Compare commits

...

92 Commits

Author SHA1 Message Date
MrZ626
4b221c2eb5 版本推进 2021-11-15 15:52:16 +08:00
MrZ626
ed45bebfa0 添加转盘模块和实验性每日转盘小程序 2021-11-15 15:47:05 +08:00
MrZ626
fa0bc3805f 整理代码,Zframework添加数学扩展模块 2021-11-15 15:46:57 +08:00
MrZ626
7710f0b70f 修正词典 2021-11-15 02:13:56 +08:00
C₂₉H₂₅N₃O₅
0277ddadb5 微调词典 (#456) 2021-11-14 12:05:00 -06:00
MrZ626
88e23e32f5 piano小程序支持shift/ctrl升降半音,左右alt变调,补充更多键位 2021-11-15 02:00:04 +08:00
MrZ626
8ab5b4a17a SFX模块新增音高获取音名的方法
整理代码
2021-11-15 02:00:04 +08:00
MrZ626
503dfd69ef 再调整SFX.playSample方法,支持用数字代表绝对音高,但是移除最后的音量参数 2021-11-15 01:40:53 +08:00
ParticleG
ae61ec26c0 - Remove upload to server 2021-11-15 01:39:37 +08:00
MrZ626
00bc24bd50 新增piano小程序(目前只支持键盘操作) 2021-11-14 22:19:45 +08:00
MrZ626
abd15d6307 table扩展模块新增一个函数 2021-11-14 22:09:44 +08:00
MrZ626
c01ac546d1 再修正播放采样的超音域问题 2021-11-14 21:48:02 +08:00
MrZ626
af77221ba2 修复换准备音效播放方式后ultra模式倒计时没声 2021-11-14 17:34:41 +08:00
MrZ626
204f0938d3 播放准备音效的函数可调音量 2021-11-14 17:32:10 +08:00
MrZ626
ad39d1408c 音乐室输入首字母自动跳转 2021-11-14 17:31:49 +08:00
MrZ626
ed011173f6 版本推进 2021-11-14 16:53:43 +08:00
MrZ626
491fcb5860 添加缓冲区和消失区两个词条
Co-authored-by: C₂₉H₂₅N₃O₅ <cgu52@wisc.edu>
2021-11-14 16:45:53 +08:00
MrZ626
c2d5537d8d 经典模式添加干旱计数器 close #452 2021-11-14 16:45:50 +08:00
MrZ626
7d5037ae87 竞速-效率显示剩余行数 2021-11-14 12:37:39 +08:00
MrZ626
07d7714317 修正无尽模式标题首字母大小写错误 close #454 2021-11-14 12:19:26 +08:00
MrZ626
2cab97f37d 修复0arr时自动移动时声音特别响 2021-11-14 11:49:41 +08:00
MrZ626
d184778c9a 修正string扩展模块时间转换函数可能出现1分60(截断小数点后两位防止被向上取整) 2021-11-14 11:24:11 +08:00
MrZ626
9fd3b3008d 新增物品数据,每日登录新增加一个zTicket 2021-11-13 22:33:25 +08:00
MrZ626
71aa35b214 修正统计里的日期每次启动都被刷新了导致单日统计时间不对 2021-11-13 17:32:54 +08:00
MrZ626
4443dc9d3e table扩展模块添加一个方法(未来会整理类似数据表更新函数) 2021-11-13 17:29:17 +08:00
MrZ626
839e357301 修改更新历史 2021-11-13 16:31:46 +08:00
MrZ626
ac56c5a415 修改竞速-效率左侧信息栏 2021-11-13 16:23:27 +08:00
MrZ626
36e3343341 TRS的J5和L5新增一个180度踢墙 2021-11-13 16:14:36 +08:00
MrZ626
510f7d7513 版本推进 2021-11-13 05:42:36 +08:00
MrZ626
3128eb38c0 再调整一些模式的bgm 2021-11-13 05:41:27 +08:00
MrZ626
14ef654612 混战模式信息绘制从玩家类移到规则包 2021-11-13 05:21:59 +08:00
MrZ626
bc5193f95e 落块事件改名落块钩子
添加死亡钩子(仅在窒息和超高触发)
堆积模式消行动作挂到死亡钩子上
2021-11-13 05:20:32 +08:00
MrZ626
8cbb4a38bc dropPiece事件改名hook_drop 2021-11-12 23:20:29 +08:00
MrZ626
fce08c83ef 堆积模式移出地图,删除h难度 2021-11-12 21:17:30 +08:00
MrZ626
018e99f9e6 修正改评级文本后tip没改 2021-11-12 16:39:30 +08:00
MrZ626
7fe390b34b 赞助名单添加三位 2021-11-12 16:28:37 +08:00
MrZ626
8c7202c569 版本推进 2021-11-12 03:35:54 +08:00
MrZ626
ab386bb53c 整理代码 2021-11-12 03:30:52 +08:00
MrZ626
87c791b8c7 tips新增几个好玩的游戏 2021-11-12 02:58:17 +08:00
MrZ626
00e3e2d19d 取消准备按钮不再只显示取消两个字 2021-11-12 02:54:14 +08:00
MrZ626
8d7d5c7b04 新BGM:peak(暂未使用) 2021-11-11 19:22:45 +08:00
MrZ626
849a18e159 移除模式的颜色 2021-11-11 19:14:37 +08:00
MrZ626
a4357d0843 移除节奏模式,准备之后添加音游模式 2021-11-11 18:59:04 +08:00
MrZ626
e2b4a78b59 修正超音源音域音符处理方法 2021-11-10 21:15:50 +08:00
MrZ626
01387b5488 版本推进(修改更新历史和build号) 2021-11-10 18:30:34 +08:00
MrZ626
168e2f80b8 SFX.play新增pitch参数,playSample方法允许超过音源范围(差太多了效果不好) 2021-11-10 17:52:48 +08:00
MrZ626
4f79ef8708 改进一处材质缺失后的报错 2021-11-10 16:40:00 +08:00
MrZ626
16497833df 修正COLOR.hsv函数s小于0时漏返回透明度 close #445 2021-11-10 14:35:22 +08:00
MrZ626
cd6a50d5a0 修复词典导出词条保留了替换敏感词的特殊字符 2021-11-10 14:35:22 +08:00
C₂₉H₂₅N₃O₅
4c5a61f2d8 修改License相关内容 (#444) 2021-11-09 21:38:45 -06:00
C29H25N3O5
1fd8d39970 更换中文字形 2021-11-09 18:57:35 -06:00
MrZ626
d133d64890 目标分数显示器分割线长度微调 2021-11-09 23:16:33 +08:00
MrZ626
b27aa8b60d freeRow模块改名line模块并暂时在“行”的管理上不再那么节约地使用内存 2021-11-09 20:14:08 +08:00
MrZ626
230d67492e 测试场景左上文本从最晚的开始显示 close #437 2021-11-09 16:04:08 +08:00
MrZ626
4f9d5b282c 修正一个开发者id写法问题 2021-11-09 16:04:08 +08:00
ParticleG
a2955e8722 - Fix wrong action name 2021-11-09 16:04:07 +08:00
MrZ626
df892671d5 修改更新历史和build号 2021-11-09 16:04:07 +08:00
MrZ626
7fa96eee1a 被攻击时场地会抖动 2021-11-09 16:04:07 +08:00
MrZ626
a1030906c7 场地晃动改名swing
添加场地抖动特效(跟场地晃动使用同一个设置值)
2021-11-09 16:04:07 +08:00
MrZ626
e6a9a4f4be 微调wine颜色,dark颜色更dark 2021-11-09 16:04:07 +08:00
MrZ626
efa1247596 颜色表的灰色饱和度更低并改为偏暖 2021-11-09 16:04:07 +08:00
MrZ626
069fcee721 整理代码
移除旧的切换攻击模式代码
旋转导致场地倾斜封装成玩家方法
调整瞬移到左右的场地晃动程度
调整场地平移晃动的恢复速度
软降触地时也会播放触地音效
2021-11-09 16:04:07 +08:00
C₂₉H₂₅N₃O₅
66621404f1 Changed the colours and the fonts in the game (#435)
* 微调字体

* 调整配色, 微调字体
2021-11-09 16:04:06 +08:00
ParticleG
e09609ea21 - Use Python 3.9 2021-11-09 16:04:06 +08:00
ParticleG
d02ae67bc0 - Add logs to upload-artifact 2021-11-09 16:04:06 +08:00
ParticleG
27327d57c4 - Test Windows with curl 2021-11-09 16:04:06 +08:00
MrZ626
cce93b6df9 整理代码 2021-11-09 16:04:06 +08:00
ParticleG
546104ba5b - Add Upload Action 2021-11-09 16:04:06 +08:00
MrZ626
ca5816ba14 进入newRoom菜单时不会试图修改背景和bgm 2021-11-09 16:04:06 +08:00
MrZ626
e5bd16476e 修改更新历史和build号 2021-11-09 16:04:05 +08:00
MrZ626
94431d4c2e 只在更新后触发自动转换以旧版本模式名存储的数据文件 2021-11-09 16:04:05 +08:00
MrZ626
f98d6892f1 颜色表改用hsv生成 2021-11-09 16:04:05 +08:00
MrZ626
1fe436cbe3 微调词典
微调两个小程序
整理代码
2021-11-09 16:04:05 +08:00
MrZ626
c5a37a9920 微调中文词典两个词条 2021-11-09 16:04:05 +08:00
MrZ626
eed7e96096 无尽马拉松的are每300行减小一次,line are每100行减小一次 2021-11-09 16:04:05 +08:00
MrZ626
a7f36a4162 无尽马拉松添加1700行的终点 2021-11-09 16:04:05 +08:00
MrZ626
8ba872d45d 微调排行榜字体大小 2021-11-09 16:04:04 +08:00
MrZ626
7a55451faa 无尽马拉松添加排行榜 2021-11-09 16:04:04 +08:00
MrZ626
372571bd80 修改更新历史
整理代码
2021-11-09 16:04:04 +08:00
MrZ626
77120c0b90 调整无尽马拉松的难度曲线 2021-11-09 16:04:04 +08:00
Not-A-Normal-Robot
01d1e44644 Decrease lock delay when level up above lvl20 2021-11-09 16:04:04 +08:00
Not-A-Normal-Robot
0ad8cddefe Added Infinite Marathon 2021-11-09 16:04:03 +08:00
MrZ626
ce67253502 修改更新历史 2021-11-09 16:04:03 +08:00
MrZ626
cb9f2c0617 修改mph模式的bgm 2021-11-09 16:04:03 +08:00
MrZ626
635d9407ed 新模式:竞速-效率 2021-11-09 16:04:03 +08:00
MrZ626
0f9f6565f1 修复超级消除结算时分数计算变量写错导致报错 2021-11-09 16:04:03 +08:00
MrZ626
a45b6ad57e move音效在方块因重力或旋转触地时也会播放,而不只是移动后
move音效名改为touch
2021-11-09 16:04:03 +08:00
MrZ626
a5de06dedb 修改更新历史 2021-11-09 16:04:03 +08:00
MrZ626
fbfbd1ed98 修正pr的一个符号错误 2021-11-09 16:04:02 +08:00
C₂₉H₂₅N₃O₅
8f06b3bd1a Changed the font and CN tips (#433)
* 补全英文词典翻译

* 大改字体

- 西文部分采用IBM Plex
- 全角标点样式采用西文样式
- 添加类Plex的IPA符号

* 微调中文tips

* 更新 Legals

* 修正一个语法错误
2021-11-09 16:04:02 +08:00
C₂₉H₂₅N₃O₅
7e0dbceefc 补全英文词典翻译 (#431) 2021-11-09 16:04:02 +08:00
MrZ626
7e3db1de17 新BGM:1989(用于几个经典模式)
重新安排一些模式的BGM
2021-11-09 16:04:02 +08:00
234 changed files with 1269 additions and 1188 deletions

View File

@@ -97,6 +97,34 @@ jobs:
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Android
path: Techmino_Snapshot.apk
build-android-mini:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- name: remove media
run: |
rm -rf media/music media/effect media/vocal
- uses: ./.github/actions/build-android
with:
type: Snapshot
apkCode: ${{ needs.get-info.outputs.apkCode }}
name: ${{ needs.get-info.outputs.name }}
file-path: Techmino_Snapshot_Mini.apk
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
ALIAS: ${{ secrets.ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Android_Mini
path: Techmino_Snapshot_Mini.apk
build-macOS:
runs-on: macos-10.15
@@ -157,4 +185,19 @@ jobs:
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_iOS
path: "Techmino.ipa"
path: Techmino.ipa
build-love:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-love
with:
file-path: Techmino.love
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Love
path: Techmino.love

View File

@@ -3,7 +3,7 @@ name: Techmino Release CI
on:
push:
tags:
- 'v*'
- "v*"
jobs:
get-info:
@@ -17,213 +17,173 @@ jobs:
updateNote: ${{ steps.actual-get-info.outputs.updateNote }}
commit: ${{ steps.actual-get-info.outputs.commit }}
steps:
- uses: actions/checkout@v2
- name: Install lua
run: |
sudo apt-get install lua5.3 -y
- name: Get Version
id: actual-get-info
run: |
UPDATE_NOTE=$(lua .github/workflows/getVersion.lua -updateNote)
UPDATE_NOTE="${UPDATE_NOTE//'%'/'%25'}"
UPDATE_NOTE="${UPDATE_NOTE//$'\n'/'%0A'}"
UPDATE_NOTE="${UPDATE_NOTE//$'\r'/'%0D'}"
echo "::set-output name=name::$(lua .github/workflows/getVersion.lua -name)"
echo "::set-output name=apkCode::$(lua .github/workflows/getVersion.lua -apkCode)"
echo "::set-output name=code::$(lua .github/workflows/getVersion.lua -code)"
echo "::set-output name=release::$(lua .github/workflows/getVersion.lua -release)"
echo "::set-output name=updateTitle::$(lua .github/workflows/getVersion.lua -updateTitle)"
echo "::set-output name=updateNote::$UPDATE_NOTE"
echo "::set-output name=commit::$(git rev-parse --short ${{ GITHUB.SHA }})"
- uses: actions/checkout@v2
- name: Install lua
run: |
sudo apt-get install lua5.3 -y
- name: Get Version
id: actual-get-info
run: |
UPDATE_NOTE=$(lua .github/workflows/getVersion.lua -updateNote)
UPDATE_NOTE="${UPDATE_NOTE//'%'/'%25'}"
UPDATE_NOTE="${UPDATE_NOTE//$'\n'/'%0A'}"
UPDATE_NOTE="${UPDATE_NOTE//$'\r'/'%0D'}"
echo "::set-output name=name::$(lua .github/workflows/getVersion.lua -name)"
echo "::set-output name=apkCode::$(lua .github/workflows/getVersion.lua -apkCode)"
echo "::set-output name=code::$(lua .github/workflows/getVersion.lua -code)"
echo "::set-output name=release::$(lua .github/workflows/getVersion.lua -release)"
echo "::set-output name=updateTitle::$(lua .github/workflows/getVersion.lua -updateTitle)"
echo "::set-output name=updateNote::$UPDATE_NOTE"
echo "::set-output name=commit::$(git rev-parse --short ${{ GITHUB.SHA }})"
build-windows-x64:
runs-on: windows-latest
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-windows
with:
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
love-dir: love-11.3-win64
arch: win64
version: ${{ needs.get-info.outputs.release }}
icon: .\.github\build\Windows\icon.ico
- name: Pack Techmino
run: 7z a -tzip .\Techmino.a${{ needs.get-info.outputs.release }}.Win64.zip .\love
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino.a${{ needs.get-info.outputs.release }}.Win64.zip
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-windows
with:
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
love-dir: love-11.3-win64
arch: win64
version: ${{ needs.get-info.outputs.release }}
icon: .\.github\build\Windows\icon.ico
- name: Pack Techmino
run: 7z a -tzip .\Techmino_a${{ needs.get-info.outputs.release }}_Win64.zip .\love
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino_a${{ needs.get-info.outputs.release }}_Win64.zip
build-windows-x86:
runs-on: windows-latest
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-windows
with:
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win32.zip
love-dir: love-11.3-win32
arch: win32
version: ${{ needs.get-info.outputs.release }}
icon: .\.github\build\Windows\icon.ico
- name: Pack Techmino
run: 7z a -tzip .\Techmino.a${{ needs.get-info.outputs.release }}.Win32.zip .\love
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino.a${{ needs.get-info.outputs.release }}.Win32.zip
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-windows
with:
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win32.zip
love-dir: love-11.3-win32
arch: win32
version: ${{ needs.get-info.outputs.release }}
icon: .\.github\build\Windows\icon.ico
- name: Pack Techmino
run: 7z a -tzip .\Techmino_a${{ needs.get-info.outputs.release }}_Win32.zip .\love
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino_a${{ needs.get-info.outputs.release }}_Win32.zip
build-linux:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-linux
with:
file-path: Techmino.a${{ needs.get-info.outputs.release }}.AppImage
icon: .github/build/Linux/icon.png
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino.a${{ needs.get-info.outputs.release }}.AppImage
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-linux
with:
file-path: Techmino_a${{ needs.get-info.outputs.release }}_Linux.AppImage
icon: .github/build/Linux/icon.png
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino_a${{ needs.get-info.outputs.release }}_Linux.AppImage
build-android:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-android
with:
type: Release
apkCode: ${{ needs.get-info.outputs.apkCode }}
name: ${{ needs.get-info.outputs.name }}
file-path: Techmino.a${{ needs.get-info.outputs.release }}.apk
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
ALIAS: ${{ secrets.ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino.a${{ needs.get-info.outputs.release }}.apk
build-android-mini:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- name: remove media
run: |
rm -rf media/music media/effect media/vocal
- uses: ./.github/actions/build-android
with:
type: Release
apkCode: ${{ needs.get-info.outputs.apkCode }}
name: ${{ needs.get-info.outputs.name }}
file-path: Techmino.a${{ needs.get-info.outputs.release }}.mini.apk
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
ALIAS: ${{ secrets.ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino.a${{ needs.get-info.outputs.release }}.mini.apk
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-android
with:
type: Release
apkCode: ${{ needs.get-info.outputs.apkCode }}
name: ${{ needs.get-info.outputs.name }}
file-path: Techmino_a${{ needs.get-info.outputs.release }}_Android.apk
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
ALIAS: ${{ secrets.ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino_a${{ needs.get-info.outputs.release }}_Android.apk
build-macOS:
runs-on: macos-10.15
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-macos
with:
name: ${{ needs.get-info.outputs.name }}
icon: .github/build/macOS/icon.icns
APPLE_API_ID: '${{ secrets.APPLE_API_ID }}'
APPLE_API_ISSUER: '${{ secrets.APPLE_API_ISSUER }}'
APPLE_API_KEY: '${{ secrets.APPLE_API_KEY }}'
APPLE_APP_IDENTIFIER: '${{ secrets.APPLE_APP_IDENTIFIER }}'
APPLE_KEYCHAIN_NAME: '${{ secrets.APPLE_KEYCHAIN_NAME }}'
APPLE_KEYCHAIN_PWD: '${{ secrets.APPLE_KEYCHAIN_PWD }}'
FASTLANE_MATCH_PWD: '${{ secrets.FASTLANE_MATCH_PWD }}'
FASTLANE_MATCH_TOKEN: '${{ secrets.FASTLANE_MATCH_TOKEN }}'
- name: Pack Techmino
run: |
mv Techmino.dmg Techmino.a${{ needs.get-info.outputs.release }}.macOS.dmg
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino.a${{ needs.get-info.outputs.release }}.macOS.dmg
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-macos
with:
name: ${{ needs.get-info.outputs.name }}
icon: .github/build/macOS/icon.icns
APPLE_API_ID: "${{ secrets.APPLE_API_ID }}"
APPLE_API_ISSUER: "${{ secrets.APPLE_API_ISSUER }}"
APPLE_API_KEY: "${{ secrets.APPLE_API_KEY }}"
APPLE_APP_IDENTIFIER: "${{ secrets.APPLE_APP_IDENTIFIER }}"
APPLE_KEYCHAIN_NAME: "${{ secrets.APPLE_KEYCHAIN_NAME }}"
APPLE_KEYCHAIN_PWD: "${{ secrets.APPLE_KEYCHAIN_PWD }}"
FASTLANE_MATCH_PWD: "${{ secrets.FASTLANE_MATCH_PWD }}"
FASTLANE_MATCH_TOKEN: "${{ secrets.FASTLANE_MATCH_TOKEN }}"
- name: Pack Techmino
run: |
mv Techmino.dmg Techmino_a${{ needs.get-info.outputs.release }}_MacOS.dmg
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino_a${{ needs.get-info.outputs.release }}_MacOS.dmg
build-iOS:
runs-on: macos-latest
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-ios
with:
name: ${{ needs.get-info.outputs.name }}
type: 'release'
APPLE_API_ID: '${{ secrets.APPLE_API_ID }}'
APPLE_API_ISSUER: '${{ secrets.APPLE_API_ISSUER }}'
APPLE_API_KEY: '${{ secrets.APPLE_API_KEY }}'
APPLE_APP_BUILD: '${{ needs.get-info.outputs.code }}.0.${{ github.run_number }}.${{ github.run_attempt }}'
APPLE_APP_CHANGELOG: '${{ needs.get-info.outputs.updateNote }}'
APPLE_APP_ID: '${{ secrets.APPLE_APP_ID }}'
APPLE_APP_IDENTIFIER: '${{ secrets.APPLE_APP_IDENTIFIER }}'
APPLE_APP_PROFILE: '${{ secrets.APPLE_APP_PROFILE }}'
APPLE_KEYCHAIN_NAME: '${{ secrets.APPLE_KEYCHAIN_NAME }}'
APPLE_KEYCHAIN_PWD: '${{ secrets.APPLE_KEYCHAIN_PWD }}'
FASTLANE_ACTION_ID: '${{ github.run_id }}'
FASTLANE_DISCORD_WEBHOOK: '${{ secrets.FASTLANE_DISCORD_WEBHOOK }}'
FASTLANE_MATCH_PWD: '${{ secrets.FASTLANE_MATCH_PWD }}'
FASTLANE_MATCH_TOKEN: '${{ secrets.FASTLANE_MATCH_TOKEN }}'
- name: Rename ipa
shell: bash
run: |
mv Techmino.ipa Techmino.a${{ needs.get-info.outputs.release }}.ipa
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino.a${{ needs.get-info.outputs.release }}.ipa
build-love:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-love
with:
file-path: Techmino.a${{ needs.get-info.outputs.release }}.love
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino.a${{ needs.get-info.outputs.release }}.love
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
- uses: ./.github/actions/build-ios
with:
name: ${{ needs.get-info.outputs.name }}
type: "release"
APPLE_API_ID: "${{ secrets.APPLE_API_ID }}"
APPLE_API_ISSUER: "${{ secrets.APPLE_API_ISSUER }}"
APPLE_API_KEY: "${{ secrets.APPLE_API_KEY }}"
APPLE_APP_BUILD: "${{ needs.get-info.outputs.code }}.0.${{ github.run_number }}.${{ github.run_attempt }}"
APPLE_APP_CHANGELOG: "${{ needs.get-info.outputs.updateNote }}"
APPLE_APP_ID: "${{ secrets.APPLE_APP_ID }}"
APPLE_APP_IDENTIFIER: "${{ secrets.APPLE_APP_IDENTIFIER }}"
APPLE_APP_PROFILE: "${{ secrets.APPLE_APP_PROFILE }}"
APPLE_KEYCHAIN_NAME: "${{ secrets.APPLE_KEYCHAIN_NAME }}"
APPLE_KEYCHAIN_PWD: "${{ secrets.APPLE_KEYCHAIN_PWD }}"
FASTLANE_ACTION_ID: "${{ github.run_id }}"
FASTLANE_DISCORD_WEBHOOK: "${{ secrets.FASTLANE_DISCORD_WEBHOOK }}"
FASTLANE_MATCH_PWD: "${{ secrets.FASTLANE_MATCH_PWD }}"
FASTLANE_MATCH_TOKEN: "${{ secrets.FASTLANE_MATCH_TOKEN }}"
- name: Rename ipa
shell: bash
run: |
mv Techmino.ipa Techmino_a${{ needs.get-info.outputs.release }}_iOS.ipa
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino_a${{ needs.get-info.outputs.release }}_iOS.ipa
Add-Release-note:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
body: ${{ needs.get-info.outputs.updateNote }}
- uses: actions/checkout@v2
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
body: ${{ needs.get-info.outputs.updateNote }}

View File

@@ -47,9 +47,9 @@ jobs:
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino.pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}.Windows
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Windows
path: love
build-linux:
runs-on: ubuntu-20.04
needs: get-info
@@ -65,7 +65,7 @@ jobs:
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino.pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}.Linux
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Linux
path: Techmino.AppImage
build-android:
@@ -90,7 +90,7 @@ jobs:
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino.pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}.Android
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Android
path: Techmino_Snapshot.apk
build-macOS:
@@ -117,7 +117,7 @@ jobs:
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino.pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}.macOS
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_MacOS
path: Techmino.dmg
build-iOS:
@@ -150,5 +150,5 @@ jobs:
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino.pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}.iOS
path: "Techmino.ipa"
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_iOS
path: Techmino.ipa

View File

@@ -1,63 +1,80 @@
local abs=math.abs
local function hsv(h,s,v,a)
if s<=0 then return v,v,v,a end
h=h*6
local c=v*s
local x=abs((h-1)%2-1)*c
if h<1 then return v,x+v-c,v-c,a
elseif h<2 then return x+v-c,v,v-c,a
elseif h<3 then return v-c,v,x+v-c,a
elseif h<4 then return v-c,x+v-c,v,a
elseif h<5 then return x+v-c,v-c,v,a
else return v,v-c,x+v-c,a
end
end
local COLOR={
red= {.92, .12, .12},
fire= {.92, 0.4, .12},
orange= {.92, 0.6, .12},
yellow= {.92, .92, .12},
lime= {0.7, .92, .12},
jade= {0.5, .92, .12},
green= {.12, .92, .12},
aqua= {.12, .92, 0.6},
cyan= {.12, .92, .92},
navy= {.12, 0.7, .92},
sea= {.12, 0.4, .92},
blue= {0.2, 0.2, .92},
violet= {0.4, .12, .92},
purple= {0.7, .12, .92},
magenta= {.92, .12, .92},
wine= {.92, .12, 0.5},
hsv=hsv,
lRed= {.95, 0.5, 0.5},
lFire= {.95, 0.7, 0.5},
lOrange= {.95, 0.8, 0.3},
lYellow= {.95, .95, 0.5},
lLime= {0.8, .95, 0.4},
lJade= {0.6, .95, 0.4},
lGreen= {0.5, .95, 0.5},
lAqua= {0.4, .95, 0.7},
lCyan= {0.5, .95, .95},
lNavy= {0.4, .85, .95},
lSea= {0.5, 0.7, .95},
lBlue= {0.7, 0.7, .95},
lViolet= {0.7, 0.4, .95},
lPurple= {0.8, 0.4, .95},
lMagenta={.95, 0.5, .95},
lWine= {.95, 0.4, 0.7},
red= {hsv(0.00, 0.89, 0.91)},
fire= {hsv(0.04, 0.93, 0.94)},
orange= {hsv(0.09, 0.99, 0.96)},
yellow= {hsv(0.16, 0.82, 0.90)},
lime= {hsv(0.18, 0.89, 0.88)},
jade= {hsv(0.23, 1.00, 0.82)},
green= {hsv(0.33, 1.00, 0.81)},
aqua= {hsv(0.48, 1.00, 0.74)},
cyan= {hsv(0.53, 1.00, 0.88)},
navy= {hsv(0.56, 1.00, 1.00)},
sea= {hsv(0.61, 1.00, 1.00)},
blue= {hsv(0.64, 1.00, 0.95)},
violet= {hsv(0.73, 1.00, 0.91)},
purple= {hsv(0.80, 1.00, 0.81)},
magenta= {hsv(0.86, 1.00, 0.78)},
wine= {hsv(0.94, 0.96, 0.91)},
dRed= {0.6, .08, .08},
dFire= {0.6, 0.3, .08},
dOrange= {0.6, 0.4, .08},
dYellow= {0.6, 0.6, .08},
dLime= {0.5, 0.6, .08},
dJade= {0.3, 0.6, .08},
dGreen= {.08, 0.6, .08},
dAqua= {.08, 0.6, 0.4},
dCyan= {.08, 0.6, 0.6},
dNavy= {.08, 0.4, 0.6},
dSea= {.08, 0.2, 0.6},
dBlue= {0.1, 0.1, 0.6},
dViolet= {0.2, .08, 0.6},
dPurple= {0.4, .08, 0.6},
dMagenta={0.6, .08, 0.6},
dWine= {0.6, .08, 0.3},
lRed= {hsv(0.00, 0.38, 0.93)},
lFire= {hsv(0.04, 0.45, 0.91)},
lOrange= {hsv(0.10, 0.53, 0.92)},
lYellow= {hsv(0.15, 0.61, 0.95)},
lLime= {hsv(0.19, 0.66, 0.92)},
lJade= {hsv(0.24, 0.56, 0.90)},
lGreen= {hsv(0.34, 0.49, 0.89)},
lAqua= {hsv(0.49, 0.59, 0.85)},
lCyan= {hsv(0.51, 0.77, 0.88)},
lNavy= {hsv(0.54, 0.80, 0.95)},
lSea= {hsv(0.56, 0.72, 0.97)},
lBlue= {hsv(0.64, 0.44, 0.96)},
lViolet= {hsv(0.73, 0.47, 0.95)},
lPurple= {hsv(0.80, 0.62, 0.89)},
lMagenta= {hsv(0.86, 0.61, 0.89)},
lWine= {hsv(0.93, 0.57, 0.92)},
black= {.05, .05, .05},
dGray= {0.3, 0.3, 0.3},
gray= {0.6, 0.6, 0.6},
lGray= {0.8, 0.8, 0.8},
white= {.97, .97, .97},
dRed= {hsv(0.00, 0.80, 0.48)},
dFire= {hsv(0.04, 0.80, 0.34)},
dOrange= {hsv(0.07, 0.80, 0.39)},
dYellow= {hsv(0.11, 0.80, 0.37)},
dLime= {hsv(0.17, 0.80, 0.26)},
dJade= {hsv(0.31, 0.80, 0.27)},
dGreen= {hsv(0.33, 0.80, 0.26)},
dAqua= {hsv(0.47, 0.80, 0.23)},
dCyan= {hsv(0.50, 0.80, 0.30)},
dNavy= {hsv(0.59, 0.80, 0.42)},
dSea= {hsv(0.64, 0.80, 0.40)},
dBlue= {hsv(0.67, 0.80, 0.34)},
dViolet= {hsv(0.71, 0.80, 0.35)},
dPurple= {hsv(0.76, 0.80, 0.32)},
dMagenta= {hsv(0.87, 0.80, 0.28)},
dWine= {hsv(0.92, 0.80, 0.28)},
black= {hsv(0.04, 0.04, 0.14)},
dGray= {hsv(0.02, 0.05, 0.44)},
gray= {hsv(0.02, 0.05, 0.65)},
lGray= {hsv(0.02, 0.06, 0.86)},
white= {hsv(0.01, 0.02, 0.99)},
}
for k,v in next,{
R='red', F='fire', O='orange', Y='yellow', L='lime', J='jade', G='green', A='aqua', C='cyan', N='navy', S='sea', B='blue', V='violet', P='purple', M='magenta', W='wine',
R='red', F='fire', O='orange', Y='yellow', L='lime', J='jade', G='green', A='aqua', C='cyan', N='navy', S='sea', B='blue', V='violet', P='purple', M='magenta', W='wine',
lR='lRed',lF='lFire',lO='lOrange',lY='lYellow',lL='lLime',lJ='lJade',lG='lGreen',lA='lAqua',lC='lCyan',lN='lNavy',lS='lSea',lB='lBlue',lV='lViolet',lP='lPurple',lM='lMagenta',lW='lWine',
dR='dRed',dF='dFire',dO='dOrange',dY='dYellow',dL='dLime',dJ='dJade',dG='dGreen',dA='dAqua',dC='dCyan',dN='dNavy',dS='dSea',dB='dBlue',dV='dViolet',dP='dPurple',dM='dMagenta',dW='dWine',
D='black',dH='dGray',H='gray',lH='lGray',Z='white',

View File

@@ -4,6 +4,7 @@ LOADED=false
ERRDATA={}
--Pure lua modules (basic)
MATH= require'Zframework.mathExtend'
COLOR= require'Zframework.color'
TABLE= require'Zframework.tableExtend'
STRING= require'Zframework.stringExtend'
@@ -622,9 +623,8 @@ function love.run()
--Left-down infos
gc_setColor(devColor[devMode])
gc_print("MEM "..gcinfo(),safeX+5,-40)
gc_print("Lines "..FREEROW.getCount(),safeX+5,-60)
gc_print("Tasks "..TASK.getCount(),safeX+5,-80)
gc_print("Voices "..VOC.getQueueCount(),safeX+5,-100)
gc_print("Tasks "..TASK.getCount(),safeX+5,-60)
gc_print("Voices "..VOC.getQueueCount(),safeX+5,-80)
--Update & draw frame time
table.insert(frameTimeList,1,dt)table.remove(frameTimeList,126)

19
Zframework/mathExtend.lua Normal file
View File

@@ -0,0 +1,19 @@
local MATH={}for k,v in next,math do MATH[k]=v end
local rnd=math.random
MATH.tau=2*math.pi
function MATH.sign(a)
return a>0 and 1 or a<0 and -1 or 0
end
function MATH.coin(a,b)
if rnd()<.5 then
return a
else
return b
end
end
return MATH

View File

@@ -1,4 +1,5 @@
local type,rem=type,table.remove
local int,rnd=math.floor,math.random
local sfxList={}
local packSetting={}
@@ -6,7 +7,7 @@ local Sources={}
local volume=1
local stereo=1
local noteName={
local noteVal={
C=1,c=1,
D=3,d=3,
E=5,e=5,
@@ -15,10 +16,11 @@ local noteName={
A=10,a=10,
B=12,b=12,
}
local noteName={'C','C#','D','D#','E','F','F#','G','G#','A','A#','B'}
local function _getTuneHeight(tune)
local octave=tonumber(tune:sub(-1,-1))
if octave then
local tuneHeight=noteName[tune:sub(1,1)]
local tuneHeight=noteVal[tune:sub(1,1)]
if tuneHeight then
tuneHeight=tuneHeight+(octave-1)*12
local s=tune:sub(2,2)
@@ -55,14 +57,14 @@ function SFX.loadSample(pack)
assert(type(pack)=='table',"Usage: SFX.loadsample([table])")
assert(pack.name,"No field: name")
assert(pack.path,"No field: path")
packSetting[pack.name]={
base=(_getTuneHeight(pack.base)or 37)-1,
}
local num=1
while love.filesystem.getInfo(pack.path..'/'..num..'.ogg')do
Sources[pack.name..num]={love.audio.newSource(pack.path..'/'..num..'.ogg','static')}
num=num+1
end
local base=(_getTuneHeight(pack.base)or 37)-1
local top=base+num-1
packSetting[pack.name]={base=base,top=top}
LOG((num-1).." "..pack.name.." samples loaded")
end
@@ -78,23 +80,39 @@ function SFX.setStereo(v)
stereo=v
end
function SFX.playSample(pack,...)--vol-2, sampSet1, vol-3, sampSet2, vol-1
function SFX.getNoteName(note)
if note<1 then
return'---'
else
note=note-1
local octave=int(note/12)+1
return noteName[note%12+1]..octave
end
end
function SFX.playSample(pack,...)--vol-1, sampSet1, vol-2, sampSet2
if ... then
local arg={...}
local vol
if type(arg[#arg])=='number'then vol=rem(arg)end
for i=1,#arg do
if type(arg[i])=='number'then
vol=arg[i]
local a=arg[i]
if type(a)=='number'and a<=1 then
vol=a
else
local tune=arg[i]
tune=_getTuneHeight(tune)-packSetting[pack].base
SFX.play(pack..tune,vol)
local base=packSetting[pack].base
local top=packSetting[pack].top
local tune=type(a)=='string'and _getTuneHeight(a)or a--Absolute tune in number
local playTune=tune+rnd(-2,2)
if playTune<=base then--Too low notes
playTune=base+1
elseif playTune>top then--Too high notes
playTune=top
end
SFX.play(pack..playTune-base,vol,nil,tune-playTune)
end
end
end
end
function SFX.play(name,vol,pos)
function SFX.play(name,vol,pos,pitch)
if volume==0 or vol==0 then return end
local S=Sources[name]--Source list
if not S then return end
@@ -117,6 +135,7 @@ function SFX.play(name,vol,pos)
end
end
S:setVolume(((vol or 1)*volume)^1.626)
S:setPitch(pitch and 1.0594630943592953^pitch or 1)
S:play()
end
function SFX.fplay(name,vol,pos)

View File

@@ -63,9 +63,9 @@ function STRING.time(t)
if t<60 then
return format("%.3f\"",t)
elseif t<3600 then
return format("%d'%05.2f\"",int(t/60),t%60)
return format("%d'%05.2f\"",int(t/60),int(t%60*100)/100)
else
return format("%d:%.2d'%05.2f\"",int(t/3600),int(t/60%60),t%60)
return format("%d:%.2d'%05.2f\"",int(t/3600),int(t/60%60),int(t%60*100)/100)
end
end

View File

@@ -46,6 +46,18 @@ function TABLE.cover(new,old)
end
end
--For all things in new, push to old
function TABLE.coverR(new,old)
for k,v in next,new do
if type(v)=='table'and type(old[k])=='table'then
TABLE.coverR(v,old[k])
else
old[k]=v
end
end
end
--For all things in new if same type in old, push to old
function TABLE.update(new,old)
for k,v in next,new do
@@ -90,6 +102,11 @@ function TABLE.find(t,val)
for i=1,#t do if t[i]==val then return i end end
end
--Retuen next value of [1~#]
function TABLE.next(t,val)
for i=1,#t do if t[i]==val then return t[i%#t+1]end end
end
--Find value in whole table
function TABLE.search(t,val)
for k,v in next,t do if v==val then return k end end

View File

@@ -435,7 +435,7 @@ end
function switch:press()
self.code()
if self.sound then
SFX.play('move')
SFX.play('touch')
end
end
function WIDGET.newSwitch(D)--name,x,y[,lim][,fText][,color][,font=30][,sound=true][,disp],code[,hideF][,hide]
@@ -1431,7 +1431,7 @@ function WIDGET.textinput(texts)
if W and W.type=='inputBox'then
if(not W.regex or texts:match(W.regex))and(not W.limit or #(WIDGET.sel.value..texts)<=W.limit)then
WIDGET.sel.value=WIDGET.sel.value..texts
SFX.play('move')
SFX.play('touch')
else
SFX.play('finesseError',.3)
end

View File

@@ -2,11 +2,7 @@
TECHMINO and "26F Studio" are trademarks of 26F Studio.
The TECHMINO game and source code are under a GNU Lesser General Public License Version 3.
TECHMINO is not a fan game of Tetris. TECHMINO and 26F Studio are not affiliated with Tetris Holding, LLC or The Tetris Company, Inc. in any way.
"Tetris" is the registered trademark of The Tetris Holding, LLC, licensed to The Tetris Company, Inc.
"Tetris" is the registered trademark of The Tetris Holding, LLC, licensed to The Tetris Company, Inc. TECHMINO is not a fan game of Tetris. TECHMINO and 26F Studio are not affiliated with Tetris Holding, LLC or The Tetris Company, Inc. in any way.
Powered by LÖVE, © 2006-2021 LÖVE Development Team.
@@ -21,7 +17,10 @@ The Apple logo, "Apple Inc.," iOS, iPadOS, macOS, iPhone, and Mac are registered
"Windows", the Windows logo, "Xbox", Xbox logo, and "Microsoft" are registered trademarks of Microsoft Corporation in the United States of America and other countries or regions.
Alibaba Sans is copyrighted by Alibaba Group Holding Limited. Alibaba is a trademark of Alibaba Group Holding Limited in the Peoples Republic of China and other countries or regions.
Source Han Sans is copyrighted by Adobe Inc. Source Han Sans and Abode are registered trademarks of Adobe Inc. in United States and other countries or regions. Source Han Sans is licensed under the SIL Open Font License.
IBM Plex is copyrighted by the International Business Machines Corporation. IBM and IBM Plex are trademarks of IBM Corp, registered in many jurisdictions worldwide. IBM Plex is licensed under the SIL Open Font License.
JetBrains Mono is copyrighted by the JetBrains Mono Project authors. JetBrains Mono is a trademark of JetBrains s.r.o. JetBrains Mono is licensed under the SIL Open Font License, Version 1.1.
@@ -47,5 +46,5 @@ Linux is a registered trademark of Linus Torvalds.
Touhou Project © Team Shanghai Alice 2002-2021.
All other trademarks are the properties of their respective owners.

View File

@@ -90,7 +90,7 @@ for _,v in next,fs.getDirectoryItems('parts/shaders')do
end
end
FREEROW= require'parts.freeRow'
LINE= require'parts.line'
DATA= require'parts.data'
TEXTURE= require'parts.texture'
@@ -104,6 +104,12 @@ PLY= require'parts.player'
NETPLY= require'parts.netPlayer'
MODES= require'parts.modes'
setmetatable(TEXTURE,{__index=function(self,k)
MES.new('warn',"No texture called: "..k)
self[k]=love.graphics.newCanvas(1,1)
return self[k]
end})
table.insert(_LOADTIMELIST_,("Load Parts: %.3fs"):format(TIME()-_LOADTIME_))
--Init Zframework
@@ -143,8 +149,8 @@ Z.setOnFnKeys({
function()
if GAME.playing and not GAME.net then
for _=1,8 do
local P=PLY_ALIVE[math.random(#PLY_ALIVE)]
if P and P~=PLAYERS[1]then
if #PLY_ALIVE>1 then
local P=PLY_ALIVE[math.random(2,#PLY_ALIVE)]
P.lastRecv=PLAYERS[1]
P:lose()
end
@@ -153,7 +159,7 @@ Z.setOnFnKeys({
end,
function()print(WIDGET.getSelected()or"no widget selected")end,
function()for k,v in next,_G do print(k,v)end end,
function()if love["_openConsole"]then love["_openConsole"]()end end,
function()if love['_openConsole']then love['_openConsole']()end end,
})
do--Z.setOnFocus
local function task_autoSoundOff()
@@ -199,7 +205,7 @@ Z.setOnQuit(destroyPlayers)
TABLE.cover (FILE.load('conf/user')or{},USER)
TABLE.cover (FILE.load('conf/unlock')or{},RANKS)
TABLE.update(FILE.load('conf/settings')or{},SETTING)
TABLE.update(FILE.load('conf/data')or{},STAT)
TABLE.coverR(FILE.load('conf/data')or{},STAT)
TABLE.cover (FILE.load('conf/key')or{},KEY_MAP)
TABLE.cover (FILE.load('conf/virtualkey')or{},VK_ORG)
@@ -222,7 +228,7 @@ if missionData then
DATA.pasteMission(missionData)
end
local customData=FILE.load('conf/customEnv')
if customData and customData.version==VERSION.code then
if customData and customData['version']==VERSION.code then
TABLE.complete(customData,CUSTOMENV)
end
TABLE.complete(require"parts.customEnv0",CUSTOMENV)
@@ -444,7 +450,7 @@ do
fs.remove('record/round_l.rec')
fs.remove('record/round_u.rec')
end
if STAT.version<1604 then
if RANKS.stack_e then
RANKS.stack_e=nil
RANKS.stack_h=nil
RANKS.stack_u=nil
@@ -460,17 +466,37 @@ do
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 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
love.event.quit('restart')
end
SETTING.appLock=nil
SETTING.dataSaving=nil
SETTING.swap=nil
SETTING.appLock,SETTING.dataSaving,SETTING.swap=nil
if not SETTING.VKSkin then SETTING.VKSkin=1 end
for _,v in next,SETTING.skin do if v<1 or v>17 then v=17 end end
if SETTING.RS=='ZRS'or SETTING.RS=='BRS'or SETTING.RS=='ASCplus'or SETTING.RS=='C2sym'then SETTING.RS='TRS'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
@@ -506,26 +532,11 @@ do
needSave=true
end
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
if needSave then
saveStats()
saveProgress()
saveSettings()
love.event.quit('restart')
end
end

BIN
media/music/1989.ogg Normal file

Binary file not shown.

BIN
media/music/peak.ogg Normal file

Binary file not shown.

View File

@@ -353,8 +353,8 @@ do
[21]={'+0+0','-1+0','-1+1','+0+1','-1+2','+0+2','-1-1','+1+0','+0-2','-1-2'},
[32]={'+0+0','-1+0','-1+1','-1-1','+1+0','+0+2','-1+2','+0-2'},
[23]={'+0+0','+1+0','+1-1','+1+1','-1+0','+0-2','+1-2','+0+2'},
[02]={'+0+0','+0-1','+1-1','-1+0','+2-1'},
[20]={'+0+0','+0+1','-1+1','+1+0','-2+1'},
[02]={'+0+0','+0-1','-1-1','+1-1','-1+0','+2-1'},
[20]={'+0+0','+0+1','+1+1','-1+1','+1+0','-2+1'},
[13]={'+0+0','-1+0','-1-1','+0+1','-1-2'},
[31]={'+0+0','+1+0','+1+1','+0-1','+1+2'},
},--J5
@@ -686,13 +686,7 @@ do
sfx='prerotate'
elseif P:ifoverlap(icb,x,y+1)and P:ifoverlap(icb,x-1,y)and P:ifoverlap(icb,x+1,y)then
sfx='rotatekick'
if P.gameEnv.shakeFX then
if d==1 or d==3 then
P.fieldOff.va=P.fieldOff.va+(2-d)*6e-3
else
P.fieldOff.va=P.fieldOff.va+P:getCenterX()*3e-3
end
end
P:_rotateField(d)
else
sfx='rotate'
end

View File

@@ -12,10 +12,9 @@ local ins,rem=table.insert,table.remove
local back={}
local t
local fan,petal
local petal
function back.init()
t=0
fan=SVG_TITLE_FAN
petal={}
end
function back.update()
@@ -62,7 +61,7 @@ function back.draw()
gc_setLineWidth(6)
gc_setColor(.8,.9,1,.3)
for i=1,8 do gc_polygon('line',fan[i])end
for i=1,8 do gc_polygon('line',SVG_TITLE_FAN[i])end
gc_setLineWidth(2)
gc_setColor(1,.5,.7,.3)

View File

@@ -44,8 +44,7 @@ local function _ifoverlapAI(f,bk,x,y)
end
end end
end
local discardRow=FREEROW.discard
local getRow=FREEROW.get
local getRow,discardRow=LINE.new,LINE.discard
local function _resetField(f0,f,start)
for _=#f,start,-1 do
discardRow(f[_])

View File

@@ -33,6 +33,7 @@ return{
P:_showText(text.maxspeed,0,-140,100,'appear',.6)
end
end
P:shakeField(9)
D.wave=D.wave+1
end
end

View File

@@ -42,6 +42,7 @@ return{
P:_showText(text.maxspeed,0,-140,100,'appear',.6)
end
end
P:shakeField(10)
D.wave=D.wave+1
end
end

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,0,generateLine(P.holeRND:random(10)))
end

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,120,generateLine(P.holeRND:random(10)))
end

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,30,generateLine(P.holeRND:random(10)))
end

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,60,generateLine(P.holeRND:random(10)))
end

View File

@@ -11,8 +11,8 @@ return{
task=function(P)
local F=P.field
for i=1,24 do
F[i]=FREEROW.get(20)
P.visTime[i]=FREEROW.get(20)
F[i]=LINE.new(20)
P.visTime[i]=LINE.new(20)
for x=4,7 do F[i][x]=0 end
end
if P.holeRND:random()<.6 then

View File

@@ -1,10 +1,10 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.row>0 then
for _=1,#P.clearedRow do
local h=#P.field
P.field[h+1]=FREEROW.get(20)
P.visTime[h+1]=FREEROW.get(20)
P.field[h+1]=LINE.new(20)
P.visTime[h+1]=LINE.new(20)
for i=4,7 do P.field[h+1][i]=0 end
end
if P.combo>P.modeData.maxCombo then

View File

@@ -1,12 +1,12 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.row==0 then
P:lose()
else
for _=1,P.lastPiece.row do
local h=#P.field
P.field[h+1]=FREEROW.get(20)
P.visTime[h+1]=FREEROW.get(20)
P.field[h+1]=LINE.new(20)
P.visTime[h+1]=LINE.new(20)
for i=4,7 do P.field[h+1][i]=0 end
end
if P.combo>P.modeData.maxCombo then

View File

@@ -6,7 +6,7 @@ return{
mText(TEXTOBJ.atk,63,243)
mText(TEXTOBJ.eff,63,363)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.atk>=100 then
P:win('finish')
end

View File

@@ -1,13 +1,11 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.garbageBeneath==0 then
local D=P.modeData
D.finished=D.finished+1
if FIELD[D.finished+1]then
P.waiting=26
for i=#P.field,1,-1 do
FREEROW.discard(P.field[i])
FREEROW.discard(P.visTime[i])
P.field[i],P.visTime[i]=nil
end
setField(P,D.finished+1)

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=10 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=100 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=1000 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=20 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=200 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=40 then
P:win('finish')
end

View File

@@ -6,7 +6,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=400 then
P:win('finish')
end

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if #PLY_ALIVE>1 then
P.control=false
local id1=P.sid

View File

@@ -1,5 +1,5 @@
return{
dropPiece=function(P)
hook_drop=function(P)
if P.stat.piece%7==0 and #PLY_ALIVE>1 then
P.control=false
local id1=P.sid

View File

@@ -1,3 +1,4 @@
local gc_setColor=love.graphics.setColor
return{
das=16,arr=6,
sddas=6,sdarr=6,
@@ -18,12 +19,24 @@ return{
mStr(r<10 and 9 or r<30 and r or("%02x"):format(r*10-300),63,210)
mText(TEXTOBJ.speedLV,63,290)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
if P.modeData.drought>7 then
if P.modeData.drought<=14 then
gc_setColor(1,1,1,P.modeData.drought/7-1)
else
local gb=P.modeData.drought<=21 and 2-P.modeData.drought/14 or .5
gc_setColor(1,gb,gb)
end
setFont(50)
mStr(P.modeData.drought,63,130)
mDraw(MODES.drought_l.icon,63,200,nil,.5)
end
end,
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
if P.stat.row>=D.target then
if D.target==110 then
P.gameEnv.drop,P.gameEnv.lock=5,5

View File

@@ -1,3 +1,4 @@
local gc_setColor=love.graphics.setColor
return{
das=16,arr=6,
sddas=3,sdarr=3,
@@ -15,14 +16,25 @@ return{
mesDisp=function(P)
setFont(75)
local r=P.modeData.target/10
mStr(r<11 and 18 or r<22 and r+8 or("%02x"):format(r*10-220),63,210)
mStr(r<10 and 9 or r<30 and r or("%02x"):format(r*10-300),63,210)
mText(TEXTOBJ.speedLV,63,290)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
if P.modeData.drought>7 then
if P.modeData.drought<=14 then
gc_setColor(1,1,1,P.modeData.drought/7-1)
else
local gb=P.modeData.drought<=21 and 2-P.modeData.drought/14 or .5
gc_setColor(1,gb,gb)
end
setFont(50)
mStr(P.modeData.drought,63,130)
mDraw(MODES.drought_l.icon,63,200,nil,.5)
end
end,
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
if P.stat.row>=D.target then
if D.target==110 then

View File

@@ -1,3 +1,4 @@
local gc_setColor=love.graphics.setColor
return{
das=16,arr=6,
sddas=1,sdarr=1,
@@ -15,14 +16,25 @@ return{
mesDisp=function(P)
setFont(75)
local r=P.modeData.target/10
mStr(r==1 and 29 or("%02x"):format(r*10-20),63,210)
mStr(r<10 and 9 or r<30 and r or("%02x"):format(r*10-300),63,210)
mText(TEXTOBJ.speedLV,63,290)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
if P.modeData.drought>7 then
if P.modeData.drought<=14 then
gc_setColor(1,1,1,P.modeData.drought/7-1)
else
local gb=P.modeData.drought<=21 and 2-P.modeData.drought/14 or .5
gc_setColor(1,gb,gb)
end
setFont(50)
mStr(P.modeData.drought,63,130)
mDraw(MODES.drought_l.icon,63,200,nil,.5)
end
end,
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
if P.stat.row>=D.target then
if D.target==100 then

View File

@@ -40,6 +40,7 @@ return{
P:_showText(text.maxspeed,0,-140,100,'appear',.6)
P.dropDelay,P.gameEnv.drop=2,2
end
P:shakeField(3)
end
end
end

View File

@@ -40,6 +40,7 @@ return{
P.dropDelay,P.gameEnv.drop=5,5
P:_showText(text.maxspeed,0,-140,100,'appear',.6)
end
P:shakeField(3)
end
end
end

View File

@@ -3,7 +3,7 @@ return{
setFont(55)
mStr(100-P.stat.dig,63,265)
end,
dropPiece=function(P)
hook_drop=function(P)
for _=1,math.min(10,100-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end

View File

@@ -3,7 +3,7 @@ return{
setFont(55)
mStr(10-P.stat.dig,63,265)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.dig==10 then
P:win('finish')
end

View File

@@ -3,7 +3,7 @@ return{
setFont(55)
mStr(400-P.stat.dig,63,265)
end,
dropPiece=function(P)
hook_drop=function(P)
for _=1,math.min(10,400-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end

View File

@@ -3,7 +3,7 @@ return{
setFont(55)
mStr(40-P.stat.dig,63,265)
end,
dropPiece=function(P)
hook_drop=function(P)
for _=1,math.min(10,40-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end

View File

@@ -11,7 +11,7 @@ return{
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
local flag
local l=P.lastPiece
if P.combo>1 then flag=true;P:showText("2x",0,-220,40,'flicker',.3)end

View File

@@ -10,7 +10,7 @@ return
task=function(P)
P.modeData.target=50
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==50 then
P.gameEnv.drop=.25

View File

@@ -0,0 +1,56 @@
local dropSpeed={
50,42,35,30,25,20,16,13,11,10,
9,8,7,6,5,5,4,4,3,3,
3,2,2,2,2,1,1,1,1,1,
.5,.5,.5,.5,.25,.25,.25,.125,.125,--Total 39 numbers, switch to 20G when reach 400 lines
}
local lockDelay={
57,54,51,48,46,44,42,40,38,36,
34,32,30,28,26,25,24,23,22,21,
20,20,19,19,18,18,17,17,16,16,
15,15,14,14,13,13,13,12,12,12,
11,11,11,11,11,10,10,10,10,10,
9,9,9,9,9,9,8,8,8,8,
8,8,8,8,7,7,7,7,7,7,
7,7,6,6,6,6,6,6,6,6,
5,5,5,5,5,5,5,5,5,5,
4,4,4,4,4,4,4,4,4,4,
3,3,3,3,3,3,3,3,3,3,
2,2,2,2,2,2,2,2,2,2,
1,1,1,1,1,1,1,1,1,--Finish at 1700
}
return
{
drop=60,lock=60,
wait=8,fall=20,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
end,
task=function(P)
P.modeData.target=10
end,
hook_drop=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target%300==0 then
P.gameEnv.wait=P.gameEnv.wait-1
end
if P.modeData.target%100==0 then
P.gameEnv.fall=P.gameEnv.fall-1
end
if P.modeData.target<400 then
P.gameEnv.drop=dropSpeed[P.modeData.target/10]
elseif P.modeData.target==400 then
P:set20G(true)
elseif P.modeData.target<1700 then
P.gameEnv.lock=lockDelay[(P.modeData.target-400)/10]
else
P.stat.row=1700
P:win('finish')
return
end
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
}

View File

@@ -12,7 +12,7 @@ return
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')

View File

@@ -30,7 +30,7 @@ return{
mStr(P.stat.row,63,230)
mStr(P.stat.clears[4],63,340)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.modeData.rankPoint<140-passPoint then--If Less then X
local R=#P.clearedRow
if R>0 then

View File

@@ -8,7 +8,7 @@ return{
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
local c=#P.clearedRow

View File

@@ -12,7 +12,7 @@ return{
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
local c=#P.clearedRow

View File

@@ -14,7 +14,7 @@ return
task=function(P)
P.modeData.target=10
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')

View File

@@ -12,7 +12,7 @@ return{
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
dropPiece=function(P)
hook_drop=function(P)
local D=P.modeData
local c=#P.clearedRow

View File

@@ -13,7 +13,7 @@ return
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
dropPiece=function(P)
hook_drop=function(P)
local p=P.modeData.pt+P.lastPiece.row
if p>=P.modeData.target then
local ENV=P.gameEnv
@@ -55,8 +55,8 @@ return
P.field[i][P.holeRND:random(10)]=0
end
else
P.field[i]=FREEROW.get(0)
P.visTime[i]=FREEROW.get(30)
P.field[i]=LINE.new(0)
P.visTime[i]=LINE.new(30)
for j=1,10 do
if P.holeRND:random()>.9 then
P.field[i][j]=P.holeRND:random(16)
@@ -89,6 +89,7 @@ return
ENV.bone=true
P.modeData.target=62
SFX.play('reach')
else
p=41
end
@@ -112,6 +113,7 @@ return
ENV.fall=4
P.modeData.target=162
SFX.play('reach')
elseif T==162 then--Stage 7: speed up+++
P:stageComplete(7)
P.life=P.life+1
@@ -146,6 +148,7 @@ return
P.modeData.target=260
p=260
SFX.play('blip_2')
SFX.play('reach')
else
p=260
end

View File

@@ -5,7 +5,7 @@ return{
mStr(P.stat.pc,63,340)
mText(TEXTOBJ.pc,63,410)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.pc and P.stat.row%4==0 then
P.gameEnv.heightLimit=4
if P.stat.pc%5==0 then

View File

@@ -46,6 +46,6 @@ return{
mStr(P.stat.pc,63,340)
mText(TEXTOBJ.pc,63,410)
end,
dropPiece=check,
hook_drop=check,
task=check,
}

View File

@@ -37,6 +37,6 @@ return{
mStr(P.stat.pc,63,340)
mText(TEXTOBJ.pc,63,410)
end,
dropPiece=check,
hook_drop=check,
task=check,
}

View File

@@ -1,53 +0,0 @@
local gc=love.graphics
local dropSpeed={[0]=40,33,27,20,16,12,11,10,9,8,7,6,5,4,3,3,2,2,1,1}
return{
drop=40,
lock=1e99,
wait=20,
fall=90,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
setFont(30)
mStr(P.modeData.bpm,63,178)
gc.setLineWidth(4)
gc.circle('line',63,200,30)
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',63,200,30+45*beat)
end,
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')
else
P.modeData.bpm=40+2*P.modeData.target/10
P.modeData.beatFrame=math.floor(3600/P.modeData.bpm)
P.gameEnv.fall=P.modeData.beatFrame
P.gameEnv.wait=math.max(P.gameEnv.wait-2,0)
P.gameEnv.drop=dropSpeed[P.modeData.target/10]
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
end,
task=function(P)
P.modeData.target=10
P.modeData.bpm=40
P.modeData.beatFrame=90
P.modeData.counter=90
while true do
YIELD()
P.modeData.counter=P.modeData.counter-1
if P.modeData.counter==0 then
P.modeData.counter=P.modeData.beatFrame
SFX.play('click',.3)
P:act_hardDrop()
end
end
end,
}

View File

@@ -1,53 +0,0 @@
local gc=love.graphics
local dropSpeed={[0]=30,26,23,20,17,14,12,10,8,6,5,4,3,2,1,1,.5,.5,.25,.25}
return{
drop=30,
lock=1e99,
wait=10,
fall=60,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
setFont(30)
mStr(P.modeData.bpm,63,178)
gc.setLineWidth(4)
gc.circle('line',63,200,30)
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',63,200,30+45*beat)
end,
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')
else
P.modeData.bpm=60+3*P.modeData.target/10
P.modeData.beatFrame=math.floor(3600/P.modeData.bpm)
P.gameEnv.fall=P.modeData.beatFrame
P.gameEnv.wait=math.max(P.gameEnv.wait-1,0)
P.gameEnv.drop=dropSpeed[P.modeData.target/10]
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
end,
task=function(P)
P.modeData.target=10
P.modeData.bpm=60
P.modeData.beatFrame=60
P.modeData.counter=60
while true do
YIELD()
P.modeData.counter=P.modeData.counter-1
if P.modeData.counter==0 then
P.modeData.counter=P.modeData.beatFrame
SFX.play('click',.3)
P:act_hardDrop()
end
end
end,
}

View File

@@ -1,58 +0,0 @@
local gc=love.graphics
return{
drop=.5,
lock=1e99,
wait=5,
fall=30,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
setFont(30)
mStr(P.modeData.bpm,63,178)
gc.setLineWidth(4)
gc.circle('line',63,200,30)
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',63,200,30+45*beat)
end,
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')
else
P.modeData.bpm=120+2*P.modeData.target/10
P.modeData.beatFrame=math.floor(3600/P.modeData.bpm)
P.gameEnv.fall=P.modeData.beatFrame
P.gameEnv.wait=math.max(P.gameEnv.wait-1,0)
if P.modeData.target==50 then
P.gameEnv.das=5
P.gameEnv.drop=.25
elseif P.modeData.target==100 then
P.gameEnv.das=4
P:set20G(true)
end
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
end,
task=function(P)
P.modeData.target=10
P.modeData.bpm=120
P.modeData.beatFrame=30
P.modeData.counter=30
while true do
YIELD()
P.modeData.counter=P.modeData.counter-1
if P.modeData.counter==0 then
P.modeData.counter=P.modeData.beatFrame
SFX.play('click',.3)
P:act_hardDrop()
end
end
end,
}

View File

@@ -1,5 +1,24 @@
local gc=love.graphics
local gc_draw,gc_print,gc_setColor=gc.draw,gc.print,gc.setColor
local setFont=setFont
local PLAYERS,PLY_ALIVE=PLAYERS,PLY_ALIVE
return{
mesDisp=function(P)
PLY.draw.drawRoyaleInfo(P)
setFont(35)
mStr(#PLY_ALIVE.."/"..#PLAYERS,63,175)
mStr(P.modeData.ko,80,215)
gc_draw(TEXTOBJ.ko,60-TEXTOBJ.ko:getWidth(),222)
setFont(20)
gc_setColor(1,.5,0,.6)
gc_print(P.badge,103,227)
gc_setColor(.97,.97,.97)
setFont(25)
mStr(text.powerUp[P.strength],63,290)
gc_setColor(1,1,1)
for i=1,P.strength do
gc_draw(IMG.badgeIcon,16*i+6,260)
end
end,
}

View File

@@ -0,0 +1,19 @@
return{
mesDisp=function(P)
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,63,170)
PLY.draw.drawTargetLine(P,r)
setFont(45)
mStr(("%.1f"):format(P.stat.atk),63,270)
mText(TEXTOBJ.atk,63,323)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,370)
mText(TEXTOBJ.eff,63,423)
end,
hook_drop=function(P)
if P.stat.row>=40 then
P:win('finish')
end
end
}

View File

@@ -36,7 +36,7 @@ return{
end
end
end,
dropPiece=function(P)
hook_drop=function(P)
if P.stat.row>=40 then
P:win('finish')
end

View File

@@ -14,7 +14,7 @@ return{
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
dropPiece=function(P)
hook_drop=function(P)
local F=P.field
for y=1,#F do
local l=F[y]

View File

@@ -7,9 +7,9 @@ return{
mText(TEXTOBJ.line,63,350)
PLY.draw.drawMarkLine(P,20,.3,1,1,TIME()%.42<.21 and .95 or .6)
end,
dropPiece=function(P)
if #P.field>20 then
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
hook_die=function(P)
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
if cc>0 then
local h=20-cc-P.garbageBeneath
if h>0 then
P:garbageRise(21,h,2e10-1)

View File

@@ -1,22 +0,0 @@
return{
fieldH=21,
fillClear=false,
mesDisp=function(P)
setFont(60)
mStr(P.stat.row,63,280)
mText(TEXTOBJ.line,63,350)
PLY.draw.drawMarkLine(P,18,.3,1,1,TIME()%.42<.21 and .95 or .6)
end,
dropPiece=function(P)
if #P.field>20 then
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
local h=20-cc-P.garbageBeneath-2
if h>0 then
P:garbageRise(21,h,2e10-1)
if P.garbageBeneath>=20 then
P:lose()
end
end
end
end,
}

View File

@@ -7,9 +7,9 @@ return{
mText(TEXTOBJ.line,63,350)
PLY.draw.drawMarkLine(P,17,.3,1,1,TIME()%.42<.21 and .95 or .6)
end,
dropPiece=function(P)
if #P.field>20 then
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
hook_die=function(P)
local cc=P:clearFilledLines(P.garbageBeneath+1,#P.field-P.garbageBeneath)
if cc>0 then
local h=20-cc-P.garbageBeneath-3
if h>0 then
P:garbageRise(21,h,2e10-1)

View File

@@ -21,6 +21,7 @@ return{
if D.wave==60 then
P:_showText(text.maxspeed,0,-140,100,'appear',.6)
end
P:shakeField(3)
D.timer=0
D.wave=D.wave+1
end

View File

@@ -24,6 +24,7 @@ return{
if D.wave==30 then
P:_showText(text.maxspeed,0,-140,100,'appear',.6)
end
P:shakeField(9)
D.timer=0
D.wave=D.wave+1
end

View File

@@ -4,7 +4,7 @@ return{
mStr(P.stat.clear[7][4],63,250)
mText(TEXTOBJ.techrash,63,315)
end,
dropPiece=function(P)
hook_drop=function(P)
if P.lastPiece.row>0 and P.lastPiece.row<4 then
P:lose()
end

View File

@@ -8,12 +8,12 @@ return{
PLY.draw.applyField(P)
local L=P.modeData.history
for i=1,#L do
gc.setColor(1,.3,.3,.45-i*.04)
gc.setColor(1,.3,.3,.5-i*.04)
gc.rectangle('fill',30*L[i]-30,0,30,600)
end
PLY.draw.cancelField(P)
end,
dropPiece=function(P)
hook_drop=function(P)
local C=P.lastPiece
if C.row>0 then
if C.row==4 then

View File

@@ -4,7 +4,7 @@ return{
mStr(P.modeData.tsd,63,250)
mText(TEXTOBJ.tsd,63,315)
end,
dropPiece=function(P)
hook_drop=function(P)
local C=P.lastPiece
if C.row>0 then
if C.id==5 and C.row==2 and C.spin then

View File

@@ -13,7 +13,7 @@ return{
PLY.draw.cancelField(P)
end
end,
dropPiece=function(P)
hook_drop=function(P)
local C=P.lastPiece
if C.row>0 then
if C.id==5 and C.row==2 and C.spin then

View File

@@ -8,12 +8,12 @@ return{
PLY.draw.applyField(P)
local L=P.modeData.history
for i=1,#L do
gc.setColor(1,.3,.3,.3-i*.05)
gc.setColor(1,.3,.3,.4-i*.05)
gc.rectangle('fill',30*L[i]-30,0,30,600)
end
PLY.draw.cancelField(P)
end,
dropPiece=function(P)
hook_drop=function(P)
local C=P.lastPiece
if C.row>0 then
if C.id==5 and C.row==2 and C.spin then

View File

@@ -16,9 +16,9 @@ return{
if P.stat.frame/60>=warnTime[P.modeData.stage]then
if P.modeData.stage<9 then
P.modeData.stage=P.modeData.stage+1
SFX.play('ready',.7+P.modeData.stage*.03)
playReadySFX(3,.7+P.modeData.stage*.03)
else
SFX.play('start')
playReadySFX(0,.7+P.modeData.stage*.03)
P:win('finish')
return
end

Binary file not shown.

Binary file not shown.

View File

@@ -1,37 +0,0 @@
local FREEROW={}
local L={}--Storage
local len=0--Length
function FREEROW.reset(num)
if num<len then
for i=len,num+1,-1 do
L[i]=nil
end
elseif num>len then
for i=len+1,num do
L[i]={0,0,0,0,0,0,0,0,0,0,garbage=false}
end
end
len=num
end
function FREEROW.get(val,ifGarbage)
if len==0 then
for i=1,10 do
L[i]={0,0,0,0,0,0,0,0,0,0,garbage=false}
end
len=len+10
end
local t=L[len]
for i=1,10 do t[i]=val end
t.garbage=ifGarbage==true
L[len]=nil
len=len-1
return t
end
function FREEROW.discard(t)
len=len+1
L[len]=t
end
function FREEROW.getCount()
return len
end
return FREEROW

View File

@@ -206,34 +206,30 @@ function playClearSFX(cc)
end
end
end
function playReadySFX(i)
function playReadySFX(i,vol)
if i==3 then
Snd('bass','A3')
Snd('lead','A4')
Snd('bass','A3',vol)
Snd('lead','A4',vol)
elseif i==2 then
Snd('bass','F3')
Snd('lead','A4')
Snd('lead','D5')
Snd('bass','F3',vol)
Snd('lead','A4',vol)
Snd('lead','D5',vol)
elseif i==1 then
Snd('bass','G3')
Snd('lead','B4')
Snd('lead','E5')
Snd('bass','G3',vol)
Snd('lead','B4',vol)
Snd('lead','E5',vol)
elseif i==0 then
Snd('bass','A3')
Snd('lead','A4')
Snd('lead','E5')
Snd('lead','A5')
Snd('bass','A3',vol)
Snd('lead','A4',vol)
Snd('lead','E5',vol)
Snd('lead','A5',vol)
end
end
--Game
function coin(a,b)
if rnd()<.5 then
return a
else
return b
end
function getItem(itemName,amount)
STAT.item[itemName]=STAT.item[itemName]+(amount or 1)
end
function generateLine(hole)
return 1023-2^(hole-1)
@@ -257,8 +253,8 @@ function setField(P,page)
local t=P.showTime*3
for y=1,height do
local notEmpty=notEmptyLine(F[y])
P.field[y]=FREEROW.get(0,notEmpty)
P.visTime[y]=FREEROW.get(t)
P.field[y]=LINE.new(0,notEmpty)
P.visTime[y]=LINE.new(t)
if notEmpty then
for x=1,10 do
P.field[y][x]=F[y][x]
@@ -275,9 +271,11 @@ function freshDate(mode)
if STAT.date~=date then
STAT.date=date
STAT.todayTime=0
getItem('zTicket',1)
if not mode:find'q'then
MES.new('info',text.newDay)
end
saveStats()
return true
end
end
@@ -331,8 +329,8 @@ function destroyPlayers()--Destroy all player objects, restore freerows and free
P.canvas:release()
end
while P.field[1]do
FREEROW.discard(rem(P.field))
FREEROW.discard(rem(P.visTime))
rem(P.field)
rem(P.visTime)
end
end
TABLE.cut(PLAYERS)
@@ -668,7 +666,6 @@ do--function resetGameData(args)
GAME.secDangerous=false
GAME.stage=1
end
FREEROW.reset(30*#PLAYERS)
TASK.removeTask_code(task_showMods)
if GAME.setting.allowMod then
TASK.new(task_showMods)

View File

@@ -345,7 +345,6 @@ EVENTSETS={
'marathon_n','marathon_h',
'master_n','master_h','master_final','master_m','master_ex','master_ph',
'pctrain_n','pctrain_l','pc_inf',
'rhythm_e','rhythm_h','rhythm_u',
'survivor_e','survivor_n','survivor_h','survivor_l','survivor_u',
'tsd_e','tsd_h','tsd_u',
'ultra',
@@ -727,6 +726,10 @@ do--Userdata tables
spin=(function()local L={}for i=1,29 do L[i]={0,0,0,0,0,0,0}end return L end)(),
pc=0,hpc=0,b2b=0,b3b=0,score=0,
lastPlay='sprint_10l',--Last played mode ID
item=setmetatable({},{__index=function(self,k)
self[k]=0
return 0
end}),
date=false,
todayTime=0,
}

View File

@@ -4,7 +4,7 @@ return{
{"Translator Note 1",
"",
"help",
"This translation of the TetroDictionary is provided by me, User670 (Discord: User670#9501).\n\nThe translation may not completely reflect the contents of the original Chinese text.\n\nCorrected by C29H25N3O5.\n\nTo view the list of contributors or make contributions, feel free to visit the GitHub page.",
"This translation of the TetroDictionary is provided by me, User670 (Discord: User670#9501).\n\nThe translation may not completely reflect the contents of the original Chinese text.\n\nCorrected by C₂₉H₂₅N₃O₅ (Discord: C29H25N3O5#1606).\n\nTo view the list of contributors or make contributions, feel free to visit the GitHub page.",
"https://github.com/26F-Studio/Techmino/blob/main/parts/language/dict_en.lua",
},
{"Official Website",
@@ -16,7 +16,7 @@ return{
{"To New Players",
"guide newbie noob",
"help",
"To new players that want to get better at the game:\n\tTwo principles:\n\t1. find a version with good controls (e.g. Techmino, Tetr.io, Tetris Online, Jstris, Tetr.js). Do not use those version used for programming practice.\n\t2. Build foundations in your skills (stable Techrashes using next queue to aid decisions), don't go for fancy T-Spins from the start.\n\n\tTwo main techniques:\n\t1. familiarize yourself with spawn locations of pieces, and the controls to move the piece into each location\n\t2. Plan ahead of where to put the pieces\nWe recommend that you read this article titled \"Words to newbies from a Tetris Pro\" (Click \"Open URL\". In Simplified Chinese)",
"To new players that want to get better at the game:\n\tTwo principles:\n\t1. find a version with good controls (e.g. Techmino, Tetr.io, Tetris Online, Jstris, Tetr.js). Do not use those version used for programming practice.\n\t2. Build foundations in your skills (stable Techrashes using next queue to aid decisions), don't go for fancy T-Spins from the start.\n\n\tTwo main techniques:\n\t1. familiarize yourself with spawn locations of pieces, and the controls to move the piece into each location\n\t2. Plan ahead of where to put the pieces\nHere is a article written by a well-known player in Chinese Tetris community talking about advices to new players. Click the globe if you can read simplified Chinese.",
"https://bilibili.com/read/cv2352939",
},
{"Learning T-spins",
@@ -65,7 +65,7 @@ return{
{"Communities",
"community communities",
"org",
"Join Tetris communities and talk with other players!\n\nChina: [QQ] Tetris Research: 112897780\nGlobal: [Discord] Hard Drop: discord.gg/harddrop (click \"Open URL\").",
"Join Tetris communities and talk with other players!\n\nChina: [QQ] Tetris Research: 112897780\nGlobal: [Discord] Hard Drop: discord.gg/harddrop (click the globe icon to open).",
"https://discord.gg/harddrop"
},
{"Mew",
@@ -77,7 +77,7 @@ return{
{"Tetris OL Servers",
"tetrisonline servers",
"org",
"Google \"Tetris Online Poland\" for the Poland server.\nClick \"Open URL\" for information about the Tetris Online Study server.",
"Google \"Tetris Online Poland\" for the Poland server.\nClick on the globe icon for information about the Tetris Online Study server.",
"http://teatube.ltd/tos",
},
@@ -167,7 +167,7 @@ return{
{"Tetris Mind Bender",
"tetris online official gem",
"game",
"Another Tetris game from tetris.com. It introduced Mind Bender minoes on the basis of marathon mode. Clearing a line with a Mind Bender mino will give you either a good or bad effect.",
"Another Tetris game from tetris.com. It introduced \"Mind Bender\" minoes on the basis of marathon mode. Clearing a line with a Mind Bender mino will give you either a good or bad effect.",
},
{"TGM",
@@ -439,7 +439,7 @@ return{
{"Orientation",
"orientation direction 0r2l 02 20 rl lr",
"term",
"",--TODO
"In SRS and SRS-like rotation systems, there are standard notations describing the orientations of the minoes:\n 0 for Original orientation; R for right, or 90° clockwise; L for left, or 90° counterclockwise; 2 for spin twice (180°). For example, 0→L means rotating counterclockwise from original orientation (0) to L; 0→R means rotating clockwise from original orientation (0) to R; 2→R means rotating counterclockwise from 2 (180°) to R.",
},
{"ARS",
"ars arikrotationsystem atarirotationsystem",
@@ -555,7 +555,7 @@ return{
{"Deepdrop",
"deepdrop shenjiang",
"term",
"",--TODO
"*Techmino exclusive*\n\nA special function that allows minoes to teleport through the wall to enter a hole. When the mino hits the bottom, pressing the soft drop button again will enable the deep drop. if there is a hole that fits the shape of the mino, it will teleport into this hole immediately/nThis mechanism is especially useful for AI because it allows AI to disregard the differences between different rotation systems.",
},
{"Misdrop",
"md misdrop",
@@ -660,7 +660,18 @@ return{
{"Topping out",
"die death topout toppingout",
"term",
"Modern Tetris games have three different conditions in which the player tops out:\n1. Block out: when a piece spawned overlaps with the existing blocks in the field;\n2. Lock out: when a piece locks entirely above the skyline;\n3. Garbage out: when the stack exceeds 40 lines in height (often due to incoming garbage).\nTechmino does not check for locking out and garbage out.",
"Modern Tetris games have three different conditions in which the player tops out:\n1. Block out: when a piece spawned overlaps with the existing blocks in the field;\n2. Lock out: when a piece locks entirely above the skyline;\n3. Top out: when the stack exceeds 40 lines in height (often due to incoming garbage).\nTechmino does not check for locking out and topping out.",
},
{"Buffer zone",
"buffer zone above super invisible disappear",
"term",
"Refers to 21st-40th lines above the visible field. Because the blocks in the field could go over the visible field (this usually happens when multiple garbage lines come in) so the buffer zone was created so those blocks could go back to the field when garbage lines are cleared. Also, the buffer zone is usually located at 21st-40th lines because this is sufficient for most cases. Refer to \"Vanish Zone\" to learn more.",
},
{"Vanish zone",
"vanish zone disappear gone cut die",
"term",
"Refers to the area located above the 40th line. This is usually realised by combining c4w and multiple garbage lines. In many games, when any block reaches the vanish zone, the game is terminated immediately.\nHowever, this area can have different behaviours in different games. Some games are flawed because the game could crash when the blocks enter the vanish zone (e.g. Tetris Online). Wierd behaviours could also happen when the blocks enter the vanish zone (you can refer to this video, click on the globe icon to open the link).\n\nFurthermore, the vanish zone in Jstris is located above the 22nd line, and any blocks locked above the 21st line will disappear. ",
"https://youtu.be/z4WtWISkrdU",
},
{"Falling speed",
"fallingspeed",
@@ -1123,10 +1134,10 @@ return{
"help",
"Starting from here, all but one term are China-specific (the not-China term is Diao) and are less relevant for the global community.\n\"Virtual content creator\" refers to people who produce content online under a fictional persona, and appear as a motion-controlled animated character on screens. Basically \"Virtual YouTuber\" but not platform-specific."
},
{"TetroDictionary",--TODO EDITTED
{"TetroDictionary",
"zictionary tetrodictionary littlez",
"name",
"(or Zictionary for short) The name of this thing.\nUsed to be a chatbot that serves for the same function, and mostly uses the same list of keywords.",
"(or Zictionary for short) The name of this dictionary!\nIt includes brief introductions on many common terms in Tetris.\nIt used to be a chatbot in our QQ group, which was used to answer new player's FAQs. The entries in the Tetrodictionary were also inherited from the database in the chatbot.",
},
{"MrZ",
"mrz_26",
@@ -1266,12 +1277,12 @@ return{
"(Zǐ Xīn Koishi)\n\nTetris Research community member, Virtual content creator.\nA top Tetris 99 players known for his strategies.",
"https://space.bilibili.com/147529",
},
{"ditoly",
"ditoly icrem kuimei jk",
"name",
"Tetris Research community member. The developer of Nanamino.",
"https://space.bilibili.com/13014410",
},
{"ditoly",
"ditoly icrem kuimei jk",
"name",
"Tetris Research community member. The developer of Nanamino.",
"https://space.bilibili.com/13014410",
},
{"蓝绿",
"lanlv lanlyu gompyn imple lee blari'o blariho",
"name",

View File

@@ -4,7 +4,7 @@ return{
{"新人须知",
"新人须知 xinren new noob readme",
"help",
"致想深入玩下去的新人:\n\n\t两大根本原则:\n\t\t1. 选手感好的版本Tech/Tetr.io/Jstris/TOP/Tetr.js别用编程练习渣版本\n\t\t2. 踏实打好基础预判next稳定消四等别总想着炫酷T旋对未来发展没好处。\n\t两大主要技巧:\n\t\t1. 熟悉初始位置以及到各个位置的初始操作;\n\t\t2. 提前计算好下一块能放哪。\n\n推荐阅读专栏《给TOP新人的几点建议》\n\n[点击右下角按钮打开链接]",
"致想深入玩下去的新人:\n\n\t两大根本原则:\n\t\t1. 选手感好的版本Tech/Tetr.io/Jstris/TOP/Tetr.js别用编程练习渣版本\n\t\t2. 踏实打好基础预判next稳定消四等别总想着炫酷T旋对未来发展没好处。\n\t两大主要技巧:\n\t\t1. 熟悉初始位置以及到各个位置的初始操作;\n\t\t2. 提前计算好下一块能放哪。\n\n推荐阅读专栏《给TOP新人的几点建议》\n\n[点击右下角地球按钮打开链接]",
"https://bilibili.com/read/cv2352939",
},
{"关于T-spin学习",
@@ -685,7 +685,18 @@ return{
{"死亡判定",
"死亡判定 die death siwang",
"term",
"现代方块普遍使用的死亡判定:\n1. 新出现的方块和场地方块有重叠(窒息,Top Outc4w比s4w强的原因因为被打进18行都不会窒息\n2. 方块锁定时完全在场地的外面(Block Out\n3. 场地内现存方块总高度大于40。部分游戏可能没有这条判定而是会自动“切除”场地内所有高度大于40的部分Vanish Zone\n\n注:本游戏使用的死亡判定不包含上述的第二条和第三条。",
"现代方块普遍使用的死亡判定:\n1. 新出现的方块和场地方块有重叠(窒息,Block Outc4w比s4w强的原因因为被打进18行都不会窒息\n2. 方块锁定时完全在场地的外面(Lock Out\n3. 场地内现存方块总高度大于40。超高Top Out\n\n注:本游戏使用的死亡判定不包含上述的第二条和第三条。",
},
{"缓冲区",
"缓冲区 buffer zone huanchongqu",
"term",
"不是所有游戏都有这个概念指10×20可见场地之上的21~40行。因为垃圾行顶起后两边堆高的方块可能会超出屏幕消行后这些方块要重新回到场地内所以需要保存下来由于程序上要求场地尺寸有限部分游戏可以无限故设定为40一般都够用。\n\n另见“消失区”词条。",
},
{"消失区",
"消失区 vanish zone xiaoshiqu",
"term",
"在缓冲区的基础上指比40行缓冲区还高的区域。\n标准的死亡判定涉及了这个概念在垃圾行升起后如果场地上有任何方块超出了40高的缓冲区也就是达到了消失区时游戏直接结束。\n但事实上这块区域在不同游戏中表现不同甚至有设计者考虑不周导致方块挪到40行以上但是程序没考虑导致方块接触消失区直接报错闪退的游戏。通常出现在玩家堆了c4w然后被打入大量垃圾行时才会考虑这个概念。其他游戏中方块进入消失区可能直接导致游戏结束也有可能会出现一些奇怪的bug附带链接是ppt的复制40行无限ren视频\n\nJstris中22行及以上可以理解为消失区锁定在21行之外的格子会消失。",
"https://www.bilibili.com/video/BV1ZE411Y7GD",
},
{"下落速度",
"下落速度 重力 drop speed zhongli gravity",
@@ -780,7 +791,7 @@ return{
{"Hypertap",
"超连点 hypertap",
"term",
"快速震动手指,实现比长按更快速+灵活的高速单点移动主要在经典块的高难度下因为das不可调而且特别慢高速下很容易md导致失败此时手动连点就比自动移动更快或者受特殊情况限制不适合用自动移动时使用。会使用这个技术的人称为“Hypertapper”tapper",
"快速震动手指,实现比长按更快速+灵活的高速单点移动主要在经典块的高难度下因为das不可调而且特别慢高速下很容易md导致失败此时手动连点就比自动移动更快或者受特殊情况限制不适合用自动移动时使用。会使用这个技术的人称为“Hypertapper”。",
},
{"TOP攻击表",
"攻击表 top attack",
@@ -795,7 +806,7 @@ return{
{"C2序列",
"c2序列 seq",
"term",
"七个块初始权重0\n全体除以2再加0~1的随机数选数字最大的块然后将其权重除以3.5循环",--Discovered by zxc
"七个块初始权重设为0\n要取块的时候,\n先把七个数都除以2然后加上0~1的随机数\n最大的数字是第几个的就出对应的块然后将其权重除以3.5\n循环",--Discovered by zxc
},
{"C2踢墙",
"c2踢墙 kick",

View File

@@ -316,7 +316,7 @@ return{
net_game={
ready="Ready",
spectate="Spectate",
cancel="Cancel",
cancel="Cancel ready",
},
setting_game={
title="Game Settings",
@@ -677,9 +677,6 @@ return{
['dig_400l']= {"Dig", "400L", "Dig 400 garbage lines"},
['drought_n']= {"Drought", "100L", "No I-pieces available"},
['drought_l']= {"Drought+", "100L", "W T F"},
['stack_e']= {"Stack", "EASY", "Pack them!"},
['stack_h']= {"Stack", "HARD", "Pack them!"},
['stack_u']= {"Stack", "ULTIMATE", "Pack them!"},
['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with increasing speed"},
['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon"},
['solo_e']= {"Battle", "EASY", "Defeat the AI!"},
@@ -704,9 +701,6 @@ return{
['master_final']= {"Master", "FINAL", "20G and beyond"},
['master_ph']= {"Master", "PHANTASM", "???"},
['master_ex']= {"GrandMaster", "EXTRA", "An eternity shorter than an instant"},
['rhythm_e']= {"Rhythm", "EASY", "200-line low-BPM rhythm marathon"},
['rhythm_h']= {"Rhythm", "HARD", "200-line medium BPM rhythm marathon"},
['rhythm_u']= {"Rhythm", "ULTIMATE", "200-line high-BPM rhythm marathon"},
['blind_e']= {"Invisible", "HALF", "For novices"},
['blind_n']= {"Invisible", "ALL", "For intermediates"},
['blind_h']= {"Invisible", "SUDDEN", "For the experienced"},
@@ -752,10 +746,12 @@ return{
['backfire_l']= {"Backfire", "LUNATIC", "Hold back the backfiring garbage lines"},
['backfire_u']= {"Backfire", "ULTIMATE", "Hold back the backfiring garbage lines"},
['sprintAtk']= {"Sprint", "100 Attack", "Send 100 lines!"},
['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40lines!"},
['zen']= {'Zen', "200", "A 200-line run without a time limit"},
['ultra']= {'Ultra', "EXTRA", "A 2-minute score attack"},
['infinite']= {'infinite', "", "Just a sandbox"},
['infinite']= {"Infinite", "", "Just a sandbox"},
['infinite_dig']= {"Infinite: Dig", "", "Dig-diggin'-dug"},
['marathon_inf']= {"Marathon", "INFINITE", "Infinite marathon."},
['custom_clear']= {"Custom", "NORMAL"},
['custom_puzzle']= {"Custom", "PUZZLE"},
@@ -835,7 +831,7 @@ return{
"Powered by Un..LÖVE",
"pps-0.01",
"Server down randomly",
"Some requirements to achieve rank S are intentionally set to be difficult for even the best players.",
"Some requirements to achieve rank X are intentionally set to be difficult for even the best players.",
"Soon you'll be able to play against friends and foes all over the world.",
"Split clear coming soon!",
"sudo rm -rf /*",
@@ -866,6 +862,7 @@ return{
"You can set the spawning orientation for each tetromino.",
"ZS JL T O I",
{C.C,"Also try 15puzzle!"},
{C.C,"Also try Ballance!"},
{C.C,"Also try Minecraft!"},
{C.C,"Also try Minesweeper!"},
{C.C,"Also try Orzmic!"},
@@ -876,6 +873,8 @@ return{
{C.C,"Also try Terraria!"},
{C.C,"Also try Touhou Project!"},
{C.C,"Also try VVVVVV!"},
{C.C,"Also try World of goo!"},
{C.C,"Also try Zuma!"},
{C.H,"REGRET!!"},
{C.lP,"Secret number: 626"},
{C.lR,"Z ",C.lG,"S ",C.lS,"J ",C.lO,"L ",C.lP,"T ",C.lY,"O ",C.lC,"I"},

View File

@@ -283,7 +283,7 @@ return{
net_game={
ready="Estoy Listo",
spectate="Espectear",
cancel="Cancelar",
-- cancel="Cancel ready",
},
setting_game={
title="Ajustes del Juego",
@@ -636,9 +636,6 @@ return{
['dig_400l']= {"Queso", "400L", "Limpia 400 líneas de queso."},
['drought_n']= {"Sequía", "100L", "¡Sin piezas I!"},
['drought_l']= {"Sequía+", "100L", "Guat de foc..."},
['stack_e']= {"Stack", "Fácil", "¡Sin dejar huecos!"},
['stack_h']= {"Stack", "Difícil", "¡Sin dejar huecos!"},
['stack_u']= {"Stack", "Supremo", "¡Sin dejar huecos!"},
['marathon_n']= {"Maratón", "Normal", "Maratón de 200 líneas con velocidad en aumento."},
['marathon_h']= {"Maratón", "Difícil", "Maratón de 200 líneas a velocidad máxima."},
['solo_e']= {"VS.", "Fácil", "¡Derrota a la CPU!"},
@@ -662,9 +659,6 @@ return{
-- ['master_m']= {"Master", "M21", "For 20G Masters."},
['master_final']= {"Master", "FINAL", "El verdadero 20G Supremo: el final es inalcanzable."},
['master_ex']= {"GrandMaster", "EXTRA", "Para ser un gran maestro, acepta este desafío"},
['rhythm_e']= {"Al Ritmo", "Fácil", "Maratón rítmica de 200 líneas con bajo bpm."},
['rhythm_h']= {"Al Ritmo", "Difícil", "Maratón rítmica de 200 líneas con bpm moderado."},
['rhythm_u']= {"Al Ritmo", "Supremo", "Maratón rítmica de 200 líneas con bpm elevado."},
['blind_e']= {"A Ciegas", "Parcial", "Para novatos."},
['blind_n']= {"A Ciegas", "Total", "Para jugadores intermedios."},
['blind_h']= {"A Ciegas", "Inmediato", "Para jugadores experimentados"},
@@ -710,10 +704,12 @@ return{
['backfire_l']= {"Retorno", "Lunático", "Lidia con tus propias líneas basura."},
['backfire_u']= {"Retorno", "Supremo", "Lidia con tus propias líneas basura."},
['sprintAtk']= {"Sprint", "100L - Ataque", "¡Envía 100 líneas de ataque!"},
-- ['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40lines!"},
['zen']= {'Zen', "200L", "200 líneas sin límite de tiempo."},
['ultra']= {'Ultra', "Extra", "¡Consigue el mayor puntaje posible en 2 minutos!"},
['infinite']= {"Infinito", "", "Modo Sandbox."},
['infinite_dig']= {"Infinito: Queso", "", "Limpia, limpia, más limpia que tú."},
['marathon_inf']= {"Maratón", "Infinito", "Infinito maratón."},
['custom_clear']= {"Personalizado", "Normal"},
['custom_puzzle']= {"Personalizado", "Puzzle"},

View File

@@ -279,7 +279,7 @@ return{
net_game={
-- ready="Ready",
-- spectate="Spectate",
-- cancel="Cancel",
-- cancel="Cancel ready",
},
setting_game={
title="Paramètres du jeu",
@@ -638,7 +638,6 @@ return{
['drought_n']= {"Drought", "100L", "Pas de pièce I !"},
['drought_l']= {"Drought+", "100L", "WTF ??!!"},
-- ['stack_e']= {"Stack", "FACILE", "Pack them!"},
-- ['stack_h']= {"Stack", "DIFFICILE", "Pack them!"},
-- ['stack_u']= {"Stack", "ULTIME", "Pack them!"},
['marathon_n']= {"Marathon", "NORMAL", "Marathon de 200 lignes."},
['marathon_h']= {"Marathon", "DIFFICILE", "Marathon de 200 lignes à très haute vitesse"},
@@ -664,9 +663,6 @@ return{
['master_final']= {"Master", "FINAL", "20G : Un point final impossible à atteindre !"},
-- ['master_ph']= {"Mester", "FANTASMA", "20G: ???"},
['master_ex']= {"GrandMaster", "EXTRA", "Tentez de devenir un Grandmaster."},
-- ['rhythm_e']= {"Rhythm", "EASY", "200-line low-bpm rhythm marathon."},
-- ['rhythm_h']= {"Rhythm", "HARD", "200-line medium-bpm rhythm marathon"},
-- ['rhythm_u']= {"Rhythm", "ULTIMATE", "200-line high-bpm rhythm marathon."},
['blind_e']= {"Aveugle", "MOITIE", "Pour les novices."},
['blind_n']= {"Aveugle", "TOUT", "Pour les joueurs intermédiaires."},
['blind_h']= {"Aveugle", "SOUDAIN", "Pour les bons jooeurs."},
@@ -712,10 +708,12 @@ return{
-- ['backfire_l']= {"Backfire", "LUNATIC", "Self-send garbages"},
-- ['backfire_u']= {"Backfire", "ULTIMATE", "Self-send garbages"},
-- ['sprintAtk']= {"Sprint", "100 Attack", "Send 100 lines!"},
-- ['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40lines!"},
['zen']= {'Zen', "200", "200 lignes sans limites de temps."},
['ultra']= {'Ultra', "EXTRA", "2 minutes pour avoir le meilleur score."},
['infinite']= {"Infini", "", "Mode tranquile."},
['infinite_dig']= {"Infini : Dig", "", "Creuser, creuser, creuser."},
['marathon_inf']= {"Marathon", "Infini", "Infini marathon."},
['custom_clear']= {"Perso.", "NORMAL"},
['custom_puzzle']= {"Perso.", "PUZZLE"},

View File

@@ -305,7 +305,7 @@ return{
net_game={
-- ready="Ready",
-- spectate="Spectate",
-- cancel="Cancel",
-- cancel="Cancel ready",
},
setting_game={
title="Config. de jogo",
@@ -668,7 +668,6 @@ return{
['drought_n']= {"Drought", "100L", "Sem peça I !"},
['drought_l']= {"Drought+", "100L", "WTF"},
-- ['stack_e']= {"Stack", "FÁCIL", "Pack them!"},
-- ['stack_h']= {"Stack", "DIFÍCIL", "Pack them!"},
-- ['stack_u']= {"Stack", "ULTIMATE", "Pack them!"},
['marathon_n']= {"Maratona", "NORMAL", "200-line Maratona com velocidade aumentando."},
['marathon_h']= {"Maratona", "DIFÍCIL", "200-line Maratona com velocidade alta."},
@@ -694,9 +693,6 @@ return{
['master_final']= {"Mestre", "FINAL", "20G: Final inalcançável!"},
['master_ph']= {"Mestre", "FANTASMA", "20G: ???"},
['master_ex']= {"GrandMaster", "EXTRA", "Para ser um Grand Master, aceite \nesse desafio."},
-- ['rhythm_e']= {"Rhythm", "EASY", "200-line low-bpm rhythm marathon."},
-- ['rhythm_h']= {"Rhythm", "HARD", "200-line medium-bpm rhythm marathon"},
-- ['rhythm_u']= {"Rhythm", "ULTIMATE", "200-line high-bpm rhythm marathon."},
['blind_e']= {"Cego", "METADE", "Para novatos."},
['blind_n']= {"Cego", "TUDO", "Para intermediários."},
['blind_h']= {"Cego", "DE REPENTE", "Para experientes."},
@@ -742,10 +738,12 @@ return{
-- ['backfire_l']= {"Backfire", "LUNATIC", "Self-send garbages"},
-- ['backfire_u']= {"Backfire", "ULTIMATE", "Self-send garbages"},
-- ['sprintAtk']= {"Sprint", "100 Attack", "Send 100 lines!"},
-- ['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40lines!"},
['zen']= {'Zen', "200", "200 linhas sem um limite de tempo."},
['ultra']= {'Ultra', "EXTRA", "Pegue a maior pontuação em 2 minutos."},
['infinite']= {"Infinito", "", "Modo Sandbox."},
['infinite_dig']= {"Infinito:Cave", "", "Cava, Cava, Cava."},
['marathon_inf']= {"Maratona", "Infinito", "Infinito maratona."},
['custom_clear']= {"Custom", "NORMAL"},
['custom_puzzle']= {"Custom", "PUZZLE"},
@@ -831,13 +829,16 @@ return{
"Você pode escolher uma orientação pra cada blococan.",
"ZS JL T O I",
{C.C,"Tente também 15puzzle"},
{C.C,"Tente também Ballance!"},
{C.C,"Tente também Cubo de Rubik"},
{C.C,"Tente também Minecraft"},
{C.C,"Tente também Minesweeper"},
{C.C,"Tente também osu!"},
{C.C,"Tente também Phigros"},
{C.C,"Tente também Cubo de Rubik"},
{C.C,"Tente também Terraria"},
{C.C,"Tente também VVVVVV"},
{C.C,"Tente também World of goo!"},
{C.C,"Tente também Zuma!"},
{C.F,"Tente também Cultris II"},
{C.F,"Tente também Jstris"},
{C.F,"Tente também Nullpomino"},

View File

@@ -206,9 +206,6 @@ return{fallback='zh',
['dig_400l']= {"挖掘", "400L", "挖400行"},
['drought_n']= {"干旱", "100L", "放轻松,简单得很"},
['drought_l']= {"干旱+", "100L", "有趣的要来了"},
['stack_e']= {"堆叠", "简单", "智力启蒙玩具(确信"},
['stack_h']= {"堆叠", "困难", "智力启蒙玩具(确信"},
['stack_u']= {"堆叠", "极限", "智力启蒙玩具(确信"},
['marathon_n']= {"马拉松", "普通", "休闲模式"},
['marathon_h']= {"马拉松", "困难", "休闲模式"},
['solo_e']= {"单挑", "简单", "鲨AI"},
@@ -233,9 +230,6 @@ return{fallback='zh',
['master_final']= {"大师", "终点", "真正的20G"},
['master_ph']= {"大师", "虚幻", "好玩的20G"},
['master_ex']= {"宗师", "EX", "考试20G"},
['rhythm_e']= {"节奏", "简单", "很无聊的"},
['rhythm_h']= {"节奏", "困难", "好玩么?"},
['rhythm_u']= {"节奏", "极限", "真男人不玩低难度"},
['blind_e']= {"隐形", "半隐", "谁都能玩"},
['blind_n']= {"隐形", "全隐", "稍加练习即可"},
['blind_h']= {"隐形", "瞬隐", "和上一个一样"},
@@ -279,12 +273,14 @@ return{fallback='zh',
['backfire_n']= {"自攻自受", "普通", "100攻击很少的,冲冲冲"},
['backfire_h']= {"自攻自受", "困难", "你在害怕什么"},
['backfire_l']= {"自攻自受", "疯狂", "别怂啊,打攻击呀"},
['backfire_u']= {"自攻自受", "极限", "把自己玩死,不会吧"},
['backfire_u']= {"自攻自受", "极限", "怎么可能会把自己玩死"},
['sprintAtk']= {"竞速", "100攻击", "送100行"},
['sprintEff']= {"竞速", "效率", "会打就多打点"},
['zen']= {"", "200", "不限时200行"},
['ultra']= {"限时打分", "挑战", "2分钟刷分"},
['infinite']= {"无尽", "", "真的有人会玩这个?"},
['infinite_dig']= {"无尽:挖掘", "", "闲得慌就来挖"},
['marathon_inf']= {"马拉松", "无尽", "无尽马拉松"},
['custom_clear']= {"自定义", "普通"},
['custom_puzzle']= {"自定义", "拼图"},

View File

@@ -317,7 +317,7 @@ return{
net_game={
ready="准备",
spectate="观战",
cancel="取消",
cancel="取消准备",
},
setting_game={
title="游戏设置",
@@ -681,9 +681,6 @@ return{
['dig_400l']= {"挖掘", "400L", "挖掘400行"},
['drought_n']= {"干旱", "100L", "你I没了"},
['drought_l']= {"干旱+", "100L", "后 妈 发 牌"},
['stack_e']= {"堆积", "简单", "搭积木"},
['stack_h']= {"堆积", "困难", "搭积木"},
['stack_u']= {"堆积", "极限", "搭积木"},
['marathon_n']= {"马拉松", "普通", "200行加速马拉松"},
['marathon_h']= {"马拉松", "困难", "200行高速马拉松"},
['solo_e']= {"单挑", "简单", "打败AI"},
@@ -708,9 +705,6 @@ return{
['master_final']= {"大师", "终点", "究极20G:无法触及的终点"},
['master_ph']= {"大师", "虚幻", "虚幻20G:"},
['master_ex']= {"宗师", "EX", "成为方块大师"},
['rhythm_e']= {"节奏", "简单", "200行低速节奏马拉松"},
['rhythm_h']= {"节奏", "困难", "200行中速节奏马拉松"},
['rhythm_u']= {"节奏", "极限", "200行高速节奏马拉松"},
['blind_e']= {"隐形", "半隐", "不强大脑"},
['blind_n']= {"隐形", "全隐", "挺强大脑"},
['blind_h']= {"隐形", "瞬隐", "很强大脑"},
@@ -756,10 +750,12 @@ return{
['backfire_l']= {"Backfire", "疯狂", "打出100攻击"},
['backfire_u']= {"Backfire", "极限", "打出100攻击"},
['sprintAtk']= {"竞速", "100攻击", "打出100攻击"},
['sprintEff']= {"竞速", "效率", "40行内打出更高的攻击"},
['zen']= {"", "200", "不限时200行"},
['ultra']= {"限时打分", "挑战", "在两分钟内尽可能拿到最多的分数"},
['infinite']= {"无尽", "", "沙盒"},
['infinite_dig']= {"无尽:挖掘", "", "挖呀挖呀挖"},
['marathon_inf']= {"马拉松", "无尽", "无尽马拉松"},
['custom_clear']= {"自定义", "普通"},
['custom_puzzle']= {"自定义", "拼图"},
@@ -782,6 +778,7 @@ return{
"《知识的力量》",
"《主题曲进化史》",
"↑↑↓↓←→←→BA",
"∫u dv=uv-∫v du",
"$include<studio.h>",
"0next 0hold.",
"11renPC",
@@ -899,7 +896,7 @@ return{
"锟斤拷锟斤拷锟斤拷",
"来学编程,好玩的",
"连续pc有大量知识要背不过背出来后随手10连pc不是问题",
"六连块总共有…?那不重要,不会做的",
"六连块总共有…?那不重要,不会做的",
"论如何正确使用Unicode私用区定制字体",
"卖弱和谦虚不是一回事,发言前三思呀",
"卖弱禁言警告",
@@ -933,7 +930,7 @@ return{
"请勿大力敲打设备敲坏了就没有Techmino玩了",
"请勿使用三只手游玩",
"去玩别的方块的时候记得没有Ospin",
"全球应该没人能全S评价(大爆炸不算)",
"全球目前应该没人能全X评价(大爆炸不算)",
"群友翻译的中文方块百科全书! tetris.huijiwiki.com",
"让他三尺又何妨",
"如何O-spin: 一秒转626圈(误",
@@ -942,6 +939,7 @@ return{
"上面这个不是录像,是机器人实时在玩",
"少女祈祷中",
"少玩点游戏,多注意眨眼和休息",
"深降了解一下",
"使用固定堆叠方法达成20TSD难度很低",
"试试用跳舞毯打块",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
@@ -975,7 +973,7 @@ return{
"物理hold了解一下",
"希望极简率没事",
"希望你们都能喜欢Z……哦不是喜欢Techmino",
"喜欢本游戏的话可以到应用商……好像没上架呢还",
"喜欢本游戏的话可以到应用商……好像没上架呢还,不过快了就是(",
"享受Tech的特色旋转系统",
"向其他人询问练习方法最好提供自己的详细水平,最好录些视频,不然很难给出合适的建议",
"小心腱鞘炎",
@@ -1015,7 +1013,7 @@ return{
"作者电脑上装了11个方块",
"作者浏览器收藏夹里有6个方块",
"做,做碌鸠啊做,打块先啦!",
"ALLSPIN",
"ALLSPIN!",
"Am G F G",
"B2B2B",
"B2B2B2B并不存在……",
@@ -1031,7 +1029,7 @@ return{
"e^(πi)=-1",
"e^(πi/2)=i",
"e^(πi/4)=(1+i)/√2",
"Farter:“成天被夸赞'好玩'的”",
"Farter:“成天被夸赞好玩的”",
"Farter:“可以形成方块圈子小中心话题,同作者一起衍生一些概念与梗的”",
"Farter:“论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(”",
"Farter:“民间微创新”",
@@ -1051,6 +1049,7 @@ return{
"iOS设备使用键盘控制可能会有问题还是先只用触屏吧",
"l-=-1",
"Let-The-Bass-Kick",
"lim x→c f(x)/g(x)=lim x→c f'(x)/g'(x)",
"MrZ是谁啊",
"pps-0.01",
"S△ABC=√(h(h-a)(h-b)(h-c))h=(a+b+c)/2",
@@ -1063,7 +1062,7 @@ return{
"Staff名单里飘过的是赞助榜单喜欢本游戏的话可以给我们打赞助支持开发哦~",
"STSD必死",
"sudo rm -rf /*",
"Techmino = Technique + tetromino",
"Techmino = Technique + Tetromino",
"Techmino 好玩!",
"Techmino 濂界帺锛",
"Techmino 英['tɛkmɪnəʊ] 美/'tekmɪnoʊ/ n.铁壳米诺(游戏名)",
@@ -1071,7 +1070,7 @@ return{
"Techmino安卓下载",
"Techmino不是工业产品也不是练手程序是游戏作品(至少目前是,嗯……)",
"Techmino好玩",
"Techmino没有抽卡没有氪金没有逼肝,良不良心~",
"Techmino没有氪金没有逼肝良不良心~",
"Techmino生日不太清楚那就定在2019.6.26吧",
"Techmino也有节日主题了哦",
"Techmino有一个Nspire-CX版本",
@@ -1087,10 +1086,11 @@ return{
"Z块等身抱枕来一个(x",
{C.C,"<PURE ",C.P,"MEMORY>"},
{C.C,"15puzzle好玩"},
{C.C,"东方Project好玩!"},
{C.C,"东方Project好玩"},
{C.C,"魔方好玩!"},
{C.C,"噗哟噗哟好玩!"},
{C.C,"扫雷好玩!"},
{C.C,"Ballance好玩"},
{C.C,"Celeste好玩"},
{C.C,"Minecraft好玩"},
{C.C,"Orzmic好玩"},
@@ -1098,6 +1098,8 @@ return{
{C.C,"Phigros好玩"},
{C.C,"Terraria好玩"},
{C.C,"VVVVVV好玩"},
{C.C,"World of goo好玩"},
{C.C,"Zuma好玩"},
{C.H,"暂定段位:9"},
{C.H,"REGRET!!"},
{C.lC,"Xspin",C.Z,"是啥"},

View File

@@ -95,9 +95,6 @@ return{
['dig_400l']= {"挖掘", "400L", "挖掘400行"},
['drought_n']= {"干旱", "100行", "你I没了"},
['drought_l']= {"干旱+", "100行", "后 妈 发 牌"},
['stack_e']= {"堆积", "简单", "搭积木"},
['stack_h']= {"堆积", "困难", "搭积木"},
['stack_u']= {"堆积", "极限", "搭积木"},
['marathon_n']= {"马拉松", "普通", "200行加速马拉松"},
['marathon_h']= {"马拉松", "困难", "200行高速马拉松"},
['solo_e']= {"单挑", "简单", "打败机器人"},
@@ -122,9 +119,6 @@ return{
['master_final']= {"大师", "终点", "究极20G:无法触及的终点"},
['master_ph']= {"大师", "虚幻", "虚幻20G:???"},
['master_ex']= {"宗师", "EX", "成为方块大师"},
['rhythm_e']= {"节奏", "简单", "200行低速节奏马拉松"},
['rhythm_h']= {"节奏", "困难", "200行中速节奏马拉松"},
['rhythm_u']= {"节奏", "极限", "200行高速节奏马拉松"},
['blind_e']= {"隐形", "半隐", "不强大脑"},
['blind_n']= {"隐形", "全隐", "挺强大脑"},
['blind_h']= {"隐形", "瞬隐", "很强大脑"},
@@ -170,10 +164,12 @@ return{
['backfire_l']= {"自攻自防", "疯狂", "打出100攻击"},
['backfire_u']= {"自攻自防", "极限", "打出100攻击"},
['sprintAtk']= {"竞速", "100攻击", "打出100攻击"},
['sprintEff']= {"竞速", "效率", "40行内打出更高的攻击"},
['zen']= {"", "200", "不限时200行"},
['ultra']= {"限时打分", "挑战", "在两分钟内尽可能拿到最多的分数"},
['infinite']= {"无尽", "", "沙盒"},
['infinite_dig']= {"无尽:挖掘", "", "挖呀挖呀挖"},
['marathon_inf']= {"马拉松", "无尽", "无尽马拉松"},
['custom_clear']= {"自定义", "普通"},
['custom_puzzle']= {"自定义", "拼图"},

View File

@@ -316,7 +316,7 @@ return{
net_game={
ready="准备好的",
spectate="凝视",
cancel="取消",
cancel="取消准备",
},
setting_game={
title="游戏设置",
@@ -678,9 +678,6 @@ return{
['dig_400l']= {"挖掘", "400升", "挖400条垃圾线"},
['drought_n']= {"干旱", "100升", "没有工装"},
['drought_l']= {"干旱+", "100升", "搞什么呀"},
['stack_e']= {"堆栈", "容易", "打包!"},
['stack_h']= {"堆栈", "硬的", "打包!"},
['stack_u']= {"堆栈", "终极", "打包!"},
['marathon_n']= {"马拉松赛跑", "正常", "200线加速马拉松"},
['marathon_h']= {"马拉松赛跑", "硬的", "200线高速马拉松"},
['solo_e']= {"战争", "容易", "打败AI"},
@@ -705,9 +702,6 @@ return{
['master_final']= {"主人", "最终", "20G及以上"},
['master_ph']= {"主人", "幻觉", ""},
['master_ex']= {"大师", "额外的", "比瞬间还短的永恒"},
['rhythm_e']= {"节奏", "容易", "200线低节奏马拉松"},
['rhythm_h']= {"节奏", "硬的", "200线中等节奏马拉松"},
['rhythm_u']= {"节奏", "终极", "200线高节奏马拉松"},
['blind_e']= {"看不见的", "一半", "对于新手来说"},
['blind_n']= {"看不见的", "全部", "对于中间产品"},
['blind_h']= {"看不见的", "突然", "对于有经验的人"},
@@ -753,10 +747,12 @@ return{
['backfire_l']= {"适得其反", "疯子", "挡住回火的垃圾管道"},
['backfire_u']= {"适得其反", "终极", "挡住回火的垃圾管道"},
['sprintAtk']= {"冲刺", "100次攻击", "发送100行"},
['sprintEff']= {"竞速", "效率", "在40行内发动更多攻击"},
['zen']= {"禅宗", "200", "没有时间限制的200线跑步"},
['ultra']= {"Ultra", "额外", "2分钟的得分进攻"},
['infinite']= {"无限", "", "这只是一个沙箱"},
['infinite_dig']= {"无限:挖掘", "", "挖,挖,挖"},
['marathon_inf']= {"马拉松", "无尽", "无尽马拉松"},
['custom_clear']= {"习俗", "正常"} ,
['custom_puzzle']= {"习俗", "令人费解的"},

View File

@@ -317,7 +317,7 @@ return{
net_game={
ready="準備",
spectate="觀賽",
cancel="取消",
cancel="取消準備",
},
setting_game={
title="遊戲設置",
@@ -681,9 +681,6 @@ return{
['dig_400l']= {"挖掘", "400L", "挖掘400行"},
['drought_n']= {"乾旱", "100L", "你I沒了"},
['drought_l']= {"乾旱+", "100L", "後 媽 發 牌"},
['stack_e']= {"堆疊", "簡單", "搭積木"},
['stack_h']= {"堆疊", "困難", "搭積木"},
['stack_u']= {"堆疊", "極限", "搭積木"},
['marathon_n']= {"馬拉松", "普通", "200行加速馬拉松"},
['marathon_h']= {"馬拉松", "困難", "200行高速馬拉松"},
['solo_e']= {"單挑", "簡單", "打敗AI"},
@@ -708,9 +705,6 @@ return{
['master_final']= {"大師", "究極", "究極20G:無法觸及的終點"},
['master_ph']= {"大師", "虛幻", "虛幻20G:"},
['master_ex']= {"宗師", "EX", "成為方塊大師"},
['rhythm_e']= {"節奏", "簡單", "200行低速節奏馬拉松"},
['rhythm_h']= {"節奏", "困難", "200行中速節奏馬拉松"},
['rhythm_u']= {"節奏", "極限", "200行高速節奏馬拉松"},
['blind_e']= {"隱形", "半隱", "不強大腦"},
['blind_n']= {"隱形", "全隱", "挺強大腦"},
['blind_h']= {"隱形", "瞬隱", "很強大腦"},
@@ -756,10 +750,12 @@ return{
['backfire_l']= {"Backfire", "瘋狂", "打出100攻擊"},
['backfire_u']= {"Backfire", "極限", "打出100攻擊"},
['sprintAtk']= {"競速", "100攻擊", "打出100攻擊"},
['sprintEff']= {"競速", "效率", "40行內打出更高的攻擊"},
['zen']= {"", "200行", "不限時200行"},
['ultra']= {"限時打分", "挑戰", "在兩分鐘內盡可能拿到最多的分數"},
['infinite']= {"無盡", "", "沙盒"},
['infinite_dig']= {"無盡:挖掘", "", "挖呀挖呀挖"},
['marathon_inf']= {"馬拉松", "無盡", "無盡馬拉松"},
['custom_clear']= {"自定義", "普通"},
['custom_puzzle']= {"自定義", "拼圖"},

22
parts/line.lua Normal file
View File

@@ -0,0 +1,22 @@
local LINE={}
local L={}--Storage
local len=0--Length
function LINE.new(val,isGarbage)
if len==0 then
for i=1,10 do
L[i]={0,0,0,0,0,0,0,0,0,0,garbage=false}
end
len=len+10
end
local t=L[len]
for i=1,10 do t[i]=val end
t.garbage=isGarbage==true
L[len]=nil
len=len-1
return t
end
function LINE.discard(t)
len=len+1
L[len]=t
end
return LINE

View File

@@ -1,27 +1,23 @@
return{
{name='sprint_10l', x=0, y=0, size=40,shape=1,icon="sprint1", unlock={'sprint_20l','sprint_40l'}},
{name='sprint_20l', x=-200, y=200, size=50,shape=1,icon="sprint1"},
{name='sprint_40l', x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={'dig_10l','sprint_100l','marathon_n','sprintPenta','sprintMPH','stack_e'}},
{name='sprint_40l', x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={'dig_10l','sprint_100l','marathon_n','sprintPenta','sprintMPH'}},
{name='sprint_100l', x=-200, y=0, size=50,shape=1,icon="sprint2", unlock={'sprint_400l','drought_n'}},
{name='sprint_400l', x=-400, y=0, size=40,shape=1,icon="sprint3", unlock={'sprint_1000l'}},
{name='sprint_1000l', x=-600, y=0, size=40,shape=1,icon="sprint3"},
{name='sprintPenta', x=210, y=-150, size=40,shape=3,icon="sprint2"},
{name='sprintMPH', x=210, y=-330, size=40,shape=3,icon="sprint2"},
{name='sprintPenta', x=180, y=-160, size=40,shape=3,icon="sprint2"},
{name='sprintMPH', x=220, y=-340, size=40,shape=3,icon="sprint2"},
{name='drought_n', x=-400, y=200, size=40,shape=1,icon="drought", unlock={'drought_l'}},
{name='drought_l', x=-600, y=200, size=40,shape=1,icon="drought"},
{name='stack_e', x=-200, y=-400, size=40,shape=1,icon="mess", unlock={'stack_h'}},
{name='stack_h', x=-400, y=-400, size=40,shape=1,icon="mess", unlock={'stack_u'}},
{name='stack_u', x=-600, y=-400, size=40,shape=1,icon="mess"},
{name='dig_10l', x=-200, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_40l'}},
{name='dig_40l', x=-400, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_100l'}},
{name='dig_100l', x=-600, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_400l'}},
{name='dig_400l', x=-800, y=-200, size=40,shape=1,icon="dig_sprint"},
{name='marathon_n', x=0, y=-600, size=60,shape=1,icon="marathon", unlock={'marathon_h','rhythm_e','solo_e','round_e','blind_e','classic_e','survivor_e','bigbang','zen'}},
{name='marathon_n', x=0, y=-600, size=60,shape=1,icon="marathon", unlock={'marathon_h','solo_e','round_e','blind_e','classic_e','survivor_e','bigbang','zen'}},
{name='marathon_h', x=0, y=-800, size=50,shape=1,icon="marathon", unlock={'master_n'}},
{name='solo_e', x=-600, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_n'}},
@@ -50,10 +46,6 @@ return{
{name='master_ph', x=-150, y=-1500, size=40,shape=2,icon="master"},
{name='master_ex', x=150, y=-1500, size=40,shape=2,icon="master_ex"},
{name='rhythm_e', x=-350, y=-1000, size=40,shape=1,icon="rhythm", unlock={'rhythm_h'}},
{name='rhythm_h', x=-350, y=-1200, size=40,shape=3,icon="rhythm", unlock={'rhythm_u'}},
{name='rhythm_u', x=-350, y=-1400, size=40,shape=2,icon="rhythm"},
{name='blind_e', x=150, y=-700, size=40,shape=1,icon="hidden", unlock={'blind_n'}},
{name='blind_n', x=150, y=-800, size=40,shape=1,icon="hidden", unlock={'blind_h'}},
{name='blind_h', x=150, y=-900, size=35,shape=1,icon="hidden", unlock={'blind_l'}},
@@ -61,9 +53,9 @@ return{
{name='blind_u', x=150, y=-1100, size=30,shape=3,icon="hidden", unlock={'blind_wtf'}},
{name='blind_wtf', x=150, y=-1200, size=25,shape=2,icon="hidden"},
{name='classic_e', x=-150, y=-850, size=40,shape=1,icon="classic", unlock={'classic_h'}},
{name='classic_h', x=-150, y=-970, size=35,shape=2,icon="classic", unlock={'classic_u'}},
{name='classic_u', x=-150, y=-1090, size=30,shape=2,icon="classic"},
{name='classic_e', x=-170, y=-850, size=40,shape=1,icon="classic", unlock={'classic_h'}},
{name='classic_h', x=-180, y=-1000, size=35,shape=2,icon="classic", unlock={'classic_u'}},
{name='classic_u', x=-190, y=-1150, size=30,shape=2,icon="classic"},
{name='survivor_e', x=300, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_n'}},
{name='survivor_n', x=500, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_h','attacker_h','defender_n','dig_h'}},
@@ -92,7 +84,9 @@ return{
{name='pc_l', x=1100, y=-110, size=40,shape=3,icon="pc"},
{name='pc_inf', x=1100, y=-250, size=40,shape=2,icon="pc"},
{name='sprintAtk', x=500, y=-150, size=40,shape=1,icon="sprint2", unlock={'tech_n','tech_finesse','tsd_e','backfire_n'}},
{name='sprintAtk', x=530, y=-150, size=40,shape=1,icon="sprint2", unlock={'sprintEff','tech_n','tech_finesse','tsd_e','backfire_n'}},
{name='sprintEff', x=360, y=-150, size=40,shape=1,icon="sprint2"},
{name='tech_n', x=400, y=50, size=40,shape=1,icon="tech", unlock={'tech_n_plus','tech_h'}},
{name='tech_n_plus', x=200, y=20, size=40,shape=3,icon="tech"},
@@ -113,8 +107,9 @@ return{
{name='backfire_l', x=1050, y=350, size=40,shape=3,icon="backfire", unlock={'backfire_u'}},
{name='backfire_u', x=1250, y=350, size=35,shape=2,icon="backfire"},
{name='zen', x=-800, y=-600, size=40,shape=1,icon="zen", unlock={'ultra','infinite','infinite_dig'}},
{name='ultra', x=-1000, y=-600, size=40,shape=1,icon="ultra"},
{name='infinite', x=-1000, y=-400, size=40,shape=1,icon='infinite'},
{name='infinite_dig', x=-800, y=-400, size=40,shape=1,icon="dig"},
{name='zen', x=-1000, y=-600, size=40,shape=1,icon="zen", unlock={'ultra','infinite','infinite_dig','marathon_inf'}},
{name='ultra', x=-1200, y=-600, size=40,shape=1,icon="ultra"},
{name='infinite', x=-1200, y=-400, size=40,shape=1,icon='infinite'},
{name='infinite_dig', x=-1000, y=-400, size=40,shape=1,icon="dig"},
{name='marathon_inf', x=-800, y=-400, size=40,shape=1,icon="marathon"}
}

View File

@@ -1,5 +1,4 @@
return{
color=COLOR.magenta,
env={
drop=30,lock=60,
fall=12,

View File

@@ -1,5 +1,4 @@
return{
color=COLOR.lYellow,
env={
drop=5,lock=60,
fall=8,

View File

@@ -1,11 +1,10 @@
return{
color=COLOR.magenta,
env={
drop=10,lock=60,
freshLimit=15,
dropPiece={
require'parts.eventsets.backfire_60'.dropPiece,
require'parts.eventsets.checkAttack_100'.dropPiece,
hook_drop={
require'parts.eventsets.backfire_60'.hook_drop,
require'parts.eventsets.checkAttack_100'.hook_drop,
},
mesDisp=function(P)
setFont(60)

View File

@@ -1,11 +1,10 @@
return{
color=COLOR.red,
env={
drop=5,lock=45,
freshLimit=15,
dropPiece={
require'parts.eventsets.backfire_30'.dropPiece,
require'parts.eventsets.checkAttack_100'.dropPiece,
hook_drop={
require'parts.eventsets.backfire_30'.hook_drop,
require'parts.eventsets.checkAttack_100'.hook_drop,
},
mesDisp=function(P)
setFont(60)

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