diff --git a/document/mode.txt b/document/mode.txt index 011173dd..204498bf 100644 --- a/document/mode.txt +++ b/document/mode.txt @@ -6,7 +6,7 @@ 必选 模式环境变量,决定了关卡的各项属性 *属性名* *默认值* *说明* - drop 60 下落延迟(帧,支持自然数和2的整数次幂) + drop 60 下落延迟(帧,支持正整数,1/2^n,和0(20G)) lock 60 锁定延迟(帧) wait 0 出块延迟(帧) fall 0 消行延迟(帧) @@ -80,10 +80,12 @@ fineKill false 是否开启非极简即死 b2bKill false 是否开启断b2b即死 missionKill false 是否开启强制任务 - dropPiece NULL 放一块后要执行的函数,输入玩家对象 - task NULL 每帧会*继续执行*的函数,输入玩家对象,注意:使用协程技术 noInitSZO false 是否禁止SZO块开局,如果禁止,开局序列会自动跳过最多连续五个SZO + task NULL 每帧会*继续执行*的函数(或函数列表,依次执行,返回true会把自身从队列里清除)(初始化时会执行一次,可以用来设置场地等),输入玩家对象,注意:使用协程技术 + dropPiece NULL 放一块后要执行的函数(或函数列表,依次执行),输入玩家对象 + eventSet false 使用预设事件套件名称(字符串),如果指定,套件中的事件将会替换上面这几个事件(如果有) + bg 'none' 背景,只能填写内置背景的名字 bgm 'race' 背景音乐名(或者列表随机,例如{'race','push'}),只能用内置音乐库的音乐名 allowMod true 是否允许mod @@ -128,7 +130,7 @@ return{--返回一个table,你也可以在之前定义一些常量或者函数 color=COLOR.green,--颜色 env={--模式环境变量 drop=60,lock=60, - dropPiece=function(P)if P.stat.row>=40 then P:win('finish')end end, + eventSet='checkLine_40', bg='bg2',bgm='race', }, load=function()--模式加载函数,这里只生成了一个玩家,常用的单人模式可以不写,默认使用这个函数 diff --git a/parts/eventsets/attacker_h.lua b/parts/eventsets/attacker_h.lua new file mode 100644 index 00000000..d51ec2dc --- /dev/null +++ b/parts/eventsets/attacker_h.lua @@ -0,0 +1,30 @@ +return{ + task=function(P) + while true do + YIELD() + if P.control and P.atkBufferSum==0 then + local D=P.modeData + if D.wave<20 then + local t=1500-30*D.wave--1500~900 + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=12,countdown=t,cd0=t,time=0,sent=false,lv=3}) + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=10,countdown=t,cd0=t,time=0,sent=false,lv=4}) + else + local t=900-10*(D.wave-20)--900~600 + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=4}) + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=8,countdown=t,cd0=t,time=0,sent=false,lv=5}) + end + P.atkBufferSum=P.atkBufferSum+22 + P.stat.recv=P.stat.recv+22 + D.wave=D.wave+1 + if D.wave%10==0 then + if D.wave==20 then + P:_showText(text.great,0,-140,100,'appear',.6) + P.gameEnv.pushSpeed=3 + elseif D.wave==50 then + P:_showText(text.maxspeed,0,-140,100,'appear',.6) + end + end + end + end + end +} \ No newline at end of file diff --git a/parts/eventsets/attacker_u.lua b/parts/eventsets/attacker_u.lua new file mode 100644 index 00000000..f416c7b6 --- /dev/null +++ b/parts/eventsets/attacker_u.lua @@ -0,0 +1,39 @@ +return{ + task=function(P) + while true do + YIELD() + if P.control and P.atkBufferSum<4 then + local D=P.modeData + local s + local t=800-10*D.wave--800~700~600~500 + if D.wave<10 then + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(5,6)),amount=9,countdown=t,cd0=t,time=0,sent=false,lv=3}) + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=11,countdown=t,cd0=t+62,time=0,sent=false,lv=4}) + s=20 + elseif D.wave<20 then + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=11,countdown=t,cd0=t,time=0,sent=false,lv=4}) + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=13,countdown=t,cd0=t+62,time=0,sent=false,lv=5}) + s=24 + else + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(2)*9-8),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=5}) + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=14,countdown=t+62,cd0=t,time=0,sent=false,lv=5}) + s=28 + end + P.atkBufferSum=P.atkBufferSum+s + P.stat.recv=P.stat.recv+s + D.wave=D.wave+1 + if D.wave%10==0 then + if D.wave==10 then + P:_showText(text.great,0,-140,100,'appear',.6) + P.gameEnv.pushSpeed=4 + elseif D.wave==20 then + P:_showText(text.awesome,0,-140,100,'appear',.6) + P.gameEnv.pushSpeed=5 + elseif D.wave==30 then + P:_showText(text.maxspeed,0,-140,100,'appear',.6) + end + end + end + end + end +} \ No newline at end of file diff --git a/parts/eventsets/backfire_0.lua b/parts/eventsets/backfire_0.lua new file mode 100644 index 00000000..1c555287 --- /dev/null +++ b/parts/eventsets/backfire_0.lua @@ -0,0 +1,7 @@ +return{ + dropPiece=function(P) + if P.lastPiece.atk>0 then + P:receive(nil,P.lastPiece.atk,0,generateLine(P.holeRND:random(10))) + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/backfire_120.lua b/parts/eventsets/backfire_120.lua new file mode 100644 index 00000000..bfbe5688 --- /dev/null +++ b/parts/eventsets/backfire_120.lua @@ -0,0 +1,7 @@ +return{ + dropPiece=function(P) + if P.lastPiece.atk>0 then + P:receive(nil,P.lastPiece.atk,120,generateLine(P.holeRND:random(10))) + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/backfire_30.lua b/parts/eventsets/backfire_30.lua new file mode 100644 index 00000000..8a964c4b --- /dev/null +++ b/parts/eventsets/backfire_30.lua @@ -0,0 +1,7 @@ +return{ + dropPiece=function(P) + if P.lastPiece.atk>0 then + P:receive(nil,P.lastPiece.atk,30,generateLine(P.holeRND:random(10))) + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/backfire_60.lua b/parts/eventsets/backfire_60.lua new file mode 100644 index 00000000..056b4520 --- /dev/null +++ b/parts/eventsets/backfire_60.lua @@ -0,0 +1,7 @@ +return{ + dropPiece=function(P) + if P.lastPiece.atk>0 then + P:receive(nil,P.lastPiece.atk,60,generateLine(P.holeRND:random(10))) + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/c4wBase.lua b/parts/eventsets/c4wBase.lua new file mode 100644 index 00000000..8e328381 --- /dev/null +++ b/parts/eventsets/c4wBase.lua @@ -0,0 +1,27 @@ +local rem=table.remove + +return{ + task=function(P) + local F=P.field + for i=1,24 do + F[i]=FREEROW.get(20) + P.visTime[i]=FREEROW.get(20) + for x=4,7 do F[i][x]=0 end + end + if P.holeRND:random()<.6 then + local initCell={11,14,12,13,21,24} + for _=1,3 do + _=rem(initCell,P.holeRND:random(#initCell)) + F[math.floor(_/10)][3+_%10]=20 + end + else + local initCell={11,12,13,14,21,22,23,24} + rem(initCell,P.holeRND:random(5,8)) + rem(initCell,P.holeRND:random(1,4)) + for _=1,6 do + _=rem(initCell,P.holeRND:random(#initCell)) + F[math.floor(_/10)][3+_%10]=20 + end + end + end +} \ No newline at end of file diff --git a/parts/eventsets/c4wCheck_easy.lua b/parts/eventsets/c4wCheck_easy.lua new file mode 100644 index 00000000..d04f7d69 --- /dev/null +++ b/parts/eventsets/c4wCheck_easy.lua @@ -0,0 +1,18 @@ +return{ + dropPiece=function(P) + if P.lastPiece.row>0 then + for _=1,#P.clearedRow do + local h=#P.field + P.field[h+1]=FREEROW.get(20) + P.visTime[h+1]=FREEROW.get(20) + for i=4,7 do P.field[h+1][i]=0 end + end + if P.combo>P.modeData.maxCombo then + P.modeData.maxCombo=P.combo + end + if P.stat.row>=100 then + P:win('finish') + end + end + end +} \ No newline at end of file diff --git a/parts/eventsets/c4wCheck_hard.lua b/parts/eventsets/c4wCheck_hard.lua new file mode 100644 index 00000000..930d4f2e --- /dev/null +++ b/parts/eventsets/c4wCheck_hard.lua @@ -0,0 +1,20 @@ +return{ + dropPiece=function(P) + if P.lastPiece.row==0 then + P:lose() + else + for _=1,P.lastPiece.row do + local h=#P.field + P.field[h+1]=FREEROW.get(20) + P.visTime[h+1]=FREEROW.get(20) + for i=4,7 do P.field[h+1][i]=0 end + end + if P.combo>P.modeData.maxCombo then + P.modeData.maxCombo=P.combo + end + if P.stat.row>=100 then + P:win('finish') + end + end + end +} \ No newline at end of file diff --git a/parts/eventsets/checkAttack_100.lua b/parts/eventsets/checkAttack_100.lua new file mode 100644 index 00000000..0aafe291 --- /dev/null +++ b/parts/eventsets/checkAttack_100.lua @@ -0,0 +1,7 @@ +return{ + dropPiece=function(P) + if P.stat.atk>=100 then + P:win('finish') + end + end +} \ No newline at end of file diff --git a/parts/eventsets/checkClearBoard.lua b/parts/eventsets/checkClearBoard.lua new file mode 100644 index 00000000..8ce3eff2 --- /dev/null +++ b/parts/eventsets/checkClearBoard.lua @@ -0,0 +1,21 @@ +return{ + dropPiece=function(P) + if P.garbageBeneath==0 then + local D=P.modeData + D.finished=D.finished+1 + if FIELD[D.finished+1]then + P.waiting=26 + for i=#P.field,1,-1 do + FREEROW.discard(P.field[i]) + FREEROW.discard(P.visTime[i]) + P.field[i],P.visTime[i]=nil + end + setField(P,D.finished+1) + SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.6,.8,.6) + SFX.play('blip_1') + else + P:win('finish') + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/checkLine_10.lua b/parts/eventsets/checkLine_10.lua new file mode 100644 index 00000000..bbf505a5 --- /dev/null +++ b/parts/eventsets/checkLine_10.lua @@ -0,0 +1,7 @@ +return{ + dropPiece=function(P) + if P.stat.row>=10 then + P:win('finish') + end + end +} \ No newline at end of file diff --git a/parts/eventsets/checkLine_100.lua b/parts/eventsets/checkLine_100.lua new file mode 100644 index 00000000..337c196e --- /dev/null +++ b/parts/eventsets/checkLine_100.lua @@ -0,0 +1,7 @@ +return{ + dropPiece=function(P) + if P.stat.row>=100 then + P:win('finish') + end + end +} \ No newline at end of file diff --git a/parts/eventsets/checkLine_1000.lua b/parts/eventsets/checkLine_1000.lua new file mode 100644 index 00000000..c9e6536a --- /dev/null +++ b/parts/eventsets/checkLine_1000.lua @@ -0,0 +1,7 @@ +return{ + dropPiece=function(P) + if P.stat.row>=1000 then + P:win('finish') + end + end +} \ No newline at end of file diff --git a/parts/eventsets/checkLine_20.lua b/parts/eventsets/checkLine_20.lua new file mode 100644 index 00000000..b5418596 --- /dev/null +++ b/parts/eventsets/checkLine_20.lua @@ -0,0 +1,7 @@ +return{ + dropPiece=function(P) + if P.stat.row>=20 then + P:win('finish') + end + end +} \ No newline at end of file diff --git a/parts/eventsets/checkLine_40.lua b/parts/eventsets/checkLine_40.lua new file mode 100644 index 00000000..43e704af --- /dev/null +++ b/parts/eventsets/checkLine_40.lua @@ -0,0 +1,7 @@ +return{ + dropPiece=function(P) + if P.stat.row>=40 then + P:win('finish') + end + end +} \ No newline at end of file diff --git a/parts/eventsets/checkLine_400.lua b/parts/eventsets/checkLine_400.lua new file mode 100644 index 00000000..b8b34921 --- /dev/null +++ b/parts/eventsets/checkLine_400.lua @@ -0,0 +1,7 @@ +return{ + dropPiece=function(P) + if P.stat.row>=400 then + P:win('finish') + end + end +} \ No newline at end of file diff --git a/parts/eventsets/checkTurn_1.lua b/parts/eventsets/checkTurn_1.lua new file mode 100644 index 00000000..0f8c2434 --- /dev/null +++ b/parts/eventsets/checkTurn_1.lua @@ -0,0 +1,13 @@ +return{ + dropPiece=function(P) + if #PLY_ALIVE>1 then + P.control=false + local ID=P.id + repeat + ID=ID+1 + if not PLAYERS[ID]then ID=1 end + until PLAYERS[ID].alive or ID==P.id + PLAYERS[ID].control=true + end + end +} \ No newline at end of file diff --git a/parts/eventsets/checkTurn_7.lua b/parts/eventsets/checkTurn_7.lua new file mode 100644 index 00000000..7dcadd3f --- /dev/null +++ b/parts/eventsets/checkTurn_7.lua @@ -0,0 +1,13 @@ +return{ + dropPiece=function(P) + if P.stat.piece%7==0 and #PLY_ALIVE>1 then + P.control=false + local ID=P.id + repeat + ID=ID+1 + if not PLAYERS[ID]then ID=1 end + until PLAYERS[ID].alive or ID==P.id + PLAYERS[ID].control=true + end + end +} \ No newline at end of file diff --git a/parts/eventsets/classic_fast.lua b/parts/eventsets/classic_fast.lua new file mode 100644 index 00000000..e036773c --- /dev/null +++ b/parts/eventsets/classic_fast.lua @@ -0,0 +1,20 @@ +return{ + task=function(P) + P.modeData.target=10 + end, + dropPiece=function(P) + local D=P.modeData + if P.stat.row>=D.target then + D.target=D.target+10 + if D.target==110 then + P.gameEnv.drop,P.gameEnv.lock=2,2 + SFX.play('blip_1') + elseif D.target==200 then + P.gameEnv.drop,P.gameEnv.lock=1,1 + SFX.play('blip_1') + else + SFX.play('reach') + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/defender_l.lua b/parts/eventsets/defender_l.lua new file mode 100644 index 00000000..bdc54b68 --- /dev/null +++ b/parts/eventsets/defender_l.lua @@ -0,0 +1,36 @@ +return{ + task=function(P) + while true do + YIELD() + if P.control then + local D=P.modeData + D.counter=D.counter+1 + local t=math.max(240-2*D.wave,40) + if D.counter>=t then + D.counter=0 + for _=1,4 do + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=5*t,cd0=5*t,time=0,sent=false,lv=2}) + end + P.atkBufferSum=P.atkBufferSum+4 + P.stat.recv=P.stat.recv+4 + D.wave=D.wave+1 + if D.wave<=75 then + D.rpm=math.floor(144e3/t)*.1 + if D.wave==25 then + P:_showText(text.great,0,-140,100,'appear',.6) + P.gameEnv.pushSpeed=3 + P.dropDelay,P.gameEnv.drop=4,4 + elseif D.wave==50 then + P:_showText(text.awesome,0,-140,100,'appear',.6) + P.gameEnv.pushSpeed=4 + P.dropDelay,P.gameEnv.drop=3,3 + elseif D.wave==75 then + P:_showText(text.maxspeed,0,-140,100,'appear',.6) + P.dropDelay,P.gameEnv.drop=2,2 + end + end + end + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/defender_n.lua b/parts/eventsets/defender_n.lua new file mode 100644 index 00000000..4f541f4a --- /dev/null +++ b/parts/eventsets/defender_n.lua @@ -0,0 +1,36 @@ +return{ + task=function(P) + while true do + YIELD() + if P.control then + local D=P.modeData + D.counter=D.counter+1 + local t=math.max(360-D.wave*2,60) + if D.counter>=t then + D.counter=0 + for _=1,3 do + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=2*t,cd0=2*t,time=0,sent=false,lv=1}) + end + P.atkBufferSum=P.atkBufferSum+3 + P.stat.recv=P.stat.recv+3 + D.wave=D.wave+1 + if D.wave<=90 then + D.rpm=math.floor(108e3/t)*.1 + if D.wave==25 then + P:_showText(text.great,0,-140,100,'appear',.6) + P.gameEnv.pushSpeed=2 + P.dropDelay,P.gameEnv.drop=20,20 + elseif D.wave==50 then + P:_showText(text.awesome,0,-140,100,'appear',.6) + P.gameEnv.pushSpeed=3 + P.dropDelay,P.gameEnv.drop=10,10 + elseif D.wave==90 then + P.dropDelay,P.gameEnv.drop=5,5 + P:_showText(text.maxspeed,0,-140,100,'appear',.6) + end + end + end + end + end + end +} \ No newline at end of file diff --git a/parts/eventsets/dig_h.lua b/parts/eventsets/dig_h.lua new file mode 100644 index 00000000..e30c13ec --- /dev/null +++ b/parts/eventsets/dig_h.lua @@ -0,0 +1,17 @@ +return{ + task=function(P) + while true do + YIELD() + if P.control then + local D=P.modeData + D.timer=D.timer+1 + if D.timer>=math.max(90,180-D.wave)then + P:garbageRise(21,1,P:getHolePos()) + P.stat.recv=P.stat.recv+1 + D.timer=0 + D.wave=D.wave+1 + end + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/dig_u.lua b/parts/eventsets/dig_u.lua new file mode 100644 index 00000000..88e3b205 --- /dev/null +++ b/parts/eventsets/dig_u.lua @@ -0,0 +1,17 @@ +return{ + task=function(P) + while true do + YIELD() + if P.control then + local D=P.modeData + D.timer=D.timer+1 + if D.timer>=math.max(30,80-.3*D.wave)then + P:garbageRise(20+D.wave%5,1,P:getHolePos()) + P.stat.recv=P.stat.recv+1 + D.timer=0 + D.wave=D.wave+1 + end + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/get_drop_lineTarget.lua b/parts/eventsets/get_drop_lineTarget.lua new file mode 100644 index 00000000..749c327c --- /dev/null +++ b/parts/eventsets/get_drop_lineTarget.lua @@ -0,0 +1,11 @@ +return setmetatable({},{ + __index=function(self,k) + assert(type(k)=='number'and k>0) + self[k]=function(P) + if P.stat.row>=k then + P:win('finish') + end + end + return self[k] + end +}) \ No newline at end of file diff --git a/parts/eventsets/marathon_bfmax.lua b/parts/eventsets/marathon_bfmax.lua new file mode 100644 index 00000000..507d8eb1 --- /dev/null +++ b/parts/eventsets/marathon_bfmax.lua @@ -0,0 +1,35 @@ +local dropSpeed={50,40,30,25,20,15,12,9,7,5,4,3,2,1,1,.5,.5,.25,.25} + +return{ + task=function(P) + P.gameEnv.drop=60 + P.gameEnv.wait=8 + P.gameEnv.fall=20 + + P.modeData.target=10 + end, + dropPiece=function(P) + local flag + local l=P.lastPiece + if P.combo>1 then flag=true;P:showText("2x",0,-220,40,'flicker',.3)end + if l.spin then flag=true;P:showText("spin",0,-180,40,'flicker',.3)end + if l.row>1 then flag=true;P:showText("1+",0,-140,40,'flicker',.3)end + if l.pc then flag=true;P:showText("PC",0,-100,40,'flicker',.3)end + if l.hpc then flag=true;P:showText("HPC",0,-100,40,'flicker',.3)end + if flag then + P:lose() + else + local T=P.modeData.target + if P.stat.row>=T then + if T==200 then + P:win('finish') + else + T=T+10 + P.gameEnv.drop=dropSpeed[T/10] + P.modeData.target=T + SFX.play('reach') + end + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/marathon_h.lua b/parts/eventsets/marathon_h.lua new file mode 100644 index 00000000..c38fbabf --- /dev/null +++ b/parts/eventsets/marathon_h.lua @@ -0,0 +1,25 @@ +return +{ + task=function(P) + P.gameEnv.drop=.5 + P.gameEnv.wait=8 + P.gameEnv.fall=20 + + P.modeData.target=50 + end, + dropPiece=function(P) + if P.stat.row>=P.modeData.target then + if P.modeData.target==50 then + P.gameEnv.drop=.25 + P.modeData.target=100 + SFX.play('reach') + elseif P.modeData.target==100 then + P:set20G(true) + P.modeData.target=200 + SFX.play('reach') + else + P:win('finish') + end + end + end +} \ No newline at end of file diff --git a/parts/eventsets/marathon_n.lua b/parts/eventsets/marathon_n.lua new file mode 100644 index 00000000..c6b9ba45 --- /dev/null +++ b/parts/eventsets/marathon_n.lua @@ -0,0 +1,23 @@ +local dropSpeed={50,40,30,24,18,14,10,8,6,5,4,3,2,1,1,.5,.5,.25,.25} + +return +{ + task=function(P) + P.gameEnv.drop=60 + P.gameEnv.wait=8 + P.gameEnv.fall=20 + + P.modeData.target=10 + end, + dropPiece=function(P) + if P.stat.row>=P.modeData.target then + if P.modeData.target==200 then + P:win('finish') + else + P.gameEnv.drop=dropSpeed[P.modeData.target/10] + P.modeData.target=P.modeData.target+10 + SFX.play('reach') + end + end + end +} \ No newline at end of file diff --git a/parts/eventsets/master_ex.lua b/parts/eventsets/master_ex.lua new file mode 100644 index 00000000..9907131a --- /dev/null +++ b/parts/eventsets/master_ex.lua @@ -0,0 +1,34 @@ +local sectionName={"D","C","B","A","A+","S-","S","S+","S+","SS","SS","U","U","X","X+"} +local passPoint=16 + +return{ + dropPiece=function(P) + if P.modeData.rankPoint<140-passPoint then--If Less then X + local R=#P.clearedRow + if R>0 then + if R==4 then R=10 end--Techrash +10 + P.modeData.rankPoint=math.min(P.modeData.rankPoint+R,140-passPoint) + P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1] + end + end + end, + task=function(P) + P:set20G(true) + P.lockDelay=15 + P.gameEnv.lock=15 + P.gameEnv.wait=15 + P.gameEnv.fall=6 + + P.modeData.rankPoint=0 + P.modeData.rankName=sectionName[1] + while true do + YIELD() + if P.stat.frame>=3600 then + P.modeData.rankPoint=math.min(P.modeData.rankPoint+passPoint,140) + P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1] + P:win('finish') + return + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/master_final.lua b/parts/eventsets/master_final.lua new file mode 100644 index 00000000..30383e5a --- /dev/null +++ b/parts/eventsets/master_final.lua @@ -0,0 +1,51 @@ +return{ + dropPiece=function(P) + local D=P.modeData + + local c=#P.clearedRow + if c==0 and D.pt%100==99 then return end + local s=c<3 and c+1 or c==3 and 5 or 7 + if P.combo>7 then s=s+2 + elseif P.combo>3 then s=s+1 + end + D.pt=D.pt+s + + if D.pt%100==99 then + SFX.play('blip_1') + elseif D.pt>=D.target then--Level up! + s=D.target/100--range from 1 to 9 + local E=P.gameEnv + if s<4 then + P:_showText(text.stage:gsub("$1",s),0,-120,80,'fly') + --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 + D.target=D.target+100 + elseif s<10 then + if s==5 then BGM.play('distortion')end + P:_showText(text.stage:gsub("$1",s),0,-120,60,'fly',1.26) + if s==4 or s==7 then E.das=E.das-1 end + if s%3==0 then E.lock=E.lock-1 + elseif s%3==1 then E.wait=E.wait-1 + elseif s%3==2 then E.fall=E.fall-1 + end + D.target=D.target+100 + else + D.pt=1000 + P:win('finish') + end + SFX.play('reach') + end + end, + task=function(P) + P:set20G(true) + P.lockDelay=12 + P.gameEnv.lock=12 + P.gameEnv.wait=10 + P.gameEnv.fall=10 + + P.modeData.pt=0 + P.modeData.target=100 + end, +} \ No newline at end of file diff --git a/parts/eventsets/master_h.lua b/parts/eventsets/master_h.lua new file mode 100644 index 00000000..7cd7ca14 --- /dev/null +++ b/parts/eventsets/master_h.lua @@ -0,0 +1,67 @@ +local death_lock={12,11,10,9,8, 7,7,7,7,6} +local death_wait={10,9, 8, 7,6, 6,6,5,5,4} +local death_fall={10,9, 8, 7,6, 6,5,5,4,4} + +return{ + dropPiece=function(P) + local D=P.modeData + + local c=#P.clearedRow + if c==0 and D.pt%100==99 then return end + local s=c<3 and c+1 or c==3 and 5 or 7 + if P.combo>7 then s=s+2 + elseif P.combo>3 then s=s+1 + end + D.pt=D.pt+s + + if D.pt%100==99 then + SFX.play('blip_1') + elseif D.pt>=D.target then--Level up! + s=D.target/100 + local E=P.gameEnv + E.lock=death_lock[s] + E.wait=death_wait[s] + E.fall=death_fall[s] + if s==2 then + E.das=5 + BG.set('rainbow') + elseif s==4 then + E.das=4 + BG.set('rainbow2') + elseif s==5 then + if P.stat.frame>183*60 then + D.pt=500 + P:win('finish') + return + else + E.bone=true + P.gameEnv.freshLimit=10 + BG.set('glow') + BGM.play('secret7th remix') + end + elseif s==6 then + E.das=3 + BG.set('lightning') + elseif s==7 then + E.bone=true + elseif s==10 then + D.pt=1000 + P:win('finish') + return + end + D.target=D.target+100 + P:_showText(text.stage:gsub("$1",s),0,-120,80,'beat') + SFX.play('reach') + end + end, + task=function(P) + P:set20G(true) + P.lockDelay=death_lock[1] + P.gameEnv.lock=death_lock[1] + P.gameEnv.wait=death_wait[1] + P.gameEnv.fall=death_fall[1] + + P.modeData.pt=0 + P.modeData.target=100 + end, +} \ No newline at end of file diff --git a/parts/eventsets/master_l.lua b/parts/eventsets/master_l.lua new file mode 100644 index 00000000..bb1ccba6 --- /dev/null +++ b/parts/eventsets/master_l.lua @@ -0,0 +1,53 @@ +local rush_lock={20,18,16,15,14} +local rush_wait={12,10, 9, 8, 7} +local rush_fall={18,16,14,13,12} + +return{ + dropPiece=function(P) + local D=P.modeData + + local c=#P.clearedRow + if c==0 and D.pt%100==99 then return end + local s=c<3 and c+1 or c==3 and 5 or 7 + if P.combo>7 then s=s+2 + elseif P.combo>3 then s=s+1 + end + D.pt=D.pt+s + + if D.pt%100==99 then + SFX.play('blip_1') + elseif D.pt>=D.target then--Level up! + s=D.target/100 + local E=P.gameEnv + BG.set(s==1 and'bg1'or s==2 and'bg2'or s==3 and'rainbow'or 'rainbow2') + E.lock=rush_lock[s] + E.wait=rush_wait[s] + E.fall=rush_fall[s] + E.das=10-s + if s==2 then + E.arr=2 + elseif s==4 then + E.bone=true + end + + if s==5 then + D.pt=500 + P:win('finish') + else + D.target=D.target+100 + P:_showText(text.stage:gsub("$1",s),0,-120,80,'fly') + end + SFX.play('reach') + end + end, + task=function(P) + P:set20G(true) + P.lockDelay=rush_lock[1] + P.gameEnv.lock=rush_lock[1] + P.gameEnv.wait=rush_wait[1] + P.gameEnv.fall=rush_fall[1] + + P.modeData.pt=0 + P.modeData.target=100 + end, +} \ No newline at end of file diff --git a/parts/eventsets/master_n.lua b/parts/eventsets/master_n.lua new file mode 100644 index 00000000..d0ac4d8f --- /dev/null +++ b/parts/eventsets/master_n.lua @@ -0,0 +1,67 @@ +local rush_lock={20,18,16,15,14, 14,13,12,11,11} +local rush_wait={12,11,11,10,10, 10,10, 9, 9, 9} +local rush_fall={18,16,14,13,12, 12,11,11,10,10} + +return{ + dropPiece=function(P) + local D=P.modeData + + local c=#P.clearedRow + if c==0 and D.pt%100==99 then return end + local s=c<3 and c+1 or c==3 and 5 or 7 + if P.combo>7 then s=s+2 + elseif P.combo>3 then s=s+1 + end + D.pt=D.pt+s + + if D.pt%100==99 then + SFX.play('blip_1') + elseif D.pt>=D.target then--Level up! + s=D.target/100 + local E=P.gameEnv + E.lock=rush_lock[s] + E.wait=rush_wait[s] + E.fall=rush_fall[s] + + if s==2 then + E.das=8 + BG.set('rainbow') + elseif s==4 then + BG.set('rainbow2') + elseif s==5 then + if P.stat.frame>260*60 then + D.pt=500 + P:win('finish') + return + else + P.gameEnv.freshLimit=10 + E.das=7 + BG.set('glow') + BGM.play('secret8th remix') + end + elseif s==7 then + E.das=6 + BG.set('lightning') + elseif s==9 then + E.bone=true + elseif s==10 then + D.pt=1000 + P:win('finish') + return + end + D.target=D.target+100 + P:_showText(text.stage:gsub("$1",s),0,-120,80,'fly') + SFX.play('reach') + end + end, + task=function(P) + P:set20G(true) + P.lockDelay=rush_lock[1] + P.gameEnv.lock=rush_lock[1] + P.gameEnv.wait=rush_wait[1] + P.gameEnv.fall=rush_fall[1] + + P.modeData.pt=0 + P.modeData.target=100 + end, +} \ No newline at end of file diff --git a/parts/eventsets/master_ph.lua b/parts/eventsets/master_ph.lua new file mode 100644 index 00000000..a240507c --- /dev/null +++ b/parts/eventsets/master_ph.lua @@ -0,0 +1,140 @@ +return +{ + dropPiece=function(P) + local p=P.modeData.pt+P.lastPiece.row + if p>=P.modeData.target then + local ENV=P.gameEnv + local T=P.modeData.target + --Stage 1: clear 3 techrash + if T==12 then--Stage 2: swap color of S/Z & J/L + P.waiting=30 + P.curMission=false + + ENV.skin[1],ENV.skin[2]=ENV.skin[2],ENV.skin[1] + ENV.skin[3],ENV.skin[4]=ENV.skin[4],ENV.skin[3] + + ENV.lock=14 + ENV.wait=7 + ENV.fall=7 + P:setNext(4) + + P.modeData.target=26 + SFX.play('reach') + elseif T==26 then--Stage 3: dig to bottom + if not P.holdQueue[1]then P.life=P.life+1 end--1 up if ban hold + P.waiting=45 + ENV.skin[1],ENV.skin[2]=ENV.skin[2],ENV.skin[1] + ENV.skin[3],ENV.skin[4]=ENV.skin[4],ENV.skin[3] + + for i=1,10 do + if P.field[i]then + for j=1,10 do + if P.field[i][j]>0 then + P.field[i][j]=17 + P.visTime[i][j]=15 + end + end + for _=1,5 do + P.field[i][P.holeRND:random(10)]=0 + end + else + P.field[i]=FREEROW.get(0) + P.visTime[i]=FREEROW.get(30) + for j=1,10 do + if P.holeRND:random()>.9 then + P.field[i][j]=P.holeRND:random(16) + end + end + P.field[i][P.holeRND:random(10)]=0 + end + P.field[i].garbage=true + end + P.garbageBeneath=10 + for i=1,10 do + P:createClearingFX(i,1.5) + end + SYSFX.newShade(2.5,P.absFieldX,P.y+300*P.size,300*P.size,300*P.size) + + ENV.lock=13 + ENV.wait=6 + ENV.fall=6 + P:setNext(5) + + P.modeData.target=42 + SFX.play('reach') + elseif T==42 then--Stage 4: survive in high speed + if P.garbageBeneath==0 then + P.waiting=30 + ENV.lock=11 + P:setNext(6) + P:setHold(false) + ENV.bone=true + + P.modeData.target=62 + else + p=41 + end + elseif T==62 then--Stage 5: survive without easy-fresh rule + P.life=P.life+1 + ENV.lock=13 + ENV.wait=5 + ENV.fall=5 + + ENV.easyFresh=false + + P.modeData.target=126 + SFX.play('reach') + elseif T==126 then--Stage 6: speed up + P.life=P.life+1 + + ENV.lock=11 + ENV.wait=4 + ENV.fall=4 + + P.modeData.target=162 + elseif T==162 then--Stage 7: speed up+++ + P.life=P.life+1 + + ENV.lock=10 + + P:setHold(true) + P:setInvisible(180) + + P.modeData.target=226 + SFX.play('reach') + elseif T==226 then--Stage 8: final invisible + P.life=P.life+1 + + ENV.bone=false + P:setInvisible(90) + + P.modeData.target=259 + SFX.play('reach') + elseif T==259 then--Stage 9: ending + P.life=P.life+1 + for i=1,7 do ENV.skin[i]=P.holeRND:random(16)end + + P:setInvisible(40) + ENV.lock=15 + P.curMission=1 + ENV.mission={4,4,4,4,4,4,4,4} + ENV.missionKill=false + + P.modeData.target=260 + p=260 + SFX.play('blip_2') + else + p=260 + end + end + P.modeData.pt=p + end, + task=function(P) + P:set20G(true) + P.lockDelay=15 + P.gameEnv.lock=15 + P.gameEnv.wait=10 + P.gameEnv.fall=10 + P.modeData.target=12 + end, +} \ No newline at end of file diff --git a/parts/eventsets/master_u.lua b/parts/eventsets/master_u.lua new file mode 100644 index 00000000..6d979d1c --- /dev/null +++ b/parts/eventsets/master_u.lua @@ -0,0 +1,62 @@ +local death_lock={12,11,10,9,8, 7,7,7,6,6} +local death_wait={10, 9, 8,7,6, 6,5,4,4,3} +local death_fall={10, 9, 8,7,6, 5,5,4,3,3} + +return{ + dropPiece=function(P) + local D=P.modeData + + local c=#P.clearedRow + if c==0 and D.pt%100==99 then return end + local s=c<3 and c+1 or c==3 and 5 or 7 + if P.combo>7 then s=s+2 + elseif P.combo>3 then s=s+1 + end + D.pt=D.pt+s + + if D.pt%100==99 then + SFX.play('blip_1') + elseif D.pt>=D.target then--Level up! + s=D.target/100 + local E=P.gameEnv + SFX.play('reach') + E.lock=death_lock[s] + E.wait=death_wait[s] + E.fall=death_fall[s] + E.das=math.floor(6.9-s*.4) + if s==1 then + BG.set('rainbow') + elseif s==2 then + BG.set('rainbow2') + elseif s==3 then + BG.set('glow') + elseif s==5 then + if P.stat.frame>183*60 then + D.pt=500 + P:win('finish') + return + else + P.gameEnv.freshLimit=10 + BG.set('lightning') + BGM.play('secret7th remix') + end + elseif s==10 then + D.pt=1000 + P:win('finish') + return + end + D.target=D.target+100 + P:_showText(text.stage:gsub("$1",s),0,-120,80,'fly') + end + end, + task=function(P) + P:set20G(true) + P.lockDelay=death_lock[1] + P.gameEnv.lock=death_lock[1] + P.gameEnv.wait=death_wait[1] + P.gameEnv.fall=death_fall[1] + + P.modeData.pt=0 + P.modeData.target=100 + end, +} \ No newline at end of file diff --git a/parts/eventsets/pc_inf.lua b/parts/eventsets/pc_inf.lua new file mode 100644 index 00000000..3686cd99 --- /dev/null +++ b/parts/eventsets/pc_inf.lua @@ -0,0 +1,13 @@ +return function(P) + if P.lastPiece.pc then + P.gameEnv.heightLimit=4 + if P.stat.pc%5==0 then + P.gameEnv.drop=math.max(P.gameEnv.drop-1,1) + end + else + P.gameEnv.heightLimit=P.gameEnv.heightLimit-P.lastPiece.row + end + if #P.field>P.gameEnv.heightLimit then + P:lose() + end +end \ No newline at end of file diff --git a/parts/eventsets/pctrain_l.lua b/parts/eventsets/pctrain_l.lua new file mode 100644 index 00000000..86150772 --- /dev/null +++ b/parts/eventsets/pctrain_l.lua @@ -0,0 +1,46 @@ +local pc_drop={50,45,40,35,30,26,22,18,15,12} +local pc_lock={55,50,46,42,39,36,33,31,29,27} +local pc_fall={18,16,14,12,10,9,8,7,6,5} +local PCbase=require"parts.modes.PCbase" +local PClist=require"parts.modes.PClist" + +local function task_PC(P) + if P.frameRun>180 then + P.control=false + for _=1,26 do YIELD()end + P.control=true + end + local base=PCbase[P.modeData.type] + P:pushLineList(base[P.holeRND:random(#base)],P.modeData.symmetry) +end +local function check(P) + local f=P.field + if #f>0 then + if #f+P.stat.row%4>4 then + P:lose() + end + else + local type=P.stat.pc<10 and 4 or 5 + local L=PClist[type][P.holeRND:random(#PClist[type])] + local symmetry=P.holeRND:random()>.5 + P.modeData.type=type + P.modeData.symmetry=symmetry + P:pushNextList(L,symmetry) + P.modeData.counter=P.stat.piece==0 and 20 or 0 + P:newTask(task_PC) + + local s=P.stat.pc*.25 + if math.floor(s)==s and s>0 then + P.gameEnv.drop=pc_drop[s]or 10 + P.gameEnv.lock=pc_lock[s]or 25 + P.gameEnv.fall=pc_fall[s]or 4 + if s==10 then + P:_showText(text.maxspeed,0,-140,100,'appear',.6) + end + end + end +end +return{ + dropPiece=check, + task=check, +} \ No newline at end of file diff --git a/parts/eventsets/pctrain_n.lua b/parts/eventsets/pctrain_n.lua new file mode 100644 index 00000000..53772e35 --- /dev/null +++ b/parts/eventsets/pctrain_n.lua @@ -0,0 +1,37 @@ +local PCbase=require"parts.modes.PCbase" +local PClist=require"parts.modes.PClist" +local PCtype={ + 1,1,1,1,2, + 1,1,1,1,3, + 1,1,1,2, + 1,2,1,3, + 1,2,3, +} +local function task_PC(P) + P.control=false + for _=1,26 do YIELD()end + P.control=true + local base=PCbase[P.modeData.type] + P:pushLineList(base[P.holeRND:random(#base)],P.modeData.symmetry) +end +local function check(P) + local r=P.field + if #r>0 then + if #r+P.stat.row%4>4 then + P:lose() + end + else + local type=PCtype[P.stat.pc+1]or 3 + local L=PClist[type][P.holeRND:random(#PClist[type])] + local symmetry=P.holeRND:random()>.5 + P.modeData.type=type + P.modeData.symmetry=symmetry + P:pushNextList(L,symmetry) + P.modeData.counter=P.stat.piece==0 and 20 or 0 + P:newTask(task_PC) + end +end +return{ + dropPiece=check, + task=check, +} \ No newline at end of file diff --git a/parts/eventsets/rhythm_e.lua b/parts/eventsets/rhythm_e.lua new file mode 100644 index 00000000..71e5cc10 --- /dev/null +++ b/parts/eventsets/rhythm_e.lua @@ -0,0 +1,36 @@ +local dropSpeed={[0]=40,33,27,20,16,12,11,10,9,8,7,6,5,4,3,3,2,2,1,1} + +return{ + dropPiece=function(P) + if P.stat.row>=P.modeData.target then + if P.modeData.target==200 then + P:win('finish') + else + P.modeData.bpm=40+2*P.modeData.target/10 + P.modeData.beatFrame=math.floor(3600/P.modeData.bpm) + P.gameEnv.fall=P.modeData.beatFrame + P.gameEnv.wait=math.max(P.gameEnv.wait-2,0) + P.gameEnv.drop=dropSpeed[P.modeData.target/10] + P.modeData.target=P.modeData.target+10 + SFX.play('reach') + end + end + end, + task=function(P) + P.modeData.target=10 + P.modeData.bpm=40 + P.modeData.beatFrame=90 + P.modeData.counter=90 + while true do + YIELD() + P.modeData.counter=P.modeData.counter-1 + if P.modeData.counter==0 then + P.modeData.counter=P.modeData.beatFrame + SFX.play('click',.3) + P:switchKey(6,true) + P:pressKey(6) + P:switchKey(6,false) + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/rhythm_h.lua b/parts/eventsets/rhythm_h.lua new file mode 100644 index 00000000..b01b15da --- /dev/null +++ b/parts/eventsets/rhythm_h.lua @@ -0,0 +1,36 @@ +local dropSpeed={[0]=60,50,40,30,24,18,14,10,8,6,5,4,3,2,1,1,.5,.5,.25,.25} + +return{ + dropPiece=function(P) + if P.stat.row>=P.modeData.target then + if P.modeData.target==200 then + P:win('finish') + else + P.modeData.bpm=60+3*P.modeData.target/10 + P.modeData.beatFrame=math.floor(3600/P.modeData.bpm) + P.gameEnv.fall=P.modeData.beatFrame + P.gameEnv.wait=math.max(P.gameEnv.wait-1,0) + P.gameEnv.drop=dropSpeed[P.modeData.target/10] + P.modeData.target=P.modeData.target+10 + SFX.play('reach') + end + end + end, + task=function(P) + P.modeData.target=10 + P.modeData.bpm=60 + P.modeData.beatFrame=60 + P.modeData.counter=60 + while true do + YIELD() + P.modeData.counter=P.modeData.counter-1 + if P.modeData.counter==0 then + P.modeData.counter=P.modeData.beatFrame + SFX.play('click',.3) + P:switchKey(6,true) + P:pressKey(6) + P:switchKey(6,false) + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/rhythm_u.lua b/parts/eventsets/rhythm_u.lua new file mode 100644 index 00000000..e147818c --- /dev/null +++ b/parts/eventsets/rhythm_u.lua @@ -0,0 +1,40 @@ +return{ + dropPiece=function(P) + if P.stat.row>=P.modeData.target then + if P.modeData.target==200 then + P:win('finish') + else + P.modeData.bpm=120+2*P.modeData.target/10 + P.modeData.beatFrame=math.floor(3600/P.modeData.bpm) + P.gameEnv.fall=P.modeData.beatFrame + P.gameEnv.wait=math.max(P.gameEnv.wait-1,0) + if P.modeData.target==50 then + P.gameEnv.das=5 + P.gameEnv.drop=.25 + elseif P.modeData.target==100 then + P.gameEnv.das=4 + P:set20G(true) + end + P.modeData.target=P.modeData.target+10 + SFX.play('reach') + end + end + end, + task=function(P) + P.modeData.target=10 + P.modeData.bpm=120 + P.modeData.beatFrame=30 + P.modeData.counter=30 + while true do + YIELD() + P.modeData.counter=P.modeData.counter-1 + if P.modeData.counter==0 then + P.modeData.counter=P.modeData.beatFrame + SFX.play('click',.3) + P:switchKey(6,true) + P:pressKey(6) + P:switchKey(6,false) + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/survivor_e.lua b/parts/eventsets/survivor_e.lua new file mode 100644 index 00000000..10448b54 --- /dev/null +++ b/parts/eventsets/survivor_e.lua @@ -0,0 +1,19 @@ +return{ + task=function(P) + while true do + YIELD() + if P.control then + local D=P.modeData + D.timer=D.timer+1 + if D.timer>=math.max(60,150-2*D.wave)and P.atkBufferSum<4 then + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1}) + P.atkBufferSum=P.atkBufferSum+1 + P.stat.recv=P.stat.recv+1 + if D.wave==45 then P:_showText(text.maxspeed,0,-140,100,'appear',.6)end + D.timer=0 + D.wave=D.wave+1 + end + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/survivor_h.lua b/parts/eventsets/survivor_h.lua new file mode 100644 index 00000000..2d8792fe --- /dev/null +++ b/parts/eventsets/survivor_h.lua @@ -0,0 +1,26 @@ +return{ + task=function(P) + while true do + YIELD() + if P.control then + local D=P.modeData + D.timer=D.timer+1 + if D.timer>=math.max(60,180-2*D.wave)and P.atkBufferSum<15 then + local s + if D.wave%3<2 then + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1}) + s=1 + else + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=3,countdown=60,cd0=60,time=0,sent=false,lv=2}) + s=3 + end + P.atkBufferSum=P.atkBufferSum+s + P.stat.recv=P.stat.recv+s + if D.wave==60 then P:_showText(text.maxspeed,0,-140,100,'appear',.6)end + D.timer=0 + D.wave=D.wave+1 + end + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/survivor_l.lua b/parts/eventsets/survivor_l.lua new file mode 100644 index 00000000..a78315f9 --- /dev/null +++ b/parts/eventsets/survivor_l.lua @@ -0,0 +1,20 @@ +return{ + task=function(P) + while true do + YIELD() + if P.control then + local D=P.modeData + D.timer=D.timer+1 + if D.timer>=math.max(60,150-D.wave)and P.atkBufferSum<20 then + local t=math.max(60,90-D.wave) + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}) + P.atkBufferSum=P.atkBufferSum+4 + P.stat.recv=P.stat.recv+4 + if D.wave==60 then P:_showText(text.maxspeed,0,-140,100,'appear',.6)end + D.timer=0 + D.wave=D.wave+1 + end + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/survivor_n.lua b/parts/eventsets/survivor_n.lua new file mode 100644 index 00000000..c57b325e --- /dev/null +++ b/parts/eventsets/survivor_n.lua @@ -0,0 +1,25 @@ +return{ + task=function(P) + while true do + YIELD() + if P.control then + local D=P.modeData + D.timer=D.timer+1 + if D.timer>=math.max(90,180-2*D.wave)and P.atkBufferSum<8 then + local d=D.wave+1 + table.insert(P.atkBuffer, + d%4==0 and{line=generateLine(P.holeRND:random(10)),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1}or + d%4==1 and{line=generateLine(P.holeRND:random(10)),amount=2,countdown=70,cd0=70,time=0,sent=false,lv=1}or + d%4==2 and{line=generateLine(P.holeRND:random(10)),amount=3,countdown=80,cd0=80,time=0,sent=false,lv=2}or + d%4==3 and{line=generateLine(P.holeRND:random(10)),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3} + ) + P.atkBufferSum=P.atkBufferSum+d%4+1 + P.stat.recv=P.stat.recv+d%4+1 + if D.wave==45 then P:_showText(text.maxspeed,0,-140,100,'appear',.6)end + D.timer=0 + D.wave=d + end + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/survivor_u.lua b/parts/eventsets/survivor_u.lua new file mode 100644 index 00000000..d343412f --- /dev/null +++ b/parts/eventsets/survivor_u.lua @@ -0,0 +1,23 @@ +return{ + task=function(P) + while true do + YIELD() + if P.control then + local D=P.modeData + D.timer=D.timer+1 + if D.timer>=math.max(300,600-10*D.wave)and P.atkBufferSum<20 then + local t=math.max(300,480-12*D.wave) + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=2}) + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}) + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=6,countdown=1.2*t,cd0=1.2*t,time=0,sent=false,lv=4}) + table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=6,countdown=1.5*t,cd0=1.5*t,time=0,sent=false,lv=5}) + P.atkBufferSum=P.atkBufferSum+20 + P.stat.recv=P.stat.recv+20 + if D.wave==31 then P:_showText(text.maxspeed,0,-140,100,'appear',.6)end + D.timer=0 + D.wave=D.wave+1 + end + end + end + end, +} \ No newline at end of file diff --git a/parts/eventsets/tsd_h.lua b/parts/eventsets/tsd_h.lua new file mode 100644 index 00000000..d49d0440 --- /dev/null +++ b/parts/eventsets/tsd_h.lua @@ -0,0 +1,23 @@ +return{ + dropPiece=function(P) + local C=P.lastPiece + if C.row>0 then + if C.id==5 and C.row==2 and C.spin then + local L=P.modeData.history + if L[1]==C.centX and L[1]==L[2]and L[1]==L[3]then + P:showText("STACK",0,-140,40,'flicker',.3) + P:lose() + else + P.modeData.tsd=P.modeData.tsd+1 + table.insert(L,1,C.centX) + L[4]=nil + end + else + P:lose() + end + end + end, + task=function(P) + P.modeData.history={} + end, +} \ No newline at end of file diff --git a/parts/eventsets/tsd_u.lua b/parts/eventsets/tsd_u.lua new file mode 100644 index 00000000..c5dc5c2e --- /dev/null +++ b/parts/eventsets/tsd_u.lua @@ -0,0 +1,22 @@ +return{ + dropPiece=function(P) + local C=P.lastPiece + if C.row>0 then + if C.id==5 and C.row==2 and C.spin then + if TABLE.find(P.modeData.history,C.centX)then + P:showText("STACK",0,-140,40,'flicker',.3) + P:lose() + else + P.modeData.tsd=P.modeData.tsd+1 + table.insert(P.modeData.history,1,C.centX) + P.modeData.history[5]=nil + end + else + P:lose() + end + end + end, + task=function(P) + P.modeData.history={} + end, +} \ No newline at end of file diff --git a/parts/eventsets/ultra.lua b/parts/eventsets/ultra.lua new file mode 100644 index 00000000..2df9e687 --- /dev/null +++ b/parts/eventsets/ultra.lua @@ -0,0 +1,20 @@ +local warnTime={60,90,105,115,116,117,118,119,120} + +return{ + task=function(P) + P.modeData.stage=1 + while true do + YIELD() + if P.stat.frame/60>=warnTime[P.modeData.stage]then + if P.modeData.stage<9 then + P.modeData.stage=P.modeData.stage+1 + SFX.play('ready',.7+P.modeData.stage*.03) + else + SFX.play('start') + P:win('finish') + return + end + end + end + end, +} \ No newline at end of file diff --git a/parts/gametoolfunc.lua b/parts/gametoolfunc.lua index fa0f2c7a..fefc951d 100644 --- a/parts/gametoolfunc.lua +++ b/parts/gametoolfunc.lua @@ -153,6 +153,33 @@ end function generateLine(hole) return 1023-2^(hole-1) end +function solidLine(L) + for i=1,10 do + if L[i]>0 then return true end + end +end +function setField(P,page) + local F=FIELD[page] + local height=0 + for y=20,1,-1 do + if solidLine(F[y])then + height=y + break + end + end + local t=P.showTime*3 + for y=1,height do + local solid=solidLine(F[y]) + P.field[y]=FREEROW.get(0,solid) + P.visTime[y]=FREEROW.get(t) + if solid then + for x=1,10 do + P.field[y][x]=F[y][x] + end + P.garbageBeneath=P.garbageBeneath+1 + end + end +end function freshDate(mode) if not mode then mode=""end local date=os.date("%Y/%m/%d") @@ -519,22 +546,6 @@ do--function resetGameData(args) end freshPlayerPosition(args:find'q') VK.restore() - if GAME.modeEnv.task then - local task=GAME.modeEnv.task - if type(task)=='function'then - for i=1,#PLAYERS do - PLAYERS[i]:newTask(task) - end - elseif type(task)=='table'then - for i=1,#PLAYERS do - for _,t in ipairs(task)do - PLAYERS[i]:newTask(t) - end - end - else - MES.new('error',"Wrong task type") - end - end local bg=GAME.modeEnv.bg BG.set(type(bg)=='string'and bg or type(bg)=='table'and bg[math.random(#bg)]) diff --git a/parts/modes/attacker_h.lua b/parts/modes/attacker_h.lua index a27a2dc8..fa410783 100644 --- a/parts/modes/attacker_h.lua +++ b/parts/modes/attacker_h.lua @@ -5,34 +5,7 @@ return{ fall=12, freshLimit=15, pushSpeed=2, - task=function(P) - while true do - YIELD() - if P.control and P.atkBufferSum==0 then - local D=P.modeData - if D.wave<20 then - local t=1500-30*D.wave--1500~900 - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=12,countdown=t,cd0=t,time=0,sent=false,lv=3}) - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=10,countdown=t,cd0=t,time=0,sent=false,lv=4}) - else - local t=900-10*(D.wave-20)--900~600 - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=4}) - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=8,countdown=t,cd0=t,time=0,sent=false,lv=5}) - end - P.atkBufferSum=P.atkBufferSum+22 - P.stat.recv=P.stat.recv+22 - D.wave=D.wave+1 - if D.wave%10==0 then - if D.wave==20 then - P:_showText(text.great,0,-140,100,'appear',.6) - P.gameEnv.pushSpeed=3 - elseif D.wave==50 then - P:_showText(text.maxspeed,0,-140,100,'appear',.6) - end - end - end - end - end, + eventSet='attacker_h', bg='rainbow2',bgm='shining terminal', }, mesDisp=function(P) diff --git a/parts/modes/attacker_u.lua b/parts/modes/attacker_u.lua index bb1ed141..ad5ee2b0 100644 --- a/parts/modes/attacker_u.lua +++ b/parts/modes/attacker_u.lua @@ -4,43 +4,7 @@ return{ drop=5,lock=60, fall=8, freshLimit=15, - task=function(P) - while true do - YIELD() - if P.control and P.atkBufferSum<4 then - local D=P.modeData - local s - local t=800-10*D.wave--800~700~600~500 - if D.wave<10 then - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(5,6)),amount=9,countdown=t,cd0=t,time=0,sent=false,lv=3}) - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=11,countdown=t,cd0=t+62,time=0,sent=false,lv=4}) - s=20 - elseif D.wave<20 then - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=11,countdown=t,cd0=t,time=0,sent=false,lv=4}) - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=13,countdown=t,cd0=t+62,time=0,sent=false,lv=5}) - s=24 - else - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(2)*9-8),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=5}) - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=14,countdown=t+62,cd0=t,time=0,sent=false,lv=5}) - s=28 - end - P.atkBufferSum=P.atkBufferSum+s - P.stat.recv=P.stat.recv+s - D.wave=D.wave+1 - if D.wave%10==0 then - if D.wave==10 then - P:_showText(text.great,0,-140,100,'appear',.6) - P.gameEnv.pushSpeed=4 - elseif D.wave==20 then - P:_showText(text.awesome,0,-140,100,'appear',.6) - P.gameEnv.pushSpeed=5 - elseif D.wave==30 then - P:_showText(text.maxspeed,0,-140,100,'appear',.6) - end - end - end - end - end, + eventSet='attacker_u', bg='rainbow2',bgm='shining terminal', }, mesDisp=function(P) diff --git a/parts/modes/backfire_h.lua b/parts/modes/backfire_h.lua index 0d6fcbd7..d10124a1 100644 --- a/parts/modes/backfire_h.lua +++ b/parts/modes/backfire_h.lua @@ -3,14 +3,10 @@ return{ env={ drop=10,lock=60, freshLimit=15, - dropPiece=function(P) - if P.lastPiece.atk>0 then - P:receive(nil,P.lastPiece.atk,60,generateLine(P.holeRND:random(10))) - end - if P.stat.atk>=100 then - P:win('finish') - end - end, + dropPiece={ + require'parts.eventsets.backfire_60'.dropPiece, + require'parts.eventsets.checkAttack_100'.dropPiece, + }, bg='tunnel',bgm='echo', }, mesDisp=function(P) diff --git a/parts/modes/backfire_l.lua b/parts/modes/backfire_l.lua index ac68360c..ae3c3b86 100644 --- a/parts/modes/backfire_l.lua +++ b/parts/modes/backfire_l.lua @@ -3,14 +3,10 @@ return{ env={ drop=5,lock=45, freshLimit=15, - dropPiece=function(P) - if P.lastPiece.atk>0 then - P:receive(nil,P.lastPiece.atk,30,generateLine(P.holeRND:random(10))) - end - if P.stat.atk>=100 then - P:win('finish') - end - end, + dropPiece={ + require'parts.eventsets.backfire_30'.dropPiece, + require'parts.eventsets.checkAttack_100'.dropPiece, + }, bg='blackhole',bgm='echo', }, mesDisp=function(P) diff --git a/parts/modes/backfire_n.lua b/parts/modes/backfire_n.lua index ee8bcc95..ac41a95e 100644 --- a/parts/modes/backfire_n.lua +++ b/parts/modes/backfire_n.lua @@ -2,14 +2,10 @@ return{ color=COLOR.green, env={ drop=30,lock=60, - dropPiece=function(P) - if P.lastPiece.atk>0 then - P:receive(nil,P.lastPiece.atk,120,generateLine(P.holeRND:random(10))) - end - if P.stat.atk>=100 then - P:win('finish') - end - end, + dropPiece={ + require'parts.eventsets.backfire_120'.dropPiece, + require'parts.eventsets.checkAttack_100'.dropPiece, + }, bg='tunnel',bgm='echo', }, mesDisp=function(P) diff --git a/parts/modes/backfire_u.lua b/parts/modes/backfire_u.lua index 9f1f0b29..caa1d95a 100644 --- a/parts/modes/backfire_u.lua +++ b/parts/modes/backfire_u.lua @@ -3,14 +3,10 @@ return{ env={ drop=2,lock=30, freshLimit=10, - dropPiece=function(P) - if P.lastPiece.atk>0 then - P:receive(nil,P.lastPiece.atk,0,generateLine(P.holeRND:random(10))) - end - if P.stat.atk>=100 then - P:win('finish') - end - end, + dropPiece={ + require'parts.eventsets.backfire_0'.dropPiece, + require'parts.eventsets.checkAttack_100'.dropPiece, + }, bg='blackhole',bgm='echo', }, mesDisp=function(P) diff --git a/parts/modes/blind_e.lua b/parts/modes/blind_e.lua index c05d6978..8c2fb198 100644 --- a/parts/modes/blind_e.lua +++ b/parts/modes/blind_e.lua @@ -4,8 +4,8 @@ return{ env={ drop=30,lock=45, visible='easy', - dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end, freshLimit=10, + eventSet='checkLine_200', bg='glow',bgm='push', }, mesDisp=function(P) diff --git a/parts/modes/blind_h.lua b/parts/modes/blind_h.lua index ca8e829a..9cd6f1d1 100644 --- a/parts/modes/blind_h.lua +++ b/parts/modes/blind_h.lua @@ -8,8 +8,8 @@ return{ dropFX=0,lockFX=0, visible='none', score=false, - dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end, freshLimit=15, + eventSet='checkLine_200', bg='rgb',bgm='push', }, mesDisp=function(P) diff --git a/parts/modes/blind_l.lua b/parts/modes/blind_l.lua index eaddfc00..aa3403db 100644 --- a/parts/modes/blind_l.lua +++ b/parts/modes/blind_l.lua @@ -9,8 +9,8 @@ return{ dropFX=0,lockFX=0, visible='none', score=false, - dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end, freshLimit=15, + eventSet='checkLine_200', bg='rgb',bgm='push', }, mesDisp=function(P) diff --git a/parts/modes/blind_n.lua b/parts/modes/blind_n.lua index 16ff1b7d..de02839b 100644 --- a/parts/modes/blind_n.lua +++ b/parts/modes/blind_n.lua @@ -6,7 +6,7 @@ return{ drop=15,lock=45, freshLimit=10, visible='fast', - dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end, + eventSet='checkLine_200', bg='glow',bgm='push', }, mesDisp=function(P) diff --git a/parts/modes/blind_u.lua b/parts/modes/blind_u.lua index 5aebdb64..24c65750 100644 --- a/parts/modes/blind_u.lua +++ b/parts/modes/blind_u.lua @@ -8,8 +8,8 @@ return{ dropFX=0,lockFX=0, visible='none', score=false, - dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end, freshLimit=15, + eventSet='checkLine_100', bg='rgb',bgm='far', }, mesDisp=function(P) diff --git a/parts/modes/blind_wtf.lua b/parts/modes/blind_wtf.lua index 37eaa572..38ed4646 100644 --- a/parts/modes/blind_wtf.lua +++ b/parts/modes/blind_wtf.lua @@ -16,8 +16,8 @@ return{ block=false,center=0,ghost=0, dropFX=0,lockFX=0, visible='none', - dropPiece=function(P)if P.stat.row>=40 then P:win('finish')end end, freshLimit=15, + eventSet='checkLine_40', bg='none',bgm='far', }, load=function() diff --git a/parts/modes/c4wtrain_l.lua b/parts/modes/c4wtrain_l.lua index 75408b2d..44f15fb4 100644 --- a/parts/modes/c4wtrain_l.lua +++ b/parts/modes/c4wtrain_l.lua @@ -1,57 +1,12 @@ -local rem=table.remove -local function check_c4w(P) - if P.lastPiece.row==0 then - P:lose() - else - for _=1,P.lastPiece.row do - local h=#P.field - P.field[h+1]=FREEROW.get(20) - P.visTime[h+1]=FREEROW.get(20) - for i=4,7 do P.field[h+1][i]=0 end - end - if P.combo>P.modeData.maxCombo then - P.modeData.maxCombo=P.combo - end - if P.stat.row>=100 then - P:win('finish') - end - end -end - return{ color=COLOR.red, env={ drop=5,lock=30, - task=function(P)P.modeData.maxCombo=0 end, - dropPiece=check_c4w, freshLimit=15,ospin=false, + dropPiece=require'parts.eventsets.c4wCheck_hard'.dropPiece, + eventSet='c4wBase', bg='rgb',bgm='oxygen', }, - load=function() - PLY.newPlayer(1) - local P=PLAYERS[1] - local F=P.field - for i=1,24 do - F[i]=FREEROW.get(20) - P.visTime[i]=FREEROW.get(20) - for x=4,7 do F[i][x]=0 end - end - if P.holeRND:random()<.6 then - local initCell={11,14,12,13,21,24} - for _=1,3 do - _=rem(initCell,P.holeRND:random(#initCell)) - F[math.floor(_/10)][3+_%10]=20 - end - else - local initCell={11,12,13,14,21,22,23,24} - rem(initCell,P.holeRND:random(5,8)) - rem(initCell,P.holeRND:random(1,4)) - for _=1,6 do - _=rem(initCell,P.holeRND:random(#initCell)) - F[math.floor(_/10)][3+_%10]=20 - end - end - end, mesDisp=function(P) setFont(45) mStr(P.combo,63,310) diff --git a/parts/modes/c4wtrain_n.lua b/parts/modes/c4wtrain_n.lua index 5e15f0bb..1e68f9ce 100644 --- a/parts/modes/c4wtrain_n.lua +++ b/parts/modes/c4wtrain_n.lua @@ -1,55 +1,12 @@ -local rem=table.remove -local function check_c4w(P) - if P.lastPiece.row>0 then - for _=1,#P.clearedRow do - local h=#P.field - P.field[h+1]=FREEROW.get(20) - P.visTime[h+1]=FREEROW.get(20) - for i=4,7 do P.field[h+1][i]=0 end - end - if P.combo>P.modeData.maxCombo then - P.modeData.maxCombo=P.combo - end - if P.stat.row>=100 then - P:win('finish') - end - end -end - return{ color=COLOR.green, env={ drop=30,lock=60,infHold=true, - task=function(P)P.modeData.maxCombo=0 end, - dropPiece=check_c4w, freshLimit=15,ospin=false, + dropPiece=require'parts.eventsets.c4wCheck_easy'.dropPiece, + eventSet='c4wBase', bg='rgb',bgm='oxygen', }, - load=function() - PLY.newPlayer(1) - local P=PLAYERS[1] - local F=P.field - for i=1,24 do - F[i]=FREEROW.get(20) - P.visTime[i]=FREEROW.get(20) - for x=4,7 do F[i][x]=0 end - end - if P.holeRND:random()<.6 then - local initCell={11,14,12,13,21,24} - for _=1,3 do - _=rem(initCell,P.holeRND:random(#initCell)) - F[math.floor(_/10)][3+_%10]=20 - end - else - local initCell={11,12,13,14,21,22,23,24} - rem(initCell,P.holeRND:random(5,8)) - rem(initCell,P.holeRND:random(1,4)) - for _=1,6 do - _=rem(initCell,P.holeRND:random(#initCell)) - F[math.floor(_/10)][3+_%10]=20 - end - end - end, mesDisp=function(P) setFont(45) mStr(P.combo,63,310) diff --git a/parts/modes/classic_fast.lua b/parts/modes/classic_fast.lua index b41728cf..ecb894ea 100644 --- a/parts/modes/classic_fast.lua +++ b/parts/modes/classic_fast.lua @@ -13,22 +13,7 @@ return{ freshLimit=0, face={0,0,2,2,2,0,0}, noTele=true,keyCancel={5,6}, - task=function(P)P.modeData.target=10 end, - dropPiece=function(P) - local D=P.modeData - if P.stat.row>=D.target then - D.target=D.target+10 - if D.target==110 then - P.gameEnv.drop,P.gameEnv.lock=2,2 - SFX.play('blip_1') - elseif D.target==200 then - P.gameEnv.drop,P.gameEnv.lock=1,1 - SFX.play('blip_1') - else - SFX.play('reach') - end - end - end, + eventSet='classic_fast', bg='rgb',bgm='magicblock', }, slowMark=true, diff --git a/parts/modes/custom_clear.lua b/parts/modes/custom_clear.lua index df71b78f..683b54db 100644 --- a/parts/modes/custom_clear.lua +++ b/parts/modes/custom_clear.lua @@ -1,49 +1,3 @@ -local function notAir(L) - for i=1,10 do - if L[i]>0 then return true end - end -end -local function setField(P,page) - local F=FIELD[page] - local height=0 - for y=20,1,-1 do - if notAir(F[y])then - height=y - break - end - end - local t=P.showTime*3 - for y=1,height do - local solid=notAir(F[y]) - P.field[y]=FREEROW.get(0,solid) - P.visTime[y]=FREEROW.get(t) - if solid then - for x=1,10 do - P.field[y][x]=F[y][x] - end - P.garbageBeneath=P.garbageBeneath+1 - end - end -end -local function checkClear(P) - if P.garbageBeneath==0 then - local D=P.modeData - D.finished=D.finished+1 - if FIELD[D.finished+1]then - P.waiting=26 - for i=#P.field,1,-1 do - FREEROW.discard(P.field[i]) - FREEROW.discard(P.visTime[i]) - P.field[i],P.visTime[i]=nil - end - setField(P,D.finished+1) - SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.6,.8,.6) - SFX.play('blip_1') - else - P:win('finish') - end - end -end return{ color=COLOR.white, env={}, @@ -51,9 +5,9 @@ return{ applyCustomGame() for y=1,20 do - if notAir(FIELD[1][y])then + if solidLine(FIELD[1][y])then --Switch clear sprint mode on - GAME.modeEnv.dropPiece=checkClear + GAME.modeEnv.dropPiece=require'parts.eventsets.checkClearBoard'.dropPiece goto BREAK_clearMode end end diff --git a/parts/modes/defender_l.lua b/parts/modes/defender_l.lua index 565000de..318b6bf8 100644 --- a/parts/modes/defender_l.lua +++ b/parts/modes/defender_l.lua @@ -6,40 +6,7 @@ return{ nextCount=3, freshLimit=15, pushSpeed=2, - task=function(P) - while true do - YIELD() - if P.control then - local D=P.modeData - D.counter=D.counter+1 - local t=math.max(240-2*D.wave,40) - if D.counter>=t then - D.counter=0 - for _=1,4 do - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=5*t,cd0=5*t,time=0,sent=false,lv=2}) - end - P.atkBufferSum=P.atkBufferSum+4 - P.stat.recv=P.stat.recv+4 - D.wave=D.wave+1 - if D.wave<=75 then - D.rpm=math.floor(144e3/t)*.1 - if D.wave==25 then - P:_showText(text.great,0,-140,100,'appear',.6) - P.gameEnv.pushSpeed=3 - P.dropDelay,P.gameEnv.drop=4,4 - elseif D.wave==50 then - P:_showText(text.awesome,0,-140,100,'appear',.6) - P.gameEnv.pushSpeed=4 - P.dropDelay,P.gameEnv.drop=3,3 - elseif D.wave==75 then - P:_showText(text.maxspeed,0,-140,100,'appear',.6) - P.dropDelay,P.gameEnv.drop=2,2 - end - end - end - end - end - end, + eventSet='defender_l', bg='rainbow2',bgm='storm', }, mesDisp=function(P) diff --git a/parts/modes/defender_n.lua b/parts/modes/defender_n.lua index bfe64cf9..807ffbfb 100644 --- a/parts/modes/defender_n.lua +++ b/parts/modes/defender_n.lua @@ -6,40 +6,7 @@ return{ nextCount=3, freshLimit=15, pushSpeed=1, - task=function(P) - while true do - YIELD() - if P.control then - local D=P.modeData - D.counter=D.counter+1 - local t=math.max(360-D.wave*2,60) - if D.counter>=t then - D.counter=0 - for _=1,3 do - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=2*t,cd0=2*t,time=0,sent=false,lv=1}) - end - P.atkBufferSum=P.atkBufferSum+3 - P.stat.recv=P.stat.recv+3 - D.wave=D.wave+1 - if D.wave<=90 then - D.rpm=math.floor(108e3/t)*.1 - if D.wave==25 then - P:_showText(text.great,0,-140,100,'appear',.6) - P.gameEnv.pushSpeed=2 - P.dropDelay,P.gameEnv.drop=20,20 - elseif D.wave==50 then - P:_showText(text.awesome,0,-140,100,'appear',.6) - P.gameEnv.pushSpeed=3 - P.dropDelay,P.gameEnv.drop=10,10 - elseif D.wave==90 then - P.dropDelay,P.gameEnv.drop=5,5 - P:_showText(text.maxspeed,0,-140,100,'appear',.6) - end - end - end - end - end - end, + eventSet='defender_n', bg='rainbow2',bgm='storm', }, mesDisp=function(P) diff --git a/parts/modes/dig_h.lua b/parts/modes/dig_h.lua index ece95f52..763d13c1 100644 --- a/parts/modes/dig_h.lua +++ b/parts/modes/dig_h.lua @@ -4,21 +4,7 @@ return{ drop=60,lock=120, fall=20, freshLimit=15, - task=function(P) - while true do - YIELD() - if P.control then - local D=P.modeData - D.timer=D.timer+1 - if D.timer>=math.max(90,180-D.wave)then - P:garbageRise(21,1,P:getHolePos()) - P.stat.recv=P.stat.recv+1 - D.timer=0 - D.wave=D.wave+1 - end - end - end - end, + eventSet='dig_h', bg='bg2',bgm='shift', }, mesDisp=function(P) diff --git a/parts/modes/dig_u.lua b/parts/modes/dig_u.lua index d20a36ee..84dd93b6 100644 --- a/parts/modes/dig_u.lua +++ b/parts/modes/dig_u.lua @@ -3,21 +3,7 @@ return{ env={ drop=10,lock=30, freshLimit=15, - task=function(P) - while true do - YIELD() - if P.control then - local D=P.modeData - D.timer=D.timer+1 - if D.timer>=math.max(30,80-.3*D.wave)then - P:garbageRise(20+D.wave%5,1,P:getHolePos()) - P.stat.recv=P.stat.recv+1 - D.timer=0 - D.wave=D.wave+1 - end - end - end - end, + eventSet='dig_u', bg='bg2',bgm='shift', }, mesDisp=function(P) diff --git a/parts/modes/drought_l.lua b/parts/modes/drought_l.lua index 1a816faa..ad4cbdf0 100644 --- a/parts/modes/drought_l.lua +++ b/parts/modes/drought_l.lua @@ -75,10 +75,10 @@ return{ end end end, - dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end, nextCount=1,holdCount=0, ospin=false, freshLimit=15, + eventSet='checkLine_100', bg='blockfall',bgm='reason', }, mesDisp=function(P) diff --git a/parts/modes/drought_n.lua b/parts/modes/drought_n.lua index 597f97ca..5de5bbb9 100644 --- a/parts/modes/drought_n.lua +++ b/parts/modes/drought_n.lua @@ -5,10 +5,10 @@ return{ drop=20,lock=60, sequence='bag', seqData={1,1,2,2,3,3,4,4,5,5,6,6}, - dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end, nextCount=3, ospin=false, freshLimit=15, + eventSet='checkLine_100', bg='blockfall',bgm='reason', }, mesDisp=function(P) diff --git a/parts/modes/marathon_bfmax.lua b/parts/modes/marathon_bfmax.lua index ffc81860..9c3ed4da 100644 --- a/parts/modes/marathon_bfmax.lua +++ b/parts/modes/marathon_bfmax.lua @@ -1,36 +1,9 @@ -local dropSpeed={50,40,30,25,20,15,12,9,7,5,4,3,2,1,1,.5,.5,.25,.25} - return{ color=COLOR.yellow, env={ noTele=true, - drop=60,wait=8,fall=20, - task=function(P)P.modeData.target=10 end, - dropPiece=function(P) - local flag - local l=P.lastPiece - if P.combo>1 then flag=true;P:showText("2x",0,-220,40,'flicker',.3)end - if l.spin then flag=true;P:showText("spin",0,-180,40,'flicker',.3)end - if l.row>1 then flag=true;P:showText("1+",0,-140,40,'flicker',.3)end - if l.pc then flag=true;P:showText("PC",0,-100,40,'flicker',.3)end - if l.hpc then flag=true;P:showText("HPC",0,-100,40,'flicker',.3)end - if flag then - P:lose() - else - local T=P.modeData.target - if P.stat.row>=T then - if T==200 then - P:win('finish') - else - T=T+10 - P.gameEnv.drop=dropSpeed[T/10] - P.modeData.target=T - SFX.play('reach') - end - end - end - end, mindas=7,minarr=1,minsdarr=1, + eventSet='marathon_bfmax', bg='bg2',bgm='blank', }, slowMark=true, diff --git a/parts/modes/marathon_h.lua b/parts/modes/marathon_h.lua index fc27048e..376ac9ec 100644 --- a/parts/modes/marathon_h.lua +++ b/parts/modes/marathon_h.lua @@ -3,24 +3,8 @@ return{ env={ noTele=true, mindas=7,minarr=1,minsdarr=1, - drop=.5,wait=8,fall=20, - task=function(P)P.modeData.target=50 end, - dropPiece=function(P) - if P.stat.row>=P.modeData.target then - if P.modeData.target==50 then - P.gameEnv.drop=.25 - P.modeData.target=100 - SFX.play('reach') - elseif P.modeData.target==100 then - P:set20G(true) - P.modeData.target=200 - SFX.play('reach') - else - P:win('finish') - end - end - end, noInitSZO=true, + eventSet='marathon_h', bg='cubes',bgm='push', }, slowMark=true, diff --git a/parts/modes/marathon_n.lua b/parts/modes/marathon_n.lua index 0e30f7ff..d0c0a5c0 100644 --- a/parts/modes/marathon_n.lua +++ b/parts/modes/marathon_n.lua @@ -1,24 +1,10 @@ -local dropSpeed={50,40,30,24,18,14,10,8,6,5,4,3,2,1,1,.5,.5,.25,.25} - return{ color=COLOR.green, env={ noTele=true, mindas=7,minarr=1,minsdarr=1, - drop=60,wait=8,fall=20, - task=function(P)P.modeData.target=10 end, - dropPiece=function(P) - if P.stat.row>=P.modeData.target then - if P.modeData.target==200 then - P:win('finish') - else - P.gameEnv.drop=dropSpeed[P.modeData.target/10] - P.modeData.target=P.modeData.target+10 - SFX.play('reach') - end - end - end, noInitSZO=true, + eventSet='marathon_n', bg='bg2',bgm='push', }, slowMark=true, diff --git a/parts/modes/master_ex.lua b/parts/modes/master_ex.lua index 700cbf3c..eb5ac0e5 100644 --- a/parts/modes/master_ex.lua +++ b/parts/modes/master_ex.lua @@ -1,42 +1,16 @@ local sectionName={"D","C","B","A","A+","S-","S","S+","S+","SS","SS","U","U","X","X+"} -local passPoint=16 -local function score(P) - if P.modeData.rankPoint<140-passPoint then--If Less then X - local R=#P.clearedRow - if R>0 then - if R==4 then R=10 end--Techrash +10 - P.modeData.rankPoint=math.min(P.modeData.rankPoint+R,140-passPoint) - P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1] - end - end -end return{ color=COLOR.lBlue, env={ noTele=true, minarr=1, - drop=0,lock=15, - wait=15,fall=6, nextCount=3, sequence='hisPool', visible='fast', freshLimit=15, - dropPiece=score, noInitSZO=true, - task=function(P) - P.modeData.rankPoint=0 - P.modeData.rankName=sectionName[1] - while true do - YIELD() - if P.stat.frame>=3600 then - P.modeData.rankPoint=math.min(P.modeData.rankPoint+passPoint,140) - P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1] - P:win('finish') - return - end - end - end, + eventSet='master_ex', bg='blockspace',bgm='hope', }, slowMark=true, diff --git a/parts/modes/master_final.lua b/parts/modes/master_final.lua index aa6418c5..9f287198 100644 --- a/parts/modes/master_final.lua +++ b/parts/modes/master_final.lua @@ -1,58 +1,12 @@ -local function score(P) - local D=P.modeData - - local c=#P.clearedRow - if c==0 and D.pt%100==99 then return end - local s=c<3 and c+1 or c==3 and 5 or 7 - if P.combo>7 then s=s+2 - elseif P.combo>3 then s=s+1 - end - D.pt=D.pt+s - - if D.pt%100==99 then - SFX.play('blip_1') - elseif D.pt>=D.target then--Level up! - s=D.target/100--range from 1 to 9 - local E=P.gameEnv - if s<4 then - P:_showText(text.stage:gsub("$1",s),0,-120,80,'fly') - --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 - D.target=D.target+100 - elseif s<10 then - if s==5 then BGM.play('distortion')end - P:_showText(text.stage:gsub("$1",s),0,-120,60,'fly',1.26) - if s==4 or s==7 then E.das=E.das-1 end - if s%3==0 then E.lock=E.lock-1 - elseif s%3==1 then E.wait=E.wait-1 - elseif s%3==2 then E.fall=E.fall-1 - end - D.target=D.target+100 - else - D.pt=1000 - P:win('finish') - end - SFX.play('reach') - end -end - return{ color=COLOR.lGray, env={ noTele=true, das=5,arr=1, - drop=0,lock=12, - wait=10,fall=10, - dropPiece=score, - task=function(P) - P.modeData.pt=0 - P.modeData.target=100 - end, freshLimit=15, easyFresh=false,bone=true, noInitSZO=true, + eventSet='master_final', bg='lightning',bgm='rectification', }, slowMark=true, diff --git a/parts/modes/master_h.lua b/parts/modes/master_h.lua index b6cc3965..192d3605 100644 --- a/parts/modes/master_h.lua +++ b/parts/modes/master_h.lua @@ -1,74 +1,11 @@ -local death_lock={12,11,10,9,8, 7,7,7,7,6} -local death_wait={10,9, 8, 7,6, 6,6,5,5,4} -local death_fall={10,9, 8, 7,6, 6,5,5,4,4} -local function score(P) - local D=P.modeData - - local c=#P.clearedRow - if c==0 and D.pt%100==99 then return end - local s=c<3 and c+1 or c==3 and 5 or 7 - if P.combo>7 then s=s+2 - elseif P.combo>3 then s=s+1 - end - D.pt=D.pt+s - - if D.pt%100==99 then - SFX.play('blip_1') - elseif D.pt>=D.target then--Level up! - s=D.target/100 - local E=P.gameEnv - E.lock=death_lock[s] - E.wait=death_wait[s] - E.fall=death_fall[s] - if s==2 then - E.das=5 - BG.set('rainbow') - elseif s==4 then - E.das=4 - BG.set('rainbow2') - elseif s==5 then - if P.stat.frame>183*60 then - D.pt=500 - P:win('finish') - return - else - E.bone=true - P.gameEnv.freshLimit=10 - BG.set('glow') - BGM.play('secret7th remix') - end - elseif s==6 then - E.das=3 - BG.set('lightning') - elseif s==7 then - E.bone=true - elseif s==10 then - D.pt=1000 - P:win('finish') - return - end - D.target=D.target+100 - P:_showText(text.stage:gsub("$1",s),0,-120,80,'beat') - SFX.play('reach') - end -end - return{ color=COLOR.red, env={ noTele=true, das=6,arr=1, - drop=0, - lock=death_lock[1], - wait=death_wait[1], - fall=death_fall[1], - dropPiece=score, - task=function(P) - P.modeData.pt=0 - P.modeData.target=100 - end, freshLimit=15, noInitSZO=true, + eventSet='master_h', bg='bg2',bgm='secret7th', }, slowMark=true, diff --git a/parts/modes/master_l.lua b/parts/modes/master_l.lua index e193c0c9..cf5569a6 100644 --- a/parts/modes/master_l.lua +++ b/parts/modes/master_l.lua @@ -1,60 +1,11 @@ -local rush_lock={20,18,16,15,14} -local rush_wait={12,10, 9, 8, 7} -local rush_fall={18,16,14,13,12} -local function score(P) - local D=P.modeData - - local c=#P.clearedRow - if c==0 and D.pt%100==99 then return end - local s=c<3 and c+1 or c==3 and 5 or 7 - if P.combo>7 then s=s+2 - elseif P.combo>3 then s=s+1 - end - D.pt=D.pt+s - - if D.pt%100==99 then - SFX.play('blip_1') - elseif D.pt>=D.target then--Level up! - s=D.target/100 - local E=P.gameEnv - BG.set(s==1 and'bg1'or s==2 and'bg2'or s==3 and'rainbow'or 'rainbow2') - E.lock=rush_lock[s] - E.wait=rush_wait[s] - E.fall=rush_fall[s] - E.das=10-s - if s==2 then - E.arr=2 - elseif s==4 then - E.bone=true - end - - if s==5 then - D.pt=500 - P:win('finish') - else - D.target=D.target+100 - P:_showText(text.stage:gsub("$1",s),0,-120,80,'fly') - end - SFX.play('reach') - end -end - return{ color=COLOR.red, env={ noTele=true, das=9,arr=3, - drop=0, - lock=rush_lock[1], - wait=rush_wait[1], - fall=rush_fall[1], - dropPiece=score, - noInitSZO=true, - task=function(P) - P.modeData.pt=0 - P.modeData.target=100 - end, freshLimit=15, + noInitSZO=true, + eventSet='master_l', bg='bg1',bgm='secret8th', }, slowMark=true, diff --git a/parts/modes/master_n.lua b/parts/modes/master_n.lua index a7f97266..1d098c3c 100644 --- a/parts/modes/master_n.lua +++ b/parts/modes/master_n.lua @@ -1,74 +1,11 @@ -local rush_lock={20,18,16,15,14, 14,13,12,11,11} -local rush_wait={12,11,11,10,10, 10,10, 9, 9, 9} -local rush_fall={18,16,14,13,12, 12,11,11,10,10} -local function score(P) - local D=P.modeData - - local c=#P.clearedRow - if c==0 and D.pt%100==99 then return end - local s=c<3 and c+1 or c==3 and 5 or 7 - if P.combo>7 then s=s+2 - elseif P.combo>3 then s=s+1 - end - D.pt=D.pt+s - - if D.pt%100==99 then - SFX.play('blip_1') - elseif D.pt>=D.target then--Level up! - s=D.target/100 - local E=P.gameEnv - E.lock=rush_lock[s] - E.wait=rush_wait[s] - E.fall=rush_fall[s] - - if s==2 then - E.das=8 - BG.set('rainbow') - elseif s==4 then - BG.set('rainbow2') - elseif s==5 then - if P.stat.frame>260*60 then - D.pt=500 - P:win('finish') - return - else - P.gameEnv.freshLimit=10 - E.das=7 - BG.set('glow') - BGM.play('secret8th remix') - end - elseif s==7 then - E.das=6 - BG.set('lightning') - elseif s==9 then - E.bone=true - elseif s==10 then - D.pt=1000 - P:win('finish') - return - end - D.target=D.target+100 - P:_showText(text.stage:gsub("$1",s),0,-120,80,'fly') - SFX.play('reach') - end -end - return{ color=COLOR.red, env={ noTele=true, das=10,arr=3, - drop=0, - lock=rush_lock[1], - wait=rush_wait[1], - fall=rush_fall[1], - dropPiece=score, noInitSZO=true, - task=function(P) - P.modeData.pt=0 - P.modeData.target=100 - end, freshLimit=15, + eventSet='master_n', bg='bg1',bgm='secret8th', }, slowMark=true, diff --git a/parts/modes/master_ph.lua b/parts/modes/master_ph.lua index 6b188e68..ec0fe9a3 100644 --- a/parts/modes/master_ph.lua +++ b/parts/modes/master_ph.lua @@ -3,144 +3,13 @@ return{ env={ noTele=true, das=5,arr=1, - drop=0,lock=15, - wait=10,fall=10, nextCount=2, sequence='his', - task=function(P)P.modeData.target=12 end, - dropPiece=function(P) - local p=P.modeData.pt+P.lastPiece.row - if p>=P.modeData.target then - local ENV=P.gameEnv - local T=P.modeData.target - --Stage 1: clear 3 techrash - if T==12 then--Stage 2: swap color of S/Z & J/L - P.waiting=30 - P.curMission=false - - ENV.skin[1],ENV.skin[2]=ENV.skin[2],ENV.skin[1] - ENV.skin[3],ENV.skin[4]=ENV.skin[4],ENV.skin[3] - - ENV.lock=14 - ENV.wait=7 - ENV.fall=7 - P:setNext(4) - - P.modeData.target=26 - SFX.play('reach') - elseif T==26 then--Stage 3: dig to bottom - if not P.holdQueue[1]then P.life=P.life+1 end--1 up if ban hold - P.waiting=45 - ENV.skin[1],ENV.skin[2]=ENV.skin[2],ENV.skin[1] - ENV.skin[3],ENV.skin[4]=ENV.skin[4],ENV.skin[3] - - for i=1,10 do - if P.field[i]then - for j=1,10 do - if P.field[i][j]>0 then - P.field[i][j]=17 - P.visTime[i][j]=15 - end - end - for _=1,5 do - P.field[i][P.holeRND:random(10)]=0 - end - else - P.field[i]=FREEROW.get(0) - P.visTime[i]=FREEROW.get(30) - for j=1,10 do - if P.holeRND:random()>.9 then - P.field[i][j]=P.holeRND:random(16) - end - end - P.field[i][P.holeRND:random(10)]=0 - end - P.field[i].garbage=true - end - P.garbageBeneath=10 - for i=1,10 do - P:createClearingFX(i,1.5) - end - SYSFX.newShade(2.5,P.absFieldX,P.y+300*P.size,300*P.size,300*P.size) - - ENV.lock=13 - ENV.wait=6 - ENV.fall=6 - P:setNext(5) - - P.modeData.target=42 - SFX.play('reach') - elseif T==42 then--Stage 4: survive in high speed - if P.garbageBeneath==0 then - P.waiting=30 - ENV.lock=11 - P:setNext(6) - P:setHold(false) - ENV.bone=true - - P.modeData.target=62 - else - p=41 - end - elseif T==62 then--Stage 5: survive without easy-fresh rule - P.life=P.life+1 - ENV.lock=13 - ENV.wait=5 - ENV.fall=5 - - ENV.easyFresh=false - - P.modeData.target=126 - SFX.play('reach') - elseif T==126 then--Stage 6: speed up - P.life=P.life+1 - - ENV.lock=11 - ENV.wait=4 - ENV.fall=4 - - P.modeData.target=162 - elseif T==162 then--Stage 7: speed up+++ - P.life=P.life+1 - - ENV.lock=10 - - P:setHold(true) - P:setInvisible(180) - - P.modeData.target=226 - SFX.play('reach') - elseif T==226 then--Stage 8: final invisible - P.life=P.life+1 - - ENV.bone=false - P:setInvisible(90) - - P.modeData.target=259 - SFX.play('reach') - elseif T==259 then--Stage 9: ending - P.life=P.life+1 - for i=1,7 do ENV.skin[i]=P.holeRND:random(16)end - - P:setInvisible(40) - ENV.lock=15 - P.curMission=1 - ENV.mission={4,4,4,4,4,4,4,4} - ENV.missionKill=false - - P.modeData.target=260 - p=260 - SFX.play('blip_2') - else - p=260 - end - end - P.modeData.pt=p - end, mission={4,4,4,64}, missionKill=true, freshLimit=12, noInitSZO=true, + eventSet='master_ph', bg='blockspace',bgm='super7th', }, slowMark=true, diff --git a/parts/modes/master_u.lua b/parts/modes/master_u.lua index 8e5b51fc..a7fae4ca 100644 --- a/parts/modes/master_u.lua +++ b/parts/modes/master_u.lua @@ -1,69 +1,12 @@ -local death_lock={12,11,10,9,8, 7,7,7,6,6} -local death_wait={10, 9, 8,7,6, 6,5,4,4,3} -local death_fall={10, 9, 8,7,6, 5,5,4,3,3} -local function score(P) - local D=P.modeData - - local c=#P.clearedRow - if c==0 and D.pt%100==99 then return end - local s=c<3 and c+1 or c==3 and 5 or 7 - if P.combo>7 then s=s+2 - elseif P.combo>3 then s=s+1 - end - D.pt=D.pt+s - - if D.pt%100==99 then - SFX.play('blip_1') - elseif D.pt>=D.target then--Level up! - s=D.target/100 - local E=P.gameEnv - SFX.play('reach') - E.lock=death_lock[s] - E.wait=death_wait[s] - E.fall=death_fall[s] - E.das=math.floor(6.9-s*.4) - if s==1 then - BG.set('rainbow') - elseif s==2 then - BG.set('rainbow2') - elseif s==3 then - BG.set('glow') - elseif s==5 then - if P.stat.frame>183*60 then - D.pt=500 - P:win('finish') - return - else - P.gameEnv.freshLimit=10 - BG.set('lightning') - BGM.play('secret7th remix') - end - elseif s==10 then - D.pt=1000 - P:win('finish') - return - end - D.target=D.target+100 - P:_showText(text.stage:gsub("$1",s),0,-120,80,'fly') - end -end return{ color=COLOR.red, env={ noTele=true, das=6,arr=1, - drop=0, - lock=death_lock[1], - wait=death_wait[1], - fall=death_fall[1], - dropPiece=score, - task=function(P) - P.modeData.pt=0 - P.modeData.target=100 - end, freshLimit=15, noInitSZO=true, + eventSet='master_u', bg='bg2',bgm='secret7th', }, slowMark=true, diff --git a/parts/modes/pc_h.lua b/parts/modes/pc_h.lua index 5ce0195f..53742873 100644 --- a/parts/modes/pc_h.lua +++ b/parts/modes/pc_h.lua @@ -3,9 +3,9 @@ return{ env={ drop=60,lock=120, fall=10, - dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end, freshLimit=15, ospin=false, + eventSet='checkLine_100', bg='rgb',bgm='truth', }, mesDisp=function(P) diff --git a/parts/modes/pc_inf.lua b/parts/modes/pc_inf.lua index 596cebcc..2b44840f 100644 --- a/parts/modes/pc_inf.lua +++ b/parts/modes/pc_inf.lua @@ -3,22 +3,10 @@ return{ env={ drop=20,lock=60, fall=10, - dropPiece=function(P) - if P.lastPiece.pc then - P.gameEnv.heightLimit=4 - if P.stat.pc%5==0 then - P.gameEnv.drop=math.max(P.gameEnv.drop-1,1) - end - else - P.gameEnv.heightLimit=P.gameEnv.heightLimit-P.lastPiece.row - end - if #P.field>P.gameEnv.heightLimit then - P:lose() - end - end, freshLimit=8, heightLimit=4, ospin=false, + eventSet='pc_inf', bg='rgb',bgm='moonbeam', }, mesDisp=function(P) diff --git a/parts/modes/pc_l.lua b/parts/modes/pc_l.lua index 31e70eca..b3d9cb36 100644 --- a/parts/modes/pc_l.lua +++ b/parts/modes/pc_l.lua @@ -3,9 +3,9 @@ return{ env={ drop=20,lock=60, fall=20, - dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end, freshLimit=15, ospin=false, + eventSet='checkLine_100', bg='rgb',bgm='moonbeam', }, mesDisp=function(P) diff --git a/parts/modes/pc_n.lua b/parts/modes/pc_n.lua index 65934a8a..f5724d8f 100644 --- a/parts/modes/pc_n.lua +++ b/parts/modes/pc_n.lua @@ -3,7 +3,7 @@ return{ env={ infHold=true, drop=150,lock=1e99, - dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end, + eventSet='checkLine_100', bg='rgb',bgm='truth', }, mesDisp=function(P) diff --git a/parts/modes/pctrain_l.lua b/parts/modes/pctrain_l.lua index d26b06d5..b737eac8 100644 --- a/parts/modes/pctrain_l.lua +++ b/parts/modes/pctrain_l.lua @@ -1,44 +1,3 @@ -local pc_drop={50,45,40,35,30,26,22,18,15,12} -local pc_lock={55,50,46,42,39,36,33,31,29,27} -local pc_fall={18,16,14,12,10,9,8,7,6,5} -local PCbase=require"parts.modes.PCbase" -local PClist=require"parts.modes.PClist" - -local function task_PC(P) - P.control=false - for _=1,26 do YIELD()end - P.control=true - local base=PCbase[P.modeData.type] - P:pushLineList(base[P.holeRND:random(#base)],P.modeData.symmetry) -end -local function check(P) - local f=P.field - if #f>0 then - if #f+P.stat.row%4>4 then - P:lose() - end - else - local type=P.stat.pc<10 and 4 or 5 - local L=PClist[type][P.holeRND:random(#PClist[type])] - local symmetry=P.holeRND:random()>.5 - P.modeData.type=type - P.modeData.symmetry=symmetry - P:pushNextList(L,symmetry) - P.modeData.counter=P.stat.piece==0 and 20 or 0 - P:newTask(task_PC) - - local s=P.stat.pc*.25 - if math.floor(s)==s and s>0 then - P.gameEnv.drop=pc_drop[s]or 10 - P.gameEnv.lock=pc_lock[s]or 25 - P.gameEnv.fall=pc_fall[s]or 4 - if s==10 then - P:_showText(text.maxspeed,0,-140,100,'appear',.6) - end - end - end -end - return{ color=COLOR.red, env={ @@ -48,14 +7,10 @@ return{ fall=20, sequence='none', freshLimit=15, - dropPiece=check, RS="SRS", + eventSet='pctrain_l', bg='rgb',bgm='oxygen', }, - load=function() - PLY.newPlayer(1) - check(PLAYERS[1]) - end, mesDisp=function(P) setFont(60) mStr(P.stat.pc,63,300) diff --git a/parts/modes/pctrain_n.lua b/parts/modes/pctrain_n.lua index 44dfe02c..7540da90 100644 --- a/parts/modes/pctrain_n.lua +++ b/parts/modes/pctrain_n.lua @@ -1,36 +1,3 @@ -local PCbase=require"parts.modes.PCbase" -local PClist=require"parts.modes.PClist" -local PCtype={ - 1,1,1,1,2, - 1,1,1,1,3, - 1,1,1,2, - 1,2,1,3, - 1,2,3, -} -local function task_PC(P) - P.control=false - for _=1,26 do YIELD()end - P.control=true - local base=PCbase[P.modeData.type] - P:pushLineList(base[P.holeRND:random(#base)],P.modeData.symmetry) -end -local function check(P) - local r=P.field - if #r>0 then - if #r+P.stat.row%4>4 then - P:lose() - end - else - local type=PCtype[P.stat.pc+1]or 3 - local L=PClist[type][P.holeRND:random(#PClist[type])] - local symmetry=P.holeRND:random()>.5 - P.modeData.type=type - P.modeData.symmetry=symmetry - P:pushNextList(L,symmetry) - P.modeData.counter=P.stat.piece==0 and 20 or 0 - P:newTask(task_PC) - end -end return{ color=COLOR.green, env={ @@ -39,13 +6,12 @@ return{ drop=120,lock=180, fall=20, sequence='none', - dropPiece=check, RS="SRS", + eventSet='pctrain_n', bg='rgb',bgm='oxygen', }, load=function() PLY.newPlayer(1) - check(PLAYERS[1]) end, mesDisp=function(P) setFont(60) diff --git a/parts/modes/rhythm_e.lua b/parts/modes/rhythm_e.lua index cce373ab..47a5ab4c 100644 --- a/parts/modes/rhythm_e.lua +++ b/parts/modes/rhythm_e.lua @@ -1,5 +1,4 @@ local gc=love.graphics -local dropSpeed={[0]=40,33,27,20,16,12,11,10,9,8,7,6,5,4,3,3,2,2,1,1} return{ color=COLOR.green, @@ -9,38 +8,7 @@ return{ wait=20,fall=90, mindas=7,minarr=1,minsdarr=1, keyCancel={6}, - dropPiece=function(P) - if P.stat.row>=P.modeData.target then - if P.modeData.target==200 then - P:win('finish') - else - P.modeData.bpm=40+2*P.modeData.target/10 - P.modeData.beatFrame=math.floor(3600/P.modeData.bpm) - P.gameEnv.fall=P.modeData.beatFrame - P.gameEnv.wait=math.max(P.gameEnv.wait-2,0) - P.gameEnv.drop=dropSpeed[P.modeData.target/10] - P.modeData.target=P.modeData.target+10 - SFX.play('reach') - end - end - end, - task=function(P) - P.modeData.target=10 - P.modeData.bpm=40 - P.modeData.beatFrame=90 - P.modeData.counter=90 - while true do - YIELD() - P.modeData.counter=P.modeData.counter-1 - if P.modeData.counter==0 then - P.modeData.counter=P.modeData.beatFrame - SFX.play('click',.3) - P:switchKey(6,true) - P:pressKey(6) - P:switchKey(6,false) - end - end - end, + eventSet='rhythm_e', bg='bg2',bgm='push', }, slowMark=true, diff --git a/parts/modes/rhythm_h.lua b/parts/modes/rhythm_h.lua index 1d23afa7..cdc0ce5e 100644 --- a/parts/modes/rhythm_h.lua +++ b/parts/modes/rhythm_h.lua @@ -1,5 +1,4 @@ local gc=love.graphics -local dropSpeed={[0]=60,50,40,30,24,18,14,10,8,6,5,4,3,2,1,1,.5,.5,.25,.25} return{ color=COLOR.magenta, @@ -9,38 +8,7 @@ return{ wait=10,fall=60, mindas=7,minarr=1,minsdarr=1, keyCancel={6}, - dropPiece=function(P) - if P.stat.row>=P.modeData.target then - if P.modeData.target==200 then - P:win('finish') - else - P.modeData.bpm=60+3*P.modeData.target/10 - P.modeData.beatFrame=math.floor(3600/P.modeData.bpm) - P.gameEnv.fall=P.modeData.beatFrame - P.gameEnv.wait=math.max(P.gameEnv.wait-1,0) - P.gameEnv.drop=dropSpeed[P.modeData.target/10] - P.modeData.target=P.modeData.target+10 - SFX.play('reach') - end - end - end, - task=function(P) - P.modeData.target=10 - P.modeData.bpm=60 - P.modeData.beatFrame=60 - P.modeData.counter=60 - while true do - YIELD() - P.modeData.counter=P.modeData.counter-1 - if P.modeData.counter==0 then - P.modeData.counter=P.modeData.beatFrame - SFX.play('click',.3) - P:switchKey(6,true) - P:pressKey(6) - P:switchKey(6,false) - end - end - end, + eventSet='rhythm_h', bg='bg2',bgm='secret8th', }, slowMark=true, diff --git a/parts/modes/rhythm_u.lua b/parts/modes/rhythm_u.lua index 1834a404..fa0ec529 100644 --- a/parts/modes/rhythm_u.lua +++ b/parts/modes/rhythm_u.lua @@ -9,44 +9,7 @@ return{ wait=5,fall=30, das=6,minarr=1,minsdarr=1, keyCancel={6}, - dropPiece=function(P) - if P.stat.row>=P.modeData.target then - if P.modeData.target==200 then - P:win('finish') - else - P.modeData.bpm=120+2*P.modeData.target/10 - P.modeData.beatFrame=math.floor(3600/P.modeData.bpm) - P.gameEnv.fall=P.modeData.beatFrame - P.gameEnv.wait=math.max(P.gameEnv.wait-1,0) - if P.modeData.target==50 then - P.gameEnv.das=5 - P.gameEnv.drop=.25 - elseif P.modeData.target==100 then - P.gameEnv.das=4 - P:set20G(true) - end - P.modeData.target=P.modeData.target+10 - SFX.play('reach') - end - end - end, - task=function(P) - P.modeData.target=10 - P.modeData.bpm=120 - P.modeData.beatFrame=30 - P.modeData.counter=30 - while true do - YIELD() - P.modeData.counter=P.modeData.counter-1 - if P.modeData.counter==0 then - P.modeData.counter=P.modeData.beatFrame - SFX.play('click',.3) - P:switchKey(6,true) - P:pressKey(6) - P:switchKey(6,false) - end - end - end, + eventSet='rhythm_h', bg='bg2',bgm='secret7th', }, slowMark=true, diff --git a/parts/modes/round_e.lua b/parts/modes/round_e.lua index 173632ee..17d57511 100644 --- a/parts/modes/round_e.lua +++ b/parts/modes/round_e.lua @@ -1,24 +1,12 @@ -local function update_round(P) - if P.stat.piece%7==0 and #PLY_ALIVE>1 then - P.control=false - local ID=P.id - repeat - ID=ID+1 - if not PLAYERS[ID]then ID=1 end - until PLAYERS[ID].alive or ID==P.id - PLAYERS[ID].control=true - end -end - return{ color=COLOR.cyan, env={ life=1, drop=300,lock=300, infHold=true, - dropPiece=update_round, pushSpeed=15, garbageSpeed=1e99, + eventSet='checkTurn_7', bg='rainbow',bgm='push', }, load=function() diff --git a/parts/modes/round_h.lua b/parts/modes/round_h.lua index e1d08b47..5aa2f696 100644 --- a/parts/modes/round_h.lua +++ b/parts/modes/round_h.lua @@ -1,24 +1,12 @@ -local function update_round(P) - if P.stat.piece%7==0 and #PLY_ALIVE>1 then - P.control=false - local ID=P.id - repeat - ID=ID+1 - if not PLAYERS[ID]then ID=1 end - until PLAYERS[ID].alive or ID==P.id - PLAYERS[ID].control=true - end -end - return{ color=COLOR.magenta, env={ life=1, drop=300,lock=300, infHold=true, - dropPiece=update_round, pushSpeed=15, garbageSpeed=1e99, + eventSet='checkTurn_7', bg='rainbow',bgm='push', }, load=function() diff --git a/parts/modes/round_l.lua b/parts/modes/round_l.lua index 20c768fe..e919b85d 100644 --- a/parts/modes/round_l.lua +++ b/parts/modes/round_l.lua @@ -1,24 +1,12 @@ -local function update_round(P) - if P.stat.piece%7==0 and #PLY_ALIVE>1 then - P.control=false - local ID=P.id - repeat - ID=ID+1 - if not PLAYERS[ID]then ID=1 end - until PLAYERS[ID].alive or ID==P.id - PLAYERS[ID].control=true - end -end - return{ color=COLOR.red, env={ life=1, drop=300,lock=300, infHold=true, - dropPiece=update_round, pushSpeed=15, garbageSpeed=1e99, + eventSet='checkTurn_7', bg='rainbow',bgm='push', }, load=function() diff --git a/parts/modes/round_n.lua b/parts/modes/round_n.lua index 6041661e..62ddb064 100644 --- a/parts/modes/round_n.lua +++ b/parts/modes/round_n.lua @@ -1,24 +1,12 @@ -local function update_round(P) - if P.stat.piece%7==0 and #PLY_ALIVE>1 then - P.control=false - local ID=P.id - repeat - ID=ID+1 - if not PLAYERS[ID]then ID=1 end - until PLAYERS[ID].alive or ID==P.id - PLAYERS[ID].control=true - end -end - return{ color=COLOR.green, env={ life=1, drop=300,lock=300, infHold=true, - dropPiece=update_round, pushSpeed=15, garbageSpeed=1e99, + eventSet='checkTurn_7', bg='rainbow',bgm='push', }, load=function() diff --git a/parts/modes/round_u.lua b/parts/modes/round_u.lua index 89729f47..b1292fff 100644 --- a/parts/modes/round_u.lua +++ b/parts/modes/round_u.lua @@ -1,24 +1,12 @@ -local function update_round(P) - if P.stat.piece%7==0 and #PLY_ALIVE>1 then - P.control=false - local ID=P.id - repeat - ID=ID+1 - if not PLAYERS[ID]then ID=1 end - until PLAYERS[ID].alive or ID==P.id - PLAYERS[ID].control=true - end -end - return{ color=COLOR.lYellow, env={ life=1, drop=300,lock=300, infHold=true, - dropPiece=update_round, pushSpeed=15, garbageSpeed=1e99, + eventSet='checkTurn_7', bg='rainbow',bgm='push', }, load=function() diff --git a/parts/modes/sprintAtk.lua b/parts/modes/sprintAtk.lua index 5f1409a3..684ea5ed 100644 --- a/parts/modes/sprintAtk.lua +++ b/parts/modes/sprintAtk.lua @@ -3,7 +3,7 @@ return{ env={ infHold=true, drop=1e99,lock=1e99, - dropPiece=function(P)if P.stat.atk>=100 then P:win('finish')end end, + eventSet='checkAttack_100', bg='matrix',bgm='new era', }, mesDisp=function(P) diff --git a/parts/modes/sprintFix.lua b/parts/modes/sprintFix.lua index 682a8215..b72732f9 100644 --- a/parts/modes/sprintFix.lua +++ b/parts/modes/sprintFix.lua @@ -4,7 +4,7 @@ return{ drop=60,lock=180, noTele=true, keyCancel={1,2}, - dropPiece=function(P)if P.stat.row>=40 then P:win('finish')end end, + eventSet='checkLine_40', bg='aura',bgm='waterfall', }, mesDisp=function(P) diff --git a/parts/modes/sprintLock.lua b/parts/modes/sprintLock.lua index 3aec710b..485ebcd7 100644 --- a/parts/modes/sprintLock.lua +++ b/parts/modes/sprintLock.lua @@ -3,7 +3,7 @@ return{ env={ drop=60,lock=180, keyCancel={3,4,5}, - dropPiece=function(P)if P.stat.row>=40 then P:win('finish')end end, + eventSet='checkLine_40', bg='aura',bgm='waterfall', }, mesDisp=function(P) diff --git a/parts/modes/sprintMPH.lua b/parts/modes/sprintMPH.lua index 687d0841..6b76b476 100644 --- a/parts/modes/sprintMPH.lua +++ b/parts/modes/sprintMPH.lua @@ -4,7 +4,7 @@ return{ drop=60,lock=60, nextCount=0,holdCount=0, sequence='rnd', - dropPiece=function(P)if P.stat.row>=40 then P:win('finish')end end, + eventSet='checkLine_40', bg='aura',bgm='waterfall', }, mesDisp=function(P) diff --git a/parts/modes/sprintPenta.lua b/parts/modes/sprintPenta.lua index a14c0265..2cbf65ea 100644 --- a/parts/modes/sprintPenta.lua +++ b/parts/modes/sprintPenta.lua @@ -3,7 +3,7 @@ return{ env={ drop=60,lock=60, sequence='bag',seqData={8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25}, - dropPiece=function(P)if P.stat.row>=40 then P:win('finish')end end, + eventSet='checkLine_40', bg='aura',bgm='beat5th', }, mesDisp=function(P) diff --git a/parts/modes/sprintSmooth.lua b/parts/modes/sprintSmooth.lua index 0fe7c92d..534d394d 100644 --- a/parts/modes/sprintSmooth.lua +++ b/parts/modes/sprintSmooth.lua @@ -4,7 +4,7 @@ return{ drop=0,lock=120, nextCount=3, das=0,arr=0, - dropPiece=function(P)if P.stat.row>=40 then P:win('finish')end end, + eventSet='checkLine_40', bg='aura',bgm='waterfall', }, mesDisp=function(P) diff --git a/parts/modes/sprint_1000l.lua b/parts/modes/sprint_1000l.lua index ca708453..ce378692 100644 --- a/parts/modes/sprint_1000l.lua +++ b/parts/modes/sprint_1000l.lua @@ -2,7 +2,7 @@ return{ color=COLOR.lGray, env={ drop=60,lock=60, - dropPiece=function(P)if P.stat.row>=1000 then P:win('finish')end end, + eventSet='checkLine_1000', bg='rainbow',bgm='push', }, mesDisp=function(P) diff --git a/parts/modes/sprint_100l.lua b/parts/modes/sprint_100l.lua index 9ff18f47..dea8f077 100644 --- a/parts/modes/sprint_100l.lua +++ b/parts/modes/sprint_100l.lua @@ -2,7 +2,7 @@ return{ color=COLOR.red, env={ drop=60,lock=60, - dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end, + eventSet='checkLine_100', bg='bg2',bgm='race', }, mesDisp=function(P) diff --git a/parts/modes/sprint_10l.lua b/parts/modes/sprint_10l.lua index b1e07c79..7dbe4036 100644 --- a/parts/modes/sprint_10l.lua +++ b/parts/modes/sprint_10l.lua @@ -2,7 +2,7 @@ return{ color=COLOR.cyan, env={ drop=60,lock=60, - dropPiece=function(P)if P.stat.row>=10 then P:win('finish')end end, + eventSet='checkLine_10', bg='bg2',bgm='race', }, mesDisp=function(P) diff --git a/parts/modes/sprint_20l.lua b/parts/modes/sprint_20l.lua index fa674995..d8bc02a2 100644 --- a/parts/modes/sprint_20l.lua +++ b/parts/modes/sprint_20l.lua @@ -2,7 +2,7 @@ return{ color=COLOR.lBlue, env={ drop=60,lock=60, - dropPiece=function(P)if P.stat.row>=20 then P:win('finish')end end, + eventSet='checkLine_20', bg='bg2',bgm='race', }, mesDisp=function(P) diff --git a/parts/modes/sprint_400l.lua b/parts/modes/sprint_400l.lua index 1bca99e3..4da191ba 100644 --- a/parts/modes/sprint_400l.lua +++ b/parts/modes/sprint_400l.lua @@ -2,7 +2,7 @@ return{ color=COLOR.dRed, env={ drop=60,lock=60, - dropPiece=function(P)if P.stat.row>=400 then P:win('finish')end end, + eventSet='checkLine_400', bg='rainbow',bgm='push', }, mesDisp=function(P) diff --git a/parts/modes/sprint_40l.lua b/parts/modes/sprint_40l.lua index f95845fb..31a90665 100644 --- a/parts/modes/sprint_40l.lua +++ b/parts/modes/sprint_40l.lua @@ -2,7 +2,7 @@ return{ color=COLOR.green, env={ drop=60,lock=60, - dropPiece=function(P)if P.stat.row>=40 then P:win('finish')end end, + eventSet='checkLine_40', bg='bg2',bgm='race', }, mesDisp=function(P) diff --git a/parts/modes/survivor_e.lua b/parts/modes/survivor_e.lua index d72cc1a9..018d0cd3 100644 --- a/parts/modes/survivor_e.lua +++ b/parts/modes/survivor_e.lua @@ -3,23 +3,7 @@ return{ env={ drop=30,lock=45, freshLimit=10, - task=function(P) - while true do - YIELD() - if P.control then - local D=P.modeData - D.timer=D.timer+1 - if D.timer>=math.max(60,150-2*D.wave)and P.atkBufferSum<4 then - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1}) - P.atkBufferSum=P.atkBufferSum+1 - P.stat.recv=P.stat.recv+1 - if D.wave==45 then P:_showText(text.maxspeed,0,-140,100,'appear',.6)end - D.timer=0 - D.wave=D.wave+1 - end - end - end - end, + eventSet='survivor_e', bg='glow',bgm='new era', }, mesDisp=function(P) diff --git a/parts/modes/survivor_h.lua b/parts/modes/survivor_h.lua index fb2250f6..6baed546 100644 --- a/parts/modes/survivor_h.lua +++ b/parts/modes/survivor_h.lua @@ -3,30 +3,7 @@ return{ env={ drop=30,lock=60, freshLimit=5, - task=function(P) - while true do - YIELD() - if P.control then - local D=P.modeData - D.timer=D.timer+1 - if D.timer>=math.max(60,180-2*D.wave)and P.atkBufferSum<15 then - local s - if D.wave%3<2 then - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1}) - s=1 - else - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=3,countdown=60,cd0=60,time=0,sent=false,lv=2}) - s=3 - end - P.atkBufferSum=P.atkBufferSum+s - P.stat.recv=P.stat.recv+s - if D.wave==60 then P:_showText(text.maxspeed,0,-140,100,'appear',.6)end - D.timer=0 - D.wave=D.wave+1 - end - end - end - end, + eventSet='survivor_h', bg='glow',bgm='new era', }, mesDisp=function(P) diff --git a/parts/modes/survivor_l.lua b/parts/modes/survivor_l.lua index 79d6c4ab..20de2852 100644 --- a/parts/modes/survivor_l.lua +++ b/parts/modes/survivor_l.lua @@ -3,24 +3,7 @@ return{ env={ drop=30,lock=60, freshLimit=5, - task=function(P) - while true do - YIELD() - if P.control then - local D=P.modeData - D.timer=D.timer+1 - if D.timer>=math.max(60,150-D.wave)and P.atkBufferSum<20 then - local t=math.max(60,90-D.wave) - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}) - P.atkBufferSum=P.atkBufferSum+4 - P.stat.recv=P.stat.recv+4 - if D.wave==60 then P:_showText(text.maxspeed,0,-140,100,'appear',.6)end - D.timer=0 - D.wave=D.wave+1 - end - end - end - end, + eventSet='survivor_l', bg='glow',bgm='here', }, mesDisp=function(P) diff --git a/parts/modes/survivor_n.lua b/parts/modes/survivor_n.lua index f8f74917..61b392ff 100644 --- a/parts/modes/survivor_n.lua +++ b/parts/modes/survivor_n.lua @@ -3,29 +3,7 @@ return{ env={ drop=30,lock=60, freshLimit=10, - task=function(P) - while true do - YIELD() - if P.control then - local D=P.modeData - D.timer=D.timer+1 - if D.timer>=math.max(90,180-2*D.wave)and P.atkBufferSum<8 then - local d=D.wave+1 - table.insert(P.atkBuffer, - d%4==0 and{line=generateLine(P.holeRND:random(10)),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1}or - d%4==1 and{line=generateLine(P.holeRND:random(10)),amount=2,countdown=70,cd0=70,time=0,sent=false,lv=1}or - d%4==2 and{line=generateLine(P.holeRND:random(10)),amount=3,countdown=80,cd0=80,time=0,sent=false,lv=2}or - d%4==3 and{line=generateLine(P.holeRND:random(10)),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3} - ) - P.atkBufferSum=P.atkBufferSum+d%4+1 - P.stat.recv=P.stat.recv+d%4+1 - if D.wave==45 then P:_showText(text.maxspeed,0,-140,100,'appear',.6)end - D.timer=0 - D.wave=d - end - end - end - end, + eventSet='survivor_n', bg='glow',bgm='new era', }, mesDisp=function(P) diff --git a/parts/modes/survivor_u.lua b/parts/modes/survivor_u.lua index dde0c19a..8a238487 100644 --- a/parts/modes/survivor_u.lua +++ b/parts/modes/survivor_u.lua @@ -5,27 +5,7 @@ return{ fall=10, freshLimit=15, pushSpeed=2, - task=function(P) - while true do - YIELD() - if P.control then - local D=P.modeData - D.timer=D.timer+1 - if D.timer>=math.max(300,600-10*D.wave)and P.atkBufferSum<20 then - local t=math.max(300,480-12*D.wave) - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=2}) - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}) - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=6,countdown=1.2*t,cd0=1.2*t,time=0,sent=false,lv=4}) - table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=6,countdown=1.5*t,cd0=1.5*t,time=0,sent=false,lv=5}) - P.atkBufferSum=P.atkBufferSum+20 - P.stat.recv=P.stat.recv+20 - if D.wave==31 then P:_showText(text.maxspeed,0,-140,100,'appear',.6)end - D.timer=0 - D.wave=D.wave+1 - end - end - end - end, + eventSet='survivor_u', bg='welcome',bgm='here', }, mesDisp=function(P) diff --git a/parts/modes/tech_finesse.lua b/parts/modes/tech_finesse.lua index 7a801be1..040c93f6 100644 --- a/parts/modes/tech_finesse.lua +++ b/parts/modes/tech_finesse.lua @@ -4,8 +4,8 @@ return{ arr=0, drop=1e99,lock=60, freshLimit=15, - dropPiece=function(P)if P.stat.atk>=100 then P:win('finish')end end, fineKill=true, + eventSet='checkAttack_100', bg='flink',bgm='infinite', }, slowMark=true, diff --git a/parts/modes/tech_h.lua b/parts/modes/tech_h.lua index 491cd955..6a1f3428 100644 --- a/parts/modes/tech_h.lua +++ b/parts/modes/tech_h.lua @@ -4,7 +4,7 @@ return{ drop=20,lock=60, freshLimit=15, b2bKill=true, - dropPiece=function(P)if P.stat.atk>=100 then P:win('finish')end end, + eventSet='checkAttack_100', bg='matrix',bgm='down', }, mesDisp=function(P) diff --git a/parts/modes/tech_l.lua b/parts/modes/tech_l.lua index b767ae12..33dd02ed 100644 --- a/parts/modes/tech_l.lua +++ b/parts/modes/tech_l.lua @@ -4,7 +4,7 @@ return{ drop=0,lock=60, freshLimit=15, b2bKill=true, - dropPiece=function(P)if P.stat.atk>=100 then P:win('finish')end end, + eventSet='checkAttack_100', bg='matrix',bgm='warped', }, mesDisp=function(P) diff --git a/parts/modes/tech_n.lua b/parts/modes/tech_n.lua index 4b401e5a..86ad6e70 100644 --- a/parts/modes/tech_n.lua +++ b/parts/modes/tech_n.lua @@ -4,7 +4,7 @@ return{ infHold=true, drop=1e99,lock=1e99, b2bKill=true, - dropPiece=function(P)if P.stat.atk>=100 then P:win('finish')end end, + eventSet='checkAttack_100', bg='matrix',bgm='new era', }, mesDisp=function(P) diff --git a/parts/modes/tsd_h.lua b/parts/modes/tsd_h.lua index d95a5476..890bce89 100644 --- a/parts/modes/tsd_h.lua +++ b/parts/modes/tsd_h.lua @@ -1,31 +1,12 @@ local gc=love.graphics -local function check_tsd(P) - local C=P.lastPiece - if C.row>0 then - if C.id==5 and C.row==2 and C.spin then - local L=P.modeData.history - if L[1]==C.centX and L[1]==L[2]and L[1]==L[3]then - P:showText("STACK",0,-140,40,'flicker',.3) - P:lose() - else - P.modeData.tsd=P.modeData.tsd+1 - table.insert(L,1,C.centX) - L[4]=nil - end - else - P:lose() - end - end -end return{ color=COLOR.magenta, env={ drop=30,lock=60, freshLimit=15, - dropPiece=check_tsd, - task=function(P)P.modeData.history={}end, ospin=false, + eventSet='tsd_h', bg='matrix',bgm='vapor', }, mesDisp=function(P) diff --git a/parts/modes/tsd_u.lua b/parts/modes/tsd_u.lua index 1346d941..f5585b25 100644 --- a/parts/modes/tsd_u.lua +++ b/parts/modes/tsd_u.lua @@ -1,30 +1,12 @@ local gc=love.graphics -local function check_tsd(P) - local C=P.lastPiece - if C.row>0 then - if C.id==5 and C.row==2 and C.spin then - if TABLE.find(P.modeData.history,C.centX)then - P:showText("STACK",0,-140,40,'flicker',.3) - P:lose() - else - P.modeData.tsd=P.modeData.tsd+1 - table.insert(P.modeData.history,1,C.centX) - P.modeData.history[5]=nil - end - else - P:lose() - end - end -end return{ color=COLOR.lYellow, env={ drop=60,lock=60, freshLimit=15, - dropPiece=check_tsd, - task=function(P)P.modeData.history={}end, ospin=false, + eventSet='tsd_u', bg='matrix',bgm='vapor', }, mesDisp=function(P) diff --git a/parts/modes/ultra.lua b/parts/modes/ultra.lua index ebc1e94c..c9f91950 100644 --- a/parts/modes/ultra.lua +++ b/parts/modes/ultra.lua @@ -1,5 +1,4 @@ local gc=love.graphics -local warnTime={60,90,105,115,116,117,118,119,120} return{ color=COLOR.lGray, env={ @@ -7,22 +6,7 @@ return{ minarr=1,minsdarr=1, drop=60,lock=60, fall=20, - task=function(P) - P.modeData.stage=1 - while true do - YIELD() - if P.stat.frame/60>=warnTime[P.modeData.stage]then - if P.modeData.stage<9 then - P.modeData.stage=P.modeData.stage+1 - SFX.play('ready',.7+P.modeData.stage*.03) - else - SFX.play('start') - P:win('finish') - return - end - end - end - end, + eventSet='ultra', bg='fan',bgm='memory', }, slowMark=true, diff --git a/parts/modes/zen.lua b/parts/modes/zen.lua index 59775686..e2b912c4 100644 --- a/parts/modes/zen.lua +++ b/parts/modes/zen.lua @@ -3,7 +3,7 @@ return{ env={ drop=120,lock=120, infHold=true, - dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end, + eventSet='checkLine_200', bg='bg2',bgm='venus', }, mesDisp=function(P) diff --git a/parts/net.lua b/parts/net.lua index d14ebeaa..446299c0 100644 --- a/parts/net.lua +++ b/parts/net.lua @@ -371,7 +371,7 @@ function NET.quitChat() WS.send('chat','q') end ---WS tick funcs +--WS task funcs function NET.freshPlayerCount() while WS.status('app')=='running'do for _=1,260 do yield()end diff --git a/parts/player/gameEnv0.lua b/parts/player/gameEnv0.lua index 603e415d..1f081517 100644 --- a/parts/player/gameEnv0.lua +++ b/parts/player/gameEnv0.lua @@ -56,10 +56,13 @@ return{ fine=false,fineKill=false, b2bKill=false, missionKill=false, - dropPiece=NULL, mindas=0,minarr=0,minsdarr=0, noInitSZO=false, + task={}, + dropPiece={}, + eventSet=false, + bg='none',bgm='race', allowMod=true, } \ No newline at end of file diff --git a/parts/player/init.lua b/parts/player/init.lua index bb6ae83a..b6ca0722 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -350,6 +350,26 @@ local function _applyGameEnv(P)--Finish gameEnv processing if ENV.grid==0 then ENV.grid=false end if ENV.center==0 then ENV.center=false end if ENV.lineNum==0 then ENV.lineNum=false end + + --Apply eventSet + if ENV.eventSet then + if type(ENV.eventSet)=='string'then + local eventSet=require('parts.eventsets.'..ENV.eventSet) + if eventSet then + for k,v in next,eventSet do + ENV[k]=v + end + else + MES.new('warn',"No event set called: "..ENV.eventSet) + end + else + MES.new('warn',"Wrong event set type: "..type(ENV.eventSet)) + end + end + + --Apply events + if type(ENV.dropPiece)=='function'then ENV.dropPiece={ENV.dropPiece} else ENV.dropPiece=TABLE.shift(ENV.dropPiece) end + if type(ENV.task)=='function'then P:newTask(ENV.task) else for i=1,#ENV.task do P:newTask(ENV.task[i])end end end ---------------------------------------------------- diff --git a/parts/player/player.lua b/parts/player/player.lua index 1861dfbc..b0800f5a 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -290,6 +290,13 @@ function Player:setRS(RSname) if self.cur then self.cur.RS=rs end end +function Player:triggerDropEvents() + local L=self.gameEnv.dropPiece + for i=1,#L do + L[i](self) + end +end + function Player:getHolePos()--Get a good garbage-line hole position if self.garbageBeneath==0 then return generateLine(self.holeRND:random(10)) @@ -1183,7 +1190,7 @@ do--Player.drop(self)--Place piece if finePts<5 then Stat.extraPiece=Stat.extraPiece+1 if ENV.fineKill then - finish=true + finish='lose' end if self.sound then if ENV.fineKill then @@ -1349,7 +1356,7 @@ do--Player.drop(self)--Place piece if self.b2b>1000 then self.b2b=1000 elseif self.b2b==0 and ENV.b2bKill then - finish=true + finish='lose' end --Bonus atk/def when focused @@ -1468,7 +1475,7 @@ do--Player.drop(self)--Place piece elseif ENV.missionKill then self:_showText(text.missionFailed,0,140,40,'flicker',.5) SFX.play('finesseError_long',.6) - finish=true + finish='lose' end end @@ -1513,11 +1520,14 @@ do--Player.drop(self)--Place piece end if finish then - if finish==true then self:lose()return end - _=ENV.dropPiece if _ then _(self)end - if finish then self:win(finish)end + if finish=='lose'then + self:lose() + else + self:triggerDropEvents() + if finish then self:win(finish)end + end else - _=ENV.dropPiece if _ then _(self)end + self:triggerDropEvents() end end end diff --git a/parts/updateLog.lua b/parts/updateLog.lua index 3de6fbd1..2541134e 100644 --- a/parts/updateLog.lua +++ b/parts/updateLog.lua @@ -40,9 +40,11 @@ return[=[ 增大场地晃动的阻力,看起来更舒服 平滑下落的消行动画曲线稍微拉直一些 消除目标线高度会在消行时跟随平滑下落动画 #208 + 回合制模式改为7块一个回合与两条命 代码: - 重做ai相关,新增BOT模块方便未来接入更多机器人 + 重写ai相关代码(轻微影响难度),新增BOT模块方便未来接入更多机器人 修改主循环帧率限制策略,尝试修复部分设备帧率不稳定(可能消耗更多性能) + 重构模式环境的dropPiece和task事件为更强大的自定义和未来联网任意模式做准备 大规模整理ai相关代码 方块对象内记录旋转系统 大规模整理玩家创建特效相关方法 @@ -56,6 +58,7 @@ return[=[ 小程序15p开盲打报错 f11开关全屏时不会自动保存 #230 非sudomode下控制台#print非字符串报错 #231 + 包分界线关不掉 0.16.1: 深空 Deep space 新增: