Compare commits

...

29 Commits

Author SHA1 Message Date
MrZ_26
3c852f17a0 补翻译说明 2024-08-09 01:12:49 +08:00
MrZ_26
8737a00b44 补越南语翻译 2024-08-09 01:08:25 +08:00
MrZ_26
fff2c49f2e 补越南语翻译 2024-08-09 00:03:13 +08:00
MrZ_26
35c19a4d50 spinren加一些注释的代码 2024-08-08 23:43:01 +08:00
MrZ_26
137e707c63 删除ffa按钮
tech league改名galaxim,调整一些联网菜单文本
2024-08-08 23:42:41 +08:00
MrZ_26
d2e9439e38 更新版本号 2024-08-08 23:06:38 +08:00
MrZ_26
39cd7e4c1a 调整服务器url 2024-08-08 23:06:07 +08:00
MrZ_26
57f2b9541d 修几个词条不能通过拼音搜索 2024-08-08 16:14:53 +08:00
MrZ_26
9d4065a05a 修复创建联网房间时有好几个选项并没有生效 2024-08-08 16:08:51 +08:00
MrZ_26
424a3b3bee 公告页面信息更详细一点 2024-08-07 13:52:46 +08:00
MrZ_26
de3e1fcdc7 实现公告场景的功能 2024-08-07 13:25:03 +08:00
MrZ_26
59f390de93 尝试启用公告功能 2024-08-07 12:54:06 +08:00
MrZ_26
26287c8f35 更新历史和版本号 2024-08-07 12:19:53 +08:00
MrZ_26
24d552ba2b Merge branch 'ci-web-revive' 2024-08-07 12:11:32 +08:00
MrZ_26
f1a08ca325 更新历史和版本号 2024-08-03 13:05:09 +08:00
MrZ_26
28ec031afa 修time_short函数一个错误 2024-08-03 03:18:31 +08:00
MrZ_26
d9f606c56f 修地图布局
修spinren模式翻译
调整一些模式的外框形状
2024-08-03 01:45:37 +08:00
MrZ_26
de4b73cf83 spinren模式结束时显示的文本会根据是否到10行变化 2024-08-02 23:22:16 +08:00
MrZ_26
beff0c9d99 调整翻译文本,所有模式的“难度”一栏更统一 2024-08-02 23:04:49 +08:00
MrZ_26
4a76a929f5 更新spinren模式的越南语翻译 2024-08-02 22:58:32 +08:00
MrZ_26
aa981160e8 spinren少出两行防止一直响警报 2024-08-02 22:49:51 +08:00
MrZ_26
24a95a36d0 微调地图布局 2024-08-02 22:41:05 +08:00
MrZ_26
583819e8c4 优化spin模式并加到大地图,微调相关区域布局 2024-08-02 22:37:39 +08:00
Imple Lee
4c193efd41 add a new mode: spin ren (#1129)
* add a new mode: spin ren

* remove some bad cases; rework of the weights

* fix lines

* add different orientation for 323

* harder ranking

* Fix the map to sijun's mode

This mode can be used as big-bang!
2024-08-02 21:53:10 +08:00
MrZ_26
8208e7b132 修第三季度音乐名称打错 2024-08-01 21:47:25 +08:00
MrZ_26
7e2bd7b08d 词典里的“全消四”改成“全程消四” 2024-07-24 19:07:54 +08:00
MrZ_26
29258e2a35 添加edm节日 2024-07-14 04:10:26 +08:00
MrZ_26
9e028bc907 微调c4w普通模式评分标准 2024-07-04 02:07:00 +08:00
MrZ_26
75ae05ffc9 c4w普通的计分完全改为竞速 close #1126
改版本号和更新历史
2024-07-03 17:55:04 +08:00
28 changed files with 289 additions and 125 deletions

View File

@@ -131,9 +131,8 @@ function STRING.time_short(t)
-- floor seconds
timeUnits[#timeUnits]=floorint(timeUnits[#timeUnits])
local outputStr=''
for i=1,#timeUnits do
if timeUnits>0 then
if timeUnits[i]>0 then
return timeUnits[i]..timeLetters[i]..' '..timeUnits[i+1]..timeLetters[i+1]
end
end

View File

@@ -40,21 +40,25 @@ do-- Connect
repeat
res,err=SOCK:receive('*l')
assert(res,err)
if not ctLen and res:find('length') then
ctLen=tonumber(res:match('%d+'))
if not ctLen and res:find('content-length') then
ctLen=tonumber(res:match('%d+')) or 0
end
until res==''
-- Result
if code=='101' then
CHN_push(readCHN,'success')
end
-- Content(?)
if ctLen then
if code=='101' then
CHN_push(readCHN,'success')
else
res,err=SOCK:receive(ctLen)
res,err=SOCK:receive(ctLen)
if code~='101' then
res=JSON.decode(assert(res,err))
error((code or "XXX")..":"..(res and res.reason or "Server Error"))
end
end
SOCK:settimeout(0)
end

View File

@@ -591,10 +591,10 @@ for _,fileName in next,fs.getDirectoryItems('replay') do
end
table.sort(REPLAY,function(a,b) return a.fileName>b.fileName end)
AUTHURL="https://studio26f.org/oauth?product=techmino"
AUTHHOST="cafuuchino1.3322.org:8081"
WS.switchHost('cafuuchino1.3322.org','10026','/techmino/ws/v1')
HTTP.setHost("cafuuchino1.3322.org:10026")
AUTHURL="https://www.studio26f.org/oauth?product=techmino"
AUTHHOST="www.studio26f.org:8080"
WS.switchHost('www.studio26f.org','8081','/techmino/ws/v1')
HTTP.setHost("www.studio26f.org:8081")
HTTP.setThreadCount(1)
table.insert(_LOADTIMELIST_,("Load Resources: %.3fs"):format(TIME()-_LOADTIME_))

View File

@@ -10,12 +10,12 @@ return {
{"新人学习/练习路线",
"读我 必读 萌新 xinren new noob readme",
"help",
"以下是关于提升真正打块能力的指引,如果在以下任何项目练习过程中感到有困难,可以适当回去玩玩自己喜欢的项目。别忘了你是来 “玩” 游戏的,兴趣最重要。\n以下给出几个新手时期的主线任务树前期主要就应该练习以下内容学定式和T-Spin什么的对实力帮助很小我们不认为靠定式对战秒其他萌新是有效实力\n注意三段应当同时进行不是A→B→C\nA. 堆叠能力练习方法\n\tA1. 手上的块可以放的时候先别急着放,看看下一块有没有地方,如果放不下去就看看手上的能不能换个地方\n\tA2. 尝试把地形尽量控制得平整,因为大多数情况比较平的地形来啥块都比较容易放得下去\n\tA3. 允许hold的时候可以多想想手里和hold的块和后续几块应该怎么安排顺序长远地使地形平整\nB. 操作效率与速度练习方法\n\tB1. 不要每一块都拿影子去对形状对位置,要自己想象这个块转一下是什么方向,想好了再开始按按键\n\tB2. 学习双旋,能逆时针转一次就不要顺时针转三次,费手\n\tB3. 学习极简,刚开始不用管速度,保证正确率最重要,养成良好习惯以后再提速快得很\nC. 堆叠能力考核\n\tC1. 稳定完成40行不死可以用hold\n\tC2. 稳定完成40行不死不能用hold\n\tC3. 稳定全消四完成40行可以用hold\n\tC4. 稳定全消四完成40行不能用hold\n以上都是根据社区和个人经验总结的模糊方法与目标所以C的考核可以根据自身情况调整严格程度例如 “稳定” 的具体成功率)。\n完成C的考核后需要在未来一直注意没有上限的A1这是方块的根本元素之一强大的读next能力可以让你快速上手任何变种玩法。",
"以下是关于提升真正打块能力的指引,如果在以下任何项目练习过程中感到有困难,可以适当回去玩玩自己喜欢的项目。别忘了你是来 “玩” 游戏的,兴趣最重要。\n以下给出几个新手时期的主线任务树前期主要就应该练习以下内容学定式和T-Spin什么的对实力帮助很小我们不认为靠定式对战秒其他萌新是有效实力\n注意三段应当同时进行不是A→B→C\nA. 堆叠能力练习方法\n\tA1. 手上的块可以放的时候先别急着放,看看下一块有没有地方,如果放不下去就看看手上的能不能换个地方\n\tA2. 尝试把地形尽量控制得平整,因为大多数情况比较平的地形来啥块都比较容易放得下去\n\tA3. 允许hold的时候可以多想想手里和hold的块和后续几块应该怎么安排顺序长远地使地形平整\nB. 操作效率与速度练习方法\n\tB1. 不要每一块都拿影子去对形状对位置,要自己想象这个块转一下是什么方向,想好了再开始按按键\n\tB2. 学习双旋,能逆时针转一次就不要顺时针转三次,费手\n\tB3. 学习极简,刚开始不用管速度,保证正确率最重要,养成良好习惯以后再提速快得很\nC. 堆叠能力考核\n\tC1. 稳定完成40行不死可以用hold\n\tC2. 稳定完成40行不死不能用hold\n\tC3. 稳定全消四完成40行可以用hold\n\tC4. 稳定全消四完成40行不能用hold\n以上都是根据社区和个人经验总结的模糊方法与目标所以C的考核可以根据自身情况调整严格程度例如 “稳定” 的具体成功率)。\n完成C的考核后需要在未来一直注意没有上限的A1这是方块的根本元素之一强大的读next能力可以让你快速上手任何变种玩法。",
},
{"关于T-spin学习",
"T旋 T转 tspins",
"help",
"首先指出要能熟练做出各种T-spin并不是只看着T-spin的那一小部分地形就可以玩好的对玩家堆叠能力和计算next能力同样也有较高的要求。\n\n如果不只是出于娱乐、随便玩玩的目的是真的想不断提升T-spin能力变强请在基础能力达到一定要求前不要刻意去学习太多的T-spin而先把重点放在堆叠等基本功上。\n\n参考学T门槛水平40L达到60s以内可以视个人情况调整为40~120s、能够轻松完成全消四的40L、不使用Hold不降太多速度的前提下比较轻松完成全消四的40L培养看next的意识和算力",
"首先指出要能熟练做出各种T-spin并不是只看着T-spin的那一小部分地形就可以玩好的对玩家堆叠能力和计算next能力同样也有较高的要求。\n\n如果不只是出于娱乐、随便玩玩的目的是真的想不断提升T-spin能力变强请在基础能力达到一定要求前不要刻意去学习太多的T-spin而先把重点放在堆叠等基本功上。\n\n参考学T门槛水平40L达到60s以内可以视个人情况调整为40~120s、能够轻松完成全消四的40L、不使用Hold不降太多速度的前提下比较轻松完成全消四的40L培养看next的意识和算力",
},
{"游戏官网",
"official website homepage mainpage guanwang",
@@ -618,17 +618,17 @@ FNNS and {"赞助3",
"主流方块游戏中七种块的颜色会使用同一套彩虹配色:\nZ红 S绿 J蓝 L橙 T紫 O黄 I\n\nTechmino默认也使用这一套 “标准” 配色。",
},
{"提前旋转(IRS)",
"irs initialrotatesystem",
"tiqianxuanzhuan irs initialrotatesystem",
"term",
"Initial Rotation System 提前旋转系统\n方块出现前提前按下旋转后,出现时就是转好的形状,有时可以避免死亡。",
},
{"提前暂存(IHS)",
"ihs initialholdsystem",
"tiqianzancun ihs initialholdsystem",
"term",
"Initial Hold System 提前Hold系统\n方块出现前提前按下hold后直接出现hold里的方块有时可以避免死亡。",
},
{"提前移动(IMS)",
"ims initialmovesystem",
"tiqianyidong ims initialmovesystem",
"term",
"Initial Move System 提前移动系统\n方块出现前提前按住移动后出现时会朝移动方向偏一格有时可以避免死亡Techmino限定\n需要块出现时das已充满",
},

View File

@@ -462,14 +462,13 @@ C. Gamepad
tas="TAS (T)",
},
net_menu={
league="Tech League",
ffa="FFA",
galaxim="Galaxim",
rooms="Rooms",
resetPW="Reset password",
logout="Log out",
},
net_league={
match="Find Match",
net_galaxim={
match="Enter Sim.",
},
net_rooms={
password="Password",
@@ -969,13 +968,14 @@ C. Gamepad
['backfire_h']= {"Backfire", "HARD", "Send 100 lines as fast as you can while attacking yourself!"},
['backfire_l']= {"Backfire", "LUNATIC", "Send 100 lines as fast as you can while attacking yourself!"},
['backfire_u']= {"Backfire", "ULTIMATE", "Send 100 lines as fast as you can while attacking yourself!"},
['sprintAtk']= {"Sprint", "100 Attack", "Send 100 lines as fast as you can!"},
['sprintAtk']= {"Sprint", "100 ATTACK", "Send 100 lines as fast as you can!"},
['sprintEff']= {"Efficiency", "40L", "Send more attack in 40 lines!"},
['zen']= {'Zen', "200L", "A 200-line score attack with no time limit"},
['ultra']= {'Ultra', "EXTRA", "A 2-minute score attack"},
['infinite']= {"Infinite", "", "Just a sandbox"},
['infinite_dig']= {"Dig", "INFINITE", "Dig-diggin'-dug"},
['marathon_inf']= {"Marathon", "INFINITE", "Infinite marathon."},
['spinren']= {"Spin Combo", "EFFICIENCY", "Spike in a blink"},
['custom_clear']= {"Custom", "NORMAL"},
['custom_puzzle']= {"Custom", "PUZZLE"},

View File

@@ -423,14 +423,13 @@ return {
tas="TAS (T)",
},
net_menu={
league="Liga Tech",
ffa="FFA",
-- galaxim="Galaxim", -- Galaxy+Simulation
rooms="Salas",
resetPW="Restabl. Contraseña",
logout="Desconec.",
},
net_league={
match="Buscar Match",
net_galaxim={
-- match="Enter Sim.", -- (Actively) Enter (the) (digital) Simulation of (a galaxy)
},
net_rooms={
password="Contraseña",
@@ -941,6 +940,7 @@ return {
['infinite']= {"Infinito", "", "Modo Sandbox."},
['infinite_dig']= {"Infinito: Queso", "", "Limpia, limpia, más limpia que tú."},
['marathon_inf']= {"Maratón", "Infinito", "Maratón infinita."},
-- ['spinren']= {"Spin Combo", "EFFICIENCY", "Spike in a blink"},
['custom_clear']= {"Personalizado", "Normal"},
['custom_puzzle']= {"Personalizado", "Puzzle"},

View File

@@ -398,14 +398,13 @@ return {
-- tas="TAS (T)",
},
net_menu={
-- league="Tech League",
ffa="FFA",
-- galaxim="Galaxim", -- Galaxy+Simulation
rooms="Salons",
resetPW="Réinitialiser le mot de passe",
logout="Se déconnecter",
},
net_league={
match="Find Match",
net_galaxim={
-- match="Enter Sim.", -- (Actively) Enter (the) (digital) Simulation of (a galaxy)
},
net_rooms={
password="Mot de passe",
@@ -914,7 +913,8 @@ return {
['ultra']= {'Ultra', "EXTRA", "2 minutes pour avoir le meilleur score."},
['infinite']= {"Infini", "", "Mode tranquile."},
['infinite_dig']= {"Infini : Dig", "", "Creuser, creuser, creuser."},
['marathon_inf']= {"Marathon", "Infini", "Marathon infini."},
['marathon_inf']= {"Marathon", "INFINI", "Marathon infini."},
-- ['spinren']= {"Spin Combo", "EFFICIENCY", "Spike in a blink"},
['custom_clear']= {"Perso.", "NORMAL"},
['custom_puzzle']= {"Perso.", "PUZZLE"},

View File

@@ -424,14 +424,13 @@ return {
tas="TAS (T)",
},
net_menu={
league="Tech League",
ffa="FFA",
-- galaxim="Galaxim", -- Galaxy+Simulation
rooms="Ruang-ruang",
-- resetPW="Reset password",
logout="Log out",
},
net_league={
match="Cari Tandingan",
net_galaxim={
-- match="Enter Sim.", -- (Actively) Enter (the) (digital) Simulation of (a galaxy)
},
net_rooms={
password="Password",
@@ -938,6 +937,7 @@ return {
['infinite']= {"Tak Terbatas", "", "Bak pasir"},
['infinite_dig']= {"Tak Terbatas: Gali","", "Gali, gali, gali"},
['marathon_inf']= {"Maraton", "TAK TERBATAS", "Maraton tanpa akhir."},
-- ['spinren']= {"Spin Combo", "EFFICIENCY", "Spike in a blink"},
['custom_clear']= {"Tersesuai", "NORMAL"},
['custom_puzzle']= {"Tersesuai", "TEKA-TEKI"},

View File

@@ -468,14 +468,13 @@ C. ゲームパッド
tas="TAS (T)",
},
net_menu={
league="テクリーグ",
ffa="FFA",
-- galaxim="Galaxim", -- Galaxy+Simulation
rooms="ルーム",
resetPW="パスワード再設定",
logout="ログアウト",
},
net_league={
match="対戦相手を探す",
net_galaxim={
-- match="Enter Sim.", -- (Actively) Enter (the) (digital) Simulation of (a galaxy)
},
net_rooms={
password="パスワード",
@@ -975,13 +974,14 @@ C. ゲームパッド
['backfire_h']= {"バックファイヤー", "HARD", "撃った火力が戻ってくる!"},
['backfire_l']= {"バックファイヤー", "LUNATIC", "撃った火力が戻ってくる!"},
['backfire_u']= {"バックファイヤー", "ULTIMATE", "撃った火力が戻ってくる!"},
['sprintAtk']= {"スプリント", "100 Attack", "100line送れ!"},
['sprintEff']= {"スプリント", "Efficiency", "40lineの間に高火力を出せ!"},
['sprintAtk']= {"スプリント", "100 ATTACK", "100line送れ!"},
['sprintEff']= {"スプリント", "EFFICIENCY", "40lineの間に高火力を出せ!"},
['zen']= {'zen', "200", "時間制限なしで200line消去"},
['ultra']= {'ウルトラ', "EXTRA", "2分間でスコアアタック"},
['infinite']= {"無限", "", "サンドボックス"},
['infinite_dig']= {"無限: 掘り", "", "掘れ掘れ掘れ掘れ掘れ掘・・・"},
['marathon_inf']= {"マラソン", "INFINITE", "ずっと走れるね"},
-- ['spinren']= {"Spin Combo", "EFFICIENCY", "Spike in a blink"},
['custom_clear']= {"カスタム", "NORMAL"},
['custom_puzzle']= {"カスタム", "PUZZLE"},

View File

@@ -412,13 +412,12 @@ return {
-- tas="TAS (T)",
},
net_menu={
-- league="Tech League",
ffa="FFA",
-- galaxim="Galaxim", -- Galaxy+Simulation
rooms="Salas",
-- resetPW="Reset password",
-- logout="Log out",
},
net_league={
net_galaxim={
-- match="Find Match",
},
net_rooms={
@@ -927,7 +926,8 @@ return {
['ultra']= {'Ultra', "EXTRA", "Pegue a maior pontuação em 2 minutos."},
['infinite']= {"Infinito", "", "Modo Sandbox."},
['infinite_dig']= {"Infinito:Cave", "", "Cava, Cava, Cava."},
['marathon_inf']= {"Maratona", "Infinito", "Infinito maratona."},
['marathon_inf']= {"Maratona", "INFINITO", "Infinito maratona."},
-- ['spinren']= {"Spin Combo", "EFFICIENCY", "Spike in a blink"},
['custom_clear']= {"Custom", "NORMAL"},
['custom_puzzle']= {"Custom", "PUZZLE"},

View File

@@ -171,13 +171,12 @@ return {
tas="#&; (T)",
},
net_menu={
league="TL",
ffa="FFA",
-- galaxim="Galaxim", -- Galaxy+Simulation
rooms="< >",
resetPW="R ***",
logout="@_@x",
},
net_league={
net_galaxim={
match="!",
},
net_rooms={

View File

@@ -457,14 +457,13 @@ C. Tay cầm chơi game (Gamepad):
tas="TAS (T)",
},
net_menu={
league="Tech League",
ffa="FFA",
galaxim="Galaxim",
rooms="Danh sách phòng",
resetPW="Đặt lại mật khẩu",
logout="Đăng xuất",
},
net_league={
match="Tìm trận",
net_galaxim={
match="Bước vào mô phỏng",
},
net_rooms={
password="Mật khẩu",
@@ -963,8 +962,8 @@ C. Tay cầm chơi game (Gamepad):
['tech_h_plus']= {"Tech B2B", "KHÓ+", "Chỉ được clear Spin hoặc PC"},
['tech_l']= {"Tech B2B", "RẤT KHÓ", "Cố gắng không phá B2B!"},
['tech_l_plus']= {"Tech B2B", "RẤT KHÓ+", "Chỉ được clear Spin hoặc PC"},
['tech_finesse']= {"Kỹ thuật di chuyển","", "Không được phép có lỗi di chuyển!"},
['tech_finesse_f']= {"Kỹ thuật di chuyển","Khg ĐƠN/ĐÔI/TAM","Không được phép có lỗi di chuyển hoặc kiểu Xoá hàng thường!"},
['tech_finesse']= {"Tech FINESSE", "", "Không được phép có lỗi di chuyển!"},
['tech_finesse_f']= {"Tech FINESSE", "PLUS", "Không được phép có lỗi di chuyển hoặc kiểu Xoá hàng thường!"},
['tsd_e']= {"TSD Challenge", "DỄ", "Chỉ được làm T-Spin Double!"},
['tsd_h']= {"TSD Challenge", "KHÓ", "Chỉ được làm T-Spin Double!"},
['tsd_u']= {"TSD Challenge", "THÁCH ĐẤU", "Chỉ được làm T-Spin Double!"},
@@ -972,13 +971,14 @@ C. Tay cầm chơi game (Gamepad):
['backfire_h']= {"Backfire", "KHÓ", "Sống sót những hàng rác do chính bạn gửi"},
['backfire_l']= {"Backfire", "RẤT KHÓ", "Sống sót những hàng rác do chính bạn gửi"},
['backfire_u']= {"Backfire", "THÁCH ĐẤU", "Sống sót những hàng rác do chính bạn gửi"},
['sprintAtk']= {"Sprint", "100 Attack", "Gửi 100 hàng!"},
['sprintEff']= {"Sprint", "Efficiency", "Gửi càng nhiều hàng càng tốt trong 40 hàng"},
['sprintAtk']= {"Sprint", "100 ATTACK", "Gửi 100 hàng!"},
['sprintEff']= {"Sprint", "EFFICIENCY", "Gửi càng nhiều hàng càng tốt trong 40 hàng"},
['zen']= {'Zen', "200", "Xoá 200 hàng nhưng không có thời gian giới hạn"},
['ultra']= {'Ultra', "EXTRA", "Lấy càng nhiều điểm càng tốt trong 2 phút"},
['infinite']= {"Infinite", "", "Chỉ là một chế độ tự do"},
['infinite_dig']= {"Infinite: Dig", "", "Đào, đào nữa, đào mãi"},
['marathon_inf']= {"Marathon", "VÔ TẬN", "Marathon không có điểm dừng."},
['spinren']= {"Spin Ren", "EFFICIENCY", "Một nháy mắt, gửi chục hàng"},
['custom_clear']= {"Custom", "NORMAL"},
['custom_puzzle']= {"Custom", "PUZZLE"},

View File

@@ -453,14 +453,13 @@ return {
tas="TAS (T)",
},
net_menu={
league="Tech League",
ffa="FFA",
galaxim="Galaxim",
rooms="房间列表",
resetPW="重置密码",
logout="退出登录",
},
net_league={
match="匹配对手",
net_galaxim={
match="进入模拟",
},
net_rooms={
password="密码",
@@ -966,6 +965,7 @@ return {
['infinite']= {"无尽", "", "沙盒"},
['infinite_dig']= {"无尽:挖掘", "", "挖呀挖呀挖"},
['marathon_inf']= {"马拉松", "无尽", "无尽马拉松"},
['spinren']= {"Spin连击", "效率", "掌管效率的神"},
['custom_clear']= {"自定义", "普通"},
['custom_puzzle']= {"自定义", "拼图"},

View File

@@ -372,14 +372,13 @@ return {
tas="TAS(); (T)",
},
net_menu={
league="M.TechLeague();",
ffa="M.FFA",
galaxim="M.Galaxim();",
rooms="M.Rooms();",
resetPW="M.ResetPW",
logout="M.Logout();",
},
net_league={
match="TL.Match();",
net_galaxim={
match="GX.Enter();",
},
net_rooms={
password="Password=",
@@ -881,10 +880,11 @@ return {
['sprintAtk']= {"Sprint(100ATK);", "", "打出100攻击"},
['sprintEff']= {"Sprint(EFF);", "", "40行内打出更高的攻击"},
['zen']= {"Zen(200L);", "", "不限时200行"},
['ultra']= {"Ultra(EXTRA);", "", "在两分钟内尽可能拿到最多的分数"},
['ultra']= {"Ultra(Extra);", "", "在两分钟内尽可能拿到最多的分数"},
['infinite']= {"Infinite();", "", "沙盒"},
['infinite_dig']= {"InfDig();", "", "挖呀挖呀挖"},
['marathon_inf']= {"Marathon(Inf);", "", "无尽马拉松"},
['spinren']= {"Spinren(EFF)", "", "掌管效率的神"},
['custom_clear']= {"Custom(Clear);", ""},
['custom_puzzle']= {"Custom(Puzzle);", ""},

View File

@@ -424,14 +424,13 @@ return {
tas="TAS (T)",
},
net_menu={
league="Tech League",
ffa="FFA",
galaxim="Galaxim",
rooms="房間列表",
resetPW="重設密碼",
logout="登出",
},
net_league={
match="匹配對手",
net_galaxim={
match="进入模拟",
},
net_rooms={
password="密碼",
@@ -938,6 +937,7 @@ return {
['infinite']= {"無盡", "", "沙盒"},
['infinite_dig']= {"無盡:挖掘", "", "挖呀挖呀挖"},
['marathon_inf']= {"馬拉松", "無盡", "無盡馬拉松"},
['spinren']= {"Spin連擊", "效率", "掌管效率的神"},
['custom_clear']= {"自定義", "普通"},
['custom_puzzle']= {"自定義", "拼圖"},

View File

@@ -88,29 +88,30 @@ return {
{name='survivor_l', x=1050, y=-600, size=40,shape=3,icon="survivor", unlock={'survivor_u'}},
{name='survivor_u', x=1250, y=-600, size=40,shape=2,icon="survivor"},
{name='attacker_h', x=450, y=-800, size=40,shape=1,icon="attack", unlock={'attacker_u'}},
{name='attacker_u', x=450, y=-1000,size=40,shape=1,icon="attack"},
{name='attacker_h', x=450, y=-800, size=40,shape=3,icon="attack", unlock={'attacker_u'}},
{name='attacker_u', x=450, y=-1000,size=40,shape=2,icon="attack"},
{name='defender_n', x=650, y=-800, size=40,shape=1,icon="defend", unlock={'defender_l'}},
{name='defender_l', x=650, y=-1000,size=40,shape=1,icon="defend"},
{name='defender_n', x=650, y=-800, size=40,shape=3,icon="defend", unlock={'defender_l'}},
{name='defender_l', x=650, y=-1000,size=40,shape=2,icon="defend"},
{name='dig_h', x=850, y=-800, size=40,shape=1,icon="dig", unlock={'dig_u'}},
{name='dig_u', x=850, y=-1000,size=40,shape=1,icon="dig"},
{name='dig_h', x=850, y=-800, size=40,shape=3,icon="dig", unlock={'dig_u'}},
{name='dig_u', x=850, y=-1000,size=40,shape=2,icon="dig"},
{name='c4wtrain_n', x=700, y=-450, size=40,shape=1,icon="pc", unlock={'c4wtrain_l'}},
{name='c4wtrain_l', x=900, y=-450, size=40,shape=1,icon="pc"},
{name='c4wtrain_n', x=800, y=-450, size=40,shape=1,icon="pc", unlock={'c4wtrain_l'}},
{name='c4wtrain_l', x=950, y=-450, size=40,shape=3,icon="pc"},
{name='pctrain_n', x=700, y=-300, size=40,shape=1,icon="pc", unlock={'pctrain_l','pc_n'}},
{name='pctrain_l', x=900, y=-300, size=40,shape=1,icon="pc"},
{name='pc_n', x=800, y=-140, size=40,shape=1,icon="pc", unlock={'pc_h'}},
{name='pc_h', x=950, y=-140, size=40,shape=3,icon="pc", unlock={'pc_l','pc_inf'}},
{name='pc_l', x=1100, y=-140, size=40,shape=3,icon="pc"},
{name='pc_inf', x=1100, y=-280, size=40,shape=2,icon="pc"},
{name='sprintAtk', x=500, y=-280, size=40,shape=1,icon="sprint2", unlock={'sprintEff','tech_n','tech_finesse','tsd_e','backfire_n'}},
{name='sprintAtk', x=500, y=-300, size=40,shape=1,icon="sprint2", unlock={'sprintEff','tech_n','tech_finesse','tsd_e','backfire_n','spinren'}},
{name='sprintEff', x=360, y=-150, size=40,shape=1,icon="sprint2"},
{name='spinren', x=720, y=-260, size=40,shape=3,icon="tsd"},
{name='pctrain_n', x=950, y=-300, size=40,shape=1,icon="pc", unlock={'pctrain_l','pc_n'}},
{name='pctrain_l', x=1100, y=-300, size=40,shape=3,icon="pc"},
{name='pc_n', x=950, y=-150, size=40,shape=3,icon="pc", unlock={'pc_h'}},
{name='pc_h', x=1100, y=-150, size=40,shape=2,icon="pc", unlock={'pc_l','pc_inf'}},
{name='pc_l', x=1250, y=-150, size=40,shape=2,icon="pc"},
{name='pc_inf', x=1250, y=-300, size=40,shape=2,icon="pc"},
{name='tech_n', x=400, y=20, size=40,shape=1,icon="tech", unlock={'tech_n_plus','tech_h'}},
{name='tech_n_plus', x=200, y=-10, size=40,shape=3,icon="tech_plus"},
{name='tech_h', x=400, y=170, size=40,shape=1,icon="tech", unlock={'tech_h_plus','tech_l'}},
@@ -122,8 +123,8 @@ return {
{name='tech_finesse_f', x=1050, y=20, size=40,shape=1,icon="tech_plus"},
{name='tsd_e', x=700, y=100, size=40,shape=1,icon="tsd", unlock={'tsd_h'}},
{name='tsd_h', x=860, y=160, size=40,shape=1,icon="tsd", unlock={'tsd_u'}},
{name='tsd_u', x=1050, y=170, size=40,shape=1,icon="tsd"},
{name='tsd_h', x=860, y=160, size=40,shape=3,icon="tsd", unlock={'tsd_u'}},
{name='tsd_u', x=1050, y=170, size=40,shape=2,icon="tsd"},
{name='backfire_n', x=640, y=270, size=40,shape=1,icon="backfire", unlock={'backfire_h'}},
{name='backfire_h', x=790, y=300, size=40,shape=1,icon="backfire", unlock={'backfire_l'}},

View File

@@ -6,23 +6,22 @@ return {
eventSet='c4wBase',
bg='rgb',bgm='oxygen',
},
score=function(P) return {math.min(P.modeData.maxCombo,100),P.stat.time} end,
scoreDisp=function(D) return STRING.time(D[2]).." "..D[1].." Combo" end,
comp=function(a,b) return a[2]<b[2] or a[2]==b[2] and a[1]>b[1] end,
score=function(P) return {math.min(P.stat.row,100),P.stat.time} end,
scoreDisp=function(D) return D[1].." Lines "..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,
getRank=function(P)
local L=P.stat.row
if L>=100 then
local T=P.stat.time
return
T<=32 and 5 or
T<=50 and 4 or
T<=80 and 3 or
T<=32.6 and 5 or
T<=49.5 and 4 or
T<=94.2 and 3 or
2
else
return
L>=60 and 2 or
L>=30 and 1 or
L>=10 and 0
L>=42 and 1 or
L>=26 and 0
end
end,
}

101
parts/modes/spinren.lua Normal file
View File

@@ -0,0 +1,101 @@
local skip
---@param RND love.RandomGenerator
local function randomizer(RND)
local last=RND:random(2)==1 and 1 or 4
local function get_next()
local list={1,2,3,1,3,2}
local ret=list[last]
last=last+1
if last>6 then last=1 end
return ret
end
local bag={}
local function fill_bag()
local weights=0
while weights<24 do
local x=get_next()
table.insert(bag,x)
weights=weights+(x==1 and 2 or 3)
end
local pos=RND:random(#bag)+1
table.insert(bag,pos,4)
if skip==1 then skip=0 end
end
return function()
if #bag==0 then fill_bag() end
return table.remove(bag,1)
end
end
local lines={
{1,1,1,1,0,0,1,1,1,1},
{1,1,1,0,0,0,1,1,1,1},
{1,1,1,1,0,0,0,1,1,1},
{1,1,1,0,0,0,0,1,1,1}
}
local function get_lines(n,P)
local ret={}
for _=1,n do
local L=TABLE.shift(lines[P.randomizer_spinren()])
for i=1,#L do
if L[i]==1 then
L[i]=P.modeData.colorSet[P.holeRND:random(4)]
end
end
table.insert(ret,L)
end
return ret
end
return {
load=function()
PLY.newPlayer(1)
local P=PLY_ALIVE[1]
P.modeData.colorSet={}
for i=1,4 do
P.modeData.colorSet[i]=P.holeRND:random(25)
end
P.randomizer_spinren=randomizer(P.holeRND)
-- table.insert(P.field,1,LINE.new(0))
-- P.field[1][1]=18
-- P.field[1][2]=18
-- P.field[1][9]=18
-- P.field[1][10]=18
-- table.insert(P.visTime,1,LINE.new(20))
P:pushLineList(get_lines(18,P))
P.fieldBeneath=0
end,
env={
lock=1e99,
drop=1e99,
minsdarr=3,
infHold=true,
highCam=false,
bgm='lounge',
eventSet='sprintEff_40',
hook_drop=function(P)
if P.lastPiece.row==0 then
if P.stat.row<10 then
P:lose()
else
P:win('finish')
end
end
local up=MATH.clamp(22-P.stat.row+P.lastPiece.row,0,P.lastPiece.row)
P:pushLineList(get_lines(up,P))
end
},
score=function(P) return {P.stat.atk/P.stat.row,P.stat.time} end,
scoreDisp=function(D) return ("%.2f"):format(D[1]).." Efficiency "..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,
getRank=function(P)
if P.stat.row<10 then return end
local E=P.stat.atk/P.stat.row
return
E>=10 and 5 or
E>=9 and 4 or
E>=8 and 3 or
E>=6 and 2 or
E>=3 and 1 or
0
end
}

View File

@@ -187,17 +187,48 @@ function NET.getAvatar(uid)
end
end)
end
function NET.getNotice(lang,count)
local noticeLang={
en='en_us',
fr='en_us', -- fr_fr
es='en_us', -- es_es
id='en_us', -- id_id
pt='en_us', -- pt_pt
symbol='en_us', -- gl_os
ja='en_us', -- ja_jp
vi='en_us', -- vi_vn
zh='zh_cn',
zh_trad='zh_tw',
zh_code='zh_cn',
}
function NET.launchNotice()
TASK.new(function()
local res=getMsg({
pool='getNotice',
path='/techmino/api/v1/notice?language='..noticeLang[SETTING.locale]..'&lastCount=1',
},6.26)
if res and res.code==200 then
local opt=res.data.contents[1]
if opt then
MES.new('info',opt.content,12.6)
else
MES.new('info',text.Techrater.NoticeManager.noticeNotFound)
end
end
end)
end
function NET.getNotice(count)
WAIT{timeout=6.26}
TASK.new(function()
local res=getMsg({
pool='getNotice',
path='/techmino/api/v1/notice?language='..(lang or 'zh_cn')..'&lastCount='..(count or 5),
path='/techmino/api/v1/notice?language='..noticeLang[SETTING.locale]..'&lastCount='..(count or 5),
},6.26)
if res and res.code==200 and type(res.data)=='string' then
local dataStr=""
SCN.go('notice',nil,dataStr)
if res and res.code==200 then
WAIT.interrupt()
SCN.go('notice',nil,noticeLang[SETTING.locale],res.data.contents)
end
end)
end

View File

@@ -193,6 +193,7 @@ function scene.enter()
maxProgress=10
t1,t2=0,0-- Timer
animeType={} for i=1,#SVG_TITLE_FILL do animeType[i]=math.random(#titleTransform) end-- Random animation type
NET.launchNotice()
end
function scene.leave()
SCN.go('quit','none')

View File

@@ -104,8 +104,7 @@ function scene.keyDown(key,isRep)
end
elseif key=='3' then
if _testButton(10) then
MES.new('warn',text.notFinished)
-- NET.getNotice()
NET.getNotice()
end
elseif key=='4' then
if _testButton(11) then
@@ -212,7 +211,7 @@ end
scene.widgetList={
WIDGET.newButton{name='offline',x=-1200,y=210,w=800,h=100,color='lR',font=45,align='R',edge=30,code=pressKey'1'},
WIDGET.newButton{name='qplay', x=-1200,y=330,w=800,h=100,color='lM',font=40,align='R',edge=30,code=pressKey'q'},
WIDGET.newButton{name='online', x=-1200,y=450,w=800,h=100,color='D',font=45,align='R',edge=30,code=pressKey'a'},
WIDGET.newButton{name='online', x=-1200,y=450,w=800,h=100,color='lV',font=45,align='R',edge=30,code=pressKey'a'},
WIDGET.newButton{name='custom', x=-1200,y=570,w=800,h=100,color='lS',font=45,align='R',edge=30,code=pressKey'z'},
WIDGET.newButton{name='setting',x=2480,y=210,w=800,h=100, color='lO',font=40,align='L',edge=30,code=pressKey'-'},
@@ -221,7 +220,7 @@ scene.widgetList={
WIDGET.newButton{name='replays',x=2480,y=570,w=800,h=100, color='lC',font=40,align='L',edge=30,code=pressKey','},
WIDGET.newButton{name='music', x=90,y=80,w=100, color='lY',code=pressKey'2',font=70,fText=CHAR.icon.music},
WIDGET.newButton{name='notice', x=210,y=80,w=100, color='D',code=pressKey'3',font=70,fText=CHAR.key.winMenu},
WIDGET.newButton{name='notice', x=210,y=80,w=100, color='lG',code=pressKey'3',font=70,fText=CHAR.key.winMenu},
WIDGET.newButton{name='lang', x=330,y=80,w=100, color='lN',code=pressKey'4',font=70,fText=CHAR.icon.language},
WIDGET.newButton{name='about', x=-110,y=670,w=600,h=70, color='lB',align='R',edge=20,code=pressKey'x',font=50,fText=CHAR.icon.info},
WIDGET.newButton{name='manual', x=1390,y=670,w=600,h=70, color='lR',align='L',edge=20,code=pressKey'm',font=50,fText=CHAR.icon.help},

View File

@@ -3,14 +3,14 @@ local gc=love.graphics
local scene={}
function scene.enter()
BG.set('league')
BG.set('galaxy')
BGM.play('exploration')
end
function scene.draw()
gc.setColor(COLOR.Z)
setFont(100)
GC.mStr("Tech League",640,120)
GC.mStr("Galaxim",640,120)
drawSelfProfile()
drawOnlinePlayerCount()
end

View File

@@ -14,11 +14,10 @@ function scene.draw()
end
scene.widgetList={
WIDGET.newKey{name='setting', x=1200,y=160,w=90, h=90,code=goScene'setting_game',font=60,fText=CHAR.icon.settings},
WIDGET.newButton{name='league',x=640, y=180,w=350,h=120,font=40,color='D',code=goScene'net_league'},
WIDGET.newButton{name='ffa', x=640, y=360,w=350,h=120,font=40,color='D',code=function() MES.new('warn',text.notFinished)--[[NET.enterRoom({name='ffa'})]] end},
WIDGET.newButton{name='rooms', x=640, y=540,w=350,h=120,font=40,code=goScene'net_rooms'},
WIDGET.newButton{name='logout',x=880, y=40,w=180, h=60,color='dR',
WIDGET.newKey{name='setting', x=1200,y=160,w=90, h=90,code=goScene'setting_game',font=60,fText=CHAR.icon.settings},
WIDGET.newButton{name='galaxim',x=640, y=260,w=350,h=120,font=40,color='D',code=goScene'net_galaxim'},
WIDGET.newButton{name='rooms', x=640, y=460,w=350,h=120,font=40,code=goScene'net_rooms'},
WIDGET.newButton{name='logout', x=880, y=40,w=180, h=60,color='dR',
code=function()
if tryBack() then
print('logout')

View File

@@ -85,8 +85,8 @@ scene.widgetList={
WIDGET.newSelector{name='lock', x=730,y=410,w=260,color='O',list=sList.lock,disp=ROOMval('lock'),code=ROOMsto('lock')},
WIDGET.newSelector{name='wait', x=730,y=520,w=260,color='G',list=sList.wait,disp=ROOMval('wait'),code=ROOMsto('wait')},
WIDGET.newSelector{name='fall', x=730,y=600,w=260,color='G',list=sList.fall,disp=ROOMval('fall'),code=ROOMsto('fall')},
WIDGET.newSelector{name='hurry', x=730,y=680,w=260,color='G',list=sList.hurry,disp=ROOMval('hurry'),code=ROOMval('hurry')},
WIDGET.newSelector{name='hang', x=730,y=760,w=260,color='G',list=sList.hang,disp=ROOMval('hang'),code=ROOMval('hang')},
WIDGET.newSelector{name='hurry', x=730,y=680,w=260,color='G',list=sList.hurry,disp=ROOMval('hurry'),code=ROOMsto('hurry')},
WIDGET.newSelector{name='hang', x=730,y=760,w=260,color='G',list=sList.hang,disp=ROOMval('hang'),code=ROOMsto('hang')},
-- Capacity & Create & Back
WIDGET.newSelector{name='capacity', x=1070,y=330,w=310,color='lY',list={2,3,4,5,7,10,17,31,49,99},disp=ROOMval('capacity'),code=ROOMsto('capacity')},
@@ -103,10 +103,10 @@ scene.widgetList={
WIDGET.newSwitch{name='bone', x=1170,y=970, lim=250,disp=ROOMval('bone'), code=ROOMrev('bone')},
-- Ruleset
WIDGET.newSelector{name='eventSet', x=1050,y=760,w=340,color='H',list=sList.eventSet,disp=ROOMval('eventSet'),code=ROOMval('eventSet')},
WIDGET.newSelector{name='eventSet', x=1050,y=760,w=340,color='H',list=sList.eventSet,disp=ROOMval('eventSet'),code=ROOMsto('eventSet')},
-- Next & Hold
WIDGET.newSelector{name='holdMode', x=310, y=890, w=300,color='lY',list=sList.holdMode,disp=ROOMval('holdMode'),code=ROOMval('holdMode'),hideF=function() return ROOMENV.holdCount==0 end},
WIDGET.newSelector{name='holdMode', x=310, y=890, w=300,color='lY',list=sList.holdMode,disp=ROOMval('holdMode'),code=ROOMsto('holdMode'),hideF=function() return ROOMENV.holdCount==0 end},
WIDGET.newSlider{name='nextCount', x=140, y=960, lim=130,w=200,axis={0,6,1},disp=ROOMval('nextCount'),code=ROOMsto('nextCount')},
WIDGET.newSlider{name='holdCount', x=140, y=1030,lim=130,w=200,axis={0,6,1},disp=ROOMval('holdCount'),code=ROOMsto('holdCount')},
WIDGET.newSwitch{name='infHold', x=560, y=960, lim=200, disp=ROOMval('infHold'),code=ROOMrev('infHold'),hideF=function() return ROOMENV.holdCount==0 end},

View File

@@ -2,8 +2,16 @@ local scene={}
function scene.enter()
BG.set('cubes')
if type(SCN.args[1])=='string' then
scene.widgetList.texts:setTexts(SCN.args[1])
local data=SCN.args[2]
if data then
local texts={"<"..SCN.args[1]..">"}
for i=1,#data do
table.insert(texts,("[$1] $2"):repD(data[i].id or "?",data[i].timestamp or "20??/??/??"))
table.insert(texts,data[i].content)
table.insert(texts,"")
table.insert(texts,"——————————————————————————")
end
scene.widgetList.texts:setTexts(texts)
else
scene.widgetList.texts:setTexts({"No data"})
end
@@ -27,7 +35,7 @@ function scene.keyDown(key)
end
scene.widgetList={
WIDGET.newTextBox{name='texts',x=30,y=45,w=1000,h=640,font=20,fix=true},
WIDGET.newTextBox{name='texts',x=30,y=45,w=1000,h=640,font=25,fix=true,lineH=45},
WIDGET.newButton{name='back',x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene},
}

View File

@@ -42,6 +42,10 @@ function THEME.calculate(Y,M,D)
M=='04' and D=='01' and
'fool' or
-- April fool's day
M=='07' and (D=='14' or D=='15') and
'edm' or
-- Z day
D=='26' and (
(M=='03' or M=='04' or M=='05' or M=='06') and 'zday1' or
@@ -61,7 +65,7 @@ end
function THEME.set(theme,keepBGM)
if type(theme)=='string' and theme:sub(1,6)=='season' then
BG.setDefault(SETTING.defaultBG)
BGM.setDefault(({season1='null',season2='nil',season3='vaccum',season4='space'})[theme])
BGM.setDefault(({season1='null',season2='nil',season3='vacuum',season4='space'})[theme])
elseif not SETTING.noTheme then
if theme=='xmas' then
BG.setDefault('snow')
@@ -90,6 +94,10 @@ function THEME.set(theme,keepBGM)
elseif theme=='fool' then
BG.setDefault('blockrain')
BGM.setDefault('how feeling')
elseif theme=='edm' then
BG.setDefault('lightning2')
BGM.setDefault('malate')
MES.new('music'," 红 色 电 音\n 极 地 大 冲 击\n 只要你敢触电——\n 7月14日、15日 天地人间完全放电\n不用麻醉一样情不自禁HI起来飞起来")
else
return
end

View File

@@ -1,6 +1,21 @@
未来计划:
正在点亮科技树...
0.17.21: 暂停? Break?
新增:
主菜单添加公告页面
尝试重启联网
0.17.19: 暂停 Break
新增:
新模式:Spin连击 (by Gompyn) #1129
改动:
调整一些模式的外框形状
修复:
大师-段位考试模式崩溃
第三季度主菜单音乐名称打错导致没有bgm和进音乐室报错
c4w普通的计分完全改为竞速 #1126
0.17.17: 暂停 Break
新增:
新语音包: neuro (by Petalzu) #1109

View File

@@ -1,7 +1,7 @@
return {
["apkCode"]=1717,
["code"]=1717,
["string"]="V0.17.17",
["room"]="ver A-12",
["apkCode"]=1721,
["code"]=1721,
["string"]="V0.17.21",
["room"]="ver A-13",
["name"]="暂停 Break",
}