Compare commits

...

5 Commits

Author SHA1 Message Date
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
MrZ_26
c9a3e3ce1b Alpha V0.7.13+ 2020-02-04 19:33:03 +08:00
MrZ_26
72dcb84662 Alpha V0.7.12 2020-02-04 19:32:38 +08:00
MrZ_26
4af2126254 Alpha V0.7.11 2020-02-04 19:32:26 +08:00
30 changed files with 3104 additions and 2563 deletions

BIN
BGM/end.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
SFX/collect.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
SFX/lock.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
SFX/swipe.ogg Normal file

Binary file not shown.

33
ai.lua
View File

@@ -51,7 +51,7 @@ function ifoverlapAI(f,bk,x,y)
if y<1 then return true end if y<1 then return true end
if y>#f then return end if y>#f then return end
for i=1,#bk do for j=1,#bk[1]do for i=1,#bk do for j=1,#bk[1]do
if f[y+i-1]and bk[i][j]>0 and f[y+i-1][x+j-1]>0 then return true end if f[y+i-1]and bk[i][j]and f[y+i-1][x+j-1]>0 then return true end
end end end end
end end
function resetField(f0,f,start) function resetField(f0,f,start)
@@ -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,19 +69,17 @@ 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
for i=cy+#cb-1,cy,-1 do for i=cy+#cb-1,cy,-1 do
local f=true
for j=1,10 do for j=1,10 do
if field[i][j]==0 then f=false;break end if field[i][j]==0 then goto L end
end
if f then
removeRow(field,i)
clear=clear+1
end end
removeRow(field,i)
clear=clear+1
::L::
end end
if #field==0 then return 9e99 end--PC best if #field==0 then return 9e99 end--PC best
for x=1,10 do for x=1,10 do
@@ -119,21 +117,21 @@ function getScore(field,bn,cb,cx,cy)
+clearScore[clear]*(8+#field) +clearScore[clear]*(8+#field)
-hole*50 -hole*50
if #field>6 then score=score-highest*5 end if #field>6 then score=score-highest*5 end
if mh1>3 then score=score-50-mh1*40 end if mh1>3 then score=score-40-mh1*30 end
return score return score
end end
function AI_getControls(ctrl) 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
end end
local best={x=1,dir=0,hold=false,score=-9e99} local best={x=1,dir=0,hold=false,score=-9e99}
for ifhold=0,P.gameEnv.hold and 1 or 0 do for ifhold=0,P.gameEnv.hold and 1 or 0 do
local bn=ifhold==0 and P.bid or P.hid>0 and P.hid or P.nxt[1] local bn=ifhold==0 and P.cur.id or P.hold.id>0 and P.hold.id or P.next[1].id
for dir=0,dirCount[bn] do--each dir for dir=0,dirCount[bn] do--each dir
local cb=blocks[bn][dir] local cb=blocks[bn][dir]
for cx=1,11-#cb[1]do--each pos for cx=1,11-#cb[1]do--each pos
@@ -144,9 +142,9 @@ 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]~=0 then if cb[i][j]then
Tfield[y][cx+j-1]=1 Tfield[y][cx+j-1]=1
end end
end end
@@ -173,11 +171,4 @@ function AI_getControls(ctrl)
ins(ctrl,l[i]) ins(ctrl,l[i])
end end
ins(ctrl,6) ins(ctrl,6)
if rnd()<.1 then
if P.atkMode~=4 and P==mostDangerous then
ins(P.ai.controls,9)
--Smarter AI???
end
end
end end

View File

@@ -1,5 +1,106 @@
local gc,tm=love.graphics,love.timer
local ms,kb,tc=love.mouse,love.keyboard,love.touch
local wd=love.window
local setFont=setFont
local Timer=tm.getTime
local scr=scr
local xOy=love.math.newTransform()
local focus=true
local mx,my,mouseShow=-20,-20,false
local touching=nil--1st touching ID
local sceneInit={
load=function()
curBG="none"
loading=1--Loading mode
loadnum=1--Loading counter
loadprogress=0--Loading bar(0~1)
loadTip=text.tips[rnd(#text.tips)]
end,
intro=function()
curBG="none"
count=0
BGM("blank")
end,
main=function()
curBG="none"
collectgarbage()
end,
mode=function()
saveData()
modeSel=modeSel or 1
levelSel=levelSel or 3
curBG="none"
BGM("blank")
end,
custom=function()
optSel=optSel or 1
curBG="matrix"
BGM("blank")
end,
draw=function()
kb.setKeyRepeat(true)
clearSureTime=0
pen=1
sx,sy=1,1
curBG="none"
end,
play=function()
if needResetGameData then
resetGameData()
needResetGameData=nil
end
sysSFX("ready")
end,
pause=function()
pauseTime=0
end,
setting=function()
curBG="none"
end,
setting2=function()
curBG="none"
curBoard=1
keyboardSet=1
joystickSet=1
keyboardSetting=false
joystickSetting=false
end,--Control settings
setting3=function()
curBG="game1"
defaultSel=1
sel=nil
snapLevel=1
end,--Touch setting
help=function()
curBG="none"
end,
stat=function()
curBG="none"
end,
quit=function()
love.event.quit()
end,
}
BGblockList={}for i=1,16 do BGblockList[i]={v=0}end
local BGblock={tm=150,next=7,ct=0}
local function getNewBlock()
BGblock.ct=BGblock.ct+1
if BGblock.ct==17 then BGblock.ct=1 end
local t=BGblockList[BGblock.ct]
t.bn,t.size=BGblock.next,2+3*rnd()
t.b=blocks[t.bn][rnd(0,3)]
t.x=rnd(-#t.b[1]*t.size*30+100,1180)
t.y=-#t.b*30*t.size
t.v=t.size*(1+rnd())
BGblock.next=BGblock.next%7+1
return t
end
local scs={{1,2},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]
@@ -14,37 +115,32 @@ function onVirtualkey(x,y)
end end
function buttonControl_key(i) function buttonControl_key(i)
if i=="up"or i=="down"or i=="left"or i=="right"then if i=="up"or i=="down"or i=="left"or i=="right"then
if not Buttons.sel then if Buttons.sel then
if Buttons[scene][1]then Buttons.sel=Buttons[scene][Buttons.sel[i]]or Buttons.sel
Buttons.sel=1
end
else else
Buttons.sel=Buttons[scene][Buttons.sel][i]or Buttons.sel Buttons.sel=select(2,next(Buttons[scene]))
mouseShow=false
end end
elseif i=="space"or i=="return"then elseif i=="space"or i=="return"then
if not sceneSwaping and Buttons.sel then if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel] Buttons.sel.alpha=1
B.code() Buttons.sel.code()
B.alpha=1
sysSFX("button") sysSFX("button")
end end
end end
end end
function buttonControl_gamepad(i) function buttonControl_gamepad(i)
if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then
if not Buttons.sel then if Buttons.sel then
if Buttons[scene][1]then Buttons.sel=Buttons[scene][Buttons.sel[i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]]or Buttons.sel
Buttons.sel=1
end
mouseShow=false
else else
Buttons.sel=Buttons[scene][Buttons.sel][i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]or Buttons.sel Buttons.sel=select(2,next(Buttons[scene]))
mouseShow=false
end end
elseif i=="start"then elseif i=="start"then
if not sceneSwaping and Buttons.sel then if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel] Buttons.sel.alpha=1
B.code() Buttons.sel.code()
B.alpha=1
sysSFX("button") sysSFX("button")
end end
end end
@@ -59,6 +155,126 @@ 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
sel=nil
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={}
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)
modeSel=min(max(modeSel+(y>0 and -1 or 1),1),#modeID)
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
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
@@ -105,12 +321,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
@@ -141,9 +387,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"then pauseGame()end
local m=setting.keyMap local m=setting.keyMap
for p=1,4 do for p=1,human do
local lib=setting.keyLib[p] local lib=setting.keyLib[p]
for s=1,#lib do for s=1,#lib do
for k=1,12 do for k=1,12 do
@@ -155,10 +401,17 @@ 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
for p=1,4 do for p=1,human do
local lib=setting.keyLib[p] local lib=setting.keyLib[p]
for s=1,#lib do for s=1,#lib do
for k=1,12 do for k=1,12 do
@@ -248,149 +501,116 @@ function gamepadUp.play(key)
end end
end end
end end
wheelmoved={}
function wheelmoved.mode(x,y)
modeSel=min(max(modeSel-sgn(y),1),#modeID)
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
end
function love.mousepressed(x,y,k,t,num)
function love.mousemoved(x,y,dx,dy,t) if t then return end
if not t then mouseShow=true
mouseShow=true mx,my=xOy:inverseTransformPoint(x,y)
mx,my=xOy:inverseTransformPoint(x,y) if mouseDown[scene]then
Buttons.sel=nil mouseDown[scene](mx,my,k)
for i=1,#Buttons[scene]do elseif k==2 then
local B=Buttons[scene][i] back()
if not(B.hide and B.hide())then end
if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then if k==1 then
Buttons.sel=i if not sceneSwaping and Buttons.sel then
return local B=Buttons.sel
end B.code()
end B.alpha=1
Buttons.sel=nil
love.mousemoved(x,y,0,0)
sysSFX("button")
end end
end end
end end
function love.mousepressed(x,y,k,t,num) function love.mousemoved(x,y,dx,dy,t)
if not t then if t then return end
mouseShow=true mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y) mx,my=xOy:inverseTransformPoint(x,y)
if mouseDown[scene]then Buttons.sel=nil
mouseDown[scene](mx,my,k) if mouseMove[scene]then
else mouseMove[scene](mx,my,dx/scr.k,dy/scr.k)
if k==1 then end
if not sceneSwaping and Buttons.sel then for _,B in next,Buttons[scene]do
local B=Buttons[scene][Buttons.sel] if not(B.hide and B.hide())then
B.code() if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then
B.alpha=1 Buttons.sel=B
Buttons.sel=nil return
love.mousemoved(x,y)
sysSFX("button")
end
elseif k==2 then
back()
end end
end end
end 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
end 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.mousemoved(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)
if id==touching then if id==touching then
touching=nil touching=nil
if Buttons.sel then if Buttons.sel then
local B=Buttons[scene][Buttons.sel] local B=Buttons.sel
B.code() B.code()
B.alpha=1 B.alpha=1
Buttons.sel=nil Buttons.sel=nil
sysSFX("button")
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)
mouseShow=false
if not Buttons.sel then if not Buttons.sel then
touching=nil touching=nil
end end
if scene=="play"and setting.virtualkeySwitch then x,y=xOy:inverseTransformPoint(x,y)
local l=tc.getTouches() if touchMove[scene]then
for n=1,#virtualkey do touchMove[scene](id,x,y,dx/scr.k,dy/scr.k)
local b=virtualkey[n] end
for i=1,#l do for _,B in next,Buttons[scene]do
local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i])) if not(B.hide and B.hide())then
if(x-b[1])^2+(y-b[2])^2<=b[3]then return end if abs(x-B.x)<B.w*.5 and abs(y-B.y)<B.h*.5 then
Buttons.sel=B
return
end end
if P.keyPressing[n]then
releaseKey(n,players[1])
end
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
end end
function love.keypressed(i) function love.keypressed(i)
if i=="f12"then devMode=not devMode end if i=="f8"then devMode=not devMode end
if devMode then if devMode then
if i=="k"then if i=="k"then
P=players.alive[rnd(#players.alive)] P=players.alive[rnd(#players.alive)]
Event.gameover.lose() Event_gameover.lose()
--Test code here
elseif i=="q"then elseif i=="q"then
for i=1,#Buttons[scene]do for k,B in next,Buttons[scene]do
local B=Buttons[scene][i]
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[scene][Buttons.sel] local B=Buttons.sel
if i=="left"then B.x=B.x-10 if i=="left"then B.x=B.x-10
elseif i=="right"then B.x=B.x+10 elseif i=="right"then B.x=B.x+10
elseif i=="up"then B.y=B.y-10 elseif i=="up"then B.y=B.y-10
@@ -426,17 +646,34 @@ 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.lowmemory()
collectgarbage()
end
function love.resize(w,h)
if w>=h then scr.w,scr.h=w,h
else scr.w,scr.h=h,w
end
scr.r=h/w
if h/w>=.5625 then
scr.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 scene=="play"then pauseGame()end
end
function love.update(dt) function love.update(dt)
--[[ --[[
if players then if players then
@@ -450,45 +687,42 @@ function love.update(dt)
if BGblock[i].y>720 then rem(BGblock,i)end if BGblock[i].y>720 then rem(BGblock,i)end
end end
if setting.bgblock then if setting.bgblock then
BGblock.ct=BGblock.ct-1 BGblock.tm=BGblock.tm-1
if BGblock.ct==0 then if BGblock.tm==0 then
ins(BGblock,getNewBlock()) ins(BGblock,getNewBlock())
BGblock.ct=rnd(20,30) BGblock.tm=rnd(20,30)
end end
end end
if sceneSwaping then if sceneSwaping then
sceneSwaping.time=sceneSwaping.time-1 sceneSwaping.time=sceneSwaping.time-1
if sceneSwaping.time==sceneSwaping.mid then if sceneSwaping.time==sceneSwaping.mid then
for i=1,#Buttons[scene]do for k,B in next,Buttons[scene]do
Buttons[scene][i].alpha=0 B.alpha=0
end--Reset buttons' state 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
sceneSwaping=nil sceneSwaping=nil
end end
elseif Tmr[scene]then end
if Tmr[scene]then
Tmr[scene](dt) Tmr[scene](dt)
end end
for i=#Task,1,-1 do
Task[i]:update()
end
updateButton() updateButton()
end end
function love.sendData(data)
return
end
function love.receiveData(id,data)
return
end
function love.draw() function love.draw()
gc.clear() gc.discard()--SPEED UPUPUP!
Pnt.BG[curBG]() Pnt.BG[setting.bg and curBG or"grey"]()
gc.setColor(1,1,1,.3) 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
for i=1,#b do for j=1,#b[1]do for i=1,#b do for j=1,#b[1]do
if b[i][j]>0 then if b[i][j]then
gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size) gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size)
end end
end end end end
@@ -499,7 +733,7 @@ function love.draw()
local r=Timer()*.5 local r=Timer()*.5
gc.setColor(1,1,1,min(1-abs(1-r%1*2),.3)) gc.setColor(1,1,1,min(1-abs(1-r%1*2),.3))
r=int(r)%7+1 r=int(r)%7+1
gc.draw(mouseBlock[r],mx,my,Timer()%pi*4,20,20,scs[r][0][2]-.5,#blocks[r][0]-scs[r][0][1]+.5) gc.draw(mouseBlock[r],mx,my,Timer()%pi*4,20,20,scs[r][2]-.5,#blocks[r][0]-scs[r][1]+.5)
gc.setColor(1,1,1,.5) gc.setColor(1,1,1,.5)
gc.circle("fill",mx,my,5) gc.circle("fill",mx,my,5)
gc.setColor(1,1,1) gc.setColor(1,1,1)
@@ -507,74 +741,44 @@ function love.draw()
end end
if sceneSwaping then sceneSwaping.draw()end if sceneSwaping then sceneSwaping.draw()end
if wh/ww>.5625 then if scr.r==.5625 then goto L end
gc.setColor(0,0,0) if scr.r>.5625 then
gc.rectangle("fill",0,0,1280,ww*9/16-wh) gc.setColor(0,0,0)
gc.rectangle("fill",0,720,1280,wh-ww*9/16) gc.rectangle("fill",0,0,1280,scr.w*9/16-scr.h)
elseif wh/ww<.5625 then gc.rectangle("fill",0,720,1280,scr.h-scr.w*9/16)
gc.setColor(0,0,0) else
gc.rectangle("fill",0,0,wh*16/9-ww,720) gc.setColor(0,0,0)
gc.rectangle("fill",1280,0,ww-wh*16/9,720) gc.rectangle("fill",0,0,scr.h*16/9-scr.w,720)
end gc.rectangle("fill",1280,0,scr.w-scr.h*16/9,720)
end
::L::
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)
ww,wh=w,h
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)
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 gc.clear()
gc.clear() love.draw()
love.draw() gc.present()
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()

44
class.lua Normal file
View File

@@ -0,0 +1,44 @@
Task={}
metatable_task={__index=Task}
function newTask(code,P,data)
local obj={
code=code,
P=P,
data=data,
}
setmetatable(obj,metatable_task)
ins(Task,obj)
end
function clearTask(opt)
if opt=="all"then
while Task[1]do
rem(Task,i)
end
elseif opt=="play"then
for i=#Task,1,-1 do
if Task[i].P then
rem(Task,i)
end
end
else--Player table
for i=#Task,1,-1 do
if Task[i].P==P then
rem(Task,i)
end
end
end
end
function Task:update()
if self.code(self.P,self.data)then
self:destroy()
return nil
end
end
function Task:destroy()
for i=#Task,1,-1 do
if Task[i]==self then
rem(Task,i)
return nil
end
end
end

View File

@@ -9,7 +9,7 @@ function love.conf(t)
t.audio.mixwithsystem=true--Switch on to keep sysBGM t.audio.mixwithsystem=true--Switch on to keep sysBGM
local W=t.window local W=t.window
W.title="Techmino V0.7.10" W.title="Techmino V0.7.15"
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
@@ -17,7 +17,7 @@ function love.conf(t)
W.resizable=true W.resizable=true
W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string) W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string)
W.fullscreen=X W.fullscreen=X
W.vsync=X--0 to set ∞fps W.vsync=0--0∞fps
W.msaa=X--The number of samples to use with multi-sampled antialiasing (number) W.msaa=X--The number of samples to use with multi-sampled antialiasing (number)
W.depth=X--Bits per sample in the depth buffer W.depth=X--Bits per sample in the depth buffer
W.stencil=1--The number of bits per sample in the stencil buffer W.stencil=1--The number of bits per sample in the stencil buffer

1082
dataList.lua Normal file

File diff suppressed because it is too large Load Diff

BIN
font.ttf

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
image/mess/groupcode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
image/mess/light.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

BIN
image/mess/lightBulb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

BIN
image/mess/paycode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

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

@@ -1,18 +1,17 @@
return{ return{
royale_remain=function(n) atkModeName={"随机","徽章","击杀","反击"},
return "剩余 "..n.." 名玩家" royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
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连击","4连击","5连击","6连击","7连击","8连击","9连击","10连击!","11连击!","12连击!","13连击!","14连击!","15连击!","16连击!","17连击!","18连击!","19连击!","巨型连击"}, techrash="Techrash",
techrash="四清", techrashB2B="Techrash B2B",
techrashB2B="满贯 四清", techrashB3B="Techrash B2B2B",
techrashB3B="大满贯 四清",
block={"Z","S","L","J","T","O","I"}, block={"Z","S","L","J","T","O","I"},
spin={"Z型回旋","S型回旋","L型回旋","J型回旋","T型回旋","O型回旋","I型回旋"}, spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
clear={"单清","双清","三清"}, clear={" single"," double"," triple"},
b2b="满贯 ", b2b="B2B ",
b3b="大满贯 ", b3b="B2B2B ",
mini="次级", mini="Mini",
PC="场地全清", PC="Perfect Clear",
hold="暂存", hold="暂存",
next="下一个", next="下一个",
@@ -22,6 +21,7 @@ return{
win="胜利", win="胜利",
lose="失败", lose="失败",
pause="暂停",
custom="自定义游戏", custom="自定义游戏",
customOption={ customOption={
@@ -45,7 +45,7 @@ return{
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,""},
freshLimit={0,8,15,""}, freshLimit={0,8,15,""},
opponent={"无电脑",1,2,3,4,5,6,7,8,9,10,11}, opponent={"无电脑",1,2,3,4,5,6,7,8,9,10,11},
@@ -53,20 +53,21 @@ 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","隐形","挖掘","生存","科研",
"全清训练","全清挑战","41人混战","99人混战","干旱","多人", "全清训练","全清挑战","41人混战","99人混战","干旱","多人",
}, },
modeInfo={ modeInfo={
sprint="挑战世界纪录", sprint="挑战世界纪录",
marathon="尝试坚持到最后", marathon="尝试坚持到最后",
master="成为方块大师",
classic="高速经典", classic="高速经典",
zen="无重力消除200行", zen="无重力消除200行",
infinite="科研沙盒", infinite="科研沙盒",
@@ -84,17 +85,20 @@ return{
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存在吗?",
"MrZ旋转消5!",
"MEGACMB!", "MEGACMB!",
"ALLSPIN!", "ALLSPIN!",
"O spin Techrash?" "O型回旋三清?",
"只用一个输入设备就可以玩游戏啦~",
"Miya:喵!",
"225238922,哔哩哔哩 干杯~",
}, },
stat={ stat={
"游戏运行次数:", "游戏运行次数:",
@@ -121,71 +125,100 @@ return{
"特别感谢:Farter,Teatube,196,Flyz,T830,[所有测试人员]和 你!", "特别感谢:Farter,Teatube,196,Flyz,T830,[所有测试人员]和 你!",
"错误或者建议请附带相关信息发送到作者邮箱~", "错误或者建议请附带相关信息发送到作者邮箱~",
}, },
support="支持作者",
group="官方QQ群",
ButtonText={ ButtonText={
main={ main={
"开始", play="开始",
"设置", setting="设置",
"帮助", stat="统计信息",
"统计信息", help="帮助",
"退出", quit="退出",
}, },
mode={ mode={
"Λ", up="Λ",
"v", down="v",
"<", left="<",
">", right=">",
"开始", start="开始",
"自定义(C)", custom="自定义(C)",
"返回", back="返回",
}, },
custom={ custom={
"Λ", up="Λ",
"v", 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={ setting={
function()return setting.ghost and"阴影 "or"阴影 "end, ghost=function()return setting.ghost and"阴影:"or"阴影:"end,
function()return setting.center 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="+",
function()return setting.sfx and"音效 "or"音效 "end, sfx=function()return setting.sfx and"音效:"or"音效:"end,
function()return setting.bgm and"音乐 "or"音乐 "end, bgm=function()return setting.bgm and"音乐:"or"音乐:"end,
function()return "震动强度:"..setting.vib end, vib=function()return "震动强度:"..setting.vib end,
function()return setting.fullscreen and"全屏 "or"全屏 "end, fullscreen=function()return setting.fullscreen and"全屏:"or"全屏:"end,
function()return setting.bgblock and"背景动画 "or"背景动画 "end, bgblock=function()return setting.bgblock and"背景动画:"or"背景动画:"end,
function()return"绘制帧:"..setting.frameMul.."%"end, frame=function()return"绘制帧:"..setting.frameMul.."%"end,
"控制设置", control="控制设置",
"触摸设置", touch="触摸设置",
function()return langName[setting.lang]end, lang=function()return langName[setting.lang]end,
"保存&返回", back="保存&返回",
}, },
setting2={ setting2={
"返回", back="返回",
}, },
setting3={ setting3={
"返回", back="返回",
function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end, hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end,
"默认组合", default="默认组合",
function()return text.snapLevelName[snapLevel]end, snap=function()return text.snapLevelName[snapLevel]end,
function()return percent0to5[setting.virtualkeyAlpha]end, alpha=function()return percent0to5[setting.virtualkeyAlpha]end,
"图标", icon="图标",
"大小", size="大小",
}, },
help={ help={
"返回", back="返回",
"作者QQ", qq="作者QQ",
}, },
stat={ stat={
"返回", back="返回",
path="打开存储目录",
}, },
}, },
}--中文 }--中文

View File

@@ -1,20 +1,19 @@
return{ return{
royale_remain=function(n) atkModeName={"Random","Badges","K.O.s","Counters"},
return n.." Players Remain" royale_remain=function(n)return n.." Players Remain"end,
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="Techrash B2B",
techrashB3B="Techrash B2B2B", techrashB3B="Techrash B2B2B",
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"}, 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", b2b="B2B ",
b3b=" B2B2B", b3b="B2B2B ",
mini="Mini", mini="Mini",
PC="Perfect Clear", PC="Perfect Clear",
hold="hold", hold="Hold",
next="next", next="Next",
stage={"STAGE 1","STAGE 2","STAGE 3","STAGE 4","STAGE 5",}, stage={"STAGE 1","STAGE 2","STAGE 3","STAGE 4","STAGE 5",},
maxspeed="Max speed", maxspeed="Max speed",
@@ -22,6 +21,7 @@ return{
win="WIN", win="WIN",
lose="LOSE", lose="LOSE",
pause="PAUSE",
custom="Custom Game", custom="Custom Game",
customOption={ customOption={
@@ -43,9 +43,9 @@ return{
wait=nil, wait=nil,
fall=nil, fall=nil,
next=nil, next=nil,
hold={"on","off"}, hold={"ON","OFF"},
sequence={"bag7","his4","random"}, sequence={"bag7","his4","random"},
visible={"normal","time","invisible"}, visible={"normal","time","invisible","sudden"},
target={10,20,40,100,200,500,1000,""}, target={10,20,40,100,200,500,1000,""},
freshLimit={0,8,15,""}, freshLimit={0,8,15,""},
opponent={"No CPU",1,2,3,4,5,6,7,8,9,10,11}, opponent={"No CPU",1,2,3,4,5,6,7,8,9,10,11},
@@ -53,20 +53,21 @@ 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","Classic","Zen","Infinite","1v1","TSD-only","Blind","Dig","Survivor","Tech", "Sprint","Marathon","Master","Classic","Zen","Infinite","1v1","TSD-only","Blind","Dig","Survivor","Tech",
"PC Train","PC Challenge","Techmino41","Techmino99","Drought","Hotseat", "PC Train","PC Challenge","Techmino41","Techmino99","Drought","Hotseat",
}, },
modeInfo={ modeInfo={
sprint="Speed run", sprint="Speed run",
marathon="Survive and reach target", marathon="Survive and reach target",
master="To be Grand Master",
classic="Vintage car drag racing", classic="Vintage car drag racing",
zen="Clear 200 Lines without gravity", zen="Clear 200 Lines without gravity",
infinite="Infinite game,infinite happiness", infinite="Infinite game,infinite happiness",
@@ -84,17 +85,20 @@ 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!", "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!",
}, },
stat={ stat={
"Games run:", "Games run:",
@@ -109,7 +113,7 @@ return{
"Total spin:", "Total spin:",
}, },
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 SMALL 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",
@@ -121,71 +125,100 @@ return{
"Special thanks:Farter,Teatube,196,Flyz,T830,[all test staff] and YOU!", "Special thanks:Farter,Teatube,196,Flyz,T830,[all test staff] and YOU!",
"Any bugs/suggestions to my E-mail.", "Any bugs/suggestions to my E-mail.",
}, },
support="Support Author",
group="Official QQ Group",
ButtonText={ ButtonText={
main={ main={
"Play", play="Play",
"Settings", setting="Settings",
"Help", stat="Statistics",
"Statistics", help="Help",
"Quit", quit="Quit",
}, },
mode={ mode={
"Λ", up="Λ",
"v", down="v",
"<", left="<",
">", right=">",
"Start", start="Start",
"Custom(C)", custom="Custom(C)",
"Back", back="Back",
}, },
custom={ custom={
"Λ", up="Λ",
"v", down="v",
"<", left="<",
">", right=">",
"Start", start1="Clear Start",
"Back", 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",
},
play={
pause="Pause",
},
pause={
resume="Resume",
quit="Quit",
}, },
setting={ setting={
function()return setting.ghost and"Ghost:ON"or"Ghost:OFF"end, ghost=function()return setting.ghost and"Ghost:ON"or"Ghost:OFF"end,
function()return setting.center and"Center:ON"or"Center:OFF"end, center=function()return setting.center and"Center:ON"or"Center:OFF"end,
"-", grid=function()return setting.grid and"Grid:ON"or"Grid:OFF"end,
"+", swap=function()return setting.swap and"Swap:comboKey"or"Swap:loop"end,
"-", fxs=function()return setting.fxs and"FXs:ON"or"FXs:OFF"end,
"+", bg=function()return setting.bg and"BG:ON"or"BG:OFF"end,
"-", dasD="-",dasU="+",
"+", arrD="-",arrU="+",
"-", sddasD="-",sddasU="+",
"+", sdarrD="-",sdarrU="+",
function()return setting.sfx and"SFX:on"or"SFX:off"end, sfx=function()return setting.sfx and"SFX:ON"or"SFX:OFF"end,
function()return setting.bgm and"BGM:on"or"BGM:off"end, bgm=function()return setting.bgm and"BGM:ON"or"BGM:OFF"end,
function()return "Vibrate level:"..setting.vib end, vib=function()return "Vibrate level:"..setting.vib end,
function()return setting.fullscreen and"Fullscreen:on"or"Fullscreen:off"end, fullscreen=function()return setting.fullscreen and"Fullscreen:ON"or"Fullscreen:OFF"end,
function()return setting.bgblock and"BG animation:on"or"BG animation:off"end, bgblock=function()return setting.bgblock and"BG animation:ON"or"BG animation:OFF"end,
function()return"FrameDraw:"..setting.frameMul.."%"end, frame=function()return"FrameDraw:"..setting.frameMul.."%"end,
"Control settings", control="Control settings",
"Touch settings", touch="Touch settings",
function()return langName[setting.lang]end, lang=function()return langName[setting.lang]end,
"Save&Back", back="Save&Back",
}, },
setting2={ setting2={
"Back", back="Back",
}, },
setting3={ setting3={
"Back", back="Back",
function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end, hide=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,
"Defaults", default="Defaults",
function()return text.snapLevelName[snapLevel]end, snap=function()return text.snapLevelName[snapLevel]end,
function()return percent0to5[setting.virtualkeyAlpha]end, alpha=function()return percent0to5[setting.virtualkeyAlpha]end,
"Icon", icon="Icon",
"Size", size="Size",
}, },
help={ help={
"Back", back="Back",
"Author's qq", qq="Author's qq",
}, },
stat={ stat={
"Back", back="Back",
path="Open Data Folder",
}, },
} }
} }

957
list.lua

File diff suppressed because it is too large Load Diff

698
main.lua
View File

@@ -1,39 +1,23 @@
lib={ local gc,tm=love.graphics,love.timer
gc=love.graphics, local ms,kb=love.mouse,love.keyboard
kb=love.keyboard, local fs,sys=love.filesystem,love.system
ms=love.mouse,
tc=love.touch,
tm=love.timer,
fs=love.filesystem,
wd=love.window,
mt=love.math,
sys=love.system,
}for k,v in pairs(lib)do _G[k]=v end lib=nil
toN,toS=tonumber,tostring
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,sort=table.insert,table.remove,table.sort
math.randomseed(os.time()*626)
null=function()end null=function()end
ww,wh=gc.getWidth(),gc.getHeight()
Timer=tm.getTime--Easy&Quick to get time!
mx,my,mouseShow=-20,-20,false
xOy=love.math.newTransform()
focus=true
system=sys.getOS() system=sys.getOS()
touching=nil--1st touching ID scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1}
scene="" scene=""
bgmPlaying=nil bgmPlaying=nil
curBG="none" curBG="none"
BGblock={ct=150,next=7}
kb.setKeyRepeat(false) kb.setKeyRepeat(false)
kb.setTextInput(false) kb.setTextInput(false)
ms.setVisible(false) ms.setVisible(false)
Fonts={} local Fonts={}
function setFont(s) function setFont(s)
if s~=currentFont then if s~=currentFont then
if Fonts[s]then if Fonts[s]then
@@ -45,23 +29,25 @@ function setFont(s)
end end
currentFont=s currentFont=s
end end
return Fonts[s]
end end
gameEnv0={ 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,
_20G=false,bone=false,
drop=30,lock=45, drop=30,lock=45,
wait=1,fall=1, wait=0,fall=0,
next=6,hold=true,oncehold=true, next=6,hold=true,oncehold=true,
sequence="bag7",visible=1, sequence="bag7",
_20G=false,target=1e99,
freshLimit=15, block=true,
ospin=true, keepVisible=true,visible="show",
reach=null, Fkey=false,puzzle=false,ospin=true,
bg="none", freshLimit=1e99,target=1e99,reach=null,
bgm="race" bg="none",bgm="race"
--not all is actually used,some only provide a key
} }
customSel={ customSel={
drop=20, drop=20,
@@ -76,620 +62,24 @@ customSel={
freshLimit=3, freshLimit=3,
opponent=1, opponent=1,
} }
loadmode={ preField={}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
sprint=function() freeRow={}
createPlayer(1,340,15) for i=1,40 do
end, freeRow[i]={0,0,0,0,0,0,0,0,0,0}
marathon=function() end
createPlayer(1,340,15)
end,
classic=function()
createPlayer(1,340,15)
end,
zen=function()
createPlayer(1,340,15)
end,
infinite=function()
createPlayer(1,340,15)
end,
solo=function()
createPlayer(1,200,15)
createPlayer(2,830,220,.7,customRange.opponent[3*curMode.lv])
end,
tsd=function()
createPlayer(1,340,15)
end,
blind=function()
createPlayer(1,340,15)
end,
dig=function()
createPlayer(1,340,15)
local P=players[1]
if curMode.lv==1 then
ins(players[1].task,Event.task.dig_normal)
pushSpeed=1
elseif curMode.lv==2 then
ins(players[1].task,Event.task.dig_lunatic)
pushSpeed=1
end
end,
survivor=function()
createPlayer(1,340,15)
local P=players[1]
ins(players[1].task,Event.task[curMode.lv==1 and"survivor_easy"or curMode.lv==2 and"survivor_normal"or curMode.lv==3 and"survivor_hard"or curMode.lv==4 and"survivor_lunatic"])
pushSpeed=curMode.lv>2 and 2 or 1
end,
tech=function()
createPlayer(1,340,15)
end,
pctrain=function()
createPlayer(1,340,15)
P=players[1]
Event.newPC()
P.freshNext()
end,
pcchallenge=function()
createPlayer(1,340,15)
end,
techmino41=function()
createPlayer(1,340,15)--Player
if curMode.lv==5 then players[1].gameEnv.drop=15 end
local n,min,max=2
if curMode.lv==1 then min,max=5,30
elseif curMode.lv==2 then min,max=3,25
elseif curMode.lv==3 then min,max=2,20
elseif curMode.lv==4 then min,max=2,10
elseif curMode.lv==5 then min,max=1,6
end
for i=1,4 do for j=1,5 do
createPlayer(n,77*i-55,140*j-125,.2,rnd(min,max))
n=n+1
end end
for i=9,12 do for j=1,5 do
createPlayer(n,77*i+275,140*j-125,.2,rnd(min,max))
n=n+1
end end
--AIs
end,
techmino99=function()
createPlayer(1,340,15)--Player
if curMode.lv==5 then players[1].gameEnv.drop=15 end
local n,min,max=2
if curMode.lv==1 then min,max=5,32
elseif curMode.lv==2 then min,max=3,25
elseif curMode.lv==3 then min,max=2,18
elseif curMode.lv==4 then min,max=2,12
elseif curMode.lv==5 then min,max=1,12
end
for i=1,7 do for j=1,7 do
createPlayer(n,46*i-36,97*j-72,.135,rnd(min,max))
n=n+1
end end
for i=15,21 do for j=1,7 do
createPlayer(n,46*i+264,97*j-72,.135,rnd(min,max))
n=n+1
end end
--AIs
end,
drought=function()
createPlayer(1,340,15)
end,
hotseat=function()
if curMode.lv==1 then
createPlayer(1,20,15)
createPlayer(2,650,15)
elseif curMode.lv==2 then
createPlayer(1,20,100,.65)
createPlayer(2,435,100,.65)
createPlayer(3,850,100,.65)
elseif curMode.lv==3 then
createPlayer(1,25,160,.5)
createPlayer(2,335,160,.5)
createPlayer(3,645,160,.5)
createPlayer(4,955,160,.5)
end
end,
custom=function()
for i=1,#customID do
local k=customID[i]
modeEnv[k]=customRange[k][customSel[k]]
end
modeEnv._20G=modeEnv.drop==-1
if modeEnv.opponent==0 then
createPlayer(1,340,15)
else
modeEnv.target=nil
createPlayer(1,20,15)
createPlayer(2,660,85,.9,modeEnv.opponent)
end
end,
}
mesDisp={
--Default:font=35,white
sprint=function()
setFont(70)
mStr(max(P.gameEnv.target-P.cstat.row,0),-75,260)
end,
marathon=function()
setFont(50)
mStr(P.cstat.row,-75,320)
mStr(P.gameEnv.target,-75,370)
gc.rectangle("fill",-120,376,90,4)
end,
classic=function()
setFont(80)
local r=P.gameEnv.target*.1
mStr(r<11 and 19+r or r==11 and"00"or r==12 and"0a"or format("%x",r*10-110),-75,210)
setFont(20)
mStr("speed level",-75,290)
setFont(50)
mStr(P.cstat.row,-75,320)
mStr(P.gameEnv.target,-75,370)
gc.rectangle("fill",-120,376,90,4)
end,
zen=function()
setFont(75)
mStr(max(200-P.cstat.row,0),-75,280)
end,
infinite=function()
setFont(50)
mStr(P.cstat.atk,-75,310)
mStr(format("%.2f",2.5*P.cstat.atk/P.cstat.piece),-75,420)
setFont(20)
mStr("Attack",-75,363)
mStr("Efficiency",-75,475)
end,
tsd=function()
setFont(35)
mStr("TSD",-75,405)
setFont(80)
mStr(P.cstat.event,-75,330)
end,
blind=function()
setFont(25)
mStr("Rows",-75,300)
mStr("Techrash",-75,420)
setFont(80)
mStr(P.cstat.row,-75,220)
mStr(P.cstat.techrash,-75,340)
end,
dig=function()
setFont(70)
mStr(P.cstat.event,-75,310)
setFont(30)
mStr("Wave",-75,375)
end,
survivor=function()
setFont(70)
mStr(P.cstat.event,-75,310)
setFont(30)
mStr("Wave",-75,375)
end,
pctrain=function()
setFont(25)
mStr("Perfect Clear",-75,410)
setFont(80)
mStr(P.cstat.pc,-75,330)
end,
pcchallenge=function()
setFont(25)
mStr("Perfect Clear",-75,430)
setFont(80)
mStr(P.cstat.pc,-75,350)
setFont(50)
mStr(max(100-P.cstat.row,0),-75,250)
end,
techmino41=function()
setFont(40)
mStr(#players.alive.."/41",-75,175)
mStr(P.ko,-60,215)
setFont(25)
gc.print("KO",-115,225)
gc.setColor(1,.5,0,.6)
gc.print(P.badge,-35,227)
gc.setColor(1,1,1)
setFont(30)
gc.print(up0to4[P.strength],-125,290)
for i=1,P.strength do
gc.draw(badgeIcon,16*i-130,260)
end
end,
techmino99=function()
setFont(40)
mStr(#players.alive.."/99",-75,175)
mStr(P.ko,-60,215)
setFont(25)
gc.print("KO",-115,225)
gc.setColor(1,.5,0,.6)
gc.print(P.badge,-35,227)
gc.setColor(1,1,1)
setFont(30)
gc.print(up0to4[P.strength],-125,290)
for i=1,P.strength do
gc.draw(badgeIcon,16*i-130,260)
end
end,
drought=function()
setFont(75)
mStr(max(100-P.cstat.row,0),-75,280)
end,
custom=function()
if P.gameEnv.target<1e4 then
setFont(75)
mStr(max(P.gameEnv.target-P.cstat.row,0),-75,280)
end
end
}
Event={
gameover={
win=function()
local P=players.alive[1]
P.alive=false
P.control=false
P.timing=false
P.waiting=1e99
P.b2b=0
if modeEnv.royaleMode then
P.rank=1
P.result="WIN"
showText(P,1,"appear",60,120,nil,true)
changeAtk(P)
end
::L::if P.task[1]then
rem(P.task)
goto L
end
for i=1,#P.atkBuffer do
P.atkBuffer[i].sent=true
P.atkBuffer[i].time=0
end
for i=1,#P.field do
for j=1,10 do
P.visTime[i][j]=min(P.visTime[i][j],20)
end
end
showText(P,text.win,"beat",90,nil,nil,true)
if P.id==1 and players[2]and players[2].ai then SFX("win")end
ins(P.task,Event.task.win)
end,
lose=function()
P.alive=false
P.control=false
P.timing=false
P.waiting=1e99
P.b2b=0
::L::if P.task[1]then
rem(P.task)
goto L
end
for i=1,#players.alive do
if players.alive[i]==P then
rem(players.alive,i)
break
end
end
if modeEnv.royaleMode then
changeAtk(P)
P.result="K.O."
P.rank=#players.alive+1
showText(P,P.rank,"appear",60,120,nil,true)
P.strength=0
local A=P
::L::
A=A.lastRecv
if A and not A.alive and A~=P then goto L end
if A and A~=P then
if P.id==1 or A.id==1 then
throwBadge(P,A,P.badge)
P.killMark=A.id==1
end
A.ko,A.badge=A.ko+1,A.badge+P.badge+1
for i=A.strength+1,4 do
if A.badge>=modeEnv.royalePowerup[i]then
A.strength=i
end
end
if P==mostBadge then
mostBadge,secBadge=secBadge
elseif P==secBadge then
secBadge=nil
end
if mostBadge then
if A.badge>mostBadge.badge then
if A~=mostBadge then
mostBadge,secBadge=A,mostBadge
end
elseif secBadge then
if A.badge>secBadge.badge then
secBadge=A
end
else
secBadge=A
end
else
mostBadge=A
end
end
freshMostDangerous()
for i=1,#players.alive do
if players.alive[i].atking==P then
freshTarget(players.alive[i])
end
end
if #players.alive==modeEnv.royaleRemain[gameStage]then
royaleLevelup()
end
end
for i=1,#P.atkBuffer do
P.atkBuffer[i].sent=true
P.atkBuffer[i].time=0
end
for i=1,#P.field do
for j=1,10 do
P.visTime[i][j]=min(P.visTime[i][j],20)
end
end
showText(P,text.lose,"appear",90,nil,nil,true)
if P.id==1 and players[2]and players[2].ai then SFX("fail")end
ins(P.task,Event.task.lose)
if #players.alive==1 then
local t=P
P=players.alive[1]
Event.gameover.win()
P=t
end
end,
},
marathon_reach=function()
local s=int(P.cstat.row*.1)
if s>=20 then
P.cstat.row=200
Event.gameover.win()
else
P.gameEnv.drop=marathon_drop[s]
if s==18 then P.gameEnv._20G=true end
P.gameEnv.target=s*10+10
SFX("reach")
end
end,
marathon_reach_lunatic=function()
if P.gameEnv.target==250 then
P.cstat.row=250
Event.gameover.win()
else
P.gameEnv.target=P.gameEnv.target+50
local t=P.gameEnv.target/50
P.gameEnv.lock=rush_lock[t]
P.gameEnv.wait=rush_wait[t]
P.gameEnv.fall=rush_fall[t]
showText(P,text.stage[t],"fly",80,-120)
SFX("reach")
end
end,
marathon_reach_ultimate=function()
if P.cstat.event==5 then
P.cstat.row=250
Event.gameover.win()
else
local t=P.cstat.event+1
if t==1 then t=2 end
P.gameEnv.target=50*t
P.cstat.event=t
P.gameEnv.lock=death_lock[t]
P.gameEnv.wait=death_wait[t]
P.gameEnv.fall=death_fall[t]
showText(P,text.stage[t],"fly",80,-120)
SFX("reach")
end
end,
classic_reach=function()
P.gameEnv.target=P.gameEnv.target+10
if P.gameEnv.target==100 then
P.gameEnv.drop,P.gameEnv.lock=0,0
end
SFX("reach")
end,
tsd_reach=function()
if P.lastClear~=52 then
Event.gameover.lose()
else
P.gameEnv.target=P.gameEnv.target+20
P.cstat.event=P.cstat.event+1
if #P.field>11 and P.cstat.event%5~=1 then
ins(P.clearing,1)
end
end
end,
tech_reach=function()
if #P.clearing>0 and P.lastClear<10 then
Event.gameover.lose()
end
end,
tech_reach_hard=function()
if #P.clearing>0 and P.lastClear<10 or P.lastClear==74 then
Event.gameover.lose()
end
end,
newPC=function()
local P=players[1]
if P.cstat.piece%4==0 then
if #P.field==#P.clearing then
P.counter=P.cstat.piece==0 and 20 or 0
ins(P.task,Event.task.PC)
if curMode.lv==2 then
local s=P.cstat.pc*.5
if int(s)==s and s>0 then
P.gameEnv.drop=pc_drop[s]or 10
P.gameEnv.lock=pc_lock[s]or 20
P.gameEnv.fall=pc_fall[s]or 5
if s==10 then
showText(P,text.maxspeed,"appear",80,-140)
else
showText(P,text.speedup,"appear",30,-140)
end
end
end
else
Event.gameover.lose()
end
end
end,
task={
win=function()
P.endCounter=P.endCounter+1
if P.endCounter>80 then
if P.gameEnv.visible==1 then
for i=1,#P.field do
for j=1,10 do
if P.visTime[i][j]>0 then
P.visTime[i][j]=P.visTime[i][j]-1
end
end
end
if P.endCounter==100 then
for i=1,#P.field do
removeRow(P.field)
removeRow(P.visTime)
end
return true
end
elseif P.endCounter==100 then
return true
end
end
end,
lose=function()
P.endCounter=P.endCounter+1
if P.endCounter>80 then
if P.gameEnv.visible==1 then
for i=1,#P.field do
for j=1,10 do
if P.visTime[i][j]>0 then
P.visTime[i][j]=P.visTime[i][j]-1
end
end
end
if P.endCounter==100 then
for i=1,#P.field do
removeRow(P.field)
removeRow(P.visTime)
end
return true
end
elseif P.endCounter==100 then
return true
end
end
end,
dig_normal=function()
local P=players[1]
P.counter=P.counter+1
if #P.clearing==0 and P.counter>=max(90,180-2*P.cstat.event)then
ins(P.field,1,getNewRow(13))
ins(P.visTime,1,getNewRow(1e99))
P.field[1][rnd(10)]=0
P.fieldBeneath=P.fieldBeneath+30
P.cy,P.y_img=P.cy+1,P.y_img+1
P.counter=0
P.cstat.event=P.cstat.event+1
end
end,
dig_lunatic=function()
local P=players[1]
P.counter=P.counter+1
if #P.clearing==0 and P.counter>=max(40,60-.5*P.cstat.event)then
ins(P.field,1,getNewRow(13))
ins(P.visTime,1,getNewRow(1e99))
P.field[1][rnd(10)]=0
P.fieldBeneath=P.fieldBeneath+30
P.cy,P.y_img=P.cy+1,P.y_img+1
P.counter=0
P.cstat.event=P.cstat.event+1
end
end,
survivor_easy=function()
local P=players[1]
P.counter=P.counter+1
if P.counter==max(60,180-2*P.cstat.event)then
ins(P.atkBuffer,{rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1})
P.counter=0
if P.cstat.event==60 then showText(P,text.maxspeed,"appear",80,-140)end
P.cstat.event=P.cstat.event+1
end
end,
survivor_normal=function()
local P=players[1]
P.counter=P.counter+1
if P.counter==max(60,180-2*P.cstat.event)then
local d=P.cstat.event+1
if d%4==0 then ins (P.atkBuffer,{rnd(10),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1})
elseif d%4==1 then ins(P.atkBuffer,{rnd(10),amount=2,countdown=70,cd0=70,time=0,sent=false,lv=1})
elseif d%4==2 then ins(P.atkBuffer,{rnd(10),amount=3,countdown=80,cd0=80,time=0,sent=false,lv=2})
elseif d%4==3 then ins(P.atkBuffer,{rnd(10),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3})
end
P.counter=0
if P.cstat.event==60 then showText(P,text.maxspeed,"appear",80,-140)end
P.cstat.event=P.cstat.event+1
end
end,
survivor_hard=function()
local P=players[1]
P.counter=P.counter+1
if P.counter==max(60,180-2*P.cstat.event)then
if P.cstat.event%3<2 then
ins(P.atkBuffer,{rnd(10),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1})
else
ins(P.atkBuffer,{rnd(10),amount=3,countdown=60,cd0=60,time=0,sent=false,lv=2})
end
P.counter=0
if P.cstat.event==45 then showText(P,text.maxspeed,"appear",80,-140)end
P.cstat.event=P.cstat.event+1
end
end,
survivor_lunatic=function()
local P=players[1]
P.counter=P.counter+1
if P.counter==max(90,150-P.cstat.event)then
local t=max(60,90-P.cstat.event)
ins(P.atkBuffer,{rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3})
P.counter=0
if P.cstat.event==30 then showText(P,text.maxspeed,"appear",80,-140)end
P.cstat.event=P.cstat.event+1
end
end,
PC=function()
local P=players[1]
P.counter=P.counter+1
if P.counter==21 then
local t=P.cstat.pc%2
for i=1,4 do
local r=getNewRow()
for j=1,10 do
r[j]=PCbase[4*t+i][j]
end
ins(P.field,1,r)
ins(P.visTime,1,getNewRow(P.showTime))
end
P.fieldBeneath=P.fieldBeneath+120
-- P.cy=P.cy+4
P.y_img=P.y_img+4
freshgho()
return true
end
end,
},
}
--Game system Data --Game system Data
setting={ setting={
lang=1, ghost=true,center=true,
grid=false,swap=true,
fxs=true,bg=true,
das=10,arr=2,
sddas=0,sdarr=2,
sfx=true,bgm=true,vib=3, sfx=true,bgm=true,vib=3,
fullscreen=false, fullscreen=false,
bgblock=true, bgblock=true,
das=10,arr=2, lang=1,
sddas=0,sdarr=2,
ghost=true,center=true,
keyMap={ keyMap={
{"left","right","x","z","c","up","down","space","tab","r","","",""}, {"left","right","x","z","c","up","down","space","tab","r","","",""},
{"","","","","","","","","","","","",""}, {"","","","","","","","","","","","",""},
@@ -751,7 +141,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
@@ -763,9 +153,18 @@ virtualkey={
virtualkeyDown={false,false,false,false,false,false,false,false,false,false,false,false,false} virtualkeyDown={false,false,false,false,false,false,false,false,false,false,false,false,false}
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"
userData=fs.newFile("userdata") require"list"
userSetting=fs.newFile("usersetting") require"class"
require"gamefunc"
require"ai"
require"timer"
require"paint"
require"call&sys"
require"dataList"
require"texture"
userData,userSetting=fs.newFile("userdata"),fs.newFile("usersetting")
if fs.getInfo("userdata")then if fs.getInfo("userdata")then
loadData() loadData()
end end
@@ -773,13 +172,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
end end
swapLanguage(setting.lang)
require("gamefunc")
require("ai")
require("timer")
require("paint")
require("call&sys")
require("list")
swapLanguage(setting.lang)
require("texture")

554
paint.lua
View File

@@ -1,40 +1,59 @@
swapDeck_data={ local gc=love.graphics
{4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1}, local mt=love.math
{1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2}, local setFont=setFont
{3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2}, local Timer=love.timer.getTime
{2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4},
{7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5}, local attackColor={
{3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6}, {color.darkGrey,color.white},
{2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7}, {color.grey,color.white},
{5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8}, {color.lightPurple,color.white},
{7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8}, {color.lightRed,color.white},
}--Block id [ZSLJTOI] ,dir,x,y {color.darkGreen,color.cyan},
swap={ }
none={2,1,d=function()end}, local frameColor={
flash={8,1,d=function()gc.clear(1,1,1)end}, [0]=color.white,
deck={50,8,d=function() color.lightGreen,
local t=sceneSwaping.time color.lightBlue,
gc.setColor(1,1,1) color.lightPurple,
if t>8 then color.lightOrange,
local t=max(t,15) }
for i=1,51-t do local modeLevelColor={
local bn=swapDeck_data[i][1] EASY=color.cyan,
local b=blocks[bn][swapDeck_data[i][2]] NORMAL=color.green,
local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4] HARD=color.magenta,
for y=1,#b do for x=1,#b[1]do ["HARD+"]=color.darkMagenta,
if b[y][x]>0 then LUNATIC=color.red,
gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3) EXTRA=color.lightMagenta,
end ULTIMATE=color.lightYellow,
end end
end MESS=color.lightGrey,
end GM=color.blue,
if t<17 then DEATH=color.lightRed,
gc.setColor(1,1,1,(8-abs(t-8))*.125) CTWC=color.lightBlue,
gc.rectangle("fill",0,0,1280,720) ["10L"]=color.cyan,
end ["20L"]=color.lightBlue,
["40L"]=color.green,
["100L"]=color.orange,
["400L"]=color.red,
["1000L"]=color.darkRed,
}
local miniTitle_rect={
{2,0,5,1},{4,1,1,6},
{9,0,4,1},{9,3,4,1},{9,6,4,1},{8,0,1,7},
{15,0,3,1},{15,6,3,1},{14,0,1,7},
{19,0,1,7},{23,0,1,7},{20,3,3,1},
{0,8,1,6},{6,8,1,6},{1,9,1,1},{2,10,1,1},{3,11,1,1},{4,10,1,1},{5,9,1,1},
{8,8,5,1},{8,13,5,1},{10,9,1,4},
{14,8,1,6},{19,8,1,6},{15,9,1,1},{16,10,1,1},{17,11,1,1},{18,12,1,1},
{21,8,5,1},{21,13,5,1},{21,9,1,4},{25,9,1,4},
}
local function stencil_miniTitle()
for i=1,#miniTitle_rect do
gc.rectangle("fill",unpack(miniTitle_rect[i]))
end end
}, end
}--Scene swapping animations
FX={ FX={
flash=0,--Black screen(frame) flash=0,--Black screen(frame)
shake=0,--Screen shake(frame) shake=0,--Screen shake(frame)
@@ -87,7 +106,7 @@ FX={
zoomout=function(t,a) zoomout=function(t,a)
gc.push("transform") gc.push("transform")
setFont(t.font) setFont(t.font)
local k=t.t^.5*.2+1 local k=t.t^.5*.1+1
gc.translate(150,290+t.dy) gc.translate(150,290+t.dy)
gc.scale(k,k) gc.scale(k,k)
gc.setColor(1,1,1,a) gc.setColor(1,1,1,a)
@@ -109,38 +128,35 @@ FX={
} }
function updateButton() function updateButton()
for i=1,#Buttons[scene]do for k,B in next,Buttons[scene]do
local B=Buttons[scene][i] local t=B==Buttons.sel and .4 or 0
local t=i==Buttons.sel and .4 or 0
B.alpha=abs(B.alpha-t)>.02 and(B.alpha+(B.alpha<t and .02 or -.02))or t B.alpha=abs(B.alpha-t)>.02 and(B.alpha+(B.alpha<t and .02 or -.02))or t
if B.alpha>t then B.alpha=B.alpha-.02 elseif B.alpha<t then B.alpha=B.alpha+.02 end if B.alpha>t then B.alpha=B.alpha-.02 elseif B.alpha<t then B.alpha=B.alpha+.02 end
end end
end end
function drawButton() function drawButton()
for i=1,#Buttons[scene]do for k,B in next,Buttons[scene]do
local B=Buttons[scene][i]
if not(B.hide and B.hide())then if not(B.hide and B.hide())then
local C=B.rgb or color.white local C=B.rgb or color.white
gc.setColor(C[1],C[2],C[3],B.alpha) gc.setColor(C[1],C[2],C[3],B.alpha)
gc.rectangle("fill",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h) gc.rectangle("fill",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h)
gc.setColor(C)
gc.setLineWidth(3)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
gc.setColor(C[1],C[2],C[3],.3) gc.setColor(C[1],C[2],C[3],.3)
gc.setLineWidth(5)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h) gc.setLineWidth(5)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
local t=B.t local t=B.t
local y0 local y0
if t then if t then
if type(t)=="function"then t=t()end if type(t)=="function"then t=t()end
setFont(B.f or 40) setFont(B.f or 40)
y0=B.y-7-currentFont*.5 y0=B.y-currentFont*.64
mStr(t,B.x-1,y0) gc.printf(t,B.x-201,y0+2,400,"center")
mStr(t,B.x+1,y0) gc.printf(t,B.x-199,y0+2,400,"center")
mStr(t,B.x-1,y0+2) gc.printf(t,B.x-201,y0,400,"center")
mStr(t,B.x+1,y0+2) gc.printf(t,B.x-199,y0,400,"center")
end gc.setColor(C)
gc.setColor(C)
if t then
mStr(t,B.x,y0+1) mStr(t,B.x,y0+1)
end end
gc.setLineWidth(3)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
end end
end end
end end
@@ -151,21 +167,22 @@ function drawDial(x,y,speed)
gc.setColor(1,1,1,.6) gc.setColor(1,1,1,.6)
gc.draw(dialNeedle,x,y,2.094+(speed<=175 and .02094*speed or 4.712-52.36/(speed-125)),nil,nil,5,4) gc.draw(dialNeedle,x,y,2.094+(speed<=175 and .02094*speed or 4.712-52.36/(speed-125)),nil,nil,5,4)
end end
function drawPixel(y,x,id,alpha) function drawPixel(y,x,id)
gc.setColor(1,1,1,alpha)
gc.draw(blockSkin[id],30*x-30,600-30*y) gc.draw(blockSkin[id],30*x-30,600-30*y)
end end
function drawAtkPointer(x,y) function drawAtkPointer(x,y)
gc.setColor(0,.6,1,.35+sin(Timer()*20)*.2) local t=sin(Timer()*20)
gc.setColor(.2,.7+t*.2,1,.6+t*.4)
gc.circle("fill",x,y,25,6) gc.circle("fill",x,y,25,6)
local a=Timer()*3%1*.8 local a=Timer()*3%1*.8
gc.setColor(0,.6,1,.8-a) gc.setColor(0,.6,1,.8-a)
gc.circle("line",x,y,25*(1+a),6) gc.circle("line",x,y,30*(1+a),6)
end 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)
@@ -176,76 +193,80 @@ 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(.75,.75,.75,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
Pnt={} Pnt={BG={}}
Pnt.BG={ function Pnt.BG.none()
none=function() gc.clear(.15,.15,.15)
gc.clear(.2,.2,.2) end
end, function Pnt.BG.grey()
glow=function() gc.clear(.3,.3,.3)
local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05 end
gc.clear(t,t,t) function Pnt.BG.glow()
end, local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05
game1=function() gc.clear(t,t,t)
gc.setColor(1,1,1) end
gc.draw(background1,640,360,Timer()*.15,12,nil,64,64) function Pnt.BG.game1()
end, gc.setColor(1,1,1)
game2=function() gc.draw(background1,640,360,Timer()*.15,12,nil,64,64)
gc.setColor(1,.5,.5) end
gc.draw(background1,640,360,Timer()*.2,12,nil,64,64) function Pnt.BG.game2()
end, gc.setColor(1,.5,.5)
game3=function() gc.draw(background1,640,360,Timer()*.2,12,nil,64,64)
gc.setColor(.6,.6,1) end
gc.draw(background1,640,360,Timer()*.25,12,nil,64,64) function Pnt.BG.game3()
end, gc.setColor(.6,.6,1)
rgb=function() gc.draw(background1,640,360,Timer()*.25,12,nil,64,64)
gc.clear( end
sin(Timer()*1.2)*.15+.5, function Pnt.BG.rgb()
sin(Timer()*1.5)*.15+.5, gc.clear(
sin(Timer()*1.9)*.15+.5 sin(Timer()*1.2)*.15+.5,
) sin(Timer()*1.5)*.15+.5,
end, sin(Timer()*1.9)*.15+.5
strap=function() )
gc.setColor(1,1,1) end
local x=Timer()%32*40 function Pnt.BG.strap()
gc.draw(background2,x,0,nil,10) gc.setColor(1,1,1)
gc.draw(background2,x-1280,0,nil,10) local x=Timer()%32*40
end, gc.draw(background2,x,0,nil,10)
matrix=function() gc.draw(background2,x-1280,0,nil,10)
for i=0,15 do end
for j=0,8 do 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 t=sin(Timer()*((2.468*i-1.357*j)%3))*.3 function Pnt.BG.matrix()
local t=(sin((mt.noise(i,j)+2)*Timer())+1)*.2 gc.clear(.15,.15,.15)
gc.setColor(t,t,t) for i=0,15 do
gc.rectangle("fill",80*i,80*j,80,80) for j=0,8 do
end local t=sin(matrixT[i][j]*Timer())*.2+.2
gc.setColor(1,1,1,t)
gc.rectangle("fill",80*i,80*j,80,80)
end end
end, end
} end
function Pnt.load() function Pnt.load()
gc.setLineWidth(4) gc.setLineWidth(4)
gc.setColor(1,1,1,.5) gc.setColor(1,1,1,.5)
gc.rectangle("fill",300,330,loadprogress*680,60) gc.rectangle("fill",300,330,loadprogress*680,60,5)
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.rectangle("line",300,330,680,60) 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()
@@ -256,20 +277,19 @@ function Pnt.intro()
gc.setColor(1,1,1,min(count,80)*.005) gc.setColor(1,1,1,min(count,80)*.005)
gc.rectangle("fill",0,0,26,14) gc.rectangle("fill",0,0,26,14)
gc.pop() gc.pop()
gc.setColor(1,1,1) gc.setColor(1,1,1,.06)
gc.setColor(1,1,1,.125) for i=41,5,-2 do
for i=19,5,-2 do
gc.setLineWidth(i) gc.setLineWidth(i)
gc.line(250+(count-80)*25,150,(count-80)*25-150,570) gc.line(200+(count-80)*25,130,(count-80)*25,590)
end end
gc.setStencilTest() gc.setStencilTest()
end end
function Pnt.main() function Pnt.main()
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(titleImage,300,30)
setFont(30) setFont(30)
gc.print("Alpha V0.7.10",370,140) gc.print("Alpha V0.7.15",290,140)
gc.print(system,530,110) gc.print(system,800,110)
gc.draw(titleImage,30,30)
end end
function Pnt.mode() function Pnt.mode()
setFont(40) setFont(40)
@@ -291,45 +311,78 @@ function Pnt.mode()
end end
end end
function Pnt.custom() function Pnt.custom()
gc.setColor(1,1,1,.3+sin(Timer()*8)*.2)
gc.rectangle("fill",25,95+40*optSel,465,40)
setFont(80) setFont(80)
gc.setColor(color.lightGrey) gc.setColor(.8,.8,.8)gc.print(text.custom,20,20)
gc.print(text.custom,20,20) gc.setColor(1,1,1)gc.print(text.custom,22,23)
gc.setColor(color.white)
gc.print(text.custom,22,23)
setFont(40) setFont(40)
for i=1,#customID do for i=1,#customID do
local k=customID[i] local k=customID[i]
local y=90+40*i local y=90+40*i
gc.printf(text.customOption[k],50,y,300,"right") gc.printf(text.customOption[k],30,y,320,"right")
if text.customVal[k]then if text.customVal[k]then
gc.print(text.customVal[k][customSel[k]],350,y) gc.print(text.customVal[k][customSel[k]],350,y)
else else
gc.print(customRange[k][customSel[k]],350,y) gc.print(customRange[k][customSel[k]],350,y)
end end
end end
gc.print("",10,90+40*optSel) 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 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
@@ -352,58 +405,85 @@ 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)--Big frame
gc.stencil(stencil_field,"replace", 1) gc.translate(150,70)
gc.translate(150,70+P.fieldBeneath) if P.gameEnv.grid then
gc.setStencilTest("equal",1) gc.setLineWidth(1)
gc.setColor(1,1,1,.2)
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
end--Grid lines
gc.translate(0,P.fieldBeneath)
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
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
for i=1,10 do h=h-1
if P.field[j][i]>0 then
drawPixel(j,i,P.field[j][i],min(P.visTime[j][i],20)*.05)
end
end
else
gc.setColor(1,1,1,P.falling/P.gameEnv.fall) gc.setColor(1,1,1,P.falling/P.gameEnv.fall)
gc.rectangle("fill",0,600-30*j,320,30) gc.rectangle("fill",0,600-30*j,320,30)
else
for i=1,10 do
if P.field[j][i]>0 then
gc.setColor(1,1,1,min(P.visTime[j][i]*.05,1))
drawPixel(j,i,P.field[j][i])
end
end
end end
end--Field end--Field
if P.waiting<=0 then for i=1,#P.shade do
local S=P.shade[i]
gc.setColor(1,1,1,S[1]*.12)
for x=S[3],S[5]do
for y=S[6],S[4]do
drawPixel(y,x,S[2])
end
end
end--shade FX
if P.waiting==-1 then
if P.gameEnv.ghost then if P.gameEnv.ghost then
gc.setColor(1,1,1,.3)
for i=1,P.r do for j=1,P.c do for i=1,P.r do for j=1,P.c do
if P.cb[i][j]>0 then if P.cur.bk[i][j]then
drawPixel(i+P.y_img-1,j+P.cx-1,P.bc,.3) drawPixel(i+P.y_img-1,j+P.curX-1,P.cur.color)
end end
end end end end
end--Ghost end--Ghost
gc.setColor(1,1,1,P.lockDelay/P.gameEnv.lock) if P.gameEnv.block then
for i=1,P.r do for j=1,P.c do gc.setColor(1,1,1,P.lockDelay/P.gameEnv.lock)
if P.cb[i][j]>0 then for i=1,P.r do for j=1,P.c do
gc.rectangle("fill",30*(j+P.cx-1)-34,596-30*(i+P.cy-1),38,38) if P.cur.bk[i][j]then
end gc.rectangle("fill",30*(j+P.curX-1)-33,597-30*(i+P.curY-1),36,36)
end end--BlockShade(lockdelay indicator) end
for i=1,P.r do for j=1,P.c do end end--BlockShade(lockdelay indicator)
if P.cb[i][j]>0 then gc.setColor(1,1,1)
drawPixel(i+P.cy-1,j+P.cx-1,P.bc,1) for i=1,P.r do for j=1,P.c do
end if P.cur.bk[i][j]then
end end--Block drawPixel(i+P.curY-1,j+P.curX-1,P.cur.color)
end
end end--Block
end
if P.gameEnv.center then if P.gameEnv.center then
local x=30*(P.cx+P.sc[2]-1)-30+15 gc.setColor(1,1,1)
gc.draw(spinCenter,x,600-30*(P.cy+P.sc[1]-1)+15,nil,nil,nil,4,4) local x=30*(P.curX+P.sc[2]-1)-30+15
gc.draw(spinCenter,x,600-30*(P.curY+P.sc[1]-1)+15,nil,nil,nil,4,4)
gc.setColor(1,1,1,.5) gc.setColor(1,1,1,.5)
gc.draw(spinCenter,x,600-30*(P.y_img+P.sc[1]-1)+15,nil,nil,nil,4,4) gc.draw(spinCenter,x,600-30*(P.y_img+P.sc[1]-1)+15,nil,nil,nil,4,4)
end--Rotate center end--Rotate center
end end
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(PTC.dust[p])--Draw game field gc.draw(PTC.dust[p])
gc.setStencilTest()--In-playField mask --Draw game field
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.rectangle("line",-1,-11,302,612)--Draw boarder gc.setColor(1,1,1)
gc.rectangle("line",-1,-11,302,612)--Draw boarder
gc.setLineWidth(2)
gc.rectangle("line",301,0,16,601.5)--Draw atkBuffer boarder
local h=0 local h=0
for i=1,#P.atkBuffer do for i=1,#P.atkBuffer do
local a=P.atkBuffer[i] local a=P.atkBuffer[i]
@@ -416,59 +496,63 @@ function Pnt.play()
end end
if a.countdown>0 then if a.countdown>0 then
gc.setColor(attackColor[a.lv][1]) gc.setColor(attackColor[a.lv][1])
gc.rectangle("fill",304,600-h,12,-bar+3) gc.rectangle("fill",304,599-h,11,-bar+3)
gc.setColor(attackColor[a.lv][2]) gc.setColor(attackColor[a.lv][2])
gc.rectangle("fill",304,600-h+(-bar+3),12,-(-bar+3)*(1-a.countdown/a.cd0)) gc.rectangle("fill",304,599-h+(-bar+3),11,-(-bar+3)*(1-a.countdown/a.cd0))
--Timing --Timing
else else
attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5) local t=sin((Timer()-i)*30)*.5+.5
gc.rectangle("fill",304,600-h,12,-bar+3) local c1,c2=attackColor[a.lv][1],attackColor[a.lv][2]
gc.setColor(c1[1]*t+c2[1]*(1-t),c1[2]*t+c2[2]*(1-t),c1[3]*t+c2[3]*(1-t))
gc.rectangle("fill",304,599-h,11,-bar+3)
--Warning --Warning
end end
else else
gc.setColor(attackColor[a.lv][1]) gc.setColor(attackColor[a.lv][1])
bar=bar*(20-a.time)*.05 bar=bar*(20-a.time)*.05
gc.rectangle("fill",304,600-h,12,-bar+2) gc.rectangle("fill",304,599-h,11,-bar+2)
--Disappear --Disappear
end end
h=h+bar h=h+bar
end--Buffer line end--Buffer line
local a,b=P.b2b,P.b2b1 if a>b then a,b=b,a end
gc.setColor(P.b2b<40 and color.white or P.b2b<=480 and color.lightRed or color.lightBlue) gc.setColor(.8,1,.2)
gc.rectangle("fill",-13,600,10,-P.b2b1) gc.rectangle("fill",-15,599.5,11,-b*.5)
gc.setColor(color.red) gc.setColor(P.b2b<40 and color.white or P.b2b<=1e3 and color.lightRed or color.lightBlue)
gc.rectangle("fill",-19,600-40,16,5) gc.rectangle("fill",-15,599.5,11,-a*.5)
gc.setColor(color.blue) gc.setColor(1,1,1,.5+sin(Timer()*30)*.5)
gc.rectangle("fill",-19,600-480,16,5) gc.rectangle("fill",-16,b<40 and 578.5 or 98.5,13,3)
--B2B bar
setFont(40)
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.rectangle("line",-17,-3,16,604.5)--Draw b2b bar boarder
--B2B indictator
if P.gameEnv.hold then if P.gameEnv.hold then
mStr(text.hold,-75,-10) gc.setColor(1,1,1)
for i=1,#P.hb do gc.draw(drawableText.hold,-124,-10)
for j=1,#P.hb[1] do for i=1,#P.hold.bk do
if P.hb[i][j]>0 then for j=1,#P.hold.bk[1] do
drawPixel(i+17.5-#P.hb*.5,j-2.5-#P.hb[1]*.5,P.holded and 13 or P.hc,1) if P.hold.bk[i][j]then
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.print(text.next,325,-10) gc.draw(drawableText.next,340,-10)
for N=1,P.gameEnv.next do local N=1
local b=P.nb[N] ::L::
for i=1,#b do local b,c=P.next[N].bk,P.next[N].color
for j=1,#b[1] do gc.setColor(1,1,1)
if b[i][j]>0 then for i=1,#b do for j=1,#b[1] do
drawPixel(i+20-2.4*N-#b*.5,j+12.5-#b[1]*.5,P.nxt[N],1) if b[i][j]then
end drawPixel(i+20-2.4*N-#b*.5,j+12.7-#b[1]*.5,c)
end end
end end end
end--Next N=N+1
setFont(30) if N<=P.gameEnv.next and P.next[N]then goto L end
--Next
gc.setColor(.8,.8,.8) gc.setColor(.8,.8,.8)
gc.print(curMode.modeName,-135,-65) gc.draw(drawableText.modeName,-135,-65)
gc.printf(curMode.levelName,240,-65,200,"right") gc.draw(drawableText.levelName,437-drawableText.levelName:getWidth(),-65)
if frame<180 then if frame<180 then
local count=179-frame local count=179-frame
gc.push("transform") gc.push("transform")
@@ -485,13 +569,12 @@ 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.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)
setFont(15) gc.draw(drawableText.bpm,390,490)
gc.print("BPM",390,490) gc.draw(drawableText.kpm,350,583)
gc.print("KPM",350,583)
setFont(30) setFont(30)
drawDial(360,520,P.dropSpeed) drawDial(360,520,P.dropSpeed)
drawDial(405,575,P.keySpeed) drawDial(405,575,P.keySpeed)
@@ -508,18 +591,16 @@ function Pnt.play()
end end
end--Draw players end--Draw players
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,3 do gc.draw(PTC.attack[1])
gc.draw(PTC.attack[i]) gc.draw(PTC.attack[2])
end gc.draw(PTC.attack[3])
if setting.virtualkeySwitch then if setting.virtualkeySwitch then drawVirtualkey()end
drawVirtualkey()
end
if modeEnv.royaleMode then if modeEnv.royaleMode then
for i=1,#FX.badge do for i=1,#FX.badge do
local b=FX.badge[i] local b=FX.badge[i]
local t=b.t<10 and 0 or b.t<50 and(sin(1.5*(b.t/20-1.5))+1)*.5 or 1 local t=b.t<10 and 0 or b.t<50 and .5+sin(1.5*(b.t/20-1.5))*.5 or 1
gc.setColor(1,1,1,b.t<10 and b.t*.1 or b.t<50 and 1 or(60-b.t)*.1) gc.setColor(1,1,1,b.t<10 and b.t*.1 or b.t<50 and 1 or(60-b.t)*.1)
gc.draw(badgeIcon,b[1]+(b[3]-b[1])*t,b[2]+(b[4]-b[2])*t,nil,b.size,nil,14,14) gc.draw(badgeIcon,b[1]+(b[3]-b[1])*t,b[2]+(b[4]-b[2])*t,nil,nil,nil,14,14)
end end
P=players[1] P=players[1]
gc.setLineWidth(5) gc.setLineWidth(5)
@@ -538,33 +619,47 @@ function Pnt.play()
end end
end end
end end
function Pnt.pause()
gc.setColor(0,0,0,pauseTime*.015)
gc.rectangle("fill",0,0,1280,720)
if system~="Android"then
setFont(40)
gc.setColor(1,1,1,pauseTime*.02)
mStr(text.space.."/"..text.enter,640,300)
gc.print("ESC",610,598)
end
setFont(120)
gc.setColor(1,1,1)
mStr(text.pause,640,140-12*(5-pauseTime*.1)^2)
end
function Pnt.setting() function Pnt.setting()
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(35) setFont(35)
mStr("DAS:"..setting.das,288,158) mStr("DAS:"..setting.das,290,278)
mStr("ARR:"..setting.arr,503,158) mStr("ARR:"..setting.arr,506,278)
setFont(18) setFont(18)
mStr(text.softdropdas..setting.sddas,288,249) mStr(text.softdropdas..setting.sddas,290,361)
mStr(text.softdroparr..setting.sdarr,503,249) mStr(text.softdroparr..setting.sdarr,506,361)
end end
function Pnt.setting2() function Pnt.setting2()
local a=.3+sin(Timer()*15)*.1
if keyboardSetting then if keyboardSetting then
gc.setColor(1,.5,.5,.2+(sin(Timer()*15)+1)*.1) gc.setColor(1,.5,.5,a)
else else
gc.setColor(.9,.9,.9,.2+(sin(Timer()*15)+1)*.1) gc.setColor(.9,.9,.9,a)
end end
gc.rectangle("fill",240,40*keyboardSet-10,200,40) gc.rectangle("fill",240,40*keyboardSet-10,200,40)
if joystickSetting then if joystickSetting then
gc.setColor(1,.5,.5,.2+(sin(Timer()*15)+1)*.1) gc.setColor(1,.5,.5,a)
else else
gc.setColor(.9,.9,.9,.2+(sin(Timer()*15)+1)*.1) gc.setColor(.9,.9,.9,a)
end end
gc.rectangle("fill",440,40*joystickSet-10,200,40) gc.rectangle("fill",440,40*joystickSet-10,200,40)
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(25) setFont(25)
for y=1,13 do for y=1,13 do
mStr(text.actName[y],150,40*y) mStr(text.actName[y],150,40*y-5)
for x=1,2 do for x=1,2 do
mStr(setting.keyMap[curBoard+x*8-8][y],200*x+140,40*y-3) mStr(setting.keyMap[curBoard+x*8-8][y],200*x+140,40*y-3)
end end
@@ -574,8 +669,8 @@ function Pnt.setting2()
gc.line(200*x-160,30,200*x-160,550) gc.line(200*x-160,30,200*x-160,550)
end end
gc.line(40,550,640,550) gc.line(40,550,640,550)
gc.print(text.keyboard,335,1) mStr(text.keyboard,340,0)
gc.print(text.joystick,420,1) mStr(text.joystick,540,0)
gc.print(text.setting2Help,50,620) gc.print(text.setting2Help,50,620)
setFont(40) setFont(40)
gc.print("< P"..curBoard.."/P8 >",430,570) gc.print("< P"..curBoard.."/P8 >",430,570)
@@ -601,17 +696,21 @@ function Pnt.help()
gc.printf(text.help[i],140,15+43*i,1000,"center") gc.printf(text.help[i],140,15+43*i,1000,"center")
end end
gc.draw(titleImage,180,600,.2,.7+.05*sin(Timer()*2),nil,140,100) gc.draw(titleImage,180,600,.2,.7+.05*sin(Timer()*2),nil,140,100)
gc.draw(payCode,20,20)
gc.draw(groupCode,1080,20)
gc.setColor(1,1,1,sin(Timer()*10)*.5+.5)
setFont(35)
mStr(text.support,150,283)
setFont(25)
mStr(text.group,1170,210)
end end
function Pnt.stat() function Pnt.stat()
setFont(35) setFont(35)
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,10 do for i=1,10 do gc.print(text.stat[i],350,20+40*i)end
gc.print(text.stat[i],350,20+40*i)
end
gc.print(stat.run,650,60) gc.print(stat.run,650,60)
gc.print(stat.game,650,100) gc.print(stat.game,650,100)
gc.print(format("%0.2f",stat.gametime).."s",650,140) gc.print(format("%0.1fhr",stat.gametime*2.78e-4),650,140)
gc.print(stat.piece,650,180) gc.print(stat.piece,650,180)
gc.print(stat.row,650,220) gc.print(stat.row,650,220)
gc.print(stat.atk,650,260) gc.print(stat.atk,650,260)
@@ -619,6 +718,5 @@ function Pnt.stat()
gc.print(stat.rotate,650,340) gc.print(stat.rotate,650,340)
gc.print(stat.hold,650,380) gc.print(stat.hold,650,380)
gc.print(stat.spin,650,420) 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

@@ -1,12 +1,13 @@
local N=gc.newImage local gc=love.graphics
function C(x,y) local N,c=gc.newImage
local function T(s,t)return gc.newText(setFont(s),t)end
local function C(x,y)
c=gc.newCanvas(x,y) c=gc.newCanvas(x,y)
gc.setCanvas(c) gc.setCanvas(c)
return c return c
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
@@ -17,21 +18,8 @@ for i=1,13 do
gc.draw(blockImg,6-6*i,0,nil,.2) gc.draw(blockImg,6-6*i,0,nil,.2)
blockSkinmini[i]=c blockSkinmini[i]=c
end end
for i=1,13 do
end
blockImg:release() blockImg:release()
RCPB={10,33,200,33,105,5,105,60}
do royaleCtrlPad=C(300,100)
gc.setColor(1,1,1)
setFont(25)
gc.setLineWidth(2)
for i=1,4 do
gc.rectangle("line",RCPB[2*i-1],RCPB[2*i],90,35,8,4)
mStr(atkModeName[i],RCPB[2*i-1]+45,RCPB[2*i]+3)
end
end
virtualkeyIcon={} virtualkeyIcon={}
for i=1,10 do for i=1,10 do
virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png") virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png")
@@ -43,8 +31,8 @@ for i=1,7 do
local b=blocks[i][0] local b=blocks[i][0]
mouseBlock[i]=C(#b[1],#b) mouseBlock[i]=C(#b[1],#b)
gc.setColor(blockColor[i]) gc.setColor(blockColor[i])
for x=1,#b[1]do for y=1,#b do for y=1,#b do for x=1,#b[1]do
if b[y][x]==1 then if b[y][x]then
gc.rectangle("fill",x-1,#b-y,1,1) gc.rectangle("fill",x-1,#b-y,1,1)
end end
end end end end
@@ -87,77 +75,21 @@ dialCircle=N("/image/mess/dialCircle.png")
dialNeedle=N("/image/mess/dialNeedle.png") dialNeedle=N("/image/mess/dialNeedle.png")
badgeIcon=N("/image/mess/badge.png") badgeIcon=N("/image/mess/badge.png")
spinCenter=N("/image/mess/spinCenter.png") spinCenter=N("/image/mess/spinCenter.png")
lightBulb=N("/image/mess/lightBulb.png")
light=N("/image/mess/light.png")
background1=N("/image/BG/bg1.jpg") background1=N("/image/BG/bg1.jpg")
background2=N("/image/BG/bg2.png") background2=N("/image/BG/bg2.png")
groupCode=N("/image/mess/groupcode.png")
c=nil payCode=N("/image/mess/paycode.png")
gc.setCanvas() drawableText={
question=T(100,"?"),
sceneInit={ x=T(110,"×"),
load=function() bpm=T(15,"BPM"),
curBG="none" kpm=T(15,"KPM"),
keeprun=true modeName=T(30),
loading=1--Loading mode levelName=T(30),
loadnum=1--Loading counter next=T(40),
loadprogress=0--Loading bar(0~1) hold=T(40),
end, }
intro=function() c=gc.setCanvas()
curBG="none"
count=0
keeprun=true
end,
main=function()
curBG="none"
keeprun=true
collectgarbage()
end,
mode=function()
saveData()
modeSel=modeSel or 1
levelSel=levelSel or 3
curBG="none"
keeprun=true
end,
custom=function()
optSel=optSel or 1
curBG="matrix"
keeprun=true
end,
play=function()
keeprun=false
resetGameData()
sysSFX("ready")
mouseShow=false
end,
setting=function()
curBG="none"
keeprun=true
end,
setting2=function()
curBG="none"
keeprun=true
curBoard=1
keyboardSet=1
joystickSet=1
keyboardSetting=false
joystickSetting=false
end,--Control settings
setting3=function()
curBG="game1"
keeprun=true
defaultSel=1
sel=nil
snapLevel=1
end,--Touch setting
help=function()
curBG="none"
keeprun=true
end,
stat=function()
curBG="none"
keeprun=true
end,
quit=function()
love.event.quit()
end,
}

182
timer.lua
View File

@@ -1,10 +1,12 @@
local Timer=love.timer.getTime
Tmr={} Tmr={}
function Tmr.load() function Tmr.load()
if loading==1 then if loading==1 then
loadnum=loadnum+1 loadnum=loadnum+1
loadprogress=loadnum/10 loadprogress=loadnum/10
if loadnum==5 then if loadnum==5 then
--require("load_texture") --require("texture")
elseif loadnum==10 then elseif loadnum==10 then
loadnum=1 loadnum=1
loading=2 loading=2
@@ -13,6 +15,7 @@ function Tmr.load()
if loadnum<=#bgm then if loadnum<=#bgm then
bgm[bgm[loadnum]]=love.audio.newSource("/BGM/"..bgm[loadnum]..".ogg","stream") bgm[bgm[loadnum]]=love.audio.newSource("/BGM/"..bgm[loadnum]..".ogg","stream")
bgm[bgm[loadnum]]:setLooping(true) bgm[bgm[loadnum]]:setLooping(true)
bgm[bgm[loadnum]]:setVolume(0)
loadprogress=loadnum/#bgm loadprogress=loadnum/#bgm
loadnum=loadnum+1 loadnum=loadnum+1
else else
@@ -42,6 +45,9 @@ 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.gametime=stat.gametime+dt
@@ -69,10 +75,9 @@ function Tmr.play(dt)
virtualkeyPressTime[i]=virtualkeyPressTime[i]-1 virtualkeyPressTime[i]=virtualkeyPressTime[i]-1
end end
end end
for i=1,3 do PTC.attack[1]:update(dt)
PTC.attack[i]:update(dt) PTC.attack[2]:update(dt)
end PTC.attack[3]:update(dt)
if frame<180 then if frame<180 then
if frame==179 then if frame==179 then
gameStart() gameStart()
@@ -82,24 +87,33 @@ function Tmr.play(dt)
for p=1,#players do for p=1,#players do
P=players[p] P=players[p]
if P.keyPressing[1]or P.keyPressing[2]then if P.keyPressing[1]or P.keyPressing[2]then
P.moving=P.moving+sgn(P.moving) P.moving=P.moving+(P.moving>0 and 1 or -1)
else else
P.moving=0 P.moving=0
end end
end end
return return
end--Counting,include pre-das 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.time=P.time+dt end
if P.alive then if P.alive then
local v=0 if not P.small then
for i=2,10 do v=v+i*(i-1)*7.2/(frame-P.keyTime[i])end P.keySpeed=P.keySpeed*.99+v*.1 local v=0
v=0 for i=2,10 do v=v+i*(i-1)*7.2/(frame-P.keyTime[i])end P.keySpeed=P.keySpeed*.99+v*.1
for i=2,10 do v=v+i*(i-1)*7.2/(frame-P.dropTime[i])end P.dropSpeed=P.dropSpeed*.99+v*.1 v=0
--Update speeds for i=2,10 do v=v+i*(i-1)*7.2/(frame-P.dropTime[i])end P.dropSpeed=P.dropSpeed*.99+v*.1
--Update speeds
if modeEnv.royaleMode then
if P.keyPressing[9]then
P.swappingAtkMode=min(P.swappingAtkMode+2,30)
else
P.swappingAtkMode=P.swappingAtkMode+((#P.field>15 and P.swappingAtkMode>4 or P.swappingAtkMode>8)and -1 or 1)
end
end
end
if P.ai and P.waiting<=0 then if P.ai and P.waiting==-1 then
P.ai.controlDelay=P.ai.controlDelay-1 P.ai.controlDelay=P.ai.controlDelay-1
if P.ai.controlDelay==0 then if P.ai.controlDelay==0 then
if #P.ai.controls>0 then if #P.ai.controls>0 then
@@ -110,16 +124,22 @@ 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
P.cstat.point=Timer()
P.cstat.event=P.ai.controlDelay0+rnd(2,10)
changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.35 and 2 or 3)
end
end end
end end
end end
if not P.keepVisible then
for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]>0 then P.visTime[j][i]=P.visTime[j][i]-1 end
end end
end--Fresh visible time
for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]>0 then P.visTime[j][i]=P.visTime[j][i]-1 end
end end
--Fresh visible time
if P.keyPressing[1]or P.keyPressing[2]then if P.keyPressing[1]or P.keyPressing[2]then
P.moving=P.moving+sgn(P.moving) P.moving=P.moving+(P.moving>0 and 1 or -1)
local d=abs(P.moving)-P.gameEnv.das local d=abs(P.moving)-P.gameEnv.das
if d>1 then if d>1 then
if P.gameEnv.arr>0 then if P.gameEnv.arr>0 then
@@ -134,8 +154,8 @@ function Tmr.play(dt)
P.moving=0 P.moving=0
end end
if P.keyPressing[7]and not P.keyPressing[9]then if P.keyPressing[7]and not P.keyPressing[9]then
P.downing=P.downing+1
local d=abs(P.downing)-P.gameEnv.sddas local d=abs(P.downing)-P.gameEnv.sddas
P.downing=P.downing+1
if d>1 then if d>1 then
if P.gameEnv.sdarr>0 then if P.gameEnv.sdarr>0 then
if d%P.gameEnv.sdarr==0 then if d%P.gameEnv.sdarr==0 then
@@ -148,76 +168,82 @@ function Tmr.play(dt)
else else
P.downing=0 P.downing=0
end end
if modeEnv.royaleMode then if P.falling>=0 then
if P.keyPressing[9]then
P.swappingAtkMode=min(P.swappingAtkMode+2,30)
else
P.swappingAtkMode=P.swappingAtkMode+((#P.field>15 and P.swappingAtkMode>4 or P.swappingAtkMode>8)and -1 or 1)
end
end
if P.falling>0 then
P.falling=P.falling-1 P.falling=P.falling-1
if P.falling<=0 then if P.falling>=0 then goto stop end
if #P.field>P.clearing[1]then SFX("fall")end if P.gameEnv.fall>0 and #P.field>P.clearing[1]then SFX("fall")end
for i=1,#P.clearing do for i=1,#P.clearing do
removeRow(P.field,P.clearing[i]) removeRow(P.field,P.clearing[i])
removeRow(P.visTime,P.clearing[i]) removeRow(P.visTime,P.clearing[i])
end
::L::if P.clearing[1]then
rem(P.clearing)
goto L
end
end end
elseif P.waiting>0 then ::L::
rem(P.clearing)
if P.clearing[1]then goto L end
end
if P.waiting>=0 then
P.waiting=P.waiting-1 P.waiting=P.waiting-1
if P.waiting<=0 then if P.waiting==-1 then resetblock()end
resetblock() goto stop
end
if P.curY~=P.y_img then
if P.dropDelay>=0 then
P.dropDelay=P.dropDelay-1
if P.dropDelay>=0 then goto stop end
end
drop()
P.dropDelay=P.gameEnv.drop
if P.freshTime<=P.gameEnv.freshLimit then
P.lockDelay=P.gameEnv.lock
end end
else else
if P.cy~=P.y_img then P.lockDelay=P.lockDelay-1
if P.dropDelay>0 then if P.lockDelay>=0 then goto stop end
P.dropDelay=P.dropDelay-1 drop()
else end
drop() ::stop::
P.dropDelay=P.gameEnv.drop if P.b2b1==P.b2b then
if P.freshTime<=P.gameEnv.freshLimit then elseif P.b2b1<P.b2b then
P.lockDelay=P.gameEnv.lock P.b2b1=min(P.b2b1*.98+P.b2b*.02+.4,P.b2b)
end else
end P.b2b1=max(P.b2b1*.95+P.b2b*.05-.6,P.b2b)
else
if P.lockDelay>0 then P.lockDelay=P.lockDelay-1
else drop()
end
end
end end
P.b2b1=P.b2b1*.92+P.b2b*.08
--Alive --Alive
else else
P.keySpeed=P.keySpeed*.96+P.cstat.key/P.time*60*.04 if not P.small then
P.dropSpeed=P.dropSpeed*.96+P.cstat.piece/P.time*60*.04 P.keySpeed=P.keySpeed*.96+P.cstat.key/P.time*60*.04
--Final average speeds P.dropSpeed=P.dropSpeed*.96+P.cstat.piece/P.time*60*.04
if P.falling>0 then --Final average speeds
P.falling=P.falling-1 if modeEnv.royaleMode then
if P.falling<=0 then P.swappingAtkMode=min(P.swappingAtkMode+2,30)
if #P.field>P.clearing[1]then
SFX("fall")
if P.id==1 then VIB(1)end
end
for i=1,#P.clearing do
removeRow(P.field,P.clearing[i])
removeRow(P.visTime,P.clearing[i])
end
P.clearing={}
end end
end--Rows cleared drop end
if P.falling>=0 then
P.falling=P.falling-1
if P.falling>=0 then goto stop end
if P.gameEnv.fall>0 and #P.field>P.clearing[1]then SFX("fall")end
for i=1,#P.clearing do
removeRow(P.field,P.clearing[i])
removeRow(P.visTime,P.clearing[i])
end
::L::
rem(P.clearing)
if P.clearing[1]then goto L end
end::stop::
if P.endCounter<40 then if P.endCounter<40 then
for j=1,#P.field do for i=1,10 do for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
end end--Make field visible end end--Make field visible
end end
if P.b2b1>0 then P.b2b1=max(P.b2b1-3,0)end if P.b2b1>0 then P.b2b1=max(0,P.b2b1*.92-1)end
--Dead --Dead
end end
for i=#P.shade,1,-1 do
local S=P.shade[i]
S[1]=S[1]-1
if S[1]==0 then
rem(P.shade,i)
end
end
for i=#P.bonus,1,-1 do for i=#P.bonus,1,-1 do
local b=P.bonus[i] local b=P.bonus[i]
if b.inf then if b.inf then
@@ -229,9 +255,6 @@ function Tmr.play(dt)
if b.t>=60 then rem(P.bonus,i)end if b.t>=60 then rem(P.bonus,i)end
end end
end end
for i=#P.task,1,-1 do
if P.task[i]()then rem(P.task,i)end
end
for i=#P.atkBuffer,1,-1 do for i=#P.atkBuffer,1,-1 do
local atk=P.atkBuffer[i] local atk=P.atkBuffer[i]
atk.time=atk.time+1 atk.time=atk.time+1
@@ -250,5 +273,10 @@ function Tmr.play(dt)
PTC.dust[p]:update(dt) PTC.dust[p]:update(dt)
end end
end end
if modeEnv.royaleMode and frame%60==0 then freshMostDangerous()end if modeEnv.royaleMode and frame%120==0 then freshMostDangerous()end
end
function Tmr.pause(dt)
if pauseTime<50 then
pauseTime=pauseTime+1
end
end end

View File

@@ -1,4 +1,10 @@
function string.splitS(s,sep) local tm=love.timer
local gc=love.graphics
local kb=love.keyboard
local setFont=setFont
local toN,toS=tonumber,tostring
local function splitS(s,sep)
local t={} local t={}
::L:: ::L::
local i=find(s,sep)or #s+1 local i=find(s,sep)or #s+1
@@ -7,27 +13,18 @@ function string.splitS(s,sep)
if #s~=0 then goto L end if #s~=0 then goto L end
return t return t
end end
function sgn(i)return i>0 and 1 or i<0 and -1 or 0 end--Row numbe is A-uth-or's id!
function stringPack(s,v)return s..toS(v)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-300,y,600,"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
@@ -38,47 +35,38 @@ function removeRow(t,k)
ins(freeRow,rem(t,k)) ins(freeRow,rem(t,k))
end end
local count=0
BGblockList={}for i=1,16 do BGblockList[i]={v=0}end
function getNewBlock()
count=count+1
if count==17 then count=1 end
local t=BGblockList[count]
t.bn,t.size=BGblock.next,2+3*rnd()
t.b=blocks[t.bn][rnd(0,3)]
t.x=rnd(-#t.b[1]*t.size*30+100,1180)
t.y=-#t.b*30*t.size
t.v=t.size*(1+rnd())
BGblock.next=BGblock.next%7+1
return t
end
--Background animation
function timeSort(a,b)
return a.time>b.time
end
function stencil_miniTitle()
for i=1,#miniTitle_rect do
gc.rectangle("fill",unpack(miniTitle_rect[i]))
end
end
function stencil_field()
gc.rectangle("fill",150,60,300,610)
end
function stencil_field_small()
gc.rectangle("fill",0,0,60,120)
end
--Single-usage funcs --Single-usage funcs
langName={"中文","English"}
local langID={"chi","eng"}
function swapLanguage(l) function swapLanguage(l)
text=require("language/"..langID[l]) text=require("language/"..langID[l])
Buttons.sel=nil Buttons.sel=nil
for scene,list in pairs(Buttons)do for S,L in next,Buttons do
for num=1,#list do for N,B in next,L do
list[num].alpha=0 B.alpha=0
list[num].t=text.ButtonText[scene][num] B.t=text.ButtonText[S][N]
end end
end end
drawableText.next:set(text.next)
drawableText.hold:set(text.hold)
if royaleCtrlPad then royaleCtrlPad:release()end
gc.push("transform")
gc.origin()
royaleCtrlPad=gc.newCanvas(300,100)
gc.setCanvas(royaleCtrlPad)
gc.setColor(1,1,1)
setFont(25)
gc.setLineWidth(2)
for i=1,4 do
gc.rectangle("line",RCPB[2*i-1],RCPB[2*i],90,35,8,4)
mStr(text.atkModeName[i],RCPB[2*i-1]+45,RCPB[2*i]+3)
end
gc.setCanvas()
gc.pop()
collectgarbage()
end end
local vibrateLevel={0,0,.03,.04,.05,.07,.9}
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])
@@ -118,22 +106,103 @@ function SFX(s,v)
end end
function BGM(s) function BGM(s)
if setting.bgm and bgmPlaying~=s then if setting.bgm and bgmPlaying~=s then
for k,v in pairs(bgm)do v:stop()end if bgmPlaying then newTask(Event_task.bgmFadeOut,nil,bgmPlaying)end
if s then bgm[s]:play()end for i=1,#Task do
if Task[i].code==Event_task.bgmFadeIn then
Task[i].code=Event_task.bgmFadeOut
end
end
if s then
newTask(Event_task.bgmFadeIn,nil,s)
bgm[s]:play()
end
bgmPlaying=s bgmPlaying=s
end end
end end
local swapDeck_data={
{4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1},
{1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2},
{3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2},
{2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4},
{7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5},
{3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6},
{2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7},
{5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8},
{7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8},
}--Block id [ZSLJTOI] ,dir,x,y
local swap={
none={2,1,d=function()end},
flash={8,1,d=function()gc.clear(1,1,1)end},
fade={30,15,d=function()
local t=1-abs(sceneSwaping.time*.06667-1)
gc.setColor(0,0,0,t)
gc.rectangle("fill",0,0,1280,720)
end},
deck={50,8,d=function()
local t=sceneSwaping.time
gc.setColor(1,1,1)
if t>8 then
local t=max(t,15)
for i=1,51-t do
local bn=swapDeck_data[i][1]
local b=blocks[bn][swapDeck_data[i][2]]
local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4]
for y=1,#b do for x=1,#b[1]do
if b[y][x]then
gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3)
end
end end
end
end
if t<17 then
gc.setColor(1,1,1,(8-abs(t-8))*.125)
gc.rectangle("fill",0,0,1280,720)
end
end},
}--Scene swapping animations
function gotoScene(s,style) function gotoScene(s,style)
if not sceneSwaping and s~=scene then if not sceneSwaping and s~=scene then
style=style or"deck" style=style or"fade"
sceneSwaping={ sceneSwaping={
tar=s,style=style, tar=s,style=style,
time=swap[style][1],mid=swap[style][2], time=swap[style][1],mid=swap[style][2],
draw=swap[style].d draw=swap[style].d
} }
Buttons.sel=nil Buttons.sel=nil
if style~="none"then
sysSFX("swipe")
end
end end
end end
local prevMenu={
load=love.event.quit,
intro="quit",
main="intro",
mode="main",
custom="mode",
draw=function()
kb.setKeyRepeat(false)
gotoScene("custom")
end,
ready="mode",
play=function()
clearTask("play")
gotoScene(curMode.id~="custom"and"mode"or"custom","deck")
end,
pause=function()
clearTask("play")
gotoScene(curMode.id~="custom"and"mode"or"custom","deck")
end,
help="main",
stat="main",
setting=function()
saveSetting()
gotoScene("main")
end,
setting2="setting",
setting3="setting",
}
function back() function back()
local t=prevMenu[scene] local t=prevMenu[scene]
if type(t)=="string"then if type(t)=="string"then
@@ -142,10 +211,57 @@ function back()
t() t()
end end
end end
function pauseGame()
if bgmPlaying then bgm[bgmPlaying]:pause()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={
"run",
"game",
"gametime",
"piece",
"row",
"atk",
"key",
"rotate",
"hold",
"spin",
}
local saveOpt={
"ghost","center",
"grid","swap",
"fxs","bg",
"das","arr",
"sddas","sdarr",
"lang",
"sfx","bgm",
"vib",
"fullscreen",
"bgblock",
"virtualkeyAlpha",
"virtualkeyIcon",
"virtualkeySwitch",
"frameMul",
}
function loadData() function loadData()
userData:open("r") userData:open("r")
--local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n") --local t=splitS(love.math.decompress(userdata,"zlib"),"\r\n")
local t=string.splitS(userData:read(),"\r\n") local t=splitS(userData:read(),"\r\n")
userData:close() userData:close()
for i=1,#t do for i=1,#t do
local i=t[i] local i=t[i]
@@ -160,18 +276,11 @@ function loadData()
end end
end end
function saveData() function saveData()
local t=table.concat({ local t={}
stringPack("run=",stat.run), for i=1,#dataOpt do
stringPack("game=",stat.game), ins(t,dataOpt[i].."="..toS(stat[dataOpt[i]]))
stringPack("gametime=",stat.gametime), end
stringPack("piece=",stat.piece), t=table.concat(t,"\r\n")
stringPack("row=",stat.row),
stringPack("atk=",stat.atk),
stringPack("key=",stat.key),
stringPack("rotate=",stat.rotate),
stringPack("hold=",stat.hold),
stringPack("spin=",stat.spin),
},"\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)
@@ -179,8 +288,8 @@ function saveData()
end end
function loadSetting() function loadSetting()
userSetting:open("r") userSetting:open("r")
--local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n") --local t=splitS(love.math.decompress(userdata,"zlib"),"\r\n")
local t=string.splitS(userSetting:read(),"\r\n") local t=splitS(userSetting:read(),"\r\n")
userSetting:close() userSetting:close()
for i=1,#t do for i=1,#t do
local i=t[i] local i=t[i]
@@ -195,17 +304,17 @@ function loadSetting()
setting.fullscreen=v=="true" setting.fullscreen=v=="true"
love.window.setFullscreen(setting.fullscreen) love.window.setFullscreen(setting.fullscreen)
elseif t=="keymap"then elseif t=="keymap"then
v=string.splitS(v,"/") v=splitS(v,"/")
for i=1,16 do for i=1,16 do
local v1=string.splitS(v[i],",") local v1=splitS(v[i],",")
for j=1,#v1 do for j=1,#v1 do
setting.keyMap[i][j]=v1[j] setting.keyMap[i][j]=v1[j]
end end
end end
elseif t=="keylib"then elseif t=="keylib"then
v=string.splitS(v,"/") v=splitS(v,"/")
for i=1,4 do for i=1,4 do
local v1=string.splitS(v[i],",") local v1=splitS(v[i],",")
for j=1,#v1 do for j=1,#v1 do
setting.keyLib[i][j]=toN(v1[j]) setting.keyLib[i][j]=toN(v1[j])
end end
@@ -218,10 +327,10 @@ function loadSetting()
end end
end end
elseif t=="virtualkey"then elseif t=="virtualkey"then
v=string.splitS(v,"/") v=splitS(v,"/")
for i=1,10 do for i=1,10 do
if not v[i]then goto c end if not v[i]then goto c end
virtualkey[i]=string.splitS(v[i],",") virtualkey[i]=splitS(v[i],",")
for j=1,4 do for j=1,4 do
virtualkey[i][j]=toN(virtualkey[i][j]) virtualkey[i][j]=toN(virtualkey[i][j])
end end
@@ -236,7 +345,7 @@ 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"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("[12]"))or 1
@@ -260,25 +369,15 @@ function saveSetting()
for i=1,4 do for i=1,4 do
lib[i]=table.concat(setting.keyLib[i],",") lib[i]=table.concat(setting.keyLib[i],",")
end end
local t=table.concat({ local t={
stringPack("lang=",setting.lang), "keymap="..toS(table.concat(map,"/")),
stringPack("sfx=",setting.sfx), "keylib="..toS(table.concat(lib,"/")),
stringPack("bgm=",setting.bgm), "virtualkey="..toS(table.concat(vk,"/")),
stringPack("vib=",setting.vib), }
stringPack("fullscreen=",setting.fullscreen), for i=1,#saveOpt do
stringPack("bgblock=",setting.bgblock), ins(t,saveOpt[i].."="..toS(setting[saveOpt[i]]))
stringPack("das=",setting.das), end
stringPack("arr=",setting.arr), t=table.concat(t,"\r\n")
stringPack("sddas=",setting.sddas),
stringPack("sdarr=",setting.sdarr),
stringPack("keymap=",table.concat(map,"/")),
stringPack("keylib=",table.concat(lib,"/")),
stringPack("virtualkey=",table.concat(vk,"/")),
stringPack("virtualkeyAlpha=",setting.virtualkeyAlpha),
stringPack("virtualkeyIcon=",setting.virtualkeyIcon),
stringPack("virtualkeySwitch=",setting.virtualkeySwitch),
stringPack("frameMul=",setting.frameMul),
},"\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)