diff --git a/BGM/sores.ogg b/BGM/end.ogg similarity index 100% rename from BGM/sores.ogg rename to BGM/end.ogg diff --git a/ai.lua b/ai.lua index 89f441d3..10f57268 100644 --- a/ai.lua +++ b/ai.lua @@ -51,7 +51,7 @@ function ifoverlapAI(f,bk,x,y) if y<1 then return true end if y>#f then return end for i=1,#bk do for j=1,#bk[1]do - if f[y+i-1]and bk[i][j]>0 and f[y+i-1][x+j-1]>0 then return true end + if f[y+i-1]and bk[i][j]and f[y+i-1][x+j-1]>0 then return true end end end end function resetField(f0,f,start) @@ -117,7 +117,7 @@ function getScore(field,bn,cb,cx,cy) +clearScore[clear]*(8+#field) -hole*50 if #field>6 then score=score-highest*5 end - if mh1>3 then score=score-50-mh1*40 end + if mh1>3 then score=score-40-mh1*30 end return score end function AI_getControls(ctrl) @@ -131,7 +131,7 @@ function AI_getControls(ctrl) end local best={x=1,dir=0,hold=false,score=-9e99} for ifhold=0,P.gameEnv.hold and 1 or 0 do - local bn=ifhold==0 and P.curID or P.holdID>0 and P.holdID or P.nextID[1] + local bn=ifhold==0 and P.cur.id or P.hold.id>0 and P.hold.id or P.next[1].id for dir=0,dirCount[bn] do--each dir local cb=blocks[bn][dir] for cx=1,11-#cb[1]do--each pos @@ -144,7 +144,7 @@ function AI_getControls(ctrl) local y=cy+i-1 if not Tfield[y]then Tfield[y]=getNewRow()end for j=1,#cb[1]do - if cb[i][j]~=0 then + if cb[i][j]then Tfield[y][cx+j-1]=1 end end diff --git a/call&sys.lua b/call&sys.lua index 077c4d68..da564170 100644 --- a/call&sys.lua +++ b/call&sys.lua @@ -1,3 +1,99 @@ +local gc=love.graphics +local tm=love.timer +local ms=love.mouse +local tc=love.touch +local wd=love.window +local setFont=setFont +local Timer=tm.getTime + +local ww,wh=gc.getWidth(),gc.getHeight() +local xOy=love.math.newTransform() +local focus=true +local mx,my,mouseShow=-20,-20,false +local touching=nil--1st touching ID +local sceneInit={ + load=function() + curBG="none" + keeprun=true + loading=1--Loading mode + loadnum=1--Loading counter + loadprogress=0--Loading bar(0~1) + end, + intro=function() + curBG="none" + count=0 + keeprun=true + end, + main=function() + curBG="none" + keeprun=true + collectgarbage() + end, + mode=function() + saveData() + modeSel=modeSel or 1 + levelSel=levelSel or 3 + curBG="none" + keeprun=true + end, + custom=function() + optSel=optSel or 1 + curBG="matrix" + keeprun=true + end, + play=function() + keeprun=false + resetGameData() + sysSFX("ready") + end, + setting=function() + curBG="none" + keeprun=true + end, + setting2=function() + curBG="none" + keeprun=true + curBoard=1 + keyboardSet=1 + joystickSet=1 + keyboardSetting=false + joystickSetting=false + end,--Control settings + setting3=function() + curBG="game1" + keeprun=true + defaultSel=1 + sel=nil + snapLevel=1 + end,--Touch setting + help=function() + curBG="none" + keeprun=true + end, + stat=function() + curBG="none" + keeprun=true + end, + quit=function() + love.event.quit() + end, +} +BGblockList={}for i=1,16 do BGblockList[i]={v=0}end +local BGblock={tm=150,next=7,ct=0} +local function getNewBlock() + BGblock.ct=BGblock.ct+1 + if BGblock.ct==17 then BGblock.ct=1 end + local t=BGblockList[BGblock.ct] + t.bn,t.size=BGblock.next,2+3*rnd() + t.b=blocks[t.bn][rnd(0,3)] + t.x=rnd(-#t.b[1]*t.size*30+100,1180) + t.y=-#t.b*30*t.size + t.v=t.size*(1+rnd()) + BGblock.next=BGblock.next%7+1 + return t +end +local scs={{1,2},{1,2},{1,2},{1,2},{1,2},{1.5,1.5},{0.5,2.5}} + function onVirtualkey(x,y) local x,y=xOy:inverseTransformPoint(x,y) local d2,nearest,distance @@ -54,6 +150,11 @@ function mouseDown.intro(x,y,k) gotoScene("main") end end +wheelmoved={} +function wheelmoved.mode(x,y) + modeSel=min(max(modeSel+(y>0 and -1 or 1),1),#modeID) + levelSel=ceil(#modeLevel[modeID[modeSel]]*.5) +end keyDown={} function keyDown.intro(key) if key=="escape"then @@ -243,11 +344,6 @@ function gamepadUp.play(key) end end end -wheelmoved={} -function wheelmoved.mode(x,y) - modeSel=min(max(modeSel-sgn(y),1),#modeID) - levelSel=ceil(#modeLevel[modeID[modeSel]]*.5) -end @@ -321,7 +417,7 @@ function love.touchreleased(id,x,y) if id==touching then touching=nil if Buttons.sel then - local B=Buttons[scene][Buttons.sel] + local B=Buttons.sel B.code() B.alpha=1 Buttons.sel=nil @@ -372,15 +468,14 @@ function love.touchmoved(id,x,y,dx,dy) end function love.keypressed(i) - if i=="f12"then devMode=not devMode end + if i=="f8"then devMode=not devMode end if devMode then if i=="k"then P=players.alive[rnd(#players.alive)] Event_gameover.lose() --Test code here elseif i=="q"then - for i=1,#Buttons[scene]do - local B=Buttons[scene][i] + for k,B in next,Buttons[scene]do print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h)) end elseif Buttons.sel then @@ -429,6 +524,13 @@ end function love.joystickhat(js,hat,dir) end + +function love.sendData(data) + return +end +function love.receiveData(id,data) + return +end ]] function love.update(dt) @@ -444,10 +546,10 @@ function love.update(dt) if BGblock[i].y>720 then rem(BGblock,i)end end if setting.bgblock then - BGblock.ct=BGblock.ct-1 - if BGblock.ct==0 then + BGblock.tm=BGblock.tm-1 + if BGblock.tm==0 then ins(BGblock,getNewBlock()) - BGblock.ct=rnd(20,30) + BGblock.tm=rnd(20,30) end end if sceneSwaping then @@ -472,21 +574,14 @@ function love.update(dt) end updateButton() end -function love.sendData(data) - return -end -function love.receiveData(id,data) - return -end function love.draw() - gc.clear() Pnt.BG[curBG]() - gc.setColor(1,1,1,.3) + gc.setColor(1,1,1,.22) for n=1,#BGblock do local b,img=BGblock[n].b,blockSkin[BGblock[n].bn] local size=BGblock[n].size for i=1,#b do for j=1,#b[1]do - if b[i][j]>0 then + if b[i][j]then gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size) end end end @@ -497,7 +592,7 @@ function love.draw() local r=Timer()*.5 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][0][2]-.5,#blocks[r][0]-scs[r][0][1]+.5) + 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) diff --git a/class.lua b/class.lua index f0a3950b..bef373df 100644 --- a/class.lua +++ b/class.lua @@ -9,7 +9,6 @@ function newTask(code,P,data) setmetatable(obj,metatable_task) ins(Task,obj) end - function clearTask(opt) if opt=="all"then while Task[1]do diff --git a/conf.lua b/conf.lua index 3b88922f..f3345fb2 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.12" + W.title="Techmino V0.7.13+" W.icon="/image/icon.png" W.width,W.height=1280,720 W.minwidth,W.minheight=640,360 @@ -17,7 +17,7 @@ function love.conf(t) W.resizable=true W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string) W.fullscreen=X - W.vsync=0--0 to set ∞fps + W.vsync=0--0→∞fps W.msaa=X--The number of samples to use with multi-sampled antialiasing (number) W.depth=X--Bits per sample in the depth buffer W.stencil=1--The number of bits per sample in the stencil buffer diff --git a/dataList.lua b/dataList.lua index 9ae9cb74..0139296a 100644 --- a/dataList.lua +++ b/dataList.lua @@ -1,3 +1,6 @@ +local gc=love.graphics +local setFont=setFont + local PCbase={ {3,3,3,0,0,0,0,0,2,2}, {3,6,6,0,0,0,0,2,2,5}, @@ -8,7 +11,7 @@ local PCbase={ {5,5,2,2,0,0,0,6,6,4}, {5,2,2,0,0,0,0,4,4,4}, } -local PClist={ +PClist={ {7,7,4,5},{7,7,6,4},{7,7,2,4},{7,7,1,3},{7,7,5,6},{7,7,5,2},{7,7,5,4},{7,7,5,3}, {7,4,1,2},{7,3,5,7},{7,5,4,3},{7,5,1,2},{7,1,4,2},{7,4,2,5},{7,6,4,5},{7,5,4,2}, {7,5,6,4},{7,5,3,6},{7,2,5,6},{7,2,6,4},{7,2,1,3},{7,5,2,7},{7,5,7,2},{7,5,2,3}, @@ -23,70 +26,265 @@ local marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0} local rush_lock={20,18,16,15,14} local rush_wait={12,10,9,8,7} local rush_fall={18,16,14,13,12} -local death_lock={12,10,9,8,7} +local death_lock={12,11,10,9,8} local death_wait={10,9,8,7,6} local death_fall={10,9,8,7,6} local pc_drop={50,45,40,35,30,26,22,18,15,12} local pc_lock={55,50,45,40,36,32,30} local pc_fall={18,16,14,12,10,9,8,7,6} -freshMethod={ - bag7=function() - if #P.nextID<6 then - local bag={1,2,3,4,5,6,7} - for i=1,7 do - newNext(rem(bag,rnd(#bag))) - end +loadmode={ + sprint=function() + createPlayer(1,340,15) + end, + marathon=function() + createPlayer(1,340,15) + end, + master=function() + createPlayer(1,340,15) + end, + classic=function() + createPlayer(1,340,15) + end, + zen=function() + createPlayer(1,340,15) + end, + infinite=function() + createPlayer(1,340,15) + end, + solo=function() + createPlayer(1,340,15) + createPlayer(2,965,360,.5,customRange.opponent[3*curMode.lv]) + end, + tsd=function() + createPlayer(1,340,15) + end, + blind=function() + createPlayer(1,340,15) + end, + dig=function() + createPlayer(1,340,15) + newTask(Event_task[curMode.lv==1 and"dig_normal"or curMode.lv==2 and"dig_lunatic"],P) + pushSpeed=1 + end, + survivor=function() + createPlayer(1,340,15) + newTask(Event_task[curMode.lv==1 and"survivor_easy"or curMode.lv==2 and"survivor_normal"or curMode.lv==3 and"survivor_hard"or curMode.lv==4 and"survivor_lunatic"or curMode.lv==5 and"survivor_ultimate"],P) + pushSpeed=curMode.lv>2 and 2 or 1 + end, + tech=function() + createPlayer(1,340,15) + end, + pctrain=function() + createPlayer(1,340,15) + P=players[1] + Event.newPC() + P.freshNext() + end, + pcchallenge=function() + createPlayer(1,340,15) + end, + techmino41=function() + createPlayer(1,340,15)--Player + if curMode.lv==5 then players[1].gameEnv.drop=15 end + local n,min,max=2 + if curMode.lv==1 then min,max=5,30 + elseif curMode.lv==2 then min,max=3,25 + elseif curMode.lv==3 then min,max=2,20 + elseif curMode.lv==4 then min,max=2,10 + elseif curMode.lv==5 then min,max=1,6 + end + for i=1,4 do for j=1,5 do + createPlayer(n,77*i-55,140*j-125,.2,rnd(min,max)) + n=n+1 + end end + for i=9,12 do for j=1,5 do + createPlayer(n,77*i+275,140*j-125,.2,rnd(min,max)) + n=n+1 + end end + --AIs + + end, + techmino99=function() + createPlayer(1,340,15)--Player + if curMode.lv==5 then players[1].gameEnv.drop=15 end + local n,min,max=2 + if curMode.lv==1 then min,max=5,32 + elseif curMode.lv==2 then min,max=3,25 + elseif curMode.lv==3 then min,max=2,18 + elseif curMode.lv==4 then min,max=2,12 + elseif curMode.lv==5 then min,max=1,12 + end + for i=1,7 do for j=1,7 do + createPlayer(n,46*i-36,97*j-72,.135,rnd(min,max)) + n=n+1 + end end + for i=15,21 do for j=1,7 do + createPlayer(n,46*i+264,97*j-72,.135,rnd(min,max)) + n=n+1 + end end + --AIs + + end, + drought=function() + createPlayer(1,340,15) + end, + hotseat=function() + if curMode.lv==1 then + createPlayer(1,20,15) + createPlayer(2,650,15) + elseif curMode.lv==2 then + createPlayer(1,20,100,.65) + createPlayer(2,435,100,.65) + createPlayer(3,850,100,.65) + elseif curMode.lv==3 then + createPlayer(1,25,160,.5) + createPlayer(2,335,160,.5) + createPlayer(3,645,160,.5) + createPlayer(4,955,160,.5) end end, - his4=function() - if #P.nextID<6 then - local j,i=0 - ::L:: - i,j=rnd(7),j+1 - if(i==P.his[1]or i==P.his[2]or i==P.his[3]or i==P.his[4])then goto L end - newNext(i) - rem(P.his,1)ins(P.his,i) + custom=function() + for i=1,#customID do + local k=customID[i] + modeEnv[k]=customRange[k][customSel[k]] + end + modeEnv._20G=modeEnv.drop==-1 + if modeEnv.opponent==0 then + createPlayer(1,340,15) + else + modeEnv.target=nil + createPlayer(1,340,15) + createPlayer(2,965,360,.5,modeEnv.opponent) end end, - rnd=function() - local i - ::L:: - i=rnd(7) - if i==P.nextID[5]then goto L end - newNext(i) - end,--random - pc=function() - if P.cstat.piece%4==0 then - local r=rnd(#PClist) - local f=P.cstat.event==1 - for i=1,4 do - local b=PClist[r][i] - if f then - if b<3 then b=3-b - elseif b<5 then b=7-b - end - end - newNext(b) - end - P.cstat.event=(P.cstat.event+1)%2 +} +mesDisp={ + --Default:font=35,white + sprint=function() + setFont(70) + local r=max(P.gameEnv.target-P.cstat.row,0) + mStr(r,-82,260) + if r<21 and r>0 then + gc.setLineWidth(3) + gc.setColor(1,.5,.5) + gc.line(0,600-30*r,300,600-30*r) end end, - drought1=function() - if #P.nextID<6 then - local bag={1,2,3,4,5,6} - for i=1,6 do - newNext(rem(bag,rnd(#bag))) - end + marathon=function() + setFont(50) + mStr(P.cstat.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) + gc.rectangle("fill",-128,376,90,4) + end, + classic=function() + setFont(80) + local r=P.gameEnv.target*.1 + mStr(r<11 and 19+r or r==11 and"00"or r==12 and"0a"or format("%x",r*10-110),-82,210) + setFont(20) + mStr("speed level",-82,290) + setFont(50) + mStr(P.cstat.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) + end, + infinite=function() + setFont(50) + mStr(P.cstat.atk,-82,310) + mStr(format("%.2f",2.5*P.cstat.atk/P.cstat.piece),-82,420) + setFont(20) + mStr("Attack",-82,363) + mStr("Efficiency",-82,475) + end, + tsd=function() + setFont(35) + mStr("TSD",-82,407) + setFont(80) + mStr(P.cstat.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) + end, + dig=function() + setFont(70) + mStr(P.cstat.event,-82,310) + setFont(30) + mStr("Wave",-82,375) + end, + survivor=function() + setFont(70) + mStr(P.cstat.event,-82,310) + setFont(30) + mStr("Wave",-82,375) + end, + pctrain=function() + setFont(22) + mStr("Perfect Clear",-82,412) + setFont(80) + mStr(P.cstat.pc,-82,330) + end, + pcchallenge=function() + setFont(22) + mStr("Perfect Clear",-82,432) + setFont(80) + mStr(P.cstat.pc,-82,350) + setFont(50) + mStr(max(100-P.cstat.row,0),-82,250) + end, + techmino41=function() + setFont(40) + mStr(#players.alive.."/41",-82,175) + mStr(P.ko,-70,215) + setFont(25) + gc.print("KO",-127,225) + gc.setColor(1,.5,0,.6) + gc.print(P.badge,-47,227) + gc.setColor(1,1,1) + setFont(30) + gc.print(up0to4[P.strength],-132,290) + for i=1,P.strength do + gc.draw(badgeIcon,16*i-142,260) end end, - drought2=function() - if #P.nextID<6 then - local bag={1,1,1,2,2,2,3,3,3,4,4,4,6,6,6,5,7} - ::L:: - newNext(rem(bag,rnd(#bag))) - if bag[1]then goto L end + techmino99=function() + setFont(40) + mStr(#players.alive.."/99",-82,175) + mStr(P.ko,-70,215) + setFont(25) + gc.print("KO",-127,225) + gc.setColor(1,.5,0,.6) + gc.print(P.badge,-47,227) + gc.setColor(1,1,1) + setFont(30) + gc.print(up0to4[P.strength],-132,290) + for i=1,P.strength do + gc.draw(badgeIcon,16*i-142,260) end end, + drought=function() + setFont(75) + mStr(max(100-P.cstat.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) + end + end } Event={ marathon_reach=function() @@ -103,8 +301,9 @@ Event={ end, master_reach_lunatic=function() local t=P.cstat.point - if t%100==99 and #P.clearing==0 then goto L end - t=t+clearPoint[#P.clearing] + 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 @@ -130,8 +329,9 @@ Event={ end, master_reach_ultimate=function() local t=P.cstat.point - if t%100==99 and #P.clearing==0 then goto L end - t=t+clearPoint[#P.clearing] + 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 @@ -220,6 +420,7 @@ Event_gameover={ P.result="WIN" showText(P,1,"appear",60,120,nil,true) changeAtk(P) + BGM("end") end for i=1,#P.atkBuffer do P.atkBuffer[i].sent=true @@ -253,25 +454,27 @@ Event_gameover={ P.rank=#players.alive+1 showText(P,P.rank,"appear",60,120,nil,true) P.strength=0 - local A,i=P,0 - ::L:: - A,i=A.lastRecv,i+1 - if A and not A.alive and A~=P and i<3 then goto L end - if A and A~=P then - if P.id==1 or A.id==1 then - P.killMark=A.id==1 - end - A.ko,A.badge=A.ko+1,A.badge+P.badge+1 - for i=A.strength+1,4 do - if A.badge>=modeEnv.royalePowerup[i]then - A.strength=i + if P.lastRecv then + local A,i=P,0 + ::L:: + A,i=A.lastRecv,i+1 + if A and not A.alive and A~=P and i<3 then goto L end + if A and A~=P then + if P.id==1 or A.id==1 then + P.killMark=A.id==1 end + A.ko,A.badge=A.ko+1,A.badge+P.badge+1 + for i=A.strength+1,4 do + if A.badge>=modeEnv.royalePowerup[i]then + A.strength=i + end + end + P.lastRecv=A + if P.id==1 or A.id==1 then + newTask(Event_task.throwBadge,nil,{P,max(3,P.badge)*4}) + end + freshMostBadge() end - P.lastRecv=A - if P.id==1 or A.id==1 then - newTask(Event_task.throwBadge,nil,{P,max(3,P.badge)*4}) - end - freshMostBadge() else P.badge=-1 end @@ -294,11 +497,12 @@ Event_gameover={ P.visTime[i][j]=min(P.visTime[i][j],20) end end + P.gameEnv.keepVisible=P.gameEnv.visible~="show" showText(P,text.lose,"appear",90,nil,nil,true) if P.id==1 then SFX("fail") if modeEnv.royaleMode then - BGM("sores") + BGM("end") end end newTask(Event_task.lose,P) @@ -371,11 +575,7 @@ Event_task={ if not P.control then return end P.counter=P.counter+1 if #P.clearing==0 and P.counter>=max(90,180-2*P.cstat.event)then - ins(P.field,1,getNewRow(10)) - ins(P.visTime,1,getNewRow(1e99)) - P.field[1][rnd(10)]=0 - P.fieldBeneath=P.fieldBeneath+30 - P.curY,P.y_img=P.curY+1,P.y_img+1 + garbageRise(10,1,rnd(10)) P.counter=0 P.cstat.event=P.cstat.event+1 end @@ -384,11 +584,7 @@ Event_task={ if not P.control then return end P.counter=P.counter+1 if #P.clearing==0 and P.counter>=max(45,80-.4*P.cstat.event)then - ins(P.field,1,getNewRow(11+P.cstat.event%3)) - ins(P.visTime,1,getNewRow(1e99)) - P.field[1][rnd(10)]=0 - P.fieldBeneath=P.fieldBeneath+30 - P.curY,P.y_img=P.curY+1,P.y_img+1 + garbageRise(11+P.cstat.event%3,1,rnd(10)) P.counter=0 P.cstat.event=P.cstat.event+1 end @@ -396,25 +592,27 @@ Event_task={ survivor_easy=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 - ins(P.atkBuffer,{rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1}) + if P.counter==max(60,150-2*P.cstat.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==60 then showText(P,text.maxspeed,"appear",80,-140)end + if P.cstat.event==45 then showText(P,text.maxspeed,"appear",80,-140)end P.cstat.event=P.cstat.event+1 end end, survivor_normal=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.counter==max(90,180-2*P.cstat.event)then local d=P.cstat.event+1 - if d%4==0 then ins (P.atkBuffer,{rnd(10),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1}) - elseif d%4==1 then ins(P.atkBuffer,{rnd(10),amount=2,countdown=70,cd0=70,time=0,sent=false,lv=1}) - elseif d%4==2 then ins(P.atkBuffer,{rnd(10),amount=3,countdown=80,cd0=80,time=0,sent=false,lv=2}) - elseif d%4==3 then ins(P.atkBuffer,{rnd(10),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3}) + 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 + if P.atkBuffer.sum>20 then garbageRelease()end P.counter=0 - if P.cstat.event==60 then showText(P,text.maxspeed,"appear",80,-140)end + if P.cstat.event==45 then showText(P,text.maxspeed,"appear",80,-140)end P.cstat.event=P.cstat.event+1 end end, @@ -423,10 +621,12 @@ Event_task={ P.counter=P.counter+1 if P.counter==max(60,180-2*P.cstat.event)then if P.cstat.event%3<2 then - ins(P.atkBuffer,{rnd(10),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1}) + ins(P.atkBuffer,{pos=rnd(10),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1}) else - ins(P.atkBuffer,{rnd(10),amount=3,countdown=60,cd0=60,time=0,sent=false,lv=2}) + 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) + 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 @@ -435,11 +635,29 @@ Event_task={ survivor_lunatic=function(P) if not P.control then return end P.counter=P.counter+1 - if P.counter==max(90,150-P.cstat.event)then + if P.counter==max(60,150-P.cstat.event)then local t=max(60,90-P.cstat.event) - ins(P.atkBuffer,{rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}) + 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 P.counter=0 - if P.cstat.event==30 then showText(P,text.maxspeed,"appear",80,-140)end + if P.cstat.event==60 then showText(P,text.maxspeed,"appear",80,-140)end + P.cstat.event=P.cstat.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) + 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 + P.counter=0 + if P.cstat.event==31 then showText(P,text.maxspeed,"appear",80,-140)end P.cstat.event=P.cstat.event+1 end end, @@ -561,7 +779,7 @@ defaultModeEnv={ bg="game2", bgm="secret8th", }, - { + { _20G=true, drop=0, lock=death_lock[1], @@ -646,7 +864,6 @@ defaultModeEnv={ drop=30, lock=60, freshLimit=15, - ghost=false, visible="time", bg="glow", bgm="newera", @@ -670,6 +887,15 @@ defaultModeEnv={ bg="rgb", bgm="secret7th", }, + { + fall=5, + lock=60, + center=false, + visible="none", + freshLimit=15, + bg="rgb", + bgm="secret8th", + }, { fall=5, lock=60, @@ -744,6 +970,14 @@ defaultModeEnv={ bg="game3", bgm="secret7th", }, + { + drop=5, + lock=60, + fall=10, + freshLimit=15, + bg="rgb", + bgm="secret7th", + }, }, tech={ { diff --git a/gamefunc.lua b/gamefunc.lua index 09392d90..1005cc5e 100644 --- a/gamefunc.lua +++ b/gamefunc.lua @@ -1,7 +1,163 @@ +local blockPos={4,4,4,4,4,5,4} +local renATK={[0]=0,0,0,1,1,2,2,3,3,4,4}--3 else +local b2bPoint={50,100,180} +local b2bATK={3,5,8} +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 clear_n={"clear_1","clear_2","clear_3","clear_4"} +local ren_n={}for i=1,11 do ren_n[i]="ren_"..i end + +local scs={ + {[0]={1,2},{2,1},{2,2},{2,2}}, + {[0]={1,2},{2,1},{2,2},{2,2}}, + {[0]={1,2},{2,1},{2,2},{2,2}}, + {[0]={1,2},{2,1},{2,2},{2,2}}, + {[0]={1,2},{2,1},{2,2},{2,2}}, + {[0]={1.5,1.5},{1.5,1.5},{1.5,1.5},{1.5,1.5},}, + {[0]={0.5,2.5},{2.5,0.5},{1.5,2.5},{2.5,1.5}}, +} +local TRS={ + [1]={ + [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,1}}, + [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}}, + [12]={{0,0},{1,0},{1,-1},{0,1},{-1,0},{0,2},{1,2}}, + [21]={{0,0},{-1,0},{-1,1},{1,0},{0,-2},{-1,-2}}, + [23]={{0,0},{1,0},{1,1},{1,-1},{0,-2},{1,-2}}, + [32]={{0,0},{-1,0},{-1,-1},{-1,1},{0,2},{-1,2}}, + [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}}, + [03]={{0,0},{1,0},{1,1},{1,-1},{0,-2},{1,-2},{0,1}}, + [02]={{0,0},{1,0},{-1,0},{0,-1},{0,1}}, + [20]={{0,0},{-1,0},{1,0},{0,1},{0,-1}}, + [13]={{0,0},{0,-1},{0,1},{-1,0}}, + [31]={{0,0},{0,1},{0,-1},{1,0}}, + },--Z/J + [2]={ + [01]={{0,0},{-1,0},{-1,1},{-1,-1},{0,-2},{-1,-2}}, + [10]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, + [12]={{0,0},{1,0},{1,-1},{1,1},{0,2},{1,2}}, + [21]={{0,0},{-1,0},{-1,1},{-1,-1},{0,-2},{-1,-2}}, + [23]={{0,0},{1,0},{1,1},{-1,0},{0,-2},{1,-2}}, + [32]={{0,0},{-1,0},{-1,-1},{0,1},{1,0},{0,2},{-1,2}}, + [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1},{-1,1}}, + [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{1,-1},{0,1}}, + [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, + [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, + [13]={{0,0},{0,1},{0,-1},{1,0}}, + [31]={{0,0},{0,-1},{0,1},{-1,0}}, + },--S/L + [5]={ + [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{-1,-1}}, + [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1},{1,1}}, + [12]={{0,0},{1,0},{1,-1},{0,-1},{0,2},{1,2},{-1,-1}}, + [21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{1,1}}, + [23]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{-1,1}}, + [32]={{0,0},{-1,0},{-1,-1},{0,-1},{0,2},{-1,2},{1,-1}}, + [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}}, + [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, + [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, + [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, + [13]={{0,0},{0,-1},{0,1},{1,0},{-1,0},{0,2}}, + [31]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}}, + }, + [7]={ + [01]={{0,0},{0,1},{1,0},{-2,0},{-2,-1},{1,2}}, + [03]={{0,0},{0,1},{-1,0},{2,0},{2,-1},{-1,2}}, + [10]={{0,0},{2,0},{-1,0},{-1,-2},{2,1},{0,2}}, + [30]={{0,0},{-2,0},{1,0},{1,-2},{-2,1},{0,2}}, + [12]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}}, + [32]={{0,0},{1,0},{-2,0},{1,-2},{-2,-1}}, + [21]={{0,0},{-2,0},{1,0},{1,-2},{-2,1}}, + [23]={{0,0},{2,0},{-1,0},{-1,-2},{2,1}}, + [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, + [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, + [13]={{0,0},{0,-1},{-1,0},{1,0},{0,1}}, + [31]={{0,0},{1,0},{-1,0}}, + } +}TRS[3],TRS[4]=TRS[2],TRS[1] + +local freshMethod={ + bag7=function() + if #P.next<6 then + local bag={1,2,3,4,5,6,7} + ::L:: + newNext(rem(bag,rnd(#bag))) + if bag[1]then goto L end + end + end, + his4=function() + if #P.next<6 then + local j,i=0 + ::L:: + i,j=rnd(7),j+1 + if(i==P.his[1]or i==P.his[2]or i==P.his[3]or i==P.his[4])then goto L end + newNext(i) + rem(P.his,1)ins(P.his,i) + end + end, + rnd=function() + local i + ::L:: + i=rnd(7) + if i==P.next[5]then goto L end + newNext(i) + end,--random + pc=function() + if P.cstat.piece%4==0 then + local r=rnd(#PClist) + local f=P.cstat.event==1 + for i=1,4 do + local b=PClist[r][i] + if f then + if b<3 then b=3-b + elseif b<5 then b=7-b + end + end + newNext(b) + end + P.cstat.event=(P.cstat.event+1)%2 + end + end, + drought1=function() + if #P.next<6 then + local bag={1,2,3,4,5,6} + ::L:: + newNext(rem(bag,rnd(#bag))) + if bag[1]then goto L end + end + end, + drought2=function() + if #P.next<6 then + local bag={1,1,1,2,2,2,3,3,3,4,4,4,6,6,6,5,7} + ::L:: + newNext(rem(bag,rnd(#bag))) + if bag[1]then goto L end + end + end, +} +local shadeColor={ + {1,0,0,.3}, + {0,1,0,.3}, + {1,.5,0,.3}, + {0,0,1,.3}, + {1,0,1,.3}, + {1,1,0,.3}, + {0,1,1,.3}, +} +local function createShade(x1,y1,x2,y2)--x1y2 + if not P.small and P.showTime>=20 and setting.fxs and y1>=y2 then + ins(P.shade,{5,P.cur.color,x1,y1,x2,y2}) + end +end function loadGame(mode,level) --rec={} - curMode={id=modeID[mode],lv=level,modeName=text.modeName[mode],levelName=modeLevel[modeID[mode]][level]} - gotoScene("play") + curMode={id=modeID[mode],lv=level} + PTC.attack[1]:reset()PTC.attack[2]:reset()PTC.attack[3]:reset() + drawableText.modeName:set(text.modeName[mode]) + drawableText.levelName:set(modeLevel[modeID[mode]][level]) + gotoScene("play","deck") end function resetGameData() frame=0 @@ -112,17 +268,18 @@ function createPlayer(id,x,y,size,AIspeed,data) P.gameEnv[k]=v end end--reset current game settings - - P.curBlock,P.curID,P.curColor,P.curName={{}},1,0,0 + P.cur={bk={{}},id=0,color=0,name=0} P.sc,P.dir,P.r,P.c={0,0},0,0,0 P.curX,P.curY,P.y_img=0,0,0 - P.holdBlock,P.holdID,P.holdColor,P.holdName={{}},0,0,0 + P.hold={bk={{}},id=0,color=0,name=0} P.holded=false - P.nextID,P.nextBlock,P.nextColor,P.nextName={},{},{},{} + P.next={} P.dropDelay,P.lockDelay=P.gameEnv.drop,P.gameEnv.lock P.freshTime=0 P.spinLast,P.lastClear=false,nil + + P.his={rnd(7),rnd(7),rnd(7),rnd(7)} local s=P.gameEnv.sequence if s=="bag7"or s=="his4"then local bag1={1,2,3,4,5,6,7} @@ -148,19 +305,20 @@ function createPlayer(id,x,y,size,AIspeed,data) P.freshNext=freshMethod[P.gameEnv.sequence] if P.gameEnv.sequence==1 then P.bag={}--Bag7 - elseif P.gameEnv.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.nextID[i+3]end--History4 + elseif P.gameEnv.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.next.id[i+3]end--History4 elseif P.gameEnv.sequence==3 then--Pure random end P.showTime=visible_opt[P.gameEnv.visible] + P.keepVisible=P.gameEnv.visible=="show" P.keyPressing={}for i=1,12 do P.keyPressing[i]=false end P.moving,P.downing=0,0 - P.waiting,P.falling=0,0 + P.waiting,P.falling=-1,-1 P.clearing={} P.fieldBeneath=0 - P.combo=0 - P.b2b=0 + P.combo,P.b2b=0,0 + P.shade,P.b2b1={},0 P.endCounter=0 P.counter=0 @@ -173,35 +331,45 @@ function showText(P,text,type,font,dy,spd,inf) end end function garbageSend(S,R,send,time) - local pos=rnd(10) createBeam(S,R,send<4 and 1 or send<7 and 2 or 3) R.lastRecv=S if R.atkBuffer.sum<20 then send=min(send,20-R.atkBuffer.sum) R.atkBuffer.sum=R.atkBuffer.sum+send - ins(R.atkBuffer,{pos,amount=send,countdown=time,cd0=time,time=0,sent=false,lv=min(int(send^.69),5)}) + ins(R.atkBuffer,{ + pos=rnd(10), + amount=send, + countdown=time, + cd0=time, + time=0, + sent=false, + lv=min(int(send^.69),5), + }) if R.id==1 then sysSFX(send<4 and "blip_1"or"blip_2",min(send+1,5)*.1)end end end function garbageRelease() - local t=P.showTime*2 for i=1,#P.atkBuffer do - local atk=P.atkBuffer[i] - if not atk.sent and atk.countdown<=0 then - for j=1,atk.amount do - ins(P.field,1,getNewRow(8+atk.lv)) - ins(P.visTime,1,getNewRow(t)) - for k=1,#atk do - P.field[1][atk[k]]=0 - end - end - P.atkBuffer.sum=P.atkBuffer.sum-atk.amount - atk.sent=true - atk.time=0 - P.fieldBeneath=P.fieldBeneath+atk.amount*30 + local A=P.atkBuffer[i] + 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 + A.sent=true + A.time=0 end end end +function garbageRise(color,amount,pos) + local t=P.showTime*2 + for _=1,amount do + ins(P.field,1,getNewRow(color)) + ins(P.visTime,1,getNewRow(t)) + P.field[1][pos]=0 + end + P.fieldBeneath=P.fieldBeneath+amount*30 + P.curY,P.y_img=P.curY+amount,P.y_img+amount + if #P.field>40 then Event_gameover.lose()end +end function createBeam(S,R,lv)--Player id local x1,y1,x2,y2 if S.small then @@ -352,16 +520,19 @@ function royaleLevelup() end end function freshgho() + P.y_img=min(#P.field+1,P.curY) if P.gameEnv._20G or P.keyPressing[7]and P.gameEnv.sdarr==0 then - ::L::if not ifoverlap(P.curBlock,P.curX,P.curY-1)then - P.curY=P.curY-1 + ::L::if not ifoverlap(P.cur.bk,P.curX,P.y_img-1)then + P.y_img=P.y_img-1 P.spinLast=false goto L end - P.y_img=P.curY + if P.curY>P.y_img then + createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) + P.curY=P.y_img + end else - P.y_img=P.curY>#P.field+1 and #P.field+1 or P.curY - ::L::if not ifoverlap(P.curBlock,P.curX,P.y_img-1)then + ::L::if not ifoverlap(P.cur.bk,P.curX,P.y_img-1)then P.y_img=P.y_img-1 goto L end @@ -379,7 +550,7 @@ function ifoverlap(bk,x,y) if x<1 or x+#bk[1]>11 or y<1 then return true end if y>#P.field then return end for i=1,#bk do for j=1,#bk[1]do - if P.field[y+i-1]and bk[i][j]>0 and P.field[y+i-1][x+j-1]>0 then return true end + if P.field[y+i-1]and bk[i][j]and P.field[y+i-1][x+j-1]>0 then return true end end end end function ckfull(i) @@ -410,79 +581,32 @@ function solid(x,y) return P.field[y][x]>0 end function newNext(n) - ins(P.nextBlock,blocks[n][0]) - ins(P.nextID,n) - ins(P.nextColor,P.gameEnv.bone and 8 or n) - ins(P.nextName,n) + ins(P.next,{bk=blocks[n][0],id=n,color=P.gameEnv.bone and 8 or n,name=n}) end function resetblock() - P.spinLast=false - P.curID,P.curBlock,P.curColor,P.curName=rem(P.nextID,1),rem(P.nextBlock,1),rem(P.nextColor,1),rem(P.nextName,1)--id/block/color/name + P.holded,P.spinLast=false,false + P.cur=rem(P.next,1) P.freshNext() - P.holded=false - P.sc,P.dir=scs[P.curID][0],0--spin center/direction - P.r,P.c=#P.curBlock,#P.curBlock[1]--row/column - P.curX,P.curY=blockPos[P.curID],21+ceil(P.fieldBeneath/30)-P.r+min(int(#P.field*.2),2) + P.sc,P.dir=scs[P.cur.id][0],0--spin center/direction + P.r,P.c=#P.cur.bk,#P.cur.bk[1]--row/column + P.curX,P.curY=blockPos[P.cur.id],21+ceil(P.fieldBeneath/30)-P.r+min(int(#P.field*.2),2) P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,0 + if P.keyPressing[8]then hold(true)end if P.keyPressing[3]then spin(1,true)end if P.keyPressing[4]then spin(-1,true)end if P.keyPressing[5]then spin(2,true)end - if abs(P.moving)-P.gameEnv.das>1 and not ifoverlap(P.curBlock,P.curX+sgn(P.moving),P.curY)then - P.curX=P.curX+sgn(P.moving) - end + if abs(P.moving)-P.gameEnv.das>1 and not ifoverlap(P.cur.bk,P.curX+(P.moving>0 and 1 or -1),P.curY)then + P.curX=P.curX+(P.moving>0 and 1 or -1) + end--Initial SYSs - if ifoverlap(P.curBlock,P.curX,P.curY)then lock()Event_gameover.lose()end + if ifoverlap(P.cur.bk,P.curX,P.curY)then lock()Event_gameover.lose()end freshgho() if P.keyPressing[6]then act.hardDrop()P.keyPressing[6]=false end end -function pressKey(i,p) - P=p - P.keyPressing[i]=true - if P.id==1 then - virtualkeyDown[i]=true - virtualkeyPressTime[i]=10 - end - if i==10 then - act.restart() - elseif P.alive then - if P.control and P.waiting<=0 then - act[actName[i]]() - if i>2 and i<7 then P.keyPressing[i]=false end - elseif i==9 and not setting.swap then - P.atkMode=P.atkMode<3 and P.atkMode+2 or 5-P.atkMode - elseif P.keyPressing[9]and setting.swap then - if i==1 then - P.atkMode=1 - changeAtk(P,randomTarget(P)) - elseif i==2 then - P.atkMode=2 - elseif i==6 then - P.atkMode=3 - elseif i==7 then - P.atkMode=4 - end - else - if i==1 then - P.moving=-1 - elseif i==2 then - P.moving=1 - 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 - end - --ins(rec,{i,frame}) -end -function releaseKey(i,p) - p.keyPressing[i]=false - if p.id==1 then virtualkeyDown[i]=false end - -- if recording then ins(rec,{-i,frame})end -end function spin(d,ifpre) local idir=(P.dir+d)%4 - if P.curID==6 then + if P.cur.id==6 then freshLockDelay() SFX(ifpre and"prerotate"or"rotate") if P.gameEnv.ospin and P.freshTime>10 then @@ -510,16 +634,16 @@ function spin(d,ifpre) end goto E ::T:: - P.curID=5 - P.curBlock=blocks[5][0] + 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 ::I:: - P.curID=7 - P.curBlock=blocks[7][2] + 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 @@ -527,12 +651,12 @@ function spin(d,ifpre) end ::E::return end - local icb=blocks[P.curID][idir] - local isc=scs[P.curID][idir] + local icb=blocks[P.cur.id][idir] + local isc=scs[P.cur.id][idir] local ir,ic=#icb,#icb[1] local ix,iy=P.curX+P.sc[2]-isc[2],P.curY+P.sc[1]-isc[1] local t--succssful test id - local iki=TRS[P.curID][P.dir*10+idir] + local iki=TRS[P.cur.id][P.dir*10+idir] for i=1,P.freshTime<=1.2*P.gameEnv.freshLimit and #iki or 1 do if not ifoverlap(icb,ix+iki[i][1],iy+iki[i][2])then ix,iy=ix+iki[i][1],iy+iki[i][2] @@ -543,39 +667,37 @@ function spin(d,ifpre) goto fail ::spin:: P.curX,P.curY,P.dir=ix,iy,idir - P.sc,P.curBlock=scs[P.curID][idir],icb + P.sc,P.cur.bk=scs[P.cur.id][idir],icb P.r,P.c=ir,ic P.spinLast=t==2 and testScore[-d]or 2 freshgho() freshLockDelay() - SFX(ifpre and"prerotate"or ifoverlap(P.curBlock,P.curX,P.curY+1)and ifoverlap(P.curBlock,P.curX-1,P.curY)and ifoverlap(P.curBlock,P.curX+1,P.curY)and"rotatekick"or"rotate") + 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 id==1 then stat.rotate=stat.rotate+1 end ::fail:: end function hold(ifpre) - if not P.holded and P.waiting<=0 and P.gameEnv.hold then + if not P.holded and P.waiting==-1 and P.gameEnv.hold then P.holded=P.gameEnv.oncehold - P.holdID,P.curID=P.curID,P.holdID - P.holdBlock,P.curBlock=blocks[P.holdID][0],P.holdBlock - P.holdColor,P.curColor=P.curColor,P.holdColor - P.holdName,P.curName=P.curName,P.holdName - if P.curID==0 then - P.curID,P.curBlock,P.curColor,P.curName=rem(P.nextID,1),rem(P.nextBlock,1),rem(P.nextColor,1),rem(P.nextName,1)--id/block/color/name + P.cur,P.hold=P.hold,P.cur + P.hold.bk=blocks[P.hold.id][0] + if P.cur.id==0 then + P.cur=rem(P.next,1) P.freshNext() end - P.sc,P.dir=scs[P.curID][0],0 - P.r,P.c=#P.curBlock,#P.curBlock[1] - P.curX,P.curY=blockPos[P.curID],21+ceil(P.fieldBeneath/30)-P.r+min(int(#P.field*.2),2) + P.sc,P.dir=scs[P.cur.id][0],0 + P.r,P.c=#P.cur.bk,#P.cur.bk[1] + P.curX,P.curY=blockPos[P.cur.id],21+ceil(P.fieldBeneath/30)-P.r+min(int(#P.field*.2),2) - if abs(P.moving)-P.gameEnv.das>1 and not ifoverlap(P.curBlock,P.curX+sgn(P.moving),P.curY)then - P.curX=P.curX+sgn(P.moving) + if abs(P.moving)-P.gameEnv.das>1 and not ifoverlap(P.cur.bk,P.curX+(P.moving>0 and 1 or -1),P.curY)then + P.curX=P.curX+(P.moving>0 and 1 or -1) end freshgho() - P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,0 - if ifoverlap(P.curBlock,P.curX,P.curY)then lock()Event_gameover.lose()end + P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,max(P.freshTime-5,0) + 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 @@ -589,7 +711,7 @@ function drop() P.waiting=P.gameEnv.wait local dospin=0 if P.spinLast then - if P.curID<6 then + if P.cur.id<6 then local x,y=P.curX+P.sc[2]-1,P.curY+P.sc[1]-1 local c=0 if solid(x-1,y+1)then c=c+1 end @@ -597,12 +719,10 @@ function drop() if c==0 then goto NTC end if solid(x-1,y-1)then c=c+1 end if solid(x+1,y-1)then c=c+1 end - if c>2 then - dospin=dospin+1 - end + if c>2 then dospin=dospin+1 end end--Three point ::NTC:: - if P.curID~=6 and ifoverlap(P.curBlock,P.curX-1,P.curY)and ifoverlap(P.curBlock,P.curX+1,P.curY)and ifoverlap(P.curBlock,P.curX,P.curY+1)then + if P.cur.id~=6 and ifoverlap(P.cur.bk,P.curX-1,P.curY)and ifoverlap(P.cur.bk,P.curX+1,P.curY)and ifoverlap(P.cur.bk,P.curX,P.curY+1)then dospin=dospin+2 end--Immobile end @@ -621,7 +741,7 @@ function drop() elseif dospin<2 then dospin=false elseif dospin==2 then - mini=P.curID<6 and cc<3 and cc0 then if dospin then if P.b2b>1000 then - showText(P,text.b3b..text.spin[P.curName]..text.clear[cc],"spin",40,-30) + showText(P,text.b3b..text.spin[P.cur.name]..text.clear[cc],"spin",40,-30) csend=b2bATK[cc]+1 exblock=exblock+1 elseif P.b2b>=40 then - showText(P,text.b2b..text.spin[P.curName]..text.clear[cc],"spin",40,-30) + showText(P,text.b2b..text.spin[P.cur.name]..text.clear[cc],"spin",40,-30) csend=b2bATK[cc] else - showText(P,text.spin[P.curName]..text.clear[cc],"spin",50,-30) + showText(P,text.spin[P.cur.name]..text.clear[cc],"spin",50,-30) csend=2*cc end sendTime=20+csend*20 @@ -665,7 +785,7 @@ function drop() else P.b2b=P.b2b+b2bPoint[cc] end - P.lastClear=P.curID*10+cc + P.lastClear=P.cur.id*10+cc if P.id==1 then stat.spin=stat.spin+1 end @@ -680,7 +800,7 @@ function drop() else P.combo=0 if dospin then - showText(P,text.spin[P.curName],"appear",50,-30) + showText(P,text.spin[P.cur.name],"appear",50,-30) SFX("spin_0") P.b2b=P.b2b+20 end @@ -692,7 +812,7 @@ function drop() sendTime=sendTime+30 if P.cstat.row>4 then P.b2b=1200 end P.cstat.pc=P.cstat.pc+1 - P.lastClear=P.curID*10+5 + P.lastClear=P.cur.id*10+5 SFX("perfectclear") end @@ -789,13 +909,57 @@ function lock() local y=P.curY+i-1 if not P.field[y]then P.field[y],P.visTime[y]=getNewRow(),getNewRow()end for j=1,P.c do - if P.curBlock[i][j]~=0 then - P.field[y][P.curX+j-1]=P.curColor + if P.cur.bk[i][j]then + P.field[y][P.curX+j-1]=P.cur.color P.visTime[y][P.curX+j-1]=P.showTime end end end end +function pressKey(i,p) + P=p + P.keyPressing[i]=true + if P.id==1 then + virtualkeyDown[i]=true + virtualkeyPressTime[i]=10 + end + if i==10 then + act.restart() + elseif P.alive then + if P.control and P.waiting==-1 then + act[actName[i]]() + if i>2 and i<7 then P.keyPressing[i]=false end + elseif i==9 and not setting.swap then + P.atkMode=P.atkMode<3 and P.atkMode+2 or 5-P.atkMode + elseif P.keyPressing[9]and setting.swap then + if i==1 then + P.atkMode=1 + changeAtk(P,randomTarget(P)) + elseif i==2 then + P.atkMode=2 + elseif i==6 then + P.atkMode=3 + elseif i==7 then + P.atkMode=4 + end + else + if i==1 then + P.moving=-1 + elseif i==2 then + P.moving=1 + 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 + end + --ins(rec,{i,frame}) +end +function releaseKey(i,p) + p.keyPressing[i]=false + if p.id==1 then virtualkeyDown[i]=false end + -- if recording then ins(rec,{-i,frame})end +end act={ moveLeft=function(auto) if P.keyPressing[9]and setting.swap then @@ -804,7 +968,7 @@ act={ if not auto then P.moving=-1 end - if not ifoverlap(P.curBlock,P.curX-1,P.curY)then + if not ifoverlap(P.cur.bk,P.curX-1,P.curY)then P.curX=P.curX-1 freshgho() freshLockDelay() @@ -820,7 +984,7 @@ act={ if not auto then P.moving=1 end - if not ifoverlap(P.curBlock,P.curX+1,P.curY)then + if not ifoverlap(P.cur.bk,P.curX+1,P.curY)then P.curX=P.curX+1 freshgho() freshLockDelay() @@ -836,13 +1000,15 @@ act={ if P.keyPressing[9]and setting.swap then changeAtkMode(3) else - if P.waiting<=0 then - if P.curY~=P.y_img then + if P.waiting==-1 then + if P.curY-P.y_img>0 then + createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) P.curY=P.y_img P.spinLast=false SFX("drop") if P.id==1 then VIB(1)end end + P.lockDelay=-1 drop() end end @@ -877,14 +1043,21 @@ act={ end end, restart=function() + clearTask("play") resetGameData() frame=30 end, - insDown=function()if P.curY~=P.y_img then P.curY,P.lockDelay,P.spinLast=P.y_img,P.gameEnv.lock,false end end, + insDown=function() + if P.curY~=P.y_img then + createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) + P.curY,P.lockDelay,P.spinLast=P.y_img,P.gameEnv.lock,false + end + end, insLeft=function() local x0=cx - ::L::if not ifoverlap(P.curBlock,P.curX-1,P.curY)then + ::L::if not ifoverlap(P.cur.bk,P.curX-1,P.curY)then P.curX=P.curX-1 + createShade(P.curX-1,P.curY+P.r-1,P.curX+P.c-1,P.curY) freshgho() goto L end @@ -892,8 +1065,9 @@ act={ end, insRight=function() local x0=cx - ::L::if not ifoverlap(P.curBlock,P.curX+1,P.curY)then + ::L::if not ifoverlap(P.cur.bk,P.curX+1,P.curY)then P.curX=P.curX+1 + createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY) freshgho() goto L end diff --git a/image/block/1.png b/image/block/1.png index 8d5da93d..d87015e8 100644 Binary files a/image/block/1.png and b/image/block/1.png differ diff --git a/language/chi.lua b/language/chi.lua index 191a303a..58a8469e 100644 --- a/language/chi.lua +++ b/language/chi.lua @@ -156,6 +156,7 @@ return{ 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, dasD="-",dasU="+", arrD="-",arrU="+", sddasD="-",sddasU="+", @@ -192,4 +193,4 @@ return{ path="打开存储目录", }, }, -}--中文→ \ No newline at end of file +}--中文 \ No newline at end of file diff --git a/language/eng.lua b/language/eng.lua index b5280419..3700768a 100644 --- a/language/eng.lua +++ b/language/eng.lua @@ -42,7 +42,7 @@ return{ wait=nil, fall=nil, next=nil, - hold={"on","off"}, + hold={"ON","OFF"}, sequence={"bag7","his4","random"}, visible={"normal","time","invisible","sudden"}, target={10,20,40,100,200,500,1000,"∞"}, @@ -156,6 +156,7 @@ return{ center=function()return setting.center and"Center:ON"or"Center:OFF"end, grid=function()return setting.grid and"Grid:ON"or"Grid:OFF"end, swap=function()return setting.swap and"Swap:comboKey"or"Swap:loop"end, + fxs=function()return setting.fxs and"FXs:ON"or"FXs:OFF"end, dasD="-", dasU="+", arrD="-", @@ -164,11 +165,11 @@ return{ sddasU="+", sdarrD="-", sdarrU="+", - sfx=function()return setting.sfx and"SFX:ON"or"SFX:off"end, - bgm=function()return setting.bgm and"BGM:ON"or"BGM:off"end, + sfx=function()return setting.sfx and"SFX:ON"or"SFX:OFF"end, + bgm=function()return setting.bgm and"BGM:ON"or"BGM:OFF"end, vib=function()return "Vibrate level:"..setting.vib end, - fullscreen=function()return setting.fullscreen and"Fullscreen:ON"or"Fullscreen:off"end, - bgblock=function()return setting.bgblock and"BG animation:ON"or"BG animation:off"end, + fullscreen=function()return setting.fullscreen and"Fullscreen:ON"or"Fullscreen:OFF"end, + bgblock=function()return setting.bgblock and"BG animation:ON"or"BG animation:OFF"end, frame=function()return"FrameDraw:"..setting.frameMul.."%"end, control="Control settings", touch="Touch settings", diff --git a/list.lua b/list.lua index 19b43d25..8b491074 100644 --- a/list.lua +++ b/list.lua @@ -1,16 +1,7 @@ ---[["four name" - Techrash - x Zestris - x Quadruple - x Tequeno - x Techzino - x Tectris - Techris - - Techmino - Tequéno -]] +local gc=love.graphics +local sys=love.system +actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","swap","restart","insLeft","insRight","insDown"} color={ red={1,0,0}, green={0,1,0}, @@ -42,40 +33,6 @@ color={ purple={.5,0,1}, lightPurple={.7,.3,1}, } -attackColor={ - {color.darkGrey,color.white}, - {color.grey,color.white}, - {color.lightPurple,color.white}, - {color.lightRed,color.white}, - {color.darkGreen,color.cyan}, -} -frameColor={ - [0]=color.white, - color.lightGreen, - color.lightBlue, - color.lightPurple, - color.lightOrange, -} -blockColor={ - color.red, - color.green, - color.orange, - color.blue, - color.magenta, - color.yellow, - color.cyan, -} - -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}, -} sfx={ "button", @@ -103,96 +60,7 @@ bgm={ "secret7th", "secret8th", "rockblock", - "sores", -} - -sceneInit={ - load=function() - curBG="none" - keeprun=true - loading=1--Loading mode - loadnum=1--Loading counter - loadprogress=0--Loading bar(0~1) - end, - intro=function() - curBG="none" - count=0 - keeprun=true - end, - main=function() - curBG="none" - keeprun=true - collectgarbage() - end, - mode=function() - saveData() - modeSel=modeSel or 1 - levelSel=levelSel or 3 - curBG="none" - keeprun=true - end, - custom=function() - optSel=optSel or 1 - curBG="matrix" - keeprun=true - end, - play=function() - keeprun=false - resetGameData() - sysSFX("ready") - mouseShow=false - end, - setting=function() - curBG="none" - keeprun=true - end, - setting2=function() - curBG="none" - keeprun=true - curBoard=1 - keyboardSet=1 - joystickSet=1 - keyboardSetting=false - joystickSetting=false - end,--Control settings - setting3=function() - curBG="game1" - keeprun=true - defaultSel=1 - sel=nil - snapLevel=1 - end,--Touch setting - help=function() - curBG="none" - keeprun=true - end, - stat=function() - curBG="none" - keeprun=true - end, - quit=function() - love.event.quit() - end, -} -prevMenu={ - load=love.event.quit, - intro="quit", - main="intro", - mode="main", - custom="mode", - ready="mode", - play=function() - clearTask() - gotoScene(curMode.id~="custom"and"mode"or"custom") - end, - help="main", - stat="main", - setting=function() - saveSetting() - gotoScene("main") - end, - setting2="setting", - setting3="setting", + "end", } customID={ @@ -211,8 +79,8 @@ customID={ customRange={ drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99,-1}, lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99}, - wait={1,3,5,7,10,15,20,30,60}, - fall={1,3,5,7,10,15,20,30,60}, + wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, + fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, next={0,1,2,3,4,5,6}, hold={true,false}, sequence={"bag7","his4","rnd"}, @@ -222,23 +90,6 @@ customRange={ opponent={0,60,30,20,15,10,7,5,4,3,2,1}, } -langName={"中文","English"} -langID={"chi","eng"} -actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","swap","restart","insLeft","insRight","insDown"} -blockPos={4,4,4,4,4,5,4} -clearPoint={[0]=1,2,3,5,7} -renATK={[0]=0,0,0,1,1,2,2,3,3,4,4}--3 else -b2bPoint={50,120,200} -b2bATK={3,5,8} -testScore={[-1]=1,[-2]=0,[-3]=1,2,2,2} -visible_opt={show=1e99,time=300,fast=20,none=5} -reAtk={0,0,1,1,1,2,2,3,3} -reDef={0,1,1,2,3,3,4,4,5} - -spin_n={"spin_1","spin_2","spin_3"} -clear_n={"clear_1","clear_2","clear_3","clear_4"} -ren_n={}for i=1,11 do ren_n[i]="ren_"..i end -vibrateLevel={0,0,.03,.04,.05,.07,.9} snapLevelValue={1,10,20,40,60,80} RCPB={10,33,200,33,105,5,105,60} @@ -259,9 +110,9 @@ modeLevel={ infinite={"NORMAL"}, solo={"EASY","NORMAL","HARD","LUNATIC"}, tsd={"NORMAL","HARD"}, - blind={"EASY","HARD","LUNATIC","ULTIMATE","GM"}, + blind={"EASY","HARD","HARD+","LUNATIC","ULTIMATE","GM"}, dig={"NORMAL","LUNATIC"}, - survivor={"EASY","NORMAL","HARD","LUNATIC"}, + survivor={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"}, tech={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"}, pctrain={"NORMAL","EXTRA"}, pcchallenge={"NORMAL","HARD","LUNATIC"}, @@ -271,138 +122,20 @@ modeLevel={ hotseat={"2P","3P","4P",}, custom={""}, } -modeLevelColor={ - EASY=color.cyan, - NORMAL=color.green, - HARD=color.magenta, - LUNATIC=color.red, - EXTRA=color.lightMagenta, - ULTIMATE=color.lightYellow, - - MESS=color.lightGrey, - GM=color.blue, - DEATH=color.lightRed, - CTWC=color.lightBlue, - ["10L"]=color.cyan, - ["20L"]=color.lightBlue, - ["40L"]=color.green, - ["100L"]=color.orange, - ["400L"]=color.red, - ["1000L"]=color.darkRed, -} - +local t,f=true,false blocks={ - {[0]={{0,1,1},{1,1,0}},{{1,0},{1,1},{0,1}}}, - {[0]={{1,1,0},{0,1,1}},{{0,1},{1,1},{1,0}}}, - {[0]={{1,1,1},{0,0,1}},{{1,1},{1,0},{1,0}},{{1,0,0},{1,1,1}},{{0,1},{0,1},{1,1}}}, - {[0]={{1,1,1},{1,0,0}},{{1,0},{1,0},{1,1}},{{0,0,1},{1,1,1}},{{1,1},{0,1},{0,1}}}, - {[0]={{1,1,1},{0,1,0}},{{1,0},{1,1},{1,0}},{{0,1,0},{1,1,1}},{{0,1},{1,1},{0,1}}}, - {[0]={{1,1},{1,1}},{{1,1},{1,1}}}, - {[0]={{1,1,1,1}},{{1},{1},{1},{1}}}, + {[0]={{f,t,t},{t,t,f}},{{t,f},{t,t},{f,t}}}, + {[0]={{t,t,f},{f,t,t}},{{f,t},{t,t},{t,f}}}, + {[0]={{t,t,t},{f,f,t}},{{t,t},{t,f},{t,f}},{{t,f,f},{t,t,t}},{{f,t},{f,t},{t,t}}}, + {[0]={{t,t,t},{t,f,f}},{{t,f},{t,f},{t,t}},{{f,f,t},{t,t,t}},{{t,t},{f,t},{f,t}}}, + {[0]={{t,t,t},{f,t,f}},{{t,f},{t,t},{t,f}},{{f,t,f},{t,t,t}},{{f,t},{t,t},{f,t}}}, + {[0]={{t,t},{t,t}},{{t,t},{t,t}}}, + {[0]={{t,t,t,t}},{{t},{t},{t},{t}}}, } local l={1,2,6,7}for i=1,4 do blocks[l[i]][2],blocks[l[i]][3]=blocks[l[i]][0],blocks[l[i]][1]end for i=1,7 do blocks[i+7]=blocks[i]end -scs={ - {[0]={1,2},{2,1},{2,2},{2,2}}, - {[0]={1,2},{2,1},{2,2},{2,2}}, - {[0]={1,2},{2,1},{2,2},{2,2}}, - {[0]={1,2},{2,1},{2,2},{2,2}}, - {[0]={1,2},{2,1},{2,2},{2,2}}, - {[0]={1.5,1.5},{1.5,1.5},{1.5,1.5},{1.5,1.5},}, - {[0]={0.5,2.5},{2.5,0.5},{1.5,2.5},{2.5,1.5}}, -} -TRS={ - [1]={ - [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,1}}, - [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}}, - [12]={{0,0},{1,0},{1,-1},{0,1},{-1,0},{0,2},{1,2}}, - [21]={{0,0},{-1,0},{-1,1},{1,0},{0,-2},{-1,-2}}, - [23]={{0,0},{1,0},{1,1},{1,-1},{0,-2},{1,-2}}, - [32]={{0,0},{-1,0},{-1,-1},{-1,1},{0,2},{-1,2}}, - [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}}, - [03]={{0,0},{1,0},{1,1},{1,-1},{0,-2},{1,-2},{0,1}}, - [02]={{0,0},{1,0},{-1,0},{0,-1},{0,1}}, - [20]={{0,0},{-1,0},{1,0},{0,1},{0,-1}}, - [13]={{0,0},{0,-1},{0,1},{-1,0}}, - [31]={{0,0},{0,1},{0,-1},{1,0}}, - },--Z/J - [2]={ - [01]={{0,0},{-1,0},{-1,1},{-1,-1},{0,-2},{-1,-2}}, - [10]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, - [12]={{0,0},{1,0},{1,-1},{1,1},{0,2},{1,2}}, - [21]={{0,0},{-1,0},{-1,1},{-1,-1},{0,-2},{-1,-2}}, - [23]={{0,0},{1,0},{1,1},{-1,0},{0,-2},{1,-2}}, - [32]={{0,0},{-1,0},{-1,-1},{0,1},{1,0},{0,2},{-1,2}}, - [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1},{-1,1}}, - [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{1,-1},{0,1}}, - [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, - [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, - [13]={{0,0},{0,1},{0,-1},{1,0}}, - [31]={{0,0},{0,-1},{0,1},{-1,0}}, - },--S/L - [5]={ - [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{-1,-1}}, - [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1},{1,1}}, - [12]={{0,0},{1,0},{1,-1},{0,-1},{0,2},{1,2},{-1,-1}}, - [21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{1,1}}, - [23]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{-1,1}}, - [32]={{0,0},{-1,0},{-1,-1},{0,-1},{0,2},{-1,2},{1,-1}}, - [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}}, - [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, - [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, - [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, - [13]={{0,0},{0,-1},{0,1},{1,0},{-1,0},{0,2}}, - [31]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}}, - }, - [7]={ - [01]={{0,0},{0,1},{1,0},{-2,0},{-2,-1},{1,2}}, - [03]={{0,0},{0,1},{-1,0},{2,0},{2,-1},{-1,2}}, - [10]={{0,0},{2,0},{-1,0},{-1,-2},{2,1},{0,2}}, - [30]={{0,0},{-2,0},{1,0},{1,-2},{-2,1},{0,2}}, - [12]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}}, - [32]={{0,0},{1,0},{-2,0},{1,-2},{-2,-1}}, - [21]={{0,0},{-2,0},{1,0},{1,-2},{-2,1}}, - [23]={{0,0},{2,0},{-1,0},{-1,-2},{2,1}}, - [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, - [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, - [13]={{0,0},{0,-1},{-1,0},{1,0},{0,1}}, - [31]={{0,0},{1,0},{-1,0}}, - } -}TRS[3],TRS[4]=TRS[2],TRS[1] -dataOpt={ - "run", - "game", - "gametime", - "piece", - "row", - "atk", - "key", - "rotate", - "hold", - "spin", -} -saveOpt={ - "lang", - "ghost", - "center", - "grid", - "swap", - "sfx", - "bgm", - "vib", - "fullscreen", - "bgblock", - "das", - "arr", - "sddas", - "sdarr", - "virtualkeyAlpha", - "virtualkeyIcon", - "virtualkeySwitch", - "frameMul", -} -virtualkeySet={ +local virtualkeySet={ { {80,720-200,6400,80},--moveLeft {320,720-200,6400,80},--moveRight @@ -495,54 +228,57 @@ Buttons={ back={x=1235,y=45,w=80,h=80,rgb=color.white,code=back,f=35}, }, setting={--Normal setting - ghost={x=290,y=90,w=210,h=60,rgb=color.white,code=function()setting.ghost=not setting.ghost end,down="grid",right="center"}, - center={x=505,y=90,w=210,h=60,rgb=color.white,code=function()setting.center=not setting.center end,down="swap",left="ghost",right="sfx"}, - grid={x=290,y=160,w=210,h=60,rgb=color.white,code=function()setting.grid=not setting.grid end,up="ghost",down="dasD",right="swap"}, - swap={x=505,y=160,w=210,h=60,f=28,rgb=color.white,code=function()setting.swap=not setting.swap end,up="center",down="arrD",left="grid",right="vib"}, - dasD={x=210,y=230,w=50,h=50,rgb=color.white,code=function()setting.das=(setting.das-1)%31 end,up="grid",down="sddasD",right="dasU"}, - dasU={x=370,y=230,w=50,h=50,rgb=color.white,code=function()setting.das=(setting.das+1)%31 end,up="grid",down="sddasU",left="dasD",right="arrD"}, - arrD={x=425,y=230,w=50,h=50,rgb=color.white,code=function()setting.arr=(setting.arr-1)%16 end,up="swap",down="sdarrD",left="dasU",right="arrU"}, - arrU={x=585,y=230,w=50,h=50,rgb=color.white,code=function()setting.arr=(setting.arr+1)%16 end,up="swap",down="sdarrU",left="arrD",right="fullscreen"},--3~6 - sddasD={x=210,y=300,w=50,h=50,rgb=color.white,code=function()setting.sddas=(setting.sddas-1)%11 end,up="dasD",down="lang",right="sddasU"}, - sddasU={x=370,y=300,w=50,h=50,rgb=color.white,code=function()setting.sddas=(setting.sddas+1)%11 end,up="dasU",down="lang",left="sddasD",right="sdarrD"}, - sdarrD={x=425,y=300,w=50,h=50,rgb=color.white,code=function()setting.sdarr=(setting.sdarr-1)%4 end,up="arrD",down="lang",left="sddasU",right="sdarrU"}, - sdarrU={x=585,y=300,w=50,h=50,rgb=color.white,code=function()setting.sdarr=(setting.sdarr+1)%4 end,up="arrU",down="lang",left="sdarrD",right="bgblock"}, - sfx={x=760,y=90,w=160,h=60,rgb=color.white,code=function()setting.sfx=not setting.sfx end,down="vib",left="center",right="bgm"}, - bgm={x=940,y=90,w=160,h=60,rgb=color.white,code=function() + ghost= {x=290, y=90, w=210, h=60, rgb=color.white, code=function()setting.ghost=not setting.ghost end,down="grid",right="center"}, + center= {x=505, y=90, w=210, h=60, rgb=color.white, code=function()setting.center=not setting.center end,down="swap",left="ghost",right="sfx"}, + grid= {x=290, y=160, w=210, h=60, rgb=color.white, code=function()setting.grid=not setting.grid end,up="ghost",down="fxs",right="swap"}, + swap= {x=505, y=160, w=210, h=60,f=28, rgb=color.white, code=function()setting.swap=not setting.swap end,up="center",down="arrD",left="grid",right="vib"}, + fxs= {x=290, y=230, w=210, h=60, rgb=color.white, code=function()setting.fxs=not setting.fxs end,up="grid",down="dasU",right="fullscreen"}, + + dasD= {x=210, y=300, w=50, h=50, rgb=color.white, code=function()setting.das=(setting.das-1)%31 end,up="fxs",down="sddasD",right="dasU"}, + dasU= {x=370, y=300, w=50, h=50, rgb=color.white, code=function()setting.das=(setting.das+1)%31 end,up="fxs",down="sddasU",left="dasD",right="arrD"}, + arrD= {x=425, y=300, w=50, h=50, rgb=color.white, code=function()setting.arr=(setting.arr-1)%16 end,up="swap",down="sdarrD",left="dasU",right="arrU"}, + arrU= {x=585, y=300, w=50, h=50, rgb=color.white, code=function()setting.arr=(setting.arr+1)%16 end,up="swap",down="sdarrU",left="arrD",right="bgblock"},--3~6 + sddasD= {x=210, y=370, w=50, h=50, rgb=color.white, code=function()setting.sddas=(setting.sddas-1)%11 end,up="dasD",down="lang",right="sddasU"}, + sddasU= {x=370, y=370, w=50, h=50, rgb=color.white, code=function()setting.sddas=(setting.sddas+1)%11 end,up="dasU",down="lang",left="sddasD",right="sdarrD"}, + sdarrD= {x=425, y=370, w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr-1)%4 end,up="arrD",down="lang",left="sddasU",right="sdarrU"}, + sdarrU= {x=585, y=370, w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr+1)%4 end,up="arrU",down="lang",left="sdarrD",right="frame"}, + + sfx= {x=760, y=90, w=160, h=60, rgb=color.white, code=function()setting.sfx=not setting.sfx end,down="vib",left="center",right="bgm"}, + bgm= {x=940, y=90, w=160, h=60, rgb=color.white, code=function() BGM() setting.bgm=not setting.bgm BGM("blank") - end,down="vib",left="sfx"}, - vib={x=850,y=160,w=340,h=60,rgb=color.white,code=function() + 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) - end,up="sfx",down="fullscreen",left="swap"}, - fullscreen={x=850,y=230,w=340,h=60,rgb=color.white,code=function() + 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 love.window.setFullscreen(setting.fullscreen) if not setting.fullscreen then love.resize(gc.getWidth(),gc.getHeight()) end - end,up="vib",down="bgblock",left="arrU"}, - bgblock={x=850,y=300,w=340,h=60,rgb=color.white,code=function() + end,up="vib",down="bgblock",left="arrU"}, + bgblock= {x=850, y=300, w=340, h=60, rgb=color.white, code=function() setting.bgblock=not setting.bgblock if not setting.bgblock then for i=1,16 do BGblockList[i].v=3*BGblockList[i].v end end - end,up="fullscreen",down="frame",left="sdarrU"}, - frame={x=850,y=370,w=340,h=60,rgb=color.white,code=function() + end,up="fullscreen",down="frame",left="sdarrU"}, + frame= {x=850, y=370, w=340, h=60, rgb=color.white, code=function() setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10) if setting.frameMul>100 then setting.frameMul=25 end - end,up="bgblock",down="control",left="sdarrU"}, - control={x=850,y=440,w=340,h=60,rgb=color.green,code=function()gotoScene("setting2")end,up="frame",down="touch",left="lang"}, - touch={x=850,y=510,w=340,h=60,rgb=color.yellow,code=function()gotoScene("setting3")end,up="control",down="back",left="lang"}, - lang={x=280,y=510,w=200,h=60,rgb=color.red,code=function() + end,up="bgblock",down="control",left="sdarrU"}, + control= {x=850, y=440, w=340, h=60, rgb=color.green, code=function()gotoScene("setting2")end,up="frame",down="touch",left="lang"}, + touch= {x=850, y=510, w=340, h=60, rgb=color.yellow, code=function()gotoScene("setting3")end,up="control",down="back",left="lang"}, + lang= {x=280, y=510, w=200, h=60, rgb=color.red, code=function() setting.lang=setting.lang%#langName+1 swapLanguage(setting.lang) - end,up="sddasD",down="back",right="touch"}, - back={x=640,y=620,w=300,h=70,rgb=color.white,code=back,up="touch"}, + end,up="sddasD",down="back",right="touch"}, + back= {x=640, y=620, w=300, h=70, rgb=color.white, code=back,up="touch"}, }, setting2={--Control setting back={x=840,y=630,w=180,h=60,rgb=color.white,code=back}, @@ -551,25 +287,25 @@ Buttons={ back={x=640,y=410,w=170,h=80,f=45,code=back}, hide={x=640,y=210,w=500,h=80,f=45,code=function() setting.virtualkeySwitch=not setting.virtualkeySwitch - end}, + end}, default={x=450,y=310,w=170,h=80,code=function() for K=1,#virtualkey do local b,b0=virtualkey[K],virtualkeySet[defaultSel][K] b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4] end--Default virtualkey defaultSel=defaultSel%5+1 - end}, + end}, snap={x=640,y=310,w=170,h=80,code=function() snapLevel=snapLevel%6+1 - end}, + end}, alpha={x=830,y=310,w=170,h=80,f=45,code=function() setting.virtualkeyAlpha=(setting.virtualkeyAlpha+1)%6 --Adjust virtualkey alpha - end}, + end}, icon={x=450,y=410,w=170,h=80,f=45,code=function() setting.virtualkeyIcon=not setting.virtualkeyIcon --Switch virtualkey icon - end}, + end}, size={x=830,y=410,w=170,h=80,f=45,code=function() if sel then local b=virtualkey[sel] @@ -577,7 +313,7 @@ Buttons={ if b[4]==150 then b[4]=40 end b[3]=b[4]^2 end - end}, + end}, }, help={ back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="qq"}, diff --git a/main.lua b/main.lua index 19515cee..6ffdca2f 100644 --- a/main.lua +++ b/main.lua @@ -1,39 +1,22 @@ -lib={ - gc=love.graphics, - kb=love.keyboard, - ms=love.mouse, - tc=love.touch, - tm=love.timer, - fs=love.filesystem, - wd=love.window, - mt=love.math, - sys=love.system, -}for k,v in pairs(lib)do _G[k]=v end lib=nil -toN,toS=tonumber,tostring +local gc=love.graphics +local tm=love.timer +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 null=function()end -ww,wh=gc.getWidth(),gc.getHeight() -Timer=tm.getTime--Easy&Quick to get time! -mx,my,mouseShow=-20,-20,false -xOy=love.math.newTransform() -focus=true - system=sys.getOS() -touching=nil--1st touching ID - scene="" bgmPlaying=nil curBG="none" -BGblock={ct=150,next=7} kb.setKeyRepeat(false) kb.setTextInput(false) ms.setVisible(false) -Fonts={} +local Fonts={} function setFont(s) if s~=currentFont then if Fonts[s]then @@ -45,6 +28,7 @@ function setFont(s) end currentFont=s end + return Fonts[s] end gameEnv0={ @@ -54,13 +38,15 @@ gameEnv0={ grid=false,swap=true, _20G=false,bone=false, drop=30,lock=45, - wait=1,fall=1, + wait=0,fall=0, next=6,hold=true,oncehold=true, + + keepVisible=true,visible="show", sequence="bag7", - block=true,visible="show", - target=1e99, - freshLimit=1e99, + block=true, ospin=true, + freshLimit=1e99, + target=1e99, reach=null, bg="none", bgm="race" @@ -78,276 +64,19 @@ customSel={ freshLimit=3, opponent=1, } -loadmode={ - sprint=function() - createPlayer(1,340,15) - end, - marathon=function() - createPlayer(1,340,15) - end, - master=function() - createPlayer(1,340,15) - end, - classic=function() - createPlayer(1,340,15) - end, - zen=function() - createPlayer(1,340,15) - end, - infinite=function() - createPlayer(1,340,15) - end, - solo=function() - createPlayer(1,340,15) - createPlayer(2,965,360,.5,customRange.opponent[3*curMode.lv]) - end, - tsd=function() - createPlayer(1,340,15) - end, - blind=function() - createPlayer(1,340,15) - end, - dig=function() - createPlayer(1,340,15) - local P=players[1] - if curMode.lv==1 then - newTask(Event_task.dig_normal,P) - pushSpeed=1 - elseif curMode.lv==2 then - newTask(Event_task.dig_lunatic,P) - pushSpeed=1 - end - end, - survivor=function() - createPlayer(1,340,15) - newTask(Event_task[curMode.lv==1 and"survivor_easy"or curMode.lv==2 and"survivor_normal"or curMode.lv==3 and"survivor_hard"or curMode.lv==4 and"survivor_lunatic"],P) - pushSpeed=curMode.lv>2 and 2 or 1 - end, - tech=function() - createPlayer(1,340,15) - end, - pctrain=function() - createPlayer(1,340,15) - P=players[1] - Event.newPC() - P.freshNext() - end, - pcchallenge=function() - createPlayer(1,340,15) - end, - techmino41=function() - createPlayer(1,340,15)--Player - if curMode.lv==5 then players[1].gameEnv.drop=15 end - local n,min,max=2 - if curMode.lv==1 then min,max=5,30 - elseif curMode.lv==2 then min,max=3,25 - elseif curMode.lv==3 then min,max=2,20 - elseif curMode.lv==4 then min,max=2,10 - elseif curMode.lv==5 then min,max=1,6 - end - for i=1,4 do for j=1,5 do - createPlayer(n,77*i-55,140*j-125,.2,rnd(min,max)) - n=n+1 - end end - for i=9,12 do for j=1,5 do - createPlayer(n,77*i+275,140*j-125,.2,rnd(min,max)) - n=n+1 - end end - --AIs - - end, - techmino99=function() - createPlayer(1,340,15)--Player - if curMode.lv==5 then players[1].gameEnv.drop=15 end - local n,min,max=2 - if curMode.lv==1 then min,max=5,32 - elseif curMode.lv==2 then min,max=3,25 - elseif curMode.lv==3 then min,max=2,18 - elseif curMode.lv==4 then min,max=2,12 - elseif curMode.lv==5 then min,max=1,12 - end - for i=1,7 do for j=1,7 do - createPlayer(n,46*i-36,97*j-72,.135,rnd(min,max)) - n=n+1 - end end - for i=15,21 do for j=1,7 do - createPlayer(n,46*i+264,97*j-72,.135,rnd(min,max)) - n=n+1 - end end - --AIs - - end, - drought=function() - createPlayer(1,340,15) - end, - hotseat=function() - if curMode.lv==1 then - createPlayer(1,20,15) - createPlayer(2,650,15) - elseif curMode.lv==2 then - createPlayer(1,20,100,.65) - createPlayer(2,435,100,.65) - createPlayer(3,850,100,.65) - elseif curMode.lv==3 then - createPlayer(1,25,160,.5) - createPlayer(2,335,160,.5) - createPlayer(3,645,160,.5) - createPlayer(4,955,160,.5) - end - end, - custom=function() - for i=1,#customID do - local k=customID[i] - modeEnv[k]=customRange[k][customSel[k]] - end - modeEnv._20G=modeEnv.drop==-1 - if modeEnv.opponent==0 then - createPlayer(1,340,15) - else - modeEnv.target=nil - createPlayer(1,340,15) - createPlayer(2,965,360,.9,modeEnv.opponent) - end - end, -} -mesDisp={ - --Default:font=35,white - sprint=function() - setFont(70) - local r=max(P.gameEnv.target-P.cstat.row,0) - mStr(r,-75,260) - if r<21 and r>0 then - gc.setLineWidth(3) - gc.setColor(color.lightRed) - gc.line(0,600-30*r,300,600-30*r) - end - end, - marathon=function() - setFont(50) - mStr(P.cstat.row,-75,320) - mStr(P.gameEnv.target,-75,370) - gc.rectangle("fill",-120,376,90,4) - end, - master=function() - setFont(50) - mStr(P.cstat.point,-75,320) - mStr((P.cstat.event+1)*100,-75,370) - gc.rectangle("fill",-120,376,90,4) - end, - classic=function() - setFont(80) - local r=P.gameEnv.target*.1 - mStr(r<11 and 19+r or r==11 and"00"or r==12 and"0a"or format("%x",r*10-110),-75,210) - setFont(20) - mStr("speed level",-75,290) - setFont(50) - mStr(P.cstat.row,-75,320) - mStr(P.gameEnv.target,-75,370) - gc.rectangle("fill",-120,376,90,4) - end, - zen=function() - setFont(75) - mStr(max(200-P.cstat.row,0),-75,280) - end, - infinite=function() - setFont(50) - mStr(P.cstat.atk,-75,310) - mStr(format("%.2f",2.5*P.cstat.atk/P.cstat.piece),-75,420) - setFont(20) - mStr("Attack",-75,363) - mStr("Efficiency",-75,475) - end, - tsd=function() - setFont(35) - mStr("TSD",-75,405) - setFont(80) - mStr(P.cstat.event,-75,330) - end, - blind=function() - setFont(25) - mStr("Rows",-75,300) - mStr("Techrash",-75,420) - setFont(80) - mStr(P.cstat.row,-75,220) - mStr(P.cstat.techrash,-75,340) - end, - dig=function() - setFont(70) - mStr(P.cstat.event,-75,310) - setFont(30) - mStr("Wave",-75,375) - end, - survivor=function() - setFont(70) - mStr(P.cstat.event,-75,310) - setFont(30) - mStr("Wave",-75,375) - end, - pctrain=function() - setFont(25) - mStr("Perfect Clear",-75,410) - setFont(80) - mStr(P.cstat.pc,-75,330) - end, - pcchallenge=function() - setFont(25) - mStr("Perfect Clear",-75,430) - setFont(80) - mStr(P.cstat.pc,-75,350) - setFont(50) - mStr(max(100-P.cstat.row,0),-75,250) - end, - techmino41=function() - setFont(40) - mStr(#players.alive.."/41",-75,175) - mStr(P.ko,-60,215) - setFont(25) - gc.print("KO",-115,225) - gc.setColor(1,.5,0,.6) - gc.print(P.badge,-35,227) - gc.setColor(1,1,1) - setFont(30) - gc.print(up0to4[P.strength],-125,290) - for i=1,P.strength do - gc.draw(badgeIcon,16*i-130,260) - end - end, - techmino99=function() - setFont(40) - mStr(#players.alive.."/99",-75,175) - mStr(P.ko,-60,215) - setFont(25) - gc.print("KO",-115,225) - gc.setColor(1,.5,0,.6) - gc.print(P.badge,-35,227) - gc.setColor(1,1,1) - setFont(30) - gc.print(up0to4[P.strength],-125,290) - for i=1,P.strength do - gc.draw(badgeIcon,16*i-130,260) - end - end, - drought=function() - setFont(75) - mStr(max(100-P.cstat.row,0),-75,280) - end, - custom=function() - if P.gameEnv.target<1e4 then - setFont(75) - mStr(max(P.gameEnv.target-P.cstat.row,0),-75,280) - end - end -} --Game system Data setting={ - lang=1, + ghost=true,center=true, + grid=false,swap=true, + fxs=true, + + das=10,arr=2, + sddas=0,sdarr=2, + sfx=true,bgm=true,vib=3, fullscreen=false, bgblock=true, - das=10,arr=2, - sddas=0,sdarr=2, - ghost=true,center=true, - grid=false,swap=true, + lang=1, keyMap={ {"left","right","x","z","c","up","down","space","tab","r","","",""}, {"","","","","","","","","","","","",""}, @@ -422,6 +151,7 @@ virtualkeyDown={false,false,false,false,false,false,false,false,false,false,fals virtualkeyPressTime={0,0,0,0,0,0,0,0,0,0,0,0,0} --User Data&User Setting require"toolfunc" +require"list" require"class" require"gamefunc" require"ai" @@ -429,7 +159,6 @@ require"timer" require"paint" require"call&sys" require"dataList" -require"list" require"texture" userData,userSetting=fs.newFile("userdata"),fs.newFile("usersetting") diff --git a/paint.lua b/paint.lua index 89a9f493..eba6897b 100644 --- a/paint.lua +++ b/paint.lua @@ -1,40 +1,65 @@ -swapDeck_data={ - {4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1}, - {1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2}, - {3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2}, - {2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4}, - {7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5}, - {3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6}, - {2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7}, - {5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8}, - {7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8}, -}--Block id [ZSLJTOI] ,dir,x,y -swap={ - none={2,1,d=function()end}, - flash={8,1,d=function()gc.clear(1,1,1)end}, - deck={50,8,d=function() - local t=sceneSwaping.time - gc.setColor(1,1,1) - if t>8 then - local t=max(t,15) - for i=1,51-t do - local bn=swapDeck_data[i][1] - local b=blocks[bn][swapDeck_data[i][2]] - local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4] - for y=1,#b do for x=1,#b[1]do - if b[y][x]>0 then - gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3) - end - end end - end - end - if t<17 then - gc.setColor(1,1,1,(8-abs(t-8))*.125) - gc.rectangle("fill",0,0,1280,720) - end +local gc=love.graphics +local mt=love.math +local setFont=setFont +local Timer=love.timer.getTime + +local attackColor={ + {color.darkGrey,color.white}, + {color.grey,color.white}, + {color.lightPurple,color.white}, + {color.lightRed,color.white}, + {color.darkGreen,color.cyan}, +} +local frameColor={ + [0]=color.white, + color.lightGreen, + color.lightBlue, + color.lightPurple, + color.lightOrange, +} +local modeLevelColor={ + EASY=color.cyan, + NORMAL=color.green, + HARD=color.magenta, + ["HARD+"]=color.darkMagenta, + LUNATIC=color.red, + EXTRA=color.lightMagenta, + ULTIMATE=color.lightYellow, + + MESS=color.lightGrey, + GM=color.blue, + DEATH=color.lightRed, + CTWC=color.lightBlue, + ["10L"]=color.cyan, + ["20L"]=color.lightBlue, + ["40L"]=color.green, + ["100L"]=color.orange, + ["400L"]=color.red, + ["1000L"]=color.darkRed, +} + +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}, +} +local function stencil_miniTitle() + for i=1,#miniTitle_rect do + gc.rectangle("fill",unpack(miniTitle_rect[i])) end -}, -}--Scene swapping animations +end +local function stencil_field() + gc.rectangle("fill",0,-10,300,610) +end +local function stencil_field_small() + gc.rectangle("fill",0,0,60,120) +end + FX={ flash=0,--Black screen(frame) shake=0,--Screen shake(frame) @@ -148,8 +173,7 @@ function drawDial(x,y,speed) gc.setColor(1,1,1,.6) gc.draw(dialNeedle,x,y,2.094+(speed<=175 and .02094*speed or 4.712-52.36/(speed-125)),nil,nil,5,4) end -function drawPixel(y,x,id,alpha) - gc.setColor(1,1,1,alpha) +function drawPixel(y,x,id) gc.draw(blockSkin[id],30*x-30,600-30*y) end function drawAtkPointer(x,y) @@ -188,51 +212,49 @@ function drawVirtualkey() end end -Pnt={} -Pnt.BG={ - none=function() - gc.clear(.2,.2,.2) - end, - glow=function() - local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05 - gc.clear(t,t,t) - end, - game1=function() - gc.setColor(1,1,1) - gc.draw(background1,640,360,Timer()*.15,12,nil,64,64) - end, - game2=function() - gc.setColor(1,.5,.5) - gc.draw(background1,640,360,Timer()*.2,12,nil,64,64) - end, - game3=function() - gc.setColor(.6,.6,1) - gc.draw(background1,640,360,Timer()*.25,12,nil,64,64) - end, - rgb=function() - gc.clear( - sin(Timer()*1.2)*.15+.5, - sin(Timer()*1.5)*.15+.5, - sin(Timer()*1.9)*.15+.5 - ) - end, - strap=function() - gc.setColor(1,1,1) - local x=Timer()%32*40 - gc.draw(background2,x,0,nil,10) - gc.draw(background2,x-1280,0,nil,10) - end, - matrix=function() - for i=0,15 do - for j=0,8 do - -- local t=sin(Timer()*((2.468*i-1.357*j)%3))*.3 - local t=(sin((mt.noise(i,j)+2)*Timer())+1)*.2 - gc.setColor(t,t,t) - gc.rectangle("fill",80*i,80*j,80,80) - end +Pnt={BG={}} +function Pnt.BG.none() + gc.clear(.15,.15,.15) +end +function Pnt.BG.glow() + local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05 + gc.clear(t,t,t) +end +function Pnt.BG.game1() + gc.setColor(1,1,1) + gc.draw(background1,640,360,Timer()*.15,12,nil,64,64) +end +function Pnt.BG.game2() + gc.setColor(1,.5,.5) + gc.draw(background1,640,360,Timer()*.2,12,nil,64,64) +end +function Pnt.BG.game3() + gc.setColor(.6,.6,1) + gc.draw(background1,640,360,Timer()*.25,12,nil,64,64) +end +function Pnt.BG.rgb() + gc.clear( + sin(Timer()*1.2)*.15+.5, + sin(Timer()*1.5)*.15+.5, + sin(Timer()*1.9)*.15+.5 + ) +end +function Pnt.BG.strap() + gc.setColor(1,1,1) + local x=Timer()%32*40 + gc.draw(background2,x,0,nil,10) + gc.draw(background2,x-1280,0,nil,10) +end +local matrixT={}for i=0,15 do matrixT[i]={}for j=0,8 do matrixT[i][j]=mt.noise(i,j)+2 end end +function Pnt.BG.matrix() + for i=0,15 do + for j=0,8 do + local t=sin(matrixT[i][j]*Timer())*.2+.2 + gc.setColor(1,1,1,t) + gc.rectangle("fill",80*i,80*j,80,80) end - end, -} + end +end function Pnt.load() gc.setLineWidth(4) @@ -265,7 +287,7 @@ function Pnt.main() gc.setColor(1,1,1) gc.draw(titleImage,300,30) setFont(30) - gc.print("Alpha V0.7.12",290,140) + gc.print("Alpha V0.7.13+",290,140) gc.print(system,800,110) end function Pnt.mode() @@ -288,11 +310,11 @@ function Pnt.mode() end end function Pnt.custom() + gc.setColor(1,1,1,.3+sin(Timer()*8)*.2) + gc.rectangle("fill",25,95+40*optSel,465,40) setFont(80) - gc.setColor(color.lightGrey) - gc.print(text.custom,20,20) - gc.setColor(color.white) - gc.print(text.custom,22,23) + gc.setColor(.8,.8,.8)gc.print(text.custom,20,20) + gc.setColor(1,1,1)gc.print(text.custom,22,23) setFont(40) for i=1,#customID do local k=customID[i] @@ -304,7 +326,6 @@ function Pnt.custom() gc.print(customRange[k][customSel[k]],350,y) end end - gc.print("→",10,90+40*optSel) end function Pnt.play() for p=1,#players do @@ -363,36 +384,50 @@ function Pnt.play() gc.stencil(stencil_field,"replace", 1) gc.translate(0,P.fieldBeneath) gc.setStencilTest("equal",1) + local h=#P.clearing for j=int(P.fieldBeneath/30+1),#P.field do - if P.falling<=0 or without(P.clearing,j)then - for i=1,10 do - if P.field[j][i]>0 then - drawPixel(j,i,P.field[j][i],min(P.visTime[j][i],20)*.05) - end - end - else + if j==P.clearing[h]and P.falling>-1 then + h=h-1 gc.setColor(1,1,1,P.falling/P.gameEnv.fall) gc.rectangle("fill",0,600-30*j,320,30) + else + for i=1,10 do + if P.field[j][i]>0 then + gc.setColor(1,1,1,min(P.visTime[j][i],20)*.05) + drawPixel(j,i,P.field[j][i]) + end + end end end--Field - if P.waiting<=0 then + for i=1,#P.shade do + local S=P.shade[i] + gc.setColor(1,1,1,.15+S[1]*.08) + for x=S[3],S[5]do + for y=S[6],S[4]do + drawPixel(y,x,S[2]) + end + end + end + if P.waiting==-1 then if P.gameEnv.ghost then + gc.setColor(1,1,1,.3) for i=1,P.r do for j=1,P.c do - if P.curBlock[i][j]>0 then - drawPixel(i+P.y_img-1,j+P.curX-1,P.curColor,.3) + if P.cur.bk[i][j]then + drawPixel(i+P.y_img-1,j+P.curX-1,P.cur.color) end end end end--Ghost if P.gameEnv.block then gc.setColor(1,1,1,P.lockDelay/P.gameEnv.lock) for i=1,P.r do for j=1,P.c do - if P.curBlock[i][j]>0 then - gc.rectangle("fill",30*(j+P.curX-1)-34,596-30*(i+P.curY-1),38,38) + if P.cur.bk[i][j]then + gc.rectangle("fill",30*(j+P.curX-1)-33,597-30*(i+P.curY-1),36,36) end end end--BlockShade(lockdelay indicator) + gc.setColor(1,1,1) for i=1,P.r do for j=1,P.c do - if P.curBlock[i][j]>0 then - drawPixel(i+P.curY-1,j+P.curX-1,P.curColor,1) + if P.cur.bk[i][j]then + drawPixel(i+P.curY-1,j+P.curX-1,P.cur.color) end end end--Block end @@ -405,15 +440,16 @@ function Pnt.play() end--Rotate center end gc.setColor(1,1,1) - gc.draw(PTC.dust[p])--Draw game field + gc.draw(PTC.dust[p]) + --Draw game field gc.setStencilTest()--In-playField mask gc.translate(0,-P.fieldBeneath) gc.setLineWidth(3) gc.setColor(1,1,1) gc.rectangle("line",-1,-11,302,612)--Draw boarder + gc.setLineWidth(2) gc.rectangle("line",301,0,16,601.5)--Draw atkBuffer boarder - local h=0 for i=1,#P.atkBuffer do local a=P.atkBuffer[i] @@ -445,40 +481,44 @@ function Pnt.play() end h=h+bar end--Buffer line + local a,b=P.b2b,P.b2b1 if a>b then a,b=b,a end + gc.setColor(.8,1,.2) + gc.rectangle("fill",-15,599.5,11,-b*.5) + gc.setColor(P.b2b<40 and color.white or P.b2b<=1e3 and color.lightRed or color.lightBlue) + gc.rectangle("fill",-15,599.5,11,-a*.5) + gc.setColor(1,1,1,.5+sin(Timer()*30)*.5) + gc.rectangle("fill",-16,b<40 and 578.5 or 98.5,13,3) gc.setColor(1,1,1) - gc.draw(lightBulb,-35,573) - if P.b2b>0 then - gc.setColor(P.b2b<50 and color.white or P.b2b<=1000 and color.lightRed or color.lightBlue) - gc.draw(light,-35,573) - end + gc.rectangle("line",-17,-3,16,604.5)--Draw b2b bar boarder --B2B indictator - setFont(40) - gc.setColor(1,1,1) + if P.gameEnv.hold then - mStr(text.hold,-75,-10) - for i=1,#P.holdBlock do - for j=1,#P.holdBlock[1] do - if P.holdBlock[i][j]>0 then - drawPixel(i+17.5-#P.holdBlock*.5,j-2.5-#P.holdBlock[1]*.5,P.holded and 9 or P.holdColor,1) + gc.draw(drawableText.hold,-75-drawableText.hold:getWidth()*.5,-10) + gc.setColor(1,1,1) + for i=1,#P.hold.bk do + for j=1,#P.hold.bk[1] do + if P.hold.bk[i][j]then + drawPixel(i+17.5-#P.hold.bk*.5,j-2.5-#P.hold.bk[1]*.5,P.holded and 9 or P.hold.color) end end end end--Hold - mStr(text.next,375,-10) - for N=1,P.gameEnv.next do - local b=P.nextBlock[N] - for i=1,#b do - for j=1,#b[1] do - if b[i][j]>0 then - drawPixel(i+20-2.4*N-#b*.5,j+12.7-#b[1]*.5,P.nextColor[N],1) - end + gc.draw(drawableText.next,382-drawableText.next:getWidth()*.5,-10) + local N=1 + ::L:: + local b,c=P.next[N].bk,P.next[N].color + gc.setColor(1,1,1) + for i=1,#b do for j=1,#b[1] do + if b[i][j]then + drawPixel(i+20-2.4*N-#b*.5,j+12.7-#b[1]*.5,c) end - end - end--Next - setFont(30) + end end + N=N+1 + if N<=P.gameEnv.next and P.next[N]then goto L end + --Next gc.setColor(.8,.8,.8) - gc.print(curMode.modeName,-135,-65) - gc.printf(curMode.levelName,240,-65,200,"right") + gc.draw(drawableText.modeName,-135,-65) + gc.draw(drawableText.levelName,437-drawableText.levelName:getWidth(),-65) if frame<180 then local count=179-frame gc.push("transform") @@ -499,9 +539,8 @@ function Pnt.play() if mesDisp[curMode.id]then mesDisp[curMode.id]()end--Draw other message gc.setColor(1,1,1) - setFont(15) - gc.print("BPM",390,490) - gc.print("KPM",350,583) + gc.draw(drawableText.bpm,390,490) + gc.draw(drawableText.kpm,350,583) setFont(30) drawDial(360,520,P.dropSpeed) drawDial(405,575,P.keySpeed) @@ -518,16 +557,14 @@ function Pnt.play() end end--Draw players gc.setColor(1,1,1) - for i=1,3 do - gc.draw(PTC.attack[i]) - end - if setting.virtualkeySwitch then - drawVirtualkey() - end + gc.draw(PTC.attack[1]) + gc.draw(PTC.attack[2]) + gc.draw(PTC.attack[3]) + if setting.virtualkeySwitch then drawVirtualkey()end if modeEnv.royaleMode then for i=1,#FX.badge do local b=FX.badge[i] - local t=b.t<10 and 0 or b.t<50 and(sin(1.5*(b.t/20-1.5))+1)*.5 or 1 + local t=b.t<10 and 0 or b.t<50 and .5+sin(1.5*(b.t/20-1.5))*.5 or 1 gc.setColor(1,1,1,b.t<10 and b.t*.1 or b.t<50 and 1 or(60-b.t)*.1) gc.draw(badgeIcon,b[1]+(b[3]-b[1])*t,b[2]+(b[4]-b[2])*t,nil,nil,nil,14,14) end @@ -551,14 +588,14 @@ end function Pnt.setting() gc.setColor(1,1,1) setFont(35) - mStr("DAS:"..setting.das,290,208) - mStr("ARR:"..setting.arr,506,208) + mStr("DAS:"..setting.das,290,278) + mStr("ARR:"..setting.arr,506,278) setFont(18) - mStr(text.softdropdas..setting.sddas,290,291) - mStr(text.softdroparr..setting.sdarr,506,291) + mStr(text.softdropdas..setting.sddas,290,361) + mStr(text.softdroparr..setting.sdarr,506,361) end function Pnt.setting2() - local a=.2+(sin(Timer()*15)+1)*.1 + local a=.3+sin(Timer()*15)*.1 if keyboardSetting then gc.setColor(1,.5,.5,a) else @@ -585,8 +622,8 @@ function Pnt.setting2() gc.line(200*x-160,30,200*x-160,550) end gc.line(40,550,640,550) - gc.print(text.keyboard,335,1) - gc.print(text.joystick,420,1) + mStr(text.keyboard,340,0) + mStr(text.joystick,540,0) gc.print(text.setting2Help,50,620) setFont(40) gc.print("< P"..curBoard.."/P8 >",430,570) diff --git a/texture.lua b/texture.lua index ff4db762..fef78d4d 100644 --- a/texture.lua +++ b/texture.lua @@ -1,6 +1,7 @@ -local c -local N=gc.newImage -local C=function(x,y) +local gc=love.graphics +local N,c=gc.newImage +local function T(s,t)return gc.newText(setFont(s),t)end +local function C(x,y) c=gc.newCanvas(x,y) gc.setCanvas(c) return c @@ -25,6 +26,15 @@ for i=1,10 do virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png") end +local blockColor={ + color.red, + color.green, + color.orange, + color.blue, + color.magenta, + color.yellow, + color.cyan, +} gc.setColor(1,1,1) mouseBlock={} for i=1,7 do @@ -32,7 +42,7 @@ for i=1,7 do mouseBlock[i]=C(#b[1],#b) gc.setColor(blockColor[i]) for y=1,#b do for x=1,#b[1]do - if b[y][x]~=0 then + if b[y][x]then gc.rectangle("fill",x-1,#b-y,1,1) end end end @@ -83,5 +93,13 @@ background2=N("/image/BG/bg2.png") groupCode=N("/image/mess/groupcode.png") payCode=N("/image/mess/paycode.png") -c=nil -gc.setCanvas() \ No newline at end of file +drawableText={ + bpm=T(15,"BPM"), + kpm=T(15,"KPM"), + modeName=T(30), + levelName=T(30), + next=T(40), + hold=T(40), +} + +c=gc.setCanvas() \ No newline at end of file diff --git a/timer.lua b/timer.lua index 7c7605f3..dd8d49c4 100644 --- a/timer.lua +++ b/timer.lua @@ -1,3 +1,5 @@ +local Timer=love.timer.getTime + Tmr={} function Tmr.load() if loading==1 then @@ -70,10 +72,9 @@ function Tmr.play(dt) virtualkeyPressTime[i]=virtualkeyPressTime[i]-1 end end - for i=1,3 do - PTC.attack[i]:update(dt) - end - + PTC.attack[1]:update(dt) + PTC.attack[2]:update(dt) + PTC.attack[3]:update(dt) if frame<180 then if frame==179 then gameStart() @@ -83,13 +84,13 @@ function Tmr.play(dt) for p=1,#players do P=players[p] if P.keyPressing[1]or P.keyPressing[2]then - P.moving=P.moving+sgn(P.moving) + P.moving=P.moving+(P.moving>0 and 1 or -1) else P.moving=0 end end return - end--Counting,include pre-das + 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 @@ -109,7 +110,7 @@ function Tmr.play(dt) end end - if P.ai and P.waiting<=0 then + if P.ai and P.waiting==-1 then P.ai.controlDelay=P.ai.controlDelay-1 if P.ai.controlDelay==0 then if #P.ai.controls>0 then @@ -128,13 +129,14 @@ function Tmr.play(dt) end end end + if not P.keepVisible then + for j=1,#P.field do for i=1,10 do + if P.visTime[j][i]>0 then P.visTime[j][i]=P.visTime[j][i]-1 end + end end + end--Fresh visible time - for j=1,#P.field do for i=1,10 do - if P.visTime[j][i]>0 then P.visTime[j][i]=P.visTime[j][i]-1 end - end end - --Fresh visible time if P.keyPressing[1]or P.keyPressing[2]then - P.moving=P.moving+sgn(P.moving) + P.moving=P.moving+(P.moving>0 and 1 or -1) local d=abs(P.moving)-P.gameEnv.das if d>1 then if P.gameEnv.arr>0 then @@ -149,8 +151,8 @@ function Tmr.play(dt) P.moving=0 end if P.keyPressing[7]and not P.keyPressing[9]then - P.downing=P.downing+1 local d=abs(P.downing)-P.gameEnv.sddas + P.downing=P.downing+1 if d>1 then if P.gameEnv.sdarr>0 then if d%P.gameEnv.sdarr==0 then @@ -163,40 +165,44 @@ function Tmr.play(dt) else P.downing=0 end - if P.falling>0 then + if P.falling>=0 then P.falling=P.falling-1 - if P.falling<=0 then - if #P.field>P.clearing[1]then SFX("fall")end - for i=1,#P.clearing do - removeRow(P.field,P.clearing[i]) - removeRow(P.visTime,P.clearing[i]) - end - ::L::if P.clearing[1]then - rem(P.clearing) - goto L - end + if P.falling>=0 then goto stop end + if P.gameEnv.fall>0 and #P.field>P.clearing[1]then SFX("fall")end + for i=1,#P.clearing do + removeRow(P.field,P.clearing[i]) + removeRow(P.visTime,P.clearing[i]) end - elseif P.waiting>0 then + ::L:: + rem(P.clearing) + if P.clearing[1]then goto L end + end + if P.waiting>=0 then P.waiting=P.waiting-1 - if P.waiting<=0 then - resetblock() + if P.waiting==-1 then resetblock()end + goto stop + end + if P.curY~=P.y_img then + if P.dropDelay>=0 then + P.dropDelay=P.dropDelay-1 + if P.dropDelay>=0 then goto stop end + end + drop() + P.dropDelay=P.gameEnv.drop + if P.freshTime<=P.gameEnv.freshLimit then + P.lockDelay=P.gameEnv.lock end else - if P.curY~=P.y_img then - if P.dropDelay>0 then - P.dropDelay=P.dropDelay-1 - else - drop() - P.dropDelay=P.gameEnv.drop - if P.freshTime<=P.gameEnv.freshLimit then - P.lockDelay=P.gameEnv.lock - end - end - else - if P.lockDelay>0 then P.lockDelay=P.lockDelay-1 - else drop() - end - end + P.lockDelay=P.lockDelay-1 + if P.lockDelay>=0 then goto stop end + drop() + end + ::stop:: + if P.b2b1==P.b2b then + elseif P.b2b10 then + if P.falling>=0 then P.falling=P.falling-1 - if P.falling<=0 then - if #P.field>P.clearing[1]then - SFX("fall") - if P.id==1 then VIB(1)end - end - for i=1,#P.clearing do - removeRow(P.field,P.clearing[i]) - removeRow(P.visTime,P.clearing[i]) - end - P.clearing={} + if P.falling>=0 then goto stop end + if P.gameEnv.fall>0 and #P.field>P.clearing[1]then SFX("fall")end + for i=1,#P.clearing do + removeRow(P.field,P.clearing[i]) + removeRow(P.visTime,P.clearing[i]) end - end--Rows cleared drop + ::L:: + rem(P.clearing) + if P.clearing[1]then goto L end + end::stop:: if P.endCounter<40 then for j=1,#P.field do for i=1,10 do if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end end end--Make field visible end + if P.b2b1>0 then P.b2b1=max(0,P.b2b1*.92-1)end --Dead end + for i=#P.shade,1,-1 do + local S=P.shade[i] + S[1]=S[1]-1 + if S[1]==0 then + rem(P.shade,i) + end + end for i=#P.bonus,1,-1 do local b=P.bonus[i] if b.inf then diff --git a/toolfunc.lua b/toolfunc.lua index 97e624b7..5891333e 100644 --- a/toolfunc.lua +++ b/toolfunc.lua @@ -1,4 +1,8 @@ -function string.splitS(s,sep) +local gc=love.graphics +local setFont=setFont +local toN,toS=tonumber,tostring + +local function splitS(s,sep) local t={} ::L:: local i=find(s,sep)or #s+1 @@ -7,7 +11,6 @@ function string.splitS(s,sep) if #s~=0 then goto L end return t end -function sgn(i)return i>0 and 1 or i<0 and -1 or 0 end--Row numbe is A-uth-or's id! function without(t,v) for i=1,#t do if t[i]==v then return end @@ -37,40 +40,9 @@ function removeRow(t,k) ins(freeRow,rem(t,k)) end -local count=0 -BGblockList={}for i=1,16 do BGblockList[i]={v=0}end -function getNewBlock() - count=count+1 - if count==17 then count=1 end - local t=BGblockList[count] - t.bn,t.size=BGblock.next,2+3*rnd() - t.b=blocks[t.bn][rnd(0,3)] - t.x=rnd(-#t.b[1]*t.size*30+100,1180) - t.y=-#t.b*30*t.size - t.v=t.size*(1+rnd()) - BGblock.next=BGblock.next%7+1 - return t -end ---Background animation - -function timeSort(a,b) - return a.time>b.time -end -function badgeSort(a,b) - return a.badge>b.badge -end -function stencil_miniTitle() - for i=1,#miniTitle_rect do - gc.rectangle("fill",unpack(miniTitle_rect[i])) - end -end -function stencil_field() - gc.rectangle("fill",0,-10,300,610) -end -function stencil_field_small() - gc.rectangle("fill",0,0,60,120) -end --Single-usage funcs +langName={"中文","English"} +local langID={"chi","eng"} function swapLanguage(l) text=require("language/"..langID[l]) Buttons.sel=nil @@ -80,19 +52,26 @@ function swapLanguage(l) B.t=text.ButtonText[S][N] end end + drawableText.next:set(text.next) + drawableText.hold:set(text.hold) if royaleCtrlPad then royaleCtrlPad:release()end - royaleCtrlPad=gc.newCanvas(300,100) - gc.setCanvas(royaleCtrlPad) - gc.setColor(1,1,1) - setFont(25) - gc.setLineWidth(2) - for i=1,4 do - gc.rectangle("line",RCPB[2*i-1],RCPB[2*i],90,35,8,4) - mStr(text.atkModeName[i],RCPB[2*i-1]+45,RCPB[2*i]+3) - end - gc.setCanvas() + gc.push("transform") + gc.origin() + royaleCtrlPad=gc.newCanvas(300,100) + gc.setCanvas(royaleCtrlPad) + gc.setColor(1,1,1) + setFont(25) + gc.setLineWidth(2) + for i=1,4 do + gc.rectangle("line",RCPB[2*i-1],RCPB[2*i],90,35,8,4) + mStr(text.atkModeName[i],RCPB[2*i-1]+45,RCPB[2*i]+3) + end + gc.setCanvas() + gc.pop() collectgarbage() end + +local vibrateLevel={0,0,.03,.04,.05,.07,.9} function VIB(t) if setting.vib>0 then love.system.vibrate(vibrateLevel[setting.vib+t]) @@ -145,9 +124,51 @@ function BGM(s) bgmPlaying=s end end + +local swapDeck_data={ + {4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1}, + {1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2}, + {3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2}, + {2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4}, + {7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5}, + {3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6}, + {2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7}, + {5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8}, + {7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8}, +}--Block id [ZSLJTOI] ,dir,x,y +local swap={ + none={2,1,d=function()end}, + flash={8,1,d=function()gc.clear(1,1,1)end}, + fade={30,15,d=function() + local t=1-abs(sceneSwaping.time*.06667-1) + gc.setColor(0,0,0,t) + gc.rectangle("fill",0,0,1280,720) + end}, + deck={50,8,d=function() + local t=sceneSwaping.time + gc.setColor(1,1,1) + if t>8 then + local t=max(t,15) + for i=1,51-t do + local bn=swapDeck_data[i][1] + local b=blocks[bn][swapDeck_data[i][2]] + local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4] + for y=1,#b do for x=1,#b[1]do + if b[y][x]then + gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3) + end + end end + end + end + if t<17 then + gc.setColor(1,1,1,(8-abs(t-8))*.125) + gc.rectangle("fill",0,0,1280,720) + end + end}, +}--Scene swapping animations function gotoScene(s,style) if not sceneSwaping and s~=scene then - style=style or"deck" + style=style or"fade" sceneSwaping={ tar=s,style=style, time=swap[style][1],mid=swap[style][2], @@ -156,6 +177,27 @@ function gotoScene(s,style) Buttons.sel=nil end end + +local prevMenu={ + load=love.event.quit, + intro="quit", + main="intro", + mode="main", + custom="mode", + ready="mode", + play=function() + clearTask("play") + gotoScene(curMode.id~="custom"and"mode"or"custom","deck") + end, + help="main", + stat="main", + setting=function() + saveSetting() + gotoScene("main") + end, + setting2="setting", + setting3="setting", +} function back() local t=prevMenu[scene] if type(t)=="string"then @@ -164,10 +206,46 @@ function back() t() end end + +local dataOpt={ + "run", + "game", + "gametime", + "piece", + "row", + "atk", + "key", + "rotate", + "hold", + "spin", +} +local saveOpt={ + "lang", + "ghost", + "center", + "grid", + "swap", + "sfx", + "bgm", + "vib", + "fxs", + + "das", + "arr", + "sddas", + "sdarr", + + "fullscreen", + "bgblock", + "virtualkeyAlpha", + "virtualkeyIcon", + "virtualkeySwitch", + "frameMul", +} function loadData() userData:open("r") - --local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n") - local t=string.splitS(userData:read(),"\r\n") + --local t=splitS(love.math.decompress(userdata,"zlib"),"\r\n") + local t=splitS(userData:read(),"\r\n") userData:close() for i=1,#t do local i=t[i] @@ -194,8 +272,8 @@ function saveData() end function loadSetting() userSetting:open("r") - --local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n") - local t=string.splitS(userSetting:read(),"\r\n") + --local t=splitS(love.math.decompress(userdata,"zlib"),"\r\n") + local t=splitS(userSetting:read(),"\r\n") userSetting:close() for i=1,#t do local i=t[i] @@ -210,17 +288,17 @@ function loadSetting() setting.fullscreen=v=="true" love.window.setFullscreen(setting.fullscreen) elseif t=="keymap"then - v=string.splitS(v,"/") + v=splitS(v,"/") for i=1,16 do - local v1=string.splitS(v[i],",") + local v1=splitS(v[i],",") for j=1,#v1 do setting.keyMap[i][j]=v1[j] end end elseif t=="keylib"then - v=string.splitS(v,"/") + v=splitS(v,"/") for i=1,4 do - local v1=string.splitS(v[i],",") + local v1=splitS(v[i],",") for j=1,#v1 do setting.keyLib[i][j]=toN(v1[j]) end @@ -233,10 +311,10 @@ function loadSetting() end end elseif t=="virtualkey"then - v=string.splitS(v,"/") + v=splitS(v,"/") for i=1,10 do if not v[i]then goto c end - virtualkey[i]=string.splitS(v[i],",") + virtualkey[i]=splitS(v[i],",") for j=1,4 do virtualkey[i][j]=toN(virtualkey[i][j]) end @@ -251,7 +329,7 @@ function loadSetting() elseif t=="das"or t=="arr"or t=="sddas"or t=="sdarr"then v=toN(v)if not v or v<0 then v=0 end setting[t]=int(v) - elseif t=="ghost"or t=="center"or t=="grid"or t=="swap"then + elseif t=="ghost"or t=="center"or t=="grid"or t=="swap"or t=="fxs"then setting[t]=v=="true" elseif t=="lang"then setting[t]=toN(v:match("[12]"))or 1