Compare commits
286 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98f73aa4c0 | ||
|
|
1db854618e | ||
|
|
940a1bc3f8 | ||
|
|
7463dd96dc | ||
|
|
48e96998a9 | ||
|
|
95a1b03cc5 | ||
|
|
ee4dfa7f51 | ||
|
|
06f403e9d7 | ||
|
|
c03f3f727c | ||
|
|
ed4ba1dc38 | ||
|
|
9663f8c316 | ||
|
|
2478df1242 | ||
|
|
1b54dd3b90 | ||
|
|
001014c70e | ||
|
|
1a444a9e98 | ||
|
|
d5397333d5 | ||
|
|
e1001c74c5 | ||
|
|
5f664c04d6 | ||
|
|
525fa4c25e | ||
|
|
f513760153 | ||
|
|
5faa929bb0 | ||
|
|
5c4557a7b7 | ||
|
|
69a84c035e | ||
|
|
f8277e1c8a | ||
|
|
48f3d293bd | ||
|
|
00bf828ef4 | ||
|
|
d1cef7ed84 | ||
|
|
17bb8dbe6d | ||
|
|
6166c03eab | ||
|
|
303f32f5b2 | ||
|
|
f7e4d7b30d | ||
|
|
f2957dff7b | ||
|
|
cadbe38a8f | ||
|
|
e55d117371 | ||
|
|
1f3d8a212b | ||
|
|
035f30d7e1 | ||
|
|
3202aa18b1 | ||
|
|
0c5d2bdf1a | ||
|
|
db25475c21 | ||
|
|
11b1c23be0 | ||
|
|
5b1eef890d | ||
|
|
3a3d062e5c | ||
|
|
2ee9ed237f | ||
|
|
9159661945 | ||
|
|
0efd2c8044 | ||
|
|
0aaa5822fb | ||
|
|
2b258aeaed | ||
|
|
0d7a80f2b5 | ||
|
|
d433d98c04 | ||
|
|
180dc12460 | ||
|
|
dd1d0b4126 | ||
|
|
f1517fad1a | ||
|
|
62ed279f07 | ||
|
|
6925d59f87 | ||
|
|
848cc41c72 | ||
|
|
f212076604 | ||
|
|
ee4fd51e0f | ||
|
|
f96b4f6724 | ||
|
|
7b6f2f826a | ||
|
|
8ed4fd6cba | ||
|
|
b914cb26be | ||
|
|
97472e9a17 | ||
|
|
dece8c0daa | ||
|
|
5796d1af32 | ||
|
|
06d7a1df6b | ||
|
|
ed293ddad8 | ||
|
|
d7a92344e5 | ||
|
|
3fa020fe91 | ||
|
|
ce19af7da0 | ||
|
|
e558a9fc9d | ||
|
|
fb5544ce0f | ||
|
|
051f0d484c | ||
|
|
108cbea686 | ||
|
|
8b61bd7d8a | ||
|
|
1699a2b68a | ||
|
|
2fca95e81b | ||
|
|
969aa87a10 | ||
|
|
b3dfa7d7ce | ||
|
|
483de50169 | ||
|
|
96762ffa5c | ||
|
|
88d05c2354 | ||
|
|
8aac152ee6 | ||
|
|
d83779662a | ||
|
|
c19e656d46 | ||
|
|
4631a2f440 | ||
|
|
338f5811a1 | ||
|
|
bc634b2eeb | ||
|
|
23cbb9e261 | ||
|
|
fbfbf3c32b | ||
|
|
3073a2e90d | ||
|
|
29e4dc93ab | ||
|
|
2b16a20032 | ||
|
|
59b412899d | ||
|
|
e656ab5e1d | ||
|
|
b90c06da72 | ||
|
|
f62f3652e2 | ||
|
|
dbbec9d2bd | ||
|
|
1be8189058 | ||
|
|
b8b3160ccd | ||
|
|
54fd3995e6 | ||
|
|
e506190c7f | ||
|
|
8f418a0da9 | ||
|
|
0403ee91ea | ||
|
|
47d1856143 | ||
|
|
e521f0fea0 | ||
|
|
eb1e7fd15a | ||
|
|
c9e0a58232 | ||
|
|
9acd8b54e3 | ||
|
|
acd66b1634 | ||
|
|
3820855812 | ||
|
|
056abe7b68 | ||
|
|
bf05b1bda2 | ||
|
|
77a3c146c0 | ||
|
|
5761f7f543 | ||
|
|
5ed5b543ce | ||
|
|
98ae0f2762 | ||
|
|
963bc80439 | ||
|
|
4106dc454e | ||
|
|
0ba26aa836 | ||
|
|
a4c775174b | ||
|
|
29c40c34fe | ||
|
|
44cb889b91 | ||
|
|
915d65d2f4 | ||
|
|
8b7c270cf6 | ||
|
|
a3f07f8ce4 | ||
|
|
91d3252685 | ||
|
|
f9d9112651 | ||
|
|
477a1acc61 | ||
|
|
4770366f74 | ||
|
|
1c66b4dce1 | ||
|
|
3a19bb534a | ||
|
|
f39b3cfd4a | ||
|
|
f0410243c4 | ||
|
|
8abc40707a | ||
|
|
f91fe34a12 | ||
|
|
e9bf6c3b58 | ||
|
|
17c660b5a2 | ||
|
|
ed46f73987 | ||
|
|
e1200b5038 | ||
|
|
7f7ea6ac97 | ||
|
|
f70edaac83 | ||
|
|
d932febe89 | ||
|
|
945a63c51d | ||
|
|
da716ea5c5 | ||
|
|
c6f92a3030 | ||
|
|
267e2dc544 | ||
|
|
cb7d3afdfb | ||
|
|
b57e863c28 | ||
|
|
7aed15fd4f | ||
|
|
6d71b26595 | ||
|
|
1df5406cb3 | ||
|
|
a2b762dcbc | ||
|
|
c2d29c3d6a | ||
|
|
da602eb693 | ||
|
|
9e442a3073 | ||
|
|
bc8b7e733b | ||
|
|
94aa84e380 | ||
|
|
c462c28640 | ||
|
|
b5fbf9cade | ||
|
|
e88957296f | ||
|
|
9e61cb995a | ||
|
|
89a5a718da | ||
|
|
43649c54a3 | ||
|
|
b2b5c99425 | ||
|
|
9e882e6188 | ||
|
|
e688458cfd | ||
|
|
b7c528f5ac | ||
|
|
c743fdcffc | ||
|
|
56e19dd91e | ||
|
|
308512d36a | ||
|
|
749806e553 | ||
|
|
78223334ee | ||
|
|
7f50161ca7 | ||
|
|
dd872a72b2 | ||
|
|
0df17cb4ee | ||
|
|
27244dae04 | ||
|
|
c472d6cbd7 | ||
|
|
e4c786a5d4 | ||
|
|
e291a070f3 | ||
|
|
6b16fcd5f5 | ||
|
|
d79279d1cd | ||
|
|
03fbfaa577 | ||
|
|
8231021426 | ||
|
|
784b2074f8 | ||
|
|
93c9977c86 | ||
|
|
ad1b129dfa | ||
|
|
2d4856551b | ||
|
|
4d0e72d61e | ||
|
|
9b20ec6941 | ||
|
|
5a02265018 | ||
|
|
0dd5c46fd1 | ||
|
|
55831339dd | ||
|
|
e0ba04e579 | ||
|
|
d5f7a6ddd0 | ||
|
|
66a3354883 | ||
|
|
55218e4563 | ||
|
|
081b769ac6 | ||
|
|
8f767b3ab9 | ||
|
|
a2eb7e4a54 | ||
|
|
2de663703b | ||
|
|
40a587dcc4 | ||
|
|
f366a63c8f | ||
|
|
8c603fadee | ||
|
|
5e9ef8d3ab | ||
|
|
2e9cef3ed8 | ||
|
|
354d4f80bf | ||
|
|
a578d537cd | ||
|
|
85ff1cd1c3 | ||
|
|
0d015de359 | ||
|
|
5a0a473d4a | ||
|
|
420ff9a556 | ||
|
|
4f6e99daa2 | ||
|
|
10a57ecc18 | ||
|
|
b101d74df5 | ||
|
|
97d4e58d47 | ||
|
|
b436645ab7 | ||
|
|
af7c73f9f0 | ||
|
|
7d44396b03 | ||
|
|
bd428f355a | ||
|
|
2d6d897e2a | ||
|
|
4913deb15f | ||
|
|
0cb9d3990c | ||
|
|
388e8e1fe1 | ||
|
|
42168ddf16 | ||
|
|
134773765c | ||
|
|
74b099d58f | ||
|
|
c1936441dd | ||
|
|
dc3b7c0825 | ||
|
|
86910f2956 | ||
|
|
7b1df65e64 | ||
|
|
04559efaca | ||
|
|
b668fa4750 | ||
|
|
a4db061485 | ||
|
|
d4d97f1e7f | ||
|
|
e682202b60 | ||
|
|
2480987f10 | ||
|
|
b0acdce294 | ||
|
|
7953cf735b | ||
|
|
d074a85fbc | ||
|
|
543e85e94c | ||
|
|
23f43df737 | ||
|
|
43b6ff7697 | ||
|
|
6ecc80ac0f | ||
|
|
3ae0e80ce5 | ||
|
|
d12f8a27e7 | ||
|
|
f9bbb8fce6 | ||
|
|
80984cddf9 | ||
|
|
8fb0b2e600 | ||
|
|
9a4e8ab4ec | ||
|
|
dc1973e049 | ||
|
|
ccb05230f2 | ||
|
|
7ac6f45b9b | ||
|
|
df7ab20636 | ||
|
|
c06961c9c8 | ||
|
|
37b76a1cb4 | ||
|
|
01d02a916d | ||
|
|
8e99565a9d | ||
|
|
f8d17b23b6 | ||
|
|
06f4bb4e1a | ||
|
|
6e00ff96ec | ||
|
|
468bbc8053 | ||
|
|
f41999c019 | ||
|
|
d259e05ca7 | ||
|
|
2491a436c2 | ||
|
|
7a55e447fc | ||
|
|
f3face791f | ||
|
|
9ccc019bb9 | ||
|
|
bc9f00d09f | ||
|
|
33c470dd38 | ||
|
|
9e0e93de5d | ||
|
|
16553e13a2 | ||
|
|
d031dc3a82 | ||
|
|
7297eb8ee8 | ||
|
|
55bcdd426b | ||
|
|
139e2e14c4 | ||
|
|
339b53115a | ||
|
|
03515b4490 | ||
|
|
9690a345a3 | ||
|
|
8324f72e90 | ||
|
|
15eefc0e9f | ||
|
|
d504bd3d49 | ||
|
|
fd4b4f1882 | ||
|
|
a176ef35a0 | ||
|
|
0fc7178589 | ||
|
|
76d985cc0f | ||
|
|
aa05e8857b |
6
.github/actions/get-cc/action.yml
vendored
6
.github/actions/get-cc/action.yml
vendored
@@ -3,7 +3,7 @@ description: 'download cc into specific dir'
|
||||
inputs:
|
||||
tag:
|
||||
required: false
|
||||
default: "11.4"
|
||||
default: "11.4.2"
|
||||
platform:
|
||||
required: true
|
||||
dir:
|
||||
@@ -19,10 +19,10 @@ runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- run: |
|
||||
echo "::set-output name=tag::"$(if [ -z "${{ inputs.tag }}" ]
|
||||
echo "tag="$(if [ -z "${{ inputs.tag }}" ]
|
||||
then curl -w '%{url_effective}' -I -L -s -S https://github.com/${{ inputs.repo }}/releases/latest -o /dev/null | grep -o '\<[^/]*$'
|
||||
else echo ${{ inputs.tag }}
|
||||
fi)
|
||||
fi) >> $GITHUB_OUTPUT
|
||||
id: get-tag
|
||||
shell: bash
|
||||
- uses: ./.github/actions/get-unzip
|
||||
|
||||
10
.github/build/linux/dev/template.desktop
vendored
10
.github/build/linux/dev/template.desktop
vendored
@@ -1,10 +0,0 @@
|
||||
[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
|
||||
1
.github/build/linux/release/.gitattributes
vendored
1
.github/build/linux/release/.gitattributes
vendored
@@ -1 +0,0 @@
|
||||
*.template text eol=lf
|
||||
10
.github/build/linux/release/template.desktop
vendored
10
.github/build/linux/release/template.desktop
vendored
@@ -1,10 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Name=Techmino
|
||||
Comment=Techmino is fun!
|
||||
MimeType=application/x-love-game;
|
||||
Exec=app %f
|
||||
Type=Application
|
||||
Categories=Game;
|
||||
Terminal=false
|
||||
Icon=icon
|
||||
NoDisplay=false
|
||||
7
.github/build/windows/dev/template.rc
vendored
7
.github/build/windows/dev/template.rc
vendored
@@ -8,9 +8,12 @@ FILETYPE 0x1
|
||||
{
|
||||
BLOCK "040904B0"
|
||||
{
|
||||
VALUE "FileDescription", "Techmino Development"
|
||||
VALUE "CompanyName", "26F Studio"
|
||||
VALUE "LegalCopyright", "Copyright @ 26F Studio"
|
||||
VALUE "FileDescription", "Techmino Development"
|
||||
VALUE "FileVersion", "@Version"
|
||||
VALUE "InternalName", "Techmino"
|
||||
VALUE "LegalCopyright", "Copyright © 2019-2023 26F-Studio. Some Rights Reserved."
|
||||
VALUE "OriginalFilename", "Techmino.exe"
|
||||
VALUE "ProductName", "Techmino"
|
||||
VALUE "ProductVersion", "@Version"
|
||||
}
|
||||
|
||||
7
.github/build/windows/release/template.rc
vendored
7
.github/build/windows/release/template.rc
vendored
@@ -8,9 +8,12 @@ FILETYPE 0x1
|
||||
{
|
||||
BLOCK "040904B0"
|
||||
{
|
||||
VALUE "FileDescription", "Techmino"
|
||||
VALUE "CompanyName", "26F Studio"
|
||||
VALUE "LegalCopyright", "Copyright @ 26F Studio"
|
||||
VALUE "FileDescription", "Techmino"
|
||||
VALUE "FileVersion", "@Version"
|
||||
VALUE "InternalName", "Techmino"
|
||||
VALUE "LegalCopyright", "Copyright © 2019-2023 26F-Studio. Some Rights Reserved."
|
||||
VALUE "OriginalFilename", "Techmino.exe"
|
||||
VALUE "ProductName", "Techmino"
|
||||
VALUE "ProductVersion", "@Version"
|
||||
}
|
||||
|
||||
381
.github/workflows/main.yml
vendored
381
.github/workflows/main.yml
vendored
@@ -20,6 +20,8 @@ jobs:
|
||||
version-name: ${{ steps.app-info.outputs.version-name }}
|
||||
version-string: ${{ steps.app-info.outputs.version-string }}
|
||||
version-code: ${{ steps.app-info.outputs.version-code }}
|
||||
update-title: ${{ steps.app-info.outputs.update-title }}
|
||||
update-note: ${{ steps.app-info.outputs.update-note }}
|
||||
commit-hash: ${{ steps.git-info.outputs.commit-hash }}
|
||||
base-name: ${{ steps.assemble-base-name.outputs.base-name }}
|
||||
steps:
|
||||
@@ -32,30 +34,42 @@ jobs:
|
||||
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))
|
||||
os.execute('echo "app-name=Techmino" >> $GITHUB_OUTPUT')
|
||||
os.execute('echo "version-name=' .. version.name .. '" >> $GITHUB_OUTPUT')
|
||||
os.execute('echo "version-string=' .. version.string:gsub("%a", "") .. '" >> $GITHUB_OUTPUT')
|
||||
os.execute('echo "version-code=' .. tostring(version.code) .. '" >> $GITHUB_OUTPUT')
|
||||
|
||||
local note = require 'parts.updateLog'
|
||||
local p1 = note:find("\n%d") + 1
|
||||
local p2 = note:find("\n", p1) - 1
|
||||
os.execute('echo "update-title=' .. note:sub(p1, p2) .. '" >> $GITHUB_OUTPUT')
|
||||
local p3 = note:find("\n", note:find("\n%d") + 1) + 1
|
||||
local p4 = note:find("\n%d", p3 + 1)
|
||||
updateNote = note:sub(p3, p4 - 2)
|
||||
:gsub(" ", "- ")
|
||||
:gsub(" ", "# ")
|
||||
os.execute('echo "update-note<<EOF" >> $GITHUB_OUTPUT')
|
||||
os.execute('echo "' .. updateNote .. '" >> $GITHUB_OUTPUT')
|
||||
os.execute('echo "EOF" >> $GITHUB_OUTPUT')
|
||||
- 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
|
||||
echo "commit-hash=$COMMIT_HASH" >> $GITHUB_OUTPUT
|
||||
- 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
|
||||
echo "base-name=$BASE_NAME" >> $GITHUB_OUTPUT
|
||||
|
||||
build-core:
|
||||
runs-on: ubuntu-latest
|
||||
needs: get-info
|
||||
env:
|
||||
OUTPUT_FOLDER: ./build
|
||||
outputs:
|
||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
||||
RELEASE_FOLDER: ./release
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
@@ -66,14 +80,15 @@ jobs:
|
||||
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 }}"))
|
||||
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
||||
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
||||
- uses: ./.github/actions/update-version
|
||||
if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
|
||||
with:
|
||||
commit: ${{ needs.get-info.outputs.commit-hash }}
|
||||
type: snapshot
|
||||
- name: Build core love package
|
||||
uses: 26F-Studio/love-actions-core@v1
|
||||
uses: love-actions/love-actions-core@v1
|
||||
with:
|
||||
build-list: ./media/ ./parts/ ./Zframework/ ./conf.lua ./main.lua ./version.lua
|
||||
package-path: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||
@@ -82,6 +97,11 @@ jobs:
|
||||
with:
|
||||
name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
|
||||
path: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||
- name: Add icon to love package
|
||||
run: |
|
||||
cp ./.github/build/linux/${{ env.BUILD_TYPE }}/icon.png media/image/icon.png
|
||||
zip -u ${{ env.CORE_LOVE_PACKAGE_PATH }} media/image/icon.png
|
||||
rm media/image/icon.png
|
||||
- name: Rename love package
|
||||
run: |
|
||||
mkdir -p ${{ env.OUTPUT_FOLDER }}
|
||||
@@ -91,23 +111,21 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.base-name }}_Core_love
|
||||
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love
|
||||
- name: Upload release
|
||||
- name: Prepare for release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
body: ${{ github.event.head_commit.message }}
|
||||
files: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
- name: Upload to WeTransfer
|
||||
id: transfer
|
||||
run: |
|
||||
curl -sL https://git.io/file-transfer | sh
|
||||
./transfer wet -s -p 16 --no-progress ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love 2>&1>./wetransfer.log
|
||||
echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")"
|
||||
- name: Show download link
|
||||
shell: bash
|
||||
run: |
|
||||
echo "::notice title=Bare love package::${{ steps.transfer.outputs.download-url }}"
|
||||
mkdir -p ${{ env.RELEASE_FOLDER }}
|
||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Bare.love
|
||||
- name: Upload release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
allowUpdates: true
|
||||
artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Bare.love
|
||||
body: ${{ needs.get-info.outputs.update-note }}
|
||||
name: ${{ needs.get-info.outputs.update-title }}
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
|
||||
auto-test:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -117,7 +135,7 @@ jobs:
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Love actions for testing
|
||||
uses: 26F-Studio/love-actions-test@v1
|
||||
uses: love-actions/love-actions-test@v1
|
||||
with:
|
||||
font-path: ./parts/fonts/proportional.otf
|
||||
language-folder: ./parts/language
|
||||
@@ -125,10 +143,10 @@ jobs:
|
||||
build-android:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [get-info, build-core, auto-test]
|
||||
if: github.event_name != 'pull_request'
|
||||
env:
|
||||
OUTPUT_FOLDER: ./build
|
||||
outputs:
|
||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
||||
RELEASE_FOLDER: ./release
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
@@ -139,8 +157,13 @@ jobs:
|
||||
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 }}") + ".snapshot")
|
||||
os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}") + "_Snapshot")
|
||||
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
||||
if "${{ env.BUILD_TYPE }}" == "dev":
|
||||
f.write('bundle-id=org.f26_studio.' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '.snapshot\n')
|
||||
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '-', '${{ needs.get-info.outputs.app-name }}') + '_Snapshot\n')
|
||||
else:
|
||||
f.write('bundle-id=org.f26_studio.' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
||||
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '-', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
||||
- name: Download core love package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
@@ -149,17 +172,10 @@ jobs:
|
||||
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/
|
||||
dir: ./libAndroid
|
||||
- name: Build Android packages
|
||||
id: build-packages
|
||||
uses: 26F-Studio/love-actions-android@v1
|
||||
uses: love-actions/love-actions-android@main
|
||||
with:
|
||||
app-name: ${{ needs.get-info.outputs.app-name }}
|
||||
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
|
||||
@@ -170,13 +186,13 @@ jobs:
|
||||
keystore-store-password: ${{ secrets.ANDROID_KEYSTORE_STOREPASSWORD }}
|
||||
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||
resource-path: ./.github/build/android/${{ env.BUILD_TYPE }}/res
|
||||
libs-path: ./ColdClear/
|
||||
extra-assets: ./libAndroid/
|
||||
custom-scheme: studio26f://oauth
|
||||
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 release artifact
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.base-name }}_Android_release
|
||||
@@ -185,33 +201,25 @@ jobs:
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p release
|
||||
mv ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}-release.apk release/${{ steps.process-app-name.outputs.product-name }}.apk
|
||||
mkdir -p ${{ env.RELEASE_FOLDER }}
|
||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}-release.apk ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Android.apk
|
||||
- name: Upload release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
body: ${{ github.event.head_commit.message }}
|
||||
files: release/${{ steps.process-app-name.outputs.product-name }}.apk
|
||||
allowUpdates: true
|
||||
artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Android.apk
|
||||
body: ${{ needs.get-info.outputs.update-note }}
|
||||
name: ${{ needs.get-info.outputs.update-title }}
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
- 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" ")"
|
||||
- name: Show download link
|
||||
shell: bash
|
||||
run: |
|
||||
echo "::notice title=Android packages::${{ steps.transfer.outputs.download-url }}"
|
||||
|
||||
build-ios:
|
||||
runs-on: macos-latest
|
||||
needs: [get-info, build-core, auto-test]
|
||||
if: github.event_name != 'pull_request'
|
||||
env:
|
||||
OUTPUT_FOLDER: ./build
|
||||
outputs:
|
||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
||||
RELEASE_FOLDER: ./release
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
@@ -222,8 +230,9 @@ jobs:
|
||||
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 }}"))
|
||||
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
||||
f.write('bundle-id=org.26f-studio.techmino\n')
|
||||
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
||||
- name: Download core love package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
@@ -235,11 +244,11 @@ jobs:
|
||||
dir: ./ColdClear
|
||||
- name: Build iOS packages
|
||||
id: build-packages
|
||||
uses: 26F-Studio/love-actions-ios@v1
|
||||
uses: love-actions/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."
|
||||
copyright: "Copyright © 2019-2023 26F-Studio. Some Rights Reserved."
|
||||
icon-path: ./.github/build/iOS/${{ env.BUILD_TYPE }}/icon
|
||||
love-patch: ./.github/build/iOS/love.patch
|
||||
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||
@@ -269,31 +278,28 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.base-name }}_iOS_ipa
|
||||
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.ipa
|
||||
- name: Upload release
|
||||
- name: Prepare for release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
body: ${{ github.event.head_commit.message }}
|
||||
files: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.ipa
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
- 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" ")"
|
||||
- name: Show download link
|
||||
shell: bash
|
||||
run: |
|
||||
echo "::notice title=iOS packages::${{ steps.transfer.outputs.download-url }}"
|
||||
mkdir -p ${{ env.RELEASE_FOLDER }}
|
||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.ipa ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_iOS.ipa
|
||||
- name: Upload release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
allowUpdates: true
|
||||
artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_iOS.ipa
|
||||
body: ${{ needs.get-info.outputs.update-note }}
|
||||
name: ${{ needs.get-info.outputs.update-title }}
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
|
||||
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 }}
|
||||
RELEASE_FOLDER: ./release
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
@@ -304,11 +310,20 @@ jobs:
|
||||
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 }}"))
|
||||
|
||||
product_name = re.sub(r'[^A-Za-z0-9]+', '-', '${{ needs.get-info.outputs.app-name }}').strip('-').lower()
|
||||
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
||||
f.write('bundle-id=org.26f-studio.' + product_name + '\n')
|
||||
f.write('product-name=' + product_name + '\n')
|
||||
- name: Download core love package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
|
||||
- name: Add icon to love package
|
||||
run: |
|
||||
cp ./.github/build/linux/${{ env.BUILD_TYPE }}/icon.png media/image/icon.png
|
||||
zip -u ${{ env.CORE_LOVE_PACKAGE_PATH }} media/image/icon.png
|
||||
rm media/image/icon.png
|
||||
- name: Download ColdClear
|
||||
uses: ./.github/actions/get-cc
|
||||
with:
|
||||
@@ -318,20 +333,19 @@ jobs:
|
||||
shell: bash
|
||||
run: |
|
||||
cd ./ColdClear
|
||||
mkdir ./libs
|
||||
mv ./x64/libcold_clear.so ./libs
|
||||
mkdir ./shared
|
||||
mv ./x64/CCloader.so ./shared
|
||||
mkdir -p ./lib/lua/5.1
|
||||
mv ./x64/CCloader.so ./lib/lua/5.1
|
||||
- name: Build Linux packages
|
||||
id: build-packages
|
||||
uses: 26F-Studio/love-actions-linux@v1
|
||||
uses: love-actions/love-actions-linux@v1
|
||||
with:
|
||||
desktop-file-path: ./.github/build/linux/${{ env.BUILD_TYPE }}/template.desktop
|
||||
executable-name: app
|
||||
app-name: ${{ needs.get-info.outputs.app-name }}
|
||||
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
|
||||
description: Techmino is fun!
|
||||
version-string: ${{ needs.get-info.outputs.version-string }}
|
||||
icon-path: ./.github/build/linux/${{ env.BUILD_TYPE }}/icon.png
|
||||
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||
libs-path: ./ColdClear/libs/
|
||||
shared-path: ./ColdClear/shared/
|
||||
lib-path: ./ColdClear/lib
|
||||
product-name: ${{ steps.process-app-name.outputs.product-name }}
|
||||
output-folder: ${{ env.OUTPUT_FOLDER }}
|
||||
- name: Upload AppImage artifact
|
||||
@@ -339,31 +353,37 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.base-name }}_Linux_AppImage
|
||||
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.AppImage
|
||||
- name: Upload release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: softprops/action-gh-release@v1
|
||||
- name: Upload Debian artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
body: ${{ github.event.head_commit.message }}
|
||||
files: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.AppImage
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
- 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" ")"
|
||||
- name: Show download link
|
||||
name: ${{ needs.get-info.outputs.base-name }}_Linux_Debian
|
||||
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.deb
|
||||
- name: Prepare for release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
shell: bash
|
||||
run: |
|
||||
echo "::notice title=Linux packages::${{ steps.transfer.outputs.download-url }}"
|
||||
mkdir -p ${{ env.RELEASE_FOLDER }}
|
||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.AppImage ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.AppImage
|
||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.deb ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.deb
|
||||
- name: Upload release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
allowUpdates: true
|
||||
artifacts: |
|
||||
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.AppImage
|
||||
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.deb
|
||||
body: ${{ needs.get-info.outputs.update-note }}
|
||||
name: ${{ needs.get-info.outputs.update-title }}
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
|
||||
build-macos-appstore:
|
||||
runs-on: macos-latest
|
||||
needs: [get-info, build-core, auto-test]
|
||||
if: github.event_name != 'pull_request'
|
||||
env:
|
||||
OUTPUT_FOLDER: ./build
|
||||
outputs:
|
||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
||||
RELEASE_FOLDER: ./release
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
@@ -374,8 +394,9 @@ jobs:
|
||||
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 }}"))
|
||||
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
||||
f.write('bundle-id=org.26f-studio.techmino\n')
|
||||
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
||||
- name: Download core love package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
@@ -391,11 +412,11 @@ jobs:
|
||||
rm ./ColdClear/universal/libcold_clear.a
|
||||
- name: Build macOS packages
|
||||
id: build-packages
|
||||
uses: 26F-Studio/love-actions-macos-appstore@v1
|
||||
uses: love-actions/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."
|
||||
copyright: "Copyright © 2019-2023 26F-Studio. Some Rights Reserved."
|
||||
icon-path: ./.github/build/macOS/${{ env.BUILD_TYPE }}/icon.icns
|
||||
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||
libs-path: ./ColdClear/universal/
|
||||
@@ -424,31 +445,29 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.base-name }}_macOS_appstore_pkg
|
||||
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.pkg
|
||||
- name: Upload release
|
||||
- name: Prepare for release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
body: ${{ github.event.head_commit.message }}
|
||||
files: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.pkg
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
- 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" ")"
|
||||
- name: Show download link
|
||||
shell: bash
|
||||
run: |
|
||||
echo "::notice title=macOS App Store packages::${{ steps.transfer.outputs.download-url }}"
|
||||
mkdir -p ${{ env.RELEASE_FOLDER }}
|
||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.pkg ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_appstore.pkg
|
||||
- name: Upload release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
allowUpdates: true
|
||||
artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_appstore.pkg
|
||||
body: ${{ needs.get-info.outputs.update-note }}
|
||||
name: ${{ needs.get-info.outputs.update-title }}
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
|
||||
build-macos-portable:
|
||||
runs-on: macos-latest
|
||||
needs: [get-info, build-core, auto-test]
|
||||
if: github.event_name != 'pull_request'
|
||||
env:
|
||||
OUTPUT_FOLDER: ./build
|
||||
outputs:
|
||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
||||
RELEASE_FOLDER: ./release
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
@@ -459,8 +478,9 @@ jobs:
|
||||
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 }}"))
|
||||
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
||||
f.write('bundle-id=org.26f-studio.techmino\n')
|
||||
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
||||
- name: Download core love package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
@@ -476,11 +496,11 @@ jobs:
|
||||
rm ./ColdClear/universal/libcold_clear.a
|
||||
- name: Build macOS packages
|
||||
id: build-packages
|
||||
uses: 26F-Studio/love-actions-macos-portable@v1
|
||||
uses: love-actions/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."
|
||||
copyright: "Copyright © 2019-2023 26F-Studio. Some Rights Reserved."
|
||||
icon-path: ./.github/build/macOS/${{ env.BUILD_TYPE }}/icon.icns
|
||||
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||
libs-path: ./ColdClear/universal/
|
||||
@@ -518,33 +538,31 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.base-name }}_macOS_portable_bare
|
||||
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.zip
|
||||
- name: Upload release
|
||||
- name: Prepare for release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
body: ${{ github.event.head_commit.message }}
|
||||
files: |
|
||||
${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.pkg
|
||||
${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.dmg
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
- 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" ")"
|
||||
- name: Show download link
|
||||
shell: bash
|
||||
run: |
|
||||
echo "::notice title=macOS portable packages::${{ steps.transfer.outputs.download-url }}"
|
||||
mkdir -p ${{ env.RELEASE_FOLDER }}
|
||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.pkg ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.pkg
|
||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.dmg ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.dmg
|
||||
- name: Upload release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
allowUpdates: true
|
||||
artifacts: |
|
||||
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.pkg
|
||||
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.dmg
|
||||
body: ${{ needs.get-info.outputs.update-note }}
|
||||
name: ${{ needs.get-info.outputs.update-title }}
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
needs: [get-info, build-core, auto-test]
|
||||
env:
|
||||
OUTPUT_FOLDER: ./build
|
||||
outputs:
|
||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
||||
RELEASE_FOLDER: ./release
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
@@ -555,7 +573,8 @@ jobs:
|
||||
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 }}"))
|
||||
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
||||
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
||||
- name: Download core love package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
@@ -565,9 +584,22 @@ jobs:
|
||||
with:
|
||||
platform: Windows
|
||||
dir: ./ColdClear
|
||||
- name: Update Windows template
|
||||
shell: python3 {0}
|
||||
run: |
|
||||
version_string = "${{ needs.get-info.outputs.version-string }}"
|
||||
file_version = (f"{version_string.replace('.', ',')},0")
|
||||
with open("./.github/build/windows/${{ env.BUILD_TYPE }}/template.rc", "r+", encoding="utf8") as file:
|
||||
data = file.read()
|
||||
data = data\
|
||||
.replace("@Version", version_string)\
|
||||
.replace("@FileVersion", file_version)
|
||||
file.seek(0)
|
||||
file.truncate()
|
||||
file.write(data)
|
||||
- name: Build Windows packages
|
||||
id: build-packages
|
||||
uses: 26F-Studio/love-actions-windows@v1
|
||||
uses: love-actions/love-actions-windows@v1
|
||||
with:
|
||||
icon-path: ./.github/build/windows/${{ env.BUILD_TYPE }}/icon.ico
|
||||
rc-path: ./.github/build/windows/${{ env.BUILD_TYPE }}/template.rc
|
||||
@@ -575,7 +607,9 @@ jobs:
|
||||
extra-assets-x86: ./ColdClear/x86/CCloader.dll ./ColdClear/x86/cold_clear.dll
|
||||
extra-assets-x64: ./ColdClear/x64/CCloader.dll ./ColdClear/x64/cold_clear.dll
|
||||
product-name: ${{ steps.process-app-name.outputs.product-name }}
|
||||
version-string: ${{ needs.get-info.outputs.version-string }}
|
||||
app-id: ${{ secrets.WINDOWS_APP_ID }}
|
||||
project-website: https://www.studio26f.org/
|
||||
installer-languages: ChineseSimplified.isl ChineseTraditional.isl English.isl Spanish.isl French.isl Indonesian.isl Japanese.isl Portuguese.isl
|
||||
output-folder: ${{ env.OUTPUT_FOLDER }}
|
||||
- name: Upload 32-bit artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
@@ -587,32 +621,31 @@ jobs:
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.base-name }}_Windows_x64
|
||||
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x64.zip
|
||||
- name: Upload installer artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ needs.get-info.outputs.base-name }}_Windows_installer
|
||||
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_installer.exe
|
||||
- name: Prepare for release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p ${{ env.RELEASE_FOLDER }}
|
||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x86.zip ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x86.zip
|
||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x64.zip ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x64.zip
|
||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_installer.exe ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_installer.exe
|
||||
- name: Upload release
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
body: ${{ github.event.head_commit.message }}
|
||||
files: |
|
||||
${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x86.zip
|
||||
${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x64.zip
|
||||
allowUpdates: true
|
||||
artifacts: |
|
||||
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x86.zip
|
||||
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x64.zip
|
||||
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_installer.exe
|
||||
body: ${{ needs.get-info.outputs.update-note }}
|
||||
name: ${{ needs.get-info.outputs.update-title }}
|
||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||
- 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" ")"
|
||||
- name: Show download link
|
||||
shell: bash
|
||||
run: |
|
||||
echo "::notice title=Windows packages::${{ steps.transfer.outputs.download-url }}"
|
||||
|
||||
post-build:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -634,11 +667,12 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Cleanup
|
||||
uses: geekyeggo/delete-artifact@v1
|
||||
uses: geekyeggo/delete-artifact@v2
|
||||
with:
|
||||
name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
|
||||
- name: Send Discord message
|
||||
uses: Sniddl/discord-commits@v1.3
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: Sniddl/discord-commits@v1.6
|
||||
with:
|
||||
webhook: ${{ secrets.DISCORD_WEBHOOK }}
|
||||
message: "Github Actions for **${{ github.repository }}**."
|
||||
@@ -657,7 +691,6 @@ jobs:
|
||||
"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}}"}
|
||||
{"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 }}"}
|
||||
]
|
||||
}'
|
||||
|
||||
Submodule Zframework updated: 963af77fe2...7f7b0eb857
64
conf.lua
64
conf.lua
@@ -1,29 +1,32 @@
|
||||
SYSTEM=love._os if SYSTEM=='OS X' then SYSTEM='macOS' end
|
||||
MOBILE=SYSTEM=='Android' or SYSTEM=='iOS'
|
||||
FNNS=SYSTEM:find'\79\83'-- What does FNSF stand for? IDK so don't ask me lol
|
||||
|
||||
function love.conf(t)
|
||||
t.identity='Techmino'--Saving folder
|
||||
t.version="11.1"
|
||||
local identity='Techmino'
|
||||
local msaa=0
|
||||
local portrait=false
|
||||
|
||||
local fs=love.filesystem
|
||||
fs.setIdentity(identity)
|
||||
do -- Load grapgic settings from conf/settings
|
||||
local fileData=fs.read('conf/settings')
|
||||
if fileData then
|
||||
msaa=tonumber(fileData:match('"msaa":(%d+)')) or 0;
|
||||
portrait=MOBILE and fileData:find('"portrait":true') and true
|
||||
end
|
||||
end
|
||||
|
||||
t.identity=identity -- Saving folder
|
||||
t.version="11.4"
|
||||
t.gammacorrect=false
|
||||
t.appendidentity=true--Search files in source then in save directory
|
||||
t.accelerometerjoystick=false--Accelerometer=joystick on ios/android
|
||||
t.appendidentity=true -- Search files in source then in save directory
|
||||
t.accelerometerjoystick=false -- Accelerometer=joystick on ios/android
|
||||
if t.audio then
|
||||
t.audio.mic=false
|
||||
t.audio.mixwithsystem=true
|
||||
end
|
||||
|
||||
local W=t.window
|
||||
W.title="Techmino "..require"version".string
|
||||
W.width,W.height=1280,720
|
||||
W.minwidth,W.minheight=640,360
|
||||
W.borderless=false
|
||||
W.resizable=true
|
||||
W.fullscreen=false
|
||||
W.vsync=0--Unlimited FPS
|
||||
W.msaa=0--Multi-sampled antialiasing
|
||||
W.depth=0--Bits/samp of depth buffer
|
||||
W.stencil=1--Bits/samp of stencil buffer
|
||||
W.display=1--Monitor ID
|
||||
W.highdpi=true--High-dpi mode for the window on a Retina display
|
||||
W.x,W.y=nil
|
||||
|
||||
local M=t.modules
|
||||
M.window,M.system,M.event,M.thread=true,true,true,true
|
||||
M.timer,M.math,M.data=true,true,true
|
||||
@@ -31,4 +34,27 @@ function love.conf(t)
|
||||
M.graphics,M.font,M.image=true,true,true
|
||||
M.mouse,M.touch,M.keyboard,M.joystick=true,true,true,true
|
||||
M.physics=false
|
||||
|
||||
local W=t.window
|
||||
W.vsync=0 -- Unlimited FPS
|
||||
W.msaa=msaa -- Multi-sampled antialiasing
|
||||
W.depth=0 -- Bits/samp of depth buffer
|
||||
W.stencil=1 -- Bits/samp of stencil buffer
|
||||
W.display=1 -- Monitor ID
|
||||
W.highdpi=true -- High-dpi mode for the window on a Retina display
|
||||
W.x,W.y=nil,nil -- Position of the window
|
||||
W.borderless=MOBILE -- Display window frame
|
||||
W.resizable=not MOBILE -- Whether window is resizable
|
||||
W.fullscreentype=MOBILE and "exclusive" or "desktop" -- Fullscreen type
|
||||
if portrait then
|
||||
W.width,W.height=720,1280
|
||||
W.minwidth,W.minheight=360,640
|
||||
else
|
||||
W.width,W.height=1280,720
|
||||
W.minwidth,W.minheight=640,360
|
||||
end
|
||||
W.title="Techmino "..require "version".string -- Window title
|
||||
if fs.getInfo('media/image/icon.png') then
|
||||
W.icon='media/image/icon.png'
|
||||
end
|
||||
end
|
||||
|
||||
557
main.lua
557
main.lua
@@ -15,40 +15,30 @@
|
||||
]]--
|
||||
|
||||
|
||||
--Var leak check
|
||||
-- setmetatable(_G,{__newindex=function(self,k,v)print('>>'..k)print(debug.traceback():match("\n.-\n\t(.-): "))rawset(self,k,v)end})
|
||||
-- Var leak check
|
||||
-- setmetatable(_G,{__newindex=function(self,k,v) print('>>'..k..string.rep(" ",26-#k),debug.traceback():match("\n.-\n\t(.-): "))rawset(self,k,v) end})
|
||||
|
||||
--System Global Vars Declaration
|
||||
-- System Global Vars Declaration
|
||||
local fs=love.filesystem
|
||||
VERSION=require"version"
|
||||
TIME=love.timer.getTime
|
||||
YIELD=coroutine.yield
|
||||
SYSTEM=love.system.getOS()if SYSTEM=='OS X'then SYSTEM='macOS'end
|
||||
FNNS=SYSTEM:find'\79\83'--What does FNSF stand for? IDK so don't ask me lol
|
||||
MOBILE=SYSTEM=='Android'or SYSTEM=='iOS'
|
||||
SAVEDIR=fs.getSaveDirectory()
|
||||
|
||||
--Global Vars & Settings
|
||||
-- Global Vars & Settings
|
||||
SFXPACKS={'chiptune'}
|
||||
VOCPACKS={'miya','mono','xiaoya','miku','rin'}
|
||||
VOCPACKS={'miya','mono','xiaoya','miku','zundamon'}
|
||||
FIRSTLAUNCH=false
|
||||
DAILYLAUNCH=false
|
||||
|
||||
--System setting
|
||||
-- System setting
|
||||
math.randomseed(os.time()*626)
|
||||
love.setDeprecationOutput(false)
|
||||
love.keyboard.setKeyRepeat(true)
|
||||
love.keyboard.setTextInput(false)
|
||||
if MOBILE then
|
||||
local w,h,f=love.window.getMode()
|
||||
f.resizable=false
|
||||
love.window.setMode(w,h,f)
|
||||
end
|
||||
|
||||
local _LOADTIMELIST_={}
|
||||
local _LOADTIME_=TIME()
|
||||
|
||||
--Load modules
|
||||
-- Load modules
|
||||
Z=require'Zframework'
|
||||
FONT.load{
|
||||
norm='parts/fonts/proportional.otf',
|
||||
@@ -57,27 +47,24 @@ FONT.load{
|
||||
FONT.setDefault('norm')
|
||||
FONT.setFallback('norm')
|
||||
|
||||
SCR.setSize(1280,720)--Initialize Screen size
|
||||
SCR.setSize(1280,720)-- Initialize Screen size
|
||||
BGM.setMaxSources(5)
|
||||
BGM.setChange(function(name)MES.new('music',text.nowPlaying..name,5)end)
|
||||
VOC.setDiversion(.62)
|
||||
|
||||
WIDGET.setOnChange(function()
|
||||
if SCN.cur~='custom_field'then
|
||||
if SCN.cur~='net_game' and SCN.cur~='custom_field' then
|
||||
local colorList=THEME.getThemeColor()
|
||||
if not colorList then return end
|
||||
local rnd=math.random
|
||||
for _,W in next,SCN.scenes[SCN.cur].widgetList do
|
||||
if W.color then
|
||||
W.color=colorList[rnd(#colorList)]
|
||||
if colorList then
|
||||
for _,W in next,SCN.scenes[SCN.cur].widgetList do
|
||||
if W.color then
|
||||
W.color=colorList[math.random(#colorList)]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Load Zframework: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
--Create shortcuts
|
||||
-- Create shortcuts
|
||||
setFont=FONT.set
|
||||
getFont=FONT.get
|
||||
mText=GC.simpX
|
||||
@@ -87,33 +74,34 @@ string.repD=STRING.repD
|
||||
string.sArg=STRING.sArg
|
||||
string.split=STRING.split
|
||||
|
||||
--Delete all naked files (from ancient versions)
|
||||
-- Delete all naked files (from ancient versions)
|
||||
FILE.clear('')
|
||||
|
||||
--Create directories
|
||||
for _,v in next,{'conf','record','replay','cache','lib'}do
|
||||
-- Create directories
|
||||
for _,v in next,{'conf','record','replay','cache','lib'} do
|
||||
local info=fs.getInfo(v)
|
||||
if not info then
|
||||
fs.createDirectory(v)
|
||||
elseif info.type~='directory'then
|
||||
elseif info.type~='directory' then
|
||||
fs.remove(v)
|
||||
fs.createDirectory(v)
|
||||
end
|
||||
end
|
||||
|
||||
CHAR=require'parts.char'
|
||||
require'parts.gameTables'
|
||||
require'parts.gameFuncs'
|
||||
|
||||
--Load shader files from SOURCE ONLY
|
||||
-- Load shader files from SOURCE ONLY
|
||||
SHADER={}
|
||||
for _,v in next,fs.getDirectoryItems('parts/shaders')do
|
||||
if isSafeFile('parts/shaders/'..v)then
|
||||
for _,v in next,fs.getDirectoryItems('parts/shaders') do
|
||||
if FILE.isSafe('parts/shaders/'..v) then
|
||||
local name=v:sub(1,-6)
|
||||
SHADER[name]=love.graphics.newShader('parts/shaders/'..name..'.glsl')
|
||||
end
|
||||
end
|
||||
|
||||
-- Load modules
|
||||
CHAR=require'parts.char'
|
||||
require'parts.gameTables'
|
||||
require'parts.gameFuncs'
|
||||
|
||||
THEME= require'parts.theme'
|
||||
LINE= require'parts.line'
|
||||
DATA= require'parts.data'
|
||||
@@ -124,7 +112,7 @@ USERS= require'parts.users'
|
||||
NET= require'parts.net'
|
||||
VK= require'parts.virtualKey'
|
||||
BOT= require'parts.bot'
|
||||
RSlist= require'parts.RSlist'DSCP=RSlist.TRS.centerPos
|
||||
RSlist= require'parts.RSlist'; DSCP=RSlist.TRS.centerPos
|
||||
PLY= require'parts.player'
|
||||
NETPLY= require'parts.netPlayer'
|
||||
MODES= require'parts.modes'
|
||||
@@ -135,10 +123,29 @@ setmetatable(TEXTURE,{__index=function(self,k)
|
||||
return self[k]
|
||||
end})
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Load Parts: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
-- Load mode files
|
||||
for i=1,#MODES do
|
||||
local m=MODES[i]-- Mode template
|
||||
if FILE.isSafe('parts/modes/'..m.name) then
|
||||
TABLE.complete(require('parts.modes.'..m.name),MODES[i])
|
||||
MODES[m.name],MODES[i]=MODES[i]
|
||||
end
|
||||
end
|
||||
for _,v in next,fs.getDirectoryItems('parts/modes') do
|
||||
if FILE.isSafe('parts/modes/'..v) and not MODES[v:sub(1,-5)] then
|
||||
local M={name=v:sub(1,-5)}
|
||||
local modeData=require('parts.modes.'..M.name)
|
||||
if modeData.env then
|
||||
TABLE.complete(modeData,M)
|
||||
MODES[M.name]=M
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--Init Zframework
|
||||
do--Z.setCursor
|
||||
table.insert(_LOADTIMELIST_,("Load Modules: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
-- Initialize Zframework
|
||||
do-- Z.setCursor
|
||||
local normImg=GC.DO{16,16,
|
||||
{'fCirc',8,8,4},
|
||||
{'setCL',1,1,1,.7},
|
||||
@@ -149,6 +156,7 @@ do--Z.setCursor
|
||||
{'dCirc',8,8,7},
|
||||
{'fCirc',8,8,3},
|
||||
}
|
||||
local _
|
||||
Z.setCursor(function(time,x,y)
|
||||
if not SETTING.sysCursor then
|
||||
local R=math.floor((time+1)/2)%7+1
|
||||
@@ -157,17 +165,17 @@ do--Z.setCursor
|
||||
_=DSCP[R][0]
|
||||
GC.draw(TEXTURE.miniBlock[R],x,y,time%math.pi*4,8,8,2*_[2]+1,2*(#BLOCKS[R][0]-_[1])-1)
|
||||
GC.setColor(1,1,1)
|
||||
GC.draw(love.mouse.isDown(1)and holdImg or normImg,x,y,nil,nil,nil,8,8)
|
||||
GC.draw(love.mouse.isDown(1) and holdImg or normImg,x,y,nil,nil,nil,8,8)
|
||||
end
|
||||
end)
|
||||
end
|
||||
Z.setOnFnKeys({
|
||||
function()MES.new('check',PROFILE.switch()and"profile start!"or"profile report copied!")end,
|
||||
function()MES.new('info',("System:%s[%s]\nluaVer:%s\njitVer:%s\njitVerNum:%s"):format(SYSTEM,jit.arch,_VERSION,jit.version,jit.version_num))end,
|
||||
function()MES.new('error',"挂了")end,
|
||||
function() MES.new('check',PROFILE.switch() and "profile start!" or "profile report copied!") end,
|
||||
function() MES.new('info',("System:%s[%s]\nluaVer:%s\njitVer:%s\njitVerNum:%s"):format(SYSTEM,jit.arch,_VERSION,jit.version,jit.version_num)) end,
|
||||
function() MES.new('error',"挂了") end,
|
||||
function()
|
||||
if GAME.playing and not GAME.net then
|
||||
for _=1,8 do
|
||||
for _=1,1 do
|
||||
if #PLY_ALIVE>1 then
|
||||
local P=PLY_ALIVE[math.random(2,#PLY_ALIVE)]
|
||||
P.lastRecv=PLAYERS[1]
|
||||
@@ -176,17 +184,25 @@ Z.setOnFnKeys({
|
||||
end
|
||||
end
|
||||
end,
|
||||
function()print(BG.locked)end,
|
||||
function()for k,v in next,_G do print(k,v)end end,
|
||||
function()if love['_openConsole']then love['_openConsole']()end end,
|
||||
function() print(BG.locked) end,
|
||||
function() for k,v in next,_G do print(k,v) end end,
|
||||
function() if love['_openConsole'] then love['_openConsole']() end end,
|
||||
})
|
||||
Z.setOnGlobalKey('f11',function()
|
||||
if not MOBILE then
|
||||
SETTING.fullscreen=not SETTING.fullscreen
|
||||
applySettings()
|
||||
saveSettings()
|
||||
end
|
||||
end)
|
||||
Z.setVersionText(VERSION.string)
|
||||
Z.setDebugInfo{
|
||||
{"Cache",gcinfo},
|
||||
{"Tasks",TASK.getCount},
|
||||
{"Voices",VOC.getQueueCount},
|
||||
{"Audios",love.audio.getSourceCount},
|
||||
}
|
||||
do--Z.setOnFocus
|
||||
do-- Z.setOnFocus
|
||||
local function task_autoSoundOff()
|
||||
while true do
|
||||
coroutine.yield()
|
||||
@@ -214,7 +230,7 @@ do--Z.setOnFocus
|
||||
TASK.new(task_autoSoundOn)
|
||||
end
|
||||
else
|
||||
if SCN.cur=='game'and SETTING.autoPause then
|
||||
if SCN.cur=='game' and SETTING.autoPause then
|
||||
pauseGame()
|
||||
end
|
||||
if SETTING.autoMute and SCN.cur~='music' then
|
||||
@@ -224,48 +240,18 @@ do--Z.setOnFocus
|
||||
end
|
||||
end)
|
||||
end
|
||||
Z.setOnQuit(destroyPlayers)
|
||||
Z.setOnBeforeQuit(function()
|
||||
NET.ws_close()
|
||||
TASK.new(function()
|
||||
TEST.yieldT(.26)
|
||||
love.event.quit()
|
||||
end)
|
||||
end)
|
||||
Z.setOnQuit(function()
|
||||
destroyPlayers()
|
||||
end)
|
||||
|
||||
--Load settings and statistics
|
||||
if
|
||||
not(
|
||||
pcall(TABLE.cover, loadFile('conf/user', '-json -canSkip')or loadFile('conf/user', '-luaon -canSkip')or{},USER) and
|
||||
pcall(TABLE.cover, loadFile('conf/unlock', '-json -canSkip')or loadFile('conf/unlock', '-luaon -canSkip')or{},RANKS) and
|
||||
pcall(TABLE.update,loadFile('conf/settings', '-json -canSkip')or loadFile('conf/settings', '-luaon -canSkip')or{},SETTING) and
|
||||
pcall(TABLE.coverR,loadFile('conf/data', '-json -canSkip')or loadFile('conf/data', '-luaon -canSkip')or{},STAT) and
|
||||
pcall(TABLE.cover, loadFile('conf/key', '-json -canSkip')or loadFile('conf/key', '-luaon -canSkip')or{},KEY_MAP) and
|
||||
pcall(TABLE.cover, loadFile('conf/virtualkey','-json -canSkip')or loadFile('conf/virtualkey','-luaon -canSkip')or{},VK_ORG)
|
||||
)
|
||||
then
|
||||
MES.new('error',"An error occured during loading, and some data was lost.")
|
||||
end
|
||||
|
||||
--Initialize fields, sequence, missions, gameEnv for cutsom game
|
||||
local fieldData=loadFile('conf/customBoards','-string -canSkip')
|
||||
if fieldData then
|
||||
fieldData=STRING.split(fieldData,"!")
|
||||
for i=1,#fieldData do
|
||||
DATA.pasteBoard(fieldData[i],i)
|
||||
end
|
||||
else
|
||||
FIELD[1]=DATA.newBoard()
|
||||
end
|
||||
local sequenceData=loadFile('conf/customSequence','-string -canSkip')
|
||||
if sequenceData then
|
||||
DATA.pasteSequence(sequenceData)
|
||||
end
|
||||
local missionData=loadFile('conf/customMissions','-string -canSkip')
|
||||
if missionData then
|
||||
DATA.pasteMission(missionData)
|
||||
end
|
||||
local customData=loadFile('conf/customEnv','-canSkip')
|
||||
if customData and customData['version']==VERSION.code then
|
||||
TABLE.complete(customData,CUSTOMENV)
|
||||
end
|
||||
TABLE.complete(require"parts.customEnv0",CUSTOMENV)
|
||||
|
||||
|
||||
--Initialize image libs
|
||||
-- Initialize image libs
|
||||
IMG.init{
|
||||
lock='media/image/mess/lock.png',
|
||||
dialCircle='media/image/mess/dialCircle.png',
|
||||
@@ -286,7 +272,7 @@ IMG.init{
|
||||
xiaoyaCH='media/image/characters/xiaoya.png',
|
||||
xiaoyaOmino='media/image/characters/xiaoya_Omino.png',
|
||||
mikuCH='media/image/characters/miku.png',
|
||||
rinCH='media/image/characters/rin.png',
|
||||
zundamonCH='media/image/characters/zundamon.png',
|
||||
z={
|
||||
character='media/image/characters/z_character.png',
|
||||
screen1='media/image/characters/z_screen1.png',
|
||||
@@ -344,20 +330,20 @@ SKIN.load{
|
||||
{name="wtf",path='media/image/skin/wtf_mrz.png'},
|
||||
}
|
||||
|
||||
--Initialize sound libs
|
||||
-- Initialize sound libs
|
||||
SFX.init((function()--[Warning] Not loading files here, just get the list of sound needed
|
||||
local L={}
|
||||
for _,v in next,fs.getDirectoryItems('media/effect/chiptune/')do
|
||||
if isSafeFile('media/effect/chiptune/'..v,"Dangerous file : %SAVE%/media/effect/chiptune/"..v)then
|
||||
for _,v in next,fs.getDirectoryItems('media/effect/chiptune/') do
|
||||
if FILE.isSafe('media/effect/chiptune/'..v,"Dangerous file : %SAVE%/media/effect/chiptune/"..v) then
|
||||
table.insert(L,v:sub(1,-5))
|
||||
end
|
||||
end
|
||||
return L
|
||||
end)())
|
||||
BGM.load((function()
|
||||
BGM.init((function()
|
||||
local L={}
|
||||
for _,v in next,fs.getDirectoryItems('media/music')do
|
||||
if isSafeFile('media/music/'..v,"Dangerous file : %SAVE%/media/music/"..v)then
|
||||
for _,v in next,fs.getDirectoryItems('media/music') do
|
||||
if FILE.isSafe('media/music/'..v,"Dangerous file : %SAVE%/media/music/"..v) then
|
||||
L[v:sub(1,-5)]='media/music/'..v
|
||||
end
|
||||
end
|
||||
@@ -373,7 +359,138 @@ VOC.init{
|
||||
'welcome',
|
||||
}
|
||||
|
||||
--Initialize language lib
|
||||
table.insert(_LOADTIMELIST_,("Initialize Modules: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
-- Load settings and statistics
|
||||
if
|
||||
not (
|
||||
pcall(TABLE.cover, loadFile('conf/user', '-json -canSkip') or loadFile('conf/user', '-luaon -canSkip') or{},USER) and
|
||||
pcall(TABLE.cover, loadFile('conf/unlock', '-json -canSkip') or loadFile('conf/unlock', '-luaon -canSkip') or{},RANKS) and
|
||||
pcall(TABLE.update,loadFile('conf/settings', '-json -canSkip') or loadFile('conf/settings', '-luaon -canSkip') or{},SETTING) and
|
||||
pcall(TABLE.coverR,loadFile('conf/data', '-json -canSkip') or loadFile('conf/data', '-luaon -canSkip') or{},STAT) and
|
||||
pcall(TABLE.cover, loadFile('conf/key', '-json -canSkip') or loadFile('conf/key', '-luaon -canSkip') or{},KEY_MAP) and
|
||||
pcall(TABLE.cover, loadFile('conf/virtualkey','-json -canSkip') or loadFile('conf/virtualkey','-luaon -canSkip') or{},VK_ORG)
|
||||
)
|
||||
then
|
||||
MES.new('error',"An error occured during loading, and some data was lost.")
|
||||
end
|
||||
|
||||
-- Initialize fields, sequence, missions, gameEnv for cutsom game
|
||||
local fieldData=loadFile('conf/customBoards','-string -canSkip')
|
||||
if fieldData then
|
||||
fieldData=STRING.split(fieldData,"!")
|
||||
for i=1,#fieldData do
|
||||
DATA.pasteBoard(fieldData[i],i)
|
||||
end
|
||||
else
|
||||
FIELD[1]=DATA.newBoard()
|
||||
end
|
||||
local sequenceData=loadFile('conf/customSequence','-string -canSkip')
|
||||
if sequenceData then
|
||||
DATA.pasteSequence(sequenceData)
|
||||
end
|
||||
local missionData=loadFile('conf/customMissions','-string -canSkip')
|
||||
if missionData then
|
||||
DATA.pasteMission(missionData)
|
||||
end
|
||||
local customData=loadFile('conf/customEnv','-canSkip')
|
||||
if customData and customData['version']==VERSION.code then
|
||||
TABLE.complete(customData,CUSTOMENV)
|
||||
end
|
||||
TABLE.complete(require"parts.customEnv0",CUSTOMENV)
|
||||
|
||||
-- Update data
|
||||
do
|
||||
if type(STAT.version)~='number' then
|
||||
STAT.version=0
|
||||
end
|
||||
if STAT.version<1700 and SETTING.dascut<5 then
|
||||
SETTING.dascut=SETTING.dascut+1
|
||||
end
|
||||
|
||||
if RANKS.stack_e then
|
||||
RANKS.stack_e=nil; fs.remove('record/stack_e.rec')
|
||||
RANKS.stack_h=nil; fs.remove('record/stack_h.rec')
|
||||
RANKS.stack_u=nil; fs.remove('record/stack_u.rec')
|
||||
end
|
||||
if RANKS.stack_20l then
|
||||
RANKS.stack_20l=nil; fs.remove('record/stack_20l.rec')
|
||||
RANKS.stack_40l=nil; fs.remove('record/stack_40l.rec')
|
||||
RANKS.stack_100l=nil; fs.remove('record/stack_100l.rec')
|
||||
end
|
||||
if RANKS.rhythm_e then
|
||||
RANKS.rhythm_e=nil; fs.remove('record/rhythm_e.rec')
|
||||
RANKS.rhythm_h=nil; fs.remove('record/rhythm_h.rec')
|
||||
RANKS.rhythm_u=nil; fs.remove('record/rhythm_u.rec')
|
||||
end
|
||||
if RANKS.bigbang then fs.remove('record/bigbang.rec') end
|
||||
if RANKS.clearRush then fs.remove('record/clearRush.rec') end
|
||||
|
||||
if STAT.version~=VERSION.code then
|
||||
for k,v in next,MODE_UPDATE_MAP do
|
||||
if RANKS[k] then
|
||||
RANKS[v]=RANKS[k]
|
||||
RANKS[k]=nil
|
||||
end
|
||||
k='record/'..k
|
||||
if fs.getInfo(k..'.dat') then
|
||||
fs.write('record/'..v..'.rec',fs.read(k..'.dat'))
|
||||
fs.remove(k..'.dat')
|
||||
end
|
||||
if fs.getInfo(k..'.rec') then
|
||||
fs.write('record/'..v..'.rec',fs.read(k..'.rec'))
|
||||
fs.remove(k..'.rec')
|
||||
end
|
||||
end
|
||||
STAT.version=VERSION.code
|
||||
end
|
||||
SETTING.appLock,SETTING.dataSaving,SETTING.swap,SETTING.autoLogin=nil
|
||||
if not SETTING.VKSkin then SETTING.VKSkin=1 end
|
||||
for _,v in next,SETTING.skin do if v<1 or v>17 then v=17 end end
|
||||
if not RSlist[SETTING.RS] then SETTING.RS='TRS' end
|
||||
if SETTING.ghostType=='greyCell' then SETTING.ghostType='grayCell' end
|
||||
if type(SETTING.skinSet)=='number' then SETTING.skinSet='crystal_scf' end
|
||||
if not TABLE.find({8,10,13,17,22,29,37,47,62,80,100},SETTING.frameMul) then SETTING.frameMul=100 end
|
||||
if SETTING.cv then SETTING.vocPack,SETTING.cv=SETTING.cv end
|
||||
if type(SETTING.bg)~='string' then SETTING.bg='on' end
|
||||
if SETTING.skin[18]==10 then SETTING.skin[18]=4 end
|
||||
if SETTING.reTime>3 or SETTING.reTime<.5 then SETTING.reTime=2 end
|
||||
if SETTING.locale=='zh_full' then SETTING.locale='zh' end
|
||||
if SETTING.vocPack=='rin' then SETTING.vocPack='miku' end
|
||||
if RANKS.infinite then RANKS.infinite=0 end
|
||||
if RANKS.infinite_dig then RANKS.infinite_dig=0 end
|
||||
if not RANKS.sprint_10l then RANKS.sprint_10l=0 end
|
||||
if RANKS.master_l then RANKS.master_n,RANKS.master_l=RANKS.master_l end
|
||||
if RANKS.master_u then RANKS.master_h,RANKS.master_u=RANKS.master_u end
|
||||
for _,v in next,VK_ORG do v.color=nil end
|
||||
for name,rank in next,RANKS do
|
||||
if type(name)=='number' or type(rank)~='number' then
|
||||
RANKS[name]=nil
|
||||
else
|
||||
local M=MODES[name]
|
||||
if M and M.unlock and rank>0 then
|
||||
for _,unlockName in next,M.unlock do
|
||||
if not RANKS[unlockName] then
|
||||
RANKS[unlockName]=0
|
||||
end
|
||||
end
|
||||
end
|
||||
if not (M and M.x) then
|
||||
RANKS[name]=nil
|
||||
end
|
||||
end
|
||||
end
|
||||
if not MODES[STAT.lastPlay] then
|
||||
STAT.lastPlay='sprint_10l'
|
||||
end
|
||||
fs.remove('conf/account')
|
||||
|
||||
saveStats()
|
||||
saveProgress()
|
||||
saveSettings()
|
||||
end
|
||||
|
||||
-- Initialize language lib
|
||||
LANG.init('zh',
|
||||
{
|
||||
zh=require'parts.language.lang_zh',
|
||||
@@ -386,219 +503,50 @@ LANG.init('zh',
|
||||
ja=require'parts.language.lang_ja',
|
||||
symbol=require'parts.language.lang_symbol',
|
||||
zh_code=require'parts.language.lang_zh_code',
|
||||
--1. Add language file to LANG folder;
|
||||
--2. Require it;
|
||||
--3. Add a button in parts/scenes/lang.lua;
|
||||
vi=require'parts.language.lang_vi',
|
||||
-- 1. Add language file to LANG folder;
|
||||
-- 2. Require it;
|
||||
-- 3. Add a button in parts/scenes/lang.lua;
|
||||
},
|
||||
{
|
||||
block=BLOCK_NAMES
|
||||
},
|
||||
(function()
|
||||
local tipMeta={__call=function(L)return L[math.random(#L)]end}
|
||||
local tipMeta={__call=function(L) return L[math.random(#L)] end}
|
||||
return function(L)
|
||||
if type(rawget(L,'getTip'))=='table'then setmetatable(L.getTip,tipMeta)end
|
||||
if type(rawget(L,'getTip'))=='table' then setmetatable(L.getTip,tipMeta) end
|
||||
setmetatable(L,{__index=function(self,k)
|
||||
local mes="No Text ("..SETTING.locale.."): "..k
|
||||
LOG(mes)
|
||||
MES.new('warn',mes)
|
||||
self[k]=CHAR.zChan.thinking
|
||||
self[k]="["..k.."]"
|
||||
return self[k]
|
||||
end})
|
||||
end
|
||||
end)()
|
||||
)
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Initialize Parts: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
--Load background files from SOURCE ONLY
|
||||
for _,v in next,fs.getDirectoryItems('parts/backgrounds')do
|
||||
if isSafeFile('parts/backgrounds/'..v)and v:sub(-3)=='lua'then
|
||||
-- Load background files from SOURCE ONLY
|
||||
for _,v in next,fs.getDirectoryItems('parts/backgrounds') do
|
||||
if FILE.isSafe('parts/backgrounds/'..v) and v:sub(-3)=='lua' then
|
||||
local name=v:sub(1,-5)
|
||||
BG.add(name,require('parts.backgrounds.'..name))
|
||||
end
|
||||
end
|
||||
BG.remList('none')BG.remList('gray')BG.remList('custom')
|
||||
--Load scene files from SOURCE ONLY
|
||||
for _,v in next,fs.getDirectoryItems('parts/scenes')do
|
||||
if isSafeFile('parts/scenes/'..v)then
|
||||
|
||||
-- Load scene files from SOURCE ONLY
|
||||
for _,v in next,fs.getDirectoryItems('parts/scenes') do
|
||||
if FILE.isSafe('parts/scenes/'..v) then
|
||||
local sceneName=v:sub(1,-5)
|
||||
SCN.add(sceneName,require('parts.scenes.'..sceneName))
|
||||
LANG.addScene(sceneName)
|
||||
end
|
||||
end
|
||||
--Load mode files
|
||||
for i=1,#MODES do
|
||||
local m=MODES[i]--Mode template
|
||||
if isSafeFile('parts/modes/'..m.name)then
|
||||
TABLE.complete(require('parts.modes.'..m.name),MODES[i])
|
||||
MODES[m.name],MODES[i]=MODES[i]
|
||||
end
|
||||
end
|
||||
for _,v in next,fs.getDirectoryItems('parts/modes')do
|
||||
if isSafeFile('parts/modes/'..v)and not MODES[v:sub(1,-5)]then
|
||||
local M={name=v:sub(1,-5)}
|
||||
local modeData=require('parts.modes.'..M.name)
|
||||
if modeData.env then
|
||||
TABLE.complete(modeData,M)
|
||||
MODES[M.name]=M
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Load Files: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
--Update data
|
||||
do
|
||||
local needSave
|
||||
|
||||
if not fs.getInfo('conf/data')then
|
||||
needSave=true
|
||||
end
|
||||
if type(STAT.version)~='number'then
|
||||
STAT.version=0
|
||||
needSave=true
|
||||
end
|
||||
if STAT.version<1500 then
|
||||
FILE.clear_s('')
|
||||
end
|
||||
if STAT.version<1505 then
|
||||
fs.remove('record/bigbang.rec')
|
||||
fs.remove('conf/replay')
|
||||
end
|
||||
if STAT.version==1506 then
|
||||
local temp1,temp2
|
||||
if fs.getInfo('record/master_l.rec')then
|
||||
temp1=fs.read('record/master_l.rec')
|
||||
end
|
||||
if fs.getInfo('record/master_u.rec')then
|
||||
temp2=fs.read('record/master_u.rec')
|
||||
end
|
||||
if temp1 then
|
||||
fs.write('record/master_u.rec',temp1)
|
||||
end
|
||||
if temp2 then
|
||||
fs.write('record/master_l.rec',temp2)
|
||||
end
|
||||
RANKS.master_l,RANKS.master_u=RANKS.master_u,RANKS.master_l
|
||||
if RANKS.tsd_u then
|
||||
RANKS.tsd_u=0
|
||||
end
|
||||
end
|
||||
if STAT.version==1601 then
|
||||
RANKS.round_e=nil
|
||||
RANKS.round_n=nil
|
||||
RANKS.round_h=nil
|
||||
RANKS.round_l=nil
|
||||
RANKS.round_u=nil
|
||||
fs.remove('record/round_e.rec')
|
||||
fs.remove('record/round_n.rec')
|
||||
fs.remove('record/round_h.rec')
|
||||
fs.remove('record/round_l.rec')
|
||||
fs.remove('record/round_u.rec')
|
||||
end
|
||||
if STAT.version<1700 and SETTING.dascut<5 then
|
||||
SETTING.dascut=SETTING.dascut+1
|
||||
needSave=true
|
||||
end
|
||||
if RANKS.stack_e then
|
||||
RANKS.stack_e=nil
|
||||
RANKS.stack_h=nil
|
||||
RANKS.stack_u=nil
|
||||
fs.remove('record/stack_e.rec')
|
||||
fs.remove('record/stack_h.rec')
|
||||
fs.remove('record/stack_u.rec')
|
||||
end
|
||||
if RANKS.stack_20l then
|
||||
RANKS.stack_20l=nil
|
||||
RANKS.stack_40l=nil
|
||||
RANKS.stack_100l=nil
|
||||
fs.remove('record/stack_20l.rec')
|
||||
fs.remove('record/stack_40l.rec')
|
||||
fs.remove('record/stack_100l.rec')
|
||||
end
|
||||
if RANKS.rhythm_e then
|
||||
RANKS.rhythm_e=nil
|
||||
RANKS.rhythm_h=nil
|
||||
RANKS.rhythm_u=nil
|
||||
fs.remove('record/rhythm_e.rec')
|
||||
fs.remove('record/rhythm_h.rec')
|
||||
fs.remove('record/rhythm_u.rec')
|
||||
end
|
||||
if RANKS.bigbang or RANKS.clearRush then
|
||||
fs.remove('record/clearRush.rec')
|
||||
fs.remove('record/bigbang.rec')
|
||||
end
|
||||
if STAT.version~=VERSION.code then
|
||||
for k,v in next,MODE_UPDATE_MAP do
|
||||
if RANKS[k]then
|
||||
RANKS[v]=RANKS[k]
|
||||
RANKS[k]=nil
|
||||
end
|
||||
k='record/'..k
|
||||
if fs.getInfo(k..'.dat')then
|
||||
fs.write('record/'..v..'.rec',fs.read(k..'.dat'))
|
||||
fs.remove(k..'.dat')
|
||||
end
|
||||
if fs.getInfo(k..'.rec')then
|
||||
fs.write('record/'..v..'.rec',fs.read(k..'.rec'))
|
||||
fs.remove(k..'.rec')
|
||||
end
|
||||
end
|
||||
STAT.version=VERSION.code
|
||||
needSave=true
|
||||
end
|
||||
SETTING.appLock,SETTING.dataSaving,SETTING.swap=nil
|
||||
if not SETTING.VKSkin then SETTING.VKSkin=1 end
|
||||
for _,v in next,SETTING.skin do if v<1 or v>17 then v=17 end end
|
||||
if not RSlist[SETTING.RS]then SETTING.RS='TRS'end
|
||||
if SETTING.ghostType=='greyCell'then SETTING.ghostType='grayCell'end
|
||||
if type(SETTING.skinSet)=='number'then SETTING.skinSet='crystal_scf'end
|
||||
if not TABLE.find({8,10,13,17,22,29,37,47,62,80,100},SETTING.frameMul)then SETTING.frameMul=100 end
|
||||
if SETTING.cv then SETTING.vocPack,SETTING.cv=SETTING.cv end
|
||||
if type(SETTING.bg)~='string'then SETTING.bg='on'end
|
||||
if SETTING.skin[18]==10 then SETTING.skin[18]=4 end
|
||||
if SETTING.reTime>3 or SETTING.reTime<.5 then SETTING.reTime=2 end
|
||||
if SETTING.locale=='zh_full' then SETTING.locale='zh' end
|
||||
if RANKS.infinite then RANKS.infinite=0 end
|
||||
if RANKS.infinite_dig then RANKS.infinite_dig=0 end
|
||||
if not RANKS.sprint_10l then RANKS.sprint_10l=0 end
|
||||
if RANKS.master_l then RANKS.master_n,RANKS.master_l=RANKS.master_l needSave=true end
|
||||
if RANKS.master_u then RANKS.master_h,RANKS.master_u=RANKS.master_u needSave=true end
|
||||
for _,v in next,VK_ORG do v.color=nil end
|
||||
for name,rank in next,RANKS do
|
||||
if type(name)=='number'or type(rank)~='number'then
|
||||
RANKS[name]=nil
|
||||
needSave=true
|
||||
else
|
||||
local M=MODES[name]
|
||||
if M and M.unlock and rank>0 then
|
||||
for _,unlockName in next,M.unlock do
|
||||
if not RANKS[unlockName]then
|
||||
RANKS[unlockName]=0
|
||||
needSave=true
|
||||
end
|
||||
end
|
||||
end
|
||||
if not(M and M.x)then
|
||||
RANKS[name]=nil
|
||||
needSave=true
|
||||
end
|
||||
end
|
||||
end
|
||||
if not MODES[STAT.lastPlay]then
|
||||
STAT.lastPlay='sprint_10l'
|
||||
needSave=true
|
||||
end
|
||||
|
||||
if needSave then
|
||||
saveStats()
|
||||
saveProgress()
|
||||
saveSettings()
|
||||
love.event.quit('restart')
|
||||
end
|
||||
end
|
||||
|
||||
--First start
|
||||
-- First start
|
||||
FIRSTLAUNCH=STAT.run==0
|
||||
if FIRSTLAUNCH and MOBILE then
|
||||
SETTING.VKSwitch=true
|
||||
@@ -606,18 +554,18 @@ if FIRSTLAUNCH and MOBILE then
|
||||
SETTING.cleanCanvas=true
|
||||
end
|
||||
|
||||
--Apply system setting
|
||||
-- Apply system setting
|
||||
applySettings()
|
||||
|
||||
--Load replays
|
||||
for _,fileName in next,fs.getDirectoryItems('replay')do
|
||||
if fileName:sub(12,12):match("[a-zA-Z]")then
|
||||
-- Load replays
|
||||
for _,fileName in next,fs.getDirectoryItems('replay') do
|
||||
if fileName:sub(12,12):match("[a-zA-Z]") then
|
||||
local date,mode,version,player,seed,setting,mod
|
||||
local fileData=fs.read('replay/'..fileName)
|
||||
date, fileData=STRING.readLine(fileData)date=date:gsub("[a-zA-Z]","")
|
||||
mode, fileData=STRING.readLine(fileData)mode=MODE_UPDATE_MAP[mode]or mode
|
||||
mode, fileData=STRING.readLine(fileData)mode=MODE_UPDATE_MAP[mode] or mode
|
||||
version,fileData=STRING.readLine(fileData)
|
||||
player, fileData=STRING.readLine(fileData)if player=="Local Player"then player="Stacker"end
|
||||
player, fileData=STRING.readLine(fileData) if player=="Local Player" then player="Stacker" end
|
||||
local success
|
||||
success,fileData=pcall(love.data.decompress,'string','zlib',fileData)
|
||||
if not success then goto BREAK_cannotParse end
|
||||
@@ -653,16 +601,22 @@ for _,fileName in next,fs.getDirectoryItems('replay')do
|
||||
local rep=DATA.parseReplay('replay/'..fileName)
|
||||
table.insert(REPLAY,rep)
|
||||
end
|
||||
table.sort(REPLAY,function(a,b)return a.fileName>b.fileName end)
|
||||
table.sort(REPLAY,function(a,b) return a.fileName>b.fileName end)
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Initialize Data: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
AUTHURL="https://studio26f.org/oauth?product=techmino"
|
||||
AUTHHOST="cafuuchino1.3322.org:8081"
|
||||
WS.switchHost('cafuuchino1.3322.org','10026','/techmino/ws/v1')
|
||||
HTTP.setHost("cafuuchino1.3322.org:10026")
|
||||
HTTP.setThreadCount(1)
|
||||
|
||||
for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i])end
|
||||
table.insert(_LOADTIMELIST_,("Load Resources: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
--Launch testing task if launch param received
|
||||
if TABLE.find(arg,'--test')then
|
||||
for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i]) end
|
||||
|
||||
-- Launch testing task if launch param received
|
||||
if TABLE.find(arg,'-- test') then
|
||||
TASK.new(function()
|
||||
while not LOADED do YIELD()end
|
||||
while not LOADED do coroutine.yield() end
|
||||
|
||||
LOG("\27[92m\27[1mAutomatic Test Started\27[0m")
|
||||
BGM.setVol(0)SFX.setVol(0)
|
||||
@@ -670,7 +624,7 @@ if TABLE.find(arg,'--test')then
|
||||
TEST.yieldUntilNextScene()
|
||||
|
||||
for k,mode in next,MODES do
|
||||
if k~='netBattle'then
|
||||
if k~='netBattle' then
|
||||
LOG("Scanning mode: "..mode.name)
|
||||
loadGame(mode.name,true)
|
||||
TEST.yieldUntilNextScene()
|
||||
@@ -684,12 +638,11 @@ if TABLE.find(arg,'--test')then
|
||||
end)
|
||||
TASK.new(function()
|
||||
while true do
|
||||
YIELD()
|
||||
if Z.getErr(1)then break end
|
||||
coroutine.yield()
|
||||
if Z.getErr(1) then break end
|
||||
end
|
||||
LOG("\27[91m\27[1mAutomatic Test Failed :(\27[0m\nThe error message is:\n"..table.concat(Z.getErr(1).mes,"\n").."\27[91m\nAborting\27[0m")
|
||||
TEST.yieldN(60)
|
||||
love.event.quit(1)
|
||||
end)
|
||||
end
|
||||
WS.switchHost('101.43.110.22','10026','/tech/socket/v1')
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 117 KiB |
BIN
media/image/characters/zundamon.png
Normal file
BIN
media/image/characters/zundamon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 99 KiB |
BIN
media/music/antispace.ogg
Normal file
BIN
media/music/antispace.ogg
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
media/vocal/zundamon/air.ogg
Normal file
BIN
media/vocal/zundamon/air.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/b2b.ogg
Normal file
BIN
media/vocal/zundamon/b2b.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/b3b.ogg
Normal file
BIN
media/vocal/zundamon/b3b.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/bye.ogg
Normal file
BIN
media/vocal/zundamon/bye.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/color.ogg
Normal file
BIN
media/vocal/zundamon/color.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/cspin.ogg
Normal file
BIN
media/vocal/zundamon/cspin.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/cspin0.ogg
Normal file
BIN
media/vocal/zundamon/cspin0.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/decacrash.ogg
Normal file
BIN
media/vocal/zundamon/decacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/deep.ogg
Normal file
BIN
media/vocal/zundamon/deep.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/dodecacrash.ogg
Normal file
BIN
media/vocal/zundamon/dodecacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/double.ogg
Normal file
BIN
media/vocal/zundamon/double.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/doubt.ogg
Normal file
BIN
media/vocal/zundamon/doubt.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/espin.ogg
Normal file
BIN
media/vocal/zundamon/espin.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/espin0.ogg
Normal file
BIN
media/vocal/zundamon/espin0.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/fspin.ogg
Normal file
BIN
media/vocal/zundamon/fspin.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/fspin0.ogg
Normal file
BIN
media/vocal/zundamon/fspin0.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/half_clear_1.ogg
Normal file
BIN
media/vocal/zundamon/half_clear_1.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/half_clear_2.ogg
Normal file
BIN
media/vocal/zundamon/half_clear_2.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/happy.ogg
Normal file
BIN
media/vocal/zundamon/happy.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/heptacrash.ogg
Normal file
BIN
media/vocal/zundamon/heptacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/heptadecacrash.ogg
Normal file
BIN
media/vocal/zundamon/heptadecacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/hexacrash.ogg
Normal file
BIN
media/vocal/zundamon/hexacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/hexadecacrash.ogg
Normal file
BIN
media/vocal/zundamon/hexadecacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/hspin.ogg
Normal file
BIN
media/vocal/zundamon/hspin.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/hspin0.ogg
Normal file
BIN
media/vocal/zundamon/hspin0.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/impossicrash.ogg
Normal file
BIN
media/vocal/zundamon/impossicrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/ispin.ogg
Normal file
BIN
media/vocal/zundamon/ispin.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/ispin0.ogg
Normal file
BIN
media/vocal/zundamon/ispin0.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/jspin.ogg
Normal file
BIN
media/vocal/zundamon/jspin.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/jspin0.ogg
Normal file
BIN
media/vocal/zundamon/jspin0.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/lose_1.ogg
Normal file
BIN
media/vocal/zundamon/lose_1.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/lose_2.ogg
Normal file
BIN
media/vocal/zundamon/lose_2.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/lspin.ogg
Normal file
BIN
media/vocal/zundamon/lspin.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/lspin0.ogg
Normal file
BIN
media/vocal/zundamon/lspin0.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/mini.ogg
Normal file
BIN
media/vocal/zundamon/mini.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/mis.ogg
Normal file
BIN
media/vocal/zundamon/mis.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/nonacrash.ogg
Normal file
BIN
media/vocal/zundamon/nonacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/nonadecacrash.ogg
Normal file
BIN
media/vocal/zundamon/nonadecacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/nspin.ogg
Normal file
BIN
media/vocal/zundamon/nspin.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/nspin0.ogg
Normal file
BIN
media/vocal/zundamon/nspin0.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/octacrash.ogg
Normal file
BIN
media/vocal/zundamon/octacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/octadecacrash.ogg
Normal file
BIN
media/vocal/zundamon/octadecacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/ospin.ogg
Normal file
BIN
media/vocal/zundamon/ospin.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/ospin0.ogg
Normal file
BIN
media/vocal/zundamon/ospin0.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/pentacrash.ogg
Normal file
BIN
media/vocal/zundamon/pentacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/pentadecacrash.ogg
Normal file
BIN
media/vocal/zundamon/pentadecacrash.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/perfect_clear_1.ogg
Normal file
BIN
media/vocal/zundamon/perfect_clear_1.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/perfect_clear_2.ogg
Normal file
BIN
media/vocal/zundamon/perfect_clear_2.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/pspin.ogg
Normal file
BIN
media/vocal/zundamon/pspin.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/pspin0.ogg
Normal file
BIN
media/vocal/zundamon/pspin0.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/qspin.ogg
Normal file
BIN
media/vocal/zundamon/qspin.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/qspin0.ogg
Normal file
BIN
media/vocal/zundamon/qspin0.ogg
Normal file
Binary file not shown.
BIN
media/vocal/zundamon/rspin.ogg
Normal file
BIN
media/vocal/zundamon/rspin.ogg
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user