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

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
k="["..k.."]="
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.."]="
else assert(false,"Error key type!")
end

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,8 +1,8 @@
local function N(file)
return love.graphics.newShader("shader/"..file..".glsl")
return love.graphics.newShader("Zframework/shader/"..file..".glsl")
end
return{
-- glow=gc.newShader("shader/glow.cs"),
-- glow=gc.newShader("Zframework/shader/glow.cs"),
alpha=N("alpha"),
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);
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.);
}

View File

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

View File

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

View File

@@ -218,9 +218,6 @@ function WIDGET.press(x,y)
local W=WIDGET.sel
if not W then return end
if W.type=="button"then
for k,v in next,W do
print(k,v)
end
W.code()
W:FX()
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 function BACK()SCN.back()end
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 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 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 C=color
local Widgets={
load={},intro={},quit={},
main={
play= newButton(150,280,200,160,C.lightRed, 55,function()SCN.push()SCN.swapTo("mode")end, nil,"setting"),
setting=newButton(370,280,200,160,C.lightBlue, 45,function()SCN.push()SCN.swapTo("setting_game")end, nil,"music"),
music= newButton(590,280,200,160,C.lightPurple, 32,function()SCN.push()SCN.swapTo("music")end, nil,"help"),
help= newButton(150,460,200,160,C.lightYellow, 50,function()SCN.push()SCN.swapTo("help")end, nil,"stat"),
stat= newButton(370,460,200,160,C.lightCyan, 43,function()SCN.push()SCN.swapTo("stat")end, nil,"qplay"),
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.goto("setting_game")end, nil,"music"),
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.goto("help")end, nil,"stat"),
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"),
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"),
},
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),
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),
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),
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),
--function()SCN.push()SCN.swapTo("custom")end
},
music={
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")),
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")),
back= newButton(640, 630,230,90, C.white,40,BACK),
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),
down= newButton(1100, 480,120,120,C.white, 55,pressKey("down")),
back= newButton(640, 630,230,90, C.white, 40,BACK),
},
custom={
up= newButton(1000, 360,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),
left= newButton(880, 480,100,100,C.white, 45,pressKey("left")),
right= newButton(1120, 480,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")),
set3= newButton(640, 340,240,75, C.lightYellow, 35,pressKey("3")),
set4= newButton(640, 430,240,75, C.lightYellow, 35,pressKey("4")),
set5= newButton(640, 520,240,75, C.lightYellow, 35,pressKey("5")),
back= newButton(640, 630,180,60, C.white, 35,BACK),
up= newButton(1140, 100,100,100,C.white, 45,function()sceneTemp=(sceneTemp-2)%#customID+1 end),
down= newButton(1140, 340,100,100,C.white, 45,function()sceneTemp=sceneTemp%#customID+1 end),
left= newButton(1080, 220,100,100,C.white, 45,pressKey("left")),
right= newButton(1200, 220,100,100,C.white, 45,pressKey("right")),
set1= newButton(940, 320,260,70, C.lightYellow, 32,pressKey("1")),
set2= newButton(940, 400,260,70, C.lightYellow, 32,pressKey("2")),
set3= newButton(940, 480,260,70, C.lightYellow, 32,pressKey("3")),
set4= newButton(940, 560,260,70, C.lightYellow, 32,pressKey("4")),
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={
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),
copy= newButton(920, 640,120,120,C.lightRed, 35,copyBoard),
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),
},
play={
@@ -160,28 +200,27 @@ local Widgets={
pause={
resume= newButton(640,290,240,100,C.white,30,function()resumeGame()end),
restart=newButton(640,445,240,100,C.white,33,function()
TASK.clear("play")
TASK.removeTask_code(TICK.autoPause)
mergeStat(stat,players[1].stat)
resetGameData()
SCN.swapTo("play","none")
end),
setting=newButton(1120,70,240,90,C.lightBlue,35,function()
SCN.push()SCN.swapTo("setting_sound")
SCN.goto("setting_sound")
end),
quit= newButton(640,600,240,100,C.white,35,BACK),
},
setting_game={
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"),
ctrl= newButton(290,220,320,80,C.lightYellow,35,function()SCN.push()SCN.swapTo("setting_control")end, nil,"key"),
key= newButton(640,220,320,80,C.lightGreen,35,function()SCN.push()SCN.swapTo("setting_key")end, nil,"touch"),
touch= newButton(990,220,320,80,C.lightBlue,35,function()SCN.push()SCN.swapTo("setting_touch")end, nil,"reTime"),
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.goto("setting_key")end, nil,"touch"),
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"),
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"),
layout= newButton(590,540,140,70,C.white,35,function()
SCN.push()
SCN.swapTo("setting_skin")
SCN.goto("setting_skin")
end,nil,"quickR"),
quickR= newSwitch(1050,340,35, SETval("quickR"), SETrev("quickR"), nil,"swap"),
swap= newSwitch(1050,440,19, SETval("swap"), SETrev("swap"), nil,"fine"),
@@ -308,8 +347,7 @@ local Widgets={
sceneTemp.snap=sceneTemp.snap%6+1
end),
option= newButton(520,180,170,80,C.white,40,function()
SCN.push()
SCN.swapTo("setting_touchSwitch")
SCN.goto("setting_touchSwitch")
end),
back= newButton(760,180,170,80,C.white,40,BACK),
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")),
icon= newSwitch(850,300, 40,SETval("VKIcon"),SETrev("VKIcon")),
tkset= newButton(1120,420,240,80,C.white,32,function()
SCN.push()
SCN.swapTo("setting_trackSetting")
SCN.goto("setting_trackSetting")
end,function()return not setting.VKTrack end),
alpha= newSlider(840,540,400,10,40,nil,SETval("VKAlpha"),SETsto("VKAlpha")),
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"),
},
help={
staff= newButton(980,500,150,80,C.white,32,function()SCN.push()SCN.swapTo("staff")end,nil,"his"),
his= newButton(1160,500,150,80,C.white,32,function()SCN.push()SCN.swapTo("history")end,nil,"qq"),
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.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"),
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
}
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}
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}
--blockSkin,blockSkinMini={},{}--redefined in SKIN.change
@@ -47,11 +50,11 @@ SKIN= require("parts/skin")
PLY= require("parts/player")
AIfunc= require("parts/ai")
Modes= require("parts/modes")
TICK= require("parts/tick")
--load files & settings
modeRanks={}for i=1,#Modes do modeRanks[i]=false assert(i==Modes[i].id,"ModeID error:"..i)end
modeRanks[1]=0
modeRanks={sprint_10=0}
local fs=love.filesystem
if fs.getInfo("keymap.dat")then fs.remove("keymap.dat")end
@@ -149,6 +152,12 @@ while #modeRanks>73 do
table.remove(modeRanks)
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
setting.skin[10],setting.skin[11]=1,5
end

View File

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

View File

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

View File

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

View File

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

View File

@@ -205,7 +205,7 @@ return{
end
local best={x=1,dir=0,hold=false,score=-1e99}
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
local cb=blocks[bn][dir]
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},
spin={},spin_B={},spin_S={0,0,0,0,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
s.clear_B[i]=0

View File

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

View File

@@ -70,7 +70,7 @@ local XspinList={
local TRS={
{
[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}},
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}},
[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}},
[21]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{-1,-2}},
[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}},
[20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0}},
@@ -104,9 +104,9 @@ local TRS={
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}},
[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}},
[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}},
[20]={{ 1, 0},{-1, 0},{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0},{ 0,-2},{ 0, 2}},
@@ -217,10 +217,10 @@ local TRS={
[10]={{ 1, 0},{ 1,-1}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-1},{ 1,-2}},
[30]={{-1, 0},{-1,-1}},
[12]={{ 1, 0},{ 1, 1}},
[21]={{-1,-1},{-1, 1}},
[32]={{-1, 0},{-1, 1}},
[23]={{ 1,-1},{ 1, 1}},
[12]={{ 1, 0},{ 1,-1},{ 1, 1}},
[21]={{-1,-1},{-1, 1},{-1,-1}},
[32]={{-1, 0},{-1,-1},{-1, 1}},
[23]={{ 1,-1},{ 1, 1},{ 1,-1}},
[02]={{ 0, 1}},
[20]={{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0}},
@@ -286,7 +286,7 @@ local TRS={
{},--L5
{
[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}},
[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}},

View File

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

View File

@@ -1,85 +1,85 @@
return{
{"sprint_10", id=1, x=0, y=0, size=35,shape=1,icon="sprint", unlock={2,3}},
{"sprint_20", id=2, 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}},
{"sprint_100", id=4, x=-200, y=-400, size=45,shape=1,icon="sprint", unlock={5,7}},
{"sprint_400", id=5, x=-400, y=-400, size=35,shape=1,icon="sprint", unlock={6}},
{"sprint_1000", id=6, 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}},
{"drought_lunatic", id=8, 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}},
{"marathon_hard", id=10, x=0, y=-800, size=45,shape=1,icon="flag", unlock={27}},
{"solo_1", id=11, x=-300, y=-1000, size=35,shape=1,icon="solo", unlock={12}},
{"solo_2", id=12, x=-500, y=-1000, size=35,shape=1,icon="solo", unlock={13}},
{"solo_3", id=13, x=-700, y=-1000, size=35,shape=1,icon="solo", unlock={14,16}},
{"solo_4", id=14, x=-900, y=-1000, size=35,shape=1,icon="solo", unlock={15}},
{"solo_5", id=15, 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}},
{"techmino49_hard", id=17, x=-900, y=-1400, size=35,shape=1,icon="royale", unlock={18}},
{"techmino49_ultimate", id=18, x=-900, y=-1600, size=35,shape=1,icon="royale", unlock={}},
{name="sprint_10", x=0, y=0, size=35,shape=1,icon="sprint", unlock={"sprint_20","sprint_40"}},
{name="sprint_20", x=-300, y=0, size=45,shape=1,icon="sprint", unlock={}},
{name="sprint_40", x=0, y=-400, size=55,shape=1,icon="sprint", unlock={"sprint_100","marathon_normal","custom_clear","custom_puzzle","sprintPenta"}},
{name="sprint_100", x=-200, y=-400, size=45,shape=1,icon="sprint", unlock={"sprint_400","drought_normal"}},
{name="sprint_400", x=-400, y=-400, size=35,shape=1,icon="sprint", unlock={"sprint_1000"}},
{name="sprint_1000", x=-600, y=-400, size=35,shape=1,icon="sprint", unlock={}},
{name="drought_normal", x=-400, y=-200, size=35,shape=1,icon="noI", unlock={"drought_lunatic"}},
{name="drought_lunatic", x=-600, y=-200, size=35,shape=1,icon="mess", unlock={}},
{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"}},
{name="marathon_hard", x=0, y=-800, size=45,shape=1,icon="flag", unlock={"master_beginner"}},
{name="solo_1", x=-300, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_2"}},
{name="solo_2", x=-500, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_3"}},
{name="solo_3", x=-700, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_4","techmino49_easy"}},
{name="solo_4", x=-900, y=-1000, size=35,shape=1,icon="solo", unlock={"solo_5"}},
{name="solo_5", x=-1100, y=-1000, size=35,shape=1,icon="solo", unlock={}},
{name="techmino49_easy", x=-900, y=-1200, size=35,shape=1,icon="royale", unlock={"techmino49_hard","techmino99_easy"}},
{name="techmino49_hard", x=-900, y=-1400, size=35,shape=1,icon="royale", unlock={"techmino49_ultimate"}},
{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}},
{"techmino99_hard", id=20, x=-1100, y=-1600, size=35,shape=1,icon="royale", unlock={21}},
{"techmino99_ultimate", id=21, 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}},
{"round_2", id=23, x=-500, y=-800, size=35,shape=1,icon="round", unlock={24}},
{"round_3", id=24, x=-700, y=-800, size=35,shape=1,icon="round", unlock={25}},
{"round_4", id=25, x=-900, y=-800, size=35,shape=1,icon="round", unlock={26}},
{"round_5", id=26, x=-1100, y=-800, size=35,shape=1,icon="round", unlock={}},
{name="techmino99_easy", x=-1100, y=-1400, size=35,shape=1,icon="royale", unlock={"techmino99_hard"}},
{name="techmino99_hard", x=-1100, y=-1600, size=35,shape=1,icon="royale", unlock={"techmino99_ultimate"}},
{name="techmino99_ultimate", x=-1100, y=-1800, size=35,shape=1,icon="royale", unlock={}},
{name="round_1", x=-300, y=-800, size=35,shape=1,icon="round", unlock={"round_2"}},
{name="round_2", x=-500, y=-800, size=35,shape=1,icon="round", unlock={"round_3"}},
{name="round_3", x=-700, y=-800, size=35,shape=1,icon="round", unlock={"round_4"}},
{name="round_4", x=-900, y=-800, size=35,shape=1,icon="round", unlock={"round_5"}},
{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}},
{"master_adavnce", id=28, x=0, y=-1200, size=35,shape=1,icon="master", unlock={29,30}},
{"master_final", id=29, 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="master_beginner", x=0, y=-1000, size=35,shape=1,icon="master", unlock={"master_adavnce"}},
{name="master_adavnce", x=0, y=-1200, size=35,shape=1,icon="master", unlock={"master_final","GM"}},
{name="master_final", x=0, y=-1400, size=40,shape=2,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}},
{"blind_normal", id=32, x=150, y=-800, size=35,shape=1,icon="blind", unlock={33}},
{"blind_hard", id=33, x=150, y=-900, size=35,shape=1,icon="blind", unlock={34}},
{"blind_lunatic", id=34, x=150, y=-1000, size=35,shape=1,icon="blind", unlock={35}},
{"blind_ultimate", id=35, x=150, y=-1100, size=35,shape=1,icon="blind", unlock={}},
{name="blind_easy", x=150, y=-700, size=35,shape=1,icon="blind", unlock={"blind_normal"}},
{name="blind_normal", x=150, y=-800, size=35,shape=1,icon="blind", unlock={"blind_hard"}},
{name="blind_hard", x=150, y=-900, size=35,shape=1,icon="blind", unlock={"blind_lunatic"}},
{name="blind_lunatic", x=150, y=-1000, size=35,shape=1,icon="blind", unlock={"blind_ultimate"}},
{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}},
{"survivor_normal", id=38, x=500, y=-600, size=35,shape=1,icon="survivor",unlock={39,42,44,46}},
{"survivor_hard", id=39, x=700, y=-600, size=35,shape=1,icon="survivor",unlock={40}},
{"survivor_lunatic", id=40, x=900, y=-600, size=35,shape=1,icon="survivor",unlock={41}},
{"survivor_ultimate", id=41, 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}},
{"attacker_ultimate", id=43, x=300, y=-1000, size=35,shape=1,icon="attacker",unlock={}},
{name="survivor_easy", x=300, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_normal"}},
{name="survivor_normal", x=500, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_hard","attacker_hard","defender_normal","dig_hard"}},
{name="survivor_hard", x=700, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_lunatic"}},
{name="survivor_lunatic", x=900, y=-600, size=35,shape=1,icon="survivor", unlock={"survivor_ultimate"}},
{name="survivor_ultimate", x=1100, y=-600, size=35,shape=1,icon="survivor", unlock={}},
{name="attacker_hard", x=300, y=-800, size=35,shape=1,icon="attacker", unlock={"attacker_ultimate"}},
{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}},
{"defender_lunatic", id=45, x=500, y=-1000, size=35,shape=1,icon="defender",unlock={}},
{name="defender_normal", x=500, y=-800, size=35,shape=1,icon="defender", unlock={"defender_lunatic"}},
{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}},
{"dig_ultimate", id=47, x=700, y=-1000, size=35,shape=1,icon="dig", unlock={}},
{name="dig_hard", x=700, y=-800, size=35,shape=1,icon="dig", unlock={"dig_ultimate"}},
{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}},
{"c4wtrain_normal", id=49, x=700, y=-400, size=35,shape=1,icon="c4wtrain",unlock={50}},
{"c4wtrain_lunatic", id=50, x=900, y=-400, size=35,shape=1,icon="c4wtrain",unlock={}},
{name="bigbang", x=400, y=-400, size=55,shape=1,icon="bigbang", unlock={"c4wtrain_normal","pctrain_normal","tech_normal"}},
{name="c4wtrain_normal", x=700, y=-400, size=35,shape=1,icon="c4wtrain", unlock={"c4wtrain_lunatic"}},
{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}},
{"pctrain_lunatic", id=52, 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}},
{"pcchallenge_hard", id=54, x=1000, y=-100, size=35,shape=1,icon="pcchallenge",unlock={55}},
{"pcchallenge_lunatic", id=55, 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}},
{"tech_normal+", id=57, x=650, y=150, size=35,shape=1,icon="tech", unlock={64}},
{"tech_hard", id=58, x=400, y=50, size=35,shape=1,icon="tech", unlock={59,60}},
{"tech_hard+", id=59, 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}},
{"tech_lunatic+", id=61, 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}},
{"tech_ultimate+", id=63, 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}},
{"tsd_hard", id=65, x=1000, y=200, size=35,shape=1,icon="tsd", unlock={66}},
{"tsd_ultimate", id=66, x=1200, y=200, size=35,shape=1,icon="tsd", unlock={}},
{name="pctrain_normal", x=700, y=-200, size=35,shape=1,icon="pctrain", unlock={"pctrain_lunatic","pcchallenge_normal"}},
{name="pctrain_lunatic", x=900, y=-200, size=35,shape=1,icon="pctrain", unlock={}},
{name="pcchallenge_normal", x=800, y=-100, size=35,shape=1,icon="pcchallenge", unlock={"pcchallenge_hard"}},
{name="pcchallenge_hard", x=1000, y=-100, size=35,shape=1,icon="pcchallenge", unlock={"pcchallenge_lunatic"}},
{name="pcchallenge_lunatic",x=1200, y=-100, size=35,shape=1,icon="pcchallenge", unlock={}},
{name="tech_normal", x=400, y=-100, size=35,shape=1,icon="tech", unlock={"tech_normal+","tech_hard"}},
{name="tech_normal+", x=650, y=150, size=35,shape=1,icon="tech", unlock={"tsd_easy"}},
{name="tech_hard", x=400, y=50, size=35,shape=1,icon="tech", unlock={"tech_hard+","tech_lunatic"}},
{name="tech_hard+", x=250, y=50, size=35,shape=1,icon="tech", unlock={}},
{name="tech_lunatic", x=400, y=200, size=35,shape=1,icon="tech", unlock={"tech_lunatic+","tech_ultimate"}},
{name="tech_lunatic+", x=250, y=200, size=35,shape=1,icon="tech", unlock={}},
{name="tech_ultimate", x=400, y=350, size=35,shape=1,icon="tech", unlock={"tech_ultimate+"}},
{name="tech_ultimate+", x=250, y=350, size=35,shape=1,icon="tech", unlock={}},
{name="tsd_easy", x=800, y=200, size=35,shape=1,icon="tsd", unlock={"tsd_hard"}},
{name="tsd_hard", x=1000, y=200, size=35,shape=1,icon="tsd", unlock={"tsd_ultimate"}},
{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}},
{"ultra", id=68, 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={}},
{"infinite_dig", id=70, 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={}},
{"custom_puzzle", id=72, 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="zen", x=-900, y=-600, size=35,shape=1,icon="zen", unlock={"ultra","infinite","infinite_dig"}},
{name="ultra", x=-1100, y=-400, size=35,shape=1,icon="ultra", unlock={}},
{name="infinite", x=-900, y=-400, size=35,shape=1,icon="infinite", unlock={}},
{name="infinite_dig", x=-1100, y=-600, size=35,shape=1,icon="infinite_dig",unlock={}},
{name="custom_clear", x=200, y=-350, size=45,shape=3,icon="custom", unlock={}},
{name="custom_puzzle", x=200, y=-200, size=45,shape=3,icon="puzzle", 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={
none=NULL,
bag=function(P)
local bag0,bag=P.gameEnv.bag,{}
for i=1,#bag0 do bag[i]=bag0[i]end
repeat P:getNext(rem(bag,rnd(#bag)))until not bag[1]
local bag=P.gameEnv.bag
local L
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,
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
local i
local j=0
repeat
i=rnd(7)
i=bag[rnd(L)]
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
P:getNext(i)
@@ -105,13 +110,33 @@ local freshPrepare={
end
end,
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
local count=0
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)
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={
none=NULL,
@@ -124,10 +149,12 @@ local freshMethod={
end,
his4=function(P)
if #P.next<6 then
local bag=P.gameEnv.bag
local L=#bag
for n=1,4 do
local j,i=0
repeat
i=rnd(7)
i=bag[rnd(L)]
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
P:getNext(i)
@@ -137,13 +164,29 @@ local freshMethod={
end,
rnd=function(P)
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
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)
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 clearName={"single","double","triple","techrash","pentcrash"}
@@ -220,7 +263,7 @@ end
local function updateTasks(P)
local L=P.tasks
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
local function Pupdate_alive(P,dt)
@@ -281,7 +324,7 @@ local function Pupdate_alive(P,dt)
mov=mov+1
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
end
else
@@ -306,7 +349,7 @@ local function Pupdate_alive(P,dt)
mov=mov+1
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
end
else
@@ -353,42 +396,44 @@ local function Pupdate_alive(P,dt)
P.waiting=P.waiting-1
goto stop
end
if P.curY~=P.y_img then
local D=P.dropDelay
if D>1 then
P.dropDelay=D-1
goto stop
end
if D==1 then
P.curY=P.curY-1
else
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)
if P.cur then
if P.curY~=P.y_img then
local D=P.dropDelay
if D>1 then
P.dropDelay=D-1
goto stop
end
if D==1 then
P.curY=P.curY-1
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
P.spinLast=false
if P.y_img~=P.curY then
P.dropDelay=P.gameEnv.drop
elseif P.AI_mode=="CC"then
P.AI_needFresh=true
if not P.AIdata._20G and P.gameEnv.drop<P.AI_delay0*.5 then
CC_switch20G(P)
P.spinLast=false
if P.y_img~=P.curY then
P.dropDelay=P.gameEnv.drop
elseif P.AI_mode=="CC"then
P.AI_needFresh=true
if not P.AIdata._20G and P.gameEnv.drop<P.AI_delay0*.5 then
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
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
::stop::
@@ -422,11 +467,6 @@ local function Pupdate_dead(P,dt)
end
end
::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
updateFXs(P,dt)
updateTasks(P)
@@ -499,15 +539,12 @@ local function drawFXs(P)
end--clearFX
end
local function Pdraw_norm(P)
local curColor=P.cur.color
local _
gc.push("transform")
gc.translate(P.x,P.y)gc.scale(P.size)
--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.setColor(0,0,0,.6)gc.rectangle("fill",0,-10,300,610)
if P.gameEnv.grid then
gc.setLineWidth(1)
gc.setColor(1,1,1,.2)
@@ -517,7 +554,9 @@ local function Pdraw_norm(P)
gc.line(0,y,300,y)
end
end--Grid
gc.setLineWidth(2)
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
for j=int(P.fieldBeneath/30+1),#P.field do
for i=1,10 do
@@ -551,7 +590,8 @@ local function Pdraw_norm(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
gc.setColor(1,1,1,.3)
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)
end
::E::
gc.setScissor()--In-playField things
gc.translate(0,-P.fieldBeneath)
gc.setLineWidth(2)
gc.setColor(1,1,1)
gc.rectangle("line",-1,-11,302,612)--Draw boarder
gc.rectangle("line",301,0,15,601)--Draw atkBuffer boarder
local h=0
for i=1,#P.atkBuffer do
local A=P.atkBuffer[i]
local bar=A.amount*30
if h+bar>600 then bar=600-h end
if not A.sent then
if A.time<20 then
bar=bar*(20*A.time)^.5*.05
--Appear
end
if A.countdown>0 then
gc.setColor(attackColor[A.lv][1])
gc.rectangle("fill",303,599-h,11,-bar+3)
gc.setColor(attackColor[A.lv][2])
gc.rectangle("fill",303,599-h+(-bar+3),11,-(-bar+3)*(1-A.countdown/A.cd0))
--Timing
gc.setColor(1,1,1)
gc.rectangle("line",-1,-11,302,612)--Boarder
gc.rectangle("line",301,0,15,601)--AtkBuffer boarder
gc.rectangle("line",-16,-3,15,604)--B2b bar boarder
--Buffer line
local h=0
for i=1,#P.atkBuffer do
local A=P.atkBuffer[i]
local bar=A.amount*30
if h+bar>600 then bar=600-h end
if not A.sent then
if A.time<20 then
bar=bar*(20*A.time)^.5*.05
--Appear
end
if A.countdown>0 then
gc.setColor(attackColor[A.lv][1])
gc.rectangle("fill",303,599-h,11,-bar+3)
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
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
gc.setColor(attackColor[A.lv][1])
bar=bar*(20-A.time)*.05
gc.rectangle("fill",303,599-h,11,-bar+2)
--Disappear
end
else
gc.setColor(attackColor[A.lv][1])
bar=bar*(20-A.time)*.05
gc.rectangle("fill",303,599-h,11,-bar+2)
--Disappear
h=h+bar
end
--B2B indictator
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
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)
--Draw Hold
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)
if P.holded then gc.setColor(.6,.5,.5)end
local B=P.hd.bk
for i=1,#B do for j=1,#B[1]do
if B[i][j]then
drawPixel(i+17.5-#B*.5,j-2.7-#B[1]*.5,P.hd.color)
end
end end
end--Hold
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
if P.hd then
if P.holded then gc.setColor(.6,.5,.5)end
local B=P.hd.bk
for i=1,#B do for j=1,#B[1]do
if B[i][j]then
drawPixel(i+17.5-#B*.5,j-2.7-#B[1]*.5,P.hd.color)
end
end end
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
local L=P.gameEnv.bagLen
local C=-P.pieceCount%L--phase
gc.setColor(.5,.5,.5)
for i=C,N-1,L do
local y=72*i+36
gc.line(320,y,442,y)
gc.line(321+P.fieldOff.x,y,441,y)
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)
if game.frame<180 then
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)
end
gc.setColor(1,1,1,P.swappingAtkMode*.025)
gc.setLineWidth(2)
setFont(18)
for i=1,4 do
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)
if P.waiting==-1 then
if P.cur and P.waiting==-1 then
gc.setColor(1,1,1,.3)
for i=1,P.r do for j=1,P.c do
if P.cur.bk[i][j]then
@@ -828,14 +876,13 @@ local function Pdraw_demo(P)
end end--Block
end
local id=P.hd.id
if id>0 then
if P.hd then
local id=P.hd.id
_=P.color[id]
gc.setColor(_[1],_[2],_[3],.3)
_=miniBlock[P.hd.id]
_=miniBlock[id]
gc.draw(_,15,30,nil,16,nil,0,_:getHeight()*.5)
end
--Hold
end--Hold
local N=1
while N<=P.gameEnv.next and P.next[N]do
@@ -845,8 +892,7 @@ local function Pdraw_demo(P)
_=miniBlock[id]
gc.draw(_,285,40*N-10,nil,16,nil,_:getWidth(),_:getHeight()*.5)
N=N+1
end
--Next
end--Next
gc.setColor(1,1,1)
gc.translate(-P.fieldOff.x,-P.fieldOff.y)
@@ -1248,28 +1294,30 @@ function player.spin(P,d,ifpre)
end
end
function player.resetBlock(P)
local id=P.cur.id
local C=P.cur
local id=C.id
local face=P.gameEnv.face[id]
local sc=scs[id][face]
P.sc=sc --spin center
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)
local y=21+ceil(P.fieldBeneath/30)
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
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
end
end
--IMS
end--IMS
end
function player.hold(P,ifpre)
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
local H,B=P.hd,P.cur
if H and H.id==B.id and H.name==B.name or P.ctrlCount>1 then
if H and C and H.id==C.id and H.name==C.name or P.ctrlCount>1 then
P:fineError(1)
end
@@ -1277,20 +1325,31 @@ function player.hold(P,ifpre)
P.spinLast=false
P.ctrlCount=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.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
P.cur,P.hd=H,C--Swap hold
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
SFX.play(ifpre and"prehold"or"hold")
@@ -1298,6 +1357,7 @@ function player.hold(P,ifpre)
P.stat.hold=P.stat.hold+1
end
end
function player.getNext(P,n)
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}
@@ -1310,37 +1370,41 @@ function player.popNext(P)--pop next queue to hand
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
local _=P.keyPressing
if _[8]and P.gameEnv.hold and P.gameEnv.ihs then
P:hold(true)
_[8]=false
else
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)
if P.cur then
P.pieceCount=P.pieceCount+1
if P.AI_mode=="CC"then BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])end
local _=P.keyPressing
if _[8]and P.gameEnv.hold and P.gameEnv.ihs then
P:hold(true)
_[8]=false
else
if _[3]then
if _[4]then
P:spin(2,true)
else
P:spin(1,true)
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
if _[3]then
if _[4]then
P:spin(2,true)
else
P:spin(1,true)
end
elseif _[4]then
P:spin(3,true)
end
elseif _[4]then
P:spin(3,true)
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
if _[6]then P.act.hardDrop(P)_[6]=false end--IHdS
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
function player.drop(P)--Place piece
local _
@@ -1783,60 +1847,6 @@ end
--------------------------</Methods>--------------------------
--------------------------<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()
FILE.saveData()
local M=curMode
@@ -1845,16 +1855,17 @@ local function gameOver()
local P=players[1]
R=R(P)--new rank
if R then
local r=modeRanks[M.id]--old rank
local r=modeRanks[M.name]--old rank
local _
if R>r then
modeRanks[M.id]=R
modeRanks[M.name]=R
_=true
end
for i=1,#M.unlock do
local m=M.unlock[i]
if not modeRanks[m]then
modeRanks[m]=Modes[m].score and 0 or 6
local n=Modes[m].name
if not modeRanks[n]then
modeRanks[n]=Modes[m].score and 0 or 6
_=true
end
end
@@ -1877,7 +1888,7 @@ local function gameOver()
D.date=os.date("%Y/%m/%d %H:%M")
ins(L,p+1,D)
if L[11]then L[11]=nil end
FILE.saveRecord(M.saveFileName,L)
FILE.saveRecord(M.name,L)
end
end
end
@@ -1923,8 +1934,9 @@ function player.win(P,result)
end
if P.human then
gameOver()
TASK.new(TICK.autoPause,{0})
end
P:newTask(tick.finish)
P:newTask(TICK.finish)
end
function player.lose(P)
if P.life>0 then
@@ -1968,7 +1980,7 @@ function player.lose(P)
end
P.lastRecv=A
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
freshMostBadge()
end
@@ -2001,9 +2013,10 @@ function player.lose(P)
end
end
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
P:newTask(tick.lose)
P:newTask(TICK.lose)
end
if #players.alive==1 then
players.alive[1]:win()
@@ -2030,7 +2043,7 @@ function player.act.moveLeft(P,auto)
P.keyPressing[1]=false
end
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
local y0=P.curY
P:freshgho()
@@ -2056,7 +2069,7 @@ function player.act.moveRight(P,auto)
P.keyPressing[2]=false
end
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
local y0=P.curY
P:freshgho()
@@ -2072,21 +2085,21 @@ function player.act.moveRight(P,auto)
end
end
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:spin(1)
P.keyPressing[3]=false
end
end
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:spin(3)
P.keyPressing[4]=false
end
end
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:spin(2)
P.keyPressing[5]=false
@@ -2098,7 +2111,7 @@ function player.act.hardDrop(P)
P:changeAtkMode(3)
end
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.gameEnv.dropFX then
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
else
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
P.curY=P.curY-1
P.spinLast=false
@@ -2143,12 +2156,12 @@ function player.act.func(P)
end
function player.act.restart(P)
if P.gameEnv.quickR or game.frame<180 then
TASK.clear("play")
TASK.removeTask_code(TICK.autoPause)
resetPartGameData()
end
end
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
while not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)do
P.curX=P.curX-1
@@ -2171,7 +2184,7 @@ function player.act.insLeft(P,auto)
end
end
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
while not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)do
P.curX=P.curX+1
@@ -2194,7 +2207,7 @@ function player.act.insRight(P,auto)
end
end
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
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
end
@@ -2205,14 +2218,14 @@ function player.act.insDown(P)
end
end
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.spinLast=false
end
end
function player.act.down4(P)
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.spinLast=false
else
@@ -2221,34 +2234,36 @@ function player.act.down4(P)
end
end
function player.act.down10(P)
for _=1,10 do
if P.curY~=P.y_img then
P.curY=P.curY-1
P.spinLast=false
else
break
if P.cur then
for _=1,10 do
if P.curY~=P.y_img then
P.curY=P.curY-1
P.spinLast=false
else
break
end
end
end
end
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.hardDrop(P)
end
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.hardDrop(P)
end
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.insDown(P)
P.act.insRight(P)
P.act.hardDrop(P)
end
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.insDown(P)
P.act.insLeft(P)
@@ -2319,10 +2334,11 @@ local function newEmptyPlayer(id,x,y,size)
P.showTime=nil
P.keepVisible=true
P.cur={bk={{}},id=0,color=0,name=0}--shape,shapeID,colorID,nameID
P.sc,P.dir,P.r,P.c={0,0},0,0,0--IMG.spinCenter,direction,row,col
--P.cur={bk=matrix[2], id=shapeID, color=colorID, name=nameID}
--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.hd={bk={{}},id=0,color=0,name=0}
P.holded=false
P.next={}
@@ -2335,8 +2351,7 @@ local function newEmptyPlayer(id,x,y,size)
P.human=false
P.RS=kickList.TRS
-- prepareSequence 这个参数在调用prepareSequence时被初始化
P.newNext=nil
-- P.newNext=nil--call prepareSequence()to get a function to get new next
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
@@ -2391,7 +2406,7 @@ local function applyGameEnv(P)--finish gameEnv processing
ENV.sdarr=max(ENV.sdarr,ENV.minsdarr)
ENV.next=min(ENV.next,setting.maxNext)
if ENV.sequence~="bag"then
if ENV.sequence~="bag"and ENV.sequence~="loop"then
ENV.bagLine=false
else
ENV.bagLen=#ENV.bag
@@ -2543,11 +2558,12 @@ function PLY.newAIPlayer(id,x,y,size,AIdata)
loadGameEnv(P)
applyGameEnv(P)
prepareSequence(P)
local ENV=P.gameEnv
ENV.face={0,0,0,0,0,0,0}
ENV.skin={1,5,8,2,10,3,7}
prepareSequence(P)
P.human=false
loadAI(P,AIdata)
end

View File

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