界面美化/死亡动画/自定义序列编辑器

This commit is contained in:
MrZ_26
2020-07-15 23:22:44 +08:00
parent 3d22f5d8ca
commit 882b841d3f
35 changed files with 1054 additions and 812 deletions

View File

@@ -39,7 +39,12 @@ local function dumpTable(L,t)
else else
k="["..k.."]=" k="["..k.."]="
end end
elseif T=="string"then k=k.."=" elseif T=="string"then
if find(k,"[^0-9a-zA-Z_]")then
k="[\""..k.."\"]="
else
k=k.."="
end
elseif T=="boolean"then k="["..k.."]=" elseif T=="boolean"then k="["..k.."]="
else assert(false,"Error key type!") else assert(false,"Error key type!")
end end

View File

@@ -146,21 +146,18 @@ function mouseDown.intro(x,y,k)
VOC.play("bye") VOC.play("bye")
SCN.back() SCN.back()
else else
SCN.push() SCN.goto("main")
SCN.swapTo("main")
end end
end end
function touchDown.intro(id,x,y) function touchDown.intro(id,x,y)
SCN.push() SCN.goto("main")
SCN.swapTo("main")
end end
function keyDown.intro(key) function keyDown.intro(key)
if key=="escape"then if key=="escape"then
VOC.play("bye") VOC.play("bye")
SCN.back() SCN.back()
else else
SCN.push() SCN.goto("main")
SCN.swapTo("main")
end end
end end
@@ -168,17 +165,15 @@ local function onMode(x,y)
local cam=mapCam local cam=mapCam
x=(cam.x1-640+x)/cam.k1 x=(cam.x1-640+x)/cam.k1
y=(cam.y1-360+y)/cam.k1 y=(cam.y1-360+y)/cam.k1
local MM,R=Modes,modeRanks for name,M in next,Modes do
for _=1,#MM do if modeRanks[name]then
if R[_]then
local M=MM[_]
local s=M.size local s=M.size
if M.shape==1 then if M.shape==1 then
if x>M.x-s and x<M.x+s and y>M.y-s and y<M.y+s then return _ end if x>M.x-s and x<M.x+s and y>M.y-s and y<M.y+s then return name end
elseif M.shape==2 then elseif M.shape==2 then
if abs(x-M.x)+abs(y-M.y)<s then return _ end if abs(x-M.x)+abs(y-M.y)<s then return name end
elseif M.shape==3 then elseif M.shape==3 then
if(x-M.x)^2+(y-M.y)^2<s^2 then return _ end if(x-M.x)^2+(y-M.y)^2<s^2 then return name end
end end
end end
end end
@@ -208,20 +203,22 @@ end
function mouseClick.mode(x,y,k) function mouseClick.mode(x,y,k)
local cam=mapCam local cam=mapCam
local _=cam.sel local _=cam.sel
if not cam.sel or x<920 then if not _ or x<920 then
local __=onMode(x,y) local SEL=onMode(x,y)
if _~=__ then if _~=SEL then
if __ then if SEL then
SFX.play("click") SFX.play("click")
cam.moving=true cam.moving=true
_=Modes[__] _=Modes[SEL]
cam.x=_.x*cam.k+180 cam.x=_.x*cam.k+180
cam.y=_.y*cam.k cam.y=_.y*cam.k
cam.sel=__ cam.sel=SEL
else else
cam.sel=nil cam.sel=nil
cam.x=cam.x-180 cam.x=cam.x-180
end end
elseif _ then
loadGame(_)
end end
end end
cam.keyCtrl=false cam.keyCtrl=false
@@ -259,11 +256,9 @@ function keyDown.mode(key)
else else
SCN.back() SCN.back()
end end
elseif mapCam.sel==71 or mapCam.sel==72 then elseif mapCam.sel=="custom_clear" or mapCam.sel=="custom_puzzle" then
if key=="q"then if key=="e"then
SCN.push()SCN.swapTo("draw") SCN.goto("custom")
elseif key=="e"then
SCN.push()SCN.swapTo("custom")
end end
end end
end end
@@ -333,6 +328,28 @@ function keyDown.custom(key)
end end
end end
function keyDown.sequence(key)
local s=sceneTemp
if key=="left"then
if s.cur>0 then s.cur=s.cur-1 end
elseif key=="right"then
if s.cur<#preBag then s.cur=s.cur+1 end
elseif key=="backspace"then
local C=s.cur
if C>0 then
rem(preBag,C)
s.cur=C-1
end
elseif key=="delete"then
if sceneTemp.sure>20 then
preBag={1,2,3,4,5,6,7}
sceneTemp.sure=0
else
sceneTemp.sure=50
end
end
end
function mouseDown.draw(x,y,k) function mouseDown.draw(x,y,k)
mouseMove.draw(x,y) mouseMove.draw(x,y)
end end
@@ -417,13 +434,9 @@ function mouseDown.setting_sound(x,y,k)
VOC.play((t<1.5 or t>15)and"doubt"or rnd()<.8 and"happy"or"egg") VOC.play((t<1.5 or t>15)and"doubt"or rnd()<.8 and"happy"or"egg")
sceneTemp.last=Timer() sceneTemp.last=Timer()
if rnd()<.0626 then if rnd()<.0626 then
for i=1,#Modes do for name,M in next,Modes do
local M=Modes[i] if not modeRanks[name]then
for i=1,#M.unlock do modeRanks[name]=M.score and 0 or 6
local m=M.unlock[i]
if not modeRanks[m]then
modeRanks[m]=Modes[m].score and 0 or 6
end
end end
end end
FILE.saveUnlock() FILE.saveUnlock()
@@ -547,8 +560,7 @@ function keyDown.pause(key)
elseif key=="escape"then elseif key=="escape"then
resumeGame() resumeGame()
elseif key=="s"then elseif key=="s"then
SCN.push() SCN.goto("setting_sound")
SCN.swapTo("setting_sound")
elseif key=="r"then elseif key=="r"then
TASK.clear("play") TASK.clear("play")
mergeStat(stat,players[1].stat) mergeStat(stat,players[1].stat)

View File

@@ -2,7 +2,7 @@ local langList={
{ {
anykey="按任意键继续", anykey="按任意键继续",
newVersion="检测到更新!存档格式可能更新,设置已重置", newVersion="检测到更新!存档格式可能更新,设置已重置",
marking="游戏作者:MrZ_26\n任何视频不得出现此水印", marking="游戏作者:MrZ_26\n任何视频/直播不得出现此水印\n任何视频内声明无效",
lang="中文", lang="中文",
atkModeName={"随机","徽章","击杀","反击"}, atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end, royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
@@ -49,12 +49,13 @@ local langList={
fall=nil, fall=nil,
next=nil, next=nil,
hold={"","","无限"}, hold={"","","无限"},
sequence={"bag7","his4","随机"}, sequence={"bag","his4","随机","循环","固定"},
visible={"可见","半隐","全隐","瞬隐"}, visible={"可见","半隐","全隐","瞬隐"},
target={10,20,40,100,200,500,1000,""}, target={10,20,40,100,200,500,1000,""},
freshLimit={0,8,15,""}, freshLimit={0,8,15,""},
opponent={"无电脑","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"}, opponent={"无电脑","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
}, },
sequence="自定义序列",
softdropdas="软降DAS:", softdropdas="软降DAS:",
softdroparr="软降ARR:", softdroparr="软降ARR:",
snapLevelName={"无吸附","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"}, snapLevelName={"无吸附","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
@@ -188,8 +189,7 @@ local langList={
quit="退出", quit="退出",
}, },
mode={ mode={
draw="画图(Q)", setting="参数(E)",
custom="参数(E)",
start="开始", start="开始",
back="返回", back="返回",
}, },
@@ -210,6 +210,18 @@ local langList={
set3="无尽(3)", set3="无尽(3)",
set4="隐形(4)", set4="隐形(4)",
set5="极限(5)", set5="极限(5)",
seq="高级设置",
draw="初始场地编辑",
back="返回",
},
sequence={
Z="Z",S="S",J="J",L="L",T="T",O="O",I="I",
Z5="Z5",S5="S5",P="P",Q="Q",F="F",E="E",T5="T5",U="U",
V="V",W="W",X="X",J5="J5",L5="L5",R="R",Y="Y",N="N",H="H",I5="I5",
left="",
right="",
backsp="<X",
reset="R",
back="返回", back="返回",
}, },
draw={ draw={
@@ -219,6 +231,7 @@ local langList={
demo="不显示×", demo="不显示×",
copy="复制", copy="复制",
paste="粘贴", paste="粘贴",
custom="参数",
back="返回", back="返回",
}, },
play={ play={
@@ -352,85 +365,85 @@ local langList={
}, },
}, },
modes={ modes={
{"竞速", "10L", "消除10行"}, ["sprint_10"]= {"竞速", "10L", "消除10行"},
{"竞速", "20L", "消除20行"}, ["sprint_20"]= {"竞速", "20L", "消除20行"},
{"竞速", "40L", "消除40行"}, ["sprint_40"]= {"竞速", "40L", "消除40行"},
{"竞速", "100L", "消除100行"}, ["sprint_100"]= {"竞速", "100L", "消除100行"},
{"竞速", "400L", "消除400行"}, ["sprint_400"]= {"竞速", "400L", "消除400行"},
{"竞速", "1000L", "消除1000行"}, ["sprint_1000"]= {"竞速", "1000L", "消除1000行"},
{"干旱", "100L", "你I没了"}, ["drought_normal"]= {"干旱", "100L", "你I没了"},
{"干旱", "100L", "后 妈 发 牌"}, ["drought_lunatic"]= {"干旱", "100L", "后 妈 发 牌"},
{"马拉松", "普通", "200行加速马拉松"}, ["marathon_normal"]= {"马拉松", "普通", "200行加速马拉松"},
{"马拉松", "困难", "200行高速马拉松"}, ["marathon_hard"]= {"马拉松", "困难", "200行高速马拉松"},
{"单挑", "简单", "打败AI"}, ["solo_1"]= {"单挑", "简单", "打败AI"},
{"单挑", "普通", "打败AI"}, ["solo_2"]= {"单挑", "普通", "打败AI"},
{"单挑", "困难", "打败AI"}, ["solo_3"]= {"单挑", "困难", "打败AI"},
{"单挑", "疯狂", "打败AI"}, ["solo_4"]= {"单挑", "疯狂", "打败AI"},
{"单挑", "极限", "打败AI"}, ["solo_5"]= {"单挑", "极限", "打败AI"},
{"49人混战", "简单", "49人混战,活到最后"}, ["techmino49_easy"]= {"49人混战", "简单", "49人混战,活到最后"},
{"49人混战", "困难", "49人混战,活到最后"}, ["techmino49_hard"]= {"49人混战", "困难", "49人混战,活到最后"},
{"49人混战", "极限", "49人混战,活到最后"}, ["techmino49_ultimate"]={"49人混战", "极限", "49人混战,活到最后"},
{"99人混战", "简单", "99人混战,活到最后"}, ["techmino99_easy"]= {"99人混战", "简单", "99人混战,活到最后"},
{"99人混战", "困难", "99人混战,活到最后"}, ["techmino99_hard"]= {"99人混战", "困难", "99人混战,活到最后"},
{"99人混战", "极限", "99人混战,活到最后"}, ["techmino99_ultimate"]={"99人混战", "极限", "99人混战,活到最后"},
{"回合制", "简单", "下棋模式"}, ["round_1"]= {"回合制", "简单", "下棋模式"},
{"回合制", "普通", "下棋模式"}, ["round_2"]= {"回合制", "普通", "下棋模式"},
{"回合制", "困难", "下棋模式"}, ["round_3"]= {"回合制", "困难", "下棋模式"},
{"回合制", "疯狂", "下棋模式"}, ["round_4"]= {"回合制", "疯狂", "下棋模式"},
{"回合制", "极限", "下棋模式"}, ["round_5"]= {"回合制", "极限", "下棋模式"},
{"大师", "疯狂", "20G:初心者适用"}, ["master_beginner"]= {"大师", "疯狂", "20G:初心者适用"},
{"大师", "极限", "20G:上级者的挑战"}, ["master_adavnce"]= {"大师", "极限", "20G:上级者的挑战"},
{"大师", "终点", "究极20G:无法触及的终点"}, ["master_final"]= {"大师", "终点", "究极20G:无法触及的终点"},
{"宗师", "GM", "成为方块大师"}, ["GM"]= {"宗师", "GM", "成为方块大师"},
{"隐形", "半隐", "不强大脑"}, ["blind_easy"]= {"隐形", "半隐", "不强大脑"},
{"隐形", "全隐", "挺强大脑"}, ["blind_normal"]= {"隐形", "全隐", "挺强大脑"},
{"隐形", "瞬隐", "很强大脑"}, ["blind_hard"]= {"隐形", "瞬隐", "很强大脑"},
{"隐形", "瞬隐+", "最强大脑"}, ["blind_lunatic"]= {"隐形", "瞬隐+", "最强大脑"},
{"隐形", "", "你准备好了吗"}, ["blind_ultimate"]= {"隐形", "", "你准备好了吗"},
{"高速经典", "CTWC", "高速经典"}, ["classic_fast"]= {"高速经典", "CTWC", "高速经典"},
{"生存", "简单", "你能存活多久?"}, ["survivor_easy"]= {"生存", "简单", "你能存活多久?"},
{"生存", "普通", "你能存活多久?"}, ["survivor_normal"]= {"生存", "普通", "你能存活多久?"},
{"生存", "困难", "你能存活多久?"}, ["survivor_hard"]= {"生存", "困难", "你能存活多久?"},
{"生存", "疯狂", "你能存活多久?"}, ["survivor_lunatic"]= {"生存", "疯狂", "你能存活多久?"},
{"生存", "极限", "你能存活多久?"}, ["survivor_ultimate"]= {"生存", "极限", "你能存活多久?"},
{"进攻", "困难", "进攻练习"}, ["attacker_hard"]= {"进攻", "困难", "进攻练习"},
{"进攻", "极限", "进攻练习"}, ["attacker_ultimate"]= {"进攻", "极限", "进攻练习"},
{"防守", "普通", "防守练习"}, ["defender_normal"]= {"防守", "普通", "防守练习"},
{"防守", "疯狂", "防守练习"}, ["defender_lunatic"]= {"防守", "疯狂", "防守练习"},
{"挖掘", "困难", "挖掘练习"}, ["dig_hard"]= {"挖掘", "困难", "挖掘练习"},
{"挖掘", "极限", "挖掘练习"}, ["dig_ultimate"]= {"挖掘", "极限", "挖掘练习"},
{"大爆炸", "简单", "All-spin 入门教程\n未制作完成,落块即通"}, ["bigbang"]= {"大爆炸", "简单", "All-spin 入门教程\n未制作完成,落块即通"},
{"C4W练习", "普通", "无 限 连 击"}, ["c4wtrain_normal"]= {"C4W练习", "普通", "无 限 连 击"},
{"C4W练习", "疯狂", "无 限 连 击"}, ["c4wtrain_lunatic"]= {"C4W练习", "疯狂", "无 限 连 击"},
{"全清训练", "普通", "简易PC题库,熟悉全清定式的组合"}, ["pctrain_normal"]= {"全清训练", "普通", "简易PC题库,熟悉全清定式的组合"},
{"全清训练", "疯狂", "简易PC题库,熟悉全清定式的组合"}, ["pctrain_lunatic"]= {"全清训练", "疯狂", "简易PC题库,熟悉全清定式的组合"},
{"全清挑战", "普通", "100行内刷PC"}, ["pcchallenge_normal"]= {"全清挑战", "普通", "100行内刷PC"},
{"全清挑战", "困难", "100行内刷PC"}, ["pcchallenge_hard"]= {"全清挑战", "困难", "100行内刷PC"},
{"全清挑战", "疯狂", "100行内刷PC"}, ["pcchallenge_lunatic"]={"全清挑战", "疯狂", "100行内刷PC"},
{"科研", "普通", "禁止断B2B"}, ["tech_normal"]= {"科研", "普通", "禁止断B2B"},
{"科研", "普通+", "仅允许spin与PC"}, ["tech_normal+"]= {"科研", "普通+", "仅允许spin与PC"},
{"科研", "困难", "禁止断B2B"}, ["tech_hard"]= {"科研", "困难", "禁止断B2B"},
{"科研", "困难+", "仅允许spin与PC"}, ["tech_hard+"]= {"科研", "困难+", "仅允许spin与PC"},
{"科研", "疯狂", "禁止断B2B"}, ["tech_lunatic"]= {"科研", "疯狂", "禁止断B2B"},
{"科研", "疯狂+", "仅允许spin与PC"}, ["tech_lunatic+"]= {"科研", "疯狂+", "仅允许spin与PC"},
{"科研", "极限", "强制最简操作"}, ["tech_ultimate"]= {"科研", "极限", "强制最简操作"},
{"科研", "极限+", "禁止普通消除,强制最简操作"}, ["tech_ultimate+"]= {"科研", "极限+", "禁止普通消除,强制最简操作"},
{"TSD挑战", "简单", "你能连续做几个TSD?"}, ["tsd_easy"]= {"TSD挑战", "简单", "你能连续做几个TSD?"},
{"TSD挑战", "困难", "你能连续做几个TSD?"}, ["tsd_hard"]= {"TSD挑战", "困难", "你能连续做几个TSD?"},
{"TSD挑战", "极限", "你能连续做几个TSD?"}, ["tsd_ultimate"]= {"TSD挑战", "极限", "你能连续做几个TSD?"},
{"", "", "不限时200行"}, ["zen"]= {"", "", "不限时200行"},
{"限时打分", "挑战", "在两分钟内尽可能拿到最多的分数"}, ["ultra"]= {"限时打分", "挑战", "在两分钟内尽可能拿到最多的分数"},
{"无尽", "", "沙盒"}, ["infinite"]= {"无尽", "", "沙盒"},
{"无尽:挖掘", "", "挖呀挖呀挖"}, ["infinite_dig"]= {"无尽:挖掘", "", "挖呀挖呀挖"},
{"自定义", "普通", "画点什么然后把它消除!"}, ["custom_clear"]= {"自定义", "普通", "画点什么然后把它消除!"},
{"自定义", "拼图", "画点什么然后把它拼出来吧!"}, ["custom_puzzle"]= {"自定义", "拼图", "画点什么然后把它拼出来吧!"},
{"竞速", "五联块", "伤脑筋十八块"}, ["sprintPenta"]= {"竞速", "五联块", "伤脑筋十八块"},
}, },
}, },
{ {
anykey="按任意键继续", anykey="按任意键继续",
newVersion="检测到更新!存档格式可能更新,设置已重置", newVersion="检测到更新!存档格式可能更新,设置已重置",
marking="游戏作者:MrZ_26\n任何视频不得出现此水印", marking="游戏作者:MrZ_26\n任何视频/直播不得出现此水印\n任何视频内声明无效",
lang="全中文", lang="全中文",
atkModeName={"随机","徽章","击杀","反击"}, atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end, royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
@@ -477,12 +490,13 @@ local langList={
fall=nil, fall=nil,
next=nil, next=nil,
hold={"","","无限"}, hold={"","","无限"},
sequence={"bag7","his4","随机"}, sequence={"bag","his4","随机","循环","固定"},
visible={"可见","半隐","全隐","瞬隐"}, visible={"可见","半隐","全隐","瞬隐"},
target={10,20,40,100,200,500,1000,""}, target={10,20,40,100,200,500,1000,""},
freshLimit={0,8,15,""}, freshLimit={0,8,15,""},
opponent={"无电脑","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"}, opponent={"无电脑","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
}, },
sequence="自定义序列",
snapLevelName={"无吸附","10像素吸附","20像素吸附","40像素吸附","60像素吸附","80像素吸附"}, snapLevelName={"无吸附","10像素吸附","20像素吸附","40像素吸附","60像素吸附","80像素吸附"},
setting_game="游戏设置", setting_game="游戏设置",
setting_video="画面设置", setting_video="画面设置",
@@ -613,8 +627,7 @@ local langList={
quit="退出", quit="退出",
}, },
mode={ mode={
draw="画图(Q)", setting="参数(E)",
custom="参数(E)",
start="开始", start="开始",
back="返回", back="返回",
}, },
@@ -635,6 +648,18 @@ local langList={
set3="无尽(3)", set3="无尽(3)",
set4="隐形(4)", set4="隐形(4)",
set5="极限(5)", set5="极限(5)",
seq="高级设置",
draw="初始场地编辑",
back="返回",
},
sequence={
Z="Z",S="S",J="J",L="L",T="T",O="O",I="I",
Z5="Z5",S5="S5",P="P",Q="Q",F="F",E="E",T5="T5",U="U",
V="V",W="W",X="X",J5="J5",L5="L5",R="R",Y="Y",N="N",H="H",I5="I5",
left="",
right="",
backsp="<X",
reset="R",
back="返回", back="返回",
}, },
draw={ draw={
@@ -644,6 +669,7 @@ local langList={
demo="不显示×", demo="不显示×",
copy="复制", copy="复制",
paste="粘贴", paste="粘贴",
custom="参数",
back="返回", back="返回",
}, },
play={ play={
@@ -777,85 +803,85 @@ local langList={
}, },
}, },
modes={ modes={
{"竞速", "10行", "消除10行"}, ["sprint_10"]= {"竞速", "10行", "消除10行"},
{"竞速", "20行", "消除20行"}, ["sprint_20"]= {"竞速", "20行", "消除20行"},
{"竞速", "40行", "消除40行"}, ["sprint_40"]= {"竞速", "40行", "消除40行"},
{"竞速", "100行", "消除100行"}, ["sprint_100"]= {"竞速", "100行", "消除100行"},
{"竞速", "400行", "消除400行"}, ["sprint_400"]= {"竞速", "400行", "消除400行"},
{"竞速", "1000行", "消除1000行"}, ["sprint_1000"]= {"竞速", "1000行", "消除1000行"},
{"干旱", "100行", "你I没了"}, ["drought_normal"]= {"干旱", "100行", "你I没了"},
{"干旱", "100行", "后 妈 发 牌"}, ["drought_lunatic"]= {"干旱", "100行", "后 妈 发 牌"},
{"马拉松", "普通", "200行加速马拉松"}, ["marathon_normal"]= {"马拉松", "普通", "200行加速马拉松"},
{"马拉松", "困难", "200行高速马拉松"}, ["marathon_hard"]= {"马拉松", "困难", "200行高速马拉松"},
{"单挑", "简单", "打败机器人"}, ["solo_1"]= {"单挑", "简单", "打败机器人"},
{"单挑", "普通", "打败机器人"}, ["solo_2"]= {"单挑", "普通", "打败机器人"},
{"单挑", "困难", "打败机器人"}, ["solo_3"]= {"单挑", "困难", "打败机器人"},
{"单挑", "疯狂", "打败机器人"}, ["solo_4"]= {"单挑", "疯狂", "打败机器人"},
{"单挑", "极限", "打败机器人"}, ["solo_5"]= {"单挑", "极限", "打败机器人"},
{"49人混战", "简单", "49人混战,活到最后"}, ["techmino49_easy"]= {"49人混战", "简单", "49人混战,活到最后"},
{"49人混战", "困难", "49人混战,活到最后"}, ["techmino49_hard"]= {"49人混战", "困难", "49人混战,活到最后"},
{"49人混战", "极限", "49人混战,活到最后"}, ["techmino49_ultimate"]={"49人混战", "极限", "49人混战,活到最后"},
{"99人混战", "简单", "99人混战,活到最后"}, ["techmino99_easy"]= {"99人混战", "简单", "99人混战,活到最后"},
{"99人混战", "困难", "99人混战,活到最后"}, ["techmino99_hard"]= {"99人混战", "困难", "99人混战,活到最后"},
{"99人混战", "极限", "99人混战,活到最后"}, ["techmino99_ultimate"]={"99人混战", "极限", "99人混战,活到最后"},
{"回合制", "简单", "下棋模式"}, ["round_1"]= {"回合制", "简单", "下棋模式"},
{"回合制", "普通", "下棋模式"}, ["round_2"]= {"回合制", "普通", "下棋模式"},
{"回合制", "困难", "下棋模式"}, ["round_3"]= {"回合制", "困难", "下棋模式"},
{"回合制", "疯狂", "下棋模式"}, ["round_4"]= {"回合制", "疯狂", "下棋模式"},
{"回合制", "极限", "下棋模式"}, ["round_5"]= {"回合制", "极限", "下棋模式"},
{"大师", "疯狂", "20G:初心者适用"}, ["master_beginner"]= {"大师", "疯狂", "20G:初心者适用"},
{"大师", "极限", "20G:上级者的挑战"}, ["master_adavnce"]= {"大师", "极限", "20G:上级者的挑战"},
{"大师", "终点", "究极20G:无法触及的终点"}, ["master_final"]= {"大师", "终点", "究极20G:无法触及的终点"},
{"宗师", "GM", "成为方块大师"}, ["GM"]= {"宗师", "GM", "成为方块大师"},
{"隐形", "半隐", "不强大脑"}, ["blind_easy"]= {"隐形", "半隐", "不强大脑"},
{"隐形", "全隐", "挺强大脑"}, ["blind_normal"]= {"隐形", "全隐", "挺强大脑"},
{"隐形", "瞬隐", "很强大脑"}, ["blind_hard"]= {"隐形", "瞬隐", "很强大脑"},
{"隐形", "瞬隐+", "超强大脑"}, ["blind_lunatic"]= {"隐形", "瞬隐+", "超强大脑"},
{"隐形", "", "你准备好了吗"}, ["blind_ultimate"]= {"隐形", "", "你准备好了吗"},
{"高速经典", "CTWC", "高速经典"}, ["classic_fast"]= {"高速经典", "CTWC", "高速经典"},
{"生存", "简单", "你能存活多久?"}, ["survivor_easy"]= {"生存", "简单", "你能存活多久?"},
{"生存", "普通", "你能存活多久?"}, ["survivor_normal"]= {"生存", "普通", "你能存活多久?"},
{"生存", "困难", "你能存活多久?"}, ["survivor_hard"]= {"生存", "困难", "你能存活多久?"},
{"生存", "疯狂", "你能存活多久?"}, ["survivor_lunatic"]= {"生存", "疯狂", "你能存活多久?"},
{"生存", "极限", "你能存活多久?"}, ["survivor_ultimate"]= {"生存", "极限", "你能存活多久?"},
{"进攻", "困难", "进攻练习"}, ["attacker_hard"]= {"进攻", "困难", "进攻练习"},
{"进攻", "极限", "进攻练习"}, ["attacker_ultimate"]= {"进攻", "极限", "进攻练习"},
{"防守", "普通", "防守练习"}, ["defender_normal"]= {"防守", "普通", "防守练习"},
{"防守", "疯狂", "防守练习"}, ["defender_lunatic"]= {"防守", "疯狂", "防守练习"},
{"挖掘", "困难", "挖掘练习"}, ["dig_hard"]= {"挖掘", "困难", "挖掘练习"},
{"挖掘", "极限", "挖掘练习"}, ["dig_ultimate"]= {"挖掘", "极限", "挖掘练习"},
{"大爆炸", "简单", "All-spin 入门教程\n未制作完成,落块即通"}, ["bigbang"]= {"大爆炸", "简单", "All-spin 入门教程\n未制作完成,落块即通"},
{"中四宽练习", "普通", "无 限 连 击"}, ["c4wtrain_normal"]= {"中四宽练习", "普通", "无 限 连 击"},
{"中四宽练习", "疯狂", "无 限 连 击"}, ["c4wtrain_lunatic"]= {"中四宽练习", "疯狂", "无 限 连 击"},
{"全清训练", "普通", "简易全清题库,熟悉全清定式的组合"}, ["pctrain_normal"]= {"全清训练", "普通", "简易全清题库,熟悉全清定式的组合"},
{"全清训练", "疯狂", "简易全清题库,熟悉全清定式的组合"}, ["pctrain_lunatic"]= {"全清训练", "疯狂", "简易全清题库,熟悉全清定式的组合"},
{"全清挑战", "普通", "100行内刷全清"}, ["pcchallenge_normal"]= {"全清挑战", "普通", "100行内刷全清"},
{"全清挑战", "困难", "100行内刷全清"}, ["pcchallenge_hard"]= {"全清挑战", "困难", "100行内刷全清"},
{"全清挑战", "疯狂", "100行内刷全清"}, ["pcchallenge_lunatic"]={"全清挑战", "疯狂", "100行内刷全清"},
{"科研", "普通", "禁止断B2B"}, ["tech_normal"]= {"科研", "普通", "禁止断B2B"},
{"科研", "普通+", "仅允许回旋与全清"}, ["tech_normal+"]= {"科研", "普通+", "仅允许回旋与全清"},
{"科研", "困难", "禁止断B2B"}, ["tech_hard"]= {"科研", "困难", "禁止断B2B"},
{"科研", "困难+", "仅允许回旋与全清"}, ["tech_hard+"]= {"科研", "困难+", "仅允许回旋与全清"},
{"科研", "疯狂", "禁止断B2B"}, ["tech_lunatic"]= {"科研", "疯狂", "禁止断B2B"},
{"科研", "疯狂+", "仅允许spin与PC"}, ["tech_lunatic+"]= {"科研", "疯狂+", "仅允许spin与PC"},
{"科研", "极限", "强制最简操作"}, ["tech_ultimate"]= {"科研", "极限", "强制最简操作"},
{"科研", "极限+", "禁止普通消除,强制最简操作"}, ["tech_ultimate+"]= {"科研", "极限+", "禁止普通消除,强制最简操作"},
{"T2挑战", "简单", "你能连续做几个T旋双清?"}, ["tsd_easy"]= {"T2挑战", "简单", "你能连续做几个T旋双清?"},
{"T2挑战", "困难", "你能连续做几个T旋双清?"}, ["tsd_hard"]= {"T2挑战", "困难", "你能连续做几个T旋双清?"},
{"T2挑战", "极限", "你能连续做几个T旋双清?"}, ["tsd_ultimate"]= {"T2挑战", "极限", "你能连续做几个T旋双清?"},
{"", "", "不限时200行"}, ["zen"]= {"", "", "不限时200行"},
{"限时打分", "挑战", "在两分钟内尽可能拿到最多的分数"}, ["ultra"]= {"限时打分", "挑战", "在两分钟内尽可能拿到最多的分数"},
{"无尽", "", "沙盒"}, ["infinite"]= {"无尽", "", "沙盒"},
{"无尽:挖掘", "", "挖呀挖呀挖"}, ["infinite_dig"]= {"无尽:挖掘", "", "挖呀挖呀挖"},
{"自定义", "普通", "画点什么然后把它消除!"}, ["custom_clear"]= {"自定义", "普通", "画点什么然后把它消除!"},
{"自定义", "拼图", "画点什么然后把它拼出来吧!"}, ["custom_puzzle"]= {"自定义", "拼图", "画点什么然后把它拼出来吧!"},
{"竞速", "五联块", "伤脑筋十八块"}, ["sprintPenta"]= {"竞速", "五联块", "伤脑筋十八块"},
}, },
}, },
{ {
anykey="Press any button", anykey="Press any button",
newVersion="Updating detected! Save format may have been updated, settings reseted", newVersion="Updating detected! Save format may have been updated, settings reseted",
marking="Author:MrZ_26\nIllegal recording if u see this", marking="Author:MrZ_26\nIllegal recording if see this\nAny explanation invalid",
lang="English", lang="English",
atkModeName={"Random","Badges","K.O.s","Attackers"}, atkModeName={"Random","Badges","K.O.s","Attackers"},
royale_remain=function(n)return n.." Players Remaining"end, royale_remain=function(n)return n.." Players Remaining"end,
@@ -902,12 +928,13 @@ local langList={
fall=nil, fall=nil,
next=nil, next=nil,
hold={"On","Off","Inf"}, hold={"On","Off","Inf"},
sequence={"bag7","his4","random"}, sequence={"bag","his4","random","loop","fixed"},
visible={"normal","slow fade","fast fade","sudden fade"}, visible={"normal","slow fade","fast fade","sudden fade"},
target={10,20,40,100,200,500,1000,"None"}, target={10,20,40,100,200,500,1000,"None"},
freshLimit={0,8,15,"Inf"}, freshLimit={0,8,15,"Inf"},
opponent={"None","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"}, opponent={"None","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
}, },
sequence="Custom Sequence",
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"}, snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"},
setting_game="Game settings", setting_game="Game settings",
setting_video="Video settings", setting_video="Video settings",
@@ -1027,8 +1054,7 @@ local langList={
quit="Exit", quit="Exit",
}, },
mode={ mode={
draw="Draw (Q)", setting="Settings (E)",
custom="Settings (E)",
start="Start", start="Start",
back="Back", back="Back",
}, },
@@ -1049,6 +1075,18 @@ local langList={
set3="Inf. (3)", set3="Inf. (3)",
set4="Blind (4)", set4="Blind (4)",
set5="Master (5)", set5="Master (5)",
seq="Advanced",
draw="Field Edit",
back="Back",
},
sequence={
Z="Z",S="S",J="J",L="L",T="T",O="O",I="I",
Z5="Z5",S5="S5",P="P",Q="Q",F="F",E="E",T5="T5",U="U",
V="V",W="W",X="X",J5="J5",L5="L5",R="R",Y="Y",N="N",H="H",I5="I5",
left="",
right="",
backsp="<X",
reset="R",
back="Back", back="Back",
}, },
draw={ draw={
@@ -1058,6 +1096,7 @@ local langList={
demo="Don't show ×", demo="Don't show ×",
copy="Copy", copy="Copy",
paste="Paste", paste="Paste",
custom="Args",
back="Back", back="Back",
}, },
play={ play={
@@ -1191,85 +1230,85 @@ local langList={
}, },
}, },
modes={ modes={
{"Sprint", "10L", "Clear 10 lines!"}, ["sprint_10"]= {"Sprint", "10L", "Clear 10 lines!"},
{"Sprint", "20L", "Clear 20 lines!"}, ["sprint_20"]= {"Sprint", "20L", "Clear 20 lines!"},
{"Sprint", "40L", "Clear 40 lines!"}, ["sprint_40"]= {"Sprint", "40L", "Clear 40 lines!"},
{"Sprint", "100L", "Clear 100 lines!"}, ["sprint_100"]= {"Sprint", "100L", "Clear 100 lines!"},
{"Sprint", "400L", "Clear 400 lines!"}, ["sprint_400"]= {"Sprint", "400L", "Clear 400 lines!"},
{"Sprint", "1000L", "Clear 1000 lines!"}, ["sprint_1000"]= {"Sprint", "1000L", "Clear 1000 lines!"},
{"Drought", "100L", "No I piece!"}, ["drought_normal"]= {"Drought", "100L", "No I piece!"},
{"Drought", "100L", "WTF"}, ["drought_lunatic"]= {"Drought", "100L", "WTF"},
{"Marathon", "NORMAL", "200-line marathon with accelerating speed."}, ["marathon_normal"]= {"Marathon", "NORMAL", "200-line marathon with accelerating speed."},
{"Marathon", "HARD", "200-line high-speed marathon."}, ["marathon_hard"]= {"Marathon", "HARD", "200-line high-speed marathon."},
{"Battle", "EASY", "Defeat the AI!"}, ["solo_1"]= {"Battle", "EASY", "Defeat the AI!"},
{"Battle", "NORMAL", "Defeat the AI!"}, ["solo_2"]= {"Battle", "NORMAL", "Defeat the AI!"},
{"Battle", "HARD", "Defeat the AI!"}, ["solo_3"]= {"Battle", "HARD", "Defeat the AI!"},
{"Battle", "LUNATIC", "Defeat the AI!"}, ["solo_4"]= {"Battle", "LUNATIC", "Defeat the AI!"},
{"Battle", "ULTIMATE", "Defeat the AI!"}, ["solo_5"]= {"Battle", "ULTIMATE", "Defeat the AI!"},
{"Tech 49", "EASY", "49-player battle.\nThe last one standing wins."}, ["techmino49_easy"]= {"Tech 49", "EASY", "49-player battle.\nThe last one standing wins."},
{"Tech 49", "HARD", "49-player battle.\nThe last one standing wins."}, ["techmino49_hard"]= {"Tech 49", "HARD", "49-player battle.\nThe last one standing wins."},
{"Tech 49", "ULTIMATE", "49-player battle.\nThe last one standing wins."}, ["techmino49_ultimate"]={"Tech 49", "ULTIMATE", "49-player battle.\nThe last one standing wins."},
{"Tech 99", "EASY", "99-player battle.\nThe last one standing wins."}, ["techmino99_easy"]= {"Tech 99", "EASY", "99-player battle.\nThe last one standing wins."},
{"Tech 99", "HARD", "99-player battle.\nThe last one standing wins."}, ["techmino99_hard"]= {"Tech 99", "HARD", "99-player battle.\nThe last one standing wins."},
{"Tech 99", "ULTIMATE", "99-player battle.\nThe last one standing wins."}, ["techmino99_ultimate"]={"Tech 99", "ULTIMATE", "99-player battle.\nThe last one standing wins."},
{"Turn-Based", "EASY", "Chess mode"}, ["round_1"]= {"Turn-Based", "EASY", "Chess mode"},
{"Turn-Based", "NORMAL", "Chess mode"}, ["round_2"]= {"Turn-Based", "NORMAL", "Chess mode"},
{"Turn-Based", "HARD", "Chess mode"}, ["round_3"]= {"Turn-Based", "HARD", "Chess mode"},
{"Turn-Based", "LUNATIC", "Chess mode"}, ["round_4"]= {"Turn-Based", "LUNATIC", "Chess mode"},
{"Turn-Based", "ULTIMATE", "Chess mode"}, ["round_5"]= {"Turn-Based", "ULTIMATE", "Chess mode"},
{"Master", "LUNATIC", "20G: For beginners."}, ["master_beginner"]= {"Master", "LUNATIC", "20G: For beginners."},
{"Master", "ULTIMATE", "20G: Professional challenge!"}, ["master_adavnce"]= {"Master", "ULTIMATE", "20G: Professional challenge!"},
{"Master", "FINAL", "20G: Unreachable end point!"}, ["master_final"]= {"Master", "FINAL", "20G: Unreachable end point!"},
{"GrandMaster", "GM", "To be Grand Master"}, ["GM"]= {"GrandMaster", "GM", "To be Grand Master"},
{"Blind", "HALF", "For novice players."}, ["blind_easy"]= {"Blind", "HALF", "For novice players."},
{"Blind", "ALL", "For intermediate players."}, ["blind_normal"]= {"Blind", "ALL", "For intermediate players."},
{"Blind", "SUDDEN", "For experienced players."}, ["blind_hard"]= {"Blind", "SUDDEN", "For experienced players."},
{"Blind", "SUDDEN+", "For professionals."}, ["blind_lunatic"]= {"Blind", "SUDDEN+", "For professionals."},
{"Blind", "", "R U Ready?"}, ["blind_ultimate"]= {"Blind", "", "R U Ready?"},
{"Classic", "CTWC", "High-speed classic mode."}, ["classic_fast"]= {"Classic", "CTWC", "High-speed classic mode."},
{"Survivor", "EASY", "How long can you survive?"}, ["survivor_easy"]= {"Survivor", "EASY", "How long can you survive?"},
{"Survivor", "NORMAL", "How long can you survive?"}, ["survivor_normal"]= {"Survivor", "NORMAL", "How long can you survive?"},
{"Survivor", "HARD", "How long can you survive?"}, ["survivor_hard"]= {"Survivor", "HARD", "How long can you survive?"},
{"Survivor", "LUNATIC", "How long can you survive?"}, ["survivor_lunatic"]= {"Survivor", "LUNATIC", "How long can you survive?"},
{"Survivor", "ULTIMATE", "How long can you survive?"}, ["survivor_ultimate"]= {"Survivor", "ULTIMATE", "How long can you survive?"},
{"Attacker", "HARD", "Offensive practice!"}, ["attacker_hard"]= {"Attacker", "HARD", "Offensive practice!"},
{"Attacker", "ULTIMATE", "Offensive practice!"}, ["attacker_ultimate"]= {"Attacker", "ULTIMATE", "Offensive practice!"},
{"Defender", "NORMAL", "Defensive practice!"}, ["defender_normal"]= {"Defender", "NORMAL", "Defensive practice!"},
{"Defender", "LUNATIC", "Defensive practice!"}, ["defender_lunatic"]= {"Defender", "LUNATIC", "Defensive practice!"},
{"Driller", "HARD", "Digging practice!"}, ["dig_hard"]= {"Driller", "HARD", "Digging practice!"},
{"Driller", "ULTIMATE", "Digging practice!"}, ["dig_ultimate"]= {"Driller", "ULTIMATE", "Digging practice!"},
{"Big Bang", "EASY", "All-spin tutorial!\n[Under construction]"}, ["bigbang"]= {"Big Bang", "EASY", "All-spin tutorial!\n[Under construction]"},
{"C4W Training", "NORMAL", "Infinite combos."}, ["c4wtrain_normal"]= {"C4W Training", "NORMAL", "Infinite combos."},
{"C4W Training", "LUNATIC", "Infinite combos."}, ["c4wtrain_lunatic"]= {"C4W Training", "LUNATIC", "Infinite combos."},
{"PC Training", "NORMAL", "Simple Perfect Clear mode."}, ["pctrain_normal"]= {"PC Training", "NORMAL", "Simple Perfect Clear mode."},
{"PC Training", "LUNATIC", "Simple Perfect Clear mode."}, ["pctrain_lunatic"]= {"PC Training", "LUNATIC", "Simple Perfect Clear mode."},
{"PC Challenge", "NORMAL", "Get PCs within 100 lines!"}, ["pcchallenge_normal"]= {"PC Challenge", "NORMAL", "Get PCs within 100 lines!"},
{"PC Challenge", "HARD", "Get PCs within 100 lines!"}, ["pcchallenge_hard"]= {"PC Challenge", "HARD", "Get PCs within 100 lines!"},
{"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"}, ["pcchallenge_lunatic"]={"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"},
{"Tech", "NORMAL", "Keep the B2B chain!"}, ["tech_normal"]= {"Tech", "NORMAL", "Keep the B2B chain!"},
{"Tech", "NORMAL+", "Spin & PC only"}, ["tech_normal+"]= {"Tech", "NORMAL+", "Spin & PC only"},
{"Tech", "HARD", "Keep the B2B chain!"}, ["tech_hard"]= {"Tech", "HARD", "Keep the B2B chain!"},
{"Tech", "HARD+", "Spin & PC only"}, ["tech_hard+"]= {"Tech", "HARD+", "Spin & PC only"},
{"Tech", "LUNATIC", "Keep the B2B chain!"}, ["tech_lunatic"]= {"Tech", "LUNATIC", "Keep the B2B chain!"},
{"Tech", "LUNATIC+", "Spin & PC only"}, ["tech_lunatic+"]= {"Tech", "LUNATIC+", "Spin & PC only"},
{"Tech", "ULTIMATE", "No finesse faults!"}, ["tech_ultimate"]= {"Tech", "ULTIMATE", "No finesse faults!"},
{"Tech", "ULTIMATE+", "No normal clears, no finesse faults!"}, ["tech_ultimate+"]= {"Tech", "ULTIMATE+", "No normal clears, no finesse faults!"},
{"TSD Challenge", "EASY", "T-spin-doubles only!"}, ["tsd_easy"]= {"TSD Challenge", "EASY", "T-spin-doubles only!"},
{"TSD Challenge", "HARD", "T-spin-doubles only!"}, ["tsd_hard"]= {"TSD Challenge", "HARD", "T-spin-doubles only!"},
{"TSD Challenge", "ULTIMATE", "T-spin-doubles only!"}, ["tsd_ultimate"]= {"TSD Challenge", "ULTIMATE", "T-spin-doubles only!"},
{"Zen", "", "200 lines without a time limit."}, ["zen"]= {"Zen", "", "200 lines without a time limit."},
{"Ultra", "EXTRA", "Get the highest score within 2 min."}, ["ultra"]= {"Ultra", "EXTRA", "Get the highest score within 2 min."},
{"Infinite", "", "Sandbox mode."}, ["infinite"]= {"Infinite", "", "Sandbox mode."},
{"Infinite: Dig", "", "Dig, dig, dig."}, ["infinite_dig"]= {"Infinite: Dig", "", "Dig, dig, dig."},
{"Custom", "NORMAL", "Draw something then clear it!!"}, ["custom_clear"]= {"Custom", "NORMAL", "Draw something then clear it!!"},
{"Custom", "PUZZLE", "Draw something then stack it!!"}, ["custom_puzzle"]= {"Custom", "PUZZLE", "Draw something then stack it!!"},
{"Sprint", "Pentomino", "Puzzle-18"}, ["sprintPenta"]= {"Sprint", "Pentomino", "Puzzle-18"},
}, },
}, },
{ {
anykey="↓□↓", anykey="↓□↓",
newVersion="&!!! ___/_?_ R", newVersion="&!!! ___/_?_ R",
marking="Author:MrZ_26\nIllegal recording if u see this", marking="Author:MrZ_26\nIllegal recording if see this\nAny explanation invalid",
lang="?????", lang="?????",
atkModeName={"?","( )","!","←→"}, atkModeName={"?","( )","!","←→"},
royale_remain=function(n)return n.."~"end, royale_remain=function(n)return n.."~"end,
@@ -1316,12 +1355,13 @@ local langList={
fall=nil, fall=nil,
next=nil, next=nil,
hold={"+","-","~"}, hold={"+","-","~"},
sequence={"(xxx)","[...]","???"}, sequence={"(xxx)","[....]","???","{abc}+","==="},
visible={"=","-","_","."}, visible={"=","-","_","."},
target={10,20,40,100,200,500,1000,"x"}, target={10,20,40,100,200,500,1000,"x"},
freshLimit={0,8,15,"~"}, freshLimit={0,8,15,"~"},
opponent={"x","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"}, opponent={"x","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
}, },
sequence="!@#$%^&*",
snapLevelName={"~","10","20","40","60","80"}, snapLevelName={"~","10","20","40","60","80"},
setting_game="%~~%", setting_game="%~~%",
setting_video="{~~}", setting_video="{~~}",
@@ -1441,8 +1481,7 @@ local langList={
quit="X", quit="X",
}, },
mode={ mode={
draw="ABC (Q)", setting="_?_ (E)",
custom="_?_ (E)",
start="!!!", start="!!!",
back="X", back="X",
}, },
@@ -1463,6 +1502,18 @@ local langList={
set3="Inf. (3)", set3="Inf. (3)",
set4="Blind (4)", set4="Blind (4)",
set5="Master (5)", set5="Master (5)",
seq="Advanced",
draw="Field Edit",
back="X",
},
sequence={
Z="Z",S="S",J="J",L="L",T="T",O="O",I="I",
Z5="Z5",S5="S5",P="P",Q="Q",F="F",E="E",T5="T5",U="U",
V="V",W="W",X="X",J5="J5",L5="L5",R="R",Y="Y",N="N",H="H",I5="I5",
left="",
right="",
backsp="<X",
reset="R",
back="X", back="X",
}, },
draw={ draw={
@@ -1472,6 +1523,7 @@ local langList={
demo="X ×", demo="X ×",
copy="→__", copy="→__",
paste="__→", paste="__→",
custom="_?_",
back="X", back="X",
}, },
play={ play={
@@ -1605,79 +1657,79 @@ local langList={
}, },
}, },
modes={ modes={
{"Sprint", "10L", "Clear 10 lines!"}, ["sprint_10"]= {"Sprint", "10L", "Clear 10 lines!"},
{"Sprint", "20L", "Clear 20 lines!"}, ["sprint_20"]= {"Sprint", "20L", "Clear 20 lines!"},
{"Sprint", "40L", "Clear 40 lines!"}, ["sprint_40"]= {"Sprint", "40L", "Clear 40 lines!"},
{"Sprint", "100L", "Clear 100 lines!"}, ["sprint_100"]= {"Sprint", "100L", "Clear 100 lines!"},
{"Sprint", "400L", "Clear 400 lines!"}, ["sprint_400"]= {"Sprint", "400L", "Clear 400 lines!"},
{"Sprint", "1000L", "Clear 1000 lines!"}, ["sprint_1000"]= {"Sprint", "1000L", "Clear 1000 lines!"},
{"Drought", "100L", "No I piece!"}, ["drought_normal"]= {"Drought", "100L", "No I piece!"},
{"Drought", "100L", "WTF"}, ["drought_lunatic"]= {"Drought", "100L", "WTF"},
{"Marathon", "NORMAL", "200-line marathon with accelerating speed."}, ["marathon_normal"]= {"Marathon", "NORMAL", "200-line marathon with accelerating speed."},
{"Marathon", "HARD", "200-line high-speed marathon."}, ["marathon_hard"]= {"Marathon", "HARD", "200-line high-speed marathon."},
{"Battle", "EASY", "Defeat the AI!"}, ["solo_1"]= {"Battle", "EASY", "Defeat the AI!"},
{"Battle", "NORMAL", "Defeat the AI!"}, ["solo_2"]= {"Battle", "NORMAL", "Defeat the AI!"},
{"Battle", "HARD", "Defeat the AI!"}, ["solo_3"]= {"Battle", "HARD", "Defeat the AI!"},
{"Battle", "LUNATIC", "Defeat the AI!"}, ["solo_4"]= {"Battle", "LUNATIC", "Defeat the AI!"},
{"Battle", "ULTIMATE", "Defeat the AI!"}, ["solo_5"]= {"Battle", "ULTIMATE", "Defeat the AI!"},
{"Tech 49", "EASY", "49-player battle.\nThe last one standing wins."}, ["techmino49_easy"]= {"Tech 49", "EASY", "49-player battle.\nThe last one standing wins."},
{"Tech 49", "HARD", "49-player battle.\nThe last one standing wins."}, ["techmino49_hard"]= {"Tech 49", "HARD", "49-player battle.\nThe last one standing wins."},
{"Tech 49", "ULTIMATE", "49-player battle.\nThe last one standing wins."}, ["techmino49_ultimate"]={"Tech 49", "ULTIMATE", "49-player battle.\nThe last one standing wins."},
{"Tech 99", "EASY", "99-player battle.\nThe last one standing wins."}, ["techmino99_easy"]= {"Tech 99", "EASY", "99-player battle.\nThe last one standing wins."},
{"Tech 99", "HARD", "99-player battle.\nThe last one standing wins."}, ["techmino99_hard"]= {"Tech 99", "HARD", "99-player battle.\nThe last one standing wins."},
{"Tech 99", "ULTIMATE", "99-player battle.\nThe last one standing wins."}, ["techmino99_ultimate"]={"Tech 99", "ULTIMATE", "99-player battle.\nThe last one standing wins."},
{"Turn-Based", "EASY", "Chess mode"}, ["round_1"]= {"Turn-Based", "EASY", "Chess mode"},
{"Turn-Based", "NORMAL", "Chess mode"}, ["round_2"]= {"Turn-Based", "NORMAL", "Chess mode"},
{"Turn-Based", "HARD", "Chess mode"}, ["round_3"]= {"Turn-Based", "HARD", "Chess mode"},
{"Turn-Based", "LUNATIC", "Chess mode"}, ["round_4"]= {"Turn-Based", "LUNATIC", "Chess mode"},
{"Turn-Based", "ULTIMATE", "Chess mode"}, ["round_5"]= {"Turn-Based", "ULTIMATE", "Chess mode"},
{"Master", "LUNATIC", "20G: For beginners."}, ["master_beginner"]= {"Master", "LUNATIC", "20G: For beginners."},
{"Master", "ULTIMATE", "20G: Professional challenge!"}, ["master_adavnce"]= {"Master", "ULTIMATE", "20G: Professional challenge!"},
{"Master", "FINAL", "20G: Unreachable end point!"}, ["master_final"]= {"Master", "FINAL", "20G: Unreachable end point!"},
{"GrandMaster", "GM", "To be Grand Master"}, ["GM"]= {"GrandMaster", "GM", "To be Grand Master"},
{"Blind", "HALF", "For novice players."}, ["blind_easy"]= {"Blind", "HALF", "For novice players."},
{"Blind", "ALL", "For intermediate players."}, ["blind_normal"]= {"Blind", "ALL", "For intermediate players."},
{"Blind", "SUDDEN", "For experienced players."}, ["blind_hard"]= {"Blind", "SUDDEN", "For experienced players."},
{"Blind", "SUDDEN+", "For professionals."}, ["blind_lunatic"]= {"Blind", "SUDDEN+", "For professionals."},
{"Blind", "", "R U Ready?"}, ["blind_ultimate"]= {"Blind", "", "R U Ready?"},
{"Classic", "CTWC", "High-speed classic mode."}, ["classic_fast"]= {"Classic", "CTWC", "High-speed classic mode."},
{"Survivor", "EASY", "How long can you survive?"}, ["survivor_easy"]= {"Survivor", "EASY", "How long can you survive?"},
{"Survivor", "NORMAL", "How long can you survive?"}, ["survivor_normal"]= {"Survivor", "NORMAL", "How long can you survive?"},
{"Survivor", "HARD", "How long can you survive?"}, ["survivor_hard"]= {"Survivor", "HARD", "How long can you survive?"},
{"Survivor", "LUNATIC", "How long can you survive?"}, ["survivor_lunatic"]= {"Survivor", "LUNATIC", "How long can you survive?"},
{"Survivor", "ULTIMATE", "How long can you survive?"}, ["survivor_ultimate"]= {"Survivor", "ULTIMATE", "How long can you survive?"},
{"Attacker", "HARD", "Offensive practice!"}, ["attacker_hard"]= {"Attacker", "HARD", "Offensive practice!"},
{"Attacker", "ULTIMATE", "Offensive practice!"}, ["attacker_ultimate"]= {"Attacker", "ULTIMATE", "Offensive practice!"},
{"Defender", "NORMAL", "Defensive practice!"}, ["defender_normal"]= {"Defender", "NORMAL", "Defensive practice!"},
{"Defender", "LUNATIC", "Defensive practice!"}, ["defender_lunatic"]= {"Defender", "LUNATIC", "Defensive practice!"},
{"Driller", "HARD", "Digging practice!"}, ["dig_hard"]= {"Driller", "HARD", "Digging practice!"},
{"Driller", "ULTIMATE", "Digging practice!"}, ["dig_ultimate"]= {"Driller", "ULTIMATE", "Digging practice!"},
{"Big Bang", "EASY", "All-spin tutorial!\n[Under construction]"}, ["bigbang"]= {"Big Bang", "EASY", "All-spin tutorial!\n[Under construction]"},
{"C4W Training", "NORMAL", "Infinite combos."}, ["c4wtrain_normal"]= {"C4W Training", "NORMAL", "Infinite combos."},
{"C4W Training", "LUNATIC", "Infinite combos."}, ["c4wtrain_lunatic"]= {"C4W Training", "LUNATIC", "Infinite combos."},
{"PC Training", "NORMAL", "Simple Perfect Clear mode."}, ["pctrain_normal"]= {"PC Training", "NORMAL", "Simple Perfect Clear mode."},
{"PC Training", "LUNATIC", "Simple Perfect Clear mode."}, ["pctrain_lunatic"]= {"PC Training", "LUNATIC", "Simple Perfect Clear mode."},
{"PC Challenge", "NORMAL", "Get PCs within 100 lines!"}, ["pcchallenge_normal"]= {"PC Challenge", "NORMAL", "Get PCs within 100 lines!"},
{"PC Challenge", "HARD", "Get PCs within 100 lines!"}, ["pcchallenge_hard"]= {"PC Challenge", "HARD", "Get PCs within 100 lines!"},
{"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"}, ["pcchallenge_lunatic"]={"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"},
{"Tech", "NORMAL", "Keep the B2B chain!"}, ["tech_normal"]= {"Tech", "NORMAL", "Keep the B2B chain!"},
{"Tech", "NORMAL+", "Spin & PC only"}, ["tech_normal+"]= {"Tech", "NORMAL+", "Spin & PC only"},
{"Tech", "HARD", "Keep the B2B chain!"}, ["tech_hard"]= {"Tech", "HARD", "Keep the B2B chain!"},
{"Tech", "HARD+", "Spin & PC only"}, ["tech_hard+"]= {"Tech", "HARD+", "Spin & PC only"},
{"Tech", "LUNATIC", "Keep the B2B chain!"}, ["tech_lunatic"]= {"Tech", "LUNATIC", "Keep the B2B chain!"},
{"Tech", "LUNATIC+", "Spin & PC only"}, ["tech_lunatic+"]= {"Tech", "LUNATIC+", "Spin & PC only"},
{"Tech", "ULTIMATE", "No finesse faults!"}, ["tech_ultimate"]= {"Tech", "ULTIMATE", "No finesse faults!"},
{"Tech", "ULTIMATE+", "No normal clears, no finesse faults!"}, ["tech_ultimate+"]= {"Tech", "ULTIMATE+", "No normal clears, no finesse faults!"},
{"TSD Challenge", "EASY", "T-spin-doubles only!"}, ["tsd_easy"]= {"TSD Challenge", "EASY", "T-spin-doubles only!"},
{"TSD Challenge", "HARD", "T-spin-doubles only!"}, ["tsd_hard"]= {"TSD Challenge", "HARD", "T-spin-doubles only!"},
{"TSD Challenge", "ULTIMATE", "T-spin-doubles only!"}, ["tsd_ultimate"]= {"TSD Challenge", "ULTIMATE", "T-spin-doubles only!"},
{"Zen", "", "200 lines without a time limit."}, ["zen"]= {"Zen", "", "200 lines without a time limit."},
{"Ultra", "EXTRA", "Get the highest score within 2 min."}, ["ultra"]= {"Ultra", "EXTRA", "Get the highest score within 2 min."},
{"Infinite", "", "Sandbox mode."}, ["infinite"]= {"Infinite", "", "Sandbox mode."},
{"Infinite: Dig", "", "Dig, dig, dig."}, ["infinite_dig"]= {"Infinite: Dig", "", "Dig, dig, dig."},
{"Custom", "NORMAL", "Draw something then clear it!!"}, ["custom_clear"]= {"Custom", "NORMAL", "Draw something then clear it!!"},
{"Custom", "PUZZLE", "Draw something then stack it!!"}, ["custom_puzzle"]= {"Custom", "PUZZLE", "Draw something then stack it!!"},
{"Sprint", "Pentomino", "Puzzle-18"}, ["sprintPenta"]= {"Sprint", "Pentomino", "Puzzle-18"},
}, },
}, },
} }
@@ -1729,7 +1781,7 @@ local drawableTextLoad={
"anykey", "anykey",
"next","hold", "next","hold",
"win","finish","lose","pause", "win","finish","lose","pause",
"custom", "custom","sequence",
"setting_game", "setting_game",
"setting_video", "setting_video",
"setting_sound", "setting_sound",

View File

@@ -3,8 +3,8 @@
--https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows --https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows
local gc=love.graphics local gc=love.graphics
local C=gc.clear local C=gc.clear
local shadowMapShader=gc.newShader("shader/shadowMap.glsl")--Shader for caculating the 1D shadow map. local shadowMapShader=gc.newShader("Zframework/shader/shadowMap.glsl")--Shader for caculating the 1D shadow map.
local lightRenderShader=gc.newShader("shader/lightRender.glsl")--Shader for rendering blurred lights and shadows. local lightRenderShader=gc.newShader("Zframework/shader/lightRender.glsl")--Shader for rendering blurred lights and shadows.
local Lights={}--Lightsource objects local Lights={}--Lightsource objects
local function move(L,x,y) local function move(L,x,y)
L.x,L.y=x,y L.x,L.y=x,y

View File

@@ -152,59 +152,60 @@ function Pnt.mode()
gc.scale(cam.zoomK) gc.scale(cam.zoomK)
gc.translate(-cam.x1,-cam.y1) gc.translate(-cam.x1,-cam.y1)
gc.scale(cam.k1) gc.scale(cam.k1)
local MM=Modes
local R=modeRanks local R=modeRanks
local sel=cam.sel local sel=cam.sel
setFont(30) setFont(30)
for _=1,#MM do
local M=MM[_] gc.setLineWidth(8)
if R[_]then gc.setColor(1,1,1,.2)
gc.setLineWidth(8) for name,M in next,Modes do
gc.setColor(1,1,1,.2) if R[name]then
for _=1,#M.unlock do for _=1,#M.unlock do
local m=M.unlock[_] local m=Modes[M.unlock[_]]
m=MM[m]
gc.line(M.x,M.y,m.x,m.y) gc.line(M.x,M.y,m.x,m.y)
end end
end
end--lines connecting modes
for name,M in next,Modes do
if R[name]then
local S=M.size local S=M.size
local d=((M.x-(cam.x1+(sel and -180 or 0))/cam.k1)^2+(M.y-cam.y1/cam.k1)^2)^.55 local d=((M.x-(cam.x1+(sel and -180 or 0))/cam.k1)^2+(M.y-cam.y1/cam.k1)^2)^.55
if d<500 then S=S*(1.25-d*0.0005) end if d<500 then S=S*(1.25-d*0.0005) end
local c=modeRankColor[modeRanks[M.id]] local c=modeRankColor[R[M.name]]
if c then if c then
gc.setColor(c) gc.setColor(c)
else else
c=.5+sin(Timer()*6.26-_)*.2 c=.5+sin(Timer()*6.26)*.2
S=S*(.9+c*.4) S=S*(.9+c*.4)
gc.setColor(c,c,c) gc.setColor(c,c,c)
end end
if M.shape==1 then--Rectangle if M.shape==1 then--Rectangle
gc.rectangle("fill",M.x-S,M.y-S,2*S,2*S) gc.rectangle("fill",M.x-S,M.y-S,2*S,2*S)
if sel==_ then if sel==name then
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.setLineWidth(10) gc.setLineWidth(10)
gc.rectangle("line",M.x-S+5,M.y-S+5,2*S-10,2*S-10) gc.rectangle("line",M.x-S+5,M.y-S+5,2*S-10,2*S-10)
end end
elseif M.shape==2 then--diamond elseif M.shape==2 then--diamond
gc.circle("fill",M.x,M.y,S+5,4) gc.circle("fill",M.x,M.y,S+5,4)
if sel==_ then if sel==name then
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.setLineWidth(10) gc.setLineWidth(10)
gc.circle("line",M.x,M.y,S+5,4) gc.circle("line",M.x,M.y,S+5,4)
end end
elseif M.shape==3 then--Octagon elseif M.shape==3 then--Octagon
gc.circle("fill",M.x,M.y,S,8) gc.circle("fill",M.x,M.y,S,8)
if sel==_ then if sel==name then
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.setLineWidth(10) gc.setLineWidth(10)
gc.circle("line",M.x,M.y,S,8) gc.circle("line",M.x,M.y,S,8)
end end
end end
_=drawableText[rankString[modeRanks[M.id]]] name=drawableText[rankString[R[M.name]]]
if _ then if name then
local dx,dy=6.26*sin(Timer()*0.626+M.id),6.6*sin(Timer()+M.id)
gc.setColor(0,0,0,.26) gc.setColor(0,0,0,.26)
mDraw(_,M.x+dx*1.5,M.y+dy*1.5) mDraw(name,M.x,M.y)
end end
--[[ --[[
if M.icon then if M.icon then
@@ -224,7 +225,7 @@ function Pnt.mode()
end end
gc.pop() gc.pop()
if sel then if sel then
local M=MM[sel] local M=Modes[sel]
local lang=setting.lang local lang=setting.lang
gc.setColor(.7,.7,.7,.5) gc.setColor(.7,.7,.7,.5)
gc.rectangle("fill",920,0,360,720)--Info board gc.rectangle("fill",920,0,360,720)--Info board
@@ -293,21 +294,40 @@ function Pnt.music()
end end
function Pnt.custom() function Pnt.custom()
gc.setColor(1,1,1,.3+sin(Timer()*8)*.2) gc.setColor(1,1,1,.3+sin(Timer()*8)*.2)
gc.rectangle("fill",25,95+40*sceneTemp,480,40) gc.rectangle("fill",100,115+40*sceneTemp,570,40)
gc.setColor(.7,.7,.7)gc.draw(drawableText.custom,20,20) gc.setColor(.7,.7,.7)gc.draw(drawableText.custom,360,20)
gc.setColor(1,1,1)gc.draw(drawableText.custom,22,23) gc.setColor(1,1,1)gc.draw(drawableText.custom,362,23)
setFont(35) setFont(35)
for i=1,#customID do for i=1,#customID do
local k=customID[i] local k=customID[i]
local y=90+40*i local y=110+40*i
gc.printf(text.customOption[k],15,y,320,"right") gc.printf(text.customOption[k],100,y,320,"right")
if text.customVal[k]then if text.customVal[k]then
gc.print(text.customVal[k][customSel[i]],335,y) gc.print(text.customVal[k][customSel[i]],440,y)
else else
gc.print(customRange[k][customSel[i]],335,y) gc.print(customRange[k][customSel[i]],440,y)
end end
end end
end end
function Pnt.sequence()
gc.setColor(.7,.7,.7)gc.draw(drawableText.sequence,120,-15)
gc.setColor(1,1,1)gc.draw(drawableText.sequence,122,-12)
gc.setLineWidth(4)
gc.rectangle("line",100,100,1080,260)
setFont(30)
for i=1,#preBag do
gc.print(preBag[i],100+30*i,110)
end
setFont(40)
gc.print(sceneTemp.cur,120,300)
--Confirm reset
if sceneTemp.sure>0 then
gc.setColor(1,1,1,sceneTemp.sure*.02)
gc.draw(drawableText.question,1035,570)
end
end
function Pnt.draw() function Pnt.draw()
local sx,sy=sceneTemp.x,sceneTemp.y local sx,sy=sceneTemp.x,sceneTemp.y
gc.translate(200,60) gc.translate(200,60)
@@ -333,6 +353,8 @@ function Pnt.draw()
gc.rectangle("line",30*sx-30,600-30*sy,30,30) gc.rectangle("line",30*sx-30,600-30*sy,30,30)
end end
gc.translate(-200,-60) gc.translate(-200,-60)
--Pen
local pen=sceneTemp.pen local pen=sceneTemp.pen
if pen>0 then if pen>0 then
gc.setLineWidth(13) gc.setLineWidth(13)
@@ -344,10 +366,14 @@ function Pnt.draw()
gc.line(575,470,625,520) gc.line(575,470,625,520)
gc.line(575,520,625,470) gc.line(575,520,625,470)
end end
--Confirm reset
if sceneTemp.sure>0 then if sceneTemp.sure>0 then
gc.setColor(1,1,1,sceneTemp.sure*.02) gc.setColor(1,1,1,sceneTemp.sure*.02)
gc.draw(drawableText.question,1040,430) gc.draw(drawableText.question,1040,430)
end end
--Block name
setFont(40) setFont(40)
local _ local _
for i=1,7 do for i=1,7 do
@@ -358,10 +384,13 @@ function Pnt.draw()
end end
function Pnt.play() function Pnt.play()
if marking then if marking then
setFont(36) setFont(26)
local x=game.frame*2%1800-260 local x=Timer()*46%1680-200
gc.setColor(1,1,1,abs(0.26*(1-x/640))-0.0626) gc.setColor(1,1,1,abs(.26*(1-x/640)))
mStr(text.marking,x,260+62*sin(Timer())) mStr(text.marking,x,260+62*sin(Timer()))
-- gc.setColor(1,1,1,.0626)
-- mStr(text.marking,260,62+26*sin(Timer()))
-- mStr(text.marking,1100,460+62*sin(Timer()*1.2))
end end
for p=1,#players do for p=1,#players do
players[p]:draw() players[p]:draw()
@@ -420,6 +449,13 @@ function Pnt.play()
end end
end end
end end
--Mode info
gc.setColor(1,1,1,.8)
gc.draw(drawableText.modeName,485,10)
gc.draw(drawableText.levelName,511+drawableText.modeName:getWidth(),10)
--Danger
gc.push("transform") gc.push("transform")
gc.origin() gc.origin()
if restartCount>0 then if restartCount>0 then

View File

@@ -79,6 +79,9 @@ function sceneInit.custom()
BG.set(customRange.bg[customSel[12]]) BG.set(customRange.bg[customSel[12]])
BGM.play(customRange.bgm[customSel[13]]) BGM.play(customRange.bgm[customSel[13]])
end end
function sceneInit.sequence()
sceneTemp={cur=#preBag,sure=0}
end
function sceneInit.draw() function sceneInit.draw()
BG.set("space") BG.set("space")
sceneTemp={ sceneTemp={
@@ -328,6 +331,9 @@ function SCN.swapTo(tar,style)
S.draw=swap[3] S.draw=swap[3]
end end
end end
function SCN.goto(tar,style)
SCN.push()SCN.swapTo(tar,style)
end
function SCN.back() function SCN.back()
if backFunc[SCN.cur] then backFunc[SCN.cur]()end if backFunc[SCN.cur] then backFunc[SCN.cur]()end
--func when scene end --func when scene end

View File

@@ -1,8 +1,8 @@
local function N(file) local function N(file)
return love.graphics.newShader("shader/"..file..".glsl") return love.graphics.newShader("Zframework/shader/"..file..".glsl")
end end
return{ return{
-- glow=gc.newShader("shader/glow.cs"), -- glow=gc.newShader("Zframework/shader/glow.cs"),
alpha=N("alpha"), alpha=N("alpha"),
warning=N("warning"), warning=N("warning"),

View File

@@ -37,6 +37,6 @@ vec4 effect(vec4 color,Image text,vec2 pos,vec2 scr_pos){
dx=sqrt(dx*dx+dy*dy); dx=sqrt(dx*dx+dy*dy);
V.gb+=vec2(smoothstep(0.626,0.,dx)); V.gb+=vec2(smoothstep(0.626,0.,dx));
dx=1.26*max(max(V.r,V.g),V.b); dx=1.626*max(max(V.r,V.g),V.b);
return vec4(V/dx,1.); return vec4(V/dx,1.);
} }

View File

@@ -1,5 +1,4 @@
local rem=table.remove local rem=table.remove
local tasks={} local tasks={}
local TASK={} local TASK={}
@@ -48,12 +47,6 @@ function TASK.clear(opt)
tasks[i]=nil tasks[i]=nil
i=i-1 i=i-1
end end
elseif opt=="play"then
for i=#tasks,1,-1 do
if tasks[i].P then
rem(tasks,i)
end
end
else--Player table else--Player table
for i=#tasks,1,-1 do for i=#tasks,1,-1 do
if tasks[i].P==opt then if tasks[i].P==opt then

View File

@@ -18,13 +18,13 @@ function Tmr.load()
elseif S.phase==4 then elseif S.phase==4 then
IMG.loadOne(S.cur) IMG.loadOne(S.cur)
elseif S.phase==5 then elseif S.phase==5 then
local m=Modes[S.cur] local m=Modes[S.cur]--mode template
Modes[S.cur]=require("modes/"..m[1]) local M=require("modes/"..m.name)--mode file
local M=Modes[S.cur] Modes[m.name]=M
M.saveFileName,M.id=m[1],m.id for k,v in next,m do
M.x,M.y,M.size,M.shape=m.x,m.y,m.size,m.shape M[k]=v
M.unlock=m.unlock end
M.records=FILE.loadRecord(m[1])or M.score and{} M.records=FILE.loadRecord(m.name)or M.score and{}
-- M.icon=gc.newImage("image/modeIcon/"..m.icon..".png") -- M.icon=gc.newImage("image/modeIcon/"..m.icon..".png")
-- M.icon=gc.newImage("image/modeIcon/custom.png") -- M.icon=gc.newImage("image/modeIcon/custom.png")
elseif S.phase==6 then elseif S.phase==6 then
@@ -105,21 +105,19 @@ function Tmr.mode(dt)
cam.keyCtrl=true cam.keyCtrl=true
end end
local x,y=(cam.x1-180)/cam.k1,cam.y1/cam.k1 local x,y=(cam.x1-180)/cam.k1,cam.y1/cam.k1
local MM,R=Modes,modeRanks for name,M in next,Modes do
for _=1,#MM do if modeRanks[name]then
if R[_]then local SEL
local __
local M=MM[_]
local s=M.size local s=M.size
if M.shape==1 then if M.shape==1 then
if x>M.x-s and x<M.x+s and y>M.y-s and y<M.y+s then __=_ end if x>M.x-s and x<M.x+s and y>M.y-s and y<M.y+s then SEL=name end
elseif M.shape==2 then elseif M.shape==2 then
if abs(x-M.x)+abs(y-M.y)<s then __=_ end if abs(x-M.x)+abs(y-M.y)<s then SEL=name end
elseif M.shape==3 then elseif M.shape==3 then
if(x-M.x)^2+(y-M.y)^2<s^2 then __=_ end if(x-M.x)^2+(y-M.y)^2<s^2 then SEL=name end
end end
if __ and cam.sel~=__ then if SEL and cam.sel~=SEL then
cam.sel=__ cam.sel=SEL
SFX.play("click") SFX.play("click")
end end
end end
@@ -154,6 +152,9 @@ function Tmr.mode(dt)
cam.zoomK=cam.zoomK^.9 cam.zoomK=cam.zoomK^.9
end end
end end
function Tmr.sequence()
if sceneTemp.sure>0 then sceneTemp.sure=sceneTemp.sure-1 end
end
function Tmr.draw() function Tmr.draw()
if sceneTemp.sure>0 then sceneTemp.sure=sceneTemp.sure-1 end if sceneTemp.sure>0 then sceneTemp.sure=sceneTemp.sure-1 end
end end
@@ -239,8 +240,8 @@ function Tmr.play(dt)
if game.frame%26==0 and setting.warn then if game.frame%26==0 and setting.warn then
local F=P1.field local F=P1.field
local M=#F local M=#F
local height=0 local height=0--max height of row 4~7
for x=3,8 do for x=4,7 do
for y=M,1,-1 do for y=M,1,-1 do
if F[y][x]>0 then if F[y][x]>0 then
if y>height then if y>height then

View File

@@ -218,9 +218,6 @@ function WIDGET.press(x,y)
local W=WIDGET.sel local W=WIDGET.sel
if not W then return end if not W then return end
if W.type=="button"then if W.type=="button"then
for k,v in next,W do
print(k,v)
end
W.code() W.code()
W:FX() W:FX()
SFX.play("button") SFX.play("button")

View File

@@ -1,3 +1,4 @@
local ins,rem=table.insert,table.remove
local mobileHide=(system=="Android"or system=="iOS")and function()return true end local mobileHide=(system=="Android"or system=="iOS")and function()return true end
local function BACK()SCN.back()end local function BACK()SCN.back()end
local virtualkeySet={ local virtualkeySet={
@@ -85,46 +86,84 @@ local function nextDir(n) return function()SKIN.rotate(n) end end
local function VKAdisp(n) return function()return VK_org[n].ava end end local function VKAdisp(n) return function()return VK_org[n].ava end end
local function VKAcode(n) return function()VK_org[n].ava=not VK_org[n].ava end end local function VKAcode(n) return function()VK_org[n].ava=not VK_org[n].ava end end
local function setLang(n) return function()LANG.set(n)setting.lang=n end end local function setLang(n) return function()LANG.set(n)setting.lang=n end end
local function SEQpush(n) return function()local C=sceneTemp.cur+1 ins(preBag,C,n)sceneTemp.cur=C end end
local newButton,newSwitch,newSlider=WIDGET.new.button,WIDGET.new.switch,WIDGET.new.slider local newButton,newSwitch,newSlider=WIDGET.new.button,WIDGET.new.switch,WIDGET.new.slider
local C=color local C=color
local Widgets={ local Widgets={
load={},intro={},quit={}, load={},intro={},quit={},
main={ main={
play= newButton(150,280,200,160,C.lightRed, 55,function()SCN.push()SCN.swapTo("mode")end, nil,"setting"), play= newButton(150,280,200,160,C.lightRed, 55,function()SCN.goto("mode")end, nil,"setting"),
setting=newButton(370,280,200,160,C.lightBlue, 45,function()SCN.push()SCN.swapTo("setting_game")end, nil,"music"), setting=newButton(370,280,200,160,C.lightBlue, 45,function()SCN.goto("setting_game")end, nil,"music"),
music= newButton(590,280,200,160,C.lightPurple, 32,function()SCN.push()SCN.swapTo("music")end, nil,"help"), music= newButton(590,280,200,160,C.lightPurple, 32,function()SCN.goto("music")end, nil,"help"),
help= newButton(150,460,200,160,C.lightYellow, 50,function()SCN.push()SCN.swapTo("help")end, nil,"stat"), help= newButton(150,460,200,160,C.lightYellow, 50,function()SCN.goto("help")end, nil,"stat"),
stat= newButton(370,460,200,160,C.lightCyan, 43,function()SCN.push()SCN.swapTo("stat")end, nil,"qplay"), stat= newButton(370,460,200,160,C.lightCyan, 43,function()SCN.goto("stat")end, nil,"qplay"),
qplay= newButton(590,460,200,160,C.lightOrange, 43,function()SCN.push()loadGame(stat.lastPlay)end, nil,"lang"), qplay= newButton(590,460,200,160,C.lightOrange, 43,function()SCN.push()loadGame(stat.lastPlay)end, nil,"lang"),
lang= newButton(150,610,160,100,C.lightGreen, 45,function()SCN.push()SCN.swapTo("setting_lang")end, nil,"quit"), lang= newButton(150,610,160,100,C.lightGreen, 45,function()SCN.goto("setting_lang")end, nil,"quit"),
quit= newButton(590,610,160,100,C.lightGrey, 45,function()VOC.play("bye")SCN.swapTo("quit","slowFade")end,nil,"play"), quit= newButton(590,610,160,100,C.lightGrey, 45,function()VOC.play("bye")SCN.swapTo("quit","slowFade")end,nil,"play"),
}, },
mode={ mode={
draw= newButton(1100, 440,240,90,C.lightYellow, 40,function()SCN.push()SCN.swapTo("draw")end,function()return mapCam.sel~=71 and mapCam.sel~=72 end), setting=newButton(1100, 540,240,90,C.lightGreen, 40,function()SCN.goto("custom")end,function()return mapCam.sel~="custom_clear" and mapCam.sel~="custom_puzzle" end),
custom= newButton(1100, 540,240,90,C.lightGreen, 40,function()SCN.push()SCN.swapTo("custom")end,function()return mapCam.sel~=71 and mapCam.sel~=72 end),
start= newButton(1040, 655,180,80,C.lightGrey, 40,function()if mapCam.sel then SCN.push()loadGame(mapCam.sel)end end,function()return not mapCam.sel end), start= newButton(1040, 655,180,80,C.lightGrey, 40,function()if mapCam.sel then SCN.push()loadGame(mapCam.sel)end end,function()return not mapCam.sel end),
back= newButton(1200, 655,120,80,C.white, 40,BACK), back= newButton(1200, 655,120,80,C.white, 40,BACK),
--function()SCN.push()SCN.swapTo("custom")end
}, },
music={ music={
bgm= newSlider(760, 80,400,10,35,function()BGM.freshVolume()end,SETval("bgm"),SETsto("bgm")), bgm= newSlider(760, 80,400,10,35,function()BGM.freshVolume()end,SETval("bgm"),SETsto("bgm")),
up= newButton(1100, 200,120,120,C.white,55,pressKey("up")), up= newButton(1100, 200,120,120,C.white, 55,pressKey("up")),
play= newButton(1100, 340,120,120,C.white,35,pressKey("space"),function()return setting.bgm==0 end), play= newButton(1100, 340,120,120,C.white, 35,pressKey("space"),function()return setting.bgm==0 end),
down= newButton(1100, 480,120,120,C.white,55,pressKey("down")), down= newButton(1100, 480,120,120,C.white, 55,pressKey("down")),
back= newButton(640, 630,230,90, C.white,40,BACK), back= newButton(640, 630,230,90, C.white, 40,BACK),
}, },
custom={ custom={
up= newButton(1000, 360,100,100,C.white, 45,function()sceneTemp=(sceneTemp-2)%#customID+1 end), up= newButton(1140, 100,100,100,C.white, 45,function()sceneTemp=(sceneTemp-2)%#customID+1 end),
down= newButton(1000, 600,100,100,C.white, 45,function()sceneTemp=sceneTemp%#customID+1 end), down= newButton(1140, 340,100,100,C.white, 45,function()sceneTemp=sceneTemp%#customID+1 end),
left= newButton(880, 480,100,100,C.white, 45,pressKey("left")), left= newButton(1080, 220,100,100,C.white, 45,pressKey("left")),
right= newButton(1120, 480,100,100,C.white, 45,pressKey("right")), right= newButton(1200, 220,100,100,C.white, 45,pressKey("right")),
set1= newButton(640, 160,240,75, C.lightYellow, 35,pressKey("1")),
set2= newButton(640, 250,240,75, C.lightYellow, 35,pressKey("2")), set1= newButton(940, 320,260,70, C.lightYellow, 32,pressKey("1")),
set3= newButton(640, 340,240,75, C.lightYellow, 35,pressKey("3")), set2= newButton(940, 400,260,70, C.lightYellow, 32,pressKey("2")),
set4= newButton(640, 430,240,75, C.lightYellow, 35,pressKey("4")), set3= newButton(940, 480,260,70, C.lightYellow, 32,pressKey("3")),
set5= newButton(640, 520,240,75, C.lightYellow, 35,pressKey("5")), set4= newButton(940, 560,260,70, C.lightYellow, 32,pressKey("4")),
back= newButton(640, 630,180,60, C.white, 35,BACK), set5= newButton(940, 640,260,70, C.lightYellow, 32,pressKey("5")),
seq= newButton(665, 415,162,40, C.lightGreen, 32,function()SCN.goto("sequence")end),
draw= newButton(150, 80, 220,80, C.white, 35,function()SCN.swapTo("draw")end),
back= newButton(1200, 640,120,120,C.white, 35,BACK),
},
sequence={
Z= newButton(150, 440,90, 90,C.white, 50,SEQpush(1)),
S= newButton(250, 440,90, 90,C.white, 50,SEQpush(2)),
J= newButton(350, 440,90, 90,C.white, 50,SEQpush(3)),
L= newButton(450, 440,90, 90,C.white, 50,SEQpush(4)),
T= newButton(550, 440,90, 90,C.white, 50,SEQpush(5)),
O= newButton(650, 440,90, 90,C.white, 50,SEQpush(6)),
I= newButton(750, 440,90, 90,C.white, 50,SEQpush(7)),
Z5= newButton(150, 540,90, 90,C.white, 50,SEQpush(8)),
S5= newButton(250, 540,90, 90,C.white, 50,SEQpush(9)),
P= newButton(350, 540,90, 90,C.white, 50,SEQpush(10)),
Q= newButton(450, 540,90, 90,C.white, 50,SEQpush(11)),
F= newButton(550, 540,90, 90,C.white, 50,SEQpush(12)),
E= newButton(650, 540,90, 90,C.white, 50,SEQpush(13)),
T5= newButton(750, 540,90, 90,C.white, 50,SEQpush(14)),
U= newButton(850, 540,90, 90,C.white, 50,SEQpush(15)),
V= newButton(950, 540,90, 90,C.white, 50,SEQpush(16)),
W= newButton(150, 640,90, 90,C.white, 50,SEQpush(17)),
X= newButton(250, 640,90, 90,C.white, 50,SEQpush(18)),
J5= newButton(350, 640,90, 90,C.white, 50,SEQpush(19)),
L5= newButton(450, 640,90, 90,C.white, 50,SEQpush(20)),
R= newButton(550, 640,90, 90,C.white, 50,SEQpush(21)),
Y= newButton(650, 640,90, 90,C.white, 50,SEQpush(22)),
N= newButton(750, 640,90, 90,C.white, 50,SEQpush(23)),
H= newButton(850, 640,90, 90,C.white, 50,SEQpush(24)),
I5= newButton(950, 640,90, 90,C.white, 50,SEQpush(25)),
left= newButton(850, 440,90, 90,C.green, 55,pressKey("left")),
right= newButton(950, 440,90, 90,C.green, 55,pressKey("right")),
backsp= newButton(1050, 440,90, 90,C.red, 50,pressKey("backspace")),
reset= newButton(1050, 540,90, 90,C.red, 50,pressKey("delete")),
back= newButton(1200, 640,120,120,C.white, 35,BACK),
}, },
draw={ draw={
b1= newButton(500+65*1, 150,58,58,C.red, 30,setPen(1)),--B1 b1= newButton(500+65*1, 150,58,58,C.red, 30,setPen(1)),--B1
@@ -152,6 +191,7 @@ local Widgets={
demo= newSwitch(755, 640,30,function()return sceneTemp.demo end,function()sceneTemp.demo=not sceneTemp.demo end), demo= newSwitch(755, 640,30,function()return sceneTemp.demo end,function()sceneTemp.demo=not sceneTemp.demo end),
copy= newButton(920, 640,120,120,C.lightRed, 35,copyBoard), copy= newButton(920, 640,120,120,C.lightRed, 35,copyBoard),
paste= newButton(1060, 640,120,120,C.lightBlue, 35,pasteBoard), paste= newButton(1060, 640,120,120,C.lightBlue, 35,pasteBoard),
custom= newButton(110, 80, 140,80, C.white, 35,function()SCN.goto("custom")end),
back= newButton(1200, 640,120,120,C.white, 35,BACK), back= newButton(1200, 640,120,120,C.white, 35,BACK),
}, },
play={ play={
@@ -160,28 +200,27 @@ local Widgets={
pause={ pause={
resume= newButton(640,290,240,100,C.white,30,function()resumeGame()end), resume= newButton(640,290,240,100,C.white,30,function()resumeGame()end),
restart=newButton(640,445,240,100,C.white,33,function() restart=newButton(640,445,240,100,C.white,33,function()
TASK.clear("play") TASK.removeTask_code(TICK.autoPause)
mergeStat(stat,players[1].stat) mergeStat(stat,players[1].stat)
resetGameData() resetGameData()
SCN.swapTo("play","none") SCN.swapTo("play","none")
end), end),
setting=newButton(1120,70,240,90,C.lightBlue,35,function() setting=newButton(1120,70,240,90,C.lightBlue,35,function()
SCN.push()SCN.swapTo("setting_sound") SCN.goto("setting_sound")
end), end),
quit= newButton(640,600,240,100,C.white,35,BACK), quit= newButton(640,600,240,100,C.white,35,BACK),
}, },
setting_game={ setting_game={
graphic=newButton(200,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_video")end, nil,"sound"), graphic=newButton(200,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_video")end, nil,"sound"),
sound= newButton(1080,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_sound")end, nil,"ctrl"), sound= newButton(1080,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_sound")end, nil,"ctrl"),
ctrl= newButton(290,220,320,80,C.lightYellow,35,function()SCN.push()SCN.swapTo("setting_control")end, nil,"key"), ctrl= newButton(290,220,320,80,C.lightYellow,35,function()SCN.goto("setting_control")end, nil,"key"),
key= newButton(640,220,320,80,C.lightGreen,35,function()SCN.push()SCN.swapTo("setting_key")end, nil,"touch"), key= newButton(640,220,320,80,C.lightGreen,35,function()SCN.goto("setting_key")end, nil,"touch"),
touch= newButton(990,220,320,80,C.lightBlue,35,function()SCN.push()SCN.swapTo("setting_touch")end, nil,"reTime"), touch= newButton(990,220,320,80,C.lightBlue,35,function()SCN.goto("setting_touch")end, nil,"reTime"),
reTime= newSlider(350,340,300,10,30,nil, SETval("reTime"), SETsto("reTime"), nil,"maxNext"), reTime= newSlider(350,340,300,10,30,nil, SETval("reTime"), SETsto("reTime"), nil,"maxNext"),
maxNext=newSlider(350,440,300,6,30,nil, SETval("maxNext"), SETsto("maxNext"), nil,"autoPause"), maxNext=newSlider(350,440,300,6,30,nil, SETval("maxNext"), SETsto("maxNext"), nil,"autoPause"),
autoPause=newSwitch(350,540,20, SETval("autoPause"), SETrev("autoPause"), nil,"layout"), autoPause=newSwitch(350,540,20, SETval("autoPause"), SETrev("autoPause"), nil,"layout"),
layout= newButton(590,540,140,70,C.white,35,function() layout= newButton(590,540,140,70,C.white,35,function()
SCN.push() SCN.goto("setting_skin")
SCN.swapTo("setting_skin")
end,nil,"quickR"), end,nil,"quickR"),
quickR= newSwitch(1050,340,35, SETval("quickR"), SETrev("quickR"), nil,"swap"), quickR= newSwitch(1050,340,35, SETval("quickR"), SETrev("quickR"), nil,"swap"),
swap= newSwitch(1050,440,19, SETval("swap"), SETrev("swap"), nil,"fine"), swap= newSwitch(1050,440,19, SETval("swap"), SETrev("swap"), nil,"fine"),
@@ -308,8 +347,7 @@ local Widgets={
sceneTemp.snap=sceneTemp.snap%6+1 sceneTemp.snap=sceneTemp.snap%6+1
end), end),
option= newButton(520,180,170,80,C.white,40,function() option= newButton(520,180,170,80,C.white,40,function()
SCN.push() SCN.goto("setting_touchSwitch")
SCN.swapTo("setting_touchSwitch")
end), end),
back= newButton(760,180,170,80,C.white,40,BACK), back= newButton(760,180,170,80,C.white,40,BACK),
size= newSlider(450,265,460,14,40,nil,function() size= newSlider(450,265,460,14,40,nil,function()
@@ -351,8 +389,7 @@ local Widgets={
vib= newSlider(800,460,180,2,40,function()VIB(setting.VKVIB)end,SETval("VKVIB"),SETsto("VKVIB")), vib= newSlider(800,460,180,2,40,function()VIB(setting.VKVIB)end,SETval("VKVIB"),SETsto("VKVIB")),
icon= newSwitch(850,300, 40,SETval("VKIcon"),SETrev("VKIcon")), icon= newSwitch(850,300, 40,SETval("VKIcon"),SETrev("VKIcon")),
tkset= newButton(1120,420,240,80,C.white,32,function() tkset= newButton(1120,420,240,80,C.white,32,function()
SCN.push() SCN.goto("setting_trackSetting")
SCN.swapTo("setting_trackSetting")
end,function()return not setting.VKTrack end), end,function()return not setting.VKTrack end),
alpha= newSlider(840,540,400,10,40,nil,SETval("VKAlpha"),SETsto("VKAlpha")), alpha= newSlider(840,540,400,10,40,nil,SETval("VKAlpha"),SETsto("VKAlpha")),
back= newButton(1120,620,200,80,C.white,45,BACK), back= newButton(1120,620,200,80,C.white,45,BACK),
@@ -371,8 +408,8 @@ local Widgets={
back= newButton(640,600,200,80,C.white,40,BACK,nil,"chi"), back= newButton(640,600,200,80,C.white,40,BACK,nil,"chi"),
}, },
help={ help={
staff= newButton(980,500,150,80,C.white,32,function()SCN.push()SCN.swapTo("staff")end,nil,"his"), staff= newButton(980,500,150,80,C.white,32,function()SCN.goto("staff")end,nil,"his"),
his= newButton(1160,500,150,80,C.white,32,function()SCN.push()SCN.swapTo("history")end,nil,"qq"), his= newButton(1160,500,150,80,C.white,32,function()SCN.goto("history")end,nil,"qq"),
qq= newButton(980,600,150,80,C.white,32,function()love.system.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,mobileHide,"back"), qq= newButton(980,600,150,80,C.white,32,function()love.system.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,mobileHide,"back"),
back= newButton(640,600,200,80,C.white,40,BACK,nil,"staff"), back= newButton(640,600,200,80,C.white,40,BACK,nil,"staff"),
}, },

View File

@@ -26,8 +26,11 @@ mapCam={
--for auto zooming when enter/leave scene --for auto zooming when enter/leave scene
} }
scr={x=0,y=0,w=0,h=0,rad=0,k=1}--wid,hei,radius,scale K scr={x=0,y=0,w=0,h=0,rad=0,k=1}--wid,hei,radius,scale K
customSel={1,22,1,1,7,3,1,1,8,4,1,1,1} customSel={1,22,1,1,7,3,1,1,8,4,1,1,1}
preField={h=20}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end preField={h=20}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
preBag={1,2,3,4,5,6,7}
players={alive={},human=0} players={alive={},human=0}
--blockSkin,blockSkinMini={},{}--redefined in SKIN.change --blockSkin,blockSkinMini={},{}--redefined in SKIN.change
@@ -47,11 +50,11 @@ SKIN= require("parts/skin")
PLY= require("parts/player") PLY= require("parts/player")
AIfunc= require("parts/ai") AIfunc= require("parts/ai")
Modes= require("parts/modes") Modes= require("parts/modes")
TICK= require("parts/tick")
--load files & settings --load files & settings
modeRanks={}for i=1,#Modes do modeRanks[i]=false assert(i==Modes[i].id,"ModeID error:"..i)end modeRanks={sprint_10=0}
modeRanks[1]=0
local fs=love.filesystem local fs=love.filesystem
if fs.getInfo("keymap.dat")then fs.remove("keymap.dat")end if fs.getInfo("keymap.dat")then fs.remove("keymap.dat")end
@@ -149,6 +152,12 @@ while #modeRanks>73 do
table.remove(modeRanks) table.remove(modeRanks)
end end
if modeRanks[73]==6 then modeRanks[73]=0 end if modeRanks[73]==6 then modeRanks[73]=0 end
if modeRanks[1]then--rename key of modeRanks
local L=modeRanks
for i=1,#L do
L[Modes[i].name],L[i]=L[i]
end
end
if setting.skin[10]==5 then if setting.skin[10]==5 then
setting.skin[10],setting.skin[11]=1,5 setting.skin[10],setting.skin[11]=1,5
end end

View File

@@ -12,6 +12,7 @@ return{
end end
modeEnv._20G=modeEnv.drop==0 modeEnv._20G=modeEnv.drop==0
modeEnv.oncehold=customSel[6]==1 modeEnv.oncehold=customSel[6]==1
modeEnv.bag=preBag
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
local L=modeEnv.opponent local L=modeEnv.opponent
if L~=0 then if L~=0 then

View File

@@ -31,6 +31,7 @@ return{
end end
modeEnv._20G=modeEnv.drop==0 modeEnv._20G=modeEnv.drop==0
modeEnv.oncehold=customSel[6]==1 modeEnv.oncehold=customSel[6]==1
modeEnv.bag=preBag
modeEnv.target=0 modeEnv.target=0
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
local L=modeEnv.opponent local L=modeEnv.opponent

View File

@@ -36,7 +36,7 @@ return{
color=color.red, color=color.red,
env={ env={
noFly=true, noFly=true,
mindas=6,minarr=1, das=6,arr=1,
_20G=true, _20G=true,
lock=death_lock[1], lock=death_lock[1],
wait=death_wait[1], wait=death_wait[1],

View File

@@ -12,12 +12,12 @@ local function score(P)
if MD.point%100==99 then SFX.play("blip_1")end if MD.point%100==99 then SFX.play("blip_1")end
if int(MD.point*.01)>MD.event then if int(MD.point*.01)>MD.event then
local s=MD.event+1;MD.event=s--level up! local s=MD.event+1;MD.event=s--level up!
P:showTextF(text.stage(s),0,-120,80,"fly")
local E=P.gameEnv local E=P.gameEnv
if s<4 then--first 300 if s<4 then--first 300
if s~=1 then E.lock=E.lock-1 end if s~=1 then E.lock=E.lock-1 end
if s~=2 then E.wait=E.wait-1 end if s~=2 then E.wait=E.wait-1 end
if s~=3 then E.fall=E.fall-1 end if s~=3 then E.fall=E.fall-1 end
P:showTextF(text.stage(s),0,-120,80,"fly")
elseif s<10 then elseif s<10 then
if s==4 or s==7 then E.das=E.das-1 end if s==4 or s==7 then E.das=E.das-1 end
s=s%3 s=s%3
@@ -25,6 +25,7 @@ local function score(P)
elseif s==1 then E.wait=E.wait-1 elseif s==1 then E.wait=E.wait-1
elseif s==2 then E.fall=E.fall-1 elseif s==2 then E.fall=E.fall-1
end end
P:showTextF(text.stage(s),0,-120,80,"fly")
else else
MD.point,MD.event=1000,9 MD.point,MD.event=1000,9
P:win("finish") P:win("finish")
@@ -37,7 +38,7 @@ return{
color=color.lightGrey, color=color.lightGrey,
env={ env={
noFly=true, noFly=true,
mindas=5,minarr=1, das=5,arr=1,
_20G=true,lock=12, _20G=true,lock=12,
wait=10,fall=10, wait=10,fall=10,
dropPiece=score, dropPiece=score,

View File

@@ -5,7 +5,7 @@ local function check_tsd(P)
elseif #P.clearedRow>0 then elseif #P.clearedRow>0 then
P.modeData.event=P.modeData.event+1 P.modeData.event=P.modeData.event+1
if P.modeData.event==20 then if P.modeData.event==20 then
P:win() P:win("finish")
end end
end end
end end

View File

@@ -205,7 +205,7 @@ return{
end end
local best={x=1,dir=0,hold=false,score=-1e99} local best={x=1,dir=0,hold=false,score=-1e99}
for ifhold=0,P.gameEnv.hold and 1 or 0 do for ifhold=0,P.gameEnv.hold and 1 or 0 do
local bn=ifhold==0 and P.cur.id or P.hd.id>0 and P.hd.id or P.next[1].id local bn=ifhold==0 and P.cur.id or P.hd and P.hd.id or P.next[1]and P.next[1].id
for dir=0,dirCount[bn] do--each dir for dir=0,dirCount[bn] do--each dir
local cb=blocks[bn][dir] local cb=blocks[bn][dir]
for cx=1,11-#cb[1]do--each pos for cx=1,11-#cb[1]do--each pos

View File

@@ -63,7 +63,7 @@ s={
clear={},clear_B={},clear_S={0,0,0,0,0}, clear={},clear_B={},clear_S={0,0,0,0,0},
spin={},spin_B={},spin_S={0,0,0,0,0}, spin={},spin_B={},spin_S={0,0,0,0,0},
pc=0,hpc=0,b2b=0,b3b=0,score=0, pc=0,hpc=0,b2b=0,b3b=0,score=0,
lastPlay=1,--last played mode ID lastPlay="sprint_10",--last played mode ID
} }
for i=1,25 do for i=1,25 do
s.clear_B[i]=0 s.clear_B[i]=0

View File

@@ -97,7 +97,7 @@ function pasteBoard()
p=p+1 p=p+1
end end
for y=fY+1,20 do for y=fY,20 do
for x=1,10 do for x=1,10 do
preField[y][x]=0 preField[y][x]=0
end end
@@ -211,6 +211,7 @@ function resumeGame()
SCN.swapTo("play","none") SCN.swapTo("play","none")
end end
function loadGame(M) function loadGame(M)
print(M)
--rec={} --rec={}
stat.lastPlay=M stat.lastPlay=M
curMode=Modes[M] curMode=Modes[M]

View File

@@ -70,7 +70,7 @@ local XspinList={
local TRS={ local TRS={
{ {
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1, 2},{ 0, 1}}, [01]={{-1, 0},{-1, 1},{ 0,-2},{-1, 2},{ 0, 1}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1,-1},{ 1,-2}}, [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1,-2},{ 1,-2}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-1},{ 1,-2}}, [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-1},{ 1,-2}},
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}}, [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}},
[12]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}}, [12]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}},
@@ -91,7 +91,7 @@ local TRS={
[12]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-1},{ 0, 2},{ 1, 2}}, [12]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-1},{ 0, 2},{ 1, 2}},
[21]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{-1,-2}}, [21]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{-1,-2}},
[32]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{-1, 1}}, [32]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{-1, 1}},
[23]={{ 1, 0},{ 1,-1},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-1}}, [23]={{ 1, 0},{ 1,-1},{ 1, 1},{ 0,-2},{ 1,-2}},
[02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}}, [02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}},
[20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}}, [20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0}}, [13]={{ 0,-1},{ 0, 1},{ 1, 0}},
@@ -104,9 +104,9 @@ local TRS={
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}}, [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}}, [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}},
[12]={{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},{ 0, 2},{ 1, 2}}, [12]={{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},{ 0, 2},{ 1, 2}},
[21]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{ 1, 1}}, [21]={{-1, 0},{ 0,-2},{-1,-2},{ 1, 1}},
[32]={{-1, 0},{-1,-1},{ 0,-1},{ 1,-1},{ 0, 2},{-1, 2}}, [32]={{-1, 0},{-1,-1},{ 0,-1},{ 1,-1},{ 0, 2},{-1, 2}},
[23]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{-1, 1}}, [23]={{ 1, 0},{ 0,-2},{ 1,-2},{-1, 1}},
[02]={{-1, 0},{ 1, 0},{ 0, 1}}, [02]={{-1, 0},{ 1, 0},{ 0, 1}},
[20]={{ 1, 0},{-1, 0},{ 0,-1}}, [20]={{ 1, 0},{-1, 0},{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0},{ 0,-2},{ 0, 2}}, [13]={{ 0,-1},{ 0, 1},{ 1, 0},{ 0,-2},{ 0, 2}},
@@ -217,10 +217,10 @@ local TRS={
[10]={{ 1, 0},{ 1,-1}}, [10]={{ 1, 0},{ 1,-1}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-1},{ 1,-2}}, [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-1},{ 1,-2}},
[30]={{-1, 0},{-1,-1}}, [30]={{-1, 0},{-1,-1}},
[12]={{ 1, 0},{ 1, 1}}, [12]={{ 1, 0},{ 1,-1},{ 1, 1}},
[21]={{-1,-1},{-1, 1}}, [21]={{-1,-1},{-1, 1},{-1,-1}},
[32]={{-1, 0},{-1, 1}}, [32]={{-1, 0},{-1,-1},{-1, 1}},
[23]={{ 1,-1},{ 1, 1}}, [23]={{ 1,-1},{ 1, 1},{ 1,-1}},
[02]={{ 0, 1}}, [02]={{ 0, 1}},
[20]={{ 0,-1}}, [20]={{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0}}, [13]={{ 0,-1},{ 0, 1},{ 1, 0}},
@@ -286,7 +286,7 @@ local TRS={
{},--L5 {},--L5
{ {
[01]={{-1, 0},{-1, 1},{ 1, 0},{-1, 2},{-1,-1},{ 0,-3},{ 0, 1}}, [01]={{-1, 0},{-1, 1},{ 1, 0},{-1, 2},{-1,-1},{ 0,-3},{ 0, 1}},
[10]={{-1, 0},{ 1,-1},{-1, 0},{ 1,-2},{ 1, 1},{ 0, 3},{ 0, 1}}, [10]={{-1, 0},{ 1,-1},{ 1, 0},{ 1,-2},{ 1, 1},{ 0, 3},{ 0, 1}},
[03]={{ 0,-1},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}}, [03]={{ 0,-1},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}},
[30]={{ 0, 1},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}}, [30]={{ 0, 1},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}},
[12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}}, [12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}},

View File

@@ -15,7 +15,7 @@ customRange={
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
next={0,1,2,3,4,5,6}, next={0,1,2,3,4,5,6},
hold={true,false,true}, hold={true,false,true},
sequence={"bag","his4","rnd"}, sequence={"bag","his4","rnd","loop","fixed"},
visible={"show","time","fast","none"}, visible={"show","time","fast","none"},
target={10,20,40,100,200,500,1000,1e99}, target={10,20,40,100,200,500,1000,1e99},
freshLimit={0,8,15,1e99}, freshLimit={0,8,15,1e99},

View File

@@ -1,85 +1,85 @@
return{ return{
{"sprint_10", id=1, x=0, y=0, size=35,shape=1,icon="sprint", unlock={2,3}}, {name="sprint_10", x=0, y=0, size=35,shape=1,icon="sprint", unlock={"sprint_20","sprint_40"}},
{"sprint_20", id=2, x=-300, y=0, size=45,shape=1,icon="sprint", unlock={}}, {name="sprint_20", x=-300, y=0, size=45,shape=1,icon="sprint", unlock={}},
{"sprint_40", id=3, x=0, y=-400, size=55,shape=1,icon="sprint", unlock={4,9,71,72,73}}, {name="sprint_40", x=0, y=-400, size=55,shape=1,icon="sprint", unlock={"sprint_100","marathon_normal","custom_clear","custom_puzzle","sprintPenta"}},
{"sprint_100", id=4, x=-200, y=-400, size=45,shape=1,icon="sprint", unlock={5,7}}, {name="sprint_100", x=-200, y=-400, size=45,shape=1,icon="sprint", unlock={"sprint_400","drought_normal"}},
{"sprint_400", id=5, x=-400, y=-400, size=35,shape=1,icon="sprint", unlock={6}}, {name="sprint_400", x=-400, y=-400, size=35,shape=1,icon="sprint", unlock={"sprint_1000"}},
{"sprint_1000", id=6, x=-600, y=-400, size=35,shape=1,icon="sprint", unlock={}}, {name="sprint_1000", x=-600, y=-400, size=35,shape=1,icon="sprint", unlock={}},
{"drought_normal", id=7, x=-400, y=-200, size=35,shape=1,icon="noI", unlock={8}}, {name="drought_normal", x=-400, y=-200, size=35,shape=1,icon="noI", unlock={"drought_lunatic"}},
{"drought_lunatic", id=8, x=-600, y=-200, size=35,shape=1,icon="mess", unlock={}}, {name="drought_lunatic", x=-600, y=-200, size=35,shape=1,icon="mess", unlock={}},
{"marathon_normal", id=9, x=0, y=-600, size=55,shape=1,icon="flag", unlock={10,11,22,31,36,37,48,67}}, {name="marathon_normal", x=0, y=-600, size=55,shape=1,icon="flag", unlock={"marathon_hard","solo_1","round_1","blind_easy","classic_fast","survivor_easy","bigbang","zen"}},
{"marathon_hard", id=10, x=0, y=-800, size=45,shape=1,icon="flag", unlock={27}}, {name="marathon_hard", x=0, y=-800, size=45,shape=1,icon="flag", unlock={"master_beginner"}},
{"solo_1", id=11, x=-300, y=-1000, size=35,shape=1,icon="solo", unlock={12}}, {name="solo_1", x=-300, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_2"}},
{"solo_2", id=12, x=-500, y=-1000, size=35,shape=1,icon="solo", unlock={13}}, {name="solo_2", x=-500, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_3"}},
{"solo_3", id=13, x=-700, y=-1000, size=35,shape=1,icon="solo", unlock={14,16}}, {name="solo_3", x=-700, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_4","techmino49_easy"}},
{"solo_4", id=14, x=-900, y=-1000, size=35,shape=1,icon="solo", unlock={15}}, {name="solo_4", x=-900, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_5"}},
{"solo_5", id=15, x=-1100, y=-1000, size=35,shape=1,icon="solo", unlock={}}, {name="solo_5", x=-1100, y=-1000, size=35,shape=1,icon="solo", unlock={}},
{"techmino49_easy", id=16, x=-900, y=-1200, size=35,shape=1,icon="royale", unlock={17,19}}, {name="techmino49_easy", x=-900, y=-1200, size=35,shape=1,icon="royale", unlock={"techmino49_hard","techmino99_easy"}},
{"techmino49_hard", id=17, x=-900, y=-1400, size=35,shape=1,icon="royale", unlock={18}}, {name="techmino49_hard", x=-900, y=-1400, size=35,shape=1,icon="royale", unlock={"techmino49_ultimate"}},
{"techmino49_ultimate", id=18, x=-900, y=-1600, size=35,shape=1,icon="royale", unlock={}}, {name="techmino49_ultimate", x=-900, y=-1600, size=35,shape=1,icon="royale", unlock={}},
{"techmino99_easy", id=19, x=-1100, y=-1400, size=35,shape=1,icon="royale", unlock={20}}, {name="techmino99_easy", x=-1100, y=-1400, size=35,shape=1,icon="royale", unlock={"techmino99_hard"}},
{"techmino99_hard", id=20, x=-1100, y=-1600, size=35,shape=1,icon="royale", unlock={21}}, {name="techmino99_hard", x=-1100, y=-1600, size=35,shape=1,icon="royale", unlock={"techmino99_ultimate"}},
{"techmino99_ultimate", id=21, x=-1100, y=-1800, size=35,shape=1,icon="royale", unlock={}}, {name="techmino99_ultimate", x=-1100, y=-1800, size=35,shape=1,icon="royale", unlock={}},
{"round_1", id=22, x=-300, y=-800, size=35,shape=1,icon="round", unlock={23}}, {name="round_1", x=-300, y=-800, size=35,shape=1,icon="round", unlock={"round_2"}},
{"round_2", id=23, x=-500, y=-800, size=35,shape=1,icon="round", unlock={24}}, {name="round_2", x=-500, y=-800, size=35,shape=1,icon="round", unlock={"round_3"}},
{"round_3", id=24, x=-700, y=-800, size=35,shape=1,icon="round", unlock={25}}, {name="round_3", x=-700, y=-800, size=35,shape=1,icon="round", unlock={"round_4"}},
{"round_4", id=25, x=-900, y=-800, size=35,shape=1,icon="round", unlock={26}}, {name="round_4", x=-900, y=-800, size=35,shape=1,icon="round", unlock={"round_5"}},
{"round_5", id=26, x=-1100, y=-800, size=35,shape=1,icon="round", unlock={}}, {name="round_5", x=-1100, y=-800, size=35,shape=1,icon="round", unlock={}},
{"master_beginner", id=27, x=0, y=-1000, size=35,shape=1,icon="master", unlock={28}}, {name="master_beginner", x=0, y=-1000, size=35,shape=1,icon="master", unlock={"master_adavnce"}},
{"master_adavnce", id=28, x=0, y=-1200, size=35,shape=1,icon="master", unlock={29,30}}, {name="master_adavnce", x=0, y=-1200, size=35,shape=1,icon="master", unlock={"master_final","GM"}},
{"master_final", id=29, x=0, y=-1400, size=40,shape=2,icon="master", unlock={}}, {name="master_final", x=0, y=-1400, size=40,shape=2,icon="master", unlock={}},
{"GM", id=30, x=150, y=-1500, size=35,shape=1,icon="master", unlock={}}, {name="GM", x=150, y=-1500, size=35,shape=1,icon="master", unlock={}},
{"blind_easy", id=31, x=150, y=-700, size=35,shape=1,icon="blind", unlock={32}}, {name="blind_easy", x=150, y=-700, size=35,shape=1,icon="blind", unlock={"blind_normal"}},
{"blind_normal", id=32, x=150, y=-800, size=35,shape=1,icon="blind", unlock={33}}, {name="blind_normal", x=150, y=-800, size=35,shape=1,icon="blind", unlock={"blind_hard"}},
{"blind_hard", id=33, x=150, y=-900, size=35,shape=1,icon="blind", unlock={34}}, {name="blind_hard", x=150, y=-900, size=35,shape=1,icon="blind", unlock={"blind_lunatic"}},
{"blind_lunatic", id=34, x=150, y=-1000, size=35,shape=1,icon="blind", unlock={35}}, {name="blind_lunatic", x=150, y=-1000, size=35,shape=1,icon="blind", unlock={"blind_ultimate"}},
{"blind_ultimate", id=35, x=150, y=-1100, size=35,shape=1,icon="blind", unlock={}}, {name="blind_ultimate", x=150, y=-1100, size=35,shape=1,icon="blind", unlock={}},
{"classic_fast", id=36, x=-300, y=-1200, size=40,shape=2,icon="classic", unlock={}}, {name="classic_fast", x=-300, y=-1200, size=40,shape=2,icon="classic", unlock={}},
{"survivor_easy", id=37, x=300, y=-600, size=35,shape=1,icon="survivor",unlock={38}}, {name="survivor_easy", x=300, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_normal"}},
{"survivor_normal", id=38, x=500, y=-600, size=35,shape=1,icon="survivor",unlock={39,42,44,46}}, {name="survivor_normal", x=500, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_hard","attacker_hard","defender_normal","dig_hard"}},
{"survivor_hard", id=39, x=700, y=-600, size=35,shape=1,icon="survivor",unlock={40}}, {name="survivor_hard", x=700, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_lunatic"}},
{"survivor_lunatic", id=40, x=900, y=-600, size=35,shape=1,icon="survivor",unlock={41}}, {name="survivor_lunatic", x=900, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_ultimate"}},
{"survivor_ultimate", id=41, x=1100, y=-600, size=35,shape=1,icon="survivor",unlock={}}, {name="survivor_ultimate", x=1100, y=-600, size=35,shape=1,icon="survivor", unlock={}},
{"attacker_hard", id=42, x=300, y=-800, size=35,shape=1,icon="attacker",unlock={43}}, {name="attacker_hard", x=300, y=-800, size=35,shape=1,icon="attacker", unlock={"attacker_ultimate"}},
{"attacker_ultimate", id=43, x=300, y=-1000, size=35,shape=1,icon="attacker",unlock={}}, {name="attacker_ultimate", x=300, y=-1000, size=35,shape=1,icon="attacker", unlock={}},
{"defender_normal", id=44, x=500, y=-800, size=35,shape=1,icon="defender",unlock={45}}, {name="defender_normal", x=500, y=-800, size=35,shape=1,icon="defender", unlock={"defender_lunatic"}},
{"defender_lunatic", id=45, x=500, y=-1000, size=35,shape=1,icon="defender",unlock={}}, {name="defender_lunatic", x=500, y=-1000, size=35,shape=1,icon="defender", unlock={}},
{"dig_hard", id=46, x=700, y=-800, size=35,shape=1,icon="dig", unlock={47}}, {name="dig_hard", x=700, y=-800, size=35,shape=1,icon="dig", unlock={"dig_ultimate"}},
{"dig_ultimate", id=47, x=700, y=-1000, size=35,shape=1,icon="dig", unlock={}}, {name="dig_ultimate", x=700, y=-1000, size=35,shape=1,icon="dig", unlock={}},
{"bigbang", id=48, x=400, y=-400, size=55,shape=1,icon="bigbang", unlock={49,51,56}}, {name="bigbang", x=400, y=-400, size=55,shape=1,icon="bigbang", unlock={"c4wtrain_normal","pctrain_normal","tech_normal"}},
{"c4wtrain_normal", id=49, x=700, y=-400, size=35,shape=1,icon="c4wtrain",unlock={50}}, {name="c4wtrain_normal", x=700, y=-400, size=35,shape=1,icon="c4wtrain", unlock={"c4wtrain_lunatic"}},
{"c4wtrain_lunatic", id=50, x=900, y=-400, size=35,shape=1,icon="c4wtrain",unlock={}}, {name="c4wtrain_lunatic", x=900, y=-400, size=35,shape=1,icon="c4wtrain", unlock={}},
{"pctrain_normal", id=51, x=700, y=-200, size=35,shape=1,icon="pctrain", unlock={52,53}}, {name="pctrain_normal", x=700, y=-200, size=35,shape=1,icon="pctrain", unlock={"pctrain_lunatic","pcchallenge_normal"}},
{"pctrain_lunatic", id=52, x=900, y=-200, size=35,shape=1,icon="pctrain", unlock={}}, {name="pctrain_lunatic", x=900, y=-200, size=35,shape=1,icon="pctrain", unlock={}},
{"pcchallenge_normal", id=53, x=800, y=-100, size=35,shape=1,icon="pcchallenge",unlock={54}}, {name="pcchallenge_normal", x=800, y=-100, size=35,shape=1,icon="pcchallenge", unlock={"pcchallenge_hard"}},
{"pcchallenge_hard", id=54, x=1000, y=-100, size=35,shape=1,icon="pcchallenge",unlock={55}}, {name="pcchallenge_hard", x=1000, y=-100, size=35,shape=1,icon="pcchallenge", unlock={"pcchallenge_lunatic"}},
{"pcchallenge_lunatic", id=55, x=1200, y=-100, size=35,shape=1,icon="pcchallenge",unlock={}}, {name="pcchallenge_lunatic",x=1200, y=-100, size=35,shape=1,icon="pcchallenge", unlock={}},
{"tech_normal", id=56, x=400, y=-100, size=35,shape=1,icon="tech", unlock={57,58}}, {name="tech_normal", x=400, y=-100, size=35,shape=1,icon="tech", unlock={"tech_normal+","tech_hard"}},
{"tech_normal+", id=57, x=650, y=150, size=35,shape=1,icon="tech", unlock={64}}, {name="tech_normal+", x=650, y=150, size=35,shape=1,icon="tech", unlock={"tsd_easy"}},
{"tech_hard", id=58, x=400, y=50, size=35,shape=1,icon="tech", unlock={59,60}}, {name="tech_hard", x=400, y=50, size=35,shape=1,icon="tech", unlock={"tech_hard+","tech_lunatic"}},
{"tech_hard+", id=59, x=250, y=50, size=35,shape=1,icon="tech", unlock={}}, {name="tech_hard+", x=250, y=50, size=35,shape=1,icon="tech", unlock={}},
{"tech_lunatic", id=60, x=400, y=200, size=35,shape=1,icon="tech", unlock={61,62}}, {name="tech_lunatic", x=400, y=200, size=35,shape=1,icon="tech", unlock={"tech_lunatic+","tech_ultimate"}},
{"tech_lunatic+", id=61, x=250, y=200, size=35,shape=1,icon="tech", unlock={}}, {name="tech_lunatic+", x=250, y=200, size=35,shape=1,icon="tech", unlock={}},
{"tech_ultimate", id=62, x=400, y=350, size=35,shape=1,icon="tech", unlock={63}}, {name="tech_ultimate", x=400, y=350, size=35,shape=1,icon="tech", unlock={"tech_ultimate+"}},
{"tech_ultimate+", id=63, x=250, y=350, size=35,shape=1,icon="tech", unlock={}}, {name="tech_ultimate+", x=250, y=350, size=35,shape=1,icon="tech", unlock={}},
{"tsd_easy", id=64, x=800, y=200, size=35,shape=1,icon="tsd", unlock={65}}, {name="tsd_easy", x=800, y=200, size=35,shape=1,icon="tsd", unlock={"tsd_hard"}},
{"tsd_hard", id=65, x=1000, y=200, size=35,shape=1,icon="tsd", unlock={66}}, {name="tsd_hard", x=1000, y=200, size=35,shape=1,icon="tsd", unlock={"tsd_ultimate"}},
{"tsd_ultimate", id=66, x=1200, y=200, size=35,shape=1,icon="tsd", unlock={}}, {name="tsd_ultimate", x=1200, y=200, size=35,shape=1,icon="tsd", unlock={}},
{"zen", id=67, x=-900, y=-600, size=35,shape=1,icon="zen", unlock={68,69,70}}, {name="zen", x=-900, y=-600, size=35,shape=1,icon="zen", unlock={"ultra","infinite","infinite_dig"}},
{"ultra", id=68, x=-1100, y=-400, size=35,shape=1,icon="ultra", unlock={}}, {name="ultra", x=-1100, y=-400, size=35,shape=1,icon="ultra", unlock={}},
{"infinite", id=69, x=-900, y=-400, size=35,shape=1,icon="infinite",unlock={}}, {name="infinite", x=-900, y=-400, size=35,shape=1,icon="infinite", unlock={}},
{"infinite_dig", id=70, x=-1100, y=-600, size=35,shape=1,icon="infinite_dig",unlock={}}, {name="infinite_dig", x=-1100, y=-600, size=35,shape=1,icon="infinite_dig",unlock={}},
{"custom_clear", id=71, x=200, y=-350, size=45,shape=3,icon="custom", unlock={}}, {name="custom_clear", x=200, y=-350, size=45,shape=3,icon="custom", unlock={}},
{"custom_puzzle", id=72, x=200, y=-200, size=45,shape=3,icon="puzzle", unlock={}}, {name="custom_puzzle", x=200, y=-200, size=45,shape=3,icon="puzzle", unlock={}},
{"sprintPenta", id=73, x=-200, y=-200, size=45,shape=3,icon="sprint", unlock={}}, {name="sprintPenta", x=-200, y=-200, size=45,shape=3,icon="sprint", unlock={}},
} }

View File

@@ -87,17 +87,22 @@ local CCblockID={4,3,6,5,1,2,0}
local freshPrepare={ local freshPrepare={
none=NULL, none=NULL,
bag=function(P) bag=function(P)
local bag0,bag=P.gameEnv.bag,{} local bag=P.gameEnv.bag
for i=1,#bag0 do bag[i]=bag0[i]end local L
repeat P:getNext(rem(bag,rnd(#bag)))until not bag[1] repeat
L={}for i=1,#bag do L[i]=i end
repeat P:getNext(bag[rem(L,rnd(#L))])until not L[1]
until #P.next>5
end, end,
his4=function(P) his4=function(P)
P.his={rnd(7),rnd(7),rnd(7),rnd(7)} local bag=P.gameEnv.bag
local L=#bag
P.his={bag[rnd(L)],bag[rnd(L)],bag[rnd(L)],bag[rnd(L)]}
for _=1,6 do for _=1,6 do
local i local i
local j=0 local j=0
repeat repeat
i=rnd(7) i=bag[rnd(L)]
j=j+1 j=j+1
until i~=P.his[1]and i~=P.his[2]and i~=P.his[3]and i~=P.his[4]or j==6 until i~=P.his[1]and i~=P.his[2]and i~=P.his[3]and i~=P.his[4]or j==6
P:getNext(i) P:getNext(i)
@@ -105,13 +110,33 @@ local freshPrepare={
end end
end, end,
rnd=function(P) rnd=function(P)
P:getNext(rnd(7)) local bag=P.gameEnv.bag
local L=#bag
P:getNext(bag[rnd(L)])
for i=1,5 do for i=1,5 do
local count=0
local i local i
repeat i=rnd(7)until i~=P.next[#P.next].id repeat
i=bag[rnd(L)]
count=count+1
until i~=P.next[#P.next].id or count>=L
P:getNext(i) P:getNext(i)
end end
end, end,
loop=function(P)
local bag=P.gameEnv.bag
repeat
for i=1,#bag do
P:getNext(bag[i])
end
until #P.next>5
end,
fixed=function(P)
local bag=P.gameEnv.bag
for i=1,#bag do
P:getNext(bag[i])
end
end,
} }
local freshMethod={ local freshMethod={
none=NULL, none=NULL,
@@ -124,10 +149,12 @@ local freshMethod={
end, end,
his4=function(P) his4=function(P)
if #P.next<6 then if #P.next<6 then
local bag=P.gameEnv.bag
local L=#bag
for n=1,4 do for n=1,4 do
local j,i=0 local j,i=0
repeat repeat
i=rnd(7) i=bag[rnd(L)]
j=j+1 j=j+1
until i~=P.his[1]and i~=P.his[2]and i~=P.his[3]and i~=P.his[4]or j==4 until i~=P.his[1]and i~=P.his[2]and i~=P.his[3]and i~=P.his[4]or j==4
P:getNext(i) P:getNext(i)
@@ -137,13 +164,29 @@ local freshMethod={
end, end,
rnd=function(P) rnd=function(P)
if #P.next<6 then if #P.next<6 then
for i=1,3 do local bag=P.gameEnv.bag
local L=#bag
for i=1,4 do
local count=0
local i local i
repeat i=rnd(7)until i~=P.next[#P.next].id repeat
i=bag[rnd(L)]
count=count+1
until i~=P.next[#P.next].id or count>=L
P:getNext(i) P:getNext(i)
end end
end end
end, end,
loop=function(P)
local bag=P.gameEnv.bag
for i=1,#bag do
P:getNext(bag[i])
end
end,
fixed=function(P)
if P.cur or P.hd then return end
P:lose()
end,
} }
local spinName={"zspin","sspin","jspin","lspin","tspin","ospin","ispin","zspin","sspin","pspin","qspin","fspin","espin","tspin","uspin","vspin","wspin","xspin","jspin","lspin","rspin","yspin","hspin","nspin","ispin"} local spinName={"zspin","sspin","jspin","lspin","tspin","ospin","ispin","zspin","sspin","pspin","qspin","fspin","espin","tspin","uspin","vspin","wspin","xspin","jspin","lspin","rspin","yspin","hspin","nspin","ispin"}
local clearName={"single","double","triple","techrash","pentcrash"} local clearName={"single","double","triple","techrash","pentcrash"}
@@ -220,7 +263,7 @@ end
local function updateTasks(P) local function updateTasks(P)
local L=P.tasks local L=P.tasks
for i=#L,1,-1 do for i=#L,1,-1 do
if L[i].code(P,L[i].data)then end if L[i].code(P,L[i].data)then rem(L,i)end
end end
end end
local function Pupdate_alive(P,dt) local function Pupdate_alive(P,dt)
@@ -281,7 +324,7 @@ local function Pupdate_alive(P,dt)
mov=mov+1 mov=mov+1
end end
end end
if mov>=das and P.gameEnv.shakeFX and P:ifoverlap(P.cur.bk,P.curX+1,P.curY)then if mov>=das and P.gameEnv.shakeFX and P.cur and P:ifoverlap(P.cur.bk,P.curX+1,P.curY)then
P.fieldOff.vx=P.gameEnv.shakeFX*.5 P.fieldOff.vx=P.gameEnv.shakeFX*.5
end end
else else
@@ -306,7 +349,7 @@ local function Pupdate_alive(P,dt)
mov=mov+1 mov=mov+1
end end
end end
if mov>=das and P.gameEnv.shakeFX and P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then if mov>=das and P.gameEnv.shakeFX and P.cur and P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then
P.fieldOff.vx=-P.gameEnv.shakeFX*.5 P.fieldOff.vx=-P.gameEnv.shakeFX*.5
end end
else else
@@ -353,42 +396,44 @@ local function Pupdate_alive(P,dt)
P.waiting=P.waiting-1 P.waiting=P.waiting-1
goto stop goto stop
end end
if P.curY~=P.y_img then if P.cur then
local D=P.dropDelay if P.curY~=P.y_img then
if D>1 then local D=P.dropDelay
P.dropDelay=D-1 if D>1 then
goto stop P.dropDelay=D-1
end goto stop
if D==1 then end
P.curY=P.curY-1 if D==1 then
else P.curY=P.curY-1
local _=P.curY-P.y_img--max fall dist
D=1/D--fall dist
if D<_ then
P.curY=P.curY-D
assert(P.curY==int(P.curY),"y:"..P.curY.." fall:"..D.." D_env:"..P.gameEnv.drop)
else else
P.curY=P.y_img local _=P.curY-P.y_img--max fall dist
D=1/D--fall dist
if D<_ then
P.curY=P.curY-D
assert(P.curY==int(P.curY),"y:"..P.curY.." fall:"..D.." D_env:"..P.gameEnv.drop)
else
P.curY=P.y_img
end
end end
end P.spinLast=false
P.spinLast=false if P.y_img~=P.curY then
if P.y_img~=P.curY then P.dropDelay=P.gameEnv.drop
P.dropDelay=P.gameEnv.drop elseif P.AI_mode=="CC"then
elseif P.AI_mode=="CC"then P.AI_needFresh=true
P.AI_needFresh=true if not P.AIdata._20G and P.gameEnv.drop<P.AI_delay0*.5 then
if not P.AIdata._20G and P.gameEnv.drop<P.AI_delay0*.5 then CC_switch20G(P)
CC_switch20G(P) end
end
if P.freshTime<=P.gameEnv.freshLimit then
P.lockDelay=P.gameEnv.lock
end
else
P.lockDelay=P.lockDelay-1
if P.lockDelay>=0 then goto stop end
P:drop()
if P.AI_mode=="CC"then
P.AI_needFresh=true
end end
end
if P.freshTime<=P.gameEnv.freshLimit then
P.lockDelay=P.gameEnv.lock
end
else
P.lockDelay=P.lockDelay-1
if P.lockDelay>=0 then goto stop end
P:drop()
if P.AI_mode=="CC"then
P.AI_needFresh=true
end end
end end
::stop:: ::stop::
@@ -422,11 +467,6 @@ local function Pupdate_dead(P,dt)
end end
end end
::stop:: ::stop::
if P.endCounter<40 then
for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
end end--Make field visible
end
if P.b2b1>0 then P.b2b1=max(0,P.b2b1*.92-1)end if P.b2b1>0 then P.b2b1=max(0,P.b2b1*.92-1)end
updateFXs(P,dt) updateFXs(P,dt)
updateTasks(P) updateTasks(P)
@@ -499,15 +539,12 @@ local function drawFXs(P)
end--clearFX end--clearFX
end end
local function Pdraw_norm(P) local function Pdraw_norm(P)
local curColor=P.cur.color
local _ local _
gc.push("transform") gc.push("transform")
gc.translate(P.x,P.y)gc.scale(P.size) gc.translate(P.x,P.y)gc.scale(P.size)
--Camera --Camera
gc.setColor(0,0,0,.6)gc.rectangle("fill",0,0,600,690)
gc.setLineWidth(7)gc.setColor(frameColor[P.strength])gc.rectangle("line",0,0,600,690)
--Boarder
gc.translate(150+P.fieldOff.x,70+P.fieldOff.y) gc.translate(150+P.fieldOff.x,70+P.fieldOff.y)
gc.setColor(0,0,0,.6)gc.rectangle("fill",0,-10,300,610)
if P.gameEnv.grid then if P.gameEnv.grid then
gc.setLineWidth(1) gc.setLineWidth(1)
gc.setColor(1,1,1,.2) gc.setColor(1,1,1,.2)
@@ -517,7 +554,9 @@ local function Pdraw_norm(P)
gc.line(0,y,300,y) gc.line(0,y,300,y)
end end
end--Grid end--Grid
gc.setLineWidth(2)
gc.translate(0,P.fieldBeneath) gc.translate(0,P.fieldBeneath)
gc.setScissor(scr.x+(P.absFieldX+P.fieldOff.x)*scr.k,scr.y+(P.absFieldY+P.fieldOff.y)*scr.k,300*P.size*scr.k,610*P.size*scr.k)
if P.falling==-1 then if P.falling==-1 then
for j=int(P.fieldBeneath/30+1),#P.field do for j=int(P.fieldBeneath/30+1),#P.field do
for i=1,10 do for i=1,10 do
@@ -551,7 +590,8 @@ local function Pdraw_norm(P)
drawFXs(P) drawFXs(P)
if P.waiting==-1 then if P.cur and P.waiting==-1 then
local curColor=P.cur.color
if P.gameEnv.ghost then if P.gameEnv.ghost then
gc.setColor(1,1,1,.3) gc.setColor(1,1,1,.3)
for i=1,P.r do for j=1,P.c do for i=1,P.r do for j=1,P.c do
@@ -598,94 +638,103 @@ local function Pdraw_norm(P)
gc.translate(0,dy) gc.translate(0,dy)
end end
::E:: ::E::
gc.setScissor()--In-playField things
gc.translate(0,-P.fieldBeneath) gc.translate(0,-P.fieldBeneath)
gc.setLineWidth(2) gc.setColor(1,1,1)
gc.setColor(1,1,1) gc.rectangle("line",-1,-11,302,612)--Boarder
gc.rectangle("line",-1,-11,302,612)--Draw boarder gc.rectangle("line",301,0,15,601)--AtkBuffer boarder
gc.rectangle("line",301,0,15,601)--Draw atkBuffer boarder gc.rectangle("line",-16,-3,15,604)--B2b bar boarder
local h=0
for i=1,#P.atkBuffer do --Buffer line
local A=P.atkBuffer[i] local h=0
local bar=A.amount*30 for i=1,#P.atkBuffer do
if h+bar>600 then bar=600-h end local A=P.atkBuffer[i]
if not A.sent then local bar=A.amount*30
if A.time<20 then if h+bar>600 then bar=600-h end
bar=bar*(20*A.time)^.5*.05 if not A.sent then
--Appear if A.time<20 then
end bar=bar*(20*A.time)^.5*.05
if A.countdown>0 then --Appear
gc.setColor(attackColor[A.lv][1]) end
gc.rectangle("fill",303,599-h,11,-bar+3) if A.countdown>0 then
gc.setColor(attackColor[A.lv][2]) gc.setColor(attackColor[A.lv][1])
gc.rectangle("fill",303,599-h+(-bar+3),11,-(-bar+3)*(1-A.countdown/A.cd0)) gc.rectangle("fill",303,599-h,11,-bar+3)
--Timing gc.setColor(attackColor[A.lv][2])
gc.rectangle("fill",303,599-h+(-bar+3),11,-(-bar+3)*(1-A.countdown/A.cd0))
--Timing
else
local t=math.sin((Timer()-i)*30)*.5+.5
local c1,c2=attackColor[A.lv][1],attackColor[A.lv][2]
gc.setColor(c1[1]*t+c2[1]*(1-t),c1[2]*t+c2[2]*(1-t),c1[3]*t+c2[3]*(1-t))
gc.rectangle("fill",303,599-h,11,-bar+3)
--Warning
end
else else
local t=math.sin((Timer()-i)*30)*.5+.5 gc.setColor(attackColor[A.lv][1])
local c1,c2=attackColor[A.lv][1],attackColor[A.lv][2] bar=bar*(20-A.time)*.05
gc.setColor(c1[1]*t+c2[1]*(1-t),c1[2]*t+c2[2]*(1-t),c1[3]*t+c2[3]*(1-t)) gc.rectangle("fill",303,599-h,11,-bar+2)
gc.rectangle("fill",303,599-h,11,-bar+3) --Disappear
--Warning
end end
else h=h+bar
gc.setColor(attackColor[A.lv][1]) end
bar=bar*(20-A.time)*.05
gc.rectangle("fill",303,599-h,11,-bar+2) --B2B indictator
--Disappear local a,b=P.b2b,P.b2b1 if a>b then a,b=b,a end
gc.setColor(.8,1,.2)
gc.rectangle("fill",-14,599,11,-b*.5)
gc.setColor(P.b2b<40 and color.white or P.b2b<=1e3 and color.lightRed or color.lightBlue)
gc.rectangle("fill",-14,599,11,-a*.5)
gc.setColor(1,1,1)
if Timer()%.5<.3 then
gc.rectangle("fill",-15,b<40 and 578.5 or 98.5,13,3)
end end
h=h+bar
end--Buffer line
local a,b=P.b2b,P.b2b1 if a>b then a,b=b,a end
gc.setColor(.8,1,.2)
gc.rectangle("fill",-14,599,11,-b*.5)
gc.setColor(P.b2b<40 and color.white or P.b2b<=1e3 and color.lightRed or color.lightBlue)
gc.rectangle("fill",-14,599,11,-a*.5)
gc.setColor(1,1,1)
if Timer()%.5<.3 then
gc.rectangle("fill",-15,b<40 and 578.5 or 98.5,13,3)
end
gc.rectangle("line",-16,-3,15,604)--Draw b2b bar boarder
--B2B indictator
gc.translate(-P.fieldOff.x,-P.fieldOff.y) gc.translate(-P.fieldOff.x,-P.fieldOff.y)
--Draw Hold
if P.gameEnv.hold then if P.gameEnv.hold then
gc.setColor(0,0,0,.4)gc.rectangle("fill",-143,36,124,80)
gc.setColor(1,1,1)gc.rectangle("line",-143,36,124,80)
mText(drawableText.hold,-81,-15) mText(drawableText.hold,-81,-15)
if P.holded then gc.setColor(.6,.5,.5)end if P.hd then
local B=P.hd.bk if P.holded then gc.setColor(.6,.5,.5)end
for i=1,#B do for j=1,#B[1]do local B=P.hd.bk
if B[i][j]then for i=1,#B do for j=1,#B[1]do
drawPixel(i+17.5-#B*.5,j-2.7-#B[1]*.5,P.hd.color) if B[i][j]then
end drawPixel(i+17.5-#B*.5,j-2.7-#B[1]*.5,P.hd.color)
end end end
end--Hold end end
end
gc.setColor(1,1,1)
mText(drawableText.next,381,-15)
local N=1
while N<=P.gameEnv.next and P.next[N]do
local b,c=P.next[N].bk,P.next[N].color
for i=1,#b do for j=1,#b[1] do
if b[i][j]then
drawPixel(i+20-2.4*N-#b*.5,j+12.7-#b[1]*.5,c)
end
end end
N=N+1
end end
--Next(s)
--Draw Next(s)
local N=P.gameEnv.next*72
if P.gameEnv.next>0 then
gc.setColor(0,0,0,.4)gc.rectangle("fill",319,36,124,N)
gc.setColor(1,1,1)gc.rectangle("line",319,36,124,N)
mText(drawableText.next,381,-15)
N=1
while N<=P.gameEnv.next and P.next[N]do
local b,c=P.next[N].bk,P.next[N].color
for i=1,#b do for j=1,#b[1] do
if b[i][j]then
drawPixel(i+20-2.4*N-#b*.5,j+12.7-#b[1]*.5,c)
end
end end
N=N+1
end
end
--Draw Bagline(s)
if P.gameEnv.bagLine then if P.gameEnv.bagLine then
local L=P.gameEnv.bagLen local L=P.gameEnv.bagLen
local C=-P.pieceCount%L--phase local C=-P.pieceCount%L--phase
gc.setColor(.5,.5,.5) gc.setColor(.5,.5,.5)
for i=C,N-1,L do for i=C,N-1,L do
local y=72*i+36 local y=72*i+36
gc.line(320,y,442,y) gc.line(321+P.fieldOff.x,y,441,y)
end end
end end
--BagLine(s)
gc.setColor(.8,.8,.8)
gc.draw(drawableText.modeName,-135,-65)
gc.draw(drawableText.levelName,437-drawableText.levelName:getWidth(),-65)
gc.setColor(1,1,1) gc.setColor(1,1,1)
if game.frame<180 then if game.frame<180 then
local count=179-game.frame local count=179-game.frame
@@ -715,7 +764,6 @@ local function Pdraw_norm(P)
gc.rectangle("fill",RCPB[2*P.atkMode-1],RCPB[2*P.atkMode],90,35,8,4) gc.rectangle("fill",RCPB[2*P.atkMode-1],RCPB[2*P.atkMode],90,35,8,4)
end end
gc.setColor(1,1,1,P.swappingAtkMode*.025) gc.setColor(1,1,1,P.swappingAtkMode*.025)
gc.setLineWidth(2)
setFont(18) setFont(18)
for i=1,4 do for i=1,4 do
gc.rectangle("line",RCPB[2*i-1],RCPB[2*i],90,35,8,4) gc.rectangle("line",RCPB[2*i-1],RCPB[2*i],90,35,8,4)
@@ -812,7 +860,7 @@ local function Pdraw_demo(P)
drawFXs(P) drawFXs(P)
if P.waiting==-1 then if P.cur and P.waiting==-1 then
gc.setColor(1,1,1,.3) gc.setColor(1,1,1,.3)
for i=1,P.r do for j=1,P.c do for i=1,P.r do for j=1,P.c do
if P.cur.bk[i][j]then if P.cur.bk[i][j]then
@@ -828,14 +876,13 @@ local function Pdraw_demo(P)
end end--Block end end--Block
end end
local id=P.hd.id if P.hd then
if id>0 then local id=P.hd.id
_=P.color[id] _=P.color[id]
gc.setColor(_[1],_[2],_[3],.3) gc.setColor(_[1],_[2],_[3],.3)
_=miniBlock[P.hd.id] _=miniBlock[id]
gc.draw(_,15,30,nil,16,nil,0,_:getHeight()*.5) gc.draw(_,15,30,nil,16,nil,0,_:getHeight()*.5)
end end--Hold
--Hold
local N=1 local N=1
while N<=P.gameEnv.next and P.next[N]do while N<=P.gameEnv.next and P.next[N]do
@@ -845,8 +892,7 @@ local function Pdraw_demo(P)
_=miniBlock[id] _=miniBlock[id]
gc.draw(_,285,40*N-10,nil,16,nil,_:getWidth(),_:getHeight()*.5) gc.draw(_,285,40*N-10,nil,16,nil,_:getWidth(),_:getHeight()*.5)
N=N+1 N=N+1
end end--Next
--Next
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.translate(-P.fieldOff.x,-P.fieldOff.y) gc.translate(-P.fieldOff.x,-P.fieldOff.y)
@@ -1248,28 +1294,30 @@ function player.spin(P,d,ifpre)
end end
end end
function player.resetBlock(P) function player.resetBlock(P)
local id=P.cur.id local C=P.cur
local id=C.id
local face=P.gameEnv.face[id] local face=P.gameEnv.face[id]
local sc=scs[id][face] local sc=scs[id][face]
P.sc=sc --spin center P.sc=sc --spin center
P.dir=face --block direction P.dir=face --block direction
P.r,P.c=#P.cur.bk,#P.cur.bk[1] --row/column P.r,P.c=#C.bk,#C.bk[1] --row/column
P.curX=int(6-P.c*.5) P.curX=int(6-P.c*.5)
local y=21+ceil(P.fieldBeneath/30) local y=21+ceil(P.fieldBeneath/30)
P.curY=y P.curY=y
if P.gameEnv.ims and(P.keyPressing[1]and P.movDir==-1 or P.keyPressing[2]and P.movDir==1)and P.moving>=P.gameEnv.das then if P.gameEnv.ims and(P.keyPressing[1]and P.movDir==-1 or P.keyPressing[2]and P.movDir==1)and P.moving>=P.gameEnv.das then
local x=P.curX+P.movDir local x=P.curX+P.movDir
if not P:ifoverlap(P.cur.bk,x,y)then if not P:ifoverlap(C.bk,x,y)then
P.curX=x P.curX=x
end end
end end--IMS
--IMS
end end
function player.hold(P,ifpre) function player.hold(P,ifpre)
if not P.holded and (ifpre or P.waiting==-1) and P.gameEnv.hold then if not P.holded and (ifpre or P.waiting==-1) and P.gameEnv.hold then
local H,C=P.hd,P.cur
if not(H or C)then return end
--Finesse check --Finesse check
local H,B=P.hd,P.cur if H and C and H.id==C.id and H.name==C.name or P.ctrlCount>1 then
if H and H.id==B.id and H.name==B.name or P.ctrlCount>1 then
P:fineError(1) P:fineError(1)
end end
@@ -1277,20 +1325,31 @@ function player.hold(P,ifpre)
P.spinLast=false P.spinLast=false
P.ctrlCount=0 P.ctrlCount=0
P.spinSeq=0 P.spinSeq=0
P.cur,P.hd=P.hd,P.cur
local hid=P.hd.id
P.hd.bk=blocks[hid][P.gameEnv.face[hid]]
if P.cur.id==0 then
P.cur=rem(P.next,1)
P:newNext()
P.pieceCount=P.pieceCount+1
if P.AI_mode=="CC"then BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])end
end
P:resetBlock()
P:freshgho() P.cur,P.hd=H,C--Swap hold
P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,max(P.freshTime-5,0)
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end H,C=P.hd,P.cur
if H then
local hid=P.hd.id
P.hd.bk=blocks[hid][P.gameEnv.face[hid]]
end
if not C then
C=rem(P.next,1)
P:newNext()
if C then
P.cur=C
P.pieceCount=P.pieceCount+1
if P.AI_mode=="CC"then BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])end
else
P.holded=false
end
end
if C then
P:resetBlock()
P:freshgho()
P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,max(P.freshTime-5,0)
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end
end
if P.human then if P.human then
SFX.play(ifpre and"prehold"or"hold") SFX.play(ifpre and"prehold"or"hold")
@@ -1298,6 +1357,7 @@ function player.hold(P,ifpre)
P.stat.hold=P.stat.hold+1 P.stat.hold=P.stat.hold+1
end end
end end
function player.getNext(P,n) function player.getNext(P,n)
local E=P.gameEnv local E=P.gameEnv
P.next[#P.next+1]={bk=blocks[n][E.face[n]],id=n,color=E.bone and 12 or E.skin[n],name=n} P.next[#P.next+1]={bk=blocks[n][E.face[n]],id=n,color=E.bone and 12 or E.skin[n],name=n}
@@ -1310,37 +1370,41 @@ function player.popNext(P)--pop next queue to hand
P.cur=rem(P.next,1) P.cur=rem(P.next,1)
P:newNext() P:newNext()
P.pieceCount=P.pieceCount+1 if P.cur then
if P.AI_mode=="CC"then BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])end P.pieceCount=P.pieceCount+1
local _=P.keyPressing if P.AI_mode=="CC"then BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])end
if _[8]and P.gameEnv.hold and P.gameEnv.ihs then local _=P.keyPressing
P:hold(true) if _[8]and P.gameEnv.hold and P.gameEnv.ihs then
_[8]=false P:hold(true)
else _[8]=false
P:resetBlock()
end
--IHS
P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,0
if P.gameEnv.irs then
if _[5]then
P:spin(2,true)
else else
if _[3]then P:resetBlock()
if _[4]then end--IHS
P:spin(2,true)
else P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,0
P:spin(1,true) if P.gameEnv.irs then
if _[5]then
P:spin(2,true)
else
if _[3]then
if _[4]then
P:spin(2,true)
else
P:spin(1,true)
end
elseif _[4]then
P:spin(3,true)
end end
elseif _[4]then
P:spin(3,true)
end end
end--IRS
if P.cur then
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end
P:freshgho()
end end
if _[6]then P.act.hardDrop(P)_[6]=false end--IHdS
end end
--IRS
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end
P:freshgho()
if _[6]then P.act.hardDrop(P)_[6]=false end
--IHdS
end end
function player.drop(P)--Place piece function player.drop(P)--Place piece
local _ local _
@@ -1783,60 +1847,6 @@ end
--------------------------</Methods>-------------------------- --------------------------</Methods>--------------------------
--------------------------<Events>-------------------------- --------------------------<Events>--------------------------
local tick={}
function tick.finish(P)
if SCN.cur~="play"then return true end
P.endCounter=P.endCounter+1
if P.endCounter>120 then pauseGame()end
end
function tick.lose(P)
P.endCounter=P.endCounter+1
if P.endCounter>80 then
for i=1,#P.field do
for j=1,10 do
if P.visTime[i][j]>0 then
P.visTime[i][j]=P.visTime[i][j]-1
end
end
end
if P.endCounter==120 then
for _=#P.field,1,-1 do
freeRow.discard(P.field[_])
freeRow.discard(P.visTime[_])
P.field[_],P.visTime[_]=nil
end
if #players==1 and SCN.cur=="play"then
pauseGame()
end
return true
end
end
end
function tick.throwBadge(data)--{ifAI,Sender,timer}
data[3]=data[3]-1
if data[3]%4==0 then
local S,R=data[2],data[2].lastRecv
local x1,y1,x2,y2
if S.small then
x1,y1=S.centerX,S.centerY
else
x1,y1=S.x+308*S.size,S.y+450*S.size
end
if R.small then
x2,y2=R.centerX,R.centerY
else
x2,y2=R.x+66*R.size,R.y+344*R.size
end
FX_badge[#FX_badge+1]={x1,y1,x2,y2,t=0}
--generate badge object
if not data[1]and data[3]%8==0 then
SFX.play("collect")
end
end
if data[3]<=0 then return true end
end
local function gameOver() local function gameOver()
FILE.saveData() FILE.saveData()
local M=curMode local M=curMode
@@ -1845,16 +1855,17 @@ local function gameOver()
local P=players[1] local P=players[1]
R=R(P)--new rank R=R(P)--new rank
if R then if R then
local r=modeRanks[M.id]--old rank local r=modeRanks[M.name]--old rank
local _ local _
if R>r then if R>r then
modeRanks[M.id]=R modeRanks[M.name]=R
_=true _=true
end end
for i=1,#M.unlock do for i=1,#M.unlock do
local m=M.unlock[i] local m=M.unlock[i]
if not modeRanks[m]then local n=Modes[m].name
modeRanks[m]=Modes[m].score and 0 or 6 if not modeRanks[n]then
modeRanks[n]=Modes[m].score and 0 or 6
_=true _=true
end end
end end
@@ -1877,7 +1888,7 @@ local function gameOver()
D.date=os.date("%Y/%m/%d %H:%M") D.date=os.date("%Y/%m/%d %H:%M")
ins(L,p+1,D) ins(L,p+1,D)
if L[11]then L[11]=nil end if L[11]then L[11]=nil end
FILE.saveRecord(M.saveFileName,L) FILE.saveRecord(M.name,L)
end end
end end
end end
@@ -1923,8 +1934,9 @@ function player.win(P,result)
end end
if P.human then if P.human then
gameOver() gameOver()
TASK.new(TICK.autoPause,{0})
end end
P:newTask(tick.finish) P:newTask(TICK.finish)
end end
function player.lose(P) function player.lose(P)
if P.life>0 then if P.life>0 then
@@ -1968,7 +1980,7 @@ function player.lose(P)
end end
P.lastRecv=A P.lastRecv=A
if P.id==1 or A.id==1 then if P.id==1 or A.id==1 then
TASK.new(tick.throwBadge,{A.ai,P,max(3,P.badge)*4}) TASK.new(TICK.throwBadge,{A.ai,P,max(3,P.badge)*4})
end end
freshMostBadge() freshMostBadge()
end end
@@ -2001,9 +2013,10 @@ function player.lose(P)
end end
end end
gameOver() gameOver()
P:newTask(#players>1 and tick.lose or tick.finish) P:newTask(#players>1 and TICK.lose or TICK.finish)
TASK.new(TICK.autoPause,{0})
else else
P:newTask(tick.lose) P:newTask(TICK.lose)
end end
if #players.alive==1 then if #players.alive==1 then
players.alive[1]:win() players.alive[1]:win()
@@ -2030,7 +2043,7 @@ function player.act.moveLeft(P,auto)
P.keyPressing[1]=false P.keyPressing[1]=false
end end
elseif P.control and P.waiting==-1 then elseif P.control and P.waiting==-1 then
if 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
P.curX=P.curX-1 P.curX=P.curX-1
local y0=P.curY local y0=P.curY
P:freshgho() P:freshgho()
@@ -2056,7 +2069,7 @@ function player.act.moveRight(P,auto)
P.keyPressing[2]=false P.keyPressing[2]=false
end end
elseif P.control and P.waiting==-1 then elseif P.control and P.waiting==-1 then
if 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
P.curX=P.curX+1 P.curX=P.curX+1
local y0=P.curY local y0=P.curY
P:freshgho() P:freshgho()
@@ -2072,21 +2085,21 @@ function player.act.moveRight(P,auto)
end end
end end
function player.act.rotRight(P) function player.act.rotRight(P)
if P.control and P.waiting==-1 then if P.control and P.waiting==-1 and P.cur then
P.ctrlCount=P.ctrlCount+1 P.ctrlCount=P.ctrlCount+1
P:spin(1) P:spin(1)
P.keyPressing[3]=false P.keyPressing[3]=false
end end
end end
function player.act.rotLeft(P) function player.act.rotLeft(P)
if P.control and P.waiting==-1 then if P.control and P.waiting==-1 and P.cur then
P.ctrlCount=P.ctrlCount+1 P.ctrlCount=P.ctrlCount+1
P:spin(3) P:spin(3)
P.keyPressing[4]=false P.keyPressing[4]=false
end end
end end
function player.act.rot180(P) function player.act.rot180(P)
if P.control and P.waiting==-1 then if P.control and P.waiting==-1 and P.cur then
P.ctrlCount=P.ctrlCount+2 P.ctrlCount=P.ctrlCount+2
P:spin(2) P:spin(2)
P.keyPressing[5]=false P.keyPressing[5]=false
@@ -2098,7 +2111,7 @@ function player.act.hardDrop(P)
P:changeAtkMode(3) P:changeAtkMode(3)
end end
P.keyPressing[6]=false P.keyPressing[6]=false
elseif P.control and P.waiting==-1 then elseif P.control and P.waiting==-1 and P.cur then
if P.curY~=P.y_img then if P.curY~=P.y_img then
if P.gameEnv.dropFX then if P.gameEnv.dropFX then
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
@@ -2125,7 +2138,7 @@ function player.act.softDrop(P)
end end
else else
P.downing=1 P.downing=1
if P.control and P.waiting==-1 then if P.control and P.waiting==-1 and P.cur then
if P.curY~=P.y_img then if P.curY~=P.y_img then
P.curY=P.curY-1 P.curY=P.curY-1
P.spinLast=false P.spinLast=false
@@ -2143,12 +2156,12 @@ function player.act.func(P)
end end
function player.act.restart(P) function player.act.restart(P)
if P.gameEnv.quickR or game.frame<180 then if P.gameEnv.quickR or game.frame<180 then
TASK.clear("play") TASK.removeTask_code(TICK.autoPause)
resetPartGameData() resetPartGameData()
end end
end end
function player.act.insLeft(P,auto) function player.act.insLeft(P,auto)
if P.gameEnv.nofly then return end if P.gameEnv.nofly or not P.cur then return end
local x0,y0=P.curX,P.curY local x0,y0=P.curX,P.curY
while not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)do while not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)do
P.curX=P.curX-1 P.curX=P.curX-1
@@ -2171,7 +2184,7 @@ function player.act.insLeft(P,auto)
end end
end end
function player.act.insRight(P,auto) function player.act.insRight(P,auto)
if P.gameEnv.nofly then return end if P.gameEnv.nofly or not P.cur then return end
local x0,y0=P.curX,P.curY local x0,y0=P.curX,P.curY
while not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)do while not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)do
P.curX=P.curX+1 P.curX=P.curX+1
@@ -2194,7 +2207,7 @@ function player.act.insRight(P,auto)
end end
end end
function player.act.insDown(P) function player.act.insDown(P)
if P.curY~=P.y_img then if P.curY~=P.y_img and P.cur then
if P.gameEnv.dropFX then if P.gameEnv.dropFX then
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
end end
@@ -2205,14 +2218,14 @@ function player.act.insDown(P)
end end
end end
function player.act.down1(P) function player.act.down1(P)
if P.curY~=P.y_img then if P.curY~=P.y_img and P.cur then
P.curY=P.curY-1 P.curY=P.curY-1
P.spinLast=false P.spinLast=false
end end
end end
function player.act.down4(P) function player.act.down4(P)
for _=1,4 do for _=1,4 do
if P.curY~=P.y_img then if P.curY~=P.y_img and P.cur then
P.curY=P.curY-1 P.curY=P.curY-1
P.spinLast=false P.spinLast=false
else else
@@ -2221,34 +2234,36 @@ function player.act.down4(P)
end end
end end
function player.act.down10(P) function player.act.down10(P)
for _=1,10 do if P.cur then
if P.curY~=P.y_img then for _=1,10 do
P.curY=P.curY-1 if P.curY~=P.y_img then
P.spinLast=false P.curY=P.curY-1
else P.spinLast=false
break else
break
end
end end
end end
end end
function player.act.dropLeft(P) function player.act.dropLeft(P)
if P.gameEnv.nofly then return end if P.gameEnv.nofly or not P.cur then return end
P.act.insLeft(P) P.act.insLeft(P)
P.act.hardDrop(P) P.act.hardDrop(P)
end end
function player.act.dropRight(P) function player.act.dropRight(P)
if P.gameEnv.nofly then return end if P.gameEnv.nofly or not P.cur then return end
P.act.insRight(P) P.act.insRight(P)
P.act.hardDrop(P) P.act.hardDrop(P)
end end
function player.act.addLeft(P) function player.act.addLeft(P)
if P.gameEnv.nofly then return end if P.gameEnv.nofly or not P.cur then return end
P.act.insLeft(P) P.act.insLeft(P)
P.act.insDown(P) P.act.insDown(P)
P.act.insRight(P) P.act.insRight(P)
P.act.hardDrop(P) P.act.hardDrop(P)
end end
function player.act.addRight(P) function player.act.addRight(P)
if P.gameEnv.nofly then return end if P.gameEnv.nofly or not P.cur then return end
P.act.insRight(P) P.act.insRight(P)
P.act.insDown(P) P.act.insDown(P)
P.act.insLeft(P) P.act.insLeft(P)
@@ -2319,10 +2334,11 @@ local function newEmptyPlayer(id,x,y,size)
P.showTime=nil P.showTime=nil
P.keepVisible=true P.keepVisible=true
P.cur={bk={{}},id=0,color=0,name=0}--shape,shapeID,colorID,nameID --P.cur={bk=matrix[2], id=shapeID, color=colorID, name=nameID}
P.sc,P.dir,P.r,P.c={0,0},0,0,0--IMG.spinCenter,direction,row,col --P.sc,P.dir={0,0},0--spinCenterCoord, direction
--P.r,P.c=0,0--row, col
--P.hd={...},same as P.cur
P.curX,P.curY,P.y_img=0,0,0--x,y,ghostY P.curX,P.curY,P.y_img=0,0,0--x,y,ghostY
P.hd={bk={{}},id=0,color=0,name=0}
P.holded=false P.holded=false
P.next={} P.next={}
@@ -2335,8 +2351,7 @@ local function newEmptyPlayer(id,x,y,size)
P.human=false P.human=false
P.RS=kickList.TRS P.RS=kickList.TRS
-- prepareSequence 这个参数在调用prepareSequence时被初始化 -- P.newNext=nil--call prepareSequence()to get a function to get new next
P.newNext=nil
P.keyPressing={}for i=1,12 do P.keyPressing[i]=false end P.keyPressing={}for i=1,12 do P.keyPressing[i]=false end
P.movDir,P.moving,P.downing=0,0,0--last move key,DAS charging,downDAS charging P.movDir,P.moving,P.downing=0,0,0--last move key,DAS charging,downDAS charging
@@ -2391,7 +2406,7 @@ local function applyGameEnv(P)--finish gameEnv processing
ENV.sdarr=max(ENV.sdarr,ENV.minsdarr) ENV.sdarr=max(ENV.sdarr,ENV.minsdarr)
ENV.next=min(ENV.next,setting.maxNext) ENV.next=min(ENV.next,setting.maxNext)
if ENV.sequence~="bag"then if ENV.sequence~="bag"and ENV.sequence~="loop"then
ENV.bagLine=false ENV.bagLine=false
else else
ENV.bagLen=#ENV.bag ENV.bagLen=#ENV.bag
@@ -2543,11 +2558,12 @@ function PLY.newAIPlayer(id,x,y,size,AIdata)
loadGameEnv(P) loadGameEnv(P)
applyGameEnv(P) applyGameEnv(P)
prepareSequence(P)
local ENV=P.gameEnv local ENV=P.gameEnv
ENV.face={0,0,0,0,0,0,0} ENV.face={0,0,0,0,0,0,0}
ENV.skin={1,5,8,2,10,3,7} ENV.skin={1,5,8,2,10,3,7}
prepareSequence(P)
P.human=false P.human=false
loadAI(P,AIdata) loadAI(P,AIdata)
end end

View File

@@ -69,7 +69,7 @@ drawableText={
win=T(120),finish=T(120), win=T(120),finish=T(120),
lose=T(120),pause=T(120), lose=T(120),pause=T(120),
custom=T(80), custom=T(80),sequence=T(80),
setting_game=T(80),setting_video=T(80),setting_sound=T(80), setting_game=T(80),setting_video=T(80),setting_sound=T(80),
setting_control=T(70),setting_skin=T(70), setting_control=T(70),setting_skin=T(70),
preview=T(40), preview=T(40),

72
parts/tick.lua Normal file
View File

@@ -0,0 +1,72 @@
local Tick={}
function Tick.finish(P)
P.endCounter=P.endCounter+1
if P.endCounter<40 then
for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
end end--Make field visible
elseif P.endCounter==60 then
return true
end
end
function Tick.lose(P)
P.endCounter=P.endCounter+1
if P.endCounter<40 then
for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
end end--Make field visible
elseif P.endCounter>80 then
for i=1,#P.field do
for j=1,10 do
if P.visTime[i][j]>0 then
P.visTime[i][j]=P.visTime[i][j]-1
end
end
end
if P.endCounter==120 then
for _=#P.field,1,-1 do
freeRow.discard(P.field[_])
freeRow.discard(P.visTime[_])
P.field[_],P.visTime[_]=nil
end
return true
end
end
if not modeEnv.royaleMode and #players>1 then
P.y=P.y+P.endCounter*.26
end
end
function Tick.throwBadge(data)--{ifAI,Sender,timer}
data[3]=data[3]-1
if data[3]%4==0 then
local S,R=data[2],data[2].lastRecv
local x1,y1,x2,y2
if S.small then
x1,y1=S.centerX,S.centerY
else
x1,y1=S.x+308*S.size,S.y+450*S.size
end
if R.small then
x2,y2=R.centerX,R.centerY
else
x2,y2=R.x+66*R.size,R.y+344*R.size
end
FX_badge[#FX_badge+1]={x1,y1,x2,y2,t=0}
--generate badge object
if not data[1]and data[3]%8==0 then
SFX.play("collect")
end
end
if data[3]<=0 then return true end
end
function Tick.autoPause(data)
data[1]=data[1]+1
if data[1]==120 then
if SCN.cur=="play"then
pauseGame()
end
return true
end
end
return Tick

View File

@@ -21,7 +21,7 @@ local S=[=[
Thanks!!! Thanks!!!
Future outlook: Future outlook:
New mode: New modes:
PUYO PUYO
game tutorial game tutorial
finesse tutorial finesse tutorial
@@ -68,7 +68,6 @@ Future outlook:
lang setting page lang setting page
game recording game recording
new widgets (joystick etc.) new widgets (joystick etc.)
custom sequence(TTT!)
splashing block splashing block
cool backgrounds cool backgrounds
more graphic FXs & 3D features & animations more graphic FXs & 3D features & animations
@@ -76,12 +75,15 @@ Future outlook:
network game network game
new AI: task-Z new AI: task-Z
0.8.25: Custom Sequence Update 0.9.0: Custom Sequence Update
new: new:
--TODO: custom sequence custom sequence
new sequence type: loop & fixed
many new tips many new tips
better watermark more powerful watermark
die animation in non-royale mode
changed: changed:
mode name shown at the top of screen
faster & harder attacker-ultimate faster & harder attacker-ultimate
little easier to get S in PC challenge (easy mode) little easier to get S in PC challenge (easy mode)
easier to get S in infinite mode, c4w, PC easier to get S in infinite mode, c4w, PC