Compare commits

...

12 Commits

Author SHA1 Message Date
MrZ_26
830f0ffbed Alpha V0.7.16 2020-02-04 19:33:52 +08:00
MrZ_26
849e5b586e Alpha V0.7.15 2020-02-04 19:33:41 +08:00
MrZ_26
f82e979f9c Alpha V0.7.14 2020-02-04 19:33:20 +08:00
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
MrZ_26
42d7b1be94 Alpha V0.7.10 2020-02-04 19:32:10 +08:00
MrZ_26
a31474c43a Alpha V0.7.9 2020-02-04 19:31:45 +08:00
MrZ_26
75c7955bb5 Alpha V0.7.8 2020-02-04 19:31:31 +08:00
MrZ_26
c35152cf6e Alpha V0.7.7 2020-02-04 19:31:17 +08:00
MrZ_26
1b0ad009b0 Alpha V0.7.6 2020-02-04 19:30:59 +08:00
MrZ_26
e7c797bf14 Alpha V0.7.5 2020-02-04 19:30:42 +08:00
48 changed files with 3936 additions and 2264 deletions

Binary file not shown.

BIN
BGM/cruelty.ogg Normal file

Binary file not shown.

BIN
BGM/end.ogg Normal file

Binary file not shown.

BIN
BGM/final.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
BGM/newera.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
BGM/rockblock.ogg Normal file

Binary file not shown.

BIN
BGM/secret7th.ogg Normal file

Binary file not shown.

BIN
BGM/secret8th.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
SFX/blip_1.ogg Normal file

Binary file not shown.

BIN
SFX/blip_2.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
SFX/collect.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
SFX/emit.ogg Normal file

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.

46
ai.lua
View File

@@ -49,17 +49,18 @@ FCL[5]=FCL[3]
clearScore={[0]=0,0,2,4,12}
function ifoverlapAI(f,bk,x,y)
if y<1 then return true end
if y>#f then return nil end
if y>#f then return end
for i=1,#bk do for j=1,#bk[1]do
if f[y+i-1]and bk[i][j]>0 and f[y+i-1][x+j-1]>0 then return true end
if f[y+i-1]and bk[i][j]and f[y+i-1][x+j-1]>0 then return true end
end end
end
function resetField(f0,f,start)
while f[start]do
::L::if f[start]then
removeRow(f,start)
goto L
end
for i=start,#f0 do
f[i]=getNewRow()
f[i]=getNewRow(0)
for j=1,10 do
f[i][j]=f0[i][j]
end
@@ -68,25 +69,24 @@ end
function getScore(field,bn,cb,cx,cy)
local score=0
local highest=0
local height=getNewRow()
local height=getNewRow(0)
local clear=0
local hole=0
for i=cy+#cb-1,cy,-1 do
local f=true
for j=1,10 do
if field[i][j]==0 then f=false;break end
end
if f then
removeRow(field,i)
clear=clear+1
if field[i][j]==0 then goto L end
end
removeRow(field,i)
clear=clear+1
::L::
end
if #field==0 then return 9e99 end--PC best
for x=1,10 do
local h=#field
while field[h][x]==0 and h>1 do
::L::if field[h][x]==0 and h>1 then
h=h-1
goto L
end
height[x]=h
if x>3 and x<8 and h>highest then highest=h end
@@ -112,38 +112,39 @@ function getScore(field,bn,cb,cx,cy)
ins(freeRow,height)
score=
#field*20
-cy*40
-cy*35
-#cb*25
+clearScore[clear]*(8+#field)
-hole*50
if #field>6 then score=score-highest*5 end
if mh1>3 then score=score-50-mh1*40 end
if mh1>3 then score=score-40-mh1*30 end
return score
end
function AI_getControls(ctrl)
local Tfield={}--test field
local field_org=P.field
for i=1,#field_org do
Tfield[i]=getNewRow()
for i=1,#field_org do
Tfield[i]=getNewRow(0)
for j=1,10 do
Tfield[i][j]=field_org[i][j]
end
end
local best={x=1,dir=0,hold=false,score=-9e99}
for ifhold=0,P.gameEnv.hold and 1 or 0 do
local bn=ifhold==0 and P.bn or P.hn>0 and P.hn 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
local cb=blocks[bn][dir]
for cx=1,11-#cb[1]do--each pos
local cy=#Tfield+1
while not ifoverlapAI(Tfield,cb,cx,cy-1)do
::L::if not ifoverlapAI(Tfield,cb,cx,cy-1)then
cy=cy-1
goto L
end--move to bottom
for i=1,#cb do
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
if cb[i][j]~=0 then
if cb[i][j]then
Tfield[y][cx+j-1]=1
end
end
@@ -156,8 +157,11 @@ function AI_getControls(ctrl)
end
end
end
while #Tfield>0 do
::L::
if #Tfield>0 then
removeRow(Tfield,1)
goto L
end--Release cache
if best.hold then
ins(ctrl,8)

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)
local x,y=xOy:inverseTransformPoint(x,y)
local d2,nearest,distance
for K=1,#virtualkey do
local b=virtualkey[K]
@@ -12,36 +113,34 @@ function onVirtualkey(x,y)
end
return nearest
end
function buttonControl_key(i)
if i=="up"or i=="down"or i=="left"or i=="right"then
if not Buttons.sel then
Buttons.sel=1
if Buttons.sel then
Buttons.sel=Buttons[scene][Buttons.sel[i]]or Buttons.sel
else
Buttons.sel=Buttons[scene][Buttons.sel][i]or Buttons.sel
Buttons.sel=select(2,next(Buttons[scene]))
mouseShow=false
end
elseif i=="space"or i=="return"then
if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel]
B.code()
B.alpha=1
Buttons.sel.alpha=1
Buttons.sel.code()
sysSFX("button")
end
end
end
function buttonControl_gamepad(i)
if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then
if not Buttons.sel then
Buttons.sel=1
mouseShow=false
if Buttons.sel 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
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
elseif i=="start"then
if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel]
B.code()
B.alpha=1
Buttons.sel.alpha=1
Buttons.sel.code()
sysSFX("button")
end
end
@@ -56,6 +155,125 @@ function mouseDown.intro(x,y,k)
gotoScene("main")
end
end
function mouseDown.draw(x,y,k)
mouseMove.draw(x,y)
end
function mouseDown.setting3(x,y,k)
if k==2 then back()end
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
sel=K
end
end
end
mouseMove={}
function mouseMove.draw(x,y,dx,dy)
sx,sy=int((x-200)/30)+1,20-int((y-60)/30)
if sx<1 or sx>10 then sx=nil end
if sy<1 or sy>20 then sy=nil end
if sx and sy and ms.isDown(1,2)then
preField[sy][sx]=ms.isDown(1)and pen or 0
end
end
function mouseMove.setting3(x,y,dx,dy)
if sel and ms.isDown(1)then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
mouseUp={}
function mouseUp.setting3(x,y,k)
if sel then
local b=virtualkey[sel]
local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k
end
end
wheelmoved={}
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={}
function keyDown.intro(key)
if key=="escape"then
@@ -66,11 +284,25 @@ function keyDown.intro(key)
end
function keyDown.mode(key)
if key=="down"then
if modeSel<#modeID then modeSel=modeSel+1 end
if modeSel<#modeID then
modeSel=modeSel+1
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
end
elseif key=="up"then
if modeSel>1 then modeSel=modeSel-1 end
if modeSel>1 then
modeSel=modeSel-1
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
end
elseif key=="left"then
if levelSel>1 then
levelSel=levelSel-1
end
elseif key=="right"then
if levelSel<#modeLevel[modeID[modeSel]]then
levelSel=levelSel+1
end
elseif key=="return"then
startGame(modeID[modeSel])
loadGame(modeSel,levelSel)
elseif key=="c"then
gotoScene("custom")
elseif key=="escape"then
@@ -88,12 +320,42 @@ function keyDown.custom(key)
optSel=optSel%#customID+1
elseif key=="up"then
optSel=(optSel-2)%#customID+1
elseif key=="d"then
gotoScene("draw")
elseif key=="return"then
startGame("custom")
loadGame(0,1)
elseif key=="space"then
loadGame(0,2)
elseif key=="escape"then
back()
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)
if key=="escape"then
if keyboardSetting then
@@ -124,30 +386,37 @@ function keyDown.setting2(key)
end
end
function keyDown.play(key)
if key=="escape"then back()return nil end
if key=="escape"then pauseGame()end
local m=setting.keyMap
for p=1,4 do
for p=1,human do
local lib=setting.keyLib[p]
for s=1,#lib do
for k=1,12 do
if key==m[lib[s]][k]then
pressKey(k,players[p])
return nil
return
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={}
function keyUp.play(key)
local m=setting.keyMap
for p=1,4 do
for p=1,human do
local lib=setting.keyLib[p]
for s=1,#lib do
for k=1,12 do
if key==m[lib[s]][k]then
releaseKey(k,players[p])
return nil
return
end
end
end
@@ -167,7 +436,7 @@ function gamepadDown.mode(key)
elseif key=="dpup"then
if modeSel>1 then modeSel=modeSel-1 end
elseif key=="start"then
startGame(modeID[modeSel])
loadGame(modeSel,levelSel)
elseif key=="back"then
back()
end
@@ -202,7 +471,7 @@ function gamepadDown.setting2(key)
end
end
function gamepadDown.play(key)
if key=="back"then back()return nil end
if key=="back"then back()return end
local m=setting.keyMap
for p=1,4 do
local lib=setting.keyLib[p]
@@ -210,7 +479,7 @@ function gamepadDown.play(key)
for k=1,12 do
if key==m[8+lib[s]][k]then
pressKey(k,players[p])
return nil
return
end
end
end
@@ -225,147 +494,137 @@ function gamepadUp.play(key)
for k=1,12 do
if key==m[8+lib[s]][k]then
releaseKey(k,players[p])
return nil
return
end
end
end
end
end
wheelmoved={}
function wheelmoved.mode(x,y)
modeSel=min(max(modeSel-sgn(y),1),#modeID)
end
--Warning,these are not system callbacks!
function love.mousemoved(x,y,dx,dy,t)
if not t then
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
Buttons.sel=nil
for i=1,#Buttons[scene]do
local B=Buttons[scene][i]
if not(B.hide and B.hide())then
if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then
Buttons.sel=i
return nil
end
end
end
end
end
function love.mousepressed(x,y,k,t,num)
if not t then
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
if mouseDown[scene]then
mouseDown[scene](mx,my,k)
else
if k==1 then
if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel]
B.code()
B.alpha=1
Buttons.sel=nil
love.mousemoved(x,y)
sysSFX("button")
end
elseif k==2 then
back()
if t then return end
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
if mouseDown[scene]then
mouseDown[scene](mx,my,k)
elseif k==2 then
back()
end
if k==1 then
if not sceneSwaping and Buttons.sel then
local B=Buttons.sel
B.code()
B.alpha=1
Buttons.sel=nil
love.mousemoved(x,y,0,0)
sysSFX("button")
end
end
end
function love.mousemoved(x,y,dx,dy,t)
if t then return end
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
Buttons.sel=nil
if mouseMove[scene]then
mouseMove[scene](mx,my,dx/scr.k,dy/scr.k)
end
for _,B in next,Buttons[scene]do
if not(B.hide and B.hide())then
if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then
Buttons.sel=B
return
end
end
end
end
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
function love.wheelmoved(x,y)
if wheelmoved[scene]then wheelmoved[scene](x,y)end
end
function love.touchpressed(id,x,y)
if not touching then
touching=id
love.mousemoved(x,y)
love.mousemoved(x,y,0,0)
mouseShow=false
end
if scene=="play"then
if setting.virtualkeySwitch then
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")
if touchDown[scene]then
touchDown[scene](id,xOy:inverseTransformPoint(x,y))
end
end
function love.touchreleased(id,x,y)
if id==touching then
touching=nil
if Buttons.sel then
local B=Buttons[scene][Buttons.sel]
local B=Buttons.sel
B.code()
B.alpha=1
Buttons.sel=nil
sysSFX("button")
end
Buttons.sel=nil
mouseShow=false
end
if scene=="play"and setting.virtualkeySwitch then
local t=onVirtualkey(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
if touchUp[scene]then
touchUp[scene](id,xOy:inverseTransformPoint(x,y))
end
end
function love.touchmoved(id,x,y,dx,dy)
love.mousemoved(x,y)
mouseShow=false
if not Buttons.sel then
touching=nil
end
if scene=="play"and setting.virtualkeySwitch then
local l=tc.getTouches()
for n=1,#virtualkey do
local b=virtualkey[n]
local p=false
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
p=true
break
end
x,y=xOy:inverseTransformPoint(x,y)
if touchMove[scene]then
touchMove[scene](id,x,y,dx/scr.k,dy/scr.k)
end
for _,B in next,Buttons[scene]do
if not(B.hide and B.hide())then
if abs(x-B.x)<B.w*.5 and abs(y-B.y)<B.h*.5 then
Buttons.sel=B
return
end
if not p and players[1].keyPressing 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
function love.keypressed(i)
if i=="f12"then devMode=true end
if keyDown[scene]then keyDown[scene](i)
elseif i=="escape"or i=="back"then back()
else buttonControl_key(i)
if i=="f8"then devMode=not devMode end
if devMode then
if i=="k"then
P=players.alive[rnd(#players.alive)]
Event_gameover.lose()
--Test code here
elseif i=="q"then
for k,B in next,Buttons[scene]do
print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h))
end
elseif i=="s"then
print(scr.x,scr.y,scr.w,scr.h,scr.k)
elseif Buttons.sel then
local B=Buttons.sel
if i=="left"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=="down"then B.y=B.y+10
elseif i==","then B.w=B.w-10
elseif i=="."then B.w=B.w+10
elseif i=="/"then B.h=B.h-10
elseif i=="'"then B.h=B.h+10
end
end
else
if keyDown[scene]then keyDown[scene](i)
elseif i=="escape"or i=="back"then back()
else buttonControl_key(i)
end
end
mouseShow=false
end
@@ -376,29 +635,44 @@ end
function love.gamepadpressed(joystick,i)
if gamepadDown[scene]then return gamepadDown[scene](i)
elseif i=="back"then return back()
elseif i=="back"then back()
else buttonControl_gamepad(i)
end
mouseShow=false
end
function love.gamepadreleased(joystick,i)
if gamepadUp[scene]then gamepadUp[scene](i)
end
end
--[[
function love.joystickpressed(js,k)
end
function love.joystickaxis(js,axis,val)
end
function love.joystickhat(js,hat,dir)
end
function love.joystickpressed(js,k)end
function love.joystickaxis(js,axis,valend
function love.joystickhat(js,hat,dirend
function love.sendData(data)end
function love.receiveData(id,data)end
]]
function love.wheelmoved(x,y)
if wheelmoved[scene]then wheelmoved[scene](x,y)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 wd.isMinimized()and scene=="play"then pauseGame()end
end
function love.update(dt)
--[[
if players then
@@ -412,48 +686,45 @@ function love.update(dt)
if BGblock[i].y>720 then rem(BGblock,i)end
end
if setting.bgblock then
BGblock.ct=BGblock.ct-1
if BGblock.ct==0 then
BGblock.tm=BGblock.tm-1
if BGblock.tm==0 then
ins(BGblock,getNewBlock())
BGblock.ct=rnd(20,30)
BGblock.tm=rnd(20,30)
end
end
--Background blocks update
if sceneSwaping then
sceneSwaping.time=sceneSwaping.time-1
if sceneSwaping.time==sceneSwaping.mid then
for i=1,#Buttons[scene]do
Buttons[scene][i].alpha=0
end--Reset buttons' state
game[sceneSwaping.tar]()
for k,B in next,Buttons[scene]do
B.alpha=0
end--Reset buttons' alpha
scene=sceneSwaping.tar
sceneInit[scene]()
Buttons.sel=nil
elseif sceneSwaping.time==0 then
sceneSwaping=nil
end
elseif Tmr[scene]then
end
if Tmr[scene]then
Tmr[scene](dt)
end
--scene swapping & Timer
end
function love.sendData(data)
return nil
end
function love.receiveData(id,data)
return nil
for i=#Task,1,-1 do
Task[i]:update()
end
updateButton()
end
function love.draw()
gc.clear()
Pnt.BG[curBG]()
gc.setColor(1,1,1,.3)
gc.discard()--SPEED UPUPUP!
Pnt.BG[setting.bg and curBG or"grey"]()
gc.setColor(1,1,1,.2)
for n=1,#BGblock do
local b,img=BGblock[n].b,blockSkin[BGblock[n].bn]
local size=BGblock[n].size
for i=1,#b do for j=1,#b[1]do
if b[i][j]>0 then
if b[i][j]then
gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size)
end
end end--Block
end end
end
if Pnt[scene]then Pnt[scene]()end
drawButton()
@@ -461,7 +732,7 @@ function love.draw()
local r=Timer()*.5
gc.setColor(1,1,1,min(1-abs(1-r%1*2),.3))
r=int(r)%7+1
gc.draw(mouseBlock[r],mx,my,Timer()%pi*4,20,20,scs[r][0][2]-.5,#blocks[r][0]-scs[r][0][1]+.5)
gc.draw(mouseBlock[r],mx,my,Timer()%pi*4,20,20,scs[r][2]-.5,#blocks[r][0]-scs[r][1]+.5)
gc.setColor(1,1,1,.5)
gc.circle("fill",mx,my,5)
gc.setColor(1,1,1)
@@ -469,76 +740,46 @@ function love.draw()
end
if sceneSwaping then sceneSwaping.draw()end
if wh/ww>.5625 then
gc.setColor(0,0,0)
gc.rectangle("fill",0,0,1280,ww*9/16-wh)
gc.rectangle("fill",0,720,1280,wh-ww*9/16)
elseif wh/ww<.5625 then
gc.setColor(0,0,0)
gc.rectangle("fill",0,0,wh*16/9-ww,720)
gc.rectangle("fill",1280,0,ww-wh*16/9,720)
end
if scr.r==.5625 then goto L end
if scr.r>.5625 then
gc.setColor(0,0,0)
gc.rectangle("fill",0,0,1280,scr.w*9/16-scr.h)
gc.rectangle("fill",0,720,1280,scr.h-scr.w*9/16)
else
gc.setColor(0,0,0)
gc.rectangle("fill",0,0,scr.h*16/9-scr.w,720)
gc.rectangle("fill",1280,0,scr.w-scr.h*16/9,720)
end
::L::
setFont(20)gc.setColor(1,1,1)
gc.print(tm.getFPS(),5,700)
if devMode then
gc.print(gcinfo(),5,680)
gc.print(freeRow and #freeRow or 0,5,660)
gc.print(#freeRow or 0,5,660)
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()
local frameT=Timer()
local readyDrawFrame=0
love.resize(gc.getWidth(),gc.getHeight())
game.load()--System scene Launch
math.randomseed(os.time()*626)
scene="load"sceneInit.load()--System Launch
return function()
love.event.pump()
for name,a,b,c,d,e,f in love.event.poll()do
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
if focus then
tm.step()
-- love.receiveData(id,data)
love.update(tm.getDelta())
readyDrawFrame=readyDrawFrame+setting.frameMul
if readyDrawFrame>=100 then
readyDrawFrame=readyDrawFrame-100
gc.clear()
love.draw()
gc.present()
end
if not(wd.hasFocus()or keeprun)then
focus=false
ms.setVisible(true)
if bgmPlaying then bgm[bgmPlaying]:pause()end
if scene=="play"then
for i=1,#players.alive do
local l=players.alive[i].keyPressing
for j=1,#l do
if l[j]then
releaseKey(j,players.alive[i])
end
end
end
end
end
else
tm.sleep(.2)
if wd.hasFocus()then
tm.step()
focus=true
ms.setVisible(false)
if bgmPlaying then bgm[bgmPlaying]:play()end
end
tm.step()
-- love.receiveData(id,data)
love.update(tm.getDelta())
readyDrawFrame=readyDrawFrame+setting.frameMul
if readyDrawFrame>=100 then
readyDrawFrame=readyDrawFrame-100
love.draw()
gc.present()
end
while Timer()-frameT<1/60 do end
::L::if Timer()-frameT<1/60 then goto L end
frameT=Timer()
tm.sleep(.001)
end
end

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

@@ -1,7 +1,7 @@
function love.conf(t)
local X=nil
t.identity="Techmino"--The name of the save directory (string)
t.appendidentity=X--Search files in source directory before save directory (boolean)
t.identity="Techmino"--Save directory name
t.appendidentity=X--If search files in source before save directory
t.version="11.1"
t.console=X
t.accelerometerjoystick=X--If exposing accelerometer on iOS and Android as a Joystick
@@ -9,18 +9,18 @@ function love.conf(t)
t.audio.mixwithsystem=true--Switch on to keep sysBGM
local W=t.window
W.title="Techmino V0.7.4"
W.title="Techmino V0.7.16"
W.icon="/image/icon.png"
W.width,W.height=1280,720
W.minwidth,W.minheight=640,360
W.borderless=X
W.resizable=true
W.minwidth,W.minheight=640,360
W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string)
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.depth=X--Bits per sample in the depth buffer
W.stencil=8--The number of bits per sample in the stencil buffer
W.stencil=1--The number of bits per sample in the stencil buffer
W.display=1--Monitor ID
W.highdpi=X--Enable high-dpi mode for the window on a Retina display (boolean)
W.x,W.y=nil

1080
dataList.lua Normal file

File diff suppressed because it is too large Load Diff

BIN
font.ttf Normal file

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 638 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

230
language/chi.lua Normal file
View File

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

230
language/eng.lua Normal file
View File

@@ -0,0 +1,230 @@
return{
atkModeName={"Random","Badges","K.O.s","Counters"},
royale_remain=function(n)return n.." Players Remain"end,
cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
techrash="Techrash",
techrashB2B="Techrash B2B",
techrashB3B="Techrash B2B2B",
block={"Z","S","L","J","T","O","I"},
spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
clear={" single"," double"," triple"},
b2b="B2B ",
b3b="B2B2B ",
mini="Mini",
PC="Perfect Clear",
hold="Hold",
next="Next",
stage={"STAGE 1","STAGE 2","STAGE 3","STAGE 4","STAGE 5",},
maxspeed="Max speed",
speedup="Speed up",
win="WIN",
lose="LOSE",
pause="PAUSE",
custom="Custom Game",
customOption={
drop="Drop delay:",
lock="Lock delay:",
wait="Next piece delay:",
fall="Clear row delay:",
next="Next count:",
hold="Hold:",
sequence="Sequence:",
visible="Visible:",
target="Line limit:",
freshLimit="Lock fresh limit:",
opponent="Opponent speed:",
},
customVal={
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"","[20G]"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
next=nil,
hold={"ON","OFF","FREE"},
sequence={"bag7","his4","random"},
visible={"normal","time","invisible","sudden"},
target={10,20,40,100,200,500,1000,""},
freshLimit={0,8,15,""},
opponent={"No CPU",1,2,3,4,5,6,7,8,9,10,11},
},
softdropdas="softdropDAS:",
softdroparr="softdropARR:",
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"},
keyboard="Keyboard",joystick="Joystick",
space="Space",enter="Enter",
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:","Function:","Restart:","Instant Left:","Instant Right:","Ins Down:"},
modeName={
[0]="Custom",
"Sprint","Marathon","Master","Classic","Zen","Infinite","1v1","TSD-only","Blind","Dig","Survivor","Tech",
"PC Train","PC Challenge","Techmino41","Techmino99","Drought","Hotseat",
},
modeInfo={
sprint="Speed run",
marathon="Survive and reach target",
master="To be Grand Master",
classic="Vintage car drag racing",
zen="Clear 200 Lines without gravity",
infinite="Infinite game,infinite happiness",
solo="Beat AI",
tsd="Make more T-spin-doubles",
blind="Invisible board",
dig="Downstack!",
survivor="Hand them!",
tech="Techniques practice",
pctrain="Let's learn some PCs",
pcchallenge="Make PCs in 100 Lines",
techmino41="Melee fight with 40 AIs",
techmino99="Melee fight with 98 AIs",
drought="ERRSEQ flood attack",
hotseat="",
},
load={"Loading textures","Loading BGM","Loading SFX","Finished",},
tips={
"Not animation,real loading!",
"The WHOLE game is made by MrZ!",
"Back to Back 10 combo Techrash PC!",
"Techmino has a Nspire-CX edition!",
"Is B2B2B2B possible?",
"MEGACMB!",
"ALLSPIN!",
"O spin triple?",
"You can play with any input device!",
"Miya:Nya!",
"225238922,Bilibili cheers!",
"Playing too much = taking drugs",
"Disappearing doesn't mean useless",
"Try to use two rotate button,three better",
"Small DAS&ARR can make you faster,if you can adapt to it",
"Have you noticed what does \"rotating\" do to block?",
"20G is a brand new game rule",
"Do not play this game in class!",
},
stat={
"Games run:",
"Games played:",
"Game time:",
"Total block used:",
"Total rows cleared:",
"Total lines sent:",
"Total key pressed:",
"Total rotate:",
"Total hold:",
"Total spin:",
},
help={
"I don't think you need \"help\".",
"THIS IS ONLY A BLOCK GAME",
"But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,so DO NOT DISTIRBUTE",
"",
"Powered by LOVE2D",
"Author:MrZ E-mail:1046101471@qq.com",
"Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ",
"Tool used:VScode,GFIE,Beepbox,Goldwave",
"Special thanks:Farter,Teatube,196,Flyz,T830,[all test staff] and YOU!",
"Any bugs/suggestions to my E-mail.",
},
support="Support Author",
group="Official QQ Group",
ButtonText={
main={
play="Play",
setting="Settings",
stat="Statistics",
help="Help",
quit="Quit",
},
mode={
up="Λ",
down="v",
left="<",
right=">",
start="Start",
custom="Custom(C)",
back="Back",
},
custom={
up="Λ",
down="v",
left="<",
right=">",
start1="Clear Start",
start2="Puzzle Start",
draw="Draw(D)",
back="Back",
},
draw={
block1="",
block2="",
block3="",
block4="",
block5="",
block6="",
block7="",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
erase="×",
clear="Clear",
back="Back",
},
play={
pause="Pause",
},
pause={
resume="Resume",
quit="Quit",
},
setting={
ghost=function()return setting.ghost and"Ghost:ON"or"Ghost: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="+",
sfx=function()return setting.sfx and"SFX:ON"or"SFX:OFF"end,
bgm=function()return setting.bgm and"BGM:ON"or"BGM:OFF"end,
vib=function()return "Vibrate level:"..setting.vib end,
fullscreen=function()return setting.fullscreen and"Fullscreen:ON"or"Fullscreen:OFF"end,
bgblock=function()return setting.bgblock and"BG animation:ON"or"BG animation:OFF"end,
frame=function()return"FrameDraw:"..setting.frameMul.."%"end,
control="Control settings",
touch="Touch settings",
lang=function()return langName[setting.lang]end,
back="Save&Back",
},
setting2={
back="Back",
},
setting3={
back="Back",
hide=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,
default="Defaults",
snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return percent0to5[setting.virtualkeyAlpha]end,
icon="Icon",
size="Size",
},
help={
back="Back",
qq="Author's qq",
},
stat={
back="Back",
path="Open Data Folder",
},
}
}

647
list.lua
View File

@@ -1,40 +1,13 @@
--[["four name"
Techrash
Techmino
Tequéno
Zestris
Quadruple
Tequeno
Techzino
Tectris
]]
PCbase={
{3,3,3,0,0,0,0,0,2,2},
{3,6,6,0,0,0,0,2,2,5},
{4,6,6,0,0,0,1,1,5,5},
{4,4,4,0,0,0,0,1,1,5},
{1,1,0,0,0,0,0,3,3,3},
{5,1,1,0,0,0,0,6,6,3},
{5,5,2,2,0,0,0,6,6,4},
{5,2,2,0,0,0,0,4,4,4},
}
PClist={--ZSLJTOI
{7,7,4,5},{7,7,6,4},{7,7,2,4},{7,7,1,3},{7,7,5,6},{7,7,5,2},{7,7,5,4},{7,7,5,3},
{7,4,1,2},{7,3,5,7},{7,5,4,3},{7,5,1,2},{7,1,4,2},{7,4,2,5},{7,6,4,5},{7,5,4,2},
{7,5,6,4},{7,5,3,6},{7,2,5,6},{7,2,6,4},{7,2,1,3},{7,5,2,7},{7,5,7,2},{7,5,2,3},
{7,5,3,2},{7,6,4,5},{7,6,5,4},{7,3,1,5},{7,3,2,5},{7,4,1,5},{7,4,5,2},{7,7,3,6},
{7,3,7,6},{7,3,6,2},{7,3,7,1},{7,6,4,2},{3,2,7,6},{3,2,6,7},{7,7,4,5},{7,5,3,4},
{7,3,6,5},{7,3,2,5},{7,4,6,5},{7,6,4,5},{7,5,2,3},{7,3,5,7},{7,3,2,5},{7,3,5,1},
{7,5,2,3},{3,6,2,5},{3,1,2,5},{3,1,1,5},{3,1,5,2},{3,1,5,1},{3,5,1,2},{4,5,3,2},
{4,2,6,5},{6,5,3,2},{1,4,2,5},{1,5,3,6},{5,2,6,3},{5,2,1,3},{5,2,7,4},{2,4,1,5},
{2,4,5,1},{2,1,4,5},{2,5,4,3},{2,5,6,7},{7,5,4,2},
}
local gc=love.graphics
local sys=love.system
local fs=love.filesystem
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","func","restart","insLeft","insRight","insDown"}
color={
red={1,0,0},
green={0,1,0},
blue={.2,.2,1},
yellow={1,1,0},
purple={1,0,1},
magenta={1,0,1},
cyan={0,1,1},
grey={.6,.6,.6},
@@ -42,7 +15,7 @@ color={
lightGreen={.5,1,.5},
lightBlue={.6,.6,1},
lightYellow={1,1,.5},
lightPurple={1,.5,1},
lightMagenta={1,.5,1},
lightCyan={.5,1,1},
lightGrey={.8,.8,.8},
@@ -50,135 +23,60 @@ color={
darkGreen={0,.6,0},
darkBlue={0,0,.6},
darkYellow={.6,.6,0},
darkPurple={.6,0,.6},
darkMagenta={.6,0,.6},
darkCyan={0,.6,.6},
darkGrey={.3,.3,.3},
white={1,1,1},
orange={1,.6,0},
lightOrange={1,.7,.3},
purple={.5,0,1},
lightPurple={.8,.4,1},
darkPurple={.3,0,.6},
}
attackColor={
{color.red,color.yellow},
{color.red,color.purple},
{color.blue,color.white},
animate={
function(t)
gc.setColor(1,t,0)
end,
function(t)
gc.setColor(1,0,t)
end,
function(t)
gc.setColor(t,t,1)
end,
}--3 animation-colorsets of attack buffer bar
}
frameColor={
[0]=color.white,
color.green,
color.blue,
color.purple,
color.orange,
}
blockName={"Z","S","L","J","T","O","I"}
blockColor={
color.red,
color.green,
color.orange,
color.blue,
color.purple,
color.magenta,
color.yellow,
color.cyan,
color.darkGreen,
color.darkGrey,
color.grey,
color.darkPurple,
color.darkRed,
color.darkGreen,
}
clearName={"Single","Double","Triple"}
spinName={[0]={}}
for i=1,3 do
spinName[i]={}
for j=1,7 do
spinName[i][j]=blockName[j].." spin "..clearName[i]
end
end
for j=1,7 do
spinName[0][j]=blockName[j].." spin"
end
miniTitle_pixel={
{2,0,5,1},{4,1,1,6},
{9,0,4,1},{9,3,4,1},{9,6,4,1},{8,0,1,7},
{15,0,3,1},{15,6,3,1},{14,0,1,7},
{19,0,1,7},{23,0,1,7},{20,3,3,1},
{0,8,1,6},{6,8,1,6},{1,9,1,1},{2,10,1,1},{3,11,1,1},{4,10,1,1},{5,9,1,1},
{8,8,5,1},{8,13,5,1},{10,9,1,4},
{14,8,1,6},{19,8,1,6},{15,9,1,1},{16,10,1,1},{17,11,1,1},{18,12,1,1},
{21,8,5,1},{21,13,5,1},{21,9,1,4},{25,9,1,4},
}
sfx={
"button",
"ready","start","win","fail",
"button","swipe",
"ready","start","win","fail","collect",
"move","rotate","rotatekick","hold",
"prerotate","prehold",
"drop","fall",
"lock","drop","fall",
"reach",
"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","ren_10","ren_11",
"clear_1","clear_2","clear_3","clear_4",
"spin_0","spin_1","spin_2","spin_3",
"emit","blip_1","blip_2",
"perfectclear",
}
bgm={
"blank",
"way",
"race",
"newera",
"push",
"reason",
"infinite",
}
prevMenu={
load=love.event.quit,
intro="quit",
main="intro",
mode="main",
custom="mode",
ready="mode",
play=function()
gotoScene(gamemode~="custom"and"mode"or"custom")
end,
help="main",
stat="main",
setting=function()
saveSetting()
gotoScene("main")
end,
setting2="setting",
setting3="setting",
}
modeID={
"sprint","marathon","zen","infinite","solo","death","tsd","blind",
"pctrain","pcchallenge","techmino41","techmino99","gmroll","p2","p3","p4"
}
modeName={
"Sprint","Marathon","Zen","Infinite","1v1","Death","TSD-only","Blind",
"PC Train","PC Challenge","Techmino41","Techmino99","GM roll","2P","3P","4P"
}
modeInfo={
sprint="Clear 40 Lines",
marathon="Clear 200 Lines",
zen="Clear 200 Lines without gravity",
infinite="Infinite game,infinite happiness",
solo="Beat AI",
death="Survive under terrible speed",
tsd="T-spin-double Only!",
blind="Invisible board!",
pctrain="Let's learn some PCs",
pcchallenge="Make PCs in 100 Lines",
techmino41="Melee fight with 40 AIs",
techmino99="Melee fight with 98 AIs",
gmroll="Who want to be the grand master?",
p2="2 players game",
p3="3 players game",
p4="4 players game",
"cruelty",
"final",
"secret7th",
"secret8th",
"rockblock",
"end",
}
customID={
@@ -193,317 +91,284 @@ customID={
"target",
"freshLimit",
"opponent",
}--Order
customOption={
drop="Drop delay:",
lock="Lock delay:",
wait="Next piece delay:",
fall="Clear row delay:",
next="Next count:",
hold="Hold:",
sequence="Sequence:",
visible="Visible:",
target="Line limit:",
freshLimit="Lock fresh limit:",
opponent="Opponent speed:",
}--Key str
customVal={
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"","[20G]"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
next=nil,
hold={"on","off"},
sequence={"bag","his4","random"},
visible={"normal","time","invisible"},
target={10,20,40,100,200,500,1000,""},
freshLimit={0,8,15,""},
opponent={"No CPU",1,2,3,4,5,6,7,8,9,10,11},
}--number-Val str
}
customRange={
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99,-1},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
wait={1,3,5,7,10,15,20,30,60},
fall={1,3,5,7,10,15,20,30,60},
wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
next={0,1,2,3,4,5,6},
hold={true,false},
sequence={1,2,3},
visible={1,2,3},
hold={true,false,true},
sequence={"bag7","his4","rnd"},
visible={"show","time","fast","none"},
target={10,20,40,100,200,500,1000,1e99},
freshLimit={0,8,15,1e99},
opponent={0,60,30,20,15,10,7,5,4,3,2,1},
}
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","swap","restart","insLeft","insRight","insDown"}
actName_show={"Move Left:","Move Right:","Rotate Right:","Rotate Left:","Rotate Flip","Hard Drop:","Soft Drop:","Hold:","Swap:","Restart:","Instant Left:","Instant Right:","Ins Down:"}
blockPos={4,4,4,4,4,5,4}
renATK={[0]=0,0,0,1,1,2,2,3,3,4,4}--3 else
renName={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",}
b2bPoint={50,90,150}
b2bATK={3,5,8}
testScore={[0]=0,[-1]=1,[-2]=0,[-3]=1,2,2,2}
spin_n={"spin_1","spin_2","spin_3"}
clear_n={"clear_1","clear_2","clear_3","clear_4"}
ren_n={"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","ren_10","ren_11"}
atkModeName={"Random","Badges","K.O.s","Attackers"}
RCPB={10,33,200,33,105,5,105,60}
snapLevelValue={1,10,20,40,60,80}
up0to4={[0]="000%UP","025%UP","050%UP","075%UP","100%UP",}
percent0to5={[0]="0%","20%","40%","60%","80%","100%",}
marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0}
death_lock={12,11,10,9,8}
death_wait={9,8,7,6,5}
death_fall={10,9,8,7,6}
pc_drop={50,45,40,35,30,26,22,18,15,12}
pc_lock={55,50,45,40,36,32,30}
pc_fall={18,16,14,12,10,9,8,7,6}
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"}
snapLevelValue={1,10,20,40,60,80}
modeID={
[0]="custom",
"sprint","marathon","master","classic","zen","infinite","solo","tsd","blind","dig","survivor","tech",
"pctrain","pcchallenge","techmino41","techmino99","drought","hotseat",
}
modeLevel={
sprint={"10L","20L","40L","100L","400L","1000L"},
marathon={"EASY","NORMAL","HARD"},
master={"LUNATIC","ULTIMATE"},
classic={"CTWC"},
zen={"NORMAL"},
infinite={"NORMAL"},
solo={"EASY","NORMAL","HARD","LUNATIC"},
tsd={"NORMAL","HARD"},
blind={"EASY","HARD","HARD+","LUNATIC","ULTIMATE","GM"},
dig={"NORMAL","LUNATIC"},
survivor={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
tech={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
pctrain={"NORMAL","EXTRA"},
pcchallenge={"NORMAL","HARD","LUNATIC"},
techmino41={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
techmino99={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
drought={"NORMAL","MESS"},
hotseat={"2P","3P","4P",},
custom={"Normal","Puzzle"},
}
local t,f=true,false
blocks={
{[0]={{0,1,1},{1,1,0}},{{1,0},{1,1},{0,1}},{{0,1,1},{1,1,0}},{{1,0},{1,1},{0,1}}},
{[0]={{1,1,0},{0,1,1}},{{0,1},{1,1},{1,0}},{{1,1,0},{0,1,1}},{{0,1},{1,1},{1,0}}},
{[0]={{1,1,1},{0,0,1}},{{1,1},{1,0},{1,0}},{{1,0,0},{1,1,1}},{{0,1},{0,1},{1,1}}},
{[0]={{1,1,1},{1,0,0}},{{1,0},{1,0},{1,1}},{{0,0,1},{1,1,1}},{{1,1},{0,1},{0,1}}},
{[0]={{1,1,1},{0,1,0}},{{1,0},{1,1},{1,0}},{{0,1,0},{1,1,1}},{{0,1},{1,1},{0,1}}},
{[0]={{1,1},{1,1}},{{1,1},{1,1}},{{1,1},{1,1}},{{1,1},{1,1}}},
{[0]={{1,1,1,1}},{{1},{1},{1},{1}},{{1,1,1,1}},{{1},{1},{1},{1}}},
{[0]={{f,t,t},{t,t,f}},{{t,f},{t,t},{f,t}}},
{[0]={{t,t,f},{f,t,t}},{{f,t},{t,t},{t,f}}},
{[0]={{t,t,t},{f,f,t}},{{t,t},{t,f},{t,f}},{{t,f,f},{t,t,t}},{{f,t},{f,t},{t,t}}},
{[0]={{t,t,t},{t,f,f}},{{t,f},{t,f},{t,t}},{{f,f,t},{t,t,t}},{{t,t},{f,t},{f,t}}},
{[0]={{t,t,t},{f,t,f}},{{t,f},{t,t},{t,f}},{{f,t,f},{t,t,t}},{{f,t},{t,t},{f,t}}},
{[0]={{t,t},{t,t}},{{t,t},{t,t}}},
{[0]={{t,t,t,t}},{{t},{t},{t},{t}}},
}
scs={
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1.5,1.5},{1.5,1.5},{1.5,1.5},{1.5,1.5},},
{[0]={0.5,2.5},{2.5,0.5},{1.5,2.5},{2.5,1.5}},
}
TRS={
[1]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,1}},
[10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}},
[12]={{0,0},{1,0},{1,-1},{-1,0},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-1,1},{1,0},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{1,-1},{0,-2},{1,-2}},
[32]={{0,0},{-1,0},{-1,-1},{-1,1},{0,2},{-1,2}},
[30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}},
[03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{0,1}},
[02]={{0,0},{1,0},{-1,0},{0,-1},{0,1}},
[20]={{0,0},{-1,0},{1,0},{0,1},{0,-1}},
[13]={{0,0},{0,-1},{0,1},{-1,0}},
[31]={{0,0},{0,1},{0,-1},{1,0}},
},--Z/J
[2]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[10]={{0,0},{1,0},{1,-1},{0,2},{1,2}},
[12]={{0,0},{1,0},{1,-1},{1,1},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-1,1},{-1,-1},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{-1,0},{0,-2},{1,-2}},
[32]={{0,0},{-1,0},{-1,-1},{1,0},{0,2},{-1,2}},
[30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1},{-1,1}},
[03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{1,-1},{0,1}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
[20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{0,0},{0,1},{0,-1},{1,0}},
[31]={{0,0},{0,-1},{0,1},{-1,0}},
},--S/L
[5]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{-1,-1},{0,1}},
[10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1},{1,1}},
[12]={{0,0},{1,0},{1,-1},{0,-1},{0,2},{1,2},{-1,-1}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{1,1}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{-1,1}},
[32]={{0,0},{-1,0},{-1,-1},{0,-1},{0,2},{-1,2},{1,-1}},
[30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}},
[03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{0,1}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
[20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{0,0},{0,-1},{0,1},{1,0},{-1,0},{0,2}},
[31]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}},
},
[7]={
[01]={{0,0},{1,0},{-2,0},{-2,-1},{1,2}},
[10]={{0,0},{2,0},{-1,0},{2,1},{-1,-2}},
[12]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}},
[21]={{0,0},{-2,0},{1,0},{1,-2},{-2,1}},
[23]={{0,0},{2,0},{-1,0},{-1,-2},{2,1}},
[32]={{0,0},{-2,0},{1,0},{-2,-1},{1,2}},
[30]={{0,0},{1,0},{-2,0},{1,-2},{-2,1}},
[03]={{0,0},{-1,0},{2,0},{2,-1},{-1,2}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
[20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{0,0},{0,-1},{-1,0},{1,0},{0,1}},
[31]={{0,0},{0,-1},{1,0},{-1,0},{0,1}},
}
}TRS[3],TRS[4]=TRS[2],TRS[1]
local l={1,2,6,7}for i=1,4 do blocks[l[i]][2],blocks[l[i]][3]=blocks[l[i]][0],blocks[l[i]][1]end
for i=1,7 do blocks[i+7]=blocks[i]end
local virtualkeySet={
{
{80,720-200,6400,80},--moveLeft
{320,720-200,6400,80},--moveRight
{1280-80,720-200,6400,80},--rotRight
{1280-200,720-80,6400,80},--rotLeft
{1280-200,720-320,6400,80},--rotFlip
{200,720-320,6400,80},--hardDrop
{200,720-80,6400,80},--softDrop
{1280-320,720-200,6400,80},--hold
{1280-80,280,6400,80},--func
{80,280,6400,80},--restart
},--Farter's set 3
{
{1280-320,720-200,6400,80},--moveLeft
{1280-80,720-200,6400,80},--moveRight
{200,720-80,6400,80},--rotRight
{80,720-200,6400,80},--rotLeft
{200,720-320,6400,80},--rotFlip
{1280-200,720-320,6400,80},--hardDrop
{1280-200,720-80,6400,80},--softDrop
{320,720-200,6400,80},--hold
{80,280,6400,80},--func
{1280-80,280,6400,80},--restart
},--Mirrored farter's set 3
{
{80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight
{1280-240,720-80,6400,80},--rotRight
{1280-400,720-80,6400,80},--rotLeft
{1280-240,720-240,6400,80},--rotFlip
{1280-80,720-80,6400,80},--hardDrop
{1280-80,720-240,6400,80},--softDrop
{1280-80,720-400,6400,80},--hold
{80,360,6400,80},--func
{80,80,6400,80},--restart
},--Author's set
{
{1280-400,720-80,6400,80},--moveLeft
{1280-80,720-80,6400,80},--moveRight
{240,720-80,6400,80},--rotRight
{80,720-80,6400,80},--rotLeft
{240,720-240,6400,80},--rotFlip
{1280-240,720-240,6400,80},--hardDrop
{1280-240,720-80,6400,80},--softDrop
{1280-80,720-240,6400,80},--hold
{80,720-240,6400,80},--func
{80,320,6400,80},--restart
},--Keyboard set
{
{1200-360,40,1600,40},--moveLeft
{1200-280,40,1600,40},--moveRight
{1200-520,40,1600,40},--rotRight
{1200-600,40,1600,40},--rotLeft
{1200-440,40,1600,40},--rotFlip
{1200-40,40,1600,40},--hardDrop
{1200-120,40,1600,40},--softDrop
{1200-200,40,1600,40},--hold
{1200-680,40,1600,40},--func
{1200-760,40,1600,40},--restart
},--PC key feedback
}
Buttons={
load={},
intro={},
main={
{x=250,y=300,w=330,h=60,rgb=color.red,t="Play",code=function()gotoScene("mode")end,down=2},
{x=250,y=380,w=330,h=60,rgb=color.blue,t="Settings",code=function()gotoScene("setting")end,up=1,down=3},
{x=165,y=460,w=160,h=60,rgb=color.yellow,t="Help",code=function()gotoScene("help")end,up=2,down=5,right=4},
{x=335,y=460,w=160,h=60,rgb=color.cyan,t="Statistics",code=function()gotoScene("stat")end,up=2,down=5,left=3},
{x=250,y=540,w=330,h=60,rgb=color.grey,t="Quit",code=back,up=3},
play= {x=380,y=300,w=240,h=240,rgb=color.red,f=70,code=function()gotoScene("mode")end,down="stat",right="setting"},
setting={x=640,y=300,w=240,h=240,rgb=color.lightBlue,f=55,code=function()gotoScene("setting")end,down="stat",left="play",right="help"},
stat= {x=640,y=560,w=240,h=240,rgb=color.cyan,f=55,code=function()gotoScene("stat")end,up="setting",left="play",right="help"},
help= {x=900,y=560,w=240,h=240,rgb=color.yellow,f=55,code=function()gotoScene("help")end,up="setting",left="stat",right="quit"},
quit= {x=1180,y=620,w=120,h=120,rgb=color.lightGrey,f=50,code=function()gotoScene("quit")end,up="setting",left="help"},
},
mode={
{x=1000,y=210,w=200,h=140,rgb=color.white,t="Λ",f=64,code=function()if modeSel>1 then modeSel=modeSel-1 end end},
{x=1000,y=430,w=200,h=140,rgb=color.white,t="v",f=80,code=function()if modeSel<#modeID then modeSel=modeSel+1 end end},
{x=1000,y=600,w=180,h=80,rgb=color.green,t="Start",code=function()startGame(modeID[modeSel])end},
{x=400,y=150,w=180,h=80,rgb=color.yellow,t="Custom(c)",code=function()gotoScene("custom")end},
{x=640,y=630,w=180,h=60,rgb=color.white,t="Back",code=back},
up= {x=1000,y=210,w=200,h=140, rgb=color.white, f=64, code=function()keyDown.mode("up")end, hide=function()return modeSel==1 end,},
down= {x=1000,y=430,w=200,h=140, rgb=color.white, f=80, code=function()keyDown.mode("down")end, hide=function()return modeSel==#modeID end,},
left= {x=190, y=160,w=100,h=80, rgb=color.white, code=function()keyDown.mode("left")end, hide=function()return levelSel==1 end,},
right= {x=350, y=160,w=100,h=80, rgb=color.white, code=function()keyDown.mode("right")end,hide=function()return levelSel==#modeLevel[modeID[modeSel]]end,},
start={ x=1000, y=600,w=250,h=100, rgb=color.green, f=50, code=function()
loadGame(modeSel,levelSel)end},
custom= {x=275, y=420,w=200,h=90, rgb=color.yellow, code=function()gotoScene("custom")end},
back= {x=640, y=630,w=230,h=90, rgb=color.white, f=45, code=back},
},
custom={
{x=1000,y=200,w=100,h=100,rgb=color.white,t="Λ",f=40,code=function()optSel=(optSel-2)%#customID+1 end},
{x=1000,y=440,w=100,h=100,rgb=color.white,t="v",f=50,code=function()optSel=optSel%#customID+1 end},
{x=880,y=320,w=100,h=100,rgb=color.white,t="<",f=50,code=function()local k=customID[optSel]customSel[k]=(customSel[k]-2)%#customRange[k]+1 end},
{x=1120,y=320,w=100,h=100,rgb=color.white,t=">",f=50,code=function()local k=customID[optSel]customSel[k]=customSel[k]%#customRange[k]+1 end},
{x=1000,y=580,w=180,h=80,rgb=color.green,t="Start",code=function()startGame("custom")end},
{x=640,y=630,w=180,h=60,rgb=color.white,t="Back",code=back},
up= {x=1000,y=220, w=100, h=100, rgb=color.white, code=function()optSel=(optSel-2)%#customID+1 end},
down= {x=1000,y=460, w=100, h=100, rgb=color.white,f=50, code=function()optSel=optSel%#customID+1 end},
left= {x=880, y=340, w=100, h=100, rgb=color.white,f=50, code=function()local k=customID[optSel]customSel[k]=(customSel[k]-2)%#customRange[k]+1 end},
right= {x=1120,y=340, w=100, h=100, rgb=color.white,f=50, code=function()local k=customID[optSel]customSel[k]=customSel[k]%#customRange[k]+1 end},
start1= {x=880, y=580, w=220, h=70, rgb=color.green, code=function()loadGame(0,1)end},
start2= {x=1120,y=580, w=220, h=70, rgb=color.lightPurple, code=function()loadGame(0,2)end},
draw= {x=1000,y=90, w=190, h=85, rgb=color.cyan, code=function()gotoScene("draw")end},
back= {x=640, y=630 ,w=180, h=60, rgb=color.white, code=back},
},
draw={
block1= {x=840, y=80,w=120,h=120, f=65, rgb=color.red, code=function()pen=1 end},
block2= {x=980, y=80,w=120,h=120, f=65, rgb=color.green, code=function()pen=2 end},
block3= {x=1120,y=80,w=120,h=120, f=65, rgb=color.orange, code=function()pen=3 end},
block4= {x=840, y=220,w=120,h=120, f=65, rgb=color.blue, code=function()pen=4 end},
block5= {x=980, y=220,w=120,h=120, f=65, rgb=color.magenta, code=function()pen=5 end},
block6= {x=1120,y=220,w=120,h=120, f=65, rgb=color.yellow, code=function()pen=6 end},
block7= {x=840, y=360,w=120,h=120, f=65, rgb=color.cyan, code=function()pen=7 end},
gb1= {x=980, y=360,w=120,h=120, f=65, rgb=color.darkGrey, code=function()pen=9 end},
gb2= {x=1120,y=360,w=120,h=120, f=65, rgb=color.grey, code=function()pen=10 end},
gb3= {x=840, y=500,w=120,h=120, f=65, rgb=color.darkPurple,code=function()pen=11 end},
gb4= {x=980, y=500,w=120,h=120, f=65, rgb=color.darkRed, code=function()pen=12 end},
gb5= {x=1120,y=500,w=120,h=120, f=65, rgb=color.darkGreen,code=function()pen=13 end},
erase= {x=840, y=640,w=120,h=120, f=70, rgb=color.grey, code=function()pen=0 end},
clear= {x=1120,y=640,w=120,h=120, rgb=color.white, code=function()
if clearSureTime>0 then
for y=1,20 do for x=1,10 do preField[y][x]=0 end end
clearSureTime=0
else
clearSureTime=50
end
end},
back= {x=1235,y=45,w=80,h=80, f=35, rgb=color.white, code=back},
},
play={
pause={x=1235,y=45,w=80,h=80,rgb=color.white,f=30,code=pauseGame},
},
pause={
resume= {x=640,y=400,w=240,h=100, rgb=color.white,f=50,code=resumeGame},
quit= {x=640,y=550,w=240,h=100, rgb=color.white,f=50,code=back},
},
setting={--Normal setting
{x=330,y=100,w=200,h=60,rgb=color.white,t=function()return setting.ghost and"Ghost ON"or"Ghost OFF"end,code=function()setting.ghost=not setting.ghost end,down=3,right=2},
{x=540,y=100,w=200,h=60,rgb=color.white,t=function()return setting.center and"Center ON"or"Center OFF"end,code=function()setting.center=not setting.center end,down=5,left=1,right=11},
--1,2
{x=245,y=180,w=40,h=40,rgb=color.white,t="-",code=function()setting.das=(setting.das-1)%31 end,up=1,down=7,right=4},
{x=410,y=180,w=40,h=40,rgb=color.white,t="+",code=function()setting.das=(setting.das+1)%31 end,up=1,down=8,left=3,right=5},
{x=460,y=180,w=40,h=40,rgb=color.white,t="-",code=function()setting.arr=(setting.arr-1)%16 end,up=2,down=9,left=4,right=6},
{x=625,y=180,w=40,h=40,rgb=color.white,t="+",code=function()setting.arr=(setting.arr+1)%16 end,up=2,down=10,left=5,right=13},
--3~6
{x=245,y=260,w=40,h=40,rgb=color.white,t="-",code=function()setting.sddas=(setting.sddas-1)%11 end,up=3,down=17,right=8},
{x=410,y=260,w=40,h=40,rgb=color.white,t="+",code=function()setting.sddas=(setting.sddas+1)%11 end,up=4,down=17,left=7,right=9},
{x=460,y=260,w=40,h=40,rgb=color.white,t="-",code=function()setting.sdarr=(setting.sdarr-1)%6 end,up=5,down=17,left=8,right=10},
{x=625,y=260,w=40,h=40,rgb=color.white,t="+",code=function()setting.sdarr=(setting.sdarr+1)%4 end,up=6,down=17,left=9,right=14},
--7~10
{x=870-90,y=100,w=160,h=60,rgb=color.white,t=function()return setting.sfx and"SFX:on"or"SFX:off"end,code=function()setting.sfx=not setting.sfx end,down=13,left=2,right=12},
{x=870+90,y=100,w=160,h=60,rgb=color.white,t=function()return setting.bgm and"BGM:on"or"BGM:off"end,code=function()BGM()setting.bgm=not setting.bgm;BGM("blank")end,down=13,left=11},
{x=870,y=180,w=340,h=60,rgb=color.white,t=function()return setting.fullscreen and"Fullscreen:on"or"Fullscreen:off"end,
code=function()
setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen)
if not setting.fullscreen then
love.resize(gc.getWidth(),gc.getHeight())
end
end,
up=11,down=14,left=6
},
{x=870,y=260,w=340,h=60,rgb=color.white,t=function()return setting.bgblock and"BG animation:on"or"BG animation:off"end,
code=function()
setting.bgblock=not setting.bgblock
if not setting.bgblock then
for i=1,16 do
BGblockList[i].v=3*BGblockList[i].v
end
end
end,
up=12,down=15,left=10
},
ghost= {x=290, y=90, w=210, h=60, rgb=color.white,code=function()setting.ghost=not setting.ghost end,down="grid",right="center"},
center= {x=505, y=90, w=210, h=60, rgb=color.white,code=function()setting.center=not setting.center end,down="swap",left="ghost",right="sfx"},
grid= {x=290, y=160, w=210, h=60, rgb=color.white,code=function()setting.grid=not setting.grid end,up="ghost",down="fxs",right="swap"},
swap= {x=505, y=160, w=210, h=60,f=28, rgb=color.white,code=function()setting.swap=not setting.swap end,up="center",down="bg",left="grid",right="vib"},
fxs= {x=290, y=230, w=210, h=60, rgb=color.white,code=function()setting.fxs=not setting.fxs end,up="grid",down="dasU",right="bg"},
bg= {x=505, y=230, w=210, h=60, rgb=color.white,code=function()setting.bg=not setting.bg end,up="swap",down="arrD",right="fullscreen"},
--11~14
{x=870,y=340,w=340,h=60,rgb=color.white,t=function()return"frameDraw:"..setting.frameMul.."%"end,code=function()
dasD= {x=210, y=300, w=50, h=50, rgb=color.white,code=function()setting.das=(setting.das-1)%31 end,up="fxs",down="sddasD",right="dasU"},
dasU= {x=370, y=300, w=50, h=50, rgb=color.white,code=function()setting.das=(setting.das+1)%31 end,up="fxs",down="sddasU",left="dasD",right="arrD"},
arrD= {x=425, y=300, w=50, h=50, rgb=color.white,code=function()setting.arr=(setting.arr-1)%16 end,up="bg",down="sdarrD",left="dasU",right="arrU"},
arrU= {x=585, y=300, w=50, h=50, rgb=color.white,code=function()setting.arr=(setting.arr+1)%16 end,up="bg",down="sdarrU",left="arrD",right="bgblock"},--3~6
sddasD= {x=210, y=370, w=50, h=50, rgb=color.white,code=function()setting.sddas=(setting.sddas-1)%11 end,up="dasD",down="lang",right="sddasU"},
sddasU= {x=370, y=370, w=50, h=50, rgb=color.white,code=function()setting.sddas=(setting.sddas+1)%11 end,up="dasU",down="lang",left="sddasD",right="sdarrD"},
sdarrD= {x=425, y=370, w=50, h=50, rgb=color.white,code=function()setting.sdarr=(setting.sdarr-1)%4 end,up="arrD",down="lang",left="sddasU",right="sdarrU"},
sdarrU= {x=585, y=370, w=50, h=50, rgb=color.white,code=function()setting.sdarr=(setting.sdarr+1)%4 end,up="arrU",down="lang",left="sdarrD",right="frame"},
sfx= {x=760,y=90, w=160, h=60, rgb=color.white,code=function()setting.sfx=not setting.sfx end,down="vib",left="center",right="bgm"},
bgm= {x=940,y=90, w=160, h=60, rgb=color.white,code=function()
BGM()
setting.bgm=not setting.bgm
BGM("blank")
end,down="vib",left="sfx"},
vib= {x=850,y=160, w=340,h=60,rgb=color.white, code=function()
setting.vib=(setting.vib+1)%5
VIB(2)
end,up="sfx",down="fullscreen",left="swap"},
fullscreen= {x=850,y=230, w=340,h=60,rgb=color.white, code=function()
setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen)
if not setting.fullscreen then
love.resize(gc.getWidth(),gc.getHeight())
end
end,up="vib",down="bgblock",left="bg"},
bgblock={x=850,y=300, w=340,h=60,rgb=color.white, code=function()
setting.bgblock=not setting.bgblock
if not setting.bgblock then
for i=1,16 do
BGblockList[i].v=3*BGblockList[i].v
end
end
end,up="fullscreen",down="frame",left="arrU"},
frame= {x=850,y=370, w=340,h=60,rgb=color.white, code=function()
setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10)
if setting.frameMul>100 then setting.frameMul=25 end
end,up=14,down=16},
{x=870,y=420,w=340,h=60,rgb=color.green,t="Control settings",code=function()gotoScene("setting2")end,up=15,down=17},
{x=870,y=500,w=340,h=60,rgb=color.yellow,t="Touch settings",code=function()gotoScene("setting3")end,up=16,down=18},
{x=640,y=640,w=210,h=60,rgb=color.white,t="Save&Back",code=back,up=17},
--15~18
end,up="bgblock",down="control",left="sdarrU"},
control={x=850,y=440, w=340,h=60,rgb=color.green, code=function()gotoScene("setting2")end,up="frame",down="touch",left="lang"},
touch= {x=850,y=510, w=340,h=60,rgb=color.yellow,code=function()gotoScene("setting3")end,up="control",down="back",left="lang"},
lang= {x=280,y=510, w=200,h=60,rgb=color.red, code=function()
setting.lang=setting.lang%#langName+1
swapLanguage(setting.lang)
end,up="sddasD",down="back",right="touch"},
back= {x=640,y=620, w=300,h=70,rgb=color.white, code=back,up="touch"},
},
setting2={--Control setting
{x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=back},
back={x=840,y=630,w=180,h=60,rgb=color.white,code=back},
},
setting3={--Touch setting
{x=640,y=410,w=170,h=80,t="Back",code=back},
{x=640,y=210,w=500,h=80,t=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,code=function()
back={x=640,y=410,w=170,h=80,f=45,code=back},
hide={x=640,y=210,w=500,h=80,f=45,code=function()
setting.virtualkeySwitch=not setting.virtualkeySwitch
end},
{x=450,y=310,w=170,h=80,t="Reset",code=function()
end},
default={x=450,y=310,w=170,h=80,code=function()
for K=1,#virtualkey do
local b,b0=virtualkey[K],gameEnv0.virtualkey[K]
local b,b0=virtualkey[K],virtualkeySet[defaultSel][K]
b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4]
end--Reset virtualkey
end},
{x=640,y=310,w=170,h=80,t=function()return snapLevelName[snapLevel]end,code=function()
end--Default virtualkey
defaultSel=defaultSel%5+1
end},
snap={x=640,y=310,w=170,h=80,code=function()
snapLevel=snapLevel%6+1
end},
{x=830,y=310,w=170,h=80,t=function()return percent0to5[setting.virtualkeyAlpha]end,code=function()
end},
alpha={x=830,y=310,w=170,h=80,f=45,code=function()
setting.virtualkeyAlpha=(setting.virtualkeyAlpha+1)%6
--Adjust virtualkey alpha
end},
{x=450,y=410,w=170,h=80,t="Icon",code=function()
end},
icon={x=450,y=410,w=170,h=80,f=45,code=function()
setting.virtualkeyIcon=not setting.virtualkeyIcon
--Switch virtualkey icon
end},
{x=830,y=410,w=170,h=80,t="Size",code=function()
end},
size={x=830,y=410,w=170,h=80,f=45,code=function()
if sel then
local b=virtualkey[sel]
b[4]=b[4]+10
if b[4]==150 then b[4]=40 end
b[3]=b[4]^2
end
end},
end},
},
help={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=back,right=2},
{x=980,y=590,w=230,h=60,rgb=color.white,t="Author's qq",code=function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,left=1},
back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="qq"},
qq={x=980,y=590,w=230,h=60,hide=function()return system=="Android"end,rgb=color.white,code=function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,left="back"},
},
stat={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=back},
back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="path"},
path={x=980,y=590,w=250,h=60,f=30,hide=function()return system=="Android"end,rgb=color.white,code=function()sys.openURL(fs.getSaveDirectory())end,left="back"},
},
sel=nil,--selected button id(integer)
}
for k,v in pairs(Buttons)do
for i=1,#v do
v[i].alpha=0
end
end
virtualkey={
{80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight
{1280-240,720-80,6400,80},--rotRight
{1280-400,720-80,6400,80},--rotLeft
{1280-240,720-240,6400,80},--rotFlip
{1280-80,720-80,6400,80},--hardDrop
{1280-80,720-240,6400,80},--softDrop
{1280-80,720-400,6400,80},--hold
{80,360,6400,80},--swap
{80,80,6400,80},--restart
--[[
{x=0,y=0,r=0},--toLeft
{x=0,y=0,r=0},--toRight
{x=0,y=0,r=0},--toDown
]]
}
Text={
load={"Loading textures","Loading BGM","Loading SFX","Finished",},
stat={
"Games run:",
"Games played:",
"Game time:",
"Total block used:",
"Total rows cleared:",
"Total lines sent:",
"Total key pressed:",
"Total rotate:",
"Total hold:",
"Total spin:",
},
help={
"I think you don't need \"help\".",
"THIS IS ONLY A SMALL BLOCK GAME",
"But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,so DO NOT DISTIRBUTE",
"",
"Powered by LOVE2D",
"Author:MrZ E-mail:1046101471@qq.com",
"Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ",
"Tool used:VScode,GFIE,Beepbox,Goldwave",
"Special thanks:farter,teatube,flyz,t830,[all test staff] and YOU!!",
"Any bugs/suggestions to my E-mail.",
},
}

723
main.lua
View File

@@ -1,77 +1,53 @@
lib={
gc=love.graphics,
kb=love.keyboard,
ms=love.mouse,
tc=love.touch,
tm=love.timer,
fs=love.filesystem,
wd=love.window,
mt=love.math,
sys=love.system,
}for k,v in pairs(lib)do _G[k]=v end lib=nil
toN,toS=tonumber,tostring
local gc,tm=love.graphics,love.timer
local ms,kb=love.mouse,love.keyboard
local fs,sys=love.filesystem,love.system
int,ceil,abs,rnd,max,min,sin,cos,atan,pi=math.floor,math.ceil,math.abs,math.random,math.max,math.min,math.sin,math.cos,math.atan,math.pi
sub,gsub,find,format,byte,char=string.sub,string.gsub,string.find,string.format,string.byte,string.char
ins,rem,sort=table.insert,table.remove,table.sort
math.randomseed(os.time()*626)
null=function()end
ww,wh=gc.getWidth(),gc.getHeight()
Timer=tm.getTime--Easy&Quick to get time!
mx,my,mouseShow=-20,-20,false
xOy=love.math.newTransform()
focus=true
system=sys.getOS()
touching=nil--1st touching ID
scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1}
scene=""
gamemode=""
bgmPlaying=nil
curBG="none"
BGblock={ct=150,next=7}
kb.setKeyRepeat(false)
kb.setTextInput(false)
ms.setVisible(false)
Fonts={}
local Fonts={}
function setFont(s)
if s~=currentFont then
if Fonts[s]then
gc.setFont(Fonts[s])
else
local t=gc.setNewFont("siyuanhei.otf",s-5)
local t=gc.setNewFont("font.ttf",s-5)
Fonts[s]=t
gc.setFont(t)
end
currentFont=s
end
return Fonts[s]
end
gameEnv0={
das=10,arr=2,
sddas=0,sdarr=2,
ghost=true,center=true,
grid=false,swap=true,
_20G=false,bone=false,
drop=30,lock=45,
wait=1,fall=1,
wait=0,fall=0,
next=6,hold=true,oncehold=true,
sequence=1,visible=1,
_20G=false,target=1e99,
freshLimit=1e99,
virtualkey={
{80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight
{1280-240,720-80,6400,80},--rotRight
{1280-400,720-80,6400,80},--rotLeft
{1280-240,720-240,6400,80},--rotFlip
{1280-80,720-80,6400,80},--hardDrop
{1280-80,720-240,6400,80},--softDrop
{1280-80,720-400,6400,80},--hold
{80,360,6400,80},--swap
{80,80,6400,80},--restart
},
reach=null,
--not all is actually used,some only provide a key
sequence="bag7",
block=true,
keepVisible=true,visible="show",
Fkey=false,puzzle=false,ospin=true,
freshLimit=1e99,target=1e99,reach=null,
bg="none",bgm="race"
}
customSel={
drop=20,
@@ -86,610 +62,24 @@ customSel={
freshLimit=3,
opponent=1,
}
freshMethod={
function()
P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
if #P.nxt<6 then
local bag={1,2,3,4,5,6,7}
for i=1,7 do
ins(P.nxt,rem(bag,rnd(8-i)))
ins(P.nb,blocks[P.nxt[#P.nxt]][0])
end
end
end,
function()
P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
local i,j=nil,0
repeat
i,j=rnd(7),j+1
until not(i==P.his[1]or i==P.his[2]or i==P.his[3]or i==P.his[4])
P.nxt[6],P.nb[6]=i,blocks[i][0]
rem(P.his,1)ins(P.his,i)
end,
function()
P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
repeat i=rnd(7)until i~=P.nxt[5]
P.nxt[6],P.nb[6]=i,blocks[i][0]
end,
function()
P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
if #P.nxt<6 then
local bag={1,1,2,2,3,3,4,4,5,5,5,6,6,7,7}
repeat
local i=rem(bag,rnd(#bag))
ins(P.nxt,i)
ins(P.nb,blocks[i][0])
until #bag==0
end
end,
function()
P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
if P.cstat.piece%4==0 then
local r=rnd(#PClist)
local P=players[1]
local f=P.cstat.pc%2==0
for i=1,4 do
local b=PClist[r][i]
if f then
if b<3 then b=3-b
elseif b<5 then b=7-b
end
end
ins(P.nxt,b)
ins(P.nb,blocks[b][0])
end
end
end,
}
loadmode={
sprint=function()
modeEnv={
drop=60,
target=40,
reach=Event.gameover.win,
}
createPlayer(1,340,15)
curBG="game1"
BGM("race")
end,
zen=function()
modeEnv={
drop=1e99,
lock=1e99,
target=200,
reach=Event.gameover.win,
}
createPlayer(1,340,15)
curBG="strap"
BGM("infinite")
end,
infinite=function()
modeEnv={
drop=1e99,
lock=1e99,
}
createPlayer(1,340,15)
curBG="glow"
BGM("infinite")
end,
gmroll=function()
modeEnv={
drop=0,
lock=15,
wait=10,
fall=15,
_20G=true,
visible=0,
freshLimit=15,
arr=1,
}
createPlayer(1,340,15)
curBG="glow"
BGM("push")
end,
marathon=function()
modeEnv={
drop=60,
fall=20,
target=10,
reach=Event.marathon_reach,
freshLimit=15,
}
createPlayer(1,340,15)
curBG="strap"
BGM("way")
end,
death=function()
modeEnv={
_20G=true,
drop=0,
lock=death_lock[1],
wait=death_wait[1],
fall=death_fall[1],
target=50,
reach=Event.death_reach,
freshLimit=15,
arr=1,
}
createPlayer(1,340,15)
curBG="game2"
BGM("push")
end,
tsd=function()
modeEnv={
drop=60,
lock=60,
sequence=4,
target=1,
reach=Event.tsd_reach,
freshLimit=15,
}
createPlayer(1,340,15)
curBG="matrix"
BGM("infinite")
end,
pctrain=function()
modeEnv={
next=4,
hold=false,
drop=60,
lock=60,
fall=20,
sequence=5,
target=0,
reach=Event.newPC,
freshLimit=15,
}
createPlayer(1,340,15)
local r=rnd(#PClist)
local P=players[1]
for i=1,4 do
local b=PClist[r][i]
ins(P.nxt,b)
ins(P.nb,blocks[b][0])
end
Event.newPC()
curBG="matrix"
BGM("infinite")
end,
pcchallenge=function()
modeEnv={
oncehold=false,
drop=300,
lock=1e99,
fall=20,
sequence=1,
target=100,
reach=Event.gameover.win,
freshLimit=1e99,
}
createPlayer(1,340,15)
curBG="matrix"
BGM("infinite")
end,
techmino41=function()
modeEnv={
freshLimit=15,
royaleMode=true,
royale={2,5,10,20},
}
createPlayer(1,340,15)--Player
local n=2
for i=1,4 do
for j=1,5 do
createPlayer(n,75*i-48,142*j-130,.19,rnd(15))
n=n+1
end
end
for i=9,12 do
for j=1,5 do
createPlayer(n,75*i+292,142*j-130,.19,rnd(15))
n=n+1
end
end--AIs
curBG="game3"
BGM("race")
end,
techmino99=function()
modeEnv={
freshLimit=15,
royaleMode=true,
royale={2,6,14,30},
}
createPlayer(1,340,15)--Player
local n=2
for i=1,7 do
for j=1,7 do
createPlayer(n,46*i-36,97*j-72,.135,rnd()<.1 and rnd(6)or rnd(10,30))
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()<.1 and rnd(6)or rnd(10,30))
n=n+1
end
end--AIs
curBG="game3"
BGM("race")
end,
solo=function()
modeEnv={
freshLimit=15,
}
createPlayer(1,20,15)--Player
createPlayer(2,660,85,.9,1)--AI
curBG="game2"
BGM("race")
end,
blind=function()
modeEnv={
drop=15,
lock=30,
visible=0,
freshLimit=10,
}
createPlayer(1,340,15)
curBG="glow"
BGM("push")
end,
p2=function()
modeEnv={
freshLimit=15,
}
createPlayer(1,20,15)
createPlayer(2,650,15)
curBG="game2"
BGM("way")
end,
p3=function()
modeEnv={
freshLimit=15,
}
createPlayer(1,20,100,.65)
createPlayer(2,435,100,.65)
createPlayer(3,850,100,.65)
curBG="game2"
BGM("way")
end,
p4=function()
modeEnv={
freshLimit=15,
}
createPlayer(1,25,150,.5)
createPlayer(2,335,150,.5)
createPlayer(3,645,150,.5)
createPlayer(4,955,150,.5)
curBG="game2"
BGM("way")
end,
custom=function()
modeEnv={reach=Event.gameover.win}
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
curBG="matrix"
BGM("reason")
end,
}
mesDisp={
--Default:font=40,white
sprint=function()
setFont(75)
mStr(max(40-P.cstat.row,0),-75,280)
end,
zen=function()
setFont(75)
mStr(max(200-P.cstat.row,0),-75,280)
end,
infinite=function()
setFont(50)
mStr(P.cstat.atk,-75,320)
mStr(format("%.2f",2.5*P.cstat.atk/P.cstat.piece),-75,430)
setFont(20)
gc.print("Attack",-100,360)
gc.print("Efficiency",-108,472)
end,
solo=function()
setFont(50)
mStr(P.cstat.atk,-75,320)
setFont(20)
gc.print("Attack",-100,360)
end,
gmroll=function()
setFont(25)
gc.print("Techrash",-120,420)
setFont(80)
mStr(P.cstat.techrash,-75,350)
end,
marathon=function()
setFont(50)
mStr(P.cstat.row,-75,330)
mStr(P.gameEnv.target,-75,380)
gc.rectangle("fill",-120,376,90,4)
end,
death=function()
setFont(50)
mStr(P.cstat.row,-75,330)
mStr(P.gameEnv.target,-75,380)
gc.rectangle("fill",-120,376,90,4)
end,
tsd=function()
setFont(35)
gc.print("TSD",-105,405)
setFont(80)
mStr((P.gameEnv.target-1)*.5,-75,330)
end,
pctrain=function()
setFont(25)
gc.print("Perfect Clear",-138,400)
setFont(80)
mStr(P.cstat.pc,-75,330)
end,
pcchallenge=function()
setFont(25)
gc.print("Perfect Clear",-138,420)
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",-80,180)
mStr(P.ko,-55,220)
setFont(25)
gc.print("KO",-105,229)
for i=1,P.strength do
gc.draw(badgeIcon,16*i-130,260)
end
setFont(30)
gc.print(up0to4[P.strength],-125,295)
end,
techmino99=function()
setFont(40)
mStr(#players.alive.."/99",-80,180)
mStr(P.ko,-55,220)
setFont(25)
gc.print("KO",-105,229)
for i=1,P.strength do
gc.draw(badgeIcon,16*i-130,260)
end
setFont(30)
gc.print(up0to4[P.strength],-125,295)
end,
blind=function()
setFont(25)
gc.print("Rows",-100,300)
gc.print("Techrash",-120,420)
setFont(80)
mStr(P.cstat.row,-75,230)
mStr(P.cstat.techrash,-75,350)
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()
P.alive=false
P.control=false
P.timing=false
P.waiting=1e99
P.result="WIN"
P.b2b=0
for i=1,#P.field do
for j=1,10 do
P.visTime[i][j]=min(P.visTime[i][j],20)
end
end
showText("WIN","appear",100,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.result=" K.O."
P.waiting=1e99
P.atking=nil
P.b2b=0
showText("LOSE","appear",100,nil,true)
for i=1,#players.alive do
if players.alive[i]==P then
rem(players.alive,i)
if #players.alive==1 then
ins(players.alive[1].task,Event.task.winTrigger)
end
break
end
end
if modeEnv.royaleMode then
if P.lastRecv and P.lastRecv.alive then
if P.lastRecv.id==1 then
throwBadge(P,P.lastRecv,P.badge)
end
local A=P.lastRecv
A.ko,A.badge=A.ko+1,A.badge+P.badge+1
for i=A.strength+1,4 do
if A.badge>=modeEnv.royale[i]then
A.strength=i
end
end
end
for i=1,#players.alive do
if players.alive[i].atking==P then
players.alive[i].atking=nil
end
end
freshRoyaleTarget()
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
if P.id==1 and players[2]and players[2].ai then SFX("fail")end
ins(P.task,Event.task.lose)
end,
},
marathon_reach=function()
local s=int(P.cstat.row*.1)
if s>=20 then
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,
death_reach=function()
if P.gameEnv.target==250 then
Event.gameover.win()
else
P.gameEnv.target=P.gameEnv.target+50
local t=P.gameEnv.target/50
P.gameEnv.lock=death_lock[t]
P.gameEnv.wait=death_wait[t]
P.gameEnv.fall=death_fall[t]
showText("STAGE "..t,"fly",80,-120)
SFX("reach")
end
end,
tsd_reach=function()
if not(#P.clearing==2 and P.bn==5 and P.spinLast)then
Event.gameover.lose()
else
P.gameEnv.target=P.gameEnv.target+2
end
end,
newPC=function()
local P=players[1]
if #P.field==#P.clearing then
P.counter=P.cstat.piece==0 and 19 or 0
ins(P.task,Event.task.PC)
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("Max speed","appear",80,-120)
else
showText("Speed up","appear",30,-130)
end
end
else
Event.gameover.lose()
end
end,
task={
winTrigger=function()
Event.gameover.win()
return true
end,
win=function()
P.counter=P.counter+1
if P.counter>60 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.counter==100 then
for i=1,#P.field do
removeRow(P.field)
removeRow(P.visTime)
end
return true
end
end
end,
lose=function()
P.counter=P.counter+1
if P.counter>60 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.counter==100 then
for i=1,#P.field do
removeRow(P.field)
removeRow(P.visTime)
end
return true
end
end
end,
garbagepush=function()
end,
PC=function()
local P=players[1]
P.counter=P.counter+1
if P.counter==21 then
P.gameEnv.target=P.gameEnv.target+4
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,
},
}
preField={}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
freeRow={}
for i=1,40 do
freeRow[i]={0,0,0,0,0,0,0,0,0,0}
end
--Game system Data
setting={
sfx=true,bgm=true,
fullscreen=false,
bgblock=true,
lang="eng",
ghost=true,center=true,
grid=false,swap=true,
fxs=true,bg=true,
das=10,arr=2,
sddas=0,sdarr=2,
ghost=true,center=true,
sfx=true,bgm=true,vib=3,
fullscreen=false,
bgblock=true,
lang=1,
keyMap={
{"left","right","x","z","c","up","down","space","tab","r","","",""},
{"","","","","","","","","","","","",""},
@@ -742,20 +132,39 @@ stat={
rotate=0,
spin=0,
}
--User Data&User Setting
--------------------------------Wrning!_G __index Plyr[n] when chng any playr's val!
require("toolfunc")
require("gamefunc")
require("list")
require("texture")
require("ai")
require("timer")
require("paint")
require("scene")
require("call&sys")
virtualkey={
{80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight
{1280-240,720-80,6400,80},--rotRight
{1280-400,720-80,6400,80},--rotLeft
{1280-240,720-240,6400,80},--rotFlip
{1280-80,720-80,6400,80},--hardDrop
{1280-80,720-240,6400,80},--softDrop
{1280-80,720-400,6400,80},--hold
{80,360,6400,80},--func
{80,80,6400,80},--restart
--[[
{x=0,y=0,r=0},--toLeft
{x=0,y=0,r=0},--toRight
{x=0,y=0,r=0},--toDown
]]
userData=fs.newFile("userdata")
userSetting=fs.newFile("usersetting")
}
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}
--User Data&User Setting
require"toolfunc"
require"list"
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
loadData()
end
@@ -763,4 +172,6 @@ if fs.getInfo("usersetting")then
loadSetting()
elseif system=="Android" or system=="iOS"then
setting.virtualkeySwitch=true
end
setting.swap=false
end
swapLanguage(setting.lang)

766
paint.lua

File diff suppressed because it is too large Load Diff

View File

@@ -1,86 +0,0 @@
game={}
function game.load()
scene="load"
curBG="none"
keeprun=true
loading=1--Loading mode
loadnum=1--Loading counter
loadprogress=0--Loading bar
end
function game.intro()
scene="intro"
curBG="none"
count=0
keeprun=true
end
function game.main()
scene="main"
curBG="none"
keeprun=true
BGM("blank")
collectgarbage()
end
function game.mode()
saveData()
modeSel=modeSel or 1
scene="mode"
curBG="none"
keeprun=true
BGM("blank")
end
function game.custom()
optSel=optSel or 1
scene="custom"
curBG="matrix"
keeprun=true
BGM("blank")
end
function game.play()
scene="play"
--curBG="game1"
keeprun=false
resetGameData()
sysSFX("ready")
mouseShow=false
end
function game.setting()
scene="setting"
curBG="none"
keeprun=true
BGM("blank")
end
function game.setting2()
scene="setting2"
curBG="none"
keeprun=true
curBoard=1
keyboardSet=1
joystickSet=1
keyboardSetting=false
joystickSetting=false
BGM("blank")
end--Control settings
function game.setting3()
scene="setting3"
curBG="game1"
keeprun=true
sel=nil
keyssetting=nil
snapLevel=1
BGM("blank")
end--Touch setting
function game.help()
scene="help"
curBG="none"
keeprun=true
BGM("blank")
end
function game.stat()
scene="stat"
curBG="none"
keeprun=true
BGM("blank")
end
function game.quit()
love.event.quit()
end

Binary file not shown.

View File

@@ -1,53 +1,24 @@
local N=gc.newImage
function C(x,y)
local gc=love.graphics
local N,c=gc.newImage
local function T(s,t)return gc.newText(setFont(s),t)end
local function C(x,y)
c=gc.newCanvas(x,y)
gc.setCanvas(c)
return c
end
gc.setDefaultFilter("nearest","nearest")
miniTitle=C(26,14)
gc.setColor(1,1,1)
for i=1,#miniTitle_pixel do
gc.rectangle("fill",unpack(miniTitle_pixel[i]))
end
gc.setDefaultFilter("linear","linear")
titleImage=N("/image/mess/title.png")
spinCenter=N("/image/mess/spinCenter.png")
dialCircle=N("/image/mess/dialCircle.png")
dialNeedle=N("/image/mess/dialNeedle.png")
badgeIcon=N("/image/mess/badge.png")
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]+6)
end
local blockImg=N("/image/block/1.png")
blockSkin,blockSkinmini={},{}
for i=1,13 do
C(30,30)
gc.draw(blockImg,30-30*i,0)
blockSkin[i]=c
C(6,6)
gc.draw(blockImg,6-6*i,0,nil,.2)
blockSkinmini[i]=c
end
do local img=N("/image/block/1.png")
blockSkin,blockSkinmini={},{}
for i=1,13 do
C(30,30)
gc.draw(img,30-30*i,0)
blockSkin[i]=c
C(12,12)
gc.draw(img,12-12*i,0,nil,.4)
blockSkinmini[i]=c
end
img:release()
end
background={
N("/image/BG/bg1.jpg"),
N("/image/BG/bg2.png"),
}
gc.setDefaultFilter("nearest","nearest")
blockImg:release()
virtualkeyIcon={}
for i=1,10 do
@@ -60,8 +31,8 @@ for i=1,7 do
local b=blocks[i][0]
mouseBlock[i]=C(#b[1],#b)
gc.setColor(blockColor[i])
for x=1,#b[1]do for y=1,#b do
if b[y][x]==1 then
for y=1,#b do for x=1,#b[1]do
if b[y][x]then
gc.rectangle("fill",x-1,#b-y,1,1)
end
end end
@@ -79,25 +50,46 @@ c:release()
--Dust particles
PTC.attack={}
PTC.attack[1]=gc.newParticleSystem(gc.newImage("/image/mess/atk1.png"),200)
PTC.attack[1]=gc.newParticleSystem(N("/image/mess/atk1.png"),200)
PTC.attack[1]:setParticleLifetime(.25)
PTC.attack[1]:setEmissionRate(0)
PTC.attack[1]:setSpin(10)
PTC.attack[1]:setColors(1,1,1,.7,1,1,1,0)
PTC.attack[2]=gc.newParticleSystem(gc.newImage("/image/mess/atk2.png"),200)
PTC.attack[2]=gc.newParticleSystem(N("/image/mess/atk2.png"),200)
PTC.attack[2]:setParticleLifetime(.3)
PTC.attack[2]:setEmissionRate(0)
PTC.attack[2]:setSpin(8)
PTC.attack[2]:setColors(1,1,1,.7,1,1,1,0)
PTC.attack[3]=gc.newParticleSystem(gc.newImage("/image/mess/atk3.png"),200)
PTC.attack[3]=gc.newParticleSystem(N("/image/mess/atk3.png"),200)
PTC.attack[3]:setParticleLifetime(.4)
PTC.attack[3]:setEmissionRate(0)
PTC.attack[3]:setSpin(6)
PTC.attack[3]:setColors(1,1,1,.7,1,1,1,0)
--Attack particles
c=nil
gc.setCanvas()
gc.setDefaultFilter("linear","linear")
gc.setDefaultFilter("linear","linear")
titleImage=N("/image/mess/title.png")
dialCircle=N("/image/mess/dialCircle.png")
dialNeedle=N("/image/mess/dialNeedle.png")
badgeIcon=N("/image/mess/badge.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")
background2=N("/image/BG/bg2.png")
groupCode=N("/image/mess/groupcode.png")
payCode=N("/image/mess/paycode.png")
drawableText={
question=T(100,"?"),
x=T(110,"×"),
bpm=T(15,"BPM"),
kpm=T(15,"KPM"),
modeName=T(30),
levelName=T(30),
next=T(40),
hold=T(40),
}
c=gc.setCanvas()

203
timer.lua
View File

@@ -1,10 +1,13 @@
local wd=love.window
local Timer=love.timer.getTime
Tmr={}
function Tmr.load()
if loading==1 then
loadnum=loadnum+1
loadprogress=loadnum/10
if loadnum==5 then
--require("load_texture")
--require("texture")
elseif loadnum==10 then
loadnum=1
loading=2
@@ -13,6 +16,7 @@ function Tmr.load()
if loadnum<=#bgm then
bgm[bgm[loadnum]]=love.audio.newSource("/BGM/"..bgm[loadnum]..".ogg","stream")
bgm[bgm[loadnum]]:setLooping(true)
bgm[bgm[loadnum]]:setVolume(0)
loadprogress=loadnum/#bgm
loadnum=loadnum+1
else
@@ -42,6 +46,9 @@ function Tmr.intro()
count=count+1
if count==200 then count=80 end
end
function Tmr.draw()
if clearSureTime>0 then clearSureTime=clearSureTime-1 end
end
function Tmr.play(dt)
frame=frame+1
stat.gametime=stat.gametime+dt
@@ -64,11 +71,14 @@ function Tmr.play(dt)
rem(FX.badge,i)
end
end
for i=1,3 do
PTC.attack[i]:update(dt)
for i=1,#virtualkey do
if virtualkeyPressTime[i]>0 then
virtualkeyPressTime[i]=virtualkeyPressTime[i]-1
end
end
-- Update attack beam
PTC.attack[1]:update(dt)
PTC.attack[2]:update(dt)
PTC.attack[3]:update(dt)
if frame<180 then
if frame==179 then
gameStart()
@@ -78,44 +88,59 @@ function Tmr.play(dt)
for p=1,#players do
P=players[p]
if P.keyPressing[1]or P.keyPressing[2]then
P.moving=P.moving+sgn(P.moving)
P.moving=P.moving+(P.moving>0 and 1 or -1)
else
P.moving=0
end
end
return nil
end--Counting,include pre-das
return
end--Counting,include pre-das,directy RETURN
for p=1,#players do
P=players[p]
if P.timing then P.time=P.time+dt end
if P.alive then
local 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
v=0
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 not P.small then
local 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
v=0
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
if P.ai.controlDelay==0 then
if #P.ai.controls>0 then
pressKey(P.ai.controls[1],P)
releaseKey(P.ai.controls[1],P)
rem(P.ai.controls,1)
P.ai.controlDelay=P.ai.controlDelay0+2
P.ai.controlDelay=P.ai.controlDelay0+1
else
AI_getControls(P.ai.controls)
P.ai.controlDelay=2*P.ai.controlDelay0
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
if not P.keepVisible then
for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]>0 then P.visTime[j][i]=P.visTime[j][i]-1 end
end end
end--Fresh visible time
for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]>0 then P.visTime[j][i]=P.visTime[j][i]-1 end
end end
--Fresh visible time
if P.keyPressing[1]or P.keyPressing[2]then
P.moving=P.moving+sgn(P.moving)
P.moving=P.moving+(P.moving>0 and 1 or -1)
local d=abs(P.moving)-P.gameEnv.das
if d>1 then
if P.gameEnv.arr>0 then
@@ -130,8 +155,8 @@ function Tmr.play(dt)
P.moving=0
end
if P.keyPressing[7]and not P.keyPressing[9]then
P.downing=P.downing+1
local d=abs(P.downing)-P.gameEnv.sddas
P.downing=P.downing+1
if d>1 then
if P.gameEnv.sdarr>0 then
if d%P.gameEnv.sdarr==0 then
@@ -144,93 +169,99 @@ function Tmr.play(dt)
else
P.downing=0
end
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
if P.falling>0 then
if P.falling>=0 then
P.falling=P.falling-1
if P.falling<=0 then
if #P.field>P.clearing[1]then SFX("fall")end
for i=1,#P.clearing do
removeRow(P.field,P.clearing[i])
removeRow(P.visTime,P.clearing[i])
end
while #P.clearing>0 do
rem(P.clearing)
end
if P.falling>=0 then goto stop end
if P.gameEnv.fall>0 and #P.field>P.clearing[1]then SFX("fall")end
for i=1,#P.clearing do
removeRow(P.field,P.clearing[i])
removeRow(P.visTime,P.clearing[i])
end
--Rows cleared drop
elseif P.waiting>0 then
::L::
rem(P.clearing)
if P.clearing[1]then goto L end
end
if P.waiting>=0 then
P.waiting=P.waiting-1
if P.waiting<=0 then
resetblock()
if P.waiting==-1 then resetblock()end
goto stop
end
if P.curY~=P.y_img then
if P.dropDelay>=0 then
P.dropDelay=P.dropDelay-1
if P.dropDelay>=0 then goto stop end
end
drop()
P.dropDelay=P.gameEnv.drop
if P.freshTime<=P.gameEnv.freshLimit then
P.lockDelay=P.gameEnv.lock
end
else
if P.cy~=P.y_img then
if P.dropDelay>0 then
P.dropDelay=P.dropDelay-1
else
drop()
P.dropDelay=P.gameEnv.drop
if P.freshTime<=P.gameEnv.freshLimit then
P.lockDelay=P.gameEnv.lock
end
end
else
if P.lockDelay>0 then P.lockDelay=P.lockDelay-1
else drop()
end
end
P.lockDelay=P.lockDelay-1
if P.lockDelay>=0 then goto stop end
drop()
end
::stop::
if P.b2b1==P.b2b then
elseif P.b2b1<P.b2b then
P.b2b1=min(P.b2b1*.98+P.b2b*.02+.4,P.b2b)
else
P.b2b1=max(P.b2b1*.95+P.b2b*.05-.6,P.b2b)
end
P.b2b1=P.b2b1*.92+P.b2b*.08
--Alive
else
P.keySpeed=P.keySpeed*.96+P.cstat.key/P.time*60*.04
P.dropSpeed=P.dropSpeed*.96+P.cstat.piece/P.time*60*.04
--Final average speeds
if P.falling>0 then
P.falling=P.falling-1
if P.falling<=0 then
if #P.field>P.clearing[1]then SFX("fall")end
for i=1,#P.clearing do
removeRow(P.field,P.clearing[i])
removeRow(P.visTime,P.clearing[i])
end
P.clearing={}
if not P.small then
P.keySpeed=P.keySpeed*.96+P.cstat.key/P.time*60*.04
P.dropSpeed=P.dropSpeed*.96+P.cstat.piece/P.time*60*.04
--Final average speeds
if modeEnv.royaleMode then
P.swappingAtkMode=min(P.swappingAtkMode+2,30)
end
end--Rows cleared drop
if P.counter<40 then
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
for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
end end--Make field visible
end
if P.b2b1>0 then P.b2b1=max(P.b2b1-3,0)end
if P.b2b1>0 then P.b2b1=max(0,P.b2b1*.92-1)end
--Dead
end
for i=#P.shade,1,-1 do
local S=P.shade[i]
S[1]=S[1]-1
if S[1]==0 then
rem(P.shade,i)
end
end
for i=#P.bonus,1,-1 do
local b=P.bonus[i]
if b.inf then
if b.t<30 then
b.t=b.t+1
b.t=b.t+.5
end
else
b.t=b.t+1
if b.t==60 then rem(P.bonus,i)end
b.t=b.t+b.speed
if b.t>=60 then rem(P.bonus,i)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
local atk=P.atkBuffer[i]
atk.time=atk.time+1
if not atk.sent then
if atk.countdown>0 then
atk.countdown=atk.countdown-1
atk.countdown=atk.countdown-garbageSpeed
end
else
if atk.time>20 then
@@ -238,13 +269,15 @@ function Tmr.play(dt)
end
end
end
if P.fieldBeneath>0 then P.fieldBeneath=P.fieldBeneath-3 end
if P.fieldBeneath>0 then P.fieldBeneath=max(P.fieldBeneath-pushSpeed,0)end
if not P.small then
PTC.dust[p]:update(dt)
end
end
if modeEnv.royale and frame%120==0 then
freshRoyaleTarget()
if modeEnv.royaleMode and frame%120==0 then freshMostDangerous()end
end
function Tmr.pause(dt)
if not wd.isMinimized()and pauseTime<50 then
pauseTime=pauseTime+1
end
setmetatable(_G,nil)
end

View File

@@ -1,33 +1,30 @@
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={}
repeat
::L::
local i=find(s,sep)or #s+1
ins(t,sub(s,1,i-1))
s=sub(s,i+#sep)
until #s==0
if #s~=0 then goto L end
return t
end
function sgn(i)return i>0 and 1 or i<0 and -1 or 0 end--Row numbe is A-uth-or's id!
function stringPack(s,v)return s..toS(v)end
function without(t,v)
for i=1,#t do
if t[i]==v then return nil end
end
return true
end
function mStr(s,x,y)
gc.printf(s,x-500,y,1000,"center")
gc.printf(s,x-300,y,600,"center")
end
function getNewRow(val)
if not val then val=0 end
local t=rem(freeRow)
for i=1,10 do
t[i]=val or 0
t[i]=val
end
--clear a row and move to active list
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})
end
end
@@ -38,48 +35,55 @@ function removeRow(t,k)
ins(freeRow,rem(t,k))
end
local count=0
BGblockList={}for i=1,16 do BGblockList[i]={v=0}end
function getNewBlock()
count=count+1
if count==17 then count=1 end
local t=BGblockList[count]
t.bn,t.size=BGblock.next,2+3*rnd()
t.b=blocks[t.bn][rnd(0,3)]
t.x=rnd(-#t.b[1]*t.size*30+100,1180)
t.y=-#t.b*30*t.size
t.v=t.size*(1+rnd())
BGblock.next=BGblock.next%7+1
return t
--Single-usage funcs
langName={"中文","English"}
local langID={"chi","eng"}
function swapLanguage(l)
text=require("language/"..langID[l])
Buttons.sel=nil
for S,L in next,Buttons do
for N,B in next,L do
B.alpha=0
B.t=text.ButtonText[S][N]
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
--Background animation
function timeSort(a,b)
return a.time>b.time
end
function stencil_miniTitle()
for i=1,#miniTitle_pixel do
gc.rectangle("fill",unpack(miniTitle_pixel[i]))
local vibrateLevel={0,0,.03,.04,.05,.07,.9}
function VIB(t)
if setting.vib>0 then
love.system.vibrate(vibrateLevel[setting.vib+t])
end
end
function stencil_field()
gc.rectangle("fill",150,60,300,610)
end
function stencil_field_small()
gc.rectangle("fill",0,0,300,600)
end
--Single-usage funcs
function sysSFX(s,v)
if setting.sfx then
local n=1
while sfx[s][n]:isPlaying()do
::L::if sfx[s][n]:isPlaying()then
n=n+1
if not sfx[s][n]then
sfx[s][n]=sfx[s][n-1]:clone()
sfx[s][n]:seek(0)
goto quit
end
end
goto L
end::quit::
sfx[s][n]:setVolume(v or 1)
sfx[s][n]:play()
end
@@ -87,41 +91,118 @@ end
function SFX(s,v)
if setting.sfx and not P.ai then
local n=1
while sfx[s][n]:isPlaying()do
::L::if sfx[s][n]:isPlaying()then
n=n+1
if not sfx[s][n]then
sfx[s][n]=sfx[s][n-1]:clone()
sfx[s][n]:seek(0)
break
goto quit
end
end
goto L
end::quit::
sfx[s][n]:setVolume(v or 1)
sfx[s][n]:play()
end
end
function BGM(s)
if setting.bgm and bgmPlaying~=s then
for k,v in pairs(bgm)do v:stop()end
if s then bgm[s]:play()end
if bgmPlaying then newTask(Event_task.bgmFadeOut,nil,bgmPlaying)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
end
end
local swapDeck_data={
{4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1},
{1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2},
{3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2},
{2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4},
{7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5},
{3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6},
{2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7},
{5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8},
{7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8},
}--Block id [ZSLJTOI] ,dir,x,y
local swap={
none={2,1,d=function()end},
flash={8,1,d=function()gc.clear(1,1,1)end},
fade={30,15,d=function()
local t=1-abs(sceneSwaping.time*.06667-1)
gc.setColor(0,0,0,t)
gc.rectangle("fill",0,0,1280,720)
end},
deck={50,8,d=function()
local t=sceneSwaping.time
gc.setColor(1,1,1)
if t>8 then
local t=max(t,15)
for i=1,51-t do
local bn=swapDeck_data[i][1]
local b=blocks[bn][swapDeck_data[i][2]]
local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4]
for y=1,#b do for x=1,#b[1]do
if b[y][x]then
gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3)
end
end end
end
end
if t<17 then
gc.setColor(1,1,1,(8-abs(t-8))*.125)
gc.rectangle("fill",0,0,1280,720)
end
end},
}--Scene swapping animations
function gotoScene(s,style)
if not sceneSwaping and s~=scene then
style=style or"deck"
style=style or"fade"
sceneSwaping={
tar=s,style=style,
time=swap[style][1],mid=swap[style][2],
draw=swap[style].d
}
Buttons.sel=nil
if style~="none"then
sysSFX("swipe")
end
end
end
function startGame(mode)
--rec=""
gamemode=mode
gotoScene("play")
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()
local t=prevMenu[scene]
if type(t)=="string"then
@@ -130,10 +211,57 @@ function back()
t()
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()
userData:open("r")
--local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n")
local t=string.splitS(userData:read(),"\r\n")
--local t=splitS(love.math.decompress(userdata,"zlib"),"\r\n")
local t=splitS(userData:read(),"\r\n")
userData:close()
for i=1,#t do
local i=t[i]
@@ -148,18 +276,11 @@ function loadData()
end
end
function saveData()
local t=table.concat({
stringPack("run=",stat.run),
stringPack("game=",stat.game),
stringPack("gametime=",stat.gametime),
stringPack("piece=",stat.piece),
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")
local t={}
for i=1,#dataOpt do
ins(t,dataOpt[i].."="..toS(stat[dataOpt[i]]))
end
t=table.concat(t,"\r\n")
--t=love.math.compress(t,"zlib"):getString()
userData:open("w")
userData:write(t)
@@ -167,33 +288,33 @@ function saveData()
end
function loadSetting()
userSetting:open("r")
--local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n")
local t=string.splitS(userSetting:read(),"\r\n")
--local t=splitS(love.math.decompress(userdata,"zlib"),"\r\n")
local t=splitS(userSetting:read(),"\r\n")
userSetting:close()
for i=1,#t do
local i=t[i]
if find(i,"=")then
local t=sub(i,1,find(i,"=")-1)
local v=sub(i,find(i,"=")+1)
if t=="sfx"or t=="bgm"then
if t=="sfx"or t=="bgm"or t=="bgblock"then
setting[t]=v=="true"
elseif t=="vib"then
setting.vib=toN(v:match("[01234]"))or 0
elseif t=="fullscreen"then
setting.fullscreen=v=="true"
love.window.setFullscreen(setting.fullscreen)
elseif t=="bgblock"then
setting.bgblock=v=="true"
elseif t=="keymap"then
v=string.splitS(v,"/")
v=splitS(v,"/")
for i=1,16 do
local v1=string.splitS(v[i],",")
local v1=splitS(v[i],",")
for j=1,#v1 do
setting.keyMap[i][j]=v1[j]
end
end
elseif t=="keylib"then
v=string.splitS(v,"/")
v=splitS(v,"/")
for i=1,4 do
local v1=string.splitS(v[i],",")
local v1=splitS(v[i],",")
for j=1,#v1 do
setting.keyLib[i][j]=toN(v1[j])
end
@@ -206,29 +327,28 @@ function loadSetting()
end
end
elseif t=="virtualkey"then
v=string.splitS(v,"/")
v=splitS(v,"/")
for i=1,10 do
if not v[i]then goto continue end
virtualkey[i]=string.splitS(v[i],",")
if not v[i]then goto c end
virtualkey[i]=splitS(v[i],",")
for j=1,4 do
virtualkey[i][j]=toN(virtualkey[i][j])
end
::continue::
::c::
end
elseif t=="virtualkeyAlpha"then
setting.virtualkeyAlpha=int(abs(toN(v)))
elseif t=="virtualkeyIcon"then
setting.virtualkeyIcon=v=="true"
elseif t=="virtualkeySwitch"then
setting.virtualkeySwitch=v=="true"
elseif t=="virtualkeyIcon"or t=="virtualkeySwitch"then
setting[t]=v=="true"
elseif t=="frameMul"then
v=min(max(toN(v)or 100,0),100)
setting.frameMul=v
setting.frameMul=min(max(toN(v)or 100,0),100)
elseif t=="das"or t=="arr"or t=="sddas"or t=="sdarr"then
v=toN(v)if not v or v<0 then v=0 end
setting[t]=int(v)
elseif t=="ghost"or t=="center"then
elseif t=="ghost"or t=="center"or t=="grid"or t=="swap"or t=="fxs"or t=="bg"then
setting[t]=v=="true"
elseif t=="lang"then
setting[t]=toN(v:match("[12]"))or 1
end
end
end
@@ -249,23 +369,15 @@ function saveSetting()
for i=1,4 do
lib[i]=table.concat(setting.keyLib[i],",")
end
local t=table.concat({
stringPack("sfx=",setting.sfx),
stringPack("bgm=",setting.bgm),
stringPack("fullscreen=",setting.fullscreen),
stringPack("bgblock=",setting.bgblock),
stringPack("das=",setting.das),
stringPack("arr=",setting.arr),
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")
local t={
"keymap="..toS(table.concat(map,"/")),
"keylib="..toS(table.concat(lib,"/")),
"virtualkey="..toS(table.concat(vk,"/")),
}
for i=1,#saveOpt do
ins(t,saveOpt[i].."="..toS(setting[saveOpt[i]]))
end
t=table.concat(t,"\r\n")
--t=love.math.compress(t,"zlib"):getString()
userSetting:open("w")
userSetting:write(t)