diff --git a/.github/actions/automatic-test/action.yml b/.github/actions/automatic-test/action.yml
deleted file mode 100644
index 617f7fdd..00000000
--- a/.github/actions/automatic-test/action.yml
+++ /dev/null
@@ -1,75 +0,0 @@
-name: 'Automatic Test'
-description: 'Check for obvious errors.'
-
-runs:
- using: "composite"
- steps:
- - name: Install lua
- shell: bash
- run: |
- sudo apt-get install lua5.3 -y
- - name: Check all lua files are valid
- shell: lua {0}
- run: |
- local files = assert(io.popen "find . -name '*.lua' -not -path '*/.git/*'")
- local errors = 0
- for file in files:lines() do
- local f, error = loadfile(file)
- if not f then
- print(error)
- errors = errors + 1
- end
- end
- files:close()
-
- if errors > 0 then
- print(('%d syntax error(s) found.'):format(errors))
- os.exit(1)
- else
- print('No syntax error found.')
- end
- - name: Prepare FontTools
- shell: bash
- run: |
- pip install fonttools
- - name: Check all characters are in the font
- shell: python
- run: |
- from fontTools.ttLib import TTFont
- from pathlib import Path
-
- font = TTFont('parts/fonts/proportional.otf')
- keys = set(font.getBestCmap().keys())
-
- missing = []
- for file in Path('parts/language').glob('*.lua'):
- for i, line in enumerate(file.read_text().splitlines()):
- for char in line:
- if ord(char) not in keys:
- missing.append((char, file, i+1))
-
- if missing:
- print('Missing characters:')
- for char, file, i in missing:
- print(f"'{char}'({ord(char):x}) in {file} at line {i} " \
- f"(${{ github.server_url }}/${{ github.repository }}/blob/${{ github.sha }}/{file}#L{i})")
- exit(1)
- else:
- print('All characters are present in the font.')
- - uses: ./.github/actions/build-love
- with:
- file-path: Techmino.love
- - name: Download love
- shell: bash
- run: |
- curl -L https://github.com/love2d/love/releases/download/11.3/love-11.3-linux-x86_64.tar.gz | tar xz
- - name: Prepare PulseAudio
- shell: bash
- run: |
- sudo apt-get update
- sudo apt-get install pulseaudio pulseaudio-utils pavucontrol alsa-oss alsa-utils -y
- - name: Run automated test
- uses: GabrielBB/xvfb-action@v1
- with:
- run: |
- ./dest/love Techmino.love --test
diff --git a/.github/actions/build-android/action.yml b/.github/actions/build-android/action.yml
deleted file mode 100644
index 889cdc42..00000000
--- a/.github/actions/build-android/action.yml
+++ /dev/null
@@ -1,102 +0,0 @@
-name: 'build Android'
-description: 'build Android package'
-inputs:
- type:
- required: true
- apkCode:
- required: true
- name:
- required: true
- file-path:
- required: true
- SIGNING_KEY:
- required: true
- KEY_STORE_PASSWORD:
- required: true
- ALIAS:
- required: true
- KEY_PASSWORD:
- required: true
-runs:
- using: "composite"
- steps:
- - uses: actions/setup-java@v2
- with:
- distribution: 'adopt'
- java-version: '8'
- - name: Clone love-android
- shell: bash
- run: |
- git clone --recurse-submodules https://github.com/26F-Studio/love-android -b CI --depth 1 --shallow-submodules
- - uses: ./.github/actions/build-love
- with:
- file-path: love-android/app/src/main/assets/game.love
- - name: Download ColdClear arm64-v8a
- uses: ./.github/actions/get-cc
- with:
- arch: android_aarch64
- dir: ColdClear/arm64-v8a
- - name: Process ColdClear arm64-v8a
- shell: bash
- run: |
- mkdir -p love-android/app/libs/arm64-v8a
- mv ColdClear/arm64-v8a/love-11.3-android/lib/arm64-v8a/libcold_clear.so love-android/app/libs/arm64-v8a
- mkdir -p libAndroid/arm64-v8a
- mv ColdClear/arm64-v8a/libs/arm64-v8a/libCCloader.so libAndroid/arm64-v8a
- - name: Download ColdClear armeabi-v7a
- uses: ./.github/actions/get-cc
- with:
- arch: android_armv7
- dir: ColdClear/armeabi-v7a
- - name: Process ColdClear armeabi-v7a
- shell: bash
- run: |
- mkdir -p love-android/app/libs/armeabi-v7a
- mv ColdClear/armeabi-v7a/love-11.3-android/lib/armeabi-v7a/libcold_clear.so love-android/app/libs/armeabi-v7a
- mkdir -p libAndroid/armeabi-v7a
- mv ColdClear/armeabi-v7a/libs/armeabi-v7a/libCCloader.so libAndroid/armeabi-v7a
- - name: Pack ColdClear
- shell: bash
- run: |
- 7z a -tzip love-android/app/src/main/assets/game.love libAndroid
- - name: update Android information
- shell: python
- run: |
- if '${{ inputs.type }}' == 'Release':
- appName = 'Techmino'
- packageName = 'org.love2d.MrZ.Techmino'
- edition = 'release'
- elif '${{ inputs.type }}' == 'Snapshot':
- appName = 'Techmino_Snapshot'
- packageName = 'org.love2d.MrZ.Techmino.Snapshot'
- edition = 'snapshot'
- with open('./love-android/app/src/main/AndroidManifest.xml', "r+", encoding='utf-8') as file:
- data = file.read()
- data = data\
- .replace('@appName', appName)\
- .replace('@edition', edition)
- file.seek(0)
- file.truncate()
- file.write(data)
- with open("./love-android/app/build.gradle", "r+", encoding='utf-8') as file:
- data = file.read()
- data = data\
- .replace('@packageName', packageName)\
- .replace('@versionCode', '${{ inputs.apkCode }}')\
- .replace('@versionName', '${{ inputs.name }}')\
- .replace('@storePassword', '${{ inputs.KEY_STORE_PASSWORD }}')\
- .replace('@keyAlias', '${{ inputs.ALIAS }}')\
- .replace('@keyPassword', '${{ inputs.KEY_PASSWORD }}')
- file.seek(0)
- file.truncate()
- file.write(data)
- - name: Build Techmino
- shell: bash
- run: |
- echo "${{ inputs.SIGNING_KEY }}" | base64 -d > love-android/app/android.keystore
- chmod 777 love-android/gradlew
- cd love-android/
- ./gradlew assembleRelease
- - name: rename apk
- shell: bash
- run: mv love-android/app/build/outputs/apk/release/app-release.apk ${{ inputs.file-path }}
diff --git a/.github/actions/build-ios/action.yml b/.github/actions/build-ios/action.yml
deleted file mode 100644
index fa1ddced..00000000
--- a/.github/actions/build-ios/action.yml
+++ /dev/null
@@ -1,96 +0,0 @@
-name: 'build iOS'
-description: 'build iOS package'
-inputs:
- name:
- required: true
- description: "Version name"
- type:
- required: true
- description: "Build type"
- APPLE_API_ID:
- required: true
- description: "API key ID"
- APPLE_API_ISSUER:
- required: true
- description: "API issuer ID"
- APPLE_API_KEY:
- required: true
- description: "API key content"
- APPLE_APP_BUILD:
- required: true
- description: "Build number"
- APPLE_APP_CHANGELOG:
- required: true
- description: "Changelog"
- APPLE_APP_ID:
- required: true
- description: "AppStore Apple ID"
- APPLE_APP_IDENTIFIER:
- required: true
- description: "Bundle ID"
- APPLE_APP_PROFILE:
- required: true
- description: "Provisioning Profile specifer"
- APPLE_KEYCHAIN_NAME:
- required: true
- description: "Temporary keychain name"
- APPLE_KEYCHAIN_PWD:
- required: true
- description: "Temporary keychain password"
- FASTLANE_DISCORD_WEBHOOK:
- required: true
- description: "Fastlane Discord webhook"
- FASTLANE_ACTION_ID:
- required: true
- description: "Fastlane Action ID"
- FASTLANE_MATCH_PWD:
- required: true
- description: "Fastlane Match description password"
- FASTLANE_MATCH_TOKEN:
- required: true
- description: "Fastlane Match Github token"
-runs:
- using: "composite"
- steps:
- - uses: ./.github/actions/build-love
- - name: Checkout source codes
- uses: actions/checkout@v2
- with:
- repository: '26F-Studio/Techmino-iOS'
- path: 'Techmino-iOS'
- - name: Download CCloader
- uses: ./.github/actions/get-cc
- with:
- arch: iOS
- - name: Update source codes
- shell: bash
- run: |
- mv Techmino.love Techmino-iOS/platform/xcode
- mv libcold_clear.a Techmino-iOS/platform/xcode
- mv libCCloader.a Techmino-iOS/platform/xcode
- - name: Run fastlane
- uses: maierj/fastlane-action@v2.0.1
- with:
- lane: '${{ inputs.type }}'
- subdirectory: 'Techmino-iOS/platform/xcode'
- env:
- ACTION_ID: '${{ inputs.FASTLANE_ACTION_ID }}'
- API_ID: '${{ inputs.APPLE_API_ID }}'
- API_ISSUER: '${{ inputs.APPLE_API_ISSUER }}'
- API_KEY: '${{ inputs.APPLE_API_KEY }}'
- APP_BUILD: '${{ inputs.APPLE_APP_BUILD }}'
- APP_CHANGELOG: '${{ inputs.APPLE_APP_CHANGELOG }}'
- APP_ID: '${{ inputs.APPLE_APP_ID }}'
- APP_IDENTIFIER: '${{ inputs.APPLE_APP_IDENTIFIER }}'
- APP_PROFILE: '${{ inputs.APPLE_APP_PROFILE }}'
- APP_VERSION: '${{ inputs.name }}'
- DISCORD_WEBHOOK: '${{ inputs.FASTLANE_DISCORD_WEBHOOK }}'
- KEYCHAIN_NAME: '${{ inputs.APPLE_KEYCHAIN_NAME }}'
- KEYCHAIN_PWD: '${{ inputs.APPLE_KEYCHAIN_PWD }}'
- MATCH_PASSWORD: '${{ inputs.FASTLANE_MATCH_PWD }}'
- MATCH_TOKEN: '${{ inputs.FASTLANE_MATCH_TOKEN }}'
- - name: Move ipa
- shell: bash
- run: |
- mv Techmino-iOS/platform/xcode/Techmino.ipa Techmino.ipa
-
\ No newline at end of file
diff --git a/.github/actions/build-linux/action.yml b/.github/actions/build-linux/action.yml
deleted file mode 100644
index 66090a86..00000000
--- a/.github/actions/build-linux/action.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-name: 'build Linux'
-description: 'build Linux package'
-inputs:
- file-path:
- required: false
- default: Techmino.AppImage
- icon:
- required: true
-runs:
- using: "composite"
- steps:
- - name: Download AppImageKit
- shell: bash
- run: |
- curl -OL https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage
- - name: Download love
- shell: bash
- run: |
- curl -OL https://github.com/love2d/love/releases/download/11.3/love-11.3-x86_64.AppImage
- chmod 777 love-11.3-x86_64.AppImage
- ./love-11.3-x86_64.AppImage --appimage-extract
- - name: Download ColdClear
- uses: ./.github/actions/get-cc
- with:
- arch: linux
- - name: Pack Techmino
- shell: bash
- run: |
- rm -rf squashfs-root/love squashfs-root/love.desktop squashfs-root/love.svg squashfs-root/.DirIcon
- mv .github/build/Linux/love.template squashfs-root/love
- mv .github/build/Linux/Techmino.desktop.template squashfs-root/Techmino.desktop
- mv ${{ inputs.icon }} squashfs-root/icon.png
- cp squashfs-root/icon.png squashfs-root/.DirIcon
- chmod 777 squashfs-root/love
- mkdir -p squashfs-root/usr/share/Techmino
- mv media parts Zframework conf.lua main.lua version.lua legals.md license.txt squashfs-root/usr/share/Techmino
- mv CCloader.so squashfs-root/usr/share/Techmino
- mv libcold_clear.so squashfs-root/usr/lib
- chmod 777 appimagetool-x86_64.AppImage
- ./appimagetool-x86_64.AppImage squashfs-root ${{ inputs.file-path }}
diff --git a/.github/actions/build-love/action.yml b/.github/actions/build-love/action.yml
deleted file mode 100644
index 623dbc7a..00000000
--- a/.github/actions/build-love/action.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-name: 'build love'
-description: 'build love file'
-inputs:
- file-path:
- required: true
- default: Techmino.love
-runs:
- using: "composite"
- steps:
- - run: 7z a -tzip ${{ inputs.file-path }} media parts Zframework conf.lua main.lua version.lua legals.md license.txt
- shell: bash
diff --git a/.github/actions/build-macos/action.yml b/.github/actions/build-macos/action.yml
deleted file mode 100644
index dcf1ed8c..00000000
--- a/.github/actions/build-macos/action.yml
+++ /dev/null
@@ -1,152 +0,0 @@
-name: 'build Mac OS'
-description: 'build Mac OS package'
-inputs:
- name:
- required: true
- description: "Version name"
- icon:
- required: true
- description: "App icons (.icns)"
- APPLE_API_ID:
- required: true
- description: "API key ID"
- APPLE_API_ISSUER:
- required: true
- description: "API issuer ID"
- APPLE_API_KEY:
- required: true
- description: "API key content"
- APPLE_APP_IDENTIFIER:
- required: true
- description: "Bundle ID"
- APPLE_KEYCHAIN_NAME:
- required: true
- description: "Temporary keychain name"
- APPLE_KEYCHAIN_PWD:
- required: true
- description: "Temporary keychain password"
- FASTLANE_MATCH_PWD:
- required: true
- description: "Fastlane Match description password"
- FASTLANE_MATCH_TOKEN:
- required: true
- description: "Fastlane Match Github token"
-runs:
- using: "composite"
- steps:
- - uses: ./.github/actions/build-love
- - name: Checkout template
- uses: actions/checkout@v2
- with:
- repository: '26F-Studio/Techmino-macOS'
- path: 'Techmino-macOS'
- - name: Download ColdClear
- uses: ./.github/actions/get-cc
- with:
- arch: macOS
- - name: Fastlane match
- uses: maierj/fastlane-action@v2.0.1
- with:
- lane: 'get_cert'
- subdirectory: 'Techmino-macOS'
- env:
- API_ID: '${{ inputs.APPLE_API_ID }}'
- API_ISSUER: '${{ inputs.APPLE_API_ISSUER }}'
- API_KEY: '${{ inputs.APPLE_API_KEY }}'
- APP_IDENTIFIER: '${{ inputs.APPLE_APP_IDENTIFIER }}'
- KEYCHAIN_NAME: '${{ inputs.APPLE_KEYCHAIN_NAME }}'
- KEYCHAIN_PWD: '${{ inputs.APPLE_KEYCHAIN_PWD }}'
- MATCH_PASSWORD: '${{ inputs.FASTLANE_MATCH_PWD }}'
- MATCH_TOKEN: '${{ inputs.FASTLANE_MATCH_TOKEN }}'
- - name: Modify template
- shell: python
- run: |
- import datetime
- from io import open
- thisYear = str(datetime.datetime.today().year)
- with open('./.github/build/macOS/info.plist.template', 'r', encoding='utf-8') as file:
- data = file.read()
- data = data\
- .replace('@versionName', '${{ inputs.name }}'[1:])\
- .replace('@thisYear', thisYear)\
- .replace('@bundleId', '${{ inputs.APPLE_APP_IDENTIFIER }}')
- with open('./Techmino-macOS/Techmino.app/Contents/info.plist', 'w+', encoding='utf-8') as file:
- file.write(data)
- - name: Pack
- shell: bash
- run: |
- mv Techmino.love Techmino-macOS/Techmino.app/Contents/Resources
- mv CCloader.dylib Techmino-macOS/Techmino.app/Contents/Frameworks
- mv ${{ inputs.icon }} Techmino-macOS/Techmino.app/Contents/Resources/iconfile.icns
-
- chmod +x Techmino-macOS/Techmino.app/Contents/Frameworks/CCloader.dylib
- chmod +x Techmino-macOS/Techmino.app/Contents/MacOS/love
- - name: Codesign executable
- shell: bash
- run: |
- security unlock-keychain -p ${{ inputs.TEMP_KEYCHAIN_PASSWORD }} \
- ~/Library/Keychains/${{ inputs.TEMP_KEYCHAIN_USER }}-db
-
- [[ $(security find-identity) =~ ([0-9A-F]{40}) ]]
-
- codesign --timestamp --force --strict --deep -v \
- --options runtime \
- -s ${BASH_REMATCH[1]} \
- --entitlements Techmino-macOS/love.entitlements \
- Techmino-macOS/Techmino.app
- - name: Fastlane notarize
- uses: maierj/fastlane-action@v2.0.1
- with:
- lane: 'make_safe'
- subdirectory: 'Techmino-macOS'
- env:
- API_ID: '${{ inputs.APPLE_API_ID }}'
- API_ISSUER: '${{ inputs.APPLE_API_ISSUER }}'
- API_KEY: '${{ inputs.APPLE_API_KEY }}'
- APP_IDENTIFIER: '${{ inputs.APPLE_APP_IDENTIFIER }}'
- NOTARIZE_OBJECT: 'Techmino.app'
- - name: Create DMG file
- shell: bash
- run: |
- brew install create-dmg
- create-dmg \
- --volname "Techmino for MacOS" \
- --volicon "./.github/build/macOS/Techminodisk.icns" \
- --window-pos 200 120 \
- --window-size 800 500 \
- --icon-size 100 \
- --icon "Techmino.app" 239 203 \
- --background ".github/build/macOS/backgroundImage.tiff" \
- --hide-extension "Techmino.app" \
- --app-drop-link 565 203 \
- "Techmino-macOS/Techmino-macOS.dmg" \
- "Techmino-macOS/Techmino.app/"
- - name: Codesign DMG
- shell: bash
- run: |
- security unlock-keychain -p ${{ inputs.TEMP_KEYCHAIN_PASSWORD }} \
- ~/Library/Keychains/${{ inputs.TEMP_KEYCHAIN_USER }}-db
-
- [[ $(security find-identity) =~ ([0-9A-F]{40}) ]]
-
- codesign --timestamp --force --strict --deep -v \
- --options runtime \
- -s ${BASH_REMATCH[1]} \
- --entitlements Techmino-macOS/love.entitlements \
- Techmino-macOS/Techmino-macOS.dmg
- - name: Fastlane notarize
- uses: maierj/fastlane-action@v2.0.1
- with:
- lane: 'make_safe'
- subdirectory: 'Techmino-macOS'
- env:
- API_ID: '${{ inputs.APPLE_API_ID }}'
- API_ISSUER: '${{ inputs.APPLE_API_ISSUER }}'
- API_KEY: '${{ inputs.APPLE_API_KEY }}'
- APP_IDENTIFIER: '${{ inputs.APPLE_APP_IDENTIFIER }}'
- NOTARIZE_OBJECT: 'Techmino-macOS.dmg'
- - name: Finalize
- shell: bash
- run: |
- mv Techmino-macOS/Techmino-macOS.dmg Techmino.dmg
- spctl -a -t open --context context:primary-signature -vv Techmino.dmg
diff --git a/.github/actions/build-windows/action.yml b/.github/actions/build-windows/action.yml
deleted file mode 100644
index 546d3a94..00000000
--- a/.github/actions/build-windows/action.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-name: 'build Windows'
-description: 'build Windows package'
-inputs:
- love-url:
- required: true
- love-dir:
- required: true
- arch:
- required: true
- version:
- required: true
- icon:
- required: true
-runs:
- using: "composite"
- steps:
- - name: Download love
- uses: ./.github/actions/get-unzip
- with:
- url: ${{ inputs.love-url }}
- - name: move love
- shell: bash
- run: mv ${{ inputs.love-dir }} love
- - name: Download ColdClear
- uses: ./.github/actions/get-cc
- with:
- arch: ${{ inputs.arch }}
- - name: Download ResourceHacker
- uses: ./.github/actions/get-unzip
- with:
- url: http://www.angusj.com/resourcehacker/resource_hacker.zip
- - uses: ./.github/actions/build-love
- - name: update Windows template
- shell: python
- run: |
- Version = '${{ inputs.version }}'.replace('V', '')
- FileVersion = (f"{Version.replace('.', ',')},0")
- with open('./.github/build/Windows/Techmino.rc.template', 'r', encoding='utf8') as file:
- data = file.read()
- data = data\
- .replace('@FileVersion', FileVersion)\
- .replace('@Version', Version)
- with open('Techmino.rc', 'w+', encoding='utf8') as file:
- file.write(data)
- - name: Pack Techmino
- shell: pwsh
- run: |
- cmd /c copy /b .\love\love.exe + .\Techmino.love .\love\Techmino.exe
- del .\love\love.exe
- del .\love\lovec.exe
- del .\love\game.ico
- del .\love\love.ico
- del .\love\changes.txt
- del .\love\readme.txt
- move .\cold_clear.dll .\love
- move .\CCloader.dll .\love
- cmd /c '.\ResourceHacker.exe -open .\love\Techmino.exe -save .\love\Techmino.exe -action delete -mask ICONGROUP,,'
- cmd /c '.\ResourceHacker.exe -open .\Techmino.rc -save .\Techmino.res -action compile'
- cmd /c '.\ResourceHacker.exe -open .\love\Techmino.exe -save .\love\Techmino.exe -action addoverwrite -res "${{ inputs.icon }}" -mask ICONGROUP,1,'
- cmd /c '.\ResourceHacker.exe -open .\love\Techmino.exe -save .\love\Techmino.exe -action addoverwrite -res ".\Techmino.res" -mask VERSIONINFO,1,'
diff --git a/.github/actions/get-cc/action.yml b/.github/actions/get-cc/action.yml
index 3d5e0bb9..caf789e3 100644
--- a/.github/actions/get-cc/action.yml
+++ b/.github/actions/get-cc/action.yml
@@ -3,8 +3,8 @@ description: 'download cc into specific dir'
inputs:
tag:
required: false
- default: techmino-alize-2
- arch:
+ default: "11.4"
+ platform:
required: true
dir:
required: false
@@ -27,6 +27,6 @@ runs:
shell: bash
- uses: ./.github/actions/get-unzip
with:
- url: https://github.com/${{ inputs.repo }}/releases/download/${{ steps.get-tag.outputs.tag }}/${{ inputs.arch }}.zip
+ url: https://github.com/${{ inputs.repo }}/releases/download/${{ steps.get-tag.outputs.tag }}/${{ inputs.platform }}.zip
dir: ${{ inputs.dir }}
temp-file: ${{ inputs.temp-file }}
diff --git a/.github/build/Linux/love.template b/.github/build/Linux/love.template
deleted file mode 100644
index 37022827..00000000
--- a/.github/build/Linux/love.template
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-export LOVE_LAUNCHER_LOCATION="$(dirname "$(which "$0")")"
-export LD_LIBRARY_PATH="${LOVE_LAUNCHER_LOCATION}/lib/x86_64-linux-gnu:${LOVE_LAUNCHER_LOCATION}/usr/bin:${LOVE_LAUNCHER_LOCATION}/usr/lib:${LOVE_LAUNCHER_LOCATION}/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
-/sbin/ldconfig -p | grep -q libstdc++ || export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${LOVE_LAUNCHER_LOCATION}/libstdc++/"
-exec ${LOVE_BIN_WRAPPER} "${LOVE_LAUNCHER_LOCATION}/usr/bin/love" "${LOVE_LAUNCHER_LOCATION}/usr/share/Techmino"
diff --git a/.github/build/Windows/.gitattributes b/.github/build/Windows/.gitattributes
deleted file mode 100644
index d773a295..00000000
--- a/.github/build/Windows/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-*.template text eol=crlf
diff --git a/.github/build/Windows/icon.png b/.github/build/Windows/icon.png
deleted file mode 100644
index 7a92a48a..00000000
Binary files a/.github/build/Windows/icon.png and /dev/null differ
diff --git a/.github/build/android/dev/res/icon-playstore.png b/.github/build/android/dev/res/icon-playstore.png
new file mode 100644
index 00000000..db9d0922
Binary files /dev/null and b/.github/build/android/dev/res/icon-playstore.png differ
diff --git a/.github/build/android/dev/res/mipmap-anydpi-v26/icon.xml b/.github/build/android/dev/res/mipmap-anydpi-v26/icon.xml
new file mode 100644
index 00000000..1ed40370
--- /dev/null
+++ b/.github/build/android/dev/res/mipmap-anydpi-v26/icon.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.github/build/android/dev/res/mipmap-anydpi-v26/icon_round.xml b/.github/build/android/dev/res/mipmap-anydpi-v26/icon_round.xml
new file mode 100644
index 00000000..1ed40370
--- /dev/null
+++ b/.github/build/android/dev/res/mipmap-anydpi-v26/icon_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.github/build/android/dev/res/mipmap-hdpi/icon.png b/.github/build/android/dev/res/mipmap-hdpi/icon.png
new file mode 100644
index 00000000..f355645b
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-hdpi/icon.png differ
diff --git a/.github/build/android/dev/res/mipmap-hdpi/icon_background.png b/.github/build/android/dev/res/mipmap-hdpi/icon_background.png
new file mode 100644
index 00000000..0a212c9c
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-hdpi/icon_background.png differ
diff --git a/.github/build/android/dev/res/mipmap-hdpi/icon_foreground.png b/.github/build/android/dev/res/mipmap-hdpi/icon_foreground.png
new file mode 100644
index 00000000..e09b9a4e
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-hdpi/icon_foreground.png differ
diff --git a/.github/build/android/dev/res/mipmap-hdpi/icon_round.png b/.github/build/android/dev/res/mipmap-hdpi/icon_round.png
new file mode 100644
index 00000000..f70ee81e
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-hdpi/icon_round.png differ
diff --git a/.github/build/android/dev/res/mipmap-mdpi/icon.png b/.github/build/android/dev/res/mipmap-mdpi/icon.png
new file mode 100644
index 00000000..6021f04a
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-mdpi/icon.png differ
diff --git a/.github/build/android/dev/res/mipmap-mdpi/icon_background.png b/.github/build/android/dev/res/mipmap-mdpi/icon_background.png
new file mode 100644
index 00000000..a961ca12
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-mdpi/icon_background.png differ
diff --git a/.github/build/android/dev/res/mipmap-mdpi/icon_foreground.png b/.github/build/android/dev/res/mipmap-mdpi/icon_foreground.png
new file mode 100644
index 00000000..b4806555
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-mdpi/icon_foreground.png differ
diff --git a/.github/build/android/dev/res/mipmap-mdpi/icon_round.png b/.github/build/android/dev/res/mipmap-mdpi/icon_round.png
new file mode 100644
index 00000000..5b80f445
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-mdpi/icon_round.png differ
diff --git a/.github/build/android/dev/res/mipmap-xhdpi/icon.png b/.github/build/android/dev/res/mipmap-xhdpi/icon.png
new file mode 100644
index 00000000..aaad54e6
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xhdpi/icon.png differ
diff --git a/.github/build/android/dev/res/mipmap-xhdpi/icon_background.png b/.github/build/android/dev/res/mipmap-xhdpi/icon_background.png
new file mode 100644
index 00000000..f644dec4
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xhdpi/icon_background.png differ
diff --git a/.github/build/android/dev/res/mipmap-xhdpi/icon_foreground.png b/.github/build/android/dev/res/mipmap-xhdpi/icon_foreground.png
new file mode 100644
index 00000000..a0a86e8f
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xhdpi/icon_foreground.png differ
diff --git a/.github/build/android/dev/res/mipmap-xhdpi/icon_round.png b/.github/build/android/dev/res/mipmap-xhdpi/icon_round.png
new file mode 100644
index 00000000..758807bc
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xhdpi/icon_round.png differ
diff --git a/.github/build/android/dev/res/mipmap-xxhdpi/icon.png b/.github/build/android/dev/res/mipmap-xxhdpi/icon.png
new file mode 100644
index 00000000..50b2e0a8
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xxhdpi/icon.png differ
diff --git a/.github/build/android/dev/res/mipmap-xxhdpi/icon_background.png b/.github/build/android/dev/res/mipmap-xxhdpi/icon_background.png
new file mode 100644
index 00000000..5937963d
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xxhdpi/icon_background.png differ
diff --git a/.github/build/android/dev/res/mipmap-xxhdpi/icon_foreground.png b/.github/build/android/dev/res/mipmap-xxhdpi/icon_foreground.png
new file mode 100644
index 00000000..89629566
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xxhdpi/icon_foreground.png differ
diff --git a/.github/build/android/dev/res/mipmap-xxhdpi/icon_round.png b/.github/build/android/dev/res/mipmap-xxhdpi/icon_round.png
new file mode 100644
index 00000000..7e0f8100
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xxhdpi/icon_round.png differ
diff --git a/.github/build/android/dev/res/mipmap-xxxhdpi/icon.png b/.github/build/android/dev/res/mipmap-xxxhdpi/icon.png
new file mode 100644
index 00000000..ad14c459
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xxxhdpi/icon.png differ
diff --git a/.github/build/android/dev/res/mipmap-xxxhdpi/icon_background.png b/.github/build/android/dev/res/mipmap-xxxhdpi/icon_background.png
new file mode 100644
index 00000000..c9674ee2
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xxxhdpi/icon_background.png differ
diff --git a/.github/build/android/dev/res/mipmap-xxxhdpi/icon_foreground.png b/.github/build/android/dev/res/mipmap-xxxhdpi/icon_foreground.png
new file mode 100644
index 00000000..f67b32c6
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xxxhdpi/icon_foreground.png differ
diff --git a/.github/build/android/dev/res/mipmap-xxxhdpi/icon_round.png b/.github/build/android/dev/res/mipmap-xxxhdpi/icon_round.png
new file mode 100644
index 00000000..d280f49e
Binary files /dev/null and b/.github/build/android/dev/res/mipmap-xxxhdpi/icon_round.png differ
diff --git a/.github/build/android/release/res/icon-playstore.png b/.github/build/android/release/res/icon-playstore.png
new file mode 100644
index 00000000..8c7eb670
Binary files /dev/null and b/.github/build/android/release/res/icon-playstore.png differ
diff --git a/.github/build/android/release/res/mipmap-anydpi-v26/icon.xml b/.github/build/android/release/res/mipmap-anydpi-v26/icon.xml
new file mode 100644
index 00000000..1ed40370
--- /dev/null
+++ b/.github/build/android/release/res/mipmap-anydpi-v26/icon.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.github/build/android/release/res/mipmap-anydpi-v26/icon_round.xml b/.github/build/android/release/res/mipmap-anydpi-v26/icon_round.xml
new file mode 100644
index 00000000..1ed40370
--- /dev/null
+++ b/.github/build/android/release/res/mipmap-anydpi-v26/icon_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.github/build/android/release/res/mipmap-hdpi/icon.png b/.github/build/android/release/res/mipmap-hdpi/icon.png
new file mode 100644
index 00000000..47002e9c
Binary files /dev/null and b/.github/build/android/release/res/mipmap-hdpi/icon.png differ
diff --git a/.github/build/android/release/res/mipmap-hdpi/icon_background.png b/.github/build/android/release/res/mipmap-hdpi/icon_background.png
new file mode 100644
index 00000000..6f05b8ad
Binary files /dev/null and b/.github/build/android/release/res/mipmap-hdpi/icon_background.png differ
diff --git a/.github/build/android/release/res/mipmap-hdpi/icon_foreground.png b/.github/build/android/release/res/mipmap-hdpi/icon_foreground.png
new file mode 100644
index 00000000..2ae7cd22
Binary files /dev/null and b/.github/build/android/release/res/mipmap-hdpi/icon_foreground.png differ
diff --git a/.github/build/android/release/res/mipmap-hdpi/icon_round.png b/.github/build/android/release/res/mipmap-hdpi/icon_round.png
new file mode 100644
index 00000000..a74a1029
Binary files /dev/null and b/.github/build/android/release/res/mipmap-hdpi/icon_round.png differ
diff --git a/.github/build/android/release/res/mipmap-mdpi/icon.png b/.github/build/android/release/res/mipmap-mdpi/icon.png
new file mode 100644
index 00000000..e2803d9f
Binary files /dev/null and b/.github/build/android/release/res/mipmap-mdpi/icon.png differ
diff --git a/.github/build/android/release/res/mipmap-mdpi/icon_background.png b/.github/build/android/release/res/mipmap-mdpi/icon_background.png
new file mode 100644
index 00000000..08b119c9
Binary files /dev/null and b/.github/build/android/release/res/mipmap-mdpi/icon_background.png differ
diff --git a/.github/build/android/release/res/mipmap-mdpi/icon_foreground.png b/.github/build/android/release/res/mipmap-mdpi/icon_foreground.png
new file mode 100644
index 00000000..e0b0176a
Binary files /dev/null and b/.github/build/android/release/res/mipmap-mdpi/icon_foreground.png differ
diff --git a/.github/build/android/release/res/mipmap-mdpi/icon_round.png b/.github/build/android/release/res/mipmap-mdpi/icon_round.png
new file mode 100644
index 00000000..2d145b85
Binary files /dev/null and b/.github/build/android/release/res/mipmap-mdpi/icon_round.png differ
diff --git a/.github/build/android/release/res/mipmap-xhdpi/icon.png b/.github/build/android/release/res/mipmap-xhdpi/icon.png
new file mode 100644
index 00000000..c56d513a
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xhdpi/icon.png differ
diff --git a/.github/build/android/release/res/mipmap-xhdpi/icon_background.png b/.github/build/android/release/res/mipmap-xhdpi/icon_background.png
new file mode 100644
index 00000000..39f0f544
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xhdpi/icon_background.png differ
diff --git a/.github/build/android/release/res/mipmap-xhdpi/icon_foreground.png b/.github/build/android/release/res/mipmap-xhdpi/icon_foreground.png
new file mode 100644
index 00000000..ef0dcd6b
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xhdpi/icon_foreground.png differ
diff --git a/.github/build/android/release/res/mipmap-xhdpi/icon_round.png b/.github/build/android/release/res/mipmap-xhdpi/icon_round.png
new file mode 100644
index 00000000..dd43ba71
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xhdpi/icon_round.png differ
diff --git a/.github/build/android/release/res/mipmap-xxhdpi/icon.png b/.github/build/android/release/res/mipmap-xxhdpi/icon.png
new file mode 100644
index 00000000..6a0d6787
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xxhdpi/icon.png differ
diff --git a/.github/build/android/release/res/mipmap-xxhdpi/icon_background.png b/.github/build/android/release/res/mipmap-xxhdpi/icon_background.png
new file mode 100644
index 00000000..663c585a
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xxhdpi/icon_background.png differ
diff --git a/.github/build/android/release/res/mipmap-xxhdpi/icon_foreground.png b/.github/build/android/release/res/mipmap-xxhdpi/icon_foreground.png
new file mode 100644
index 00000000..7b6a2c08
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xxhdpi/icon_foreground.png differ
diff --git a/.github/build/android/release/res/mipmap-xxhdpi/icon_round.png b/.github/build/android/release/res/mipmap-xxhdpi/icon_round.png
new file mode 100644
index 00000000..482bd717
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xxhdpi/icon_round.png differ
diff --git a/.github/build/android/release/res/mipmap-xxxhdpi/icon.png b/.github/build/android/release/res/mipmap-xxxhdpi/icon.png
new file mode 100644
index 00000000..3deefaa4
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xxxhdpi/icon.png differ
diff --git a/.github/build/android/release/res/mipmap-xxxhdpi/icon_background.png b/.github/build/android/release/res/mipmap-xxxhdpi/icon_background.png
new file mode 100644
index 00000000..2ae710fa
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xxxhdpi/icon_background.png differ
diff --git a/.github/build/android/release/res/mipmap-xxxhdpi/icon_foreground.png b/.github/build/android/release/res/mipmap-xxxhdpi/icon_foreground.png
new file mode 100644
index 00000000..4257fcf7
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xxxhdpi/icon_foreground.png differ
diff --git a/.github/build/android/release/res/mipmap-xxxhdpi/icon_round.png b/.github/build/android/release/res/mipmap-xxxhdpi/icon_round.png
new file mode 100644
index 00000000..671afb0e
Binary files /dev/null and b/.github/build/android/release/res/mipmap-xxxhdpi/icon_round.png differ
diff --git a/.github/build/iOS/dev/icon/icon_1024x1024.png b/.github/build/iOS/dev/icon/icon_1024x1024.png
new file mode 100644
index 00000000..8712fe61
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_1024x1024.png differ
diff --git a/.github/build/iOS/dev/icon/icon_20x20.png b/.github/build/iOS/dev/icon/icon_20x20.png
new file mode 100644
index 00000000..19a62fd8
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_20x20.png differ
diff --git a/.github/build/iOS/dev/icon/icon_20x20@2x.png b/.github/build/iOS/dev/icon/icon_20x20@2x.png
new file mode 100644
index 00000000..bd20a69a
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_20x20@2x.png differ
diff --git a/.github/build/iOS/dev/icon/icon_20x20@3x.png b/.github/build/iOS/dev/icon/icon_20x20@3x.png
new file mode 100644
index 00000000..d9d83def
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_20x20@3x.png differ
diff --git a/.github/build/iOS/dev/icon/icon_29x29.png b/.github/build/iOS/dev/icon/icon_29x29.png
new file mode 100644
index 00000000..10132af0
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_29x29.png differ
diff --git a/.github/build/iOS/dev/icon/icon_29x29@2x.png b/.github/build/iOS/dev/icon/icon_29x29@2x.png
new file mode 100644
index 00000000..2876828c
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_29x29@2x.png differ
diff --git a/.github/build/iOS/dev/icon/icon_29x29@3x.png b/.github/build/iOS/dev/icon/icon_29x29@3x.png
new file mode 100644
index 00000000..03677d99
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_29x29@3x.png differ
diff --git a/.github/build/iOS/dev/icon/icon_40x40.png b/.github/build/iOS/dev/icon/icon_40x40.png
new file mode 100644
index 00000000..bd20a69a
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_40x40.png differ
diff --git a/.github/build/iOS/dev/icon/icon_40x40@2x.png b/.github/build/iOS/dev/icon/icon_40x40@2x.png
new file mode 100644
index 00000000..b8a9728f
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_40x40@2x.png differ
diff --git a/.github/build/iOS/dev/icon/icon_40x40@3x.png b/.github/build/iOS/dev/icon/icon_40x40@3x.png
new file mode 100644
index 00000000..7147ed2a
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_40x40@3x.png differ
diff --git a/.github/build/iOS/dev/icon/icon_60x60@2x.png b/.github/build/iOS/dev/icon/icon_60x60@2x.png
new file mode 100644
index 00000000..7147ed2a
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_60x60@2x.png differ
diff --git a/.github/build/iOS/dev/icon/icon_60x60@3x.png b/.github/build/iOS/dev/icon/icon_60x60@3x.png
new file mode 100644
index 00000000..7ab3e05f
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_60x60@3x.png differ
diff --git a/.github/build/iOS/dev/icon/icon_76x76.png b/.github/build/iOS/dev/icon/icon_76x76.png
new file mode 100644
index 00000000..924b176e
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_76x76.png differ
diff --git a/.github/build/iOS/dev/icon/icon_76x76@2x.png b/.github/build/iOS/dev/icon/icon_76x76@2x.png
new file mode 100644
index 00000000..c172865d
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_76x76@2x.png differ
diff --git a/.github/build/iOS/dev/icon/icon_83.5x83.5@2x.png b/.github/build/iOS/dev/icon/icon_83.5x83.5@2x.png
new file mode 100644
index 00000000..9b7572ca
Binary files /dev/null and b/.github/build/iOS/dev/icon/icon_83.5x83.5@2x.png differ
diff --git a/.github/build/iOS/love.patch b/.github/build/iOS/love.patch
new file mode 100644
index 00000000..bbeec4d2
--- /dev/null
+++ b/.github/build/iOS/love.patch
@@ -0,0 +1,106 @@
+diff --git a/src/common/ios.h b/src/common/ios.h
+index c1932555..552e432e 100644
+--- a/src/common/ios.h
++++ b/src/common/ios.h
+@@ -66,7 +66,7 @@ std::string getExecutablePath();
+ /**
+ * Causes devices with vibration support to vibrate for about 0.5 seconds.
+ **/
+-void vibrate();
++void vibrate(const double seconds);
+
+ /**
+ * Enable mix mode (e.g. with background music apps) and playback with a muted device.
+diff --git a/src/common/ios.mm b/src/common/ios.mm
+index 7730991e..4ba8e708 100644
+--- a/src/common/ios.mm
++++ b/src/common/ios.mm
+@@ -36,6 +36,8 @@
+ #include
+ #include
+
++#include
++
+ static NSArray *getLovesInDocuments();
+ static bool deleteFileInDocuments(NSString *filename);
+
+@@ -391,10 +393,40 @@ std::string getExecutablePath()
+ }
+ }
+
+-void vibrate()
++void vibrate(const double seconds)
+ {
+ @autoreleasepool
+ {
++ struct utsname systemInfo;
++ uname(&systemInfo);
++ NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
++ NSRange iPhoneRange = [deviceString rangeOfString:@"iPhone"];
++ if (iPhoneRange.length == 6) {
++ NSRange commaRange = [deviceString rangeOfString:@","];
++ NSString *iPhone = [deviceString substringWithRange:iPhoneRange];
++ NSRange numRange = NSMakeRange(iPhoneRange.location + iPhoneRange.length, commaRange.location - iPhoneRange.location - iPhoneRange.length);
++ NSString *num = [deviceString substringWithRange:numRange];
++
++ if ([num intValue] >= 9) {
++ // iPhone 7 and above, see: https://gist.github.com/adamawolf/3048717#file-apple_mobile_device_types-txt-L22
++
++ if (@available(iOS 10.0, *)) {
++ // iOS 10.0 and above
++ UIImpactFeedbackGenerator *impact = nil;
++ if (seconds >= 0.5 && seconds < 1.5) {
++ impact = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleLight]; // 轻
++ } else if (seconds >= 1.5 && seconds < 2.5) {
++ impact = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium]; // 中
++ } else if (seconds >= 2.5) {
++ impact = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleHeavy]; // 重
++ } else {
++ return;
++ }
++ [impact impactOccurred];
++ return;
++ }
++ }
++ }
+ AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
+ }
+ }
+diff --git a/src/love.cpp b/src/love.cpp
+index c8af8596..ae7a5e32 100644
+--- a/src/love.cpp
++++ b/src/love.cpp
+@@ -140,6 +140,10 @@ enum DoneAction
+ DONE_RESTART,
+ };
+
++extern "C" {
++ int luaopen_CCloader(lua_State *L);
++}
++
+ static DoneAction runlove(int argc, char **argv, int &retval)
+ {
+ // Oh, you just want the version? Okay!
+@@ -158,6 +162,9 @@ static DoneAction runlove(int argc, char **argv, int &retval)
+ lua_State *L = luaL_newstate();
+ luaL_openlibs(L);
+
++ // Init CCloader
++ luaopen_CCloader(L);
++
+ // LuaJIT-specific setup needs to be done as early as possible - before
+ // get_app_arguments because that loads external library code. This is also
+ // loaded inside require("love"). Note that it doesn't use the love table.
+diff --git a/src/modules/system/System.cpp b/src/modules/system/System.cpp
+index e1de16d5..e0f03557 100644
+--- a/src/modules/system/System.cpp
++++ b/src/modules/system/System.cpp
+@@ -174,7 +174,7 @@ void System::vibrate(double seconds) const
+ #ifdef LOVE_ANDROID
+ love::android::vibrate(seconds);
+ #elif defined(LOVE_IOS)
+- love::ios::vibrate();
++ love::ios::vibrate(seconds);
+ #else
+ LOVE_UNUSED(seconds);
+ #endif
diff --git a/.github/build/iOS/release/icon/icon_1024x1024.png b/.github/build/iOS/release/icon/icon_1024x1024.png
new file mode 100644
index 00000000..c80bf420
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_1024x1024.png differ
diff --git a/.github/build/iOS/release/icon/icon_20x20.png b/.github/build/iOS/release/icon/icon_20x20.png
new file mode 100644
index 00000000..93dac519
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_20x20.png differ
diff --git a/.github/build/iOS/release/icon/icon_20x20@2x.png b/.github/build/iOS/release/icon/icon_20x20@2x.png
new file mode 100644
index 00000000..88772124
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_20x20@2x.png differ
diff --git a/.github/build/iOS/release/icon/icon_20x20@3x.png b/.github/build/iOS/release/icon/icon_20x20@3x.png
new file mode 100644
index 00000000..cace3881
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_20x20@3x.png differ
diff --git a/.github/build/iOS/release/icon/icon_29x29.png b/.github/build/iOS/release/icon/icon_29x29.png
new file mode 100644
index 00000000..bab7dac1
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_29x29.png differ
diff --git a/.github/build/iOS/release/icon/icon_29x29@2x.png b/.github/build/iOS/release/icon/icon_29x29@2x.png
new file mode 100644
index 00000000..bfb79f21
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_29x29@2x.png differ
diff --git a/.github/build/iOS/release/icon/icon_29x29@3x.png b/.github/build/iOS/release/icon/icon_29x29@3x.png
new file mode 100644
index 00000000..e1de7c28
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_29x29@3x.png differ
diff --git a/.github/build/iOS/release/icon/icon_40x40.png b/.github/build/iOS/release/icon/icon_40x40.png
new file mode 100644
index 00000000..88772124
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_40x40.png differ
diff --git a/.github/build/iOS/release/icon/icon_40x40@2x.png b/.github/build/iOS/release/icon/icon_40x40@2x.png
new file mode 100644
index 00000000..9f08f761
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_40x40@2x.png differ
diff --git a/.github/build/iOS/release/icon/icon_40x40@3x.png b/.github/build/iOS/release/icon/icon_40x40@3x.png
new file mode 100644
index 00000000..6ed8550f
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_40x40@3x.png differ
diff --git a/.github/build/iOS/release/icon/icon_60x60@2x.png b/.github/build/iOS/release/icon/icon_60x60@2x.png
new file mode 100644
index 00000000..6ed8550f
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_60x60@2x.png differ
diff --git a/.github/build/iOS/release/icon/icon_60x60@3x.png b/.github/build/iOS/release/icon/icon_60x60@3x.png
new file mode 100644
index 00000000..ec6b2bb4
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_60x60@3x.png differ
diff --git a/.github/build/iOS/release/icon/icon_76x76.png b/.github/build/iOS/release/icon/icon_76x76.png
new file mode 100644
index 00000000..ec239362
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_76x76.png differ
diff --git a/.github/build/iOS/release/icon/icon_76x76@2x.png b/.github/build/iOS/release/icon/icon_76x76@2x.png
new file mode 100644
index 00000000..1c0955c8
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_76x76@2x.png differ
diff --git a/.github/build/iOS/release/icon/icon_83.5x83.5@2x.png b/.github/build/iOS/release/icon/icon_83.5x83.5@2x.png
new file mode 100644
index 00000000..d9968bd3
Binary files /dev/null and b/.github/build/iOS/release/icon/icon_83.5x83.5@2x.png differ
diff --git a/.github/build/Linux/icon_snapshot.png b/.github/build/linux/dev/icon.png
similarity index 100%
rename from .github/build/Linux/icon_snapshot.png
rename to .github/build/linux/dev/icon.png
diff --git a/.github/build/linux/dev/template.desktop b/.github/build/linux/dev/template.desktop
new file mode 100644
index 00000000..31b0f21e
--- /dev/null
+++ b/.github/build/linux/dev/template.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Name=Techmino Development
+Comment=Techmino is fun!
+MimeType=application/x-love-game;
+Exec=app %f
+Type=Application
+Categories=Game;
+Terminal=false
+Icon=icon
+NoDisplay=false
\ No newline at end of file
diff --git a/.github/build/Linux/.gitattributes b/.github/build/linux/release/.gitattributes
similarity index 100%
rename from .github/build/Linux/.gitattributes
rename to .github/build/linux/release/.gitattributes
diff --git a/.github/build/Linux/icon.png b/.github/build/linux/release/icon.png
similarity index 100%
rename from .github/build/Linux/icon.png
rename to .github/build/linux/release/icon.png
diff --git a/.github/build/Linux/Techmino.desktop.template b/.github/build/linux/release/template.desktop
similarity index 57%
rename from .github/build/Linux/Techmino.desktop.template
rename to .github/build/linux/release/template.desktop
index bed656e1..11f27a4d 100644
--- a/.github/build/Linux/Techmino.desktop.template
+++ b/.github/build/linux/release/template.desktop
@@ -1,8 +1,10 @@
[Desktop Entry]
-Name=Techmino Alpha
+Name=Techmino
Comment=Techmino is fun!
-Exec=wrapper-love %f
+MimeType=application/x-love-game;
+Exec=app %f
Type=Application
Categories=Game;
Terminal=false
Icon=icon
+NoDisplay=false
\ No newline at end of file
diff --git a/.github/build/macOS/.gitattributes b/.github/build/macOS/.gitattributes
deleted file mode 100644
index c179c320..00000000
--- a/.github/build/macOS/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-*.template text eol=lf
diff --git a/.github/build/macOS/Techminodisk.icns b/.github/build/macOS/dev/dmg.icns
similarity index 100%
rename from .github/build/macOS/Techminodisk.icns
rename to .github/build/macOS/dev/dmg.icns
diff --git a/.github/build/macOS/backgroundImage.tiff b/.github/build/macOS/dev/dmg.png
similarity index 100%
rename from .github/build/macOS/backgroundImage.tiff
rename to .github/build/macOS/dev/dmg.png
diff --git a/.github/build/macOS/icon_snapshot.icns b/.github/build/macOS/dev/icon.icns
similarity index 100%
rename from .github/build/macOS/icon_snapshot.icns
rename to .github/build/macOS/dev/icon.icns
diff --git a/.github/build/macOS/info.plist.template b/.github/build/macOS/info.plist.template
deleted file mode 100644
index c4f251ef..00000000
--- a/.github/build/macOS/info.plist.template
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
- BuildMachineOSBuild
- 19B88
- CFBundleDevelopmentRegion
- English
- CFBundleExecutable
- love
- CFBundleIconFile
- iconfile
- CFBundleIdentifier
- @bundleId
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- Techmino
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- @versionName
- CFBundleSignature
- LoVe
- CFBundleSupportedPlatforms
-
- MacOSX
-
- DTCompiler
- com.apple.compilers.llvm.clang.1_0
- DTPlatformBuild
- 11C504
- DTPlatformVersion
- GM
- DTSDKBuild
- 19B90
- DTSDKName
- macosx10.15
- DTXcode
- 1130
- DTXcodeBuild
- 11C504
- LSApplicationCategoryType
- public.app-category.games
- LSMinimumSystemVersion
- 10.7
- NSHighResolutionCapable
-
- NSHumanReadableCopyright
- ©2020-@thisYear 26F Studio, GNU LGPLv3.0
- NSPrincipalClass
- NSApplication
- NSSupportsAutomaticGraphicsSwitching
-
-
-
diff --git a/.github/build/macOS/release/dmg.icns b/.github/build/macOS/release/dmg.icns
new file mode 100644
index 00000000..f1a560cb
Binary files /dev/null and b/.github/build/macOS/release/dmg.icns differ
diff --git a/.github/build/macOS/release/dmg.png b/.github/build/macOS/release/dmg.png
new file mode 100644
index 00000000..e50fad1f
Binary files /dev/null and b/.github/build/macOS/release/dmg.png differ
diff --git a/.github/build/macOS/icon.icns b/.github/build/macOS/release/icon.icns
similarity index 100%
rename from .github/build/macOS/icon.icns
rename to .github/build/macOS/release/icon.icns
diff --git a/.github/build/windows/dev/.gitattributes b/.github/build/windows/dev/.gitattributes
new file mode 100644
index 00000000..20947f93
--- /dev/null
+++ b/.github/build/windows/dev/.gitattributes
@@ -0,0 +1 @@
+*.rc text eol=crlf
diff --git a/.github/build/Windows/icon_snapshot.ico b/.github/build/windows/dev/icon.ico
similarity index 100%
rename from .github/build/Windows/icon_snapshot.ico
rename to .github/build/windows/dev/icon.ico
diff --git a/.github/build/windows/dev/template.rc b/.github/build/windows/dev/template.rc
new file mode 100644
index 00000000..8aa567fb
--- /dev/null
+++ b/.github/build/windows/dev/template.rc
@@ -0,0 +1,23 @@
+1 VERSIONINFO
+FILEVERSION @FileVersion
+PRODUCTVERSION @FileVersion
+FILEOS 0x40004
+FILETYPE 0x1
+{
+ BLOCK "StringFileInfo"
+ {
+ BLOCK "040904B0"
+ {
+ VALUE "FileDescription", "Techmino Development"
+ VALUE "CompanyName", "26F Studio"
+ VALUE "LegalCopyright", "Copyright @ 26F Studio"
+ VALUE "ProductName", "Techmino"
+ VALUE "ProductVersion", "@Version"
+ }
+ }
+
+ BLOCK "VarFileInfo"
+ {
+ VALUE "Translation", 0x0409 0x04E4
+ }
+}
diff --git a/.github/build/windows/release/.gitattributes b/.github/build/windows/release/.gitattributes
new file mode 100644
index 00000000..20947f93
--- /dev/null
+++ b/.github/build/windows/release/.gitattributes
@@ -0,0 +1 @@
+*.rc text eol=crlf
diff --git a/.github/build/Windows/icon.ico b/.github/build/windows/release/icon.ico
similarity index 100%
rename from .github/build/Windows/icon.ico
rename to .github/build/windows/release/icon.ico
diff --git a/.github/build/Windows/Techmino.rc.template b/.github/build/windows/release/template.rc
similarity index 89%
rename from .github/build/Windows/Techmino.rc.template
rename to .github/build/windows/release/template.rc
index 30c8207d..14f7ff77 100644
--- a/.github/build/Windows/Techmino.rc.template
+++ b/.github/build/windows/release/template.rc
@@ -8,7 +8,7 @@ FILETYPE 0x1
{
BLOCK "040904B0"
{
- VALUE "FileDescription", "Techmino Alpha"
+ VALUE "FileDescription", "Techmino"
VALUE "CompanyName", "26F Studio"
VALUE "LegalCopyright", "Copyright @ 26F Studio"
VALUE "ProductName", "Techmino"
diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml
index feb7ee90..3cf96dab 100644
--- a/.github/workflows/dev.yml
+++ b/.github/workflows/dev.yml
@@ -2,224 +2,504 @@ name: Techmino Develop CI
on:
push:
- branches: [ main, ci* ]
+ branches: [main, ci*]
pull_request:
- branches: [ main ]
-
+ branches: [main]
+env:
+ CORE_LOVE_PACKAGE_PATH: ./core.love
+ CORE_LOVE_ARTIFACT_NAME: core_love_package
jobs:
get-info:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-latest
outputs:
- name: ${{ steps.lua-related.outputs.name }}
- apkCode: ${{ steps.lua-related.outputs.apkCode }}
- code: ${{ steps.lua-related.outputs.code }}
- commit: ${{ steps.git-related.outputs.commit }}
+ app-name: ${{ steps.app-info.outputs.app-name }}
+ version-name: ${{ steps.app-info.outputs.version-name }}
+ version-string: ${{ steps.app-info.outputs.version-string }}
+ version-code: ${{ steps.app-info.outputs.version-code }}
+ commit-hash: ${{ steps.git-info.outputs.commit-hash }}
+ base-name: ${{ steps.assemble-base-name.outputs.base-name }}
steps:
- - uses: actions/checkout@v2
- - name: Install lua
- run: |
- sudo apt-get install lua5.3 -y
- - name: Get Version
- id: lua-related
- shell: lua {0}
- run: |
- local version = require 'version'
- print("::set-output name=name::"..version.string)
- print(("::set-output name=apkCode::%d"):format(version.apkCode))
- print(("::set-output name=code::%d"):format(version.code))
- - name: Get Commit
- id: git-related
- shell: bash
- run: |
- echo "::set-output name=commit::$(git rev-parse --short ${{ GITHUB.SHA }})"
-
- automatic-test:
- runs-on: ubuntu-20.04
+ - uses: actions/checkout@v3
+ - name: Install lua
+ run: |
+ sudo apt-get install lua5.3 -y
+ - name: Get app info
+ id: app-info
+ shell: lua {0}
+ run: |
+ local version = require "version"
+ print("::set-output name=app-name::Techmino")
+ print("::set-output name=version-name::"..version.name)
+ print("::set-output name=version-string::"..version.string:gsub("%a", ""))
+ print(("::set-output name=version-code::%d"):format(version.code))
+ - name: Get git info
+ id: git-info
+ shell: bash
+ run: |
+ COMMIT_HASH=$(git rev-parse --short ${{ GITHUB.SHA }})
+ echo ::set-output name=commit-hash::$COMMIT_HASH
+ - name: Assemble package base name
+ id: assemble-base-name
+ shell: bash
+ run: |
+ BASE_NAME=Techmino_${{ steps.app-info.outputs.version-string }}_${{ steps.git-info.outputs.commit-hash }}_#${{ GITHUB.RUN_NUMBER }}
+ echo ::set-output name=base-name::$BASE_NAME
+ build-core:
+ runs-on: ubuntu-latest
+ needs: get-info
+ env:
+ PACKAGE_NAME: ./${{ needs.get-info.outputs.base-name }}_Core.love
+ outputs:
+ download-url: ${{ steps.transfer.outputs.download-url }}
steps:
- - uses: actions/checkout@v2
- with:
- submodules: 'recursive'
- - uses: ./.github/actions/automatic-test
-
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Build core love package
+ uses: 26F-Studio/love-actions-core@v1
+ with:
+ build-list: ./media/ ./parts/ ./Zframework/ ./conf.lua ./main.lua ./version.lua
+ package-path: ${{ env.CORE_LOVE_PACKAGE_PATH }}
+ - name: Upload core love package
+ uses: actions/upload-artifact@v3
+ with:
+ name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
+ path: ${{ env.CORE_LOVE_PACKAGE_PATH }}
+ - name: Rename love package
+ run: mv ${{ env.CORE_LOVE_PACKAGE_PATH }} ${{ env.PACKAGE_NAME }}
+ - name: Upload artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: ${{ needs.get-info.outputs.base-name }}_Core
+ path: ${{ env.PACKAGE_NAME }}
+ - name: Upload to WeTransfer
+ id: transfer
+ run: |
+ curl -sL https://git.io/file-transfer | sh
+ ./transfer wet -s -p 16 --no-progress ${{ env.PACKAGE_NAME }} 2>&1>./wetransfer.log
+ echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")"
+ auto-test:
+ runs-on: ubuntu-latest
+ needs: build-core
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Love actions for testing
+ uses: 26F-Studio/love-actions-test@v1
+ with:
+ font-path: ./parts/fonts/proportional.otf
+ language-folder: ./parts/language
+ build-android:
+ runs-on: ubuntu-latest
+ needs: [get-info, build-core, auto-test]
+ env:
+ OUTPUT_FOLDER: ./build
+ outputs:
+ download-url: ${{ steps.transfer.outputs.download-url }}
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Process app name
+ id: process-app-name
+ shell: python3 {0}
+ run: |
+ import os
+ import re
+ os.system("echo ::set-output name=bundle-id::org.f26_studio." + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}"))
+ os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "-", "${{ needs.get-info.outputs.app-name }}"))
+ - name: Download core love package
+ uses: actions/download-artifact@v3
+ with:
+ name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
+ - name: Download ColdClear
+ uses: ./.github/actions/get-cc
+ with:
+ platform: Android
+ dir: ./ColdClear
+ - name: Process ColdClear
+ shell: bash
+ run: |
+ mkdir -p ./libAndroid/armeabi-v7a/
+ mkdir -p ./libAndroid/arm64-v8a/
+ mv ./ColdClear/armeabi-v7a/libCCloader.so ./libAndroid/armeabi-v7a/
+ mv ./ColdClear/arm64-v8a/libCCloader.so ./libAndroid/arm64-v8a/
+ - name: Build Android packages
+ id: build-packages
+ uses: 26F-Studio/love-actions-android@v1
+ with:
+ app-name: ${{ needs.get-info.outputs.app-name }}
+ bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
+ icon-specifier: "@mipmap/icon"
+ keystore-alias: ${{ secrets.ANDROID_KEYSTORE_ALIAS }}
+ keystore-base64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
+ keystore-key-password: ${{ secrets.ANDROID_KEYSTORE_KEYPASSWORD }}
+ keystore-store-password: ${{ secrets.ANDROID_KEYSTORE_STOREPASSWORD }}
+ love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
+ resource-path: ./.github/build/android/dev/res
+ libs-path: ./ColdClear/
+ extra-assets: ./libAndroid/
+ product-name: ${{ steps.process-app-name.outputs.product-name }}
+ version-string: ${{ needs.get-info.outputs.version-string }}
+ version-code: ${{ needs.get-info.outputs.version-code }}
+ output-folder: ${{ env.OUTPUT_FOLDER }}
+ - name: Upload artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: ${{ needs.get-info.outputs.base-name }}_Android
+ path: ${{ env.OUTPUT_FOLDER }}/*
+ - name: Upload to WeTransfer
+ id: transfer
+ run: |
+ curl -sL https://git.io/file-transfer | sh
+ ./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
+ echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")"
+ build-ios:
+ runs-on: macos-latest
+ needs: [get-info, build-core, auto-test]
+ env:
+ OUTPUT_FOLDER: ./build
+ outputs:
+ download-url: ${{ steps.transfer.outputs.download-url }}
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Process app name
+ id: process-app-name
+ shell: python3 {0}
+ run: |
+ import os
+ import re
+ os.system("echo ::set-output name=bundle-id::org.26f-studio.techmino")
+ os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}"))
+ - name: Download core love package
+ uses: actions/download-artifact@v3
+ with:
+ name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
+ - name: Download ColdClear
+ uses: ./.github/actions/get-cc
+ with:
+ platform: iOS
+ dir: ./ColdClear
+ - name: Build iOS packages
+ id: build-packages
+ uses: 26F-Studio/love-actions-ios@v1
+ with:
+ app-name: ${{ needs.get-info.outputs.app-name }}
+ bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
+ copyright: "Copyright © 2019-2022 26F-Studio. Some Rights Reserved."
+ icon-path: ./.github/build/iOS/dev/icon
+ love-patch: ./.github/build/iOS/love.patch
+ love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
+ libs-path: ./ColdClear/arm64/
+ product-name: ${{ steps.process-app-name.outputs.product-name }}
+ version-string: ${{ needs.get-info.outputs.version-string }}
+ output-folder: ${{ env.OUTPUT_FOLDER }}
+ apple-development-base64: ${{ secrets.APPLE_CERT_APPLE_DEVELOPMENT_BASE64 }}
+ apple-development-password: ${{ secrets.APPLE_CERT_APPLE_DEVELOPMENT_PWD }}
+ api-key: ${{ secrets.APPLE_API_KEY }}
+ api-key-id: ${{ secrets.APPLE_API_KEY_ID }}
+ api-issuer-id: ${{ secrets.APPLE_API_ISSUER_ID }}
+ team-id: ${{ secrets.APPLE_DEVELOPER_TEAM_ID }}
+ apple-id: ${{ secrets.APPLE_APPLE_ID }}
+ - name: Upload artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: ${{ needs.get-info.outputs.base-name }}_iOS
+ path: ${{ env.OUTPUT_FOLDER }}/*
+ - name: Upload to WeTransfer
+ id: transfer
+ run: |
+ wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz
+ ./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
+ echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")"
+ build-linux:
+ runs-on: ubuntu-latest
+ needs: [get-info, build-core, auto-test]
+ env:
+ OUTPUT_FOLDER: ./build
+ outputs:
+ download-url: ${{ steps.transfer.outputs.download-url }}
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Process app name
+ id: process-app-name
+ shell: python3 {0}
+ run: |
+ import os
+ import re
+ os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}"))
+ - name: Download core love package
+ uses: actions/download-artifact@v3
+ with:
+ name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
+ - name: Download ColdClear
+ uses: ./.github/actions/get-cc
+ with:
+ platform: Linux
+ dir: ./ColdClear
+ - name: Process ColdClear
+ shell: bash
+ run: |
+ cd ./ColdClear
+ mkdir ./libs
+ mv ./x64/libcold_clear.so ./libs
+ mkdir ./shared
+ mv ./x64/CCloader.so ./shared
+ - name: Build Linux packages
+ id: build-packages
+ uses: 26F-Studio/love-actions-linux@v1
+ with:
+ desktop-file-path: ./.github/build/linux/dev/template.desktop
+ executable-name: app
+ icon-path: ./.github/build/linux/dev/icon.png
+ love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
+ libs-path: ./ColdClear/libs/
+ shared-path: ./ColdClear/shared/
+ product-name: ${{ steps.process-app-name.outputs.product-name }}
+ output-folder: ${{ env.OUTPUT_FOLDER }}
+ - name: Upload artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: ${{ needs.get-info.outputs.base-name }}_Linux
+ path: ${{ env.OUTPUT_FOLDER }}/*
+ - name: Upload to WeTransfer
+ id: transfer
+ run: |
+ curl -sL https://git.io/file-transfer | sh
+ ./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
+ echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")"
+ build-macos-appstore:
+ runs-on: macos-latest
+ needs: [get-info, build-core, auto-test]
+ env:
+ OUTPUT_FOLDER: ./build
+ outputs:
+ download-url: ${{ steps.transfer.outputs.download-url }}
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Process app name
+ id: process-app-name
+ shell: python3 {0}
+ run: |
+ import os
+ import re
+ os.system("echo ::set-output name=bundle-id::org.26f-studio.techmino")
+ os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}"))
+ - name: Download core love package
+ uses: actions/download-artifact@v3
+ with:
+ name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
+ - name: Download ColdClear
+ uses: ./.github/actions/get-cc
+ with:
+ platform: macOS
+ dir: ./ColdClear
+ - name: Process ColdClear
+ shell: bash
+ run: |
+ rm ./ColdClear/universal/libcold_clear.a
+ - name: Build macOS packages
+ id: build-packages
+ uses: 26F-Studio/love-actions-macos-appstore@v1
+ with:
+ app-name: ${{ needs.get-info.outputs.app-name }}
+ bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
+ copyright: "Copyright © 2019-2022 26F-Studio. Some Rights Reserved."
+ icon-path: ./.github/build/macOS/dev/icon.icns
+ love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
+ libs-path: ./ColdClear/universal/
+ product-name: ${{ steps.process-app-name.outputs.product-name }}
+ version-string: ${{ needs.get-info.outputs.version-string }}
+ output-folder: ${{ env.OUTPUT_FOLDER }}
+ apple-development-base64: ${{ secrets.APPLE_CERT_APPLE_DEVELOPMENT_BASE64 }}
+ apple-development-password: ${{ secrets.APPLE_CERT_APPLE_DEVELOPMENT_PWD }}
+ api-key: ${{ secrets.APPLE_API_KEY }}
+ api-key-id: ${{ secrets.APPLE_API_KEY_ID }}
+ api-issuer-id: ${{ secrets.APPLE_API_ISSUER_ID }}
+ team-id: ${{ secrets.APPLE_DEVELOPER_TEAM_ID }}
+ apple-id: ${{ secrets.APPLE_APPLE_ID }}
+ - name: Upload artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: ${{ needs.get-info.outputs.base-name }}_macOS_appstore
+ path: ${{ env.OUTPUT_FOLDER }}/*
+ - name: Upload to WeTransfer
+ id: transfer
+ run: |
+ wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz
+ ./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
+ echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")"
+ build-macos-portable:
+ runs-on: macos-latest
+ needs: [get-info, build-core, auto-test]
+ env:
+ OUTPUT_FOLDER: ./build
+ outputs:
+ download-url: ${{ steps.transfer.outputs.download-url }}
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Process app name
+ id: process-app-name
+ shell: python3 {0}
+ run: |
+ import os
+ import re
+ os.system("echo ::set-output name=bundle-id::org.26f-studio.techmino")
+ os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}"))
+ - name: Download core love package
+ uses: actions/download-artifact@v3
+ with:
+ name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
+ - name: Download ColdClear
+ uses: ./.github/actions/get-cc
+ with:
+ platform: macOS
+ dir: ./ColdClear
+ - name: Process ColdClear
+ shell: bash
+ run: |
+ rm ./ColdClear/universal/libcold_clear.a
+ - name: Build macOS packages
+ id: build-packages
+ uses: 26F-Studio/love-actions-macos-portable@v1
+ with:
+ app-name: ${{ needs.get-info.outputs.app-name }}
+ bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
+ copyright: "Copyright © 2019-2022 26F-Studio. Some Rights Reserved."
+ icon-path: ./.github/build/macOS/dev/icon.icns
+ love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
+ libs-path: ./ColdClear/universal/
+ product-name: ${{ steps.process-app-name.outputs.product-name }}
+ version-string: ${{ needs.get-info.outputs.version-string }}
+ output-folder: ${{ env.OUTPUT_FOLDER }}
+ account-username: ${{ secrets.APPLE_ACCOUNT_USERNAME }}
+ account-password: ${{ secrets.APPLE_ACCOUNT_PASSWORD }}
+ team-id: "${{ secrets.APPLE_DEVELOPER_TEAM_ID }}"
+ developer-id-application-base64: ${{ secrets.APPLE_CERT_DEVELOPER_ID_APPLICATION }}
+ developer-id-application-password: ${{ secrets.APPLE_CERT_DEVELOPER_ID_APPLICATION_PWD }}
+ developer-id-installer-base64: ${{ secrets.APPLE_CERT_DEVELOPER_ID_INSTALLER }}
+ developer-id-installer-password: ${{ secrets.APPLE_CERT_DEVELOPER_ID_INSTALLER_PWD }}
+ dmg-background-path: ./.github/build/macOS/dev/dmg.png
+ dmg-icon-position: "239 203"
+ dmg-icon-size: "100"
+ dmg-link-position: "565 203"
+ dmg-text-size: "12"
+ dmg-volume-icon-path: ./.github/build/macOS/dev/dmg.icns
+ dmg-volume-name: ${{ steps.process-app-name.outputs.product-name }}
+ dmg-window-position: "200 120"
+ dmg-window-size: "800 500"
+ - name: Upload artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: ${{ needs.get-info.outputs.base-name }}_macOS_portable
+ path: ${{ env.OUTPUT_FOLDER }}/*
+ - name: Upload to WeTransfer
+ id: transfer
+ run: |
+ wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz
+ ./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
+ echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")"
build-windows:
runs-on: windows-latest
- needs: get-info
+ needs: [get-info, build-core, auto-test]
+ env:
+ OUTPUT_FOLDER: ./build
+ outputs:
+ download-url: ${{ steps.transfer.outputs.download-url }}
steps:
- - uses: actions/checkout@v2
- with:
- submodules: 'recursive'
- - uses: ./.github/actions/update-version
- with:
- commit: ${{ needs.get-info.outputs.commit }}
- type: snapshot
- - uses: ./.github/actions/build-windows
- with:
- love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
- love-dir: love-11.3-win64
- arch: win64
- version: ${{ needs.get-info.outputs.name }}
- icon: .\.github\build\Windows\icon_snapshot.ico
- - name: Upload
- uses: actions/upload-artifact@v2
- with:
- name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Windows
- path: love
-
- build-linux:
- runs-on: ubuntu-20.04
- needs: get-info
+ - uses: actions/checkout@v3
+ with:
+ submodules: recursive
+ - name: Process app name
+ id: process-app-name
+ shell: python3 {0}
+ run: |
+ import os
+ import re
+ os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}"))
+ - name: Download core love package
+ uses: actions/download-artifact@v3
+ with:
+ name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
+ - name: Build Windows packages
+ id: build-packages
+ uses: 26F-Studio/love-actions-windows@v1
+ with:
+ icon-path: ./.github/build/windows/dev/icon.ico
+ rc-path: ./.github/build/windows/dev/template.rc
+ love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
+ product-name: ${{ steps.process-app-name.outputs.product-name }}
+ version-string: ${{ needs.get-info.outputs.version-string }}
+ output-folder: ${{ env.OUTPUT_FOLDER }}
+ - name: Upload artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: ${{ needs.get-info.outputs.base-name }}_Windows
+ path: ${{ env.OUTPUT_FOLDER }}/*
+ - name: Get transfer
+ env:
+ TEMP_PATH: ./temp.zip
+ shell: bash
+ run: |
+ curl -L --retry 5 https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_windows_amd64.zip -o ${{ env.TEMP_PATH }}
+ 7z x ${{ env.TEMP_PATH }} -o./
+ rm ${{ env.TEMP_PATH }}
+ - name: Upload to WeTransfer
+ id: transfer
+ run: |
+ ./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
+ echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")"
+ post-build:
+ runs-on: ubuntu-latest
+ if: ${{ always() }}
+ needs:
+ [
+ get-info,
+ auto-test,
+ build-core,
+ build-android,
+ build-ios,
+ build-linux,
+ build-macos-appstore,
+ build-macos-portable,
+ build-windows,
+ ]
steps:
- - uses: actions/checkout@v2
- with:
- submodules: 'recursive'
- - uses: ./.github/actions/update-version
- with:
- commit: ${{ needs.get-info.outputs.commit }}
- type: snapshot
- - uses: ./.github/actions/build-linux
- with:
- icon: .github/build/Linux/icon_snapshot.png
- - name: Upload
- uses: actions/upload-artifact@v2
- with:
- name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Linux
- path: Techmino.AppImage
-
- build-android:
- runs-on: ubuntu-20.04
- needs: get-info
- steps:
- - uses: actions/checkout@v2
- with:
- submodules: 'recursive'
- - uses: ./.github/actions/update-version
- with:
- commit: ${{ needs.get-info.outputs.commit }}
- type: snapshot
- - uses: ./.github/actions/build-android
- with:
- type: Snapshot
- apkCode: ${{ needs.get-info.outputs.apkCode }}
- name: ${{ needs.get-info.outputs.name }}
- file-path: Techmino_Snapshot.apk
- SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
- KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
- ALIAS: ${{ secrets.ALIAS }}
- KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
- - name: Upload
- uses: actions/upload-artifact@v2
- with:
- name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Android
- path: Techmino_Snapshot.apk
-
- build-android-mini:
- runs-on: ubuntu-20.04
- needs: get-info
- steps:
- - uses: actions/checkout@v2
- with:
- submodules: 'recursive'
- - uses: ./.github/actions/update-version
- with:
- commit: ${{ needs.get-info.outputs.commit }}
- type: snapshot
- - name: remove media
- run: |
- rm -rf media/music media/effect media/vocal
- - uses: ./.github/actions/build-android
- with:
- type: Snapshot
- apkCode: ${{ needs.get-info.outputs.apkCode }}
- name: ${{ needs.get-info.outputs.name }}
- file-path: Techmino_Snapshot_Mini.apk
- SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
- KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
- ALIAS: ${{ secrets.ALIAS }}
- KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
- - name: Upload
- uses: actions/upload-artifact@v2
- with:
- name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Android_Mini
- path: Techmino_Snapshot_Mini.apk
-
- build-macOS:
- runs-on: macos-10.15
- needs: get-info
- steps:
- - uses: actions/checkout@v2
- with:
- submodules: 'recursive'
- - uses: ./.github/actions/update-version
- with:
- commit: ${{ needs.get-info.outputs.commit }}
- type: snapshot
- - uses: ./.github/actions/build-macos
- with:
- name: ${{ needs.get-info.outputs.name }}
- icon: .github/build/macOS/icon_snapshot.icns
- APPLE_API_ID: '${{ secrets.APPLE_API_ID }}'
- APPLE_API_ISSUER: '${{ secrets.APPLE_API_ISSUER }}'
- APPLE_API_KEY: '${{ secrets.APPLE_API_KEY }}'
- APPLE_APP_IDENTIFIER: '${{ secrets.APPLE_APP_IDENTIFIER }}'
- APPLE_KEYCHAIN_NAME: '${{ secrets.APPLE_KEYCHAIN_NAME }}'
- APPLE_KEYCHAIN_PWD: '${{ secrets.APPLE_KEYCHAIN_PWD }}'
- FASTLANE_MATCH_PWD: '${{ secrets.FASTLANE_MATCH_PWD }}'
- FASTLANE_MATCH_TOKEN: '${{ secrets.FASTLANE_MATCH_TOKEN }}'
- - name: Upload
- uses: actions/upload-artifact@v2
- with:
- name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_macOS
- path: Techmino.dmg
-
- build-iOS:
- runs-on: macos-latest
- if: (!startsWith( github.ref , 'refs/heads/ci-')) || startsWith( github.ref , 'refs/heads/ci-ios-')
- needs: get-info
- steps:
- - uses: actions/checkout@v2
- with:
- submodules: 'recursive'
- - uses: ./.github/actions/update-version
- with:
- commit: ${{ needs.get-info.outputs.commit }}
- type: snapshot
- - uses: ./.github/actions/build-ios
- with:
- name: ${{ needs.get-info.outputs.name }}
- type: 'dev'
- APPLE_API_ID: '${{ secrets.APPLE_API_ID }}'
- APPLE_API_ISSUER: '${{ secrets.APPLE_API_ISSUER }}'
- APPLE_API_KEY: '${{ secrets.APPLE_API_KEY }}'
- APPLE_APP_BUILD: '${{ needs.get-info.outputs.code }}.2.${{ github.run_number }}.${{ github.run_attempt }}'
- APPLE_APP_CHANGELOG: '${{ github.event.commits[0].message }}'
- APPLE_APP_ID: '${{ secrets.APPLE_APP_ID }}'
- APPLE_APP_IDENTIFIER: '${{ secrets.APPLE_APP_IDENTIFIER }}'
- APPLE_APP_PROFILE: '${{ secrets.APPLE_APP_PROFILE }}'
- APPLE_KEYCHAIN_NAME: '${{ secrets.APPLE_KEYCHAIN_NAME }}'
- APPLE_KEYCHAIN_PWD: '${{ secrets.APPLE_KEYCHAIN_PWD }}'
- FASTLANE_ACTION_ID: '${{ github.run_id }}'
- FASTLANE_DISCORD_WEBHOOK: '${{ secrets.FASTLANE_DISCORD_WEBHOOK }}'
- FASTLANE_MATCH_PWD: '${{ secrets.FASTLANE_MATCH_PWD }}'
- FASTLANE_MATCH_TOKEN: '${{ secrets.FASTLANE_MATCH_TOKEN }}'
- - name: Upload
- uses: actions/upload-artifact@v2
- with:
- name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_iOS
- path: Techmino.ipa
-
- build-love:
- runs-on: ubuntu-20.04
- needs: get-info
- steps:
- - uses: actions/checkout@v2
- with:
- submodules: 'recursive'
- - uses: ./.github/actions/update-version
- - uses: ./.github/actions/build-love
- with:
- file-path: Techmino.love
- - name: Upload
- uses: actions/upload-artifact@v2
- with:
- name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Love
- path: Techmino.love
+ - uses: actions/checkout@v3
+ - name: Cleanup
+ uses: geekyeggo/delete-artifact@v1
+ with:
+ name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
+ - name: Send Discord message
+ uses: Sniddl/discord-commits@v1.3
+ with:
+ webhook: ${{ secrets.DISCORD_WEBHOOK }}
+ message: "Github Actions for **${{ github.repository }}**."
+ embed: '{
+ "author":{
+ "name":"${{ needs.get-info.outputs.app-name }} [Development]",
+ "url":"https://github.com/${{ github.repository }}"
+ },
+ "title":"${{ needs.get-info.outputs.app-name }} (${{ needs.get-info.outputs.version-name }}) Build Result",
+ "description": "CI triggered at ${{ needs.get-info.outputs.commit-hash }}",
+ "url":"https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}",
+ "thumbnail":{
+ "url":"https://raw.githubusercontent.com/${{ github.repository }}/main/.github/build/linux/dev/icon.png"
+ },
+ "color":36863,
+ "fields":[
+ {"name":"Version","value":"${{ needs.get-info.outputs.version-string }}","inline": true},
+ {"name":"Package Name","value":"${{ needs.get-info.outputs.base-name }}","inline": true},
+ {"name":"Status","value":"**Automatic Test:** ${{ needs.auto-test.result }}\n**Core:** ${{ needs.build-core.result }}\n**Android:** ${{ needs.build-android.result }}\n**iOS:** ${{ needs.build-ios.result }}\n**Linux:** ${{ needs.build-linux.result }}\n**macOS App Store:** ${{ needs.build-macos-appstore.result }}\n**macOS portable:** ${{ needs.build-macos-portable.result }}\n**Windows:** ${{ needs.build-windows.result }}"},
+ {"name":"Download Links","value":"**Core:** ${{ needs.build-core.outputs.download-url}}\n**Android:** ${{ needs.build-android.outputs.download-url }}\n**iOS:** ${{ needs.build-ios.outputs.download-url }}\n**Linux:** ${{ needs.build-linux.outputs.download-url }}\n**macOS App Store:** ${{ needs.build-macos-appstore.outputs.download-url }}\n**macOS portable:** ${{ needs.build-macos-portable.outputs.download-url }}\n**Windows:** ${{ needs.build-windows.outputs.download-url}}"}
+ ]
+ }'