Compare commits

..

244 Commits

Author SHA1 Message Date
ParticleG
63da1b5585 - Add logs to upload-artifact 2021-11-08 04:37:22 +08:00
ParticleG
929be4faf0 - Test Windows with curl 2021-11-08 04:11:04 +08:00
MrZ626
59a5b52993 整理代码 2021-11-08 03:08:42 +08:00
ParticleG
c412e07153 - Add Upload Action 2021-11-08 02:48:38 +08:00
MrZ626
252f19c6df 进入newRoom菜单时不会试图修改背景和bgm 2021-11-07 22:09:22 +08:00
MrZ626
8264fdd4bf 修改更新历史和build号 2021-11-07 21:27:39 +08:00
MrZ626
dfd28f2f10 只在更新后触发自动转换以旧版本模式名存储的数据文件 2021-11-07 21:19:49 +08:00
MrZ626
5fc1257e58 颜色表改用hsv生成 2021-11-07 17:44:17 +08:00
MrZ626
5c39765f71 微调词典
微调两个小程序
整理代码
2021-11-07 17:44:13 +08:00
MrZ626
ca92622d5d 微调中文词典两个词条 2021-11-07 12:28:26 +08:00
MrZ626
e28902bc97 无尽马拉松的are每300行减小一次,line are每100行减小一次 2021-11-07 05:42:03 +08:00
MrZ626
d228809a53 无尽马拉松添加1700行的终点 2021-11-07 05:28:08 +08:00
MrZ626
60f8a22dd5 微调排行榜字体大小 2021-11-07 05:20:58 +08:00
MrZ626
db4ae56990 无尽马拉松添加排行榜 2021-11-07 05:19:12 +08:00
MrZ626
e95288b171 修改更新历史
整理代码
2021-11-07 05:00:41 +08:00
MrZ626
2511555eb0 调整无尽马拉松的难度曲线 2021-11-07 04:58:37 +08:00
Not-A-Normal-Robot
4c4f01cb95 Decrease lock delay when level up above lvl20 2021-11-07 04:55:02 +08:00
Not-A-Normal-Robot
7177118f34 Added Infinite Marathon 2021-11-07 04:55:02 +08:00
MrZ626
a6d5c4a1bf 修改更新历史 2021-11-07 04:02:40 +08:00
MrZ626
73a828d73a 修改mph模式的bgm 2021-11-07 04:02:22 +08:00
MrZ626
a7df4d6aa7 新模式:竞速-效率 2021-11-07 04:02:12 +08:00
MrZ626
7fe4802887 修复超级消除结算时分数计算变量写错导致报错 2021-11-07 01:49:19 +08:00
MrZ626
7eac341b9a move音效在方块因重力或旋转触地时也会播放,而不只是移动后
move音效名改为touch
2021-11-07 01:41:29 +08:00
MrZ626
1fa02a18b2 修改更新历史 2021-11-06 20:57:30 +08:00
MrZ626
b15cb64681 修正pr的一个符号错误 2021-11-06 20:53:45 +08:00
C₂₉H₂₅N₃O₅
bf345c8655 Changed the font and CN tips (#433)
* 补全英文词典翻译

* 大改字体

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

* 微调中文tips

* 更新 Legals

* 修正一个语法错误
2021-11-06 19:10:44 +08:00
C₂₉H₂₅N₃O₅
cbdb15d658 补全英文词典翻译 (#431) 2021-11-06 04:21:44 +08:00
MrZ626
8b4504bfa0 新BGM:1989(用于几个经典模式)
重新安排一些模式的BGM
2021-11-06 04:05:08 +08:00
MrZ626
111790fdab 修正自动打包没有把legals.md和license.txt文件放进去 2021-11-06 03:27:09 +08:00
MrZ626
bec03de7b8 纠正几个错别字 2021-11-06 00:50:12 +08:00
MrZ626
f5dfae3a6c 词典新增deepdrop词条 2021-11-06 00:40:04 +08:00
MrZ626
d3dec2b5f1 更新版本号为0.17.0,追加更新历史 2021-11-06 00:39:50 +08:00
MrZ626
f083136998 整理代码 2021-11-05 11:02:45 +08:00
MrZ626
cd3d0b370c 修改一些词典词条 2021-11-05 10:36:49 +08:00
MrZ626
f4c6632941 降低无旋转40L评级标准 2021-11-04 21:57:24 +08:00
MrZ626
750cb9a669 调整繁中一些用词
微调语言菜单按钮文本大小
2021-11-04 21:50:05 +08:00
C₂₉H₂₅N₃O₅
62a198a017 添加繁体中文语言, 语言切换界面变更颜色和布局 (#429) 2021-11-04 21:39:05 +08:00
MrZ626
5780ba0f3e 词典other分类改为org并移到开始的help版块后
词典新增一个词条等待翻译
2021-11-04 19:40:42 +08:00
ParticleG
86edeb1e0c - Fix wrong upload file suffix 2021-11-04 16:12:48 +08:00
Particle_G
53b1852f28 Rel ios test (#427)
* - Test Release note

* - Test ios changelog

* - Finish touching
2021-11-04 04:01:12 +08:00
MrZ626
e3c385693b 修改更新历史和build号 2021-11-03 19:45:23 +08:00
MrZ626
572c0fbfa1 调整方块朝向菜单彩蛋模式进入方式 2021-11-03 19:43:36 +08:00
MrZ626
bbdf71167a 调整录像回放菜单按钮尺寸 2021-11-03 19:14:43 +08:00
MrZ626
2136ccd9a2 更新词典中的一些玩家信息 2021-11-03 15:46:46 +08:00
MrZ626
2131aea575 玩家类添加一个目标线绘制函数
堆叠模式添加需要填满的高度线
2021-11-03 15:41:13 +08:00
MrZ626
32b21c7d29 修改更新历史 2021-11-03 13:37:58 +08:00
MrZ626
8f6f6f316f 微调倒计时动画 2021-11-03 13:33:44 +08:00
MrZ626
66f9ac2791 修复无尽挖掘开局垃圾行可能会在同一列 2021-11-03 13:21:51 +08:00
MrZ626
ac0ba90438 修复wing背景颜色配置问题 2021-11-03 13:21:37 +08:00
MrZ626
990659ce91 修改更新历史和build号 2021-11-03 02:42:38 +08:00
MrZ626
00c602c844 再调整超级消除音效
调整launchpad
2021-11-03 02:40:21 +08:00
MrZ626
9db62ffc39 调整堆叠模式平衡 2021-11-03 02:33:31 +08:00
MrZ626
e7c777e502 超级消除有分数了
再调整超级消除的声音
2021-11-02 22:17:44 +08:00
MrZ626
4991e8cea2 优化堆叠模式体验,微调难度和评级 2021-11-02 20:15:23 +08:00
MrZ626
111d4e991f 微调单次超大消除相关的文本和效果 2021-11-02 19:37:50 +08:00
MrZ626
bedfa74a32 整理代码 2021-11-02 19:34:46 +08:00
MrZ626
f6944dc223 微调test模块 2021-11-02 17:39:23 +08:00
MrZ626
a34a3051a3 Merge remote-tracking branch 'tech/ci-autotest' into HEAD 2021-11-02 17:39:13 +08:00
MrZ626
0e13883faf 修改更新历史和build号 2021-11-02 17:21:36 +08:00
MrZ626
e8860eda1b 消除超过6行时部分语言会小字显示消的行数 2021-11-02 17:21:36 +08:00
MrZ626
33ba4820b3 音效室补充消除音效 2021-11-02 17:21:36 +08:00
MrZ626
5ed0dda8ab 修改一处中文语言里的BGM忘了改 2021-11-02 17:21:36 +08:00
MrZ626
bd260b2c6f 消除所有填满行的函数整理为玩家类的clearFilledLines方法
添加消7~20和20+的消除文本与消除音效
播放消n音效打包为函数移至gameFuncs文件
2021-11-02 17:21:36 +08:00
MrZ626
aa01ab07f7 英文词典补充一条翻译
Co-authored-by: C29H25N3O5 <a1228465111@163.com>
2021-11-02 17:21:35 +08:00
MrZ626
684cb90a7d 修改堆叠模式玩法(自动清除之前记录)
修改更新历史和build号
2021-11-02 03:38:43 +08:00
MrZ626
172101ed55 整理玩家类代码,再分离出一个方法 2021-11-02 02:27:08 +08:00
MrZ626
98b5914726 移除机翻语言的tips 2021-11-02 02:15:34 +08:00
MrZ626
d1518e7ba4 词典新增研究群下属mew词条 2021-11-02 00:31:43 +08:00
MrZ626
72d4faa52a 微调进控制台音效力度 2021-11-01 21:56:57 +08:00
MrZ626
862dcbf806 准备&开始音效改为函数整理到gameFuncs文件里
launchpad可以执行任意函数,添加准备-开始音效
2021-11-01 20:30:04 +08:00
MrZ626
3db28f5136 再修正ci替换版本号的问题 2021-11-01 17:33:42 +08:00
MrZ626
f9e37f3c6a 修正ci替换版本号的小问题 2021-11-01 17:24:47 +08:00
MrZ626
457681e6ec 中英tips调整 2021-11-01 16:26:34 +08:00
MrZ626
904bcf6852 版本号改为0.16.4,移除@DEV标记(需要测试) 2021-11-01 15:52:23 +08:00
MrZ626
e21e57ff84 添加tip命令方便看tips 2021-11-01 14:51:40 +08:00
MrZ626
562a69831a 给中英tip排序 2021-11-01 14:32:26 +08:00
C29H25N3O5
706a683540 修正标点, .gitignore添加几个文件类型 2021-11-01 14:13:08 +08:00
C29H25N3O5
8e2aee5e84 再改语言文件 2021-11-01 14:13:08 +08:00
Trebor-Huang
c009893377 New part in Zframework 2021-11-01 10:14:09 +08:00
Trebor-Huang
3ae128d4c3 Revert init.lua 2021-11-01 10:00:39 +08:00
Trebor-Huang
cb2164c21d Fix string bug 2021-11-01 09:57:12 +08:00
Trebor-Huang
951b7407fc Keep up the pace 2021-11-01 09:52:41 +08:00
MrZ626
f68facbe0e 检测到启动参数有--test时启动测试脚本(需要更多测试)
Co-authored-by: Trebor Huang <41145779+Trebor-Huang@users.noreply.github.com>
2021-11-01 03:41:19 +08:00
MrZ626
5535366bb1 TASK模块创建任务第一次执行的时候也用assert保证错误被捕捉 2021-11-01 03:23:00 +08:00
Imple Lee
d75b709f23 Move Python code from updateVersion.py into action.ymls directly (#423)
* test python3

* try use `python` instead of `python3`

* use `update-version` everywhere

* fix variable injection

* fix python2vs3

* move `updateVersion.py` into action files
2021-11-01 02:12:32 +08:00
Trebor Huang
5a1fd0ca4d Correct semantic merge 2021-11-01 01:43:05 +08:00
Trebor Huang
f4b85e0dbb Merge branch 'main' into ci-autotest 2021-10-31 23:51:40 +08:00
Trebor-Huang
c38bceb87e Yay it works 2021-10-31 23:38:15 +08:00
Trebor-Huang
2569e8844e Test dummy failure 2021-10-31 23:36:44 +08:00
Trebor-Huang
e42fa8351e Can't get xvfb to return the correct value? 2021-10-31 23:35:12 +08:00
Trebor-Huang
9582a625ff Add shell 2021-10-31 23:20:33 +08:00
Trebor-Huang
81abb06f7b Add shell 2021-10-31 23:19:04 +08:00
Trebor-Huang
7cfea0eebe Try using composite 2021-10-31 23:15:57 +08:00
Trebor-Huang
01c2bfe955 Remove uneccesary needs 2021-10-31 22:51:12 +08:00
Trebor-Huang
70242e6a07 Add some more utils 2021-10-31 21:23:54 +08:00
Trebor-Huang
c1edba974f Maybe update first 2021-10-31 20:47:23 +08:00
Trebor-Huang
546b3f230d Prepare PulseAudio 2021-10-31 20:45:23 +08:00
Trebor-Huang
14593eb487 Okay ubuntu doesn't allow gui either 2021-10-31 20:27:03 +08:00
Trebor-Huang
838621a3ae Try without xvfb first 2021-10-31 20:23:34 +08:00
Trebor-Huang
283d4a5fce Test xvfb 2021-10-31 20:04:54 +08:00
Trebor-Huang
490cf44132 Change iOS ci condition 2021-10-31 19:41:36 +08:00
Trebor-Huang
9dcbd86fc3 Implement auto test 2021-10-31 19:03:05 +08:00
MrZ626
0a15011ec7 修复模式目录下非完整模式文件也会被当成模式加载 2021-10-31 02:03:54 +08:00
ParticleG
f7dfe1d869 - Re-enable other workflows 2021-10-31 00:39:54 +08:00
ParticleG
5e9c9cb5fa - Try use discordrb 2021-10-31 00:39:52 +08:00
MrZ626
c485c26c93 修改更新历史和build号 2021-10-31 00:34:49 +08:00
MrZ626
137d9296cd 移除一个TODO的注释 2021-10-30 15:57:34 +08:00
MrZ626
11b144da74 词典场景按键也会自动开始输入 2021-10-30 15:36:56 +08:00
MrZ626
25ef9d9886 再调整中英两个词典 2021-10-30 15:02:11 +08:00
MrZ626
0e1e279209 游戏界面布局微调:录像播放时单独一套;模式名文本太长的时候会横向压缩 2021-10-30 14:48:19 +08:00
C29H25N3O5
a960897a83 字体加几个新的 Unicode 字符 2021-10-30 14:33:03 +08:00
C29H25N3O5
69ab7849c5 英文词典补完 2021-10-30 14:33:03 +08:00
MrZ626
bc55c3d892 中文词典添加are和line are两个词条,英文词典添加几个todo 2021-10-29 16:01:42 +08:00
MrZ626
cee1c41c35 修改更新历史和build号 2021-10-29 02:24:34 +08:00
MrZ626
6c5fe2463e 微调评级图标颜色 2021-10-29 02:24:15 +08:00
MrZ626
880ce376b3 next槽上方会显示序列模式的标记 2021-10-29 02:07:24 +08:00
MrZ626
5a8b573bb7 修正SFX播放采样低了两个半音 2021-10-29 01:01:54 +08:00
C₂₉H₂₅N₃O₅
ab1e750fa4 微调 yygq 文本 (#419) 2021-10-28 23:56:36 +08:00
MrZ626
f6f4e1cd1a 游戏设置菜单按钮颜色根据平台引导 2021-10-28 15:04:00 +08:00
MrZ626
2a9549b106 自定义场地消行按钮可以消除20行以上的部分
移除测试用代码
2021-10-28 14:49:13 +08:00
MrZ626
1ed7ee3952 整理代码 2021-10-28 14:34:28 +08:00
MrZ626
a69fc35f5a 修改TRS的JL踢墙表的0-R和R-0最后几项 2021-10-28 12:08:38 +08:00
MrZ626
28e83dcf02 词典两个按钮改为图标 2021-10-28 02:34:57 +08:00
MrZ626
8c6df74237 计算器可以弹琴了 2021-10-28 02:34:57 +08:00
C₂₉H₂₅N₃O₅
d86cd6a8c6 Updated English Zintionary and legals.md (#417)
* 更改词典, 调整苹果设备基线不对的问题

* 微调字体

* 添加复制符号, 可用于词典

* 添加新符号定义

* 更新词典和 legals

* 再更新 legals

* Update legals.md

Co-authored-by: MrZ_26 <1046101471@qq.com>
2021-10-28 02:18:42 +08:00
ParticleG
c40d411d63 - Finished touching 2021-10-27 17:14:42 +08:00
C₂₉H₂₅N₃O₅
aca63abf49 Multiple Enhancements (See Comments) (#415)
* 更改词典, 调整苹果设备基线不对的问题

* 微调字体

* 添加复制符号, 可用于词典

* 添加新符号定义

Co-authored-by: MrZ_26 <1046101471@qq.com>
2021-10-27 13:17:36 +08:00
MrZ626
4733615c4b 中文词典添加欠债词条
修正一处小错误
2021-10-27 13:11:57 +08:00
MrZ626
80e5469653 修复第二次进词典就爆炸 2021-10-27 02:18:39 +08:00
MrZ626
4ea2cb18c7 整理代码,修复应用语言加载TEXTOBJ时有个特殊的文本对象会弹出警告 2021-10-27 01:21:15 +08:00
MrZ626
840be65198 修改ios退出提示文本 2021-10-27 01:14:52 +08:00
MrZ626
5a568df6cd 控件名字符串改用单引号 2021-10-27 01:03:15 +08:00
MrZ626
cf57161174 移除语言模块里有个默认返回按钮文本 2021-10-26 20:55:18 +08:00
MrZ626
7847e72f63 语言文件真正缺失文本时不会蓝屏了 2021-10-26 20:54:41 +08:00
MrZ626
00999426b9 关闭主页机器人追帧,防止挂后台回来后失去同步 2021-10-26 16:33:19 +08:00
MrZ626
188da8b6ff 修改更新历史和build号 2021-10-26 14:21:27 +08:00
MrZ626
59182b0ec8 第一帧启动时间可以通过控制台log命令查看 2021-10-26 14:17:25 +08:00
MrZ626
6ced935c22 修正log模块时间格式不好 2021-10-26 14:16:52 +08:00
MrZ626
ad50475bb6 修正计算器键盘不能输入乘号和符号e不能正常工作的问题 2021-10-26 13:54:00 +08:00
MrZ626
9c40f4918c 修正uttt小程序触屏不响应 2021-10-26 11:26:12 +08:00
MrZ626
62c802d2c3 暂时取消存档导入时的版本限制 2021-10-26 11:12:33 +08:00
MrZ626
3294760f6d 中文语言标点修改 2021-10-26 11:04:22 +08:00
MrZ626
85d72a1ee5 再微调wing背景 2021-10-26 11:04:21 +08:00
C29H25N3O5
e02bb0f23c Multiple Enhancements (See comment) (#413)
* 更改wings背景, 看起来更像翅膀

* 规范中文标点(顺便改不对的tips)

* 字体添加缺少的几个拼音字母
2021-10-26 11:04:21 +08:00
MrZ626
b0465775dc fix ios subversion 2021-10-26 02:15:43 +08:00
Particle_G
bd4b28e052 Rel ci test (#412)
* - Test iOS release

* - Fix wrong grammar

* - Try release CI

* - Modify window size

* - Try with discord webhook

* - Finish test
2021-10-26 01:33:50 +08:00
Trebor Huang
c6c5c849b4 Dmg ameliorate (#408)
* Add `dmg` background

* Eyeball coordinates

* Add dmg icon

* Delete dmg-background.png

* Change background

* Change resources

* Fix line break

* 词典的命令行词条补充一些

* 屏蔽词典敏感词
词典场景代码简化(无需性能场景,更易读)

* Update dict_en.lua (#410)

I've personally never seen the game being referred to as Tetris Tour. In most places, including Tetris.com, it's referred to as Tetris Journey; TapTap once referred to it as Tetris Adventure.

* 修复生成AI玩家时没刷新20G开关

* 再减少一点框架依赖

* 修改BGM模块的初始化log
简单统计启动第一帧各个阶段加载时间

* 修改更新历史和build号

* - Testing CI

* - Change CI name

* - Update badge

* - Pass version number to fastlane

* - Modify build number

* - Try more dots

* - Add send email support

* - Give up using email to notify

* -  Only test macos

* - Skip sign and notarize

* - Change position

* - Modify window size

* - Slighty move icons

* - Re-enables other stuffs

Co-authored-by: MrZ626 <1046101471@qq.com>
Co-authored-by: user670 <22617255+user670@users.noreply.github.com>
Co-authored-by: ParticleG <particle_g@outlook.com>
2021-10-25 21:06:11 +08:00
MrZ_26
cc5c3db1c1 Merge pull request #411 from 26F-Studio/pre-ci-test
iOS Testing workflow
2021-10-25 16:57:19 +08:00
MrZ626
f60236f06e 修改更新历史和build号 2021-10-25 16:19:59 +08:00
MrZ626
bd63584207 修改BGM模块的初始化log
简单统计启动第一帧各个阶段加载时间
2021-10-25 16:00:56 +08:00
ParticleG
e5fd3f6c9f - Give up using email to notify 2021-10-25 15:58:03 +08:00
MrZ626
423173413f 再减少一点框架依赖 2021-10-25 15:45:20 +08:00
MrZ626
a136d01da5 修复生成AI玩家时没刷新20G开关 2021-10-25 15:37:20 +08:00
user670
8ab675baf0 Update dict_en.lua (#410)
I've personally never seen the game being referred to as Tetris Tour. In most places, including Tetris.com, it's referred to as Tetris Journey; TapTap once referred to it as Tetris Adventure.
2021-10-25 15:23:29 +08:00
ParticleG
8d8e537cd4 - Add send email support 2021-10-25 14:15:48 +08:00
MrZ626
d3b117a23f 屏蔽词典敏感词
词典场景代码简化(无需性能场景,更易读)
2021-10-25 13:01:34 +08:00
MrZ626
007982c481 词典的命令行词条补充一些 2021-10-25 11:19:37 +08:00
MrZ626
ff9b0abfc7 两个manual文件改为txt格式
说明书和法律信息场景找不到文件不会爆炸了
2021-10-25 05:09:32 +08:00
MrZ626
275e983f55 错误场景的退出按钮改为直接强制退出游戏 2021-10-25 05:02:46 +08:00
MrZ626
bccb0b9976 添加legals页面 2021-10-25 04:57:29 +08:00
MrZ626
d5f01537f8 iOS设备不显示收款码 2021-10-25 04:56:47 +08:00
MrZ626
6029363af8 微调launchpad的ui 2021-10-25 04:31:33 +08:00
MrZ626
cde61a57b8 修正两个词典的格式问题 2021-10-25 04:31:33 +08:00
C29H25N3O5
2fc1768a7a 更新词典和 legals (#407) 2021-10-25 04:28:46 +08:00
ParticleG
50d73bcc1e - Try more dots 2021-10-25 00:28:41 +08:00
ParticleG
0f570be7e5 - Modify build number 2021-10-24 23:54:16 +08:00
ParticleG
658e6f7fdd - Pass version number to fastlane 2021-10-24 22:06:30 +08:00
MrZ626
d651932d9a 修改更新历史和build号 2021-10-24 21:52:46 +08:00
ParticleG
6167c9f317 - Update badge 2021-10-24 20:45:45 +08:00
ParticleG
33acf06a71 - Change CI name 2021-10-24 20:19:18 +08:00
ParticleG
9833e759cc - Testing CI 2021-10-24 20:15:43 +08:00
ParticleG
918bb09d54 - Update CI badge 2021-10-24 19:38:10 +08:00
MrZ_26
9a0a396872 Merge pull request #406 from 26F-Studio/ci-dmg
CI functionality for iOS and macOS
2021-10-24 19:09:13 +08:00
MrZ626
6c6dc654e6 修正一处容易歧义的设置文本 2021-10-24 17:30:54 +08:00
MrZ626
00c0cc3d9e 修正之前不小心把电脑隐藏翻页按钮删了没改回去 2021-10-24 17:14:58 +08:00
MrZ626
0eb0fd3311 中文词典添加新词条
整理部分标点
2021-10-24 17:14:40 +08:00
ParticleG
4e3823616d - Update variables 2021-10-24 16:06:23 +08:00
ParticleG
7450bae6d2 [no ci] Rearrange names and descriptions 2021-10-24 15:37:33 +08:00
ParticleG
a2ddaf5341 [no ci] Modify variable names 2021-10-24 15:00:06 +08:00
Trebor-Huang
b266a0ae57 Dubious Bundle ID 2021-10-24 13:18:07 +08:00
Trebor-Huang
ac9e649e02 Integration into current CI files 2021-10-24 13:06:29 +08:00
Trebor-Huang
506e1a4c1d Use *.dmg format to distribute on macOS
Pack up dmg files

Cooperate with fastlane config

Fix directory

Put off notarization

Diagnose dmg

Try notarize

Check notarize

Duh Fix

Better codesigning

Last try
2021-10-24 13:06:11 +08:00
YunyushuLiu
c9d74a4cdf Follow up macOS CI
- Update macOS CI to use flatlane

- Test macOS

- Use Github tokens

- Pass MATCH_PASSWORD

- Fix wrong path

- Update keychain file

- Change keychain path

- Update macOS release

- Triggered on release, not main

- Try notarize macOS app

- Triggered on test branch

- Triggered by release

- Rename lane names to avoid infinite recurse

- Init dev workflow

- Triggered by tags

- Rename workflow name

- Update workflows

- Allow all tags

- Fix on

- Add codesign options

- Add missing =

- Update options

- Test sign

- Fix options

- Update macOS template
- Use identifier

- Fix minor issues

- Try not notarize

- try not sign package

- Try sign without runtime option

- Try notarize without runtime option

- Use entitlements

- Add back runtime option

- Pack the whole directory to see what happened

- Chmod +x love

- Try with strict and print app info

- Change step order

- Break into two step

Zip first with `ditto`.

Push back zipping

Don't check the `zip` file

Stop zipping it over and over and over and over

Try zipping right
2021-10-24 13:05:51 +08:00
YunyushuLiu
0ff2e6e273 Implement iOS CI
- Update for multiple targets

- Fix wrong lane

- Update Dev CI

- Rename scheme

- Test ad-hoc

- Enable other runs

- Try use if

- Fix missing shell property

- Fix if

- Add change log support

- Update apple key

- Test Release

[no ci] fix grammar

- Release test

- Only test release

- New build

- Test rename in fastfile

- Move right ipa

- Finish touching
2021-10-24 13:05:35 +08:00
MrZ626
c4c6ab3130 删除ci中对不存在的document文件夹的操作 2021-10-24 04:46:51 +08:00
MrZ626
bc5b7638db 修改更新历史 2021-10-24 04:45:56 +08:00
MrZ626
2db147461c iOS设备震动函数改为输入1|2|3三档而不是时间(适配自改love,原版love都是固定振动)
框架不再使用不属于自己的SYSTEM的变量
2021-10-24 04:45:34 +08:00
MrZ626
716c44746b wing背景优化(水晶比例设计:C29H25N3O5) 2021-10-24 04:31:05 +08:00
MrZ626
0278a3ad47 miku语音小修正 2021-10-24 03:33:24 +08:00
MrZ626
3601047ffb 调整模式地图右下角区域 2021-10-24 03:05:56 +08:00
MrZ626
8013319c14 完善词典的复制按钮 2021-10-24 02:46:04 +08:00
MrZ626
b4f14bcb5b das介绍和设置指导词条拆成两段 2021-10-24 02:09:31 +08:00
MrZ626
406beab9d6 词典新增复制页面功能,方便查好发送给别人 2021-10-24 01:51:41 +08:00
MrZ626
58a8828503 赞助列表加一个人 2021-10-24 01:47:22 +08:00
MrZ626
fd563b732c 整理代码 2021-10-24 00:48:51 +08:00
MrZ626
30093f9db5 readme添加github维基页面 2021-10-22 19:56:50 +08:00
MrZ626
2f16c54cde legals文件放到根目录 2021-10-22 17:42:37 +08:00
MrZ626
bca7f2e19b 整理代码
修改更新历史
2021-10-22 16:56:42 +08:00
MrZ626
2696106f96 文档移至github的wiki功能 2021-10-22 16:54:58 +08:00
MrZ626
9f7692f91c skin模块升级 2021-10-22 16:09:56 +08:00
MrZ626
48b2ff5416 微调TRS的R块踢墙表 2021-10-22 16:06:05 +08:00
MrZ626
81104d7004 修改更新历史 2021-10-22 02:08:23 +08:00
MrZ626
b56103f247 新增简单等级图标组(暂时显示不出其他) 2021-10-22 01:47:58 +08:00
MrZ626
0923cf3acf 修改部分语言的id
修正原yygq语言词典是英文的问题
2021-10-21 23:58:11 +08:00
MrZ626
fffb7d0188 极简率评级改为灰色 2021-10-21 21:45:41 +08:00
MrZ626
f02124de0c 再调整准备开始音效 2021-10-21 21:39:47 +08:00
MrZ626
a1a77f291b 几个文件的中文标点换成全角 2021-10-21 20:52:26 +08:00
MrZ626
31bb7f62c6 移除打击垫的准备&开始音效 2021-10-21 20:20:25 +08:00
MrZ626
bfb5fc3f5e 游戏设置场景不再需要滚动 2021-10-21 16:37:16 +08:00
MrZ626
ac2e53adc7 修复“应用全屏”函数实际含义为反转全屏状态 2021-10-21 16:33:46 +08:00
MrZ626
46e8e161d0 修改版本号和更新历史 2021-10-21 15:51:51 +08:00
MrZ626
68e2255e1b 修改进控制台音效 2021-10-21 15:51:51 +08:00
MrZ626
222c1b5bba SFX.playSample支持同时播放多个采样(两种参数格式) 2021-10-21 15:51:51 +08:00
MrZ626
59c63da36f 整理代码
添加一个小工具函数
2021-10-21 15:51:51 +08:00
MrZ626
89fb7a7659 微调资源加载,整理代码,多一点点log 2021-10-21 15:51:50 +08:00
C29H25N3O5
ea02bc470a Added IPA Symbols and optimised CJK punctuations (#401)
* 增加控制器符号

* 增加新符号, 所有标点改成半角

* 剩余两个文档也都改成 Markdown 格式

* 字体新增基础 IPA 符号

* 增加 IPA 字符, 中文标点使用开明式
2021-10-21 13:54:23 +08:00
MrZ626
361dc576f3 准备-开始音效使用乐器采样 2021-10-21 02:53:51 +08:00
MrZ626
395ad907b8 添加三个简单乐器采样包并加载(之后用于替换部分音效) 2021-10-21 02:53:51 +08:00
MrZ626
bf5cdb1b99 SFX模块新增采样功能(初步)
添加loadSample和playSample方法
2021-10-21 02:53:50 +08:00
MrZ626
45f9c80888 重做连击音效
重新导出部分音效
2021-10-21 02:53:49 +08:00
Particle_G
b80a72785b Ci ios (#399)
*Bunch of ci-ios thing*

Co-authored-by: Imple Lee <80144331+ImpleLee@users.noreply.github.com>
Co-authored-by: Trebor-Huang <2300936257@qq.com>
Co-authored-by: Trebor Huang <41145779+Trebor-Huang@users.noreply.github.com>
Co-authored-by: YunyushuLiu <kunluntree@qq.com>
Co-authored-by: MrZ626 <1046101471@qq.com>
Co-authored-by: 梦飞翔 <1149761294@qq.com>
2021-10-21 02:49:29 +08:00
MrZ626
20ab916f9c SFX模块升级 2021-10-20 16:43:07 +08:00
MrZ626
76bfaa870e 控件模块不再依赖TABLE扩展模块 2021-10-20 16:18:04 +08:00
C29H25N3O5
10ed702c2e Changed the other two documents to markdown format (#396)
* 剩余两个文档也都改成 Markdown 格式
2021-10-20 13:09:48 +08:00
Particle_G
e236be7a62 Ci ios (#395)
* merge get-cc-url into get-version

* add `get-cc`

* remove `apt update`

* rename `get-version` -> `get-info`

* rm unnecessary file

* - Add support for ios
- Fix missing top folder for macos

* - Fix directory names

* - Fix with binary r/w

* iOS的plist文件先转换为明文

* add IOS

* 整合新action

* Finishing touch

* Update action.yml

* Test chmod

* - Xcode build test

* - Build with default keychain

* - Test iOS only

* - Use macos-11

* - Change keychain operations' sequence

* - Allow provisioning updates

* - Set build directory

* - Specify build path

* - Pack bare app

* - Add quiet option

* 测试:输出touchrelease位置

* - Test with ad hoc cert

* - Fix wrong variable

* - Use Release instead of Distribution

* - Chmod CCloader to add execute permission

* 继续测试ios触屏问题

* 继续测试ios触屏问题

* - Use macos latest
- Re-enable other runs

* - Sign CCloader after build

* - Remove redundant inputs in build.yml

* - Install test

* - Export test

* - install test

* - Try fastlane

* - Use builtin ruby

* - CI Test

* - Update python script to fix ios versioning

* - Use static lib

* - Test static cc

* - Fix locations

* Update readme.md

Co-authored-by: Imple Lee <80144331+ImpleLee@users.noreply.github.com>
Co-authored-by: Trebor-Huang <2300936257@qq.com>
Co-authored-by: Trebor Huang <41145779+Trebor-Huang@users.noreply.github.com>
Co-authored-by: YunyushuLiu <kunluntree@qq.com>
Co-authored-by: MrZ626 <1046101471@qq.com>
Co-authored-by: 梦飞翔 <1149761294@qq.com>
2021-10-20 13:07:51 +08:00
MrZ626
2fbd183322 整理代码
规范更多全局变量名
语音包/音效包列表声明放到main开头
2021-10-20 01:21:01 +08:00
MrZ626
14df29ce21 修正中文词典一处词条名错误 2021-10-19 19:22:12 +08:00
MrZ626
cb3d9e4862 整理代码 2021-10-19 19:19:12 +08:00
MrZ626
d9a82878bf 移除组合键切换攻击模式功能,固定为单点切换
微调游戏设置菜单
2021-10-19 19:00:02 +08:00
MrZ626
e484bef6df md语法翻新voice文档
Co-authored-by: C29H25N3O5 <87485746+C29H25N3O5@users.noreply.github.com>
2021-10-19 17:12:11 +08:00
MrZ626
c8d358cc64 新增两条中英tip 2021-10-19 00:01:18 +08:00
MrZ626
013765d5d2 touching变量移入SCN模块
修复iOS上经常卡掉第一个触摸导致后续不能和控件交互
2021-10-18 23:45:03 +08:00
MrZ626
ed2b07d5cf 自定义场地的按钮应用定制字体 2021-10-18 19:49:34 +08:00
C29H25N3O5
8d0780cef4 Added more symbols to the font and changed all the punctuations to half-width (#392)
* 增加控制器符号

* 增加新符号, 所有标点改成半角
2021-10-18 19:21:54 +08:00
MrZ626
2ba25014c6 utf8解码报错后会提示windows用户换一个游戏版本 2021-10-18 16:33:50 +08:00
MrZ626
033a770759 更多全局变量改为全大写 2021-10-18 15:12:56 +08:00
MrZ626
b7832c133a 微调代码规范变量名格式说明 2021-10-18 15:12:56 +08:00
MrZ626
93af618fa0 启动时会遍历所有模式文件补充不在地图上的模式 2021-10-18 15:05:35 +08:00
MrZ626
d4539c3a23 修改加载SHADER的时机 2021-10-18 15:05:35 +08:00
MrZ626
3d70a5ac79 检测资源文件是否来自工程的过程改为函数 2021-10-18 15:05:34 +08:00
Trebor Huang
f40b2f75bd Move help file to correct place 2021-10-18 02:16:41 +08:00
Trebor Huang
46a49050b9 Fix vulneribility 2021-10-18 02:00:26 +08:00
Imple Lee
fb4fd15687 fix release name in release.yml (#390) 2021-10-18 01:27:16 +08:00
MrZ626
f3e18de45f release note符合markdown语法,方便阅读 2021-10-18 00:28:12 +08:00
319 changed files with 5100 additions and 3288 deletions

View File

@@ -0,0 +1,24 @@
name: 'Automatic Test'
description: 'Check for obvious errors.'
runs:
using: "composite"
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/build-love
with:
file-path: Techmino.love
- name: Download love
shell: bash
run: |
curl -L https://github.com/love2d/love/releases/download/11.3/love-11.3-linux-x86_64.tar.gz | tar xz
- name: Prepare PulseAudio
shell: bash
run: |
sudo apt-get update
sudo apt-get install pulseaudio pulseaudio-utils pavucontrol alsa-oss alsa-utils -y
- name: Run automated test
uses: GabrielBB/xvfb-action@v1
with:
run: |
./dest/love Techmino.love --test

View File

@@ -3,7 +3,7 @@ description: 'build Android package'
inputs: inputs:
type: type:
required: true required: true
code: apkCode:
required: true required: true
name: name:
required: true required: true
@@ -59,11 +59,41 @@ runs:
shell: bash shell: bash
run: | run: |
7z a -tzip love-android/app/src/main/assets/game.love libAndroid 7z a -tzip love-android/app/src/main/assets/game.love libAndroid
- name: update Android information
shell: python
run: |
if '${{ inputs.type }}' == 'Release':
appName = 'Techmino'
packageName = 'org.love2d.MrZ.Techmino'
edition = 'release'
elif '${{ inputs.type }}' == 'Snapshot':
appName = 'Techmino_Snapshot'
packageName = 'org.love2d.MrZ.Techmino.Snapshot'
edition = 'snapshot'
with open('./love-android/app/src/main/AndroidManifest.xml', "r+", encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@appName', appName)\
.replace('@edition', edition)
file.seek(0)
file.truncate()
file.write(data)
with open("./love-android/app/build.gradle", "r+", encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@packageName', packageName)\
.replace('@versionCode', '${{ inputs.apkCode }}')\
.replace('@versionName', '${{ inputs.name }}')\
.replace('@storePassword', '${{ inputs.KEY_STORE_PASSWORD }}')\
.replace('@keyAlias', '${{ inputs.ALIAS }}')\
.replace('@keyPassword', '${{ inputs.KEY_PASSWORD }}')
file.seek(0)
file.truncate()
file.write(data)
- name: Build Techmino - name: Build Techmino
shell: bash shell: bash
run: | run: |
echo "${{ inputs.SIGNING_KEY }}" | base64 -d > love-android/app/android.keystore echo "${{ inputs.SIGNING_KEY }}" | base64 -d > love-android/app/android.keystore
python3 .github/workflows/updateVersion.py -T Android${{ inputs.type }} -C ${{ inputs.code }} -N ${{ inputs.name }} -S ${{ inputs.KEY_STORE_PASSWORD }} -A ${{ inputs.ALIAS }} -K ${{ inputs.KEY_PASSWORD }}
chmod 777 love-android/gradlew chmod 777 love-android/gradlew
cd love-android/ cd love-android/
./gradlew assembleRelease ./gradlew assembleRelease

96
.github/actions/build-ios/action.yml vendored Normal file
View File

@@ -0,0 +1,96 @@
name: 'build iOS'
description: 'build iOS package'
inputs:
name:
required: true
description: "Version name"
type:
required: true
description: "Build type"
APPLE_API_ID:
required: true
description: "API key ID"
APPLE_API_ISSUER:
required: true
description: "API issuer ID"
APPLE_API_KEY:
required: true
description: "API key content"
APPLE_APP_BUILD:
required: true
description: "Build number"
APPLE_APP_CHANGELOG:
required: true
description: "Changelog"
APPLE_APP_ID:
required: true
description: "AppStore Apple ID"
APPLE_APP_IDENTIFIER:
required: true
description: "Bundle ID"
APPLE_APP_PROFILE:
required: true
description: "Provisioning Profile specifer"
APPLE_KEYCHAIN_NAME:
required: true
description: "Temporary keychain name"
APPLE_KEYCHAIN_PWD:
required: true
description: "Temporary keychain password"
FASTLANE_DISCORD_WEBHOOK:
required: true
description: "Fastlane Discord webhook"
FASTLANE_ACTION_ID:
required: true
description: "Fastlane Action ID"
FASTLANE_MATCH_PWD:
required: true
description: "Fastlane Match description password"
FASTLANE_MATCH_TOKEN:
required: true
description: "Fastlane Match Github token"
runs:
using: "composite"
steps:
- uses: ./.github/actions/build-love
- name: Checkout source codes
uses: actions/checkout@v2
with:
repository: '26F-Studio/Techmino-iOS'
path: 'Techmino-iOS'
- name: Download CCloader
uses: ./.github/actions/get-cc
with:
arch: iOS
- name: Update source codes
shell: bash
run: |
mv Techmino.love Techmino-iOS/platform/xcode
mv libcold_clear.a Techmino-iOS/platform/xcode
mv libCCloader.a Techmino-iOS/platform/xcode
- name: Run fastlane
uses: maierj/fastlane-action@v2.0.1
with:
lane: '${{ inputs.type }}'
subdirectory: 'Techmino-iOS/platform/xcode'
env:
ACTION_ID: '${{ inputs.FASTLANE_ACTION_ID }}'
API_ID: '${{ inputs.APPLE_API_ID }}'
API_ISSUER: '${{ inputs.APPLE_API_ISSUER }}'
API_KEY: '${{ inputs.APPLE_API_KEY }}'
APP_BUILD: '${{ inputs.APPLE_APP_BUILD }}'
APP_CHANGELOG: '${{ inputs.APPLE_APP_CHANGELOG }}'
APP_ID: '${{ inputs.APPLE_APP_ID }}'
APP_IDENTIFIER: '${{ inputs.APPLE_APP_IDENTIFIER }}'
APP_PROFILE: '${{ inputs.APPLE_APP_PROFILE }}'
APP_VERSION: '${{ inputs.name }}'
DISCORD_WEBHOOK: '${{ inputs.FASTLANE_DISCORD_WEBHOOK }}'
KEYCHAIN_NAME: '${{ inputs.APPLE_KEYCHAIN_NAME }}'
KEYCHAIN_PWD: '${{ inputs.APPLE_KEYCHAIN_PWD }}'
MATCH_PASSWORD: '${{ inputs.FASTLANE_MATCH_PWD }}'
MATCH_TOKEN: '${{ inputs.FASTLANE_MATCH_TOKEN }}'
- name: Move ipa
shell: bash
run: |
mv Techmino-iOS/platform/xcode/Techmino.ipa Techmino.ipa

View File

@@ -33,7 +33,7 @@ runs:
cp squashfs-root/icon.png squashfs-root/.DirIcon cp squashfs-root/icon.png squashfs-root/.DirIcon
chmod 777 squashfs-root/love chmod 777 squashfs-root/love
mkdir -p squashfs-root/usr/share/Techmino mkdir -p squashfs-root/usr/share/Techmino
mv document media parts Zframework conf.lua main.lua version.lua squashfs-root/usr/share/Techmino mv media parts Zframework conf.lua main.lua version.lua legals.md license.txt squashfs-root/usr/share/Techmino
mv CCloader.so squashfs-root/usr/share/Techmino mv CCloader.so squashfs-root/usr/share/Techmino
mv libcold_clear.so squashfs-root/usr/lib mv libcold_clear.so squashfs-root/usr/lib
chmod 777 appimagetool-x86_64.AppImage chmod 777 appimagetool-x86_64.AppImage

View File

@@ -7,5 +7,5 @@ inputs:
runs: runs:
using: "composite" using: "composite"
steps: steps:
- run: 7z a -tzip ${{ inputs.file-path }} document media parts Zframework conf.lua main.lua version.lua - run: 7z a -tzip ${{ inputs.file-path }} media parts Zframework conf.lua main.lua version.lua legals.md license.txt
shell: bash shell: bash

View File

@@ -3,43 +3,150 @@ description: 'build Mac OS package'
inputs: inputs:
name: name:
required: true required: true
description: "Version name"
icon: icon:
required: true required: true
MACOS_CERTIFICATE: description: "App icons (.icns)"
APPLE_API_ID:
required: true required: true
MACOS_CERTIFICATE_ID: description: "API key ID"
APPLE_API_ISSUER:
required: true required: true
MACOS_CERTIFICATE_PWD: description: "API issuer ID"
APPLE_API_KEY:
required: true required: true
description: "API key content"
APPLE_APP_IDENTIFIER:
required: true
description: "Bundle ID"
APPLE_KEYCHAIN_NAME:
required: true
description: "Temporary keychain name"
APPLE_KEYCHAIN_PWD:
required: true
description: "Temporary keychain password"
FASTLANE_MATCH_PWD:
required: true
description: "Fastlane Match description password"
FASTLANE_MATCH_TOKEN:
required: true
description: "Fastlane Match Github token"
runs: runs:
using: "composite" using: "composite"
steps: steps:
- uses: ./.github/actions/build-love - uses: ./.github/actions/build-love
- name: Download template - name: Checkout template
uses: ./.github/actions/get-unzip uses: actions/checkout@v2
with: with:
url: https://github.com/26F-Studio/Techmino/releases/download/v0.15.1/Techmino.app.zip repository: '26F-Studio/Techmino-macOS'
path: 'Techmino-macOS'
- name: Download ColdClear - name: Download ColdClear
uses: ./.github/actions/get-cc uses: ./.github/actions/get-cc
with: with:
arch: macOS arch: macOS
- name: Fastlane match
uses: maierj/fastlane-action@v2.0.1
with:
lane: 'get_cert'
subdirectory: 'Techmino-macOS'
env:
API_ID: '${{ inputs.APPLE_API_ID }}'
API_ISSUER: '${{ inputs.APPLE_API_ISSUER }}'
API_KEY: '${{ inputs.APPLE_API_KEY }}'
APP_IDENTIFIER: '${{ inputs.APPLE_APP_IDENTIFIER }}'
KEYCHAIN_NAME: '${{ inputs.APPLE_KEYCHAIN_NAME }}'
KEYCHAIN_PWD: '${{ inputs.APPLE_KEYCHAIN_PWD }}'
MATCH_PASSWORD: '${{ inputs.FASTLANE_MATCH_PWD }}'
MATCH_TOKEN: '${{ inputs.FASTLANE_MATCH_TOKEN }}'
- name: Modify template - name: Modify template
shell: python
run: |
import datetime
from io import open
thisYear = str(datetime.datetime.today().year)
with open('./.github/build/macOS/info.plist.template', 'r', encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@versionName', '${{ inputs.name }}'[1:])\
.replace('@thisYear', thisYear)\
.replace('@bundleId', '${{ inputs.APPLE_APP_IDENTIFIER }}')
with open('./Techmino-macOS/Techmino.app/Contents/info.plist', 'w+', encoding='utf-8') as file:
file.write(data)
- name: Pack
shell: bash shell: bash
run: | run: |
python3 .github/workflows/updateVersion.py -T macOS -N ${{ inputs.name }} mv Techmino.love Techmino-macOS/Techmino.app/Contents/Resources
mv Techmino.love Techmino.app/Contents/Resources mv CCloader.dylib Techmino-macOS/Techmino.app/Contents/Frameworks
mv CCloader.dylib Techmino.app/Contents/Frameworks mv ${{ inputs.icon }} Techmino-macOS/Techmino.app/Contents/Resources/iconfile.icns
mv ${{ inputs.icon }} Techmino.app/Contents/Resources/iconfile.icns
chmod +x Techmino-macOS/Techmino.app/Contents/Frameworks/CCloader.dylib
chmod +x Techmino-macOS/Techmino.app/Contents/MacOS/love
- name: Codesign executable - name: Codesign executable
# In secrets:
# - MACOS_CERTIFICATE: the *.p12 Developer ID Certificate, encoded in base64
# - MACOS_CERTIFICATE_PWD: The password
shell: bash shell: bash
run: | run: |
echo ${{ inputs.MACOS_CERTIFICATE }} | base64 --decode > certificate.p12 security unlock-keychain -p ${{ inputs.TEMP_KEYCHAIN_PASSWORD }} \
security create-keychain -p Techminohaowan build.keychain ~/Library/Keychains/${{ inputs.TEMP_KEYCHAIN_USER }}-db
security default-keychain -s build.keychain
security unlock-keychain -p Techminohaowan build.keychain [[ $(security find-identity) =~ ([0-9A-F]{40}) ]]
security import certificate.p12 -k build.keychain -P ${{ inputs.MACOS_CERTIFICATE_PWD }} -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k Techminohaowan build.keychain codesign --timestamp --force --strict --deep -v \
/usr/bin/codesign --force --deep -s ${{ inputs.MACOS_CERTIFICATE_ID }} Techmino.app -v --options runtime \
-s ${BASH_REMATCH[1]} \
--entitlements Techmino-macOS/love.entitlements \
Techmino-macOS/Techmino.app
- name: Fastlane notarize
uses: maierj/fastlane-action@v2.0.1
with:
lane: 'make_safe'
subdirectory: 'Techmino-macOS'
env:
API_ID: '${{ inputs.APPLE_API_ID }}'
API_ISSUER: '${{ inputs.APPLE_API_ISSUER }}'
API_KEY: '${{ inputs.APPLE_API_KEY }}'
APP_IDENTIFIER: '${{ inputs.APPLE_APP_IDENTIFIER }}'
NOTARIZE_OBJECT: 'Techmino.app'
- name: Create DMG file
shell: bash
run: |
brew install create-dmg
create-dmg \
--volname "Techmino for MacOS" \
--volicon "./.github/build/macOS/Techminodisk.icns" \
--window-pos 200 120 \
--window-size 800 500 \
--icon-size 100 \
--icon "Techmino.app" 239 203 \
--background ".github/build/macOS/backgroundImage.tiff" \
--hide-extension "Techmino.app" \
--app-drop-link 565 203 \
"Techmino-macOS/Techmino-macOS.dmg" \
"Techmino-macOS/Techmino.app/"
- name: Codesign DMG
shell: bash
run: |
security unlock-keychain -p ${{ inputs.TEMP_KEYCHAIN_PASSWORD }} \
~/Library/Keychains/${{ inputs.TEMP_KEYCHAIN_USER }}-db
[[ $(security find-identity) =~ ([0-9A-F]{40}) ]]
codesign --timestamp --force --strict --deep -v \
--options runtime \
-s ${BASH_REMATCH[1]} \
--entitlements Techmino-macOS/love.entitlements \
Techmino-macOS/Techmino-macOS.dmg
- name: Fastlane notarize
uses: maierj/fastlane-action@v2.0.1
with:
lane: 'make_safe'
subdirectory: 'Techmino-macOS'
env:
API_ID: '${{ inputs.APPLE_API_ID }}'
API_ISSUER: '${{ inputs.APPLE_API_ISSUER }}'
API_KEY: '${{ inputs.APPLE_API_KEY }}'
APP_IDENTIFIER: '${{ inputs.APPLE_APP_IDENTIFIER }}'
NOTARIZE_OBJECT: 'Techmino-macOS.dmg'
- name: Finalize
shell: bash
run: |
mv Techmino-macOS/Techmino-macOS.dmg Techmino.dmg
spctl -a -t open --context context:primary-signature -vv Techmino.dmg

View File

@@ -30,6 +30,18 @@ runs:
with: with:
url: http://www.angusj.com/resourcehacker/resource_hacker.zip url: http://www.angusj.com/resourcehacker/resource_hacker.zip
- uses: ./.github/actions/build-love - uses: ./.github/actions/build-love
- name: update Windows template
shell: python
run: |
Version = '${{ inputs.version }}'.replace('V', '')
FileVersion = (f"{Version.replace('.', ',')},0")
with open('./.github/build/Windows/Techmino.rc.template', 'r', encoding='utf8') as file:
data = file.read()
data = data\
.replace('@FileVersion', FileVersion)\
.replace('@Version', Version)
with open('Techmino.rc', 'w+', encoding='utf8') as file:
file.write(data)
- name: Pack Techmino - name: Pack Techmino
shell: pwsh shell: pwsh
run: | run: |
@@ -42,7 +54,6 @@ runs:
del .\love\readme.txt del .\love\readme.txt
move .\cold_clear.dll .\love move .\cold_clear.dll .\love
move .\CCloader.dll .\love move .\CCloader.dll .\love
python .\.github\workflows\updateVersion.py -T Windows -N ${{ inputs.version }}
cmd /c '.\ResourceHacker.exe -open .\love\Techmino.exe -save .\love\Techmino.exe -action delete -mask ICONGROUP,,' cmd /c '.\ResourceHacker.exe -open .\love\Techmino.exe -save .\love\Techmino.exe -action delete -mask ICONGROUP,,'
cmd /c '.\ResourceHacker.exe -open .\Techmino.rc -save .\Techmino.res -action compile' cmd /c '.\ResourceHacker.exe -open .\Techmino.rc -save .\Techmino.res -action compile'
cmd /c '.\ResourceHacker.exe -open .\love\Techmino.exe -save .\love\Techmino.exe -action addoverwrite -res "${{ inputs.icon }}" -mask ICONGROUP,1,' cmd /c '.\ResourceHacker.exe -open .\love\Techmino.exe -save .\love\Techmino.exe -action addoverwrite -res "${{ inputs.icon }}" -mask ICONGROUP,1,'

View File

@@ -1,12 +0,0 @@
name: 'update for a snapshot'
description: 'common update logic for snapshot'
inputs:
commit:
required: true
runs:
using: "composite"
steps:
- shell: bash
run: |
python3 .github/workflows/updateVersion.py -T Conf
python3 .github/workflows/updateVersion.py -T Version -H ${{ inputs.commit }}

View File

@@ -0,0 +1,37 @@
name: 'update version'
description: 'common update logic for snapshot and release'
inputs:
commit:
required: false
type:
required: true
runs:
using: "composite"
steps:
- shell: python
name: update snapshot saving folder
run: |
from io import open
if '${{ inputs.type }}'.lower() != 'snapshot':
exit(0)
with open('conf.lua', 'r+', encoding='utf-8') as file:
data = file.read()
data = data.replace("t.identity='Techmino'--Saving folder", "t.identity='Techmino_Snapshot'--Saving folder")
file.seek(0)
file.truncate()
file.flush()
file.write(data)
- shell: python
run: |
from io import open
import re
with open('version.lua', 'r+', encoding='utf-8') as file:
commitHash = '${{ inputs.commit }}'
if commitHash != '':
commitHash = '@' + commitHash[0:4]
data = file.read()
data = re.sub('(\d)"', r'\1' + commitHash + '"', data, 1)
file.seek(0)
file.truncate()
file.flush()
file.write(data)

View File

@@ -0,0 +1,51 @@
name: "upload artifact"
description: "upload file with webdav"
inputs:
WEBDAV_USERNAME:
required: true
description: "webdav username"
WEBDAV_PASSWORD:
required: true
description: "webdav password"
ARTIFACT_TYPE:
required: true
description: "file build type"
ARTIFACT_PLATFORM:
required: true
description: "file platform"
ARTIFACT_NAME:
required: true
description: "file name"
runs:
using: "composite"
steps:
- name: Install Webdav 4
shell: bash
run: |
pip install webdav4
- name: Update release
shell: python
run: |
import re
from webdav4.client import Client
client = Client(
"http://mc.yuhao7370.top:5212/dav",
auth=("${{ inputs.WEBDAV_USERNAME }}", "${{ inputs.WEBDAV_PASSWORD }}"),
timeout=None,
)
if '${{ inputs.ARTIFACT_TYPE }}' == 'release'
print('Removing previous ${{ inputs.ARTIFACT_PLATFORM }} release file...')
for file in client.ls('Techmino distribution'):
if re.search(r'(Techmino_a[0-9]+\.[0-9]+\.[0-9]_${{ inputs.ARTIFACT_PLATFORM }}.*)', file['name']):
client.remove(file['name'])
print('Uploading new ${{ inputs.ARTIFACT_PLATFORM }} release file...')
client.upload_file("${{ inputs.ARTIFACT_NAME }}", 'Techmino distribution/${{ inputs.ARTIFACT_NAME }}')
if '${{ inputs.ARTIFACT_TYPE }}' == 'test':
print('Removing previous ${{ inputs.ARTIFACT_PLATFORM }} test file...')
for file in client.ls('Techmino Snapshot'):
if re.search(r'(Techmino_pre[0-9]+\.[0-9]+\.[0-9]_[0-9a-z]{7}_${{ inputs.ARTIFACT_PLATFORM }}.*)', file['name']):
client.remove(file['name'])
print('Uploading new ${{ inputs.ARTIFACT_PLATFORM }} test file...')
client.upload_file("${{ inputs.ARTIFACT_NAME }}", 'Techmino Snapshot/${{ inputs.ARTIFACT_NAME }}')

BIN
.github/build/macOS/Techminodisk.icns vendored Normal file

Binary file not shown.

BIN
.github/build/macOS/backgroundImage.tiff vendored Normal file

Binary file not shown.

View File

@@ -11,7 +11,7 @@
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>
<string>iconfile</string> <string>iconfile</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>org.love2d.MrZ.Techmino</string> <string>@bundleId</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>

View File

@@ -1,112 +0,0 @@
name: Techmino CI
on:
push:
branches: [ main, ci* ]
pull_request:
branches: [ main, ci* ]
jobs:
get-info:
runs-on: ubuntu-20.04
outputs:
name: ${{ steps.actual-get-info.outputs.name }}
code: ${{ steps.actual-get-info.outputs.code }}
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: |
echo "::set-output name=name::$(lua .github/workflows/getVersion.lua -name)"
echo "::set-output name=code::$(lua .github/workflows/getVersion.lua -code)"
echo "::set-output name=commit::$(git rev-parse --short ${{ GITHUB.SHA }})"
build-windows:
runs-on: windows-latest
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
with:
commit: ${{ needs.get-info.outputs.commit }}
- uses: ./.github/actions/build-windows
with:
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
love-dir: love-11.3-win64
arch: win64
version: ${{ needs.get-info.outputs.name }}
icon: .\.github\build\Windows\icon_snapshot.ico
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Windows
path: love
build-linux:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
with:
commit: ${{ needs.get-info.outputs.commit }}
- uses: ./.github/actions/build-linux
with:
icon: .github/build/Linux/icon_snapshot.png
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Linux
path: Techmino.AppImage
build-android:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
with:
commit: ${{ needs.get-info.outputs.commit }}
- uses: ./.github/actions/build-android
with:
type: Snapshot
code: ${{ needs.get-info.outputs.code }}
name: ${{ needs.get-info.outputs.name }}
file-path: Techmino_Snapshot.apk
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
ALIAS: ${{ secrets.ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Android
path: Techmino_Snapshot.apk
build-macOS:
runs-on: macos-10.15
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/snapshot-update
with:
commit: ${{ needs.get-info.outputs.commit }}
- uses: ./.github/actions/build-macos
with:
name: ${{ needs.get-info.outputs.name }}
icon: .github/build/macOS/icon_snapshot.icns
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
MACOS_CERTIFICATE_ID: ${{ secrets.MACOS_CERTIFICATE_ID }}
MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }}
- name: Pack Techmino
run: |
zip -r -y Techmino.zip Techmino.app
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_macOS
path: Techmino.zip

203
.github/workflows/dev.yml vendored Normal file
View File

@@ -0,0 +1,203 @@
name: Techmino Develop CI
on:
push:
branches: [ main, ci* ]
pull_request:
branches: [ main ]
jobs:
get-info:
runs-on: ubuntu-20.04
outputs:
name: ${{ steps.actual-get-info.outputs.name }}
apkCode: ${{ steps.actual-get-info.outputs.apkCode }}
code: ${{ steps.actual-get-info.outputs.code }}
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: |
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=commit::$(git rev-parse --short ${{ GITHUB.SHA }})"
automatic-test:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/automatic-test
build-windows:
runs-on: windows-latest
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-windows
with:
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
love-dir: love-11.3-win64
arch: win64
version: ${{ needs.get-info.outputs.name }}
icon: .\.github\build\Windows\icon_snapshot.ico
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Windows
path: love
build-linux:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-linux
with:
icon: .github/build/Linux/icon_snapshot.png
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Linux
path: Techmino.AppImage
build-android:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-android
with:
type: Snapshot
apkCode: ${{ needs.get-info.outputs.apkCode }}
name: ${{ needs.get-info.outputs.name }}
file-path: Techmino_Snapshot.apk
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
ALIAS: ${{ secrets.ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Android
path: Techmino_Snapshot.apk
build-android-mini:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- name: remove media
run: |
rm -rf media/music media/effect media/vocal
- uses: ./.github/actions/build-android
with:
type: Snapshot
apkCode: ${{ needs.get-info.outputs.apkCode }}
name: ${{ needs.get-info.outputs.name }}
file-path: Techmino_Snapshot_Mini.apk
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
ALIAS: ${{ secrets.ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_Android_Mini
path: Techmino_Snapshot_Mini.apk
build-macOS:
runs-on: macos-10.15
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-macos
with:
name: ${{ needs.get-info.outputs.name }}
icon: .github/build/macOS/icon_snapshot.icns
APPLE_API_ID: '${{ secrets.APPLE_API_ID }}'
APPLE_API_ISSUER: '${{ secrets.APPLE_API_ISSUER }}'
APPLE_API_KEY: '${{ secrets.APPLE_API_KEY }}'
APPLE_APP_IDENTIFIER: '${{ secrets.APPLE_APP_IDENTIFIER }}'
APPLE_KEYCHAIN_NAME: '${{ secrets.APPLE_KEYCHAIN_NAME }}'
APPLE_KEYCHAIN_PWD: '${{ secrets.APPLE_KEYCHAIN_PWD }}'
FASTLANE_MATCH_PWD: '${{ secrets.FASTLANE_MATCH_PWD }}'
FASTLANE_MATCH_TOKEN: '${{ secrets.FASTLANE_MATCH_TOKEN }}'
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_macOS
path: Techmino.dmg
build-iOS:
runs-on: macos-latest
if: (!startsWith( github.ref , 'refs/heads/ci-')) || startsWith( github.ref , 'refs/heads/ci-ios-')
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-ios
with:
name: ${{ needs.get-info.outputs.name }}
type: 'dev'
APPLE_API_ID: '${{ secrets.APPLE_API_ID }}'
APPLE_API_ISSUER: '${{ secrets.APPLE_API_ISSUER }}'
APPLE_API_KEY: '${{ secrets.APPLE_API_KEY }}'
APPLE_APP_BUILD: '${{ needs.get-info.outputs.code }}.2.${{ github.run_number }}.${{ github.run_attempt }}'
APPLE_APP_CHANGELOG: '${{ github.event.commits[0].message }}'
APPLE_APP_ID: '${{ secrets.APPLE_APP_ID }}'
APPLE_APP_IDENTIFIER: '${{ secrets.APPLE_APP_IDENTIFIER }}'
APPLE_APP_PROFILE: '${{ secrets.APPLE_APP_PROFILE }}'
APPLE_KEYCHAIN_NAME: '${{ secrets.APPLE_KEYCHAIN_NAME }}'
APPLE_KEYCHAIN_PWD: '${{ secrets.APPLE_KEYCHAIN_PWD }}'
FASTLANE_ACTION_ID: '${{ github.run_id }}'
FASTLANE_DISCORD_WEBHOOK: '${{ secrets.FASTLANE_DISCORD_WEBHOOK }}'
FASTLANE_MATCH_PWD: '${{ secrets.FASTLANE_MATCH_PWD }}'
FASTLANE_MATCH_TOKEN: '${{ secrets.FASTLANE_MATCH_TOKEN }}'
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_${{ needs.get-info.outputs.name }}_${{ GITHUB.RUN_NUMBER }}_${{ needs.get-info.outputs.commit }}_iOS
path: Techmino.ipa
build-love:
runs-on: ubuntu-20.04
needs: get-info
steps:
- uses: actions/checkout@v2
- 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

@@ -1,28 +1,28 @@
if arg[1]=="-code"then local arg=arg[1]
if arg=="-apkCode"then
local code=require"version".apkCode local code=require"version".apkCode
print(code) print(code)
elseif arg[1]=="-name"then elseif arg=="-code"then
local str=require"version".string:gsub("@DEV","") local str=require"version".code
print(str) print(str)
elseif arg[1]=="-release"then elseif arg=="-name"then
local str=require"version".string:gsub("V","",1):gsub("@DEV","") local str=require"version".string
print(str) print(str)
elseif arg[1]=="-updateTitle"then elseif arg=="-release"then
local str=require"version".string:gsub("V","",1)
print(str)
elseif arg=="-updateTitle"then
local note=require"parts.updateLog" local note=require"parts.updateLog"
local p1=note:find("\n%d")+1 local p1=note:find("\n%d")+1
local p2=note:find("\n",p1)-1 local p2=note:find("\n",p1)-1
note=note:sub(p1,p2) note=note:sub(p1,p2)
print(note) print(note)
elseif arg[1]=="-updateNote"then elseif arg=="-updateNote"then
local note=require"parts.updateLog" local note=require"parts.updateLog"
local p1=note:find("\n",note:find("\n%d")+1)+1 local p1=note:find("\n",note:find("\n%d")+1)+1
local p2=note:find("\n%d",p1+1) local p2=note:find("\n%d",p1+1)
note=note:sub(p1,p2-2) note=note:sub(p1,p2-2)
note=note :gsub(" ","- ")
:gsub(" ","_") :gsub(" ","# ")
:gsub(" ","")
:gsub("\n([^_])","\n\n%1")
:gsub("\n_","\n")
:gsub("\n\n","\n",1)
print(note) print(note)
end end

View File

@@ -3,202 +3,235 @@ name: Techmino Release CI
on: on:
push: push:
tags: tags:
- '*' - "v*"
jobs: jobs:
get-info: get-info:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
outputs: outputs:
name: ${{ steps.actual-get-info.outputs.name }} name: ${{ steps.actual-get-info.outputs.name }}
apkCode: ${{ steps.actual-get-info.outputs.apkCode }}
code: ${{ steps.actual-get-info.outputs.code }} code: ${{ steps.actual-get-info.outputs.code }}
release: ${{ steps.actual-get-info.outputs.release }} release: ${{ steps.actual-get-info.outputs.release }}
updateTitle: ${{ steps.actual-get-info.outputs.updateTitle }} updateTitle: ${{ steps.actual-get-info.outputs.updateTitle }}
updateNote: ${{ steps.actual-get-info.outputs.updateNote }}
commit: ${{ steps.actual-get-info.outputs.commit }} commit: ${{ steps.actual-get-info.outputs.commit }}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Install lua - name: Install lua
run: | run: |
sudo apt-get install lua5.3 -y sudo apt-get install lua5.3 -y
- name: Get Version - name: Get Version
id: actual-get-info id: actual-get-info
run: | run: |
echo "::set-output name=name::$(lua .github/workflows/getVersion.lua -name)" UPDATE_NOTE=$(lua .github/workflows/getVersion.lua -updateNote)
echo "::set-output name=code::$(lua .github/workflows/getVersion.lua -code)" UPDATE_NOTE="${UPDATE_NOTE//'%'/'%25'}"
echo "::set-output name=release::$(lua .github/workflows/getVersion.lua -release)" UPDATE_NOTE="${UPDATE_NOTE//$'\n'/'%0A'}"
echo "::set-output name=updateTitle::$(lua .github/workflows/getVersion.lua -updateTitle)" UPDATE_NOTE="${UPDATE_NOTE//$'\r'/'%0D'}"
echo "::set-output name=commit::$(git rev-parse --short ${{ GITHUB.SHA }})" 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: build-windows-x64:
runs-on: windows-latest runs-on: windows-latest
needs: get-info needs: get-info
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Update Version - uses: ./.github/actions/update-version
run: | - uses: ./.github/actions/build-windows
python .\.github\workflows\updateVersion.py -T Version with:
- uses: ./.github/actions/build-windows love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
with: love-dir: love-11.3-win64
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip arch: win64
love-dir: love-11.3-win64 version: ${{ needs.get-info.outputs.release }}
arch: win64 icon: .\.github\build\Windows\icon.ico
version: ${{ needs.get-info.outputs.release }} - name: Pack Techmino
icon: .\.github\build\Windows\icon.ico run: 7z a -tzip .\Techmino_a${{ needs.get-info.outputs.release }}_Win64.zip .\love
- name: Pack Techmino - name: Release
run: 7z a -tzip .\Techmino.a${{ needs.get-info.outputs.release }}.Win64.zip .\love uses: softprops/action-gh-release@v1
- name: Release with:
uses: softprops/action-gh-release@v1 name: ${{ needs.get-info.outputs.updateTitle }}
with: files: Techmino_a${{ needs.get-info.outputs.release }}_Win64.zip
name: ${{ needs.get-info.outputs.updateTitle }} - name: Upload artifact to server
files: Techmino.a${{ needs.get-info.outputs.release }}.Win64.zip uses: ./.github/actions/upload-artifact
with:
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
ARTIFACT_TYPE: release
ARTIFACT_PLATFORM: Win64
ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_Win64.zip
build-windows-x86: build-windows-x86:
runs-on: windows-latest runs-on: windows-latest
needs: get-info needs: get-info
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Update Version - uses: ./.github/actions/update-version
run: | - uses: ./.github/actions/build-windows
python .\.github\workflows\updateVersion.py -T Version with:
- uses: ./.github/actions/build-windows love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win32.zip
with: love-dir: love-11.3-win32
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win32.zip arch: win32
love-dir: love-11.3-win32 version: ${{ needs.get-info.outputs.release }}
arch: win32 icon: .\.github\build\Windows\icon.ico
version: ${{ needs.get-info.outputs.release }} - name: Pack Techmino
icon: .\.github\build\Windows\icon.ico run: 7z a -tzip .\Techmino_a${{ needs.get-info.outputs.release }}_Win32.zip .\love
- name: Pack Techmino - name: Release
run: 7z a -tzip .\Techmino.a${{ needs.get-info.outputs.release }}.Win32.zip .\love uses: softprops/action-gh-release@v1
- name: Release with:
uses: softprops/action-gh-release@v1 name: ${{ needs.get-info.outputs.updateTitle }}
with: files: Techmino_a${{ needs.get-info.outputs.release }}_Win32.zip
name: ${{ needs.get-info.outputs.updateTitle }} - name: Upload artifact to server
files: Techmino.a${{ needs.get-info.outputs.release }}.Win32.zip uses: ./.github/actions/upload-artifact
with:
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
ARTIFACT_TYPE: release
ARTIFACT_PLATFORM: Win32
ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_Win32.zip
build-linux: build-linux:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
needs: get-info needs: get-info
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Update Version - uses: ./.github/actions/update-version
run: | - uses: ./.github/actions/build-linux
python3 .github/workflows/updateVersion.py -T Version with:
- uses: ./.github/actions/build-linux file-path: Techmino_a${{ needs.get-info.outputs.release }}_Linux.AppImage
with: icon: .github/build/Linux/icon.png
file-path: Techmino.a${{ needs.get-info.outputs.release }}.AppImage - name: Release
icon: .github/build/Linux/icon.png uses: softprops/action-gh-release@v1
- name: Release with:
uses: softprops/action-gh-release@v1 name: ${{ needs.get-info.outputs.updateTitle }}
with: files: Techmino_a${{ needs.get-info.outputs.release }}_Linux.AppImage
name: ${{ needs.get-info.outputs.updateTitle }} - name: Upload artifact to server
files: Techmino.a${{ needs.get-info.outputs.release }}.AppImage uses: ./.github/actions/upload-artifact
with:
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
ARTIFACT_TYPE: release
ARTIFACT_PLATFORM: Linux
ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_Linux.AppImage
build-android: build-android:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
needs: get-info needs: get-info
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Update Version - uses: ./.github/actions/update-version
run: | - uses: ./.github/actions/build-android
python3 .github/workflows/updateVersion.py -T Version with:
- uses: ./.github/actions/build-android type: Release
with: apkCode: ${{ needs.get-info.outputs.apkCode }}
type: Release name: ${{ needs.get-info.outputs.name }}
code: ${{ needs.get-info.outputs.code }} file-path: Techmino_a${{ needs.get-info.outputs.release }}_Android.apk
name: ${{ needs.get-info.outputs.name }} SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
file-path: Techmino.a${{ needs.get-info.outputs.Version }}.apk KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
SIGNING_KEY: ${{ secrets.SIGNING_KEY }} ALIAS: ${{ secrets.ALIAS }}
KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
ALIAS: ${{ secrets.ALIAS }} - name: Release
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} uses: softprops/action-gh-release@v1
- name: Release with:
uses: softprops/action-gh-release@v1 name: ${{ needs.get-info.outputs.updateTitle }}
with: files: Techmino_a${{ needs.get-info.outputs.release }}_Android.apk
name: ${{ needs.get-info.outputs.updateTitle }} - name: Upload artifact to server
files: Techmino.a${{ needs.get-info.outputs.Version }}.apk uses: ./.github/actions/upload-artifact
with:
build-android-mini: WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
runs-on: ubuntu-20.04 WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
needs: get-info ARTIFACT_TYPE: release
steps: ARTIFACT_PLATFORM: Android
- uses: actions/checkout@v2 ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_Android.apk
- name: Update Version
run: |
python3 .github/workflows/updateVersion.py -T Version
- name: remove media
run: |
rm -rf media/music media/effect media/vocal
- uses: ./.github/actions/build-android
with:
type: Release
code: ${{ needs.get-info.outputs.code }}
name: ${{ needs.get-info.outputs.name }}
file-path: Techmino.a${{ needs.get-info.outputs.Version }}.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.Version }}.mini.apk
build-macOS: build-macOS:
runs-on: macos-10.15 runs-on: macos-10.15
needs: get-info needs: get-info
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Update Version - uses: ./.github/actions/update-version
run: | - uses: ./.github/actions/build-macos
python3 .github/workflows/updateVersion.py -T Version with:
- uses: ./.github/actions/build-macos name: ${{ needs.get-info.outputs.name }}
with: icon: .github/build/macOS/icon.icns
name: ${{ needs.get-info.outputs.name }} APPLE_API_ID: "${{ secrets.APPLE_API_ID }}"
icon: .github/build/macOS/icon.icns APPLE_API_ISSUER: "${{ secrets.APPLE_API_ISSUER }}"
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }} APPLE_API_KEY: "${{ secrets.APPLE_API_KEY }}"
MACOS_CERTIFICATE_ID: ${{ secrets.MACOS_CERTIFICATE_ID }} APPLE_APP_IDENTIFIER: "${{ secrets.APPLE_APP_IDENTIFIER }}"
MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }} APPLE_KEYCHAIN_NAME: "${{ secrets.APPLE_KEYCHAIN_NAME }}"
- name: Pack Techmino APPLE_KEYCHAIN_PWD: "${{ secrets.APPLE_KEYCHAIN_PWD }}"
run: | FASTLANE_MATCH_PWD: "${{ secrets.FASTLANE_MATCH_PWD }}"
zip -r -y Techmino.a${{ needs.get-info.outputs.Version }}.macOS.zip Techmino.app ".github/build/macOS/打不开Cant open the App.pdf" FASTLANE_MATCH_TOKEN: "${{ secrets.FASTLANE_MATCH_TOKEN }}"
- name: Release - name: Pack Techmino
uses: softprops/action-gh-release@v1 run: |
with: mv Techmino.dmg Techmino_a${{ needs.get-info.outputs.release }}_MacOS.dmg
name: ${{ needs.get-info.outputs.updateTitle }} - name: Release
files: Techmino.a${{ needs.get-info.outputs.Version }}.macOS.zip uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
files: Techmino_a${{ needs.get-info.outputs.release }}_MacOS.dmg
- name: Upload artifact to server
uses: ./.github/actions/upload-artifact
with:
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
ARTIFACT_TYPE: release
ARTIFACT_PLATFORM: MacOS
ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_MacOS.dmg
build-love: build-iOS:
runs-on: ubuntu-20.04 runs-on: macos-latest
needs: get-info needs: get-info
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Update Version - uses: ./.github/actions/update-version
run: | - uses: ./.github/actions/build-ios
python3 .github/workflows/updateVersion.py -T Version with:
- uses: ./.github/actions/build-love name: ${{ needs.get-info.outputs.name }}
with: type: "release"
file-path: Techmino.a${{ needs.get-info.outputs.release }}.love APPLE_API_ID: "${{ secrets.APPLE_API_ID }}"
- name: Release APPLE_API_ISSUER: "${{ secrets.APPLE_API_ISSUER }}"
uses: softprops/action-gh-release@v1 APPLE_API_KEY: "${{ secrets.APPLE_API_KEY }}"
with: APPLE_APP_BUILD: "${{ needs.get-info.outputs.code }}.0.${{ github.run_number }}.${{ github.run_attempt }}"
name: ${{ needs.get-info.outputs.updateTitle }} APPLE_APP_CHANGELOG: "${{ needs.get-info.outputs.updateNote }}"
files: Techmino.a${{ needs.get-info.outputs.release }}.love 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
- name: Upload artifact to server
uses: ./.github/actions/upload-artifact
with:
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
ARTIFACT_TYPE: release
ARTIFACT_PLATFORM: iOS
ARTIFACT_NAME: Techmino_a${{ needs.get-info.outputs.release }}_iOS.ipa
Add-Release-note: Add-Release-note:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
needs: get-info needs: get-info
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Install lua - name: Release
run: | uses: softprops/action-gh-release@v1
sudo apt-get update -y with:
sudo apt-get upgrade -y name: ${{ needs.get-info.outputs.updateTitle }}
sudo apt-get install lua5.3 -y body: ${{ needs.get-info.outputs.updateNote }}
- name: Get ReleaseNote
run: |
lua .github/workflows/getVersion.lua -updateNote > updateNote.txt
- name: Release
uses: softprops/action-gh-release@v1
with:
name: ${{ needs.get-info.outputs.updateTitle }}
body_path: updateNote.txt

207
.github/workflows/test.yml vendored Normal file
View File

@@ -0,0 +1,207 @@
name: Techmino Test CI
on:
push:
tags:
- 'pre*'
jobs:
get-info:
runs-on: ubuntu-20.04
outputs:
name: ${{ steps.actual-get-info.outputs.name }}
apkCode: ${{ steps.actual-get-info.outputs.apkCode }}
code: ${{ steps.actual-get-info.outputs.code }}
release: ${{ steps.actual-get-info.outputs.release }}
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: |
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=commit::$(git rev-parse --short ${{ GITHUB.SHA }})"
build-windows:
runs-on: windows-latest
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-windows
with:
love-url: https://github.com/love2d/love/releases/download/11.3/love-11.3-win64.zip
love-dir: love-11.3-win64
arch: win64
version: ${{ needs.get-info.outputs.name }}
icon: .\.github\build\Windows\icon_snapshot.ico
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Windows
path: love
- name: Pack Techmino
run: 7z a -tzip .\Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Windows.zip .\love
- name: Upload artifact to server
uses: ./.github/actions/upload-artifact
with:
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
ARTIFACT_TYPE: test
ARTIFACT_PLATFORM: Windows
ARTIFACT_NAME: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Windows.zip
# - name: Upload artifact to server
# run: |
# curl --user "${{ secrets.WEBDAV_USERNAME }}:${{ secrets.WEBDAV_PASSWORD }}" -T Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Windows.zip http://mc.yuhao7370.top:5212/dav/Techmino%20Snapshots/ -v
build-linux:
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
- uses: ./.github/actions/build-linux
with:
icon: .github/build/Linux/icon_snapshot.png
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Linux
path: Techmino.AppImage
- name: Pack Techmino
run: mv Techmino.AppImage Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Linux.AppImage
- name: Upload artifact to server
uses: ./.github/actions/upload-artifact
with:
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
ARTIFACT_TYPE: test
ARTIFACT_PLATFORM: Linux
ARTIFACT_NAME: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Linux.AppImage
build-android:
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
- uses: ./.github/actions/build-android
with:
type: Snapshot
apkCode: ${{ needs.get-info.outputs.apkCode }}
name: ${{ needs.get-info.outputs.name }}
file-path: Techmino_Snapshot.apk
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
ALIAS: ${{ secrets.ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Android
path: Techmino_Snapshot.apk
- name: Pack Techmino
run: mv Techmino_Snapshot.apk Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Android.apk
- name: Upload artifact to server
uses: ./.github/actions/upload-artifact
with:
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
ARTIFACT_TYPE: test
ARTIFACT_PLATFORM: Android
ARTIFACT_NAME: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_Android.apk
build-macOS:
runs-on: macos-10.15
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-macos
with:
name: ${{ needs.get-info.outputs.name }}
icon: .github/build/macOS/icon_snapshot.icns
APPLE_API_ID: '${{ secrets.APPLE_API_ID }}'
APPLE_API_ISSUER: '${{ secrets.APPLE_API_ISSUER }}'
APPLE_API_KEY: '${{ secrets.APPLE_API_KEY }}'
APPLE_APP_IDENTIFIER: '${{ secrets.APPLE_APP_IDENTIFIER }}'
APPLE_KEYCHAIN_NAME: '${{ secrets.APPLE_KEYCHAIN_NAME }}'
APPLE_KEYCHAIN_PWD: '${{ secrets.APPLE_KEYCHAIN_PWD }}'
FASTLANE_MATCH_PWD: '${{ secrets.FASTLANE_MATCH_PWD }}'
FASTLANE_MATCH_TOKEN: '${{ secrets.FASTLANE_MATCH_TOKEN }}'
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_MacOS
path: Techmino.dmg
- name: Pack Techmino
run: mv Techmino.dmg Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_MacOS.dmg
- name: Upload artifact to server
uses: ./.github/actions/upload-artifact
with:
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
ARTIFACT_TYPE: test
ARTIFACT_PLATFORM: MacOS
ARTIFACT_NAME: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_MacOS.dmg
build-iOS:
runs-on: macos-latest
needs: get-info
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/update-version
with:
commit: ${{ needs.get-info.outputs.commit }}
type: snapshot
- uses: ./.github/actions/build-ios
with:
name: ${{ needs.get-info.outputs.name }}
type: 'test'
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 }}.1.${{ github.run_number }}.${{ github.run_attempt }}'
APPLE_APP_CHANGELOG: '${{ github.event.commits[0].message }}'
APPLE_APP_ID: '${{ secrets.APPLE_APP_ID }}'
APPLE_APP_IDENTIFIER: '${{ secrets.APPLE_APP_IDENTIFIER }}'
APPLE_APP_PROFILE: '${{ secrets.APPLE_APP_PROFILE }}'
APPLE_KEYCHAIN_NAME: '${{ secrets.APPLE_KEYCHAIN_NAME }}'
APPLE_KEYCHAIN_PWD: '${{ secrets.APPLE_KEYCHAIN_PWD }}'
FASTLANE_ACTION_ID: '${{ github.run_id }}'
FASTLANE_DISCORD_WEBHOOK: '${{ secrets.FASTLANE_DISCORD_WEBHOOK }}'
FASTLANE_MATCH_PWD: '${{ secrets.FASTLANE_MATCH_PWD }}'
FASTLANE_MATCH_TOKEN: '${{ secrets.FASTLANE_MATCH_TOKEN }}'
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_iOS
path: Techmino.ipa
- name: Pack Techmino
run: mv Techmino.ipa Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_iOS.ipa
- name: Upload artifact to server
uses: ./.github/actions/upload-artifacts
with:
WEBDAV_USERNAME: ${{ secrets.WEBDAV_USERNAME }}
WEBDAV_PASSWORD: ${{ secrets.WEBDAV_PASSWORD }}
ARTIFACT_TYPE: test
ARTIFACT_PLATFORM: iOS
ARTIFACT_NAME: Techmino_pre${{ needs.get-info.outputs.release }}_${{ needs.get-info.outputs.commit }}_iOS.ipa

View File

@@ -1,97 +0,0 @@
import argparse
def updateConf(): #更新存档位置
with open('conf.lua', 'r+', encoding='utf-8') as file:
data = file.read()
data = data.replace("t.identity='Techmino'--Saving folder", "t.identity='Techmino_Snapshot'--Saving folder")
file.seek(0)
file.truncate()
file.flush()
file.write(data)
def updateVersion(args): #更新版本号
with open('version.lua', 'r+', encoding='utf-8') as file:
data = file.read()
if args.Hash != False:
data = data.replace('@DEV', f'@{args.Hash[0:4]}')
else:
data = data.replace('@DEV', '')
file.seek(0)
file.truncate()
file.flush()
file.write(data)
def updateMacOS(args): #更新macOS打包信息
import datetime
thisYear = str(datetime.datetime.today().year)
with open('./.github/build/macOS/info.plist.template', 'r', encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@versionName', args.Name)\
.replace('@thisYear', thisYear)
with open('./Techmino.app/Contents/info.plist', 'w+', encoding='utf-8') as file:
file.write(data)
def updateWindows(args): #更新Windows打包信息
Version = (args.Name).replace('V', '')
FileVersion = (f"{Version.replace('.', ',')},0")
with open('./.github/build/Windows/Techmino.rc.template', 'r', encoding='utf8') as file:
data = file.read()
data = data\
.replace('@FileVersion', FileVersion)\
.replace('@Version', Version)
with open('Techmino.rc', 'w+', encoding='utf8') as file:
file.write(data)
def updateAndroid(args, edition): #更新Android打包信息
if edition == 'Release':
appName = 'Techmino'
packageName = 'org.love2d.MrZ.Techmino'
edition = 'release'
elif edition == 'Snapshot':
appName = 'Techmino_Snapshot'
packageName = 'org.love2d.MrZ.Techmino.Snapshot'
edition = 'snapshot'
with open('./love-android/app/src/main/AndroidManifest.xml', "r+", encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@appName', appName)\
.replace('@edition', edition)
file.seek(0)
file.truncate()
file.write(data)
with open("./love-android/app/build.gradle", "r+", encoding='utf-8') as file:
data = file.read()
data = data\
.replace('@packageName', packageName)\
.replace('@versionCode', args.Code)\
.replace('@versionName', args.Name)\
.replace('@storePassword', args.Store)\
.replace('@keyAlias', args.Alias)\
.replace('@keyPassword', args.Key)
file.seek(0)
file.truncate()
file.write(data)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='用于CI更新程序各类信息')
parser.add_argument('-T', '--Type', type=str, help = '更新的种类')
parser.add_argument('-H', '--Hash', type=str, default = False, help = 'Github提交Hash')
parser.add_argument('-C', '--Code', type=str, default = False, help = 'versionCode')
parser.add_argument('-N', '--Name', type=str, default = False, help = 'versionName')
parser.add_argument('-S', '--Store', type=str, default = False, help = 'storePassword')
parser.add_argument('-A', '--Alias', type=str, default = False, help = 'keyAlias')
parser.add_argument('-K', '--Key', type=str, default = False, help = 'keyPassword')
args = parser.parse_args()
if args.Type == 'Conf':
updateConf()
elif args.Type == 'Version':
updateVersion(args)
elif args.Type == 'Windows':
updateWindows(args)
elif args.Type == 'macOS':
updateMacOS(args)
elif args.Type == 'AndroidRelease':
updateAndroid(args, 'Release')
elif args.Type == 'AndroidSnapshot':
updateAndroid(args, 'Snapshot')

5
.gitignore vendored
View File

@@ -1,3 +1,8 @@
.vscode .vscode
libAndroid libAndroid
*.ini *.ini
.DS_Store
Thumbs.db
Icon?
.Trash
.file

View File

@@ -1,5 +1,7 @@
local Sources={}
local volume=1
local BGM={ local BGM={
vol=1,
default=false, default=false,
getList=function()error("Cannot getList before initialize!")end, getList=function()error("Cannot getList before initialize!")end,
getCount=function()return 0 end, getCount=function()return 0 end,
@@ -13,7 +15,7 @@ local BGM={
local function task_fadeOut(src) local function task_fadeOut(src)
while true do while true do
coroutine.yield() coroutine.yield()
local v=src:getVolume()-.025*BGM.vol local v=src:getVolume()-.025*volume
src:setVolume(v>0 and v or 0) src:setVolume(v>0 and v or 0)
if v<=0 then if v<=0 then
src:pause() src:pause()
@@ -24,10 +26,10 @@ end
local function task_fadeIn(src) local function task_fadeIn(src)
while true do while true do
coroutine.yield() coroutine.yield()
local v=BGM.vol local v=volume
v=math.min(v,src:getVolume()+.025*v) v=math.min(v,src:getVolume()+.025*v)
src:setVolume(v) src:setVolume(v)
if v>=BGM.vol then if v>=volume then
return true return true
end end
end end
@@ -43,11 +45,10 @@ function BGM.setChange(func)
end end
function BGM.setVol(v) function BGM.setVol(v)
assert(type(v)=='number'and v>=0 and v<=1) assert(type(v)=='number'and v>=0 and v<=1)
BGM.vol=v volume=v
end end
function BGM.init(list) function BGM.init(list)
BGM.init=nil BGM.init=nil
local Sources={}
local simpList={} local simpList={}
for _,v in next,list do for _,v in next,list do
@@ -57,6 +58,7 @@ function BGM.init(list)
table.sort(simpList) table.sort(simpList)
function BGM.getList()return simpList end function BGM.getList()return simpList end
local count=#simpList local count=#simpList
LOG(count.." BGM files added")
function BGM.getCount()return count end function BGM.getCount()return count end
local function _load(name) local function _load(name)
@@ -77,10 +79,10 @@ function BGM.init(list)
end end
function BGM.setVol(v) function BGM.setVol(v)
assert(type(v)=='number'and v>=0 and v<=1) assert(type(v)=='number'and v>=0 and v<=1)
BGM.vol=v volume=v
if BGM.playing then if BGM.playing then
if BGM.vol>0 then if volume>0 then
BGM.playing:setVolume(BGM.vol) BGM.playing:setVolume(volume)
BGM.playing:play() BGM.playing:play()
elseif BGM.nowPlay then elseif BGM.nowPlay then
BGM.playing:pause() BGM.playing:pause()
@@ -95,7 +97,7 @@ function BGM.init(list)
function BGM.play(name) function BGM.play(name)
name=name or BGM.default name=name or BGM.default
if not _load(name)then return end if not _load(name)then return end
if BGM.vol==0 then if volume==0 then
BGM.nowPlay=name BGM.nowPlay=name
BGM.playing=Sources[name] BGM.playing=Sources[name]
return true return true

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 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={ local COLOR={
red= {.92, .12, .12}, hsv=hsv,
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},
lRed= {.95, 0.5, 0.5}, red= {hsv(0, .85,.85)},
lFire= {.95, 0.7, 0.5}, fire= {hsv(0.0625,.85,.85)},
lOrange= {.95, 0.8, 0.3}, orange= {hsv(0.125, .85,.85)},
lYellow= {.95, .95, 0.5}, yellow= {hsv(0.1875,.85,.85)},
lLime= {0.8, .95, 0.4}, lime= {hsv(0.25, .85,.85)},
lJade= {0.6, .95, 0.4}, jade= {hsv(0.3125,.85,.85)},
lGreen= {0.5, .95, 0.5}, green= {hsv(0.375, .85,.85)},
lAqua= {0.4, .95, 0.7}, aqua= {hsv(0.4375,.85,.85)},
lCyan= {0.5, .95, .95}, cyan= {hsv(0.5, .85,.85)},
lNavy= {0.4, .85, .95}, navy= {hsv(0.5625,.85,.85)},
lSea= {0.5, 0.7, .95}, sea= {hsv(0.625, .85,.85)},
lBlue= {0.7, 0.7, .95}, blue= {hsv(0.6875,.85,.85)},
lViolet= {0.7, 0.4, .95}, violet= {hsv(0.75, .85,.85)},
lPurple= {0.8, 0.4, .95}, purple= {hsv(0.8125,.85,.85)},
lMagenta={.95, 0.5, .95}, magenta= {hsv(0.875, .85,.85)},
lWine= {.95, 0.4, 0.7}, wine= {hsv(0.9375,.85,.85)},
dRed= {0.6, .08, .08}, lRed= {hsv(0, .5,.95)},
dFire= {0.6, 0.3, .08}, lFire= {hsv(0.0625,.5,.95)},
dOrange= {0.6, 0.4, .08}, lOrange= {hsv(0.125, .5,.95)},
dYellow= {0.6, 0.6, .08}, lYellow= {hsv(0.1875,.5,.95)},
dLime= {0.5, 0.6, .08}, lLime= {hsv(0.25, .5,.95)},
dJade= {0.3, 0.6, .08}, lJade= {hsv(0.3125,.5,.95)},
dGreen= {.08, 0.6, .08}, lGreen= {hsv(0.375, .5,.95)},
dAqua= {.08, 0.6, 0.4}, lAqua= {hsv(0.4375,.5,.95)},
dCyan= {.08, 0.6, 0.6}, lCyan= {hsv(0.5, .5,.95)},
dNavy= {.08, 0.4, 0.6}, lNavy= {hsv(0.5625,.5,.95)},
dSea= {.08, 0.2, 0.6}, lSea= {hsv(0.625, .5,.95)},
dBlue= {0.1, 0.1, 0.6}, lBlue= {hsv(0.6875,.5,.95)},
dViolet= {0.2, .08, 0.6}, lViolet= {hsv(0.75, .5,.95)},
dPurple= {0.4, .08, 0.6}, lPurple= {hsv(0.8125,.5,.95)},
dMagenta={0.6, .08, 0.6}, lMagenta={hsv(0.875, .5,.95)},
dWine= {0.6, .08, 0.3}, lWine= {hsv(0.9375,.5,.95)},
black= {.05, .05, .05}, dRed= {hsv(0, .9,.5)},
dGray= {0.3, 0.3, 0.3}, dFire= {hsv(0.0625,.9,.5)},
gray= {0.6, 0.6, 0.6}, dOrange= {hsv(0.125, .9,.5)},
lGray= {0.8, 0.8, 0.8}, dYellow= {hsv(0.1875,.9,.5)},
white= {.97, .97, .97}, dLime= {hsv(0.25, .9,.5)},
dJade= {hsv(0.3125,.9,.5)},
dGreen= {hsv(0.375, .9,.5)},
dAqua= {hsv(0.4375,.9,.5)},
dCyan= {hsv(0.5, .9,.5)},
dNavy= {hsv(0.5625,.9,.5)},
dSea= {hsv(0.625, .9,.5)},
dBlue= {hsv(0.6875,.9,.5)},
dViolet= {hsv(0.75, .9,.5)},
dPurple= {hsv(0.8125,.9,.5)},
dMagenta={hsv(0.875, .9,.5)},
dWine= {hsv(0.9375,.9,.5)},
black= {hsv(0,0,.05)},
dGray= {hsv(0,0,0.3)},
gray= {hsv(0,0,0.6)},
lGray= {hsv(0,0,0.8)},
white= {hsv(0,0,.97)},
} }
for k,v in next,{ 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', 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', 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', D='black',dH='dGray',H='gray',lH='lGray',Z='white',

View File

@@ -25,8 +25,8 @@ function FONT.reset()
end end
end end
function FONT.init(mainFont,secFont) function FONT.load(mainFont,secFont)
assert(love.filesystem.getInfo(mainFont)) assert(love.filesystem.getInfo(mainFont),"Font file '"..mainFont.."' not exist!")
mainFont=love.filesystem.newFile(mainFont) mainFont=love.filesystem.newFile(mainFont)
if secFont and love.filesystem.getInfo(secFont)then if secFont and love.filesystem.getInfo(secFont)then
secFont=love.filesystem.newFile(secFont) secFont=love.filesystem.newFile(secFont)

View File

@@ -9,6 +9,8 @@ TABLE= require'Zframework.tableExtend'
STRING= require'Zframework.stringExtend' STRING= require'Zframework.stringExtend'
PROFILE= require'Zframework.profile' PROFILE= require'Zframework.profile'
JSON= require'Zframework.json' JSON= require'Zframework.json'
TEST= require'Zframework.test'
do--Add pcall & MES for JSON lib do--Add pcall & MES for JSON lib
local encode,decode=JSON.encode,JSON.decode local encode,decode=JSON.encode,JSON.decode
JSON.encode=function(val) JSON.encode=function(val)
@@ -71,7 +73,6 @@ local xOy=SCR.xOy
local ITP=xOy.inverseTransformPoint local ITP=xOy.inverseTransformPoint
local mx,my,mouseShow=-20,-20,false local mx,my,mouseShow=-20,-20,false
local touching--First touching ID(userdata)
joysticks={} joysticks={}
local devMode local devMode
@@ -181,8 +182,8 @@ end
function love.touchpressed(id,x,y) function love.touchpressed(id,x,y)
mouseShow=false mouseShow=false
if SCN.swapping then return end if SCN.swapping then return end
if not touching then if not SCN.mainTouchID then
touching=id SCN.mainTouchID=id
WIDGET.unFocus(true) WIDGET.unFocus(true)
love.touchmoved(id,x,y,0,0) love.touchmoved(id,x,y,0,0)
end end
@@ -201,12 +202,12 @@ end
function love.touchreleased(id,x,y) function love.touchreleased(id,x,y)
if SCN.swapping then return end if SCN.swapping then return end
x,y=ITP(xOy,x,y) x,y=ITP(xOy,x,y)
if id==touching then if id==SCN.mainTouchID then
WIDGET.press(x,y,1) WIDGET.press(x,y,1)
WIDGET.release(x,y) WIDGET.release(x,y)
WIDGET.cursorMove(x,y) WIDGET.cursorMove(x,y)
WIDGET.unFocus() WIDGET.unFocus()
touching=false SCN.mainTouchID=false
end end
if SCN.touchUp then SCN.touchUp(x,y)end if SCN.touchUp then SCN.touchUp(x,y)end
if(x-lastX)^2+(y-lastY)^2<62 then if(x-lastX)^2+(y-lastY)^2<62 then
@@ -259,7 +260,8 @@ function love.keypressed(key,_,isRep)
devMode=1 devMode=1
MES.new('info',"DEBUG ON",.2) MES.new('info',"DEBUG ON",.2)
elseif key=="f11"then elseif key=="f11"then
switchFullscreen() SETTING.fullscreen=not SETTING.fullscreen
applyFullscreen()
saveSettings() saveSettings()
elseif not SCN.swapping then elseif not SCN.swapping then
if SCN.keyDown then if SCN.keyDown then
@@ -349,9 +351,9 @@ function love.directorydropped(dir)
end end
local lastGCtime=0 local lastGCtime=0
function love.lowmemory() function love.lowmemory()
if TIME()-lastGCtime>6.26 then if love.timer.getTime()-lastGCtime>6.26 then
collectgarbage() collectgarbage()
lastGCtime=TIME() lastGCtime=love.timer.getTime()
MES.new('check',"[auto GC] low MEM 设备内存过低") MES.new('check',"[auto GC] low MEM 设备内存过低")
end end
end end
@@ -374,7 +376,11 @@ local function secondLoopThread()
repeat yield()until mainLoop() repeat yield()until mainLoop()
end end
function love.errorhandler(msg) function love.errorhandler(msg)
if not msg then msg="Unknown error" end if type(msg)~='string'then
msg="Unknown error"
elseif msg:find("Invaild UTF-8")and text then
msg=text.tryAnotherBuild
end
--Generate error message --Generate error message
local err={"Error:"..msg} local err={"Error:"..msg}
@@ -404,7 +410,7 @@ function love.errorhandler(msg)
--Write messages to log file --Write messages to log file
love.filesystem.append('conf/error.log', love.filesystem.append('conf/error.log',
os.date("%Y/%m/%d %A %H:%M:%S\n").. os.date("%Y/%m/%d %A %H:%M:%S\n")..
#ERRDATA.." crash(es) "..SYSTEM.."-"..VERSION.string.." scene: "..scn.."\n".. #ERRDATA.." crash(es) "..love.system.getOS().."-"..VERSION.string.." scene: "..scn.."\n"..
table.concat(err,"\n",1,c-2).."\n\n" table.concat(err,"\n",1,c-2).."\n\n"
) )
@@ -445,7 +451,7 @@ function love.errorhandler(msg)
FONT.set(100)gc_print(":(",100,0,0,1.2) FONT.set(100)gc_print(":(",100,0,0,1.2)
FONT.set(40)gc.printf(errorMsg,100,160,SCR.w0-100) FONT.set(40)gc.printf(errorMsg,100,160,SCR.w0-100)
FONT.set(20) FONT.set(20)
gc_print(SYSTEM.."-"..VERSION.string.." scene:"..(SCN and SCN.cur or"NULL"),100,660) gc_print(love.system.getOS().."-"..VERSION.string.." scene:"..(SCN and SCN.cur or"NULL"),100,660)
gc.printf(err[1],100,360,1260-100) gc.printf(err[1],100,360,1260-100)
gc_print("TRACEBACK",100,450) gc_print("TRACEBACK",100,450)
for i=4,#err-2 do for i=4,#err-2 do
@@ -520,10 +526,10 @@ function love.run()
local FPS,MINI=love.timer.getFPS,love.window.isMinimized local FPS,MINI=love.timer.getFPS,love.window.isMinimized
local PUMP,POLL=love.event.pump,love.event.poll local PUMP,POLL=love.event.pump,love.event.poll
local TIME,SETTING,VERSION=TIME,SETTING,VERSION local timer,SETTING,VERSION=love.timer.getTime,SETTING,VERSION
local frameTimeList={} local frameTimeList={}
local lastFrame=TIME() local lastFrame=timer()
local lastFreshPow=lastFrame local lastFreshPow=lastFrame
local FCT=0--Framedraw counter, from 0~99 local FCT=0--Framedraw counter, from 0~99
@@ -537,7 +543,7 @@ function love.run()
return function() return function()
local _ local _
local time=TIME() local time=timer()
local dt=time-lastFrame local dt=time-lastFrame
lastFrame=time lastFrame=time
@@ -689,9 +695,9 @@ function love.run()
end end
--Keep 60fps --Keep 60fps
_=TIME()-lastFrame _=timer()-lastFrame
if _<.0162 then WAIT(.0162-_)end if _<.0162 then WAIT(.0162-_)end
while TIME()-lastFrame<1/60 do end while timer()-lastFrame<1/60 do end
end end
end end
@@ -699,7 +705,7 @@ local Z={}
function Z.setIfPowerInfo(func)showPowerInfo=func end function Z.setIfPowerInfo(func)showPowerInfo=func end
--Warning: color and line width is uncertain value, set it in the function. --[Warning] Color and line width is uncertain value, set it in the function.
function Z.setCursor(func)drawCursor=func end function Z.setCursor(func)drawCursor=func end
--Change F1~F7 events of devmode (F8 mode) --Change F1~F7 events of devmode (F8 mode)

View File

@@ -47,7 +47,7 @@ function LANG.init(defaultLang,langList,publicText,pretreatFunc)
function LANG.addScene(name) function LANG.addScene(name)
for _,L in next,langList do for _,L in next,langList do
if L.WidgetText and not L.WidgetText[name]then if L.WidgetText and not L.WidgetText[name]then
L.WidgetText[name]={back=L.back} L.WidgetText[name]={}
end end
end end
end end

View File

@@ -3,7 +3,7 @@ local ins=table.insert
local logs={os.date("Techmino logs %Y/%m/%d %A")} local logs={os.date("Techmino logs %Y/%m/%d %A")}
local function log(message) local function log(message)
ins(logs,os.date("%H:%M:%S")..message) ins(logs,os.date("[%H:%M:%S] ")..message)
end end
local LOG=setmetatable({logs=logs},{ local LOG=setmetatable({logs=logs},{

View File

@@ -2,10 +2,10 @@ package.cpath=package.cpath..';'..SAVEDIR..'/lib/lib?.so;'..'?.dylib'
local loaded={} local loaded={}
return function(libName) return function(libName)
local require=require local require=require
if SYSTEM=='OS X'then if love.system.getOS()=='OS X'then
require=package.loadlib(libName..'.dylib','luaopen_'..libName) require=package.loadlib(libName..'.dylib','luaopen_'..libName)
libname=nil libname=nil
elseif SYSTEM=='Android'then elseif love.system.getOS()=='Android'then
if not loaded[libName]then if not loaded[libName]then
local platform=(function() local platform=(function()
local p=io.popen('uname -m') local p=io.popen('uname -m')

View File

@@ -4,6 +4,7 @@ local abs=math.abs
local scenes={} local scenes={}
local SCN={ local SCN={
mainTouchID=nil, --First touching ID(userdata)
cur='NULL', --Current scene name cur='NULL', --Current scene name
swapping=false, --If Swapping swapping=false, --If Swapping
stat={ stat={
@@ -52,6 +53,7 @@ function SCN.swapUpdate(dt)
if S.time<S.changeTime and S.time+dt>=S.changeTime then if S.time<S.changeTime and S.time+dt>=S.changeTime then
--Scene swapped this frame --Scene swapped this frame
SCN.init(S.tar,SCN.cur) SCN.init(S.tar,SCN.cur)
SCN.mainTouchID=nil
end end
if S.time<0 then if S.time<0 then
SCN.swapping=false SCN.swapping=false

View File

@@ -1,97 +1,158 @@
local SFX={ local type,rem=type,table.remove
vol=1,
stereo=1, local sfxList={}
getCount=function()return 0 end, local packSetting={}
load=function()error("Cannot load before init!")end, local Sources={}
fieldPlay=NULL, local volume=1
play=NULL, local stereo=1
fplay=NULL,
reset=NULL, local noteName={
C=1,c=1,
D=3,d=3,
E=5,e=5,
F=6,f=6,
G=8,g=8,
A=10,a=10,
B=12,b=12,
} }
local function _getTuneHeight(tune)
local octave=tonumber(tune:sub(-1,-1))
if octave then
local tuneHeight=noteName[tune:sub(1,1)]
if tuneHeight then
tuneHeight=tuneHeight+(octave-1)*12
local s=tune:sub(2,2)
if s=='s'or s=='#'then
tuneHeight=tuneHeight+1
elseif s=='f'or s=='b'then
tuneHeight=tuneHeight-1
end
return tuneHeight
end
end
end
local SFX={}
function SFX.init(list)
assert(type(list)=='table',"Initialize SFX lib with a list of filenames!")
for i=1,#list do table.insert(sfxList,list[i])end
end
function SFX.load(path)
local c=0
for i=1,#sfxList do
local fullPath=path..sfxList[i]..'.ogg'
if love.filesystem.getInfo(fullPath)then
Sources[sfxList[i]]={love.audio.newSource(fullPath,'static')}
c=c+1
else
LOG("No SFX: "..sfxList[i]..'.ogg',.1)
end
end
LOG(c.."/"..#sfxList.." SFX files loaded")
end
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
LOG((num-1).." "..pack.name.." samples loaded")
end
function SFX.getCount()
return #sfxList
end
function SFX.setVol(v) function SFX.setVol(v)
assert(type(v)=='number'and v>=0 and v<=1) assert(type(v)=='number'and v>=0 and v<=1)
SFX.vol=v volume=v
end end
function SFX.setStereo(v) function SFX.setStereo(v)
assert(type(v)=='number'and v>=0 and v<=1) assert(type(v)=='number'and v>=0 and v<=1)
SFX.stereo=v stereo=v
end end
function SFX.init(list)
SFX.init=nil
local rem=table.remove
local Sources={}
local count=#list function SFX.getCount()return count end function SFX.playSample(pack,...)--vol-2, sampSet1, vol-3, sampSet2, vol-1
function SFX.load(path) if ... then
for i=1,count do local arg={...}
local fullPath=path..list[i]..'.ogg' local vol
if love.filesystem.getInfo(fullPath)then if type(arg[#arg])=='number'then vol=rem(arg)end
Sources[list[i]]={love.audio.newSource(fullPath,'static')} for i=1,#arg do
if type(arg[i])=='number'then
vol=arg[i]
else else
LOG("No SFX: "..list[i]..'.ogg',.1) local tune=arg[i]
tune=_getTuneHeight(tune)-packSetting[pack].base
SFX.play(pack..tune,vol)
end end
end end
end
function SFX.play(s,vol,pos) end
if SFX.vol==0 or vol==0 then return end function SFX.play(name,vol,pos)
local S=Sources[s]--Source list if volume==0 or vol==0 then return end
if not S then return end local S=Sources[name]--Source list
local n=1 if not S then return end
while S[n]:isPlaying()do local n=1
n=n+1 while S[n]:isPlaying()do
if not S[n]then n=n+1
S[n]=S[1]:clone() if not S[n]then
S[n]:seek(0) S[n]=S[1]:clone()
break S[n]:seek(0)
end break
end
S=S[n]--AU_SRC
if S:getChannelCount()==1 then
if pos then
pos=pos*SFX.stereo
S:setPosition(pos,1-pos^2,0)
else
S:setPosition(0,0,0)
end
end
S:setVolume(((vol or 1)*SFX.vol)^1.626)
S:play()
end end
function SFX.fplay(s,vol,pos) end
local S=Sources[s]--Source list S=S[n]--AU_SRC
if not S then return end if S:getChannelCount()==1 then
local n=1 if pos then
while S[n]:isPlaying()do pos=pos*stereo
n=n+1 S:setPosition(pos,1-pos^2,0)
if not S[n]then else
S[n]=S[1]:clone() S:setPosition(0,0,0)
S[n]:seek(0)
break
end
end
S=S[n]--AU_SRC
if S:getChannelCount()==1 then
if pos then
pos=pos*SFX.stereo
S:setPosition(pos,1-pos^2,0)
else
S:setPosition(0,0,0)
end
end
S:setVolume(vol^1.626)
S:play()
end end
function SFX.reset() end
for _,L in next,Sources do S:setVolume(((vol or 1)*volume)^1.626)
if type(L)=='table'then S:play()
for i=#L,1,-1 do end
if not L[i]:isPlaying()then function SFX.fplay(name,vol,pos)
rem(L,i) local S=Sources[name]--Source list
end if not S then return end
end local n=1
while S[n]:isPlaying()do
n=n+1
if not S[n]then
S[n]=S[1]:clone()
S[n]:seek(0)
break
end
end
S=S[n]--AU_SRC
if S:getChannelCount()==1 then
if pos then
pos=pos*stereo
S:setPosition(pos,1-pos^2,0)
else
S:setPosition(0,0,0)
end
end
S:setVolume(vol^1.626)
S:play()
end
function SFX.reset()
for _,L in next,Sources do
if type(L)=='table'then
for i=#L,1,-1 do
if not L[i]:isPlaying()then
rem(L,i)
end end
end end
end end
end end
end end
return SFX return SFX

View File

@@ -23,7 +23,7 @@ function TASK.update(dt)
end end
function TASK.new(code,...) function TASK.new(code,...)
local thread=coroutine.create(code) local thread=coroutine.create(code)
resume(thread,...) assert(resume(thread,...))
if status(thread)~='dead'then if status(thread)~='dead'then
tasks[#tasks+1]={ tasks[#tasks+1]={
thread=thread, thread=thread,

12
Zframework/test.lua Normal file
View File

@@ -0,0 +1,12 @@
local TEST={}
--Wait for the scene swapping animation to finish
function TEST.yieldUntilNextScene()
while SCN.swapping do YIELD()end
end
function TEST.yieldN(frames)
for _=1,frames do YIELD()end
end
return TEST

View File

@@ -1,6 +1,12 @@
local level={0,0,.01,.016,.023,.03,.04,.05,.06,.07,.08,.09,.12,.15} local level={0,0,.01,.016,.023,.03,.04,.05,.06,.07,.08,.09,.12,.15}
local vib=love.system.vibrate local vib=love.system.vibrate
return function(t) return love.system.getOS()=='iOS'and
t=level[t] function(t)
if t then vib(t)end t=level[t]
end if t then vib(t<=.03 and 1 or t<=.09 and 2 or 3)end
end
or
function(t)
t=level[t]
if t then vib(t)end
end

View File

@@ -151,7 +151,7 @@ local readThread=coroutine.wrap(function()
if op==8 then--8=close if op==8 then--8=close
CHN_push(readCHN,8)--close CHN_push(readCHN,8)--close
if type(res)=='string'then if type(res)=='string'then
CHN_push(readCHN,res:sub(3))--Warning: 2 bytes close code at start so :sub(3) CHN_push(readCHN,res:sub(3))--[Warning] 2 bytes close code at start so :sub(3)
else else
CHN_push(readCHN,"WS closed") CHN_push(readCHN,"WS closed")
end end

View File

@@ -10,6 +10,7 @@ local gc_rectangle=gc.rectangle
local gc_print,gc_printf=gc.print,gc.printf local gc_print,gc_printf=gc.print,gc.printf
local kb=love.keyboard local kb=love.keyboard
local timer=love.timer.getTime
local next=next local next=next
local int,ceil,abs=math.floor,math.ceil,math.abs local int,ceil,abs=math.floor,math.ceil,math.abs
@@ -434,7 +435,7 @@ end
function switch:press() function switch:press()
self.code() self.code()
if self.sound then if self.sound then
SFX.play('move') SFX.play('touch')
end end
end end
function WIDGET.newSwitch(D)--name,x,y[,lim][,fText][,color][,font=30][,sound=true][,disp],code[,hideF][,hide] function WIDGET.newSwitch(D)--name,x,y[,lim][,fText][,color][,font=30][,sound=true][,disp],code[,hideF][,hide]
@@ -571,8 +572,8 @@ function slider:drag(x)
if p~=P then if p~=P then
self.code(P) self.code(P)
end end
if self.change and TIME()-self.lastTime>.5 then if self.change and timer()-self.lastTime>.5 then
self.lastTime=TIME() self.lastTime=timer()
self.change() self.change()
end end
end end
@@ -586,8 +587,8 @@ function slider:scroll(n)
local P=n==-1 and max(p-u,0)or min(p+u,self.unit) local P=n==-1 and max(p-u,0)or min(p+u,self.unit)
if p==P or not P then return end if p==P or not P then return end
self.code(P) self.code(P)
if self.change and TIME()-self.lastTime>.18 then if self.change and timer()-self.lastTime>.18 then
self.lastTime=TIME() self.lastTime=timer()
self.change() self.change()
end end
end end
@@ -656,15 +657,16 @@ local selector={
function selector:reset() function selector:reset()
self.ATV=0 self.ATV=0
local V,L=self.disp(),self.list local V,L=self.disp(),self.list
local i=TABLE.find(L,V) for i=1,#L do
if i then if L[i]==V then
self.select=i self.select=i
self.selText=self.list[i] self.selText=self.list[i]
else return
self.select=0 end
self.selText=""
MES.new('error',"Selector "..self.name.." dead, disp= "..tostring(V))
end end
self.select=0
self.selText=""
MES.new('error',"Selector "..self.name.." dead, disp= "..tostring(V))
end end
function selector:isAbove(x,y) function selector:isAbove(x,y)
return return
@@ -696,7 +698,7 @@ function selector:draw()
--Arrow --Arrow
gc_setColor(1,1,1,.2+ATV*.1) gc_setColor(1,1,1,.2+ATV*.1)
local t=(TIME()%.5)^.5 local t=(timer()%.5)^.5
if self.select>1 then if self.select>1 then
gc_draw(smallerThen,x+6,y+33) gc_draw(smallerThen,x+6,y+33)
if ATV>0 then if ATV>0 then
@@ -1429,7 +1431,7 @@ function WIDGET.textinput(texts)
if W and W.type=='inputBox'then 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 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 WIDGET.sel.value=WIDGET.sel.value..texts
SFX.play('move') SFX.play('touch')
else else
SFX.play('finesseError',.3) SFX.play('finesseError',.3)
end end
@@ -1456,8 +1458,8 @@ function WIDGET.gamepadPressed(i)
local P=i=="left"and(p>0 and p-1)or p<W.unit and p+1 local P=i=="left"and(p>0 and p-1)or p<W.unit and p+1
if p==P or not P then return end if p==P or not P then return end
W.code(P) W.code(P)
if W.change and TIME()-W.lastTime>.18 then if W.change and timer()-W.lastTime>.18 then
W.lastTime=TIME() W.lastTime=timer()
W.change() W.change()
end end
end end

View File

@@ -1,87 +0,0 @@
# 代码规范
注:小程序和外部库等部分代码可以不遵守
## 缩进
全部使用四个空格
## 文件尾
文件尾要有空行
## 变量名
库 全大写
库方法和全局变量 小驼峰
局部函数 下划线开头小驼峰
简单的局部变量 多个单词首字母或大写单字母
需要阅读的局部变量 小驼峰
## 常用语句块格式
```lua
f() -- 语句末不需要加分号
if c1 then
s1
elseif c2 then
s2
else
s3
end
while c do
s
end
for i=1,#l do
s
end
for k,v in next,table do -- pairs(table)最好换成next,table
s
end
repeat
s
until c
do
s
end
```
## 单行/多行注释
```lua
--注释1
--注释2
--[[这里最好带上几个字的概述,方便折叠的时候预览,方括号间等号能不带就不带
注释内容
]]
```
## 字符串
可能输出到外部给玩家或者看的(或给开发者看的debug信息)用双引号
只存在于代码中不对外展示的字符串用单引号
双方括号(等号能不带就不带)用于大段文本
## 代码紧凑
### 少空格(这几种地方不要用空格)
逗号后
运算符两边
左括号前
右括号后
### 省小括号
如果一个函数只能接受一个输入
并且输入的值是table或者string
那么小括号要省略,例如
GC.DO{100,40
{'print',"Hello",0,0},
{'print',"World",0,20},
}
### 少空格紧凑方法
用正则查找替换,把
\s?([+\-*/=()\[\]{}"']|==|>=|<=|~=|\.\.)\s?
全部替换成
$1
注意,需要缩进模式为制表符,可以先切到制表符然后替换再切回去
注意,字符串常量内部首尾空格会被替换
## goto
### 所有标签必须使用下列前缀的一个
BREAK_ 类似一般的break,用于跳出任意层,可能跳过循环后一部分代码
CONTINUE_ 类似一般的continue,用于快速跳到循环的末尾执行下一次循环
THROW_ 类似一般的catch,用于捕获错误或跳出一个块并执行统一操作
REPEAT_ 返回到前面一个点,用于重新执行某个操作

View File

@@ -1,149 +0,0 @@
模式文件应当是一个合(语)法的lua程序文件其必须返回一个table里面的内容包括
color:
必选
模式的颜色,用于点击地图图标后显示的提示文本
env:
必选
模式环境变量,决定了关卡的各项属性
*属性名* *默认值* *说明*
drop 60 下落延迟(帧,支持正整数,1/2^n,和0(20G))
lock 60 锁定延迟(帧)
wait 0 出块延迟(帧)
fall 0 消行延迟(帧)
bone false 是否开启骨块模式
fieldH 20 场地高度
heightLimit 1e99 允许的最大场地高度
nextCount 6 显示next个数
nextStartPos 1 next从第几个开始显示
holdCount 1 hold个数
infHold false 是否能无限hold
phyHold false 是否开启物理hold
ospin true 是否能O-spin
deepDrop false 是否开启深降
RS 'TRS' 旋转系统名
das 10 DAS
arr 2 ARR
sddas 2 软降DAS
sdarr 2 软降ARR
mindas 0 允许的最小DAS
minarr 0 允许的最小ARR
minsdarr 0 允许的最小软降ARR
ihs true 提前Hold
irs true 提前旋转
ims true 提前移动
skinSet [设置] 方块贴图,只能填写内置皮肤的名字
skin [设置] 方块颜色包含25个整数(1~16)的table
face [设置] 方块朝向包含25个整数(0~3)的table
block true 是否显示方块
ghost 0.3 影子透明度(0~1)
center 1 旋转中心透明度(0~1)
smooth false 是否平滑下落
grid 0.16 网格透明度(0~1)
bagLine true 是否显示包分界线(如果存在)
lockFX 2 锁定特效等级(0~5整数)
dropFX 2 瞬间下落特效等级(0~5整数)
moveFX 2 移动特效等级(0~5整数)
clearFX 2 消除特效等级(0~5整数)
splashFX 2 溅射特效等级(0~5整数)
shakeFX 2 晃动特效等级(0~5整数)
atkFX 2 攻击特效等级(0~5整数)
text true 是否显示消行文本
score true 是否显示落块分数
highCam false 是否开启超屏视野
nextPos false 是否开启生成预览
showSpike false 是否开启spike计数器
hideBoard false 场地隐藏模式("down"|"up"|"all")
flipBoard false 场地翻转模式("U-D"|"L-R"|"180")
sequence bag' 序列模式是放一块后对next序列的刷新函数可以使用默认的几个函数用字符串表示。也可以自己写一个注意使用协程技术
seqData {1,2,3,4,5,6,7}序列模式使用的"包"数据(本质是生成序列用的数据会作为参数传进上面那个叫sequence的序列生成函数不一定是包)
mission false 包含任务的table说明暂时略
life 0 生命数(复活次数)
garbageSpeed 1 垃圾行释放速度
pushSpeed 3 垃圾行上涨速度
noTele false 是否禁止10个高级按键
visible 'show' 方块可见性,填写固定的几个字符串
freshLimit 1e99 锁延刷新次数限制
easyFresh true 是否使用简单锁延刷新规则
bufferLimit 1e99 攻击缓冲行数上限
fkey1 false 按下功能键1后执行的函数
fkey2 false 按下功能键2后执行的函数
keyCancel {} 包含禁止使用的按键的id例如{1,2}就是禁止左移和右移
fine [设置] 是否开启非极简提示音
fineKill false 是否开启非极简即死
b2bKill false 是否开启断b2b即死
missionKill false 是否开启强制任务
noInitSZO false 是否禁止SZO块开局如果禁止开局序列会自动跳过最多连续五个SZO
mesDisp NULL 需要在玩家侧边栏显示的信息(或函数列表,依次执行,可以显示在外面但是强烈不建议),输入玩家对象
dropPiece NULL 放一块后要执行的函数(或函数列表,依次执行),输入玩家对象
task NULL 每帧会*继续执行*的函数(或函数列表,依次执行,返回true会把自身从队列里清除)(初始化时会执行一次,可以用来设置场地等),输入玩家对象,注意:使用协程技术
eventSet false 使用预设事件套件名称(字符串),和上面三个套件会叠加,使用时请小心,尽量不要同时指定太多组件
bg 'none' 背景,只能填写内置背景的名字
bgm 'race' 背景音乐名(或者列表随机,例如{'race','push'}),只能用内置音乐库的音乐名
allowMod true 是否允许mod
load:
必选
模式初始化函数,一般创建一个玩家即可
无输入
无输出
score:
可选(不填就没有分数保存和计算)
一局打完后要存储的数据
输入玩家对象
输出游戏结束瞬间返回一个包含直接决定该模式成绩的数据table(会被强制加上date标签)
scoreDisp:
可选(模式不出现在地图上的时候不用写)
是把score()存起来的table转换为字符串显示出来的函数
输入一个成绩table
输出一个字符串
comp:
可选(没有score函数的时候不用写)
是成绩table之间对比并排序的规则
输入两个成绩table
输出[第一个是不是排在第二个前面]的布尔值(可以类比"小于"运算)
getRank:
可选,模式评级函数
是用于评价玩家表现的函数
输入玩家对象
输出0~50表示除了记录到排行榜外什么都不做1/2/3/4/5表示D/C/B/A/S级能解锁连接的模式还会让模式图标在地图上显示不同的颜色
以下是40行的模式文件内容:
//sprint_40l.lua
return{--返回一个table你也可以在之前定义一些常量或者函数什么的
color=COLOR.green,--颜色
env={--模式环境变量
drop=60,lock=60,
eventSet='checkLine_40',--这个预设eventSet包含了dropPiece和mesDisp就是40行需要的东西
bg='bg2',bgm='race',
},
load=function()--模式加载函数,这里只生成了一个玩家,常用的单人模式可以不写,默认使用这个函数
PLY.newPlayer(1)--1是玩家编号默认用户控制1号玩家
end,
score=function(P)return{P.stat.time,P.stat.piece}end,--游戏结束时需要保存的本局关键信息
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,--把score返回的数据显示出来的方法
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,--按照时间排序,时间一样就看块数
getRank=function(P)--计算评级
if P.stat.row<40 then return end--你总得打完40行对吧否则直接return空掉成绩都不记录
local T=P.stat.time
return
T<=26 and 5 or--时间小于等于26秒就是S级要求
T<=32.6 and 4 or--A级要求
T<=52.6 and 3 or--B级要求
T<=92.9 and 2 or--C级要求
T<=183 and 1 or--D级要求解锁别的模式的最低标准
0--记录成绩的最低标准
end,
}

View File

@@ -1,59 +0,0 @@
Techmino配音说明文档
每一个都可以录任意多条,用的时候会随机取一个,听起来更自然
每一个都可以录任意多条,用的时候会随机取一个,听起来更自然
每一个都可以录任意多条,用的时候会随机取一个,听起来更自然
多条语音说明:
录了多条的在播放时会随机挑选一个播放,所以组合性的语音大概率不能随意发挥,不然和其他组合起来可能就会出现奇怪的现象
多条mini语音文件名应为 mini_1.oggmini_2.ogg...
如果只有一个,"_1"可以省略一个mini.ogg就行但是多个文件的数字不能跳开必须从1开始一个个写
投稿语音包请使用wav格式方便我留源文件未来有需要的时候重新转格式
打算自己导入游戏的话需要降噪+裁剪+调整音量后再转为ogg格式 不支持别的因为ogg体积小
目前游戏内正在使用的音频:
【尖括号里是念的,方括号里是文件名,没写就跟尖括号里一样】
【尖括号里是念的,方括号里是文件名,没写就跟尖括号里一样】
【尖括号里是念的,方括号里是文件名,没写就跟尖括号里一样】
<single>
<double>
<triple>
<techrash> 读作\'tekrʌʃ\
<pentacrash> 读作\'ˈpæntəkrʌʃ\
<hexacrash> 读作\'heksəkrʌʃ\
用于消行
<mini>
<b2b> 读作back to back有点长可以读快一点
<b2b2b> 读作back to back to back有点长可以读快一点
用于加在 *-spin 前面,注意结束时语气要上扬,后面要接东西
<z spin>[zspin0] 用于不消行注意结束时语气要下降注意这个文件名就是自带0后面还要接_1 _2等
<z spin>[zspin] 用于消行,注意结束时语气要上扬,后面要接东西
这两条要有所有方块的版本,文件名就替换第一个字母,包括:
Z S L J T O I四连块
P Q F E U V W X R Y N H五连块
C三连块
<all clear>[all_clear] 全消语音建议也录几个perfect clear
<clear> 半全消语音建议也录几个half clear
<win> 胜利语音,自由发挥
<lose> 失败语音,自由发挥
<welcome> 开游戏语音,自由发挥
<bye> 关游戏语音,自由发挥
这几个长度不要太长最多最多最多2秒建议多录几种不同的
<test> 测试音量用语音,要非常短,比如“啊”“喵”“呜”
<happy> 彩蛋语音,建议用短的笑声
<doubt> 彩蛋语音,建议“嗯?”声
目前没有用到但是将要加入的,可能会修改导致用不上,条件方便的话可以顺便带上:
<split> 隔断消除
<air> 架空消除
<mix> 混合消除
<color> 彩色消除
<deep> 穿透消除
注意这些结束时语气全都要上扬,后面要接东西

View File

@@ -1,29 +1,54 @@
TECHMINO © 2019-2021 26F Studio. Some rights reserved. **TECHMINO © 2019-2021 26F Studio. Some rights reserved.**
TECHMINO and "26F Studio" are trademarks of 26F Studio. 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. The TECHMINO game and source code are under a GNU Lesser General Public License Version 3.
TECHMINO is not a fan game. TECHMINO and 26F Studio are not affiliated with Tetris Holding, LLC or The Tetris Company, Inc. in any way.
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.
Powered by LÖVE, © 2006-2021 LÖVE Development Team. Powered by LÖVE, © 2006-2021 LÖVE Development Team.
Lua is free software distributed under the terms of the MIT license. Copyright © 1994~2021 by Lua.org, PUC-Rio. Lua is free software distributed under the terms of the MIT license. Copyright © 1994~2021 by Lua.org, PUC-Rio.
The Apple logo, "Apple Inc.," iOS, iPadOS, macOS, iPhone, and Mac are registered trademarks of Apple Inc. in the United States of America and other countries or regions. The Apple logo, "Apple Inc.," iOS, iPadOS, macOS, iPhone, and Mac are registered trademarks of Apple Inc. in the United States of America and other countries or regions.
"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. "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. 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.
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. 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.
"PlayStation", "PS", "PlayStation Family Mark", "PS logo", "DualSense" and "Play Has No Limits" are registered trademarks or trademarks of Sony Interactive Entertainment Inc. "SONY" is a registered trademark of Sony Corporation. © 2021 Sony Interactive Entertainment LLC. "PlayStation", "PS", "PlayStation Family Mark", "PS logo", "DualSense" and "Play Has No Limits" are registered trademarks or trademarks of Sony Interactive Entertainment Inc. "SONY" is a registered trademark of Sony Corporation. © 2021 Sony Interactive Entertainment LLC.
N3TWORK is a registered trademark of N3TWORK Inc. © 2021 N3TWORK Inc.
"EA" and "Electronic Arts" are registered trademarks of Electronic Arts Inc. © 2021 Electronic Arts Inc.
Oculus Quest is a registered trademark of Facebook Technologies, LLC. © Facebook, Inc.
GoldWave is a registered trademark of GoldWave, Inc. GoldWave is a registered trademark of GoldWave, Inc.
Linux is a registered trademark of Linus Torvalds. Linux is a registered trademark of Linus Torvalds.
Touhou Project © Team Shanghai Alice 2002-2021. Touhou Project © Team Shanghai Alice 2002-2021.
All other trademarks are the property of their respective owners.
All other trademarks are the properties of their respective owners.

186
main.lua
View File

@@ -28,6 +28,8 @@ MOBILE=SYSTEM=='Android'or SYSTEM=='iOS'
SAVEDIR=fs.getSaveDirectory() SAVEDIR=fs.getSaveDirectory()
--Global Vars & Settings --Global Vars & Settings
SFXPACKS={'chiptune'}
VOCPACKS={'miya','mono','xiaoya','miku'}
FIRSTLAUNCH=false FIRSTLAUNCH=false
DAILYLAUNCH=false DAILYLAUNCH=false
@@ -42,18 +44,24 @@ if MOBILE then
love.window.setMode(w,h,f) love.window.setMode(w,h,f)
end end
local _LOADTIMELIST_={}
local _LOADTIME_=TIME()
--Load modules --Load modules
Z=require'Zframework' Z=require'Zframework'
FONT.init('parts/fonts/proportional.ttf') FONT.load('parts/fonts/proportional.ttf')
SCR.setSize(1280,720)--Initialize Screen size SCR.setSize(1280,720)--Initialize Screen size
BGM.setChange(function(name)MES.new('music',text.nowPlaying..name,5)end) BGM.setChange(function(name)MES.new('music',text.nowPlaying..name,5)end)
table.insert(_LOADTIMELIST_,("Load Zframework: %.3fs"):format(TIME()-_LOADTIME_))
--Create shortcuts --Create shortcuts
setFont=FONT.set setFont=FONT.set
getFont=FONT.get getFont=FONT.get
mStr=GC.mStr mStr=GC.mStr
mText=GC.simpX mText=GC.simpX
mDraw=GC.draw mDraw=GC.draw
Snd=SFX.playSample
--Delete all naked files (from too old version) --Delete all naked files (from too old version)
FILE.clear('') FILE.clear('')
@@ -69,19 +77,19 @@ for _,v in next,{'conf','record','replay','cache','lib'}do
end end
end end
CHAR=require'parts.char'
require'parts.gameTables'
require'parts.gameFuncs'
--Load shader files from SOURCE ONLY --Load shader files from SOURCE ONLY
SHADER={} SHADER={}
for _,v in next,fs.getDirectoryItems('parts/shaders')do for _,v in next,fs.getDirectoryItems('parts/shaders')do
if fs.getRealDirectory('parts/shaders/'..v)~=SAVEDIR then if isSafeFile('parts/shaders/'..v)then
local name=v:sub(1,-6) local name=v:sub(1,-6)
SHADER[name]=love.graphics.newShader('parts/shaders/'..name..'.glsl') SHADER[name]=love.graphics.newShader('parts/shaders/'..name..'.glsl')
end end
end end
CHAR=require'parts.char'
require'parts.gameTables'
require'parts.gameFuncs'
FREEROW= require'parts.freeRow' FREEROW= require'parts.freeRow'
DATA= require'parts.data' DATA= require'parts.data'
@@ -93,9 +101,11 @@ VK= require'parts.virtualKey'
BOT= require'parts.bot' BOT= require'parts.bot'
RSlist= require'parts.RSlist'DSCP=RSlist.TRS.centerPos RSlist= require'parts.RSlist'DSCP=RSlist.TRS.centerPos
PLY= require'parts.player' PLY= require'parts.player'
netPLY= require'parts.netPlayer' NETPLY= require'parts.netPlayer'
MODES= require'parts.modes' MODES= require'parts.modes'
table.insert(_LOADTIMELIST_,("Load Parts: %.3fs"):format(TIME()-_LOADTIME_))
--Init Zframework --Init Zframework
Z.setIfPowerInfo(function() Z.setIfPowerInfo(function()
return SETTING.powerInfo and LOADED return SETTING.powerInfo and LOADED
@@ -117,7 +127,7 @@ do--Z.setCursor
Z.setCursor(function(time,x,y) Z.setCursor(function(time,x,y)
if not SETTING.sysCursor then if not SETTING.sysCursor then
local R=int((time+1)/2)%7+1 local R=int((time+1)/2)%7+1
_=minoColor[SETTING.skin[R]] _=BLOCK_COLORS[SETTING.skin[R]]
gc_setColor(_[1],_[2],_[3],min(abs(1-time%2),.3)) gc_setColor(_[1],_[2],_[3],min(abs(1-time%2),.3))
_=DSCP[R][0] _=DSCP[R][0]
gc_draw(TEXTURE.miniBlock[R],x,y,time%3.14159265359*4,16,16,_[2]+.5,#BLOCKS[R][0]-_[1]-.5) gc_draw(TEXTURE.miniBlock[R],x,y,time%3.14159265359*4,16,16,_[2]+.5,#BLOCKS[R][0]-_[1]-.5)
@@ -133,8 +143,8 @@ Z.setOnFnKeys({
function() function()
if GAME.playing and not GAME.net then if GAME.playing and not GAME.net then
for _=1,8 do for _=1,8 do
local P=PLY_ALIVE[math.random(#PLY_ALIVE)] if #PLY_ALIVE>1 then
if P and P~=PLAYERS[1]then local P=PLY_ALIVE[math.random(2,#PLY_ALIVE)]
P.lastRecv=PLAYERS[1] P.lastRecv=PLAYERS[1]
P:lose() P:lose()
end end
@@ -143,7 +153,7 @@ Z.setOnFnKeys({
end, end,
function()print(WIDGET.getSelected()or"no widget selected")end, function()print(WIDGET.getSelected()or"no widget selected")end,
function()for k,v in next,_G do print(k,v)end 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 do--Z.setOnFocus
local function task_autoSoundOff() local function task_autoSoundOff()
@@ -190,8 +200,8 @@ TABLE.cover (FILE.load('conf/user')or{},USER)
TABLE.cover (FILE.load('conf/unlock')or{},RANKS) TABLE.cover (FILE.load('conf/unlock')or{},RANKS)
TABLE.update(FILE.load('conf/settings')or{},SETTING) TABLE.update(FILE.load('conf/settings')or{},SETTING)
TABLE.update(FILE.load('conf/data')or{},STAT) TABLE.update(FILE.load('conf/data')or{},STAT)
TABLE.cover (FILE.load('conf/key')or{},keyMap) TABLE.cover (FILE.load('conf/key')or{},KEY_MAP)
TABLE.cover (FILE.load('conf/virtualkey')or{},VK_org) TABLE.cover (FILE.load('conf/virtualkey')or{},VK_ORG)
--Initialize fields, sequence, missions, gameEnv for cutsom game --Initialize fields, sequence, missions, gameEnv for cutsom game
local fieldData=FILE.load('conf/customBoards','string') local fieldData=FILE.load('conf/customBoards','string')
@@ -212,7 +222,7 @@ if missionData then
DATA.pasteMission(missionData) DATA.pasteMission(missionData)
end end
local customData=FILE.load('conf/customEnv') 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) TABLE.complete(customData,CUSTOMENV)
end end
TABLE.complete(require"parts.customEnv0",CUSTOMENV) TABLE.complete(require"parts.customEnv0",CUSTOMENV)
@@ -250,7 +260,7 @@ IMG.init{
'media/image/lanterns/6.png', 'media/image/lanterns/6.png',
}, },
} }
SKIN.init{ SKIN.load{
{name="crystal_scf",path='media/image/skin/crystal_scf.png'}, {name="crystal_scf",path='media/image/skin/crystal_scf.png'},
{name="matte_mrz",path='media/image/skin/matte_mrz.png'}, {name="matte_mrz",path='media/image/skin/matte_mrz.png'},
{name="shiny_cho",path='media/image/skin/shiny_cho.png'}, {name="shiny_cho",path='media/image/skin/shiny_cho.png'},
@@ -282,13 +292,11 @@ SKIN.init{
} }
--Initialize sound libs --Initialize sound libs
SFX.init((function() SFX.init((function()--[Warning] Not loading files here, just get the list of sound needed
local L={} local L={}
for _,v in next,fs.getDirectoryItems('media/effect/chiptune/')do for _,v in next,fs.getDirectoryItems('media/effect/chiptune/')do
if fs.getRealDirectory('media/effect/chiptune/'..v)~=SAVEDIR then if isSafeFile('media/effect/chiptune/'..v,"Dangerous file : %SAVE%/media/effect/chiptune/"..v)then
table.insert(L,v:sub(1,-5)) table.insert(L,v:sub(1,-5))
else
MES.new('warn',"Dangerous file : %SAVE%/media/effect/chiptune/"..v)
end end
end end
return L return L
@@ -296,10 +304,8 @@ end)())
BGM.init((function() BGM.init((function()
local L={} local L={}
for _,v in next,fs.getDirectoryItems('media/music')do for _,v in next,fs.getDirectoryItems('media/music')do
if fs.getRealDirectory('media/music/'..v)~=SAVEDIR then if isSafeFile('media/music/'..v,"Dangerous file : %SAVE%/media/music/"..v)then
table.insert(L,{name=v:sub(1,-5),path='media/music/'..v}) table.insert(L,{name=v:sub(1,-5),path='media/music/'..v})
else
MES.new('warn',"Dangerous file : %SAVE%/media/music/"..v)
end end
end end
return L return L
@@ -318,40 +324,49 @@ VOC.init{
LANG.init('zh', LANG.init('zh',
{ {
zh=require'parts.language.lang_zh', zh=require'parts.language.lang_zh',
zh2=require'parts.language.lang_zh2', zh_full=require'parts.language.lang_zh_full',
zh_trad=require'parts.language.lang_zh_trad',
en=require'parts.language.lang_en', en=require'parts.language.lang_en',
fr=require'parts.language.lang_fr', fr=require'parts.language.lang_fr',
es=require'parts.language.lang_es', es=require'parts.language.lang_es',
pt=require'parts.language.lang_pt', pt=require'parts.language.lang_pt',
grass=require'parts.language.lang_zh3', zh_grass=require'parts.language.lang_zh_grass',
yygq=require'parts.language.lang_yygq', zh_yygq=require'parts.language.lang_yygq',
symbol=require'parts.language.lang_symbol', symbol=require'parts.language.lang_symbol',
--1. Add language file to LANG folder; --1. Add language file to LANG folder;
--2. Require it; --2. Require it;
--3. Add a button in parts/scenes/setting_lang.lua; --3. Add a button in parts/scenes/lang.lua;
}, },
{ {
block=BLOCKNAMES block=BLOCK_NAMES
}, },
(function() (function()
local tipMeta={__call=function(L)return L[math.random(#L)]end} local tipMeta={__call=function(L)return L[math.random(#L)]end}
return function(L) return function(L)
if type(rawget(L,'getTip'))=='table'then setmetatable(L.getTip,tipMeta)end if type(rawget(L,'getTip'))=='table'then setmetatable(L.getTip,tipMeta)end
setmetatable(L,{__index=function(self,k)
local mes="No Text ("..SETTING.locale.."): "..k
LOG(mes)
MES.new('warn',mes)
self[k]=CHAR.zChan.thinking
return self[k]
end})
end end
end)() end)()
) )
table.insert(_LOADTIMELIST_,("Initialize Parts: %.3fs"):format(TIME()-_LOADTIME_))
--Load background files from SOURCE ONLY --Load background files from SOURCE ONLY
for _,v in next,fs.getDirectoryItems('parts/backgrounds')do for _,v in next,fs.getDirectoryItems('parts/backgrounds')do
if fs.getRealDirectory('parts/backgrounds/'..v)~=SAVEDIR then if isSafeFile('parts/backgrounds/'..v)and v:sub(-3)=='lua'then
if v:sub(-3)=='lua'then local name=v:sub(1,-5)
local name=v:sub(1,-5) BG.add(name,require('parts.backgrounds.'..name))
BG.add(name,require('parts.backgrounds.'..name))
end
end end
end end
--Load scene files from SOURCE ONLY --Load scene files from SOURCE ONLY
for _,v in next,fs.getDirectoryItems('parts/scenes')do for _,v in next,fs.getDirectoryItems('parts/scenes')do
if fs.getRealDirectory('parts/scenes/'..v)~=SAVEDIR then if isSafeFile('parts/scenes/'..v)then
local sceneName=v:sub(1,-5) local sceneName=v:sub(1,-5)
SCN.add(sceneName,require('parts.scenes.'..sceneName)) SCN.add(sceneName,require('parts.scenes.'..sceneName))
LANG.addScene(sceneName) LANG.addScene(sceneName)
@@ -360,11 +375,23 @@ end
--Load mode files --Load mode files
for i=1,#MODES do for i=1,#MODES do
local m=MODES[i]--Mode template local m=MODES[i]--Mode template
if fs.getRealDirectory('parts/modes/'..m.name)~=SAVEDIR then if isSafeFile('parts/modes/'..m.name)then
TABLE.complete(require('parts.modes.'..m.name),MODES[i]) TABLE.complete(require('parts.modes.'..m.name),MODES[i])
MODES[m.name],MODES[i]=MODES[i] MODES[m.name],MODES[i]=MODES[i]
end end
end end
for _,v in next,fs.getDirectoryItems('parts/modes')do
if isSafeFile('parts/modes/'..v)and not MODES[v:sub(1,-5)]then
local M={name=v:sub(1,-5)}
local modeData=require('parts.modes.'..M.name)
if modeData.env then
TABLE.complete(modeData,M)
MODES[M.name]=M
end
end
end
table.insert(_LOADTIMELIST_,("Load Files: %.3fs"):format(TIME()-_LOADTIME_))
--Update data --Update data
do do
@@ -417,6 +444,14 @@ do
fs.remove('record/round_l.rec') fs.remove('record/round_l.rec')
fs.remove('record/round_u.rec') fs.remove('record/round_u.rec')
end end
if STAT.version<1604 then
RANKS.stack_e=nil
RANKS.stack_h=nil
RANKS.stack_u=nil
fs.remove('record/stack_e.rec')
fs.remove('record/stack_h.rec')
fs.remove('record/stack_u.rec')
end
if RANKS.stack_20l then if RANKS.stack_20l then
RANKS.stack_20l=nil RANKS.stack_20l=nil
RANKS.stack_40l=nil RANKS.stack_40l=nil
@@ -426,15 +461,28 @@ do
fs.remove('record/stack_100l.rec') fs.remove('record/stack_100l.rec')
end end
if STAT.version~=VERSION.code then 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 STAT.version=VERSION.code
needSave=true needSave=true
love.event.quit('restart')
end end
SETTING.appLock=nil SETTING.appLock,SETTING.dataSaving,SETTING.swap=nil
SETTING.dataSaving=nil
if not SETTING.VKSkin then SETTING.VKSkin=1 end 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 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 SETTING.ghostType=='greyCell'then SETTING.ghostType='grayCell'end
if type(SETTING.skinSet)=='number'then SETTING.skinSet='crystal_scf'end if type(SETTING.skinSet)=='number'then SETTING.skinSet='crystal_scf'end
if not TABLE.find({8,10,13,17,22,29,37,47,62,80,100},SETTING.frameMul)then SETTING.frameMul=100 end if not TABLE.find({8,10,13,17,22,29,37,47,62,80,100},SETTING.frameMul)then SETTING.frameMul=100 end
@@ -444,7 +492,7 @@ do
if not RANKS.sprint_10l then RANKS.sprint_10l=0 end if not RANKS.sprint_10l then RANKS.sprint_10l=0 end
if RANKS.master_l then RANKS.master_n,RANKS.master_l=RANKS.master_l needSave=true end if RANKS.master_l then RANKS.master_n,RANKS.master_l=RANKS.master_l needSave=true end
if RANKS.master_u then RANKS.master_h,RANKS.master_u=RANKS.master_u needSave=true end if RANKS.master_u then RANKS.master_h,RANKS.master_u=RANKS.master_u needSave=true end
for _,v in next,VK_org do v.color=nil end for _,v in next,VK_ORG do v.color=nil end
for name,rank in next,RANKS do for name,rank in next,RANKS do
if type(name)=='number'or type(rank)~='number'then if type(name)=='number'or type(rank)~='number'then
RANKS[name]=nil RANKS[name]=nil
@@ -470,39 +518,23 @@ do
needSave=true needSave=true
end end
for k,v in next,oldModeNameTable 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 if needSave then
saveStats() saveStats()
saveProgress() saveProgress()
saveSettings() saveSettings()
love.event.quit('restart')
end end
end end
--First start for phones --First start for phones
if FIRSTLAUNCH and MOBILE then if FIRSTLAUNCH and MOBILE then
SETTING.VKSwitch=true SETTING.VKSwitch=true
SETTING.swap=false
SETTING.powerInfo=true SETTING.powerInfo=true
SETTING.cleanCanvas=true SETTING.cleanCanvas=true
end end
--Apply system setting --Apply system setting
applySettings() applyAllSettings()
--Load replays --Load replays
for _,fileName in next,fs.getDirectoryItems('replay')do for _,fileName in next,fs.getDirectoryItems('replay')do
@@ -510,7 +542,7 @@ for _,fileName in next,fs.getDirectoryItems('replay')do
local date,mode,version,player,seed,setting,mod local date,mode,version,player,seed,setting,mod
local fileData=fs.read('replay/'..fileName) local fileData=fs.read('replay/'..fileName)
date, fileData=STRING.readLine(fileData)date=date:gsub("[a-zA-Z]","") date, fileData=STRING.readLine(fileData)date=date:gsub("[a-zA-Z]","")
mode, fileData=STRING.readLine(fileData)mode=oldModeNameTable[mode]or mode mode, fileData=STRING.readLine(fileData)mode=MODE_UPDATE_MAP[mode]or mode
version,fileData=STRING.readLine(fileData) version,fileData=STRING.readLine(fileData)
player, fileData=STRING.readLine(fileData)if player=="Local Player"then player="Stacker"end player, fileData=STRING.readLine(fileData)if player=="Local Player"then player="Stacker"end
local success local success
@@ -549,3 +581,41 @@ for _,fileName in next,fs.getDirectoryItems('replay')do
table.insert(REPLAY,rep) table.insert(REPLAY,rep)
end end
table.sort(REPLAY,function(a,b)return a.fileName>b.fileName end) table.sort(REPLAY,function(a,b)return a.fileName>b.fileName end)
table.insert(_LOADTIMELIST_,("Initialize Data: %.3fs"):format(TIME()-_LOADTIME_))
for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i])end
--Launch testing task if launch param received
if TABLE.find(arg,'--test')then
TASK.new(function()
while not LOADED do YIELD()end
LOG("\27[92m\27[1mAutomatic Test Started\27[0m")
BGM.setVol(0)SFX.setVol(0)
love.keypressed('space')
TEST.yieldUntilNextScene()
for k,mode in next,MODES do
if k~='netBattle'then
LOG("Scanning mode: "..mode.name)
loadGame(mode.name,true)
TEST.yieldUntilNextScene()
SCN.back()
TEST.yieldUntilNextScene()
end
end
LOG("\27[92m\27[1mAutomatic Test Passed :)\27[0m")
TEST.yieldN(60)
love.event.quit(0)
end)
TASK.new(function()
while true do
YIELD()
if ERRDATA[1]then break end
end
LOG("\27[91m\27[1mAutomatic Test Failed :(\27[0m\nThe error message is:\n"..table.concat(ERRDATA[1].mes,"\n").."\27[91m\nAborting\27[0m")
TEST.yieldN(60)
love.event.quit(1)
end)
end

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
media/music/1989.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/1.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/10.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/11.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/12.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/13.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/14.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/15.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/16.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/17.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/18.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/19.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/2.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/20.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/21.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/22.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/23.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/24.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/25.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/26.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/27.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/28.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/3.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/4.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/5.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/6.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/7.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/8.ogg Normal file

Binary file not shown.

BIN
media/sample/bass/9.ogg Normal file

Binary file not shown.

BIN
media/sample/bell/1.ogg Normal file

Binary file not shown.

BIN
media/sample/bell/10.ogg Normal file

Binary file not shown.

BIN
media/sample/bell/11.ogg Normal file

Binary file not shown.

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