lib={ gc=love.graphics, kb=love.keyboard, ms=love.mouse, tc=love.touch, tm=love.timer, fs=love.filesystem, wd=love.window, mt=love.math, sys=love.system, }for k,v in pairs(lib)do _G[k]=v end lib=nil toN,toS=tonumber,tostring int,ceil,abs,rnd,max,min,sin,cos,atan,pi=math.floor,math.ceil,math.abs,math.random,math.max,math.min,math.sin,math.cos,math.atan,math.pi sub,gsub,find,format,byte,char=string.sub,string.gsub,string.find,string.format,string.byte,string.char ins,rem,sort=table.insert,table.remove,table.sort null=function()end ww,wh=gc.getWidth(),gc.getHeight() Timer=tm.getTime--Easy&Quick to get time! mx,my,mouseShow=-20,-20,false xOy=love.math.newTransform() focus=true system=sys.getOS() touching=nil--1st touching ID scene="" bgmPlaying=nil curBG="none" BGblock={ct=150,next=7} kb.setKeyRepeat(false) kb.setTextInput(false) ms.setVisible(false) Fonts={} function setFont(s) if s~=currentFont then if Fonts[s]then gc.setFont(Fonts[s]) else local t=gc.setNewFont("albbph.ttf",s-5) Fonts[s]=t gc.setFont(t) end currentFont=s end end gameEnv0={ das=10,arr=2, sddas=0,sdarr=2, ghost=true,center=true, drop=30,lock=45, wait=1,fall=1, next=6,hold=true,oncehold=true, sequence="bag7",visible=1, _20G=false,target=1e99, freshLimit=15, virtualkey={}, reach=null, bgm="race" --not all is actually used,some only provide a key } customSel={ drop=20, lock=20, wait=1, fall=1, next=7, hold=1, sequence=1, visible=1, target=4, freshLimit=3, opponent=1, } loadmode={ sprint=function() createPlayer(1,340,15) curBG="game1" end, marathon=function() createPlayer(1,340,15) curBG="strap" end, zen=function() createPlayer(1,340,15) curBG="strap" end, infinite=function() createPlayer(1,340,15) curBG="glow" end, solo=function() createPlayer(1,20,15)--Player createPlayer(2,660,85,.9,customRange.opponent[3*curMode.lv])--AI curBG="game2" end, death=function() createPlayer(1,340,15) curBG="game2" BGM("push") end, tsd=function() createPlayer(1,340,15) curBG="matrix" end, blind=function() createPlayer(1,340,15) curBG="glow" end, dig=function() createPlayer(1,340,15) local P=players[1] if curMode.lv==1 then ins(players[1].task,Event.task.dig_normal) pushSpeed=1 elseif curMode.lv==2 then ins(players[1].task,Event.task.dig_lunatic) pushSpeed=1 end curBG="game2" end, survivor=function() createPlayer(1,340,15) local P=players[1] ins(players[1].task,Event.task[curMode.lv==1 and"survivor_easy"or curMode.lv==2 and"survivor_normal"or curMode.lv==3 and"survivor_hard"or curMode.lv==4 and"survivor_lunatic"]) pushSpeed=curMode.lv>2 and 2 or 1 curBG="game2" end, sudden=function() createPlayer(1,340,15) curBG="matrix" end, pctrain=function() createPlayer(1,340,15) P=players[1] Event.newPC() P.freshNext() curBG="matrix" end, pcchallenge=function() createPlayer(1,340,15) curBG="matrix" end, techmino41=function() createPlayer(1,340,15)--Player if curMode.lv==5 then players[1].gameEnv.drop=15 end local n,min,max=2 if curMode.lv==1 then min,max=5,30 elseif curMode.lv==2 then min,max=3,25 elseif curMode.lv==3 then min,max=2,20 elseif curMode.lv==4 then min,max=2,10 elseif curMode.lv==5 then min,max=1,6 end for i=1,4 do for j=1,5 do createPlayer(n,77*i-55,140*j-125,.2,rnd(min,max)) n=n+1 end end for i=9,12 do for j=1,5 do createPlayer(n,77*i+275,140*j-125,.2,rnd(min,max)) n=n+1 end end --AIs curBG="game3" end, techmino99=function() createPlayer(1,340,15)--Player if curMode.lv==5 then players[1].gameEnv.drop=15 end local n,min,max=2 if curMode.lv==1 then min,max=5,32 elseif curMode.lv==2 then min,max=3,25 elseif curMode.lv==3 then min,max=2,18 elseif curMode.lv==4 then min,max=2,12 elseif curMode.lv==5 then min,max=1,12 end for i=1,7 do for j=1,7 do createPlayer(n,46*i-36,97*j-72,.135,rnd(min,max)) n=n+1 end end for i=15,21 do for j=1,7 do createPlayer(n,46*i+264,97*j-72,.135,rnd(min,max)) n=n+1 end end --AIs curBG="game3" end, drought=function() createPlayer(1,340,15) curBG="strap" end, hotseat=function() if curMode.lv==1 then createPlayer(1,20,15) createPlayer(2,650,15) elseif curMode.lv==2 then createPlayer(1,20,100,.65) createPlayer(2,435,100,.65) createPlayer(3,850,100,.65) elseif curMode.lv==3 then createPlayer(1,25,160,.5) createPlayer(2,335,160,.5) createPlayer(3,645,160,.5) createPlayer(4,955,160,.5) end curBG="game2" end, custom=function() for i=1,#customID do local k=customID[i] modeEnv[k]=customRange[k][customSel[k]] end modeEnv._20G=modeEnv.drop==-1 if modeEnv.opponent==0 then createPlayer(1,340,15) else modeEnv.target=nil createPlayer(1,20,15) createPlayer(2,660,85,.9,modeEnv.opponent) end curBG="matrix" end, } mesDisp={ --Default:font=35,white sprint=function() setFont(70) mStr(max(P.gameEnv.target-P.cstat.row,0),-75,260) end, zen=function() setFont(75) mStr(max(200-P.cstat.row,0),-75,280) end, infinite=function() setFont(50) mStr(P.cstat.atk,-75,310) mStr(format("%.2f",2.5*P.cstat.atk/P.cstat.piece),-75,420) setFont(20) gc.print("Attack",-98,363) gc.print("Efficiency",-110,475) end, marathon=function() setFont(50) mStr(P.cstat.row,-75,320) mStr(P.gameEnv.target,-75,370) gc.rectangle("fill",-120,376,90,4) end, tsd=function() setFont(35) gc.print("TSD",-102,405) setFont(80) mStr((P.gameEnv.target-1)*.5,-75,330) end, blind=function() setFont(25) gc.print("Rows",-102,300) gc.print("Techrash",-123,420) setFont(80) mStr(P.cstat.row,-75,220) mStr(P.cstat.techrash,-75,340) end, dig=function() setFont(70) mStr(P.cstat.event,-75,310) setFont(30) gc.print("Wave",-112,375) end, survivor=function() setFont(70) mStr(P.cstat.event,-75,310) setFont(30) gc.print("Wave",-112,375) end, pctrain=function() setFont(25) gc.print("Perfect Clear",-140,410) setFont(80) mStr(P.cstat.pc,-75,330) end, pcchallenge=function() setFont(25) gc.print("Perfect Clear",-140,430) setFont(80) mStr(P.cstat.pc,-75,350) setFont(50) mStr(max(100-P.cstat.row,0),-75,250) end, techmino41=function() setFont(40) mStr(#players.alive.."/41",-75,175) mStr(P.ko,-60,215) setFont(25) gc.print("KO",-115,225) gc.setColor(1,.5,0,.6) gc.print(P.badge,-35,227) gc.setColor(1,1,1) setFont(30) gc.print(up0to4[P.strength],-125,290) for i=1,P.strength do gc.draw(badgeIcon,16*i-130,260) end end, techmino99=function() setFont(40) mStr(#players.alive.."/99",-75,175) mStr(P.ko,-60,215) setFont(25) gc.print("KO",-115,225) gc.setColor(1,.5,0,.6) gc.print(P.badge,-35,227) gc.setColor(1,1,1) setFont(30) gc.print(up0to4[P.strength],-125,290) for i=1,P.strength do gc.draw(badgeIcon,16*i-130,260) end end, drought=function() setFont(75) mStr(max(100-P.cstat.row,0),-75,280) end, custom=function() if P.gameEnv.target<1e4 then setFont(75) mStr(max(P.gameEnv.target-P.cstat.row,0),-75,280) 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" 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,"WIN","appear",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 P.strength=0 local A=P ::L:: A=A.lastRecv if A and not A.alive then goto L end if A and A~=P then if P.id==1 or A.id==1 then throwBadge(P,A,P.badge) 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 end freshMostBadge() 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,"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] showText(P,"STAGE "..t,"fly",80,-120) SFX("reach") end end, marathon_reach_ultimate=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=death_lock[t] P.gameEnv.wait=death_wait[t] P.gameEnv.fall=death_fall[t] showText(P,"STAGE "..t,"beat",80,-120) SFX("reach") end end, tsd_reach=function() if P.lastClear~=52 then Event.gameover.lose() else P.gameEnv.target=P.gameEnv.target+2 if P.cstat.row%10~=0 then ins(P.clearing,1) end end end, sudden_reach=function() if #P.clearing>0 and P.lastClear<10 then Event.gameover.lose() end end, sudden_reach_hard=function() if #P.clearing>0 and P.lastClear<10 and 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,"Max speed","appear",80,-120) else showText(P,"Speed up","appear",30,-130) 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==1 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==1 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, 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(13)) ins(P.visTime,1,getNewRow(1e99)) P.field[1][rnd(10)]=0 P.fieldBeneath=P.fieldBeneath+30 P.cy,P.y_img=P.cy+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(40,60-.5*P.cstat.event)then ins(P.field,1,getNewRow(13)) ins(P.visTime,1,getNewRow(1e99)) P.field[1][rnd(10)]=0 P.fieldBeneath=P.fieldBeneath+30 P.cy,P.y_img=P.cy+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 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 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(80,150-2*P.cstat.event)then if rnd()<.33 then ins(P.atkBuffer,{rnd(10),amount=1,countdown=20,cd0=20,time=0,sent=false,lv=1}) else ins(P.atkBuffer,{rnd(10),amount=3,countdown=40,cd0=40,time=0,sent=false,lv=2}) end P.counter=0 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(30,90-2*P.cstat.event) ins(P.atkBuffer,{rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}) P.counter=0 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.cy=P.cy+4 P.y_img=P.y_img+4 freshgho() return true end end, }, } --Game system Data setting={ sfx=true,bgm=true,vib=3, fullscreen=false, bgblock=true, lang="eng", das=10,arr=2, sddas=0,sdarr=2, ghost=true,center=true, keyMap={ {"left","right","x","z","c","up","down","space","tab","r","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, {"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","x","leftshoulder","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""}, },--keyboard & joystick keyLib={ {1}, {2}, {3}, {4}, },--Players' key setting(s) virtualkey={ {80,720-80,6400,80},--moveLeft {240,720-80,6400,80},--moveRight {1280-240,720-80,6400,80},--rotRight {1280-400,720-80,6400,80},--rotLeft {1280-240,720-240,6400,80},--rotFlip {1280-80,720-80,6400,80},--hardDrop {1280-80,720-240,6400,80},--softDrop {1280-80,720-400,6400,80},--hold {80,80,6400,80},--restart }, virtualkeyAlpha=3, virtualkeyIcon=true, virtualkeySwitch=false, frameMul=100, } stat={ run=0, game=0, gametime=0, piece=0, row=0, atk=0, key=0, hold=0, rotate=0, spin=0, } --User Data&User Setting require("toolfunc") require("gamefunc") require("list") require("texture") require("ai") require("timer") require("paint") require("scene") require("call&sys") userData=fs.newFile("userdata") userSetting=fs.newFile("usersetting") if fs.getInfo("userdata")then loadData() end if fs.getInfo("usersetting")then loadSetting() elseif system=="Android" or system=="iOS"then setting.virtualkeySwitch=true end