From 7e2af7fe2e51b9dd9868430366b7cec2a6d8837a Mon Sep 17 00:00:00 2001 From: MrZ626 <1046101471@qq.com> Date: Mon, 31 Aug 2020 16:41:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E5=9C=BA=E6=99=AF=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=95=B4=E5=90=88=E5=88=B0scenes.lua?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Zframework/init.lua | 9 +- Zframework/paint.lua | 922 ------------------------ Zframework/scene.lua | 333 +-------- Zframework/timer.lua | 362 ---------- main.lua | 1 + parts/scenes.lua | 1635 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 1642 insertions(+), 1620 deletions(-) delete mode 100644 Zframework/paint.lua delete mode 100644 Zframework/timer.lua create mode 100644 parts/scenes.lua diff --git a/Zframework/init.lua b/Zframework/init.lua index ffaf2f92..5b79bbc6 100644 --- a/Zframework/init.lua +++ b/Zframework/init.lua @@ -16,8 +16,6 @@ WIDGET= require("Zframework/widget") Widgets=require("Zframework/widgetList") LIGHT= require("Zframework/light") SCN= require("Zframework/scene") -local Tmr=require("Zframework/timer") -local Pnt=require("Zframework/paint") local ms,kb,tc=love.mouse,love.keyboard,love.touch local gc,sys=love.graphics,love.system @@ -200,16 +198,15 @@ function keyDown.calculator(k) elseif S.val==34494 then error("This is an error testing message.") elseif S.val==114 then - S.val=514 + S.reg=514 elseif S.val==114514 then S.reg=1919810 - S.val=114514 elseif S.val==1145141919810 then error("小鬼自裁请") elseif S.val==123456789 then S.reg=123456789 S.val=987654321 - elseif S.val==152435 or S.val==81524 then + elseif S.val==152435 or S.val==81524 or S.val==815 or S.val==1524 or S.val==2435 then SCN.go("p15") end end @@ -268,7 +265,7 @@ local function tapBoard(x,y,key) local S=sceneTemp if S.state<2 then if not key then - sysFX.newRipple(.2,x,y,13) + sysFX.newRipple(.16,x,y,10) x,y=int((x-320)/160)+1,int((y-40)/160)+1 end local b=S.board diff --git a/Zframework/paint.lua b/Zframework/paint.lua deleted file mode 100644 index af1a519e..00000000 --- a/Zframework/paint.lua +++ /dev/null @@ -1,922 +0,0 @@ -local gc=love.graphics -local setFont=setFont -local int,ceil,rnd,abs=math.floor,math.ceil,math.random,math.abs -local max,min,sin,cos=math.max,math.min,math.sin,math.cos -local format=string.format - -local Timer=love.timer.getTime -local mStr=mStr -local scr=scr -local scs=require("parts/spinCenters") -local modeRankColor={ - color.dRed, --D - color.dOrange, --C - color.lYellow, --B - color.lBlue, --A - color.lCyan, --S - color.lGreen, --Special -} -local rankString={ - "D","C","B","A","S", -} -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}, - {15,0,3,1},{15,6,3,1},{14,0,1,7}, - {19,0,1,7},{23,0,1,7},{20,3,3,1}, - {0,8,1,6},{6,8,1,6},{1,9,1,1},{2,10,1,1},{3,11,1,1},{4,10,1,1},{5,9,1,1}, - {8,8,5,1},{8,13,5,1},{10,9,1,4}, - {14,8,1,6},{19,8,1,6},{15,9,1,1},{16,10,1,1},{17,11,1,1},{18,12,1,1}, - {21,8,5,1},{21,13,5,1},{21,9,1,4},{25,9,1,4}, -} -FX_attack={}--Attack beam -FX_badge={}--Badge thrown -local function drawAtkPointer(x,y) - local t=sin(Timer()*20) - gc.setColor(.2,.7+t*.2,1,.6+t*.4) - gc.circle("fill",x,y,25,6) - local a=Timer()*3%1*.8 - gc.setColor(0,.6,1,.8-a) - gc.circle("line",x,y,30*(1+a),6) -end -local function VirtualkeyPreview() - if setting.VKSwitch then - for i=1,#VK_org do - local B=VK_org[i] - if B.ava then - local c=sceneTemp.sel==i and .6 or 1 - gc.setColor(c,1,c,setting.VKAlpha) - gc.setLineWidth(B.r*.07) - gc.circle("line",B.x,B.y,B.r,10) - if setting.VKIcon then gc.draw(TEXTURE.VKIcon[i],B.x,B.y,nil,B.r*.025,nil,18,18)end - end - end - end -end -local function drawVirtualkey() - local V=virtualkey - local a=setting.VKAlpha - local _ - if setting.VKIcon then - local icons=TEXTURE.VKIcon - for i=1,#V do - if V[i].ava then - local B=V[i] - gc.setColor(1,1,1,a) - gc.setLineWidth(B.r*.07) - gc.circle("line",B.x,B.y,B.r,10)--Button outline - _=V[i].pressTime - gc.draw(icons[i],B.x,B.y,nil,B.r*.026+_*.08,nil,18,18)--Icon - if _>0 then - gc.setColor(1,1,1,a*_*.08) - gc.circle("fill",B.x,B.y,B.r*.94,10)--Glow - gc.circle("line",B.x,B.y,B.r*(1.4-_*.04),10)--Ripple - end - end - end - else - for i=1,#V do - if V[i].ava then - local B=V[i] - gc.setColor(1,1,1,a) - gc.setLineWidth(B.r*.07) - gc.circle("line",B.x,B.y,B.r,10) - _=V[i].pressTime - if _>0 then - gc.setColor(1,1,1,a*_*.08) - gc.circle("fill",B.x,B.y,B.r*.94,10) - gc.circle("line",B.x,B.y,B.r*(1.4-_*.04),10) - end - end - end - end -end - -local Pnt={} - -function Pnt.calculator() - local S=sceneTemp - gc.setLineWidth(4) - gc.rectangle("line",100,80,650,150) - setFont(45) - if S.reg then gc.printf(S.reg,0,100,720,"right")end - if S.val then gc.printf(S.val,0,150,720,"right")end - - if S.sym then setFont(50)gc.print(S.sym,126,150)end - if S.pass then setFont(40)mStr(S.tip,640,10)end -end - -local cellColor={ - color.lRed,color.lRed,color.lRed,color.lRed, - color.lBlue,color.lGreen,color.lGreen,color.lGreen, - color.lBlue,color.lYellow,color.lPurple,color.lPurple, - color.lBlue,color.lYellow,color.lPurple,color.lPurple, -} -local backColor={ - color.dRed,color.dRed,color.dRed,color.dRed, - color.dBlue,color.dGreen,color.dGreen,color.dGreen, - color.dBlue,color.dYellow,color.dPurple,color.dPurple, - color.dBlue,color.dYellow,color.dPurple,color.dPurple, -} -function Pnt.p15() - local S=sceneTemp - - setFont(40) - gc.print(format("%.3f",S.time),1000,50) - gc.print(S.move,1000,100) - - if S.state==1 then gc.setColor(.9,.9,.9) --game - elseif S.state==0 then gc.setColor(.2,.8,.2)--ready - elseif S.state==2 then gc.setColor(.9,.9,0) --win - end - gc.setLineWidth(10) - gc.rectangle("line",313,33,654,654,18) - - gc.setLineWidth(4) - local x,y=S.x,S.y - setFont(80) - for i=1,4 do - for j=1,4 do - if x~=j or y~=i then - local N=S.board[i][j] - if S.color and not(S.blind and S.state==1)then - gc.setColor(backColor[N]) - gc.rectangle("fill",j*160+163,i*160-117,154,154,8) - gc.setColor(cellColor[N]) - gc.rectangle("line",j*160+163,i*160-117,154,154,8) - else - gc.setColor(.3,.3,.3) - gc.rectangle("fill",j*160+163,i*160-117,154,154,8) - gc.setColor(1,1,1) - gc.rectangle("line",j*160+163,i*160-117,154,154,8) - end - if not(S.blind and S.state==1)then - gc.setColor(.1,.1,.1) - mStr(N,j*160+240,i*160-96) - mStr(N,j*160+242,i*160-98) - gc.setColor(1,1,1) - mStr(N,j*160+243,i*160-95) - end - end - end - end - gc.setColor(.3,.3,.3) - gc.setLineWidth(10) - gc.rectangle("line",x*160+173,y*160-107,134,134,50) -end -function Pnt.load() - local S=sceneTemp - gc.setLineWidth(4) - gc.setColor(1,1,1,.5) - gc.rectangle("fill",300,330,S.cur/S.tar*680,60,5) - gc.setColor(1,1,1) - gc.rectangle("line",300,330,680,60,5) - if not setting.appLock then - setFont(35) - gc.print(text.load[S.phase],340,335) - if S.phase~=0 then - gc.printf(S.cur.."/"..S.tar,795,335,150,"right") - end - setFont(25) - mStr(S.tip,640,400) - end -end - -local titleTransform={ - function(t) - gc.translate(0,max(50-t,0)^2/25) - end, - function(t) - gc.translate(0,-max(50-t,0)^2/25) - end, - function(t,i) - local d=max(50-t,0) - gc.translate(sin(Timer()*3+626*i)*d,cos(Timer()*3+626*i)*d) - end, - function(t,i) - local d=max(50-t,0) - gc.translate(sin(Timer()*3+626*i)*d,-cos(Timer()*3+626*i)*d) - end, - function(t) - gc.setColor(1,1,1,min(t*.02,1)+rnd()*.2) - end, -} -function Pnt.intro() - local S=sceneTemp - local t=S.t1 - local T=(t+110)%300 - if T<30 then - gc.setLineWidth(4+(30-T)^1.626/62) - else - gc.setLineWidth(4) - end - local L=title - gc.push("transform") - gc.translate(126,226) - for i=1,8 do - local T=t-i*15 - if T>0 then - gc.push("transform") - gc.setColor(1,1,1,min(T*.025,1)) - titleTransform[S.r[i]](T,i) - local dt=(t+62-5*i)%300 - if dt<20 then - gc.translate(0,abs(10-dt)-10) - end - gc.polygon("line",L[i]) - gc.pop() - end - end - gc.pop() - t=S.t2 - if t>=80 then - gc.setColor(1,1,1,.6+sin((t-80)*.0626)*.3) - mText(drawableText.anykey,640,615+sin(Timer()*3)*5) - end -end -function Pnt.main() - gc.setColor(1,1,1) - gc.draw(IMG.title_color,60,30,nil,1.3) - setFont(30) - gc.print(gameVersion,70,125) - gc.print(system,610,100) - local L=text.modes[stat.lastPlay] - setFont(25) - gc.print(L[1],700,470) - gc.print(L[2],700,500) - players[1]:draw() -end -function Pnt.mode() - local _ - local cam=mapCam - gc.push("transform") - gc.translate(640,360) - gc.scale(cam.zoomK) - gc.translate(-cam.x1,-cam.y1) - gc.scale(cam.k1) - local R=modeRanks - local sel=cam.sel - setFont(30) - - --Draw lines connecting modes - gc.setLineWidth(8) - gc.setColor(1,1,1,.2) - for name,M in next,Modes do - if R[name]then - for _=1,#M.unlock do - local m=Modes[M.unlock[_]] - gc.line(M.x,M.y,m.x,m.y) - end - end - end - - for name,M in next,Modes do - if R[name]then - local S=M.size - local d=((M.x-(cam.x1+(sel and -180 or 0))/cam.k1)^2+(M.y-cam.y1/cam.k1)^2)^.55 - if d<500 then S=S*(1.25-d*0.0005) end - local c=modeRankColor[R[M.name]] - if c then - gc.setColor(c) - else - c=.5+sin(Timer()*6.26)*.2 - S=S*(.9+c*.4) - gc.setColor(c,c,c) - end - if M.shape==1 then--Rectangle - gc.rectangle("fill",M.x-S,M.y-S,2*S,2*S) - if sel==name then - gc.setColor(1,1,1) - gc.setLineWidth(10) - gc.rectangle("line",M.x-S+5,M.y-S+5,2*S-10,2*S-10) - end - elseif M.shape==2 then--Diamond - gc.circle("fill",M.x,M.y,S+5,4) - if sel==name then - gc.setColor(1,1,1) - gc.setLineWidth(10) - gc.circle("line",M.x,M.y,S+5,4) - end - elseif M.shape==3 then--Octagon - gc.circle("fill",M.x,M.y,S,8) - if sel==name then - gc.setColor(1,1,1) - gc.setLineWidth(10) - gc.circle("line",M.x,M.y,S,8) - end - end - name=drawableText[rankString[R[M.name]]] - if name then - gc.setColor(0,0,0,.26) - mDraw(name,M.x,M.y) - end - --[[ - if M.icon then - local i=M.icon - local l=i:getWidth()*.5 - local k=S/l*.8 - gc.setColor(0,0,0,2) - gc.draw(i,M.x-1,M.y-1,nil,k,nil,l,l) - gc.draw(i,M.x-1,M.y+1,nil,k,nil,l,l) - gc.draw(i,M.x+1,M.y-1,nil,k,nil,l,l) - gc.draw(i,M.x+1,M.y+1,nil,k,nil,l,l) - gc.setColor(1,1,1) - gc.draw(i,M.x,M.y,nil,k,nil,l,l) - end - ]] - end - end - gc.pop() - if sel then - local M=Modes[sel] - local lang=setting.lang - gc.setColor(.7,.7,.7,.5) - gc.rectangle("fill",920,0,360,720)--Info board - gc.setColor(M.color) - setFont(40)mStr(text.modes[sel][1],1100,5) - setFont(30)mStr(text.modes[sel][2],1100,50) - gc.setColor(1,1,1) - setFont(28)gc.printf(text.modes[sel][3],920,110,360,"center") - if M.slowMark then - gc.draw(IMG.ctrlSpeedLimit,1230,50,nil,.4) - end - if M.score then - mText(drawableText.highScore,1100,240) - gc.setColor(.4,.4,.4,.8) - gc.rectangle("fill",940,290,320,280)--Highscore board - local L=M.records - gc.setColor(1,1,1) - if L[1]then - for i=1,#L do - local t=M.scoreDisp(L[i]) - local s=#t - local dy - if s<15 then dy=0 - elseif s<25 then dy=2 - else dy=4 - end - setFont(int(26-s*.4)) - gc.print(t,955,275+dy+25*i) - setFont(10) - _=L[i].date - if _ then gc.print(_,1155,284+25*i)end - end - else - mText(drawableText.noScore,1100,370) - end - end - end - if cam.keyCtrl then - gc.setColor(1,1,1) - gc.draw(TEXTURE.mapCross,460-20,360-20) - end -end -function Pnt.music() - gc.setColor(1,1,1,.3+sin(Timer()*5)*.2) - gc.rectangle("fill",45,98+30*sceneTemp,250,30) - gc.setColor(.7,.7,.7)gc.draw(drawableText.musicRoom,20,20) - gc.setColor(1,1,1)gc.draw(drawableText.musicRoom,22,23) - gc.draw(drawableText.nowPlaying,490,390) - setFont(30) - for i=1,BGM.len do - gc.print(BGM.list[i],50,90+30*i) - end - gc.draw(IMG.title,640,310,nil,1.5,nil,206,35) - if BGM.nowPlay then - setFont(45) - gc.setColor(sin(Timer()*.5)*.2+.8,sin(Timer()*.7)*.2+.8,sin(Timer())*.2+.8) - mStr(BGM.nowPlay,630,460) - local t=-Timer()%2.3/2 - if t<1 then - gc.setColor(1,1,1,t) - gc.draw(IMG.title_color,640,310,nil,1.5+.1-.1*t,1.5+.3-.3*t,206,35) - end - end -end -function Pnt.custom() - gc.setColor(1,1,1,.3+sin(Timer()*8)*.2) - gc.rectangle("fill",100,115+40*sceneTemp,570,40) - gc.setColor(.7,.7,.7)gc.draw(drawableText.custom,360,20) - gc.setColor(1,1,1)gc.draw(drawableText.custom,362,23) - setFont(35) - for i=1,#customID do - local k=customID[i] - local y=110+40*i - gc.printf(text.customOption[k],100,y,320,"right") - if text.customVal[k]then - gc.print(text.customVal[k][customSel[i]],440,y) - else - gc.print(customRange[k][customSel[i]],440,y) - end - end -end -function Pnt.sequence() - local S=sceneTemp - gc.setColor(.7,.7,.7)gc.draw(drawableText.sequence,120,-15) - gc.setColor(1,1,1)gc.draw(drawableText.sequence,122,-12) - gc.setLineWidth(4) - gc.rectangle("line",100,100,1080,260) - setFont(30) - local bag=preBag - local len=#bag - - setFont(40) - gc.print(len,120,300) - - local L=TEXTURE.miniBlock - local lib=SKIN.libColor - local set=setting.skin - - local x,y=120,126 - local cx,cy=120,126 - for i=1,len do - local B=L[bag[i]] - gc.setColor(lib[set[bag[i]]]) - gc.draw(B,x,y,nil,15,15,0,B:getHeight()*.5) - x=x+B:getWidth()*15+10 - if x>1126 then - x,y=120,y+50 - end - if i==S.cur then - cx,cy=x,y - end - end - - gc.setColor(.5,1,.5,.6+.4*sin(Timer()*6.26)) - gc.line(cx-5,cy-20,cx-5,cy+20) - - --Confirm reset - if S.sure>0 then - gc.setColor(1,1,1,S.sure*.02) - gc.draw(drawableText.question,980,470) - end -end -function Pnt.draw() - local sx,sy=sceneTemp.x,sceneTemp.y - gc.translate(200,60) - gc.setColor(1,1,1,.2) - gc.setLineWidth(1) - for x=1,9 do gc.line(30*x,0,30*x,600)end - for y=0,19 do gc.line(0,30*y,300,30*y)end - gc.setColor(1,1,1) - gc.setLineWidth(3) - gc.rectangle("line",-2,-2,304,604) - gc.setLineWidth(2) - local cross=puzzleMark[-1] - for y=1,20 do for x=1,10 do - local B=preField[y][x] - if B>0 then - gc.draw(blockSkin[B],30*x-30,600-30*y) - elseif B==-1 and not sceneTemp.demo then - gc.draw(cross,30*x-30,600-30*y) - end - end end - if sx and sy then - gc.setLineWidth(2) - gc.rectangle("line",30*sx-30,600-30*sy,30,30) - end - gc.translate(-200,-60) - - --Pen - local pen=sceneTemp.pen - if pen>0 then - gc.setLineWidth(13) - gc.setColor(SKIN.libColor[pen]) - gc.rectangle("line",565,460,70,70) - elseif pen==-1 then - gc.setLineWidth(5) - gc.setColor(.9,.9,.9) - gc.line(575,470,625,520) - gc.line(575,520,625,470) - end - - --Confirm reset - if sceneTemp.sure>0 then - gc.setColor(1,1,1,sceneTemp.sure*.02) - gc.draw(drawableText.question,1040,430) - end - - --Block name - setFont(40) - local _ - for i=1,7 do - _=setting.skin[i] - gc.setColor(SKIN.libColor[_]) - mStr(text.block[i],500+65*_,65) - end -end -function Pnt.play() - if marking then - setFont(26) - local t=Timer() - gc.setColor(1,1,1,.2+.1*(sin(3*t)+sin(2.6*t))) - mStr(text.marking,190,60+26*sin(t)) - end - for p=1,#players do - players[p]:draw() - end - - gc.setLineWidth(5) - for i=1,#FX_attack do - local A=FX_attack[i] - gc.push("transform") - local a=(A.t<10 and A.t*.05 or A.t>50 and 6-A.t*.1 or 1)*A.a - gc.setColor(A.r,A.g,A.b,a*.5) - gc.circle("line",0,0,A.rad,A.corner) - local L=A.drag - local len=#L - for i=1,len,2 do - gc.setColor(A.r,A.g,A.b,.4*a*i/len) - gc.translate(L[i],L[i+1]) - gc.rotate(A.t*.1) - gc.circle("fill",0,0,A.rad,A.corner) - gc.rotate(-A.t*.1) - gc.translate(-L[i],-L[i+1]) - end - gc.setColor(A.r,A.g,A.b,a) - gc.translate(A.x,A.y) - gc.rotate(A.t*.1) - gc.circle("fill",0,0,A.rad,A.corner) - gc.pop() - end - - gc.setColor(1,1,1) - if setting.VKSwitch then drawVirtualkey()end - - if modeEnv.royaleMode then - for i=1,#FX_badge do - local b=FX_badge[i] - gc.setColor(1,1,1,b.t<10 and b.t*.1 or b.t<50 and 1 or(60-b.t)*.1) - if b.t<10 then - gc.draw(IMG.badgeIcon,b[1]-14,b[2]-14) - elseif b.t<50 then - local t=((b.t-10)*.025)t=(3-2*t)*t*t - gc.draw(IMG.badgeIcon,b[1]*(1-t)+b[3]*t-14,b[2]*(1-t)+b[4]*t-14) - else - gc.draw(IMG.badgeIcon,b[3]-14,b[4]-14) - end - end - local P=players[1] - gc.setLineWidth(5) - gc.setColor(.8,1,0,.2) - for i=1,#P.atker do - local p=P.atker[i] - gc.line(p.centerX,p.centerY,P.x+300*P.size,P.y+670*P.size) - end - if P.atkMode~=4 then - if P.atking then drawAtkPointer(P.atking.centerX,P.atking.centerY)end - else - for i=1,#P.atker do - local p=P.atker[i] - drawAtkPointer(p.centerX,p.centerY) - end - end - end - - --Mode info - gc.setColor(1,1,1,.8) - gc.draw(drawableText.modeName,485,10) - gc.draw(drawableText.levelName,511+drawableText.modeName:getWidth(),10) - - --Replaying - if game.replaying then - gc.setColor(1,1,Timer()%1>.5 and 1 or 0) - mText(drawableText.replaying,410,17) - end - - --Warning - gc.push("transform") - gc.origin() - if restartCount>0 then - gc.setColor(0,0,0,restartCount*.05) - gc.rectangle("fill",0,0,scr.W,scr.H) - end - if game.warnLVL>0 then - gc.setColor(0,0,0,0) - SHADER.warning:send("level",game.warnLVL) - gc.setShader(SHADER.warning) - gc.rectangle("fill",0,0,scr.w,scr.h) - gc.setShader() - end - gc.pop() -end - -local hexList={1,0,.5,1.732*.5,-.5,1.732*.5}for i=1,6 do hexList[i]=hexList[i]*150 end -local textPos={90,131,-90,131,-200,-25,-90,-181,90,-181,200,-25} -local dataPos={90,143,-90,143,-200,-13,-90,-169,90,-169,200,-13} -function Pnt.pause() - local S=sceneTemp - local T=S.timer*.02 - if T<1 or game.result then Pnt.play()end - --Dark BG - local _=T - if game.result then _=_*.7 end - gc.setColor(.15,.15,.15,_) - gc.push("transform") - gc.origin() - gc.rectangle("fill",0,0,scr.W,scr.H) - gc.pop() - - --Pause Info - setFont(25) - if game.pauseCount>0 then - gc.setColor(1,.4,.4,T) - gc.print(text.pauseCount..":["..game.pauseCount.."] "..format("%.2f",game.pauseTime).."s",70,100) - end - - gc.setColor(1,1,1,T) - - --Mode Info - _=drawableText.modeName - gc.draw(_,40,170) - gc.draw(drawableText.levelName,60+_:getWidth(),170) - - --Result Text - setFont(35) - mText(game.result and drawableText[game.result]or drawableText.pause,640,50-10*(5-sceneTemp.timer*.1)^1.5) - - --Infos - if game.frame>180 then - _=S.list - setFont(26) - for i=1,10 do - gc.print(text.pauseStat[i],40,210+40*i) - gc.printf(_[i],195,210+40*i,300,"right") - end - end - - --Radar Chart - if T>.5 and game.frame>180 then - T=T*2-1 - gc.setLineWidth(2) - gc.push("transform") - gc.translate(1026,400) - - --Polygon - gc.push("transform") - gc.scale((3-2*T)*T) - gc.setColor(1,1,1,T*(.5+.3*sin(Timer()*6.26)))gc.polygon("line",S.standard) - _=S.color - gc.setColor(_[1],_[2],_[3],T*.626) - _=S.val - for i=1,9,2 do - gc.polygon("fill",0,0,_[i],_[i+1],_[i+2],_[i+3]) - end - gc.polygon("fill",0,0,_[11],_[12],_[1],_[2]) - gc.setColor(1,1,1,T)gc.polygon("line",S.val) - gc.pop() - - --Axes - gc.setColor(1,1,1,T) - for i=1,3 do - local x,y=hexList[2*i-1],hexList[2*i] - gc.line(-x,-y,x,y) - end - - --Texts - local C - _=Timer()%6.2832 - if _>3.1416 then - gc.setColor(1,1,1,-T*sin(_)) - setFont(35) - C,_=text.radar,textPos - else - gc.setColor(1,1,1,T*sin(_)) - setFont(18) - C,_=S.radar,dataPos - end - for i=1,6 do - mStr(C[i],_[2*i-1],_[2*i]) - end - gc.pop() - end -end -function Pnt.setting_game() - gc.setColor(1,1,1) - mText(drawableText.setting_game,640,15) - gc.draw(blockSkin[int(Timer()*2)%11+1],590,540,Timer()%6.28319,2,nil,15,15) -end -function Pnt.setting_video() - gc.setColor(1,1,1) - mText(drawableText.setting_video,640,15) -end -function Pnt.setting_sound() - gc.setColor(1,1,1) - mText(drawableText.setting_sound,640,15) - local t=Timer() - local _=sceneTemp.jump - local x,y=800,340+10*sin(t*.5)+(_-10)*_*.3 - gc.translate(x,y) - gc.draw(IMG.miyaCH,0,0) - gc.setColor(1,1,1,.7) - gc.draw(IMG.miyaF1,4,47+4*sin(t*.9)) - gc.draw(IMG.miyaF2,42,107+5*sin(t)) - gc.draw(IMG.miyaF3,93,126+3*sin(t*.7)) - gc.draw(IMG.miyaF4,129,98+3*sin(t*.7)) - gc.translate(-x,-y) -end - -function Pnt.setting_control() - --Testing grid line - gc.setLineWidth(4) - gc.setColor(1,1,1,.4) - gc.line(550,540,950,540) - gc.line(550,580,950,580) - gc.line(550,620,950,620) - for x=590,910,40 do - gc.line(x,530,x,630) - end - gc.setColor(1,1,1) - gc.line(550,530,550,630) - gc.line(950,530,950,630) - - --Texts - gc.setColor(.7,.7,.7)gc.draw(drawableText.setting_control,80,50) - gc.setColor(1,1,1)gc.draw(drawableText.setting_control,80,50) - setFont(50) - gc.printf(text.preview,320,540,200,"right") - - --Testing O mino - _=blockSkin[setting.skin[6]] - local x=550+40*sceneTemp.pos - gc.draw(_,x,540,nil,40/30) - gc.draw(_,x,580,nil,40/30) - gc.draw(_,x+40,540,nil,40/30) - gc.draw(_,x+40,580,nil,40/30) -end -function Pnt.setting_key() - local S=sceneTemp - local a=.3+sin(Timer()*15)*.1 - if S.kS then gc.setColor(1,.3,.3,a)else gc.setColor(1,.7,.7,a)end - gc.rectangle("fill", - S.kb<11 and 240 or 840, - 45*S.kb+20-450*int(S.kb/11), - 200,45 - ) - if S.jS then gc.setColor(.3,.3,.1,a)else gc.setColor(.7,.7,1,a)end - gc.rectangle("fill", - S.js<11 and 440 or 1040, - 45*S.js+20-450*int(S.js/11), - 200,45 - ) - --Selection rect - - gc.setColor(1,.3,.3) - mText(drawableText.keyboard,340,30) - mText(drawableText.keyboard,940,30) - gc.setColor(.3,.3,1) - mText(drawableText.joystick,540,30) - mText(drawableText.joystick,1140,30) - - gc.setColor(1,1,1) - setFont(26) - local b1,b2=keyMap[S.board],keyMap[S.board+2] - for N=1,20 do - if N<11 then - gc.printf(text.acts[N],47,45*N+22,180,"right") - mStr(b1[N],340,45*N+22) - mStr(b2[N],540,45*N+22) - else - gc.printf(text.acts[N],647,45*N-428,180,"right") - mStr(b1[N],940,45*N-428) - mStr(b2[N],1040,45*N-428) - end - end - gc.setLineWidth(2) - for x=40,1240,200 do - gc.line(x,65,x,515) - end - for y=65,515,45 do - gc.line(40,y,1240,y) - end - setFont(35) - gc.print(text.page..S.board,280,590) - gc.draw(drawableText.ctrlSetHelp,50,650) -end -function Pnt.setting_skin() - gc.setColor(.7,.7,.7)gc.draw(drawableText.setting_skin,80,50) - gc.setColor(1,1,1)gc.draw(drawableText.setting_skin,80,50) - for N=1,7 do - local face=setting.face[N] - local B=blocks[N][face] - local x,y=-55+140*N-scs[N][face][2]*30,355+scs[N][face][1]*30 - local col=#B[1] - for i=1,#B do for j=1,col do - if B[i][j]then - gc.draw(blockSkin[setting.skin[N]],x+30*j,y-30*i) - end - end end - gc.circle("fill",-10+140*N,340,sin(Timer()*10)+5) - end - for i=1,6 do - gc.draw(blockSkin[11+i],570+60*i,610,nil,2) - end -end -function Pnt.setting_touch() - gc.setColor(1,1,1) - gc.setLineWidth(7)gc.rectangle("line",340,15,600,690) - gc.setLineWidth(3)gc.rectangle("line",490,85,300,600) - VirtualkeyPreview() - local d=snapLevelValue[sceneTemp.snap] - if d>=10 then - gc.setLineWidth(3) - gc.setColor(1,1,1,sin(Timer()*4)*.1+.1) - for i=1,1280/d-1 do - gc.line(d*i,0,d*i,720) - end - for i=1,720/d-1 do - gc.line(0,d*i,1280,d*i) - end - end -end -function Pnt.setting_trackSetting() - gc.setColor(1,1,1) - mText(drawableText.VKTchW,140+50*setting.VKTchW,260) - mText(drawableText.VKOrgW,140+50*setting.VKTchW+50*setting.VKCurW,320) - mText(drawableText.VKCurW,640+50*setting.VKCurW,380) -end -function Pnt.help() - setFont(20) - gc.setColor(1,1,1) - for i=1,#text.help do - gc.printf(text.help[i],150,35*i+40,1000,"center") - end - setFont(19) - gc.print(text.used,30,330) - gc.draw(IMG.title,280,610,.1,1+.05*sin(Timer()*2.6),nil,206,35) - gc.setLineWidth(3) - gc.rectangle("line",18,18,263,263) - gc.rectangle("line",1012,18,250,250) - gc.draw(IMG.pay1,20,20) - gc.draw(IMG.pay2,1014,20) - setFont(20) - mStr(text.group,640,490) - gc.setColor(1,1,1,sin(Timer()*20)*.3+.6) - setFont(30) - mStr(text.support,150+sin(Timer()*4)*20,283) - mStr(text.support,1138-sin(Timer()*4)*20,270) -end -function Pnt.staff() - local L=text.staff - local t=sceneTemp.time - setFont(40) - for i=1,#L do - mStr(L[i],640,800+80*i-t*40) - end - mDraw(IMG.title_color,640,800-t*40,nil,2) - mDraw(IMG.title_color,640,2160-t*40,nil,2) -end -function Pnt.stat() - local chart=sceneTemp.chart - setFont(24) - local _,__=SKIN.libColor,setting.skin - local A,B=chart.A1,chart.A2 - for x=1,7 do - gc.setColor(_[__[x]]) - mStr(text.block[x],80*x,40) - mStr(text.block[x],80*x,280) - for y=1,4 do - mStr(A[x][y],80*x,40+40*y) - mStr(B[x][y],80*x,280+40*y) - end - mStr(chart.Y1[x],80*x,240) - mStr(chart.Y2[x],80*x,480) - end - gc.setColor(1,1,1) - A,B=chart.X1,chart.X2 - mStr(text.stat.spin,650,45) - mStr(text.stat.clear,650,285) - for y=1,4 do - mStr(A[y],650,40+40*y) - mStr(B[y],650,280+40*y) - end - - setFont(22) - for i=1,11 do - gc.print(sceneTemp.item[i],740,40*i+10) - end - - gc.setLineWidth(4) - for x=1,8 do - x=80*x-40 - gc.line(x,80,x,240) - gc.line(x,320,x,480) - end - for y=2,6 do - gc.line(40,40*y,600,40*y) - gc.line(40,240+40*y,600,240+40*y) - end - - gc.draw(IMG.title,260,615,.2+.04*sin(Timer()*3),nil,nil,206,35) -end -function Pnt.history() - gc.setColor(.2,.2,.2,.7) - gc.rectangle("fill",30,45,1000,632) - gc.setColor(1,1,1) - gc.setLineWidth(4) - gc.rectangle("line",30,45,1000,632) - setFont(20) - local S=sceneTemp - gc.print(S.text[S.pos],40,50) -end -return Pnt \ No newline at end of file diff --git a/Zframework/scene.lua b/Zframework/scene.lua index 8e25a984..30176599 100644 --- a/Zframework/scene.lua +++ b/Zframework/scene.lua @@ -1,337 +1,10 @@ local gc=love.graphics -local int,abs=math.floor,math.abs -local max,log=math.max,math.log -local rnd,sin,cos=math.random,math.sin,math.cos -local format=string.format +local abs=math.abs local scr=scr -local sceneInit={} +sceneInit,sceneBack={},{} +local sceneInit,sceneBack=sceneInit,sceneBack sceneInit.quit=love.event.quit -function sceneInit.calculator() - sceneTemp={ - reg=false, - val=0, - sym=false, - pass=false, - tip=require("parts/getTip"), - } -end -function sceneInit.p15() - sceneTemp={ - board={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}, - x=4,y=4, - startTime=0, - time=0, - move=0, - state=2, - - color=true, - blind=false, - } -end -function sceneInit.load() - sceneTemp={ - phase=1,--Loading stage - cur=1,--Counter - tar=#VOC.name,--Loading bar length(current) - tip=setting.appLock or require("parts/getTip"), - list={ - #VOC.name, - #BGM.list, - #SFX.list, - IMG.getCount(), - #Modes, - 1, - }, - skip=false,--If skipped - } -end -function sceneInit.intro() - BG.set("space") - sceneTemp={ - t1=0,--Timer 1 - t2=0,--Timer 2 - r={},--Random animation type - } - for i=1,8 do - sceneTemp.r[i]=rnd(5) - end - BGM.play("blank") -end -function sceneInit.main() - BG.set("space") - BGM.play("blank") - - modeEnv={} - --Create demo player - destroyPlayers() - PLY.newDemoPlayer(1,900,35,1.1) -end -function sceneInit.music() - if BGM.nowPlay then - for i=1,BGM.len do - if BGM.list[i]==BGM.nowPlay then - sceneTemp=i--Music selected - return - end - end - else - sceneTemp=1 - end -end -function sceneInit.mode(org) - BG.set("space") - BGM.play("blank") - destroyPlayers() - local cam=mapCam - cam.zoomK=org=="main"and 5 or 1 - if cam.sel then - local M=Modes[cam.sel] - cam.x,cam.y=M.x*cam.k+180,M.y*cam.k - cam.x1,cam.y1=cam.x,cam.y - end -end -function sceneInit.custom() - sceneTemp=1--Option selected - destroyPlayers() - BG.set(customRange.bg[customSel[12]]) - BGM.play(customRange.bgm[customSel[13]]) -end -function sceneInit.sequence() - sceneTemp={cur=#preBag,sure=0} -end -function sceneInit.draw() - BG.set("space") - sceneTemp={ - sure=0, - pen=1, - x=1,y=1, - demo=false, - } -end -function sceneInit.play() - love.keyboard.setKeyRepeat(false) - restartCount=0 - if needResetGameData then - resetGameData() - needResetGameData=nil - end - BG.set(modeEnv.bg) -end -function sceneInit.pause(org) - if - org=="setting_game"or - org=="setting_video"or - org=="setting_sound" - then - TEXT.show(text.needRestart,640,440,50,"fly",.6) - end - local S=players[1].stat - sceneTemp={ - timer=org=="play"and 0 or 50, - list={ - toTime(S.time), - format("%d/%d/%d",S.key,S.rotate,S.hold), - format("%d %.2fPPS",S.piece,S.piece/S.time), - format("%d(%d) %.2fLPM",S.row,S.dig,S.row/S.time*60), - format("%d(%d) %.2fAPM",S.atk,S.digatk,S.atk/S.time*60), - format("%d(%d-%d)",S.pend,S.recv,S.recv-S.pend), - format("%d/%d/%d/%d",S.clears[1],S.clears[2],S.clears[3],S.clears[4]), - format("(%d)/%d/%d/%d",S.spins[1],S.spins[2],S.spins[3],S.spins[4]), - format("%d/%d ; %d/%d",S.b2b,S.b3b,S.pc,S.hpc), - format("%d [%.2f%%]",S.extraPiece,100*max(1-S.extraRate/S.piece,0)), - }, - - --From right-down, 60 degree each - radar={ - (S.off+S.dig)/S.time*60,--DefPM - (S.send+S.dig)/S.time*60,--ADPM - S.atk/S.time*60, --AtkPM - S.send/S.time*60, --SendPM - S.piece/S.time*24, --LinePM - S.dig/S.time*60, --DigPM - }, - val={1/80,1/80,1/80,1/60,1/100,1/40}, - timing=org=="play", - } - local _=sceneTemp - local A,B=_.radar,_.val - - --Normalize Values - for i=1,6 do - B[i]=B[i]*A[i]if B[i]>1.26 then B[i]=1.26+log(B[i]-.26,10)end - end - - for i=1,6 do - A[i]=format("%.2f",A[i])..text.radarData[i] - end - local f=1 - for i=1,6 do - if B[i]>.5 then f=2 end - if B[i]>1 then f=3 break end - end - if f==1 then _.color,f={.4,.9,.5},1.25 --Vegetable - elseif f==2 then _.color,f={.4,.7,.9},1 --Normal - elseif f==3 then _.color,f={1,.3,.3},.626 --Diao - end - A={ - 120*.5*f, 120*3^.5*.5*f, - 120*-.5*f, 120*3^.5*.5*f, - 120*-1*f, 120*0*f, - 120*-.5*f, 120*-3^.5*.5*f, - 120*.5*f, 120*-3^.5*.5*f, - 120*1*f, 120*0*f, - } - _.scale=f - _.standard=A - - for i=6,1,-1 do - B[2*i-1],B[2*i]=B[i]*A[2*i-1],B[i]*A[2*i] - end - _.val=B -end -function sceneInit.setting_game() - BG.set("space") -end -function sceneInit.setting_video() - BG.set("space") -end -function sceneInit.setting_sound() - sceneTemp={ - last=0,--Last sound time - jump=0,--Animation timer(10 to 0) - } - BG.set("space") -end -function sceneInit.setting_control() - sceneTemp={ - das=setting.das, - arr=setting.arr, - pos=0, - dir=1, - wait=30, - } - BG.set("bg1") -end -function sceneInit.setting_key() - sceneTemp={ - board=1, - kb=1,js=1, - kS=false,jS=false, - } -end -function sceneInit.setting_touch() - BG.set("rainbow") - sceneTemp={ - default=1, - snap=1, - sel=nil, - } -end -function sceneInit.setting_touchSwitch() - BG.set("matrix") -end -function sceneInit.help() - BG.set("space") -end -function sceneInit.staff() - sceneTemp={ - time=0, - v=1, - } - BG.set("space") -end -function sceneInit.stat() - local S=stat - local X1,X2,Y1,Y2={0,0,0,0},{0,0,0,0},{},{} - for i=1,7 do - local S,C=S.spin[i],S.clear[i] - Y1[i]=S[1]+S[2]+S[3]+S[4] - Y2[i]=C[1]+C[2]+C[3]+C[4] - for j=1,4 do - X1[j]=X1[j]+S[j] - X2[j]=X2[j]+C[j] - end - end - sceneTemp={ - chart={ - A1=S.spin,A2=S.clear, - X1=X1,X2=X2, - Y1=Y1,Y2=Y2, - }, - item={ - S.run, - S.game, - toTime(S.time), - S.key.." "..S.rotate.." "..S.hold, - S.piece.." "..S.row.." "..int(S.atk), - S.recv.." "..S.off.." "..S.pend, - S.dig.." "..int(S.digatk), - format("%.2f %.2f",S.atk/S.row,S.digatk/S.dig), - format("%d/%.3f%%",S.extraPiece,100*max(1-S.extraRate/S.piece,0)), - S.b2b.." "..S.b3b, - S.pc.." "..S.hpc, - }, - } - for i=1,11 do - sceneTemp.item[i]=text.stat[i].."\t"..sceneTemp.item[i] - end -end -function sceneInit.history() - BG.set("rainbow") - sceneTemp={ - text=require("parts/updateLog"),--Text list - pos=1,--Scroll pos - } - if newVersionLaunch then - newVersionLaunch=nil - sceneTemp.pos=4 - end -end -function sceneInit.debug() - sceneTemp={ - reset=false, - } -end -function sceneInit.quit() - if rnd()>.000626 then - love.timer.sleep(.3) - love.event.quit() - else - error("So lucky! 0.0626 precent to get this!!! You can quit the game now.") - end -end - -local sceneBack={} -function sceneBack.load() - love.event.quit() -end -function sceneBack.pause() - love.keyboard.setKeyRepeat(true) - if not game.replaying then - mergeStat(stat,players[1].stat) - end - FILE.saveData() - TASK.clear("play") -end -function sceneBack.setting_game() - FILE.saveSetting() -end -function sceneBack.setting_video() - FILE.saveSetting() -end -function sceneBack.setting_sound() - FILE.saveSetting() -end -function sceneBack.setting_touch() - FILE.saveVK() -end -function sceneBack.setting_key() - FILE.saveKeyMap() -end -function sceneBack.setting_lang() - FILE.saveSetting() -end local SCN={ cur="load",--Current scene diff --git a/Zframework/timer.lua b/Zframework/timer.lua deleted file mode 100644 index 0bceceef..00000000 --- a/Zframework/timer.lua +++ /dev/null @@ -1,362 +0,0 @@ -local gc=love.graphics -local kb=love.keyboard -local Timer=love.timer.getTime -local int,abs,rnd,max,min,sin,ln=math.floor,math.abs,math.random,math.max,math.min,math.sin,math.log -local ins,rem=table.insert,table.remove - -local Tmr={} -function Tmr.load() - local t=Timer() - local S=sceneTemp - repeat - if S.phase==1 then - VOC.loadOne(S.cur) - elseif S.phase==2 then - BGM.loadOne(S.cur) - elseif S.phase==3 then - SFX.loadOne(S.cur) - elseif S.phase==4 then - IMG.loadOne(S.cur) - elseif S.phase==5 then - local m=Modes[S.cur]--Mode template - local M=require("modes/"..m.name)--Mode file - Modes[m.name],Modes[S.cur]=M - for k,v in next,m do - M[k]=v - end - M.records=FILE.loadRecord(m.name)or M.score and{} - if M.score then - if modeRanks[M.name]==6 then - modeRanks[M.name]=0 - end - else - modeRanks[M.name]=6 - end - -- M.icon=gc.newImage("image/modeIcon/"..m.icon..".png") - -- M.icon=gc.newImage("image/modeIcon/custom.png") - elseif S.phase==6 then - --------------------------Loading other little things here - SKIN.load() - stat.run=stat.run+1 - -------------------------- - if not setting.appLock then - SFX.play("welcome_sfx") - VOC.play("welcome") - end - else - S.cur=S.cur+1 - S.tar=S.cur - if S.cur>62.6 then - SCN.swapTo(setting.appLock and "calculator"or"intro","none") - end - loadingFinished=true - return - end - S.cur=S.cur+1 - if S.cur>S.tar then - S.phase=S.phase+1 - S.cur=1 - S.tar=S.list[S.phase] - if not S.tar then - S.phase=0 - S.tar=1 - end - end - until not S.skip and Timer()-t>.01 -end -function Tmr.p15() - local S=sceneTemp - if S.state==1 then - S.time=Timer()-S.startTime - end -end -function Tmr.intro() - local S=sceneTemp - S.t1=S.t1+1 - S.t2=S.t2+1 -end -function Tmr.main(dt) - players[1]:update(dt) -end -function Tmr.mode(dt) - local cam=mapCam - local x,y,k=cam.x,cam.y,cam.k - local F - if not SCN.swapping then - if kb.isDown("up", "w")then y=y-10*k;F=true end - if kb.isDown("down","s")then y=y+10*k;F=true end - if kb.isDown("left","a")then x=x-10*k;F=true end - if kb.isDown("right","d")then x=x+10*k;F=true end - local js1=joysticks[1] - if js1 then - local k=js1:getAxis(1) - if k~="c"then - if k=="u"or k=="ul"or k=="ur"then y=y-10*k;F=true end - if k=="d"or k=="dl"or k=="dl"then y=y+10*k;F=true end - if k=="l"or k=="ul"or k=="dl"then x=x-10*k;F=true end - if k=="r"or k=="ur"or k=="dr"then x=x+10*k;F=true end - end - end - end - if F or cam.keyCtrl and(x-cam.x1)^2+(y-cam.y1)^2>2.6 then - if F then - cam.keyCtrl=true - end - local x,y=(cam.x1-180)/cam.k1,cam.y1/cam.k1 - for name,M in next,Modes do - if modeRanks[name]then - local SEL - local s=M.size - if M.shape==1 then - if x>M.x-s and xM.y-s and y1850*k then x=1850*k - elseif x<-1000*k then x=-1000*k - end - if y>500*k then y=500*k - elseif y<-1900*k then y=-1900*k - end - cam.x,cam.y=x,y - --Keyboard controlling - - cam.x1=cam.x1*.85+x*.15 - cam.y1=cam.y1*.85+y*.15 - cam.k1=cam.k1*.85+k*.15 - local _=SCN.stat.tar - cam.zoomMethod=_=="play"and 1 or _=="mode"and 2 - if cam.zoomMethod==1 then - if cam.sel then - local M=Modes[cam.sel] - cam.x=cam.x*.8+M.x*cam.k*.2 - cam.y=cam.y*.8+M.y*cam.k*.2 - end - _=cam.zoomK - if _<.8 then _=_*1.05 end - if _<1.1 then _=_*1.05 end - cam.zoomK=_*1.05 - elseif cam.zoomMethod==2 then - cam.zoomK=cam.zoomK^.9 - end -end -function Tmr.sequence() - if sceneTemp.sure>0 then sceneTemp.sure=sceneTemp.sure-1 end -end -function Tmr.draw() - if sceneTemp.sure>0 then sceneTemp.sure=sceneTemp.sure-1 end -end -function Tmr.play(dt) - local _ - game.frame=game.frame+1 - stat.time=stat.time+dt - - --Update attack FX - for i=#FX_attack,1,-1 do - local b=FX_attack[i] - b.t=b.t+1 - if b.t>50 then - b.rad=b.rad*1.05+.1 - b.x,b.y=b.x2,b.y2 - elseif b.t>10 then - _=(b.t-10)*.025 - _=(3-2*_)*_*_ - b.x,b.y=b.x1*(1-_)+b.x2*_,b.y1*(1-_)+b.y2*_ - end - if b.t<60 then - _=FX_attack[i].drag - if #_==4*setting.atkFX then - rem(_,1)rem(_,1) - end - ins(_,b.x)ins(_,b.y) - else - for i=i,#FX_attack do - FX_attack[i]=FX_attack[i+1] - end - end - end - - --Update badge FX - for i=#FX_badge,1,-1 do - local b=FX_badge[i] - b.t=b.t+1 - if b.t==60 then - rem(FX_badge,i) - end - end - - --Update virtualkey animation - if setting.VKSwitch then - for i=1,#virtualkey do - _=virtualkey[i] - if _.pressTime>0 then - _.pressTime=_.pressTime-1 - end - end - end - - local P1=players[1] - - --Replay - if game.replaying then - _=game.replaying - local L=game.rec - while game.frame==L[_]do - local k=L[_+1] - if k>0 then - P1:pressKey(k) - virtualkey[k].isDown=true - virtualkey[k].pressTime=10 - else - virtualkey[-k].isDown=false - P1:releaseKey(-k) - end - _=_+2 - end - game.replaying=_ - end - --Counting,include pre-das,directy RETURN,or restart counting - if game.frame<180 then - if game.frame==179 then - gameStart() - elseif game.frame==60 or game.frame==120 then - SFX.play("ready") - end - for p=1,#players do - local P=players[p] - if P.movDir~=0 then - if P.moving0 then restartCount=restartCount-1 end - return - elseif P1.keyPressing[10]then - restartCount=restartCount+1 - if restartCount>20 then - TASK.clear("play") - resetPartGameData() - return - end - elseif restartCount>0 then - restartCount=restartCount>2 and restartCount-2 or 0 - end - - --Update players - for p=1,#players do - local P=players[p] - P:update(dt) - end - - --Fresh royale target - if game.frame%120==0 then - if modeEnv.royaleMode then freshMostDangerous()end - end - - --Warning check - if P1.alive then - if game.frame%26==0 and setting.warn then - local F=P1.field - local height=0--Max height of row 4~7 - for x=4,7 do - for y=#F,1,-1 do - if F[y][x]>0 then - if y>height then - height=y - end - break - end - end - end - game.warnLVL0=ln(height-15+P1.atkBuffer.sum*.8) - end - _=game.warnLVL - if _0 then - _=max(_-.026,0) - end - game.warnLVL=_ - elseif game.warnLVL>0 then - game.warnLVL=max(game.warnLVL-.026,0) - end -end -function Tmr.pause(dt) - if not game.result then - game.pauseTime=game.pauseTime+dt - end - if sceneTemp.timer<50 then - sceneTemp.timer=sceneTemp.timer+1 - end -end -function Tmr.setting_sound() - local t=sceneTemp.jump - if t>0 then - sceneTemp.jump=t-1 - end -end -function Tmr.setting_control() - local T=sceneTemp - if T.wait>0 then - T.wait=T.wait-1 - if T.wait==0 then - T.pos=T.pos+T.dir - else - return - end - end - if T.das>0 then - T.das=T.das-1 - if T.das==0 then - if T.arr==0 then - T.pos=T.pos+7*T.dir - T.das=setting.das+1 - T.arr=setting.arr - T.dir=-T.dir - T.wait=26 - else - T.pos=T.pos+T.dir - end - end - else - T.arr=T.arr-1 - if T.arr==0 then - T.pos=T.pos+T.dir - T.arr=setting.arr - elseif T.arr==-1 then - T.pos=T.dir>0 and 8 or 0 - T.arr=setting.arr - end - if T.pos%8==0 then - T.dir=-T.dir - T.wait=26 - T.das=setting.das - end - end -end -function Tmr.staff(dt) - local S=sceneTemp - if kb.isDown("space","return")and S.v<6.26 then - S.v=S.v+.26 - elseif S.v>1 then - S.v=S.v-.26 - end - S.time=S.time+S.v*dt - if S.time>45 then - S.time=45 - end -end -return Tmr \ No newline at end of file diff --git a/main.lua b/main.lua index a8990f30..99309b00 100644 --- a/main.lua +++ b/main.lua @@ -82,6 +82,7 @@ AIfunc= require("parts/ai") Modes= require("parts/modes") TICK= require("parts/tick") +require("parts/scenes") --Load files & settings modeRanks={sprint_10=0} diff --git a/parts/scenes.lua b/parts/scenes.lua new file mode 100644 index 00000000..02c18ca7 --- /dev/null +++ b/parts/scenes.lua @@ -0,0 +1,1635 @@ +local gc=love.graphics +local kb=love.keyboard + +local setFont=setFont +local mStr=mStr + +local int,ceil,rnd,abs=math.floor,math.ceil,math.random,math.abs +local max,min,sin,cos=math.max,math.min,math.sin,math.cos +local log,rnd=math.log,math.random + +local format=string.format +local Timer=love.timer.getTime +local ins,rem=table.insert,table.remove + +local scr=scr + +Tmr,Pnt={},{} + +do--calculator + function sceneInit.calculator() + sceneTemp={ + reg=false, + val=0, + sym=false, + pass=false, + tip=require("parts/getTip"), + } + end + function Pnt.calculator() + local S=sceneTemp + gc.setLineWidth(4) + gc.rectangle("line",100,80,650,150) + setFont(45) + if S.reg then gc.printf(S.reg,0,100,720,"right")end + if S.val then gc.printf(S.val,0,150,720,"right")end + + if S.sym then setFont(50)gc.print(S.sym,126,150)end + if S.pass then setFont(40)mStr(S.tip,640,10)end + end +end + +do--p15 + function sceneInit.p15() + sceneTemp={ + board={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}, + x=4,y=4, + startTime=0, + time=0, + move=0, + state=2, + + color=true, + blind=false, + } + end + + function Tmr.p15() + local S=sceneTemp + if S.state==1 then + S.time=Timer()-S.startTime + end + end + + local cellColor={ + color.lRed,color.lRed,color.lRed,color.lRed, + color.lBlue,color.lGreen,color.lGreen,color.lGreen, + color.lBlue,color.lYellow,color.lPurple,color.lPurple, + color.lBlue,color.lYellow,color.lPurple,color.lPurple, + } + local backColor={ + color.dRed,color.dRed,color.dRed,color.dRed, + color.dBlue,color.dGreen,color.dGreen,color.dGreen, + color.dBlue,color.dYellow,color.dPurple,color.dPurple, + color.dBlue,color.dYellow,color.dPurple,color.dPurple, + } + function Pnt.p15() + local S=sceneTemp + + setFont(40) + gc.print(format("%.3f",S.time),1000,50) + gc.print(S.move,1000,100) + + if S.state==1 then gc.setColor(.9,.9,.9) --game + elseif S.state==0 then gc.setColor(.2,.8,.2)--ready + elseif S.state==2 then gc.setColor(.9,.9,0) --win + end + gc.setLineWidth(10) + gc.rectangle("line",313,33,654,654,18) + + gc.setLineWidth(4) + local x,y=S.x,S.y + setFont(80) + for i=1,4 do + for j=1,4 do + if x~=j or y~=i then + local N=S.board[i][j] + if S.color and not(S.blind and S.state==1)then + gc.setColor(backColor[N]) + gc.rectangle("fill",j*160+163,i*160-117,154,154,8) + gc.setColor(cellColor[N]) + gc.rectangle("line",j*160+163,i*160-117,154,154,8) + else + gc.setColor(.3,.3,.3) + gc.rectangle("fill",j*160+163,i*160-117,154,154,8) + gc.setColor(1,1,1) + gc.rectangle("line",j*160+163,i*160-117,154,154,8) + end + if not(S.blind and S.state==1)then + gc.setColor(.1,.1,.1) + mStr(N,j*160+240,i*160-96) + mStr(N,j*160+242,i*160-98) + gc.setColor(1,1,1) + mStr(N,j*160+243,i*160-95) + end + end + end + end + gc.setColor(.3,.3,.3) + gc.setLineWidth(10) + gc.rectangle("line",x*160+173,y*160-107,134,134,50) + end +end + +do--load + function sceneInit.load() + sceneTemp={ + phase=1,--Loading stage + cur=1,--Counter + tar=#VOC.name,--Loading bar length(current) + tip=setting.appLock or require("parts/getTip"), + list={ + #VOC.name, + #BGM.list, + #SFX.list, + IMG.getCount(), + #Modes, + 1, + }, + skip=false,--If skipped + } + end + function sceneBack.load() + love.event.quit() + end + + function Tmr.load() + local t=Timer() + local S=sceneTemp + repeat + if S.phase==1 then + VOC.loadOne(S.cur) + elseif S.phase==2 then + BGM.loadOne(S.cur) + elseif S.phase==3 then + SFX.loadOne(S.cur) + elseif S.phase==4 then + IMG.loadOne(S.cur) + elseif S.phase==5 then + local m=Modes[S.cur]--Mode template + local M=require("modes/"..m.name)--Mode file + Modes[m.name],Modes[S.cur]=M + for k,v in next,m do + M[k]=v + end + M.records=FILE.loadRecord(m.name)or M.score and{} + if M.score then + if modeRanks[M.name]==6 then + modeRanks[M.name]=0 + end + else + modeRanks[M.name]=6 + end + -- M.icon=gc.newImage("image/modeIcon/"..m.icon..".png") + -- M.icon=gc.newImage("image/modeIcon/custom.png") + elseif S.phase==6 then + --------------------------Loading other little things here + SKIN.load() + stat.run=stat.run+1 + -------------------------- + if not setting.appLock then + SFX.play("welcome_sfx") + VOC.play("welcome") + end + else + S.cur=S.cur+1 + S.tar=S.cur + if S.cur>62.6 then + SCN.swapTo(setting.appLock and "calculator"or"intro","none") + end + loadingFinished=true + return + end + S.cur=S.cur+1 + if S.cur>S.tar then + S.phase=S.phase+1 + S.cur=1 + S.tar=S.list[S.phase] + if not S.tar then + S.phase=0 + S.tar=1 + end + end + until not S.skip and Timer()-t>.01 + end + + function Pnt.load() + local S=sceneTemp + gc.setLineWidth(4) + gc.setColor(1,1,1,.5) + gc.rectangle("fill",300,330,S.cur/S.tar*680,60,5) + gc.setColor(1,1,1) + gc.rectangle("line",300,330,680,60,5) + if not setting.appLock then + setFont(35) + gc.print(text.load[S.phase],340,335) + if S.phase~=0 then + gc.printf(S.cur.."/"..S.tar,795,335,150,"right") + end + setFont(25) + mStr(S.tip,640,400) + end + end +end + +do--intro + function sceneInit.intro() + BG.set("space") + sceneTemp={ + t1=0,--Timer 1 + t2=0,--Timer 2 + r={},--Random animation type + } + for i=1,8 do + sceneTemp.r[i]=rnd(5) + end + BGM.play("blank") + end + + function Tmr.intro() + local S=sceneTemp + S.t1=S.t1+1 + S.t2=S.t2+1 + end + + local titleTransform={ + function(t) + gc.translate(0,max(50-t,0)^2/25) + end, + function(t) + gc.translate(0,-max(50-t,0)^2/25) + end, + function(t,i) + local d=max(50-t,0) + gc.translate(sin(Timer()*3+626*i)*d,cos(Timer()*3+626*i)*d) + end, + function(t,i) + local d=max(50-t,0) + gc.translate(sin(Timer()*3+626*i)*d,-cos(Timer()*3+626*i)*d) + end, + function(t) + gc.setColor(1,1,1,min(t*.02,1)+rnd()*.2) + end, + } + function Pnt.intro() + local S=sceneTemp + local t=S.t1 + local T=(t+110)%300 + if T<30 then + gc.setLineWidth(4+(30-T)^1.626/62) + else + gc.setLineWidth(4) + end + local L=title + gc.push("transform") + gc.translate(126,226) + for i=1,8 do + local T=t-i*15 + if T>0 then + gc.push("transform") + gc.setColor(1,1,1,min(T*.025,1)) + titleTransform[S.r[i]](T,i) + local dt=(t+62-5*i)%300 + if dt<20 then + gc.translate(0,abs(10-dt)-10) + end + gc.polygon("line",L[i]) + gc.pop() + end + end + gc.pop() + t=S.t2 + if t>=80 then + gc.setColor(1,1,1,.6+sin((t-80)*.0626)*.3) + mText(drawableText.anykey,640,615+sin(Timer()*3)*5) + end + end +end + +do--main + function sceneInit.main() + BG.set("space") + BGM.play("blank") + + modeEnv={} + --Create demo player + destroyPlayers() + PLY.newDemoPlayer(1,900,35,1.1) + end + + function Tmr.main(dt) + players[1]:update(dt) + end + + function Pnt.main() + gc.setColor(1,1,1) + gc.draw(IMG.title_color,60,30,nil,1.3) + setFont(30) + gc.print(gameVersion,70,125) + gc.print(system,610,100) + local L=text.modes[stat.lastPlay] + setFont(25) + gc.print(L[1],700,470) + gc.print(L[2],700,500) + players[1]:draw() + end +end + +do--music + function sceneInit.music() + if BGM.nowPlay then + for i=1,BGM.len do + if BGM.list[i]==BGM.nowPlay then + sceneTemp=i--Music selected + return + end + end + else + sceneTemp=1 + end + end + + function Pnt.music() + gc.setColor(1,1,1,.3+sin(Timer()*5)*.2) + gc.rectangle("fill",45,98+30*sceneTemp,250,30) + gc.setColor(.7,.7,.7)gc.draw(drawableText.musicRoom,20,20) + gc.setColor(1,1,1)gc.draw(drawableText.musicRoom,22,23) + gc.draw(drawableText.nowPlaying,490,390) + setFont(30) + for i=1,BGM.len do + gc.print(BGM.list[i],50,90+30*i) + end + gc.draw(IMG.title,640,310,nil,1.5,nil,206,35) + if BGM.nowPlay then + setFont(45) + gc.setColor(sin(Timer()*.5)*.2+.8,sin(Timer()*.7)*.2+.8,sin(Timer())*.2+.8) + mStr(BGM.nowPlay,630,460) + local t=-Timer()%2.3/2 + if t<1 then + gc.setColor(1,1,1,t) + gc.draw(IMG.title_color,640,310,nil,1.5+.1-.1*t,1.5+.3-.3*t,206,35) + end + end + end +end + +do--mode + function sceneInit.mode(org) + BG.set("space") + BGM.play("blank") + destroyPlayers() + local cam=mapCam + cam.zoomK=org=="main"and 5 or 1 + if cam.sel then + local M=Modes[cam.sel] + cam.x,cam.y=M.x*cam.k+180,M.y*cam.k + cam.x1,cam.y1=cam.x,cam.y + end + end + + function Tmr.mode(dt) + local cam=mapCam + local x,y,k=cam.x,cam.y,cam.k + local F + if not SCN.swapping then + if kb.isDown("up", "w")then y=y-10*k;F=true end + if kb.isDown("down","s")then y=y+10*k;F=true end + if kb.isDown("left","a")then x=x-10*k;F=true end + if kb.isDown("right","d")then x=x+10*k;F=true end + local js1=joysticks[1] + if js1 then + local k=js1:getAxis(1) + if k~="c"then + if k=="u"or k=="ul"or k=="ur"then y=y-10*k;F=true end + if k=="d"or k=="dl"or k=="dl"then y=y+10*k;F=true end + if k=="l"or k=="ul"or k=="dl"then x=x-10*k;F=true end + if k=="r"or k=="ur"or k=="dr"then x=x+10*k;F=true end + end + end + end + if F or cam.keyCtrl and(x-cam.x1)^2+(y-cam.y1)^2>2.6 then + if F then + cam.keyCtrl=true + end + local x,y=(cam.x1-180)/cam.k1,cam.y1/cam.k1 + for name,M in next,Modes do + if modeRanks[name]then + local SEL + local s=M.size + if M.shape==1 then + if x>M.x-s and xM.y-s and y1850*k then x=1850*k + elseif x<-1000*k then x=-1000*k + end + if y>500*k then y=500*k + elseif y<-1900*k then y=-1900*k + end + cam.x,cam.y=x,y + --Keyboard controlling + + cam.x1=cam.x1*.85+x*.15 + cam.y1=cam.y1*.85+y*.15 + cam.k1=cam.k1*.85+k*.15 + local _=SCN.stat.tar + cam.zoomMethod=_=="play"and 1 or _=="mode"and 2 + if cam.zoomMethod==1 then + if cam.sel then + local M=Modes[cam.sel] + cam.x=cam.x*.8+M.x*cam.k*.2 + cam.y=cam.y*.8+M.y*cam.k*.2 + end + _=cam.zoomK + if _<.8 then _=_*1.05 end + if _<1.1 then _=_*1.05 end + cam.zoomK=_*1.05 + elseif cam.zoomMethod==2 then + cam.zoomK=cam.zoomK^.9 + end + end + + local rankString={ + "D","C","B","A","S", + } + local modeRankColor={ + color.dRed, --D + color.dOrange, --C + color.lYellow, --B + color.lBlue, --A + color.lCyan, --S + color.lGreen, --Special + } + function Pnt.mode() + local _ + local cam=mapCam + gc.push("transform") + gc.translate(640,360) + gc.scale(cam.zoomK) + gc.translate(-cam.x1,-cam.y1) + gc.scale(cam.k1) + local R=modeRanks + local sel=cam.sel + setFont(30) + + --Draw lines connecting modes + gc.setLineWidth(8) + gc.setColor(1,1,1,.2) + for name,M in next,Modes do + if R[name]then + for _=1,#M.unlock do + local m=Modes[M.unlock[_]] + gc.line(M.x,M.y,m.x,m.y) + end + end + end + + for name,M in next,Modes do + if R[name]then + local S=M.size + local d=((M.x-(cam.x1+(sel and -180 or 0))/cam.k1)^2+(M.y-cam.y1/cam.k1)^2)^.55 + if d<500 then S=S*(1.25-d*0.0005) end + local c=modeRankColor[R[M.name]] + if c then + gc.setColor(c) + else + c=.5+sin(Timer()*6.26)*.2 + S=S*(.9+c*.4) + gc.setColor(c,c,c) + end + if M.shape==1 then--Rectangle + gc.rectangle("fill",M.x-S,M.y-S,2*S,2*S) + if sel==name then + gc.setColor(1,1,1) + gc.setLineWidth(10) + gc.rectangle("line",M.x-S+5,M.y-S+5,2*S-10,2*S-10) + end + elseif M.shape==2 then--Diamond + gc.circle("fill",M.x,M.y,S+5,4) + if sel==name then + gc.setColor(1,1,1) + gc.setLineWidth(10) + gc.circle("line",M.x,M.y,S+5,4) + end + elseif M.shape==3 then--Octagon + gc.circle("fill",M.x,M.y,S,8) + if sel==name then + gc.setColor(1,1,1) + gc.setLineWidth(10) + gc.circle("line",M.x,M.y,S,8) + end + end + name=drawableText[rankString[R[M.name]]] + if name then + gc.setColor(0,0,0,.26) + mDraw(name,M.x,M.y) + end + --[[ + if M.icon then + local i=M.icon + local l=i:getWidth()*.5 + local k=S/l*.8 + gc.setColor(0,0,0,2) + gc.draw(i,M.x-1,M.y-1,nil,k,nil,l,l) + gc.draw(i,M.x-1,M.y+1,nil,k,nil,l,l) + gc.draw(i,M.x+1,M.y-1,nil,k,nil,l,l) + gc.draw(i,M.x+1,M.y+1,nil,k,nil,l,l) + gc.setColor(1,1,1) + gc.draw(i,M.x,M.y,nil,k,nil,l,l) + end + ]] + end + end + gc.pop() + if sel then + local M=Modes[sel] + local lang=setting.lang + gc.setColor(.7,.7,.7,.5) + gc.rectangle("fill",920,0,360,720)--Info board + gc.setColor(M.color) + setFont(40)mStr(text.modes[sel][1],1100,5) + setFont(30)mStr(text.modes[sel][2],1100,50) + gc.setColor(1,1,1) + setFont(28)gc.printf(text.modes[sel][3],920,110,360,"center") + if M.slowMark then + gc.draw(IMG.ctrlSpeedLimit,1230,50,nil,.4) + end + if M.score then + mText(drawableText.highScore,1100,240) + gc.setColor(.4,.4,.4,.8) + gc.rectangle("fill",940,290,320,280)--Highscore board + local L=M.records + gc.setColor(1,1,1) + if L[1]then + for i=1,#L do + local t=M.scoreDisp(L[i]) + local s=#t + local dy + if s<15 then dy=0 + elseif s<25 then dy=2 + else dy=4 + end + setFont(int(26-s*.4)) + gc.print(t,955,275+dy+25*i) + setFont(10) + _=L[i].date + if _ then gc.print(_,1155,284+25*i)end + end + else + mText(drawableText.noScore,1100,370) + end + end + end + if cam.keyCtrl then + gc.setColor(1,1,1) + gc.draw(TEXTURE.mapCross,460-20,360-20) + end + end +end + +do--custom + function sceneInit.custom() + sceneTemp=1--Option selected + destroyPlayers() + BG.set(customRange.bg[customSel[12]]) + BGM.play(customRange.bgm[customSel[13]]) + end + + function Pnt.custom() + gc.setColor(1,1,1,.3+sin(Timer()*8)*.2) + gc.rectangle("fill",100,115+40*sceneTemp,570,40) + gc.setColor(.7,.7,.7)gc.draw(drawableText.custom,360,20) + gc.setColor(1,1,1)gc.draw(drawableText.custom,362,23) + setFont(35) + for i=1,#customID do + local k=customID[i] + local y=110+40*i + gc.printf(text.customOption[k],100,y,320,"right") + if text.customVal[k]then + gc.print(text.customVal[k][customSel[i]],440,y) + else + gc.print(customRange[k][customSel[i]],440,y) + end + end + end +end + +do--sequence + function sceneInit.sequence() + sceneTemp={cur=#preBag,sure=0} + end + + function Tmr.sequence() + if sceneTemp.sure>0 then sceneTemp.sure=sceneTemp.sure-1 end + end + + function Pnt.sequence() + local S=sceneTemp + gc.setColor(.7,.7,.7)gc.draw(drawableText.sequence,120,-15) + gc.setColor(1,1,1)gc.draw(drawableText.sequence,122,-12) + gc.setLineWidth(4) + gc.rectangle("line",100,100,1080,260) + setFont(30) + local bag=preBag + local len=#bag + + setFont(40) + gc.print(len,120,300) + + local L=TEXTURE.miniBlock + local lib=SKIN.libColor + local set=setting.skin + + local x,y=120,126 + local cx,cy=120,126 + for i=1,len do + local B=L[bag[i]] + gc.setColor(lib[set[bag[i]]]) + gc.draw(B,x,y,nil,15,15,0,B:getHeight()*.5) + x=x+B:getWidth()*15+10 + if x>1126 then + x,y=120,y+50 + end + if i==S.cur then + cx,cy=x,y + end + end + + gc.setColor(.5,1,.5,.6+.4*sin(Timer()*6.26)) + gc.line(cx-5,cy-20,cx-5,cy+20) + + --Confirm reset + if S.sure>0 then + gc.setColor(1,1,1,S.sure*.02) + gc.draw(drawableText.question,980,470) + end + end +end + +do--draw + function sceneInit.draw() + BG.set("space") + sceneTemp={ + sure=0, + pen=1, + x=1,y=1, + demo=false, + } + end + + function Tmr.draw() + if sceneTemp.sure>0 then sceneTemp.sure=sceneTemp.sure-1 end + end + + function Pnt.draw() + local sx,sy=sceneTemp.x,sceneTemp.y + gc.translate(200,60) + gc.setColor(1,1,1,.2) + gc.setLineWidth(1) + for x=1,9 do gc.line(30*x,0,30*x,600)end + for y=0,19 do gc.line(0,30*y,300,30*y)end + gc.setColor(1,1,1) + gc.setLineWidth(3) + gc.rectangle("line",-2,-2,304,604) + gc.setLineWidth(2) + local cross=puzzleMark[-1] + for y=1,20 do for x=1,10 do + local B=preField[y][x] + if B>0 then + gc.draw(blockSkin[B],30*x-30,600-30*y) + elseif B==-1 and not sceneTemp.demo then + gc.draw(cross,30*x-30,600-30*y) + end + end end + if sx and sy then + gc.setLineWidth(2) + gc.rectangle("line",30*sx-30,600-30*sy,30,30) + end + gc.translate(-200,-60) + + --Pen + local pen=sceneTemp.pen + if pen>0 then + gc.setLineWidth(13) + gc.setColor(SKIN.libColor[pen]) + gc.rectangle("line",565,460,70,70) + elseif pen==-1 then + gc.setLineWidth(5) + gc.setColor(.9,.9,.9) + gc.line(575,470,625,520) + gc.line(575,520,625,470) + end + + --Confirm reset + if sceneTemp.sure>0 then + gc.setColor(1,1,1,sceneTemp.sure*.02) + gc.draw(drawableText.question,1040,430) + end + + --Block name + setFont(40) + local _ + for i=1,7 do + _=setting.skin[i] + gc.setColor(SKIN.libColor[_]) + mStr(text.block[i],500+65*_,65) + end + end +end + +do--play + function sceneInit.play() + love.keyboard.setKeyRepeat(false) + restartCount=0 + if needResetGameData then + resetGameData() + needResetGameData=nil + end + BG.set(modeEnv.bg) + end + + function Tmr.play(dt) + local _ + game.frame=game.frame+1 + stat.time=stat.time+dt + + --Update virtualkey animation + if setting.VKSwitch then + for i=1,#virtualkey do + _=virtualkey[i] + if _.pressTime>0 then + _.pressTime=_.pressTime-1 + end + end + end + + local P1=players[1] + + --Replay + if game.replaying then + _=game.replaying + local L=game.rec + while game.frame==L[_]do + local k=L[_+1] + if k>0 then + P1:pressKey(k) + virtualkey[k].isDown=true + virtualkey[k].pressTime=10 + else + virtualkey[-k].isDown=false + P1:releaseKey(-k) + end + _=_+2 + end + game.replaying=_ + end + --Counting,include pre-das,directy RETURN,or restart counting + if game.frame<180 then + if game.frame==179 then + gameStart() + elseif game.frame==60 or game.frame==120 then + SFX.play("ready") + end + for p=1,#players do + local P=players[p] + if P.movDir~=0 then + if P.moving0 then restartCount=restartCount-1 end + return + elseif P1.keyPressing[10]then + restartCount=restartCount+1 + if restartCount>20 then + TASK.clear("play") + resetPartGameData() + return + end + elseif restartCount>0 then + restartCount=restartCount>2 and restartCount-2 or 0 + end + + --Update players + for p=1,#players do + local P=players[p] + P:update(dt) + end + + --Fresh royale target + if game.frame%120==0 then + if modeEnv.royaleMode then freshMostDangerous()end + end + + --Warning check + if P1.alive then + if game.frame%26==0 and setting.warn then + local F=P1.field + local height=0--Max height of row 4~7 + for x=4,7 do + for y=#F,1,-1 do + if F[y][x]>0 then + if y>height then + height=y + end + break + end + end + end + game.warnLVL0=log(height-15+P1.atkBuffer.sum*.8) + end + _=game.warnLVL + if _0 then + _=max(_-.026,0) + end + game.warnLVL=_ + elseif game.warnLVL>0 then + game.warnLVL=max(game.warnLVL-.026,0) + end + end + + local function drawAtkPointer(x,y) + local t=sin(Timer()*20) + gc.setColor(.2,.7+t*.2,1,.6+t*.4) + gc.circle("fill",x,y,25,6) + local a=Timer()*3%1*.8 + gc.setColor(0,.6,1,.8-a) + gc.circle("line",x,y,30*(1+a),6) + end + local function drawVirtualkey() + local V=virtualkey + local a=setting.VKAlpha + local _ + if setting.VKIcon then + local icons=TEXTURE.VKIcon + for i=1,#V do + if V[i].ava then + local B=V[i] + gc.setColor(1,1,1,a) + gc.setLineWidth(B.r*.07) + gc.circle("line",B.x,B.y,B.r,10)--Button outline + _=V[i].pressTime + gc.draw(icons[i],B.x,B.y,nil,B.r*.026+_*.08,nil,18,18)--Icon + if _>0 then + gc.setColor(1,1,1,a*_*.08) + gc.circle("fill",B.x,B.y,B.r*.94,10)--Glow + gc.circle("line",B.x,B.y,B.r*(1.4-_*.04),10)--Ripple + end + end + end + else + for i=1,#V do + if V[i].ava then + local B=V[i] + gc.setColor(1,1,1,a) + gc.setLineWidth(B.r*.07) + gc.circle("line",B.x,B.y,B.r,10) + _=V[i].pressTime + if _>0 then + gc.setColor(1,1,1,a*_*.08) + gc.circle("fill",B.x,B.y,B.r*.94,10) + gc.circle("line",B.x,B.y,B.r*(1.4-_*.04),10) + end + end + end + end + end + function Pnt.play() + if marking then + setFont(26) + local t=Timer() + gc.setColor(1,1,1,.2+.1*(sin(3*t)+sin(2.6*t))) + mStr(text.marking,190,60+26*sin(t)) + end + for p=1,#players do + players[p]:draw() + end + + gc.setColor(1,1,1) + if setting.VKSwitch then drawVirtualkey()end + + if modeEnv.royaleMode then + local P=players[1] + gc.setLineWidth(5) + gc.setColor(.8,1,0,.2) + for i=1,#P.atker do + local p=P.atker[i] + gc.line(p.centerX,p.centerY,P.x+300*P.size,P.y+670*P.size) + end + if P.atkMode~=4 then + if P.atking then drawAtkPointer(P.atking.centerX,P.atking.centerY)end + else + for i=1,#P.atker do + local p=P.atker[i] + drawAtkPointer(p.centerX,p.centerY) + end + end + end + + --Mode info + gc.setColor(1,1,1,.8) + gc.draw(drawableText.modeName,485,10) + gc.draw(drawableText.levelName,511+drawableText.modeName:getWidth(),10) + + --Replaying + if game.replaying then + gc.setColor(1,1,Timer()%1>.5 and 1 or 0) + mText(drawableText.replaying,410,17) + end + + --Warning + gc.push("transform") + gc.origin() + if restartCount>0 then + gc.setColor(0,0,0,restartCount*.05) + gc.rectangle("fill",0,0,scr.W,scr.H) + end + if game.warnLVL>0 then + gc.setColor(0,0,0,0) + SHADER.warning:send("level",game.warnLVL) + gc.setShader(SHADER.warning) + gc.rectangle("fill",0,0,scr.w,scr.h) + gc.setShader() + end + gc.pop() + end +end + +do--pause + function sceneInit.pause(org) + if + org=="setting_game"or + org=="setting_video"or + org=="setting_sound" + then + TEXT.show(text.needRestart,640,440,50,"fly",.6) + end + local S=players[1].stat + sceneTemp={ + timer=org=="play"and 0 or 50, + list={ + toTime(S.time), + format("%d/%d/%d",S.key,S.rotate,S.hold), + format("%d %.2fPPS",S.piece,S.piece/S.time), + format("%d(%d) %.2fLPM",S.row,S.dig,S.row/S.time*60), + format("%d(%d) %.2fAPM",S.atk,S.digatk,S.atk/S.time*60), + format("%d(%d-%d)",S.pend,S.recv,S.recv-S.pend), + format("%d/%d/%d/%d",S.clears[1],S.clears[2],S.clears[3],S.clears[4]), + format("(%d)/%d/%d/%d",S.spins[1],S.spins[2],S.spins[3],S.spins[4]), + format("%d/%d ; %d/%d",S.b2b,S.b3b,S.pc,S.hpc), + format("%d [%.2f%%]",S.extraPiece,100*max(1-S.extraRate/S.piece,0)), + }, + + --From right-down, 60 degree each + radar={ + (S.off+S.dig)/S.time*60,--DefPM + (S.send+S.dig)/S.time*60,--ADPM + S.atk/S.time*60, --AtkPM + S.send/S.time*60, --SendPM + S.piece/S.time*24, --LinePM + S.dig/S.time*60, --DigPM + }, + val={1/80,1/80,1/80,1/60,1/100,1/40}, + timing=org=="play", + } + local _=sceneTemp + local A,B=_.radar,_.val + + --Normalize Values + for i=1,6 do + B[i]=B[i]*A[i]if B[i]>1.26 then B[i]=1.26+log(B[i]-.26,10)end + end + + for i=1,6 do + A[i]=format("%.2f",A[i])..text.radarData[i] + end + local f=1 + for i=1,6 do + if B[i]>.5 then f=2 end + if B[i]>1 then f=3 break end + end + if f==1 then _.color,f={.4,.9,.5},1.25 --Vegetable + elseif f==2 then _.color,f={.4,.7,.9},1 --Normal + elseif f==3 then _.color,f={1,.3,.3},.626 --Diao + end + A={ + 120*.5*f, 120*3^.5*.5*f, + 120*-.5*f, 120*3^.5*.5*f, + 120*-1*f, 120*0*f, + 120*-.5*f, 120*-3^.5*.5*f, + 120*.5*f, 120*-3^.5*.5*f, + 120*1*f, 120*0*f, + } + _.scale=f + _.standard=A + + for i=6,1,-1 do + B[2*i-1],B[2*i]=B[i]*A[2*i-1],B[i]*A[2*i] + end + _.val=B + end + function sceneBack.pause() + love.keyboard.setKeyRepeat(true) + if not game.replaying then + mergeStat(stat,players[1].stat) + end + FILE.saveData() + TASK.clear("play") + end + + function Tmr.pause(dt) + if not game.result then + game.pauseTime=game.pauseTime+dt + end + if sceneTemp.timer<50 then + sceneTemp.timer=sceneTemp.timer+1 + end + end + + local hexList={1,0,.5,1.732*.5,-.5,1.732*.5} + for i=1,6 do hexList[i]=hexList[i]*150 end + local textPos={90,131,-90,131,-200,-25,-90,-181,90,-181,200,-25} + local dataPos={90,143,-90,143,-200,-13,-90,-169,90,-169,200,-13} + function Pnt.pause() + local S=sceneTemp + local T=S.timer*.02 + if T<1 or game.result then Pnt.play()end + --Dark BG + local _=T + if game.result then _=_*.7 end + gc.setColor(.15,.15,.15,_) + gc.push("transform") + gc.origin() + gc.rectangle("fill",0,0,scr.W,scr.H) + gc.pop() + + --Pause Info + setFont(25) + if game.pauseCount>0 then + gc.setColor(1,.4,.4,T) + gc.print(text.pauseCount..":["..game.pauseCount.."] "..format("%.2f",game.pauseTime).."s",70,100) + end + + gc.setColor(1,1,1,T) + + --Mode Info + _=drawableText.modeName + gc.draw(_,40,170) + gc.draw(drawableText.levelName,60+_:getWidth(),170) + + --Result Text + setFont(35) + mText(game.result and drawableText[game.result]or drawableText.pause,640,50-10*(5-sceneTemp.timer*.1)^1.5) + + --Infos + if game.frame>180 then + _=S.list + setFont(26) + for i=1,10 do + gc.print(text.pauseStat[i],40,210+40*i) + gc.printf(_[i],195,210+40*i,300,"right") + end + end + + --Radar Chart + if T>.5 and game.frame>180 then + T=T*2-1 + gc.setLineWidth(2) + gc.push("transform") + gc.translate(1026,400) + + --Polygon + gc.push("transform") + gc.scale((3-2*T)*T) + gc.setColor(1,1,1,T*(.5+.3*sin(Timer()*6.26)))gc.polygon("line",S.standard) + _=S.color + gc.setColor(_[1],_[2],_[3],T*.626) + _=S.val + for i=1,9,2 do + gc.polygon("fill",0,0,_[i],_[i+1],_[i+2],_[i+3]) + end + gc.polygon("fill",0,0,_[11],_[12],_[1],_[2]) + gc.setColor(1,1,1,T)gc.polygon("line",S.val) + gc.pop() + + --Axes + gc.setColor(1,1,1,T) + for i=1,3 do + local x,y=hexList[2*i-1],hexList[2*i] + gc.line(-x,-y,x,y) + end + + --Texts + local C + _=Timer()%6.2832 + if _>3.1416 then + gc.setColor(1,1,1,-T*sin(_)) + setFont(35) + C,_=text.radar,textPos + else + gc.setColor(1,1,1,T*sin(_)) + setFont(18) + C,_=S.radar,dataPos + end + for i=1,6 do + mStr(C[i],_[2*i-1],_[2*i]) + end + gc.pop() + end + end +end + +do--setting_game + function sceneInit.setting_game() + BG.set("space") + end + function sceneBack.setting_game() + FILE.saveSetting() + end + + function Pnt.setting_game() + gc.setColor(1,1,1) + mText(drawableText.setting_game,640,15) + gc.draw(blockSkin[int(Timer()*2)%11+1],590,540,Timer()%6.28319,2,nil,15,15) + end +end + +do--setting_video + function sceneInit.setting_video() + BG.set("space") + end + function sceneBack.setting_video() + FILE.saveSetting() + end + + function Pnt.setting_video() + gc.setColor(1,1,1) + mText(drawableText.setting_video,640,15) + end +end + +do--setting_sound + function sceneInit.setting_sound() + sceneTemp={ + last=0,--Last sound time + jump=0,--Animation timer(10 to 0) + } + BG.set("space") + end + function sceneBack.setting_sound() + FILE.saveSetting() + end + + function Tmr.setting_sound() + local t=sceneTemp.jump + if t>0 then + sceneTemp.jump=t-1 + end + end + + function Pnt.setting_sound() + gc.setColor(1,1,1) + mText(drawableText.setting_sound,640,15) + local t=Timer() + local _=sceneTemp.jump + local x,y=800,340+10*sin(t*.5)+(_-10)*_*.3 + gc.translate(x,y) + gc.draw(IMG.miyaCH,0,0) + gc.setColor(1,1,1,.7) + gc.draw(IMG.miyaF1,4,47+4*sin(t*.9)) + gc.draw(IMG.miyaF2,42,107+5*sin(t)) + gc.draw(IMG.miyaF3,93,126+3*sin(t*.7)) + gc.draw(IMG.miyaF4,129,98+3*sin(t*.7)) + gc.translate(-x,-y) + end +end + +do--setting_control + function sceneInit.setting_control() + sceneTemp={ + das=setting.das, + arr=setting.arr, + pos=0, + dir=1, + wait=30, + } + BG.set("bg1") + end + + function Tmr.setting_control() + local T=sceneTemp + if T.wait>0 then + T.wait=T.wait-1 + if T.wait==0 then + T.pos=T.pos+T.dir + else + return + end + end + if T.das>0 then + T.das=T.das-1 + if T.das==0 then + if T.arr==0 then + T.pos=T.pos+7*T.dir + T.das=setting.das+1 + T.arr=setting.arr + T.dir=-T.dir + T.wait=26 + else + T.pos=T.pos+T.dir + end + end + else + T.arr=T.arr-1 + if T.arr==0 then + T.pos=T.pos+T.dir + T.arr=setting.arr + elseif T.arr==-1 then + T.pos=T.dir>0 and 8 or 0 + T.arr=setting.arr + end + if T.pos%8==0 then + T.dir=-T.dir + T.wait=26 + T.das=setting.das + end + end + end + + function Pnt.setting_control() + --Testing grid line + gc.setLineWidth(4) + gc.setColor(1,1,1,.4) + gc.line(550,540,950,540) + gc.line(550,580,950,580) + gc.line(550,620,950,620) + for x=590,910,40 do + gc.line(x,530,x,630) + end + gc.setColor(1,1,1) + gc.line(550,530,550,630) + gc.line(950,530,950,630) + + --Texts + gc.setColor(.7,.7,.7)gc.draw(drawableText.setting_control,80,50) + gc.setColor(1,1,1)gc.draw(drawableText.setting_control,80,50) + setFont(50) + gc.printf(text.preview,320,540,200,"right") + + --Testing O mino + _=blockSkin[setting.skin[6]] + local x=550+40*sceneTemp.pos + gc.draw(_,x,540,nil,40/30) + gc.draw(_,x,580,nil,40/30) + gc.draw(_,x+40,540,nil,40/30) + gc.draw(_,x+40,580,nil,40/30) + end +end + +do--setting_key + function sceneInit.setting_key() + sceneTemp={ + board=1, + kb=1,js=1, + kS=false,jS=false, + } + end + function sceneBack.setting_key() + FILE.saveKeyMap() + end + + function Pnt.setting_key() + local S=sceneTemp + local a=.3+sin(Timer()*15)*.1 + if S.kS then gc.setColor(1,.3,.3,a)else gc.setColor(1,.7,.7,a)end + gc.rectangle("fill", + S.kb<11 and 240 or 840, + 45*S.kb+20-450*int(S.kb/11), + 200,45 + ) + if S.jS then gc.setColor(.3,.3,.1,a)else gc.setColor(.7,.7,1,a)end + gc.rectangle("fill", + S.js<11 and 440 or 1040, + 45*S.js+20-450*int(S.js/11), + 200,45 + ) + --Selection rect + + gc.setColor(1,.3,.3) + mText(drawableText.keyboard,340,30) + mText(drawableText.keyboard,940,30) + gc.setColor(.3,.3,1) + mText(drawableText.joystick,540,30) + mText(drawableText.joystick,1140,30) + + gc.setColor(1,1,1) + setFont(26) + local b1,b2=keyMap[S.board],keyMap[S.board+2] + for N=1,20 do + if N<11 then + gc.printf(text.acts[N],47,45*N+22,180,"right") + mStr(b1[N],340,45*N+22) + mStr(b2[N],540,45*N+22) + else + gc.printf(text.acts[N],647,45*N-428,180,"right") + mStr(b1[N],940,45*N-428) + mStr(b2[N],1040,45*N-428) + end + end + gc.setLineWidth(2) + for x=40,1240,200 do + gc.line(x,65,x,515) + end + for y=65,515,45 do + gc.line(40,y,1240,y) + end + setFont(35) + gc.print(text.page..S.board,280,590) + gc.draw(drawableText.ctrlSetHelp,50,650) + end +end + +do--setting_skin + local scs=require("parts/spinCenters") + function Pnt.setting_skin() + gc.setColor(.7,.7,.7)gc.draw(drawableText.setting_skin,80,50) + gc.setColor(1,1,1)gc.draw(drawableText.setting_skin,80,50) + for N=1,7 do + local face=setting.face[N] + local B=blocks[N][face] + local x,y=-55+140*N-scs[N][face][2]*30,355+scs[N][face][1]*30 + local col=#B[1] + for i=1,#B do for j=1,col do + if B[i][j]then + gc.draw(blockSkin[setting.skin[N]],x+30*j,y-30*i) + end + end end + gc.circle("fill",-10+140*N,340,sin(Timer()*10)+5) + end + for i=1,6 do + gc.draw(blockSkin[11+i],570+60*i,610,nil,2) + end + end +end + +do--setting_touch + function sceneInit.setting_touch() + BG.set("rainbow") + sceneTemp={ + default=1, + snap=1, + sel=nil, + } + end + function sceneBack.setting_touch() + FILE.saveVK() + end + + local function VirtualkeyPreview() + if setting.VKSwitch then + for i=1,#VK_org do + local B=VK_org[i] + if B.ava then + local c=sceneTemp.sel==i and .6 or 1 + gc.setColor(c,1,c,setting.VKAlpha) + gc.setLineWidth(B.r*.07) + gc.circle("line",B.x,B.y,B.r,10) + if setting.VKIcon then gc.draw(TEXTURE.VKIcon[i],B.x,B.y,nil,B.r*.025,nil,18,18)end + end + end + end + end + function Pnt.setting_touch() + gc.setColor(1,1,1) + gc.setLineWidth(7)gc.rectangle("line",340,15,600,690) + gc.setLineWidth(3)gc.rectangle("line",490,85,300,600) + VirtualkeyPreview() + local d=snapLevelValue[sceneTemp.snap] + if d>=10 then + gc.setLineWidth(3) + gc.setColor(1,1,1,sin(Timer()*4)*.1+.1) + for i=1,1280/d-1 do + gc.line(d*i,0,d*i,720) + end + for i=1,720/d-1 do + gc.line(0,d*i,1280,d*i) + end + end + end +end + +do--setting_trackSetting + function Pnt.setting_trackSetting() + gc.setColor(1,1,1) + mText(drawableText.VKTchW,140+50*setting.VKTchW,260) + mText(drawableText.VKOrgW,140+50*setting.VKTchW+50*setting.VKCurW,320) + mText(drawableText.VKCurW,640+50*setting.VKCurW,380) + end +end + +do--setting_touchSwitch + function sceneInit.setting_touchSwitch() + BG.set("matrix") + end +end + +do--setting_lang + function sceneBack.setting_lang() + FILE.saveSetting() + end +end + +do--help + function sceneInit.help() + BG.set("space") + end + + function Pnt.help() + setFont(20) + gc.setColor(1,1,1) + for i=1,#text.help do + gc.printf(text.help[i],150,35*i+40,1000,"center") + end + setFont(19) + gc.print(text.used,30,330) + gc.draw(IMG.title,280,610,.1,1+.05*sin(Timer()*2.6),nil,206,35) + gc.setLineWidth(3) + gc.rectangle("line",18,18,263,263) + gc.rectangle("line",1012,18,250,250) + gc.draw(IMG.pay1,20,20) + gc.draw(IMG.pay2,1014,20) + setFont(20) + mStr(text.group,640,490) + gc.setColor(1,1,1,sin(Timer()*20)*.3+.6) + setFont(30) + mStr(text.support,150+sin(Timer()*4)*20,283) + mStr(text.support,1138-sin(Timer()*4)*20,270) + end +end + +do--staff + function sceneInit.staff() + sceneTemp={ + time=0, + v=1, + } + BG.set("space") + end + + function Tmr.staff(dt) + local S=sceneTemp + if kb.isDown("space","return")and S.v<6.26 then + S.v=S.v+.26 + elseif S.v>1 then + S.v=S.v-.26 + end + S.time=S.time+S.v*dt + if S.time>45 then + S.time=45 + end + end + + function Pnt.staff() + local L=text.staff + local t=sceneTemp.time + setFont(40) + for i=1,#L do + mStr(L[i],640,800+80*i-t*40) + end + mDraw(IMG.title_color,640,800-t*40,nil,2) + mDraw(IMG.title_color,640,2160-t*40,nil,2) + end +end + +do--stat + function sceneInit.stat() + local S=stat + local X1,X2,Y1,Y2={0,0,0,0},{0,0,0,0},{},{} + for i=1,7 do + local S,C=S.spin[i],S.clear[i] + Y1[i]=S[1]+S[2]+S[3]+S[4] + Y2[i]=C[1]+C[2]+C[3]+C[4] + for j=1,4 do + X1[j]=X1[j]+S[j] + X2[j]=X2[j]+C[j] + end + end + sceneTemp={ + chart={ + A1=S.spin,A2=S.clear, + X1=X1,X2=X2, + Y1=Y1,Y2=Y2, + }, + item={ + S.run, + S.game, + toTime(S.time), + S.key.." "..S.rotate.." "..S.hold, + S.piece.." "..S.row.." "..int(S.atk), + S.recv.." "..S.off.." "..S.pend, + S.dig.." "..int(S.digatk), + format("%.2f %.2f",S.atk/S.row,S.digatk/S.dig), + format("%d/%.3f%%",S.extraPiece,100*max(1-S.extraRate/S.piece,0)), + S.b2b.." "..S.b3b, + S.pc.." "..S.hpc, + }, + } + for i=1,11 do + sceneTemp.item[i]=text.stat[i].."\t"..sceneTemp.item[i] + end + end + + function Pnt.stat() + local chart=sceneTemp.chart + setFont(24) + local _,__=SKIN.libColor,setting.skin + local A,B=chart.A1,chart.A2 + for x=1,7 do + gc.setColor(_[__[x]]) + mStr(text.block[x],80*x,40) + mStr(text.block[x],80*x,280) + for y=1,4 do + mStr(A[x][y],80*x,40+40*y) + mStr(B[x][y],80*x,280+40*y) + end + mStr(chart.Y1[x],80*x,240) + mStr(chart.Y2[x],80*x,480) + end + gc.setColor(1,1,1) + A,B=chart.X1,chart.X2 + mStr(text.stat.spin,650,45) + mStr(text.stat.clear,650,285) + for y=1,4 do + mStr(A[y],650,40+40*y) + mStr(B[y],650,280+40*y) + end + + setFont(22) + for i=1,11 do + gc.print(sceneTemp.item[i],740,40*i+10) + end + + gc.setLineWidth(4) + for x=1,8 do + x=80*x-40 + gc.line(x,80,x,240) + gc.line(x,320,x,480) + end + for y=2,6 do + gc.line(40,40*y,600,40*y) + gc.line(40,240+40*y,600,240+40*y) + end + + gc.draw(IMG.title,260,615,.2+.04*sin(Timer()*3),nil,nil,206,35) + end +end + +do--history + function sceneInit.history() + BG.set("rainbow") + sceneTemp={ + text=require("parts/updateLog"),--Text list + pos=1,--Scroll pos + } + if newVersionLaunch then + newVersionLaunch=nil + sceneTemp.pos=4 + end + end + + function Pnt.history() + gc.setColor(.2,.2,.2,.7) + gc.rectangle("fill",30,45,1000,632) + gc.setColor(1,1,1) + gc.setLineWidth(4) + gc.rectangle("line",30,45,1000,632) + setFont(20) + local S=sceneTemp + gc.print(S.text[S.pos],40,50) + end +end + +do--debug + function sceneInit.debug() + sceneTemp={ + reset=false, + } + end +end + +do--quit + function sceneInit.quit() + if rnd()>.000626 then + love.timer.sleep(.3) + love.event.quit() + else + error("So lucky! 0.0626 precent to get this!!! You can quit the game now.") + end + end +end \ No newline at end of file