local int,rnd,max,min=math.floor,math.random,math.max,math.min local format=string.format local ins,rem=table.insert,table.remove local PCbase={ {3,3,3,0,0,0,0,0,2,2}, {3,6,6,0,0,0,0,2,2,5}, {4,6,6,0,0,0,1,1,5,5}, {4,4,4,0,0,0,0,1,1,5}, {1,1,0,0,0,0,0,3,3,3}, {5,1,1,0,0,0,0,6,6,3}, {5,5,2,2,0,0,0,6,6,4}, {5,2,2,0,0,0,0,4,4,4}, } local PClist={ {7,7,4,5},{7,7,6,4},{7,7,2,4},{7,7,1,3},{7,7,5,6},{7,7,5,2},{7,7,5,4},{7,7,5,3}, {7,4,1,2},{7,3,5,7},{7,5,4,3},{7,5,1,2},{7,1,4,2},{7,4,2,5},{7,6,4,5},{7,5,4,2}, {7,5,6,4},{7,5,3,6},{7,2,5,6},{7,2,6,4},{7,2,1,3},{7,5,2,7},{7,5,7,2},{7,5,2,3}, {7,5,3,2},{7,6,5,4},{7,3,1,5},{7,3,2,5},{7,4,1,5},{7,4,5,2},{7,7,3,6},{7,3,7,6}, {7,3,6,2},{7,3,7,1},{7,6,4,2},{3,2,7,6},{3,2,6,7},{7,7,4,5},{7,5,3,4},{7,3,6,5}, {7,3,2,5},{7,4,6,5},{7,5,2,3},{7,3,5,7},{7,3,2,5},{7,3,5,1},{7,5,2,3},{3,6,2,5}, {3,1,2,5},{3,1,1,5},{3,1,5,2},{3,1,5,1},{3,5,1,2},{4,5,3,2},{4,2,6,5},{6,5,3,2}, {1,4,2,5},{1,5,3,6},{5,2,6,3},{5,2,1,3},{5,2,7,4},{2,4,1,5},{2,4,5,1},{2,1,4,5}, {2,5,4,3},{2,5,6,7},{7,5,4,2},{4,5,3,5}, } local marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0} 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 death_lock={12,11,10,9,8} local death_wait={10,9,8,7,6} local death_fall={10,9,8,7,6} local pc_drop={50,45,40,35,30,26,22,18,15,12} local pc_lock={55,50,45,40,36,32,30} local pc_fall={18,16,14,12,10,9,8,7,6} local function throwBadge(S,R)--Sender/Receiver local x1,y1,x2,y2 if S.small then x1,y1=S.centerX,S.centerY else x1,y1=S.x+308*S.size,S.y+450*S.size end if R.small then x2,y2=R.centerX,R.centerY else x2,y2=R.x+66*R.size,R.y+344*R.size end FX_badge[#FX_badge+1]={x1,y1,x2,y2,t=0} end local AISpeed={60,50,45,35,25,15,9,7,5,3} local function AITemplate(type,speedLV,next,hold,node) if type=="CC"then return{ type="CC", next=next, hold=hold,--hold,-------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!! delta=AISpeed[speedLV], node=node, } elseif type=="9S"then return{ type="9S", delta=int(AISpeed[speedLV]*.5), } end end loadmode={} function loadmode.sprint() newPlayer(1,340,15) end function loadmode.marathon() newPlayer(1,340,15) end function loadmode.master() newPlayer(1,340,15) end function loadmode.classic() newPlayer(1,340,15) end function loadmode.zen() newPlayer(1,340,15) end function loadmode.infinite() newPlayer(1,340,15) if curMode.lv==2 then pushSpeed=1 for _=1,5 do players[1]:garbageRise(10,1,rnd(10)) end end end function loadmode.solo() newPlayer(1,340,15) if curMode.lv==1 then newPlayer(2,965,360,.5,AITemplate("9S",3)) elseif curMode.lv==2 then newPlayer(2,965,360,.5,AITemplate("CC",2,2,false,10000)) elseif curMode.lv==3 then newPlayer(2,965,360,.5,AITemplate("9S",6)) elseif curMode.lv==4 then newPlayer(2,965,360,.5,AITemplate("CC",5,2,true,20000)) elseif curMode.lv==5 then newPlayer(2,965,360,.5,AITemplate("9S",9)) elseif curMode.lv==6 then newPlayer(2,965,360,.5,AITemplate("CC",8,3,true,30000)) elseif curMode.lv==7 then newPlayer(2,965,360,.5,AITemplate("9S",10)) elseif curMode.lv==8 then newPlayer(2,965,360,.5,AITemplate("CC",9,3,true,40000)) elseif curMode.lv==9 then newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,80000)) end end function loadmode.round() newPlayer(1,340,15) if curMode.lv==1 then newPlayer(2,965,360,.5,AITemplate("9S",10)) elseif curMode.lv==2 then newPlayer(2,965,360,.5,AITemplate("CC",10,2,false,10000)) elseif curMode.lv==3 then newPlayer(2,965,360,.5,AITemplate("CC",10,3,true,30000)) elseif curMode.lv==4 then newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,60000)) elseif curMode.lv==5 then newPlayer(2,965,360,.5,AITemplate("CC",10,6,true,100000)) end garbageSpeed=1e4 end function loadmode.tsd() newPlayer(1,340,15) end function loadmode.blind() newPlayer(1,340,15) end function loadmode.dig() newPlayer(1,340,15) pushSpeed=1 end function loadmode.survivor() newPlayer(1,340,15) pushSpeed=curMode.lv>2 and 2 or 1 end function loadmode.defender() newPlayer(1,340,15) if curMode.lv==1 then pushSpeed=1 elseif curMode.lv==2 then pushSpeed=2 end end function loadmode.attacker() newPlayer(1,340,15) if curMode.lv==1 then pushSpeed=2 end end function loadmode.tech() newPlayer(1,340,15) end function loadmode.c4wtrain() newPlayer(1,340,15) local P=players[1] local F=P.field for i=1,24 do F[i]=getNewRow(10) P.visTime[i]=getNewRow(20) for x=4,7 do F[i][x]=0 end end local r=rnd(6) if r==1 then F[1][5],F[1][4],F[2][4]=10,10,10 elseif r==2 then F[1][6],F[1][7],F[2][7]=10,10,10 elseif r==3 then F[1][4],F[2][4],F[2][5]=10,10,10 elseif r==4 then F[1][7],F[2][7],F[2][6]=10,10,10 elseif r==5 then F[1][4],F[1][5],F[1][6]=10,10,10 elseif r==6 then F[1][7],F[1][6],F[1][5]=10,10,10 end end function loadmode.pctrain() newPlayer(1,340,15) Event.newPC(players[1]) end function loadmode.pcchallenge() newPlayer(1,340,15) end function loadmode.techmino49() newPlayer(1,340,15) local LV=curMode.lv if LV==3 then players[1].gameEnv.drop=15 end local L={}for i=1,49 do L[i]=true end local t=system~="Windows"and 0 or 2*LV while t>0 do local r=rnd(2,49) if L[r]then L[r],t=false,t-1 end end local min,max if LV==1 then min,max=4,6 elseif LV==2 then min,max=4,8 elseif LV==3 then min,max=8,10 end local n=2 for i=1,4 do for j=1,6 do if L[n]then newPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(min,max))) else newPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) end n=n+1 end end for i=9,12 do for j=1,6 do if L[n]then newPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(min,max))) else newPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) end n=n+1 end end end function loadmode.techmino99() newPlayer(1,340,15) local LV=curMode.lv if LV==3 then players[1].gameEnv.drop=15 end local L={}for i=1,100 do L[i]=true end local t=system~="Windows"and 0 or 1+3*LV while t>0 do local r=rnd(2,99) if L[r]then L[r],t=false,t-1 end end local min,max if LV==1 then min,max=4,6 elseif LV==2 then min,max=4,8 elseif LV==3 then min,max=8,10 end local n=2 for i=1,7 do for j=1,7 do if L[n]then newPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(min,max))) else newPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) end n=n+1 end end for i=15,21 do for j=1,7 do if L[n]then newPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(min,max))) else newPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) end n=n+1 end end end function loadmode.drought() newPlayer(1,340,15) end function loadmode.hotseat() if curMode.lv==1 then newPlayer(1,20,15) newPlayer(2,650,15) elseif curMode.lv==2 then newPlayer(1,20,100,.65) newPlayer(2,435,100,.65) newPlayer(3,850,100,.65) elseif curMode.lv==3 then newPlayer(1,25,160,.5) newPlayer(2,335,160,.5) newPlayer(3,645,160,.5) newPlayer(4,955,160,.5) end end function loadmode.custom() for i=1,#customID do local k=customID[i] modeEnv[k]=customRange[k][customSel[i]] end modeEnv._20G=modeEnv.drop==0 modeEnv.oncehold=customSel[6]==1 if curMode.lv==2 then modeEnv.target=0 end newPlayer(1,340,15) local L=modeEnv.opponent if L~=0 then modeEnv.target=nil if L<10 then newPlayer(2,965,360,.5,AITemplate("9S",2*L)) else newPlayer(2,965,360,.5,AITemplate("CC",L-6,2+int((L-11)*.5),modeEnv.hold,15000+5000*(L-10))) end end preField.h=20 repeat for i=1,10 do if preField[preField.h][i]>0 or curMode.lv==2 and preField[preField.h][i]==-1 then goto L end end preField.h=preField.h-1 until preField.h==0 ::L:: if curMode.lv==1 then for _,P in next,players.alive do local t=P.showTime*3 for y=1,preField.h do P.field[y]=getNewRow(0) P.visTime[y]=getNewRow(t) for x=1,10 do P.field[y][x]=preField[y][x]end end end end modeEnv.bg=customRange.bg[customSel[12]] modeEnv.bgm=customRange.bgm[customSel[13]] end -------------------------------------------------- Event={null=NULL} function Event.reach_winCheck(P) if P.stat.row>=P.gameEnv.target then Event.win(P) end end function Event.win(P) P.alive=false P.control=false P.timing=false P.waiting=1e99 P.b2b=0 clearTask(P) if modeEnv.royaleMode then P.rank=1 P.result="WIN" P:changeAtk() end for i=1,#P.atkBuffer do P.atkBuffer[i].sent=true P.atkBuffer[i].time=0 end for i=1,#P.field do for j=1,10 do P.visTime[i][j]=min(P.visTime[i][j],20) end end if P.human then gamefinished=true SFX("win") VOICE("win") if modeEnv.royaleMode then BGM("8-bit happiness") end end newTask(Event_task.finish,P) P:showText(text.win,"beat",90,nil,.4,curMode.id~="custom") end function Event.lose(P) if P.invincible then while P.field[1]do removeRow(P.field) removeRow(P.visTime) end if P.AI_mode=="CC"then P.AI_needFresh=true end return end P.alive=false P.control=false P.timing=false P.waiting=1e99 P.b2b=0 clearTask(P) for i=1,#players.alive do if players.alive[i]==P then for k=i,#players.alive do players.alive[k]=players.alive[k+1] end break end end if modeEnv.royaleMode then P:changeAtk() P.result="K.O." P.rank=#players.alive+1 P:showText(P.rank,"appear",60,120,nil,true) P.strength=0 if P.lastRecv then local A,i=P,0 repeat A,i=A.lastRecv,i+1 until not A or A.alive or A==P or i==3 if A and A.alive then if P.id==1 or A.id==1 then P.killMark=A.id==1 end A.ko,A.badge=A.ko+1,A.badge+P.badge+1 for i=A.strength+1,4 do if A.badge>=modeEnv.royalePowerup[i]then A.strength=i end end P.lastRecv=A if P.id==1 or A.id==1 then newTask(Event_task.throwBadge,A,{P,max(3,P.badge)*4}) end freshMostBadge() end else P.badge=-1 end freshMostDangerous() for i=1,#players.alive do if players.alive[i].atking==P then players.alive[i]:freshTarget() end end if #players.alive==modeEnv.royaleRemain[gameStage]then royaleLevelup() end end for i=1,#P.atkBuffer do P.atkBuffer[i].sent=true P.atkBuffer[i].time=0 end for i=1,#P.field do for j=1,10 do P.visTime[i][j]=min(P.visTime[i][j],20) end end P.gameEnv.keepVisible=P.gameEnv.visible~="show" P:showText(text.lose,"appear",90,nil,nil,true) if P.human then gamefinished=true SFX("fail") VOICE("lose") if modeEnv.royaleMode then BGM("end")end end if #players.alive==1 then Event.win(players.alive[1]) end if #players>1 then newTask(Event_task.lose,P) else newTask(Event_task.finish,P) end end function Event.marathon_update(P) if P.stat.row>=P.gameEnv.target then local s=int(P.stat.row*.1) if s>=20 then P.stat.row=200 Event.win(P) else P.gameEnv.drop=marathon_drop[s] if s==18 then P.gameEnv._20G=true end P.gameEnv.target=s*10+10 SFX("reach") end end end function Event.master_score(P) local c=#P.cleared if c==0 and P.modeData.point%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 P.modeData.point=P.modeData.point+s if P.modeData.point%100==99 then SFX("blip_1") elseif P.modeData.point>=100*(P.modeData.event+1)then local s=P.modeData.event+1;P.modeData.event=s--level up! local E=P.gameEnv local mode=curMode.lv if mode==1 then curBG=s==1 and"game1"or s==2 and"game2"or s==3 and"game3"or s==4 and"game4" E.lock=rush_lock[s] E.wait=rush_wait[s] E.fall=rush_fall[s] E.das=10-s if s==2 then P.gameEnv.arr=2 end if s==4 then P.gameEnv.bone=true end elseif mode==2 then curBG=s==1 and"game3"or s==2 and"game4"or s==3 and"game5"or s==4 and"game6" E.lock=death_lock[s] E.wait=death_wait[s] E.fall=death_fall[s] E.das=int(6.9-s*.4) if s==3 then P.gameEnv.bone=true end end if s==5 then P.modeData.point,P.modeData.event=500,4 Event.win(P) else P:showText(text.stage(s),"fly",80,-120) end SFX("reach") end end function Event.master_score_hard(P) local c=#P.cleared if c==0 then return end local s if P.lastClear<10 then s=c else s=c<3 and c+1 or c<5 and 6 or 10 end if P.combo>9 then s=s+2 elseif P.combo>4 then s=s+1 end P.modeData.point=P.modeData.point+s if P.modeData.point%100==99 then SFX("blip_1")end if int(P.modeData.point*.01)>P.modeData.event then local s=P.modeData.event+1;P.modeData.event=s--level up! P:showText(text.stage(s),"fly",80,-120) if s<4 then--first 300 if s~=1 then P.gameEnv.lock=P.gameEnv.lock-1 end if s~=2 then P.gameEnv.wait=P.gameEnv.wait-1 end if s~=3 then P.gameEnv.fall=P.gameEnv.fall-1 end elseif s<10 then if s==4 or s==7 then P.gameEnv.das=P.gameEnv.das-1 end s=s%3 if s==0 then P.gameEnv.lock=P.gameEnv.lock-1 elseif s==1 then P.gameEnv.wait=P.gameEnv.wait-1 elseif s==2 then P.gameEnv.fall=P.gameEnv.fall-1 end else P.modeData.point,P.modeData.event=1000,9 Event.win(P) end SFX("reach") end end function Event.classic_reach(P) if P.stat.row>=P.gameEnv.target then P.gameEnv.target=P.gameEnv.target+10 if P.gameEnv.target==110 then P.gameEnv.drop,P.gameEnv.lock=2,2 elseif P.gameEnv.target==200 then P.gameEnv.drop,P.gameEnv.lock=1,1 end if P.gameEnv.target>100 then SFX("reach") end end end function Event.infinite_check(P) for i=1,#P.cleared do if P.cleared[i]<6 then P:garbageRise(10,1,rnd(10)) end end end function Event.round_check(P) if #players.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 function Event.GM_score(P) local F=false if P.modeData.point<70 then--if Less then MM local R=#P.cleared if R==4 then R=10 end P.modeData.point=P.modeData.point+R F=true end if P.stat.time>=53.5 then P.modeData.point=min(P.modeData.point+15,80) F=true Event.win(P) end if F then P.modeData.event=sectionName[int(P.modeData.point*.1)+1] end end function Event.tsd_reach(P) if #P.cleared>0 then if P.lastClear~=52 then Event.lose(P) elseif #P.cleared>0 then P.modeData.event=P.modeData.event+1 end end end function Event.tech_reach_easy(P) if #P.cleared>0 and P.b2b<40 then Event.lose(P) end end function Event.tech_reach_hard(P) if #P.cleared>0 and P.lastClear<10 then Event.lose(P) end end function Event.tech_reach_ultimate(P) if #P.cleared>0 and P.lastClear<10 or P.lastClear==74 then Event.lose(P) end end function Event.c4w_reach(P) for i=1,#P.cleared do P.field[#P.field+1]=getNewRow(10) P.visTime[#P.visTime+1]=getNewRow(20) for i=4,7 do P.field[#P.field][i]=0 end end if #P.cleared==0 then if curMode.lv==2 then Event.lose(P) end else if P.combo>P.modeData.point then P.modeData.point=P.combo end if P.stat.row>=100 then Event.win(P) end end end function Event.newPC(P) local r=P.field;r=r[#r] if r then local c=0 for i=1,10 do if r[i]>0 then c=c+1 end end if c<5 then Event.lose(P) end end if P.stat.piece%4==0 and #P.field==0 then P.modeData.event=P.modeData.event==0 and 1 or 0 local r=rnd(#PClist) local f=P.modeData.event==0 for i=1,4 do local b=PClist[r][i] if f then if b<3 then b=3-b elseif b<5 then b=7-b end end P.next[#P.next+1]={bk=blocks[b][0],id=b,color=b,name=b}--P:newNext(b)'s simple version! end P.counter=P.stat.piece==0 and 20 or 0 newTask(Event_task.PC,P) if curMode.lv==2 then local s=P.stat.pc*.5 if int(s)==s and s>0 then P.gameEnv.drop=pc_drop[s]or 10 P.gameEnv.lock=pc_lock[s]or 20 P.gameEnv.fall=pc_fall[s]or 5 if s==10 then P:showText(text.maxspeed,"appear",100,-140,.6) else P:showText(text.speedup,"appear",40,-140) end end end end end function Event.puzzleCheck(P) for y=1,20 do local L=P.field[y] for x=1,10 do local a,b=preField[y][x],L and L[x]or 0 if a~=0 then if a==-1 then if b>0 then return end elseif a<8 then if a~=b then return end elseif a>7 then if b==0 then return end end end end end P.modeData.event=1 Event.win(P) end -------------------------------------------------- -------------------------------------------------- Event_task={} function Event_task.finish(P) P.endCounter=P.endCounter+1 if P.endCounter>120 then pauseGame() return true end end function Event_task.lose(P) P.endCounter=P.endCounter+1 if P.endCounter>80 then for i=1,#P.field do for j=1,10 do if P.visTime[i][j]>0 then P.visTime[i][j]=P.visTime[i][j]-1 end end end if P.endCounter==100 then while P.field[1]do removeRow(P.field) removeRow(P.visTime) end if #players==1 then pauseGame() end return true end end end function Event_task.throwBadge(A,data) data[2]=data[2]-1 if data[2]%4==0 then throwBadge(data[1],data[1].lastRecv) if not A.ai and data[2]%8==0 then SFX("collect") end end if data[2]<=0 then return true end end function Event_task.dig_normal(P) if not P.control then return end P.counter=P.counter+1 if P.counter>=max(90,180-P.modeData.event)then P.counter=0 P:garbageRise(10,1,rnd(10)) P.modeData.event=P.modeData.event+1 end end function Event_task.dig_lunatic(P) if not P.control then return end P.counter=P.counter+1 if P.counter>=max(45,80-.3*P.modeData.event)then P.counter=0 P:garbageRise(11+P.modeData.event%3,1,rnd(10)) P.modeData.event=P.modeData.event+1 end end function Event_task.survivor_easy(P) if not P.control then return end P.counter=P.counter+1 if P.counter>=max(60,150-2*P.modeData.event)and P.atkBuffer.sum<4 then P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1} P.atkBuffer.sum=P.atkBuffer.sum+1 P.stat.recv=P.stat.recv+1 if P.modeData.event==45 then P:showText(text.maxspeed,"appear",100,-140,.6)end P.counter=0 P.modeData.event=P.modeData.event+1 end end function Event_task.survivor_normal(P) if not P.control then return end P.counter=P.counter+1 if P.counter>=max(90,180-2*P.modeData.event)and P.atkBuffer.sum<8 then local d=P.modeData.event+1 P.atkBuffer[#P.atkBuffer+1]= d%4==0 and{pos=rnd(10),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1}or d%4==1 and{pos=rnd(10),amount=2,countdown=70,cd0=70,time=0,sent=false,lv=1}or d%4==2 and{pos=rnd(10),amount=3,countdown=80,cd0=80,time=0,sent=false,lv=2}or d%4==3 and{pos=rnd(10),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3} P.atkBuffer.sum=P.atkBuffer.sum+d%4+1 P.stat.recv=P.stat.recv+d%4+1 if P.modeData.event==45 then P:showText(text.maxspeed,"appear",100,-140,.6)end P.counter=0 P.modeData.event=d end end function Event_task.survivor_hard(P) if not P.control then return end P.counter=P.counter+1 if P.counter>=max(60,180-2*P.modeData.event)and P.atkBuffer.sum<15 then P.atkBuffer[#P.atkBuffer+1]= P.modeData.event%3<2 and {pos=rnd(10),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1} or {pos=rnd(10),amount=3,countdown=60,cd0=60,time=0,sent=false,lv=2} local R=(P.modeData.event%3<2 and 1 or 3) P.atkBuffer.sum=P.atkBuffer.sum+R P.stat.recv=P.stat.recv+R if P.modeData.event==60 then P:showText(text.maxspeed,"appear",100,-140,.6)end P.counter=0 P.modeData.event=P.modeData.event+1 end end function Event_task.survivor_lunatic(P) if not P.control then return end P.counter=P.counter+1 if P.counter>=max(60,150-P.modeData.event)and P.atkBuffer.sum<20 then local t=max(60,90-P.modeData.event) P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3} P.atkBuffer.sum=P.atkBuffer.sum+4 P.stat.recv=P.stat.recv+4 if P.modeData.event==60 then P:showText(text.maxspeed,"appear",100,-140,.6)end P.counter=0 P.modeData.event=P.modeData.event+1 end end function Event_task.survivor_ultimate(P) if not P.control then return end P.counter=P.counter+1 if P.counter>=max(300,600-10*P.modeData.event)and P.atkBuffer.sum<20 then local t=max(300,480-12*P.modeData.event) local p=#P.atkBuffer+1 P.atkBuffer[p] ={pos=rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=2} P.atkBuffer[p+1]={pos=rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3} P.atkBuffer[p+2]={pos=rnd(10),amount=6,countdown=1.2*t,cd0=1.2*t,time=0,sent=false,lv=4} P.atkBuffer[p+3]={pos=rnd(10),amount=6,countdown=1.5*t,cd0=1.5*t,time=0,sent=false,lv=5} P.atkBuffer.sum=P.atkBuffer.sum+20 P.stat.recv=P.stat.recv+20 P.counter=0 if P.modeData.event==31 then P:showText(text.maxspeed,"appear",100,-140,.6)end P.modeData.event=P.modeData.event+1 end end function Event_task.defender_normal(P) if not P.control then return end P.counter=P.counter+1 local t=360-P.modeData.event*2 if P.counter>=t then P.counter=0 for _=1,3 do P.atkBuffer[#P.atkBuffer+1]={pos=rnd(2,9),amount=1,countdown=2*t,cd0=2*t,time=0,sent=false,lv=1} end P.atkBuffer.sum=P.atkBuffer.sum+3 P.stat.recv=P.stat.recv+3 local D=P.modeData if D.event<90 then D.event=D.event+1 D.point=int(108e3/(360-D.event*2))*.1 if D.event==25 then P:showText(text.great,"appear",100,-140,.6) pushSpeed=2 P.dropDelay,P.gameEnv.drop=20,20 elseif D.event==50 then P:showText(text.awesome,"appear",100,-140,.6) pushSpeed=3 P.dropDelay,P.gameEnv.drop=10,10 elseif D.event==90 then P.dropDelay,P.gameEnv.drop=5,5 P:showText(text.maxspeed,"appear",100,-140,.6) end end end end function Event_task.defender_lunatic(P) if not P.control then return end P.counter=P.counter+1 local t=240-2*P.modeData.event if P.counter>=t then P.counter=0 for _=1,4 do P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=1,countdown=5*t,cd0=5*t,time=0,sent=false,lv=2} end P.atkBuffer.sum=P.atkBuffer.sum+4 P.stat.recv=P.stat.recv+4 local D=P.modeData if D.event<75 then D.event=D.event+1 D.point=int(144e3/(240-2*D.event))*.1 if D.event==25 then P:showText(text.great,"appear",100,-140,.6) pushSpeed=3 P.dropDelay,P.gameEnv.drop=4,4 elseif D.event==50 then P:showText(text.awesome,"appear",100,-140,.6) pushSpeed=4 P.dropDelay,P.gameEnv.drop=3,3 elseif D.event==75 then P:showText(text.maxspeed,"appear",100,-140,.6) P.dropDelay,P.gameEnv.drop=2,2 end end end end function Event_task.attacker_hard(P) if not P.control then return end if P.atkBuffer.sum==0 then local p=#P.atkBuffer+1 local B,D=P.atkBuffer,P.modeData local t if D.event<20 then t=1500-30*D.event--1500~900 B[p]= {pos=rnd(4,7),amount=12,countdown=t,cd0=t,time=0,sent=false,lv=3} B[p+1]= {pos=rnd(3,8),amount=10,countdown=t,cd0=t,time=0,sent=false,lv=4} else t=900-10*(D.event-20)--900~600 B[p]= {pos=rnd(10),amount=6,countdown=t,cd0=t,time=0,sent=false,lv=4} B[p+1]= {pos=rnd(4,7),amount=16,countdown=t,cd0=t,time=0,sent=false,lv=5} end B.sum=B.sum+22 P.stat.recv=P.stat.recv+22 if D.event<50 then D.event=D.event+1 D.point=int(72e4/t)*.1 if D.event==20 then P:showText(text.great,"appear",100,-140,.6) pushSpeed=3 elseif D.event==50 then P:showText(text.maxspeed,"appear",100,-140,.6) end end end end function Event_task.attacker_ultimate(P) if not P.control then return end if P.atkBuffer.sum<2 then local p=#P.atkBuffer+1 local B,D=P.atkBuffer,P.modeData local s,t if D.event<10 then t=1000-20*D.event--1000~800 B[p]= {pos=rnd(5,6),amount=10,countdown=t,cd0=t,time=0,sent=false,lv=3} B[p+1]= {pos=rnd(4,7),amount=12,countdown=t,cd0=t,time=0,sent=false,lv=4} s=22 elseif D.event<20 then t=800-20*(D.event-15)--800~600 B[p]= {pos=rnd(3,8),amount=11,countdown=t,cd0=t,time=0,sent=false,lv=4} B[p+1]= {pos=rnd(4,7),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=5} s=25 else t=600-15*(D.event-30)--600~450 B[p]= {pos=rnd(2)*9-8,amount=12,countdown=t,cd0=t,time=0,sent=false,lv=5} B[p+1]= {pos=rnd(3,8),amount=16,countdown=t,cd0=t,time=0,sent=false,lv=5} s=28 end B.sum=B.sum+s P.stat.recv=P.stat.recv+s if D.event<45 then D.event=D.event+1 D.point=int(s*36e3/t)*.1 if D.event==10 then P:showText(text.great,"appear",100,-140,.6) pushSpeed=4 elseif D.event==20 then P:showText(text.awesome,"appear",100,-140,.6) pushSpeed=5 elseif D.event==30 then P:showText(text.maxspeed,"appear",100,-140,.6) end end end end function Event_task.PC(P) P.counter=P.counter+1 if P.counter==21 then local t=P.stat.pc%2 for i=1,4 do local r=getNewRow(0) for j=1,10 do r[j]=PCbase[4*t+i][j] end ins(P.field,1,r) ins(P.visTime,1,getNewRow(20)) end P.fieldBeneath=P.fieldBeneath+120 P.curY=P.curY+4 P:freshgho() return true end end function Event_task.bgmFadeOut(_,id) local v=bgm[id]:getVolume()-.025*setting.bgm*.1 bgm[id]:setVolume(v>0 and v or 0) if v<=0 then bgm[id]:stop() return true end end function Event_task.bgmFadeIn(_,id) local v=min(bgm[id]:getVolume()+.025*setting.bgm*.1,setting.bgm*.1) bgm[id]:setVolume(v) if v>=setting.bgm*.1 then return true end end -------------------------------------------------- local Fkey_func={ royale=function(P) if setting.swap then for i=1,#P.keyPressing do if P.keyPressing[i]then P.keyPressing[i]=false end end P.keyPressing[9]=true else P:changeAtkMode(P.atkMode<3 and P.atkMode+2 or 5-P.atkMode) P.swappingAtkMode=30 end end, puzzle=function(P) P.modeData.event=1-P.modeData.event end, } defModeEnv={} defModeEnv.sprint={ { drop=60,lock=60, target=10,dropPiece="reach_winCheck", bg="strap",bgm="race", }, { drop=60,lock=60, target=20,dropPiece="reach_winCheck", bg="strap",bgm="race", }, { drop=60,lock=60, target=40,dropPiece="reach_winCheck", bg="strap",bgm="race", }, { drop=60,lock=60, target=100,dropPiece="reach_winCheck", bg="strap",bgm="race", }, { drop=60,lock=60, target=400,dropPiece="reach_winCheck", bg="strap",bgm="push", }, { drop=60,lock=60, target=1000,dropPiece="reach_winCheck", bg="strap",bgm="push", }, } defModeEnv.marathon={ { drop=60,lock=60,fall=30, target=200,dropPiece="reach_winCheck", bg="strap",bgm="way", }, { drop=60,fall=20, target=10,dropPiece="marathon_update", bg="strap",bgm="way", }, { _20G=true,fall=15, target=200,dropPiece="reach_winCheck", bg="strap",bgm="race", }, } defModeEnv.master={ { _20G=true,lock=rush_lock[1], wait=rush_wait[1], fall=rush_fall[1], dropPiece="master_score", das=9,arr=3, freshLimit=15, bg="strap",bgm="secret8th", }, { _20G=true,lock=death_lock[1], wait=death_wait[1], fall=death_fall[1], dropPiece="master_score", das=6,arr=1, freshLimit=15, bg="game2",bgm="secret7th", }, { _20G=true,lock=12, wait=10,fall=10, dropPiece="master_score_hard", das=5,arr=1, freshLimit=15, easyFresh=false,bone=true, bg="none",bgm="shining terminal", }, } defModeEnv.classic={ { das=16,arr=6,sddas=2,sdarr=2, ghost=false,center=false, drop=3,lock=3,wait=10,fall=25, next=1,hold=false, sequence="rnd", freshLimit=0, target=10,dropPiece="classic_reach", bg="rgb",bgm="rockblock", }, } defModeEnv.zen={ { drop=1e99,lock=1e99, oncehold=false, dropPiece="reach_winCheck", bg="strap",bgm="infinite", }, } defModeEnv.infinite={ { drop=1e99,lock=1e99, oncehold=false, bg="glow",bgm="infinite", }, { drop=1e99,lock=1e99, oncehold=false, dropPiece="infinite_check", bg="glow",bgm="infinite", }, } defModeEnv.solo={ { drop=60,lock=60, freshLimit=15, bg="game2",bgm="race", }, } defModeEnv.round={ { drop=1e99,lock=1e99, oncehold=false, dropPiece="round_check", bg="game2",bgm="push", }, } defModeEnv.tsd={ { oncehold=false, drop=1e99,lock=1e99, dropPiece="tsd_reach", ospin=false, bg="matrix",bgm="reason", }, { drop=60,lock=60, freshLimit=15, dropPiece="tsd_reach", ospin=false, bg="matrix",bgm="reason", }, } defModeEnv.blind={ { drop=30,lock=45, freshLimit=10, visible="time", bg="glow",bgm="newera", }, { drop=15,lock=45, freshLimit=10, visible="fast", freshLimit=10, bg="glow",bgm="reason", }, { drop=15,lock=45, fall=10,lock=60, center=false, visible="none", freshLimit=15, bg="rgb",bgm="secret7th", }, { drop=10,lock=45, fall=5,lock=60, center=false,ghost=false, visible="none", freshLimit=15, bg="rgb",bgm="secret8th", }, { drop=30,lock=60, fall=5, block=false, center=false,ghost=false, visible="none", freshLimit=15, bg="rgb",bgm="secret7th", }, { _20G=true, drop=0,lock=15, wait=10,fall=15, visible="fast", freshLimit=15, dropPiece="GM_score", arr=1, bg="game3",bgm="shining terminal", }, } defModeEnv.dig={ { drop=60,lock=120, fall=20, freshLimit=15, task="dig_normal", bg="game2",bgm="push", }, { drop=10,lock=30, freshLimit=15, task="dig_lunatic", bg="game2",bgm="secret7th", }, } defModeEnv.survivor={ { drop=60,lock=120, fall=30, freshLimit=15, task="survivor_easy", bg="game2",bgm="push", }, { drop=30,lock=60, fall=20, freshLimit=15, task="survivor_normal", bg="game2",bgm="newera", }, { drop=10,lock=60, fall=15, freshLimit=15, task="survivor_hard", bg="game2",bgm="secret8th", }, { drop=6,lock=60, fall=10, freshLimit=15, task="survivor_lunatic", bg="game3",bgm="secret7th", }, { drop=5,lock=60, fall=10, freshLimit=15, task="survivor_ultimate", bg="rgb",bgm="secret7th", }, } defModeEnv.defender={ { drop=30,lock=60, fall=10, freshLimit=15, task="defender_normal", bg="game3",bgm="way", }, { drop=5,lock=60, fall=6, freshLimit=15, task="defender_lunatic", bg="game4",bgm="way", }, } defModeEnv.attacker={ { drop=30,lock=60, fall=12, freshLimit=15, task="attacker_hard", bg="game3",bgm="push", }, { drop=5,lock=60, fall=8, freshLimit=15, task="attacker_ultimate", bg="game4",bgm="shining terminal", }, } defModeEnv.tech={ { oncehold=false, drop=1e99,lock=1e99, dropPiece="tech_reach_easy", bg="matrix",bgm="newera", }, { oncehold=false, drop=1e99,lock=1e99, dropPiece="tech_reach_ultimate", bg="matrix",bgm="newera", }, { drop=10,lock=60, freshLimit=15, dropPiece="tech_reach_easy", bg="matrix",bgm="secret8th", }, { drop=30,lock=60, freshLimit=15, dropPiece="tech_reach_ultimate", bg="matrix",bgm="secret8th", }, { _20G=true,lock=60, freshLimit=15, dropPiece="tech_reach_hard", bg="matrix",bgm="secret7th", }, { _20G=true,lock=60, freshLimit=15, dropPiece="tech_reach_ultimate", bg="matrix",bgm="secret7th", }, { drop=1e99,lock=60, freshLimit=15, fine=true,fineKill=true, dropPiece="tech_reach_hard", bg="flink",bgm="infinite", }, { drop=1e99,lock=60, freshLimit=15, fine=true,fineKill=true, dropPiece="tech_reach_ultimate", bg="flink",bgm="infinite", }, } defModeEnv.c4wtrain={ { drop=30,lock=60, oncehold=false, freshLimit=15, dropPiece="c4w_reach", ospin=false, bg="rgb",bgm="newera", }, { drop=5,lock=30, freshLimit=15, dropPiece="c4w_reach", ospin=false, bg="rgb",bgm="newera", }, } defModeEnv.pctrain={ { next=4, hold=false, drop=150,lock=150, fall=20, sequence="none", dropPiece="newPC", ospin=false, bg="rgb",bgm="newera", }, { next=4, hold=false, drop=60,lock=60, fall=20, sequence="none", freshLimit=15, dropPiece="newPC", ospin=false, bg="rgb",bgm="newera", }, } defModeEnv.pcchallenge={ { oncehold=false, drop=300,lock=1e99, target=100,dropPiece="reach_winCheck", ospin=false, bg="rgb",bgm="newera", }, { drop=60,lock=120, fall=10, target=100,dropPiece="reach_winCheck", freshLimit=15, ospin=false, bg="rgb",bgm="infinite", }, { drop=20,lock=60, fall=20, target=100,dropPiece="reach_winCheck", freshLimit=15, ospin=false, bg="rgb",bgm="infinite", }, } defModeEnv.techmino49={ { drop=60,lock=60, fall=20, royaleMode=true, Fkey=Fkey_func.royale, royalePowerup={2,5,10,20}, royaleRemain={30,20,15,10,5}, pushSpeed=2, freshLimit=15, bg="game3",bgm="rockblock", }, } defModeEnv.techmino99={ { drop=60,lock=60, fall=20, royaleMode=true, Fkey=Fkey_func.royale, royalePowerup={2,6,14,30}, royaleRemain={75,50,35,20,10}, pushSpeed=2, freshLimit=15, bg="game3",bgm="rockblock", }, } defModeEnv.drought={ { drop=20,lock=60, sequence="drought1", target=100,dropPiece="reach_winCheck", ospin=false, freshLimit=15, bg="glow",bgm="reason", }, { drop=20,lock=60, sequence="drought2", target=100,dropPiece="reach_winCheck", ospin=false, freshLimit=15, bg="glow",bgm="reason", }, } defModeEnv.hotseat={ { drop=60,lock=60, freshLimit=15, bg="none",bgm="way", }, } defModeEnv.custom={ { dropPiece="reach_winCheck", }, { Fkey=Fkey_func.puzzle,puzzle=true, dropPiece="puzzleCheck", }, }