界面美化/死亡动画/自定义序列编辑器
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"),
|
||||
|
||||
|
||||
@@ -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.);
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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"),
|
||||
},
|
||||
|
||||
13
main.lua
13
main.lua
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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],
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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}},
|
||||
|
||||
@@ -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},
|
||||
|
||||
146
parts/modes.lua
146
parts/modes.lua
@@ -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={}},
|
||||
}
|
||||
562
parts/player.lua
562
parts/player.lua
@@ -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
|
||||
|
||||
@@ -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
72
parts/tick.lua
Normal 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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user