Compare commits

..

4 Commits

Author SHA1 Message Date
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
MrZ_26
849e5b586e Alpha V0.7.15 2020-02-04 19:33:41 +08:00
MrZ_26
f82e979f9c Alpha V0.7.14 2020-02-04 19:33:20 +08:00
20 changed files with 1487 additions and 913 deletions

Binary file not shown.

BIN
SFX/swipe.ogg Normal file

Binary file not shown.

8
ai.lua
View File

@@ -60,7 +60,7 @@ function resetField(f0,f,start)
goto L goto L
end end
for i=start,#f0 do for i=start,#f0 do
f[i]=getNewRow() f[i]=getNewRow(0)
for j=1,10 do for j=1,10 do
f[i][j]=f0[i][j] f[i][j]=f0[i][j]
end end
@@ -69,7 +69,7 @@ end
function getScore(field,bn,cb,cx,cy) function getScore(field,bn,cb,cx,cy)
local score=0 local score=0
local highest=0 local highest=0
local height=getNewRow() local height=getNewRow(0)
local clear=0 local clear=0
local hole=0 local hole=0
@@ -124,7 +124,7 @@ function AI_getControls(ctrl)
local Tfield={}--test field local Tfield={}--test field
local field_org=P.field local field_org=P.field
for i=1,#field_org do for i=1,#field_org do
Tfield[i]=getNewRow() Tfield[i]=getNewRow(0)
for j=1,10 do for j=1,10 do
Tfield[i][j]=field_org[i][j] Tfield[i][j]=field_org[i][j]
end end
@@ -142,7 +142,7 @@ function AI_getControls(ctrl)
end--move to bottom end--move to bottom
for i=1,#cb do for i=1,#cb do
local y=cy+i-1 local y=cy+i-1
if not Tfield[y]then Tfield[y]=getNewRow()end if not Tfield[y]then Tfield[y]=getNewRow(0)end
for j=1,#cb[1]do for j=1,#cb[1]do
if cb[i][j]then if cb[i][j]then
Tfield[y][cx+j-1]=1 Tfield[y][cx+j-1]=1

View File

@@ -1,83 +1,80 @@
local gc=love.graphics local gc,tm=love.graphics,love.timer
local tm=love.timer local ms,kb,tc=love.mouse,love.keyboard,love.touch
local ms=love.mouse
local tc=love.touch
local wd=love.window local wd=love.window
local setFont=setFont local setFont=setFont
local Timer=tm.getTime local Timer=tm.getTime
local ww,wh=gc.getWidth(),gc.getHeight() local scr=scr
local xOy=love.math.newTransform() local xOy=love.math.newTransform()
local focus=true local focus=true
local mx,my,mouseShow=-20,-20,false local mx,my,mouseShow=-20,-20,false
local touching=nil--1st touching ID local touching=nil--1st touching ID
local sceneInit={ local sceneInit={
load=function() load=function()
curBG="none"
keeprun=true
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)]
end, end,
intro=function() intro=function()
curBG="none"
count=0 count=0
keeprun=true BGM("blank")
end, end,
main=function() main=function()
curBG="none"
keeprun=true
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")
keeprun=true
end, end,
custom=function() custom=function()
optSel=optSel or 1 optSel=optSel or 1
curBG="matrix" curBG="matrix"
keeprun=true BGM("blank")
end,
draw=function()
kb.setKeyRepeat(true)
clearSureTime=0
pen=1
sx,sy=1,1
end, end,
play=function() play=function()
keeprun=false if needResetGameData then
resetGameData() resetGameData()
sysSFX("ready") needResetGameData=nil
end
end,
pause=function()
end, end,
setting=function() setting=function()
curBG="none" curBG="none"
keeprun=true
end, end,
setting2=function() setting2=function()
curBG="none" curBoard=1
keeprun=true keyboardSet=1
curBoard=1 joystickSet=1
keyboardSet=1 keyboardSetting=false
joystickSet=1 joystickSetting=false
keyboardSetting=false
joystickSetting=false
end,--Control settings end,--Control settings
setting3=function() setting3=function()
curBG="game1" curBG="game1"
keeprun=true
defaultSel=1 defaultSel=1
sel=nil sel=nil
snapLevel=1 snapLevel=1
end,--Touch setting end,--Touch setting
help=function() help=function()
curBG="none"
keeprun=true
end, end,
stat=function() stat=function()
curBG="none"
keeprun=true
end, end,
quit=function() quit=function()
love.event.quit() love.event.quit()
end, end,
} }
BGblockList={}for i=1,16 do BGblockList[i]={v=0}end BGblockList={}for i=1,16 do BGblockList[i]={v=0}end
local BGblock={tm=150,next=7,ct=0} local BGblock={tm=150,next=7,ct=0}
local function getNewBlock() local function getNewBlock()
@@ -92,10 +89,9 @@ 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},{1,2},{1,2},{1,2},{1,2},{1.5,1.5},{0.5,2.5}} 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 x,y=xOy:inverseTransformPoint(x,y)
local d2,nearest,distance local d2,nearest,distance
for K=1,#virtualkey do for K=1,#virtualkey do
local b=virtualkey[K] local b=virtualkey[K]
@@ -150,11 +146,125 @@ function mouseDown.intro(x,y,k)
gotoScene("main") gotoScene("main")
end end
end end
function mouseDown.draw(x,y,k)
mouseMove.draw(x,y)
end
function mouseDown.setting3(x,y,k)
if k==2 then back()end
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
sel=K
end
end
end
mouseMove={}
function mouseMove.draw(x,y,dx,dy)
sx,sy=int((x-200)/30)+1,20-int((y-60)/30)
if sx<1 or sx>10 then sx=nil end
if sy<1 or sy>20 then sy=nil end
if sx and sy and ms.isDown(1,2)then
preField[sy][sx]=ms.isDown(1)and pen or 0
end
end
function mouseMove.setting3(x,y,dx,dy)
if sel and ms.isDown(1)then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
mouseUp={}
function mouseUp.setting3(x,y,k)
if sel then
local b=virtualkey[sel]
local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k
end
end
wheelmoved={} wheelmoved={}
function wheelmoved.draw(x,y)
if y<0 then
pen=pen+1
if pen==8 then pen=9 elseif pen==14 then pen=0 end
else
pen=pen-1
if pen==8 then pen=7 elseif pen==-1 then pen=13 end
end
end
function wheelmoved.mode(x,y) function wheelmoved.mode(x,y)
modeSel=min(max(modeSel+(y>0 and -1 or 1),1),#modeID) modeSel=min(max(modeSel+(y>0 and -1 or 1),1),#modeID)
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5) levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
end end
touchDown={}
function touchDown.intro(id,x,y)
gotoScene("main")
end
function touchDown.draw(id,x,y)
end
function touchDown.setting3(id,x,y)
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
sel=K
end
end
end
function touchDown.play(id,x,y)
if setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
pressKey(t,players[1])
end
end
end
touchUp={}
function touchUp.setting3(id,x,y)
if sel then
x,y=xOy:inverseTransformPoint(x,y)
if sel then
local b=virtualkey[sel]
local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k
end
end
end
function touchUp.play(id,x,y)
if setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
releaseKey(t,players[1])
end
end
end
touchMove={}
function touchMove.setting3(id,x,y,dx,dy)
if sel then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
function touchMove.draw(id,x,y,dx,dy)
sx,sy=int((x-200)/30)+1,20-int((y-60)/30)
if sx<1 or sx>10 then sx=nil end
if sy<1 or sy>20 then sy=nil end
if sx and sy then
preField[sy][sx]=pen
end
end
function touchMove.play(id,x,y,dx,dy)
if setting.virtualkeySwitch then
local l=tc.getTouches()
for n=1,#virtualkey do
local b=virtualkey[n]
for i=1,#l do
local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then goto L end
end
releaseKey(n,players[1])
::L::
end
end
end
keyDown={} keyDown={}
function keyDown.intro(key) function keyDown.intro(key)
if key=="escape"then if key=="escape"then
@@ -201,12 +311,42 @@ function keyDown.custom(key)
optSel=optSel%#customID+1 optSel=optSel%#customID+1
elseif key=="up"then elseif key=="up"then
optSel=(optSel-2)%#customID+1 optSel=(optSel-2)%#customID+1
elseif key=="d"then
gotoScene("draw")
elseif key=="return"then elseif key=="return"then
loadGame(0,1) loadGame(0,1)
elseif key=="space"then
loadGame(0,2)
elseif key=="escape"then elseif key=="escape"then
back() back()
end end
end end
function keyDown.draw(key)
if key=="delete"then
Buttons.draw.clear.code()
elseif key=="up"or key=="down"or key=="left"or key=="right"then
if not sx then sx=1 end
if not sy then sy=1 end
if key=="up"and sy<20 then sy=sy+1
elseif key=="down"and sy>1 then sy=sy-1
elseif key=="left"and sx>1 then sx=sx-1
elseif key=="right"and sx<10 then sx=sx+1
end
if kb.isDown("space")then
preField[sy][sx]=pen
end
elseif key=="space"then
if sx and sy then
preField[sy][sx]=pen
end
elseif key=="backspace"then
pen=0
elseif key=="escape"then
back()
else
pen=find("123qwea#sdzxc",key)or pen
end
end
function keyDown.setting2(key) function keyDown.setting2(key)
if key=="escape"then if key=="escape"then
if keyboardSetting then if keyboardSetting then
@@ -237,7 +377,9 @@ function keyDown.setting2(key)
end end
end end
function keyDown.play(key) function keyDown.play(key)
if key=="escape"then back()return 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] local lib=setting.keyLib[p]
@@ -251,6 +393,13 @@ function keyDown.play(key)
end end
end end
end end
function keyDown.pause(key)
if key=="escape"then
back()
elseif key=="return"or key=="space"then
resumeGame()
end
end
keyUp={} keyUp={}
function keyUp.play(key) function keyUp.play(key)
local m=setting.keyMap local m=setting.keyMap
@@ -346,13 +495,36 @@ function gamepadUp.play(key)
end end
function love.mousepressed(x,y,k,t,num)
if t then return end
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
if mouseDown[scene]then
mouseDown[scene](mx,my,k)
elseif k==2 then
back()
end
if k==1 then
if not sceneSwaping and Buttons.sel then
local B=Buttons.sel
B.code()
B.alpha=1
Buttons.sel=nil
love.mousemoved(x,y,0,0)
sysSFX("button")
VIB(1)
end
end
end
function love.mousemoved(x,y,dx,dy,t) function love.mousemoved(x,y,dx,dy,t)
if t then return end if t then return end
mouseShow=true mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y) mx,my=xOy:inverseTransformPoint(x,y)
Buttons.sel=nil Buttons.sel=nil
for N,B in next,Buttons[scene]do if mouseMove[scene]then
mouseMove[scene](mx,my,dx/scr.k,dy/scr.k)
end
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(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then
Buttons.sel=B Buttons.sel=B
@@ -361,28 +533,12 @@ function love.mousemoved(x,y,dx,dy,t)
end end
end end
end end
function love.mousepressed(x,y,k,t,num)
if t then return end
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
if mouseDown[scene]then
mouseDown[scene](mx,my,k)
else
if k==1 then
if not sceneSwaping and Buttons.sel then
local B=Buttons.sel
B.code()
B.alpha=1
Buttons.sel=nil
love.mousemoved(x,y)
sysSFX("button")
end
elseif k==2 then
back()
end
end
end
function love.mousereleased(x,y,k,t,num) function love.mousereleased(x,y,k,t,num)
if t then return end
mx,my=xOy:inverseTransformPoint(x,y)
if mouseUp[scene]then
mouseUp[scene](mx,my,k)
end
end end
function love.wheelmoved(x,y) function love.wheelmoved(x,y)
if wheelmoved[scene]then wheelmoved[scene](x,y)end if wheelmoved[scene]then wheelmoved[scene](x,y)end
@@ -391,26 +547,11 @@ end
function love.touchpressed(id,x,y) function love.touchpressed(id,x,y)
if not touching then if not touching then
touching=id touching=id
love.mousemoved(x,y) love.touchmoved(id,x,y,0,0)
mouseShow=false mouseShow=false
end end
if scene=="play"then if touchDown[scene]then
if setting.virtualkeySwitch then touchDown[scene](id,xOy:inverseTransformPoint(x,y))
local t=onVirtualkey(x,y)
if t then
pressKey(t,players[1])
end
end
elseif scene=="setting3"then
x,y=xOy:inverseTransformPoint(x,y)
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
sel=K
end
end
elseif scene=="intro"then
gotoScene("main")
end end
end end
function love.touchreleased(id,x,y) function love.touchreleased(id,x,y)
@@ -422,49 +563,32 @@ 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 mouseShow=false
end end
if scene=="play"and setting.virtualkeySwitch then if touchUp[scene]then
local t=onVirtualkey(x,y) touchUp[scene](id,xOy:inverseTransformPoint(x,y))
if t then
releaseKey(t,players[1])
end
elseif scene=="setting3"and sel then
x,y=xOy:inverseTransformPoint(x,y)
if sel then
local b=virtualkey[sel]
local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k
end
end end
end end
function love.touchmoved(id,x,y,dx,dy) function love.touchmoved(id,x,y,dx,dy)
love.mousemoved(x,y) x,y=xOy:inverseTransformPoint(x,y)
mouseShow=false if touchMove[scene]then
touchMove[scene](id,x,y,dx/scr.k,dy/scr.k)
end
Buttons.sel=nil
for _,B in next,Buttons[scene]do
if not(B.hide and B.hide())then
if abs(x-B.x)<B.w*.5 and abs(y-B.y)<B.h*.5 then
Buttons.sel=B
return
end
end
end
if not Buttons.sel then if not Buttons.sel then
touching=nil touching=nil
end end
if scene=="play"and setting.virtualkeySwitch then
local l=tc.getTouches()
for n=1,#virtualkey do
local b=virtualkey[n]
for i=1,#l do
local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then goto L end
end
releaseKey(n,players[1])
::L::
end
elseif scene=="setting3"then
x,y=xOy:inverseTransformPoint(x,y)
dx,dy=dx*screenK,dy*screenK
if sel then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
end end
function love.keypressed(i) function love.keypressed(i)
@@ -478,6 +602,8 @@ function love.keypressed(i)
for k,B in next,Buttons[scene]do for k,B in next,Buttons[scene]do
print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h)) print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h))
end 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
@@ -515,29 +641,36 @@ function love.gamepadreleased(joystick,i)
end end
end end
--[[ --[[
function love.joystickpressed(js,k) function love.joystickpressed(js,k)end
function love.joystickaxis(js,axis,valend
end function love.joystickhat(js,hat,dirend
function love.joystickaxis(js,axis,val) function love.sendData(data)end
function love.receiveData(id,data)end
end
function love.joystickhat(js,hat,dir)
end
function love.sendData(data)
return
end
function love.receiveData(id,data)
return
end
]] ]]
function love.lowmemory()
collectgarbage()
end
function love.resize(w,h)
scr.w,scr.h,scr.r=w,h,h/w
if scr.r>=.5625 then
scr.k=w/1280
scr.x,scr.y=0,(h-w*9/16)*.5
else
scr.k=h/720
scr.x,scr.y=(w-h*16/9)*.5,0
end
xOy=xOy:setTransformation(w*.5,h*.5,nil,scr.k,nil,640,360)
gc.replaceTransform(xOy)
collectgarbage()
end
function love.focus(f)
if not f and wd.isMinimized()and scene=="play"then pauseGame()end
end
function love.update(dt) function love.update(dt)
--[[ --[[
if players then if players then
for k,v in pairs(players[1])do for k,v in pairs(players[1])do
if rawget(_G,k)then print(k)end if rawget(_G,k)and k~="next"and k~="hold"and k~="stat"then print(k,_G[v])end
end end
end--check player data flew(debugging) end--check player data flew(debugging)
]] ]]
@@ -559,7 +692,6 @@ function love.update(dt)
B.alpha=0 B.alpha=0
end--Reset buttons' alpha end--Reset buttons' alpha
scene=sceneSwaping.tar scene=sceneSwaping.tar
BGM("blank")
sceneInit[scene]() sceneInit[scene]()
Buttons.sel=nil Buttons.sel=nil
elseif sceneSwaping.time==0 then elseif sceneSwaping.time==0 then
@@ -575,8 +707,9 @@ function love.update(dt)
updateButton() updateButton()
end end
function love.draw() function love.draw()
Pnt.BG[curBG]() gc.discard()--SPEED UPUPUP!
gc.setColor(1,1,1,.22) Pnt.BG[setting.bg and curBG or"grey"]()
gc.setColor(1,1,1,.2)
for n=1,#BGblock do for n=1,#BGblock do
local b,img=BGblock[n].b,blockSkin[BGblock[n].bn] local b,img=BGblock[n].b,blockSkin[BGblock[n].bn]
local size=BGblock[n].size local size=BGblock[n].size
@@ -593,86 +726,52 @@ function love.draw()
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[r][2]-.5,#blocks[r][0]-scs[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)
gc.circle("fill",mx,my,3)
end end
if sceneSwaping then sceneSwaping.draw()end if sceneSwaping then sceneSwaping.draw()end
if wh/ww>.5625 then if scr.r~=.5625 then
gc.setColor(0,0,0) gc.setColor(0,0,0)
gc.rectangle("fill",0,0,1280,ww*9/16-wh) if scr.r>.5625 then
gc.rectangle("fill",0,720,1280,wh-ww*9/16) local d=(scr.h-scr.w*9/16)*.5/scr.k
elseif wh/ww<.5625 then gc.rectangle("fill",0,0,1280,-d)
gc.setColor(0,0,0) gc.rectangle("fill",0,720,1280,d)
gc.rectangle("fill",0,0,wh*16/9-ww,720) else--high
gc.rectangle("fill",1280,0,ww-wh*16/9,720) local d=(scr.w-scr.h*16/9)*.5/scr.k
gc.rectangle("fill",0,0,-d,720)
gc.rectangle("fill",1280,0,d,720)
end--wide
end end
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(gcinfo(),5,680)
gc.print(freeRow and #freeRow or 0,5,660) gc.print(#freeRow or 0,5,660)
end end
end end
function love.resize(w,h)
if w>=h then ww,wh=w,h
else ww,wh=h,w
end
screenK=h/w>=.5625 and w/1280 or h/720
xOy=xOy:setTransformation(w*.5,h*.5,nil,screenK,nil,640,360)
gc.replaceTransform(xOy)
collectgarbage()
end
function love.run() function love.run()
local frameT=Timer() local frameT=Timer()
local readyDrawFrame=0 local readyDrawFrame=0
love.resize(gc.getWidth(),gc.getHeight()) love.resize(gc.getWidth(),gc.getHeight())
scene="load"sceneInit.load()--System Launch scene="load"sceneInit.load()--System Launch
math.randomseed(os.time()*626)
return function() return function()
love.event.pump() love.event.pump()
for name,a,b,c,d,e,f in love.event.poll()do for name,a,b,c,d,e,f in love.event.poll()do
if name=="quit"then return 0 end if name=="quit"then return 0 end
love.handlers[name](a,b,c,d,e,f) if love[name]then love[name](a,b,c,d,e,f)end
end end
if focus then tm.step()
tm.step() -- love.receiveData(id,data)
-- 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 love.draw()
gc.clear() gc.present()
love.draw()
gc.present()
end
if not(wd.hasFocus()or keeprun)then
focus=false
ms.setVisible(true)
if bgmPlaying then bgm[bgmPlaying]:pause()end
if scene=="play"then
for i=1,#players.alive do
local l=players.alive[i].keyPressing
for j=1,#l do
if l[j]then
releaseKey(j,players.alive[i])
end
end
end
end
end
else
tm.sleep(.5)
if wd.hasFocus()then
tm.step()
focus=true
ms.setVisible(false)
if bgmPlaying then bgm[bgmPlaying]:play()end
end
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,7 +29,7 @@ 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() self:destroy()
return nil return nil
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.13+" W.title="Techmino V0.7.17"
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

File diff suppressed because it is too large Load Diff

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()
@@ -157,13 +157,46 @@ function loadGame(mode,level)
PTC.attack[1]:reset()PTC.attack[2]:reset()PTC.attack[3]:reset() PTC.attack[1]:reset()PTC.attack[2]:reset()PTC.attack[3]:reset()
drawableText.modeName:set(text.modeName[mode]) drawableText.modeName:set(text.modeName[mode])
drawableText.levelName:set(modeLevel[modeID[mode]][level]) drawableText.levelName:set(modeLevel[modeID[mode]][level])
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
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 players={alive={}}human=0
modeEnv=defaultModeEnv[curMode.id][curMode.lv]or defaultModeEnv[curMode.id][1] modeEnv=defaultModeEnv[curMode.id][curMode.lv]or defaultModeEnv[curMode.id][1]
loadmode[curMode.id]() loadmode[curMode.id]()
@@ -171,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
@@ -193,12 +226,12 @@ function resetGameData()
virtualkey[i].press=false virtualkey[i].press=false
end end
stat.game=stat.game+1 stat.game=stat.game+1
local p=60*#players
freeRow={} while freeRow[p]do
collectgarbage() rem(freeRow)
for i=1,30*#players do
freeRow[i]={0,0,0,0,0,0,0,0,0,0}
end end
sysSFX("ready")
collectgarbage()
end end
function gameStart() function gameStart()
sysSFX("start") sysSFX("start")
@@ -224,6 +257,7 @@ function createPlayer(id,x,y,size,AIspeed,data)
P.size=P.size*5 P.size=P.size*5
else else
P.centerX,P.centerY=P.x+300*P.size,P.y+670*P.size P.centerX,P.centerY=P.x+300*P.size,P.y+670*P.size
P.absFieldPos={P.x+150*P.size,P.y+60*P.size}
end end
if AIspeed then if AIspeed then
@@ -239,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
@@ -345,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
@@ -354,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
@@ -368,6 +407,9 @@ function garbageRise(color,amount,pos)
end end
P.fieldBeneath=P.fieldBeneath+amount*30 P.fieldBeneath=P.fieldBeneath+amount*30
P.curY,P.y_img=P.curY+amount,P.y_img+amount P.curY,P.y_img=P.curY+amount,P.y_img+amount
for i=1,#P.clearing do
P.clearing[i]=P.clearing[i]+amount
end
if #P.field>40 then Event_gameover.lose()end if #P.field>40 then Event_gameover.lose()end
end end
function createBeam(S,R,lv)--Player id function createBeam(S,R,lv)--Player id
@@ -632,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]
@@ -664,8 +706,9 @@ 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)
P.curX,P.curY,P.dir=ix,iy,idir P.curX,P.curY,P.dir=ix,iy,idir
P.sc,P.cur.bk=scs[P.cur.id][idir],icb P.sc,P.cur.bk=scs[P.cur.id][idir],icb
P.r,P.c=ir,ic P.r,P.c=ir,ic
@@ -673,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 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
@@ -700,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()
@@ -727,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
@@ -748,75 +787,79 @@ 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
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=csend+min(6+P.cstat.pc,10) send=min(send,4)+min(6+P.stat.pc,10)
exblock=exblock+2 exblock=exblock+2
sendTime=sendTime+30 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
csend=csend+(renATK[P.combo]or 4)
if P.combo>2 then if P.combo>2 then
showText(P,text.cmb[min(P.combo,20)],P.combo<10 and"appear"or"flicker",20+P.combo*3,60) showText(P,text.cmb[min(P.combo,20)],P.combo<10 and"appear"or"flicker",20+P.combo*3,60)
end end
@@ -824,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
@@ -865,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
@@ -890,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
@@ -907,7 +947,7 @@ end
function lock() function lock()
for i=1,P.r do for i=1,P.r do
local y=P.curY+i-1 local y=P.curY+i-1
if not P.field[y]then P.field[y],P.visTime[y]=getNewRow(),getNewRow()end if not P.field[y]then P.field[y],P.visTime[y]=getNewRow(0),getNewRow(0)end
for j=1,P.c do for j=1,P.c do
if P.cur.bk[i][j]then if P.cur.bk[i][j]then
P.field[y][P.curX+j-1]=P.cur.color P.field[y][P.curX+j-1]=P.cur.color
@@ -950,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
@@ -994,7 +1033,7 @@ act={
end end
end, end,
rotRight=function()spin(1)end, rotRight=function()spin(1)end,
rotLeft=function()spin(3)end, rotLeft=function()spin(-1)end,
rotFlip=function()spin(2)end, rotFlip=function()spin(2)end,
hardDrop=function() hardDrop=function()
if P.keyPressing[9]and setting.swap then if P.keyPressing[9]and setting.swap then
@@ -1006,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()
@@ -1025,27 +1064,40 @@ act={
end end
end, end,
hold=function()hold()end, hold=function()hold()end,
swap=function() func=function()
if modeEnv.royaleMode then if modeEnv.Fkey then
for i=1,#P.keyPressing do if modeEnv.royaleMode then
if P.keyPressing[i]then for i=1,#P.keyPressing do
P.keyPressing[i]=false if P.keyPressing[i]then
P.keyPressing[i]=false
end
end
if setting.swap then
P.keyPressing[9]=true
else
changeAtkMode(P.atkMode<3 and P.atkMode+2 or 5-P.atkMode)
P.swappingAtkMode=30
end end
end end
if setting.swap then if curMode.id=="custom"and curMode.lv==2 and#P.field>0 then
P.keyPressing[9]=true for y=1,#P.field do
else for x=1,10 do
changeAtkMode(P.atkMode<3 and P.atkMode+2 or 5-P.atkMode) local a,b=preField[y][x],P.field[y][x]
P.swappingAtkMode=30 if a==0 and b>0 or a<8 and a~=b or a>7 and b==0 then return end
end
end
Event_gameover.win()
end end
else
P.keyPressing[9]=false
end end
end, end,
restart=function() restart=function()
clearTask("play") clearTask("play")
resetGameData() if frame>=180 then
frame=30 updateStat()
resetGameData()
else
resetPartGameData()
end
end, end,
insDown=function() insDown=function()
if P.curY~=P.y_img then if P.curY~=P.y_img then
@@ -1057,7 +1109,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+P.c-1,P.curY)
freshgho() freshgho()
goto L goto L
end end
@@ -1067,7 +1119,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,P.curY+P.r-1,P.curX+P.c-1,P.curY) createShade(P.curX-1,P.curY+P.r-1,P.curX+P.c-1,P.curY)
freshgho() freshgho()
goto L goto L
end end

BIN
image/virtualkey/func.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 B

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="最高速度",
@@ -21,6 +19,9 @@ return{
win="胜利", win="胜利",
lose="失败", lose="失败",
pause="暂停",
finish="结束",
pauseTime="暂停时间",
custom="自定义游戏", custom="自定义游戏",
customOption={ customOption={
@@ -42,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,""},
@@ -52,12 +53,12 @@ return{
softdropdas="软降DAS:", softdropdas="软降DAS:",
softdroparr="软降ARR:", softdroparr="软降ARR:",
snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"}, snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
keyboard="键盘", keyboard="键盘",joystick="手柄",
joystick="手柄", space="空格",enter="回车",
setting2Help="方向键选择/翻页,回车修改,esc返回", setting2Help="方向键选择/翻页,回车修改,esc返回",
actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","切换攻击:","重新开始:","左瞬移:","右瞬移:","软降到底:"}, actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","功能键:","重新开始:","左瞬移:","右瞬移:","软降到底:"},
modeName={ modeName={
[0]="自定义", [0]="自定义",
"竞速","马拉松","大师","经典","","无尽","单挑","仅TSD","隐形","挖掘","生存","科研", "竞速","马拉松","大师","经典","","无尽","单挑","仅TSD","隐形","挖掘","生存","科研",
@@ -71,42 +72,60 @@ 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人混战", techmino41="41人混战",
techmino99="99人混战", techmino99="99人混战",
drought="异常序列", drought="异常序列",
hotseat="友尽模式", hotseat="友尽模式",
}, },
loadTip="真在加载,不只是动画!",
load={"加载材质ing","加载音乐ing","加载音效ing","加载完成",}, load={"加载材质ing","加载音乐ing","加载音效ing","加载完成",},
tips={ tips={
"The whole game is made by MrZ!", "不是动画,真的在加载!",
"Back to Back 10 combo Techrash PC!", "整个游戏都是MrZ完成的!",
"Techmino has a Nspire-CX edition!", "大满贯10连击消四全清!",
"Is B2B2B2B possible?", "<方块研究所>有一个Nspire-CX版本!",
"MrZ spin Penta!", "B2B2B2B存在吗?",
"MEGACMB!", "MEGACMB!",
"ALLSPIN!", "ALLSPIN!",
"O spin Techrash?" "O型回旋三清?",
"只用一个输入设备就可以游玩了",
"Miya:喵!",
"225238922,哔哩哔哩 干杯~",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"合群了就会消失,但是消失不代表没有意义",
"学会使用两个旋转键,三个更好",
"更小的DAS和ARR拥有更高的操作上限",
"注意到\"旋转\"到底对方块做了些什么吗?",
"20G是一套全新的游戏规则",
"不要在上课时玩游戏!",
"本游戏难度上限很高,做好心理准备",
"方块可以不是个休闲游戏",
}, },
stat={ stat={
"游戏运行次数:", "游戏运行次数:",
"游戏局数:", "游戏局数:",
"游戏时间:", "游戏时间:",
"总方块使用:",
"总消行数:",
"总攻击行数:",
"总按键数:", "总按键数:",
"总旋转数:", "总旋转数:",
"暂存次数:", "Hold次数:",
"总旋转消行数:", "方块使用数:",
"总消行数:",
"总攻击数:",
"总发送数:",
"总接收数:",
"总上涨数:",
"总消除数:",
"总Spin数:",
"总B2B数:",
"总PC数:",
"平均效率:",
}, },
help={ help={
"好像也没啥好帮助的吧?就当是关于了", "好像也没啥好帮助的吧?就当是关于了",
@@ -145,11 +164,34 @@ return{
down="v", down="v",
left="<", left="<",
right=">", right=">",
start="开始", start1="消除开始",
start2="拼图开始",
draw="画图(D)",
back="返回",
},
draw={
block1="",
block2="",
block3="",
block4="",
block5="",
block6="",
block7="",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
erase="×",
clear="清空",
back="返回", back="返回",
}, },
play={ play={
back="返回", pause="暂停",
},
pause={
resume="继续",
quit="退出",
}, },
setting={ setting={
ghost=function()return setting.ghost and"阴影:开"or"阴影:关"end, ghost=function()return setting.ghost and"阴影:开"or"阴影:关"end,
@@ -157,6 +199,7 @@ return{
grid=function()return setting.grid and"网格:开"or"网格:关"end, grid=function()return setting.grid and"网格:开"or"网格:关"end,
swap=function()return setting.swap and"目标选择:组合键"or"目标选择:循环"end, swap=function()return setting.swap and"目标选择:组合键"or"目标选择:循环"end,
fxs=function()return setting.fxs and"特效:开"or"特效:关"end, fxs=function()return setting.fxs and"特效:开"or"特效:关"end,
bg=function()return setting.bg and"背景:开"or"背景:关"end,
dasD="-",dasU="+", dasD="-",dasU="+",
arrD="-",arrU="+", arrD="-",arrU="+",
sddasD="-",sddasU="+", sddasD="-",sddasU="+",
@@ -193,4 +236,4 @@ return{
path="打开存储目录", path="打开存储目录",
}, },
}, },
}--中文 }--

239
language/chi_full.lua Normal file
View File

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

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",
@@ -21,7 +19,10 @@ return{
win="WIN", win="WIN",
lose="LOSE", lose="LOSE",
pause="PAUSE",
finish="FINISH",
pauseTime="Pause time",
custom="Custom Game", custom="Custom Game",
customOption={ customOption={
drop="Drop delay:", drop="Drop delay:",
@@ -42,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,""},
@@ -52,12 +53,12 @@ return{
softdropdas="softdropDAS:", softdropdas="softdropDAS:",
softdroparr="softdropARR:", softdroparr="softdropARR:",
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"}, snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"},
keyboard="Keyboard", keyboard="Keyboard",joystick="Joystick",
joystick="Joystick", space="Space",enter="Enter",
setting2Help="Arrowkey to select/change slot,Enter to change,Esc back", setting2Help="Arrowkey to select/change slot,Enter to change,Esc back",
actName={"Move Left:","Move Right:","Rotate Right:","Rotate Left:","Rotate Flip:","Hard Drop:","Soft Drop:","Hold:","Swap:","Restart:","Instant Left:","Instant Right:","Ins Down:"}, actName={"Move Left:","Move Right:","Rotate Right:","Rotate Left:","Rotate Flip:","Hard Drop:","Soft Drop:","Hold:","Function:","Restart:","Instant Left:","Instant Right:","Ins Down:"},
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",
@@ -75,7 +76,7 @@ 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", techmino41="Melee fight with 40 AIs",
@@ -84,33 +85,51 @@ return{
hotseat="", hotseat="",
}, },
loadTip="not animation,real loading!",
load={"Loading textures","Loading BGM","Loading SFX","Finished",}, load={"Loading textures","Loading BGM","Loading SFX","Finished",},
tips={ tips={
"The whole game is made by MrZ!", "Not animation,real loading!",
"The WHOLE game is made by MrZ!",
"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 Techrash?" "O spin triple?",
"You can play with any input device!",
"Miya:Nya!",
"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:",
"Total rows cleared:",
"Total lines sent:",
"Total key pressed:", "Total key pressed:",
"Total rotate:", "Total rotate:",
"Total hold:", "Total hold:",
"Total block used:",
"Total rows cleared:",
"Total attack:",
"Total sent:",
"Total receive:",
"Total pend:",
"Total clear:",
"Total spin:", "Total spin:",
"Total B2B:",
"Total PC:",
"Total Efficiency",
}, },
help={ help={
"I think you don't 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",
"", "",
@@ -145,11 +164,34 @@ return{
down="v", down="v",
left="<", left="<",
right=">", right=">",
start="Start", start1="Clear Start",
start2="Puzzle Start",
draw="Draw(D)",
back="Back",
},
draw={
block1="",
block2="",
block3="",
block4="",
block5="",
block6="",
block7="",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
erase="×",
clear="Clear",
back="Back", back="Back",
}, },
play={ play={
back="Back", pause="Pause",
},
pause={
resume="Resume",
quit="Quit",
}, },
setting={ setting={
ghost=function()return setting.ghost and"Ghost:ON"or"Ghost:OFF"end, ghost=function()return setting.ghost and"Ghost:ON"or"Ghost:OFF"end,
@@ -157,14 +199,11 @@ return{
grid=function()return setting.grid and"Grid:ON"or"Grid:OFF"end, grid=function()return setting.grid and"Grid:ON"or"Grid:OFF"end,
swap=function()return setting.swap and"Swap:comboKey"or"Swap:loop"end, swap=function()return setting.swap and"Swap:comboKey"or"Swap:loop"end,
fxs=function()return setting.fxs and"FXs:ON"or"FXs:OFF"end, fxs=function()return setting.fxs and"FXs:ON"or"FXs:OFF"end,
dasD="-", bg=function()return setting.bg and"BG:ON"or"BG:OFF"end,
dasU="+", dasD="-",dasU="+",
arrD="-", arrD="-",arrU="+",
arrU="+", sddasD="-",sddasU="+",
sddasD="-", sdarrD="-",sdarrU="+",
sddasU="+",
sdarrD="-",
sdarrU="+",
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,

187
list.lua
View File

@@ -1,7 +1,7 @@
local gc=love.graphics local gc=love.graphics
local sys=love.system local sys=love.system
local fs=love.filesystem
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","swap","restart","insLeft","insRight","insDown"} actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","func","restart","insLeft","insRight","insDown"}
color={ color={
red={1,0,0}, red={1,0,0},
green={0,1,0}, green={0,1,0},
@@ -31,11 +31,27 @@ color={
orange={1,.6,0}, orange={1,.6,0},
lightOrange={1,.7,.3}, lightOrange={1,.7,.3},
purple={.5,0,1}, purple={.5,0,1},
lightPurple={.7,.3,1}, lightPurple={.8,.4,1},
darkPurple={.3,0,.6},
}
blockColor={
color.red,
color.green,
color.orange,
color.blue,
color.magenta,
color.yellow,
color.cyan,
color.darkGreen,
color.darkGrey,
color.grey,
color.darkPurple,
color.darkRed,
color.darkGreen,
} }
sfx={ sfx={
"button", "button","swipe",
"ready","start","win","fail","collect", "ready","start","win","fail","collect",
"move","rotate","rotatekick","hold", "move","rotate","rotatekick","hold",
"prerotate","prehold", "prerotate","prehold",
@@ -82,7 +98,7 @@ customRange={
wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
next={0,1,2,3,4,5,6}, next={0,1,2,3,4,5,6},
hold={true,false}, hold={true,false,true},
sequence={"bag7","his4","rnd"}, sequence={"bag7","his4","rnd"},
visible={"show","time","fast","none"}, visible={"show","time","fast","none"},
target={10,20,40,100,200,500,1000,1e99}, target={10,20,40,100,200,500,1000,1e99},
@@ -90,9 +106,8 @@ customRange={
opponent={0,60,30,20,15,10,7,5,4,3,2,1}, opponent={0,60,30,20,15,10,7,5,4,3,2,1},
} }
snapLevelValue={1,10,20,40,60,80}
RCPB={10,33,200,33,105,5,105,60} RCPB={10,33,200,33,105,5,105,60}
snapLevelValue={1,10,20,40,60,80}
up0to4={[0]="000%UP","025%UP","050%UP","075%UP","100%UP",} up0to4={[0]="000%UP","025%UP","050%UP","075%UP","100%UP",}
percent0to5={[0]="0%","20%","40%","60%","80%","100%",} percent0to5={[0]="0%","20%","40%","60%","80%","100%",}
@@ -120,7 +135,7 @@ modeLevel={
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",},
custom={""}, custom={"Normal","Puzzle"},
} }
local t,f=true,false local t,f=true,false
blocks={ blocks={
@@ -145,7 +160,7 @@ local virtualkeySet={
{200,720-320,6400,80},--hardDrop {200,720-320,6400,80},--hardDrop
{200,720-80,6400,80},--softDrop {200,720-80,6400,80},--softDrop
{1280-320,720-200,6400,80},--hold {1280-320,720-200,6400,80},--hold
{1280-80,280,6400,80},--swap {1280-80,280,6400,80},--func
{80,280,6400,80},--restart {80,280,6400,80},--restart
},--Farter's set 3 },--Farter's set 3
{ {
@@ -157,7 +172,7 @@ local virtualkeySet={
{1280-200,720-320,6400,80},--hardDrop {1280-200,720-320,6400,80},--hardDrop
{1280-200,720-80,6400,80},--softDrop {1280-200,720-80,6400,80},--softDrop
{320,720-200,6400,80},--hold {320,720-200,6400,80},--hold
{80,280,6400,80},--swap {80,280,6400,80},--func
{1280-80,280,6400,80},--restart {1280-80,280,6400,80},--restart
},--Mirrored farter's set 3 },--Mirrored farter's set 3
{ {
@@ -169,7 +184,7 @@ local virtualkeySet={
{1280-80,720-80,6400,80},--hardDrop {1280-80,720-80,6400,80},--hardDrop
{1280-80,720-240,6400,80},--softDrop {1280-80,720-240,6400,80},--softDrop
{1280-80,720-400,6400,80},--hold {1280-80,720-400,6400,80},--hold
{80,360,6400,80},--swap {80,360,6400,80},--func
{80,80,6400,80},--restart {80,80,6400,80},--restart
},--Author's set },--Author's set
{ {
@@ -181,104 +196,136 @@ local virtualkeySet={
{1280-240,720-240,6400,80},--hardDrop {1280-240,720-240,6400,80},--hardDrop
{1280-240,720-80,6400,80},--softDrop {1280-240,720-80,6400,80},--softDrop
{1280-80,720-240,6400,80},--hold {1280-80,720-240,6400,80},--hold
{80,720-240,6400,80},--swap {80,720-240,6400,80},--func
{80,320,6400,80},--restart {80,320,6400,80},--restart
},--Keyboard set },--Keyboard set
{ {
{1200-360,40,0,40},--moveLeft {1200-370,40,1600,40},--moveLeft
{1200-280,40,0,40},--moveRight {1200-280,40,1600,40},--moveRight
{1200-520,40,0,40},--rotRight {1200-530,40,1600,40},--rotRight
{1200-600,40,0,40},--rotLeft {1200-610,40,1600,40},--rotLeft
{1200-440,40,0,40},--rotFlip {1200-450,40,1600,40},--rotFlip
{1200-40,40,0,40},--hardDrop {1200-50,40,1600,40},--hardDrop
{1200-120,40,0,40},--softDrop {1200-130,40,1600,40},--softDrop
{1200-200,40,0,40},--hold {1200-210,40,1600,40},--hold
{1200-680,40,0,40},--swap {1200-690,40,1600,40},--func
{1200-760,40,0,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,hide=function()return modeSel==1 end,f=64,code=function()keyDown.mode("up")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,},
down={x=1000,y=430,w=200,h=140,rgb=color.white,hide=function()return modeSel==#modeID end,f=80,code=function()keyDown.mode("down")end}, down= {x=1000,y=430,w=200,h=140, rgb=color.white, f=80, code=function()keyDown.mode("down")end, hide=function()return modeSel==#modeID end,},
left={x=190,y=160,w=100,h=80,rgb=color.white,hide=function()return levelSel==1 end,code=function()keyDown.mode("left")end}, left= {x=190, y=160,w=100,h=80, rgb=color.white, code=function()keyDown.mode("left")end, hide=function()return levelSel==1 end,},
right={x=350,y=160,w=100,h=80,rgb=color.white,hide=function()return levelSel==#modeLevel[modeID[modeSel]] end,code=function()keyDown.mode("right")end}, right= {x=350, y=160,w=100,h=80, rgb=color.white, code=function()keyDown.mode("right")end,hide=function()return levelSel==#modeLevel[modeID[modeSel]]end,},
start={x=1000,y=600,w=250,h=100,rgb=color.green,f=50,code=function()loadGame(modeSel,levelSel)end}, start={ x=1000, y=600,w=250,h=100, rgb=color.green, f=50, code=function()
custom={x=270,y=540,w=190,h=85,rgb=color.yellow,code=function()gotoScene("custom")end}, loadGame(modeSel,levelSel)end},
back={x=640,y=630,w=230,h=90,rgb=color.white,f=45,code=back}, custom= {x=275, y=420,w=200,h=90, rgb=color.yellow, code=function()gotoScene("custom")end},
back= {x=640, y=630,w=230,h=90, rgb=color.white, f=45, code=back},
}, },
custom={ custom={
up={x=1000,y=200,w=100,h=100,rgb=color.white,code=function()optSel=(optSel-2)%#customID+1 end}, up= {x=1000,y=220, w=100, h=100, rgb=color.white, code=function()optSel=(optSel-2)%#customID+1 end},
down={x=1000,y=440,w=100,h=100,rgb=color.white,f=50,code=function()optSel=optSel%#customID+1 end}, down= {x=1000,y=460, w=100, h=100, rgb=color.white,f=50, code=function()optSel=optSel%#customID+1 end},
left={x=880,y=320,w=100,h=100,rgb=color.white,f=50,code=function()local k=customID[optSel]customSel[k]=(customSel[k]-2)%#customRange[k]+1 end}, left= {x=880, y=340, w=100, h=100, rgb=color.white,f=50, code=function()local k=customID[optSel]customSel[k]=(customSel[k]-2)%#customRange[k]+1 end},
right={x=1120,y=320,w=100,h=100,rgb=color.white,f=50,code=function()local k=customID[optSel]customSel[k]=customSel[k]%#customRange[k]+1 end}, right= {x=1120,y=340, w=100, h=100, rgb=color.white,f=50, code=function()local k=customID[optSel]customSel[k]=customSel[k]%#customRange[k]+1 end},
start={x=1000,y=580,w=180,h=80,rgb=color.green,code=function()loadGame(0,1)end}, start1= {x=880, y=580, w=220, h=70, rgb=color.green, code=function()loadGame(0,1)end},
back={x=640,y=630,w=180,h=60,rgb=color.white,code=back}, start2= {x=1120,y=580, w=220, h=70, rgb=color.lightPurple, code=function()loadGame(0,2)end},
draw= {x=1000,y=90, w=190, h=85, rgb=color.cyan, code=function()gotoScene("draw")end},
back= {x=640, y=630 ,w=180, h=60, rgb=color.white, code=back},
},
draw={
block1= {x=840, y=80,w=120,h=120, f=65, rgb=color.red, code=function()pen=1 end},
block2= {x=980, y=80,w=120,h=120, f=65, rgb=color.green, code=function()pen=2 end},
block3= {x=1120,y=80,w=120,h=120, f=65, rgb=color.orange, code=function()pen=3 end},
block4= {x=840, y=220,w=120,h=120, f=65, rgb=color.blue, code=function()pen=4 end},
block5= {x=980, y=220,w=120,h=120, f=65, rgb=color.magenta, code=function()pen=5 end},
block6= {x=1120,y=220,w=120,h=120, f=65, rgb=color.yellow, code=function()pen=6 end},
block7= {x=840, y=360,w=120,h=120, f=65, rgb=color.cyan, code=function()pen=7 end},
gb1= {x=980, y=360,w=120,h=120, f=65, rgb=color.darkGrey, code=function()pen=9 end},
gb2= {x=1120,y=360,w=120,h=120, f=65, rgb=color.grey, code=function()pen=10 end},
gb3= {x=840, y=500,w=120,h=120, f=65, rgb=color.darkPurple,code=function()pen=11 end},
gb4= {x=980, y=500,w=120,h=120, f=65, rgb=color.darkRed, code=function()pen=12 end},
gb5= {x=1120,y=500,w=120,h=120, f=65, rgb=color.darkGreen,code=function()pen=13 end},
erase= {x=840, y=640,w=120,h=120, f=70, rgb=color.grey, code=function()pen=0 end},
clear= {x=1120,y=640,w=120,h=120, rgb=color.white, code=function()
if clearSureTime>0 then
for y=1,20 do for x=1,10 do preField[y][x]=0 end end
clearSureTime=0
else
clearSureTime=50
end
end},
back= {x=1235,y=45,w=80,h=80, f=35, rgb=color.white, code=back},
}, },
play={ play={
back={x=1235,y=45,w=80,h=80,rgb=color.white,code=back,f=35}, pause={x=1235,y=45,w=80,h=80,rgb=color.white,f=30,code=pauseGame},
},
pause={
resume= {x=640,y=400,w=240,h=100, rgb=color.white,f=50,code=resumeGame},
quit= {x=640,y=550,w=240,h=100, rgb=color.white,f=50,code=back},
}, },
setting={--Normal setting setting={--Normal setting
ghost= {x=290, y=90, w=210, h=60, rgb=color.white, code=function()setting.ghost=not setting.ghost end,down="grid",right="center"}, ghost= {x=290, y=90, w=210, h=60, rgb=color.white,code=function()setting.ghost=not setting.ghost end,down="grid",right="center"},
center= {x=505, y=90, w=210, h=60, rgb=color.white, code=function()setting.center=not setting.center end,down="swap",left="ghost",right="sfx"}, center= {x=505, y=90, w=210, h=60, rgb=color.white,code=function()setting.center=not setting.center end,down="swap",left="ghost",right="sfx"},
grid= {x=290, y=160, w=210, h=60, rgb=color.white, code=function()setting.grid=not setting.grid end,up="ghost",down="fxs",right="swap"}, grid= {x=290, y=160, w=210, h=60, rgb=color.white,code=function()setting.grid=not setting.grid end,up="ghost",down="fxs",right="swap"},
swap= {x=505, y=160, w=210, h=60,f=28, rgb=color.white, code=function()setting.swap=not setting.swap end,up="center",down="arrD",left="grid",right="vib"}, 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="fullscreen"}, 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"},
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="swap",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="swap",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="lang",right="sddasU"},
sddasU= {x=370, y=370, w=50, h=50, rgb=color.white, code=function()setting.sddas=(setting.sddas+1)%11 end,up="dasU",down="lang",left="sddasD",right="sdarrD"}, sddasU= {x=370, y=370, w=50, h=50, rgb=color.white,code=function()setting.sddas=(setting.sddas+1)%11 end,up="dasU",down="lang",left="sddasD",right="sdarrD"},
sdarrD= {x=425, y=370, w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr-1)%4 end,up="arrD",down="lang",left="sddasU",right="sdarrU"}, sdarrD= {x=425, y=370, w=50, h=50, rgb=color.white,code=function()setting.sdarr=(setting.sdarr-1)%4 end,up="arrD",down="lang",left="sddasU",right="sdarrU"},
sdarrU= {x=585, y=370, w=50, h=50, rgb=color.white, code=function()setting.sdarr=(setting.sdarr+1)%4 end,up="arrU",down="lang",left="sdarrD",right="frame"}, sdarrU= {x=585, y=370, w=50, h=50, rgb=color.white,code=function()setting.sdarr=(setting.sdarr+1)%4 end,up="arrU",down="lang",left="sdarrD",right="frame"},
sfx= {x=760, y=90, w=160, h=60, rgb=color.white, code=function()setting.sfx=not setting.sfx end,down="vib",left="center",right="bgm"}, 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()
BGM() BGM()
setting.bgm=not setting.bgm setting.bgm=not setting.bgm
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
love.window.setFullscreen(setting.fullscreen) love.window.setFullscreen(setting.fullscreen)
if not setting.fullscreen then if not setting.fullscreen then
love.resize(gc.getWidth(),gc.getHeight()) love.resize(gc.getWidth(),gc.getHeight())
end end
end,up="vib",down="bgblock",left="arrU"}, end,up="vib",down="bgblock",left="bg"},
bgblock= {x=850, y=300, w=340, h=60, rgb=color.white, code=function() bgblock={x=850,y=300, w=340,h=60,rgb=color.white, code=function()
setting.bgblock=not setting.bgblock setting.bgblock=not setting.bgblock
if not setting.bgblock then if not setting.bgblock then
for i=1,16 do for i=1,16 do
BGblockList[i].v=3*BGblockList[i].v BGblockList[i].v=3*BGblockList[i].v
end end
end end
end,up="fullscreen",down="frame",left="sdarrU"}, end,up="fullscreen",down="frame",left="arrU"},
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="control",left="sdarrU"},
control= {x=850, y=440, w=340, h=60, rgb=color.green, code=function()gotoScene("setting2")end,up="frame",down="touch",left="lang"}, control={x=850,y=440, w=340,h=60,rgb=color.green, code=function()gotoScene("setting2")end,up="frame",down="touch",left="lang"},
touch= {x=850, y=510, w=340, h=60, rgb=color.yellow, code=function()gotoScene("setting3")end,up="control",down="back",left="lang"}, touch= {x=850,y=510, w=340,h=60,rgb=color.yellow,code=function()gotoScene("setting3")end,up="control",down="back",left="lang"},
lang= {x=280, y=510, w=200, h=60, rgb=color.red, code=function() lang= {x=280,y=510, w=200,h=60,rgb=color.red, code=function()
setting.lang=setting.lang%#langName+1 setting.lang=setting.lang%#langName+1
swapLanguage(setting.lang) swapLanguage(setting.lang)
end,up="sddasD",down="back",right="touch"}, end,up="sddasD",down="back",right="touch"},
back= {x=640, y=620, w=300, h=70, rgb=color.white, code=back,up="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},
@@ -317,11 +364,11 @@ Buttons={
}, },
help={ help={
back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="qq"}, back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="qq"},
qq={x=980,y=590,w=230,h=60,rgb=color.white,code=function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,left="back"}, qq={x=980,y=590,w=230,h=60,hide=function()return system=="Android"end,rgb=color.white,code=function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,left="back"},
}, },
stat={ stat={
back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="path"}, back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="path"},
path={x=980,y=590,w=250,h=60,f=30,rgb=color.white,code=function()sys.openURL("C:/Users/MrZ/AppData/Roaming/LOVE/Techmino")end,left="back"}, path={x=980,y=590,w=250,h=60,f=30,hide=function()return system=="Android"end,rgb=color.white,code=function()sys.openURL(fs.getSaveDirectory())end,left="back"},
}, },
sel=nil,--selected button id(integer) sel=nil,--selected button id(integer)
} }

View File

@@ -1,20 +1,23 @@
local gc=love.graphics local gc,tm=love.graphics,love.timer
local tm=love.timer
local ms,kb=love.mouse,love.keyboard 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)
null=function()end null=function()end
system=sys.getOS() system=sys.getOS()
scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1}
scene="" 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)
@@ -35,21 +38,18 @@ 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,
keepVisible=true,visible="show",
sequence="bag7", sequence="bag7",
block=true, block=true,
ospin=true, keepVisible=true,visible="show",
freshLimit=1e99, Fkey=F,puzzle=F,ospin=true,
target=1e99, freshLimit=1e99,target=1e99,reach=null,
reach=null, bg="none",bgm="race"
bg="none",
bgm="race"
} }
customSel={ customSel={
drop=20, drop=20,
@@ -64,17 +64,22 @@ customSel={
freshLimit=3, freshLimit=3,
opponent=1, opponent=1,
} }
preField={}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
freeRow={}
for i=1,40 do
freeRow[i]={0,0,0,0,0,0,0,0,0,0}
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, fxs=true,bg=true,
das=10,arr=2, das=10,arr=2,
sddas=0,sdarr=2, sddas=0,sdarr=2,
sfx=true,bgm=true,vib=3, sfx=true,bgm=true,vib=3,
fullscreen=false, fullscreen=F,
bgblock=true, bgblock=true,
lang=1, lang=1,
keyMap={ keyMap={
@@ -114,20 +119,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
@@ -138,7 +139,7 @@ virtualkey={
{1280-80,720-80,6400,80},--hardDrop {1280-80,720-80,6400,80},--hardDrop
{1280-80,720-240,6400,80},--softDrop {1280-80,720-240,6400,80},--softDrop
{1280-80,720-400,6400,80},--hold {1280-80,720-400,6400,80},--hold
{80,360,6400,80},--swap {80,360,6400,80},--func
{80,80,6400,80},--restart {80,80,6400,80},--restart
--[[ --[[
{x=0,y=0,r=0},--toLeft {x=0,y=0,r=0},--toLeft
@@ -147,7 +148,7 @@ virtualkey={
]] ]]
} }
virtualkeyDown={false,false,false,false,false,false,false,false,false,false,false,false,false} virtualkeyDown={F,F,F,F,F,F,F,F,F,F,F,F,F}
virtualkeyPressTime={0,0,0,0,0,0,0,0,0,0,0,0,0} 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"
@@ -169,6 +170,6 @@ 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)

216
paint.lua
View File

@@ -37,7 +37,48 @@ local modeLevelColor={
["400L"]=color.red, ["400L"]=color.red,
["1000L"]=color.darkRed, ["1000L"]=color.darkRed,
} }
local dataOptL={
"key","rotate","hold","piece","row",
"atk","send","recv","pend",
}
local function dataOpt(i)
local stat=players[1].stat
if i<10 then
return stat[dataOptL[i]]
elseif i==10 then
return stat.clear_1.."/"..stat.clear_2.."/"..stat.clear_3.."/"..stat.clear_4
elseif i==11 then
return "["..stat.spin_0.."]/"..stat.spin_1.."/"..stat.spin_2.."/"..stat.spin_3
elseif i==12 then
return stat.b2b.."[+"..stat.b3b.."]"
elseif i==13 then
return stat.pc
elseif i==14 then
return format("%0.2f",stat.atk/stat.row)
end
end
local statOptL={
"run","game",nil,
"key","rotate","hold","piece","row",
"atk","send","recv","pend",
}
local function statOpt(i)
if i<13 and i~=3 then
return stat[statOptL[i]]
elseif i==3 then
return format("%0.1fHr",stat.time*2.78e-4)
elseif i==13 then
return stat.clear_1.."/"..stat.clear_2.."/"..stat.clear_3.."/"..stat.clear_4
elseif i==14 then
return "["..stat.spin_0.."]/"..stat.spin_1.."/"..stat.spin_2.."/"..stat.spin_3
elseif i==15 then
return stat.b2b.."[+"..stat.b3b.."]"
elseif i==16 then
return stat.pc
elseif i==17 then
return format("%0.2f",stat.atk/stat.row)
end
end
local miniTitle_rect={ 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},
@@ -53,12 +94,6 @@ local function stencil_miniTitle()
gc.rectangle("fill",unpack(miniTitle_rect[i])) gc.rectangle("fill",unpack(miniTitle_rect[i]))
end end
end end
local function stencil_field()
gc.rectangle("fill",0,-10,300,610)
end
local function stencil_field_small()
gc.rectangle("fill",0,0,60,120)
end
FX={ FX={
flash=0,--Black screen(frame) flash=0,--Black screen(frame)
@@ -187,7 +222,8 @@ end
function VirtualkeyPreview() function VirtualkeyPreview()
for i=1,#virtualkey do for i=1,#virtualkey do
gc.setColor(1,sel==i and .5 or 1,sel==i and .5 or 1,setting.virtualkeyAlpha*.2) local c=sel==i and .8 or 1
gc.setColor(c,c,c,setting.virtualkeyAlpha*.2)
local b=virtualkey[i] local b=virtualkey[i]
gc.setLineWidth(b[4]*.07) gc.setLineWidth(b[4]*.07)
gc.circle("line",b[1],b[2],b[4]-5) gc.circle("line",b[1],b[2],b[4]-5)
@@ -198,16 +234,18 @@ function drawVirtualkey()
local a=setting.virtualkeyAlpha*.2 local a=setting.virtualkeyAlpha*.2
local P=players[1] local P=players[1]
for i=1,#virtualkey do for i=1,#virtualkey do
local p,b=virtualkeyDown[i],virtualkey[i] if i~=9 or modeEnv.Fkey then
if p then gc.setColor(.7,.7,.7,a) local p,b=virtualkeyDown[i],virtualkey[i]
else gc.setColor(1,1,1,a) if p then gc.setColor(.7,.7,.7,a)
end else gc.setColor(1,1,1,a)
gc.setLineWidth(b[4]*.07) end
gc.circle("line",b[1],b[2]+virtualkeyPressTime[i],b[4]-5) gc.setLineWidth(b[4]*.07)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2]+virtualkeyPressTime[i],nil,b[4]*.025,nil,18,18)end gc.circle("line",b[1],b[2]+virtualkeyPressTime[i],b[4]-5)
if virtualkeyPressTime[i]>0 then if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2]+virtualkeyPressTime[i],nil,b[4]*.025,nil,18,18)end
gc.setColor(1,1,1,a*virtualkeyPressTime[i]*.1) if virtualkeyPressTime[i]>0 then
gc.circle("line",b[1],b[2],b[4]*(1.4-virtualkeyPressTime[i]*.04)) gc.setColor(1,1,1,a*virtualkeyPressTime[i]*.1)
gc.circle("line",b[1],b[2],b[4]*(1.4-virtualkeyPressTime[i]*.04))
end
end end
end end
end end
@@ -216,6 +254,9 @@ Pnt={BG={}}
function Pnt.BG.none() function Pnt.BG.none()
gc.clear(.15,.15,.15) gc.clear(.15,.15,.15)
end end
function Pnt.BG.grey()
gc.clear(.3,.3,.3)
end
function Pnt.BG.glow() function Pnt.BG.glow()
local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05 local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05
gc.clear(t,t,t) gc.clear(t,t,t)
@@ -232,6 +273,22 @@ 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
function Pnt.BG.game6()
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,
@@ -247,6 +304,7 @@ function Pnt.BG.strap()
end end
local matrixT={}for i=0,15 do matrixT[i]={}for j=0,8 do matrixT[i][j]=mt.noise(i,j)+2 end end local matrixT={}for i=0,15 do matrixT[i]={}for j=0,8 do matrixT[i][j]=mt.noise(i,j)+2 end end
function Pnt.BG.matrix() function Pnt.BG.matrix()
gc.clear(.15,.15,.15)
for i=0,15 do for i=0,15 do
for j=0,8 do for j=0,8 do
local t=sin(matrixT[i][j]*Timer())*.2+.2 local t=sin(matrixT[i][j]*Timer())*.2+.2
@@ -264,8 +322,8 @@ function Pnt.load()
gc.rectangle("line",300,330,680,60,5) gc.rectangle("line",300,330,680,60,5)
setFont(40) setFont(40)
mStr(text.load[loading],640,335) mStr(text.load[loading],640,335)
setFont(25) setFont(30)
mStr(text.loadTip,640,400) mStr(loadTip,640,400)
end end
function Pnt.intro() function Pnt.intro()
gc.push() gc.push()
@@ -287,7 +345,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.13+",290,140) gc.print("Alpha V0.7.17",290,140)
gc.print(system,800,110) gc.print(system,800,110)
end end
function Pnt.mode() function Pnt.mode()
@@ -327,27 +385,61 @@ function Pnt.custom()
end end
end end
end end
function Pnt.draw()
gc.translate(200,60)
gc.setColor(1,1,1,.2)
gc.setLineWidth(1)
for x=1,9 do gc.line(30*x,0,30*x,600)end
for y=0,19 do gc.line(0,30*y,300,30*y)end
gc.setColor(1,1,1)
gc.setLineWidth(3)
gc.rectangle("line",-2,-2,304,604)
for y=1,20 do for x=1,10 do
if preField[y][x]>0 then
drawPixel(y,x,preField[y][x])
end
end end
if sx and sy then
gc.setLineWidth(2)
gc.rectangle("line",30*sx-30,600-30*sy,30,30)
end
gc.translate(-200,-60)
if clearSureTime>0 then
gc.setColor(1,1,1,clearSureTime*.02)
gc.draw(drawableText.question,1100,570)
end
if pen>0 then
gc.setLineWidth(13)
gc.setColor(blockColor[pen])
gc.rectangle("line",945,605,70,70)
else
gc.setColor(.8,.8,.8)
gc.draw(drawableText.x,950,560)
end
end
function Pnt.play() function Pnt.play()
for p=1,#players do for p=1,#players do
P=players[p] P=players[p]
if P.small then if P.small then
gc.push("transform") gc.push("transform")
gc.translate(P.x,P.y)gc.scale(P.size)--Scale gc.translate(P.x,P.y)gc.scale(P.size)--Position
gc.setColor(0,0,0,.4)gc.rectangle("fill",0,0,60,120)--Black Background gc.setColor(0,0,0,.4)gc.rectangle("fill",0,0,60,120)--Background
gc.stencil(stencil_field_small,"replace",1)
gc.translate(0,P.fieldBeneath*.2) gc.translate(0,P.fieldBeneath*.2)
gc.setStencilTest("equal",1) gc.setScissor(scr.x+P.x*scr.k,scr.y+P.y*scr.k,60*P.size*scr.k,120*P.size*scr.k)
gc.setColor(1,1,1,P.result and max(20-P.endCounter,0)*.05 or 1) gc.setColor(1,1,1,P.result and max(20-P.endCounter,0)*.05 or 1)
local h=#P.clearing
for j=int(P.fieldBeneath/30+1),#P.field do for j=int(P.fieldBeneath/30+1),#P.field do
if P.falling<=0 or without(P.clearing,j)then if j==P.clearing[h]and P.falling>-1 then
h=h-1
else
for i=1,10 do for i=1,10 do
if P.field[j][i]>0 then if P.field[j][i]>0 then
gc.draw(blockSkinmini[P.field[j][i]],6*i-6,120-6*j) gc.draw(blockSkinmini[P.field[j][i]],6*i-6,120-6*j)
end end
end end
end end
end end--Field
gc.setStencilTest()--In-playField mask gc.setScissor()
gc.translate(0,-P.fieldBeneath*.2) gc.translate(0,-P.fieldBeneath*.2)
gc.setLineWidth(2) gc.setLineWidth(2)
gc.setColor(frameColor[P.strength])gc.rectangle("line",-1,-1,62,122)--Draw boarder gc.setColor(frameColor[P.strength])gc.rectangle("line",-1,-1,62,122)--Draw boarder
@@ -370,20 +462,19 @@ function Pnt.play()
gc.pop() gc.pop()
else else
gc.push("transform") gc.push("transform")
gc.translate(P.x,P.y)gc.scale(P.size) gc.translate(P.x,P.y)gc.scale(P.size)--Position
gc.setColor(0,0,0,.6)gc.rectangle("fill",0,0,600,690)--Black 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,5)--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)
gc.setColor(1,1,1,.2) gc.setColor(1,1,1,.2)
for x=1,9 do gc.line(30*x,-10,30*x,600)end for x=1,9 do gc.line(30*x,-10,30*x,600)end
for y=0,19 do gc.line(0,30*y,300,30*y)end for y=0,19 do gc.line(0,30*y,300,30*y)end
end end--Grid lines
gc.stencil(stencil_field,"replace", 1)
gc.translate(0,P.fieldBeneath) gc.translate(0,P.fieldBeneath)
gc.setStencilTest("equal",1) gc.setScissor(scr.x+P.absFieldPos[1]*scr.k,scr.y+P.absFieldPos[2]*scr.k,300*P.size*scr.k,610*P.size*scr.k)
local h=#P.clearing local h=#P.clearing
for j=int(P.fieldBeneath/30+1),#P.field do for j=int(P.fieldBeneath/30+1),#P.field do
if j==P.clearing[h]and P.falling>-1 then if j==P.clearing[h]and P.falling>-1 then
@@ -393,7 +484,7 @@ function Pnt.play()
else else
for i=1,10 do for i=1,10 do
if P.field[j][i]>0 then if P.field[j][i]>0 then
gc.setColor(1,1,1,min(P.visTime[j][i],20)*.05) gc.setColor(1,1,1,min(P.visTime[j][i]*.05,1))
drawPixel(j,i,P.field[j][i]) drawPixel(j,i,P.field[j][i])
end end
end end
@@ -401,13 +492,13 @@ function Pnt.play()
end--Field end--Field
for i=1,#P.shade do for i=1,#P.shade do
local S=P.shade[i] local S=P.shade[i]
gc.setColor(1,1,1,.15+S[1]*.08) gc.setColor(1,1,1,S[1]*.12)
for x=S[3],S[5]do for x=S[3],S[5]do
for y=S[6],S[4]do for y=S[6],S[4]do
drawPixel(y,x,S[2]) drawPixel(y,x,S[2])
end end
end end
end end--shade FX
if P.waiting==-1 then if P.waiting==-1 then
if P.gameEnv.ghost then if P.gameEnv.ghost then
gc.setColor(1,1,1,.3) gc.setColor(1,1,1,.3)
@@ -442,7 +533,7 @@ function Pnt.play()
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(PTC.dust[p]) gc.draw(PTC.dust[p])
--Draw game field --Draw game field
gc.setStencilTest()--In-playField mask gc.setScissor()--In-playField mask
gc.translate(0,-P.fieldBeneath) gc.translate(0,-P.fieldBeneath)
gc.setLineWidth(3) gc.setLineWidth(3)
gc.setColor(1,1,1) gc.setColor(1,1,1)
@@ -493,17 +584,17 @@ function Pnt.play()
--B2B indictator --B2B indictator
if P.gameEnv.hold then if P.gameEnv.hold then
gc.draw(drawableText.hold,-75-drawableText.hold:getWidth()*.5,-10)
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(drawableText.hold,-124,-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
drawPixel(i+17.5-#P.hold.bk*.5,j-2.5-#P.hold.bk[1]*.5,P.holded and 9 or P.hold.color) drawPixel(i+17.5-#P.hold.bk*.5,j-2.7-#P.hold.bk[1]*.5,P.holded and 9 or P.hold.color)
end end
end end
end end
end--Hold end--Hold
gc.draw(drawableText.next,382-drawableText.next:getWidth()*.5,-10) gc.draw(drawableText.next,340,-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
@@ -535,7 +626,7 @@ function Pnt.play()
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(35) setFont(35)
mStr(format("%.2f",P.time),-75,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)
@@ -585,6 +676,30 @@ function Pnt.play()
end end
end end
end end
function Pnt.pause()
Pnt.play()
gc.setColor(0,0,0,pauseTimer*.015)
gc.rectangle("fill",0,0,1280,720)
gc.setColor(1,1,1,pauseTimer*.02)
setFont(30)
gc.print(text.pauseTime..":["..pauseCount.."] "..format("%0.2f",pauseTime).."s",40,280)
setFont(40)
for i=1,7 do
gc.print(text.stat[i+3],40,40*i+285)
gc.print(dataOpt(i),400,40*i+285)
end
for i=8,14 do
gc.print(text.stat[i+3],810,40*i+5)
gc.print(dataOpt(i),1060,40*i+5)
end
if system~="Android"then
mStr(text.space.."/"..text.enter,640,300)
gc.print("ESC",610,598)
end
gc.setColor(1,1,1)
setFont(120)
mStr(gamefinished and text.finish or text.pause,640,140-12*(5-pauseTimer*.1)^2)
end
function Pnt.setting() function Pnt.setting()
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(35) setFont(35)
@@ -658,18 +773,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,7 +8,6 @@ local function C(x,y)
end end
gc.setDefaultFilter("nearest","nearest") gc.setDefaultFilter("nearest","nearest")
local blockImg=N("/image/block/1.png") local blockImg=N("/image/block/1.png")
blockSkin,blockSkinmini={},{} blockSkin,blockSkinmini={},{}
for i=1,13 do for i=1,13 do
@@ -26,15 +25,6 @@ for i=1,10 do
virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png") virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png")
end end
local blockColor={
color.red,
color.green,
color.orange,
color.blue,
color.magenta,
color.yellow,
color.cyan,
}
gc.setColor(1,1,1) gc.setColor(1,1,1)
mouseBlock={} mouseBlock={}
for i=1,7 do for i=1,7 do
@@ -92,8 +82,9 @@ background1=N("/image/BG/bg1.jpg")
background2=N("/image/BG/bg2.png") background2=N("/image/BG/bg2.png")
groupCode=N("/image/mess/groupcode.png") groupCode=N("/image/mess/groupcode.png")
payCode=N("/image/mess/paycode.png") payCode=N("/image/mess/paycode.png")
drawableText={ drawableText={
question=T(100,"?"),
x=T(110,"×"),
bpm=T(15,"BPM"), bpm=T(15,"BPM"),
kpm=T(15,"KPM"), kpm=T(15,"KPM"),
modeName=T(30), modeName=T(30),
@@ -101,5 +92,4 @@ drawableText={
next=T(40), next=T(40),
hold=T(40), hold=T(40),
} }
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={}
@@ -45,9 +46,12 @@ function Tmr.intro()
count=count+1 count=count+1
if count==200 then count=80 end if count==200 then count=80 end
end end
function Tmr.draw()
if clearSureTime>0 then clearSureTime=clearSureTime-1 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]
@@ -93,7 +97,7 @@ function Tmr.play(dt)
end--Counting,include pre-das,directy RETURN end--Counting,include pre-das,directy RETURN
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
@@ -121,9 +125,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
@@ -207,8 +211,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)
@@ -271,4 +275,12 @@ function Tmr.play(dt)
end end
end end
if modeEnv.royaleMode and frame%120==0 then freshMostDangerous()end if modeEnv.royaleMode and frame%120==0 then freshMostDangerous()end
end
function Tmr.pause(dt)
if not gamefinished then
pauseTime=pauseTime+dt
end
if pauseTimer<50 and not wd.isMinimized()then
pauseTimer=pauseTimer+1
end
end end

View File

@@ -1,4 +1,6 @@
local tm=love.timer
local gc=love.graphics local gc=love.graphics
local kb=love.keyboard
local setFont=setFont local setFont=setFont
local toN,toS=tonumber,tostring local toN,toS=tonumber,tostring
@@ -11,25 +13,18 @@ local function splitS(s,sep)
if #s~=0 then goto L end if #s~=0 then goto L end
return t return t
end end
function without(t,v)
for i=1,#t do
if t[i]==v then return end
end
return true
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 end
function getNewRow(val) function getNewRow(val)
if not val then val=0 end
local t=rem(freeRow) local t=rem(freeRow)
for i=1,10 do for i=1,10 do
t[i]=val or 0 t[i]=val
end end
--clear a row and move to active list --clear a row and move to active list
if #freeRow==0 then if #freeRow==0 then
for i=1,20 do for i=1,10 do
ins(freeRow,{0,0,0,0,0,0,0,0,0,0}) ins(freeRow,{0,0,0,0,0,0,0,0,0,0})
end end
end end
@@ -41,8 +36,8 @@ 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"}
function swapLanguage(l) function swapLanguage(l)
text=require("language/"..langID[l]) text=require("language/"..langID[l])
Buttons.sel=nil Buttons.sel=nil
@@ -71,7 +66,7 @@ function swapLanguage(l)
collectgarbage() collectgarbage()
end 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,20 +170,34 @@ function gotoScene(s,style)
draw=swap[style].d draw=swap[style].d
} }
Buttons.sel=nil Buttons.sel=nil
if style~="none"then
sysSFX("swipe")
end
end
end
function updateStat()
for k,v in next,players[1].stat do
print(k)
stat[k]=stat[k]+v
end end
end end
local prevMenu={ local prevMenu={
load=love.event.quit, load=love.event.quit,
intro="quit", intro="quit",
main="intro", main="intro",
mode="main", mode="main",
custom="mode", custom="mode",
draw=function()
kb.setKeyRepeat(false)
gotoScene("custom")
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=null,
help="main", help="main",
stat="main", stat="main",
setting=function() setting=function()
@@ -197,7 +206,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
@@ -206,35 +215,46 @@ function back()
t() t()
end end
end end
function pauseGame()
pauseTimer=0--Pause timer for animation
if not gamefinished then
pauseCount=pauseCount+1
if bgmPlaying then bgm[bgmPlaying]:pause()end
end
for i=1,#players.alive do
local l=players.alive[i].keyPressing
for j=1,#l do
if l[j]then
releaseKey(j,players.alive[i])
end
end
end
gotoScene("pause","none")
end
function resumeGame()
if bgmPlaying then bgm[bgmPlaying]:play()end
gotoScene("play","fade")
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={ local saveOpt={
"ghost","center",
"grid","swap",
"fxs","bg",
"das","arr",
"sddas","sdarr",
"lang", "lang",
"ghost",
"center", "sfx","bgm",
"grid",
"swap",
"sfx",
"bgm",
"vib", "vib",
"fxs",
"das",
"arr",
"sddas",
"sdarr",
"fullscreen", "fullscreen",
"bgblock", "bgblock",
"virtualkeyAlpha", "virtualkeyAlpha",
@@ -252,10 +272,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
@@ -264,7 +289,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)
@@ -283,7 +308,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)
@@ -329,10 +354,10 @@ function loadSetting()
elseif t=="das"or t=="arr"or t=="sddas"or t=="sdarr"then elseif t=="das"or t=="arr"or t=="sddas"or t=="sdarr"then
v=toN(v)if not v or v<0 then v=0 end v=toN(v)if not v or v<0 then v=0 end
setting[t]=int(v) setting[t]=int(v)
elseif t=="ghost"or t=="center"or t=="grid"or t=="swap"or t=="fxs"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
end end
end end
end end
@@ -343,25 +368,25 @@ function saveSetting()
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 end
local lib={} local lib={}
for i=1,4 do for i=1,4 do
lib[i]=table.concat(setting.keyLib[i],",") lib[i]=concat(setting.keyLib[i],",")
end end
local t={ local t={
"keymap="..toS(table.concat(map,"/")), "keymap="..toS(concat(map,"/")),
"keylib="..toS(table.concat(lib,"/")), "keylib="..toS(concat(lib,"/")),
"virtualkey="..toS(table.concat(vk,"/")), "virtualkey="..toS(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)