Compare commits

...

71 Commits

Author SHA1 Message Date
MrZ_26
dece8c0daa 版本推进 2023-01-22 03:58:25 +08:00
scdhh
5796d1af32 update ci (#829)
* Standardized rc templates

* Update copyright
2023-01-22 02:13:08 +08:00
MrZ_26
06d7a1df6b 修正中文语言两处文本漏翻 2023-01-21 19:47:11 +08:00
MrZ_26
ed293ddad8 更换音乐way的音频文件修正开头爆音 close #828 2023-01-21 19:11:52 +08:00
MrZ_26
d7a92344e5 音乐室作者文本加上描边 2023-01-21 18:41:43 +08:00
MrZ_26
3fa020fe91 修改存档管理界面文本颜色 2023-01-21 18:29:13 +08:00
MrZ_26
ce19af7da0 更新词典里的官网链接 2023-01-21 18:22:48 +08:00
MrZ_26
e558a9fc9d 修复统计菜单游戏logo上色错误 2023-01-21 18:19:13 +08:00
MrZ_26
fb5544ce0f 优化速度表的代码,微调外观 2023-01-21 14:15:38 +08:00
NOT_A_ROBOT
051f0d484c Revamp speed counter (#825) 2023-01-20 19:06:51 +08:00
C₂₉H₂₅N₃O₅
108cbea686 Added Vietnamese support for in-game font (#834)
- Added Vietnamese support
- Revised glyph shapes for `0`
2023-01-20 17:42:55 +08:00
MrZ_26
2fca95e81b 删除词典里已经没了的mew的链接,中文词典的连续PC词条改用加加整理的文档 2023-01-16 14:55:45 +08:00
sakurw
4631a2f440 Update dict_ja.lua (#816) 2022-12-28 00:35:59 +08:00
sakurw
338f5811a1 Update lang_ja.lua (#815)
* Update lang_ja.lua

* Update lang_ja.lua

* Update lang_ja.lua
2022-12-28 00:29:58 +08:00
ParticleG
bc634b2eeb - Update workflow 2022-12-20 20:01:56 +08:00
ParticleG
23cbb9e261 - Update workflow 2022-12-20 19:02:09 +08:00
MrZ_26
fbfbf3c32b 玩家类新增dropPosition方法在失败的时候触发产生掉落动画
最后一个玩家的lose方法不会触发掉落
2022-12-19 21:42:29 +08:00
MrZ_26
3073a2e90d 修复混战模式失败后播音乐失败 2022-12-19 20:37:41 +08:00
MrZ_26
29e4dc93ab 把cc的几个print注释掉 2022-12-19 20:31:52 +08:00
ParticleG
2b16a20032 - Fix remove method 2022-12-19 20:28:00 +08:00
ParticleG
59b412899d - Try avoid flashing 2022-12-19 19:35:38 +08:00
ParticleG
e656ab5e1d - Add step to alive poslist 2022-12-19 19:07:35 +08:00
ParticleG
b90c06da72 - Add dynamic field 2022-12-19 03:38:33 +08:00
MrZ_26
f62f3652e2 修正错误情况进入暂停菜单时的一个崩溃 2022-12-19 01:28:20 +08:00
MrZ_26
dbbec9d2bd freshPlayerPosition方法添加一个执行模式用于游戏中动态调整布局 2022-12-18 22:22:53 +08:00
MrZ_26
1be8189058 修正dizt_ja漏一个引号 2022-12-18 21:00:05 +08:00
sakurw
b8b3160ccd Update dict_ja.lua (#810) 2022-12-18 20:59:11 +08:00
ParticleG
54fd3995e6 - Use raw install.sh 2022-12-18 18:03:27 +08:00
ParticleG
e506190c7f - Add retry times to transfer steps 2022-12-18 17:59:17 +08:00
Particle_G
8f418a0da9 Ci linux test (#813)
* - Only build linux
- Use love-actions/love-actions-linux@main

* - Update Linux product name

* - Finish editing
2022-12-18 14:30:15 +08:00
Particle_G
0403ee91ea Ci mobile fix (#812)
* - Add portrait switch

* - Only build mobile

* 设置项添加竖屏和msaa参数,增加调整的控件

* 修正conf.lua里没拿到正确的存档路径(因为还没设置identity)

* 加一些测试代码观察安卓到底有没有读到存档文件

* -Try relative

* - Try set settings in main

* - Make code analysis happy

* - Try not use setFullScreen

* - Test iOS portrait

* - Add various loggings

* - Try set identity first

* - Try set configs in conf.lua

* - Finish editing

Co-authored-by: MrZ_26 <1046101471@qq.com>
2022-12-17 17:57:57 +08:00
MrZ_26
47d1856143 在conf里提前读取设置文件配置一些东西 2022-12-16 22:19:17 +08:00
MrZ_26
e521f0fea0 修正上一个提交的小问题 2022-12-16 21:16:58 +08:00
Particle_G
eb1e7fd15a Fix Linux icon issue (#808)
- Try load icon
- Only build linux
- Set icon in conf.lua
- Set some global variables in conf.lua and set corresponding configs
- Avoid change fullscreen state when playing on mobile devices
- Try mobile
- Enable CI for merging
2022-12-16 14:51:00 +08:00
MrZ_26
c9e0a58232 添加N64和N64_plus旋转系统,修复None和None_plus搞反 close #805 2022-12-16 00:23:49 +08:00
MrZ_26
9acd8b54e3 提前改一下版本号 2022-12-16 00:10:57 +08:00
MrZ_26
acd66b1634 丢失的文本会显示为内部名称而不是神秘符号 close #775 2022-12-16 00:10:04 +08:00
MrZ_26
3820855812 微调几个语言文件 2022-12-16 00:10:04 +08:00
ParticleG
056abe7b68 - Add icon to bare and linux packages 2022-12-14 23:31:25 +08:00
MrZ_26
bf05b1bda2 如果存在media/image/icon.png会将其设置为窗口icon(方便Linux) 2022-12-14 20:05:35 +08:00
Particle_G
77a3c146c0 Ci test linux (#804)
- Fix build process
- Add debian package support
2022-12-14 15:51:57 +08:00
MrZ_26
5761f7f543 调整galaxy和quarks背景的粒子颜色,不影响游戏画面 2022-12-12 11:37:05 +08:00
MrZ_26
5ed5b543ce 修改一些中文tips 2022-12-11 13:44:29 +08:00
ParticleG
98ae0f2762 - Fix wrong folder name 2022-12-02 14:42:12 +08:00
ParticleG
963bc80439 - Bump Zframework version
- Fix android CC
2022-12-02 14:28:16 +08:00
Particle_G
4106dc454e Ci fix linux (#796)
* - Try fix linux

* - Try fix linux

* - Fix CC path

* - Try fix CC

* - Try fix CC

* - Remove temporary 'if's
2022-12-02 11:50:54 +08:00
MrZ_26
0ba26aa836 框架跟进 2022-12-02 01:18:37 +08:00
ParticleG
a4c775174b - Try fix Linux shared libs 2022-12-01 22:03:43 +08:00
sakurw
29c40c34fe Update dict_ja.lua (#793) 2022-12-01 10:25:29 +08:00
sakurw
44cb889b91 Update lang_ja.lua (#791) 2022-12-01 10:24:23 +08:00
ParticleG
915d65d2f4 - Update workflow 2022-12-01 10:18:56 +08:00
MrZ_26
8b7c270cf6 版本推进 2022-11-30 01:40:26 +08:00
MrZ_26
a3f07f8ce4 修复单机模式玩家uid问题,解决未登录状态下回合制报错 2022-11-29 01:10:58 +08:00
MrZ_26
91d3252685 删除可能远古留下来的account文件 2022-11-29 01:10:24 +08:00
MrZ_26
f9d9112651 修复第一次启动选择语言后直接就退出了 2022-11-28 23:37:47 +08:00
MrZ_26
477a1acc61 框架跟进,修复require模块在mac系统的崩溃 close #788 2022-11-28 23:31:28 +08:00
MrZ_26
4770366f74 修正dict_ja几处语法错误 2022-11-28 23:02:27 +08:00
sakurw
1c66b4dce1 Update dict_ja.lua (#790) 2022-11-28 23:00:41 +08:00
sakurw
3a19bb534a Update lang_ja.lua (#789) 2022-11-28 22:59:50 +08:00
sakurw
f39b3cfd4a Update lang_ja.lua (#785) 2022-11-26 17:02:43 +08:00
MrZ_26
f0410243c4 攻击竞速模式左侧攻击数字从%.1f改为%d close #780 2022-11-25 10:41:47 +08:00
MrZ_26
8abc40707a 彻底删除rin语音包相关内容(作者说不搞了) 2022-11-20 11:48:33 +08:00
MrZ_26
f91fe34a12 修复两个堆叠模式消除垃圾行的时候没减少内部的垃圾行高计数 2022-11-12 16:44:38 +08:00
MrZ_26
e9bf6c3b58 因为改了srs+踢墙表所以提升房间版本 2022-11-09 19:45:34 +08:00
MrZ_26
17c660b5a2 修正SRS_plus旋转系统的i不对称(原来8个90度的表就是srs的没改) close #772 2022-11-09 19:44:12 +08:00
sakurw
ed46f73987 Update lang_ja.lua (#773) 2022-11-09 19:22:17 +08:00
MrZ_26
e1200b5038 整理代码(修复cc加载失败有时候会报错) 2022-11-07 16:46:24 +08:00
MrZ_26
7f7ea6ac97 整理代码,调整加载顺序 2022-11-06 20:47:28 +08:00
MrZ_26
f70edaac83 移除加载时可能的强制重启(防止ios出问题)
几处love退出改为去quit场景(防止ios出问题)
整理代码
框架跟进
2022-11-06 17:28:54 +08:00
sakurw
d932febe89 Update lang_ja.lua (#770) 2022-11-06 13:39:51 +08:00
MrFaq2018
945a63c51d Update lang_es.lua (#771)
For next ver.
2022-11-06 13:39:29 +08:00
105 changed files with 2065 additions and 1430 deletions

View File

@@ -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

View File

@@ -1 +0,0 @@
*.template text eol=lf

View File

@@ -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

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -99,6 +99,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 }}
@@ -123,12 +128,20 @@ jobs:
body: ${{ needs.get-info.outputs.update-note }}
name: ${{ needs.get-info.outputs.update-title }}
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
- name: Get transfer
shell: bash
run: |
curl -sL --retry 5 https://raw.githubusercontent.com/Mikubill/transfer/master/install.sh | sh
- 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 "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
uses: nick-fields/retry@v2
with:
max_attempts: 5
retry_wait_seconds: 10
timeout_minutes: 5
command: |
./transfer wet -s -p 16 --no-progress ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love 2>&1>./wetransfer.log
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
auto-test:
runs-on: ubuntu-latest
@@ -146,6 +159,7 @@ jobs:
build-android:
runs-on: ubuntu-latest
needs: [get-info, build-core, auto-test]
if: github.event_name != 'pull_request'
env:
OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release
@@ -162,12 +176,12 @@ jobs:
import os
import re
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
if "${{ env.BUILD_TYPE }}" == "dev":
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')
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')
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:
@@ -176,14 +190,7 @@ 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: love-actions/love-actions-android@v1
@@ -197,7 +204,6 @@ 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/
product-name: ${{ steps.process-app-name.outputs.product-name }}
version-string: ${{ needs.get-info.outputs.version-string }}
@@ -223,17 +229,25 @@ jobs:
body: ${{ needs.get-info.outputs.update-note }}
name: ${{ needs.get-info.outputs.update-title }}
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
- name: Get transfer
shell: bash
run: |
curl -sL --retry 5 https://raw.githubusercontent.com/Mikubill/transfer/master/install.sh | sh
- 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 "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
uses: nick-fields/retry@v2
with:
max_attempts: 5
retry_wait_seconds: 10
timeout_minutes: 5
command: |
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
build-ios:
runs-on: macos-latest
if: github.event_name != 'pull_request'
needs: [get-info, build-core, auto-test]
if: github.event_name != 'pull_request'
env:
OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release
@@ -267,7 +281,7 @@ jobs:
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 }}
@@ -312,12 +326,20 @@ jobs:
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
- name: Get transfer
shell: bash
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 "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
- name: Upload to WeTransfer
id: transfer
uses: nick-fields/retry@v2
with:
max_attempts: 5
retry_wait_seconds: 10
timeout_minutes: 5
command: |
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
build-linux:
runs-on: ubuntu-latest
@@ -337,12 +359,20 @@ jobs:
run: |
import os
import re
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('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
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:
@@ -352,20 +382,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: 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
@@ -373,32 +402,48 @@ 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 Debian artifact
uses: actions/upload-artifact@v3
with:
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: |
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
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') }}
- name: Get transfer
shell: bash
run: |
curl -sL --retry 5 https://raw.githubusercontent.com/Mikubill/transfer/master/install.sh | sh
- 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 "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
uses: nick-fields/retry@v2
with:
max_attempts: 5
retry_wait_seconds: 10
timeout_minutes: 5
command: |
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
build-macos-appstore:
runs-on: macos-latest
if: github.event_name != 'pull_request'
needs: [get-info, build-core, auto-test]
if: github.event_name != 'pull_request'
env:
OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release
@@ -436,7 +481,7 @@ jobs:
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/
@@ -480,17 +525,25 @@ jobs:
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
- name: Get transfer
shell: bash
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 "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
- name: Upload to WeTransfer
id: transfer
uses: nick-fields/retry@v2
with:
max_attempts: 5
retry_wait_seconds: 10
timeout_minutes: 5
command: |
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
build-macos-portable:
runs-on: macos-latest
if: github.event_name != 'pull_request'
needs: [get-info, build-core, auto-test]
if: github.event_name != 'pull_request'
env:
OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release
@@ -528,7 +581,7 @@ jobs:
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/
@@ -578,16 +631,26 @@ jobs:
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
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') }}
- name: Upload to WeTransfer
id: transfer
- name: Get transfer
shell: bash
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 "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
- name: Upload to WeTransfer
id: transfer
uses: nick-fields/retry@v2
with:
max_attempts: 5
retry_wait_seconds: 10
timeout_minutes: 5
command: |
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
build-windows:
runs-on: windows-latest
@@ -652,7 +715,9 @@ jobs:
uses: ncipollo/release-action@v1
with:
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
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
body: ${{ needs.get-info.outputs.update-note }}
name: ${{ needs.get-info.outputs.update-title }}
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
@@ -661,15 +726,20 @@ jobs:
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 }}
curl -sL --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
shell: pwsh
run: |
./transfer.exe wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
"download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $env:GITHUB_OUTPUT
uses: nick-fields/retry@v2
with:
max_attempts: 5
retry_wait_seconds: 10
shell: pwsh
timeout_minutes: 5
command: |
./transfer.exe wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
"download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $env:GITHUB_OUTPUT
post-build:
runs-on: ubuntu-latest
@@ -721,6 +791,7 @@ jobs:
if "${{ needs.build-windows.result }}" == "success":
f.write("- Windows packages: [WeTransfer](${{ needs.build-windows.outputs.download-url }})\n")
- name: Send Discord message
if: github.event_name != 'pull_request'
uses: Sniddl/discord-commits@v1.5
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}

View File

@@ -1,28 +1,63 @@
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
W.title="Techmino "..require "version".string
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.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
if fs.getInfo('media/image/icon.png') then
W.icon='media/image/icon.png'
end
if MOBILE then
W.borderless=true
W.resizable=false
W.fullscreen=true
else
W.borderless=false
W.resizable=true
W.fullscreen=false
end
local M=t.modules
M.window,M.system,M.event,M.thread=true,true,true,true

409
main.lua
View File

@@ -22,9 +22,6 @@
local fs=love.filesystem
VERSION=require"version"
TIME=love.timer.getTime
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'
-- Global Vars & Settings
SFXPACKS={'chiptune'}
@@ -37,11 +34,6 @@ 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()
@@ -72,8 +64,6 @@ WIDGET.setOnChange(function()
end
end)
table.insert(_LOADTIMELIST_,("Load Zframework: %.3fs"):format(TIME()-_LOADTIME_))
-- Create shortcuts
setFont=FONT.set
getFont=FONT.get
@@ -98,10 +88,6 @@ for _,v in next,{'conf','record','replay','cache','lib'} do
end
end
CHAR=require'parts.char'
require'parts.gameTables'
require'parts.gameFuncs'
-- Load shader files from SOURCE ONLY
SHADER={}
for _,v in next,fs.getDirectoryItems('parts/shaders') do
@@ -111,6 +97,11 @@ for _,v in next,fs.getDirectoryItems('parts/shaders') do
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'
@@ -121,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'
@@ -132,9 +123,28 @@ 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
table.insert(_LOADTIMELIST_,("Load Modules: %.3fs"):format(TIME()-_LOADTIME_))
-- Initialize Zframework
do-- Z.setCursor
local normImg=GC.DO{16,16,
{'fCirc',8,8,4},
@@ -165,7 +175,7 @@ Z.setOnFnKeys({
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]
@@ -179,9 +189,11 @@ Z.setOnFnKeys({
function() if love['_openConsole'] then love['_openConsole']() end end,
})
Z.setOnGlobalKey('f11',function()
SETTING.fullscreen=not SETTING.fullscreen
applySettings()
saveSettings()
if not MOBILE then
SETTING.fullscreen=not SETTING.fullscreen
applySettings()
saveSettings()
end
end)
Z.setVersionText(VERSION.string)
Z.setDebugInfo{
@@ -239,45 +251,6 @@ 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
IMG.init{
lock='media/image/mess/lock.png',
@@ -299,7 +272,6 @@ 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',
z={
character='media/image/characters/z_character.png',
screen1='media/image/characters/z_screen1.png',
@@ -386,6 +358,137 @@ VOC.init{
'welcome',
}
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',
{
@@ -414,15 +517,13 @@ LANG.init('zh',
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 FILE.isSafe('parts/backgrounds/'..v) and v:sub(-3)=='lua' then
@@ -431,6 +532,7 @@ for _,v in next,fs.getDirectoryItems('parts/backgrounds') do
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 FILE.isSafe('parts/scenes/'..v) then
@@ -439,179 +541,9 @@ for _,v in next,fs.getDirectoryItems('parts/scenes') do
LANG.addScene(sceneName)
end
end
-- 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
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,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 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
FIRSTLAUNCH=STAT.run==0
if FIRSTLAUNCH and MOBILE then
@@ -669,7 +601,11 @@ for _,fileName in next,fs.getDirectoryItems('replay') do
end
table.sort(REPLAY,function(a,b) return a.fileName>b.fileName end)
table.insert(_LOADTIMELIST_,("Initialize Data: %.3fs"):format(TIME()-_LOADTIME_))
WS.switchHost('cafuuchino1.3322.org','10026','/techmino/ws/v1')
HTTP.setHost("cafuuchino1.3322.org:10026")
HTTP.setThreadCount(1)
table.insert(_LOADTIMELIST_,("Load Resources: %.3fs"):format(TIME()-_LOADTIME_))
for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i]) end
@@ -706,6 +642,3 @@ if TABLE.find(arg,'-- test') then
love.event.quit(1)
end)
end
WS.switchHost('cafuuchino1.3322.org','10026','/techmino/ws/v1')
HTTP.setHost("cafuuchino1.3322.org:10026")
HTTP.setThreadCount(1)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

View File

@@ -526,14 +526,14 @@ do
false,-- T
noKickSet,-- O
{
[01]={'+0+0','-2+0','+1+0','-2-1','+1+2'},
[10]={'+0+0','+2+0','-1+0','+2+1','-1-2'},
[01]={'+0+0','+1+0','-2+0','+1+2','-2-1'},
[10]={'+0+0','-1+0','+2+0','-1-2','+2+1'},
[03]={'+0+0','-1+0','+2+0','-1+2','+2-1'},
[30]={'+0+0','+1+0','-2+0','+1-2','-2+1'},
[12]={'+0+0','-1+0','+2+0','-1+2','+2-1'},
[21]={'+0+0','+1+0','-2+0','+1-2','-2+1'},
[23]={'+0+0','+2+0','-1+0','+2+1','-1-2'},
[32]={'+0+0','-2+0','+1+0','-2-1','+1+2'},
[30]={'+0+0','+1+0','-2+0','+1-2','-2+1'},
[03]={'+0+0','-1+0','+2+0','-1+2','+2-1'},
[32]={'+0+0','+1+0','-2+0','+1+2','-2-1'},
[23]={'+0+0','-1+0','+2+0','-1-2','+2+1'},
[02]={'+0+0','-1+0','+1+0','+0-1','+0+1'},
[20]={'+0+0','+1+0','-1+0','+0+1','+0-1'},
[13]={'+0+0','+0-1','-1+0','+1+0','+0+1'},
@@ -938,6 +938,40 @@ do
}
end
local N64
do
local R={'+0+0','+0-1','+1+0','-1+0','+0+1'}
local L={'+0+0','+0-1','-1+0','+1+0','+0+1'}
N64={
centerTex=GC.DO{10,10,
{'setLW',2},
{'line',2,9,2,1,8,9,8,1},
},
kickTable=TABLE.new({
[01]=R,[10]=L,[12]=R,[21]=L,
[23]=R,[32]=L,[30]=R,[03]=L,
},29)
}
end
local N64_plus
do
local R={'+0+0','+0-1','+1+0','-1+0','+0+1'}
local L={'+0+0','+0-1','-1+0','+1+0','+0+1'}
local F={'+0+0','+0-1','+0+1'}
N64_plus={
centerTex=GC.DO{10,10,
{'setLW',2},
{'line',4,9,2,9,2,1,8,9,8,1,6,1},
},
kickTable=TABLE.new({
[01]=R,[10]=L,[12]=R,[21]=L,
[23]=R,[32]=L,[30]=R,[03]=L,
[02]=F,[20]=F,[13]=F,[31]=F,
},29)
}
end
local Classic do
local centerPos=TABLE.copy(defaultCenterPos)
centerPos[1]={[0]={1,1},{1,0},{1,1},{1,0}}
@@ -978,7 +1012,7 @@ local None={
{'setLW',2},
{'line',2,2,6,6},
},
kickTable=TABLE.new(noKickSet_180,29)
kickTable=TABLE.new(noKickSet,29)
}
local None_plus={
@@ -987,7 +1021,7 @@ local None_plus={
{'line',1,1,7,7},
{'fRect',2,2,4,4},
},
kickTable=TABLE.new(noKickSet,29)
kickTable=TABLE.new(noKickSet_180,29)
}
local RSlist={
@@ -1002,6 +1036,8 @@ local RSlist={
ASC_plus=ASC_plus,
C2=C2,
C2_sym=C2_sym,
N64=N64,
N64_plus=N64_plus,
Classic=Classic,
Classic_plus=Classic_plus,
None=None,

View File

@@ -30,11 +30,11 @@ function back.draw()
for i=1,#sDist do
local d,r=sDist[i],sRev[i]
if d<5 then
setColor(hsv(.088,(d-2)/7,1,.7))
setColor(hsv(.088,(d-2)/7,1,.2))
else
setColor(hsv(.572,d/70+.1,(22-d)/12,.7))
setColor(hsv(.572,d/70+.1,(22-d)/12,.2))
end
circle('fill',8*d*cos(r),24*d*sin(r),3)
circle('fill',8*d*cos(r),24*d*sin(r),5)
end
end

View File

@@ -1,13 +1,13 @@
local gc=love.graphics
local hsv=COLOR.hsv
local circle,push,pop,rot,translate,setColor=gc.circle,gc.push,gc.pop,gc.rotate,gc.translate,gc.setColor
local rnd,sin,cos,log,ceil=math.random,math.sin,math.cos,math.log,math.ceil
local rnd,sin,cos,log=math.random,math.sin,math.cos,math.log
local back={}
local qX,qY,qdX,qdY={},{},{},{} -- quark data in SoA [size, X, Y, dx, dy, color]
local ptcclr={{1,0,0},{0,1,0},{0,0,1}}
local apcclr={{0,1,1},{1,0,1},{1,1,0}}
local ptcclr={{1,0,0,.5},{0,1,0,.5},{0,0,1,.5}}
local apcclr={{0,1,1,.5},{1,0,1,.5},{1,1,0,.5}}
local blasts={} -- data about annihilation blasts from particles and antiparticles colliding
local ptc={} -- particle-antiparticle data (antiparticle is a mirror of particle)
@@ -115,9 +115,9 @@ function back.draw()
translate(-10,-10)
-- Draw quarks in R/G/B
setColor(1,0,0,.8) for i=1, math.floor(quarkCount/3) do circle('fill',qX[i],qY[i],size) end
setColor(0,1,0,.8) for i=math.floor(quarkCount/3)+1, math.floor(quarkCount*2/3) do circle('fill',qX[i],qY[i],size) end
setColor(0,0,1,.8) for i=math.floor(quarkCount*2/3)+1,quarkCount do circle('fill',qX[i],qY[i],size) end
setColor(1,0,0,.5) for i=1, math.floor(quarkCount/3) do circle('fill',qX[i],qY[i],size) end
setColor(0,1,0,.5) for i=math.floor(quarkCount/3)+1, math.floor(quarkCount*2/3) do circle('fill',qX[i],qY[i],size) end
setColor(0,0,1,.5) for i=math.floor(quarkCount*2/3)+1,quarkCount do circle('fill',qX[i],qY[i],size) end
for i=1,#ptc do
local p=ptc[i]

View File

@@ -22,7 +22,7 @@ function bot_cc:checkDest(b2b,atk,exblock,yomi)
for k=1,#dest,2 do
local r=CB[dest[k+1]-self.P.curY+2]
if not r or not r[dest[k]-self.P.curX+2] then
print('wrong place')
-- print('wrong place')
self:lockWrongPlace()
self.P.destFX=nil
return
@@ -31,8 +31,8 @@ function bot_cc:checkDest(b2b,atk,exblock,yomi)
local should_spawn = self.P:getNextSpawn() - 1
if dest.spawn ~= should_spawn then
assert(dest.spawn > should_spawn)
print('wrong spawn: should be '..dest.spawn..' but '..should_spawn)
print('-- should only happen when camera is going down')
-- print('wrong spawn: should be '..dest.spawn..' but '..should_spawn)
-- print('-- should only happen when camera is going down')
self:lockWrongPlace()
self.P.destFX=nil
return

View File

@@ -1,7 +1,7 @@
return {
mesDisp=function(P)
setFont(45)
GC.mStr(("%.1f"):format(P.stat.atk),63,190)
GC.mStr(("%d"):format(P.stat.atk),63,190)
GC.mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,310)
mText(TEXTOBJ.atk,63,243)
mText(TEXTOBJ.eff,63,363)

View File

@@ -23,6 +23,7 @@ return {
LINE.discard(table.remove(P.field,1))
LINE.discard(table.remove(P.visTime,1))
end
P.garbageBeneath=P.garbageBeneath-bonus
end
end
end

View File

@@ -23,6 +23,7 @@ return {
LINE.discard(table.remove(P.field,1))
LINE.discard(table.remove(P.visTime,1))
end
P.garbageBeneath=P.garbageBeneath-bonus
end
end
end

Binary file not shown.

View File

@@ -608,68 +608,295 @@ function trySave()
end
end
do-- function freshPlayerPosition(sudden)
local posLists={
-- 1~5
{
{340,75,1},
{965,390,.5},
{965,30,.5},
{20,390,.5},
{20,30,.5},
local posLists=setmetatable({
alive={
[1]={main={340,75,1}},
[3]={main={340,75,1},
{25,210,.5},
{955,210,.5},
},
[4]={main={340,75,1},
{25,210,.5},
{970,90,.45},{970,410,.45},
},
[5]={main={340,75,1},
{40,90,.45},{40,410,.45},
{970,90,.45},{970,410,.45},
},
[6]={main={340,75,1},
{40,90,.45},{40,410,.45},
{1010,80,.305},{1010,290,.305},{1010,500,.305},
},
[7]={main={340,75,1},
{100,80,.305},{100,290,.305},{100,500,.305},
{1010,80,.305},{1010,290,.305},{1010,500,.305},
},
[10]={main={340,75,1},
{100,80,.305},{100,290,.305},{100,500,.305},
{935,90,.275},{935,300,.275},{935,510,.275},
{1105,90,.275},{1105,300,.275},{1105,510,.275},
},
[13]={main={340,75,1},
{10,90,.275},{10,300,.275},{10,510,.275},
{180,90,.275},{180,300,.275},{180,510,.275},
{935,90,.275},{935,300,.275},{935,510,.275},
{1105,90,.275},{1105,300,.275},{1105,510,.275},
},
[14]={main={340,75,1},
{10,90,.275},{10,300,.275},{10,510,.275},
{180,90,.275},{180,300,.275},{180,510,.275},
{935,90,.275},{935,300,.275},{935,510,.275},
{1120,80,.225},{1120,240,.225},{1120,400,.225},{1120,560,.225},
},
[15]={main={340,75,1},
{10,90,.275},{10,300,.275},{10,510,.275},
{180,90,.275},{180,300,.275},{180,510,.275},
{960,80,.225},{960,240,.225},{960,400,.225},{960,560,.225},
{1120,80,.225},{1120,240,.225},{1120,400,.225},{1120,560,.225},
},
[16]={main={340,75,1},
{10,90,.275},{10,300,.275},{10,510,.275},
{190,80,.225},{190,240,.225},{190,400,.225},{190,560,.225},
{960,80,.225},{960,240,.225},{960,400,.225},{960,560,.225},
{1120,80,.225},{1120,240,.225},{1120,400,.225},{1120,560,.225},
},
[17]={main={340,75,1},
{30,80,.225},{30,240,.225},{30,400,.225},{30,560,.225},
{190,80,.225},{190,240,.225},{190,400,.225},{190,560,.225},
{960,80,.225},{960,240,.225},{960,400,.225},{960,560,.225},
{1120,80,.225},{1120,240,.225},{1120,400,.225},{1120,560,.225},
},
[24]={main={340,75,1},
{30,80,.225},{30,240,.225},{30,400,.225},{30,560,.225},
{190,80,.225},{190,240,.225},{190,400,.225},{190,560,.225},
{940,80,.175},{940,205,.175},{940,330,.175},{940,455,.175},{940,580,.175},
{1050,80,.175},{1050,205,.175},{1050,330,.175},{1050,455,.175},{1050,580,.175},
{1160,80,.175},{1160,205,.175},{1160,330,.175},{1160,455,.175},{1160,580,.175},
},
[31]={main={340,75,1},
{10,80,.175},{10,205,.175},{10,330,.175},{10,455,.175},{10,580,.175},
{120,80,.175},{120,205,.175},{120,330,.175},{120,455,.175},{120,580,.175},
{230,80,.175},{230,205,.175},{230,330,.175},{230,455,.175},{230,580,.175},
{940,80,.175},{940,205,.175},{940,330,.175},{940,455,.175},{940,580,.175},
{1050,80,.175},{1050,205,.175},{1050,330,.175},{1050,455,.175},{1050,580,.175},
{1160,80,.175},{1160,205,.175},{1160,330,.175},{1160,455,.175},{1160,580,.175},
},
[33]=(function()
local l={main={340,75,1}}
for y=-1.5,1.5 do for x=0,3 do
table.insert(l,{265-85*x,310+160*y,.125})
table.insert(l,{940+85*x,310+160*y,.125})
end end
return l
end)(),
[51]=(function()
local l={main={340,75,1}}
for y=-2,2 do for x=0,4 do
table.insert(l,{275-65*x,315+125*y,.1})
table.insert(l,{945+65*x,315+125*y,.1})
end end
return l
end)(),
[75]=(function()
local l={main={340,75,1}}
for y=-2,2 do for x=0,4 do
table.insert(l,{275-65*x,310+125*y,.1})
end end
for y=-3,3 do for x=0,6 do
table.insert(l,{940+47*x,340+92*y,.075})
end end
return l
end)(),
[99]=(function()
local l={main={340,75,1}}
for y=-3,3 do for x=0,6 do
table.insert(l,{290-47*x,340+92*y,.075})
table.insert(l,{940+47*x,340+92*y,.075})
end end
return l
end)(),
[MATH.inf]=(function()
local l={main={340,75,1}}
for y=-3,3 do for x=0,6 do
table.insert(l,{290-47*x,340+92*y,.075})
table.insert(l,{940+47*x,340+92*y,.075})
end end
return l
end)(),
},
-- 6~17
(function()
local L={{340,75,1}}
for i=1,4 do ins(L,{15,-160+180*i,.25}) end
for i=1,4 do ins(L,{180,-160+180*i,.25}) end
for i=1,4 do ins(L,{950,-160+180*i,.25}) end
for i=1,4 do ins(L,{1120,-160+180*i,.25}) end
return L
end)(),
-- 18~31
(function()
local L={{340,75,1}}
for i=1,5 do ins(L,{10, -100+135*i,.18}) end
for i=1,5 do ins(L,{120, -100+135*i,.18}) end
for i=1,5 do ins(L,{230, -100+135*i,.18}) end
for i=1,5 do ins(L,{940, -100+135*i,.18}) end
for i=1,5 do ins(L,{1050,-100+135*i,.18}) end
for i=1,5 do ins(L,{1160,-100+135*i,.18}) end
return L
end)(),
-- 32~49
(function()
local L={{340,75,1}}
for i=1,4 do for j=1,6 do ins(L,{78*i-54,115*j-98,.09}) end end
for i=9,12 do for j=1,6 do ins(L,{78*i+267,115*j-98,.09}) end end
return L
end)(),
-- 50~99
(function()
local L={{340,75,1}}
for i=1,7 do for j=1,7 do ins(L,{46*i-36,97*j-72,.068}) end end
for i=15,21 do for j=1,7 do ins(L,{46*i+264,97*j-72,.068}) end end
return L
end)(),
}
function freshPlayerPosition(sudden)-- Set initial position for every player
dead={
[1]={{340,75,1}},
[2]={
{50,130,.925},{670,130,.925},
},
[3]={
{25,160,.675},{440,160,.675},{855,160,.675},
},
[4]={
{13,200,.525},{328,200,.525},{643,200,.525},{948,200,.525},
},
[5]={
{8,230,.425},{260,230,.425},{512,230,.425},{764,230,.425},{1016,230,.425},
},
[10]={
{8,110,.425},{260,110,.425},{512,110,.425},{764,110,.425},{1016,110,.425},
{8,410,.425},{260,410,.425},{512,410,.425},{764,410,.425},{1016,410,.425},
},
[12]={
{10,120,.35},{220,120,.35},{430,120,.35},{640,120,.35},{850,120,.35},{1060,120,.35},
{10,400,.35},{220,400,.35},{430,400,.35},{640,400,.35},{850,400,.35},{1060,400,.35},
},
[18]={
{10,90,.305},{220,90,.305},{430,90,.305},{640,90,.305},{850,90,.305},{1060,90,.305},
{10,300,.305},{220,300,.305},{430,300,.305},{640,300,.305},{850,300,.305},{1060,300,.305},
{10,510,.305},{220,510,.305},{430,510,.305},{640,510,.305},{850,510,.305},{1060,510,.305},
},
[21]={
{10,90,.295},{190,90,.295},{370,90,.295},{550,90,.295},{730,90,.295},{910,90,.295},{1090,90,.295},
{10,300,.295},{190,300,.295},{370,300,.295},{550,300,.295},{730,300,.295},{910,300,.295},{1090,300,.295},
{10,510,.295},{190,510,.295},{370,510,.295},{550,510,.295},{730,510,.295},{910,510,.295},{1090,510,.295},
},
[24]={
{20,100,.25},{175,100,.25},{330,100,.25},{485,100,.25},{640,100,.25},{795,100,.25},{950,100,.25},{1105,100,.25},
{20,300,.25},{175,300,.25},{330,300,.25},{485,300,.25},{640,300,.25},{795,300,.25},{950,300,.25},{1105,300,.25},
{20,500,.25},{175,500,.25},{330,500,.25},{485,500,.25},{640,500,.25},{795,500,.25},{950,500,.25},{1105,500,.25},
},
[27]={
{10,100,.225},{150,100,.225},{290,100,.225},{430,100,.225},{570,100,.225},{710,100,.225},{850,100,.225},{990,100,.225},{1130,100,.225},
{10,300,.225},{150,300,.225},{290,300,.225},{430,300,.225},{570,300,.225},{710,300,.225},{850,300,.225},{990,300,.225},{1130,300,.225},
{10,500,.225},{150,500,.225},{290,500,.225},{430,500,.225},{570,500,.225},{710,500,.225},{850,500,.225},{990,500,.225},{1130,500,.225},
},
[36]={
{10,90,.225},{150,90,.225},{290,90,.225},{430,90,.225},{570,90,.225},{710,90,.225},{850,90,.225},{990,90,.225},{1130,90,.225},
{10,245,.225},{150,245,.225},{290,245,.225},{430,245,.225},{570,245,.225},{710,245,.225},{850,245,.225},{990,245,.225},{1130,245,.225},
{10,400,.225},{150,400,.225},{290,400,.225},{430,400,.225},{570,400,.225},{710,400,.225},{850,400,.225},{990,400,.225},{1130,400,.225},
{10,555,.225},{150,555,.225},{290,555,.225},{430,555,.225},{570,555,.225},{710,555,.225},{850,555,.225},{990,555,.225},{1130,555,.225},
},
[39]=(function()
local l={}
for y=0,2 do for x=0,12 do
table.insert(l,{13+97*x,110+190*y,.15})
end end
return l
end)(),
[42]=(function()
local l={}
for y=0,2 do for x=0,13 do
table.insert(l,{15+90*x,120+190*y,.135})
end end
return l
end)(),
[45]=(function()
local l={}
for y=0,2 do for x=0,14 do
table.insert(l,{8+85*x,120+190*y,.125})
end end
return l
end)(),
[60]=(function()
local l={}
for y=0,3 do for x=0,14 do
table.insert(l,{8+85*x,85+155*y,.125})
end end
return l
end)(),
[64]=(function()
local l={}
for y=0,3 do for x=0,15 do
table.insert(l,{13+79*x,85+155*y,.115})
end end
return l
end)(),
[68]=(function()
local l={}
for y=0,3 do for x=0,16 do
table.insert(l,{6+75*x,85+155*y,.115})
end end
return l
end)(),
[72]=(function()
local l={}
for y=0,3 do for x=0,17 do
table.insert(l,{15+70*x,95+155*y,.1})
end end
return l
end)(),
[90]=(function()
local l={}
for y=0,4 do for x=0,17 do
table.insert(l,{15+70*x,82+127*y,.1})
end end
return l
end)(),
[95]=(function()
local l={}
for y=0,4 do for x=0,18 do
table.insert(l,{15+66*x,82+127*y,.1})
end end
return l
end)(),
[100]=(function()
local l={}
for y=0,4 do for x=0,19 do
table.insert(l,{12+63*x,82+127*y,.1})
end end
return l
end)(),
[MATH.inf]={},
},
}, {
__call=function(self,alive,count)
local lastTested=MATH.inf
for k in next,self[alive and 'alive' or 'dead'] do
if k<lastTested and k>=count then
lastTested=k
end
end
return self[alive and 'alive' or 'dead'][lastTested]
end,
})
function freshPlayerPosition(mode)-- Set initial position for every player, mode: 'normal'|'quick'|'update'
assert(mode=='normal' or mode=='quick' or mode=='update',"Wrong freshPlyPos mode")
local L=PLY_ALIVE
if not sudden then
if mode~='update' then
for i=1,#L do
L[i]:setPosition(640,#L<=5 and 360 or -62,0)
end
end
local posList
if #L<=5 then posList=posLists[1]
elseif #L<=17 then posList=posLists[2]
elseif #L<=31 then posList=posLists[3]
elseif #L<=49 then posList=posLists[4]
elseif #L<=99 then posList=posLists[5]
else error("TOO MANY PLAYERS!")
local alive=PLAYERS[1].alive
if mode=='update' then
if alive then
if #L<=31 then
for i=2,#L do
L[i].miniMode=false
L[i].draw=require"parts.player.draw".norm
end
end
else
if #L<=36 then
for i=1,#L do
L[i].miniMode=false
L[i].draw=require"parts.player.draw".norm
end
end
end
end
local posList=posLists(alive,#L)
local method=mode=='normal' and 'setPosition' or 'movePosition'
if alive then
for i=1,#L do
L[i][method](L[i],unpack(posList[i==1 and 'main' or i-1]))
end
else
for i=1,#L do
L[i][method](L[i],unpack(posList[i]))
end
end
local method=sudden and 'setPosition' or 'movePosition'
for i=1,#L do L[i][method](L[i],unpack(posList[i])) end
end
end
do-- function dumpBasicConfig()
@@ -772,7 +999,7 @@ do-- function resetGameData(args)
else
PLY.newPlayer(1)
end
freshPlayerPosition(args:find'q')
freshPlayerPosition((args:find'q') and 'quick' or 'normal')
VK.restore()
local bg=GAME.modeEnv.bg

View File

@@ -655,6 +655,8 @@ do-- Userdata tables
highCam=true,
nextPos=true,
fullscreen=true,
portrait=false,
msaa=0,
bg='on',
bgAlpha=.26,
powerInfo=false,

View File

@@ -27,7 +27,7 @@ return {
"homepage mainpage websites",
"help",
"The official website of Techmino!\nYou can download the latest stable build of Techmino and change your profile there.\nClick on the globe icon to open the website in your browser.",
"http://101.43.110.22:10026",
"http://studio26f.org",
},
{"Huiji Wiki",
"huiji wiki",
@@ -104,12 +104,6 @@ return {
"Join the Tetris communities and talk with other players! You can join the Hard Drop Discord server by clicking on the globe icon.",
"https://discord.gg/harddrop"
},
{"Mew",
"tieba forum reddit discord",
"org",
"The Mew forum owned by the Chinese Tetris Research Community and was founded in the second half of 2021. Mew is a Chinese social media, kind of like a combination of Discord and Reddit, with many channels in a big community. Users can chat in the channels and submit posts to the channel. Mew also has a function called “Library,” which systematically stores the documentation. The Tetris Mew forum is currently under construction, and not too many contents are available (2/Nov/2021).",
"https://mew.fun/n/tetris",
},
{"Tetris OL Servers",
"tetrisonline servers tos",
"org",

File diff suppressed because it is too large Load Diff

View File

@@ -20,8 +20,8 @@ return {
{"游戏官网",
"official website homepage mainpage guanwang",
"help",
"Techmino的官网\n可以在上面下载游戏本体,或者修改头像以及个人信息。\n\n游戏作者的一些话强烈不建议在任何公开场合提及甚至宣传Techmino更不要随便对外公布我们的官网链接!请务必只在私下里向有基础或真的很有兴趣入坑认真玩的玩家推荐,不然很容易拉低社群质量破坏交流氛围,非常难处理,甚至有可能影响游戏的未来发展。为了保证游戏未来会变得越来越好玩千万慎重考虑您对游戏的推广方式感谢您对Techmino的支持!!感谢配合!",
"http://101.43.110.22:10026",
"Techmino的官网\n可以在上面下载游戏本体,或者修改头像以及个人信息。\n\n游戏作者的一些话强烈不建议在任何公开场合提及甚至宣传Techmino更不要随便对外发送我们的官网链接!请务必只在私下里向有基础或真的很有兴趣入坑认真玩的玩家推荐,不然很容易拉低社群质量破坏交流氛围,比较难处理,甚至有可能影响游戏的未来发展。为了保证游戏能够变得越来越好玩千万慎重考虑您对游戏的推广方式感谢您对Techmino的大力支持!!",
"http://studio26f.org",
},
{"灰机Wiki",
"huiji",
@@ -96,12 +96,6 @@ return {
"org",
"俄罗斯方块·[研究]群QQ号764916351“中国俄罗斯方块总群”",
},
{"Mew据点",
"mew tieba forum",
"org",
"研究群下属的Mew据点类似贴吧或者Discord的服务器2021年下半年建立可以在同一个大社区的各个频道实时聊天也可以发帖以主题交流同时还有一个叫图书馆的功能方便各种方块资料整理还在建设中目前没多少内容2021/11/02",
"https://mew.fun/n/tetris",
},
{"茶服",
"tos tea study chafu",
"org",
@@ -1158,17 +1152,11 @@ return {
"在STSD上叠若干个T3的形状。"..HDwiki,
HDsearch.."King_Crimson",
},
{"连续PC (1/2)",
"pcloop",
{"连续PC",
"lianxuquanxiao lianxupc pcloop",
"pattern",
"テトリス堂的从开局起第1、2、3、4、7个4行pc的开局整理。第七个pc做完总共用掉70块相当于回到游戏开始阶段可以做1st pc\n\n第5和第6详见下一个词条",
"https://shiwehi.com/tetris/template/consecutivepc.php"
},
{"连续PC (2/2)",
"pcloop",
"pattern",
"four.lol的从开局起第5、6个4行pc的开局整理。\n链接点开是5th可以到6th其他的推荐看上一个词条",
"https://four.lol/perfect-clears/5th"
"研究群群友加加编写的一份连续PC教程",
"https://docs.qq.com/sheet/DRmxvWmt3SWxwS2tV"
},
-- 存档管理

View File

@@ -17,6 +17,7 @@ return {
playedLong="You have been playing for a long time. Time to take a break!",
playedTooMuch="You have been playing for far too long! Techmino is fun, but remember to take some rests!",
settingWarn="Careful — youre about to change some uncommon settings!",
settingWarn2="This setting takes effect after restart",
atkModeName={"Random","Badges","K.O.s","Attackers"},
royale_remain="$1 Players Left",
@@ -531,6 +532,8 @@ return {
power="Battery Info",
clean="Quick Draw",
fullscreen="Fullscreen",
portrait="Portrait",
msaa="MSAA level",
bg_on="Normal B.G.",
bg_off="No B.G.",

View File

@@ -1,4 +1,5 @@
return {
fallback='en',
loadText={
loadSFX="Cargando efectos de sonido",
loadSample="Cargando samples de música",
@@ -9,7 +10,6 @@ return {
loadOther="Cargando otros assets",
finish="Pulsa cualquier tecla",
},
fallback='en',
sureQuit="Pulsa de nuevo para salir",
sureReset="Pulsa de nuevo para reiniciar",
sureDelete="Pulsa de nuevo para borrar",
@@ -17,6 +17,7 @@ return {
playedLong="[Anti-adicción] Estuviste jugando un buen rato hoy. Recuerda descansar de vez en cuando.",
playedTooMuch="[Anti-adicción] ¡Has jugado mucho por hoy! No puedes jugar más.",
settingWarn="¡Ten cuidado con modificar esto!",
-- settingWarn2="This setting takes effect after restart",
atkModeName={"Al azar","Medallas","KOs","Atacantes"},
royale_remain="$1 Jugadores Restantes",
@@ -107,66 +108,66 @@ return {
-- Server's warn/error messages
Techrater={
-- internalError="Internal error",
-- databaseError="Database error",
-- invalidFormat="Invalid format",
-- invalidArguments="Invalid arguments",
-- tooFrequent="Too frequent",
-- notAvailable="Not available",
-- noPermission="No permission",
-- roomNotFound="Room not found",
internalError="Internal error",
databaseError="Database error",
invalidFormat="Formato inválido",
invalidArguments="Argumentos inválidos",
tooFrequent="Exceso de requests",
notAvailable="No disponible",
noPermission="No hay permisos suficientes",
roomNotFound="Sala no encontrada",
-- Controllers
WebSocket={
-- invalidConnection="Invalid connection",
-- invalidAction="Invalid action",
-- playerNotFound="Player not found",
-- connectionFailed="Connection failed",
invalidConnection="Conexión inválida",
invalidAction="Acción inválida",
playerNotFound="Jugador no encontrado",
connectionFailed="Error de conexión",
},
-- Filters
CheckPermission={
-- playerNotFound="Player not found",
playerNotFound="Jugador no encontrado",
},
-- Plugins
ConnectionManager={
-- playerInvalid="Player invalid",
-- playerNotFound="Player not found",
-- connectionReplaced="Connection replaced",
playerInvalid="Jugador inválido",
playerNotFound="Jugador no encontrado",
connectionReplaced="Conexión reiniciada",
},
NoticeManager={
-- noticeNotFound="Notice not found",
noticeNotFound="Aviso no encontrado",
},
PlayerManager={
-- invalidCode="Invalid code",
-- invalidEmail="Invalid email",
-- playerNotFound="Player not found",
-- invalidEmailPass="Invalid email or password",
-- emailExists="Email exists",
-- emailSendError="Email send error",
invalidCode="Código incorrecto",
invalidEmail="Correo inválido",
playerNotFound="Jugador no encontrado",
invalidEmailPass="Correo o contraseña incorrecta",
emailExists="Correo ya existente",
emailSendError="Error al enviar solicitud",
},
-- Strategies
PlayerRole={
-- invalidRole="Invalid role",
-- invalidTarget="Invalid target",
invalidRole="Rol inválido",
invalidTarget="Objetivo inválido",
},
PlayerType={
-- invalidType="Invalid type",
-- roomFull="Room full",
invalidType="Clase inválida",
roomFull="Esta sala está llena.",
},
RoomJoin={
-- wrongPassword="Wrong password",
wrongPassword="Contraseña incorrecta",
},
},
-- tooFrequent="Request too frequently",
-- roomPasswordChanged="Room password changed",
tooFrequent="Requests demasiado frecuentes",
roomPasswordChanged="Contraseña de sala cambiada",
oldVersion="¡Está disponible la nueva versión $1!",
versionNotMatch="¡Las versiones no coinciden!",
notFinished="Próximamente",
noUsername="Por favor ingresa un nombre de usuario",
wrongEmail="Correo electrónico inválido",
-- wrongCode="Invalid verification code",
wrongCode="Código de Verif. incorrecto",
noPassword="Por favor ingresa la contraseña",
diffPassword="Las contraseñas no coinciden",
checkEmail="Petición de registro enviada con éxito",
@@ -174,17 +175,17 @@ return {
wsFailed="WebSocket conexión fallida: $1",
wsClose="WebSocket cerrado: $1",
netTimeout="Tiempo de conexión agotado",
-- serverDown="Oops! Server is down",
-- requestFailed="Request failed",
serverDown="Server caído, F",
requestFailed="Error de Request",
onlinePlayerCount="En línea: $1",
createRoomSuccessed="¡Sala creada con éxito!",
-- playerKicked="$1 removed $2 from room",
-- becomeHost="$1 become host",
playerKicked="$2 quitado de la sala por $1",
becomeHost="$1 ahora es el host",
started="En juego",
joinRoom="$1 entró a la sala.",
leaveRoom="$1 salió de la sala.",
-- roomRemoved="Room was removed",
roomRemoved="Sala removida",
ready="LISTO",
spectating="Espectando",
@@ -414,7 +415,7 @@ return {
league="Liga Tech",
ffa="FFA",
rooms="Salas",
-- resetPW="Reset password",
resetPW="Restabl. Contraseña",
logout="Desconec.",
},
net_league={
@@ -531,6 +532,8 @@ return {
power="Inf. de Batería",
clean="Fast Draw",
fullscreen="Pant. Completa",
-- portrait="Portrait",
-- msaa="MSAA level",
bg_on="Fondo Normal",
bg_off="Sin Fondo",
@@ -735,7 +738,7 @@ return {
},
login_pw={
title="Entrar",
-- login_mail="Login with E-mail/Sign Up",
login_mail="Registrarse/Pedir código",
email="Correo Elec.",
password="Contraseña",
showEmail="Mostrar Correo",
@@ -743,19 +746,19 @@ return {
},
login_mail={
title="Entrar/Registrarse",
-- login_pw="Password Sign In",
login_pw="Ingr. con Contraseña",
email="Correo Elec.",
-- send="Send code",
-- code="Verification Code",
-- verify="Verify",
send="Enviar código",
code="Código de Verif.",
verify="Verificar",
},
reset_password={
-- title="Reset Password",
-- send="Send code",
-- code="Verification Code",
title="Restablecer Contraseña",
send="Enviar código",
code="Código de Verif.",
password="Contraseña",
password2="Repetir Contr.",
-- setPW="Set Password",
setPW="Establecer",
},
account={
title="Cuenta",
@@ -829,7 +832,7 @@ return {
['dig_eff_40l']= {"Dig", "Efic. 40L", "¡Limpia 40 líneas de queso con la menor cantidad de piezas posible!"},
['dig_eff_100l']= {"Dig", "Efic. 100L", "¡Limpia 100 líneas de queso con la menor cantidad de piezas posible!"},
['dig_eff_400l']= {"Dig", "Efic. 400L", "¡Limpia 400 líneas de queso con la menor cantidad de piezas posible!"},
--['dig_quad_10l']= {"Dig", "TECHRASH 10L", "Dig 10 garbage lines using only techrash!"},
['dig_quad_10l']= {"Dig", "TECHRASH 10L", "¡Limpia 10 líneas de queso sólo con Tecrashes!"},
['drought_n']= {"Sequía", "100L", "¡Sin piezas I!"},
['drought_l']= {"Sequía+", "100L", "Qué es esto..."},
['marathon_n']= {"Maratón", "Normal", "Maratón de 200 líneas con velocidad en aumento."},
@@ -921,5 +924,5 @@ return {
['custom_clear']= {"Personalizado", "Normal"},
['custom_puzzle']= {"Personalizado", "Puzzle"},
},
-- pumpkin="I'm a pumpkin",
pumpkin="Todos alaben al rey Calabaza",
}

View File

@@ -7,6 +7,7 @@ return {
playedLong="[Anti-addiction] Vous avez joué pendant un bon bout de temps aujourd'hui. Faites des pauses.",
playedTooMuch="[Anti-addiction] Vous avez joué trop longtemps ! Vous ne pouvez plus jouer.",
-- settingWarn="Modifing uncommon setting, be careful!",
-- settingWarn2="This setting takes effect after restart",
atkModeName={"Aléatoire","Badges","K.O.s faciles","Attaquants"},
royale_remain="$1 Joueurs restants",
@@ -496,6 +497,8 @@ return {
power="Infos d'alimentation",
-- clean="Fast Draw",
fullscreen="Plein écran",
-- portrait="Portrait",
-- msaa="MSAA level",
-- bg_on="Normal B.G.",
-- bg_off="No B.G.",

View File

@@ -18,6 +18,7 @@ return {
playedLong="Anda telah bermain lama. Waktunya istirahat!",
playedTooMuch="Anda telah bermain terlalu lama! Techmino sangat menyenangkan, tetapi jangan lupa istirahat!",
settingWarn="Awas, Anda akan mengubah beberapa pengaturan yang tidak biasanya diubah!",
-- settingWarn2="This setting takes effect after restart",
atkModeName={"Acak","Badge","K.O.","Penyerang"},
royale_remain="$1 Pemain Tersisa",
@@ -532,6 +533,8 @@ return {
power="Info Baterai",
clean="Gambar Cepat",
fullscreen="Layar Penuh",
-- portrait="Portrait",
-- msaa="MSAA level",
bg_on="B.G. Normal",
bg_off="Tidak Ada B.G.",

View File

@@ -14,10 +14,11 @@ return {
sureQuit="終了するにはもう一度押してください!",
sureReset="リセットするにはもう一度押してください!",
sureDelete="削除するにはもう一度押してください!",
newDay="新しい1日、新しい始まりです!",
playedLong="長時間プレイしています、適度休憩をして!",
playedTooMuch="かなり長くプレイしています! Techminoは楽しいですが、休憩を忘れずに!",
settingWarn="使用頻度の少ない設定変更しています。注意してください。",
newDay="新しい1日始まりです!",
playedLong="長時間プレイしています、適度休憩を",
playedTooMuch="長時間プレイしています! Techminoは楽しいですが、休憩を忘れずに!",
settingWarn="使用頻度の少ない設定変更しています。注意してください。",
settingWarn2="この設定は再起動後に適用されます",
atkModeName={"ランダム","バッジ狙い","トドメ撃ち","カウンター"},
royale_remain="残り $1 人",
@@ -33,16 +34,16 @@ return {
tasUsing="[TAS]",
stage="ステージ $1 クリア!",
great="よし!",
awesome="すごい!",
almost="あと少し!",
continue="がんばれ!",
great="GREAT",
awesome="素晴らしい",
almost="あと少し...",
continue="まだ行ける!",
maxspeed="最高速度!",
speedup="スピードアップ!",
missionFailed="失敗",
missionFailed="ミッション失敗",
speedLV="レベル",
piece="ミノ数",line="ライン",atk="火力",eff="効率",
piece="ミノ数",line="line",atk="火力",eff="効率",
rpm="RPM",tsd="TSD",
grade="Grade",techrash="Techrash",
wave="Wave",nextWave="Next",
@@ -57,15 +58,15 @@ return {
gameover="Game Over",
pause="ポーズ",
pauseCount="ポーズした回数",
pauseCount="ポーズ回数",
finesse_ap="All Perfect",
finesse_fc="Full Combo",
page="ページ:",
cc_fixed="CCは固定されたミノ順に非対応です!",
cc_swap="CCはホールドモードSwapの時に非対応です!",
ai_prebag="AIは通常のテトロミではない物やカスタマイズされたミノ順に非対応です!",
cc_fixed="CCはミの指定に非対応です!",
cc_swap="CCはホールドモードSwapに非対応です!",
ai_prebag="AIは通常のテトロミ以外やミノ順指定に非対応です!",
ai_mission="AIはカスタムミッションに非対応です!",
switchSpawnSFX="ブロック出現時の効果音をONにしてください!",
needRestart="すべての変更を適用する為にリスタートしてください!",
@@ -74,7 +75,7 @@ return {
loadError_read="'$1'の読み込みに失敗: 読み込みに失敗しました",
loadError_noFile="'$1'の読み込みに失敗: ファイルが存在しません",
loadError_other="'$1'の読み込みに失敗: $2",
loadError_unknown="'$1'の読み込みに失敗: 原因不明です",
loadError_unknown="'$1'の読み込みに失敗: 原因不明",
saveError_duplicate="'$1'の保存に失敗: 既に同じ名前のファイルがあります",
saveError_encode="'$1'の保存に失敗: エンコードエラー",
@@ -84,9 +85,9 @@ return {
copyDone="コピーしました!",
saveDone="データを保存しました!",
exportSuccess="書き出し成功!",
importSuccess="取り込み成功!",
importSuccess="読み取り成功!",
dataCorrupted="データが破損してます",
pasteWrongPlace="貼り付ける位置間違ってませんか?",
pasteWrongPlace="貼り付ける位置間違ってませんか?",
noFile="ファイルが見つかりません",
nowPlaying="再生中:",
@@ -97,8 +98,8 @@ return {
noScore="スコア無し",
modeLocked="未開放",
unlockHint="前のステージでランクB以上を取得すると解放されます!",
highScore="最高得点",
unlockHint="前のステージでBランク以上を取得すると解放されます!",
highScore="最高記録",
newRecord="新記録!",
replayBroken="リプレイが読み込めませんでした",
@@ -114,14 +115,14 @@ return {
invalidFormat="非対応の形式です",
invalidArguments="無効な引数です",
tooFrequent="リクエストが多すぎます",
notAvailable="使用不可",
notAvailable="無効なリクエスト",
noPermission="権限がありません",
roomNotFound="部屋が見つかりません",
-- Controllers
WebSocket={
invalidConnection="接続されていません",
invalidAction="無効な操作です",
invalidAction="無効な操作",
playerNotFound="プレイヤーが見つかりませんでした",
connectionFailed="接続失敗",
},
@@ -136,7 +137,7 @@ return {
connectionReplaced="接続切替",
},
NoticeManager={
noticeNotFound="通知が見つかりませんでした",
noticeNotFound="通知はありません",
},
PlayerManager={
invalidCode="無効なコード",
@@ -164,7 +165,7 @@ return {
roomPasswordChanged="部屋のパスワードを変更しました",
oldVersion="バージョン$1のダウンロードが可能になりました",
versionNotMatch="バージョンが一致しません",
notFinished="未完成ですので、ご期待ください",
notFinished="未完成です、ご期待ください",
noUsername="ユーザーネームを入力してください!",
wrongEmail="メールアドレスが無効です!",
@@ -176,29 +177,30 @@ return {
wsFailed="ウェブソケットとの通信に失敗しました: $1",
wsClose="ウェブソケットとの通信を終了: $1",
netTimeout="接続がタイムアウトしました",
serverDown="うわ! サーバーが落ちています...",
serverDown="あー、サーバーが落ちています...",
requestFailed="リクエスト失敗",
onlinePlayerCount="オンライン人数: $1",
createRoomSuccessed="部屋を建てました",
playerKicked="$1 は、$2 を部屋から追放しました",
becomeHost="$1 がホストになりました",
started="プレイ中",
joinRoom="$1 が入室しました",
leaveRoom="$1 が退出しました",
roomRemoved="部屋が撤去されました",
roomRemoved="部屋が解散しました",
ready="準備OK",
spectating="観戦中",
keySettingInstruction="選択してキーを入力\nEscape: キャンセル\nBackspace: キーを削除",
customBGhelp="カスタム背景にする画像ファイルをドロップ",
customBGloadFailed="サポートされていないフォーマットのファイルです",
customBGhelp="背景にする画像ファイルをドロップ",
customBGloadFailed="非対応のファイル形式です",
errorMsg="問題が発生! ゲームを再起動し、エラーログを開発者に送ってください",
tryAnotherBuild="[Invalid UTF-8]使用しているOSがMicrosoft WindowsであればTechmino-win32かTechmino-win64をダウンロードしてください! (現在使用しているソフトは違うバージョンです)",
modInstruction="Modを選択してください!\nModはゲームの中身を変えます\nしかしゲームが破損することもあります\nModを使用した場合スコアは保存されません",
modInstruction="Modを選択してください!\nModはゲームルールを変えられますが正常にプレイできなくなる可能性があります\nModを使用した場合スコアは保存されません",
modInfo={
next="NEXT\nNEXTの個数を変更します",
hold="HOLD\nHOLDの個数を変更します",
@@ -206,9 +208,9 @@ return {
infHold="InfiniHold\nHOLDできる回数を無限にします",
hideBlock="Hide Current Piece:\n現在出現しているピースを隠します",
hideGhost="No Ghost\nゴーストを消します",
hidden="Hide Locked Pieces.\n設置されたピースが時間内に見えなくなります",
hidden="Hide Locked Pieces\n設置されたピースが時間内に見えなくなります",
hideBoard="Hide Board\n盤面の一部もしくは、全体を隠します",
flipBoard="Flip Board\n盤面が回転もしくは滑ります",
flipBoard="Flip Board\n盤面が回転もしくは滑ります",
dropDelay="Gravity\n落下速度をフレーム単位で変更します",
lockDelay="Lock Delay\n設置猶予をフレーム単位で変更します",
waitDelay="Spawn Delay\nブロックの出現猶予をフレーム単位で変更します",
@@ -227,25 +229,25 @@ return {
"時間:",
"入力数/回転数/ホールド数:",
"ミノ数:",
"列数/掘った列:",
"火力数/堀からの火力:",
"受けたライン数:",
"ライン消去数:",
"line数/掘line:",
"火力数/火力:",
"受けたline数:",
"line消去数:",
"スピン:",
"B2B/B3B/PC/HPC:",
"最適化:",
},
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={"DPM","ADPM","APM","SPM","LPM","DPM"},
radarData={"DPM","ADPM","APM","SPM","L'PM","DPM"},
stat={
"起動回数:",
"プレイ回数:",
"プレイ時間:",
"入力数/回転数/ホールド数:",
"ミノ数/数/火力数:",
"受けたライン数/Res./Asc.:",
"火力/堀からの火力:",
"効率/の効率:",
"ミノ数/line数/火力数:",
"送られたline数/相殺/受け:",
"掘line/掘火力:",
"効率/の効率:",
"B2B数/B3B数:",
"PC数/HPC数:",
"最適化ミス数/率:",
@@ -400,7 +402,7 @@ return {
mod={
title="Mods",
reset="リセット (tab)",
unranked="ランク無し",
unranked="記録不可",
},
pause={
setting="設定 (S)",
@@ -413,7 +415,7 @@ return {
},
net_menu={
league="テクリーグ",
ffa="",
ffa="FFA",
rooms="ルーム",
resetPW="パスワード再設定",
logout="ログアウト",
@@ -448,7 +450,7 @@ return {
drop="自然落下時間",
lock="設置時間",
wait="操作硬直時間",
fall="ライン消去時間",
fall="line消去時間",
hang="死後硬直時間",
hurry="AREキャンセル時間",
@@ -469,7 +471,7 @@ return {
nextCount="ネクスト数",
holdCount="ホールド数",
infHold="無限ホールド",
phyHold="ホールド",
phyHold="その場ホールド",
},
net_game={
ready="準備OK",
@@ -513,14 +515,14 @@ return {
lockFX="設置演出",
dropFX="落下演出",
moveFX="左右移動演出",
clearFX="ライン消去演出",
clearFX="line消去演出",
splashFX="消去時の弾ける演出",
shakeFX="盤面移動演出",
atkFX="攻撃演出",
frame="レンダリングフレームレート(%)",
text="ライン消去ポップ",
text="line消去ポップ",
score="スコアポップ",
bufferWarn="ダメージアラート",
showSpike="スパイクカウンター",
@@ -530,8 +532,10 @@ return {
clickFX="クリック演出",
power="バッテリー",
clean="素早い描画",
clean="描画処理の最適化",
fullscreen="フルスクリーン",
portrait="縦画面",
msaa="アンチエイリアス(MSAA)レベル",
bg_on="通常背景",
bg_off="背景なし ",
@@ -583,16 +587,16 @@ return {
a6="ハードドロップ",
a7="ソフトドロップ",
a8="ホールド",
a9="ファンクション 1",
a10="ファンクション 2",
a9="機能 1",
a10="機能 2",
a11="即左移動",
a12="即右移動",
a13="ソニックドロップ",
a14="下1移動",
a15="下4移動",
a16="下10移動",
a17="左ドロップ",
a18="右ドロップ",
a14="落下移動 1",
a15="落下移動 4",
a16="落下移動 10",
a17="端ハードドロップ",
a18="端ハードドロップ",
a19="左ザンギ",
a20="右ザンギ",
restart="リトライ",
@@ -634,7 +638,7 @@ return {
drop="自然落下時間",
lock="設置時間",
wait="操作硬直時間",
fall="ライン消去時間",
fall="line消去時間",
hang="死後硬直時間",
hurry="AREキャンセル時間",
@@ -659,7 +663,7 @@ return {
nextCount="ネクスト数",
holdCount="ホールド数",
infHold="無限ホールド",
phyHold="ホールド",
phyHold="その場ホールド",
fieldH="盤面の高さ",
visible="設置ミノの視認性",
@@ -712,7 +716,7 @@ return {
Z2="Z2",S2="S2",J2="J2",L2="L2",T2="T2",O2="O2",I2="I2",
Z3="Z3",S3="S3",J3="J3",L3="L3",T3="T3",O3="O3",I3="I3",
O4="O4",I4="I4",
mission="強制ミッション",
mission="ミッションを強制",
},
about={
staff="スタッフ",
@@ -770,41 +774,41 @@ return {
title="アカウント",
},
app_15p={
color="Color",
invis="Invis",
slide="Slide",
pathVis="Show Path",
revKB="Reverse",
color="",
invis="インビジブル",
slide="スライド",
pathVis="ポインター",
revKB="逆順",
},
app_schulteG={
rank="Size",
invis="Invis",
disappear="Hide",
tapFX="Tap FX",
rank="サイズ",
invis="インビジブル",
disappear="済消去",
tapFX="効果音",
},
app_AtoZ={
level="Level",
keyboard="Keyboard",
level="レベル",
keyboard="キーボード",
},
app_2048={
invis="Invis",
tapControl="Tap controls",
invis="インビジブル",
tapControl="タッチ操作",
skip="Skip Round",
skip="スキップ",
},
app_ten={
next="Next",
invis="Invis",
fast="Fast",
invis="インビジブル",
fast="高速落下",
},
app_dtw={
color="Color",
mode="Mode",
color="",
mode="モード",
bgm="BGM",
arcade="Arcade",
arcade="アーケード",
},
app_link={
invis="Invis",
invis="インビジブル",
},
savedata={
export="クリップボードにコピー",
@@ -821,67 +825,67 @@ return {
},
},
modes={
['sprint_10l']= {"スプリント", "10L", "10ライン消せ!"},
['sprint_20l']= {"スプリント", "20L", "20ライン消せ!"},
['sprint_40l']= {"スプリント", "40L", "40ライン消せ!"},
['sprint_100l']= {"スプリント", "100L", "100ライン消せ!"},
['sprint_400l']= {"スプリント", "400L", "400ライン消せ!"},
['sprint_1000l']= {"スプリント", "1,000L", "1,000ライン消せ!"},
['sprintPenta']= {"スプリント", "PENTOMINO", "ペントミで40ライン"},
['sprint_10l']= {"スプリント", "10L", "10line消せ!"},
['sprint_20l']= {"スプリント", "20L", "20line消せ!"},
['sprint_40l']= {"スプリント", "40L", "40line消せ!"},
['sprint_100l']= {"スプリント", "100L", "100line消せ!"},
['sprint_400l']= {"スプリント", "400L", "400line消せ!"},
['sprint_1000l']= {"スプリント", "1,000L", "1,000line消せ!"},
['sprintPenta']= {"スプリント", "PENTOMINO", "ペントミで40line"},
['sprintMPH']= {"スプリント", "MPH", "ミノ順なし\nネクストなし\nホールドなし!"},
['sprint123']= {"スプリント", "M123", "、ドミ、トリミで40ライン"},
['secret_grade']= {"裏GM", "", "ガイドに従ってジグザグに穴を作れ!"},
['dig_10l']= {"掘り", "10L", "10ライン下穴を掘れ!"},
['dig_40l']= {"掘り", "40L", "40ライン下穴を掘れ!"},
['dig_100l']= {"掘り", "100L", "100ライン下穴を掘れ!"},
['dig_400l']= {"掘り", "400L", "400ライン下穴を掘れ!"},
['dig_eff_10l']= {"", "EFFICIENCY 10L", "最小のミ数で10ライン掘れ!"},
['dig_eff_40l']= {"", "EFFICIENCY 40L", "最小のミ数で40ライン掘れ!"},
['dig_eff_100l']= {"", "EFFICIENCY 100L","最小のミ数で100ライン掘れ!"},
['dig_eff_400l']= {"", "EFFICIENCY 400L","最小のミ数で400ライン掘れ!"},
['dig_quad_10l']= {"", "TECHRASH 10L", "techrashだけで10ライン下穴を掘れ!"},
['drought_n']= {"ドラウト", "100L", "Iミ一切無し!"},
['drought_l']= {"ドラウト+", "100L", "わったーふ◯っく!"},
['marathon_n']= {"マラソン", "NORMAL", "加速する中で200ラインマラソン!"},
['marathon_h']= {"マラソン", "HARD", "高速の中で200ラインマラソン!"},
['solo_e']= {"バトル", "EASY", "低レベルのAIに勝て!"},
['solo_n']= {"バトル", "NORMAL", "通常レベルのAIに勝て!"},
['solo_h']= {"バトル", "HARD", "高レベルのAIに勝て!"},
['solo_l']= {"バトル", "LUNATIC", "プロレベルのAIに勝て!"},
['solo_u']= {"バトル", "ULTIMATE", "神レベルのAIに勝て!"},
['techmino49_e']= {"テック 49", "EASY", "低レベルAIと49人で勝負\n最後の1人まで生き残れ!"},
['techmino49_h']= {"テック 49", "HARD", "高レベルAIと49人で勝負\n最後の1人まで生き残れ!"},
['techmino49_u']= {"テック 49", "ULTIMATE", "神レベAIと49人で勝負\n最後の1人まで生き残れ!"},
['techmino99_e']= {"テック 99", "EASY", "低レベルAIと99人で勝負\n最後の1人まで生き残れ!"},
['techmino99_h']= {"テック 99", "HARD", "高レベルAIと99人で勝負\n最後の1人まで生き残れ!"},
['techmino99_u']= {"テック 99", "ULTIMATE", "神レベルAIと99人で勝負\n最後の1人まで生き残れ!"},
['round_e']= {"ターン制", "EASY", "ターン制で低レベルAIと勝負!"},
['round_n']= {"ターン制", "NORMAL", "ターン制で通常レベルAIと勝負!"},
['round_h']= {"ターン制", "HARD", "ターン制で高レベルAIと勝負!"},
['round_l']= {"ターン制", "LUNATIC", "ターン制でプロレベルAIと勝負!"},
['round_u']= {"ターン制", "ULTIMATE", "ターン制で神レベルAIと勝負!"},
['sprint123']= {"スプリント", "M123", "、ドミ、トリミで40line"},
['secret_grade']= {"裏GM", "", "ガイドに従ってジグザグに穴を作れ!"},
['dig_10l']= {"掘り", "10L", "10line下穴を掘れ!"},
['dig_40l']= {"掘り", "40L", "40line下穴を掘れ!"},
['dig_100l']= {"掘り", "100L", "100line下穴を掘れ!"},
['dig_400l']= {"掘り", "400L", "400line下穴を掘れ!"},
['dig_eff_10l']= {"", "EFFICIENCY 10L", "最小のミ数で10line掘れ!"},
['dig_eff_40l']= {"", "EFFICIENCY 40L", "最小のミ数で40line掘れ!"},
['dig_eff_100l']= {"", "EFFICIENCY 100L","最小のミ数で100line掘れ!"},
['dig_eff_400l']= {"", "EFFICIENCY 400L","最小のミ数で400line掘れ!"},
['dig_quad_10l']= {"", "TECHRASH 10L", "techrashだけで10line下穴を掘れ!"},
['drought_n']= {"ドラウト", "100L", "Iミ一切無し!"},
['drought_l']= {"ドラウト+", "100L", "わったーふ◯っく!"},
['marathon_n']= {"マラソン", "NORMAL", "加速する中で200lineマラソン!"},
['marathon_h']= {"マラソン", "HARD", "高速の中で200lineマラソン!"},
['solo_e']= {"バトル", "EASY", "低レベルのAIに勝て!"},
['solo_n']= {"バトル", "NORMAL", "通常レベルのAIに勝て!"},
['solo_h']= {"バトル", "HARD", "高レベルのAIに勝て!"},
['solo_l']= {"バトル", "LUNATIC", "プロレベルのAIに勝て!"},
['solo_u']= {"バトル", "ULTIMATE", "神レベルのAIに勝て!"},
['techmino49_e']= {"テック 49", "EASY", "低レベルAIと49人で勝負\n最後の1人まで生き残れ!"},
['techmino49_h']= {"テック 49", "HARD", "高レベルAIと49人で勝負\n最後の1人まで生き残れ!"},
['techmino49_u']= {"テック 49", "ULTIMATE", "神レベAIと49人で勝負\n最後の1人まで生き残れ!"},
['techmino99_e']= {"テック 99", "EASY", "低レベルAIと99人で勝負\n最後の1人まで生き残れ!"},
['techmino99_h']= {"テック 99", "HARD", "高レベルAIと99人で勝負\n最後の1人まで生き残れ!"},
['techmino99_u']= {"テック 99", "ULTIMATE", "神レベルAIと99人で勝負\n最後の1人まで生き残れ!"},
['round_e']= {"ターン制", "EASY", "ターン制で低レベルAIと勝負!"},
['round_n']= {"ターン制", "NORMAL", "ターン制で通常レベルAIと勝負!"},
['round_h']= {"ターン制", "HARD", "ターン制で高レベルAIと勝負!"},
['round_l']= {"ターン制", "LUNATIC", "ターン制でプロレベルAIと勝負!"},
['round_u']= {"ターン制", "ULTIMATE", "ターン制で神レベルAIと勝負!"},
['big_n']= {"ビッグ", "NORMAL", "小さい盤面でプレイ!"},
['big_h']= {"ビッグ", "HARD", "小さい盤面でプレイ!"},
['master_n']= {"マスター", "NORMAL", "20G 初心者方へ"},
['master_h']= {"マスター", "HARD", "20G 中級者の方へ"},
['master_m']= {"マスター", "M21", "20G 上級者の方へ"},
['master_final']= {"マスター", "FINAL", "20G その先へ"},
['master_ph']= {"マスター", "PHANTASM", "???"},
['master_g']= {"マスター", "GRADED", "最高段位を取れ!"},
['master_n']= {"マスター", "NORMAL", "20G 初心者方へ"},
['master_h']= {"マスター", "HARD", "20G 中級者の方へ"},
['master_m']= {"マスター", "M21", "20G 上級者の方へ"},
['master_final']= {"マスター", "FINAL", "20G その先へ"},
['master_ph']= {"マスター", "PHANTASM", "???"},
['master_g']= {"マスター", "GRADED", "最高段位を取れ!"},
['master_ex']= {"グランドマスター", "EXTRA", "一瞬よりも短い永遠"},
['master_instinct']={"マスター", "INSTINCT", "もしミノが一切見えなくなったら?"},
['master_instinct']={"マスター", "INSTINCT", "もしミノが一切見えなくなったら?"},
['strategy_e']= {"ストラテジー", "EASY", "20Gでの素早い判断"},
['strategy_h']= {"ストラテジー", "HARD", "20Gでの素早い判断"},
['strategy_u']= {"ストラテジー", "ULTIMATE", "20Gでの素早い判断"},
['strategy_e_plus']={"ストラテジー", "EASY+", "20Gでの素早い判断"},
['strategy_h_plus']={"ストラテジー", "HARD+", "20Gでの素早い判断"},
['strategy_u_plus']={"ストラテジー", "ULTIMATE+", "20Gでの素早い判断"},
['blind_e']= {"目隠し", "HALF", "初心者用"},
['blind_n']= {"目隠し", "ALL", "中級者用"},
['blind_h']= {"目隠し", "SUDDEN", "上級者用"},
['blind_l']= {"目隠し", "SUDDEN+", "プロフェッショナル用"},
['blind_u']= {"目隠し", "?", "覚悟は良いかい?"},
['blind_wtf']= {"目隠し", "WTF", "まだ覚悟が足りない"},
['blind_e']= {"インビジブル", "HALF", "初心者用"},
['blind_n']= {"インビジブル", "ALL", "中級者用"},
['blind_h']= {"インビジブル", "SUDDEN", "上級者用"},
['blind_l']= {"インビジブル", "SUDDEN+", "プロフェッショナル用"},
['blind_u']= {"インビジブル", "?", "覚悟は良いかい?"},
['blind_wtf']= {"インビジブル", "WTF", "まだ覚悟が足りない"},
['classic_e']= {"クラシック", "EASY", "低速クラシック"},
['classic_h']= {"クラシック", "HARD", "通常速度クラシック"},
['classic_l']= {"クラシック", "LUNATIC", "中高速度クラシック"},
@@ -895,16 +899,16 @@ return {
['attacker_u']= {"火力王", "ULTIMATE", "攻撃力を磨け!"},
['defender_n']= {"相殺王", "NORMAL", "防御力を磨け!"},
['defender_l']= {"相殺王", "LUNATIC", "防御力を磨け!"},
['dig_h']= {"", "HARD", "掘りを磨け"},
['dig_u']= {"", "ULTIMATE", "掘りを磨け"},
['dig_h']= {"", "HARD", "掘りを磨け"},
['dig_u']= {"", "ULTIMATE", "掘りを磨け"},
['c4wtrain_n']= {"C4Wトレーニング", "NORMAL", "無限中開け"},
['c4wtrain_l']= {"C4Wトレーニング", "LUNATIC", "無限中開け"},
['pctrain_n']= {"パフェトレーニング", "NORMAL", "パフェの練習!"},
['pctrain_l']= {"パフェトレーニング", "LUNATIC", "もっと難しいパフェの練習!"},
['pc_n']= {"パフェチャレンジ", "NORMAL", "100Line以内で パフェをできるだけたくさん取れ!"},
['pc_h']= {"パフェチャレンジ", "HARD", "100Line以内で パフェをできるだけたくさん取れ!"},
['pc_l']= {"パフェチャレンジ", "LUNATIC", "100Line以内で パフェをできるだけたくさん取れ!"},
['pc_inf']= {"無限パフェチャレンジ", "", "できる限りたくさんのパフェを取れ!"},
['pctrain_n']= {"パフェトレーニング", "NORMAL", "パフェの練習!"},
['pctrain_l']= {"パフェトレーニング", "LUNATIC", "もっと難しいパフェの練習!"},
['pc_n']= {"パフェチャレンジ", "NORMAL", "100Line以内で パフェをできるだけたくさん取れ!"},
['pc_h']= {"パフェチャレンジ", "HARD", "100Line以内で パフェをできるだけたくさん取れ!"},
['pc_l']= {"パフェチャレンジ", "LUNATIC", "100Line以内で パフェをできるだけたくさん取れ!"},
['pc_inf']= {"無限パフェチャレンジ", "", "できる限りたくさんのパフェを取れ!"},
['tech_n']= {"テクニック", "NORMAL", "B2Bを繋げ続けよう!"},
['tech_n_plus']= {"テクニック", "NORMAL+", "回転入れとパフェだけ!"},
['tech_h']= {"テクニック", "HARD", "B2Bを繋げ続けよう!"},
@@ -912,7 +916,7 @@ return {
['tech_l']= {"テクニック", "LUNATIC", "回転入れとパフェだけ!"},
['tech_l_plus']= {"テクニック", "LUNATIC+", "回転入れとパフェだけ!"},
['tech_finesse']= {"テクニック", "FINESSE", "最適化!"},
['tech_finesse_f']= {"テクニック", "FINESSE+", "最適化はそのまま、普通のライン消去禁止!"},
['tech_finesse_f']= {"テクニック", "FINESSE+", "最適化はそのまま、通常line消去禁止!"},
['tsd_e']= {"TSDチャレンジ", "EASY", "TSDだけ!"},
['tsd_h']= {"TSDチャレンジ", "HARD", "TSDだけ!"},
['tsd_u']= {"TSDチャレンジ", "ULTIMATE", "TSDだけ!"},
@@ -920,13 +924,13 @@ return {
['backfire_h']= {"バックファイヤー", "HARD", "撃った火力が戻ってくる!"},
['backfire_l']= {"バックファイヤー", "LUNATIC", "撃った火力が戻ってくる!"},
['backfire_u']= {"バックファイヤー", "ULTIMATE", "撃った火力が戻ってくる!"},
['sprintAtk']= {"スプリント", "100 Attack", "100ライン送れ!"},
['sprintEff']= {"スプリント", "Efficiency", "40ラインの間にできるだけ火力を出せ!"},
['zen']= {'', "200", "時間制限なしで200ライン消去"},
['ultra']= {'ウルトラ', "EXTRA", "2分以内にできるだけ多くの点数を取る"},
['infinite']= {"無限", "", "サンドボックス"},
['infinite_dig']= {"無限: 掘り", "", "掘れ掘れ掘れ"},
['marathon_inf']= {"マラソン", "INFINITE", "ずっとマラソン"},
['sprintAtk']= {"スプリント", "100 Attack", "100line送れ!"},
['sprintEff']= {"スプリント", "Efficiency", "40lineの間にできるだけ火力を出せ!"},
['zen']= {'zen', "200", "時間制限なしで200line消去"},
['ultra']= {'ウルトラ', "EXTRA", "2分以内にできるだけ多くの点数を取る"},
['infinite']= {"無限", "", "サンドボックス"},
['infinite_dig']= {"無限: 掘り", "", "掘れ掘れ掘れ"},
['marathon_inf']= {"マラソン", "INFINITE", "ずっとマラソン"},
['custom_clear']= {"カスタム", "NORMAL"},
['custom_puzzle']= {"カスタム", "PUZZLE"},

View File

@@ -8,6 +8,7 @@ return {
playedLong="[Anti-vício] Você andou jogando bastante hoje. Certifique-se de fazer pausas.",
playedTooMuch="[Anti-vício] Você esteve jogando demais hoje! Você não pode jogar mais.",
-- settingWarn="Modifing uncommon setting, be careful!",
-- settingWarn2="This setting takes effect after restart",
atkModeName={"Aleatório","Emblemas","K.O.s","Atacantes"},
royale_remain="$1 Jogadores restantes",
@@ -520,6 +521,8 @@ return {
power="Informação bateria",
-- clean="Fast Draw",
fullscreen="Tela cheia",
-- portrait="Portrait",
-- msaa="MSAA level",
-- bg_on="Normal B.G.",
-- bg_off="No B.G.",

View File

@@ -1,6 +1,5 @@
return {
fallback='en',
loadText={
loadSFX="#!#",
loadSample="#~#",
@@ -283,6 +282,8 @@ return {
power="+.",
clean="[]→→O",
fullscreen="|←→|",
portrait="↑▉↓",
msaa="/ _",
bg_on="__?__",
bg_off="__.__",

View File

@@ -17,6 +17,7 @@ return {
playedLong="已经玩很久了!注意休息!",
playedTooMuch="今天玩太久啦!打块好玩但也要适可而止哦~",
settingWarn="正在修改不常用设置,小心操作!",
settingWarn2="该设置需要重启后生效",
atkModeName={"随机","徽章","击杀","反击"},
royale_remain="剩余 $1 名玩家",
@@ -256,7 +257,7 @@ return {
"",
"使用LÖVE引擎",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过官网 *暂无域名,见词典* 免费下载/更新",
"仅通过官网(见主菜单词典) 免费下载/更新",
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(怎么负责啊我又没法管)",
FNNS and "/" or "请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -338,7 +339,7 @@ return {
"Airun",
"幽灵3383",
"",
"Performances",
"演出",
"Electric283",
"Hebomai",
"",
@@ -532,6 +533,8 @@ return {
power="电量和时间",
clean="绘制优化",
fullscreen="全屏",
portrait="竖屏",
msaa="抗锯齿等级",
bg_on="普通背景",
bg_off="关闭背景",
@@ -971,7 +974,6 @@ return {
"方块能吃吗",
"感觉明明按键了但是没反应?你真的按到了吗?",
"感谢群友帮忙想tip",
"隔壁不在乎玩家意见但是我们在乎,没人提过的合理建议一定会回应",
"隔断消除即将到来!",
"还能写些什么tip呢",
"好像还没人能用脚打块打到一定水平",
@@ -993,7 +995,7 @@ return {
"你今天的人品值是(满分100):"..math.random(100),
"你们考虑过Z酱的感受吗没有你们只考虑你自己。",
"配乐是有考虑到模式氛围的哦",
"请谨慎向没有方块经验的玩家推荐,会对本游戏的生存环境造成影响,感谢配合。",
"拼图与趣味",
"请勿使用三只手游玩",
"全球目前应该没人能全X评价(大爆炸不算)",
"如何O-spin: 一秒转626圈(误",
@@ -1019,14 +1021,13 @@ return {
"游戏使用un……LÖVE引擎制作",
"游戏原声已上架网易云音乐",
"有建议的话可以反馈给作者~",
"有两个模式是以东方Project里的角色为主题的",
"这不是休闲游戏……别怪关卡要求太高,多练吧",
"中文方块百科全书tetris.huijiwiki.com",
"众所周知mac不能拿来玩游戏",
"作业没做完别玩手机",
"作者40行sub26了",
"作者电脑上装了11个方块",
"作者浏览器收藏夹里有6个方块",
"作者电脑上装了16个方块",
"作者浏览器收藏夹里有7个方块",
"ALLSPIN!",
"Am G F G",
"B2B2B",

View File

@@ -1,4 +1,3 @@
local C=COLOR
return {
loadText={
loadSFX="Load(SFX);",
@@ -17,6 +16,7 @@ return {
playedLong="PlayedLong=true",
playedTooMuch="PlayedTooMuch=true",
settingWarn="SettingWarn();",
settingWarn2="SettingWarn2();",
atkModeName={"Random();","Badges();","Kills();","Back();"},
royale_remain="LeftPlayers=$1",
@@ -205,7 +205,7 @@ return {
"",
"使用LÖVE引擎",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过官网 *暂无域名,见词典* 免费下载/更新",
"仅通过官网/*见主菜单词典*/ 免费下载/更新",
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(怎么负责啊我又没法管)",
FNNS and "/" or "请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -288,7 +288,7 @@ return {
-- "XMiao",
"幽灵3383",
"",
"Performances",
"演出",
"Electric283",
"Hebomai",
"",
@@ -482,6 +482,8 @@ return {
power="Set.Battery",
clean="Set.QuickDraw",
fullscreen="Set.Fullscreen",
portrait="Set.Portrait",
msaa="Set.MSAA",
bg_on="Set.BG(Normal);",
bg_off="Set.BG(Off);",

View File

@@ -17,6 +17,7 @@ return {
playedLong="你玩太久了!注意休息!",
playedTooMuch="今天玩得太久啦Techmino好玩但也要注意休息哦~",
settingWarn="正在修改不常用設定,小心操作!",
settingWarn2="該設定需要重啟後生效",
atkModeName={"隨機","徽章","K.O.","反擊"},
royale_remain="剩下 $1 名玩家",
@@ -532,6 +533,8 @@ return {
power="電量顯示",
clean="渲染優化",
fullscreen="全屏幕",
portrait="豎屏",
msaa="抗鋸齒等級",
bg_on="普通背景",
bg_off="無背景",

View File

@@ -30,7 +30,6 @@ local hideBoardStencil={
down=function() gc_rectangle('fill',0,-300,300,300,6) end,
all=function() gc_rectangle('fill',0,-600,300,600,6) end,
}
local dialFrame=TEXTURE.dial.frame
local dialNeedle=TEXTURE.dial.needle
local multiple=TEXTURE.multiple
local playerborder=TEXTURE.playerBorder
@@ -571,13 +570,47 @@ local function _drawNext(P,repMode)
end
gc_translate(-488,-20)
end
local function _drawDial(x,y,speed)
gc_setColor(1,1,1,.7)
gc_draw(dialFrame,x,y)
gc_setColor(1,1,1,.3)
gc_draw(dialNeedle,x+40,y+40,2.094+(speed<=175 and .02094*speed or 4.712-52.36/(speed-125)),nil,nil,1,1)
gc_setColor(.9,.9,.91)
setFont(30)GC.mStr(int(speed),x+40,y+19)
local _drawDial do
local function _getDialBackColor(speed)
if speed<60 then return COLOR.H
elseif speed<120 then return COLOR.Z
elseif speed<180 then return COLOR.lC
elseif speed<240 then return COLOR.lG
elseif speed<300 then return COLOR.lY
elseif speed<420 then return COLOR.O
else return COLOR.R
end
end
local function _getDialColor(speed)
if speed<60 then return COLOR.Z
elseif speed<120 then return COLOR.lC
elseif speed<180 then return COLOR.lG
elseif speed<240 then return COLOR.lY
elseif speed<300 then return COLOR.O
else return COLOR.R
end
end
function _drawDial(x,y,speed)
local theta=3*math.pi/2+((math.pi*(speed<300 and speed or 150+speed/2)/30)%MATH.tau)
gc_setColor(0,0,0,.4)
gc.circle('fill',x+40,y+40,36)
gc_setColor(1,1,1)
gc_draw(dialNeedle,x+40,y+40,theta,nil,nil,1,1)
gc_setLineWidth(3)
gc_setColor(_getDialBackColor(speed))
gc.circle('line',x+40,y+40,37)
gc_setColor(_getDialColor(speed))
if speed<420 then
gc.arc('line','open',x+40,y+40,37,3*math.pi/2,theta)
else
gc.circle('line',x+40,y+40,37)
end
setFont(30)GC.mStr(int(speed),x+40,y+19)
end
end
local function _drawFinesseCombo_norm(P)
if P.finesseCombo>2 then

View File

@@ -445,7 +445,13 @@ function PLY.newPlayer(id,mini,p)
local pData={
uid=USER.uid,
group=0,
} if p then TABLE.coverR(p,pData) end
} if p then
TABLE.coverR(p,pData)
else
-- Default pid=1, and empty username
pData.uid=1
P.username=""
end
P.uid=pData.uid
P.sid=NET.uid_sid[pData.uid] or pData.uid
P.group=pData.group

View File

@@ -600,6 +600,28 @@ do-- function Player:movePosition(x,y,size)
TASK.new(task_movePosition,self,x,y,size or self.size)
end
end
do-- function Player:dropPosition(x,y,size)
local function task_dropPosition(self)
local vy=0
local x,y,size=self.x,self.y,self.size
while true do
yield()
y=y+vy
vy=vy+.0626
self:setPosition(x,y,size)
if y>2600 then
return true
end
end
end
local function check_player(obj,Ptar)
return obj.args[1]==Ptar
end
function Player:dropPosition()
TASK.removeTask_iterate(check_player,self)
TASK.new(task_dropPosition,self)
end
end
local frameColorList={[0]=COLOR.Z,COLOR.lG,COLOR.lB,COLOR.lV,COLOR.lO}
function Player:setFrameColor(c)
@@ -2654,6 +2676,13 @@ local function update_dead(P,dt)
_updateMisc(P,dt)
end
function Player:_die()
do
local p=TABLE.find(PLY_ALIVE,self)
if p then
PLY_ALIVE[p]=PLY_ALIVE[#PLY_ALIVE]
rem(PLY_ALIVE)
end
end
self.alive=false
self.timing=false
self.control=false
@@ -2818,7 +2847,6 @@ function Player:lose(force)
end
self:_die()
self.result='lose'
do local p=TABLE.find(PLY_ALIVE,self) if p then rem(PLY_ALIVE,p) end end
if self.gameEnv.layout=='royale' then
self:changeAtk()
self.modeData.place=#PLY_ALIVE+1
@@ -2862,7 +2890,7 @@ function Player:lose(force)
SFX.play('fail')
VOC.play('lose')
if self.gameEnv.layout=='royale' then
BGM.play(' end')
BGM.play('end')
end
gameOver()
self:newTask(#PLAYERS>1 and task_lose or task_finish)
@@ -2876,6 +2904,9 @@ function Player:lose(force)
end
if #PLY_ALIVE>0 then
self:dropPosition()
freshPlayerPosition('update')
local cur=PLY_ALIVE[1].group
for i=2,#PLY_ALIVE do
local g=PLY_ALIVE[i].group

View File

@@ -4,7 +4,7 @@ local sin=math.sin
local scene={}
function scene.sceneInit()
function scene.enter()
BG.set()
end

View File

@@ -2,7 +2,7 @@
local scene={}
function scene.sceneInit()
function scene.enter()
end

View File

@@ -14,7 +14,7 @@ local slide,pathVis,revKB
local function ifGaming() return state==1 end
local colorSelector=WIDGET.newSelector{name='color',x=150,y=240,w=200,list={'color1','rainbow','color2','gray','black'},color='lY',disp=function() return color end,code=function(v) if state~=1 then color=v end end,hideF=ifGaming}
function scene.sceneInit()
function scene.enter()
BG.set('rainbow2')
BGM.play('push')
board={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}

View File

@@ -225,7 +225,7 @@ local function skip()
end
end
function scene.sceneInit()
function scene.enter()
BG.set('cubes')
BGM.play('truth')
board={}

View File

@@ -29,7 +29,7 @@ local startTime,time
local state,progress
local frameKeyCount,mistake
function scene.sceneInit()
function scene.enter()
BG.set('bg2')
BGM.play('way')
levelName="A_Z"

View File

@@ -94,7 +94,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
restart()
BGM.play('truth')
BG.set('rainbow')

View File

@@ -153,7 +153,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
reset()
BGM.play('truth')
end

View File

@@ -24,12 +24,12 @@ local function _autoReturn()
end
end
function scene.sceneInit()
function scene.enter()
BG.set('none')
BGM.stop()
reg,val,sym=false,"0",false
end
function scene.sceneBack()
function scene.leave()
BGM.play()
end

View File

@@ -6,7 +6,7 @@ local state,timer,score,combo
local x,y,vx,vy,ex,ey
local scene={}
function scene.sceneInit()
function scene.enter()
pow,ang=0,0
state=0
timer=0

View File

@@ -711,20 +711,22 @@ local commands={} do
local button=WIDGET.newButton{name='bye',x=640,y=615,w=426,h=100,code=function()
TASK.new(function()
scene.widgetList.bye.hide=true
for _=1,30 do coroutine.yield() end
TEST.yieldN(30)
log{C.R,"Deleting all data in 10..."}SFX.play('ready')SFX.play('clear_1')TEST.yieldN(60)
log{C.R,"Deleting all data in 9..."}SFX.play('ready')SFX.play('clear_1')TEST.yieldN(60)
log{C.R,"Deleting all data in 8..."}SFX.play('ready')SFX.play('clear_1')TEST.yieldN(60)
log{C.R,"Deleting all data in 7..."}SFX.play('ready')SFX.play('clear_2')TEST.yieldN(60)
log{C.R,"Deleting all data in 6..."}SFX.play('ready')SFX.play('clear_2')TEST.yieldN(60)
log{C.R,"Deleting all data in 5..."}SFX.play('ready')SFX.play('clear_3')TEST.yieldN(60)
log{C.R,"Deleting all data in 4..."}SFX.play('ready')SFX.play('clear_3')TEST.yieldN(60)
log{C.R,"Deleting all data in 3..."}SFX.play('ready')SFX.play('clear_4')TEST.yieldN(60)
log{C.R,"Deleting all data in 2..."}SFX.play('ready')SFX.play('clear_4')TEST.yieldN(60)
log{C.R,"Deleting all data in 1..."}SFX.play('ready')SFX.play('clear_5')TEST.yieldN(60)
log{C.R,"Deleting all data in 0..."}SFX.play('start')SFX.play('clear_6')TEST.yieldN(60)
outputBox.hide=true TEST.yieldN(26)
FILE.clear_s('')love.event.quit()
log{C.R,"Deleting all data in 9..."} SFX.play('ready')SFX.play('clear_1')TEST.yieldN(60)
log{C.R,"Deleting all data in 8..."} SFX.play('ready')SFX.play('clear_1')TEST.yieldN(60)
log{C.R,"Deleting all data in 7..."} SFX.play('ready')SFX.play('clear_2')TEST.yieldN(60)
log{C.R,"Deleting all data in 6..."} SFX.play('ready')SFX.play('clear_2')TEST.yieldN(60)
log{C.R,"Deleting all data in 5..."} SFX.play('ready')SFX.play('clear_3')TEST.yieldN(60)
log{C.R,"Deleting all data in 4..."} SFX.play('ready')SFX.play('clear_3')TEST.yieldN(60)
log{C.R,"Deleting all data in 3..."} SFX.play('ready')SFX.play('clear_4')TEST.yieldN(60)
log{C.R,"Deleting all data in 2..."} SFX.play('ready')SFX.play('clear_4')TEST.yieldN(60)
log{C.R,"Deleting all data in 1..."} SFX.play('ready')SFX.play('clear_5')TEST.yieldN(60)
log{C.R,"Deleting all data in 0..."} SFX.play('start')SFX.play('clear_6')TEST.yieldN(60)
outputBox.hide=true
TEST.yieldN(26)
FILE.clear_s('')
love.event.quit()
end)
end}
button:setObject("Techmino is fun. Bye.")
@@ -1014,7 +1016,7 @@ userG.the_key=first_key
function scene.sceneInit()
function scene.enter()
WIDGET.focus(inputBox)
BG.set('none')
end

View File

@@ -45,7 +45,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
cubesX={} for i=1,40 do cubesX[i]=rnd()*16-8 end
cubesY={} for i=1,40 do cubesY[i]=i/40*9 end
lastCube=1

View File

@@ -33,7 +33,7 @@ local function restart()
end
end
function scene.sceneInit()
function scene.enter()
restart()
state='menu'
BGM.play('hang out')

View File

@@ -197,7 +197,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
reset()
BG.set('fixColor',.26,.26,.26)
BGM.play(bgm)

View File

@@ -243,7 +243,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
invis=false
newGame()
BGM.play('truth')

View File

@@ -105,7 +105,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
BG.set('fixColor',.26,.62,.26)
_newGame()
selected=false

View File

@@ -29,7 +29,7 @@ local function _reset()
freshLevel()
end
function scene.sceneInit()
function scene.enter()
state=1
timeUsed=0
level=0

View File

@@ -13,7 +13,7 @@ local offset
local scene={}
function scene.sceneInit()
function scene.enter()
inst='lead'
offset=0
end

View File

@@ -27,7 +27,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
state=0
ang,pos=0,-tau/4
timer=50

View File

@@ -14,7 +14,7 @@ local ry=0-- Rotation Y
local p1,p2-- Player data
function scene.sceneInit()
function scene.enter()
BG.set('none')
BGM.play('way')
state=0

View File

@@ -15,7 +15,7 @@ local function reset()
s1,s2=0,0
end
function scene.sceneInit()
function scene.enter()
reset()
BG.set('none')
end

View File

@@ -11,7 +11,7 @@ local startTime,time
local state,progress
local tapFX,mistake
function scene.sceneInit()
function scene.enter()
BG.set('space')
BGM.play('way')
board={}

View File

@@ -23,7 +23,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
state=0
time1=STRING.time(0)
time2=STRING.time(0)

View File

@@ -8,7 +8,7 @@ local scene={}
local lastKey,keyTime
local speed,maxSpeed=0,260
function scene.sceneInit()
function scene.enter()
lastKey=nil
speed=0
keyTime={} for i=1,40 do keyTime[i]=-1e99 end

View File

@@ -54,7 +54,7 @@ local function reset()
fallingTimer=false
failPos=false
end
function scene.sceneInit()
function scene.enter()
BG.set('rainbow2')
BGM.play('truth')
preview={}

View File

@@ -264,7 +264,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
player:reset()
BGM.play('truth')
end

View File

@@ -24,12 +24,12 @@ local sList={
local scene={}
function scene.sceneInit()
function scene.enter()
destroyPlayers()
BG.set(CUSTOMENV.bg)
BGM.play(CUSTOMENV.bgm)
end
function scene.sceneBack()
function scene.leave()
saveFile(CUSTOMENV,'conf/customEnv')
BGM.play()
end

View File

@@ -117,14 +117,14 @@ local function _pDraw()
while #F>0 and isEmpty(F[#F]) do rem(F) end
end
function scene.sceneInit()
function scene.enter()
curPen=false
penMode=0
penX,penY=1,1
demo=false
page=1
end
function scene.sceneBack()
function scene.leave()
saveFile(DATA.copyBoards(),'conf/customBoards')
end

View File

@@ -9,11 +9,11 @@ local scene={}
local input-- Input buffer
local cur-- Cursor position
function scene.sceneInit()
function scene.enter()
input=""
cur=#MISSION
end
function scene.sceneBack()
function scene.leave()
saveFile(DATA.copyMission(),'conf/customMissions')
end

View File

@@ -1,18 +1,18 @@
local gc,sys=love.graphics,love.system
local sys=love.system
local kb=love.keyboard
local sin=math.sin
local ins,rem=table.insert,table.remove
local gc_setColor,gc_print=gc.setColor,gc.print
local gc_setColor,gc_print=GC.setColor,GC.print
local scene={}
local cur-- Cursor position
function scene.sceneInit()
function scene.enter()
cur=#BAG
end
function scene.sceneBack()
function scene.leave()
saveFile(DATA.copySequence(),'conf/customSequence')
end
@@ -112,12 +112,12 @@ function scene.keyDown(key)
end
end
local blockCharWidth={} for i=1,#BLOCK_CHARS do blockCharWidth[i]=gc.newText(FONT.get(60),BLOCK_CHARS[i]):getWidth() end
local blockCharWidth={} for i=1,#BLOCK_CHARS do blockCharWidth[i]=GC.newText(FONT.get(60),BLOCK_CHARS[i]):getWidth() end
function scene.draw()
-- Draw frame
gc_setColor(COLOR.Z)
gc.setLineWidth(2)
gc.rectangle('line',100,110,1080,260,5)
GC.setLineWidth(2)
GC.rectangle('line',100,110,1080,260,5)
-- Draw sequence
local BLOCK_COLORS=BLOCK_COLORS
@@ -166,7 +166,7 @@ function scene.draw()
-- Draw cursor
gc_setColor(.5,1,.5,.6+.4*sin(TIME()*6.26))
gc.line(cx-5,cy-20,cx-5,cy+20)
GC.line(cx-5,cy-20,cx-5,cy+20)
end
scene.widgetList={

View File

@@ -4,7 +4,7 @@ local scene={}
local timer
function scene.sceneInit()
function scene.enter()
timer=1
scene.widgetList.pause.x=
SETTING.menuPos=='right' and 1195 or

View File

@@ -75,7 +75,7 @@ local function _search()
lastSearch=input
end
function scene.sceneInit()
function scene.enter()
dict=require("parts.language.dict_"..(SETTING.locale:find'zh' and 'zh' or SETTING.locale:find'ja' and 'ja' or 'en'))
_scanDict(dict)

View File

@@ -4,7 +4,7 @@ local errorShot,errorInfo
local scene={}
function scene.sceneInit()
function scene.enter()
BGcolor=math.random()>.026 and {.3,.5,.9} or {.62,.3,.926}
sysAndScn=SYSTEM.."-"..VERSION.string.." scene:"..Z.getErr('#').scene
errorText=LOADED and text.errorMsg or "An error has occurred while the game was loading.\nAn error log has been created so you can send it to the author."
@@ -34,7 +34,7 @@ end
scene.widgetList={
WIDGET.newKey{name='console',x=940,y=640,w=170,h=80,font=65,fText=CHAR.icon.console,code=goScene'app_console'},
WIDGET.newKey{name='quit',x=1140,y=640,w=170,h=80,font=40,fText=CHAR.icon.cross_thick,code=love.event.quit},
WIDGET.newKey{name='quit',x=1140,y=640,w=170,h=80,font=40,fText=CHAR.icon.cross_thick,code=goScene('quit','none')},
}
return scene

View File

@@ -133,7 +133,7 @@ local function _checkGameKeyDown(key)
return true-- No key pressed
end
function scene.sceneInit()
function scene.enter()
if GAME.init then
resetGameData()
GAME.init=false

View File

@@ -1,6 +1,6 @@
local scene={}
function scene.sceneInit()
function scene.enter()
BG.set('cubes')
scene.widgetList.texts:setTexts(require"parts.updateLog":split("\n"))
end

View File

@@ -20,7 +20,7 @@ local curLang=1
local scene={}
function scene.sceneBack()
function scene.leave()
saveSettings()
end

View File

@@ -1,5 +1,5 @@
local scene={}
function scene.sceneInit()
function scene.enter()
BG.set('cubes')
local fileData=love.filesystem.read("legals.md")
if fileData then

View File

@@ -110,22 +110,22 @@ local loadingThread=coroutine.wrap(function()
return 'finish'
end)
function scene.sceneInit()
function scene.enter()
studioLogo=GC.newText(getFont(90),"26F Studio")
progress=0
maxProgress=10
t1,t2=0,0-- Timer
animeType={} for i=1,#SVG_TITLE_FILL do animeType[i]=math.random(#titleTransform) end-- Random animation type
end
function scene.sceneBack()
love.event.quit()
function scene.leave()
SCN.go('quit','none')
end
function scene.mouseDown()
if LOADED then
if FIRSTLAUNCH then
SCN.push('main')
SCN.swapTo('lang')
SCN.go('lang')
else
SCN.go(SETTING.simpMode and 'main_simple' or 'main')
end
@@ -134,7 +134,7 @@ end
scene.touchDown=scene.mouseDown
function scene.keyDown(key)
if key=='escape' then
love.event.quit()
SCN.go('quit','none')
else
scene.mouseDown()
end

View File

@@ -29,7 +29,7 @@ local function _paste()
MES.new('warn',text.wrongCode)
end
function scene.sceneInit()
function scene.enter()
scene.widgetList.email:setText(USER.email or "")
scene.widgetList.code:clear()
end

View File

@@ -15,7 +15,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
showEmail=false
emailBox.secret=true
emailBox:setText(USER.email)

View File

@@ -18,7 +18,7 @@ local enterConsole=coroutine.wrap(function()
Snd('bell',.6,'A4',.7,'A5',1,'A6')SFX.play('ren_mega')SCN.go('app_console')coroutine.yield()
end
end)
function scene.sceneInit()
function scene.enter()
if THEME.cur=='halloween' then
TASK.new(function()
TEST.yieldT(.26)

View File

@@ -2,7 +2,7 @@ local scene={}
local tip=GC.newText(getFont(30),"")
function scene.sceneInit()
function scene.enter()
tip:set(text.getTip())
BG.set()
end

View File

@@ -1,6 +1,6 @@
local scene={}
function scene.sceneInit()
function scene.enter()
BG.set('cubes')
local fileData=FILE.load('parts/language/manual_'..(SETTING.locale:find'zh' and 'zh' or SETTING.locale:find'ja' and 'ja' or 'en')..'.txt','-string')
if fileData then

View File

@@ -38,7 +38,7 @@ local function _toggleMod(M,back)
scene.widgetList.unranked.hide=scoreValid()
end
function scene.sceneInit()
function scene.enter()
selected=false
scene.widgetList.unranked.hide=scoreValid()
BG.set('tunnel')

View File

@@ -24,7 +24,7 @@ local touchDist
local scene={}
function scene.sceneInit()
function scene.enter()
BG.set()
mapCam.zoomK=SCN.prev=='main' and 5 or 1
visibleModes={}-- 1=unlocked, 2=locked but visible

View File

@@ -23,7 +23,7 @@ local selected-- Music selected
local bgmList=BGM.getList()
if #bgmList==0 then bgmList={"[NO BGM]"} end
function scene.sceneInit()
function scene.enter()
playing=BGM.getPlaying()[1]
selected=TABLE.find(bgmList,playing) or 1
end
@@ -111,9 +111,16 @@ function scene.draw()
GC.shadedPrint(playing,710,508,'left',2)
GC.setColor(sin(t*.5)*.2+.8,sin(t*.7)*.2+.8,sin(t)*.2+.8)
GC.print(playing,710,508)
setFont(35)
GC.setColor(1,sin(t*2.6)*.5+.5,sin(t*2.6)*.5+.5)
GC.print(author[playing] or "MrZ",670,465)
local name=author[playing] or "MrZ"
GC.setColor(.26,.26,.26)
GC.print(name,670-1,465-1)
GC.print(name,670-1,465+1)
GC.print(name,670+1,465-1)
GC.print(name,670+1,465+1)
GC.setColor(1,sin(t*2.6)*.3+.7,sin(t*2.6)*.3+.7)
GC.print(name,670,465)
setFont(20)
GC.setColor(COLOR.Z)

View File

@@ -59,7 +59,7 @@ end
local scene={}
function scene.sceneInit()
function scene.enter()
noTouch=not SETTING.VKSwitch
playing=false
lastUpstreamTime=0
@@ -73,7 +73,7 @@ function scene.sceneInit()
GAME.prevBG=false
end
end
function scene.sceneBack()
function scene.leave()
TASK.unlock('netPlaying')
end

View File

@@ -2,7 +2,7 @@ local gc=love.graphics
local scene={}
function scene.sceneInit()
function scene.enter()
BG.set('league')
BGM.play('exploration')
end

View File

@@ -1,9 +1,9 @@
local scene={}
function scene.sceneInit()
function scene.enter()
BG.set()
end
function scene.sceneBack()
function scene.leave()
NET.ws_close()
TASK.removeTask_code(NET.ws_update)
end

View File

@@ -50,11 +50,11 @@ local function _createRoom()
end
end
function scene.sceneInit()
function scene.enter()
sure=0
destroyPlayers()
end
function scene.sceneBack()
function scene.leave()
BGM.play()
end

View File

@@ -71,7 +71,7 @@ local function _fetchRoom()
end
local scene={}
function scene.sceneInit()
function scene.enter()
BG.set()
_fetchRoom()
end

View File

@@ -1,8 +1,6 @@
local gc=love.graphics
local sin,log=math.sin,math.log10
local GAME,SCR=GAME,SCR
local setFont,mStr=FONT.set,GC.mStr
local sin,log=math.sin,math.log10
local GC=GC
local scene={}
@@ -17,9 +15,9 @@ local rank-- Current rank
local trophy-- Current trophy
local trophyColor-- Current trophy color
function scene.sceneInit()
function scene.enter()
page=0
if SCN.prev:find("setting") then
if type(SCN.prev)=='string' and SCN.prev:find("setting") then
TEXT.show(text.needRestart,640,410,50,'fly',.6)
end
local P1=PLAYERS[1]
@@ -116,7 +114,7 @@ function scene.sceneInit()
GAME.prevBG=false
end
end
function scene.sceneBack()
function scene.leave()
trySave()
end
@@ -181,7 +179,7 @@ local hexList={1,0,.5,1.732*.5,-.5,1.732*.5}
for i=1,6 do hexList[i]=hexList[i]*150 end
local textPos={90,131,-90,131,-200,-25,-90,-181,90,-181,200,-25}
local dataPos={90,143,-90,143,-200,-13,-90,-169,90,-169,200,-13}
local tasText=gc.newText(getFont(100),"TAS")
local tasText=GC.newText(getFont(100),"TAS")
function scene.draw()
if timer1<1 or GAME.result then
SCN.scenes.game.draw()
@@ -190,157 +188,157 @@ function scene.draw()
-- Dark BG
local _=timer1
if GAME.result then _=_*.76 end
gc.setColor(.12,.12,.12,_)
gc.replaceTransform(SCR.origin)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.replaceTransform(SCR.xOy)
GC.setColor(.12,.12,.12,_)
GC.replaceTransform(SCR.origin)
GC.rectangle('fill',0,0,SCR.w,SCR.h)
GC.replaceTransform(SCR.xOy)
gc.setColor(.97,.97,.97,timer1)
GC.setColor(.97,.97,.97,timer1)
-- Result Text
mDraw(GAME.result and TEXTOBJ[GAME.result] or TEXTOBJ.pause,640,70-10*(5-timer1*5)^1.5)
-- Mode Info (outside)
gc.draw(TEXTOBJ.modeName,745-TEXTOBJ.modeName:getWidth(),143)
GC.draw(TEXTOBJ.modeName,745-TEXTOBJ.modeName:getWidth(),143)
-- Level rank
if RANK_CHARS[GAME.rank] then
gc.push('transform')
gc.translate(1050,5)
setFont(80)
gc.setColor(0,0,0,timer1*.7)
gc.print(RANK_CHARS[GAME.rank],-5,-4,nil,1.5)
GC.push('transform')
GC.translate(1050,5)
FONT.set(80)
GC.setColor(0,0,0,timer1*.7)
GC.print(RANK_CHARS[GAME.rank],-5,-4,nil,1.5)
local L=RANK_COLORS[GAME.rank]
gc.setColor(L[1],L[2],L[3],timer1)
gc.print(RANK_CHARS[GAME.rank],0,0,nil,1.5)
gc.pop()
GC.setColor(L[1],L[2],L[3],timer1)
GC.print(RANK_CHARS[GAME.rank],0,0,nil,1.5)
GC.pop()
end
if GAME.tasUsed then
gc.setColor(.97,.97,.97,timer1*.08)
GC.setColor(.97,.97,.97,timer1*.08)
mDraw(tasText,870,395,.3,2.6)
end
-- Big info frame
if PLAYERS[1].frameRun>=180 then
gc.push('transform')
gc.translate(560,205)
gc.setLineWidth(2)
GC.push('transform')
GC.translate(560,205)
GC.setLineWidth(2)
-- Pause Info (outside)
setFont(25)
FONT.set(25)
if GAME.pauseCount>0 then
gc.setColor(.97,.97,.97,timer1*.06)
gc.rectangle('fill',-5,390,620,36,8)
gc.setColor(.97,.97,.97,timer1)
gc.rectangle('line',-5,390,620,36,8)
mStr(("%s:[%d] %.2fs"):format(text.pauseCount,GAME.pauseCount,GAME.pauseTime),305,389)
GC.setColor(.97,.97,.97,timer1*.06)
GC.rectangle('fill',-5,390,620,36,8)
GC.setColor(.97,.97,.97,timer1)
GC.rectangle('line',-5,390,620,36,8)
GC.mStr(("%s:[%d] %.2fs"):format(text.pauseCount,GAME.pauseCount,GAME.pauseTime),305,389)
end
-- Pages
if page==0 then
-- Frame
gc.setColor(.97,.97,.97,timer2*.06)
gc.rectangle('fill',-5,-5,620,380,8)
gc.setColor(.97,.97,.97,timer2)
gc.rectangle('line',-5,-5,620,380,8)
GC.setColor(.97,.97,.97,timer2*.06)
GC.rectangle('fill',-5,-5,620,380,8)
GC.setColor(.97,.97,.97,timer2)
GC.rectangle('line',-5,-5,620,380,8)
-- Game statistics
gc.push('transform')
gc.scale(.85)
gc.setLineWidth(2)
GC.push('transform')
GC.scale(.85)
GC.setLineWidth(2)
-- Stats
_=form
setFont(30)
gc.setColor(.97,.97,.97,timer2)
FONT.set(30)
GC.setColor(.97,.97,.97,timer2)
for i=1,10 do
gc.print(text.pauseStat[i],5,43*(i-1)+2)
gc.printf(_[i],210,43*(i-1)+2,500,'right')
GC.print(text.pauseStat[i],5,43*(i-1)+2)
GC.printf(_[i],210,43*(i-1)+2,500,'right')
end
-- Finesse rank & trophy
if rank then
setFont(40)
gc.setColor(.7,.7,.7,timer2)
gc.print(rank,405,383)
FONT.set(40)
GC.setColor(.7,.7,.7,timer2)
GC.print(rank,405,383)
if trophy then
setFont(30)
gc.setColor(trophyColor[1],trophyColor[2],trophyColor[3],timer2*2-1)
gc.printf(trophy,95-120*(1-timer2^.5),390,300,'right')
FONT.set(30)
GC.setColor(trophyColor[1],trophyColor[2],trophyColor[3],timer2*2-1)
GC.printf(trophy,95-120*(1-timer2^.5),390,300,'right')
end
end
gc.pop()
GC.pop()
elseif page==1 then
-- Radar Chart
gc.setLineWidth(1)
gc.push('transform')
gc.translate(310,185)
GC.setLineWidth(1)
GC.push('transform')
GC.translate(310,185)
-- Polygon
gc.push('transform')
gc.scale((3-2*timer2)*timer2)
gc.setColor(.97,.97,.97,timer2*(.5+.3*sin(TIME()*6.26)))
GC.push('transform')
GC.scale((3-2*timer2)*timer2)
GC.setColor(.97,.97,.97,timer2*(.5+.3*sin(TIME()*6.26)))
GC.regRoundPolygon('line',0,0,120,6,8)
gc.setColor(chartColor[1],chartColor[2],chartColor[3],timer2*.626)
GC.setColor(chartColor[1],chartColor[2],chartColor[3],timer2*.626)
for i=1,9,2 do
gc.polygon('fill',0,0,val[i],val[i+1],val[i+2],val[i+3])
GC.polygon('fill',0,0,val[i],val[i+1],val[i+2],val[i+3])
end
gc.polygon('fill',0,0,val[11],val[12],val[1],val[2])
gc.setColor(.97,.97,.97,timer2)
GC.polygon('fill',0,0,val[11],val[12],val[1],val[2])
GC.setColor(.97,.97,.97,timer2)
for i=1,9,2 do
gc.line(val[i],val[i+1],val[i+2],val[i+3])
GC.line(val[i],val[i+1],val[i+2],val[i+3])
end
gc.line(val[11],val[12],val[1],val[2])
gc.pop()
GC.line(val[11],val[12],val[1],val[2])
GC.pop()
-- Texts
local C
_=TIME()%6.2832
if _>3.142 then
gc.setColor(.97,.97,.97,-timer2*sin(_))
setFont(35)
GC.setColor(.97,.97,.97,-timer2*sin(_))
FONT.set(35)
C,_=text.radar,textPos
else
gc.setColor(.97,.97,.97,timer2*sin(_))
setFont(20)
GC.setColor(.97,.97,.97,timer2*sin(_))
FONT.set(20)
C,_=radar,dataPos
end
for i=1,6 do
mStr(C[i],_[2*i-1],_[2*i])
GC.mStr(C[i],_[2*i-1],_[2*i])
end
gc.pop()
GC.pop()
end
gc.pop()
GC.pop()
end
-- Mods
gc.push('transform')
gc.translate(131,600)
gc.scale(.65)
GC.push('transform')
GC.translate(131,600)
GC.scale(.65)
if #GAME.mod>0 then
gc.setLineWidth(2)
GC.setLineWidth(2)
if scoreValid() then
gc.setColor(.7,.7,.7,timer1)
gc.rectangle('line',-5,-5,500,150,8)
gc.setColor(.7,.7,.7,timer1*.05)
gc.rectangle('fill',-5,-5,500,150,8)
GC.setColor(.7,.7,.7,timer1)
GC.rectangle('line',-5,-5,500,150,8)
GC.setColor(.7,.7,.7,timer1*.05)
GC.rectangle('fill',-5,-5,500,150,8)
else
gc.setColor(.8,0,0,timer1)
gc.rectangle('line',-5,-5,500,150,8)
gc.setColor(1,0,0,timer1*.05)
gc.rectangle('fill',-5,-5,500,150,8)
GC.setColor(.8,0,0,timer1)
GC.rectangle('line',-5,-5,500,150,8)
GC.setColor(1,0,0,timer1*.05)
GC.rectangle('fill',-5,-5,500,150,8)
end
setFont(35)
FONT.set(35)
for _,M in next,MODOPT do
if M.sel>0 then
_=M.color
gc.setColor(_[1],_[2],_[3],timer1)
mStr(M.id,35+M.no%8*60,math.floor(M.no/8)*45)
GC.setColor(_[1],_[2],_[3],timer1)
GC.mStr(M.id,35+M.no%8*60,math.floor(M.no/8)*45)
end
end
end
gc.pop()
GC.pop()
end
scene.widgetList={

View File

@@ -1,19 +1,19 @@
local scene={}
function scene.sceneInit()
if SYSTEM~="iOS" then
function scene.enter()
if SYSTEM=="iOS" then
MES.update(1e99)
Z.setPowerInfo(false)
Z.setClickFX(false)
VERSION.string=""
MES.new('error',"Please swipe up or press Home button to quit Techmino on iOS",1e99)
else
if math.random()>.0000626 then
love.timer.sleep(.26)
love.event.quit()
else
error("So lucky! 0.00626% to get this!! You can quit the game now.")
end
else
MES.update(1e99)
Z.setPowerInfo(false)
Z.setClickFX(false)
VERSION.string=""
MES.new('error',"Please swipe up or press Home button to quit Techmino on iOS",1e99)
end
end

View File

@@ -68,7 +68,7 @@ local function _updateButtonVisibility()
scene.widgetList[i].hide=hide
end
end
function scene.sceneInit()
function scene.enter()
BG.set()
listBox:setList(REPLAY)
_updateButtonVisibility()

View File

@@ -1,5 +1,11 @@
local logged
local scene={}
function scene.enter()
logged=false
end
local function _dumpCB(T)
love.system.setClipboardText(STRING.packText(TABLE.dump(T)))
MES.new('check',text.exportSuccess)
@@ -79,9 +85,9 @@ scene.widgetList={
end},
WIDGET.newText{name='couldSave', x=55,y=485,color='lB',align='L',font=50},
WIDGET.newText{name='notLogin', x=55,y=550,color='dB',align='L',font=30,hideF=function() return WS.status('user')=='running' end},
WIDGET.newButton{name='upload', x=190,y=610,w=280,h=90,color='lB',font=25,code=NET.uploadSave,hideF=function() return WS.status('user')~='running' end},
WIDGET.newButton{name='download', x=490,y=610,w=280,h=90,color='lB',font=25,code=NET.downloadSave,hideF=function() return WS.status('user')~='running' end},
WIDGET.newText{name='notLogin', x=55,y=550,color='C',align='L',font=30,hideF=function() return logged end},
WIDGET.newButton{name='upload', x=190,y=610,w=280,h=90,color='lB',font=25,code=NET.uploadSave,hideF=function() return not logged end},
WIDGET.newButton{name='download', x=490,y=610,w=280,h=90,color='lB',font=25,code=NET.downloadSave,hideF=function() return not logged end},
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene},
}

View File

@@ -5,7 +5,7 @@ local scene={}
local das,arr
local pos,dir,wait
function scene.sceneInit()
function scene.enter()
das,arr=SETTING.das,SETTING.arr
pos,dir,wait=0,1,30
BG.set('bg1')

View File

@@ -2,10 +2,10 @@ local gc=love.graphics
local scene={}
function scene.sceneInit()
function scene.enter()
BG.set()
end
function scene.sceneBack()
function scene.leave()
saveSettings()
end
@@ -43,7 +43,7 @@ scene.widgetList={
WIDGET.newButton{name='touch', x=990, y=220, w=320,h=80,color=not MOBILE and 'dH',font=35, code=goScene'setting_touch',hideF=function() return not SETTING.VKSwitch end},
WIDGET.newSwitch{name='showVK', x=1100, y=150, lim=400, disp=SETval('VKSwitch'), code=SETrev('VKSwitch')},
WIDGET.newSlider{name='reTime', x=330, y=320, w=300,lim=180,axis={.5,3,.25},disp=SETval('reTime'), code=SETsto('reTime'),show=SETval('reTime')},
WIDGET.newSelector{name='RS', x=300, y=420, w=300,color='S', disp=SETval('RS'), code=SETsto('RS'),list={'TRS','SRS','SRS_plus','SRS_X','BiRS','ARS_Z','DRS_weak','ASC','ASC_plus','C2','C2_sym','Classic','Classic_plus','None','None_plus'}},
WIDGET.newSelector{name='RS', x=300, y=420, w=300,color='S', disp=SETval('RS'), code=SETsto('RS'),list={'TRS','SRS','SRS_plus','SRS_X','BiRS','ARS_Z','DRS_weak','ASC','ASC_plus','C2','C2_sym','N64','N64_plus','Classic','Classic_plus','None','None_plus'}},
WIDGET.newSelector{name='menuPos',x=980, y=320, w=300,color='O', disp=SETval('menuPos'), code=SETsto('menuPos'),list={'left','middle','right'}},
WIDGET.newSwitch{name='sysCursor',x=1060, y=400, lim=580, disp=SETval('sysCursor'),code=function() SETTING.sysCursor=not SETTING.sysCursor applySettings() end},
WIDGET.newSwitch{name='autoPause',x=1060, y=470, lim=580, disp=SETval('autoPause'),code=SETrev('autoPause')},

View File

@@ -98,12 +98,12 @@ local function _freshKeyList()
end
end
function scene.sceneInit()
function scene.enter()
selected=false
_freshKeyList()
BG.set('none')
end
function scene.sceneBack()
function scene.leave()
saveFile(KEY_MAP,'conf/key')
end

View File

@@ -11,7 +11,7 @@ local playEgg=WIDGET.newButton{name='playEgg', x=1140,y=540,w=140,h=65,color='l
local scene={}
function scene.sceneInit()
function scene.enter()
selEggMode=false
scene.widgetList.playEgg.hide=true
BG.set()

View File

@@ -8,7 +8,7 @@ local last1,last2-- Last touch/sound time
local sfxPack=SETTING.sfxPack
local vocPack=SETTING.vocPack
function scene.sceneInit()
function scene.enter()
last1,last2=0,0
sfxPack=SETTING.sfxPack
vocPack=SETTING.vocPack
@@ -16,7 +16,7 @@ function scene.sceneInit()
scene.widgetList.vocPack:reset()
BG.set()
end
function scene.sceneBack()
function scene.leave()
saveSettings()
end
@@ -74,9 +74,6 @@ function scene.draw()
elseif vocPack=="miku" then
gc.translate(700,320+12*sin(TIME()*.5))
gc.draw(IMG.mikuCH,nil,nil,nil,.8)
elseif vocPack=="rin" then
gc.translate(820,280+12*sin(TIME()*.5))
gc.draw(IMG.rinCH,nil,nil,nil,.8)
end
gc.pop()
end

View File

@@ -31,12 +31,12 @@ local function _load2()
end
end
function scene.sceneInit()
function scene.enter()
BG.set('rainbow')
defaultSetSelect=1
selected=false
end
function scene.sceneBack()
function scene.leave()
saveFile(VK_ORG,'conf/virtualkey')
end

View File

@@ -1,6 +1,6 @@
local scene={}
function scene.sceneInit()
function scene.enter()
BG.set('matrix')
end

View File

@@ -2,7 +2,7 @@ local gc=love.graphics
local scene={}
function scene.sceneBack()
function scene.leave()
saveSettings()
end
@@ -42,6 +42,11 @@ function scene.draw()
gc.pop()
end
local function _msaaShow(S)
S=S.disp()
return S==0 and 0 or 2^S
end
scene.widgetScrollHeight=900
scene.widgetList={
WIDGET.newText{name='title', x=640,y=15,lim=630,font=80},
@@ -70,21 +75,23 @@ scene.widgetList={
WIDGET.newSelector{name='frame', x=400,y=890,lim=280,w=460,list={8,10,13,17,22,29,37,47,62,80,100},disp=SETval('frameMul'),code=function(v) SETTING.frameMul=v;Z.setFrameMul(SETTING.frameMul) end},
WIDGET.newSwitch{name='text', x=450,y=980,lim=360,disp=SETval('text'), code=SETrev('text')},
WIDGET.newSwitch{name='score', x=450,y=1030,lim=360,disp=SETval('score'), code=SETrev('score')},
WIDGET.newSwitch{name='bufferWarn', x=450,y=1100,lim=360,disp=SETval('bufferWarn'), code=SETrev('bufferWarn')},
WIDGET.newSwitch{name='showSpike', x=450,y=1150,lim=360,disp=SETval('showSpike'), code=SETrev('showSpike')},
WIDGET.newSwitch{name='nextPos', x=450,y=1220,lim=360,disp=SETval('nextPos'), code=SETrev('nextPos')},
WIDGET.newSwitch{name='highCam', x=450,y=1270,lim=360,disp=SETval('highCam'), code=SETrev('highCam')},
WIDGET.newSwitch{name='warn', x=450,y=1340,lim=360,disp=SETval('warn'), code=SETrev('warn')},
WIDGET.newSwitch{name='text', x=450,y=980,lim=360,disp=SETval('text'), code=SETrev('text')},
WIDGET.newSwitch{name='score', x=450,y=1030,lim=360,disp=SETval('score'), code=SETrev('score')},
WIDGET.newSwitch{name='bufferWarn', x=450,y=1100,lim=360,disp=SETval('bufferWarn'), code=SETrev('bufferWarn')},
WIDGET.newSwitch{name='showSpike', x=450,y=1150,lim=360,disp=SETval('showSpike'), code=SETrev('showSpike')},
WIDGET.newSwitch{name='nextPos', x=450,y=1220,lim=360,disp=SETval('nextPos'), code=SETrev('nextPos')},
WIDGET.newSwitch{name='highCam', x=450,y=1270,lim=360,disp=SETval('highCam'), code=SETrev('highCam')},
WIDGET.newSwitch{name='warn', x=450,y=1340,lim=360,disp=SETval('warn'), code=SETrev('warn')},
WIDGET.newSwitch{name='clickFX', x=950,y=980,lim=360,disp=SETval('clickFX'), code=function() SETTING.clickFX=not SETTING.clickFX applySettings() end},
WIDGET.newSwitch{name='power', x=950,y=1070,lim=360,disp=SETval('powerInfo'), code=function() SETTING.powerInfo=not SETTING.powerInfo applySettings() end},
WIDGET.newSwitch{name='clean', x=950,y=1160,lim=360,disp=SETval('cleanCanvas'), code=function() SETTING.cleanCanvas=not SETTING.cleanCanvas applySettings() end},
WIDGET.newSwitch{name='fullscreen', x=950,y=1250,lim=360,disp=SETval('fullscreen'), code=function() SETTING.fullscreen=not SETTING.fullscreen applySettings() end},
WIDGET.newSwitch{name='clickFX', x=950,y=980,lim=360,disp=SETval('clickFX'), code=function() SETTING.clickFX=not SETTING.clickFX; applySettings() end},
WIDGET.newSwitch{name='power', x=950,y=1050,lim=360,disp=SETval('powerInfo'), code=function() SETTING.powerInfo=not SETTING.powerInfo; applySettings() end},
WIDGET.newSwitch{name='clean', x=950,y=1120,lim=360,disp=SETval('cleanCanvas'), code=function() SETTING.cleanCanvas=not SETTING.cleanCanvas; applySettings() end},
WIDGET.newSwitch{name='fullscreen', x=950,y=1190,lim=360,disp=SETval('fullscreen'), code=function() SETTING.fullscreen=not SETTING.fullscreen; applySettings() end,hideF=function() return MOBILE end},
WIDGET.newSwitch{name='portrait', x=950,y=1190,lim=360,disp=SETval('portrait'), code=function() SETTING.portrait=not SETTING.portrait; saveSettings(); MES.new('warn',text.settingWarn2,6.26) end,hideF=function() return not MOBILE end},
WIDGET.newSlider{name='msaa', x=950,y=1250,lim=360,w=200,axis={0,4,1},show=_msaaShow,disp=function() return SETTING.msaa==0 and 0 or math.log(SETTING.msaa,2) end,code=function(v) SETTING.msaa=v==0 and 0 or 2^v; saveSettings(); if TASK.lock('warnMessage',6.26) then MES.new('warn',text.settingWarn2,6.26) end end},
WIDGET.newKey{name='bg_on', x=680,y=1340,w=200,h=80,code=function() SETTING.bg='on'applySettings() end},
WIDGET.newKey{name='bg_off', x=900,y=1340,w=200,h=80,code=function() SETTING.bg='off'applySettings() end},
WIDGET.newKey{name='bg_on', x=680,y=1340,w=200,h=80,code=function() SETTING.bg='on'; applySettings() end},
WIDGET.newKey{name='bg_off', x=900,y=1340,w=200,h=80,code=function() SETTING.bg='off'; applySettings() end},
WIDGET.newKey{name='bg_custom', x=1120,y=1340,w=200,h=80,
code=function()
if love.filesystem.getInfo('conf/customBG') then

View File

@@ -1,4 +1,3 @@
local gc=love.graphics
local kb,tc=love.keyboard,love.touch
local rnd=math.random
local ins,rem=table.insert,table.remove
@@ -10,7 +9,7 @@ local patron=require"parts.patron"
local names
local counter
function scene.sceneInit()
function scene.enter()
time=0
v=22.6
BG.set()
@@ -50,7 +49,7 @@ function scene.update(dt)
counter=counter-1
if counter==0 then
local N=patron[rnd(#patron)]
local T=gc.newText(getFont(N.font),N.name)
local T=GC.newText(getFont(N.font),N.name)
local r=rnd()<.5
ins(names,{
text=T,
@@ -71,26 +70,26 @@ function scene.update(dt)
end
function scene.draw()
gc.replaceTransform(SCR.origin)
gc.setColor(1,1,1,.3)
GC.replaceTransform(SCR.origin)
GC.setColor(1,1,1,.3)
for i=1,#names do
local N=names[i]
gc.draw(N.text,N.x,N.y)
GC.draw(N.text,N.x,N.y)
end
gc.replaceTransform(SCR.xOy)
GC.replaceTransform(SCR.xOy)
local T=40*math.min(time,185)
gc.setColor(.97,.97,.97,185-math.min(time,185))
GC.setColor(.97,.97,.97,185-math.min(time,185))
local L=text.staff
setFont(40)
for i=1,#L do
GC.mStr(L[i],640,950+65*i-T)
end
gc.setColor(1,1,1)
GC.setColor(1,1,1)
mDraw(TEXTURE.title_color,640,900-T,nil,.6)
mDraw(TEXTURE.title,640,7770-T,nil,.6)
if time>190 then
gc.print("CLICK ME →",50,550,-.5)
GC.print("CLICK ME →",50,550,-.5)
end
end

Some files were not shown because too many files have changed in this diff Show More