Compare commits

...

3 Commits

Author SHA1 Message Date
MrZ_26
3019f83999 Alpha V0.7.18 2020-02-04 19:34:16 +08:00
MrZ_26
438046f77f Alpha V0.7.17 2020-02-04 19:34:07 +08:00
MrZ_26
830f0ffbed Alpha V0.7.16 2020-02-04 19:33:52 +08:00
18 changed files with 1022 additions and 660 deletions

View File

@@ -12,26 +12,23 @@ local touching=nil--1st touching ID
local sceneInit={ local sceneInit={
load=function() load=function()
curBG="none"
loading=1--Loading mode loading=1--Loading mode
loadnum=1--Loading counter loadnum=1--Loading counter
loadprogress=0--Loading bar(0~1) loadprogress=0--Loading bar(0~1)
loadTip=text.tips[rnd(#text.tips)] loadTip=text.tips[rnd(#text.tips)]
end, end,
intro=function() intro=function()
curBG="none"
count=0 count=0
BGM("blank") BGM("blank")
end, end,
main=function() main=function()
curBG="none"
collectgarbage() collectgarbage()
end, end,
mode=function() mode=function()
curBG="none"
saveData() saveData()
modeSel=modeSel or 1 modeSel=modeSel or 1
levelSel=levelSel or 3 levelSel=levelSel or 3
curBG="none"
BGM("blank") BGM("blank")
end, end,
custom=function() custom=function()
@@ -40,27 +37,24 @@ local sceneInit={
BGM("blank") BGM("blank")
end, end,
draw=function() draw=function()
curBG="none"
kb.setKeyRepeat(true) kb.setKeyRepeat(true)
clearSureTime=0 clearSureTime=0
pen=1 pen,sx,sy=1,1,1
sx,sy=1,1
curBG="none"
end, end,
play=function() play=function()
restartCount=0
if needResetGameData then if needResetGameData then
resetGameData() resetGameData()
needResetGameData=nil needResetGameData=nil
end end
sysSFX("ready")
end, end,
pause=function() pause=function()
pauseTime=0
end, end,
setting=function() setting=function()
curBG="none" curBG="none"
end, end,
setting2=function() setting2=function()
curBG="none"
curBoard=1 curBoard=1
keyboardSet=1 keyboardSet=1
joystickSet=1 joystickSet=1
@@ -74,10 +68,8 @@ local sceneInit={
snapLevel=1 snapLevel=1
end,--Touch setting end,--Touch setting
help=function() help=function()
curBG="none"
end, end,
stat=function() stat=function()
curBG="none"
end, end,
quit=function() quit=function()
love.event.quit() love.event.quit()
@@ -98,7 +90,6 @@ local function getNewBlock()
BGblock.next=BGblock.next%7+1 BGblock.next=BGblock.next%7+1
return t return t
end end
local scs={{1,2},nil,nil,nil,nil,{1.5,1.5},{0.5,2.5}}for i=2,5 do scs[i]=scs[1]end
function onVirtualkey(x,y) function onVirtualkey(x,y)
local d2,nearest,distance local d2,nearest,distance
@@ -119,7 +110,6 @@ function buttonControl_key(i)
Buttons.sel=Buttons[scene][Buttons.sel[i]]or Buttons.sel Buttons.sel=Buttons[scene][Buttons.sel[i]]or Buttons.sel
else else
Buttons.sel=select(2,next(Buttons[scene])) Buttons.sel=select(2,next(Buttons[scene]))
mouseShow=false
end end
elseif i=="space"or i=="return"then elseif i=="space"or i=="return"then
if not sceneSwaping and Buttons.sel then if not sceneSwaping and Buttons.sel then
@@ -135,7 +125,6 @@ function buttonControl_gamepad(i)
Buttons.sel=Buttons[scene][Buttons.sel[i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]]or Buttons.sel Buttons.sel=Buttons[scene][Buttons.sel[i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]]or Buttons.sel
else else
Buttons.sel=select(2,next(Buttons[scene])) Buttons.sel=select(2,next(Buttons[scene]))
mouseShow=false
end end
elseif i=="start"then elseif i=="start"then
if not sceneSwaping and Buttons.sel then if not sceneSwaping and Buttons.sel then
@@ -144,7 +133,6 @@ function buttonControl_gamepad(i)
sysSFX("button") sysSFX("button")
end end
end end
mouseShow=false
end end
mouseDown={} mouseDown={}
@@ -160,7 +148,6 @@ function mouseDown.draw(x,y,k)
end end
function mouseDown.setting3(x,y,k) function mouseDown.setting3(x,y,k)
if k==2 then back()end if k==2 then back()end
sel=nil
for K=1,#virtualkey do for K=1,#virtualkey do
local b=virtualkey[K] local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then if (x-b[1])^2+(y-b[2])^2<b[3]then
@@ -387,16 +374,15 @@ function keyDown.setting2(key)
end end
end end
function keyDown.play(key) function keyDown.play(key)
if key=="escape"then pauseGame()end if key=="escape"and not sceneSwaping then
return(frame<180 and back or pauseGame)()
end
local m=setting.keyMap local m=setting.keyMap
for p=1,human do for p=1,human do
local lib=setting.keyLib[p] for k=1,12 do
for s=1,#lib do if key==m[2*p-1][k]or key==m[2*p][k]then
for k=1,12 do pressKey(k,players[p])
if key==m[lib[s]][k]then return
pressKey(k,players[p])
return
end
end end
end end
end end
@@ -412,13 +398,10 @@ keyUp={}
function keyUp.play(key) function keyUp.play(key)
local m=setting.keyMap local m=setting.keyMap
for p=1,human do for p=1,human do
local lib=setting.keyLib[p] for k=1,12 do
for s=1,#lib do if key==m[2*p-1][k]or key==m[2*p][k]then
for k=1,12 do releaseKey(k,players[p])
if key==m[lib[s]][k]then return
releaseKey(k,players[p])
return
end
end end
end end
end end
@@ -474,14 +457,11 @@ end
function gamepadDown.play(key) function gamepadDown.play(key)
if key=="back"then back()return end if key=="back"then back()return end
local m=setting.keyMap local m=setting.keyMap
for p=1,4 do for p=1,human do
local lib=setting.keyLib[p] for k=1,12 do
for s=1,#lib do if key==m[2*p+7][k]or key==m[2*p+8][k]then
for k=1,12 do pressKey(k,players[p])
if key==m[8+lib[s]][k]then return
pressKey(k,players[p])
return
end
end end
end end
end end
@@ -489,14 +469,11 @@ end
gamepadUp={} gamepadUp={}
function gamepadUp.play(key) function gamepadUp.play(key)
local m=setting.keyMap local m=setting.keyMap
for p=1,4 do for p=1,human do
local lib=setting.keyLib[p] for k=1,12 do
for s=1,#lib do if key==m[2*p+7][k]or key==m[2*p+8][k]then
for k=1,12 do releaseKey(k,players[p])
if key==m[8+lib[s]][k]then return
releaseKey(k,players[p])
return
end
end end
end end
end end
@@ -520,6 +497,7 @@ function love.mousepressed(x,y,k,t,num)
Buttons.sel=nil Buttons.sel=nil
love.mousemoved(x,y,0,0) love.mousemoved(x,y,0,0)
sysSFX("button") sysSFX("button")
VIB(1)
end end
end end
end end
@@ -552,10 +530,10 @@ function love.wheelmoved(x,y)
end end
function love.touchpressed(id,x,y) function love.touchpressed(id,x,y)
mouseShow=false
if not touching then if not touching then
touching=id touching=id
love.mousemoved(x,y,0,0) love.touchmoved(id,x,y,0,0)
mouseShow=false
end end
if touchDown[scene]then if touchDown[scene]then
touchDown[scene](id,xOy:inverseTransformPoint(x,y)) touchDown[scene](id,xOy:inverseTransformPoint(x,y))
@@ -570,22 +548,20 @@ function love.touchreleased(id,x,y)
B.alpha=1 B.alpha=1
Buttons.sel=nil Buttons.sel=nil
sysSFX("button") sysSFX("button")
VIB(1)
end end
Buttons.sel=nil Buttons.sel=nil
mouseShow=false
end end
if touchUp[scene]then if touchUp[scene]then
touchUp[scene](id,xOy:inverseTransformPoint(x,y)) touchUp[scene](id,xOy:inverseTransformPoint(x,y))
end end
end end
function love.touchmoved(id,x,y,dx,dy) function love.touchmoved(id,x,y,dx,dy)
if not Buttons.sel then
touching=nil
end
x,y=xOy:inverseTransformPoint(x,y) x,y=xOy:inverseTransformPoint(x,y)
if touchMove[scene]then if touchMove[scene]then
touchMove[scene](id,x,y,dx/scr.k,dy/scr.k) touchMove[scene](id,x,y,dx/scr.k,dy/scr.k)
end end
Buttons.sel=nil
for _,B in next,Buttons[scene]do for _,B in next,Buttons[scene]do
if not(B.hide and B.hide())then if not(B.hide and B.hide())then
if abs(x-B.x)<B.w*.5 and abs(y-B.y)<B.h*.5 then if abs(x-B.x)<B.w*.5 and abs(y-B.y)<B.h*.5 then
@@ -594,9 +570,13 @@ function love.touchmoved(id,x,y,dx,dy)
end end
end end
end end
if not Buttons.sel then
touching=nil
end
end end
function love.keypressed(i) function love.keypressed(i)
mouseShow=false
if i=="f8"then devMode=not devMode end if i=="f8"then devMode=not devMode end
if devMode then if devMode then
if i=="k"then if i=="k"then
@@ -604,11 +584,7 @@ function love.keypressed(i)
Event_gameover.lose() Event_gameover.lose()
--Test code here --Test code here
elseif i=="q"then elseif i=="q"then
for k,B in next,Buttons[scene]do local B=Buttons.sel if B then print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h))end
print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h))
end
elseif i=="s"then
print(scr.x,scr.y,scr.w,scr.h,scr.k)
elseif Buttons.sel then elseif Buttons.sel then
local B=Buttons.sel local B=Buttons.sel
if i=="left"then B.x=B.x-10 if i=="left"then B.x=B.x-10
@@ -627,7 +603,6 @@ function love.keypressed(i)
else buttonControl_key(i) else buttonControl_key(i)
end end
end end
mouseShow=false
end end
function love.keyreleased(i) function love.keyreleased(i)
if keyUp[scene]then keyUp[scene](i) if keyUp[scene]then keyUp[scene](i)
@@ -635,11 +610,11 @@ function love.keyreleased(i)
end end
function love.gamepadpressed(joystick,i) function love.gamepadpressed(joystick,i)
mouseShow=false
if gamepadDown[scene]then return gamepadDown[scene](i) if gamepadDown[scene]then return gamepadDown[scene](i)
elseif i=="back"then back() elseif i=="back"then back()
else buttonControl_gamepad(i) else buttonControl_gamepad(i)
end end
mouseShow=false
end end
function love.gamepadreleased(joystick,i) function love.gamepadreleased(joystick,i)
if gamepadUp[scene]then gamepadUp[scene](i) if gamepadUp[scene]then gamepadUp[scene](i)
@@ -656,11 +631,8 @@ function love.lowmemory()
collectgarbage() collectgarbage()
end end
function love.resize(w,h) function love.resize(w,h)
if w>=h then scr.w,scr.h=w,h scr.w,scr.h,scr.r=w,h,h/w
else scr.w,scr.h=h,w if scr.r>=.5625 then
end
scr.r=h/w
if h/w>=.5625 then
scr.k=w/1280 scr.k=w/1280
scr.x,scr.y=0,(h-w*9/16)*.5 scr.x,scr.y=0,(h-w*9/16)*.5
else else
@@ -672,16 +644,12 @@ function love.resize(w,h)
collectgarbage() collectgarbage()
end end
function love.focus(f) function love.focus(f)
if not f and scene=="play"then pauseGame()end if not f and wd.isMinimized()and scene=="play"then pauseGame()end
end end
function love.update(dt) function love.update(dt)
--[[ -- if players then for k,v in pairs(players[1])do
if players then -- if rawget(_G,k)and k~="next"and k~="hold"and k~="stat"then print(k,_G[v])end
for k,v in pairs(players[1])do -- end end--check player data flew(debugging)
if rawget(_G,k)then print(k)end
end
end--check player data flew(debugging)
]]
for i=#BGblock,1,-1 do for i=#BGblock,1,-1 do
BGblock[i].y=BGblock[i].y+BGblock[i].v BGblock[i].y=BGblock[i].y+BGblock[i].v
if BGblock[i].y>720 then rem(BGblock,i)end if BGblock[i].y>720 then rem(BGblock,i)end
@@ -699,9 +667,9 @@ function love.update(dt)
for k,B in next,Buttons[scene]do for k,B in next,Buttons[scene]do
B.alpha=0 B.alpha=0
end--Reset buttons' alpha end--Reset buttons' alpha
Buttons.sel=nil
scene=sceneSwaping.tar scene=sceneSwaping.tar
sceneInit[scene]() sceneInit[scene]()
Buttons.sel=nil
elseif sceneSwaping.time==0 then elseif sceneSwaping.time==0 then
sceneSwaping=nil sceneSwaping=nil
end end
@@ -712,8 +680,13 @@ function love.update(dt)
for i=#Task,1,-1 do for i=#Task,1,-1 do
Task[i]:update() Task[i]:update()
end end
updateButton() for k,B in next,Buttons[scene]do
local t=B==Buttons.sel and .4 or 0
B.alpha=abs(B.alpha-t)>.02 and(B.alpha+(B.alpha<t and .02 or -.02))or t
if B.alpha>t then B.alpha=B.alpha-.02 elseif B.alpha<t then B.alpha=B.alpha+.02 end
end--update Buttons
end end
local scs={1,2,1,2,1,2,1,2,1,2,1.5,1.5,.5,2.5}
function love.draw() function love.draw()
gc.discard()--SPEED UPUPUP! gc.discard()--SPEED UPUPUP!
Pnt.BG[setting.bg and curBG or"grey"]() Pnt.BG[setting.bg and curBG or"grey"]()
@@ -728,59 +701,81 @@ function love.draw()
end end end end
end end
if Pnt[scene]then Pnt[scene]()end if Pnt[scene]then Pnt[scene]()end
drawButton() for k,B in next,Buttons[scene]do
if not(B.hide and B.hide())then
local C=B.rgb or color.white
gc.setColor(C[1],C[2],C[3],B.alpha)
gc.rectangle("fill",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h)
gc.setColor(C)
gc.setLineWidth(3)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
gc.setColor(C[1],C[2],C[3],.3)
gc.setLineWidth(5)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
local t=B.t
local y0
if t then
if type(t)=="function"then t=t()end
setFont(B.f or 40)
y0=B.y-currentFont*.64
gc.printf(t,B.x-201,y0+2,400,"center")
gc.printf(t,B.x-199,y0+2,400,"center")
gc.printf(t,B.x-201,y0,400,"center")
gc.printf(t,B.x-199,y0,400,"center")
gc.setColor(C)
mStr(t,B.x,y0+1)
end
end
end--Draw buttons
if mouseShow and not touching then if mouseShow and not touching then
local r=Timer()*.5 local r=Timer()*.5
gc.setColor(1,1,1,min(1-abs(1-r%1*2),.3)) gc.setColor(1,1,1,min(1-abs(1-r%1*2),.3))
r=int(r)%7+1 r=int(r)%7+1
gc.draw(mouseBlock[r],mx,my,Timer()%pi*4,20,20,scs[r][2]-.5,#blocks[r][0]-scs[r][1]+.5) gc.draw(mouseBlock[r],mx,my,Timer()%pi*4,20,20,scs[2*r]-.5,#blocks[r][0]-scs[2*r-1]+.5)
gc.setColor(1,1,1,.5) gc.setColor(1,1,1,.5)gc.circle("fill",mx,my,5)
gc.circle("fill",mx,my,5) gc.setColor(1,1,1)gc.circle("fill",mx,my,3)
gc.setColor(1,1,1) end--Awesome mouse!
gc.circle("fill",mx,my,3) if sceneSwaping then sceneSwaping.draw()end--Swaping animation
end if scr.r~=.5625 then
if sceneSwaping then sceneSwaping.draw()end gc.setColor(0,0,0)
if scr.r==.5625 then goto L end
if scr.r>.5625 then if scr.r>.5625 then
gc.setColor(0,0,0) local d=(scr.h-scr.w*9/16)*.5/scr.k
gc.rectangle("fill",0,0,1280,scr.w*9/16-scr.h) gc.rectangle("fill",0,0,1280,-d)
gc.rectangle("fill",0,720,1280,scr.h-scr.w*9/16) gc.rectangle("fill",0,720,1280,d)
else else--high
gc.setColor(0,0,0) local d=(scr.w-scr.h*16/9)*.5/scr.k
gc.rectangle("fill",0,0,scr.h*16/9-scr.w,720) gc.rectangle("fill",0,0,-d,720)
gc.rectangle("fill",1280,0,scr.w-scr.h*16/9,720) gc.rectangle("fill",1280,0,d,720)
end end--wide
::L:: end--Black side
setFont(20)gc.setColor(1,1,1) setFont(20)gc.setColor(1,1,1)
gc.print(tm.getFPS(),5,700) gc.print(tm.getFPS(),5,700)
if devMode then if devMode then
gc.print(gcinfo(),5,680) gc.print(mx.." "..my,5,640)
gc.print(#freeRow or 0,5,660) gc.print(#freeRow or 0,5,660)
gc.print(gcinfo(),5,680)
end end
end end
function love.run() function love.run()
local frameT=Timer() local frameT=Timer()
local readyDrawFrame=0 local readyDrawFrame=0
local PUMP,POLL=love.event.pump,love.event.poll
love.resize(gc.getWidth(),gc.getHeight()) love.resize(gc.getWidth(),gc.getHeight())
scene="load"sceneInit.load()--System Launch scene="load"sceneInit.load()--System Launch
return function() return function()
love.event.pump() PUMP()
for name,a,b,c,d,e,f in love.event.poll()do for N,a,b,c,d,e in POLL()do
if name=="quit"then return 0 end if N=="quit"then return 0
if love[name]then love[name](a,b,c,d,e,f)end elseif love[N]then love[N](a,b,c,d,e)end
end end
tm.step() tm.step()
-- love.receiveData(id,data)
love.update(tm.getDelta()) love.update(tm.getDelta())
readyDrawFrame=readyDrawFrame+setting.frameMul readyDrawFrame=readyDrawFrame+setting.frameMul
if readyDrawFrame>=100 then if readyDrawFrame>=100 then
readyDrawFrame=readyDrawFrame-100 readyDrawFrame=readyDrawFrame-100
gc.clear()
love.draw() love.draw()
gc.present() gc.present()
end end
::L::if Timer()-frameT<1/60 then goto L end ::L::if Timer()-frameT<1/60 then goto L end
frameT=Timer() frameT=Timer()
tm.sleep(.001)
end end
end end

View File

@@ -29,16 +29,9 @@ function clearTask(opt)
end end
end end
function Task:update() function Task:update()
if self.code(self.P,self.data)then if(not self.P or self.P and scene=="play")and self.code(self.P,self.data)then
self:destroy() for i=#Task,1,-1 do
return nil if Task[i]==self then rem(Task,i)return end
end end--Destroy
end
function Task:destroy()
for i=#Task,1,-1 do
if Task[i]==self then
rem(Task,i)
return nil
end
end end
end end

View File

@@ -9,7 +9,7 @@ function love.conf(t)
t.audio.mixwithsystem=true--Switch on to keep sysBGM t.audio.mixwithsystem=true--Switch on to keep sysBGM
local W=t.window local W=t.window
W.title="Techmino V0.7.15" W.title="Techmino V0.7.18"
W.icon="/image/icon.png" W.icon="/image/icon.png"
W.width,W.height=1280,720 W.width,W.height=1280,720
W.minwidth,W.minheight=640,360 W.minwidth,W.minheight=640,360

View File

@@ -83,22 +83,16 @@ loadmode={
pcchallenge=function() pcchallenge=function()
createPlayer(1,340,15) createPlayer(1,340,15)
end, end,
techmino41=function() techmino49=function()
createPlayer(1,340,15)--Player createPlayer(1,340,15)
if curMode.lv==5 then players[1].gameEnv.drop=15 end if curMode.lv==5 then players[1].gameEnv.drop=15 end
local n,min,max=2 local n,min,max=2,curMode.lv,35-6*curMode.lv
if curMode.lv==1 then min,max=5,30 for i=1,4 do for j=1,6 do
elseif curMode.lv==2 then min,max=3,25 createPlayer(n,78*i-54,115*j-98,.18,rnd(min,max))
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 n=n+1
end end end end
for i=9,12 do for j=1,5 do for i=9,12 do for j=1,6 do
createPlayer(n,77*i+275,140*j-125,.2,rnd(min,max)) createPlayer(n,78*i+267,115*j-98,.18,rnd(min,max))
n=n+1 n=n+1
end end end end
--AIs --AIs
@@ -149,29 +143,34 @@ loadmode={
modeEnv[k]=customRange[k][customSel[k]] modeEnv[k]=customRange[k][customSel[k]]
end end
modeEnv._20G=modeEnv.drop==-1 modeEnv._20G=modeEnv.drop==-1
modeEnv.oncehold=customSel.hold==1
createPlayer(1,340,15) createPlayer(1,340,15)
if modeEnv.opponent==0 then if modeEnv.opponent==0 then
else else
modeEnv.target=nil modeEnv.target=nil
createPlayer(2,965,360,.5,modeEnv.opponent) createPlayer(2,965,360,.5,modeEnv.opponent)
end end
if curMode.lv==1 then preField.h=20
local h=20 ::R::
::R:: for i=1,10 do
for i=1,10 do if preField[preField.h][i]>0 then
if preField[h][i]>0 then goto L end if curMode.lv==1 then
end goto L
h=h-1 elseif curMode.lv==2 then
if h>0 then goto R end return
::L:: end
for _,P in next,players.alive do
local t=P.showTime*3
for y=1,h do
P.field[y]=getNewRow(0)
P.visTime[y]=getNewRow(t)
for x=1,10 do P.field[y][x]=preField[y][x]end
end end
end end
preField.h=preField.h-1
if preField.h>0 then goto R end
::L::
for _,P in next,players.alive do
local t=P.showTime*3
for y=1,preField.h do
P.field[y]=getNewRow(0)
P.visTime[y]=getNewRow(t)
for x=1,10 do P.field[y][x]=preField[y][x]end
end
end end
end, end,
} }
@@ -179,7 +178,7 @@ mesDisp={
--Default:font=35,white --Default:font=35,white
sprint=function() sprint=function()
setFont(70) setFont(70)
local r=max(P.gameEnv.target-P.cstat.row,0) local r=max(P.gameEnv.target-P.stat.row,0)
mStr(r,-82,260) mStr(r,-82,260)
if r<21 and r>0 then if r<21 and r>0 then
gc.setLineWidth(3) gc.setLineWidth(3)
@@ -189,14 +188,14 @@ mesDisp={
end, end,
marathon=function() marathon=function()
setFont(50) setFont(50)
mStr(P.cstat.row,-82,320) mStr(P.stat.row,-82,320)
mStr(P.gameEnv.target,-82,370) mStr(P.gameEnv.target,-82,370)
gc.rectangle("fill",-128,376,90,4) gc.rectangle("fill",-128,376,90,4)
end, end,
master=function() master=function()
setFont(50) setFont(50)
mStr(P.cstat.point,-82,320) mStr(P.modeData.point,-82,320)
mStr((P.cstat.event+1)*100,-82,370) mStr((P.modeData.event+1)*100,-82,370)
gc.rectangle("fill",-128,376,90,4) gc.rectangle("fill",-128,376,90,4)
end, end,
classic=function() classic=function()
@@ -206,18 +205,18 @@ mesDisp={
setFont(20) setFont(20)
mStr("speed level",-82,290) mStr("speed level",-82,290)
setFont(50) setFont(50)
mStr(P.cstat.row,-82,320) mStr(P.stat.row,-82,320)
mStr(P.gameEnv.target,-82,370) mStr(P.gameEnv.target,-82,370)
gc.rectangle("fill",-128,376,90,4) gc.rectangle("fill",-128,376,90,4)
end, end,
zen=function() zen=function()
setFont(75) setFont(75)
mStr(max(200-P.cstat.row,0),-82,280) mStr(max(200-P.stat.row,0),-82,280)
end, end,
infinite=function() infinite=function()
setFont(50) setFont(50)
mStr(P.cstat.atk,-82,310) mStr(P.stat.atk,-82,310)
mStr(format("%.2f",2.5*P.cstat.atk/P.cstat.piece),-82,420) mStr(format("%.2f",2.5*P.stat.atk/P.stat.piece),-82,420)
setFont(20) setFont(20)
mStr("Attack",-82,363) mStr("Attack",-82,363)
mStr("Efficiency",-82,475) mStr("Efficiency",-82,475)
@@ -226,45 +225,53 @@ mesDisp={
setFont(35) setFont(35)
mStr("TSD",-82,407) mStr("TSD",-82,407)
setFont(80) setFont(80)
mStr(P.cstat.event,-82,330) mStr(P.modeData.event,-82,330)
end, end,
blind=function() blind=function()
setFont(25) setFont(25)
mStr("Rows",-82,300) mStr("Rows",-82,300)
mStr("Techrash",-82,420) mStr("Techrash",-82,420)
setFont(80) setFont(80)
mStr(P.cstat.row,-82,220) mStr(P.stat.row,-82,220)
mStr(P.cstat.techrash,-82,340) mStr(P.stat.clear_4,-82,340)
end, end,
dig=function() dig=function()
setFont(70) setFont(70)
mStr(P.cstat.event-20,-82,310) mStr(P.modeData.event-20,-82,310)
setFont(30) setFont(30)
mStr("Wave",-82,375) mStr("Wave",-82,375)
end, end,
survivor=function() survivor=function()
setFont(70) setFont(70)
mStr(P.cstat.event,-82,310) mStr(P.modeData.event,-82,310)
setFont(30) setFont(30)
mStr("Wave",-82,375) mStr("Wave",-82,375)
end, end,
tech=function()
setFont(50)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",2.5*P.stat.atk/P.stat.piece),-82,420)
setFont(20)
mStr("Attack",-82,363)
mStr("Efficiency",-82,475)
end,
pctrain=function() pctrain=function()
setFont(22) setFont(22)
mStr("Perfect Clear",-82,412) mStr("Perfect Clear",-82,412)
setFont(80) setFont(80)
mStr(P.cstat.pc,-82,330) mStr(P.stat.pc,-82,330)
end, end,
pcchallenge=function() pcchallenge=function()
setFont(22) setFont(22)
mStr("Perfect Clear",-82,432) mStr("Perfect Clear",-82,432)
setFont(80) setFont(80)
mStr(P.cstat.pc,-82,350) mStr(P.stat.pc,-82,350)
setFont(50) setFont(50)
mStr(max(100-P.cstat.row,0),-82,250) mStr(max(100-P.stat.row,0),-82,250)
end, end,
techmino41=function() techmino49=function()
setFont(40) setFont(40)
mStr(#players.alive.."/41",-82,175) mStr(#players.alive.."/49",-82,175)
mStr(P.ko,-70,215) mStr(P.ko,-70,215)
setFont(25) setFont(25)
gc.print("KO",-127,225) gc.print("KO",-127,225)
@@ -294,16 +301,17 @@ mesDisp={
end, end,
drought=function() drought=function()
setFont(75) setFont(75)
mStr(max(100-P.cstat.row,0),-82,280) mStr(max(100-P.stat.row,0),-82,280)
end, end,
custom=function() custom=function()
if P.gameEnv.target<1e4 then if P.gameEnv.target<1e4 then
setFont(75) setFont(75)
mStr(max(P.gameEnv.target-P.cstat.row,0),-82,280) mStr(max(P.gameEnv.target-P.stat.row,0),-82,280)
end end
if curMode.lv==2 and(P.keyPressing[9]or frame<180)then if curMode.lv==2 and P.modeData.event==0 then
gc.setColor(1,1,1,.6)
gc.setLineWidth(3) gc.setLineWidth(3)
for y=1,20 do for x=1,10 do for y=1,preField.h do for x=1,10 do
if preField[y][x]>0 then if preField[y][x]>0 then
gc.setColor(blockColor[preField[y][x]]) gc.setColor(blockColor[preField[y][x]])
gc.rectangle("line",30*x-25,605-30*y,20,20) gc.rectangle("line",30*x-25,605-30*y,20,20)
@@ -314,9 +322,9 @@ mesDisp={
} }
Event={ Event={
marathon_reach=function() marathon_reach=function()
local s=int(P.cstat.row*.1) local s=int(P.stat.row*.1)
if s>=20 then if s>=20 then
P.cstat.row=200 P.stat.row=200
Event_gameover.win() Event_gameover.win()
else else
P.gameEnv.drop=marathon_drop[s] P.gameEnv.drop=marathon_drop[s]
@@ -326,19 +334,20 @@ Event={
end end
end, end,
master_reach_lunatic=function() master_reach_lunatic=function()
local t=P.cstat.point local t=P.modeData.point
local c=#P.clearing local c=#P.clearing
if t%100==99 and c==0 then goto L end 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) t=t+(c<3 and c+1 or c==3 and 5 or 7)
if int(t*.01)>P.cstat.event then if int(t*.01)>P.modeData.event then
P.cstat.event=P.cstat.event+1 P.modeData.event=P.modeData.event+1
if P.cstat.event==5 then if P.modeData.event==5 then
P.cstat.event=4 P.modeData.event=4
P.cstat.point=500 P.modeData.point=500
Event_gameover.win() Event_gameover.win()
goto L goto L
else else
local s=P.cstat.event+1 local s=P.modeData.event+1
curBG=s==2 and"game1"or s==3 and"game2"or s==4 and"game3"or s==5 and"game4"
P.gameEnv.lock=rush_lock[s] P.gameEnv.lock=rush_lock[s]
P.gameEnv.wait=rush_wait[s] P.gameEnv.wait=rush_wait[s]
P.gameEnv.fall=rush_fall[s] P.gameEnv.fall=rush_fall[s]
@@ -349,24 +358,26 @@ Event={
SFX("reach") SFX("reach")
end end
end end
P.cstat.point=t P.modeData.point=t
if t%100==99 then SFX("blip_1")end if t%100==99 then SFX("blip_1")end
::L:: ::L::
end, end,
master_reach_ultimate=function() master_reach_ultimate=function()
local t=P.cstat.point local t=P.modeData.point
local c=#P.clearing local c=#P.clearing
if t%100==99 and c==0 then goto L end 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) t=t+(c<3 and c+1 or c==3 and 5 or 7)
if int(t*.01)>P.cstat.event then if int(t*.01)>P.modeData.event then
P.cstat.event=P.cstat.event+1 P.modeData.event=P.modeData.event+1
if P.cstat.event==5 then if P.modeData.event==5 then
P.cstat.event=4 curBG="game5"
P.cstat.point=500 P.modeData.event=4
P.modeData.point=500
Event_gameover.win() Event_gameover.win()
goto L goto L
else else
local s=P.cstat.event+1 local s=P.modeData.event+1
curBG=s==2 and"game3"or s==3 and"game4"or s==4 and"game5"or s==5 and"game6"
P.gameEnv.lock=death_lock[s] P.gameEnv.lock=death_lock[s]
P.gameEnv.wait=death_wait[s] P.gameEnv.wait=death_wait[s]
P.gameEnv.fall=death_fall[s] P.gameEnv.fall=death_fall[s]
@@ -376,7 +387,7 @@ Event={
SFX("reach") SFX("reach")
end end
end end
P.cstat.point=t P.modeData.point=t
if t%100==99 then SFX("blip_1")end if t%100==99 then SFX("blip_1")end
::L:: ::L::
end, end,
@@ -391,30 +402,32 @@ Event={
if P.lastClear~=52 then if P.lastClear~=52 then
Event_gameover.lose() Event_gameover.lose()
elseif #P.clearing>0 then elseif #P.clearing>0 then
P.cstat.event=P.cstat.event+1 P.modeData.event=P.modeData.event+1
if #P.field>11 and P.cstat.event%5~=1 then
ins(P.clearing,1)
end
end end
end, end,
tech_reach=function() tech_reach_easy=function()
if #P.clearing>0 and P.lastClear<10 then if P.b2b<40 then
Event_gameover.lose() Event_gameover.lose()
end end
end, end,
tech_reach_hard=function() tech_reach_hard=function()
if #P.clearing>0 and P.lastClear<10 then
Event_gameover.lose()
end
end,
tech_reach_ultimate=function()
if #P.clearing>0 and P.lastClear<10 or P.lastClear==74 then if #P.clearing>0 and P.lastClear<10 or P.lastClear==74 then
Event_gameover.lose() Event_gameover.lose()
end end
end, end,
newPC=function() newPC=function()
local P=players[1] local P=players[1]
if P.cstat.piece%4==0 then if P.stat.piece%4==0 then
if #P.field==#P.clearing then if #P.field==#P.clearing then
P.counter=P.cstat.piece==0 and 20 or 0 P.counter=P.stat.piece==0 and 20 or 0
newTask(Event_task.PC,P) newTask(Event_task.PC,P)
if curMode.lv==2 then if curMode.lv==2 then
local s=P.cstat.pc*.5 local s=P.stat.pc*.5
if int(s)==s and s>0 then if int(s)==s and s>0 then
P.gameEnv.drop=pc_drop[s]or 10 P.gameEnv.drop=pc_drop[s]or 10
P.gameEnv.lock=pc_lock[s]or 20 P.gameEnv.lock=pc_lock[s]or 20
@@ -434,7 +447,6 @@ Event={
} }
Event_gameover={ Event_gameover={
win=function() win=function()
local P=players.alive[1]
P.alive=false P.alive=false
P.control=false P.control=false
P.timing=false P.timing=false
@@ -444,7 +456,6 @@ Event_gameover={
if modeEnv.royaleMode then if modeEnv.royaleMode then
P.rank=1 P.rank=1
P.result="WIN" P.result="WIN"
showText(P,1,"appear",60,120,nil,true)
changeAtk(P) changeAtk(P)
BGM("end") BGM("end")
end end
@@ -457,7 +468,11 @@ Event_gameover={
P.visTime[i][j]=min(P.visTime[i][j],20) P.visTime[i][j]=min(P.visTime[i][j],20)
end end
end end
showText(P,text.win,"beat",90,nil,nil,true) if P.id==1 then
gamefinished=true
newTask(Event_task.finish,P)
end
showText(P,text.win,"beat",90,nil,.4,curMode.id~="custom")
SFX("win") SFX("win")
end, end,
lose=function() lose=function()
@@ -525,6 +540,7 @@ Event_gameover={
P.gameEnv.keepVisible=P.gameEnv.visible~="show" P.gameEnv.keepVisible=P.gameEnv.visible~="show"
showText(P,text.lose,"appear",90,nil,nil,true) showText(P,text.lose,"appear",90,nil,nil,true)
if P.id==1 then if P.id==1 then
gamefinished=true
SFX("fail") SFX("fail")
if modeEnv.royaleMode then if modeEnv.royaleMode then
BGM("end") BGM("end")
@@ -538,10 +554,19 @@ Event_gameover={
end end
if #players>1 then if #players>1 then
newTask(Event_task.lose,P) newTask(Event_task.lose,P)
else
newTask(Event_task.finish,P)
end end
end, end,
} }
Event_task={ Event_task={
finish=function(P)
P.endCounter=P.endCounter+1
if P.endCounter>120 then
pauseGame()
return true
end
end,
lose=function(P) lose=function(P)
P.endCounter=P.endCounter+1 P.endCounter=P.endCounter+1
if P.endCounter>80 then if P.endCounter>80 then
@@ -557,6 +582,9 @@ Event_task={
removeRow(P.field) removeRow(P.field)
removeRow(P.visTime) removeRow(P.visTime)
end end
if P.id==1 then
pauseGame()
end
return true return true
end end
end end
@@ -574,108 +602,110 @@ Event_task={
dig_normal=function(P) dig_normal=function(P)
if not P.control then return end if not P.control then return end
P.counter=P.counter+1 P.counter=P.counter+1
if P.counter>=max(90,180-2*P.cstat.event)then if P.counter>=max(90,180-P.modeData.event)then
garbageRise(10,1,rnd(10)) garbageRise(10,1,rnd(10))
P.counter=0 P.counter=0
P.cstat.event=P.cstat.event+1 P.modeData.event=P.modeData.event+1
end end
end, end,
dig_lunatic=function(P) dig_lunatic=function(P)
if not P.control then return end if not P.control then return end
P.counter=P.counter+1 P.counter=P.counter+1
if P.counter>=max(45,80-.4*P.cstat.event)then if P.counter>=max(45,80-.3*P.modeData.event)then
garbageRise(11+P.cstat.event%3,1,rnd(10)) garbageRise(11+P.modeData.event%3,1,rnd(10))
P.counter=0 P.counter=0
P.cstat.event=P.cstat.event+1 P.modeData.event=P.modeData.event+1
end end
end, end,
survivor_easy=function(P) survivor_easy=function(P)
if not P.control then return end if not P.control then return end
P.counter=P.counter+1 P.counter=P.counter+1
if P.counter>=max(60,150-2*P.cstat.event)then if P.counter>=max(60,150-2*P.modeData.event)then
ins(P.atkBuffer,{pos=rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1}) ins(P.atkBuffer,{pos=rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1})
P.counter=0 P.counter=0
if P.cstat.event==45 then showText(P,text.maxspeed,"appear",80,-140)end if P.modeData.event==45 then showText(P,text.maxspeed,"appear",80,-140)end
P.cstat.event=P.cstat.event+1 P.modeData.event=P.modeData.event+1
end end
end, end,
survivor_normal=function(P) survivor_normal=function(P)
if not P.control then return end if not P.control then return end
P.counter=P.counter+1 P.counter=P.counter+1
if P.counter>=max(90,180-2*P.cstat.event)then if P.counter>=max(90,180-2*P.modeData.event)then
local d=P.cstat.event+1 local d=P.modeData.event+1
if d%4==0 then ins(P.atkBuffer,{pos=rnd(10),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1}) 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==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==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}) elseif d%4==3 then ins(P.atkBuffer,{pos=rnd(10),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3})
end end
P.atkBuffer.sum=P.atkBuffer.sum+d%4+1 P.atkBuffer.sum=P.atkBuffer.sum+d%4+1
P.stat.recv=P.stat.recv+d%4+1
if P.atkBuffer.sum>20 then garbageRelease()end if P.atkBuffer.sum>20 then garbageRelease()end
P.counter=0 P.counter=0
if P.cstat.event==45 then showText(P,text.maxspeed,"appear",80,-140)end if P.modeData.event==45 then showText(P,text.maxspeed,"appear",80,-140)end
P.cstat.event=P.cstat.event+1 P.modeData.event=P.modeData.event+1
end end
end, end,
survivor_hard=function(P) survivor_hard=function(P)
if not P.control then return end if not P.control then return end
P.counter=P.counter+1 P.counter=P.counter+1
if P.counter>=max(60,180-2*P.cstat.event)then if P.counter>=max(60,180-2*P.modeData.event)then
if P.cstat.event%3<2 then if P.modeData.event%3<2 then
ins(P.atkBuffer,{pos=rnd(10),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1}) ins(P.atkBuffer,{pos=rnd(10),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1})
else else
ins(P.atkBuffer,{pos=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 end
P.atkBuffer.sum=P.atkBuffer.sum+(P.cstat.event%3<2 and 1 or 3) P.atkBuffer.sum=P.atkBuffer.sum+(P.modeData.event%3<2 and 1 or 3)
if P.atkBuffer.sum>20 then garbageRelease()end if P.atkBuffer.sum>20 then garbageRelease()end
P.counter=0 P.counter=0
if P.cstat.event==45 then showText(P,text.maxspeed,"appear",80,-140)end if P.modeData.event==45 then showText(P,text.maxspeed,"appear",80,-140)end
P.cstat.event=P.cstat.event+1 P.modeData.event=P.modeData.event+1
end end
end, end,
survivor_lunatic=function(P) survivor_lunatic=function(P)
if not P.control then return end if not P.control then return end
P.counter=P.counter+1 P.counter=P.counter+1
if P.counter>=max(60,150-P.cstat.event)then if P.counter>=max(60,150-P.modeData.event)then
local t=max(60,90-P.cstat.event) local t=max(60,90-P.modeData.event)
ins(P.atkBuffer,{pos=rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}) 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 P.atkBuffer.sum=P.atkBuffer.sum+4
if P.atkBuffer.sum>20 then garbageRelease()end if P.atkBuffer.sum>15 then garbageRelease()end
P.counter=0 P.counter=0
if P.cstat.event==60 then showText(P,text.maxspeed,"appear",80,-140)end if P.modeData.event==60 then showText(P,text.maxspeed,"appear",80,-140)end
P.cstat.event=P.cstat.event+1 P.modeData.event=P.modeData.event+1
end end
end, end,
survivor_ultimate=function(P) survivor_ultimate=function(P)
if not P.control then return end if not P.control then return end
P.counter=P.counter+1 P.counter=P.counter+1
if P.counter>=max(300,600-10*P.cstat.event)then if P.counter>=max(300,600-10*P.modeData.event)then
local t=max(300,480-12*P.cstat.event) local t=max(300,480-12*P.modeData.event)
ins(P.atkBuffer,{pos=rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=2}) ins(P.atkBuffer,{pos=rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=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=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.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}) 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 P.atkBuffer.sum=P.atkBuffer.sum+20
if P.atkBuffer.sum>30 then garbageRelease()end if P.atkBuffer.sum>32 then garbageRelease()end
P.counter=0 P.counter=0
if P.cstat.event==31 then showText(P,text.maxspeed,"appear",80,-140)end if P.modeData.event==31 then showText(P,text.maxspeed,"appear",80,-140)end
P.cstat.event=P.cstat.event+1 P.modeData.event=P.modeData.event+1
end end
end, end,
PC=function(P) PC=function(P)
P.counter=P.counter+1 P.counter=P.counter+1
if P.counter==21 then if P.counter==21 then
local t=P.cstat.pc%2 local t=P.stat.pc%2
for i=1,4 do for i=1,4 do
local r=getNewRow(0) local r=getNewRow(0)
for j=1,10 do for j=1,10 do
r[j]=PCbase[4*t+i][j] r[j]=PCbase[4*t+i][j]
end end
ins(P.field,1,r) ins(P.field,1,r)
ins(P.visTime,1,getNewRow(P.showTime)) ins(P.visTime,1,getNewRow(20))
end end
P.fieldBeneath=P.fieldBeneath+120 P.fieldBeneath=P.fieldBeneath+120
-- P.curY=P.curY+4 for i=1,#P.clearing do
P.y_img=P.y_img+4 P.clearing[i]=P.clearing[i]+4
end
freshgho() freshgho()
return true return true
end end
@@ -696,84 +726,68 @@ Event_task={
defaultModeEnv={ defaultModeEnv={
sprint={ sprint={
{ {
drop=60, drop=60,target=10,
target=10,
reach=Event_gameover.win, reach=Event_gameover.win,
bg="strap",bgm="race", bg="strap",bgm="race",
}, },
{ {
drop=60, drop=60,target=20,
target=20,
reach=Event_gameover.win, reach=Event_gameover.win,
bg="strap",bgm="race", bg="strap",bgm="race",
}, },
{ {
drop=60, drop=60,target=40,
target=40,
reach=Event_gameover.win, reach=Event_gameover.win,
bg="strap",bgm="race", bg="strap",bgm="race",
}, },
{ {
drop=60, drop=60,target=100,
target=100,
reach=Event_gameover.win, reach=Event_gameover.win,
bg="strap",bgm="race", bg="strap",bgm="race",
}, },
{ {
drop=60, drop=60,target=400,
target=400,
reach=Event_gameover.win, reach=Event_gameover.win,
bg="strap",bgm="push", bg="strap",bgm="push",
}, },
{ {
drop=60, drop=60,target=1000,
target=1000,
reach=Event_gameover.win, reach=Event_gameover.win,
bg="strap",bgm="push", bg="strap",bgm="push",
}, },
}, },
marathon={ marathon={
{ {
drop=60,lock=60, drop=60,lock=60,fall=30,
fall=30, target=200,reach=Event.marathon_reach,
target=200,
reach=Event.marathon_reach,
bg="strap",bgm="way", bg="strap",bgm="way",
}, },
{ {
drop=60, drop=60,fall=20,
fall=20, target=10,reach=Event.marathon_reach,
target=10,
reach=Event.marathon_reach,
bg="strap",bgm="way", bg="strap",bgm="way",
}, },
{ {
_20G=true, _20G=true,fall=15,
fall=15, target=200,reach=Event.marathon_reach,
target=200,
reach=Event.marathon_reach,
bg="strap",bgm="race", bg="strap",bgm="race",
}, },
}, },
master={ master={
{ {
_20G=true, _20G=true,drop=0,lock=rush_lock[1],
drop=0,lock=rush_lock[1],
wait=rush_wait[1], wait=rush_wait[1],
fall=rush_fall[1], fall=rush_fall[1],
target=0, target=0,reach=Event.master_reach_lunatic,
reach=Event.master_reach_lunatic,
das=9,arr=3, das=9,arr=3,
freshLimit=15, freshLimit=15,
bg="game2",bgm="secret8th", bg="strap",bgm="secret8th",
}, },
{ {
_20G=true, _20G=true,drop=0,lock=death_lock[1],
drop=0,lock=death_lock[1],
wait=death_wait[1], wait=death_wait[1],
fall=death_fall[1], fall=death_fall[1],
target=0, target=0,reach=Event.master_reach_ultimate,
reach=Event.master_reach_ultimate,
das=6,arr=1, das=6,arr=1,
freshLimit=15, freshLimit=15,
bg="game2",bgm="secret7th", bg="game2",bgm="secret7th",
@@ -781,16 +795,13 @@ defaultModeEnv={
}, },
classic={ classic={
{ {
das=15,arr=3, das=15,arr=3,sddas=2,sdarr=2,
sddas=2,sdarr=2,
ghost=false,center=false, ghost=false,center=false,
drop=1,lock=1, drop=1,lock=1,wait=10,fall=25,
wait=10,fall=25,
next=1,hold=false, next=1,hold=false,
sequence="rnd", sequence="rnd",
freshLimit=0, freshLimit=0,
target=10, target=10,reach=Event.classic_reach,
reach=Event.classic_reach,
bg="rgb",bgm="rockblock", bg="rgb",bgm="rockblock",
}, },
}, },
@@ -798,8 +809,7 @@ defaultModeEnv={
{ {
drop=1e99,lock=1e99, drop=1e99,lock=1e99,
oncehold=false, oncehold=false,
target=200, target=200,reach=Event_gameover.win,
reach=Event_gameover.win,
bg="strap",bgm="infinite", bg="strap",bgm="infinite",
}, },
}, },
@@ -821,16 +831,14 @@ defaultModeEnv={
oncehold=false, oncehold=false,
drop=1e99,lock=1e99, drop=1e99,lock=1e99,
freshLimit=15, freshLimit=15,
target=1, target=1,reach=Event.tsd_reach,
reach=Event.tsd_reach,
ospin=false, ospin=false,
bg="matrix",bgm="reason", bg="matrix",bgm="reason",
}, },
{ {
drop=60,lock=60, drop=60,lock=60,
freshLimit=15, freshLimit=15,
target=1, target=1,reach=Event.tsd_reach,
reach=Event.tsd_reach,
ospin=false, ospin=false,
bg="matrix",bgm="reason", bg="matrix",bgm="reason",
}, },
@@ -933,35 +941,32 @@ defaultModeEnv={
{ {
oncehold=false, oncehold=false,
drop=1e99,lock=1e99, drop=1e99,lock=1e99,
target=0, target=1,reach=Event.tech_reach_easy,
reach=Event.tech_reach,
bg="matrix",bgm="way", bg="matrix",bgm="way",
}, },
{ {
oncehold=false,
drop=30,lock=60, drop=30,lock=60,
target=0, target=1,reach=Event.tech_reach_easy,
reach=Event.tech_reach,
bg="matrix",bgm="way", bg="matrix",bgm="way",
}, },
{ {
drop=15,lock=60, drop=8,lock=60,
target=0,
reach=Event.tech_reach_hard,
freshLimit=15, freshLimit=15,
bg="matrix",bgm="way", target=1,reach=Event.tech_reach_hard,
bg="matrix",bgm="secret8th",
}, },
{ {
drop=5,lock=40, drop=4,lock=40,
target=0, target=1,
freshLimit=15, freshLimit=15,
reach=Event.tech_reach_hard, reach=Event.tech_reach_hard,
bg="matrix",bgm="way", bg="matrix",bgm="secret8th",
}, },
{ {
drop=1,lock=40, drop=1,lock=40,
target=0,
freshLimit=15, freshLimit=15,
reach=Event.tech_reach_hard, target=1,reach=Event.tech_reach_ultimate,
bg="matrix",bgm="secret7th", bg="matrix",bgm="secret7th",
}, },
}, },
@@ -969,11 +974,10 @@ defaultModeEnv={
{ {
next=4, next=4,
hold=false, hold=false,
drop=120,lock=120, drop=150,lock=150,
fall=20, fall=20,
sequence="pc", sequence="pc",
target=0, target=0,reach=Event.newPC,
reach=Event.newPC,
ospin=false, ospin=false,
bg="rgb",bgm="newera", bg="rgb",bgm="newera",
}, },
@@ -983,9 +987,8 @@ defaultModeEnv={
drop=60,lock=60, drop=60,lock=60,
fall=20, fall=20,
sequence="pc", sequence="pc",
target=0,
freshLimit=15, freshLimit=15,
reach=Event.newPC, target=0,reach=Event.newPC,
ospin=false, ospin=false,
bg="rgb",bgm="newera", bg="rgb",bgm="newera",
}, },
@@ -994,31 +997,26 @@ defaultModeEnv={
{ {
oncehold=false, oncehold=false,
drop=300,lock=1e99, drop=300,lock=1e99,
target=100, target=100,reach=Event_gameover.win,
reach=Event_gameover.win,
ospin=false, ospin=false,
bg="rgb",bgm="newera", bg="rgb",bgm="newera",
}, },
{ {
drop=60,lock=120, drop=60,lock=120,fall=10,
fall=10, target=100,reach=Event_gameover.win,
target=100,
reach=Event_gameover.win,
freshLimit=15, freshLimit=15,
ospin=false, ospin=false,
bg="rgb",bgm="infinite", bg="rgb",bgm="infinite",
}, },
{ {
drop=20,lock=60, drop=20,lock=60,fall=20,
fall=20, target=100,reach=Event_gameover.win,
target=100,
reach=Event_gameover.win,
freshLimit=15, freshLimit=15,
ospin=false, ospin=false,
bg="rgb",bgm="infinite", bg="rgb",bgm="infinite",
}, },
}, },
techmino41={ techmino49={
{ {
fall=20, fall=20,
royaleMode=true, royaleMode=true,

BIN
font.ttf

Binary file not shown.

View File

@@ -6,7 +6,7 @@ local testScore={[-1]=1,[-2]=0,[-3]=1,2,2,2}
local visible_opt={show=1e99,time=300,fast=20,none=5} local visible_opt={show=1e99,time=300,fast=20,none=5}
local reAtk={0,0,1,1,1,2,2,3,3} local reAtk={0,0,1,1,1,2,2,3,3}
local reDef={0,1,1,2,3,3,4,4,5} local reDef={0,1,1,2,3,3,4,4,5}
local spin_n={"spin_1","spin_2","spin_3"} local spin_n={[0]="spin_0","spin_1","spin_2","spin_3"}
local clear_n={"clear_1","clear_2","clear_3","clear_4"} local 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 ren_n={}for i=1,11 do ren_n[i]="ren_"..i end
@@ -105,9 +105,9 @@ local freshMethod={
newNext(i) newNext(i)
end,--random end,--random
pc=function() pc=function()
if P.cstat.piece%4==0 then if P.stat.piece%4==0 then
local r=rnd(#PClist) local r=rnd(#PClist)
local f=P.cstat.event==1 local f=P.modeData.event==1
for i=1,4 do for i=1,4 do
local b=PClist[r][i] local b=PClist[r][i]
if f then if f then
@@ -117,7 +117,7 @@ local freshMethod={
end end
newNext(b) newNext(b)
end end
P.cstat.event=(P.cstat.event+1)%2 P.modeData.event=(P.modeData.event+1)%2
end end
end, end,
drought1=function() drought1=function()
@@ -160,10 +160,35 @@ function loadGame(mode,level)
needResetGameData=true needResetGameData=true
gotoScene("play","deck") gotoScene("play","deck")
end end
function resetPartGameData()
frame=30
if players then
for _,P in next,players do if P.id then
while P.field[1]do
removeRow(P.field)
removeRow(P.visTime)
end
end end
end
players={alive={}}human=0
loadmode[curMode.id]()
if modeEnv.royaleMode then
for i=1,#players do
changeAtk(players[i],randomTarget(players[i]))
end
end
for i=1,#virtualkey do
virtualkey[i].press=false
end
collectgarbage()
end
function resetGameData() function resetGameData()
gamefinished=false
frame=0 frame=0
garbageSpeed=1 garbageSpeed=1
pushSpeed=3 pushSpeed=3
pauseTime=0--Time paused
pauseCount=0--Times paused
if players then if players then
for _,P in next,players do if P.id then for _,P in next,players do if P.id then
while P.field[1]do while P.field[1]do
@@ -179,7 +204,7 @@ function resetGameData()
BGM(modeEnv.bgm) BGM(modeEnv.bgm)
FX.beam={} FX.beam={}
for k,v in pairs(PTC.dust)do for _,v in next,PTC.dust do
v:release() v:release()
end end
for i=1,#players do for i=1,#players do
@@ -205,6 +230,7 @@ function resetGameData()
while freeRow[p]do while freeRow[p]do
rem(freeRow) rem(freeRow)
end end
sysSFX("ready")
collectgarbage() collectgarbage()
end end
function gameStart() function gameStart()
@@ -247,12 +273,15 @@ function createPlayer(id,x,y,size,AIspeed,data)
P.alive=true P.alive=true
P.control=false P.control=false
P.timing=false P.timing=false
P.time=0 P.stat={
P.cstat={ time=0,
key=0,piece=0,row=0,atk=0, key=0,rotate=0,hold=0,piece=0,row=0,
techrash=0,pc=0, atk=0,send=0,recv=0,pend=0,
point=0,event=0 clear_1=0,clear_2=0,clear_3=0,clear_4=0,
spin_0=0,spin_1=0,spin_2=0,spin_3=0,
pc=0,b2b=0,b3b=0,
}--Current gamestat }--Current gamestat
P.modeData={point=0,event=0}--data use by mode
P.keyTime={}for i=1,10 do P.keyTime[i]=-1e5 end P.keySpeed=0 P.keyTime={}for i=1,10 do P.keyTime[i]=-1e5 end P.keySpeed=0
P.dropTime={}for i=1,10 do P.dropTime[i]=-1e5 end P.dropSpeed=0 P.dropTime={}for i=1,10 do P.dropTime[i]=-1e5 end P.dropSpeed=0
@@ -353,6 +382,7 @@ function garbageSend(S,R,send,time)
sent=false, sent=false,
lv=min(int(send^.69),5), lv=min(int(send^.69),5),
}) })
R.stat.recv=R.stat.recv+send
if R.id==1 then sysSFX(send<4 and "blip_1"or"blip_2",min(send+1,5)*.1)end if R.id==1 then sysSFX(send<4 and "blip_1"or"blip_2",min(send+1,5)*.1)end
end end
end end
@@ -362,6 +392,7 @@ function garbageRelease()
if not A.sent and A.countdown<=0 then if not A.sent and A.countdown<=0 then
garbageRise(8+A.lv,A.amount,A.pos) garbageRise(8+A.lv,A.amount,A.pos)
P.atkBuffer.sum=P.atkBuffer.sum-A.amount P.atkBuffer.sum=P.atkBuffer.sum-A.amount
P.stat.pend=P.stat.pend+A.amount
A.sent=true A.sent=true
A.time=0 A.time=0
end end
@@ -643,24 +674,24 @@ function spin(d,ifpre)
P.curX=P.curX-1 P.curX=P.curX-1
goto I goto I
end end
goto E goto quit
::T:: ::T::
P.cur.id=5 P.cur.id=5
P.cur.bk=blocks[5][0] P.cur.bk=blocks[5][0]
P.sc=scs[5][0] P.sc=scs[5][0]
P.r,P.c,P.dir=2,3,0 P.r,P.c,P.dir=2,3,0
P.spinLast=3 P.spinLast=3
if P.id==1 then stat.rotate=stat.rotate+1 end P.stat.rotate=P.stat.rotate+1
goto E goto quit
::I:: ::I::
P.cur.id=7 P.cur.id=7
P.cur.bk=blocks[7][2] P.cur.bk=blocks[7][2]
P.sc=scs[7][2] P.sc=scs[7][2]
P.r,P.c,P.dir=1,4,2 P.r,P.c,P.dir=1,4,2
P.spinLast=3 P.spinLast=3
if P.id==1 then stat.rotate=stat.rotate+1 end P.stat.rotate=P.stat.rotate+1
end end
::E::return goto quit
end end
local icb=blocks[P.cur.id][idir] local icb=blocks[P.cur.id][idir]
local isc=scs[P.cur.id][idir] local isc=scs[P.cur.id][idir]
@@ -675,7 +706,7 @@ function spin(d,ifpre)
goto spin goto spin
end end
end end
goto fail goto quit
::spin:: ::spin::
createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY) createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY)
P.curX,P.curY,P.dir=ix,iy,idir P.curX,P.curY,P.dir=ix,iy,idir
@@ -685,10 +716,8 @@ function spin(d,ifpre)
freshgho() freshgho()
freshLockDelay() freshLockDelay()
SFX(ifpre and"prerotate"or ifoverlap(P.cur.bk,P.curX,P.curY+1)and ifoverlap(P.cur.bk,P.curX-1,P.curY)and ifoverlap(P.cur.bk,P.curX+1,P.curY)and"rotatekick"or"rotate") SFX(ifpre and"prerotate"or ifoverlap(P.cur.bk,P.curX,P.curY+1)and ifoverlap(P.cur.bk,P.curX-1,P.curY)and ifoverlap(P.cur.bk,P.curX+1,P.curY)and"rotatekick"or"rotate")
if P.id==1 then P.stat.rotate=P.stat.rotate+1
stat.rotate=stat.rotate+1 ::quit::
end
::fail::
end end
function hold(ifpre) function hold(ifpre)
if not P.holded and P.waiting==-1 and P.gameEnv.hold then if not P.holded and P.waiting==-1 and P.gameEnv.hold then
@@ -712,9 +741,7 @@ function hold(ifpre)
if ifoverlap(P.cur.bk,P.curX,P.curY)then lock()Event_gameover.lose()end if ifoverlap(P.cur.bk,P.curX,P.curY)then lock()Event_gameover.lose()end
SFX(ifpre and"prehold"or"hold") SFX(ifpre and"prehold"or"hold")
if P.id==1 then P.stat.hold=P.stat.hold+1
stat.hold=stat.hold+1
end
end end
end end
function drop() function drop()
@@ -739,7 +766,7 @@ function drop()
end--Immobile end--Immobile
end end
lock() lock()
local cc,csend,exblock,sendTime=checkrow(P.curY,P.r),0,0,0--Currect clear&send&sendTime local cc,send,exblock,sendTime=checkrow(P.curY,P.r),0,0,0--Currect clear&send&sendTime
local mini local mini
if P.spinLast and cc>0 and dospin>0 then if P.spinLast and cc>0 and dospin>0 then
dospin=dospin+P.spinLast dospin=dospin+P.spinLast
@@ -760,71 +787,76 @@ function drop()
if cc==4 then if cc==4 then
if P.b2b>1000 then if P.b2b>1000 then
showText(P,text.techrashB3B,"fly",80,-30) showText(P,text.techrashB3B,"fly",80,-30)
csend=6 send=6
sendTime=100 sendTime=100
exblock=exblock+1 exblock=exblock+1
P.stat.b3b=P.stat.b3b+1
elseif P.b2b>=40 then elseif P.b2b>=40 then
showText(P,text.techrashB2B,"drive",80,-30) showText(P,text.techrashB2B,"drive",80,-30)
sendTime=80 sendTime=80
csend=5 send=5
P.stat.b2b=P.stat.b2b+1
else else
showText(P,text.techrash,"stretch",80,-30) showText(P,text.techrash,"stretch",80,-30)
sendTime=60 sendTime=60
csend=4 send=4
end end
P.b2b=P.b2b+120 P.b2b=P.b2b+120
P.lastClear=74 P.lastClear=74
P.cstat.techrash=P.cstat.techrash+1 P.stat.clear_4=P.stat.clear_4+1
elseif cc>0 then elseif cc>0 then
local clearKey=clear_n
if dospin then if dospin then
if P.b2b>1000 then if P.b2b>1000 then
showText(P,text.b3b..text.spin[P.cur.name]..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 send=b2bATK[cc]+1
exblock=exblock+1 exblock=exblock+1
P.stat.b3b=P.stat.b3b+1
elseif P.b2b>=40 then elseif P.b2b>=40 then
showText(P,text.b2b..text.spin[P.cur.name]..text.clear[cc],"spin",40,-30) showText(P,text.b2b..text.spin[P.cur.name]..text.clear[cc],"spin",40,-30)
csend=b2bATK[cc] send=b2bATK[cc]
P.stat.b2b=P.stat.b2b+1
else else
showText(P,text.spin[P.cur.name]..text.clear[cc],"spin",50,-30) showText(P,text.spin[P.cur.name]..text.clear[cc],"spin",50,-30)
csend=2*cc send=2*cc
end end
sendTime=20+csend*20 sendTime=20+send*20
if mini then if mini then
showText(P,text.mini,"appear",40,-80) showText(P,text.mini,"appear",40,-80)
csend=ceil(csend*.5) send=ceil(send*.5)
sendTime=sendTime+60 sendTime=sendTime+60
P.b2b=P.b2b+b2bPoint[cc]*.8 P.b2b=P.b2b+b2bPoint[cc]*.8
else else
P.b2b=P.b2b+b2bPoint[cc] P.b2b=P.b2b+b2bPoint[cc]
end end
P.lastClear=P.cur.id*10+cc P.lastClear=P.cur.id*10+cc
if P.id==1 then clearKey=spin_n
stat.spin=stat.spin+1
end
SFX(spin_n[cc]) SFX(spin_n[cc])
elseif #P.clearing<#P.field then elseif #P.clearing<#P.field then
P.b2b=max(P.b2b-250,0) P.b2b=max(P.b2b-250,0)
showText(P,text.clear[cc],"appear",32+cc*3,-30,(8-cc)*.3) showText(P,text.clear[cc],"appear",32+cc*3,-30,(8-cc)*.3)
csend=cc-1 send=cc-1
sendTime=20+csend*20 sendTime=20+send*20
P.lastClear=cc P.lastClear=cc
end end
P.stat[clearKey[cc]]=P.stat[clearKey[cc]]+1
else else
P.combo=0 P.combo=0
if dospin then if dospin then
showText(P,text.spin[P.cur.name],"appear",50,-30) showText(P,text.spin[P.cur.name],"appear",50,-30)
SFX("spin_0") SFX("spin_0")
P.b2b=P.b2b+20 P.b2b=P.b2b+20
P.stat.spin_0=P.stat.spin_0+1
end end
end end
csend=csend+(renATK[P.combo]or 4) send=send+(renATK[P.combo]or 4)
if #P.clearing==#P.field then if #P.clearing==#P.field then
showText(P,text.PC,"flicker",70,-80) showText(P,text.PC,"flicker",70,-80)
csend=min(csend,4)+min(6+P.cstat.pc,10) send=min(send,4)+min(6+P.stat.pc,10)
exblock=exblock+2 exblock=exblock+2
sendTime=sendTime+60 sendTime=sendTime+60
if P.cstat.row>4 then P.b2b=1200 end if P.stat.row>4 then P.b2b=1200 end
P.cstat.pc=P.cstat.pc+1 P.stat.pc=P.stat.pc+1
P.lastClear=P.cur.id*10+5 P.lastClear=P.cur.id*10+5
SFX("perfectclear") SFX("perfectclear")
end end
@@ -835,39 +867,38 @@ function drop()
if cc>0 then if cc>0 then
SFX(clear_n[cc]) SFX(clear_n[cc])
SFX(ren_n[min(P.combo,11)]) SFX(ren_n[min(P.combo,11)])
if P.id==1 then VIB(cc<3 and 1 or cc-1)end if P.id==1 then VIB(cc)end
end end
if P.b2b>1200 then P.b2b=1200 end if P.b2b>1200 then P.b2b=1200 end
if cc>0 and modeEnv.royaleMode then if cc>0 and modeEnv.royaleMode then
local i=min(#P.atker,9) local i=min(#P.atker,9)
if i>1 then if i>1 then
csend=csend+reAtk[i] send=send+reAtk[i]
exblock=exblock+reDef[i] exblock=exblock+reDef[i]
end end
end end
if csend>0 then if send>0 then
if exblock then exblock=int(exblock*(1+P.strength*.25))end if exblock then exblock=int(exblock*(1+P.strength*.25))end
csend=csend*(1+P.strength*.25) send=send*(1+P.strength*.25)
if mini then csend=csend end if mini then send=send end
csend=int(csend) send=int(send)
--Badge Buff --Badge Buff
P.cstat.atk=P.cstat.atk+csend P.stat.atk=P.stat.atk+send
if P.id==1 then stat.atk=stat.atk+csend end
--ATK statistics --ATK statistics
if csend==0 then goto L end if send==0 then goto L end
showText(P,csend,"zoomout",40,70) showText(P,send,"zoomout",40,70)
if exblock==0 then goto L end if exblock==0 then goto L end
showText(P,exblock,"zoomout",20,115) showText(P,exblock,"zoomout",20,115)
::L:: ::L::
if csend>0 and P.atkBuffer[1]then if send>0 and P.atkBuffer[1]then
if exblock>0 then if exblock>0 then
exblock=exblock-1 exblock=exblock-1
else else
csend=csend-1 send=send-1
end end
P.atkBuffer[1].amount=P.atkBuffer[1].amount-1 P.atkBuffer[1].amount=P.atkBuffer[1].amount-1
P.atkBuffer.sum=P.atkBuffer.sum-1 P.atkBuffer.sum=P.atkBuffer.sum-1
@@ -876,24 +907,25 @@ function drop()
end end
goto L goto L
end end
if csend>0 then if send>0 then
if modeEnv.royaleMode then if modeEnv.royaleMode then
if P.atkMode==4 then if P.atkMode==4 then
if #P.atker>0 then if #P.atker>0 then
for i=1,#P.atker do for i=1,#P.atker do
garbageSend(P,P.atker[i],csend,sendTime) garbageSend(P,P.atker[i],send,sendTime)
end end
else else
garbageSend(P,randomTarget(P),csend,sendTime) garbageSend(P,randomTarget(P),send,sendTime)
end end
else else
freshTarget(P) freshTarget(P)
garbageSend(P,P.atking,csend,sendTime) garbageSend(P,P.atking,send,sendTime)
end end
elseif #players.alive>1 then elseif #players.alive>1 then
garbageSend(P,randomTarget(P),csend,sendTime) garbageSend(P,randomTarget(P),send,sendTime)
end end
if P.id==1 and csend>3 then sysSFX("emit",min(csend,8)*.125)end P.stat.send=P.stat.send+send
if P.id==1 and send>3 then sysSFX("emit",min(send,8)*.125)end
end end
elseif cc==0 then elseif cc==0 then
if P.b2b>1000 then if P.b2b>1000 then
@@ -901,11 +933,8 @@ function drop()
end end
garbageRelease() garbageRelease()
end end
if P.id==1 then P.stat.piece,P.stat.row=P.stat.piece+1,P.stat.row+cc
stat.piece,stat.row=stat.piece+1,stat.row+cc if P.stat.row>=P.gameEnv.target then
end
P.cstat.piece,P.cstat.row=P.cstat.piece+1,P.cstat.row+cc
if P.cstat.row>=P.gameEnv.target then
P.gameEnv.reach() P.gameEnv.reach()
end end
P.spinLast=dospin and cc>0 P.spinLast=dospin and cc>0
@@ -961,8 +990,7 @@ function pressKey(i,p)
end end
end end
ins(P.keyTime,1,frame)rem(P.keyTime,11) ins(P.keyTime,1,frame)rem(P.keyTime,11)
P.cstat.key=P.cstat.key+1 P.stat.key=P.stat.key+1
if P.id==1 then stat.key=stat.key+1 end
end end
--ins(rec,{i,frame}) --ins(rec,{i,frame})
end end
@@ -1017,7 +1045,7 @@ act={
P.curY=P.y_img P.curY=P.y_img
P.spinLast=false P.spinLast=false
SFX("drop") SFX("drop")
if P.id==1 then VIB(1)end if P.id==1 then VIB(0)end
end end
P.lockDelay=-1 P.lockDelay=-1
drop() drop()
@@ -1051,20 +1079,30 @@ act={
P.swappingAtkMode=30 P.swappingAtkMode=30
end end
end end
if curMode.id=="custom"and curMode.lv==2 and#P.field>0 then if curMode.id=="custom"and curMode.lv==2 then
for y=1,#P.field do if #P.field>=preField.h then
for x=1,10 do for y=1,preField.h do
if P.field[y][x]~=preField[y][x]then return end for x=1,10 do
local a,b=preField[y][x],P.field[y][x]
if a==0 and b>0 or a<8 and a~=b or a>7 and b==0 then
P.modeData.event=1-P.modeData.event
return
end
end
end end
P.modeData.event=1
Event_gameover.win()
else
P.modeData.event=1-P.modeData.event
end end
Event_gameover.win()
end end
end end
end, end,
restart=function() restart=function()
clearTask("play") if frame<180 then
resetGameData() clearTask("play")
frame=30 resetPartGameData()
end
end, end,
insDown=function() insDown=function()
if P.curY~=P.y_img then if P.curY~=P.y_img then
@@ -1076,7 +1114,7 @@ act={
local x0=cx local x0=cx
::L::if not ifoverlap(P.cur.bk,P.curX-1,P.curY)then ::L::if not ifoverlap(P.cur.bk,P.curX-1,P.curY)then
P.curX=P.curX-1 P.curX=P.curX-1
createShade(P.curX+1,P.curY+P.r-1,P.curX+P.c-1,P.curY) createShade(P.curX+1,P.curY+P.r-1,P.curX+1,P.curY)
freshgho() freshgho()
goto L goto L
end end
@@ -1086,7 +1124,7 @@ act={
local x0=cx local x0=cx
::L::if not ifoverlap(P.cur.bk,P.curX+1,P.curY)then ::L::if not ifoverlap(P.cur.bk,P.curX+1,P.curY)then
P.curX=P.curX+1 P.curX=P.curX+1
createShade(P.curX-1,P.curY+P.r-1,P.curX+P.c-1,P.curY) createShade(P.curX+P.c-1,P.curY+P.r-1,P.curX+P.c-1,P.curY)
freshgho() freshgho()
goto L goto L
end end

BIN
image/block.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

@@ -3,17 +3,15 @@ return{
royale_remain=function(n)return"剩余 "..n.." 名玩家"end, royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"}, cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
techrash="Techrash", techrash="Techrash",
techrashB2B="Techrash B2B", techrashB2B="B2B Techrash",
techrashB3B="Techrash B2B2B", techrashB3B="B2B2B Techrash",
block={"Z","S","L","J","T","O","I"}, block={"Z","S","L","J","T","O","I"},
spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
clear={" single"," double"," triple"}, clear={" single"," double"," triple"},
b2b="B2B ", spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
b3b="B2B2B ", b2b="B2B ",b3b="B2B2B ",
mini="Mini", mini="Mini",
PC="Perfect Clear", PC="Perfect Clear",
hold="暂存", hold="暂存",next="下一个",
next="下一个",
stage={"关卡 1","关卡 2","关卡 3","关卡 4","关卡 5",}, stage={"关卡 1","关卡 2","关卡 3","关卡 4","关卡 5",},
maxspeed="最高速度", maxspeed="最高速度",
@@ -22,6 +20,8 @@ return{
win="胜利", win="胜利",
lose="失败", lose="失败",
pause="暂停", pause="暂停",
finish="结束",
pauseTime="暂停时间",
custom="自定义游戏", custom="自定义游戏",
customOption={ customOption={
@@ -43,7 +43,7 @@ return{
wait=nil, wait=nil,
fall=nil, fall=nil,
next=nil, next=nil,
hold={"",""}, hold={"","","无限"},
sequence={"bag7","his4","随机"}, sequence={"bag7","his4","随机"},
visible={"可见","半隐","全隐","瞬隐"}, visible={"可见","半隐","全隐","瞬隐"},
target={10,20,40,100,200,500,1000,""}, target={10,20,40,100,200,500,1000,""},
@@ -62,7 +62,7 @@ return{
modeName={ modeName={
[0]="自定义", [0]="自定义",
"竞速","马拉松","大师","经典","","无尽","单挑","仅TSD","隐形","挖掘","生存","科研", "竞速","马拉松","大师","经典","","无尽","单挑","仅TSD","隐形","挖掘","生存","科研",
"全清训练","全清挑战","41人混战","99人混战","干旱","多人", "全清训练","全清挑战","49人混战","99人混战","干旱","多人",
}, },
modeInfo={ modeInfo={
sprint="挑战世界纪录", sprint="挑战世界纪录",
@@ -72,14 +72,14 @@ return{
zen="无重力消除200行", zen="无重力消除200行",
infinite="科研沙盒", infinite="科研沙盒",
solo="打败AI", solo="打败AI",
tsd="尽可能做T旋消2", tsd="尽可能做TSD",
blind="最强大脑", blind="最强大脑",
dig="核能挖掘机", dig="核能挖掘机",
survivor="防守练习", survivor="防守练习",
tech="ALLSPIN练习", tech="尽可能不要普通消除",
pctrain="熟悉全清定式的组合", pctrain="熟悉全清定式的组合",
pcchallenge="100行内尽可能多全清", pcchallenge="100行内尽可能多PC",
techmino41="41人混战", techmino49="49人混战",
techmino99="99人混战", techmino99="99人混战",
drought="异常序列", drought="异常序列",
hotseat="友尽模式", hotseat="友尽模式",
@@ -90,27 +90,42 @@ return{
"不是动画,真的在加载!", "不是动画,真的在加载!",
"整个游戏都是MrZ完成的!", "整个游戏都是MrZ完成的!",
"大满贯10连击消四全清!", "大满贯10连击消四全清!",
"方块研究所有一个Nspire-CX版本!", "<方块研究所>有一个Nspire-CX版本!",
"B2B2B2B存在吗?", "B2B2B2B存在吗?",
"MrZ旋转消5!",
"MEGACMB!", "MEGACMB!",
"ALLSPIN!", "ALLSPIN!",
"O型回旋三清?", "O型回旋三清?",
"只用一个输入设备就可以玩游戏啦~", "只用一个输入设备就可以游玩了",
"Miya:喵!", "Miya:喵!",
"225238922,哔哩哔哩 干杯~", "225238922,哔哩哔哩 干杯~",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"合群了就会消失,但是消失不代表没有意义",
"学会使用两个旋转键,三个更好",
"更小的DAS和ARR拥有更高的操作上限",
"注意到\"旋转\"到底对方块做了些什么吗?",
"20G是一套全新的游戏规则",
"不要在上课时玩游戏!",
"本游戏难度上限很高,做好心理准备",
"方块可以不是个休闲游戏",
}, },
stat={ stat={
"游戏运行次数:", "游戏运行次数:",
"游戏局数:", "游戏局数:",
"游戏时间:", "游戏时间:",
"总方块使用:", "按键数:",
"总消行数:", "旋转数:",
"总攻击行数:", "Hold次数:",
"总按键数:", "方块使用数:",
"总旋转数:", "消行数:",
"暂存次数:", "攻击数:",
"总旋转消行数:", "发送数:",
"接收数:",
"上涨数:",
"消除数:",
"Spin数:",
"B2B数:",
"PC数:",
"效率:",
}, },
help={ help={
"好像也没啥好帮助的吧?就当是关于了", "好像也没啥好帮助的吧?就当是关于了",
@@ -189,15 +204,16 @@ return{
arrD="-",arrU="+", arrD="-",arrU="+",
sddasD="-",sddasU="+", sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+", sdarrD="-",sdarrU="+",
ctrl="控制设置",
touch="触摸设置",
lang=function()return langName[setting.lang]end,
sfx=function()return setting.sfx and"音效:开"or"音效:关"end, sfx=function()return setting.sfx and"音效:开"or"音效:关"end,
bgm=function()return setting.bgm and"音乐:开"or"音乐:关"end, bgm=function()return setting.bgm and"音乐:开"or"音乐:关"end,
vib=function()return "震动强度:"..setting.vib end, vib=function()return "震动强度:"..setting.vib end,
fullscreen=function()return setting.fullscreen and"全屏:开"or"全屏:关"end, fullscreen=function()return setting.fullscreen and"全屏:开"or"全屏:关"end,
bgblock=function()return setting.bgblock and"背景动画:开"or"背景动画:关"end, bgblock=function()return setting.bgblock and"背景动画:开"or"背景动画:关"end,
frame=function()return"绘制帧:"..setting.frameMul.."%"end, frame=function()return"绘制帧:"..setting.frameMul.."%"end,
control="控制设置", skin="切换方块皮肤",
touch="触摸设置",
lang=function()return langName[setting.lang]end,
back="保存&返回", back="保存&返回",
}, },
setting2={ setting2={
@@ -221,4 +237,4 @@ return{
path="打开存储目录", path="打开存储目录",
}, },
}, },
}--中文 }

240
language/chi_full.lua Normal file
View File

@@ -0,0 +1,240 @@
return{
atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
techrash="四清",
techrashB2B="满贯 四清",
techrashB3B="大满贯 四清",
block={"Z","S","L","J","T","O","I"},
clear={"单清","双清","三清"},
spin={"Z型回旋","S型回旋","L型回旋","J型回旋","T型回旋","O型回旋","I型回旋"},
b2b="满贯",b3b="大满贯",
mini="迷你",
PC="场地全清",
hold="暂存",next="下一个",
stage={"关卡 1","关卡 2","关卡 3","关卡 4","关卡 5",},
maxspeed="最高速度",
speedup="速度加快",
win="胜利",
lose="失败",
pause="暂停",
finish="结束",
pauseTime="暂停时间",
custom="自定义游戏",
customOption={
drop="下落延迟:",
lock="锁定延迟:",
wait="放块延迟:",
fall="消行延迟:",
next="序列数量:",
hold="暂存:",
sequence="序列:",
visible="可见性:",
target="目标行数:",
freshLimit="锁延刷新次数:",
opponent="对手速度等级:",
},
customVal={
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"","[20G]"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
next=nil,
hold={"","","无限"},
sequence={"bag7","his4","随机"},
visible={"可见","半隐","全隐","瞬隐"},
target={10,20,40,100,200,500,1000,""},
freshLimit={0,8,15,""},
opponent={"无电脑",1,2,3,4,5,6,7,8,9,10,11},
},
softdropdas="软降DAS:",
softdroparr="软降ARR:",
snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
keyboard="键盘",joystick="手柄",
space="空格",enter="回车",
setting2Help="方向键选择/翻页,回车修改,esc返回",
actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","功能键:","重新开始:","左瞬移:","右瞬移:","软降到底:"},
modeName={
[0]="自定义",
"竞速","马拉松","大师","经典","","无尽","单挑","仅TSD","隐形","挖掘","生存","科研",
"全清训练","全清挑战","49人混战","99人混战","干旱","多人",
},
modeInfo={
sprint="挑战世界纪录",
marathon="尝试坚持到最后",
master="成为方块大师",
classic="高速经典",
zen="无重力消除200行",
infinite="科研沙盒",
solo="打败AI",
tsd="尽可能做T旋双清",
blind="最强大脑",
dig="核能挖掘机",
survivor="防守练习",
tech="尽可能不要普通消除!",
pctrain="熟悉全清定式的组合",
pcchallenge="100行内尽可能多全清",
techmino49="49人混战",
techmino99="99人混战",
drought="异常序列",
hotseat="友尽模式",
},
load={"加载材质ing","加载音乐ing","加载音效ing","加载完成",},
tips={
"不是动画,真的在加载!",
"整个游戏都是MrZ完成的!",
"大满贯10连击消四全清!",
"<方块研究所>有一个Nspire-CX版本!",
"B2B2B2B存在吗?",
"MEGACMB!",
"ALLSPIN!",
"O型回旋三清?",
"只用一个输入设备就可以游玩了",
"Miya:喵!",
"225238922,哔哩哔哩 干杯~",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"合群了就会消失,但是消失不代表没有意义",
"学会使用两个旋转键,三个更好",
"更小的DAS和ARR拥有更高的操作上限",
"注意到\"旋转\"到底对方块做了些什么吗?",
"20G是一套全新的游戏规则",
"不要在上课时玩游戏!",
"本游戏难度上限很高,做好心理准备",
"方块可以不是个休闲游戏",
},
stat={
"游戏运行次数:",
"游戏局数:",
"游戏时间:",
"按键数:",
"旋转数:",
"暂存次数:",
"方块使用:",
"消行数:",
"攻击行数:",
"发送数:",
"接收数:",
"上涨数:",
"消除数:",
"旋转消行数:",
"满贯数:",
"全清数:",
"效率:",
},
help={
"好像也没啥好帮助的吧?就当是关于了",
"这只是一个方块游戏,请勿过度解读和随意联想",
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
"游戏还在测试阶段,请 勿 外 传",
"",
"使用LOVE2D引擎",
"作者:MrZ 邮箱:1046101471@qq.com",
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ",
"使用工具:VScode,GFIE,Beepbox,Goldwave",
"特别感谢:Farter,Teatube,196,Flyz,T830,[所有测试人员]和 你!",
"错误或者建议请附带相关信息发送到作者邮箱~",
},
support="支持作者",
group="官方QQ群",
ButtonText={
main={
play="开始",
setting="设置",
stat="统计信息",
help="帮助",
quit="退出",
},
mode={
up="Λ",
down="v",
left="<",
right=">",
start="开始",
custom="自定义(C)",
back="返回",
},
custom={
up="Λ",
down="v",
left="<",
right=">",
start1="消除开始",
start2="拼图开始",
draw="画图(D)",
back="返回",
},
draw={
block1="",
block2="",
block3="",
block4="",
block5="",
block6="",
block7="",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
erase="×",
clear="清空",
back="返回",
},
play={
pause="暂停",
},
pause={
resume="继续",
quit="退出",
},
setting={
ghost=function()return setting.ghost and"阴影:开"or"阴影:关"end,
center=function()return setting.center and"旋转中心:开"or"旋转中心:关"end,
grid=function()return setting.grid and"网格:开"or"网格:关"end,
swap=function()return setting.swap and"目标选择:组合键"or"目标选择:循环"end,
fxs=function()return setting.fxs and"特效:开"or"特效:关"end,
bg=function()return setting.bg and"背景:开"or"背景:关"end,
dasD="-",dasU="+",
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
ctrl="控制设置",
touch="触摸设置",
lang=function()return langName[setting.lang]end,
sfx=function()return setting.sfx and"音效:开"or"音效:关"end,
bgm=function()return setting.bgm and"音乐:开"or"音乐:关"end,
vib=function()return "震动强度:"..setting.vib end,
fullscreen=function()return setting.fullscreen and"全屏:开"or"全屏:关"end,
bgblock=function()return setting.bgblock and"背景动画:开"or"背景动画:关"end,
frame=function()return"绘制帧:"..setting.frameMul.."%"end,
skin="切换方块皮肤",
back="保存&返回",
},
setting2={
back="返回",
},
setting3={
back="返回",
hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end,
default="默认组合",
snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return percent0to5[setting.virtualkeyAlpha]end,
icon="图标",
size="大小",
},
help={
back="返回",
qq="作者QQ",
},
stat={
back="返回",
path="打开存储目录",
},
},
}--文

View File

@@ -3,17 +3,15 @@ return{
royale_remain=function(n)return n.." Players Remain"end, royale_remain=function(n)return n.." Players Remain"end,
cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"}, cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
techrash="Techrash", techrash="Techrash",
techrashB2B="Techrash B2B", techrashB2B="B2B Techrash",
techrashB3B="Techrash B2B2B", techrashB3B="B2B2B Techrash",
block={"Z","S","L","J","T","O","I"}, block={"Z","S","L","J","T","O","I"},
spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
clear={" single"," double"," triple"}, clear={" single"," double"," triple"},
b2b="B2B ", spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
b3b="B2B2B ", b2b="B2B ",b3b="B2B2B ",
mini="Mini", mini="Mini",
PC="Perfect Clear", PC="Perfect Clear",
hold="Hold", hold="Hold",next="Next",
next="Next",
stage={"STAGE 1","STAGE 2","STAGE 3","STAGE 4","STAGE 5",}, stage={"STAGE 1","STAGE 2","STAGE 3","STAGE 4","STAGE 5",},
maxspeed="Max speed", maxspeed="Max speed",
@@ -22,7 +20,9 @@ return{
win="WIN", win="WIN",
lose="LOSE", lose="LOSE",
pause="PAUSE", pause="PAUSE",
finish="FINISH",
pauseTime="Pause time",
custom="Custom Game", custom="Custom Game",
customOption={ customOption={
drop="Drop delay:", drop="Drop delay:",
@@ -43,7 +43,7 @@ return{
wait=nil, wait=nil,
fall=nil, fall=nil,
next=nil, next=nil,
hold={"ON","OFF"}, hold={"ON","OFF","FREE"},
sequence={"bag7","his4","random"}, sequence={"bag7","his4","random"},
visible={"normal","time","invisible","sudden"}, visible={"normal","time","invisible","sudden"},
target={10,20,40,100,200,500,1000,""}, target={10,20,40,100,200,500,1000,""},
@@ -62,7 +62,7 @@ return{
modeName={ modeName={
[0]="Custom", [0]="Custom",
"Sprint","Marathon","Master","Classic","Zen","Infinite","1v1","TSD-only","Blind","Dig","Survivor","Tech", "Sprint","Marathon","Master","Classic","Zen","Infinite","1v1","TSD-only","Blind","Dig","Survivor","Tech",
"PC Train","PC Challenge","Techmino41","Techmino99","Drought","Hotseat", "PC Train","PC Challenge","Techmino49","Techmino99","Drought","Hotseat",
}, },
modeInfo={ modeInfo={
sprint="Speed run", sprint="Speed run",
@@ -76,10 +76,10 @@ return{
blind="Invisible board", blind="Invisible board",
dig="Downstack!", dig="Downstack!",
survivor="Hand them!", survivor="Hand them!",
tech="Techniques practice", tech="Don't do normal clear",
pctrain="Let's learn some PCs", pctrain="Let's learn some PCs",
pcchallenge="Make PCs in 100 Lines", pcchallenge="Make PCs in 100 Lines",
techmino41="Melee fight with 40 AIs", techmino49="Melee fight with 48 AIs",
techmino99="Melee fight with 98 AIs", techmino99="Melee fight with 98 AIs",
drought="ERRSEQ flood attack", drought="ERRSEQ flood attack",
hotseat="", hotseat="",
@@ -92,29 +92,44 @@ return{
"Back to Back 10 combo Techrash PC!", "Back to Back 10 combo Techrash PC!",
"Techmino has a Nspire-CX edition!", "Techmino has a Nspire-CX edition!",
"Is B2B2B2B possible?", "Is B2B2B2B possible?",
"MrZ spin Penta!",
"MEGACMB!", "MEGACMB!",
"ALLSPIN!", "ALLSPIN!",
"O spin triple?", "O spin triple?",
"You can play with any input device!", "You can play with any input device!",
"Miya:Nya!", "Miya:Nya!",
"225238922,Bilibili cheers!", "225238922,Bilibili cheers!",
"Playing too much = taking drugs",
"Disappearing doesn't mean useless",
"Try to use two rotate button,three better",
"Small DAS&ARR can make you faster,if you can adapt to it",
"Have you noticed what does \"rotating\" do to block?",
"20G is a brand new game rule",
"Do not play game in class!",
"This game can be very hard,be mentally perpared",
"This in not a casual game",
}, },
stat={ stat={
"Games run:", "Games run:",
"Games played:", "Games played:",
"Game time:", "Game time:",
"Total block used:", "Key pressed:",
"Total rows cleared:", "Rotate:",
"Total lines sent:", "Hold:",
"Total key pressed:", "Block used:",
"Total rotate:", "Rows cleared:",
"Total hold:", "Attack:",
"Total spin:", "Sent:",
"Receive:",
"Pend:",
"Clear:",
"Spin:",
"B2B:",
"PC:",
"Efficiency:",
}, },
help={ help={
"I don't think you need \"help\".", "I don't think you need \"help\".",
"THIS IS ONLY A SMALL BLOCK GAME", "THIS IS ONLY A BLOCK GAME",
"But just play like playing TOP/C2/KOS/TGM3", "But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,so DO NOT DISTIRBUTE", "Game is not public now,so DO NOT DISTIRBUTE",
"", "",
@@ -189,15 +204,16 @@ return{
arrD="-",arrU="+", arrD="-",arrU="+",
sddasD="-",sddasU="+", sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+", sdarrD="-",sdarrU="+",
ctrl="Control settings",
touch="Touch settings",
lang=function()return langName[setting.lang]end,
sfx=function()return setting.sfx and"SFX:ON"or"SFX: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, bgm=function()return setting.bgm and"BGM:ON"or"BGM:OFF"end,
vib=function()return "Vibrate level:"..setting.vib end, vib=function()return "Vibrate level:"..setting.vib end,
fullscreen=function()return setting.fullscreen and"Fullscreen:ON"or"Fullscreen: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, bgblock=function()return setting.bgblock and"BG animation:ON"or"BG animation:OFF"end,
frame=function()return"FrameDraw:"..setting.frameMul.."%"end, frame=function()return"FrameDraw:"..setting.frameMul.."%"end,
control="Control settings", skin="Change Block Skin",
touch="Touch settings",
lang=function()return langName[setting.lang]end,
back="Save&Back", back="Save&Back",
}, },
setting2={ setting2={

View File

@@ -114,7 +114,7 @@ percent0to5={[0]="0%","20%","40%","60%","80%","100%",}
modeID={ modeID={
[0]="custom", [0]="custom",
"sprint","marathon","master","classic","zen","infinite","solo","tsd","blind","dig","survivor","tech", "sprint","marathon","master","classic","zen","infinite","solo","tsd","blind","dig","survivor","tech",
"pctrain","pcchallenge","techmino41","techmino99","drought","hotseat", "pctrain","pcchallenge","techmino49","techmino99","drought","hotseat",
} }
modeLevel={ modeLevel={
sprint={"10L","20L","40L","100L","400L","1000L"}, sprint={"10L","20L","40L","100L","400L","1000L"},
@@ -131,7 +131,7 @@ modeLevel={
tech={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"}, tech={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
pctrain={"NORMAL","EXTRA"}, pctrain={"NORMAL","EXTRA"},
pcchallenge={"NORMAL","HARD","LUNATIC"}, pcchallenge={"NORMAL","HARD","LUNATIC"},
techmino41={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"}, techmino49={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
techmino99={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"}, techmino99={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
drought={"NORMAL","MESS"}, drought={"NORMAL","MESS"},
hotseat={"2P","3P","4P",}, hotseat={"2P","3P","4P",},
@@ -200,27 +200,27 @@ local virtualkeySet={
{80,320,6400,80},--restart {80,320,6400,80},--restart
},--Keyboard set },--Keyboard set
{ {
{1200-360,40,1600,40},--moveLeft {1200-370,40,1600,40},--moveLeft
{1200-280,40,1600,40},--moveRight {1200-280,40,1600,40},--moveRight
{1200-520,40,1600,40},--rotRight {1200-530,40,1600,40},--rotRight
{1200-600,40,1600,40},--rotLeft {1200-610,40,1600,40},--rotLeft
{1200-440,40,1600,40},--rotFlip {1200-450,40,1600,40},--rotFlip
{1200-40,40,1600,40},--hardDrop {1200-50,40,1600,40},--hardDrop
{1200-120,40,1600,40},--softDrop {1200-130,40,1600,40},--softDrop
{1200-200,40,1600,40},--hold {1200-210,40,1600,40},--hold
{1200-680,40,1600,40},--func {1200-690,40,1600,40},--func
{1200-760,40,1600,40},--restart {1200-770,40,1600,40},--restart
},--PC key feedback },--PC key feedback
} }
Buttons={ Buttons={
load={}, load={},
intro={}, intro={},
main={ main={
play= {x=380,y=300,w=240,h=240,rgb=color.red,f=70,code=function()gotoScene("mode")end,down="stat",right="setting"}, play= {x=380,y=300,w=240,h=240,rgb=color.red, f=70,code=function()gotoScene("mode")end,down="stat",right="setting"},
setting={x=640,y=300,w=240,h=240,rgb=color.lightBlue,f=55,code=function()gotoScene("setting")end,down="stat",left="play",right="help"}, setting={x=640,y=300,w=240,h=240,rgb=color.lightBlue, f=55,code=function()gotoScene("setting")end,down="stat",left="play",right="help"},
stat= {x=640,y=560,w=240,h=240,rgb=color.cyan,f=55,code=function()gotoScene("stat")end,up="setting",left="play",right="help"}, stat= {x=640,y=560,w=240,h=240,rgb=color.cyan, f=55,code=function()gotoScene("stat")end,up="setting",left="play",right="help"},
help= {x=900,y=560,w=240,h=240,rgb=color.yellow,f=55,code=function()gotoScene("help")end,up="setting",left="stat",right="quit"}, help= {x=900,y=560,w=240,h=240,rgb=color.yellow, f=55,code=function()gotoScene("help")end,up="setting",left="stat",right="quit"},
quit= {x=1180,y=620,w=120,h=120,rgb=color.lightGrey,f=50,code=function()gotoScene("quit")end,up="setting",left="help"}, quit= {x=1180,y=620,w=120,h=120,rgb=color.lightGrey, f=50,code=function()gotoScene("quit")end,up="setting",left="help"},
}, },
mode={ mode={
up= {x=1000,y=210,w=200,h=140, rgb=color.white, f=64, code=function()keyDown.mode("up")end, hide=function()return modeSel==1 end,}, up= {x=1000,y=210,w=200,h=140, rgb=color.white, f=64, code=function()keyDown.mode("up")end, hide=function()return modeSel==1 end,},
@@ -280,15 +280,21 @@ Buttons={
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="bg",left="grid",right="vib"}, 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="bg",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="bg"}, 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="bg"},
bg= {x=505, y=230, w=210, h=60, rgb=color.white,code=function()setting.bg=not setting.bg end,up="swap",down="arrD",right="fullscreen"}, bg= {x=505, y=230, w=210, h=60, rgb=color.white,code=function()setting.bg=not setting.bg end,up="swap",down="arrD",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"}, 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"}, 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="bg",down="sdarrD",left="dasU",right="arrU"}, arrD= {x=425, y=300, w=50, h=50, rgb=color.white,code=function()setting.arr=(setting.arr-1)%16 end,up="bg",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="bg",down="sdarrU",left="arrD",right="bgblock"},--3~6 arrU= {x=585, y=300, w=50, h=50, rgb=color.white,code=function()setting.arr=(setting.arr+1)%16 end,up="bg",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"}, sddasD= {x=210, y=370, w=50, h=50, rgb=color.white,code=function()setting.sddas=(setting.sddas-1)%11 end,up="dasD",down="ctrl",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"}, sddasU= {x=370, y=370, w=50, h=50, rgb=color.white,code=function()setting.sddas=(setting.sddas+1)%11 end,up="dasU",down="ctrl",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"}, sdarrD= {x=425, y=370, w=50, h=50, rgb=color.white,code=function()setting.sdarr=(setting.sdarr-1)%4 end,up="arrD",down="ctrl",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"}, sdarrU= {x=585, y=370, w=50, h=50, rgb=color.white,code=function()setting.sdarr=(setting.sdarr+1)%4 end,up="arrU",down="ctrl",left="sdarrD",right="frame"},
ctrl= {x=340,y=440, w=310,h=60,rgb=color.green, code=function()gotoScene("setting2")end,up="sddasU",down="touch",left="lang",right="skin"},
touch= {x=340,y=510, w=310,h=60,rgb=color.yellow,code=function()gotoScene("setting3")end,up="ctrl",down="back",right="lang"},
lang= {x=580,y=510, w=150,h=60,rgb=color.red, code=function()
setting.lang=setting.lang%#langName+1
swapLanguage(setting.lang)
end,up="sdarrU",down="back",left="touch",right="skin"},
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"}, 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= {x=940,y=90, w=160, h=60, rgb=color.white,code=function()
@@ -297,8 +303,8 @@ Buttons={
BGM("blank") BGM("blank")
end,down="vib",left="sfx"}, end,down="vib",left="sfx"},
vib= {x=850,y=160, w=340,h=60,rgb=color.white, code=function() vib= {x=850,y=160, w=340,h=60,rgb=color.white, code=function()
setting.vib=(setting.vib+1)%5 setting.vib=(setting.vib+1)%6
VIB(2) VIB(1)
end,up="sfx",down="fullscreen",left="swap"}, end,up="sfx",down="fullscreen",left="swap"},
fullscreen= {x=850,y=230, w=340,h=60,rgb=color.white, code=function() fullscreen= {x=850,y=230, w=340,h=60,rgb=color.white, code=function()
setting.fullscreen=not setting.fullscreen setting.fullscreen=not setting.fullscreen
@@ -318,14 +324,12 @@ Buttons={
frame= {x=850,y=370, w=340,h=60,rgb=color.white, code=function() 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) setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10)
if setting.frameMul>100 then setting.frameMul=25 end if setting.frameMul>100 then setting.frameMul=25 end
end,up="bgblock",down="control",left="sdarrU"}, end,up="bgblock",down="skin",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"}, skin= {x=850,y=440, w=340,h=60,rgb=color.white, code=function()
touch= {x=850,y=510, w=340,h=60,rgb=color.yellow,code=function()gotoScene("setting3")end,up="control",down="back",left="lang"}, setting.skin=setting.skin%4+1
lang= {x=280,y=510, w=200,h=60,rgb=color.red, code=function() changeBlockSkin(setting.skin)
setting.lang=setting.lang%#langName+1 end,up="frame",down="back",left="ctrl"},
swapLanguage(setting.lang) back= {x=640,y=620, w=300,h=70,rgb=color.white, code=back,up="lang"},
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 setting2={--Control setting
back={x=840,y=630,w=180,h=60,rgb=color.white,code=back}, back={x=840,y=630,w=180,h=60,rgb=color.white,code=back},

View File

@@ -3,7 +3,8 @@ local ms,kb=love.mouse,love.keyboard
local fs,sys=love.filesystem,love.system 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 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 sub,gsub,find,format,byte,char=string.sub,string.gsub,string.find,string.format,string.byte,string.char
ins,rem,sort=table.insert,table.remove,table.sort ins,rem,concat=table.insert,table.remove,table.concat
-- sort=table.sort
math.randomseed(os.time()*626) math.randomseed(os.time()*626)
null=function()end null=function()end
@@ -13,9 +14,10 @@ scene=""
bgmPlaying=nil bgmPlaying=nil
curBG="none" curBG="none"
kb.setKeyRepeat(false) local F=false
kb.setTextInput(false) kb.setKeyRepeat(F)
ms.setVisible(false) kb.setTextInput(F)
ms.setVisible(F)
local Fonts={} local Fonts={}
function setFont(s) function setFont(s)
@@ -36,8 +38,8 @@ gameEnv0={
das=10,arr=2, das=10,arr=2,
sddas=0,sdarr=2, sddas=0,sdarr=2,
ghost=true,center=true, ghost=true,center=true,
grid=false,swap=true, grid=F,swap=true,
_20G=false,bone=false, _20G=F,bone=F,
drop=30,lock=45, drop=30,lock=45,
wait=0,fall=0, wait=0,fall=0,
next=6,hold=true,oncehold=true, next=6,hold=true,oncehold=true,
@@ -45,24 +47,21 @@ gameEnv0={
block=true, block=true,
keepVisible=true,visible="show", keepVisible=true,visible="show",
Fkey=false,puzzle=false,ospin=true, Fkey=F,puzzle=F,ospin=true,
freshLimit=1e99,target=1e99,reach=null, freshLimit=1e99,target=1e99,reach=null,
bg="none",bgm="race" bg="none",bgm="race"
} }
customSel={ customSel={
drop=20, drop=22,lock=22,
lock=20, wait=1,fall=1,
wait=1, next=7,hold=3,
fall=1,
next=7,
hold=1,
sequence=1, sequence=1,
visible=1, visible=1,
target=4, target=8,
freshLimit=3, freshLimit=4,
opponent=1, opponent=1,
} }
preField={}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end preField={h=20}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
freeRow={} freeRow={}
for i=1,40 do for i=1,40 do
freeRow[i]={0,0,0,0,0,0,0,0,0,0} freeRow[i]={0,0,0,0,0,0,0,0,0,0}
@@ -70,16 +69,16 @@ end
--Game system Data --Game system Data
setting={ setting={
ghost=true,center=true, ghost=true,center=true,
grid=false,swap=true, grid=F,swap=true,
fxs=true,bg=true, fxs=true,bg=true,
das=10,arr=2, das=10,arr=2,
sddas=0,sdarr=2, sddas=0,sdarr=2,
lang=1,
sfx=true,bgm=true,vib=3, sfx=true,bgm=true,vib=3,
fullscreen=false, fullscreen=F,
bgblock=true, bgblock=true,
lang=1, skin=1,
keyMap={ keyMap={
{"left","right","x","z","c","up","down","space","tab","r","","",""}, {"left","right","x","z","c","up","down","space","tab","r","","",""},
{"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""},
@@ -98,12 +97,6 @@ setting={
{"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""},
},--keyboard & joystick },--keyboard & joystick
keyLib={
{1},
{2},
{3},
{4},
},--Players' key setting(s)
virtualkey={ virtualkey={
{80,720-80,6400,80},--moveLeft {80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight {240,720-80,6400,80},--moveRight
@@ -117,20 +110,16 @@ setting={
}, },
virtualkeyAlpha=3, virtualkeyAlpha=3,
virtualkeyIcon=true, virtualkeyIcon=true,
virtualkeySwitch=false, virtualkeySwitch=F,
frameMul=100, frameMul=100,
} }
stat={ stat={
run=0, run=0,game=0,time=0,
game=0, key=0,rotate=0,hold=0,piece=0,row=0,
gametime=0, atk=0,send=0,recv=0,pend=0,
piece=0, clear_1=0,clear_2=0,clear_3=0,clear_4=0,
row=0, spin_0=0,spin_1=0,spin_2=0,spin_3=0,
atk=0, b2b=0,b3b=0,pc=0,
key=0,
hold=0,
rotate=0,
spin=0,
} }
virtualkey={ virtualkey={
{80,720-80,6400,80},--moveLeft {80,720-80,6400,80},--moveLeft
@@ -150,7 +139,7 @@ virtualkey={
]] ]]
} }
virtualkeyDown={false,false,false,false,false,false,false,false,false,false,false,false,false} virtualkeyDown={F,F,F,F,F,F,F,F,F,F,F,F,F}
virtualkeyPressTime={0,0,0,0,0,0,0,0,0,0,0,0,0} virtualkeyPressTime={0,0,0,0,0,0,0,0,0,0,0,0,0}
--User Data&User Setting --User Data&User Setting
require"toolfunc" require"toolfunc"
@@ -172,6 +161,8 @@ if fs.getInfo("usersetting")then
loadSetting() loadSetting()
elseif system=="Android" or system=="iOS"then elseif system=="Android" or system=="iOS"then
setting.virtualkeySwitch=true setting.virtualkeySwitch=true
setting.swap=false setting.swap=F
end end
swapLanguage(setting.lang)
swapLanguage(setting.lang)
changeBlockSkin(setting.skin)

179
paint.lua
View File

@@ -37,7 +37,51 @@ local modeLevelColor={
["400L"]=color.red, ["400L"]=color.red,
["1000L"]=color.darkRed, ["1000L"]=color.darkRed,
} }
local dataOptL={"key","rotate","hold",nil,nil,nil,"send","recv","pend"}
local function dataOpt(i)
local stat=players[1].stat
if i==4 then
return stat.piece.." "..(int(stat.piece/stat.time*100)*.01).."PPS"
elseif i==5 then
return stat.row.." "..(int(stat.row/stat.time*600)*.1).."LPM"
elseif i==6 then
return stat.atk.." "..(int(stat.atk/stat.time*600)*.1).."APM"
elseif i<10 then
return stat[dataOptL[i]]
elseif i==10 then
return stat.clear_1.."/"..stat.clear_2.."/"..stat.clear_3.."/"..stat.clear_4
elseif i==11 then
return "["..stat.spin_0.."]/"..stat.spin_1.."/"..stat.spin_2.."/"..stat.spin_3
elseif i==12 then
return stat.b2b.."[+"..stat.b3b.."]"
elseif i==13 then
return stat.pc
elseif i==14 then
return format("%0.2f",stat.atk/stat.row)
end
end
local statOptL={
"run","game",nil,
"key","rotate","hold","piece","row",
"atk","send","recv","pend",
}
local function statOpt(i)
if i<13 and i~=3 then
return stat[statOptL[i]]
elseif i==3 then
return format("%0.1fHr",stat.time*2.78e-4)
elseif i==13 then
return stat.clear_1.."/"..stat.clear_2.."/"..stat.clear_3.."/"..stat.clear_4
elseif i==14 then
return "["..stat.spin_0.."]/"..stat.spin_1.."/"..stat.spin_2.."/"..stat.spin_3
elseif i==15 then
return stat.b2b.."[+"..stat.b3b.."]"
elseif i==16 then
return stat.pc
elseif i==17 then
return format("%0.2f",stat.atk/stat.row)
end
end
local miniTitle_rect={ local miniTitle_rect={
{2,0,5,1},{4,1,1,6}, {2,0,5,1},{4,1,1,6},
{9,0,4,1},{9,3,4,1},{9,6,4,1},{8,0,1,7}, {9,0,4,1},{9,3,4,1},{9,6,4,1},{8,0,1,7},
@@ -127,39 +171,6 @@ FX={
end, end,
} }
function updateButton()
for k,B in next,Buttons[scene]do
local t=B==Buttons.sel and .4 or 0
B.alpha=abs(B.alpha-t)>.02 and(B.alpha+(B.alpha<t and .02 or -.02))or t
if B.alpha>t then B.alpha=B.alpha-.02 elseif B.alpha<t then B.alpha=B.alpha+.02 end
end
end
function drawButton()
for k,B in next,Buttons[scene]do
if not(B.hide and B.hide())then
local C=B.rgb or color.white
gc.setColor(C[1],C[2],C[3],B.alpha)
gc.rectangle("fill",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h)
gc.setColor(C)
gc.setLineWidth(3)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
gc.setColor(C[1],C[2],C[3],.3)
gc.setLineWidth(5)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
local t=B.t
local y0
if t then
if type(t)=="function"then t=t()end
setFont(B.f or 40)
y0=B.y-currentFont*.64
gc.printf(t,B.x-201,y0+2,400,"center")
gc.printf(t,B.x-199,y0+2,400,"center")
gc.printf(t,B.x-201,y0,400,"center")
gc.printf(t,B.x-199,y0,400,"center")
gc.setColor(C)
mStr(t,B.x,y0+1)
end
end
end
end
function drawDial(x,y,speed) function drawDial(x,y,speed)
gc.setColor(1,1,1) gc.setColor(1,1,1)
mStr(int(speed),x,y-18) mStr(int(speed),x,y-18)
@@ -232,6 +243,28 @@ function Pnt.BG.game3()
gc.setColor(.6,.6,1) gc.setColor(.6,.6,1)
gc.draw(background1,640,360,Timer()*.25,12,nil,64,64) gc.draw(background1,640,360,Timer()*.25,12,nil,64,64)
end end
function Pnt.BG.game4()
gc.setColor(.1,.5,.5)
local x=Timer()%4*320
gc.draw(background2,x,0,nil,10)
gc.draw(background2,x-1280,0,nil,10)
end
function Pnt.BG.game5()
local t=2.5-Timer()%20%6%2.5
if t<.5 then gc.clear(t,t,t)
else gc.clear(0,0,0)
end
end
local scs={{1,2},nil,nil,nil,nil,{1.5,1.5},{0.5,2.5}}for i=2,5 do scs[i]=scs[1]end
function Pnt.BG.game6()
local t=1.2-Timer()%10%3%1.2
if t<.5 then gc.clear(t,t,t)
else gc.clear(0,0,0)
end
gc.setColor(.3,.3,.3)
local r=7-int(Timer()*.5)%7
gc.draw(mouseBlock[r],640,360,Timer()%pi*6,400,400,scs[r][2]-.5,#blocks[r][0]-scs[r][1]+.5)
end
function Pnt.BG.rgb() function Pnt.BG.rgb()
gc.clear( gc.clear(
sin(Timer()*1.2)*.15+.5, sin(Timer()*1.2)*.15+.5,
@@ -288,7 +321,7 @@ function Pnt.main()
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(titleImage,300,30) gc.draw(titleImage,300,30)
setFont(30) setFont(30)
gc.print("Alpha V0.7.15",290,140) gc.print("Alpha V0.7.18",290,140)
gc.print(system,800,110) gc.print(system,800,110)
end end
function Pnt.mode() function Pnt.mode()
@@ -313,9 +346,8 @@ end
function Pnt.custom() function Pnt.custom()
gc.setColor(1,1,1,.3+sin(Timer()*8)*.2) gc.setColor(1,1,1,.3+sin(Timer()*8)*.2)
gc.rectangle("fill",25,95+40*optSel,465,40) gc.rectangle("fill",25,95+40*optSel,465,40)
setFont(80) gc.setColor(.8,.8,.8)gc.draw(drawableText.custom,20,20)
gc.setColor(.8,.8,.8)gc.print(text.custom,20,20) gc.setColor(1,1,1)gc.draw(drawableText.custom,22,23)
gc.setColor(1,1,1)gc.print(text.custom,22,23)
setFont(40) setFont(40)
for i=1,#customID do for i=1,#customID do
local k=customID[i] local k=customID[i]
@@ -384,8 +416,10 @@ function Pnt.play()
end--Field end--Field
gc.setScissor() gc.setScissor()
gc.translate(0,-P.fieldBeneath*.2) gc.translate(0,-P.fieldBeneath*.2)
gc.setLineWidth(2) if P.alive then
gc.setColor(frameColor[P.strength])gc.rectangle("line",-1,-1,62,122)--Draw boarder gc.setLineWidth(2)
gc.setColor(frameColor[P.strength])gc.rectangle("line",-1,-1,62,122)
end--Draw boarder
if modeEnv.royaleMode then if modeEnv.royaleMode then
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,P.strength do for i=1,P.strength do
@@ -408,7 +442,7 @@ function Pnt.play()
gc.translate(P.x,P.y)gc.scale(P.size)--Position gc.translate(P.x,P.y)gc.scale(P.size)--Position
gc.setColor(0,0,0,.6)gc.rectangle("fill",0,0,600,690)--Background gc.setColor(0,0,0,.6)gc.rectangle("fill",0,0,600,690)--Background
gc.setLineWidth(7) gc.setLineWidth(7)
gc.setColor(frameColor[P.strength])gc.rectangle("line",0,0,600,690)--Big frame gc.setColor(frameColor[P.strength])gc.rectangle("line",0,0,600,690,3)--Big frame
gc.translate(150,70) gc.translate(150,70)
if P.gameEnv.grid then if P.gameEnv.grid then
gc.setLineWidth(1) gc.setLineWidth(1)
@@ -528,7 +562,7 @@ function Pnt.play()
if P.gameEnv.hold then if P.gameEnv.hold then
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(drawableText.hold,-124,-10) mDraw(drawableText.hold,-82,-10)
for i=1,#P.hold.bk do for i=1,#P.hold.bk do
for j=1,#P.hold.bk[1] do for j=1,#P.hold.bk[1] do
if P.hold.bk[i][j]then if P.hold.bk[i][j]then
@@ -537,7 +571,7 @@ function Pnt.play()
end end
end end
end--Hold end--Hold
gc.draw(drawableText.next,340,-10) mDraw(drawableText.next,381,-10)
local N=1 local N=1
::L:: ::L::
local b,c=P.next[N].bk,P.next[N].color local b,c=P.next[N].bk,P.next[N].color
@@ -569,7 +603,7 @@ function Pnt.play()
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(35) setFont(35)
mStr(format("%.2f",P.time),-82,520)--Draw time mStr(format("%.2f",P.stat.time),-82,520)--Draw time
if mesDisp[curMode.id]then mesDisp[curMode.id]()end--Draw other message if mesDisp[curMode.id]then mesDisp[curMode.id]()end--Draw other message
gc.setColor(1,1,1) gc.setColor(1,1,1)
@@ -618,19 +652,34 @@ function Pnt.play()
end end
end end
end end
if restartCount>0 then
gc.setColor(0,0,0,restartCount/17)
gc.rectangle("fill",0,0,1280,720)
end
end end
function Pnt.pause() function Pnt.pause()
gc.setColor(0,0,0,pauseTime*.015) Pnt.play()
gc.setColor(0,0,0,pauseTimer*.015)
gc.rectangle("fill",0,0,1280,720) gc.rectangle("fill",0,0,1280,720)
gc.setColor(1,1,1,pauseTimer*.02)
setFont(30)
if pauseCount>0 then
gc.print(text.pauseTime..":["..pauseCount.."] "..format("%0.2f",pauseTime).."s",110,150)
end
for i=1,7 do
gc.print(text.stat[i+3],110,30*i+270)
gc.print(dataOpt(i),305,30*i+270)
end
for i=8,14 do
gc.print(text.stat[i+3],860,30*i+60)
gc.print(dataOpt(i),1000,30*i+60)
end
setFont(40)
if system~="Android"then if system~="Android"then
setFont(40)
gc.setColor(1,1,1,pauseTime*.02)
mStr(text.space.."/"..text.enter,640,300) mStr(text.space.."/"..text.enter,640,300)
gc.print("ESC",610,598) gc.print("ESC",610,598)
end end
setFont(120) mDraw(gamefinished and drawableText.finish or drawableText.pause,640,140-12*(5-pauseTimer*.1)^2)
gc.setColor(1,1,1)
mStr(text.pause,640,140-12*(5-pauseTime*.1)^2)
end end
function Pnt.setting() function Pnt.setting()
gc.setColor(1,1,1) gc.setColor(1,1,1)
@@ -640,6 +689,7 @@ function Pnt.setting()
setFont(18) setFont(18)
mStr(text.softdropdas..setting.sddas,290,361) mStr(text.softdropdas..setting.sddas,290,361)
mStr(text.softdroparr..setting.sdarr,506,361) mStr(text.softdroparr..setting.sdarr,506,361)
gc.draw(blockSkin[7-int(Timer()*2)%7],820,480,nil,2)
end end
function Pnt.setting2() function Pnt.setting2()
local a=.3+sin(Timer()*15)*.1 local a=.3+sin(Timer()*15)*.1
@@ -669,11 +719,12 @@ function Pnt.setting2()
gc.line(200*x-160,30,200*x-160,550) gc.line(200*x-160,30,200*x-160,550)
end end
gc.line(40,550,640,550) gc.line(40,550,640,550)
mStr(text.keyboard,340,0) mDraw(drawableText.keyboard,340,0)
mStr(text.joystick,540,0) mDraw(drawableText.joystick,540,0)
gc.print(text.setting2Help,50,620) gc.draw(drawableText.setting2Help,50,620)
setFont(40) setFont(40)
gc.print("< P"..curBoard.."/P8 >",430,570) gc.print("P"..int(curBoard*.5+.5).."/P4",420,560)
gc.print(curBoard.."/8",580,560)
end end
function Pnt.setting3() function Pnt.setting3()
VirtualkeyPreview() VirtualkeyPreview()
@@ -696,6 +747,9 @@ function Pnt.help()
gc.printf(text.help[i],140,15+43*i,1000,"center") gc.printf(text.help[i],140,15+43*i,1000,"center")
end end
gc.draw(titleImage,180,600,.2,.7+.05*sin(Timer()*2),nil,140,100) gc.draw(titleImage,180,600,.2,.7+.05*sin(Timer()*2),nil,140,100)
gc.setLineWidth(5)
gc.rectangle("line",17,17,260,260)
gc.rectangle("line",1077,17,186,186)
gc.draw(payCode,20,20) gc.draw(payCode,20,20)
gc.draw(groupCode,1080,20) gc.draw(groupCode,1080,20)
gc.setColor(1,1,1,sin(Timer()*10)*.5+.5) gc.setColor(1,1,1,sin(Timer()*10)*.5+.5)
@@ -705,18 +759,11 @@ function Pnt.help()
mStr(text.group,1170,210) mStr(text.group,1170,210)
end end
function Pnt.stat() function Pnt.stat()
setFont(35) setFont(28)
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,10 do gc.print(text.stat[i],350,20+40*i)end for i=1,17 do
gc.print(stat.run,650,60) gc.print(text.stat[i],400,30*i-5)
gc.print(stat.game,650,100) gc.print(statOpt(i),720,30*i-5)
gc.print(format("%0.1fhr",stat.gametime*2.78e-4),650,140) end
gc.print(stat.piece,650,180)
gc.print(stat.row,650,220)
gc.print(stat.atk,650,260)
gc.print(stat.key,650,300)
gc.print(stat.rotate,650,340)
gc.print(stat.hold,650,380)
gc.print(stat.spin,650,420)
gc.draw(titleImage,260,570,.2+.07*sin(Timer()*3),.8,nil,250,60) gc.draw(titleImage,260,570,.2+.07*sin(Timer()*3),.8,nil,250,60)
end end

View File

@@ -8,17 +8,12 @@ local function C(x,y)
end end
gc.setDefaultFilter("nearest","nearest") gc.setDefaultFilter("nearest","nearest")
local blockImg=N("/image/block/1.png") blockImg=N("/image/block.png")
blockSkin,blockSkinmini={},{} blockSkin,blockSkinmini={},{}
for i=1,13 do for i=1,13 do
C(30,30) blockSkin[i]=C(30,30)
gc.draw(blockImg,30-30*i,0) blockSkinmini[i]=C(6,6)
blockSkin[i]=c
C(6,6)
gc.draw(blockImg,6-6*i,0,nil,.2)
blockSkinmini[i]=c
end end
blockImg:release()
virtualkeyIcon={} virtualkeyIcon={}
for i=1,10 do for i=1,10 do
@@ -87,9 +82,12 @@ drawableText={
x=T(110,"×"), x=T(110,"×"),
bpm=T(15,"BPM"), bpm=T(15,"BPM"),
kpm=T(15,"KPM"), kpm=T(15,"KPM"),
modeName=T(30),
levelName=T(30), modeName=T(30),levelName=T(30),
next=T(40), next=T(40),hold=T(40),
hold=T(40), pause=T(120),
custom=T(80),
keyboard=T(25),joystick=T(25),
setting2Help=T(25),
} }
c=gc.setCanvas() c=gc.setCanvas()

View File

@@ -1,3 +1,4 @@
local wd=love.window
local Timer=love.timer.getTime local Timer=love.timer.getTime
Tmr={} Tmr={}
@@ -50,8 +51,7 @@ function Tmr.draw()
end end
function Tmr.play(dt) function Tmr.play(dt)
frame=frame+1 frame=frame+1
stat.gametime=stat.gametime+dt stat.time=stat.time+dt
for i=#FX.beam,1,-1 do for i=#FX.beam,1,-1 do
local b=FX.beam[i] local b=FX.beam[i]
b.t=b.t+1 b.t=b.t+1
@@ -92,11 +92,21 @@ function Tmr.play(dt)
P.moving=0 P.moving=0
end end
end end
if restartCount>0 then restartCount=restartCount-1 end
return return
end--Counting,include pre-das,directy RETURN elseif players[1].keyPressing[10]then
restartCount=restartCount+1
if restartCount>17 then
clearTask("play")
updateStat()
resetGameData()
end
elseif restartCount>0 then
restartCount=max(restartCount-2,0)
end--Counting,include pre-das,directy RETURN,or restart counting
for p=1,#players do for p=1,#players do
P=players[p] P=players[p]
if P.timing then P.time=P.time+dt end if P.timing then P.stat.time=P.stat.time+dt end
if P.alive then if P.alive then
if not P.small then if not P.small then
local v=0 local v=0
@@ -124,9 +134,9 @@ function Tmr.play(dt)
else else
AI_getControls(P.ai.controls) AI_getControls(P.ai.controls)
P.ai.controlDelay=P.ai.controlDelay0+2 P.ai.controlDelay=P.ai.controlDelay0+2
if Timer()-P.cstat.point>P.cstat.event then if Timer()-P.modeData.point>P.modeData.event then
P.cstat.point=Timer() P.modeData.point=Timer()
P.cstat.event=P.ai.controlDelay0+rnd(2,10) P.modeData.event=P.ai.controlDelay0+rnd(2,10)
changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.35 and 2 or 3) changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.35 and 2 or 3)
end end
end end
@@ -210,8 +220,8 @@ function Tmr.play(dt)
--Alive --Alive
else else
if not P.small then if not P.small then
P.keySpeed=P.keySpeed*.96+P.cstat.key/P.time*60*.04 P.keySpeed=P.keySpeed*.96+P.stat.key/P.stat.time*60*.04
P.dropSpeed=P.dropSpeed*.96+P.cstat.piece/P.time*60*.04 P.dropSpeed=P.dropSpeed*.96+P.stat.piece/P.stat.time*60*.04
--Final average speeds --Final average speeds
if modeEnv.royaleMode then if modeEnv.royaleMode then
P.swappingAtkMode=min(P.swappingAtkMode+2,30) P.swappingAtkMode=min(P.swappingAtkMode+2,30)
@@ -276,7 +286,10 @@ function Tmr.play(dt)
if modeEnv.royaleMode and frame%120==0 then freshMostDangerous()end if modeEnv.royaleMode and frame%120==0 then freshMostDangerous()end
end end
function Tmr.pause(dt) function Tmr.pause(dt)
if pauseTime<50 then if not gamefinished then
pauseTime=pauseTime+1 pauseTime=pauseTime+dt
end
if pauseTimer<50 and not wd.isMinimized()then
pauseTimer=pauseTimer+1
end end
end end

View File

@@ -14,7 +14,10 @@ local function splitS(s,sep)
return t return t
end end
function mStr(s,x,y) function mStr(s,x,y)
gc.printf(s,x-300,y,600,"center") gc.printf(s,x-320,y,640,"center")
end
function mDraw(s,x,y)
gc.draw(s,x-s:getWidth()*.5,y)
end end
function getNewRow(val) function getNewRow(val)
@@ -36,8 +39,17 @@ function removeRow(t,k)
end end
--Single-usage funcs --Single-usage funcs
langName={"中文","English"} langName={"中文","全中文","English"}
local langID={"chi","eng"} local langID={"chi","chi_full","eng"}
local drawableTextLoad={
"next",
"hold",
"pause",
"custom",
"keyboard",
"joystick",
"setting2Help",
}
function swapLanguage(l) function swapLanguage(l)
text=require("language/"..langID[l]) text=require("language/"..langID[l])
Buttons.sel=nil Buttons.sel=nil
@@ -47,8 +59,6 @@ function swapLanguage(l)
B.t=text.ButtonText[S][N] B.t=text.ButtonText[S][N]
end end
end end
drawableText.next:set(text.next)
drawableText.hold:set(text.hold)
if royaleCtrlPad then royaleCtrlPad:release()end if royaleCtrlPad then royaleCtrlPad:release()end
gc.push("transform") gc.push("transform")
gc.origin() gc.origin()
@@ -63,10 +73,23 @@ function swapLanguage(l)
end end
gc.setCanvas() gc.setCanvas()
gc.pop() gc.pop()
for _,s in next,drawableTextLoad do
drawableText[s]:set(text[s])
end
collectgarbage() collectgarbage()
end end
function changeBlockSkin(n)
n=n-1
for i=1,13 do
gc.setCanvas(blockSkin[i])
gc.draw(blockImg,30-30*i,-30*n)
gc.setCanvas(blockSkinmini[i])
gc.draw(blockImg,6-6*i,-6*n,nil,.2)
end
gc.setCanvas()
end
local vibrateLevel={0,0,.03,.04,.05,.07,.9} local vibrateLevel={0,.02,.03,.04,.05,.06,.07,.08}
function VIB(t) function VIB(t)
if setting.vib>0 then if setting.vib>0 then
love.system.vibrate(vibrateLevel[setting.vib+t]) love.system.vibrate(vibrateLevel[setting.vib+t])
@@ -175,6 +198,12 @@ function gotoScene(s,style)
end end
end end
end end
function updateStat()
for k,v in next,players[1].stat do
print(k)
stat[k]=stat[k]+v
end
end
local prevMenu={ local prevMenu={
load=love.event.quit, load=love.event.quit,
intro="quit", intro="quit",
@@ -187,13 +216,11 @@ local prevMenu={
end, end,
ready="mode", ready="mode",
play=function() play=function()
updateStat()
clearTask("play") clearTask("play")
gotoScene(curMode.id~="custom"and"mode"or"custom","deck") gotoScene(curMode.id~="custom"and"mode"or"custom","deck")
end, end,
pause=function() pause=null,
clearTask("play")
gotoScene(curMode.id~="custom"and"mode"or"custom","deck")
end,
help="main", help="main",
stat="main", stat="main",
setting=function() setting=function()
@@ -202,7 +229,7 @@ local prevMenu={
end, end,
setting2="setting", setting2="setting",
setting3="setting", setting3="setting",
} }prevMenu.pause=prevMenu.play
function back() function back()
local t=prevMenu[scene] local t=prevMenu[scene]
if type(t)=="string"then if type(t)=="string"then
@@ -212,7 +239,11 @@ function back()
end end
end end
function pauseGame() function pauseGame()
if bgmPlaying then bgm[bgmPlaying]:pause()end pauseTimer=0--Pause timer for animation
if not gamefinished then
pauseCount=pauseCount+1
if bgmPlaying then bgm[bgmPlaying]:pause()end
end
for i=1,#players.alive do for i=1,#players.alive do
local l=players.alive[i].keyPressing local l=players.alive[i].keyPressing
for j=1,#l do for j=1,#l do
@@ -228,35 +259,12 @@ function resumeGame()
gotoScene("play","fade") gotoScene("play","fade")
end end
local dataOpt={ local dataOpt={
"run", "run","game","time",
"game", "key","rotate","hold","piece","row",
"gametime", "atk","send","recv","pend",
"piece", "clear_1","clear_2","clear_3","clear_4",
"row", "spin_0","spin_1","spin_2","spin_3",
"atk", "b2b","b3b","pc",
"key",
"rotate",
"hold",
"spin",
}
local saveOpt={
"ghost","center",
"grid","swap",
"fxs","bg",
"das","arr",
"sddas","sdarr",
"lang",
"sfx","bgm",
"vib",
"fullscreen",
"bgblock",
"virtualkeyAlpha",
"virtualkeyIcon",
"virtualkeySwitch",
"frameMul",
} }
function loadData() function loadData()
userData:open("r") userData:open("r")
@@ -268,10 +276,15 @@ function loadData()
if find(i,"=")then if find(i,"=")then
local t=sub(i,1,find(i,"=")-1) local t=sub(i,1,find(i,"=")-1)
local v=sub(i,find(i,"=")+1) local v=sub(i,find(i,"=")+1)
if t=="run"or t=="game"or t=="gametime"or t=="piece"or t=="row"or t=="atk"or t=="key"or t=="rotate"or t=="hold"or t=="spin"then if t=="gametime"then t="time"end
for i=1,#dataOpt do
if t==dataOpt[i]then goto L end
end
goto E
::L::
v=toN(v)if not v or v<0 then v=0 end v=toN(v)if not v or v<0 then v=0 end
stat[t]=v stat[t]=v
end ::E::
end end
end end
end end
@@ -280,7 +293,7 @@ function saveData()
for i=1,#dataOpt do for i=1,#dataOpt do
ins(t,dataOpt[i].."="..toS(stat[dataOpt[i]])) ins(t,dataOpt[i].."="..toS(stat[dataOpt[i]]))
end end
t=table.concat(t,"\r\n") t=concat(t,"\r\n")
--t=love.math.compress(t,"zlib"):getString() --t=love.math.compress(t,"zlib"):getString()
userData:open("w") userData:open("w")
userData:write(t) userData:write(t)
@@ -299,7 +312,7 @@ function loadSetting()
if t=="sfx"or t=="bgm"or t=="bgblock"then if t=="sfx"or t=="bgm"or t=="bgblock"then
setting[t]=v=="true" setting[t]=v=="true"
elseif t=="vib"then elseif t=="vib"then
setting.vib=toN(v:match("[01234]"))or 0 setting.vib=toN(v:match("[012345]"))or 0
elseif t=="fullscreen"then elseif t=="fullscreen"then
setting.fullscreen=v=="true" setting.fullscreen=v=="true"
love.window.setFullscreen(setting.fullscreen) love.window.setFullscreen(setting.fullscreen)
@@ -311,21 +324,6 @@ function loadSetting()
setting.keyMap[i][j]=v1[j] setting.keyMap[i][j]=v1[j]
end end
end end
elseif t=="keylib"then
v=splitS(v,"/")
for i=1,4 do
local v1=splitS(v[i],",")
for j=1,#v1 do
setting.keyLib[i][j]=toN(v1[j])
end
for j=1,#setting.keyLib[i]do
local v=setting.keyLib[i][j]
if int(v)~=v or v>=9 or v<=0 then
setting.keyLib[i]={i}
break
end
end
end
elseif t=="virtualkey"then elseif t=="virtualkey"then
v=splitS(v,"/") v=splitS(v,"/")
for i=1,10 do for i=1,10 do
@@ -348,36 +346,51 @@ function loadSetting()
elseif t=="ghost"or t=="center"or t=="grid"or t=="swap"or t=="fxs"or t=="bg"then elseif t=="ghost"or t=="center"or t=="grid"or t=="swap"or t=="fxs"or t=="bg"then
setting[t]=v=="true" setting[t]=v=="true"
elseif t=="lang"then elseif t=="lang"then
setting[t]=toN(v:match("[12]"))or 1 setting[t]=toN(v:match("[123]"))or 1
elseif t=="skin"then
setting[t]=toN(v:match("[1234]"))or 1
end end
end end
end end
end end
local saveOpt={
"ghost","center",
"grid","swap",
"fxs","bg",
"das","arr",
"sddas","sdarr",
"lang",
"sfx","bgm",
"vib",
"fullscreen",
"bgblock",
"skin",
"virtualkeyAlpha",
"virtualkeyIcon",
"virtualkeySwitch",
"frameMul",
}
function saveSetting() function saveSetting()
local vk={} local vk={}
for i=1,10 do for i=1,10 do
for j=1,4 do for j=1,4 do
virtualkey[i][j]=int(virtualkey[i][j]+.5) virtualkey[i][j]=int(virtualkey[i][j]+.5)
end--Saving a integer is better? end--Saving a integer is better?
vk[i]=table.concat(virtualkey[i],",") vk[i]=concat(virtualkey[i],",")
end--pre-pack virtualkey setting end--pre-pack virtualkey setting
local map={} local map={}
for i=1,16 do for i=1,16 do
map[i]=table.concat(setting.keyMap[i],",") map[i]=concat(setting.keyMap[i],",")
end
local lib={}
for i=1,4 do
lib[i]=table.concat(setting.keyLib[i],",")
end end
local t={ local t={
"keymap="..toS(table.concat(map,"/")), "keymap="..toS(concat(map,"/")),
"keylib="..toS(table.concat(lib,"/")), "virtualkey="..toS(concat(vk,"/")),
"virtualkey="..toS(table.concat(vk,"/")),
} }
for i=1,#saveOpt do for i=1,#saveOpt do
ins(t,saveOpt[i].."="..toS(setting[saveOpt[i]])) ins(t,saveOpt[i].."="..toS(setting[saveOpt[i]]))
end end
t=table.concat(t,"\r\n") t=concat(t,"\r\n")
--t=love.math.compress(t,"zlib"):getString() --t=love.math.compress(t,"zlib"):getString()
userSetting:open("w") userSetting:open("w")
userSetting:write(t) userSetting:write(t)