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,14,12} local rush_wait={12,10,9,8,7} local rush_fall={12,11,10,9,8} local death_lock={12,11,10,9,8} local death_wait={9,8,7,6,5} 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} freshMethod={ bag7=function() if #P.nextID<6 then local bag={1,2,3,4,5,6,7} for i=1,7 do newNext(rem(bag,rnd(#bag))) end end end, his4=function() if #P.nextID<6 then local j,i=0 ::L:: i,j=rnd(7),j+1 if(i==P.his[1]or i==P.his[2]or i==P.his[3]or i==P.his[4])then goto L end newNext(i) rem(P.his,1)ins(P.his,i) end end, rnd=function() local i ::L:: i=rnd(7) if i==P.nextID[5]then goto L end newNext(i) end,--random pc=function() if P.cstat.piece%4==0 then local r=rnd(#PClist) local f=P.cstat.event==1 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 newNext(b) end P.cstat.event=(P.cstat.event+1)%2 end end, drought1=function() if #P.nextID<6 then local bag={1,2,3,4,5,6} for i=1,6 do newNext(rem(bag,rnd(#bag))) end end end, drought2=function() if #P.nextID<6 then local bag={1,1,1,2,2,2,3,3,3,4,4,4,6,6,6,5,7} ::L:: newNext(rem(bag,rnd(#bag))) if bag[1]then goto L end end end, } Event={ gameover={ win=function() local P=players.alive[1] P.alive=false P.control=false P.timing=false P.waiting=1e99 P.b2b=0 if modeEnv.royaleMode then P.rank=1 P.result="WIN" showText(P,1,"appear",60,120,nil,true) changeAtk(P) end ::L::if P.task[1]then rem(P.task) goto L 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 showText(P,text.win,"beat",90,nil,nil,true) if P.id==1 and players[2]and players[2].ai then SFX("win")end ins(P.task,Event.task.win) end, lose=function() P.alive=false P.control=false P.timing=false P.waiting=1e99 P.b2b=0 ::L::if P.task[1]then rem(P.task) goto L end for i=1,#players.alive do if players.alive[i]==P then rem(players.alive,i) break end end if modeEnv.royaleMode then changeAtk(P) P.result="K.O." P.rank=#players.alive+1 showText(P,P.rank,"appear",60,120,nil,true) P.strength=0 local A=P ::L:: A=A.lastRecv if A and not A.alive and A~=P then goto L end if A and A~=P 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 ins(P.task,Event.task.throwBadge) end freshMostBadge() end freshMostDangerous() for i=1,#players.alive do if players.alive[i].atking==P then freshTarget(players.alive[i]) 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 showText(P,text.lose,"appear",90,nil,nil,true) if P.id==1 and players[2]and players[2].ai then SFX("fail")end ins(P.task,Event.task.lose) if #players.alive==1 then local t=P P=players.alive[1] Event.gameover.win() P=t end end, }, marathon_reach=function() local s=int(P.cstat.row*.1) if s>=20 then P.cstat.row=200 Event.gameover.win() 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, marathon_reach_lunatic=function() if P.gameEnv.target==250 then P.cstat.row=250 Event.gameover.win() else P.gameEnv.target=P.gameEnv.target+50 local t=P.gameEnv.target/50 P.gameEnv.lock=rush_lock[t] P.gameEnv.wait=rush_wait[t] P.gameEnv.fall=rush_fall[t] if t==4 then P.gameEnv.bone=true end showText(P,text.stage[t],"fly",80,-120) SFX("reach") end end, marathon_reach_ultimate=function() if P.cstat.event==5 then P.cstat.row=250 Event.gameover.win() else local t=P.cstat.event+1 if t==1 then t=2 end P.gameEnv.target=50*t P.cstat.event=t P.gameEnv.lock=death_lock[t] P.gameEnv.wait=death_wait[t] P.gameEnv.fall=death_fall[t] if t==4 then P.gameEnv.bone=true end showText(P,text.stage[t],"fly",80,-120) SFX("reach") end end, classic_reach=function() P.gameEnv.target=P.gameEnv.target+10 if P.gameEnv.target==100 then P.gameEnv.drop,P.gameEnv.lock=0,0 end SFX("reach") end, tsd_reach=function() if P.lastClear~=52 then Event.gameover.lose() elseif #P.clearing>0 then P.cstat.event=P.cstat.event+1 if #P.field>11 and P.cstat.event%5~=1 then ins(P.clearing,1) end end end, tech_reach=function() if #P.clearing>0 and P.lastClear<10 then Event.gameover.lose() end end, tech_reach_hard=function() if #P.clearing>0 and P.lastClear<10 or P.lastClear==74 then Event.gameover.lose() end end, newPC=function() local P=players[1] if P.cstat.piece%4==0 then if #P.field==#P.clearing then P.counter=P.cstat.piece==0 and 20 or 0 ins(P.task,Event.task.PC) if curMode.lv==2 then local s=P.cstat.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 showText(P,text.maxspeed,"appear",80,-140) else showText(P,text.speedup,"appear",30,-140) end end end else Event.gameover.lose() end end end, task={ win=function() P.endCounter=P.endCounter+1 if P.endCounter>80 then if P.gameEnv.visible=="show"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 for i=1,#P.field do removeRow(P.field) removeRow(P.visTime) end return true end elseif P.endCounter==100 then return true end end end, lose=function() P.endCounter=P.endCounter+1 if P.endCounter>80 then if P.gameEnv.visible=="show"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 for i=1,#P.field do removeRow(P.field) removeRow(P.visTime) end return true end elseif P.endCounter==100 then return true end end end, throwBadge=function() if P.badge%2==0 then throwBadge(P,P.lastRecv) if P.badge%16==0 then sysSFX("collect") end end P.badge=P.badge-1 if P.badge<=0 then return true end end, dig_normal=function() local P=players[1] P.counter=P.counter+1 if #P.clearing==0 and P.counter>=max(90,180-2*P.cstat.event)then ins(P.field,1,getNewRow(10)) ins(P.visTime,1,getNewRow(1e99)) P.field[1][rnd(10)]=0 P.fieldBeneath=P.fieldBeneath+30 P.curY,P.y_img=P.curY+1,P.y_img+1 P.counter=0 P.cstat.event=P.cstat.event+1 end end, dig_lunatic=function() local P=players[1] P.counter=P.counter+1 if #P.clearing==0 and P.counter>=max(45,80-.4*P.cstat.event)then ins(P.field,1,getNewRow(11+P.cstat.event%3)) ins(P.visTime,1,getNewRow(1e99)) P.field[1][rnd(10)]=0 P.fieldBeneath=P.fieldBeneath+30 P.curY,P.y_img=P.curY+1,P.y_img+1 P.counter=0 P.cstat.event=P.cstat.event+1 end end, survivor_easy=function() local P=players[1] P.counter=P.counter+1 if P.counter==max(60,180-2*P.cstat.event)then ins(P.atkBuffer,{rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1}) P.counter=0 if P.cstat.event==60 then showText(P,text.maxspeed,"appear",80,-140)end P.cstat.event=P.cstat.event+1 end end, survivor_normal=function() local P=players[1] P.counter=P.counter+1 if P.counter==max(60,180-2*P.cstat.event)then local d=P.cstat.event+1 if d%4==0 then ins (P.atkBuffer,{rnd(10),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1}) elseif d%4==1 then ins(P.atkBuffer,{rnd(10),amount=2,countdown=70,cd0=70,time=0,sent=false,lv=1}) elseif d%4==2 then ins(P.atkBuffer,{rnd(10),amount=3,countdown=80,cd0=80,time=0,sent=false,lv=2}) elseif d%4==3 then ins(P.atkBuffer,{rnd(10),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3}) end P.counter=0 if P.cstat.event==60 then showText(P,text.maxspeed,"appear",80,-140)end P.cstat.event=P.cstat.event+1 end end, survivor_hard=function() local P=players[1] P.counter=P.counter+1 if P.counter==max(60,180-2*P.cstat.event)then if P.cstat.event%3<2 then ins(P.atkBuffer,{rnd(10),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1}) else ins(P.atkBuffer,{rnd(10),amount=3,countdown=60,cd0=60,time=0,sent=false,lv=2}) end P.counter=0 if P.cstat.event==45 then showText(P,text.maxspeed,"appear",80,-140)end P.cstat.event=P.cstat.event+1 end end, survivor_lunatic=function() local P=players[1] P.counter=P.counter+1 if P.counter==max(90,150-P.cstat.event)then local t=max(60,90-P.cstat.event) ins(P.atkBuffer,{rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}) P.counter=0 if P.cstat.event==30 then showText(P,text.maxspeed,"appear",80,-140)end P.cstat.event=P.cstat.event+1 end end, PC=function() local P=players[1] P.counter=P.counter+1 if P.counter==21 then local t=P.cstat.pc%2 for i=1,4 do local r=getNewRow() for j=1,10 do r[j]=PCbase[4*t+i][j] end ins(P.field,1,r) ins(P.visTime,1,getNewRow(P.showTime)) end P.fieldBeneath=P.fieldBeneath+120 -- P.curY=P.curY+4 P.y_img=P.y_img+4 freshgho() return true end end, }, } defaultModeEnv={ sprint={ { drop=60, target=10, reach=Event.gameover.win, bg="strap", bgm="race", }, { drop=60, target=20, reach=Event.gameover.win, bg="strap", bgm="race", }, { drop=60, target=40, reach=Event.gameover.win, bg="strap", bgm="race", }, { drop=60, target=100, reach=Event.gameover.win, bg="strap", bgm="race", }, { drop=60, target=400, reach=Event.gameover.win, bg="strap", bgm="push", }, { drop=60, target=1000, reach=Event.gameover.win, bg="strap", bgm="push", }, }, marathon={ { drop=60, lock=60, fall=30, target=200, reach=Event.marathon_reach, bg="strap", bgm="way", }, { drop=60, fall=20, target=10, reach=Event.marathon_reach, bg="strap", bgm="way", }, { _20G=true, fall=15, target=200, reach=Event.marathon_reach, bg="strap", bgm="race", }, { _20G=true, drop=0, lock=rush_lock[1], wait=rush_wait[1], fall=rush_fall[1], target=50, reach=Event.marathon_reach_lunatic, arr=2, freshLimit=15, bg="game2", bgm="secret8th", }, { _20G=true, drop=0, lock=death_lock[1], wait=death_wait[1], fall=death_fall[1], target=50, reach=Event.marathon_reach_ultimate, arr=1, freshLimit=15, bg="game2", bgm="secret7th", }, }, classic={ { das=15,arr=3, sddas=2,sdarr=2, ghost=false,center=false, drop=1,lock=1, wait=10,fall=25, next=1,hold=false, sequence="rnd", freshLimit=0, target=10, reach=Event.classic_reach, bg="rgb", bgm="rockblock", }, }, zen={ { drop=1e99, lock=1e99, oncehold=false, target=200, reach=Event.gameover.win, bg="strap", bgm="infinite", }, }, infinite={ { drop=1e99, lock=1e99, oncehold=false, bg="glow", bgm="infinite", }, }, solo={ { freshLimit=15, bg="game2", bgm="race", }, }, tsd={ { oncehold=false, drop=1e99, lock=1e99, freshLimit=15, target=1, reach=Event.tsd_reach, ospin=false, bg="matrix", bgm="reason", }, { drop=60, lock=60, freshLimit=15, target=1, reach=Event.tsd_reach, ospin=false, bg="matrix", bgm="reason", }, }, blind={ { drop=30, lock=60, freshLimit=15, ghost=false, visible="time", bg="glow", bgm="newera", }, { drop=15, lock=60, freshLimit=15, visible="fast", freshLimit=10, bg="glow", bgm="reason", }, { fall=10, lock=60, center=false, ghost=false, visible="none", freshLimit=15, bg="rgb", bgm="secret7th", }, { fall=5, lock=60, 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, arr=1, bg="game3", bgm="secret8th", }, }, dig={ { drop=60, lock=120, fall=20, freshLimit=15, bg="game2", bgm="push", }, { drop=10, lock=30, freshLimit=15, bg="game2", bgm="secret7th", }, }, survivor={ { drop=60, lock=120, fall=30, freshLimit=15, bg="game2", bgm="push", }, { drop=30, lock=60, fall=20, freshLimit=15, bg="game2", bgm="newera", }, { drop=10, lock=60, fall=15, freshLimit=15, bg="game2", bgm="secret8th", }, { drop=5, lock=60, fall=10, freshLimit=15, bg="game3", bgm="secret7th", }, }, tech={ { oncehold=false, drop=1e99, lock=1e99, target=0, reach=Event.tech_reach, bg="matrix", bgm="way", }, { drop=30, lock=60, target=0, reach=Event.tech_reach, bg="matrix", bgm="way", }, { drop=15, lock=60, target=0, reach=Event.tech_reach_hard, freshLimit=15, bg="matrix", bgm="way", }, { drop=5, lock=40, target=0, freshLimit=15, reach=Event.tech_reach_hard, bg="matrix", bgm="way", }, { drop=1, lock=40, target=0, freshLimit=15, reach=Event.tech_reach_hard, bg="matrix", bgm="secret7th", }, }, pctrain={ { next=4, hold=false, drop=120, lock=120, fall=20, sequence="pc", target=0, reach=Event.newPC, ospin=false, bg="rgb", bgm="newera", }, { next=4, hold=false, drop=60, lock=60, fall=20, sequence="pc", target=0, freshLimit=15, reach=Event.newPC, ospin=false, bg="rgb", bgm="newera", }, }, pcchallenge={ { oncehold=false, drop=300, lock=1e99, target=100, reach=Event.gameover.win, ospin=false, bg="rgb", bgm="newera", }, { drop=60, lock=120, fall=10, target=100, reach=Event.gameover.win, freshLimit=15, ospin=false, bg="rgb", bgm="infinite", }, { drop=20, lock=60, fall=20, target=100, reach=Event.gameover.win, freshLimit=15, ospin=false, bg="rgb", bgm="infinite", }, }, techmino41={ { fall=20, royaleMode=true, royalePowerup={2,5,10,20}, royaleRemain={30,20,15,10,5}, pushSpeed=2, freshLimit=15, bg="game3", bgm="race", }, }, techmino99={ { fall=20, royaleMode=true, royalePowerup={2,6,14,30}, royaleRemain={75,50,35,20,10}, pushSpeed=2, freshLimit=15, bg="game3", bgm="race", }, }, drought={ { drop=20, lock=60, sequence="drought1", target=100, reach=Event.gameover.win, ospin=false, freshLimit=15, bg="glow", bgm="reason", }, { drop=20, lock=60, sequence="drought2", target=100, reach=Event.gameover.win, ospin=false, freshLimit=15, bg="glow", bgm="reason", }, }, hotseat={ { freshLimit=15, bg="none", bgm="way", }, }, custom={ { bg="none", bgm="reason", reach=Event.gameover.win, }, }, }