Compare commits

...

143 Commits

Author SHA1 Message Date
MrZ_26
da716ea5c5 版本推进 2022-11-05 23:07:54 +08:00
MrZ_26
c6f92a3030 略微降低客户端发言频率限制
发言id和文本之间加一个空格
框架跟进,修复textBox控件和listBox控件显示范围问题
2022-11-05 22:59:21 +08:00
MrZ_26
267e2dc544 修复其他玩家进房check是否已存在的时候因为访问不存在的玩家而报错 2022-11-05 22:59:21 +08:00
MrZ_26
cb7d3afdfb 删除服务端的playerManager.noPassword消息 2022-11-05 22:59:21 +08:00
MrZ_26
b57e863c28 联网游戏可以用键盘ctrl+0123456切换队伍 2022-11-05 22:59:21 +08:00
MrZ_26
7aed15fd4f 修正其他玩家的结束游戏消息处理太早导致录像没放完出问题 2022-11-05 22:59:21 +08:00
MrZ_26
6d71b26595 自定义游戏菜单微调 2022-11-05 22:59:21 +08:00
sakurw
1df5406cb3 Update lang_ja.lua (#768) 2022-11-05 15:47:36 +08:00
MrZ_26
a2b762dcbc 添加几个房间内命令
添加房间被解散的语言文本
把一处神秘写法改正常一点
2022-11-05 02:14:51 +08:00
MrZ_26
c2d29c3d6a 联网游戏界面添加选队伍按钮,加一个没卵用的退出房间命令 2022-11-04 17:15:36 +08:00
MrZ_26
da602eb693 两个输入验证码的地方添加粘贴按钮
整理代码
2022-11-04 16:45:51 +08:00
MrZ_26
9e442a3073 整理代码
版本推进
2022-11-04 00:26:38 +08:00
Richard969
bc8b7e733b FIX c4wtrain_n getrank wrong (#766) 2022-11-04 00:25:22 +08:00
MrZ_26
94aa84e380 修复ultra进去就蓝屏(之前bgm模块更新忘了改对应用法) 2022-11-04 00:07:25 +08:00
MrZ_26
c462c28640 收到重复id玩家进入房间的时候会先触发把老的退掉防止出现复制人引起一堆问题 2022-11-03 23:55:04 +08:00
MrZ_26
b5fbf9cade 修复网战多队伍结束条件错误 2022-11-03 23:16:42 +08:00
MrZ_26
e88957296f 修改队伍颜色,看起来不扎眼一些(大概 2022-11-03 23:08:39 +08:00
MrZ_26
9e61cb995a 缓冲槽内有过多垃圾行时满了就不会再继续绘制,减少极端情况下的卡顿 2022-11-03 22:46:46 +08:00
MrZ_26
89a5a718da 实现房间内排名(方法有点小神秘 不过应该能用 2022-11-03 22:45:46 +08:00
MrZ_26
43649c54a3 基本完成中途加入的观战
修复从联网游戏房间退出不会把GAME.playing置false
checkWarning的玩家改成输入而不是自动获取
整理代码
2022-11-03 18:06:28 +08:00
MrZ_26
b2b5c99425 修复节日日期写错
修正简洁模式场景栈搜索有未触发漏洞
整理代码
框架跟进
2022-11-03 15:11:12 +08:00
MrZ_26
9e882e6188 框架跟进
推进中途加入房间的观战相关
2022-11-03 12:23:29 +08:00
渣渣120
e688458cfd 在 README 提供更多下载方式 便于那些完全不懂github的小白用户( (#765)
* 在 README 提供更多下载方式 便于那些完全不懂github的小白用户(

Co-authored-by: ParticleG <particle_g@outlook.com>
Co-authored-by: C₂₉H₂₅N₃O₅ <a1228465111@163.com>
2022-11-01 10:54:45 +08:00
MrZ_26
b7c528f5ac 修改获取对局种子的api 2022-10-31 18:59:04 +08:00
MrZ_26
c743fdcffc 修复连连看小游戏背景区域范围错误 2022-10-31 02:19:54 +08:00
MrZ_26
56e19dd91e 修复房间列表界面密码栏存在时刷新计时器不动导致很奇怪,现在会走时间但到0不会刷新 2022-10-30 00:17:07 +08:00
MrZ_26
308512d36a 修复暂停界面第一帧有时候会闪烁 2022-10-29 17:18:30 +08:00
MrZ_26
749806e553 修复100攻击模式打到40就算成绩 2022-10-29 15:55:53 +08:00
MrZ_26
78223334ee 再整理quarks背景代码 2022-10-29 02:22:52 +08:00
MrZ_26
7f50161ca7 再整理quarks背景代码 2022-10-29 02:20:52 +08:00
MrZ_26
dd872a72b2 整理代码,return后面跟空格 2022-10-29 00:59:41 +08:00
MrZ_26
0df17cb4ee 给一些模式换刚加的两个新背景 2022-10-29 00:52:35 +08:00
MrZ_26
27244dae04 优化两个新背景代码 2022-10-29 00:33:34 +08:00
NOT_A_ROBOT
c472d6cbd7 Add new backgrounds (#764)
* Add quark background

* add galaxy background
2022-10-28 23:39:34 +08:00
MrZ_26
e4c786a5d4 更新头像的函数检测如果缺数据就跳过流程
框架跟进
2022-10-28 16:33:19 +08:00
MrZ_26
e291a070f3 优化联网游戏体验(统计数据结算、远程玩家死亡结算时机) 2022-10-28 16:33:19 +08:00
MrZ_26
6b16fcd5f5 添加一点注释,整理代码 2022-10-28 16:33:19 +08:00
MrZ_26
d79279d1cd 音乐室可以按住shift+字符反向快速跳转 2022-10-28 16:33:19 +08:00
ParticleG
03fbfaa577 - Update workflow 2022-10-28 10:00:50 +08:00
ParticleG
8231021426 - Update summary 2022-10-27 18:05:12 +08:00
ParticleG
784b2074f8 - Update summaries 2022-10-27 17:16:38 +08:00
ParticleG
93c9977c86 - Update summaries 2022-10-27 16:27:15 +08:00
ParticleG
ad1b129dfa - Update summaries 2022-10-27 16:08:45 +08:00
ParticleG
2d4856551b - Update summaries 2022-10-27 15:06:40 +08:00
ParticleG
4d0e72d61e - Try using step summaries 2022-10-27 14:11:47 +08:00
ParticleG
9b20ec6941 - Try fix windows output & notice 2022-10-27 13:52:20 +08:00
ParticleG
5a02265018 - Try fix multiline issue 2022-10-27 11:31:51 +08:00
ParticleG
0dd5c46fd1 - Try use new environment file again 2022-10-27 10:59:54 +08:00
ParticleG
55831339dd - Try using deprecated set-output for debugging 2022-10-27 10:50:12 +08:00
MrZ_26
e0ba04e579 修改更新历史,框架跟进 close #763 2022-10-27 02:14:22 +08:00
MrZ_26
d5f7a6ddd0 整理代码 2022-10-27 01:43:19 +08:00
MrZ_26
66a3354883 整理代码,texture模块的新画布函数的画布底色改成透明白色 2022-10-27 00:29:33 +08:00
MrZ_26
55218e4563 修复创房间的人“当前场景”状态有问题导致别人退房的时候操作不能正确执行 2022-10-27 00:24:27 +08:00
MrZ_26
081b769ac6 非房主玩家边框还是稍微粗一点吧 2022-10-27 00:23:50 +08:00
MrZ_26
8f767b3ab9 订正一处中文文本 2022-10-27 00:01:38 +08:00
MrZ_26
a2eb7e4a54 修复联网对战攻击校验变量用错 2022-10-27 00:01:29 +08:00
MrZ_26
2de663703b 修复单机模式没有sid导致部分情况读取sid报错(会用本地uid直接代替) 2022-10-27 00:01:14 +08:00
ParticleG
40a587dcc4 - Try use new release action 2022-10-26 22:23:23 +08:00
MrZ_26
f366a63c8f 修复录像菜单添加第一个录像/删除最后一个录像后按钮显示状态没变 close #736 2022-10-26 11:58:23 +08:00
MrZ_26
8c603fadee 添加反联网玩家使用非法块皮肤
检测到联网玩家攻击数量不同步后会直接主动放弃游戏 close #720
2022-10-26 11:47:52 +08:00
MrZ_26
5e9ef8d3ab 联网玩家皮肤调成炸弹块时会被本地强制改为灰色 2022-10-26 11:47:52 +08:00
ParticleG
2e9cef3ed8 - Bump actions' versions 2022-10-26 11:04:06 +08:00
MrZ_26
354d4f80bf 一堆场景同时允许回车键和小键盘回车键 2022-10-26 10:57:45 +08:00
MrZ_26
a578d537cd 粘贴场地高度最高能读到60行,允许一些极端的高空作业 2022-10-26 10:42:53 +08:00
MrZ_26
85ff1cd1c3 刚注册完跳转到设置密码界面的时候会自动填入注册用的验证码(因为服务端就这么设计的可以复用一次) 2022-10-26 10:35:01 +08:00
ParticleG
0d015de359 - Use file IO instead of echo 2022-10-26 10:23:11 +08:00
MrZ_26
5a0a473d4a 控制台theme命令会提示可以输halloween 2022-10-26 10:16:43 +08:00
MrZ_26
420ff9a556 修正日语语言文件少个逗号 2022-10-26 10:10:50 +08:00
sakurw
4f6e99daa2 Update lang_ja.lua (#761) 2022-10-26 10:06:32 +08:00
MrZ_26
10a57ecc18 修复音乐室暂停就报错(之前合并分支选错一边)
框架跟进(修复说明书界面报错)
2022-10-26 05:34:11 +08:00
MrZ_26
b101d74df5 版本推进 2022-10-26 04:59:38 +08:00
MrZ_26
97d4e58d47 添加halloween主题,包括一个bgm,一个按钮主题,主菜单打雷特效,带蜘蛛网的标题和一个南瓜
close #757
2022-10-26 04:42:00 +08:00
MrZ_26
b436645ab7 修正几处检测当前场景的代码之前更新场景模块忘了改 2022-10-26 03:48:05 +08:00
sakurw
af7c73f9f0 Update lang_ja.lua (#760) 2022-10-26 02:05:10 +08:00
MrZ_26
7d44396b03 新增队伍系统,攻击不会打给同队,剩一队时游戏就结束(目前允许0~6,0号为自由队,每个人分别算一队)
添加/group命令来选择队伍
2022-10-26 01:26:04 +08:00
MrZ_26
bd428f355a 添加房主和队伍状态的显示方式
添加转交房主提示
2022-10-25 20:53:00 +08:00
MrZ_26
2d6d897e2a 忽略部分服务器返回的错误消息
框架跟进
2022-10-25 19:48:00 +08:00
Particle_G
4913deb15f - Try fix windows product-name 2022-10-25 09:19:10 +00:00
Particle_G
0cb9d3990c - Use new action addresses 2022-10-25 06:55:15 +00:00
Particle_G
388e8e1fe1 - Fix deprecated set-output 2022-10-25 03:34:57 +00:00
MrZ_26
42168ddf16 修复一些联网相关场景切换关系问题
修复重设密码场景回车键自动识别功能条件错误
框架跟进
2022-10-25 02:17:07 +08:00
MrZ_26
134773765c 修创建房间场景在场景栈的位置 2022-10-24 23:29:19 +08:00
MrZ_26
74b099d58f 对战房间消息框可以用两个房间管理命令 2022-10-24 23:01:35 +08:00
MrZ_26
c1936441dd 调整踢出玩家的提示文本 2022-10-24 22:59:27 +08:00
MrZ_26
dc3b7c0825 有玩家退出房间的时候也会刷新房间allReady状态
限制催促准备音效频率
2022-10-24 22:30:49 +08:00
MrZ_26
86910f2956 修正进入房间成功的时候错误打断了一个等待,应当是创建成功时 2022-10-24 22:04:49 +08:00
MrZ_26
7b1df65e64 调整用户名显示相关,只有播放录像才会强制用户名,否则都用uid获取 2022-10-24 19:15:05 +08:00
MrZ_26
04559efaca 添加服务器返回的错误信息语言文本 2022-10-24 18:39:27 +08:00
MrZ_26
b668fa4750 修改观战状态检测
整理代码
2022-10-24 15:09:33 +08:00
MrZ_26
a4db061485 修游戏中有人退出房间有一处复制漏改
观战时会默认视角为sid最小的人
2022-10-24 15:05:01 +08:00
MrZ_26
d4d97f1e7f Merge branch 'ci_new_online' 2022-10-24 14:27:27 +08:00
MrZ_26
e682202b60 更多ws连接炸掉的时候自动返回主菜单 2022-10-24 14:15:42 +08:00
MrZ_26
2480987f10 正确更新房间allReady状态 2022-10-24 14:11:46 +08:00
MrZ_26
b0acdce294 修复不同设备对局sid不一致 2022-10-24 14:07:09 +08:00
MrZ_26
7953cf735b 实现键盘一键准备 2022-10-24 02:52:44 +08:00
MrZ_26
d074a85fbc NETPLY模块删掉一堆方法,先外部直接改数据,玩家会根据状态更换样式
游戏开始/结束时自主同步正确的服务端玩家状态
2022-10-24 02:37:45 +08:00
MrZ_26
543e85e94c 实现收发房内聊天消息,修改频发言率限制
实现消息框里的进出房间提醒
2022-10-24 00:43:11 +08:00
MrZ_26
23f43df737 实现玩家全部准备的时候顶部文字提醒 2022-10-24 00:26:52 +08:00
MrZ_26
43b6ff7697 修正创建房间页面在场景书上的位置 2022-10-24 00:20:29 +08:00
MrZ_26
6ecc80ac0f 修正玩家进出房间相关问题
修正获取玩家信息相关问题
实现操作录像传输
修改一些语言文本
2022-10-23 23:31:16 +08:00
MrZ_26
3ae0e80ce5 调整重设密码界面在场景树上的位置 2022-10-23 04:53:51 +08:00
MrZ_26
d12f8a27e7 减少密码哈希迭代次数防止把手机卡烂
原来的登录和注册界面改为密码登录和邮箱登录
邮箱登录界面不再分状态,设置密码独立出一个界面
自动登录不再检测本地用过密码登录,第一次邮箱登录不设置密码但存了token也可以
整理代码
2022-10-23 04:36:19 +08:00
MrZ_26
f9bbb8fce6 实现玩家准备状态相关 2022-10-23 01:43:56 +08:00
MrZ_26
80984cddf9 联网游戏结束后2.6秒返回玩家列表 2022-10-23 01:13:01 +08:00
MrZ_26
8fb0b2e600 实现根据统一种子随机生成每个玩家的sid 2022-10-22 02:08:36 +08:00
MrZ_26
9a4e8ab4ec 实现开始游戏信号与切换进游戏状态创建玩家 2022-10-21 00:16:15 +08:00
MrZ_26
dc1973e049 实现新api的进房和准备/观战
修复不会刷新在线人数
2022-10-19 23:29:45 +08:00
MrZ_26
ccb05230f2 实现自动请求没见过的用户信息和自动获取用户头像 2022-10-17 11:47:44 +08:00
MrZ_26
7ac6f45b9b 实现玩家设置同步到服务器
实现玩家离开房间(各种途径)
修改云存读档代码(还未实现)
移除sid,准备之后用uid本地排序序号代替(排序还未实现)
整理代码,框架跟进
2022-10-09 06:47:08 +08:00
MrZ_26
df7ab20636 继续实现一堆联网消息
语言文件加一条
框架跟进
2022-10-08 04:16:18 +08:00
MrZ_26
c06961c9c8 订正上一个提交漏改的东西
优化debug消息显示格式
调整网络断开提示文本用法
2022-10-07 02:36:18 +08:00
MrZ_26
37b76a1cb4 继续整联网,数字action填入一个大表方便统一管理 2022-10-06 22:34:22 +08:00
MrZ_26
01d02a916d 修复音乐室暂停就爆炸 2022-10-06 16:45:34 +08:00
MrZ_26
8e99565a9d 退出前会主动断开一下ws连接
WAIT放到网络相关TASK函数内部(会在第一帧触发,不影响)
可以从语言文件翻译服务器的错误消息并显示了
框架跟进
2022-10-06 03:16:18 +08:00
MrZ_26
f8d17b23b6 注释后加空格
联网稍微推进
2022-10-03 02:43:51 +08:00
MrZ_26
06f4bb4e1a 整 理 代 码
(应该没有改到字符串里面的东西吧…)起码不直接影响运行
2022-10-01 11:32:11 +08:00
MrZ_26
6e00ff96ec 服务器返回房间对象格式错误的时候不会直接爆炸 2022-09-30 07:23:39 +08:00
MrZ_26
468bbc8053 实现拉取房间列表
框架跟进
2022-09-29 20:29:45 +08:00
MrZ_26
f41999c019 调整登录流程里弹出的信息 2022-09-29 18:36:19 +08:00
MrZ_26
d259e05ca7 【不能用】继续改联网,更新ws相关,完善断开后的行为与提示
框架跟进
2022-09-29 10:07:39 +08:00
MrZ_26
2491a436c2 修复生存L难度显示maxspeed文本时机不正确 2022-09-29 08:42:28 +08:00
MrZ_26
7a55e447fc 整理代码 2022-09-29 08:15:03 +08:00
MrZ_26
f3face791f 【不能用】继续改联网,实现并替换一些发送ws请求的方法
框架跟进
2022-09-29 02:41:00 +08:00
MrZ_26
9ccc019bb9 【不能用】继续改联网,能登录了
框架跟进
2022-09-28 23:00:43 +08:00
MrZ_26
bc9f00d09f 整理代码
框架跟进
2022-09-28 19:36:10 +08:00
MrZ_26
33c470dd38 【不能用】继续改联网
框架跟进
2022-09-28 01:20:03 +08:00
MrZ_26
9e0e93de5d 修音乐室和一些bgm模块更新后的小错误
框架跟进a
2022-09-27 21:30:29 +08:00
MrZ_26
16553e13a2 【警告】联网不能用,不要随便试
联网重制ing,提交一下做个中继点
2022-09-27 21:30:29 +08:00
MrZ_26
d031dc3a82 注释掉cc落块信息输出,需要的时候自己开 2022-09-27 21:30:29 +08:00
MrZ_26
7297eb8ee8 框架跟进 2022-09-27 21:30:29 +08:00
C₂₉H₂₅N₃O₅
55bcdd426b Updated the link to TTT (Eng. Ver.) (#754)
* Updated the link to TTT (Eng. Ver.)
2022-09-27 19:21:56 +08:00
NOT_A_ROBOT
139e2e14c4 Add 15 death delay to TSD Challenge modes (#753)
* Add 15 death delay to tsd_e

* Add 15 death delay to tsd_h

* Add 15 death delay to tsd_u
2022-09-27 19:20:59 +08:00
MrZ_26
339b53115a 据作者要求暂时删除rin语音包
微调几个tip
修改版本号
2022-09-17 22:27:38 +08:00
MrZ_26
03515b4490 框架跟进,修复bgm音量为0时切换几次bgm会报错 2022-09-11 22:49:26 +08:00
MrZ_26
9690a345a3 微调TRS,T的2→R和2→L加一个下1 2022-09-11 18:15:23 +08:00
ParticleG
8324f72e90 - Fix outputs 2022-09-11 17:20:53 +08:00
ParticleG
15eefc0e9f - Fix rename 2022-09-11 12:02:28 +08:00
ParticleG
d504bd3d49 - Fix macOS-appstore package name 2022-09-11 11:27:03 +08:00
ParticleG
fd4b4f1882 - Use cp instead of mv 2022-09-11 11:22:58 +08:00
ParticleG
a176ef35a0 - Fix release notes
- Add platform name to release artifacts
2022-09-11 11:19:34 +08:00
MrZ_26
0fc7178589 shader里部分float变量改为highp float,保证丝滑
(需要同时配合apk配置更新的gles版本为3.0)
2022-09-11 06:58:01 +08:00
MrZ_26
76d985cc0f 删除readme“当前稳定版本”的文本 2022-09-10 22:59:14 +08:00
C₂₉H₂₅N₃O₅
aa05e8857b Update readme.md (#751) 2022-09-10 22:57:58 +08:00
369 changed files with 6692 additions and 5489 deletions

View File

@@ -19,10 +19,10 @@ runs:
using: "composite" using: "composite"
steps: steps:
- run: | - run: |
echo "::set-output name=tag::"$(if [ -z "${{ inputs.tag }}" ] echo "tag="$(if [ -z "${{ inputs.tag }}" ]
then curl -w '%{url_effective}' -I -L -s -S https://github.com/${{ inputs.repo }}/releases/latest -o /dev/null | grep -o '\<[^/]*$' then curl -w '%{url_effective}' -I -L -s -S https://github.com/${{ inputs.repo }}/releases/latest -o /dev/null | grep -o '\<[^/]*$'
else echo ${{ inputs.tag }} else echo ${{ inputs.tag }}
fi) fi) >> $GITHUB_OUTPUT
id: get-tag id: get-tag
shell: bash shell: bash
- uses: ./.github/actions/get-unzip - uses: ./.github/actions/get-unzip

View File

@@ -20,6 +20,8 @@ jobs:
version-name: ${{ steps.app-info.outputs.version-name }} version-name: ${{ steps.app-info.outputs.version-name }}
version-string: ${{ steps.app-info.outputs.version-string }} version-string: ${{ steps.app-info.outputs.version-string }}
version-code: ${{ steps.app-info.outputs.version-code }} version-code: ${{ steps.app-info.outputs.version-code }}
update-title: ${{ steps.app-info.outputs.update-title }}
update-note: ${{ steps.app-info.outputs.update-note }}
commit-hash: ${{ steps.git-info.outputs.commit-hash }} commit-hash: ${{ steps.git-info.outputs.commit-hash }}
base-name: ${{ steps.assemble-base-name.outputs.base-name }} base-name: ${{ steps.assemble-base-name.outputs.base-name }}
steps: steps:
@@ -32,28 +34,42 @@ jobs:
shell: lua {0} shell: lua {0}
run: | run: |
local version = require "version" local version = require "version"
print("::set-output name=app-name::Techmino") os.execute('echo "app-name=Techmino" >> $GITHUB_OUTPUT')
print("::set-output name=version-name::"..version.name) os.execute('echo "version-name=' .. version.name .. '" >> $GITHUB_OUTPUT')
print("::set-output name=version-string::"..version.string:gsub("%a", "")) os.execute('echo "version-string=' .. version.string:gsub("%a", "") .. '" >> $GITHUB_OUTPUT')
print(("::set-output name=version-code::%d"):format(version.code)) os.execute('echo "version-code=' .. tostring(version.code) .. '" >> $GITHUB_OUTPUT')
local note = require 'parts.updateLog'
local p1 = note:find("\n%d") + 1
local p2 = note:find("\n", p1) - 1
os.execute('echo "update-title=' .. note:sub(p1, p2) .. '" >> $GITHUB_OUTPUT')
local p3 = note:find("\n", note:find("\n%d") + 1) + 1
local p4 = note:find("\n%d", p3 + 1)
updateNote = note:sub(p3, p4 - 2)
:gsub(" ", "- ")
:gsub(" ", "# ")
os.execute('echo "update-note<<EOF" >> $GITHUB_OUTPUT')
os.execute('echo "' .. updateNote .. '" >> $GITHUB_OUTPUT')
os.execute('echo "EOF" >> $GITHUB_OUTPUT')
- name: Get git info - name: Get git info
id: git-info id: git-info
shell: bash shell: bash
run: | run: |
COMMIT_HASH=$(git rev-parse --short ${{ GITHUB.SHA }}) COMMIT_HASH=$(git rev-parse --short ${{ GITHUB.SHA }})
echo ::set-output name=commit-hash::$COMMIT_HASH echo "commit-hash=$COMMIT_HASH" >> $GITHUB_OUTPUT
- name: Assemble package base name - name: Assemble package base name
id: assemble-base-name id: assemble-base-name
shell: bash shell: bash
run: | run: |
BASE_NAME=Techmino_${{ steps.app-info.outputs.version-string }}_${{ steps.git-info.outputs.commit-hash }}_#${{ GITHUB.RUN_NUMBER }} BASE_NAME=Techmino_${{ steps.app-info.outputs.version-string }}_${{ steps.git-info.outputs.commit-hash }}_#${{ GITHUB.RUN_NUMBER }}
echo ::set-output name=base-name::$BASE_NAME echo "base-name=$BASE_NAME" >> $GITHUB_OUTPUT
build-core: build-core:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: get-info needs: get-info
env: env:
OUTPUT_FOLDER: ./build OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release
outputs: outputs:
download-url: ${{ steps.transfer.outputs.download-url }} download-url: ${{ steps.transfer.outputs.download-url }}
steps: steps:
@@ -66,14 +82,15 @@ jobs:
run: | run: |
import os import os
import re import re
os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}")) with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
- uses: ./.github/actions/update-version - uses: ./.github/actions/update-version
if: ${{ !startsWith(github.ref, 'refs/tags/v') }} if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
with: with:
commit: ${{ needs.get-info.outputs.commit-hash }} commit: ${{ needs.get-info.outputs.commit-hash }}
type: snapshot type: snapshot
- name: Build core love package - name: Build core love package
uses: 26F-Studio/love-actions-core@v1 uses: love-actions/love-actions-core@v1
with: with:
build-list: ./media/ ./parts/ ./Zframework/ ./conf.lua ./main.lua ./version.lua build-list: ./media/ ./parts/ ./Zframework/ ./conf.lua ./main.lua ./version.lua
package-path: ${{ env.CORE_LOVE_PACKAGE_PATH }} package-path: ${{ env.CORE_LOVE_PACKAGE_PATH }}
@@ -91,23 +108,27 @@ jobs:
with: with:
name: ${{ needs.get-info.outputs.base-name }}_Core_love name: ${{ needs.get-info.outputs.base-name }}_Core_love
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love
- name: Prepare for release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
shell: bash
run: |
mkdir -p ${{ env.RELEASE_FOLDER }}
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Bare.love
- name: Upload release - name: Upload release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }} if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
uses: softprops/action-gh-release@v1 uses: ncipollo/release-action@v1
with: with:
body: ${{ github.event.head_commit.message }} allowUpdates: true
files: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Bare.love
body: ${{ needs.get-info.outputs.update-note }}
name: ${{ needs.get-info.outputs.update-title }}
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }} prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
- name: Upload to WeTransfer - name: Upload to WeTransfer
id: transfer id: transfer
run: | run: |
curl -sL https://git.io/file-transfer | sh curl -sL https://git.io/file-transfer | sh
./transfer wet -s -p 16 --no-progress ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love 2>&1>./wetransfer.log ./transfer wet -s -p 16 --no-progress ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love 2>&1>./wetransfer.log
echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
- name: Show download link
shell: bash
run: |
echo "::notice title=Bare love package::${{ steps.transfer.outputs.download-url }}"
auto-test: auto-test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -117,7 +138,7 @@ jobs:
with: with:
submodules: recursive submodules: recursive
- name: Love actions for testing - name: Love actions for testing
uses: 26F-Studio/love-actions-test@v1 uses: love-actions/love-actions-test@v1
with: with:
font-path: ./parts/fonts/proportional.otf font-path: ./parts/fonts/proportional.otf
language-folder: ./parts/language language-folder: ./parts/language
@@ -127,6 +148,7 @@ jobs:
needs: [get-info, build-core, auto-test] needs: [get-info, build-core, auto-test]
env: env:
OUTPUT_FOLDER: ./build OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release
outputs: outputs:
download-url: ${{ steps.transfer.outputs.download-url }} download-url: ${{ steps.transfer.outputs.download-url }}
steps: steps:
@@ -139,8 +161,13 @@ jobs:
run: | run: |
import os import os
import re import re
os.system("echo ::set-output name=bundle-id::org.f26_studio." + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}") + ".snapshot") with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}") + "_Snapshot") if "${{ env.BUILD_TYPE }}" == "dev":
f.write('bundle-id=org.f26_studio.' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '.snapshot\n')
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '_Snapshot\n')
else:
f.write('bundle-id=org.f26_studio.' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
- name: Download core love package - name: Download core love package
uses: actions/download-artifact@v3 uses: actions/download-artifact@v3
with: with:
@@ -159,7 +186,7 @@ jobs:
mv ./ColdClear/arm64-v8a/libCCloader.so ./libAndroid/arm64-v8a/ mv ./ColdClear/arm64-v8a/libCCloader.so ./libAndroid/arm64-v8a/
- name: Build Android packages - name: Build Android packages
id: build-packages id: build-packages
uses: 26F-Studio/love-actions-android@v1 uses: love-actions/love-actions-android@v1
with: with:
app-name: ${{ needs.get-info.outputs.app-name }} app-name: ${{ needs.get-info.outputs.app-name }}
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }} bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
@@ -176,7 +203,7 @@ jobs:
version-string: ${{ needs.get-info.outputs.version-string }} version-string: ${{ needs.get-info.outputs.version-string }}
version-code: ${{ needs.get-info.outputs.version-code }} version-code: ${{ needs.get-info.outputs.version-code }}
output-folder: ${{ env.OUTPUT_FOLDER }} output-folder: ${{ env.OUTPUT_FOLDER }}
- name: Upload release artifact - name: Upload artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
name: ${{ needs.get-info.outputs.base-name }}_Android_release name: ${{ needs.get-info.outputs.base-name }}_Android_release
@@ -185,31 +212,31 @@ jobs:
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }} if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
shell: bash shell: bash
run: | run: |
mkdir -p release mkdir -p ${{ env.RELEASE_FOLDER }}
mv ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}-release.apk release/${{ steps.process-app-name.outputs.product-name }}.apk cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}-release.apk ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Android.apk
- name: Upload release - name: Upload release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }} if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
uses: softprops/action-gh-release@v1 uses: ncipollo/release-action@v1
with: with:
body: ${{ github.event.head_commit.message }} allowUpdates: true
files: release/${{ steps.process-app-name.outputs.product-name }}.apk artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Android.apk
body: ${{ needs.get-info.outputs.update-note }}
name: ${{ needs.get-info.outputs.update-title }}
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }} prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
- name: Upload to WeTransfer - name: Upload to WeTransfer
id: transfer id: transfer
run: | run: |
curl -sL https://git.io/file-transfer | sh curl -sL https://git.io/file-transfer | sh
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log ./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
- name: Show download link
shell: bash
run: |
echo "::notice title=Android packages::${{ steps.transfer.outputs.download-url }}"
build-ios: build-ios:
runs-on: macos-latest runs-on: macos-latest
if: github.event_name != 'pull_request'
needs: [get-info, build-core, auto-test] needs: [get-info, build-core, auto-test]
env: env:
OUTPUT_FOLDER: ./build OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release
outputs: outputs:
download-url: ${{ steps.transfer.outputs.download-url }} download-url: ${{ steps.transfer.outputs.download-url }}
steps: steps:
@@ -222,8 +249,9 @@ jobs:
run: | run: |
import os import os
import re import re
os.system("echo ::set-output name=bundle-id::org.26f-studio.techmino") with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}")) f.write('bundle-id=org.26f-studio.techmino\n')
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
- name: Download core love package - name: Download core love package
uses: actions/download-artifact@v3 uses: actions/download-artifact@v3
with: with:
@@ -235,7 +263,7 @@ jobs:
dir: ./ColdClear dir: ./ColdClear
- name: Build iOS packages - name: Build iOS packages
id: build-packages id: build-packages
uses: 26F-Studio/love-actions-ios@v1 uses: love-actions/love-actions-ios@v1
with: with:
app-name: ${{ needs.get-info.outputs.app-name }} app-name: ${{ needs.get-info.outputs.app-name }}
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }} bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
@@ -269,29 +297,34 @@ jobs:
with: with:
name: ${{ needs.get-info.outputs.base-name }}_iOS_ipa name: ${{ needs.get-info.outputs.base-name }}_iOS_ipa
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.ipa path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.ipa
- name: Prepare for release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
shell: bash
run: |
mkdir -p ${{ env.RELEASE_FOLDER }}
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.ipa ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_iOS.ipa
- name: Upload release - name: Upload release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }} if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
uses: softprops/action-gh-release@v1 uses: ncipollo/release-action@v1
with: with:
body: ${{ github.event.head_commit.message }} allowUpdates: true
files: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.ipa artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_iOS.ipa
body: ${{ needs.get-info.outputs.update-note }}
name: ${{ needs.get-info.outputs.update-title }}
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }} prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
- name: Upload to WeTransfer - name: Upload to WeTransfer
id: transfer id: transfer
run: | run: |
wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log ./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
- name: Show download link
shell: bash
run: |
echo "::notice title=iOS packages::${{ steps.transfer.outputs.download-url }}"
build-linux: build-linux:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [get-info, build-core, auto-test] needs: [get-info, build-core, auto-test]
env: env:
OUTPUT_FOLDER: ./build OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release
outputs: outputs:
download-url: ${{ steps.transfer.outputs.download-url }} download-url: ${{ steps.transfer.outputs.download-url }}
steps: steps:
@@ -304,7 +337,8 @@ jobs:
run: | run: |
import os import os
import re import re
os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}")) with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
- name: Download core love package - name: Download core love package
uses: actions/download-artifact@v3 uses: actions/download-artifact@v3
with: with:
@@ -324,7 +358,7 @@ jobs:
mv ./x64/CCloader.so ./shared mv ./x64/CCloader.so ./shared
- name: Build Linux packages - name: Build Linux packages
id: build-packages id: build-packages
uses: 26F-Studio/love-actions-linux@v1 uses: love-actions/love-actions-linux@v1
with: with:
desktop-file-path: ./.github/build/linux/${{ env.BUILD_TYPE }}/template.desktop desktop-file-path: ./.github/build/linux/${{ env.BUILD_TYPE }}/template.desktop
executable-name: app executable-name: app
@@ -339,29 +373,35 @@ jobs:
with: with:
name: ${{ needs.get-info.outputs.base-name }}_Linux_AppImage name: ${{ needs.get-info.outputs.base-name }}_Linux_AppImage
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.AppImage path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.AppImage
- name: Prepare for release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
shell: bash
run: |
mkdir -p ${{ env.RELEASE_FOLDER }}
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.AppImage ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.AppImage
- name: Upload release - name: Upload release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }} if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
uses: softprops/action-gh-release@v1 uses: ncipollo/release-action@v1
with: with:
body: ${{ github.event.head_commit.message }} allowUpdates: true
files: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.AppImage artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.AppImage
body: ${{ needs.get-info.outputs.update-note }}
name: ${{ needs.get-info.outputs.update-title }}
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }} prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
- name: Upload to WeTransfer - name: Upload to WeTransfer
id: transfer id: transfer
run: | run: |
curl -sL https://git.io/file-transfer | sh curl -sL https://git.io/file-transfer | sh
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log ./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
- name: Show download link
shell: bash
run: |
echo "::notice title=Linux packages::${{ steps.transfer.outputs.download-url }}"
build-macos-appstore: build-macos-appstore:
runs-on: macos-latest runs-on: macos-latest
if: github.event_name != 'pull_request'
needs: [get-info, build-core, auto-test] needs: [get-info, build-core, auto-test]
env: env:
OUTPUT_FOLDER: ./build OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release
outputs: outputs:
download-url: ${{ steps.transfer.outputs.download-url }} download-url: ${{ steps.transfer.outputs.download-url }}
steps: steps:
@@ -374,8 +414,9 @@ jobs:
run: | run: |
import os import os
import re import re
os.system("echo ::set-output name=bundle-id::org.26f-studio.techmino") with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}")) f.write('bundle-id=org.26f-studio.techmino\n')
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
- name: Download core love package - name: Download core love package
uses: actions/download-artifact@v3 uses: actions/download-artifact@v3
with: with:
@@ -391,7 +432,7 @@ jobs:
rm ./ColdClear/universal/libcold_clear.a rm ./ColdClear/universal/libcold_clear.a
- name: Build macOS packages - name: Build macOS packages
id: build-packages id: build-packages
uses: 26F-Studio/love-actions-macos-appstore@v1 uses: love-actions/love-actions-macos-appstore@v1
with: with:
app-name: ${{ needs.get-info.outputs.app-name }} app-name: ${{ needs.get-info.outputs.app-name }}
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }} bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
@@ -424,29 +465,35 @@ jobs:
with: with:
name: ${{ needs.get-info.outputs.base-name }}_macOS_appstore_pkg name: ${{ needs.get-info.outputs.base-name }}_macOS_appstore_pkg
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.pkg path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.pkg
- name: Prepare for release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
shell: bash
run: |
mkdir -p ${{ env.RELEASE_FOLDER }}
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.pkg ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_appstore.pkg
- name: Upload release - name: Upload release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }} if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
uses: softprops/action-gh-release@v1 uses: ncipollo/release-action@v1
with: with:
body: ${{ github.event.head_commit.message }} allowUpdates: true
files: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.pkg artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_appstore.pkg
body: ${{ needs.get-info.outputs.update-note }}
name: ${{ needs.get-info.outputs.update-title }}
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }} prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
- name: Upload to WeTransfer - name: Upload to WeTransfer
id: transfer id: transfer
run: | run: |
wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log ./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
- name: Show download link
shell: bash
run: |
echo "::notice title=macOS App Store packages::${{ steps.transfer.outputs.download-url }}"
build-macos-portable: build-macos-portable:
runs-on: macos-latest runs-on: macos-latest
if: github.event_name != 'pull_request'
needs: [get-info, build-core, auto-test] needs: [get-info, build-core, auto-test]
env: env:
OUTPUT_FOLDER: ./build OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release
outputs: outputs:
download-url: ${{ steps.transfer.outputs.download-url }} download-url: ${{ steps.transfer.outputs.download-url }}
steps: steps:
@@ -459,8 +506,9 @@ jobs:
run: | run: |
import os import os
import re import re
os.system("echo ::set-output name=bundle-id::org.26f-studio.techmino") with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}")) f.write('bundle-id=org.26f-studio.techmino\n')
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
- name: Download core love package - name: Download core love package
uses: actions/download-artifact@v3 uses: actions/download-artifact@v3
with: with:
@@ -476,7 +524,7 @@ jobs:
rm ./ColdClear/universal/libcold_clear.a rm ./ColdClear/universal/libcold_clear.a
- name: Build macOS packages - name: Build macOS packages
id: build-packages id: build-packages
uses: 26F-Studio/love-actions-macos-portable@v1 uses: love-actions/love-actions-macos-portable@v1
with: with:
app-name: ${{ needs.get-info.outputs.app-name }} app-name: ${{ needs.get-info.outputs.app-name }}
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }} bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
@@ -518,31 +566,35 @@ jobs:
with: with:
name: ${{ needs.get-info.outputs.base-name }}_macOS_portable_bare name: ${{ needs.get-info.outputs.base-name }}_macOS_portable_bare
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.zip path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.zip
- name: Prepare for release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
shell: bash
run: |
mkdir -p ${{ env.RELEASE_FOLDER }}
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.pkg ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.pkg
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.dmg ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.dmg
- name: Upload release - name: Upload release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }} if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
uses: softprops/action-gh-release@v1 uses: ncipollo/release-action@v1
with: with:
body: ${{ github.event.head_commit.message }} allowUpdates: true
files: | artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.pkg, ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.dmg
${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.pkg body: ${{ needs.get-info.outputs.update-note }}
${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.dmg name: ${{ needs.get-info.outputs.update-title }}
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }} prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
- name: Upload to WeTransfer - name: Upload to WeTransfer
id: transfer id: transfer
run: | run: |
wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log ./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
- name: Show download link
shell: bash
run: |
echo "::notice title=macOS portable packages::${{ steps.transfer.outputs.download-url }}"
build-windows: build-windows:
runs-on: windows-latest runs-on: windows-latest
needs: [get-info, build-core, auto-test] needs: [get-info, build-core, auto-test]
env: env:
OUTPUT_FOLDER: ./build OUTPUT_FOLDER: ./build
RELEASE_FOLDER: ./release
outputs: outputs:
download-url: ${{ steps.transfer.outputs.download-url }} download-url: ${{ steps.transfer.outputs.download-url }}
steps: steps:
@@ -555,7 +607,8 @@ jobs:
run: | run: |
import os import os
import re import re
os.system("echo ::set-output name=product-name::" + re.sub(r"[^A-Za-z0-9]+", "_", "${{ needs.get-info.outputs.app-name }}")) with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
- name: Download core love package - name: Download core love package
uses: actions/download-artifact@v3 uses: actions/download-artifact@v3
with: with:
@@ -567,7 +620,7 @@ jobs:
dir: ./ColdClear dir: ./ColdClear
- name: Build Windows packages - name: Build Windows packages
id: build-packages id: build-packages
uses: 26F-Studio/love-actions-windows@v1 uses: love-actions/love-actions-windows@v1
with: with:
icon-path: ./.github/build/windows/${{ env.BUILD_TYPE }}/icon.ico icon-path: ./.github/build/windows/${{ env.BUILD_TYPE }}/icon.ico
rc-path: ./.github/build/windows/${{ env.BUILD_TYPE }}/template.rc rc-path: ./.github/build/windows/${{ env.BUILD_TYPE }}/template.rc
@@ -587,14 +640,21 @@ jobs:
with: with:
name: ${{ needs.get-info.outputs.base-name }}_Windows_x64 name: ${{ needs.get-info.outputs.base-name }}_Windows_x64
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x64.zip path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x64.zip
- name: Prepare for release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
shell: bash
run: |
mkdir -p ${{ env.RELEASE_FOLDER }}
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x86.zip ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x86.zip
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x64.zip ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x64.zip
- name: Upload release - name: Upload release
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }} if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
uses: softprops/action-gh-release@v1 uses: ncipollo/release-action@v1
with: with:
body: ${{ github.event.head_commit.message }} allowUpdates: true
files: | artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x86.zip, ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x64.zip
${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x86.zip body: ${{ needs.get-info.outputs.update-note }}
${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x64.zip name: ${{ needs.get-info.outputs.update-title }}
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }} prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
- name: Get transfer - name: Get transfer
env: env:
@@ -606,13 +666,10 @@ jobs:
rm ${{ env.TEMP_PATH }} rm ${{ env.TEMP_PATH }}
- name: Upload to WeTransfer - name: Upload to WeTransfer
id: transfer id: transfer
shell: pwsh
run: | run: |
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log ./transfer.exe wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
echo "::set-output name=download-url::$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $env:GITHUB_OUTPUT
- name: Show download link
shell: bash
run: |
echo "::notice title=Windows packages::${{ steps.transfer.outputs.download-url }}"
post-build: post-build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -634,11 +691,37 @@ jobs:
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Cleanup - name: Cleanup
uses: geekyeggo/delete-artifact@v1 uses: geekyeggo/delete-artifact@v2
with: with:
name: ${{ env.CORE_LOVE_ARTIFACT_NAME }} name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
- name: Display summary
shell: bash
run: |
echo "# Summary" >> $GITHUB_STEP_SUMMARY
echo "## Version: ${{ needs.get-info.outputs.version-string }}" >> $GITHUB_STEP_SUMMARY
echo "## Package Name: ${{ needs.get-info.outputs.base-name }}" >> $GITHUB_STEP_SUMMARY
echo "## Download links: " >> $GITHUB_STEP_SUMMARY
- name: Display download links
shell: python3 {0}
run: |
import os
with open(os.getenv('GITHUB_STEP_SUMMARY'), 'a') as f:
if "${{ needs.build-core.result }}" == "success":
f.write("- Bare love packages: [WeTransfer](${{ needs.build-core.outputs.download-url }})\n")
if "${{ needs.build-android.result }}" == "success":
f.write("- Android packages: [WeTransfer](${{ needs.build-android.outputs.download-url }})\n")
if "${{ needs.build-ios.result }}" == "success":
f.write("- iOS packages: [WeTransfer](${{ needs.build-ios.outputs.download-url }})\n")
if "${{ needs.build-linux.result }}" == "success":
f.write("- Linux packages: [WeTransfer](${{ needs.build-linux.outputs.download-url }})\n")
if "${{ needs.build-macos-appstore.result }}" == "success":
f.write("- macOS packages(App Store version): [WeTransfer](${{ needs.build-macos-appstore.outputs.download-url }})\n")
if "${{ needs.build-macos-portable.result }}" == "success":
f.write("- macOS packages(Portable version): [WeTransfer](${{ needs.build-macos-portable.outputs.download-url }})\n")
if "${{ needs.build-windows.result }}" == "success":
f.write("- Windows packages: [WeTransfer](${{ needs.build-windows.outputs.download-url }})\n")
- name: Send Discord message - name: Send Discord message
uses: Sniddl/discord-commits@v1.3 uses: Sniddl/discord-commits@v1.5
with: with:
webhook: ${{ secrets.DISCORD_WEBHOOK }} webhook: ${{ secrets.DISCORD_WEBHOOK }}
message: "Github Actions for **${{ github.repository }}**." message: "Github Actions for **${{ github.repository }}**."

View File

@@ -16,21 +16,19 @@
-- Var leak check -- Var leak check
-- setmetatable(_G,{__newindex=function(self,k,v)print('>>'..k)print(debug.traceback():match("\n.-\n\t(.-): "))rawset(self,k,v)end}) -- setmetatable(_G,{__newindex=function(self,k,v) print('>>'..k..string.rep(" ",26-#k),debug.traceback():match("\n.-\n\t(.-): "))rawset(self,k,v) end})
-- System Global Vars Declaration -- System Global Vars Declaration
local fs=love.filesystem local fs=love.filesystem
VERSION=require"version" VERSION=require"version"
TIME=love.timer.getTime TIME=love.timer.getTime
YIELD=coroutine.yield
SYSTEM=love.system.getOS() if SYSTEM=='OS X' then SYSTEM='macOS' end SYSTEM=love.system.getOS() if SYSTEM=='OS X' then SYSTEM='macOS' end
FNNS=SYSTEM:find'\79\83'-- What does FNSF stand for? IDK so don't ask me lol FNNS=SYSTEM:find'\79\83'-- What does FNSF stand for? IDK so don't ask me lol
MOBILE=SYSTEM=='Android' or SYSTEM=='iOS' MOBILE=SYSTEM=='Android' or SYSTEM=='iOS'
SAVEDIR=fs.getSaveDirectory()
-- Global Vars & Settings -- Global Vars & Settings
SFXPACKS={'chiptune'} SFXPACKS={'chiptune'}
VOCPACKS={'miya','mono','xiaoya','miku','rin'} VOCPACKS={'miya','mono','xiaoya','miku'}
FIRSTLAUNCH=false FIRSTLAUNCH=false
DAILYLAUNCH=false DAILYLAUNCH=false
@@ -59,17 +57,16 @@ FONT.setFallback('norm')
SCR.setSize(1280,720)-- Initialize Screen size SCR.setSize(1280,720)-- Initialize Screen size
BGM.setMaxSources(5) BGM.setMaxSources(5)
BGM.setChange(function(name)MES.new('music',text.nowPlaying..name,5)end)
VOC.setDiversion(.62) VOC.setDiversion(.62)
WIDGET.setOnChange(function() WIDGET.setOnChange(function()
if SCN.cur~='custom_field'then if SCN.cur~='net_game' and SCN.cur~='custom_field' then
local colorList=THEME.getThemeColor() local colorList=THEME.getThemeColor()
if not colorList then return end if colorList then
local rnd=math.random
for _,W in next,SCN.scenes[SCN.cur].widgetList do for _,W in next,SCN.scenes[SCN.cur].widgetList do
if W.color then if W.color then
W.color=colorList[rnd(#colorList)] W.color=colorList[math.random(#colorList)]
end
end end
end end
end end
@@ -108,7 +105,7 @@ 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 isSafeFile('parts/shaders/'..v)then if FILE.isSafe('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
@@ -149,6 +146,7 @@ do--Z.setCursor
{'dCirc',8,8,7}, {'dCirc',8,8,7},
{'fCirc',8,8,3}, {'fCirc',8,8,3},
} }
local _
Z.setCursor(function(time,x,y) Z.setCursor(function(time,x,y)
if not SETTING.sysCursor then if not SETTING.sysCursor then
local R=math.floor((time+1)/2)%7+1 local R=math.floor((time+1)/2)%7+1
@@ -180,6 +178,12 @@ Z.setOnFnKeys({
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,
}) })
Z.setOnGlobalKey('f11',function()
SETTING.fullscreen=not SETTING.fullscreen
applySettings()
saveSettings()
end)
Z.setVersionText(VERSION.string)
Z.setDebugInfo{ Z.setDebugInfo{
{"Cache",gcinfo}, {"Cache",gcinfo},
{"Tasks",TASK.getCount}, {"Tasks",TASK.getCount},
@@ -224,7 +228,16 @@ do--Z.setOnFocus
end end
end) end)
end end
Z.setOnQuit(destroyPlayers) Z.setOnBeforeQuit(function()
NET.ws_close()
TASK.new(function()
TEST.yieldT(.26)
love.event.quit()
end)
end)
Z.setOnQuit(function()
destroyPlayers()
end)
-- Load settings and statistics -- Load settings and statistics
if if
@@ -348,16 +361,16 @@ SKIN.load{
SFX.init((function()--[Warning] Not loading files here, just get the list of sound needed 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 isSafeFile('media/effect/chiptune/'..v,"Dangerous file : %SAVE%/media/effect/chiptune/"..v)then if FILE.isSafe('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))
end end
end end
return L return L
end)()) end)())
BGM.load((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 isSafeFile('media/music/'..v,"Dangerous file : %SAVE%/media/music/"..v)then if FILE.isSafe('media/music/'..v,"Dangerous file : %SAVE%/media/music/"..v) then
L[v:sub(1,-5)]='media/music/'..v L[v:sub(1,-5)]='media/music/'..v
end end
end end
@@ -412,7 +425,7 @@ 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 isSafeFile('parts/backgrounds/'..v)and v:sub(-3)=='lua'then if FILE.isSafe('parts/backgrounds/'..v) and 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
@@ -420,7 +433,7 @@ end
BG.remList('none')BG.remList('gray')BG.remList('custom') BG.remList('none')BG.remList('gray')BG.remList('custom')
-- 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 isSafeFile('parts/scenes/'..v)then if FILE.isSafe('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)
@@ -429,13 +442,13 @@ 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 isSafeFile('parts/modes/'..m.name)then if FILE.isSafe('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 for _,v in next,fs.getDirectoryItems('parts/modes') do
if isSafeFile('parts/modes/'..v)and not MODES[v:sub(1,-5)]then if FILE.isSafe('parts/modes/'..v) and not MODES[v:sub(1,-5)] then
local M={name=v:sub(1,-5)} local M={name=v:sub(1,-5)}
local modeData=require('parts.modes.'..M.name) local modeData=require('parts.modes.'..M.name)
if modeData.env then if modeData.env then
@@ -547,7 +560,7 @@ do
STAT.version=VERSION.code STAT.version=VERSION.code
needSave=true needSave=true
end end
SETTING.appLock,SETTING.dataSaving,SETTING.swap=nil SETTING.appLock,SETTING.dataSaving,SETTING.swap,SETTING.autoLogin=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 not RSlist[SETTING.RS] then SETTING.RS='TRS' end if not RSlist[SETTING.RS] then SETTING.RS='TRS' end
@@ -559,6 +572,7 @@ do
if SETTING.skin[18]==10 then SETTING.skin[18]=4 end if SETTING.skin[18]==10 then SETTING.skin[18]=4 end
if SETTING.reTime>3 or SETTING.reTime<.5 then SETTING.reTime=2 end if SETTING.reTime>3 or SETTING.reTime<.5 then SETTING.reTime=2 end
if SETTING.locale=='zh_full' then SETTING.locale='zh' end if SETTING.locale=='zh_full' then SETTING.locale='zh' end
if SETTING.vocPack=='rin' then SETTING.vocPack='miku' end
if RANKS.infinite then RANKS.infinite=0 end if RANKS.infinite then RANKS.infinite=0 end
if RANKS.infinite_dig then RANKS.infinite_dig=0 end if RANKS.infinite_dig then RANKS.infinite_dig=0 end
if not RANKS.sprint_10l then RANKS.sprint_10l=0 end if not RANKS.sprint_10l then RANKS.sprint_10l=0 end
@@ -662,7 +676,7 @@ for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i])end
-- Launch testing task if launch param received -- Launch testing task if launch param received
if TABLE.find(arg,'-- test') then if TABLE.find(arg,'-- test') then
TASK.new(function() TASK.new(function()
while not LOADED do YIELD()end while not LOADED do coroutine.yield() end
LOG("\27[92m\27[1mAutomatic Test Started\27[0m") LOG("\27[92m\27[1mAutomatic Test Started\27[0m")
BGM.setVol(0)SFX.setVol(0) BGM.setVol(0)SFX.setVol(0)
@@ -684,7 +698,7 @@ if TABLE.find(arg,'--test')then
end) end)
TASK.new(function() TASK.new(function()
while true do while true do
YIELD() coroutine.yield()
if Z.getErr(1) then break end if Z.getErr(1) then break end
end end
LOG("\27[91m\27[1mAutomatic Test Failed :(\27[0m\nThe error message is:\n"..table.concat(Z.getErr(1).mes,"\n").."\27[91m\nAborting\27[0m") LOG("\27[91m\27[1mAutomatic Test Failed :(\27[0m\nThe error message is:\n"..table.concat(Z.getErr(1).mes,"\n").."\27[91m\nAborting\27[0m")
@@ -692,4 +706,6 @@ if TABLE.find(arg,'--test')then
love.event.quit(1) love.event.quit(1)
end) end)
end end
WS.switchHost('101.43.110.22','10026','/tech/socket/v1') WS.switchHost('cafuuchino1.3322.org','10026','/techmino/ws/v1')
HTTP.setHost("cafuuchino1.3322.org:10026")
HTTP.setThreadCount(1)

BIN
media/music/antispace.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -160,9 +160,9 @@ do
[03]={'+0+0','+1+0','+1+1','+0-2','+1-2','+0+1'}, [03]={'+0+0','+1+0','+1+1','+0-2','+1-2','+0+1'},
[30]={'+0+0','-1+0','-1-1','+0+2','-1+2','+0+1','+0-1'}, [30]={'+0+0','-1+0','-1-1','+0+2','-1+2','+0+1','+0-1'},
[12]={'+0+0','+1+0','+1-1','+0-1','-1-1','+0+2','+1+2','+1+1'}, [12]={'+0+0','+1+0','+1-1','+0-1','-1-1','+0+2','+1+2','+1+1'},
[21]={'+0+0','-1+0','+0-2','-1-2','-1-1','+1+1'}, [21]={'+0+0','-1+0','+0-2','-1-2','-1-1','+0-1','+1+1'},
[32]={'+0+0','-1+0','-1-1','+0-1','+1-1','+0+2','-1+2','-1+1'}, [32]={'+0+0','-1+0','-1-1','+0-1','+1-1','+0+2','-1+2','-1+1'},
[23]={'+0+0','+1+0','+0-2','+1-2','+1-1','-1+1'}, [23]={'+0+0','+1+0','+0-2','+1-2','+1-1','+0-1','-1+1'},
[02]={'+0+0','-1+0','+1+0','+0+1'}, [02]={'+0+0','-1+0','+1+0','+0+1'},
[20]={'+0+0','+1+0','-1+0','+0-1'}, [20]={'+0+0','+1+0','-1+0','+0-1'},
[13]={'+0+0','+0-1','+0+1','+1+0','+0-2','+0+2'}, [13]={'+0+0','+0-1','+0+1','+1+0','+0-2','+0+2'},
@@ -393,8 +393,8 @@ do
{ {
[01]={'+0+0','+1-1','+1+0','+1+1','+0+1','-1+1','-1+0','-1-1','+0-1','+0-2','-2-1','-2-2','+2+0','+2-1','+2-2','+1+2','+2+2','-1+2','-2+2'}, [01]={'+0+0','+1-1','+1+0','+1+1','+0+1','-1+1','-1+0','-1-1','+0-1','+0-2','-2-1','-2-2','+2+0','+2-1','+2-2','+1+2','+2+2','-1+2','-2+2'},
[10]={'+0+0','-1+0','-1-1','+0-1','+1-1','-2-2','-2-1','-2+0','-1-2','+0-2','+1-2','+2-2','-1+1','-2+1','-2+2','+1+0','+2+0','+2-1','+0+1','+1-1','+2-2'}, [10]={'+0+0','-1+0','-1-1','+0-1','+1-1','-2-2','-2-1','-2+0','-1-2','+0-2','+1-2','+2-2','-1+1','-2+1','-2+2','+1+0','+2+0','+2-1','+0+1','+1-1','+2-2'},
[03]={'+0+0','-1-1','-1+0','-1+1','-0+1','+1+1','+1+0','+1-1','-0-1','-0-2','+2-1','+2-2','-2+0','-2-1','-2-2','-1+2','-2+2','+1+2','+2+2'}, [03]={'+0+0','-1-1','-1+0','-1+1','+0+1','+1+1','+1+0','+1-1','+0-1','+0-2','+2-1','+2-2','-2+0','-2-1','-2-2','-1+2','-2+2','+1+2','+2+2'},
[30]={'+0+0','+1+0','+1-1','-0-1','-1-1','+2-2','+2-1','+2+0','+1-2','-0-2','-1-2','-2-2','+1+1','+2+1','+2+2','-1+0','-2+0','-2-1','+0+1','-1-1','-2-2'}, [30]={'+0+0','+1+0','+1-1','+0-1','-1-1','+2-2','+2-1','+2+0','+1-2','+0-2','-1-2','-2-2','+1+1','+2+1','+2+2','-1+0','-2+0','-2-1','+0+1','-1-1','-2-2'},
},-- I5 },-- I5
{ {
[01]={'+0+0','-1+0','-1-1','+1+1','-1+1'}, [01]={'+0+0','-1+0','-1-1','+1+1','-1+1'},

View File

@@ -4,11 +4,11 @@ local shader=SHADER.aura
local t local t
function back.init() function back.init()
t=math.random()*260 t=math.random()*2600
BG.resize(SCR.w,SCR.h) BG.resize(SCR.w,SCR.h)
end end
function back.update(dt) function back.update(dt)
t=(t+dt)%2600 t=(t+dt)%6200
end end
function back.draw() function back.draw()
GC.clear(.08,.08,.084) GC.clear(.08,.08,.084)

View File

@@ -4,10 +4,10 @@ local shader=SHADER.grad1
local t local t
function back.init() function back.init()
t=math.random()*260 t=math.random()*2600
end end
function back.update(dt) function back.update(dt)
t=(t+dt)%2600 t=(t+dt)%6200
end end
function back.draw() function back.draw()
GC.clear(.08,.08,.084) GC.clear(.08,.08,.084)

View File

@@ -4,11 +4,11 @@ local shader=SHADER.grad2
local t local t
function back.init() function back.init()
t=math.random()*260 t=math.random()*2600
BG.resize(nil,SCR.h) BG.resize(nil,SCR.h)
end end
function back.update(dt) function back.update(dt)
t=(t+dt)%2600 t=(t+dt)%6200
end end
function back.draw() function back.draw()
GC.clear(.08,.08,.084) GC.clear(.08,.08,.084)

View File

@@ -0,0 +1,41 @@
--Space with stars
local gc=love.graphics
local circle,setColor,hsv=gc.circle,gc.setColor,COLOR.hsv
local sin,cos=math.sin,math.cos
local back={}
local sDist,sRev={},{} -- star data in SoA [distance from center, revolution progress, color]
function back.init()
if sDist[1]then return end
local max
for i=0,20 do
max=16*(i+1)
for j=1,max do
sDist[#sDist+1]=i+math.random()
sRev[#sRev+1]=MATH.tau*j/max+MATH.tau*math.random()/max
end
end
end
function back.update(dt)
for i=1,#sDist do
sRev[i]=(sRev[i]+dt/(sDist[i]+1))%MATH.tau
end
end
function back.draw()
gc.clear()
gc.translate(SCR.cx,SCR.cy)
gc.scale(SCR.k)
gc.rotate(1)
for i=1,#sDist do
local d,r=sDist[i],sRev[i]
if d<5 then
setColor(hsv(.088,(d-2)/7,1,.7))
else
setColor(hsv(.572,d/70+.1,(22-d)/12,.7))
end
circle('fill',8*d*cos(r),24*d*sin(r),3)
end
end
return back

View File

@@ -0,0 +1,145 @@
local gc=love.graphics
local hsv=COLOR.hsv
local circle,push,pop,rot,translate,setColor=gc.circle,gc.push,gc.pop,gc.rotate,gc.translate,gc.setColor
local rnd,sin,cos,log,ceil=math.random,math.sin,math.cos,math.log,math.ceil
local back={}
local qX,qY,qdX,qdY={},{},{},{} -- quark data in SoA [size, X, Y, dx, dy, color]
local ptcclr={{1,0,0},{0,1,0},{0,0,1}}
local apcclr={{0,1,1},{1,0,1},{1,1,0}}
local blasts={} -- data about annihilation blasts from particles and antiparticles colliding
local ptc={} -- particle-antiparticle data (antiparticle is a mirror of particle)
local nextpair
local W,H,size
local quarkCount=400
local function spawnQuarkRandom(i)
qX[i]=rnd(W)-10 -- X
qY[i]=rnd(H)-10 -- Y
local theta=rnd()*MATH.tau
qdX[i]=cos(theta)*300 -- dx
qdY[i]=sin(theta)*300 -- dy
end
local function spawnQuarkEdge(i)
local side=rnd(4)
if side==1 then -- Up edge of screen
qX[i]=rnd(SCR.x-10,SCR.ex+10)
qY[i]=SCR.y-10
elseif side==2 then -- Right edge of screen
qX[i]=SCR.ex+10
qY[i]=rnd(SCR.y-10,SCR.ey+10)
elseif side==3 then -- Down edge of screen
qX[i]=rnd(SCR.x-10,SCR.ex+10)
qY[i]=SCR.ey+10
elseif side==4 then -- Left edge of screen
qX[i]=SCR.x-10
qY[i]=rnd(SCR.y-10,SCR.ey+10)
end
local theta=rnd()*MATH.tau
qdX[i]=cos(theta)*300 -- dx
qdY[i]=sin(theta)*300 -- dy
end
local function spawnParticlePair()
ptc[#ptc+1]={
x=rnd(W)-10,
y=rnd(H)-10,
dist=0,
theta=rnd()*MATH.tau,
v=500,
c=rnd(3),
}
end
local function spawnBlast(_x,_y)
blasts[#blasts+1]={x=_x,y=_y,t=0}
end
function back.init()
qX,qY,qdX,qdY={},{},{},{}
blasts={}
ptc={}
nextpair=0
BG.resize(SCR.w,SCR.h)
end
function back.resize(w,h)
W,H=w+20,h+20
for i=1,quarkCount do spawnQuarkRandom(i) end
size=2.6*SCR.k
end
function back.update(dt)
-- Move far-away quarks
for i=1,quarkCount do
qX[i]=qX[i]+qdX[i]*dt
qY[i]=qY[i]+qdY[i]*dt
if qX[i]<SCR.x-26 or qX[i]>SCR.ex+26 or qY[i]<SCR.y-26 or qY[i]>SCR.ey+26 then
spawnQuarkEdge(i)
end
end
-- Particle pair attraction & destruction
for i=#ptc,1,-1 do
local p=ptc[i]
if p then
p.dist=p.dist+p.v*dt
p.v=p.v-p.dist^2*dt
-- Destroy colliding particle pairs
if p.dist<=10 and p.v<=0 then
spawnBlast(p.x,p.y)
table.remove(ptc,i)
end
end
end
-- Age blasts, delete old blasts
for i=#blasts,1,-1 do
if blasts[i] then
blasts[i].t=blasts[i].t+dt
if blasts[i].t>=1 then
table.remove(blasts,i)
end
end
end
-- Spawn particle pairs
nextpair=nextpair-dt
if nextpair<=0 then
spawnParticlePair()
nextpair=rnd()*4
end
end
function back.draw()
gc.clear(.08,.04,.01)
translate(-10,-10)
-- Draw quarks in R/G/B
setColor(1,0,0,.8) for i=1, math.floor(quarkCount/3) do circle('fill',qX[i],qY[i],size) end
setColor(0,1,0,.8) for i=math.floor(quarkCount/3)+1, math.floor(quarkCount*2/3) do circle('fill',qX[i],qY[i],size) end
setColor(0,0,1,.8) for i=math.floor(quarkCount*2/3)+1,quarkCount do circle('fill',qX[i],qY[i],size) end
for i=1,#ptc do
local p=ptc[i]
push()
translate(p.x,p.y)
rot(p.theta)
setColor(ptcclr[p.c])
circle('fill', p.dist,0,4*size)
setColor(apcclr[p.c])
circle('fill',-p.dist,0,4*size)
pop()
end
for i=1,#blasts do
local t=blasts[i].t
setColor(hsv(-80*t,1-1.7*log(5*t,10),1,1-t))
circle('fill',blasts[i].x,blasts[i].y,62*t^.3)
end
end
function back.discard()
qX,qY,qdX,qdY,qC=nil
ptc,blasts=nil
collectgarbage()
end
return back

View File

@@ -4,11 +4,11 @@ local shader=SHADER.rgb1
local t local t
function back.init() function back.init()
t=math.random()*260 t=math.random()*2600
BG.resize(SCR.w,SCR.h) BG.resize(SCR.w,SCR.h)
end end
function back.update(dt) function back.update(dt)
t=(t+dt)%2600 t=(t+dt)%6200
end end
function back.draw() function back.draw()
GC.clear(.08,.08,.084) GC.clear(.08,.08,.084)

View File

@@ -4,11 +4,11 @@ local shader=SHADER.rgb2
local t local t
function back.init() function back.init()
t=math.random()*260 t=math.random()*2600
BG.resize(SCR.w,SCR.h) BG.resize(SCR.w,SCR.h)
end end
function back.update(dt) function back.update(dt)
t=(t+dt)%2600 t=(t+dt)%6200
end end
function back.draw() function back.draw()
GC.clear(.08,.08,.084) GC.clear(.08,.08,.084)

View File

@@ -11,9 +11,9 @@ function bot_cc:checkDest(b2b,atk,exblock,yomi)
local dest=self.P.destFX local dest=self.P.destFX
if not dest then return end if not dest then return end
if not (dest.b2b==b2b and dest.attack==atk and dest.extra==exblock) then if not (dest.b2b==b2b and dest.attack==atk and dest.extra==exblock) then
print(('hope: %s %s %s'):format(dest.b2b,dest.attack,dest.extra)) -- print(('hope: %s %s %s'):format(dest.b2b,dest.attack,dest.extra))
print(('real: %s %s %s'):format(b2b,atk,exblock)) -- print(('real: %s %s %s'):format(b2b,atk,exblock))
print(yomi) -- print(yomi)
self:lockWrongPlace() self:lockWrongPlace()
self.P.destFX=nil self.P.destFX=nil
return return

View File

@@ -127,7 +127,7 @@ function DATA.pasteBoard(str,page)--Paste [str] data to [page] board
fX=fX+1 fX=fX+1
else else
fY=fY+1 fY=fY+1
if fY>20 then break end if fY>60 then break end
fX=1 fX=1
end end
p=p+1 p=p+1

View File

@@ -8,7 +8,7 @@ return{
end, end,
task=function(P) task=function(P)
while true do while true do
YIELD() coroutine.yield()
if P.control and P.atkBufferSum==0 then if P.control and P.atkBufferSum==0 then
local D=P.modeData local D=P.modeData
if D.wave==50 then if D.wave==50 then

View File

@@ -8,7 +8,7 @@ return{
end, end,
task=function(P) task=function(P)
while true do while true do
YIELD() coroutine.yield()
if P.control and P.atkBufferSum<4 then if P.control and P.atkBufferSum<4 then
local D=P.modeData local D=P.modeData
if D.wave==50 then if D.wave==50 then

View File

@@ -10,7 +10,7 @@ return{
end, end,
task=function(P) task=function(P)
while true do while true do
YIELD() coroutine.yield()
if P.control then if P.control then
local D=P.modeData local D=P.modeData
D.counter=D.counter+1 D.counter=D.counter+1

View File

@@ -10,7 +10,7 @@ return{
end, end,
task=function(P) task=function(P)
while true do while true do
YIELD() coroutine.yield()
if P.control then if P.control then
local D=P.modeData local D=P.modeData
D.counter=D.counter+1 D.counter=D.counter+1

View File

@@ -6,7 +6,7 @@ return{
end, end,
task=function(P) task=function(P)
while true do while true do
YIELD() coroutine.yield()
if P.control then if P.control then
local D=P.modeData local D=P.modeData
D.timer=D.timer+1 D.timer=D.timer+1

View File

@@ -6,7 +6,7 @@ return{
end, end,
task=function(P) task=function(P)
while true do while true do
YIELD() coroutine.yield()
if P.control then if P.control then
local D=P.modeData local D=P.modeData
D.timer=D.timer+1 D.timer=D.timer+1

View File

@@ -53,7 +53,7 @@ return{
P.modeData.rankPoint=0 P.modeData.rankPoint=0
P.modeData.rankName=sectionName[1] P.modeData.rankName=sectionName[1]
while true do while true do
YIELD() coroutine.yield()
if P.stat.frame>=3600 then if P.stat.frame>=3600 then
P.modeData.rankPoint=math.min(P.modeData.rankPoint+passPoint,140) P.modeData.rankPoint=math.min(P.modeData.rankPoint+passPoint,140)
P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1] P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1]

View File

@@ -289,7 +289,7 @@ return{
local decayRate={125,80,80,50,45,45,45,40,40,40,40,40,30,30,30,20,20,20,20,20,15,15,15,15,15,15,15,15,15,15,10,10,10,9,9,9,8,8,8,7,7,7,6} local decayRate={125,80,80,50,45,45,45,40,40,40,40,40,30,30,30,20,20,20,20,20,15,15,15,15,15,15,15,15,15,15,10,10,10,9,9,9,8,8,8,7,7,7,6}
local decayTimer=0 local decayTimer=0
while true do while true do
YIELD() coroutine.yield()
P.modeData.grade=getGrade() P.modeData.grade=getGrade()
P.modeData.gradePts=math.max(math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList),1) P.modeData.gradePts=math.max(math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList),1)
if P.stat.frame-prevSectTime > reg_time[math.ceil(P.modeData.pt/100+0.01)] and not (isInRoll or isInRollTrans) then if P.stat.frame-prevSectTime > reg_time[math.ceil(P.modeData.pt/100+0.01)] and not (isInRoll or isInRollTrans) then
@@ -336,7 +336,7 @@ return{
rollGrades=rollGrades+(cools>8 and 1.6 or 0.5) rollGrades=rollGrades+(cools>8 and 1.6 or 0.5)
P.modeData.grade=getGrade() P.modeData.grade=getGrade()
P.modeData.gradePts=math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList) P.modeData.gradePts=math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList)
YIELD() coroutine.yield()
P:win('finish') P:win('finish')
end end
end end

View File

@@ -72,7 +72,7 @@ return{
P.modeData.pt=0 P.modeData.pt=0
P.modeData.target=100 P.modeData.target=100
while true do while true do
YIELD() coroutine.yield()
if P.holdTime==0 and P.waiting<=0 and not held then if P.holdTime==0 and P.waiting<=0 and not held then
hidetimer=0 hidetimer=0
held=true held=true

View File

@@ -11,7 +11,7 @@ local function task_PC(P)
P:pushNextList(L,symmetry) P:pushNextList(L,symmetry)
P.control=false P.control=false
if P.frameRun>180 then for _=1,26 do YIELD()end end if P.frameRun>180 then for _=1,26 do coroutine.yield() end end
P.control=true P.control=true
local base=PCbase[difficulty] local base=PCbase[difficulty]

View File

@@ -14,7 +14,7 @@ local function task_PC(P)
P:pushNextList(L,symmetry) P:pushNextList(L,symmetry)
P.control=false P.control=false
if P.frameRun>180 then for _=1,26 do YIELD()end end if P.frameRun>180 then for _=1,26 do coroutine.yield() end end
P.control=true P.control=true
local base=PCbase[difficulty] local base=PCbase[difficulty]

View File

@@ -7,9 +7,9 @@ return{
PLY.draw.drawTargetLine(P,r) PLY.draw.drawTargetLine(P,r)
end, end,
task=function(P) task=function(P)
YIELD() coroutine.yield()
while true do while true do
for _=1,P.holeRND:random(40,200)do YIELD()end for _=1,P.holeRND:random(40,200) do coroutine.yield() end
local r=P.holeRND:random(7) local r=P.holeRND:random(7)
if r==1 then if r==1 then
if P.cur and not P:ifoverlap(P.cur.bk,P.curX-1,P.curY) then if P.cur and not P:ifoverlap(P.cur.bk,P.curX-1,P.curY) then

View File

@@ -6,7 +6,7 @@ return{
end, end,
task=function(P) task=function(P)
while true do while true do
YIELD() coroutine.yield()
if P.control then if P.control then
local D=P.modeData local D=P.modeData
D.timer=D.timer+1 D.timer=D.timer+1

View File

@@ -6,7 +6,7 @@ return{
end, end,
task=function(P) task=function(P)
while true do while true do
YIELD() coroutine.yield()
if P.control then if P.control then
local D=P.modeData local D=P.modeData
D.timer=D.timer+1 D.timer=D.timer+1

View File

@@ -6,7 +6,7 @@ return{
end, end,
task=function(P) task=function(P)
while true do while true do
YIELD() coroutine.yield()
if P.control then if P.control then
local D=P.modeData local D=P.modeData
D.timer=D.timer+1 D.timer=D.timer+1
@@ -18,7 +18,7 @@ return{
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}) table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3})
P.atkBufferSum=P.atkBufferSum+4 P.atkBufferSum=P.atkBufferSum+4
P.stat.recv=P.stat.recv+4 P.stat.recv=P.stat.recv+4
if D.wave==60 then if D.wave==90 then
P:_showText(text.maxspeed,0,-140,100,'appear',.6) P:_showText(text.maxspeed,0,-140,100,'appear',.6)
end end
P:shakeField(3) P:shakeField(3)

View File

@@ -6,7 +6,7 @@ return{
end, end,
task=function(P) task=function(P)
while true do while true do
YIELD() coroutine.yield()
if P.control then if P.control then
local D=P.modeData local D=P.modeData
D.timer=D.timer+1 D.timer=D.timer+1

View File

@@ -6,7 +6,7 @@ return{
end, end,
task=function(P) task=function(P)
while true do while true do
YIELD() coroutine.yield()
if P.control then if P.control then
local D=P.modeData local D=P.modeData
D.timer=D.timer+1 D.timer=D.timer+1

View File

@@ -18,10 +18,10 @@ return{
GC.mStr(T,63,268) GC.mStr(T,63,268)
end, end,
task=function(P) task=function(P)
BGM.seek(0) BGM.set('all','seek',0)
P.modeData.section=1 P.modeData.section=1
while true do while true do
YIELD() coroutine.yield()
while P.stat.frame>=warnTime[P.modeData.section] do while P.stat.frame>=warnTime[P.modeData.section] do
if P.modeData.section<9 then if P.modeData.section<9 then
P.modeData.section=P.modeData.section+1 P.modeData.section=P.modeData.section+1

View File

@@ -2,7 +2,7 @@ local gc_push,gc_pop=GC.push,GC.pop
local gc_origin,gc_replaceTransform=GC.origin,GC.replaceTransform local gc_origin,gc_replaceTransform=GC.origin,GC.replaceTransform
local gc_setLineWidth,gc_setColor=GC.setLineWidth,GC.setColor local gc_setLineWidth,gc_setColor=GC.setLineWidth,GC.setColor
local gc_setShader=GC.setShader local gc_setShader=GC.setShader
local gc_draw,gc_rectangle,gc_line,gc_printf=GC.draw,GC.rectangle,GC.line,GC.printf local gc_draw,gc_rectangle,gc_printf=GC.draw,GC.rectangle,GC.printf
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
local int,rnd=math.floor,math.random local int,rnd=math.floor,math.random
@@ -10,7 +10,6 @@ local approach=MATH.expApproach
local SETTING,GAME,SCR=SETTING,GAME,SCR local SETTING,GAME,SCR=SETTING,GAME,SCR
local PLAYERS=PLAYERS local PLAYERS=PLAYERS
local playSFX=SFX.play
@@ -93,13 +92,6 @@ do--function loadFile(name,args), function saveFile(data,name,args)
end end
end end
end end
function isSafeFile(file,mes)
if love.filesystem.getRealDirectory(file)~=SAVEDIR then
return true
elseif mes then
MES.new('warn',mes)
end
end
function saveStats() function saveStats()
return saveFile(STAT,'conf/data') return saveFile(STAT,'conf/data')
end end
@@ -107,8 +99,14 @@ function saveProgress()
return saveFile(RANKS,'conf/unlock') return saveFile(RANKS,'conf/unlock')
end end
function saveSettings() function saveSettings()
if WS.status('game')=='running' then
NET.player_updateConf()
end
return saveFile(SETTING,'conf/settings') return saveFile(SETTING,'conf/settings')
end end
function saveUser()
return saveFile(USER.__data,'conf/user')
end
do-- function applySettings() do-- function applySettings()
local saturateValues={ local saturateValues={
normal={0,1}, normal={0,1},
@@ -190,12 +188,22 @@ end
-- Royale mode -- Royale mode
function randomTarget(P)-- Return a random opponent for P function randomTarget(P)-- Return a random opponent for P
if #PLY_ALIVE>1 then local l=TABLE.shift(PLY_ALIVE,0)
local R local count=0
repeat for i=1,#l do
R=PLY_ALIVE[rnd(#PLY_ALIVE)] if P.group==0 and l[i]~=P or P.group~=l[i].group then
until R~=P count=count+1
return R end
end
if count==0 then return end
count=rnd(count)
for i=1,#l do
if P.group==0 and l[i]~=P or P.group~=l[i].group then
count=count-1
if count==0 then
return l[i]
end
end
end end
end end
function freshMostDangerous() function freshMostDangerous()
@@ -288,25 +296,25 @@ end
function playClearSFX(cc) function playClearSFX(cc)
if cc<=0 or cc%1~=0 then return end if cc<=0 or cc%1~=0 then return end
if cc<=4 then if cc<=4 then
playSFX('clear_'..cc) SFX.play('clear_'..cc)
elseif cc<=6 then elseif cc<=6 then
playSFX('clear_4') SFX.play('clear_4')
elseif cc<=12 then elseif cc<=12 then
playSFX('clear_4',.8) SFX.play('clear_4',.8)
if cc<=9 then if cc<=9 then
Snd('bass','A3','E4') Snd('bass','A3','E4')
else else
Snd('bass','A3','E4','A4') Snd('bass','A3','E4','A4')
end end
elseif cc<=16 then elseif cc<=16 then
playSFX('clear_5',.7) SFX.play('clear_5',.7)
if cc<=14 then if cc<=14 then
Snd('bass',.8,'A3','E4')Snd('lead','A4','E5') Snd('bass',.8,'A3','E4')Snd('lead','A4','E5')
else else
Snd('bass',.8,'A3','G4')Snd('lead','B4','G5') Snd('bass',.8,'A3','G4')Snd('lead','B4','G5')
end end
else else
playSFX('clear_6',.6) SFX.play('clear_6',.6)
if cc==17 then Snd('bass',.8,'A3','A4')Snd('lead','E5','G5') if cc==17 then Snd('bass',.8,'A3','A4')Snd('lead','E5','G5')
elseif cc==18 then Snd('bass',.7,'A4')Snd('lead',.8,'C4','G5')Snd('bell','D5') elseif cc==18 then Snd('bass',.7,'A4')Snd('lead',.8,'C4','G5')Snd('bell','D5')
elseif cc==19 then Snd('bass',.7,'A4')Snd('lead',.8,'A4','E5')Snd('bell','B5') elseif cc==19 then Snd('bass',.7,'A4')Snd('lead',.8,'A4','E5')Snd('bell','B5')
@@ -493,7 +501,7 @@ end
function loadGame(mode,ifQuickPlay,ifNet)-- Load a mode and go to game scene function loadGame(mode,ifQuickPlay,ifNet)-- Load a mode and go to game scene
freshDate() freshDate()
if legalGameTime() then if legalGameTime() then
if not MODES[mode]and love.filesystem.getRealDirectory('parts/modes/'..mode)~=SAVEDIR then if not MODES[mode] and FILE.isSafe('parts/modes/'..mode) then
MODES[mode]=require('parts.modes.'..mode) MODES[mode]=require('parts.modes.'..mode)
MODES[mode].name=mode MODES[mode].name=mode
end end
@@ -513,7 +521,7 @@ function loadGame(mode,ifQuickPlay,ifNet)--Load a mode and go to game scene
local modeText=text.modes[mode] or{"["..MODES[mode].name.."]",""} local modeText=text.modes[mode] or{"["..MODES[mode].name.."]",""}
TEXTOBJ.modeName:set(modeText[1].." "..modeText[2]) TEXTOBJ.modeName:set(modeText[1].." "..modeText[2])
SCN.go('game',ifQuickPlay and 'swipeD' or 'fade_togame') SCN.go('game',ifQuickPlay and 'swipeD' or 'fade_togame')
playSFX('enter') SFX.play('enter')
end end
end end
end end
@@ -577,7 +585,7 @@ function gameOver()--Save record
P:_showText(text.newRecord,0,-100,100,'beat',.5) P:_showText(text.newRecord,0,-100,100,'beat',.5)
if SETTING.autoSave and DATA.saveReplay() then if SETTING.autoSave and DATA.saveReplay() then
GAME.saved=true GAME.saved=true
playSFX('connected') SFX.play('connected')
MES.new('check',text.saveDone) MES.new('check',text.saveDone)
end end
end end
@@ -695,7 +703,7 @@ do--function resetGameData(args)
local function task_showMods() local function task_showMods()
local time=0 local time=0
while true do while true do
YIELD() coroutine.yield()
time=time+1 time=time+1
if time%20==0 then if time%20==0 then
local M=GAME.mod[time/20] local M=GAME.mod[time/20]
@@ -792,13 +800,12 @@ do--function resetGameData(args)
collectgarbage() collectgarbage()
end end
end end
do--function checkWarning() do-- function checkWarning(P,dt)
local max=math.max local max=math.max
function checkWarning(dt) function checkWarning(P,dt)
local P1=PLAYERS[1] if P.alive then
if P1.alive then if P.frameRun%26==0 then
if P1.frameRun%26==0 then local F=P.field
local F=P1.field
local height=0-- Max height of row 4~7 local height=0-- Max height of row 4~7
for x=4,7 do for x=4,7 do
for y=#F,1,-1 do for y=#F,1,-1 do
@@ -810,7 +817,7 @@ do--function checkWarning()
end end
end end
end end
GAME.warnLVL0=math.log(height-(P1.gameEnv.fieldH-5)+P1.atkBufferSum*.8) GAME.warnLVL0=math.log(height-(P.gameEnv.fieldH-5)+P.atkBufferSum*.8)
end end
local _=GAME.warnLVL local _=GAME.warnLVL
if _<GAME.warnLVL0 then if _<GAME.warnLVL0 then
@@ -819,7 +826,7 @@ do--function checkWarning()
_=max(_-.026,0) _=max(_-.026,0)
end end
GAME.warnLVL=_ GAME.warnLVL=_
if GAME.warnLVL>1.126 and P1.frameRun%30==0 then if GAME.warnLVL>1.126 and P.frameRun%30==0 then
SFX.fplay('warn_beep',SETTING.sfx_warn) SFX.fplay('warn_beep',SETTING.sfx_warn)
end end
elseif GAME.warnLVL>0 then elseif GAME.warnLVL>0 then
@@ -832,27 +839,9 @@ end
-- Game draw -- Game draw
do-- function drawSelfProfile() do-- function drawSelfProfile()
local lvColor={COLOR.J,COLOR.A,COLOR.C,COLOR.N,COLOR.S,COLOR.V,COLOR.P,COLOR.M,COLOR.W,COLOR.R,COLOR.O,COLOR.Y}
local lvIcon=setmetatable({},{__index=function(self,lv)
local c=lvColor[int((lv-1)/26)+1]or COLOR.Z
local img=GC.DO{25,25,
{"clear",0,0,0,0},
{"setLW",2},
{"setCL",c[1],c[2],c[3],.6},
{"fRect",2,2,21,21,2},
{"setCL",c},
{"dRect",2,2,21,21,2},
{"setCL",COLOR.Z},
{"mText",(lv-1)%26+1,13,-1},
}
rawset(self,lv,img)
return img
end})
local name local name
local textObj,scaleK,width,offY local textObj,scaleK,width,offY
function drawSelfProfile() function drawSelfProfile()
local selfAvatar=USERS.getAvatar(USER.uid)
gc_push('transform') gc_push('transform')
gc_replaceTransform(SCR.xOy_ur) gc_replaceTransform(SCR.xOy_ur)
@@ -861,7 +850,7 @@ do--function drawSelfProfile()
gc_setColor(COLOR.X)gc_rectangle('fill',0,0,-300,80) gc_setColor(COLOR.X)gc_rectangle('fill',0,0,-300,80)
gc_setColor(1,1,1)gc_rectangle('line',-300,0,300,80,5) gc_setColor(1,1,1)gc_rectangle('line',-300,0,300,80,5)
gc_rectangle('line',-73,7,66,66,2) gc_rectangle('line',-73,7,66,66,2)
gc_draw(selfAvatar,-72,8,nil,.5) gc_draw(USERS.getAvatar(USER.uid),-72,8,nil,.5)
-- Draw username -- Draw username
if name~=USERS.getUsername(USER.uid) then if name~=USERS.getUsername(USER.uid) then
@@ -873,11 +862,6 @@ do--function drawSelfProfile()
end end
gc_draw(textObj,-82,26,nil,scaleK,nil,width,offY) gc_draw(textObj,-82,26,nil,scaleK,nil,width,offY)
--Draw lv. & xp.
gc_draw(lvIcon[USER.lv],-295,50)
gc_line(-270,55,-80,55,-80,70,-270,70)
gc_rectangle('fill',-210,55,150*USER.xp/USER.lv/USER.lv,15)
gc_pop() gc_pop()
end end
end end
@@ -886,7 +870,7 @@ function drawOnlinePlayerCount()
gc_setColor(1,1,1) gc_setColor(1,1,1)
gc_push('transform') gc_push('transform')
gc_replaceTransform(SCR.xOy_ur) gc_replaceTransform(SCR.xOy_ur)
gc_printf(("%s: %s/%s/%s"):format(text.onlinePlayerCount,NET.UserCount,NET.PlayCount,NET.StreamCount),-600,80,594,'right') gc_printf(text.onlinePlayerCount:repD(NET.onlineCount),-600,80,594,'right')
gc_pop() gc_pop()
end end
function drawWarning() function drawWarning()

View File

@@ -20,6 +20,16 @@ RANK_COLORS={
{1,.5,.4}, {1,.5,.4},
{.95,.5,.95}, {.95,.5,.95},
} }
GROUP_COLORS={
[0]=COLOR.Z,
[1]={STRING.hexColor'e57373'},
[2]={STRING.hexColor"4caf50"},
[3]={STRING.hexColor'5c6bc0'},
[4]={STRING.hexColor'ffe082'},
[5]={STRING.hexColor'ba68c8'},
[6]={STRING.hexColor'80deea'},
}
do-- SVG_TITLE_FILL, SVG_TITLE_LINE do-- SVG_TITLE_FILL, SVG_TITLE_LINE
SVG_TITLE_FILL={ SVG_TITLE_FILL={
{ {
@@ -574,14 +584,24 @@ do--Game data tables
REPLAY={}-- Replay objects (not include stream data) REPLAY={}-- Replay objects (not include stream data)
end end
do-- Userdata tables do-- Userdata tables
USER={--User infomation USER=setmetatable({-- User infomation
--Network infos __data={
uid=false, uid=false,
authToken=false, email=false,
password=false,
--Local data rToken=false,
xp=0,lv=1, aToken=false,
} },
},{
__index=function(self,k)
return self.__data[k]
end,
__newindex=function(self,k,v)
if self.__data[k]~=nil and v~=nil then
self.__data[k]=v
end
end,
})
SETTING={-- Settings SETTING={-- Settings
-- Tuning -- Tuning
das=10,arr=2, das=10,arr=2,
@@ -598,7 +618,6 @@ do--Userdata tables
menuPos='middle', menuPos='middle',
fine=false, fine=false,
autoSave=false, autoSave=false,
autoLogin=true,
simpMode=false, simpMode=false,
sysCursor=true, sysCursor=true,
maxFPS=60, maxFPS=60,

View File

@@ -138,8 +138,8 @@ return{
{"TTT", {"TTT",
"tetris trainer tres bien", "tetris trainer tres bien",
"game", "game",
"Tetris Trainer Très-Bien (by こな “kona”). A hands-on tutorial of advanced techniques in modern Tetris (which only supports physical keyboards).\nRecommended for players who can complete 40L with Tetris only and no Hold.\nCovered topics such as T-Spin, finesse, SRS, and some battle setups.\nLink in Japanese.", "Tetris Trainer Très-Bien (by こな “kona”). A hands-on tutorial of advanced techniques in modern Tetris (which only supports physical keyboards).\nRecommended for players who can complete 40L with Tetris only and no Hold.\nCovered topics such as T-Spin, finesse, SRS, and some battle setups.\nThe link below is the English version of the website, translated by User670 (Originally in Japanese).",
"http://taninkona.web.fc2.com/ttt/", "https://user670.github.io/tetris-trainer-tres-bien/",
}, },
{"TTPC", {"TTPC",
"tetris perfect clear challenge", "tetris perfect clear challenge",

View File

@@ -104,40 +104,92 @@ return{
dictNote="==Copied from TetroDictionary==", dictNote="==Copied from TetroDictionary==",
getNoticeFail="Failed to fetch announcements",
-- Server's warn/error messages
Techrater={
internalError="Internal error",
databaseError="Database error",
invalidFormat="Invalid format",
invalidArguments="Invalid arguments",
tooFrequent="Too frequent",
notAvailable="Not available",
noPermission="No permission",
roomNotFound="Room not found",
-- Controllers
WebSocket={
invalidConnection="Invalid connection",
invalidAction="Invalid action",
playerNotFound="Player not found",
connectionFailed="Connection failed",
},
-- Filters
CheckPermission={
playerNotFound="Player not found",
},
-- Plugins
ConnectionManager={
playerInvalid="Player invalid",
playerNotFound="Player not found",
connectionReplaced="Connection replaced",
},
NoticeManager={
noticeNotFound="Notice not found",
},
PlayerManager={
invalidCode="Invalid code",
invalidEmail="Invalid email",
playerNotFound="Player not found",
invalidEmailPass="Invalid email or password",
emailExists="Email exists",
emailSendError="Email send error",
},
-- Strategies
PlayerRole={
invalidRole="Invalid role",
invalidTarget="Invalid target",
},
PlayerType={
invalidType="Invalid type",
roomFull="Room full",
},
RoomJoin={
wrongPassword="Wrong password",
},
},
tooFrequent="Request too frequently",
roomPasswordChanged="Room password changed",
oldVersion="Version $1 is now available", oldVersion="Version $1 is now available",
needUpdate="Newer version required!",
versionNotMatch="Versions do not match!", versionNotMatch="Versions do not match!",
notFinished="Coming soon!", notFinished="Coming soon!",
jsonError="JSON error",
noUsername="Please enter your username", noUsername="Please enter your username",
wrongEmail="Invalid email address", wrongEmail="Invalid email address",
wrongCode="Invalid verification code",
noPassword="Please enter your password", noPassword="Please enter your password",
diffPassword="Passwords dont match", diffPassword="Passwords dont match",
registerRequestSent="A sign up request has been sent.", checkEmail="A sign up request has been sent.",
registerOK="Sign up successful!",
loginOK="You are now logged in!",
accessOK="Access granted",
wsConnecting="Websocket connecting…", wsFailed="WebSocket connection failed: $1",
wsFailed="WebSocket connection failed", wsClose="WebSocket closed: $1",
wsClose="WebSocket closed:",
netTimeout="Connection timed out", netTimeout="Connection timed out",
serverDown="Oops! Server is down",
requestFailed="Request failed",
onlinePlayerCount="Online", onlinePlayerCount="Online: $1",
createRoomSuccessed="Room created", createRoomSuccessed="Room created",
playerKicked="$1 removed $2 from room",
becomeHost="$1 become host",
started="Playing", started="Playing",
joinRoom="has entered the room.", joinRoom="$1 has entered the room.",
leaveRoom="has left the room.", leaveRoom="$1 has left the room.",
roomRemoved="Room was removed",
ready="Ready", ready="Ready",
connStream="Connecting",
waitStream="Waiting",
spectating="Spectating", spectating="Spectating",
chatRemain="Online",
chatStart="------Beginning of log------",
chatHistory="------New messages below------",
keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete", keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete",
customBGhelp="Drop image file here to apply custom background", customBGhelp="Drop image file here to apply custom background",
@@ -322,6 +374,7 @@ return{
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
json.lua [rxi] json.lua [rxi]
profile.lua [itraykov] profile.lua [itraykov]
sha2 [Egor Skriptunoff]
]], ]],
support="Support the author", support="Support the author",
WidgetText={ WidgetText={
@@ -361,6 +414,7 @@ return{
league="Tech League", league="Tech League",
ffa="FFA", ffa="FFA",
rooms="Rooms", rooms="Rooms",
resetPW="Reset password",
logout="Log out", logout="Log out",
}, },
net_league={ net_league={
@@ -437,7 +491,6 @@ return{
sysCursor="Use System Cursor", sysCursor="Use System Cursor",
autoPause="Pause When Unfocused", autoPause="Pause When Unfocused",
autoSave="Auto-save New Records", autoSave="Auto-save New Records",
autoLogin="Auto-login on Start",
simpMode="Simplistic Mode", simpMode="Simplistic Mode",
}, },
setting_video={ setting_video={
@@ -688,24 +741,29 @@ return{
music="BGMs", music="BGMs",
label="label", label="label",
}, },
login={ login_pw={
title="Sign In", title="Sign In",
register="Sign Up", login_mail="Login with E-mail/Sign Up",
email="Email Address", email="Email Address",
password="Password", password="Password",
showEmail="Show Email", showEmail="Show Email",
keepPW="Remember me",
login="Log In", login="Log In",
}, },
register={ login_mail={
title="Sign Up", title="Sign In/Sign Up",
login="Sign In", login_pw="Password Sign In",
username="Username",
email="Email Address", email="Email Address",
send="Send code",
code="Verification Code",
verify="Verify",
},
reset_password={
title="Reset Password",
send="Send code",
code="Verification Code",
password="Password", password="Password",
password2="Re-enter Password", password2="Re-enter Password",
register="Sign Up", setPW="Set Password",
registering="Waiting for response…",
}, },
account={ account={
title="Account", title="Account",
@@ -874,10 +932,10 @@ return{
}, },
getTip={refuseCopy=true, getTip={refuseCopy=true,
":pog:", ":pog:",
"(RURU)RFR2URU(RURF)",
"“Techmino.app” cannot be opened because the developer cannot be verified.", "“Techmino.app” cannot be opened because the developer cannot be verified.",
"“Techmino.app” will damage your computer. You should move it to the Bin.", "“Techmino.app” will damage your computer. You should move it to the Bin.",
"“TechminOS”", "“TechminOS”",
"(RURU)RFR2URU(RURF)",
"\\jezevec/\\jezevec/\\jezevec/", "\\jezevec/\\jezevec/\\jezevec/",
"\\osk/\\osk/\\osk/", "\\osk/\\osk/\\osk/",
"↑↑↓↓←→←→BA", "↑↑↓↓←→←→BA",
@@ -890,6 +948,7 @@ return{
"40-line Sprint WR: 14.708s by hiryu", "40-line Sprint WR: 14.708s by hiryu",
"6next 1hold!", "6next 1hold!",
"6next 6hold?!", "6next 6hold?!",
"A choke a day keeps record away",
"Achievement system coming soon!", "Achievement system coming soon!",
"ALL SPIN!", "ALL SPIN!",
"Am G F G", "Am G F G",
@@ -934,8 +993,8 @@ return{
"Lua No.1", "Lua No.1",
"Mix clear coming soon!", "Mix clear coming soon!",
"Most of the button icons are realized by using self-drawn glyphs in the Unicode Private Use Area.", "Most of the button icons are realized by using self-drawn glyphs in the Unicode Private Use Area.",
"Music too distracting? You can turn it off.",
"Most of the music tracks in this game are made using Beepbox.", "Most of the music tracks in this game are made using Beepbox.",
"Music too distracting? You can turn it off.",
"No easter eggs in this menu if you have the simplistic style turned on!", "No easter eggs in this menu if you have the simplistic style turned on!",
"O-Spin Triple!", "O-Spin Triple!",
"OHHHHHHHHHHHHHH", "OHHHHHHHHHHHHHH",
@@ -1003,5 +1062,6 @@ return{
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR ",C.P,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"}, {C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR ",C.P,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"},
{C.Y,"O-Spin Triple!"}, {C.Y,"O-Spin Triple!"},
{C.Z,"What? ",C.lC,"Xspin?"}, {C.Z,"What? ",C.lC,"Xspin?"},
} },
pumpkin="I'm a pumpkin",
} }

View File

@@ -103,40 +103,92 @@ return{
dictNote="==Copia de TetroDictionary==", dictNote="==Copia de TetroDictionary==",
getNoticeFail="Error al buscar novedades.",
-- Server's warn/error messages
Techrater={
-- internalError="Internal error",
-- databaseError="Database error",
-- invalidFormat="Invalid format",
-- invalidArguments="Invalid arguments",
-- tooFrequent="Too frequent",
-- notAvailable="Not available",
-- noPermission="No permission",
-- roomNotFound="Room not found",
-- Controllers
WebSocket={
-- invalidConnection="Invalid connection",
-- invalidAction="Invalid action",
-- playerNotFound="Player not found",
-- connectionFailed="Connection failed",
},
-- Filters
CheckPermission={
-- playerNotFound="Player not found",
},
-- Plugins
ConnectionManager={
-- playerInvalid="Player invalid",
-- playerNotFound="Player not found",
-- connectionReplaced="Connection replaced",
},
NoticeManager={
-- noticeNotFound="Notice not found",
},
PlayerManager={
-- invalidCode="Invalid code",
-- invalidEmail="Invalid email",
-- playerNotFound="Player not found",
-- invalidEmailPass="Invalid email or password",
-- emailExists="Email exists",
-- emailSendError="Email send error",
},
-- Strategies
PlayerRole={
-- invalidRole="Invalid role",
-- invalidTarget="Invalid target",
},
PlayerType={
-- invalidType="Invalid type",
-- roomFull="Room full",
},
RoomJoin={
-- wrongPassword="Wrong password",
},
},
-- tooFrequent="Request too frequently",
-- roomPasswordChanged="Room password changed",
oldVersion="¡Está disponible la nueva versión $1!", oldVersion="¡Está disponible la nueva versión $1!",
needUpdate="¡Nueva versión requerida!",
versionNotMatch="¡Las versiones no coinciden!", versionNotMatch="¡Las versiones no coinciden!",
notFinished="Próximamente", notFinished="Próximamente",
jsonError="Error en Json",
noUsername="Por favor ingresa un nombre de usuario", noUsername="Por favor ingresa un nombre de usuario",
wrongEmail="Correo electrónico inválido", wrongEmail="Correo electrónico inválido",
-- wrongCode="Invalid verification code",
noPassword="Por favor ingresa la contraseña", noPassword="Por favor ingresa la contraseña",
diffPassword="Las contraseñas no coinciden", diffPassword="Las contraseñas no coinciden",
registerRequestSent="Petición de registro enviada con éxito", checkEmail="Petición de registro enviada con éxito",
registerOK="¡Registro exitoso!",
loginOK="¡Ingreso con éxito!",
accessOK="¡Autorizado exitoso!",
wsConnecting="Websocket Conectando", wsFailed="WebSocket conexión fallida: $1",
wsFailed="WebSocket conexión fallida", wsClose="WebSocket cerrado: $1",
wsClose="WebSocket cerrado:",
netTimeout="Tiempo de conexión agotado", netTimeout="Tiempo de conexión agotado",
-- serverDown="Oops! Server is down",
-- requestFailed="Request failed",
onlinePlayerCount="En línea", onlinePlayerCount="En línea: $1",
createRoomSuccessed="¡Sala creada con éxito!", createRoomSuccessed="¡Sala creada con éxito!",
-- playerKicked="$1 removed $2 from room",
-- becomeHost="$1 become host",
started="En juego", started="En juego",
joinRoom="entró a la sala.", joinRoom="$1 entró a la sala.",
leaveRoom="salió de la sala.", leaveRoom="$1 salió de la sala.",
-- roomRemoved="Room was removed",
ready="LISTO", ready="LISTO",
connStream="CONECTANDO",
waitStream="ESPERANDO",
spectating="Espectando", spectating="Espectando",
chatRemain="Usuarios en línea:",
chatStart="------Comienzo del historial------",
chatHistory="------Nuevos mensajes------",
keySettingInstruction="Pulsa la tecla a mapear\nEsc.: Cancelar\nBackspace: Borrar", keySettingInstruction="Pulsa la tecla a mapear\nEsc.: Cancelar\nBackspace: Borrar",
customBGhelp="Suelta una imagen aquí para aplicarla de fondo", customBGhelp="Suelta una imagen aquí para aplicarla de fondo",
@@ -322,6 +374,7 @@ return{
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
json.lua [rxi] json.lua [rxi]
profile.lua [itraykov] profile.lua [itraykov]
sha2 [Egor Skriptunoff]
]], ]],
support="Apoyen al Autor", support="Apoyen al Autor",
WidgetText={ WidgetText={
@@ -361,6 +414,7 @@ return{
league="Liga Tech", league="Liga Tech",
ffa="FFA", ffa="FFA",
rooms="Salas", rooms="Salas",
-- resetPW="Reset password",
logout="Desconec.", logout="Desconec.",
}, },
net_league={ net_league={
@@ -437,7 +491,6 @@ return{
sysCursor="Usar cursor del sistema", sysCursor="Usar cursor del sistema",
autoPause="Pausar cuando la ventana no está enfocada", autoPause="Pausar cuando la ventana no está enfocada",
autoSave="Autograbar Récords", autoSave="Autograbar Récords",
autoLogin="Autologueo al Iniciar",
simpMode="Modo Sencillo", simpMode="Modo Sencillo",
}, },
setting_video={ setting_video={
@@ -680,24 +733,29 @@ return{
music="BGMs", music="BGMs",
label="Etiq.", label="Etiq.",
}, },
login={ login_pw={
title="Entrar", title="Entrar",
register="Registrarse", -- login_mail="Login with E-mail/Sign Up",
email="Correo Elec.", email="Correo Elec.",
password="Contraseña", password="Contraseña",
showEmail="Mostrar Correo", showEmail="Mostrar Correo",
keepPW="Recordar credenciales",
login="Entrar", login="Entrar",
}, },
register={ login_mail={
title="Registrarse", title="Entrar/Registrarse",
login="Entrar", -- login_pw="Password Sign In",
username="Nombre de Usuario",
email="Correo Elec.", email="Correo Elec.",
-- send="Send code",
-- code="Verification Code",
-- verify="Verify",
},
reset_password={
-- title="Reset Password",
-- send="Send code",
-- code="Verification Code",
password="Contraseña", password="Contraseña",
password2="Repetir Contr.", password2="Repetir Contr.",
register="Registrarse", -- setPW="Set Password",
registering="Esperando respuesta...",
}, },
account={ account={
title="Cuenta", title="Cuenta",
@@ -863,4 +921,5 @@ return{
['custom_clear']= {"Personalizado", "Normal"}, ['custom_clear']= {"Personalizado", "Normal"},
['custom_puzzle']= {"Personalizado", "Puzzle"}, ['custom_puzzle']= {"Personalizado", "Puzzle"},
}, },
-- pumpkin="I'm a pumpkin",
} }

View File

@@ -94,40 +94,93 @@ return{
-- dictNote="==Copied from TetroDictionary==", -- dictNote="==Copied from TetroDictionary==",
getNoticeFail="Echec de l'obtention de la notice",
-- Server's warn/error messages
Techrater={
-- internalError="Internal error",
-- databaseError="Database error",
-- invalidFormat="Invalid format",
-- invalidArguments="Invalid arguments",
-- tooFrequent="Too frequent",
-- notAvailable="Not available",
-- noPermission="No permission",
-- roomNotFound="Room not found",
-- Controllers
WebSocket={
-- invalidConnection="Invalid connection",
-- invalidAction="Invalid action",
-- playerNotFound="Player not found",
-- connectionFailed="Connection failed",
},
-- Filters
CheckPermission={
-- playerNotFound="Player not found",
},
-- Plugins
ConnectionManager={
-- playerInvalid="Player invalid",
-- playerNotFound="Player not found",
-- connectionReplaced="Connection replaced",
},
NoticeManager={
-- noticeNotFound="Notice not found",
},
PlayerManager={
-- invalidCode="Invalid code",
-- invalidEmail="Invalid email",
-- playerNotFound="Player not found",
-- invalidEmailPass="Invalid email or password",
-- emailExists="Email exists",
-- emailSendError="Email send error",
},
-- Strategies
PlayerRole={
-- invalidRole="Invalid role",
-- invalidTarget="Invalid target",
},
PlayerType={
-- invalidType="Invalid type",
-- roomFull="Room full",
},
RoomJoin={
-- wrongPassword="Wrong password",
},
},
-- tooFrequent="Request too frequently",
-- roomPasswordChanged="Room password changed",
oldVersion="La version $1 est disponible !", oldVersion="La version $1 est disponible !",
-- versionNotMatch="Version do not match!", -- versionNotMatch="Version do not match!",
-- needUpdate="Newer version required!", -- needUpdate="Newer version required!",
-- notFinished="Coming soon!", -- notFinished="Coming soon!",
jsonError="Erreur json",
noUsername="Entrez votre nom d'utilisateur", noUsername="Entrez votre nom d'utilisateur",
wrongEmail="Mauvaise adresse email", wrongEmail="Mauvaise adresse email",
-- wrongCode="Invalid verification code",
noPassword="Entrez votre mot de passe", noPassword="Entrez votre mot de passe",
diffPassword="Les mots de passe ne se correspondent pas", diffPassword="Les mots de passe ne se correspondent pas",
-- registerRequestSent="Registration request sent", -- checkEmail="Registration request sent",
registerOK="Enregistré avec succès !",
loginOK="Connecté avec succès !",
accessOK="Autorisé avec succès !",
-- wsConnecting="Websocket Connecting", wsFailed="WebSocket connection échouée: $1",
wsFailed="WebSocket connection échouée", -- wsClose="WebSocket Closed: $1",
-- wsClose="WebSocket Closed:",
-- netTimeout="Network connection timeout", -- netTimeout="Network connection timeout",
-- serverDown="Oops! Server is down",
-- requestFailed="Request failed",
-- onlinePlayerCount="Online", -- onlinePlayerCount="Online: $1",
createRoomSuccessed="Salon créé avec succès !", createRoomSuccessed="Salon créé avec succès !",
-- playerKicked="$1 removed $2 from room",
-- becomeHost="$1 become host",
-- started="Playing", -- started="Playing",
joinRoom="a rejoint le salon.", joinRoom="$1 a rejoint le salon.",
leaveRoom="a quitté le salon.", leaveRoom="$1 a quitté le salon.",
-- roomRemoved="Room was removed",
-- ready="READY", -- ready="READY",
-- connStream="CONNECTING",
-- waitStream="WAITING",
-- spectating="Spectating", -- spectating="Spectating",
chatRemain="En ligne : ",
chatStart="--------Début des logs--------",
chatHistory="-Nouveaux messages en dessous-",
-- keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete", -- keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete",
-- customBGhelp="Drop image file here to apply custom background", -- customBGhelp="Drop image file here to apply custom background",
@@ -289,6 +342,7 @@ return{
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
json.lua [rxi] json.lua [rxi]
profile.lua [itraykov] profile.lua [itraykov]
sha2 [Egor Skriptunoff]
]], ]],
support="Aider le créateur", support="Aider le créateur",
WidgetText={ WidgetText={
@@ -324,6 +378,7 @@ return{
-- league="Tech League", -- league="Tech League",
ffa="FFA", ffa="FFA",
rooms="Salons", rooms="Salons",
-- resetPW="Reset password",
-- logout="Log out", -- logout="Log out",
}, },
net_league={ net_league={
@@ -400,7 +455,6 @@ return{
-- sysCursor="Use system cursor", -- sysCursor="Use system cursor",
autoPause="Mettre en pause en cas de perte de focus", autoPause="Mettre en pause en cas de perte de focus",
-- autoSave="Auto save new-best", -- autoSave="Auto save new-best",
-- autoLogin="Auto Login on Start",
-- simpMode="Simple mode", -- simpMode="Simple mode",
}, },
setting_video={ setting_video={
@@ -642,24 +696,29 @@ return{
music="Musique", music="Musique",
-- label="label", -- label="label",
}, },
login={ login_pw={
title="Connexion", title="Connexion",
register="Enregistrement", -- login_mail="Login with E-mail/Sign Up",
email="E-mail", email="E-mail",
password="Mot de passe", password="Mot de passe",
-- showEmail="Show Email", -- showEmail="Show Email",
-- keepPW="Remember me",
login="Connexion", login="Connexion",
}, },
register={ login_mail={
title="Enregistrement", title="Connexion/Enregistrement",
login="Connexion", -- login_pw="Password Sign In",
username="Nom d'utilisateur",
email="E-mail", email="E-mail",
-- send="Send code",
-- code="Verification Code",
-- verify="Verify",
},
reset_password={
-- title="Reset Password",
-- send="Send code",
-- code="Verification Code",
password="Mot de passe", password="Mot de passe",
password2="Confirmer le mot de passe", password2="Confirmer le mot de passe",
register="Enregistrement", -- setPW="Set Password",
-- registering="Waiting for response...",
}, },
account={ account={
title="Compte", title="Compte",
@@ -822,4 +881,5 @@ return{
['custom_clear']= {"Perso.", "NORMAL"}, ['custom_clear']= {"Perso.", "NORMAL"},
['custom_puzzle']= {"Perso.", "PUZZLE"}, ['custom_puzzle']= {"Perso.", "PUZZLE"},
}, },
-- pumpkin="I'm a pumpkin",
} }

View File

@@ -105,40 +105,92 @@ return{
dictNote="==Tersalin dari TetroDictionary==", dictNote="==Tersalin dari TetroDictionary==",
getNoticeFail="Gagal mengambil pengumuman-pengumuman",
-- Server's warn/error messages
Techrater={
-- internalError="Internal error",
-- databaseError="Database error",
-- invalidFormat="Invalid format",
-- invalidArguments="Invalid arguments",
-- tooFrequent="Too frequent",
-- notAvailable="Not available",
-- noPermission="No permission",
-- roomNotFound="Room not found",
-- Controllers
WebSocket={
-- invalidConnection="Invalid connection",
-- invalidAction="Invalid action",
-- playerNotFound="Player not found",
-- connectionFailed="Connection failed",
},
-- Filters
CheckPermission={
-- playerNotFound="Player not found",
},
-- Plugins
ConnectionManager={
-- playerInvalid="Player invalid",
-- playerNotFound="Player not found",
-- connectionReplaced="Connection replaced",
},
NoticeManager={
-- noticeNotFound="Notice not found",
},
PlayerManager={
-- invalidCode="Invalid code",
-- invalidEmail="Invalid email",
-- playerNotFound="Player not found",
-- invalidEmailPass="Invalid email or password",
-- emailExists="Email exists",
-- emailSendError="Email send error",
},
-- Strategies
PlayerRole={
-- invalidRole="Invalid role",
-- invalidTarget="Invalid target",
},
PlayerType={
-- invalidType="Invalid type",
-- roomFull="Room full",
},
RoomJoin={
-- wrongPassword="Wrong password",
},
},
-- tooFrequent="Request too frequently",
-- roomPasswordChanged="Room password changed",
oldVersion="Versi $1 sekarang tersedia", oldVersion="Versi $1 sekarang tersedia",
needUpdate="Butuh versi lebih baru!",
versionNotMatch="Versi tidak sama!", versionNotMatch="Versi tidak sama!",
notFinished="Segera akan datang!", notFinished="Segera akan datang!",
jsonError="Eror JSON",
noUsername="Silahkan memasukan username Anda", noUsername="Silahkan memasukan username Anda",
wrongEmail="Alamat email tidak sah", wrongEmail="Alamat email tidak sah",
-- wrongCode="Invalid verification code",
noPassword="Silahkan memasukan kata sandi Anda", noPassword="Silahkan memasukan kata sandi Anda",
diffPassword="Kata sandi tidak sama", diffPassword="Kata sandi tidak sama",
registerRequestSent="Permintaan daftar telah terkirim.", checkEmail="Permintaan daftar telah terkirim.",
registerOK="Pendaftaran sukses!",
loginOK="Anda telah gabung!",
accessOK="Akses diberikan",
wsConnecting="Menghubungkan websocket…", wsFailed="Koneksi websocket gagal: $1",
wsFailed="Koneksi websocket gagal", wsClose="Websocket tertutup: $1",
wsClose="Websocket tertutup:",
netTimeout="Koneksi waktu habis", netTimeout="Koneksi waktu habis",
-- serverDown="Oops! Server is down",
-- requestFailed="Request failed",
onlinePlayerCount="Online", onlinePlayerCount="Online: $1",
createRoomSuccessed="Ruang terbuat", createRoomSuccessed="Ruang terbuat",
-- playerKicked="$1 removed $2 from room",
-- becomeHost="$1 become host",
started="Bermain", started="Bermain",
joinRoom="telah memasuki ruangan.", joinRoom="$1 telah memasuki ruangan.",
leaveRoom="telah keluar dari ruangan.", leaveRoom="$1 telah keluar dari ruangan.",
-- roomRemoved="Room was removed",
ready="Siap", ready="Siap",
connStream="Memuat",
waitStream="Menunggu",
spectating="Menonton", spectating="Menonton",
chatRemain="Online",
chatStart="------Awal percakapan------",
chatHistory="------Pesan-pesan baru di bawah ini------",
keySettingInstruction="Tekan untuk menghubung tombol ke aksi tertentu\nescape: batal\nbackspace: hapus", keySettingInstruction="Tekan untuk menghubung tombol ke aksi tertentu\nescape: batal\nbackspace: hapus",
customBGhelp="Seret file gambar di sini untuk memasangkan background", customBGhelp="Seret file gambar di sini untuk memasangkan background",
@@ -323,6 +375,7 @@ return{
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
json.lua [rxi] json.lua [rxi]
profile.lua [itraykov] profile.lua [itraykov]
sha2 [Egor Skriptunoff]
]], ]],
support="Dukung pencipta", support="Dukung pencipta",
WidgetText={ WidgetText={
@@ -362,6 +415,7 @@ return{
league="Tech League", league="Tech League",
ffa="FFA", ffa="FFA",
rooms="Ruang-ruang", rooms="Ruang-ruang",
-- resetPW="Reset password",
logout="Log out", logout="Log out",
}, },
net_league={ net_league={
@@ -438,7 +492,6 @@ return{
sysCursor="Guna Mouse Bawaan", sysCursor="Guna Mouse Bawaan",
autoPause="Jeda Jika Tidak Difokus", autoPause="Jeda Jika Tidak Difokus",
autoSave="Simpan Rekor Otomatis", autoSave="Simpan Rekor Otomatis",
autoLogin="Auto-login Saat Membuka",
simpMode="Mode Sederhana", simpMode="Mode Sederhana",
}, },
setting_video={ setting_video={
@@ -689,24 +742,29 @@ return{
music="Musik", music="Musik",
label="label", label="label",
}, },
login={ login_pw={
title="Masuk", title="Masuk",
register="Daftar", -- login_mail="Login with E-mail/Sign Up",
email="Alamat Email", email="Alamat Email",
password="Password", password="Password",
showEmail="Tunjukkan Email", showEmail="Tunjukkan Email",
keepPW="Ingat Saya",
login="Masuk", login="Masuk",
}, },
register={ login_mail={
title="Daftar", title="Masuk/Daftar",
login="Masuk", -- login_pw="Password Sign In",
username="Username",
email="Alamat Email", email="Alamat Email",
-- send="Send code",
-- code="Verification Code",
-- verify="Verify",
},
reset_password={
-- title="Reset Password",
-- send="Send code",
-- code="Verification Code",
password="Password", password="Password",
password2="Ulangi Password", password2="Ulangi Password",
register="Daftar", -- setPW="Set Password",
registering="Menunggu respon…",
}, },
account={ account={
title="Akun", title="Akun",
@@ -993,5 +1051,6 @@ return{
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR ",C.P,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"}, {C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR ",C.P,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"},
{C.Y,"O-Spin Triple!"}, {C.Y,"O-Spin Triple!"},
{C.Z,"Apa? ",C.lC,"X-spin?"}, {C.Z,"Apa? ",C.lC,"X-spin?"},
} },
-- pumpkin="I'm a pumpkin",
} }

View File

@@ -105,46 +105,97 @@ return{
dictNote="==TetroDictionaryからコピーしました==", dictNote="==TetroDictionaryからコピーしました==",
getNoticeFail="お知らせ情報を取得できませんでした",
-- Server's warn/error messages
Techrater={
internalError="内部エラー",
databaseError="データベースエラー",
invalidFormat="非対応の形式です",
invalidArguments="無効な引数です",
tooFrequent="リクエストが多すぎます",
notAvailable="使用不可",
noPermission="権限がありません",
roomNotFound="部屋が見つかりません",
-- Controllers
WebSocket={
invalidConnection="接続されていません",
invalidAction="無効な操作です",
playerNotFound="プレイヤーが見つかりませんでした",
connectionFailed="接続失敗",
},
-- Filters
CheckPermission={
playerNotFound="プレイヤーが見つかりませんでした",
},
-- Plugins
ConnectionManager={
playerInvalid="無効なプレイヤー",
playerNotFound="プレイヤーが見つかりませんでした",
connectionReplaced="接続切替",
},
NoticeManager={
noticeNotFound="通知が見つかりませんでした",
},
PlayerManager={
invalidCode="無効なコード",
invalidEmail="無効なEメールアドレス",
playerNotFound="プレイヤーが見つかりませんでした",
invalidEmailPass="Eメールアドレスもしくはパスワードが違います",
emailExists="Eメールアドレスは存在します",
emailSendError="送信できませんでした",
},
-- Strategies
PlayerRole={
invalidRole="無効なロールです",
invalidTarget="無効なターゲットです",
},
PlayerType={
invalidType="無効なタイプです",
roomFull="部屋がいっぱいです",
},
RoomJoin={
wrongPassword="パスワードが違います",
},
},
tooFrequent="リクエストが多すぎます",
roomPasswordChanged="部屋のパスワードを変更しました",
oldVersion="バージョン$1のダウンロードが可能になりました", oldVersion="バージョン$1のダウンロードが可能になりました",
needUpdate="最新バージョンに更新してください",
versionNotMatch="バージョンが一致しません", versionNotMatch="バージョンが一致しません",
notFinished="未完成ですので、ご期待ください", notFinished="未完成ですので、ご期待ください",
jsonError="JSONエラー",
noUsername="ユーザーネームを入力してください!", noUsername="ユーザーネームを入力してください!",
wrongEmail="メールアドレスが無効です!", wrongEmail="メールアドレスが無効です!",
wrongCode="認証コードが違います",
noPassword="パスワードを入力してください!", noPassword="パスワードを入力してください!",
diffPassword="パスワードが一致しません!", diffPassword="パスワードが一致しません!",
registerRequestSent="Sign Upリクエストを送信しました!", checkEmail="Sign Upリクエストを送信しました!",
registerOK="サインアップ成功!",
loginOK="ログインしています!",
accessOK="アクセス権限を取得しました!",
wsConnecting="ウェブソケットに接続中…", wsFailed="ウェブソケットとの通信に失敗しました: $1",
wsFailed="ウェブソケットとの通信に失敗しました", wsClose="ウェブソケットとの通信を終了: $1",
wsClose="ウェブソケットとの通信を終了:",
netTimeout="接続がタイムアウトしました", netTimeout="接続がタイムアウトしました",
serverDown="うわ! サーバーが落ちています...",
requestFailed="リクエスト失敗",
onlinePlayerCount="オンライン人数", onlinePlayerCount="オンライン人数: $1",
createRoomSuccessed="部屋を建てました", createRoomSuccessed="部屋を建てました",
playerKicked="$1 は、$2 を部屋から追放しました",
started="プレイ中", started="プレイ中",
joinRoom="が入室しました", joinRoom="$1 が入室しました",
leaveRoom="が退出しました", leaveRoom="$1 が退出しました",
roomRemoved="部屋が撤去されました",
ready="準備OK", ready="準備OK",
connStream="接続中……",
waitStream="待機中……",
spectating="観戦中", spectating="観戦中",
chatRemain="オンライン",
chatStart="------チャットの先頭------",
chatHistory="------新しいメッセージ------",
keySettingInstruction="選択してキーを入力\nEscape: キャンセル\nBackspace: キーを削除", keySettingInstruction="選択してキーを入力\nEscape: キャンセル\nBackspace: キーを削除",
customBGhelp="カスタム背景にする画像ファイルをドロップ", customBGhelp="カスタム背景にする画像ファイルをドロップ",
customBGloadFailed="サポートされていないフォーマットのファイルです", customBGloadFailed="サポートされていないフォーマットのファイルです",
errorMsg="問題が発生! ゲームを再起動してください、できるならエラーログを開発者に送ってください", errorMsg="問題が発生! ゲームを再起動しエラーログを開発者に送ってください",
tryAnotherBuild="[Invalid UTF-8]使用しているOSがMicrosoft WindowsであればTechmino-win32かTechmino-win64をダウンロードしてください! (現在使用しているソフトは違うバージョンです)", tryAnotherBuild="[Invalid UTF-8]使用しているOSがMicrosoft WindowsであればTechmino-win32かTechmino-win64をダウンロードしてください! (現在使用しているソフトは違うバージョンです)",
modInstruction="Modを選択してください!\nModはゲームの中身を変えます\nしかしゲームが破損することもあります\nModを使用した場合スコアは保存されません", modInstruction="Modを選択してください!\nModはゲームの中身を変えます\nしかしゲームが破損することもあります\nModを使用した場合スコアは保存されません",
@@ -207,13 +258,13 @@ return{
"ご意見、ご感想、バグ報告など、全て大歓迎です!", "ご意見、ご感想、バグ報告など、全て大歓迎です!",
"ゲームは、必ず公式から入手してください", "ゲームは、必ず公式から入手してください",
"他から入手した場合は、安全性を保証しません", "他から入手した場合は、安全性を保証しません",
"同時に作者は、責任を負いません", "同時に作者は、責任を負いません",
FNNS and "/" or "ゲーム自体は無料ですが、寄付できるならありがたいです。", FNNS and "/" or "ゲーム自体は無料ですが、寄付できるならありがたいです。",
FNNS and "/" or "詳しくはZictionaryをご覧ください", FNNS and "/" or "詳しくはZictionaryをご覧ください",
}, },
staff={ staff={
"作者MrZ", "作者: “MrZ",
"Eメール先は: 1046101471@qq.com」まで", "Eメール: 1046101471@qq.com",
"", "",
"プログラム、開発、デザイン", "プログラム、開発、デザイン",
"MrZ", "MrZ",
@@ -324,8 +375,9 @@ return{
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
json.lua [rxi] json.lua [rxi]
profile.lua [itraykov] profile.lua [itraykov]
sha2 [Egor Skriptunoff]
]], ]],
support="Support the Author", support="制作者を支援する",
WidgetText={ WidgetText={
main={ main={
offline="ソロプレイ", offline="ソロプレイ",
@@ -361,8 +413,9 @@ return{
}, },
net_menu={ net_menu={
league="テクリーグ", league="テクリーグ",
ffa="自由乱闘戦", ffa="",
rooms="ルーム・プライベート戦", rooms="ルーム",
resetPW="パスワード再設定",
logout="ログアウト", logout="ログアウト",
}, },
net_league={ net_league={
@@ -439,7 +492,6 @@ return{
sysCursor="システムカーソル", sysCursor="システムカーソル",
autoPause="ゲーム中断時のオートポーズ", autoPause="ゲーム中断時のオートポーズ",
autoSave="最高得点を更新したときオートセーブ", autoSave="最高得点を更新したときオートセーブ",
autoLogin="オートログイン",
simpMode="シンプルなホーム画面", simpMode="シンプルなホーム画面",
}, },
setting_video={ setting_video={
@@ -690,24 +742,29 @@ return{
music="", music="",
label="ラベル", label="ラベル",
}, },
login={ login_pw={
title="サインイン", title="ログイン",
register="サインアップ", login_mail="アカウントを登録/パスワードを忘れた",
email="Eメールアドレス", email="Eメールアドレス",
password="パスワード", password="パスワード",
-- showEmail="Show Email", showEmail="Eメールアドレスを表示",
keepPW="常にログイン",
login="ログイン", login="ログイン",
}, },
register={ login_mail={
title="サインアップ", title="サインイン/サインアップ",
login="サインイン", login_pw="パスワードでログイン",
username="ユーザーネーム",
email="Eメールアドレス", email="Eメールアドレス",
send="認証コード送信",
code="認証コード",
verify="認証",
},
reset_password={
title="パスワード再設定",
send="認証コード送信",
code="認証コード",
password="パスワード", password="パスワード",
password2="パスワード(確認)", password2="パスワード(確認)",
register="これで登録する", setPW="パスワード設定",
registering="応答待機中...",
}, },
account={ account={
title="アカウント", title="アカウント",
@@ -822,9 +879,9 @@ return{
['blind_e']= {"目隠し", "HALF", "初心者用"}, ['blind_e']= {"目隠し", "HALF", "初心者用"},
['blind_n']= {"目隠し", "ALL", "中級者用"}, ['blind_n']= {"目隠し", "ALL", "中級者用"},
['blind_h']= {"目隠し", "SUDDEN", "上級者用"}, ['blind_h']= {"目隠し", "SUDDEN", "上級者用"},
['blind_l']= {"目隠し", "SUDDEN+", "プロフェッショナル用!"}, ['blind_l']= {"目隠し", "SUDDEN+", "プロフェッショナル用"},
['blind_u']= {"目隠し", "?", "覚悟は良いかい?"}, ['blind_u']= {"目隠し", "?", "覚悟は良いかい?"},
['blind_wtf']= {"目隠し", "WTF", "まだ覚悟が足りない!"}, ['blind_wtf']= {"目隠し", "WTF", "まだ覚悟が足りない"},
['classic_e']= {"クラシック", "EASY", "低速クラシック"}, ['classic_e']= {"クラシック", "EASY", "低速クラシック"},
['classic_h']= {"クラシック", "HARD", "通常速度クラシック"}, ['classic_h']= {"クラシック", "HARD", "通常速度クラシック"},
['classic_l']= {"クラシック", "LUNATIC", "中高速度クラシック"}, ['classic_l']= {"クラシック", "LUNATIC", "中高速度クラシック"},
@@ -958,7 +1015,7 @@ getTip={refuseCopy=true,
"ゲーム内にはモード選択マップからじゃ入れない隠しモードがいくつかあります!", "ゲーム内にはモード選択マップからじゃ入れない隠しモードがいくつかあります!",
"このゲームでは全てのSpinに火力補正があります!", "このゲームでは全てのSpinに火力補正があります!",
"このゲームのほとんどの楽曲はBeepboxを用いて作曲されました!", "このゲームのほとんどの楽曲はBeepboxを用いて作曲されました!",
"サーバーが不規則にダウンします", "サーバーが不規則に落ちます",
"スタッフロールの背景に流れている名前はスポンサーの名前です!", "スタッフロールの背景に流れている名前はスポンサーの名前です!",
"タブレットやスマホでもキーボードを接続できます!(iOSにはそんな機能ないと思うけど)", "タブレットやスマホでもキーボードを接続できます!(iOSにはそんな機能ないと思うけど)",
"なにかアイデアがありますか? Discordで提案してください!", "なにかアイデアがありますか? Discordで提案してください!",
@@ -1002,5 +1059,6 @@ getTip={refuseCopy=true,
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR ",C.P,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"}, {C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR ",C.P,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"},
{C.Y,"O-Spin Triple!"}, {C.Y,"O-Spin Triple!"},
{C.Z,"なんだって? ",C.lC,"X-Spin?"}, {C.Z,"なんだって? ",C.lC,"X-Spin?"},
} },
pumpkin="どうも、かぼちゃです",
} }

View File

@@ -92,40 +92,92 @@ return{
-- dictNote="==Copied from TetroDictionary==", -- dictNote="==Copied from TetroDictionary==",
getNoticeFail="Não conseguiu ter anúncios",
-- Server's warn/error messages
Techrater={
-- internalError="Internal error",
-- databaseError="Database error",
-- invalidFormat="Invalid format",
-- invalidArguments="Invalid arguments",
-- tooFrequent="Too frequent",
-- notAvailable="Not available",
-- noPermission="No permission",
-- roomNotFound="Room not found",
-- Controllers
WebSocket={
-- invalidConnection="Invalid connection",
-- invalidAction="Invalid action",
-- playerNotFound="Player not found",
-- connectionFailed="Connection failed",
},
-- Filters
CheckPermission={
-- playerNotFound="Player not found",
},
-- Plugins
ConnectionManager={
-- playerInvalid="Player invalid",
-- playerNotFound="Player not found",
-- connectionReplaced="Connection replaced",
},
NoticeManager={
-- noticeNotFound="Notice not found",
},
PlayerManager={
-- invalidCode="Invalid code",
-- invalidEmail="Invalid email",
-- playerNotFound="Player not found",
-- invalidEmailPass="Invalid email or password",
-- emailExists="Email exists",
-- emailSendError="Email send error",
},
-- Strategies
PlayerRole={
-- invalidRole="Invalid role",
-- invalidTarget="Invalid target",
},
PlayerType={
-- invalidType="Invalid type",
-- roomFull="Room full",
},
RoomJoin={
-- wrongPassword="Wrong password",
},
},
-- tooFrequent="Request too frequently",
-- roomPasswordChanged="Room password changed",
oldVersion="Versão $1 esta disponível agora!", oldVersion="Versão $1 esta disponível agora!",
-- versionNotMatch="Version do not match!", -- versionNotMatch="Version do not match!",
-- needUpdate="Newer version required!", -- needUpdate="Newer version required!",
-- notFinished="Coming soon!", -- notFinished="Coming soon!",
jsonError="Json error",
noUsername="Insira seu nome de usuário", noUsername="Insira seu nome de usuário",
wrongEmail="Endereço de email errado", wrongEmail="Endereço de email errado",
-- wrongCode="Invalid verification code",
noPassword="Insira sua senha ", noPassword="Insira sua senha ",
diffPassword="Senhas não combinam", diffPassword="Senhas não combinam",
-- registerRequestSent="Registration request sent", -- checkEmail="Registration request sent",
registerOK="Registrado com sucesso!",
loginOK="Logado com sucesso!",
accessOK="Autorizado com sucesso!",
-- wsConnecting="Websocket Connecting", wsFailed="WebSocket falha na conexão: $1",
wsFailed="WebSocket falha na conexão", wsClose="WebSocket closed: $1",
wsClose="WebSocket closed:",
-- netTimeout="Network connection timeout", -- netTimeout="Network connection timeout",
-- serverDown="Oops! Server is down",
-- requestFailed="Request failed",
-- onlinePlayerCount="Online", -- onlinePlayerCount="Online: $1",
-- createRoomSuccessed="Room successfully created!", -- createRoomSuccessed="Room successfully created!",
-- playerKicked="$1 removed $2 from room",
-- becomeHost="$1 become host",
-- started="Playing", -- started="Playing",
joinRoom="Entrou a sala.", joinRoom="$1 Entrou a sala.",
leaveRoom="Saiu da sala.", leaveRoom="$1 Saiu da sala.",
-- roomRemoved="Room was removed",
-- ready="READY", -- ready="READY",
-- connStream="CONNECTING",
-- waitStream="WAITING",
-- spectating="Spectating", -- spectating="Spectating",
chatRemain="Online",
chatStart="------Começo do log------",
chatHistory="------Novas mensagens abaixo------",
-- keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete", -- keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete",
-- customBGhelp="Drop image file here to apply custom background", -- customBGhelp="Drop image file here to apply custom background",
@@ -311,6 +363,7 @@ return{
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
json.lua [rxi] json.lua [rxi]
profile.lua [itraykov] profile.lua [itraykov]
sha2 [Egor Skriptunoff]
]], ]],
support="Support author", support="Support author",
WidgetText={ WidgetText={
@@ -350,6 +403,7 @@ return{
-- league="Tech League", -- league="Tech League",
ffa="FFA", ffa="FFA",
rooms="Salas", rooms="Salas",
-- resetPW="Reset password",
-- logout="Log out", -- logout="Log out",
}, },
net_league={ net_league={
@@ -426,7 +480,6 @@ return{
-- sysCursor="Use system cursor", -- sysCursor="Use system cursor",
autoPause="Pausar quando foco for perco", autoPause="Pausar quando foco for perco",
-- autoSave="Auto save new-best", -- autoSave="Auto save new-best",
-- autoLogin="Auto Login on Start",
-- simpMode="Simple mode", -- simpMode="Simple mode",
}, },
setting_video={ setting_video={
@@ -678,24 +731,29 @@ return{
-- music="BGMs", -- music="BGMs",
-- label="label", -- label="label",
}, },
login={ login_pw={
title="Log in", title="Log in",
register="Registrar", -- login_mail="Login with E-mail/Sign Up",
email="Endereço De Email", email="Endereço De Email",
password="Senha", password="Senha",
-- showEmail="Show Email", -- showEmail="Show Email",
-- keepPW="Remember me",
login="Log in", login="Log in",
}, },
register={ login_mail={
title="Registrar", title="Log in/Registrar",
login="Log in", -- login_pw="Password Sign In",
username="Nome De Usuário",
email="Endereço De Email", email="Endereço De Email",
-- send="Send code",
-- code="Verification Code",
-- verify="Verify",
},
reset_password={
-- title="Reset Password",
-- send="Send code",
-- code="Verification Code",
password="Senha", password="Senha",
password2="Entre Senha Novamente", password2="Entre Senha Novamente",
register="Registrar", -- setPW="Set Password",
-- registering="Waiting for response...",
}, },
account={ account={
title="Conta", title="Conta",
@@ -968,5 +1026,6 @@ return{
{C.Y,"暫定段位:MO"}, {C.Y,"暫定段位:MO"},
{C.Y,"暫定段位:MV"}, {C.Y,"暫定段位:MV"},
{C.Y,"O-spin Triple!"}, {C.Y,"O-spin Triple!"},
} },
-- pumpkin="I'm a pumpkin",
} }

View File

@@ -166,6 +166,7 @@ return{
league="TL", league="TL",
ffa="FFA", ffa="FFA",
rooms="< >", rooms="< >",
resetPW="R ***",
logout="@_@x", logout="@_@x",
}, },
net_league={ net_league={
@@ -242,7 +243,6 @@ return{
sysCursor="?→*", sysCursor="?→*",
autoPause="A||", autoPause="A||",
autoSave="!!!>%", autoSave="!!!>%",
autoLogin="#Log in#",
simpMode=".", simpMode=".",
}, },
setting_video={ setting_video={
@@ -484,24 +484,29 @@ return{
music="~~~", music="~~~",
label="...", label="...",
}, },
login={ login_pw={
title="Log in", title="Log in",
register="Sign up", -- login_mail="Login with E-mail/Sign Up",
email="@", email="@",
password="*", password="*",
showEmail="?", showEmail="?",
keepPW="!", login="",
login="Log in",
}, },
register={ login_mail={
title="Sign up", title="Log in/Sign up",
login="Log in", login_pw="*** →",
username="#",
email="@", email="@",
send="",
code="",
verify="!",
},
reset_password={
title="R ***",
send="",
code="",
password="*", password="*",
password2="*", password2="*",
register="Sign up", setPW="##",
registering="......",
}, },
account={ account={
title="@_@", title="@_@",

View File

@@ -104,47 +104,99 @@ return{
dictNote="==复制于小z词典==", dictNote="==复制于小z词典==",
getNoticeFail="拉取公告失败",
-- Server's warn/error messages
Techrater={
internalError="内部错误",
databaseError="数据库错误",
invalidFormat="json格式无效",
invalidArguments="参数无效",
tooFrequent="请求太频繁",
notAvailable="无效请求",
noPermission="没有权限",
roomNotFound="找不到房间",
-- Controllers
WebSocket={
invalidConnection="无效连接",
invalidAction="无效操作",
playerNotFound="找不到玩家",
connectionFailed="连接失败",
},
-- Filters
CheckPermission={
playerNotFound="找不到玩家",
},
-- Plugins
ConnectionManager={
playerInvalid="无效玩家",
playerNotFound="找不到玩家",
connectionReplaced="连接已更换",
},
NoticeManager={
noticeNotFound="找不到公告",
},
PlayerManager={
invalidCode="无效验证码",
invalidEmail="无效邮箱",
playerNotFound="找不到玩家",
invalidEmailPass="邮箱或密码无效",
emailExists="邮箱存在",
emailSendError="邮箱发送错误",
},
-- Strategies
PlayerRole={
invalidRole="无效角色",
invalidTarget="无效目标",
},
PlayerType={
invalidType="无效类型",
roomFull="房间已满",
},
RoomJoin={
wrongPassword="密码错误",
},
},
tooFrequent="操作太频繁",
roomPasswordChanged="房间密码已更改",
oldVersion="最新版本$1可以下载了", oldVersion="最新版本$1可以下载了",
needUpdate="请更新游戏!",
versionNotMatch="版本不一致!", versionNotMatch="版本不一致!",
notFinished="暂未完成,敬请期待!", notFinished="暂未完成,敬请期待!",
jsonError="json错误",
noUsername="请填写用户名", noUsername="请填写用户名",
wrongEmail="邮箱格式错误", wrongEmail="无效邮箱地址",
wrongCode="无效验证码",
noPassword="请填写密码", noPassword="请填写密码",
diffPassword="两次密码不一致", diffPassword="两次密码不一致",
registerRequestSent="注册请求已发送", checkEmail="请查看邮箱验证码",
registerOK="注册成功!",
loginOK="登录成功",
accessOK="身份验证成功",
wsConnecting="正在连接", wsFailed="连接失败: $1",
wsFailed="连接失败", wsClose="连接断开: $1",
wsClose="连接被断开:",
netTimeout="连接超时", netTimeout="连接超时",
serverDown="唉哟!服务器不在线",
requestFailed="请求失败",
onlinePlayerCount="在线人数", onlinePlayerCount="在线人数: $1",
createRoomSuccessed="创建房间成功!", createRoomSuccessed="创建房间成功!",
playerKicked="$1 把 $2 移出了房间",
becomeHost="$1 成为了房主",
started="游戏中", started="游戏中",
joinRoom="进入房间", joinRoom="$1 进入房间",
leaveRoom="离开房间", leaveRoom="$1 离开房间",
roomRemoved="房间被解散",
ready="各就各位!", ready="各就各位!",
connStream="正在连接",
waitStream="等待其他人连接",
spectating="观战中", spectating="观战中",
chatRemain="人数:",
chatStart="------消息的开头------",
chatHistory="------以上是历史消息------",
keySettingInstruction="点击添加键位绑定\nesc取消选中\n退格键清空选中", keySettingInstruction="点击添加键位绑定\nesc取消选中\n退格键清空选中",
customBGhelp="把图片文件拖到这个窗口里使用自定义背景", customBGhelp="把图片文件拖到这个窗口里使用自定义背景",
customBGloadFailed="自定义背景的图片文件格式不支持", customBGloadFailed="自定义背景的图片文件格式不支持",
errorMsg="Techmino遭受了雷击需要重新启动。\n我们已收集了一些错误信息,你可以向作者进行反馈。", errorMsg="Techmino遭受了雷击需要重新启动。\n我们已收集了一些错误信息,你可以向作者进行反馈。",
tryAnotherBuild="[解码UTF-8错误] 如果你现在用的是Windows系统请重新下载 Techmino-32位 或者 Techmino-64位 (和现在运行的不一样的那个)。", tryAnotherBuild="[解码UTF-8错误] 如果你现在用的是Windows系统请重新下载 Techmino-32/64位 (和现在运行的不一样的那个)。",
modInstruction="选择你要使用的Mod\n不同Mod会用不同的方式改变初始游戏规则(可能导致不能正常游玩)\n来开发新玩法或者挑战自我吧!\n提醒:开启一些Mod会让成绩无效你也可以用键盘开关Mod按住shift反向", modInstruction="选择你要使用的Mod\n不同Mod会用不同的方式改变初始游戏规则(可能导致不能正常游玩)\n来开发新玩法或者挑战自我吧!\n提醒:开启一些Mod会让成绩无效你也可以用键盘开关Mod按住shift反向",
modInfo={ modInfo={
@@ -323,6 +375,7 @@ return{
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
json.lua [rxi] json.lua [rxi]
profile.lua [itraykov] profile.lua [itraykov]
sha2 [Egor Skriptunoff]
]], ]],
support="支持作者", support="支持作者",
WidgetText={ WidgetText={
@@ -362,6 +415,7 @@ return{
league="Tech League", league="Tech League",
ffa="FFA", ffa="FFA",
rooms="房间列表", rooms="房间列表",
resetPW="重置密码",
logout="退出登录", logout="退出登录",
}, },
net_league={ net_league={
@@ -438,7 +492,6 @@ return{
sysCursor="使用系统光标", sysCursor="使用系统光标",
autoPause="失去焦点自动暂停", autoPause="失去焦点自动暂停",
autoSave="破纪录自动保存", autoSave="破纪录自动保存",
autoLogin="启动时自动登录",
simpMode="简洁模式", simpMode="简洁模式",
}, },
setting_video={ setting_video={
@@ -688,24 +741,29 @@ return{
path="打开存储目录", path="打开存储目录",
save="用户档案管理", save="用户档案管理",
}, },
login={ login_pw={
title="登录", title="登录",
register="注册", login_mail="邮箱登录/注册",
email="邮箱", email="邮箱",
password="密码", password="密码",
showEmail="显示邮箱", showEmail="显示邮箱",
keepPW="保存密码",
login="登录", login="登录",
}, },
register={ login_mail={
title="注册", title="登录/注册",
login="登录", login_pw="密码登录",
username="用户名", email="邮箱",
email="邮箱:", send="发送验证码",
password="密码:", code="验证码",
password2="确认密码:", verify="验证邮箱",
register="注册", },
registering="等待服务器响应……", reset_password={
title="重置密码",
send="发送验证码",
code="验证码",
password="密码",
password2="确认密码",
setPW="设置密码",
}, },
account={ account={
title="帐户", title="帐户",
@@ -1209,6 +1267,7 @@ return{
"群友名言[002]“我要陪伴着tech一步步成长然后就可以疯狂的享受他”", "群友名言[002]“我要陪伴着tech一步步成长然后就可以疯狂的享受他”",
"群友名言[003]“太super啦不愧是guideline”", "群友名言[003]“太super啦不愧是guideline”",
"群友名言[004]“憋惦记你那*26了", "群友名言[004]“憋惦记你那*26了",
"群友名言[005]“如果bug有颜色那一定是___”",
-- Frt评 -- Frt评
"Frt评[01]“成天被夸赞‘好玩’的”", "Frt评[01]“成天被夸赞‘好玩’的”",
@@ -1299,5 +1358,6 @@ return{
{C.R,"上班时间不许摸鱼打块!"}, {C.R,"上班时间不许摸鱼打块!"},
{C.R,"上课时间不许摸鱼打块!"}, {C.R,"上课时间不许摸鱼打块!"},
{C.W,"uid:225238922"}, {C.W,"uid:225238922"},
} },
pumpkin="我是南瓜",
} }

View File

@@ -104,47 +104,48 @@ return{
dictNote="#!CopySource=Zictionary", dictNote="#!CopySource=Zictionary",
getNoticeFail="Error.FetchAnnouncement();",
-- Server's warn/error messages
Techrater={},
tooFrequent="Error.requesttooFrequent();",
roomPasswordChanged="Info.roomPwChanged();",
oldVersion="Version.New($1);", oldVersion="Version.New($1);",
needUpdate="Version.NeedUpdate()",
versionNotMatch="Version.NotMatch();", versionNotMatch="Version.NotMatch();",
notFinished="ComingSoon();", notFinished="ComingSoon();",
jsonError="Error.JSON();",
noUsername="Error.NoUsername();", noUsername="Error.NoUsername();",
wrongEmail="Error.WrongEmail();", wrongEmail="Error.WrongEmail();",
noPassword="Error.NoPassword();", wrongCode="Error.WrongVerificationCode();",
diffPassword="Error.DiffPassword();", diffPassword="Error.DiffPassword();",
registerRequestSent="register.RequestSent=true", checkEmail="register.RequestSent=true",
registerOK="register.Success=true",
loginOK="login.Success=true",
accessOK="Access.Granted=true",
wsConnecting="Websocket.Connect();", wsFailed="Error.Websocket.Failed=$1",
wsFailed="Error.Websocket.Failed();", wsClose="Error.Websocket.Close=$1",
wsClose="Error.Websocket.Close=",
netTimeout="Error.ConnectTimeOut();", netTimeout="Error.ConnectTimeOut();",
serverDown="Error.ServerDown();",
requestFailed="Error.RequestFailed();",
onlinePlayerCount="OnlinePlayerCount", onlinePlayerCount="OnlinePlayerCount=$1",
createRoomSuccessed="CreateRoom.Successs=true", createRoomSuccessed="CreateRoom.Successs=true",
playerKicked="[$1]: roomKick([$2])",
-- becomeHost="$1 become host",
started="Room.Playing();", started="Room.Playing();",
joinRoom="Room.Join();", joinRoom="Room.Join($1);",
leaveRoom="Room.Leave();", leaveRoom="Room.Leave($1);",
roomRemoved="Room.Removed();",
ready="Ready();", ready="Ready();",
connStream="Stream.Connecting();",
waitStream="Stream.Waiting();",
spectating="Room.Spectating();", spectating="Room.Spectating();",
chatRemain="Online=",
chatStart="#!Log.Beginning();",
chatHistory="#!NewMassagesBelow();",
keySettingInstruction="Key.Bind(Press);\nKey.Bind.Cancel(Escspe);\nKey.Bind.Delete(Backspace);", keySettingInstruction="Key.Bind(Press);\nKey.Bind.Cancel(Escspe);\nKey.Bind.Delete(Backspace);",
customBGhelp="Ctm.BG(DropHere);", customBGhelp="Ctm.BG(DropHere);",
customBGloadFailed="Error.Ctm.BG(UnsupportFormat);", customBGloadFailed="Error.Ctm.BG(UnsupportFormat);",
errorMsg="Error.Fatal();\n//请检查语法错误或向作者进行反馈。", errorMsg="Error.Fatal();\n//请检查语法错误或向作者进行反馈。",
tryAnotherBuild="Error.DecodeUTF8(); //如果你现在用的是Windows系统请重新下载 Techmino-32位 或者 Techmino-64位 (和现在运行的不一样的那个)。", tryAnotherBuild="Error.DecodeUTF8(); //如果你现在用的是Windows系统请重新下载 Techmino-32/64位 (和现在运行的不一样的那个)。",
modInstruction="Mod.Instruction();\n/*选择你要使用的Mod\n不同Mod会用不同的方式改变初始游戏规则(可能导致不能正常游玩)\n提醒:开启一些Mod会让成绩无效你也可以用键盘开关Mod按住shift反向*/", modInstruction="Mod.Instruction();\n/*选择你要使用的Mod\n不同Mod会用不同的方式改变初始游戏规则(可能导致不能正常游玩)\n提醒:开启一些Mod会让成绩无效你也可以用键盘开关Mod按住shift反向*/",
modInfo={ modInfo={
@@ -324,6 +325,7 @@ return{
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
json.lua [rxi] json.lua [rxi]
profile.lua [itraykov] profile.lua [itraykov]
sha2 [Egor Skriptunoff]
]], ]],
support="支持作者", support="支持作者",
WidgetText={ WidgetText={
@@ -363,6 +365,7 @@ return{
league="M.TechLeague();", league="M.TechLeague();",
ffa="M.FFA", ffa="M.FFA",
rooms="M.Rooms();", rooms="M.Rooms();",
resetPW="M.ResetPW",
logout="M.Logout();", logout="M.Logout();",
}, },
net_league={ net_league={
@@ -439,7 +442,6 @@ return{
sysCursor="Set.SysCursor", sysCursor="Set.SysCursor",
autoPause="Set.AutoPause", autoPause="Set.AutoPause",
autoSave="Set.AutoSave", autoSave="Set.AutoSave",
autoLogin="Set.AutoLogin",
simpMode="Set.SimpMode", simpMode="Set.SimpMode",
}, },
setting_video={ setting_video={
@@ -689,24 +691,29 @@ return{
path="OpenPath();", path="OpenPath();",
save="DataManagement();", save="DataManagement();",
}, },
login={ login_pw={
title="LogIn.UI", title="LogIn.UI",
register="Register();", login_mail="Login_mail_sign_up()",
email="Email=", email="Email=",
password="Password=", password="Password=",
showEmail="ShowEmail", showEmail="ShowEmail",
keepPW="KeepPassword",
login="Login();", login="Login();",
}, },
register={ login_mail={
title="Register.UI", title="LogIn_Register.UI",
login="Login();", login_pw="Login_pw();",
username="Username=",
email="Email=", email="Email=",
send="Send();",
code="V-code=",
verify="Verify();",
},
reset_password={
title="Reset_Password.UI",
send="Send();",
code="V-code=",
password="Password=", password="Password=",
password2="RePassword=", password2="RePassword=",
register="Register();", setPW="SetPassword();",
registering="Waiting();",
}, },
account={ account={
title="Account.UI", title="Account.UI",

View File

@@ -104,40 +104,92 @@ return{
dictNote="==拷貝自小z辭典==", dictNote="==拷貝自小z辭典==",
getNoticeFail="無法獲取公告",
-- Server's warn/error messages
Techrater={
internalError="內部錯誤",
databaseError="資料庫錯誤",
invalidFormat="json格式無效",
invalidArguments="參數無效",
tooFrequent="請求太頻繁",
notAvailable="無效請求",
noPermission="沒有許可權",
roomNotFound="找不到房間",
-- Controllers
WebSocket={
invalidConnection="無效連接",
invalidAction="無效操作",
playerNotFound="找不到玩家",
connectionFailed="連接失敗",
},
-- Filters
CheckPermission={
playerNotFound="找不到玩家",
},
-- Plugins
ConnectionManager={
playerInvalid="無效玩家",
playerNotFound="找不到玩家",
connectionReplaced="連接已更換",
},
NoticeManager={
noticeNotFound="找不到公告",
},
PlayerManager={
invalidCode="無效驗證碼",
invalidEmail="無效郵箱",
playerNotFound="找不到玩家",
invalidEmailPass="郵箱或密碼無效",
emailExists="郵箱存在",
emailSendError="郵箱發送錯誤",
},
-- Strategies
PlayerRole={
invalidRole="無效角色",
invalidTarget="無效目標",
},
PlayerType={
invalidType="無效類型",
roomFull="房間已滿",
},
RoomJoin={
wrongPassword="密碼錯誤",
},
},
tooFrequent="操作太頻繁",
roomPasswordChanged="房間密碼已更改",
oldVersion="版本 $1 現已推出", oldVersion="版本 $1 現已推出",
needUpdate="請更新遊戲!",
versionNotMatch="版本不匹配", versionNotMatch="版本不匹配",
notFinished="即將推出!", notFinished="即將推出!",
jsonError="JSON錯誤",
noUsername="請輸入用戶名", noUsername="請輸入用戶名",
wrongEmail="無效的電郵地址", wrongEmail="無效的電郵地址",
wrongCode="無效的驗證碼",
noPassword="請輸入密碼", noPassword="請輸入密碼",
diffPassword="密碼不匹配", diffPassword="密碼不匹配",
registerRequestSent="已發送註冊請求", checkEmail="請查看郵件驗證碼",
registerOK="註冊成功!",
loginOK="登錄成功",
accessOK="身份認證成功",
wsConnecting="正在連接……", wsFailed="連接失敗: $1",
wsFailed="連接失敗", wsClose="連接斷開: $1",
wsClose="連接斷開:",
netTimeout="連接超時", netTimeout="連接超時",
serverDown="哎唷!服務器不在线",
requestFailed="請求失敗",
onlinePlayerCount="在線用戶數", onlinePlayerCount="在線用戶數: $1",
createRoomSuccessed="房間已創建!", createRoomSuccessed="房間已創建!",
playerKicked="#$1 把 #$2 移出了房間",
becomeHost="$1 成為了房主",
started="遊戲中", started="遊戲中",
joinRoom="進入房間", joinRoom="$1 進入房間",
leaveRoom="離開房間", leaveRoom="$1 離開房間",
roomRemoved="房間被解散",
ready="準備!", ready="準備!",
connStream="正在連接……",
waitStream="等待其他用戶連接……",
spectating="旁觀中", spectating="旁觀中",
chatRemain="用戶數:",
chatStart="------訊息開始------",
chatHistory="------以上為歷史訊息------",
keySettingInstruction="點擊來設置鍵位\n按esc來取消選中\n按退格鍵來清除選中", keySettingInstruction="點擊來設置鍵位\n按esc來取消選中\n按退格鍵來清除選中",
customBGhelp="把圖片檔案拖到這個視窗裏使用自定義背景", customBGhelp="把圖片檔案拖到這個視窗裏使用自定義背景",
@@ -323,6 +375,7 @@ return{
Cold_Clear [MinusKelvin] Cold_Clear [MinusKelvin]
json.lua [rxi] json.lua [rxi]
profile.lua [itraykov] profile.lua [itraykov]
sha2 [Egor Skriptunoff]
]], ]],
support="支持作者", support="支持作者",
WidgetText={ WidgetText={
@@ -362,6 +415,7 @@ return{
league="Tech League", league="Tech League",
ffa="FFA", ffa="FFA",
rooms="房間列表", rooms="房間列表",
resetPW="重設密碼",
logout="登出", logout="登出",
}, },
net_league={ net_league={
@@ -438,7 +492,6 @@ return{
sysCursor="使用系統光標", sysCursor="使用系統光標",
autoPause="失去焦點時暫停", autoPause="失去焦點時暫停",
autoSave="打破紀錄時自動保存", autoSave="打破紀錄時自動保存",
autoLogin="啟動時自動登錄",
simpMode="簡潔模式", simpMode="簡潔模式",
}, },
setting_video={ setting_video={
@@ -688,24 +741,29 @@ return{
path="打開存儲目錄", path="打開存儲目錄",
save="用戶資料管理", save="用戶資料管理",
}, },
login={ login_pw={
title="登錄", title="登錄",
register="註冊", login_mail="電郵登錄/注册",
email="電郵", email="電郵",
password="密碼", password="密碼",
showEmail="顯示郵箱", showEmail="顯示郵箱",
keepPW="保存密碼",
login="登錄", login="登錄",
}, },
register={ login_mail={
title="註冊", title="登錄/註冊",
login="登錄", login_pw="密碼登錄",
username="用戶名",
email="電郵", email="電郵",
send="發送驗證碼",
code="驗證碼",
verify="驗證郵箱",
},
reset_password={
title="重設密碼",
send="發送驗證碼",
code="驗證碼",
password="密碼", password="密碼",
password2="確認密碼", password2="確認密碼",
register="註冊", setPW="設置密碼",
registering="等待伺服器響應……",
}, },
account={ account={
title="賬戶", title="賬戶",
@@ -873,4 +931,5 @@ return{
['custom_clear']= {"自定義", "普通"}, ['custom_clear']= {"自定義", "普通"},
['custom_puzzle']= {"自定義", "拼圖"}, ['custom_puzzle']= {"自定義", "拼圖"},
}, },
pumpkin="我是南瓜",
} }

View File

@@ -33,7 +33,7 @@ return{
GC.rectangle('line',488,20,100,80,5) GC.rectangle('line',488,20,100,80,5)
GC.draw(border,-17+150,-12) GC.draw(border,-17+150,-12)
setFont(30) setFont(30)
GC.mStr(P.username,300,-60) GC.mStr(P.username or USERS.getUsername(P.uid),300,-60)
end end
GC.pop() GC.pop()
end end

View File

@@ -11,7 +11,7 @@ return{
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end, comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
getRank=function(P) getRank=function(P)
local L=P.stat.row local L=P.stat.row
if L==100 then if L>=100 then
local T=P.stat.time local T=P.stat.time
return return
T<=32 and 5 or T<=32 and 5 or

View File

@@ -5,7 +5,7 @@ return{
sequence=function(P) sequence=function(P)
for _=1,3 do P:getNext(7) end for _=1,3 do P:getNext(7) end
while true do while true do
YIELD() coroutine.yield()
if not P.nextQueue[1] then if not P.nextQueue[1] then
local height=TABLE.new(0,10) local height=TABLE.new(0,10)
local max=#P.field local max=#P.field

View File

@@ -3,7 +3,7 @@ return{
sequence="bagES", sequence="bagES",
freshLimit=15, freshLimit=15,
eventSet='master_n', eventSet='master_n',
bg='bg1',bgm='secret8th', bg='bg2',bgm='secret8th',
}, },
slowMark=true, slowMark=true,
score=function(P) return {P.modeData.pt,P.stat.time} end, score=function(P) return {P.modeData.pt,P.stat.time} end,

View File

@@ -1,4 +1,4 @@
local yield=YIELD local yield=coroutine.yield
local function marginTask(P) local function marginTask(P)
local S=P.stat local S=P.stat
while true do yield() if S.frame>90*60 then P.strength=1;P:setFrameColor(1)break end end while true do yield() if S.frame>90*60 then P.strength=1;P:setFrameColor(1)break end end
@@ -12,19 +12,26 @@ return{
bgm={'battle','beat5th','cruelty','distortion','echo','far','final','here','hope','memory','moonbeam','push','rectification','secret7th remix','secret7th','secret8th remix','secret8th','shift','shining terminal','storm','super7th','there','truth','vapor','waterfall'}, bgm={'battle','beat5th','cruelty','distortion','echo','far','final','here','hope','memory','moonbeam','push','rectification','secret7th remix','secret7th','secret8th remix','secret8th','shift','shining terminal','storm','super7th','there','truth','vapor','waterfall'},
}, },
load=function() load=function()
for k,v in next,NET.roomState.roomData do for k,v in next,NET.roomState.data do
GAME.modeEnv[k]=v GAME.modeEnv[k]=v
end end
GAME.modeEnv.allowMod=false GAME.modeEnv.allowMod=false
GAME.modeEnv.task=marginTask GAME.modeEnv.task=marginTask
local L=TABLE.copy(NETPLY.list) local L=TABLE.shift(NETPLY.list,0)
table.sort(L,function(a,b) return a.uid<b.uid end)
math.randomseed(GAME.seed)
for i=#L,1,-1 do
table.insert(NETPLY.list,table.remove(NETPLY.list,math.random(i)))
end
TABLE.clear(NET.uid_sid)
for i=1,#L do NET.uid_sid[L[i].uid]=i end
local N=1 local N=1
for i,p in next,L do for i,p in next,L do
if p.uid==USER.uid then if p.uid==USER.uid then
if p.connected then if p.playMode=='Gamer' then
PLY.newPlayer(1) PLY.newPlayer(1,false,p)
PLAYERS[1].sid=NETPLY.getSID(USER.uid)
N=2 N=2
end end
table.remove(L,i) table.remove(L,i)
@@ -32,7 +39,7 @@ return{
end end
end end
for _,p in next,L do for _,p in next,L do
if p.connected then if p.playMode=='Gamer' then
PLY.newRemotePlayer(N,false,p) PLY.newRemotePlayer(N,false,p)
N=N+1 N=N+1
end end

View File

@@ -3,7 +3,7 @@ return{
life=2, life=2,
drop=60,lock=60, drop=60,lock=60,
freshLimit=15, freshLimit=15,
bg='bg2',bgm='battle', bg='quarks',bgm='battle',
}, },
load=function() load=function()
PLY.newPlayer(1) PLY.newPlayer(1)

View File

@@ -3,7 +3,7 @@ return{
life=2, life=2,
drop=60,lock=60, drop=60,lock=60,
freshLimit=15, freshLimit=15,
bg='bg2',bgm='battle', bg='quarks',bgm='battle',
}, },
load=function() load=function()
PLY.newPlayer(1) PLY.newPlayer(1)

View File

@@ -3,7 +3,7 @@ return{
life=2, life=2,
drop=60,lock=60, drop=60,lock=60,
freshLimit=15, freshLimit=15,
bg='bg2',bgm='battle', bg='quarks',bgm='battle',
}, },
load=function() load=function()
PLY.newPlayer(1) PLY.newPlayer(1)

View File

@@ -3,7 +3,7 @@ return{
life=2, life=2,
drop=60,lock=60, drop=60,lock=60,
freshLimit=15, freshLimit=15,
bg='bg2',bgm='battle', bg='quarks',bgm='battle',
}, },
load=function() load=function()
PLY.newPlayer(1) PLY.newPlayer(1)

View File

@@ -3,7 +3,7 @@ return{
life=2, life=2,
drop=60,lock=60, drop=60,lock=60,
freshLimit=15, freshLimit=15,
bg='bg2',bgm='battle', bg='quarks',bgm='battle',
}, },
load=function() load=function()
PLY.newPlayer(1) PLY.newPlayer(1)

View File

@@ -8,7 +8,7 @@ return{
scoreDisp=function(D) return D[1].." Attack "..STRING.time(D[2]) end, scoreDisp=function(D) return D[1].." Attack "..STRING.time(D[2]) end,
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end, comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
getRank=function(P) getRank=function(P)
if P.stat.atk<40 then return end if P.stat.atk<100 then return end
local T=P.stat.time local T=P.stat.time
return return
T<40 and 5 or T<40 and 5 or

View File

@@ -6,7 +6,7 @@ return{
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
eventSet='royale', eventSet='royale',
bg='rainbow',bgm='rockblock', bg='galaxy',bgm='rockblock',
}, },
load=function() load=function()
ROYALEDATA.powerUp={2,5,10,20} ROYALEDATA.powerUp={2,5,10,20}

View File

@@ -6,7 +6,7 @@ return{
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
eventSet='royale', eventSet='royale',
bg='rainbow',bgm='rockblock', bg='galaxy',bgm='rockblock',
}, },
load=function() load=function()
ROYALEDATA.powerUp={2,5,10,20} ROYALEDATA.powerUp={2,5,10,20}

View File

@@ -6,7 +6,7 @@ return{
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
eventSet='royale', eventSet='royale',
bg='rainbow',bgm='rockblock', bg='galaxy',bgm='rockblock',
}, },
load=function() load=function()
ROYALEDATA.powerUp={2,5,10,20} ROYALEDATA.powerUp={2,5,10,20}

View File

@@ -6,7 +6,7 @@ return{
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
eventSet='royale', eventSet='royale',
bg='rainbow',bgm='rockblock', bg='galaxy',bgm='rockblock',
}, },
load=function() load=function()
ROYALEDATA.powerUp={2,6,14,30} ROYALEDATA.powerUp={2,6,14,30}

View File

@@ -6,7 +6,7 @@ return{
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
eventSet='royale', eventSet='royale',
bg='rainbow',bgm='rockblock', bg='galaxy',bgm='rockblock',
}, },
load=function() load=function()
ROYALEDATA.powerUp={2,6,14,30} ROYALEDATA.powerUp={2,6,14,30}

View File

@@ -6,7 +6,7 @@ return{
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
eventSet='royale', eventSet='royale',
bg='rainbow',bgm='rockblock', bg='galaxy',bgm='rockblock',
}, },
load=function() load=function()
ROYALEDATA.powerUp={2,6,14,30} ROYALEDATA.powerUp={2,6,14,30}

View File

@@ -1,6 +1,7 @@
return { return {
env={ env={
drop=120,lock=1e99, drop=120,lock=1e99,
hang=15,
infHold=true, infHold=true,
ospin=false, ospin=false,
eventSet='tsd_e', eventSet='tsd_e',

View File

@@ -1,6 +1,7 @@
return { return {
env={ env={
drop=60,lock=60, drop=60,lock=60,
hang=15,
freshLimit=15, freshLimit=15,
ospin=false, ospin=false,
eventSet='tsd_h', eventSet='tsd_h',

View File

@@ -1,6 +1,7 @@
return { return {
env={ env={
drop=60,lock=60, drop=60,lock=60,
hang=15,
freshLimit=15, freshLimit=15,
ospin=false, ospin=false,
eventSet='tsd_u', eventSet='tsd_u',

File diff suppressed because it is too large Load Diff

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