From 882b841d3f5ea3277e456d4a83d42d146fbd0bda Mon Sep 17 00:00:00 2001 From: MrZ_26 Date: Wed, 15 Jul 2020 23:22:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=95=8C=E9=9D=A2=E7=BE=8E=E5=8C=96/=E6=AD=BB?= =?UTF-8?q?=E4=BA=A1=E5=8A=A8=E7=94=BB/=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E7=BC=96=E8=BE=91=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Zframework/file.lua | 7 +- Zframework/init.lua | 78 +- Zframework/languages.lua | 670 ++++++++++-------- Zframework/light.lua | 4 +- Zframework/paint.lua | 92 ++- Zframework/scene.lua | 6 + Zframework/shader.lua | 4 +- {shader => Zframework/shader}/alpha.glsl | 0 {shader => Zframework/shader}/aura.glsl | 2 +- {shader => Zframework/shader}/glow.glsl | 0 .../shader}/lightRender.glsl | 0 {shader => Zframework/shader}/rainbow.glsl | 0 {shader => Zframework/shader}/shadowMap.glsl | 0 {shader => Zframework/shader}/strap.glsl | 0 {shader => Zframework/shader}/warning.glsl | 0 Zframework/task.lua | 7 - Zframework/timer.lua | 39 +- Zframework/widget.lua | 3 - Zframework/widgetList.lua | 109 ++- main.lua | 13 +- modes/custom_clear.lua | 1 + modes/custom_puzzle.lua | 1 + modes/master_adavnce.lua | 2 +- modes/master_final.lua | 5 +- modes/tsd_easy.lua | 2 +- parts/ai.lua | 2 +- parts/default_data.lua | 2 +- parts/gametoolfunc.lua | 3 +- parts/kickList.lua | 18 +- parts/list.lua | 2 +- parts/modes.lua | 146 ++-- parts/player.lua | 562 ++++++++------- parts/texture.lua | 2 +- parts/tick.lua | 72 ++ parts/updateLog.lua | 12 +- 35 files changed, 1054 insertions(+), 812 deletions(-) rename {shader => Zframework/shader}/alpha.glsl (100%) rename {shader => Zframework/shader}/aura.glsl (96%) rename {shader => Zframework/shader}/glow.glsl (100%) rename {shader => Zframework/shader}/lightRender.glsl (100%) rename {shader => Zframework/shader}/rainbow.glsl (100%) rename {shader => Zframework/shader}/shadowMap.glsl (100%) rename {shader => Zframework/shader}/strap.glsl (100%) rename {shader => Zframework/shader}/warning.glsl (100%) create mode 100644 parts/tick.lua diff --git a/Zframework/file.lua b/Zframework/file.lua index dd1a318c..022d36ca 100644 --- a/Zframework/file.lua +++ b/Zframework/file.lua @@ -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 diff --git a/Zframework/init.lua b/Zframework/init.lua index 1551379b..5486d31f 100644 --- a/Zframework/init.lua +++ b/Zframework/init.lua @@ -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 xM.y-s and yM.x-s and xM.y-s and y0 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) diff --git a/Zframework/languages.lua b/Zframework/languages.lua index 49b5d2fe..6a310492 100644 --- a/Zframework/languages.lua +++ b/Zframework/languages.lua @@ -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="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 diff --git a/Zframework/scene.lua b/Zframework/scene.lua index b9c0bf6b..be1c8fa6 100644 --- a/Zframework/scene.lua +++ b/Zframework/scene.lua @@ -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 diff --git a/Zframework/shader.lua b/Zframework/shader.lua index f4f2343f..3dddbd71 100644 --- a/Zframework/shader.lua +++ b/Zframework/shader.lua @@ -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"), diff --git a/shader/alpha.glsl b/Zframework/shader/alpha.glsl similarity index 100% rename from shader/alpha.glsl rename to Zframework/shader/alpha.glsl diff --git a/shader/aura.glsl b/Zframework/shader/aura.glsl similarity index 96% rename from shader/aura.glsl rename to Zframework/shader/aura.glsl index 8b734477..fe0b3cf2 100644 --- a/shader/aura.glsl +++ b/Zframework/shader/aura.glsl @@ -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.); } \ No newline at end of file diff --git a/shader/glow.glsl b/Zframework/shader/glow.glsl similarity index 100% rename from shader/glow.glsl rename to Zframework/shader/glow.glsl diff --git a/shader/lightRender.glsl b/Zframework/shader/lightRender.glsl similarity index 100% rename from shader/lightRender.glsl rename to Zframework/shader/lightRender.glsl diff --git a/shader/rainbow.glsl b/Zframework/shader/rainbow.glsl similarity index 100% rename from shader/rainbow.glsl rename to Zframework/shader/rainbow.glsl diff --git a/shader/shadowMap.glsl b/Zframework/shader/shadowMap.glsl similarity index 100% rename from shader/shadowMap.glsl rename to Zframework/shader/shadowMap.glsl diff --git a/shader/strap.glsl b/Zframework/shader/strap.glsl similarity index 100% rename from shader/strap.glsl rename to Zframework/shader/strap.glsl diff --git a/shader/warning.glsl b/Zframework/shader/warning.glsl similarity index 100% rename from shader/warning.glsl rename to Zframework/shader/warning.glsl diff --git a/Zframework/task.lua b/Zframework/task.lua index 4c15738c..abccb835 100644 --- a/Zframework/task.lua +++ b/Zframework/task.lua @@ -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 diff --git a/Zframework/timer.lua b/Zframework/timer.lua index 0a67c0e9..2a075891 100644 --- a/Zframework/timer.lua +++ b/Zframework/timer.lua @@ -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 xM.y-s and yM.x-s and xM.y-s and y0 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 diff --git a/Zframework/widget.lua b/Zframework/widget.lua index 775b98c6..b95eac3d 100644 --- a/Zframework/widget.lua +++ b/Zframework/widget.lua @@ -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") diff --git a/Zframework/widgetList.lua b/Zframework/widgetList.lua index cdf52001..81f700e5 100644 --- a/Zframework/widgetList.lua +++ b/Zframework/widgetList.lua @@ -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"), }, diff --git a/main.lua b/main.lua index eb910d24..cd2a3275 100644 --- a/main.lua +++ b/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 diff --git a/modes/custom_clear.lua b/modes/custom_clear.lua index c64e890e..a6874bc5 100644 --- a/modes/custom_clear.lua +++ b/modes/custom_clear.lua @@ -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 diff --git a/modes/custom_puzzle.lua b/modes/custom_puzzle.lua index 630c842b..3f9a776d 100644 --- a/modes/custom_puzzle.lua +++ b/modes/custom_puzzle.lua @@ -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 diff --git a/modes/master_adavnce.lua b/modes/master_adavnce.lua index f3b3d5a5..b2688667 100644 --- a/modes/master_adavnce.lua +++ b/modes/master_adavnce.lua @@ -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], diff --git a/modes/master_final.lua b/modes/master_final.lua index e8d2af0e..f89ff460 100644 --- a/modes/master_final.lua +++ b/modes/master_final.lua @@ -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, diff --git a/modes/tsd_easy.lua b/modes/tsd_easy.lua index ea850834..63576fe2 100644 --- a/modes/tsd_easy.lua +++ b/modes/tsd_easy.lua @@ -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 diff --git a/parts/ai.lua b/parts/ai.lua index ffd067df..c7fa06dd 100644 --- a/parts/ai.lua +++ b/parts/ai.lua @@ -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 diff --git a/parts/default_data.lua b/parts/default_data.lua index 4b9b5ca4..0e1fca2a 100644 --- a/parts/default_data.lua +++ b/parts/default_data.lua @@ -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 diff --git a/parts/gametoolfunc.lua b/parts/gametoolfunc.lua index 4f3f47a6..ebac0569 100644 --- a/parts/gametoolfunc.lua +++ b/parts/gametoolfunc.lua @@ -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] diff --git a/parts/kickList.lua b/parts/kickList.lua index 38b27e8d..b8806c88 100644 --- a/parts/kickList.lua +++ b/parts/kickList.lua @@ -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}}, diff --git a/parts/list.lua b/parts/list.lua index 73dd023f..d4187330 100644 --- a/parts/list.lua +++ b/parts/list.lua @@ -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}, diff --git a/parts/modes.lua b/parts/modes.lua index 1c16fd66..b4bd8797 100644 --- a/parts/modes.lua +++ b/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={}}, } \ No newline at end of file diff --git a/parts/player.lua b/parts/player.lua index e7d0069d..93c96dbb 100644 --- a/parts/player.lua +++ b/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=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 ---------------------------------------------------- ---------------------------------------------------- -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 diff --git a/parts/texture.lua b/parts/texture.lua index bef19e9c..402c0306 100644 --- a/parts/texture.lua +++ b/parts/texture.lua @@ -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), diff --git a/parts/tick.lua b/parts/tick.lua new file mode 100644 index 00000000..205014ea --- /dev/null +++ b/parts/tick.lua @@ -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 \ No newline at end of file diff --git a/parts/updateLog.lua b/parts/updateLog.lua index 439cbd64..5feabe2c 100644 --- a/parts/updateLog.lua +++ b/parts/updateLog.lua @@ -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