diff --git a/call&sys.lua b/call&sys.lua index 339c4fb1..d889ec6e 100644 --- a/call&sys.lua +++ b/call&sys.lua @@ -12,26 +12,23 @@ local touching=nil--1st touching ID local sceneInit={ load=function() - curBG="none" loading=1--Loading mode loadnum=1--Loading counter loadprogress=0--Loading bar(0~1) loadTip=text.tips[rnd(#text.tips)] end, intro=function() - curBG="none" count=0 BGM("blank") end, main=function() - curBG="none" collectgarbage() end, mode=function() + curBG="none" saveData() modeSel=modeSel or 1 levelSel=levelSel or 3 - curBG="none" BGM("blank") end, custom=function() @@ -44,23 +41,19 @@ local sceneInit={ clearSureTime=0 pen=1 sx,sy=1,1 - curBG="none" end, play=function() if needResetGameData then resetGameData() needResetGameData=nil end - sysSFX("ready") end, pause=function() - pauseTime=0 end, setting=function() curBG="none" end, setting2=function() - curBG="none" curBoard=1 keyboardSet=1 joystickSet=1 @@ -74,10 +67,8 @@ local sceneInit={ snapLevel=1 end,--Touch setting help=function() - curBG="none" end, stat=function() - curBG="none" end, quit=function() love.event.quit() @@ -386,7 +377,9 @@ function keyDown.setting2(key) end end function keyDown.play(key) - if key=="escape"then pauseGame()end + if key=="escape"and not sceneSwaping then + return(frame<180 and back or pauseGame)() + end local m=setting.keyMap for p=1,human do local lib=setting.keyLib[p] @@ -519,6 +512,7 @@ function love.mousepressed(x,y,k,t,num) Buttons.sel=nil love.mousemoved(x,y,0,0) sysSFX("button") + VIB(1) end end end @@ -553,7 +547,7 @@ end function love.touchpressed(id,x,y) if not touching then touching=id - love.mousemoved(x,y,0,0) + love.touchmoved(id,x,y,0,0) mouseShow=false end if touchDown[scene]then @@ -569,6 +563,7 @@ function love.touchreleased(id,x,y) B.alpha=1 Buttons.sel=nil sysSFX("button") + VIB(1) end Buttons.sel=nil mouseShow=false @@ -578,13 +573,11 @@ function love.touchreleased(id,x,y) end end function love.touchmoved(id,x,y,dx,dy) - if not Buttons.sel then - touching=nil - end x,y=xOy:inverseTransformPoint(x,y) if touchMove[scene]then touchMove[scene](id,x,y,dx/scr.k,dy/scr.k) end + Buttons.sel=nil for _,B in next,Buttons[scene]do if not(B.hide and B.hide())then if abs(x-B.x)=h then scr.w,scr.h=w,h - else scr.w,scr.h=h,w - end - scr.r=h/w - if h/w>=.5625 then + scr.w,scr.h,scr.r=w,h,h/w + if scr.r>=.5625 then scr.k=w/1280 scr.x,scr.y=0,(h-w*9/16)*.5 else @@ -677,7 +670,7 @@ function love.update(dt) --[[ if players then for k,v in pairs(players[1])do - if rawget(_G,k)then print(k)end + if rawget(_G,k)and k~="next"and k~="hold"and k~="stat"then print(k,_G[v])end end end--check player data flew(debugging) ]] @@ -733,24 +726,23 @@ function love.draw() gc.setColor(1,1,1,min(1-abs(1-r%1*2),.3)) r=int(r)%7+1 gc.draw(mouseBlock[r],mx,my,Timer()%pi*4,20,20,scs[r][2]-.5,#blocks[r][0]-scs[r][1]+.5) - gc.setColor(1,1,1,.5) - gc.circle("fill",mx,my,5) - gc.setColor(1,1,1) - gc.circle("fill",mx,my,3) + gc.setColor(1,1,1,.5)gc.circle("fill",mx,my,5) + gc.setColor(1,1,1)gc.circle("fill",mx,my,3) end if sceneSwaping then sceneSwaping.draw()end - if scr.r==.5625 then goto L end + if scr.r~=.5625 then + gc.setColor(0,0,0) if scr.r>.5625 then - gc.setColor(0,0,0) - gc.rectangle("fill",0,0,1280,scr.w*9/16-scr.h) - gc.rectangle("fill",0,720,1280,scr.h-scr.w*9/16) - else - gc.setColor(0,0,0) - gc.rectangle("fill",0,0,scr.h*16/9-scr.w,720) - gc.rectangle("fill",1280,0,scr.w-scr.h*16/9,720) - end - ::L:: + local d=(scr.h-scr.w*9/16)*.5/scr.k + gc.rectangle("fill",0,0,1280,-d) + gc.rectangle("fill",0,720,1280,d) + else--high + local d=(scr.w-scr.h*16/9)*.5/scr.k + gc.rectangle("fill",0,0,-d,720) + gc.rectangle("fill",1280,0,d,720) + end--wide + end setFont(20)gc.setColor(1,1,1) gc.print(tm.getFPS(),5,700) if devMode then diff --git a/class.lua b/class.lua index bef373df..27270fc7 100644 --- a/class.lua +++ b/class.lua @@ -29,7 +29,7 @@ function clearTask(opt) end end function Task:update() - if self.code(self.P,self.data)then + if(not self.P or self.P and scene=="play")and self.code(self.P,self.data)then self:destroy() return nil end diff --git a/conf.lua b/conf.lua index 93dcd5f1..5e6131ae 100644 --- a/conf.lua +++ b/conf.lua @@ -9,7 +9,7 @@ function love.conf(t) t.audio.mixwithsystem=true--Switch on to keep sysBGM local W=t.window - W.title="Techmino V0.7.16" + W.title="Techmino V0.7.17" W.icon="/image/icon.png" W.width,W.height=1280,720 W.minwidth,W.minheight=640,360 diff --git a/dataList.lua b/dataList.lua index 0f8e241a..f4107ac4 100644 --- a/dataList.lua +++ b/dataList.lua @@ -180,7 +180,7 @@ mesDisp={ --Default:font=35,white sprint=function() setFont(70) - local r=max(P.gameEnv.target-P.cstat.row,0) + local r=max(P.gameEnv.target-P.stat.row,0) mStr(r,-82,260) if r<21 and r>0 then gc.setLineWidth(3) @@ -190,14 +190,14 @@ mesDisp={ end, marathon=function() setFont(50) - mStr(P.cstat.row,-82,320) + mStr(P.stat.row,-82,320) mStr(P.gameEnv.target,-82,370) gc.rectangle("fill",-128,376,90,4) end, master=function() setFont(50) - mStr(P.cstat.point,-82,320) - mStr((P.cstat.event+1)*100,-82,370) + mStr(P.modeData.point,-82,320) + mStr((P.modeData.event+1)*100,-82,370) gc.rectangle("fill",-128,376,90,4) end, classic=function() @@ -207,18 +207,18 @@ mesDisp={ setFont(20) mStr("speed level",-82,290) setFont(50) - mStr(P.cstat.row,-82,320) + mStr(P.stat.row,-82,320) mStr(P.gameEnv.target,-82,370) gc.rectangle("fill",-128,376,90,4) end, zen=function() setFont(75) - mStr(max(200-P.cstat.row,0),-82,280) + mStr(max(200-P.stat.row,0),-82,280) end, infinite=function() setFont(50) - mStr(P.cstat.atk,-82,310) - mStr(format("%.2f",2.5*P.cstat.atk/P.cstat.piece),-82,420) + mStr(P.stat.atk,-82,310) + mStr(format("%.2f",2.5*P.stat.atk/P.stat.piece),-82,420) setFont(20) mStr("Attack",-82,363) mStr("Efficiency",-82,475) @@ -227,25 +227,25 @@ mesDisp={ setFont(35) mStr("TSD",-82,407) setFont(80) - mStr(P.cstat.event,-82,330) + mStr(P.modeData.event,-82,330) end, blind=function() setFont(25) mStr("Rows",-82,300) mStr("Techrash",-82,420) setFont(80) - mStr(P.cstat.row,-82,220) - mStr(P.cstat.techrash,-82,340) + mStr(P.stat.row,-82,220) + mStr(P.stat.clear_4,-82,340) end, dig=function() setFont(70) - mStr(P.cstat.event-20,-82,310) + mStr(P.modeData.event-20,-82,310) setFont(30) mStr("Wave",-82,375) end, survivor=function() setFont(70) - mStr(P.cstat.event,-82,310) + mStr(P.modeData.event,-82,310) setFont(30) mStr("Wave",-82,375) end, @@ -253,15 +253,15 @@ mesDisp={ setFont(22) mStr("Perfect Clear",-82,412) setFont(80) - mStr(P.cstat.pc,-82,330) + mStr(P.stat.pc,-82,330) end, pcchallenge=function() setFont(22) mStr("Perfect Clear",-82,432) setFont(80) - mStr(P.cstat.pc,-82,350) + mStr(P.stat.pc,-82,350) setFont(50) - mStr(max(100-P.cstat.row,0),-82,250) + mStr(max(100-P.stat.row,0),-82,250) end, techmino41=function() setFont(40) @@ -295,12 +295,12 @@ mesDisp={ end, drought=function() setFont(75) - mStr(max(100-P.cstat.row,0),-82,280) + mStr(max(100-P.stat.row,0),-82,280) end, custom=function() if P.gameEnv.target<1e4 then setFont(75) - mStr(max(P.gameEnv.target-P.cstat.row,0),-82,280) + mStr(max(P.gameEnv.target-P.stat.row,0),-82,280) end if curMode.lv==2 and(P.keyPressing[9]or frame<180)then gc.setLineWidth(3) @@ -315,9 +315,9 @@ mesDisp={ } Event={ marathon_reach=function() - local s=int(P.cstat.row*.1) + local s=int(P.stat.row*.1) if s>=20 then - P.cstat.row=200 + P.stat.row=200 Event_gameover.win() else P.gameEnv.drop=marathon_drop[s] @@ -327,19 +327,20 @@ Event={ end end, master_reach_lunatic=function() - local t=P.cstat.point + local t=P.modeData.point local c=#P.clearing if t%100==99 and c==0 then goto L end t=t+(c<3 and c+1 or c==3 and 5 or 7) - if int(t*.01)>P.cstat.event then - P.cstat.event=P.cstat.event+1 - if P.cstat.event==5 then - P.cstat.event=4 - P.cstat.point=500 + if int(t*.01)>P.modeData.event then + P.modeData.event=P.modeData.event+1 + if P.modeData.event==5 then + P.modeData.event=4 + P.modeData.point=500 Event_gameover.win() goto L else - local s=P.cstat.event+1 + local s=P.modeData.event+1 + curBG=s==2 and"game1"or s==3 and"game2"or s==4 and"game3"or s==5 and"game4" P.gameEnv.lock=rush_lock[s] P.gameEnv.wait=rush_wait[s] P.gameEnv.fall=rush_fall[s] @@ -350,24 +351,25 @@ Event={ SFX("reach") end end - P.cstat.point=t + P.modeData.point=t if t%100==99 then SFX("blip_1")end ::L:: end, master_reach_ultimate=function() - local t=P.cstat.point + local t=P.modeData.point local c=#P.clearing if t%100==99 and c==0 then goto L end t=t+(c<3 and c+1 or c==3 and 5 or 7) - if int(t*.01)>P.cstat.event then - P.cstat.event=P.cstat.event+1 - if P.cstat.event==5 then - P.cstat.event=4 - P.cstat.point=500 + if int(t*.01)>P.modeData.event then + P.modeData.event=P.modeData.event+1 + if P.modeData.event==5 then + P.modeData.event=4 + P.modeData.point=500 Event_gameover.win() goto L else - local s=P.cstat.event+1 + local s=P.modeData.event+1 + curBG=s==2 and"game3"or s==3 and"game4"or s==4 and"game5"or s==5 and"game6" P.gameEnv.lock=death_lock[s] P.gameEnv.wait=death_wait[s] P.gameEnv.fall=death_fall[s] @@ -377,7 +379,7 @@ Event={ SFX("reach") end end - P.cstat.point=t + P.modeData.point=t if t%100==99 then SFX("blip_1")end ::L:: end, @@ -392,27 +394,32 @@ Event={ if P.lastClear~=52 then Event_gameover.lose() elseif #P.clearing>0 then - P.cstat.event=P.cstat.event+1 + P.modeData.event=P.modeData.event+1 end end, - tech_reach=function() - if #P.clearing>0 and P.lastClear<10 then + tech_reach_easy=function() + if P.b2b<40 then Event_gameover.lose() end end, tech_reach_hard=function() + if #P.clearing>0 and P.lastClear<10 then + Event_gameover.lose() + end + end, + tech_reach_ultimate=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.stat.piece%4==0 then if #P.field==#P.clearing then - P.counter=P.cstat.piece==0 and 20 or 0 + P.counter=P.stat.piece==0 and 20 or 0 newTask(Event_task.PC,P) if curMode.lv==2 then - local s=P.cstat.pc*.5 + 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 @@ -432,7 +439,6 @@ Event={ } Event_gameover={ win=function() - local P=players.alive[1] P.alive=false P.control=false P.timing=false @@ -454,6 +460,10 @@ Event_gameover={ P.visTime[i][j]=min(P.visTime[i][j],20) end end + if P.id==1 then + gamefinished=true + newTask(Event_task.finish,P) + end showText(P,text.win,"beat",90,nil,.4,curMode.id~="custom") SFX("win") end, @@ -522,6 +532,7 @@ Event_gameover={ P.gameEnv.keepVisible=P.gameEnv.visible~="show" showText(P,text.lose,"appear",90,nil,nil,true) if P.id==1 then + gamefinished=true SFX("fail") if modeEnv.royaleMode then BGM("end") @@ -535,10 +546,19 @@ Event_gameover={ end if #players>1 then newTask(Event_task.lose,P) + else + newTask(Event_task.finish,P) end end, } Event_task={ + finish=function(P) + P.endCounter=P.endCounter+1 + if P.endCounter>120 then + pauseGame() + return true + end + end, lose=function(P) P.endCounter=P.endCounter+1 if P.endCounter>80 then @@ -554,6 +574,9 @@ Event_task={ removeRow(P.field) removeRow(P.visTime) end + if P.id==1 then + pauseGame() + end return true end end @@ -571,97 +594,98 @@ Event_task={ dig_normal=function(P) if not P.control then return end P.counter=P.counter+1 - if P.counter>=max(90,180-P.cstat.event)then + if P.counter>=max(90,180-P.modeData.event)then garbageRise(10,1,rnd(10)) P.counter=0 - P.cstat.event=P.cstat.event+1 + P.modeData.event=P.modeData.event+1 end end, dig_lunatic=function(P) if not P.control then return end P.counter=P.counter+1 - if P.counter>=max(45,80-.3*P.cstat.event)then - garbageRise(11+P.cstat.event%3,1,rnd(10)) + if P.counter>=max(45,80-.3*P.modeData.event)then + garbageRise(11+P.modeData.event%3,1,rnd(10)) P.counter=0 - P.cstat.event=P.cstat.event+1 + P.modeData.event=P.modeData.event+1 end end, survivor_easy=function(P) if not P.control then return end P.counter=P.counter+1 - if P.counter>=max(60,150-2*P.cstat.event)then + if P.counter>=max(60,150-2*P.modeData.event)then ins(P.atkBuffer,{pos=rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1}) P.counter=0 - if P.cstat.event==45 then showText(P,text.maxspeed,"appear",80,-140)end - P.cstat.event=P.cstat.event+1 + if P.modeData.event==45 then showText(P,text.maxspeed,"appear",80,-140)end + P.modeData.event=P.modeData.event+1 end end, survivor_normal=function(P) if not P.control then return end P.counter=P.counter+1 - if P.counter>=max(90,180-2*P.cstat.event)then - local d=P.cstat.event+1 + if P.counter>=max(90,180-2*P.modeData.event)then + local d=P.modeData.event+1 if d%4==0 then ins(P.atkBuffer,{pos=rnd(10),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1}) elseif d%4==1 then ins(P.atkBuffer,{pos=rnd(10),amount=2,countdown=70,cd0=70,time=0,sent=false,lv=1}) elseif d%4==2 then ins(P.atkBuffer,{pos=rnd(10),amount=3,countdown=80,cd0=80,time=0,sent=false,lv=2}) elseif d%4==3 then ins(P.atkBuffer,{pos=rnd(10),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3}) end P.atkBuffer.sum=P.atkBuffer.sum+d%4+1 + P.stat.recv=P.stat.recv+d%4+1 if P.atkBuffer.sum>20 then garbageRelease()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 + if P.modeData.event==45 then showText(P,text.maxspeed,"appear",80,-140)end + P.modeData.event=P.modeData.event+1 end end, survivor_hard=function(P) if not P.control then return end P.counter=P.counter+1 - if P.counter>=max(60,180-2*P.cstat.event)then - if P.cstat.event%3<2 then + if P.counter>=max(60,180-2*P.modeData.event)then + if P.modeData.event%3<2 then ins(P.atkBuffer,{pos=rnd(10),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1}) else ins(P.atkBuffer,{pos=rnd(10),amount=3,countdown=60,cd0=60,time=0,sent=false,lv=2}) end - P.atkBuffer.sum=P.atkBuffer.sum+(P.cstat.event%3<2 and 1 or 3) + P.atkBuffer.sum=P.atkBuffer.sum+(P.modeData.event%3<2 and 1 or 3) if P.atkBuffer.sum>20 then garbageRelease()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 + if P.modeData.event==45 then showText(P,text.maxspeed,"appear",80,-140)end + P.modeData.event=P.modeData.event+1 end end, survivor_lunatic=function(P) if not P.control then return end P.counter=P.counter+1 - if P.counter>=max(60,150-P.cstat.event)then - local t=max(60,90-P.cstat.event) + if P.counter>=max(60,150-P.modeData.event)then + local t=max(60,90-P.modeData.event) ins(P.atkBuffer,{pos=rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}) P.atkBuffer.sum=P.atkBuffer.sum+4 - if P.atkBuffer.sum>20 then garbageRelease()end + if P.atkBuffer.sum>15 then garbageRelease()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 + if P.modeData.event==60 then showText(P,text.maxspeed,"appear",80,-140)end + P.modeData.event=P.modeData.event+1 end end, survivor_ultimate=function(P) if not P.control then return end P.counter=P.counter+1 - if P.counter>=max(300,600-10*P.cstat.event)then - local t=max(300,480-12*P.cstat.event) + if P.counter>=max(300,600-10*P.modeData.event)then + local t=max(300,480-12*P.modeData.event) ins(P.atkBuffer,{pos=rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=2}) ins(P.atkBuffer,{pos=rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}) ins(P.atkBuffer,{pos=rnd(10),amount=6,countdown=1.2*t,cd0=1.2*t,time=0,sent=false,lv=4}) ins(P.atkBuffer,{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 - if P.atkBuffer.sum>30 then garbageRelease()end + if P.atkBuffer.sum>32 then garbageRelease()end P.counter=0 - if P.cstat.event==31 then showText(P,text.maxspeed,"appear",80,-140)end - P.cstat.event=P.cstat.event+1 + if P.modeData.event==31 then showText(P,text.maxspeed,"appear",80,-140)end + P.modeData.event=P.modeData.event+1 end end, PC=function(P) P.counter=P.counter+1 if P.counter==21 then - local t=P.cstat.pc%2 + local t=P.stat.pc%2 for i=1,4 do local r=getNewRow(0) for j=1,10 do @@ -694,84 +718,68 @@ Event_task={ defaultModeEnv={ sprint={ { - drop=60, - target=10, + drop=60,target=10, reach=Event_gameover.win, bg="strap",bgm="race", }, { - drop=60, - target=20, + drop=60,target=20, reach=Event_gameover.win, bg="strap",bgm="race", }, { - drop=60, - target=40, + drop=60,target=40, reach=Event_gameover.win, bg="strap",bgm="race", }, { - drop=60, - target=100, + drop=60,target=100, reach=Event_gameover.win, bg="strap",bgm="race", }, { - drop=60, - target=400, + drop=60,target=400, reach=Event_gameover.win, bg="strap",bgm="push", }, { - drop=60, - target=1000, + 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, + 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, + drop=60,fall=20, + target=10,reach=Event.marathon_reach, bg="strap",bgm="way", }, { - _20G=true, - fall=15, - target=200, - reach=Event.marathon_reach, + _20G=true,fall=15, + target=200,reach=Event.marathon_reach, bg="strap",bgm="race", }, }, master={ { - _20G=true, - drop=0,lock=rush_lock[1], + _20G=true,drop=0,lock=rush_lock[1], wait=rush_wait[1], fall=rush_fall[1], - target=0, - reach=Event.master_reach_lunatic, + target=0,reach=Event.master_reach_lunatic, das=9,arr=3, freshLimit=15, - bg="game2",bgm="secret8th", + bg="strap",bgm="secret8th", }, { - _20G=true, - drop=0,lock=death_lock[1], + _20G=true,drop=0,lock=death_lock[1], wait=death_wait[1], fall=death_fall[1], - target=0, - reach=Event.master_reach_ultimate, + target=0,reach=Event.master_reach_ultimate, das=6,arr=1, freshLimit=15, bg="game2",bgm="secret7th", @@ -779,16 +787,13 @@ defaultModeEnv={ }, classic={ { - das=15,arr=3, - sddas=2,sdarr=2, + das=15,arr=3,sddas=2,sdarr=2, ghost=false,center=false, - drop=1,lock=1, - wait=10,fall=25, + drop=1,lock=1,wait=10,fall=25, next=1,hold=false, sequence="rnd", freshLimit=0, - target=10, - reach=Event.classic_reach, + target=10,reach=Event.classic_reach, bg="rgb",bgm="rockblock", }, }, @@ -796,8 +801,7 @@ defaultModeEnv={ { drop=1e99,lock=1e99, oncehold=false, - target=200, - reach=Event_gameover.win, + target=200,reach=Event_gameover.win, bg="strap",bgm="infinite", }, }, @@ -819,16 +823,14 @@ defaultModeEnv={ oncehold=false, drop=1e99,lock=1e99, freshLimit=15, - target=1, - reach=Event.tsd_reach, + target=1,reach=Event.tsd_reach, ospin=false, bg="matrix",bgm="reason", }, { drop=60,lock=60, freshLimit=15, - target=1, - reach=Event.tsd_reach, + target=1,reach=Event.tsd_reach, ospin=false, bg="matrix",bgm="reason", }, @@ -931,35 +933,32 @@ defaultModeEnv={ { oncehold=false, drop=1e99,lock=1e99, - target=0, - reach=Event.tech_reach, + target=1,reach=Event.tech_reach_easy, bg="matrix",bgm="way", }, { + oncehold=false, drop=30,lock=60, - target=0, - reach=Event.tech_reach, + target=1,reach=Event.tech_reach_easy, bg="matrix",bgm="way", }, { - drop=15,lock=60, - target=0, - reach=Event.tech_reach_hard, + drop=8,lock=60, freshLimit=15, - bg="matrix",bgm="way", + target=1,reach=Event.tech_reach_hard, + bg="matrix",bgm="secret8th", }, { - drop=5,lock=40, - target=0, + drop=4,lock=40, + target=1, freshLimit=15, reach=Event.tech_reach_hard, - bg="matrix",bgm="way", + bg="matrix",bgm="secret8th", }, { drop=1,lock=40, - target=0, freshLimit=15, - reach=Event.tech_reach_hard, + target=1,reach=Event.tech_reach_ultimate, bg="matrix",bgm="secret7th", }, }, @@ -967,11 +966,10 @@ defaultModeEnv={ { next=4, hold=false, - drop=120,lock=120, + drop=150,lock=150, fall=20, sequence="pc", - target=0, - reach=Event.newPC, + target=0,reach=Event.newPC, ospin=false, bg="rgb",bgm="newera", }, @@ -981,9 +979,8 @@ defaultModeEnv={ drop=60,lock=60, fall=20, sequence="pc", - target=0, freshLimit=15, - reach=Event.newPC, + target=0,reach=Event.newPC, ospin=false, bg="rgb",bgm="newera", }, @@ -992,25 +989,20 @@ defaultModeEnv={ { oncehold=false, drop=300,lock=1e99, - target=100, - reach=Event_gameover.win, + target=100,reach=Event_gameover.win, ospin=false, bg="rgb",bgm="newera", }, { - drop=60,lock=120, - fall=10, - target=100, - reach=Event_gameover.win, + 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, + drop=20,lock=60,fall=20, + target=100,reach=Event_gameover.win, freshLimit=15, ospin=false, bg="rgb",bgm="infinite", diff --git a/font.ttf b/font.ttf index 03984039..789481d9 100644 Binary files a/font.ttf and b/font.ttf differ diff --git a/gamefunc.lua b/gamefunc.lua index e37927c1..4f8c4e8a 100644 --- a/gamefunc.lua +++ b/gamefunc.lua @@ -6,7 +6,7 @@ local testScore={[-1]=1,[-2]=0,[-3]=1,2,2,2} local visible_opt={show=1e99,time=300,fast=20,none=5} local reAtk={0,0,1,1,1,2,2,3,3} local reDef={0,1,1,2,3,3,4,4,5} -local spin_n={"spin_1","spin_2","spin_3"} +local spin_n={[0]="spin_0","spin_1","spin_2","spin_3"} local clear_n={"clear_1","clear_2","clear_3","clear_4"} local ren_n={}for i=1,11 do ren_n[i]="ren_"..i end @@ -105,9 +105,9 @@ local freshMethod={ newNext(i) end,--random pc=function() - if P.cstat.piece%4==0 then + if P.stat.piece%4==0 then local r=rnd(#PClist) - local f=P.cstat.event==1 + local f=P.modeData.event==1 for i=1,4 do local b=PClist[r][i] if f then @@ -117,7 +117,7 @@ local freshMethod={ end newNext(b) end - P.cstat.event=(P.cstat.event+1)%2 + P.modeData.event=(P.modeData.event+1)%2 end end, drought1=function() @@ -160,10 +160,35 @@ function loadGame(mode,level) needResetGameData=true gotoScene("play","deck") end +function resetPartGameData() + frame=30 + if players then + for _,P in next,players do if P.id then + while P.field[1]do + removeRow(P.field) + removeRow(P.visTime) + end + end end + end + players={alive={}}human=0 + loadmode[curMode.id]() + if modeEnv.royaleMode then + for i=1,#players do + changeAtk(players[i],randomTarget(players[i])) + end + end + for i=1,#virtualkey do + virtualkey[i].press=false + end + collectgarbage() +end function resetGameData() + gamefinished=false frame=0 garbageSpeed=1 pushSpeed=3 + pauseTime=0--Time paused + pauseCount=0--Times paused if players then for _,P in next,players do if P.id then while P.field[1]do @@ -179,7 +204,7 @@ function resetGameData() BGM(modeEnv.bgm) FX.beam={} - for k,v in pairs(PTC.dust)do + for _,v in next,PTC.dust do v:release() end for i=1,#players do @@ -205,6 +230,7 @@ function resetGameData() while freeRow[p]do rem(freeRow) end + sysSFX("ready") collectgarbage() end function gameStart() @@ -247,12 +273,15 @@ function createPlayer(id,x,y,size,AIspeed,data) P.alive=true P.control=false P.timing=false - P.time=0 - P.cstat={ - key=0,piece=0,row=0,atk=0, - techrash=0,pc=0, - point=0,event=0 + P.stat={ + time=0, + key=0,rotate=0,hold=0,piece=0,row=0, + atk=0,send=0,recv=0,pend=0, + clear_1=0,clear_2=0,clear_3=0,clear_4=0, + spin_0=0,spin_1=0,spin_2=0,spin_3=0, + pc=0,b2b=0,b3b=0, }--Current gamestat + P.modeData={point=0,event=0}--data use by mode P.keyTime={}for i=1,10 do P.keyTime[i]=-1e5 end P.keySpeed=0 P.dropTime={}for i=1,10 do P.dropTime[i]=-1e5 end P.dropSpeed=0 @@ -353,6 +382,7 @@ function garbageSend(S,R,send,time) sent=false, lv=min(int(send^.69),5), }) + R.stat.recv=R.stat.recv+send if R.id==1 then sysSFX(send<4 and "blip_1"or"blip_2",min(send+1,5)*.1)end end end @@ -362,6 +392,7 @@ function garbageRelease() if not A.sent and A.countdown<=0 then garbageRise(8+A.lv,A.amount,A.pos) P.atkBuffer.sum=P.atkBuffer.sum-A.amount + P.stat.pend=P.stat.pend+A.amount A.sent=true A.time=0 end @@ -643,24 +674,24 @@ function spin(d,ifpre) P.curX=P.curX-1 goto I end - goto E + goto quit ::T:: P.cur.id=5 P.cur.bk=blocks[5][0] P.sc=scs[5][0] P.r,P.c,P.dir=2,3,0 P.spinLast=3 - if P.id==1 then stat.rotate=stat.rotate+1 end - goto E + P.stat.rotate=P.stat.rotate+1 + goto quit ::I:: P.cur.id=7 P.cur.bk=blocks[7][2] P.sc=scs[7][2] P.r,P.c,P.dir=1,4,2 P.spinLast=3 - if P.id==1 then stat.rotate=stat.rotate+1 end - end - ::E::return + P.stat.rotate=P.stat.rotate+1 + end + goto quit end local icb=blocks[P.cur.id][idir] local isc=scs[P.cur.id][idir] @@ -675,7 +706,7 @@ function spin(d,ifpre) goto spin end end - goto fail + goto quit ::spin:: createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY) P.curX,P.curY,P.dir=ix,iy,idir @@ -685,10 +716,8 @@ function spin(d,ifpre) freshgho() freshLockDelay() SFX(ifpre and"prerotate"or ifoverlap(P.cur.bk,P.curX,P.curY+1)and ifoverlap(P.cur.bk,P.curX-1,P.curY)and ifoverlap(P.cur.bk,P.curX+1,P.curY)and"rotatekick"or"rotate") - if P.id==1 then - stat.rotate=stat.rotate+1 - end - ::fail:: + P.stat.rotate=P.stat.rotate+1 + ::quit:: end function hold(ifpre) if not P.holded and P.waiting==-1 and P.gameEnv.hold then @@ -712,9 +741,7 @@ function hold(ifpre) if ifoverlap(P.cur.bk,P.curX,P.curY)then lock()Event_gameover.lose()end SFX(ifpre and"prehold"or"hold") - if P.id==1 then - stat.hold=stat.hold+1 - end + P.stat.hold=P.stat.hold+1 end end function drop() @@ -739,7 +766,7 @@ function drop() end--Immobile end lock() - local cc,csend,exblock,sendTime=checkrow(P.curY,P.r),0,0,0--Currect clear&send&sendTime + local cc,send,exblock,sendTime=checkrow(P.curY,P.r),0,0,0--Currect clear&send&sendTime local mini if P.spinLast and cc>0 and dospin>0 then dospin=dospin+P.spinLast @@ -760,71 +787,76 @@ function drop() if cc==4 then if P.b2b>1000 then showText(P,text.techrashB3B,"fly",80,-30) - csend=6 + send=6 sendTime=100 exblock=exblock+1 + P.stat.b3b=P.stat.b3b+1 elseif P.b2b>=40 then showText(P,text.techrashB2B,"drive",80,-30) sendTime=80 - csend=5 + send=5 + P.stat.b2b=P.stat.b2b+1 else showText(P,text.techrash,"stretch",80,-30) sendTime=60 - csend=4 + send=4 end P.b2b=P.b2b+120 P.lastClear=74 - P.cstat.techrash=P.cstat.techrash+1 + P.stat.clear_4=P.stat.clear_4+1 elseif cc>0 then + local clearKey=clear_n if dospin then if P.b2b>1000 then showText(P,text.b3b..text.spin[P.cur.name]..text.clear[cc],"spin",40,-30) - csend=b2bATK[cc]+1 + send=b2bATK[cc]+1 exblock=exblock+1 + P.stat.b3b=P.stat.b3b+1 elseif P.b2b>=40 then showText(P,text.b2b..text.spin[P.cur.name]..text.clear[cc],"spin",40,-30) - csend=b2bATK[cc] + send=b2bATK[cc] + P.stat.b2b=P.stat.b2b+1 else showText(P,text.spin[P.cur.name]..text.clear[cc],"spin",50,-30) - csend=2*cc + send=2*cc end - sendTime=20+csend*20 + sendTime=20+send*20 if mini then showText(P,text.mini,"appear",40,-80) - csend=ceil(csend*.5) + send=ceil(send*.5) sendTime=sendTime+60 P.b2b=P.b2b+b2bPoint[cc]*.8 else P.b2b=P.b2b+b2bPoint[cc] end P.lastClear=P.cur.id*10+cc - if P.id==1 then - stat.spin=stat.spin+1 - end + clearKey=spin_n SFX(spin_n[cc]) elseif #P.clearing<#P.field then P.b2b=max(P.b2b-250,0) showText(P,text.clear[cc],"appear",32+cc*3,-30,(8-cc)*.3) - csend=cc-1 - sendTime=20+csend*20 + send=cc-1 + sendTime=20+send*20 P.lastClear=cc end + P.stat[clearKey[cc]]=P.stat[clearKey[cc]]+1 else P.combo=0 if dospin then showText(P,text.spin[P.cur.name],"appear",50,-30) SFX("spin_0") P.b2b=P.b2b+20 + P.stat.spin_0=P.stat.spin_0+1 end end - csend=csend+(renATK[P.combo]or 4) + send=send+(renATK[P.combo]or 4) if #P.clearing==#P.field then showText(P,text.PC,"flicker",70,-80) - csend=min(csend,4)+min(6+P.cstat.pc,10) + send=min(send,4)+min(6+P.stat.pc,10) exblock=exblock+2 sendTime=sendTime+60 - if P.cstat.row>4 then P.b2b=1200 end - P.cstat.pc=P.cstat.pc+1 + if P.stat.row>4 then P.b2b=1200 end + P.stat.pc=P.stat.pc+1 P.lastClear=P.cur.id*10+5 SFX("perfectclear") end @@ -835,39 +867,38 @@ function drop() if cc>0 then SFX(clear_n[cc]) SFX(ren_n[min(P.combo,11)]) - if P.id==1 then VIB(cc<3 and 1 or cc-1)end + if P.id==1 then VIB(cc)end end if P.b2b>1200 then P.b2b=1200 end if cc>0 and modeEnv.royaleMode then local i=min(#P.atker,9) if i>1 then - csend=csend+reAtk[i] + send=send+reAtk[i] exblock=exblock+reDef[i] end end - if csend>0 then + if send>0 then if exblock then exblock=int(exblock*(1+P.strength*.25))end - csend=csend*(1+P.strength*.25) - if mini then csend=csend end - csend=int(csend) + send=send*(1+P.strength*.25) + if mini then send=send end + send=int(send) --Badge Buff - P.cstat.atk=P.cstat.atk+csend - if P.id==1 then stat.atk=stat.atk+csend end + P.stat.atk=P.stat.atk+send --ATK statistics - if csend==0 then goto L end - showText(P,csend,"zoomout",40,70) + if send==0 then goto L end + showText(P,send,"zoomout",40,70) if exblock==0 then goto L end showText(P,exblock,"zoomout",20,115) ::L:: - if csend>0 and P.atkBuffer[1]then + if send>0 and P.atkBuffer[1]then if exblock>0 then exblock=exblock-1 else - csend=csend-1 + send=send-1 end P.atkBuffer[1].amount=P.atkBuffer[1].amount-1 P.atkBuffer.sum=P.atkBuffer.sum-1 @@ -876,24 +907,25 @@ function drop() end goto L end - if csend>0 then + if send>0 then if modeEnv.royaleMode then if P.atkMode==4 then if #P.atker>0 then for i=1,#P.atker do - garbageSend(P,P.atker[i],csend,sendTime) + garbageSend(P,P.atker[i],send,sendTime) end else - garbageSend(P,randomTarget(P),csend,sendTime) + garbageSend(P,randomTarget(P),send,sendTime) end else freshTarget(P) - garbageSend(P,P.atking,csend,sendTime) + garbageSend(P,P.atking,send,sendTime) end elseif #players.alive>1 then - garbageSend(P,randomTarget(P),csend,sendTime) + garbageSend(P,randomTarget(P),send,sendTime) end - if P.id==1 and csend>3 then sysSFX("emit",min(csend,8)*.125)end + P.stat.send=P.stat.send+send + if P.id==1 and send>3 then sysSFX("emit",min(send,8)*.125)end end elseif cc==0 then if P.b2b>1000 then @@ -901,11 +933,8 @@ function drop() end garbageRelease() end - if P.id==1 then - stat.piece,stat.row=stat.piece+1,stat.row+cc - end - P.cstat.piece,P.cstat.row=P.cstat.piece+1,P.cstat.row+cc - if P.cstat.row>=P.gameEnv.target then + P.stat.piece,P.stat.row=P.stat.piece+1,P.stat.row+cc + if P.stat.row>=P.gameEnv.target then P.gameEnv.reach() end P.spinLast=dospin and cc>0 @@ -961,8 +990,7 @@ function pressKey(i,p) end end ins(P.keyTime,1,frame)rem(P.keyTime,11) - P.cstat.key=P.cstat.key+1 - if P.id==1 then stat.key=stat.key+1 end + P.stat.key=P.stat.key+1 end --ins(rec,{i,frame}) end @@ -1017,7 +1045,7 @@ act={ P.curY=P.y_img P.spinLast=false SFX("drop") - if P.id==1 then VIB(1)end + if P.id==1 then VIB(0)end end P.lockDelay=-1 drop() @@ -1064,8 +1092,12 @@ act={ end, restart=function() clearTask("play") - resetGameData() - frame=30 + if frame>=180 then + updateStat() + resetGameData() + else + resetPartGameData() + end end, insDown=function() if P.curY~=P.y_img then diff --git a/language/chi.lua b/language/chi.lua index 5539cf43..59f798ac 100644 --- a/language/chi.lua +++ b/language/chi.lua @@ -3,17 +3,15 @@ return{ royale_remain=function(n)return"剩余 "..n.." 名玩家"end, cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"}, techrash="Techrash", - techrashB2B="Techrash B2B", - techrashB3B="Techrash B2B2B", + techrashB2B="B2B Techrash", + techrashB3B="B2B2B Techrash", block={"Z","S","L","J","T","O","I"}, - spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"}, clear={" single"," double"," triple"}, - b2b="B2B ", - b3b="B2B2B ", + spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"}, + b2b="B2B ",b3b="B2B2B ", mini="Mini", PC="Perfect Clear", - hold="暂存", - next="下一个", + hold="暂存",next="下一个", stage={"关卡 1","关卡 2","关卡 3","关卡 4","关卡 5",}, maxspeed="最高速度", @@ -22,6 +20,8 @@ return{ win="胜利", lose="失败", pause="暂停", + finish="结束", + pauseTime="暂停时间", custom="自定义游戏", customOption={ @@ -72,13 +72,13 @@ return{ zen="无重力消除200行", infinite="科研沙盒", solo="打败AI", - tsd="尽可能做T旋消2", + tsd="尽可能做TSD", blind="最强大脑", dig="核能挖掘机", survivor="防守练习", - tech="ALLSPIN练习", + tech="尽可能不要普通消除", pctrain="熟悉全清定式的组合", - pcchallenge="100行内尽可能多全清", + pcchallenge="100行内尽可能多PC", techmino41="41人混战", techmino99="99人混战", drought="异常序列", @@ -104,19 +104,28 @@ return{ "更小的DAS和ARR拥有更高的操作上限", "注意到\"旋转\"到底对方块做了些什么吗?", "20G是一套全新的游戏规则", - "请勿在上课时游玩本游戏!", + "不要在上课时玩游戏!", + "本游戏难度上限很高,做好心理准备", + "方块可以不是个休闲游戏", }, stat={ "游戏运行次数:", "游戏局数:", "游戏时间:", - "总方块使用:", - "总消行数:", - "总攻击行数:", "总按键数:", "总旋转数:", - "暂存次数:", - "总旋转消行数:", + "Hold次数:", + "方块使用数:", + "总消行数:", + "总攻击数:", + "总发送数:", + "总接收数:", + "总上涨数:", + "总消除数:", + "总Spin数:", + "总B2B数:", + "总PC数:", + "平均效率:", }, help={ "好像也没啥好帮助的吧?就当是关于了", @@ -227,4 +236,4 @@ return{ path="打开存储目录", }, }, -}--中文 \ No newline at end of file +}-- \ No newline at end of file diff --git a/language/chi_full.lua b/language/chi_full.lua new file mode 100644 index 00000000..e7de8b3d --- /dev/null +++ b/language/chi_full.lua @@ -0,0 +1,239 @@ +return{ + atkModeName={"随机","徽章","击杀","反击"}, + royale_remain=function(n)return"剩余 "..n.." 名玩家"end, + cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"}, + techrash="四清", + techrashB2B="满贯 四清", + techrashB3B="大满贯 四清", + block={"Z","S","L","J","T","O","I"}, + clear={"单清","双清","三清"}, + spin={"Z型回旋","S型回旋","L型回旋","J型回旋","T型回旋","O型回旋","I型回旋"}, + b2b="满贯",b3b="大满贯", + mini="迷你", + PC="场地全清", + hold="暂存",next="下一个", + + stage={"关卡 1","关卡 2","关卡 3","关卡 4","关卡 5",}, + maxspeed="最高速度", + speedup="速度加快", + + win="胜利", + lose="失败", + pause="暂停", + finish="结束", + pauseTime="暂停时间", + + custom="自定义游戏", + customOption={ + drop="下落延迟:", + lock="锁定延迟:", + wait="放块延迟:", + fall="消行延迟:", + next="序列数量:", + hold="暂存:", + sequence="序列:", + visible="可见性:", + target="目标行数:", + freshLimit="锁延刷新次数:", + opponent="对手速度等级:", + }, + customVal={ + drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"∞","[20G]"}, + lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"∞"}, + wait=nil, + fall=nil, + next=nil, + hold={"开","关","无限"}, + sequence={"bag7","his4","随机"}, + visible={"可见","半隐","全隐","瞬隐"}, + target={10,20,40,100,200,500,1000,"∞"}, + freshLimit={0,8,15,"∞"}, + opponent={"无电脑",1,2,3,4,5,6,7,8,9,10,11}, + }, + softdropdas="软降DAS:", + softdroparr="软降ARR:", + snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"}, + keyboard="键盘",joystick="手柄", + space="空格",enter="回车", + setting2Help="方向键选择/翻页,回车修改,esc返回", + + + actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","功能键:","重新开始:","左瞬移:","右瞬移:","软降到底:"}, + modeName={ + [0]="自定义", + "竞速","马拉松","大师","经典","禅","无尽","单挑","仅TSD","隐形","挖掘","生存","科研", + "全清训练","全清挑战","41人混战","99人混战","干旱","多人", + }, + modeInfo={ + sprint="挑战世界纪录", + marathon="尝试坚持到最后", + master="成为方块大师", + classic="高速经典", + zen="无重力消除200行", + infinite="科研沙盒", + solo="打败AI", + tsd="尽可能做T旋双清", + blind="最强大脑", + dig="核能挖掘机", + survivor="防守练习", + tech="尽可能不要普通消除!", + pctrain="熟悉全清定式的组合", + pcchallenge="100行内尽可能多全清", + techmino41="41人混战", + techmino99="99人混战", + drought="异常序列", + hotseat="友尽模式", + }, + + load={"加载材质ing","加载音乐ing","加载音效ing","加载完成",}, + tips={ + "不是动画,真的在加载!", + "整个游戏都是MrZ完成的!", + "大满贯10连击消四全清!", + "<方块研究所>有一个Nspire-CX版本!", + "B2B2B2B存在吗?", + "MEGACMB!", + "ALLSPIN!", + "O型回旋三清?", + "只用一个输入设备就可以游玩了", + "Miya:喵!", + "225238922,哔哩哔哩 干杯~", + "适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活", + "合群了就会消失,但是消失不代表没有意义", + "学会使用两个旋转键,三个更好", + "更小的DAS和ARR拥有更高的操作上限", + "注意到\"旋转\"到底对方块做了些什么吗?", + "20G是一套全新的游戏规则", + "不要在上课时玩游戏!", + "本游戏难度上限很高,做好心理准备", + "方块可以不是个休闲游戏", + }, + stat={ + "游戏运行次数:", + "游戏局数:", + "游戏时间:", + "总按键数:", + "总旋转数:", + "暂存次数:", + "总方块使用:", + "总消行数:", + "总攻击行数:", + "总发送数:", + "总接收数:", + "总上涨数:", + "总消除数:", + "总旋转消行数:", + "总满贯数:", + "总全清数:", + "平均效率:", + }, + help={ + "好像也没啥好帮助的吧?就当是关于了", + "这只是一个方块游戏,请勿过度解读和随意联想", + "不过就当成TOP/C2/KOS/TGM3/JS玩好了", + "游戏还在测试阶段,请 勿 外 传", + "", + "使用LOVE2D引擎", + "作者:MrZ 邮箱:1046101471@qq.com", + "程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ", + "使用工具:VScode,GFIE,Beepbox,Goldwave", + "特别感谢:Farter,Teatube,196,Flyz,T830,[所有测试人员]和 你!", + "错误或者建议请附带相关信息发送到作者邮箱~", + }, + support="支持作者", + group="官方QQ群", + ButtonText={ + main={ + play="开始", + setting="设置", + stat="统计信息", + help="帮助", + quit="退出", + }, + mode={ + up="Λ", + down="v", + left="<", + right=">", + start="开始", + custom="自定义(C)", + back="返回", + }, + custom={ + up="Λ", + down="v", + left="<", + right=">", + start1="消除开始", + start2="拼图开始", + draw="画图(D)", + back="返回", + }, + draw={ + block1="■", + block2="■", + block3="■", + block4="■", + block5="■", + block6="■", + block7="■", + gb1="■", + gb2="■", + gb3="■", + gb4="■", + gb5="■", + erase="×", + clear="清空", + back="返回", + }, + play={ + pause="暂停", + }, + pause={ + resume="继续", + quit="退出", + }, + setting={ + ghost=function()return setting.ghost and"阴影:开"or"阴影:关"end, + center=function()return setting.center and"旋转中心:开"or"旋转中心:关"end, + grid=function()return setting.grid and"网格:开"or"网格:关"end, + swap=function()return setting.swap and"目标选择:组合键"or"目标选择:循环"end, + fxs=function()return setting.fxs and"特效:开"or"特效:关"end, + bg=function()return setting.bg and"背景:开"or"背景:关"end, + dasD="-",dasU="+", + arrD="-",arrU="+", + sddasD="-",sddasU="+", + sdarrD="-",sdarrU="+", + sfx=function()return setting.sfx and"音效:开"or"音效:关"end, + bgm=function()return setting.bgm and"音乐:开"or"音乐:关"end, + vib=function()return "震动强度:"..setting.vib end, + fullscreen=function()return setting.fullscreen and"全屏:开"or"全屏:关"end, + bgblock=function()return setting.bgblock and"背景动画:开"or"背景动画:关"end, + frame=function()return"绘制帧:"..setting.frameMul.."%"end, + control="控制设置", + touch="触摸设置", + lang=function()return langName[setting.lang]end, + back="保存&返回", + }, + setting2={ + back="返回", + }, + setting3={ + back="返回", + hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end, + default="默认组合", + snap=function()return text.snapLevelName[snapLevel]end, + alpha=function()return percent0to5[setting.virtualkeyAlpha]end, + icon="图标", + size="大小", + }, + help={ + back="返回", + qq="作者QQ", + }, + stat={ + back="返回", + path="打开存储目录", + }, + }, +}--文全 \ No newline at end of file diff --git a/language/eng.lua b/language/eng.lua index 1fd09fb0..4153b8d3 100644 --- a/language/eng.lua +++ b/language/eng.lua @@ -3,17 +3,15 @@ return{ royale_remain=function(n)return n.." Players Remain"end, cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"}, techrash="Techrash", - techrashB2B="Techrash B2B", - techrashB3B="Techrash B2B2B", + techrashB2B="B2B Techrash", + techrashB3B="B2B2B Techrash", block={"Z","S","L","J","T","O","I"}, - spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"}, clear={" single"," double"," triple"}, - b2b="B2B ", - b3b="B2B2B ", + spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"}, + b2b="B2B ",b3b="B2B2B ", mini="Mini", PC="Perfect Clear", - hold="Hold", - next="Next", + hold="Hold",next="Next", stage={"STAGE 1","STAGE 2","STAGE 3","STAGE 4","STAGE 5",}, maxspeed="Max speed", @@ -22,7 +20,9 @@ return{ win="WIN", lose="LOSE", pause="PAUSE", - + finish="FINISH", + pauseTime="Pause time", + custom="Custom Game", customOption={ drop="Drop delay:", @@ -76,7 +76,7 @@ return{ blind="Invisible board", dig="Downstack!", survivor="Hand them!", - tech="Techniques practice", + tech="Don't do normal clear", pctrain="Let's learn some PCs", pcchallenge="Make PCs in 100 Lines", techmino41="Melee fight with 40 AIs", @@ -104,19 +104,28 @@ return{ "Small DAS&ARR can make you faster,if you can adapt to it", "Have you noticed what does \"rotating\" do to block?", "20G is a brand new game rule", - "Do not play this game in class!", + "Do not play game in class!", + "This game can be very hard,be mentally perpared", + "This in not a casual game", }, stat={ "Games run:", "Games played:", "Game time:", - "Total block used:", - "Total rows cleared:", - "Total lines sent:", "Total key pressed:", "Total rotate:", "Total hold:", + "Total block used:", + "Total rows cleared:", + "Total attack:", + "Total sent:", + "Total receive:", + "Total pend:", + "Total clear:", "Total spin:", + "Total B2B:", + "Total PC:", + "Total Efficiency", }, help={ "I don't think you need \"help\".", diff --git a/list.lua b/list.lua index 8f4b6e57..10f048cb 100644 --- a/list.lua +++ b/list.lua @@ -200,16 +200,16 @@ local virtualkeySet={ {80,320,6400,80},--restart },--Keyboard set { - {1200-360,40,1600,40},--moveLeft + {1200-370,40,1600,40},--moveLeft {1200-280,40,1600,40},--moveRight - {1200-520,40,1600,40},--rotRight - {1200-600,40,1600,40},--rotLeft - {1200-440,40,1600,40},--rotFlip - {1200-40,40,1600,40},--hardDrop - {1200-120,40,1600,40},--softDrop - {1200-200,40,1600,40},--hold - {1200-680,40,1600,40},--func - {1200-760,40,1600,40},--restart + {1200-530,40,1600,40},--rotRight + {1200-610,40,1600,40},--rotLeft + {1200-450,40,1600,40},--rotFlip + {1200-50,40,1600,40},--hardDrop + {1200-130,40,1600,40},--softDrop + {1200-210,40,1600,40},--hold + {1200-690,40,1600,40},--func + {1200-770,40,1600,40},--restart },--PC key feedback } Buttons={ @@ -297,8 +297,8 @@ Buttons={ BGM("blank") end,down="vib",left="sfx"}, vib= {x=850,y=160, w=340,h=60,rgb=color.white, code=function() - setting.vib=(setting.vib+1)%5 - VIB(2) + setting.vib=(setting.vib+1)%6 + VIB(1) end,up="sfx",down="fullscreen",left="swap"}, fullscreen= {x=850,y=230, w=340,h=60,rgb=color.white, code=function() setting.fullscreen=not setting.fullscreen diff --git a/main.lua b/main.lua index d866765e..72352be6 100644 --- a/main.lua +++ b/main.lua @@ -3,7 +3,8 @@ local ms,kb=love.mouse,love.keyboard local fs,sys=love.filesystem,love.system 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 +ins,rem,concat=table.insert,table.remove,table.concat +-- sort=table.sort math.randomseed(os.time()*626) null=function()end @@ -13,9 +14,10 @@ scene="" bgmPlaying=nil curBG="none" -kb.setKeyRepeat(false) -kb.setTextInput(false) -ms.setVisible(false) +local F=false +kb.setKeyRepeat(F) +kb.setTextInput(F) +ms.setVisible(F) local Fonts={} function setFont(s) @@ -36,8 +38,8 @@ gameEnv0={ das=10,arr=2, sddas=0,sdarr=2, ghost=true,center=true, - grid=false,swap=true, - _20G=false,bone=false, + grid=F,swap=true, + _20G=F,bone=F, drop=30,lock=45, wait=0,fall=0, next=6,hold=true,oncehold=true, @@ -45,7 +47,7 @@ gameEnv0={ block=true, keepVisible=true,visible="show", - Fkey=false,puzzle=false,ospin=true, + Fkey=F,puzzle=F,ospin=true, freshLimit=1e99,target=1e99,reach=null, bg="none",bgm="race" } @@ -70,14 +72,14 @@ end --Game system Data setting={ ghost=true,center=true, - grid=false,swap=true, + grid=F,swap=true, fxs=true,bg=true, das=10,arr=2, sddas=0,sdarr=2, sfx=true,bgm=true,vib=3, - fullscreen=false, + fullscreen=F, bgblock=true, lang=1, keyMap={ @@ -117,20 +119,16 @@ setting={ }, virtualkeyAlpha=3, virtualkeyIcon=true, - virtualkeySwitch=false, + virtualkeySwitch=F, frameMul=100, } stat={ - run=0, - game=0, - gametime=0, - piece=0, - row=0, - atk=0, - key=0, - hold=0, - rotate=0, - spin=0, + run=0,game=0,time=0, + key=0,rotate=0,hold=0,piece=0,row=0, + atk=0,send=0,recv=0,pend=0, + clear_1=0,clear_2=0,clear_3=0,clear_4=0, + spin_0=0,spin_1=0,spin_2=0,spin_3=0, + b2b=0,b3b=0,pc=0, } virtualkey={ {80,720-80,6400,80},--moveLeft @@ -150,7 +148,7 @@ virtualkey={ ]] } -virtualkeyDown={false,false,false,false,false,false,false,false,false,false,false,false,false} +virtualkeyDown={F,F,F,F,F,F,F,F,F,F,F,F,F} virtualkeyPressTime={0,0,0,0,0,0,0,0,0,0,0,0,0} --User Data&User Setting require"toolfunc" @@ -172,6 +170,6 @@ if fs.getInfo("usersetting")then loadSetting() elseif system=="Android" or system=="iOS"then setting.virtualkeySwitch=true - setting.swap=false + setting.swap=F end swapLanguage(setting.lang) \ No newline at end of file diff --git a/paint.lua b/paint.lua index 6fcee4f3..1c517642 100644 --- a/paint.lua +++ b/paint.lua @@ -37,7 +37,48 @@ local modeLevelColor={ ["400L"]=color.red, ["1000L"]=color.darkRed, } - +local dataOptL={ + "key","rotate","hold","piece","row", + "atk","send","recv","pend", +} +local function dataOpt(i) + local stat=players[1].stat + if i<10 then + return stat[dataOptL[i]] + elseif i==10 then + return stat.clear_1.."/"..stat.clear_2.."/"..stat.clear_3.."/"..stat.clear_4 + elseif i==11 then + return "["..stat.spin_0.."]/"..stat.spin_1.."/"..stat.spin_2.."/"..stat.spin_3 + elseif i==12 then + return stat.b2b.."[+"..stat.b3b.."]" + elseif i==13 then + return stat.pc + elseif i==14 then + return format("%0.2f",stat.atk/stat.row) + end +end +local statOptL={ + "run","game",nil, + "key","rotate","hold","piece","row", + "atk","send","recv","pend", +} +local function statOpt(i) + if i<13 and i~=3 then + return stat[statOptL[i]] + elseif i==3 then + return format("%0.1fHr",stat.time*2.78e-4) + elseif i==13 then + return stat.clear_1.."/"..stat.clear_2.."/"..stat.clear_3.."/"..stat.clear_4 + elseif i==14 then + return "["..stat.spin_0.."]/"..stat.spin_1.."/"..stat.spin_2.."/"..stat.spin_3 + elseif i==15 then + return stat.b2b.."[+"..stat.b3b.."]" + elseif i==16 then + return stat.pc + elseif i==17 then + return format("%0.2f",stat.atk/stat.row) + end +end local miniTitle_rect={ {2,0,5,1},{4,1,1,6}, {9,0,4,1},{9,3,4,1},{9,6,4,1},{8,0,1,7}, @@ -232,6 +273,22 @@ function Pnt.BG.game3() gc.setColor(.6,.6,1) gc.draw(background1,640,360,Timer()*.25,12,nil,64,64) end +function Pnt.BG.game4() + gc.setColor(.1,.5,.5) + local x=Timer()%4*320 + gc.draw(background2,x,0,nil,10) + gc.draw(background2,x-1280,0,nil,10) +end +function Pnt.BG.game5() + local t=2.5-Timer()%20%6%2.5 + if t<.5 then + gc.clear(t,t,t) + else + gc.clear(0,0,0) + end +end +function Pnt.BG.game6() +end function Pnt.BG.rgb() gc.clear( sin(Timer()*1.2)*.15+.5, @@ -288,7 +345,7 @@ function Pnt.main() gc.setColor(1,1,1) gc.draw(titleImage,300,30) setFont(30) - gc.print("Alpha V0.7.16",290,140) + gc.print("Alpha V0.7.17",290,140) gc.print(system,800,110) end function Pnt.mode() @@ -408,7 +465,7 @@ function Pnt.play() gc.translate(P.x,P.y)gc.scale(P.size)--Position gc.setColor(0,0,0,.6)gc.rectangle("fill",0,0,600,690)--Background gc.setLineWidth(7) - gc.setColor(frameColor[P.strength])gc.rectangle("line",0,0,600,690)--Big frame + gc.setColor(frameColor[P.strength])gc.rectangle("line",0,0,600,690,5)--Big frame gc.translate(150,70) if P.gameEnv.grid then gc.setLineWidth(1) @@ -569,7 +626,7 @@ function Pnt.play() gc.setColor(1,1,1) setFont(35) - mStr(format("%.2f",P.time),-82,520)--Draw time + mStr(format("%.2f",P.stat.time),-82,520)--Draw time if mesDisp[curMode.id]then mesDisp[curMode.id]()end--Draw other message gc.setColor(1,1,1) @@ -621,17 +678,27 @@ function Pnt.play() end function Pnt.pause() Pnt.play() - gc.setColor(0,0,0,pauseTime*.015) + gc.setColor(0,0,0,pauseTimer*.015) gc.rectangle("fill",0,0,1280,720) + gc.setColor(1,1,1,pauseTimer*.02) + setFont(30) + gc.print(text.pauseTime..":["..pauseCount.."] "..format("%0.2f",pauseTime).."s",40,280) + setFont(40) + for i=1,7 do + gc.print(text.stat[i+3],40,40*i+285) + gc.print(dataOpt(i),400,40*i+285) + end + for i=8,14 do + gc.print(text.stat[i+3],810,40*i+5) + gc.print(dataOpt(i),1060,40*i+5) + end if system~="Android"then - setFont(40) - gc.setColor(1,1,1,pauseTime*.02) mStr(text.space.."/"..text.enter,640,300) gc.print("ESC",610,598) end - setFont(120) gc.setColor(1,1,1) - mStr(text.pause,640,140-12*(5-pauseTime*.1)^2) + setFont(120) + mStr(gamefinished and text.finish or text.pause,640,140-12*(5-pauseTimer*.1)^2) end function Pnt.setting() gc.setColor(1,1,1) @@ -706,18 +773,11 @@ function Pnt.help() mStr(text.group,1170,210) end function Pnt.stat() - setFont(35) + setFont(28) gc.setColor(1,1,1) - for i=1,10 do gc.print(text.stat[i],350,20+40*i)end - gc.print(stat.run,650,60) - gc.print(stat.game,650,100) - gc.print(format("%0.1fhr",stat.gametime*2.78e-4),650,140) - gc.print(stat.piece,650,180) - gc.print(stat.row,650,220) - gc.print(stat.atk,650,260) - gc.print(stat.key,650,300) - gc.print(stat.rotate,650,340) - gc.print(stat.hold,650,380) - gc.print(stat.spin,650,420) + for i=1,17 do + gc.print(text.stat[i],400,30*i-5) + gc.print(statOpt(i),720,30*i-5) + end gc.draw(titleImage,260,570,.2+.07*sin(Timer()*3),.8,nil,250,60) end \ No newline at end of file diff --git a/timer.lua b/timer.lua index 945d0377..455a8708 100644 --- a/timer.lua +++ b/timer.lua @@ -51,7 +51,7 @@ function Tmr.draw() end function Tmr.play(dt) frame=frame+1 - stat.gametime=stat.gametime+dt + stat.time=stat.time+dt for i=#FX.beam,1,-1 do local b=FX.beam[i] @@ -97,7 +97,7 @@ function Tmr.play(dt) end--Counting,include pre-das,directy RETURN for p=1,#players do P=players[p] - if P.timing then P.time=P.time+dt end + if P.timing then P.stat.time=P.stat.time+dt end if P.alive then if not P.small then local v=0 @@ -125,9 +125,9 @@ function Tmr.play(dt) else AI_getControls(P.ai.controls) P.ai.controlDelay=P.ai.controlDelay0+2 - if Timer()-P.cstat.point>P.cstat.event then - P.cstat.point=Timer() - P.cstat.event=P.ai.controlDelay0+rnd(2,10) + if Timer()-P.modeData.point>P.modeData.event then + P.modeData.point=Timer() + P.modeData.event=P.ai.controlDelay0+rnd(2,10) changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.35 and 2 or 3) end end @@ -211,8 +211,8 @@ function Tmr.play(dt) --Alive else if not P.small then - P.keySpeed=P.keySpeed*.96+P.cstat.key/P.time*60*.04 - P.dropSpeed=P.dropSpeed*.96+P.cstat.piece/P.time*60*.04 + P.keySpeed=P.keySpeed*.96+P.stat.key/P.stat.time*60*.04 + P.dropSpeed=P.dropSpeed*.96+P.stat.piece/P.stat.time*60*.04 --Final average speeds if modeEnv.royaleMode then P.swappingAtkMode=min(P.swappingAtkMode+2,30) @@ -277,7 +277,10 @@ function Tmr.play(dt) if modeEnv.royaleMode and frame%120==0 then freshMostDangerous()end end function Tmr.pause(dt) - if not wd.isMinimized()and pauseTime<50 then - pauseTime=pauseTime+1 + if not gamefinished then + pauseTime=pauseTime+dt + end + if pauseTimer<50 and not wd.isMinimized()then + pauseTimer=pauseTimer+1 end end \ No newline at end of file diff --git a/toolfunc.lua b/toolfunc.lua index dd46e2c3..50a48653 100644 --- a/toolfunc.lua +++ b/toolfunc.lua @@ -14,7 +14,7 @@ local function splitS(s,sep) return t end function mStr(s,x,y) - gc.printf(s,x-300,y,600,"center") + gc.printf(s,x-320,y,640,"center") end function getNewRow(val) @@ -36,8 +36,8 @@ function removeRow(t,k) end --Single-usage funcs -langName={"中文","English"} -local langID={"chi","eng"} +langName={"中文","全中文","English"} +local langID={"chi","chi_full","eng"} function swapLanguage(l) text=require("language/"..langID[l]) Buttons.sel=nil @@ -66,7 +66,7 @@ function swapLanguage(l) collectgarbage() end -local vibrateLevel={0,0,.03,.04,.05,.07,.9} +local vibrateLevel={0,.02,.03,.04,.05,.06,.07,.08} function VIB(t) if setting.vib>0 then love.system.vibrate(vibrateLevel[setting.vib+t]) @@ -175,6 +175,12 @@ function gotoScene(s,style) end end end +function updateStat() + for k,v in next,players[1].stat do + print(k) + stat[k]=stat[k]+v + end +end local prevMenu={ load=love.event.quit, intro="quit", @@ -187,13 +193,11 @@ local prevMenu={ end, ready="mode", play=function() + updateStat() clearTask("play") gotoScene(curMode.id~="custom"and"mode"or"custom","deck") end, - pause=function() - clearTask("play") - gotoScene(curMode.id~="custom"and"mode"or"custom","deck") - end, + pause=null, help="main", stat="main", setting=function() @@ -202,7 +206,7 @@ local prevMenu={ end, setting2="setting", setting3="setting", -} +}prevMenu.pause=prevMenu.play function back() local t=prevMenu[scene] if type(t)=="string"then @@ -212,7 +216,11 @@ function back() end end function pauseGame() - if bgmPlaying then bgm[bgmPlaying]:pause()end + pauseTimer=0--Pause timer for animation + if not gamefinished then + pauseCount=pauseCount+1 + if bgmPlaying then bgm[bgmPlaying]:pause()end + end for i=1,#players.alive do local l=players.alive[i].keyPressing for j=1,#l do @@ -228,16 +236,12 @@ function resumeGame() gotoScene("play","fade") end local dataOpt={ - "run", - "game", - "gametime", - "piece", - "row", - "atk", - "key", - "rotate", - "hold", - "spin", + "run","game","time", + "key","rotate","hold","piece","row", + "atk","send","recv","pend", + "clear_1","clear_2","clear_3","clear_4", + "spin_0","spin_1","spin_2","spin_3", + "b2b","b3b","pc", } local saveOpt={ "ghost","center", @@ -268,10 +272,15 @@ function loadData() if find(i,"=")then local t=sub(i,1,find(i,"=")-1) local v=sub(i,find(i,"=")+1) - if t=="run"or t=="game"or t=="gametime"or t=="piece"or t=="row"or t=="atk"or t=="key"or t=="rotate"or t=="hold"or t=="spin"then + if t=="gametime"then t="time"end + for i=1,#dataOpt do + if t==dataOpt[i]then goto L end + end + goto E + ::L:: v=toN(v)if not v or v<0 then v=0 end stat[t]=v - end + ::E:: end end end @@ -280,7 +289,7 @@ function saveData() for i=1,#dataOpt do ins(t,dataOpt[i].."="..toS(stat[dataOpt[i]])) end - t=table.concat(t,"\r\n") + t=concat(t,"\r\n") --t=love.math.compress(t,"zlib"):getString() userData:open("w") userData:write(t) @@ -299,7 +308,7 @@ function loadSetting() if t=="sfx"or t=="bgm"or t=="bgblock"then setting[t]=v=="true" elseif t=="vib"then - setting.vib=toN(v:match("[01234]"))or 0 + setting.vib=toN(v:match("[012345]"))or 0 elseif t=="fullscreen"then setting.fullscreen=v=="true" love.window.setFullscreen(setting.fullscreen) @@ -348,7 +357,7 @@ function loadSetting() elseif t=="ghost"or t=="center"or t=="grid"or t=="swap"or t=="fxs"or t=="bg"then setting[t]=v=="true" elseif t=="lang"then - setting[t]=toN(v:match("[12]"))or 1 + setting[t]=toN(v:match("[123]"))or 1 end end end @@ -359,25 +368,25 @@ function saveSetting() for j=1,4 do virtualkey[i][j]=int(virtualkey[i][j]+.5) end--Saving a integer is better? - vk[i]=table.concat(virtualkey[i],",") + vk[i]=concat(virtualkey[i],",") end--pre-pack virtualkey setting local map={} for i=1,16 do - map[i]=table.concat(setting.keyMap[i],",") + map[i]=concat(setting.keyMap[i],",") end local lib={} for i=1,4 do - lib[i]=table.concat(setting.keyLib[i],",") + lib[i]=concat(setting.keyLib[i],",") end local t={ - "keymap="..toS(table.concat(map,"/")), - "keylib="..toS(table.concat(lib,"/")), - "virtualkey="..toS(table.concat(vk,"/")), + "keymap="..toS(concat(map,"/")), + "keylib="..toS(concat(lib,"/")), + "virtualkey="..toS(concat(vk,"/")), } for i=1,#saveOpt do ins(t,saveOpt[i].."="..toS(setting[saveOpt[i]])) end - t=table.concat(t,"\r\n") + t=concat(t,"\r\n") --t=love.math.compress(t,"zlib"):getString() userSetting:open("w") userSetting:write(t)