Compare commits

...

7 Commits

Author SHA1 Message Date
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
MrZ_26
e281634f72 Alpha V0.7.4 2020-02-04 19:30:30 +08:00
MrZ_26
7eea017c72 Alpha V0.7.3 2020-02-04 19:30:03 +08:00
MrZ_26
f0cca3092a Alpha V0.7.2 2020-02-04 19:29:42 +08:00
MrZ_26
1447893378 Alpha V0.7.1 2020-02-04 19:29:24 +08:00
36 changed files with 2721 additions and 1385 deletions

BIN
BGM/cruelty.ogg Normal file

Binary file not shown.

BIN
BGM/final.ogg Normal file

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.

BIN
SFX/emit.ogg Normal file

Binary file not shown.

98
ai.lua
View File

@@ -1,12 +1,12 @@
--[[ --[[
HighestBlock HighestBlock
HorizontalTransitions HorizontalTransitions
VerticalTransitions VerticalTransitions
BlockedCells BlockedCells
Wells Wells
FilledLines FilledLines
TetrisShape 4deepShape
BlockedWells; BlockedWells;
]] ]]
dirCount={1,1,3,3,3,0,1} dirCount={1,1,3,3,3,0,1}
spinOffset={ spinOffset={
@@ -18,33 +18,35 @@ spinOffset={
{0,0,0},--O {0,0,0},--O
{2,0,1},--I {2,0,1},--I
}for i=1,7 do spinOffset[i][0]=0 end }for i=1,7 do spinOffset[i][0]=0 end
--[[controlname: --[[
controlname:
1~5:mL,mR,rR,rL,rF, 1~5:mL,mR,rR,rL,rF,
6~9:hD,sD,H,R, 6~10:hD,sD,H,A,R,
10~12:LL,RR,DD 11~13:LL,RR,DD
]] ]]
FCL={ FCL={
[1]={ [1]={
{{10},{10,2},{1},{},{2},{2,2},{11,1},{11}}, {{11},{11,2},{1},{},{2},{2,2},{12,1},{12}},
{{10,4},{10,3},{10,2,3},{4},{3},{2,3},{2,2,3},{11,4},{11,3}}, {{11,4},{11,3},{11,2,3},{4},{3},{2,3},{2,2,3},{12,4},{12,3}},
}, },
[3]={ [3]={
{{10},{10,2},{1},{},{2},{2,2},{11,1},{11},}, {{11},{11,2},{1},{},{2},{2,2},{12,1},{12},},
{{3,10},{10,3},{10,2,3},{1,3},{3},{2,3},{2,2,3},{11,1,3},{11,3},}, {{3,11},{11,3},{11,2,3},{1,3},{3},{2,3},{2,2,3},{12,1,3},{12,3},},
{{10,5},{10,2,5},{1,5},{5},{2,5},{2,2,5},{11,1,5},{11,5},}, {{11,5},{11,2,5},{1,5},{5},{2,5},{2,2,5},{12,1,5},{12,5},},
{{10,4},{10,2,4},{1,4},{4},{2,4},{2,2,4},{11,1,4},{11,4},{4,11},}, {{11,4},{11,2,4},{1,4},{4},{2,4},{2,2,4},{12,1,4},{12,4},{4,12},},
}, },
[6]={ [6]={
{{10},{10,2},{1,1},{1},{},{2},{2,2},{11,1},{11},}, {{11},{11,2},{1,1},{1},{},{2},{2,2},{12,1},{12},},
}, },
[7]={ [7]={
{{10},{10,2},{1},{},{2},{11,1},{11},}, {{11},{11,2},{1},{},{2},{12,1},{12},},
{{4,10},{10,4},{10,3},{1,4},{4},{3},{2,3},{11,4},{11,3},{3,11},}, {{4,11},{11,4},{11,3},{1,4},{4},{3},{2,3},{12,4},{12,3},{3,12},},
}, },
} }
FCL[2]=FCL[1] FCL[2]=FCL[1]
FCL[4]=FCL[3] FCL[4]=FCL[3]
FCL[5]=FCL[3] FCL[5]=FCL[3]
clearScore={[0]=0,0,2,4,12}
function ifoverlapAI(f,bk,x,y) function ifoverlapAI(f,bk,x,y)
if y<1 then return true end if y<1 then return true end
if y>#f then return nil end if y>#f then return nil end
@@ -63,10 +65,10 @@ function resetField(f0,f,start)
end end
end end
end end
function getScore(field,cb,cx,cy) function getScore(field,bn,cb,cx,cy)
local score=0
local highest=0 local highest=0
local height=getNewRow() local height=getNewRow()
local rough=0
local clear=0 local clear=0
local hole=0 local hole=0
@@ -90,28 +92,37 @@ function getScore(field,cb,cx,cy)
if x>3 and x<8 and h>highest then highest=h end if x>3 and x<8 and h>highest then highest=h end
if h>1 then if h>1 then
for h=h-1,1,-1 do for h=h-1,1,-1 do
if field[h][x]==0 then hole=hole+1 if hole>5 then break end end if field[h][x]==0 then
hole=hole+1
if hole==5 then break end
end
end end
end end
end end
local h1,mh1=0,0
for x=1,9 do for x=1,9 do
local dh=abs(height[x]-height[x]) local dh=abs(height[x]-height[x+1])
if dh>1 then if dh==1 then
rough=rough+min(dh^2,10) h1=h1+1
if h1>mh1 then mh1=h1 end
else
h1=0
end end
end end
ins(freeRow,height) ins(freeRow,height)
return score=
-highest*5 #field*20
-rough*15 -cy*35
-cy*20 -#cb*25
-#cb*10 +clearScore[clear]*(8+#field)
+clear^2*4 -hole*50
-hole*15 if #field>6 then score=score-highest*5 end
if mh1>3 then score=score-50-mh1*40 end
return score
end end
function AI_getControls(ctrl) function AI_getControls(ctrl)
local Tfield={}--test field local Tfield={}--test field
local field_org=field local field_org=P.field
for i=1,#field_org do for i=1,#field_org do
Tfield[i]=getNewRow() Tfield[i]=getNewRow()
for j=1,10 do for j=1,10 do
@@ -119,8 +130,8 @@ function AI_getControls(ctrl)
end end
end end
local best={x=1,dir=0,hold=false,score=-9e99} local best={x=1,dir=0,hold=false,score=-9e99}
for ifhold=0,1 do for ifhold=0,P.gameEnv.hold and 1 or 0 do
local bn=ifhold==0 and bn or hn>0 and hn or nxt[1] local bn=ifhold==0 and P.bn or P.hn>0 and P.hn or P.nxt[1]
for dir=0,dirCount[bn] do--each dir for dir=0,dirCount[bn] do--each dir
local cb=blocks[bn][dir] local cb=blocks[bn][dir]
for cx=1,11-#cb[1]do--each pos for cx=1,11-#cb[1]do--each pos
@@ -137,27 +148,30 @@ function AI_getControls(ctrl)
end end
end end
end--simulate lock end--simulate lock
local score=getScore(Tfield,cb,cx,cy) local score=getScore(Tfield,bn,cb,cx,cy)
if score>best.score then if score>best.score then
best={bn=bn,x=cx,dir=dir,hold=ifhold==1,score=score} best={bn=bn,x=cx,dir=dir,hold=ifhold==1,score=score}
end end
resetField(field_org,Tfield,cy) resetField(field_org,Tfield,cy)
end end
end end
end--ifHold loop end
while #Tfield>0 do while #Tfield>0 do
removeRow(Tfield,1) removeRow(Tfield,1)
end--Release cache end--Release cache
if best.hold then if best.hold then
ins(ctrl,8) ins(ctrl,8)
end end
local l=FCL[best.bn][best.dir+1][best.x] local l=FCL[best.bn][best.dir+1][best.x]
for i=1,#l do for i=1,#l do
ins(ctrl,l[i]) ins(ctrl,l[i])
end end
ins(ctrl,6)
ins(ctrl,6)--harddrop if rnd()<.1 then
if P.atkMode~=4 and P==mostDangerous then
ins(P.ai.controls,9)
--Smarter AI???
end
end
end end

BIN
albbph.ttf Normal file

Binary file not shown.

View File

@@ -1,5 +1,5 @@
function onVirtualkey(x,y) function onVirtualkey(x,y)
local x,y=convert(x,y) local x,y=xOy:inverseTransformPoint(x,y)
local d2,nearest,distance local d2,nearest,distance
for K=1,#virtualkey do for K=1,#virtualkey do
local b=virtualkey[K] local b=virtualkey[K]
@@ -16,7 +16,9 @@ end
function buttonControl_key(i) function buttonControl_key(i)
if i=="up"or i=="down"or i=="left"or i=="right"then if i=="up"or i=="down"or i=="left"or i=="right"then
if not Buttons.sel then if not Buttons.sel then
Buttons.sel=1 if Buttons[scene][1]then
Buttons.sel=1
end
else else
Buttons.sel=Buttons[scene][Buttons.sel][i]or Buttons.sel Buttons.sel=Buttons[scene][Buttons.sel][i]or Buttons.sel
end end
@@ -28,12 +30,13 @@ function buttonControl_key(i)
sysSFX("button") sysSFX("button")
end end
end end
mouseShow=false
end end
function buttonControl_gamepad(i) function buttonControl_gamepad(i)
if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then
if not Buttons.sel then if not Buttons.sel then
Buttons.sel=1 if Buttons[scene][1]then
Buttons.sel=1
end
mouseShow=false mouseShow=false
else else
Buttons.sel=Buttons[scene][Buttons.sel][i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]or Buttons.sel Buttons.sel=Buttons[scene][Buttons.sel][i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]or Buttons.sel
@@ -50,14 +53,61 @@ function buttonControl_gamepad(i)
end end
mouseDown={} mouseDown={}
function mouseDown.intro(x,y,k)
if k==2 then
back()
else
gotoScene("main")
end
end
keyDown={} keyDown={}
function keyDown.intro(key)
if key=="escape"then
back()
else
gotoScene("main")
end
end
function keyDown.mode(key) function keyDown.mode(key)
if key=="down"then 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 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 elseif key=="return"then
startGame(modeID[modeSel]) loadGame(modeSel,levelSel)
elseif key=="c"then
gotoScene("custom")
elseif key=="escape"then
back()
end
end
function keyDown.custom(key)
if key=="left"then
local k=customID[optSel]
customSel[k]=(customSel[k]-2)%#customRange[k]+1
elseif key=="right"then
local k=customID[optSel]
customSel[k]=customSel[k]%#customRange[k]+1
elseif key=="down"then
optSel=optSel%#customID+1
elseif key=="up"then
optSel=(optSel-2)%#customID+1
elseif key=="return"then
loadGame(0,1)
elseif key=="escape"then elseif key=="escape"then
back() back()
end end
@@ -71,7 +121,7 @@ function keyDown.setting2(key)
end end
elseif keyboardSetting then elseif keyboardSetting then
for l=1,8 do for l=1,8 do
for y=1,12 do for y=1,13 do
if setting.keyMap[l][y]==key then if setting.keyMap[l][y]==key then
setting.keyMap[l][y]="" setting.keyMap[l][y]=""
end end
@@ -84,7 +134,7 @@ function keyDown.setting2(key)
elseif key=="up"then elseif key=="up"then
keyboardSet=max(keyboardSet-1,1) keyboardSet=max(keyboardSet-1,1)
elseif key=="down"then elseif key=="down"then
keyboardSet=min(keyboardSet+1,12) keyboardSet=min(keyboardSet+1,13)
elseif key=="left"then elseif key=="left"then
curBoard=max(curBoard-1,1) curBoard=max(curBoard-1,1)
elseif key=="right"then elseif key=="right"then
@@ -122,13 +172,20 @@ function keyUp.play(key)
end end
end end
gamepadDown={} gamepadDown={}
function gamepadDown.intro(key)
if key=="back"then
back()
else
gotoScene("main")
end
end
function gamepadDown.mode(key) function gamepadDown.mode(key)
if key=="dpdown"then if key=="dpdown"then
if modeSel<#modeID then modeSel=modeSel+1 end if modeSel<#modeID then modeSel=modeSel+1 end
elseif key=="dpup"then elseif key=="dpup"then
if modeSel>1 then modeSel=modeSel-1 end if modeSel>1 then modeSel=modeSel-1 end
elseif key=="start"then elseif key=="start"then
startGame(modeID[modeSel]) loadGame(modeSel,levelSel)
elseif key=="back"then elseif key=="back"then
back() back()
end end
@@ -167,10 +224,10 @@ function gamepadDown.play(key)
local m=setting.keyMap local m=setting.keyMap
for p=1,4 do for p=1,4 do
local lib=setting.keyLib[p] local lib=setting.keyLib[p]
for s=1,#l[p]do for s=1,#lib do
for k=1,12 do for k=1,12 do
if key==m[8+lib[s]][k]then if key==m[8+lib[s]][k]then
pressKey(k) pressKey(k,players[p])
return nil return nil
end end
end end
@@ -182,10 +239,10 @@ function gamepadUp.play(key)
local m=setting.keyMap local m=setting.keyMap
for p=1,4 do for p=1,4 do
local lib=setting.keyLib[p] local lib=setting.keyLib[p]
for s=1,#l[p]do for s=1,#lib do
for k=1,12 do for k=1,12 do
if key==m[8+lib[s]][k]then if key==m[8+lib[s]][k]then
pressKey(k) releaseKey(k,players[p])
return nil return nil
end end
end end
@@ -195,6 +252,7 @@ end
wheelmoved={} wheelmoved={}
function wheelmoved.mode(x,y) function wheelmoved.mode(x,y)
modeSel=min(max(modeSel-sgn(y),1),#modeID) modeSel=min(max(modeSel-sgn(y),1),#modeID)
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
end end
--Warning,these are not system callbacks! --Warning,these are not system callbacks!
@@ -202,7 +260,7 @@ end
function love.mousemoved(x,y,dx,dy,t) function love.mousemoved(x,y,dx,dy,t)
if not t then if not t then
mouseShow=true mouseShow=true
mx,my=convert(x,y) mx,my=xOy:inverseTransformPoint(x,y)
Buttons.sel=nil Buttons.sel=nil
for i=1,#Buttons[scene]do for i=1,#Buttons[scene]do
local B=Buttons[scene][i] local B=Buttons[scene][i]
@@ -218,19 +276,22 @@ end
function love.mousepressed(x,y,k,t,num) function love.mousepressed(x,y,k,t,num)
if not t then if not t then
mouseShow=true mouseShow=true
mx,my=convert(x,y) mx,my=xOy:inverseTransformPoint(x,y)
if mouseDown[scene]then mouseDown[scene](mx,my,k)end if mouseDown[scene]then
if k==1 then mouseDown[scene](mx,my,k)
if not sceneSwaping and Buttons.sel then else
local B=Buttons[scene][Buttons.sel] if k==1 then
B.code() if not sceneSwaping and Buttons.sel then
B.alpha=1 local B=Buttons[scene][Buttons.sel]
Buttons.sel=nil B.code()
love.mousemoved(x,y) B.alpha=1
sysSFX("button") Buttons.sel=nil
love.mousemoved(x,y)
sysSFX("button")
end
elseif k==2 then
back()
end end
elseif k==3 then
back()
end end
end end
end end
@@ -242,19 +303,23 @@ function love.touchpressed(id,x,y)
love.mousemoved(x,y) love.mousemoved(x,y)
mouseShow=false mouseShow=false
end end
if scene=="play"and setting.virtualkeySwitch then if scene=="play"then
local t=onVirtualkey(x,y) if setting.virtualkeySwitch then
if t then local t=onVirtualkey(x,y)
pressKey(t,players[1]) if t then
pressKey(t,players[1])
end
end end
elseif scene=="setting3"then elseif scene=="setting3"then
x,y=convert(x,y) x,y=xOy:inverseTransformPoint(x,y)
for K=1,#virtualkey do for K=1,#virtualkey do
local b=virtualkey[K] local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then if (x-b[1])^2+(y-b[2])^2<b[3]then
sel=K sel=K
end end
end end
elseif scene=="intro"then
gotoScene("main")
end end
end end
function love.touchreleased(id,x,y) function love.touchreleased(id,x,y)
@@ -272,10 +337,10 @@ function love.touchreleased(id,x,y)
if scene=="play"and setting.virtualkeySwitch then if scene=="play"and setting.virtualkeySwitch then
local t=onVirtualkey(x,y) local t=onVirtualkey(x,y)
if t then if t then
releaseKey(t) releaseKey(t,players[1])
end end
elseif scene=="setting3"and sel then elseif scene=="setting3"and sel then
x,y=convert(x,y) x,y=xOy:inverseTransformPoint(x,y)
if sel then if sel then
local b=virtualkey[sel] local b=virtualkey[sel]
local k=snapLevelValue[snapLevel] local k=snapLevelValue[snapLevel]
@@ -295,18 +360,18 @@ function love.touchmoved(id,x,y,dx,dy)
local b=virtualkey[n] local b=virtualkey[n]
local p=false local p=false
for i=1,#l do for i=1,#l do
local x,y=convert(tc.getPosition(l[i])) local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then if(x-b[1])^2+(y-b[2])^2<=b[3]then
p=true p=true
break break
end end
end end
if not p and players[1].keyPressing then if not p and players[1].isKeyDown then
releaseKey(n) releaseKey(n,players[1])
end end
end end
elseif scene=="setting3"then elseif scene=="setting3"then
x,y=convert(x,y) x,y=xOy:inverseTransformPoint(x,y)
dx,dy=dx*screenK,dy*screenK dx,dy=dx*screenK,dy*screenK
if sel then if sel then
local b=virtualkey[sel] local b=virtualkey[sel]
@@ -316,12 +381,41 @@ function love.touchmoved(id,x,y,dx,dy)
end end
function love.keypressed(i) function love.keypressed(i)
if keyDown[scene]then keyDown[scene](i) if i=="f12"then devMode=not devMode end
elseif i=="escape"or i=="back"then back() if devMode then
else buttonControl_key(i) if Buttons.sel then
local B=Buttons[scene][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
if i=="q"then
for i=1,#Buttons[scene]do
local B=Buttons[scene][i]
print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h))
end
end
else
if keyDown[scene]then keyDown[scene](i)
elseif i=="escape"or i=="back"then back()
else buttonControl_key(i)
end
end end
mouseShow=false
if i=="f12"then devMode=true end
end end
function love.keyreleased(i) function love.keyreleased(i)
if keyUp[scene]then keyUp[scene](i) if keyUp[scene]then keyUp[scene](i)
@@ -330,9 +424,10 @@ end
function love.gamepadpressed(joystick,i) function love.gamepadpressed(joystick,i)
if gamepadDown[scene]then return gamepadDown[scene](i) if gamepadDown[scene]then return gamepadDown[scene](i)
elseif i=="back"then return back() elseif i=="back"then back()
else buttonControl_gamepad(i) else buttonControl_gamepad(i)
end end
mouseShow=false
end end
function love.gamepadreleased(joystick,i) function love.gamepadreleased(joystick,i)
if gamepadUp[scene]then gamepadUp[scene](i) if gamepadUp[scene]then gamepadUp[scene](i)
@@ -372,8 +467,6 @@ function love.update(dt)
BGblock.ct=rnd(20,30) BGblock.ct=rnd(20,30)
end end
end end
--Background blocks update
if sceneSwaping then if sceneSwaping then
sceneSwaping.time=sceneSwaping.time-1 sceneSwaping.time=sceneSwaping.time-1
if sceneSwaping.time==sceneSwaping.mid then if sceneSwaping.time==sceneSwaping.mid then
@@ -388,7 +481,7 @@ function love.update(dt)
elseif Tmr[scene]then elseif Tmr[scene]then
Tmr[scene](dt) Tmr[scene](dt)
end end
--scene swapping & Timer updateButton()
end end
function love.sendData(data) function love.sendData(data)
return nil return nil
@@ -397,6 +490,7 @@ function love.receiveData(id,data)
return nil return nil
end end
function love.draw() function love.draw()
gc.clear()
Pnt.BG[curBG]() Pnt.BG[curBG]()
gc.setColor(1,1,1,.3) gc.setColor(1,1,1,.3)
for n=1,#BGblock do for n=1,#BGblock do
@@ -406,42 +500,48 @@ function love.draw()
if b[i][j]>0 then if b[i][j]>0 then
gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size) gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size)
end end
end end--Block end end
end end
if Pnt[scene]then Pnt[scene]()end if Pnt[scene]then Pnt[scene]()end
drawButton() drawButton()
if mouseShow and not touching then if mouseShow and not touching then
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.setColor(1,1,1,.5)
gc.circle("fill",mx,my,5)
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(mouseIcon,mx,my,nil,nil,nil,10,10) gc.circle("fill",mx,my,3)
end end
if sceneSwaping then sceneSwaping.draw()end if sceneSwaping then sceneSwaping.draw()end
gc.setColor(0,0,0) if wh/ww>.5625 then
if screenM>0 then gc.setColor(0,0,0)
gc.rectangle("fill",0,0,1280,-screenM) gc.rectangle("fill",0,0,1280,ww*9/16-wh)
gc.rectangle("fill",0,720,1280,screenM) gc.rectangle("fill",0,720,1280,wh-ww*9/16)
end--Draw black side elseif wh/ww<.5625 then
gc.setColor(0,0,0)
setFont(20)gc.setColor(1,1,1) gc.rectangle("fill",0,0,wh*16/9-ww,720)
gc.print(tm.getFPS(),0,700) gc.rectangle("fill",1280,0,ww-wh*16/9,720)
if devMode then end
gc.print(gcinfo(),0,680) setFont(20)gc.setColor(1,1,1)
gc.print(freeRow and #freeRow or 0,0,660) gc.print(tm.getFPS(),5,700)
if devMode then
gc.print(gcinfo(),5,680)
gc.print(freeRow and #freeRow or 0,5,660)
end end
--if gcinfo()>500 then collectgarbage()end
end end
function love.resize(x,y) function love.resize(w,h)
screenK=1280/gc.getWidth() ww,wh=w,h
screenM=(gc.getHeight()*16/9-gc.getWidth())/2 screenK=h/w>=.5625 and w/1280 or h/720
gc.origin() xOy=xOy:setTransformation(w*.5,h*.5,nil,screenK,nil,640,360)
gc.scale(1/screenK,1/screenK) gc.replaceTransform(xOy)
gc.translate(0,screenM)
end end
function love.run() function love.run()
local frameT=Timer() local frameT=Timer()
local readyDrawFrame=0 local readyDrawFrame=0
tm.step() love.resize(gc.getWidth(),gc.getHeight())
love.resize(nil,gc.getHeight())
game.load()--System scene Launch game.load()--System scene Launch
math.randomseed(os.time()*626) math.randomseed(os.time()*626)
return function() return function()
@@ -461,21 +561,25 @@ function love.run()
love.draw() love.draw()
gc.present() gc.present()
end end
if not wd.hasFocus()then if not(wd.hasFocus()or keeprun)then
focus=false focus=false
ms.setVisible(true) ms.setVisible(true)
if bgmPlaying then bgm[bgmPlaying]:pause()end if bgmPlaying then bgm[bgmPlaying]:pause()end
if scene=="play"then if scene=="play"then
for i=1,#players[1].keyPressing do for i=1,#players.alive do
if players[1].keyPressing[i]then local l=players.alive[i].isKeyDown
releaseKey(i) for j=1,#l do
if l[j]then
releaseKey(j,players.alive[i])
end
end end
end end
end end
end end
else else
tm.sleep(.2) tm.sleep(.5)
if wd.hasFocus()then if wd.hasFocus()then
tm.step()
focus=true focus=true
ms.setVisible(false) ms.setVisible(false)
if bgmPlaying then bgm[bgmPlaying]:play()end if bgmPlaying then bgm[bgmPlaying]:play()end

BIN
cb.ttf

Binary file not shown.

View File

@@ -1,15 +1,15 @@
function love.conf(t) function love.conf(t)
local X=nil local X=nil
t.identity="Techmino"--The name of the save directory (string) t.identity="Techmino"--Save directory name
t.appendidentity=X--Search files in source directory before save directory (boolean) t.appendidentity=X--If search files in source before save directory
t.version="11.1" t.version="11.1"
t.console=X t.console=X
t.accelerometerjoystick=X--Enable the accelerometer on iOS and Android by exposing it as a Joystick (boolean) t.accelerometerjoystick=X--If exposing accelerometer on iOS and Android as a Joystick
t.gammacorrect=true t.gammacorrect=X
t.audio.mixwithsystem=true--Switch on to keep background music playing t.audio.mixwithsystem=true--Switch on to keep sysBGM
local W=t.window local W=t.window
W.title="Techmino V0.68" W.title="Techmino V0.7.7"
W.icon="/image/icon.png" W.icon="/image/icon.png"
W.width,W.height=1280,720 W.width,W.height=1280,720
W.borderless=X W.borderless=X
@@ -19,8 +19,8 @@ function love.conf(t)
W.fullscreen=X W.fullscreen=X
W.vsync=X--0 to set ∞fps W.vsync=X--0 to set ∞fps
W.msaa=X--The number of samples to use with multi-sampled antialiasing (number) W.msaa=X--The number of samples to use with multi-sampled antialiasing (number)
W.depth=X--The number of bits per sample in the depth buffer 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.display=1--Monitor ID
W.highdpi=X--Enable high-dpi mode for the window on a Retina display (boolean) W.highdpi=X--Enable high-dpi mode for the window on a Retina display (boolean)
W.x,W.y=nil W.x,W.y=nil

File diff suppressed because it is too large Load Diff

BIN
image/block/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 659 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 575 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 584 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 533 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 635 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 660 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

BIN
image/virtualkey/swap.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 B

809
list.lua
View File

@@ -1,3 +1,36 @@
--[["four name"
Techrash
Zestris
x Quadruple
x Tequeno
x Techzino
x Tectris
Techris
Techmino
Tequéno
]]
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,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,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},
}
color={ color={
red={1,0,0}, red={1,0,0},
green={0,1,0}, green={0,1,0},
@@ -35,10 +68,10 @@ attackColor={
gc.setColor(1,t,0) gc.setColor(1,t,0)
end, end,
function(t) function(t)
gc.setColor(1,0,t) gc.setColor(1,.4,.3+t*.7)
end, end,
function(t) function(t)
gc.setColor(t,t,1) gc.setColor(.2+t*.8,.2+t*.8,1)
end, end,
}--3 animation-colorsets of attack buffer bar }--3 animation-colorsets of attack buffer bar
} }
@@ -71,6 +104,17 @@ for j=1,7 do
spinName[0][j]=blockName[j].." spin" spinName[0][j]=blockName[j].." spin"
end end
miniTitle_rect={
{2,0,5,1},{4,1,1,6},
{9,0,4,1},{9,3,4,1},{9,6,4,1},{8,0,1,7},
{15,0,3,1},{15,6,3,1},{14,0,1,7},
{19,0,1,7},{23,0,1,7},{20,3,3,1},
{0,8,1,6},{6,8,1,6},{1,9,1,1},{2,10,1,1},{3,11,1,1},{4,10,1,1},{5,9,1,1},
{8,8,5,1},{8,13,5,1},{10,9,1,4},
{14,8,1,6},{19,8,1,6},{15,9,1,1},{16,10,1,1},{17,11,1,1},{18,12,1,1},
{21,8,5,1},{21,13,5,1},{21,9,1,4},{25,9,1,4},
}
sfx={ sfx={
"button", "button",
"ready","start","win","fail", "ready","start","win","fail",
@@ -81,6 +125,7 @@ sfx={
"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","ren_10","ren_11", "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", "clear_1","clear_2","clear_3","clear_4",
"spin_0","spin_1","spin_2","spin_3", "spin_0","spin_1","spin_2","spin_3",
"emit","blip_1","blip_2",
"perfectclear", "perfectclear",
} }
bgm={ bgm={
@@ -90,13 +135,20 @@ bgm={
"push", "push",
"reason", "reason",
"infinite", "infinite",
"cruelty",
"final",
} }
prevMenu={ prevMenu={
load=love.event.quit, load=love.event.quit,
ready="mode", intro="quit",
play="mode", main="intro",
mode="main", mode="main",
custom="mode",
ready="mode",
play=function()
gotoScene(curMode.id~="custom"and"mode"or"custom")
end,
help="main", help="main",
stat="main", stat="main",
setting=function() setting=function()
@@ -105,110 +157,482 @@ prevMenu={
end, end,
setting2="setting", setting2="setting",
setting3="setting", setting3="setting",
intro="quit",
main="quit",
} }
modeID={"sprint","marathon","zen","infinite","solo","death","blind","puzzle","tetris41","asymsolo","gmroll","p2","p3","p4"} customID={
modeName={"Sprint","Marathon","Zen","Infinite","1v1","Death","Blind","Puzzle","Tetris 41","Asymmetry solo","GM roll","2P","3P","4P"} "drop",
modeInfo={ "lock",
sprint="Clear 40 Lines", "wait",
marathon="Clear 200 Lines", "fall",
zen="Clear 200 Lines without gravity", "next",
infinite="Infinite game,infinite happiness", "hold",
solo="Beat AI", "sequence",
death="Survive under terrible speed", "visible",
blind="Invisible board!", "target",
puzzle="Your keyboard broke", "freshLimit",
tetris41="Melee fight with 40 AIs", "opponent",
asymsolo=" See-->", }--Order
gmroll="Who want to be the grand master?", customOption={
p2="2 players game", drop="Drop delay:",
p3="3 players game", lock="Lock delay:",
p4="4 players game", 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={"bag7","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},
next={0,1,2,3,4,5,6},
hold={true,false},
sequence={1,2,3},
visible={1,2,3},
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","restart","insLeft","insRight","insDown"} 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:","Restart:","Instant Left:","Instant Right:","Ins Down:"} 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} blockPos={4,4,4,4,4,5,4}
renATK={[0]=0,0,0,1,1,2,2,3,3,4,4}--3 else 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",} 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} b2bATK={3,5,8}
testScore={[0]=0,[-1]=1,[-2]=0,[-3]=1,2,2,2}
spin_n={"spin_1","spin_2","spin_3"} spin_n={"spin_1","spin_2","spin_3"}
clear_n={"clear_1","clear_2","clear_3","clear_4"} 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"} ren_n={"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","ren_10","ren_11"}
vibrateLevel={0,.02,.03,.04,.06,.08,.1}
atkModeName={"Random","Badges","K.O.s","Counters"}
up0to4={[0]="000%UP","025%UP","050%UP","075%UP","100%UP",}
percent0to5={[0]="0%","20%","40%","60%","80%","100%",} percent0to5={[0]="0%","20%","40%","60%","80%","100%",}
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"}
snapLevelValue={1,10,20,40,60,80}
reAtk={0,0,1,1,1,2,2,3,3}
reDef={0,1,1,2,3,3,4,4,5}
marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0} 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={10,9,9,8,8} death_lock={12,11,10,9,8}
death_wait={6,6,5,5,4} death_wait={9,8,7,6,5}
death_fall={10,9,8,7,6} death_fall={10,9,8,7,6}
snapLevelValue={1,10,20,40,60,80} pc_drop={50,45,40,35,30,26,22,18,15,12}
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"} pc_lock={55,50,45,40,36,32,30}
pc_fall={18,16,14,12,10,9,8,7,6}
act={ defaultModeEnv={
moveLeft=function(auto) sprint={
if not auto then P.moving=-1 end {
if not ifoverlap(cb,cx-1,cy)then drop=60,
P.cx=cx-1 target=10,
freshgho() reach=Event.gameover.win,
freshLockDelay() },
if cy==y_img then SFX("move")end {
P.spinLast=false drop=60,
end target=20,
end, reach=Event.gameover.win,
moveRight=function(auto) },
if not auto then P.moving=1 end {
if not ifoverlap(cb,cx+1,cy)then drop=60,
P.cx=cx+1 target=40,
freshgho() reach=Event.gameover.win,
freshLockDelay() },
if cy==y_img then SFX("move")end {
P.spinLast=false drop=60,
end target=100,
end, reach=Event.gameover.win,
hardDrop=function() },
if P.waiting<=0 then {
if cy~=y_img then drop=60,
P.cy=y_img target=400,
P.spinLast=false reach=Event.gameover.win,
SFX("drop") },
{
drop=60,
target=1000,
reach=Event.gameover.win,
},
},
marathon={
{
drop=1e99,
lock=1e99,
target=200,
reach=Event.marathon_reach,
},
{
drop=60,
fall=20,
target=10,
reach=Event.marathon_reach,
},
{
_20G=true,
fall=20,
target=200,
reach=Event.marathon_reach,
},
{
_20G=true,
drop=0,
lock=death_lock[1],
wait=death_wait[1],
fall=death_fall[1],
target=50,
reach=Event.marathon_reach_lunatic,
arr=1,
},
},
zen={
{
drop=1e99,
lock=1e99,
target=200,
reach=Event.gameover.win,
},
},
infinite={
{
drop=1e99,
lock=1e99,
oncehold=false,
},
},
solo={
{},
},
tsd={
{
oncehold=false,
drop=1e99,
lock=1e99,
target=1,
reach=Event.tsd_reach,
},
{
drop=60,
lock=60,
target=1,
reach=Event.tsd_reach,
},
},
blind={
{
drop=30,
lock=60,
visible=2,
},
{
drop=15,
lock=30,
visible=0,
freshLimit=10,
},
{
_20G=true,
lock=60,
visible=0,
freshLimit=15,
},
{
_20G=true,
drop=0,
lock=15,
wait=10,
fall=15,
visible=0,
arr=1,
},
},
dig={
{
drop=60,
lock=120,
fall=20,
},
{
drop=10,
lock=30,
},
},
survivor={
{
drop=60,
lock=120,
fall=30,
},
{
drop=30,
lock=60,
fall=20,
},
{
drop=10,
lock=20,
fall=15,
},
{
drop=5,
lock=15,
fall=10,
},
},
sudden={
{
oncehold=false,
drop=1e99,
lock=1e99,
target=0,
reach=Event.sudden_reach,
},
{
drop=30,
lock=60,
target=0,
reach=Event.sudden_reach,
},
{
drop=15,
lock=60,
target=0,
reach=Event.sudden_reach_hard,
},
{
drop=5,
lock=20,
target=0,
reach=Event.sudden_reach_hard,
},
},
pctrain={
{
next=4,
hold=false,
drop=120,
lock=120,
fall=20,
sequence=4,
target=0,
freshLimit=1e99,
reach=Event.newPC,
},
{
next=4,
hold=false,
drop=60,
lock=60,
fall=15,
sequence=4,
target=0,
reach=Event.newPC,
},
},
pcchallenge={
{
oncehold=false,
drop=300,
lock=1e99,
sequence=1,
target=100,
reach=Event.gameover.win,
freshLimit=1e99,
},
{
drop=60,
lock=120,
fall=10,
sequence=1,
target=100,
reach=Event.gameover.win,
},
{
drop=20,
lock=60,
fall=20,
sequence=1,
target=100,
reach=Event.gameover.win,
},
},
techmino41={
{
fall=20,
royaleMode=true,
royalePowerup={2,5,10,20},
royaleRemain={30,20,15,10,5},
pushSpeed=2,
},
},
techmino99={
{
fall=20,
royaleMode=true,
royalePowerup={2,6,14,30},
royaleRemain={75,50,35,20,10},
pushSpeed=2,
},
},
drought={
{
drop=20,
lock=30,
sequence=5,
target=100,
reach=Event.gameover.win,
},
{
drop=20,
lock=30,
sequence=6,
target=100,
reach=Event.gameover.win,
},
},
hotseat={
{},
},
custom={
{
reach=Event.gameover.win
},
},
}
modeLevel={
sprint={"10L","20L","40L","100L","400L","1000L"},
marathon={"EASY","NORMAL","EXTRA","DEATH"},
zen={"NORMAL"},
infinite={"NORMAL"},
solo={"EASY","NORMAL","HARD","LUNATIC"},
tsd={"NORMAL","HARD"},
blind={"EASY","HARD","LUNATIC","GM"},
dig={"NORMAL","LUNATIC"},
survivor={"EASY","NORMAL","HARD","LUNATIC"},
sudden={"EASY","NORMAL","HARD","LUNATIC"},
pctrain={"HARD","LUNATIC"},
pcchallenge={"NORMAL","HARD","LUNATIC"},
techmino41={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
techmino99={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
drought={"NORMAL","MESS"},
hotseat={"2P","3P","4P",},
custom={""},
}
modeLevelColor={
EASY=color.cyan,
NORMAL=color.green,
HARD=color.purple,
LUNATIC=color.red,
EXTRA=color.lightPurple,
MESS=color.lightGrey,
GM=color.blue,
ULTIMATE=color.lightYellow,
DEATH=color.lightRed,
["10L"]=color.cyan,
["20L"]=color.lightBlue,
["40L"]=color.green,
["100L"]=color.orange,
["400L"]=color.red,
["1000L"]=color.darkRed,
}
modeID={
[0]="custom",
"sprint","marathon","zen","infinite","solo","tsd","blind","dig","survivor","sudden",
"pctrain","pcchallenge","techmino41","techmino99","drought","hotseat",
}
modeName={
[0]="Custom",
"Sprint","Marathon","Zen","Infinite","1v1","TSD-only","Blind","Dig","Survivor","Sudden",
"PC Train","PC Challenge","Techmino41","Techmino99","Drought","Hotseat",
}
modeInfo={
sprint="Speed run.",
marathon="Survive and reach target",
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!",
sudden="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="",
}
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
drop()
P.keyPressing[6]=false
end end
end, end,
softDrop=function() function()
if cy~=y_img then P.cy=cy-1 end P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
P.downing=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, end,
rotRight=function()spin(1)end, function()
rotLeft=function()spin(-1)end, P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
rotFlip=function()spin(2)end, repeat i=rnd(7)until i~=P.nxt[5]
hold=function()hold()end, P.nxt[6],P.nb[6]=i,blocks[i][0]
--Player movements
restart=function()
resetGameData()
count=60+26--Althour'z neim
end, end,
insDown=function()if cy~= y_img then P.cy,P.lockDelay,P.spinLast=y_img,gameEnv.lock,false end end, function()
insLeft=function() P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
while not ifoverlap(cb,cx-1,cy)do --generate in newPC
P.cx,P.lockDelay=cx-1,gameEnv.lock end,
freshgho() 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}
for i=1,6 do
ins(P.nxt,rem(bag,rnd(7-i)))
ins(P.nb,blocks[P.nxt[#P.nxt]][0])
end
end end
end, end,
insRight=function() function()
while not ifoverlap(cb,cx+1,cy)do P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1)
P.cx,P.lockDelay=cx+1,gameEnv.lock if #P.nxt<6 then
freshgho() local bag={1,1,1,2,2,2,3,3,3,4,4,4,6,6,6,5,7}
repeat
ins(P.nxt,rem(bag,rnd(#bag)))
ins(P.nb,blocks[P.nxt[#P.nxt]][0])
until not bag[1]
end end
end, end,
down1=function()if cy~=y_img then P.cy=cy-1 end end,
down4=function()for i=1,4 do if cy~=y_img then P.cy=cy-1 else break end end end,
quit=function()Event.gameover.lose()end,
--System movements
} }
blocks={ 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]={{0,1,1},{1,1,0}},{{1,0},{1,1},{0,1}},{{0,1,1},{1,1,0}},{{1,0},{1,1},{0,1}}},
@@ -232,38 +656,38 @@ TRS={
[1]={ [1]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,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}}, [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}},
[12]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, [12]={{0,0},{1,0},{1,-1},{-1,0},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, [21]={{0,0},{-1,0},{-1,1},{1,0},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, [23]={{0,0},{1,0},{1,1},{1,-1},{0,-2},{1,-2}},
[32]={{0,0},{-1,0},{-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}}, [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}},
[03]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{0,1}},
[02]={{0,0},{1,0},{-1,0},{0,-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}}, [20]={{0,0},{-1,0},{1,0},{0,1},{0,-1}},
[13]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}}, [13]={{0,0},{0,-1},{0,1},{-1,0}},
[31]={{0,0},{0,1},{0,-1},{1,0},{-1,0},{0,2}}, [31]={{0,0},{0,1},{0,-1},{1,0}},
}, },--Z/J
[2]={ [2]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[10]={{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},{0,2},{1,2}}, [12]={{0,0},{1,0},{1,-1},{1,1},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-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},{0,-2},{1,-2}}, [23]={{0,0},{1,0},{1,1},{-1,0},{0,-2},{1,-2}},
[32]={{0,0},{-1,0},{-1,-1},{0,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}}, [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},{0,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}}, [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
[20]={{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}}, [13]={{0,0},{0,1},{0,-1},{1,0}},
[31]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}}, [31]={{0,0},{0,-1},{0,1},{-1,0}},
}, },--S/L
[5]={ [5]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, [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}}, [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1},{1,1}},
[12]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, [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}}, [21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{1,1}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, [23]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{-1,1}},
[32]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, [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}}, [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}}, [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{0,1}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
@@ -291,37 +715,56 @@ Buttons={
load={}, load={},
intro={}, intro={},
main={ main={
{x=250,y=300,w=330,h=60,rgb=color.red,t="Play",code=function()gotoScene("mode")end,down=2}, {x=250,y=250,w=350,h=100,rgb=color.red,f=55,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=250,y=360,w=350,h=100,rgb=color.blue,f=50,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=160,y=470,w=170,h=100,rgb=color.yellow,f=50,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=340,y=470,w=170,h=100,rgb=color.cyan,f=40,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=function()gotoScene("quit")end,up=3}, {x=250,y=580,w=350,h=100,rgb=color.grey,f=40,t="Quit",code=function()gotoScene("quit")end,up=3},
}, },
mode={ mode={
{x=1000,y=210,w=200,h=140,rgb=color.white,hide=function()return not setting.virtualkeySwitch end,code=function()if modeSel>1 then modeSel=modeSel-1 end end}, {x=1000,y=210,w=200,h=140,rgb=color.white,hide=function()return modeSel==1 end,t="Λ",f=64,code=function()keyDown.mode("up")end},
{x=1000,y=430,w=200,h=140,rgb=color.white,t="v",f=80,hide=function()return not setting.virtualkeySwitch end,code=function()if modeSel<#modeID then modeSel=modeSel+1 end end}, {x=1000,y=430,w=200,h=140,rgb=color.white,hide=function()return modeSel==#modeID end,t="v",f=80,code=function()keyDown.mode("down")end},
{x=1000,y=600,w=180,h=80,rgb=color.green,t="Start",code=function()startGame(modeID[modeSel])end}, {x=190,y=160,w=100,h=80,rgb=color.white,hide=function()return levelSel==1 end,t="<",code=function()keyDown.mode("left")end},
{x=640,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()gotoScene("main")end}, {x=350,y=160,w=100,h=80,rgb=color.white,hide=function()return levelSel==#modeLevel[modeID[modeSel]] end,t=">",code=function()keyDown.mode("right")end},
{x=1000,y=600,w=250,h=100,rgb=color.green,f=50,t="Start",code=function()loadGame(modeSel,levelSel)end},
{x=270,y=540,w=190,h=85,rgb=color.yellow,t="Custom(c)",code=function()gotoScene("custom")end},
{x=640,y=630,w=230,h=90,rgb=color.white,f=45,t="Back",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()loadGame(0,1)end},
{x=640,y=630,w=180,h=60,rgb=color.white,t="Back",code=back},
}, },
play={ play={
}, },
setting={--Normal setting 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=285,y=90,w=210,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}, {x=505,y=90,w=210,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 --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=205,y=180,w=50,h=50,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=370,y=180,w=50,h=50,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=420,y=180,w=50,h=50,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}, {x=585,y=180,w=50,h=50,rgb=color.white,t="+",code=function()setting.arr=(setting.arr+1)%16 end,up=2,down=10,left=5,right=13},
--3~6 --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=205,y=260,w=50,h=50,rgb=color.white,t="-",code=function()setting.sddas=(setting.sddas-1)%11 end,up=3,down=13,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=370,y=260,w=50,h=50,rgb=color.white,t="+",code=function()setting.sddas=(setting.sddas+1)%11 end,up=4,down=13,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=420,y=260,w=50,h=50,rgb=color.white,t="-",code=function()setting.sdarr=(setting.sdarr-1)%4 end,up=5,down=13,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}, {x=585,y=260,w=50,h=50,rgb=color.white,t="+",code=function()setting.sdarr=(setting.sdarr+1)%4 end,up=6,down=13,left=9,right=14},
--7~10 --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=760,y=90,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=940,y=90,w=160,h=60,rgb=color.white,t=function()return setting.bgm and"BGM:on"or"BGM:off"end,code=function()
{x=870,y=180,w=340,h=60,rgb=color.white,t=function()return setting.fullscreen and"Fullscreen:on"or"Fullscreen:off"end, BGM()
setting.bgm=not setting.bgm
BGM("blank")
end,down=13,left=6},
{x=850,y=160,w=340,h=60,rgb=color.white,t=function()return "Vibrate level:"..setting.vib end,code=function()
setting.vib=(setting.vib+1)%5
VIB(2)
end,up=11,down=14,left=6},
{x=850,y=230,w=340,h=60,rgb=color.white,t=function()return setting.fullscreen and"Fullscreen:on"or"Fullscreen:off"end,
code=function() code=function()
setting.fullscreen=not setting.fullscreen setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen) love.window.setFullscreen(setting.fullscreen)
@@ -329,9 +772,9 @@ Buttons={
love.resize(gc.getWidth(),gc.getHeight()) love.resize(gc.getWidth(),gc.getHeight())
end end
end, end,
up=11,down=14,left=6 up=13,down=15,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, {x=850,y=300,w=340,h=60,rgb=color.white,t=function()return setting.bgblock and"BG animation:on"or"BG animation:off"end,
code=function() code=function()
setting.bgblock=not setting.bgblock setting.bgblock=not setting.bgblock
if not setting.bgblock then if not setting.bgblock then
@@ -340,32 +783,32 @@ Buttons={
end end
end end
end, end,
up=12,down=15,left=10 up=14,down=16,left=10
}, },
{x=850,y=370,w=340,h=60,rgb=color.white,t=function()return"frameDraw:"..setting.frameMul.."%"end,code=function()
--11~14
{x=870,y=340,w=340,h=60,rgb=color.white,t=function()return"frameDraw:"..setting.frameMul.."%"end,code=function()
setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10) setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10)
if setting.frameMul>100 then setting.frameMul=25 end if setting.frameMul>100 then setting.frameMul=25 end
end,up=14,down=16}, end,up=15,down=17},
{x=870,y=420,w=340,h=60,rgb=color.green,t="Control settings",code=function()gotoScene("setting2")end,up=15,down=17}, --11~16
{x=870,y=500,w=340,h=60,rgb=color.yellow,t="Touch settings",code=function()gotoScene("setting3")end,up=16,down=18}, {x=850,y=440,w=340,h=60,rgb=color.green,t="Control settings",code=function()gotoScene("setting2")end,up=16,down=18},
{x=640,y=640,w=210,h=60,rgb=color.white,t="Save&Back",code=function()back()end,up=17}, {x=850,y=510,w=340,h=60,rgb=color.yellow,t="Touch settings",code=function()gotoScene("setting3")end,up=17,down=19},
--15~18 {x=640,y=620,w=300,h=70,rgb=color.white,t="Save&Back",code=back,up=18},
--17~19
}, },
setting2={--Control setting setting2={--Control setting
{x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()keysetting=nil;back()end}, {x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=back},
}, },
setting3={--Touch setting setting3={--Touch setting
{x=640,y=410,w=170,h=80,t="Back",code=function()back()end}, {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() {x=640,y=210,w=500,h=80,t=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,code=function()
setting.virtualkeySwitch=not setting.virtualkeySwitch setting.virtualkeySwitch=not setting.virtualkeySwitch
end}, end},
{x=450,y=310,w=170,h=80,t="Reset",code=function() {x=450,y=310,w=170,h=80,t="Defaults",code=function()
for K=1,#virtualkey do 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] b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4]
end--Reset virtualkey end--Default virtualkey
defaultSel=defaultSel%5+1
end}, end},
{x=640,y=310,w=170,h=80,t=function()return snapLevelName[snapLevel]end,code=function() {x=640,y=310,w=170,h=80,t=function()return snapLevelName[snapLevel]end,code=function()
snapLevel=snapLevel%6+1 snapLevel=snapLevel%6+1
@@ -388,11 +831,11 @@ Buttons={
end}, end},
}, },
help={ help={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end,right=2}, {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}, {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},
}, },
stat={ stat={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end}, {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=back},
}, },
sel=nil,--selected button id(integer) sel=nil,--selected button id(integer)
} }
@@ -411,6 +854,7 @@ virtualkey={
{1280-80,720-80,6400,80},--hardDrop {1280-80,720-80,6400,80},--hardDrop
{1280-80,720-240,6400,80},--softDrop {1280-80,720-240,6400,80},--softDrop
{1280-80,720-400,6400,80},--hold {1280-80,720-400,6400,80},--hold
{80,360,6400,80},--swap
{80,80,6400,80},--restart {80,80,6400,80},--restart
--[[ --[[
{x=0,y=0,r=0},--toLeft {x=0,y=0,r=0},--toLeft
@@ -418,9 +862,78 @@ virtualkey={
{x=0,y=0,r=0},--toDown {x=0,y=0,r=0},--toDown
]] ]]
} }
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},--swap
{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},--swap
{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},--swap
{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},--swap
{80,320,6400,80},--restart
},--Keyboard set
{
{1280-360,40,1600,40},--moveLeft
{1280-280,40,1600,40},--moveRight
{1280-520,40,1600,40},--rotRight
{1280-600,40,1600,40},--rotLeft
{1280-440,40,1600,40},--rotFlip
{1280-40,40,1600,40},--hardDrop
{1280-120,40,1600,40},--softDrop
{1280-200,40,1600,40},--hold
{1280-680,40,1600,40},--swap
{-10,-10,0,0},--restart
},--PC key feedback
}
Text={ Text={
load={"Loading textures","Loading BGM","Loading SFX","Finished",}, load={"Loading textures","Loading BGM","Loading SFX","Finished",},
tips={
"The whole game is made by MrZ!",
"Back to Back 8 combo Techrash PC!",
"Techmino has a Nspire-CX edition!",
"Is B2B2B2B possible?",
"MrZ spin Penta!",
},
stat={ stat={
"Games run:", "Games run:",
"Games played:", "Games played:",
@@ -435,7 +948,7 @@ Text={
}, },
help={ help={
"I think you don't need \"help\".", "I think you don't need \"help\".",
"THIS IS NOT TETRIS,and SRS NOT USED.", "THIS IS ONLY A SMALL BLOCK GAME",
"But just play like playing TOP/C2/KOS/TGM3", "But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,so DO NOT DISTIRBUTE", "Game is not public now,so DO NOT DISTIRBUTE",
"", "",
@@ -443,7 +956,7 @@ Text={
"Author:MrZ E-mail:1046101471@qq.com", "Author:MrZ E-mail:1046101471@qq.com",
"Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ", "Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ",
"Tool used:VScode,GFIE,Beepbox,Goldwave", "Tool used:VScode,GFIE,Beepbox,Goldwave",
"Special thanks:farter,teatube,flyz,and YOU!!", "Special thanks:Farter,Teatube,196,Flyz,T830,[all test staff] and YOU!",
"Any bugs/suggestions to my E-mail.", "Any bugs/suggestions to my E-mail.",
}, },
} }

895
main.lua

File diff suppressed because it is too large Load Diff

526
paint.lua
View File

@@ -12,11 +12,12 @@ swapDeck_data={
swap={ swap={
none={2,1,d=function()end}, none={2,1,d=function()end},
flash={8,1,d=function()gc.clear(1,1,1)end}, flash={8,1,d=function()gc.clear(1,1,1)end},
deck={42,1,d=function() deck={50,8,d=function()
local t=sceneSwaping.time local t=sceneSwaping.time
gc.setColor(1,1,1) gc.setColor(1,1,1)
if t>6 then if t>8 then
for i=1,43-t do local t=max(t,15)
for i=1,51-t do
local bn=swapDeck_data[i][1] local bn=swapDeck_data[i][1]
local b=blocks[bn][swapDeck_data[i][2]] local b=blocks[bn][swapDeck_data[i][2]]
local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4] local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4]
@@ -26,8 +27,10 @@ swap={
end end
end end end end
end end
else end
gc.clear(1,1,1) if t<17 then
gc.setColor(1,1,1,(8-abs(t-8))*.125)
gc.rectangle("fill",0,0,1280,720)
end end
end end
}, },
@@ -51,8 +54,8 @@ FX={
gc.push("transform") gc.push("transform")
setFont(t.font) setFont(t.font)
gc.translate(150,250+t.dy) gc.translate(150,250+t.dy)
gc.setColor(1,1,1,a)
if t.t<20 then gc.scale((20-t.t)*.015+1,1)end if t.t<20 then gc.scale((20-t.t)*.015+1,1)end
gc.setColor(1,1,1,a)
mStr(t.text,0,-t.font*.5) mStr(t.text,0,-t.font*.5)
gc.pop() gc.pop()
end, end,
@@ -60,46 +63,63 @@ FX={
gc.push("transform") gc.push("transform")
setFont(t.font) setFont(t.font)
gc.translate(150,290+t.dy) gc.translate(150,290+t.dy)
gc.setColor(1,1,1,a)
if t.t<20 then gc.shear((20-t.t)*.05,0)end if t.t<20 then gc.shear((20-t.t)*.05,0)end
mStr(t.text,0,-t.font*.5) gc.setColor(1,1,1,a)
mStr(t.text,0,-t.font*.5-15)
gc.pop() gc.pop()
end, end,
spin=function(t,a) spin=function(t,a)
gc.push("transform") gc.push("transform")
setFont(t.font) setFont(t.font)
gc.translate(150,250+t.dy) gc.translate(150,250+t.dy)
gc.setColor(1,1,1,a)
if t.t<20 then if t.t<20 then
gc.rotate((20-t.t)^2*.0015) gc.rotate((20-t.t)^2*.0015)
end end
mStr(t.text,0,-t.font*.5) gc.setColor(1,1,1,a)
mStr(t.text,0,-t.font*.5-8)
gc.pop() gc.pop()
end, end,
flicker=function(t,a) flicker=function(t,a)
setFont(t.font) setFont(t.font)
gc.setColor(1,1,1,a*(rnd()+.5)) gc.setColor(1,1,1,a*(rnd()+.5))
mStr(t.text,150,250-t.font*.5+t.dy) mStr(t.text,150,225-t.font*.5+t.dy)
end, end,
zoomout=function(t,a) zoomout=function(t,a)
gc.push("transform") gc.push("transform")
setFont(t.font) setFont(t.font)
gc.translate(150,290+t.dy)
gc.setColor(1,1,1,a)
local k=t.t^.5*.2+1 local k=t.t^.5*.2+1
gc.translate(150,290+t.dy)
gc.scale(k,k) gc.scale(k,k)
mStr(t.text,0,-t.font*.5) gc.setColor(1,1,1,a)
mStr(t.text,0,-t.font*.5-5)
gc.pop() gc.pop()
end end,
beat=function(t,a)
gc.push("transform")
setFont(t.font)
gc.translate(150,290+t.dy)
if t.t<20 then
local k=.2*(5+(25-t.t)^.5)-.5
gc.scale(k,k)
end
gc.setColor(1,1,1,a)
mStr(t.text,0,-t.font*.5-5)
gc.pop()
end,
} }
function updateButton()
for i=1,#Buttons[scene]do
local B=Buttons[scene][i]
local t=i==Buttons.sel and .4 or 0
B.alpha=abs(B.alpha-t)>.02 and(B.alpha+(B.alpha<t and .02 or -.02))or t
if B.alpha>t then B.alpha=B.alpha-.02 elseif B.alpha<t then B.alpha=B.alpha+.02 end
end
end
function drawButton() function drawButton()
for i=1,#Buttons[scene]do for i=1,#Buttons[scene]do
local B=Buttons[scene][i] local B=Buttons[scene][i]
if not(B.hide and B.hide())then if not(B.hide and B.hide())then
local t=i==Buttons.sel and .3 or 0
B.alpha=abs(B.alpha-t)>.02 and(B.alpha+(B.alpha<t and .02 or -.02))or t
if B.alpha>t then B.alpha=B.alpha-.02 elseif B.alpha<t then B.alpha=B.alpha+.02 end
local C=B.rgb or color.white local C=B.rgb or color.white
gc.setColor(C[1],C[2],C[3],B.alpha) gc.setColor(C[1],C[2],C[3],B.alpha)
gc.rectangle("fill",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h) gc.rectangle("fill",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h)
@@ -110,7 +130,7 @@ function drawButton()
if t then if t then
if type(t)=="function"then t=t()end if type(t)=="function"then t=t()end
setFont(B.f or 40) setFont(B.f or 40)
y0=B.y-1-currentFont*.5 y0=B.y-7-currentFont*.5
mStr(t,B.x-1,y0) mStr(t,B.x-1,y0)
mStr(t,B.x+1,y0) mStr(t,B.x+1,y0)
mStr(t,B.x-1,y0+2) mStr(t,B.x-1,y0+2)
@@ -120,236 +140,269 @@ function drawButton()
if t then if t then
mStr(t,B.x,y0+1) mStr(t,B.x,y0+1)
end end
gc.setLineWidth(3)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h) gc.setLineWidth(3)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
end end
end end
end end
function drawDial(x,y,speed) function drawDial(x,y,speed)
gc.push("transform") gc.setColor(1,1,1)
gc.translate(x,y) mStr(int(speed),x,y-18)
gc.setColor(1,1,1) gc.draw(dialCircle,x,y,nil,nil,nil,32,32)
mStr(int(speed),0,-14) gc.setColor(1,1,1,.6)
gc.draw(dialCircle,0,0,nil,nil,nil,32,32) gc.draw(dialNeedle,x,y,2.094+(speed<=175 and .02094*speed or 4.712-52.36/(speed-125)),nil,nil,5,4)
gc.setColor(1,1,1,.6)
gc.draw(dialNeedle,0,0,2.0944+(speed<=175 and .020944*speed or 4.712389-52.35988/(speed-125)),nil,nil,5,4)
gc.pop()
end end
function drawPixel(y,x,id,alpha) function drawPixel(y,x,id,alpha)
gc.setColor(1,1,1,alpha) gc.setColor(1,1,1,alpha)
gc.draw(blockSkin[id],30*x-30,600-30*y) gc.draw(blockSkin[id],30*x-30,600-30*y)
end end
function drawVirtualkey(s) function drawPixelmini(y,x,id)
gc.setLineWidth(10) gc.draw(blockSkinmini[id],30*x-30,600-30*y,nil,5)
if s then end
for i=1,#virtualkey do function VirtualkeyPreview()
gc.setColor(1,s==i and 0 or 1,s==i and 0 or 1,setting.virtualkeyAlpha*.2) for i=1,#virtualkey do
local b=virtualkey[i] gc.setColor(1,sel==i and .5 or 1,sel==i and .5 or 1,setting.virtualkeyAlpha*.2)
gc.circle("line",b[1],b[2],b[4]-5) local b=virtualkey[i]
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,2*b[4]*.0125,nil,18,18)end gc.setLineWidth(b[4]*.08)
end gc.circle("line",b[1],b[2],b[4]-5)
else if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,2*b[4]*.0125,nil,18,18)end
gc.setColor(1,1,1,setting.virtualkeyAlpha*.2) end
for i=1,#virtualkey do end
local b=virtualkey[i] function drawVirtualkey()
gc.circle("line",b[1],b[2],b[4]-5) local a=setting.virtualkeyAlpha*.2
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,2*b[4]*.0125,nil,18,18)end local P=players[1]
for i=1,#virtualkey do
local p=P.isKeyDown[i]
local b=virtualkey[i]
if p then
gc.setColor(.75,.75,1,a)
else
gc.setColor(1,1,1,a)
end end
gc.setLineWidth(b[4]*.08)
gc.circle("line",b[1],p and b[2]+15 or b[2],b[4]-5)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],p and b[2]+15 or b[2],nil,b[4]*.025,nil,18,18)end
end end
end end
Pnt={BG={}} Pnt={}
function Pnt.BG.none() Pnt.BG={
gc.clear(.2,.2,.2) none=function()
end gc.clear(.2,.2,.2)
function Pnt.BG.glow() end,
local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05 glow=function()
gc.clear(t,t,t) local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05
end gc.clear(t,t,t)
function Pnt.BG.game1() end,
gc.setColor(1,1,1) game1=function()
gc.draw(background[1],640,360,Timer()*.15,12,nil,64,64) gc.setColor(1,1,1)
end gc.draw(background[1],640,360,Timer()*.15,12,nil,64,64)
function Pnt.BG.game2() end,
gc.setColor(1,.5,.5) game2=function()
gc.draw(background[1],640,360,Timer()*.2,12,nil,64,64) gc.setColor(1,.5,.5)
end gc.draw(background[1],640,360,Timer()*.2,12,nil,64,64)
function Pnt.BG.game3() end,
gc.setColor(.6,.6,1) game3=function()
gc.draw(background[1],640,360,Timer()*.25,12,nil,64,64) gc.setColor(.6,.6,1)
end gc.draw(background[1],640,360,Timer()*.25,12,nil,64,64)
function Pnt.BG.rgb() end,
gc.clear( rgb=function()
sin(Timer()*1.2)*.15+.5, gc.clear(
sin(Timer()*1.5)*.15+.5, sin(Timer()*1.2)*.15+.5,
sin(Timer()*1.9)*.15+.5 sin(Timer()*1.5)*.15+.5,
) sin(Timer()*1.9)*.15+.5
end )
function Pnt.BG.strap() end,
gc.setColor(1,1,1) strap=function()
local x=Timer()%32*40 gc.setColor(1,1,1)
gc.draw(background[2],x,0,nil,10) local x=Timer()%32*40
gc.draw(background[2],x-1280,0,nil,10) gc.draw(background[2],x,0,nil,10)
end gc.draw(background[2],x-1280,0,nil,10)
end,
matrix=function()
for i=0,15 do
for j=0,8 do
-- local t=sin(Timer()*((2.468*i-1.357*j)%3))*.3
local t=(sin((mt.noise(i,j)+2)*Timer())+1)*.2
gc.setColor(t,t,t)
gc.rectangle("fill",80*i,80*j,80,80)
end
end
end,
}
function Pnt.load() function Pnt.load()
gc.setLineWidth(4) gc.setLineWidth(4)
gc.setColor(1,1,1,.5) gc.setColor(1,1,1,.5)
gc.rectangle("fill",340,340,loadprogress*640,40) gc.rectangle("fill",300,330,loadprogress*680,60)
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.rectangle("line",340,340,640,40) gc.rectangle("line",300,330,680,60)
setFont(30) setFont(40)
mStr(Text.load[loading],640,345) mStr(Text.load[loading],640,335)
setFont(20) setFont(25)
mStr("not animation,real loading!",640,392) mStr("not animation,real loading!",640,400)
end
function Pnt.intro()
gc.push()
gc.translate(250,150)
gc.scale(30)
gc.stencil(stencil_miniTitle,"replace",1)
gc.setStencilTest("equal",1)
gc.setColor(1,1,1,min(count,80)*.005)
gc.rectangle("fill",0,0,26,14)
gc.pop()
gc.setColor(1,1,1)
gc.setColor(1,1,1,.125)
for i=19,5,-2 do
gc.setLineWidth(i)
gc.line(250+(count-80)*25,150,(count-80)*25-150,570)
end
gc.setStencilTest()
end end
function Pnt.main() function Pnt.main()
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(30) setFont(30)
gc.print("Alpha V0.68",370,150) gc.print("Alpha V0.7.7",370,140)
gc.print(system,530,110) gc.print(system,530,110)
gc.draw(titleImage,30,30) gc.draw(titleImage,30,30)
end end
function Pnt.mode() function Pnt.mode()
if setting.virtualkeySwitch then setFont(40)
gc.setColor(.5,.5,.5) gc.setColor(modeLevelColor[modeLevel[modeID[modeSel]][levelSel]]or color.white)
gc.draw(charV,1019,249,pi) mStr(modeLevel[modeID[modeSel]][levelSel],270,215)
gc.draw(charV,1021,249,pi)
gc.draw(charV,1019,251,pi)
gc.draw(charV,1020,251,pi)
gc.setColor(1,1,1)
gc.draw(charV,1020,250,pi)
end
gc.setColor(1,1,1)
setFont(30) setFont(30)
mStr(modeInfo[modeID[modeSel]],270,300) gc.setColor(color.white)
mStr(modeInfo[modeID[modeSel]],270,255)
setFont(80) setFont(80)
gc.setColor(color.grey) gc.setColor(color.grey)
mStr(modeName[modeSel],643,283) mStr(modeName[modeSel],643,273)
for i=modeSel-2,modeSel+2 do for i=modeSel-2,modeSel+2 do
if i>=1 and i<=#modeID then if i>=1 and i<=#modeID then
local f=80-abs(i-modeSel)*20 local f=80-abs(i-modeSel)*20
gc.setColor(i==modeSel and color.white or abs(i-modeSel)==1 and color.grey or color.darkGrey) gc.setColor(i==modeSel and color.white or abs(i-modeSel)==1 and color.grey or color.darkGrey)
setFont(f) setFont(f)
mStr(modeName[i],640,320+70*(i-modeSel)-f*.5) mStr(modeName[i],640,310+70*(i-modeSel)-f*.5)
end end
end end
end end
function Pnt.custom()
setFont(80)
gc.setColor(color.lightGrey)
gc.print("Custom Game",20,20)
gc.setColor(color.white)
gc.print("Custom Game",22,23)
setFont(40)
for i=1,#customID do
local k=customID[i]
local y=90+40*i
gc.print(customOption[k],50,y)
if customVal[k]then
gc.print(customVal[k][customSel[k]],350,y)
else
gc.print(customRange[k][customSel[k]],350,y)
end
end
gc.print("",10,90+40*optSel)
end
function Pnt.play() function Pnt.play()
for p=1,#players do for p=1,#players do
P=players[p] P=players[p]
setmetatable(_G,P.index)
if P.small then if P.small then
gc.push("transform") gc.push("transform")
gc.translate(x,y)gc.scale(size)--Scale gc.translate(P.x,P.y)gc.scale(P.size)--Scale
gc.setColor(0,0,0,.5)gc.rectangle("fill",0,0,300,600)--Black Background gc.setColor(0,0,0,.4)gc.rectangle("fill",0,0,300,600)--Black Background
gc.setLineWidth(13) gc.setLineWidth(13)
gc.stencil(stencil_field_small, "replace",1) gc.stencil(stencil_field_small,"replace",1)
gc.translate(0,fieldBeneath) gc.translate(0,P.fieldBeneath)
gc.setStencilTest("equal",1) gc.setStencilTest("equal",1)
for j=1,#field do gc.setColor(1,1,1,P.result and max(20-P.endCounter,0)*.05 or 1)
if falling<=0 or without(clearing,j)then for j=int(P.fieldBeneath/30+1),#P.field do
for i=1,10 do if P.falling<=0 or without(P.clearing,j)then
if field[j][i]>0 then for i=1,10 do
drawPixel(j,i,field[j][i],min(visTime[j][i],20)*.05) if P.field[j][i]>0 then
end drawPixelmini(j,i,P.field[j][i])
end end
end end
end--Field end
gc.setColor(1,1,1) end
gc.draw(PTC.dust[p])--Draw game field
gc.setStencilTest()--In-playField mask gc.setStencilTest()--In-playField mask
gc.translate(0,-fieldBeneath) gc.translate(0,-P.fieldBeneath)
gc.setColor(frameColor[P.strength])gc.rectangle("line",-7,-7,314,614)--Draw boarder gc.setColor(frameColor[P.strength])gc.rectangle("line",-7,-7,314,614)--Draw boarder
if modeEnv.royaleMode then
gc.setColor(1,1,1)
for i=1,P.strength do
gc.draw(badgeIcon,61*i-47,15,nil,3)
end
end
if P.result then if P.result then
gc.setColor(1,1,1,min(P.counter,60)*.01) gc.setColor(1,1,1,min(P.endCounter,60)*.01)
setFont(100) setFont(100)
mStr(P.result,150,250) mStr(P.result,150,235)
else if P.killMark then
local h=0 gc.setLineWidth(20)
for i=1,#atkBuffer do gc.setColor(1,0,0,min(P.endCounter,25)*.04)
local a=atkBuffer[i] gc.circle("line",150,300,420-10*min(P.endCounter,30))
local bar=a.amount*30 end
if not a.sent then
if a.countdown>0 then
gc.setColor(attackColor[a.lv][1])
gc.rectangle("fill",315,600-h,8,-bar+5)
gc.setColor(attackColor[a.lv][2])
gc.rectangle("fill",315,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0))
--Timing
else
attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5)
gc.rectangle("fill",315,600-h,8,-bar+5)
--Warning
end
end
h=h+bar
if h>600 then break end
end--Buffer line
gc.setColor(b2b<100 and color.white or b2b<=480 and color.lightRed or color.lightBlue)
gc.rectangle("fill",-15,600,10,-b2b)
--B2B bar
end end
gc.pop() gc.pop()
else else
gc.push("transform") gc.push("transform")
gc.translate(x,y)gc.scale(size)--Scale gc.translate(P.x,P.y)gc.scale(P.size)--Scale
gc.setColor(0,0,0,.7)gc.rectangle("fill",0,0,600,690)--Black Background gc.setColor(0,0,0,.6)gc.rectangle("fill",0,0,600,690)--Black Background
gc.setLineWidth(7) gc.setLineWidth(7)
gc.setColor(frameColor[P.strength])gc.rectangle("line",0,0,600,690)--Big frame gc.setColor(frameColor[P.strength])gc.rectangle("line",0,0,600,690)--Big frame
gc.translate(150,70) gc.stencil(stencil_field,"replace", 1)
gc.stencil(stencil_field, "replace", 1) gc.translate(150,70+P.fieldBeneath)
gc.translate(0,fieldBeneath)
gc.setStencilTest("equal",1) gc.setStencilTest("equal",1)
for j=1,#field do for j=int(P.fieldBeneath/30+1),#P.field do
if falling<=0 or without(clearing,j)then if P.falling<=0 or without(P.clearing,j)then
for i=1,10 do for i=1,10 do
if field[j][i]>0 then if P.field[j][i]>0 then
drawPixel(j,i,field[j][i],min(visTime[j][i],20)*.05) drawPixel(j,i,P.field[j][i],min(P.visTime[j][i],20)*.05)
end end
end end
else else
gc.setColor(1,1,1,falling/gameEnv.fall) gc.setColor(1,1,1,P.falling/P.gameEnv.fall)
gc.rectangle("fill",0,600-30*j,320,30) gc.rectangle("fill",0,600-30*j,320,30)
end end
end--Field end--Field
if waiting<=0 then if P.waiting<=0 then
if gameEnv.ghost then if P.gameEnv.ghost then
for i=1,r do for j=1,c do for i=1,P.r do for j=1,P.c do
if cb[i][j]>0 then if P.cb[i][j]>0 then
drawPixel(i+y_img-1,j+cx-1,bn,.3) drawPixel(i+P.y_img-1,j+P.cx-1,P.bn,.3)
end end
end end end end
end--Ghost end--Ghost
gc.setColor(1,1,1,lockDelay/gameEnv.lock) gc.setColor(1,1,1,P.lockDelay/P.gameEnv.lock)
for i=1,r do for j=1,c do for i=1,P.r do for j=1,P.c do
if cb[i][j]>0 then if P.cb[i][j]>0 then
gc.rectangle("fill",30*(j+cx-1)-34,596-30*(i+cy-1),38,38) gc.rectangle("fill",30*(j+P.cx-1)-34,596-30*(i+P.cy-1),38,38)
end end
end end--BlockShade(lockdelay indicator) end end--BlockShade(lockdelay indicator)
for i=1,r do for j=1,c do for i=1,P.r do for j=1,P.c do
if cb[i][j]>0 then if P.cb[i][j]>0 then
drawPixel(i+cy-1,j+cx-1,bn,1) drawPixel(i+P.cy-1,j+P.cx-1,P.bn,1)
end end
end end--Block end end--Block
if gameEnv.center then if P.gameEnv.center then
local x=30*(cx+sc[2]-1)-30+15 local x=30*(P.cx+P.sc[2]-1)-30+15
gc.draw(spinCenter,x,600-30*(cy+sc[1]-1)+15,nil,nil,nil,4,4) gc.draw(spinCenter,x,600-30*(P.cy+P.sc[1]-1)+15,nil,nil,nil,4,4)
gc.setColor(1,1,1,.5) gc.setColor(1,1,1,.5)
gc.draw(spinCenter,x,600-30*(y_img+sc[1]-1)+15,nil,nil,nil,4,4) gc.draw(spinCenter,x,600-30*(P.y_img+P.sc[1]-1)+15,nil,nil,nil,4,4)
end--Rotate center end--Rotate center
end end
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(PTC.dust[p])--Draw game field gc.draw(PTC.dust[p])--Draw game field
gc.setStencilTest()--In-playField mask gc.setStencilTest()--In-playField mask
gc.translate(0,-fieldBeneath) gc.translate(0,-P.fieldBeneath)
gc.setColor(1,1,1)gc.rectangle("line",-3,-13,306,616)--Draw boarder gc.setLineWidth(5)
gc.setColor(1,1,1)gc.rectangle("line",-2,-12,304,614)--Draw boarder
local h=0 local h=0
for i=1,#atkBuffer do for i=1,#P.atkBuffer do
local a=atkBuffer[i] local a=P.atkBuffer[i]
local bar=a.amount*30 local bar=a.amount*30
if h+bar>600 then bar=600-h end
if not a.sent then if not a.sent then
if a.time<20 then if a.time<20 then
bar=bar*(20*a.time)^.5*.05 bar=bar*(20*a.time)^.5*.05
@@ -357,57 +410,61 @@ function Pnt.play()
end end
if a.countdown>0 then if a.countdown>0 then
gc.setColor(attackColor[a.lv][1]) gc.setColor(attackColor[a.lv][1])
gc.rectangle("fill",308,600-h,8,-bar+5) gc.rectangle("fill",307,600-h,12,-bar+5)
gc.setColor(attackColor[a.lv][2]) gc.setColor(attackColor[a.lv][2])
gc.rectangle("fill",308,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0)) gc.rectangle("fill",307,600-h+(-bar+5),12,-(-bar+5)*(1-a.countdown/a.cd0))
--Timing --Timing
else else
attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5) attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5)
gc.rectangle("fill",308,600-h,8,-bar+5) gc.rectangle("fill",307,600-h,12,-bar+5)
--Warning --Warning
end end
else else
gc.setColor(attackColor[a.lv][1]) gc.setColor(attackColor[a.lv][1])
bar=bar*(20-a.time)*.05 bar=bar*(20-a.time)*.05
gc.rectangle("fill",308,600-h,8,-bar+5) gc.rectangle("fill",307,600-h,12,-bar+3)
--Disappear --Disappear
end end
h=h+bar h=h+bar
if h>600 then break end
end--Buffer line end--Buffer line
gc.setColor(b2b<100 and color.white or b2b<=500 and color.lightRed or color.lightBlue) gc.setColor(P.b2b<40 and color.white or P.b2b<=480 and color.lightRed or color.lightBlue)
gc.rectangle("fill",-17,600,10,-b2b1) gc.rectangle("fill",-17,600,10,-P.b2b1)
gc.setColor(color.red) gc.setColor(color.red)
gc.rectangle("fill",-23,600-100,16,5) gc.rectangle("fill",-23,600-40,16,5)
gc.setColor(color.blue) gc.setColor(color.blue)
gc.rectangle("fill",-23,600-500,16,5) gc.rectangle("fill",-23,600-480,16,5)
--B2B bar --B2B bar
setFont(40) setFont(40)
gc.setColor(1,1,1) gc.setColor(1,1,1)
if gameEnv.hold then if P.gameEnv.hold then
gc.print("Hold",-113,0) gc.print("Hold",-115,-10)
for i=1,#hb do for i=1,#P.hb do
for j=1,#hb[1] do for j=1,#P.hb[1] do
if hb[i][j]>0 then if P.hb[i][j]>0 then
drawPixel(i+17.5-#hb*.5,j-2.5-#hb[1]*.5,holded and 13 or hn,1) drawPixel(i+17.5-#P.hb*.5,j-2.5-#P.hb[1]*.5,P.holded and 13 or P.hn,1)
end end
end end
end end
end--Hold end--Hold
gc.print("Next",336,0) gc.print("Next",336,-10)
for N=1,gameEnv.next do for N=1,P.gameEnv.next do
local b=nb[N] local b=P.nb[N]
for i=1,#b do for i=1,#b do
for j=1,#b[1] do for j=1,#b[1] do
if b[i][j]>0 then if b[i][j]>0 then
drawPixel(i+20-2.4*N-#b*.5,j+12.5-#b[1]*.5,nxt[N],1) drawPixel(i+20-2.4*N-#b*.5,j+12.5-#b[1]*.5,P.nxt[N],1)
end end
end end
end end
end--Next end--Next
if count then setFont(30)
gc.setColor(.8,.8,.8)
gc.print(curMode.modeName,-135,-65)
gc.printf(curMode.levelName,240,-65,200,"right")
if frame<180 then
local count=179-frame
gc.push("transform") gc.push("transform")
gc.translate(155,220) gc.translate(155,220)
gc.setColor(1,1,1) gc.setColor(1,1,1)
@@ -416,23 +473,31 @@ function Pnt.play()
mStr(int(count/60+1),0,0) mStr(int(count/60+1),0,0)
gc.pop() gc.pop()
end--Draw starting counter end--Draw starting counter
for i=1,#bonus do for i=1,#P.bonus do
bonus[i]:draw(min((30-abs(bonus[i].t-30))*.05,1)*(not bonus[i].solid and #field>(9-bonus[i].dy*.03333)and .7 or 1)) P.bonus[i]:draw(min((30-abs(P.bonus[i].t-30))*.05,1)*(not P.bonus[i].inf and #P.field>(9-P.bonus[i].dy*.0333)and .7 or 1))
end--Effects end--Effects
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(40) setFont(35)
gc.print(format("%.2f",time),-130,530)--Draw time mStr(format("%.2f",P.time),-75,520)--Draw time
if mesDisp[gamemode]then mesDisp[gamemode]()end--Draw other message if mesDisp[curMode.id]then mesDisp[curMode.id]()end--Draw other message
setFont(15)
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.print("BPM",380,490) setFont(15)
gc.print("KPM",335,580) gc.print("BPM",390,490)
gc.print("KPM",350,583)
setFont(30) setFont(30)
drawDial(350,520,dropSpeed) drawDial(360,520,P.dropSpeed)
drawDial(400,570,keySpeed) drawDial(405,575,P.keySpeed)
--Speed dials --Speed dials
if modeEnv.royaleMode then
if P.atkMode then
gc.setColor(1,.8,0,P.swappingAtkMode*.02)
gc.rectangle("fill",RCPB[2*P.atkMode-1],RCPB[2*P.atkMode],90,35,8,4)
end
gc.setColor(1,1,1,P.swappingAtkMode*.025)
gc.draw(royaleCtrlPad)
end
gc.pop() gc.pop()
end end
end--Draw players end--Draw players
@@ -440,25 +505,44 @@ function Pnt.play()
for i=1,3 do for i=1,3 do
gc.draw(PTC.attack[i]) gc.draw(PTC.attack[i])
end end
for i=1,#FX.badge do
local b=FX.badge[i]
local t=b.t<10 and 0 or b.t<50 and(sin(1.5*(b.t/20-1.5))+1)*.5 or 1
gc.setColor(1,1,1,b.t<10 and b.t*.1 or b.t<50 and 1 or(60-b.t)*.1)
gc.draw(badgeIcon,b[1]+(b[3]-b[1])*t,b[2]+(b[4]-b[2])*t,nil,b.size,nil,14,14)
end
setmetatable(_G,nil)
if setting.virtualkeySwitch then if setting.virtualkeySwitch then
drawVirtualkey() drawVirtualkey()
end end
if modeEnv.royaleMode then
for i=1,#FX.badge do
local b=FX.badge[i]
local t=b.t<10 and 0 or b.t<50 and(sin(1.5*(b.t/20-1.5))+1)*.5 or 1
gc.setColor(1,1,1,b.t<10 and b.t*.1 or b.t<50 and 1 or(60-b.t)*.1)
gc.draw(badgeIcon,b[1]+(b[3]-b[1])*t,b[2]+(b[4]-b[2])*t,nil,b.size,nil,14,14)
end
P=players[1]
if P.atkMode~=4 then
gc.setLineWidth(5)
gc.setColor(.8,1,0,.2)
else
gc.setLineWidth(9)
gc.setColor(1,.6,.2,.4)
end
for i=1,#players[1].atker do
local p=players[1].atker[i]
gc.line(p.centerX,p.centerY,P.centerX,P.centerY)
end
if P.atkMode~=4 then
if P.atking then
gc.setColor(0,.5,1,.2+(sin(Timer()*10)+1)*.1)
gc.line(P.centerX,P.centerY,P.atking.centerX,P.atking.centerY)
end
end
end
end end
function Pnt.setting() function Pnt.setting()
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(35) setFont(35)
mStr("DAS:"..setting.das,328,163) mStr("DAS:"..setting.das,288,158)
mStr("ARR:"..setting.arr,543,163) mStr("ARR:"..setting.arr,503,158)
setFont(18) setFont(18)
mStr("softdropDAS:"..setting.sddas,328,250) mStr("softdropDAS:"..setting.sddas,288,249)
mStr("softdropARR:"..setting.sdarr,543,250) mStr("softdropARR:"..setting.sdarr,503,249)
end end
function Pnt.setting2() function Pnt.setting2()
if keyboardSetting then if keyboardSetting then
@@ -475,25 +559,25 @@ function Pnt.setting2()
gc.rectangle("fill",440,40*joystickSet-10,200,40) gc.rectangle("fill",440,40*joystickSet-10,200,40)
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(40)
gc.print("< P"..curBoard.."/P8 >",430,530)
setFont(25) setFont(25)
for y=1,12 do for y=1,13 do
mStr(actName_show[y],150,40*y) mStr(actName_show[y],150,40*y)
for x=1,2 do for x=1,2 do
mStr(setting.keyMap[curBoard+x*8-8][y],200*x+140,40*y) mStr(setting.keyMap[curBoard+x*8-8][y],200*x+140,40*y-3)
end end
gc.line(40,40*y-10,640,40*y-10) gc.line(40,40*y-10,640,40*y-10)
end end
for x=1,4 do for x=1,4 do
gc.line(200*x-160,30,200*x-160,510) gc.line(200*x-160,30,200*x-160,550)
end end
gc.line(40,510,640,510) gc.line(40,550,640,550)
gc.print("Keyboard | Joystick",330,3) gc.print("Keyboard | Joystick",335,1)
gc.print("Arrowkey to select/change slot,Enter to change,Esc back",50,580) gc.print("Arrowkey to select/change slot,Enter to change,Esc back",50,620)
setFont(40)
gc.print("< P"..curBoard.."/P8 >",430,570)
end end
function Pnt.setting3() function Pnt.setting3()
drawVirtualkey(sel) VirtualkeyPreview()
local d=snapLevelValue[snapLevel] local d=snapLevelValue[snapLevel]
if d>=10 then if d>=10 then
gc.setLineWidth(3) gc.setLineWidth(3)
@@ -510,12 +594,12 @@ function Pnt.help()
setFont(32) setFont(32)
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,11 do for i=1,11 do
mStr(Text.help[i],640,15+43*i) gc.printf(Text.help[i],140,15+43*i,1000,"center")
end end
gc.draw(titleImage,180,600,.2,.7+.05*sin(Timer()*2),nil,140,100) gc.draw(titleImage,180,600,.2,.7+.05*sin(Timer()*2),nil,140,100)
end end
function Pnt.stat() function Pnt.stat()
setFont(30) setFont(35)
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,10 do for i=1,10 do
gc.print(Text.stat[i],350,20+40*i) gc.print(Text.stat[i],350,20+40*i)

View File

@@ -2,6 +2,7 @@ game={}
function game.load() function game.load()
scene="load" scene="load"
curBG="none" curBG="none"
keeprun=true
loading=1--Loading mode loading=1--Loading mode
loadnum=1--Loading counter loadnum=1--Loading counter
loadprogress=0--Loading bar loadprogress=0--Loading bar
@@ -9,23 +10,36 @@ end
function game.intro() function game.intro()
scene="intro" scene="intro"
curBG="none" curBG="none"
count=0
keeprun=true
end end
function game.main() function game.main()
scene="main" scene="main"
curBG="none" curBG="none"
keeprun=true
BGM("blank") BGM("blank")
collectgarbage() collectgarbage()
end end
function game.mode() function game.mode()
saveData() saveData()
modeSel=modeSel or 1 modeSel=modeSel or 1
levelSel=levelSel or 3
scene="mode" scene="mode"
curBG="none" curBG="none"
keeprun=true
BGM("blank")
end
function game.custom()
optSel=optSel or 1
scene="custom"
curBG="matrix"
keeprun=true
BGM("blank") BGM("blank")
end end
function game.play() function game.play()
scene="play" scene="play"
--curBG="game1" --curBG="game1"
keeprun=false
resetGameData() resetGameData()
sysSFX("ready") sysSFX("ready")
mouseShow=false mouseShow=false
@@ -33,34 +47,39 @@ end
function game.setting() function game.setting()
scene="setting" scene="setting"
curBG="none" curBG="none"
keeprun=true
BGM("blank") BGM("blank")
end end
function game.setting2() function game.setting2()
scene="setting2" scene="setting2"
curBG="none" curBG="none"
curBoard=1 keeprun=true
keyboardSet=1 curBoard=1
joystickSet=1 keyboardSet=1
keyboardSetting=false joystickSet=1
joystickSetting=false keyboardSetting=false
joystickSetting=false
BGM("blank") BGM("blank")
end--Control settings end--Control settings
function game.setting3() function game.setting3()
scene="setting3" scene="setting3"
curBG="game1" curBG="game1"
keeprun=true
defaultSel=1
sel=nil sel=nil
keyssetting=nil
snapLevel=1 snapLevel=1
BGM("blank") BGM("blank")
end--Touch setting end--Touch setting
function game.help() function game.help()
scene="help" scene="help"
curBG="none" curBG="none"
keeprun=true
BGM("blank") BGM("blank")
end end
function game.stat() function game.stat()
scene="stat" scene="stat"
curBG="none" curBG="none"
keeprun=true
BGM("blank") BGM("blank")
end end
function game.quit() function game.quit()

View File

@@ -1,199 +0,0 @@
function sysSFX(s,v)
if setting.sfx then
local n=1
while sfx[s][n]:isPlaying()do
n=n+1
if not sfx[s][n]then
sfx[s][n]=sfx[s][n-1]:clone()
sfx[s][n]:seek(0)
end
end
sfx[s][n]:setVolume(v or 1)
sfx[s][n]:play()
end
end
function SFX(s,v)
if setting.sfx and not P.ai then
local n=1
while sfx[s][n]:isPlaying()do
n=n+1
if not sfx[s][n]then
sfx[s][n]=sfx[s][n-1]:clone()
sfx[s][n]:seek(0)
break
end
end
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
bgmPlaying=s
end
end
function gotoScene(s,style)
if not sceneSwaping and s~=scene then
style=style or"deck"
sceneSwaping={
tar=s,style=style,
time=swap[style][1],mid=swap[style][2],
draw=swap[style].d
}
Buttons.sel=nil
end
end
function startGame(mode)
--rec=""
gamemode=mode
gotoScene("play")
end
function back()
local t=prevMenu[scene]
if type(t)=="string"then
gotoScene(t)
else
t()
end
end
function loadData()
userData:open("r")
--local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n")
local t=string.splitS(userData:read(),"\r\n")
userData: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=="run"or t=="game"or t=="gametime"or t=="piece"or t=="row"or t=="atk"or t=="key"or t=="rotate"or t=="hold"or t=="spin"then
v=toN(v)if not v or v<0 then v=0 end
stat[t]=v
end
end
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")
--t=love.math.compress(t,"zlib"):getString()
userData:open("w")
userData:write(t)
userData:close()
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")
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
setting[t]=v=="true"
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,"/")
for i=1,16 do
local v1=string.splitS(v[i],",")
for j=1,#v1 do
setting.keyMap[i][j]=v1[j]
end
end
elseif t=="keylib"then
v=string.splitS(v,"/")
for i=1,4 do
local v1=string.splitS(v[i],",")
for j=1,#v1 do
setting.keyLib[i][j]=toN(v1[j])
end
for j=1,#setting.keyLib[i]do
local v=setting.keyLib[i][j]
if int(v)~=v or v>=9 or v<=0 then
setting.keyLib[i]={i}
break
end
end
end
elseif t=="virtualkey"then
v=string.splitS(v,"/")
for i=1,9 do
virtualkey[i]=string.splitS(v[i],",")
for j=1,4 do
virtualkey[i][j]=toN(virtualkey[i][j])
end
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=="frameMul"then
v=min(max(toN(v)or 100,0),100)
setting.frameMul=v
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
setting[t]=v=="true"
end
end
end
end
function saveSetting()
local vk={}
for i=1,9 do
for j=1,4 do
virtualkey[i][j]=int(virtualkey[i][j]+.5)
end--Saving a integer is better?
vk[i]=table.concat(virtualkey[i],",")
end--pre-pack virtualkey setting
local map={}
for i=1,16 do
map[i]=table.concat(setting.keyMap[i],",")
end
local lib={}
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")
--t=love.math.compress(t,"zlib"):getString()
userSetting:open("w")
userSetting:write(t)
userSetting:close()
end

View File

@@ -1,36 +1,63 @@
setFont(80)
charV=gc.newText(Fonts[80],"v")
local N=gc.newImage local N=gc.newImage
titleImage=N("/image/mess/title.png") function C(x,y)
mouseIcon=N("/image/mess/mouseIcon.png") c=gc.newCanvas(x,y)
spinCenter=N("/image/mess/spinCenter.png") gc.setCanvas(c)
dialCircle=N("/image/mess/dialCircle.png") return c
dialNeedle=N("/image/mess/dialNeedle.png")
badgeIcon=N("/image/mess/badge.png")
blockSkin={}
for i=1,13 do
blockSkin[i]=N("/image/block/1/"..i..".png")
end end
background={}
gc.setColor(1,1,1) gc.setDefaultFilter("nearest","nearest")
background={
N("/image/BG/bg1.jpg"), local blockImg=N("/image/block/1.png")
N("/image/BG/bg2.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
for i=1,13 do
end
blockImg:release()
RCPB={10,33,200,33,105,5,105,60}
do royaleCtrlPad=C(300,100)
gc.setColor(1,1,1)
setFont(25)
gc.setLineWidth(2)
for i=1,4 do
gc.rectangle("line",RCPB[2*i-1],RCPB[2*i],90,35,8,4)
mStr(atkModeName[i],RCPB[2*i-1]+45,RCPB[2*i]+3)
end
end
virtualkeyIcon={} virtualkeyIcon={}
for i=1,9 do for i=1,10 do
virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png") virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png")
end end
gc.setColor(1,1,1)
mouseBlock={}
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
gc.rectangle("fill",x-1,#b-y,1,1)
end
end end
end
PTC={dust={}}--Particle systems PTC={dust={}}--Particle systems
c=gc.newCanvas(6,6)gc.setCanvas(c) C(6,6)
gc.clear(1,1,1) gc.clear(1,1,1)
PTC.dust[0]=gc.newParticleSystem(c,1000) PTC.dust0=gc.newParticleSystem(c,1000)
PTC.dust[0]:setParticleLifetime(.2,.3) PTC.dust0:setParticleLifetime(.2,.3)
PTC.dust[0]:setEmissionRate(0) PTC.dust0:setEmissionRate(0)
PTC.dust[0]:setLinearAcceleration(-1500,-200,1500,200) PTC.dust0:setLinearAcceleration(-1500,-200,1500,200)
PTC.dust[0]:setColors(1,1,1,.5,1,1,1,0) PTC.dust0:setColors(1,1,1,.5,1,1,1,0)
c:release() c:release()
--Dust particles --Dust particles
@@ -54,5 +81,16 @@ PTC.attack[3]:setSpin(6)
PTC.attack[3]:setColors(1,1,1,.7,1,1,1,0) PTC.attack[3]:setColors(1,1,1,.7,1,1,1,0)
--Attack particles --Attack particles
gc.setCanvas() gc.setDefaultFilter("linear","linear")
c=nil 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")
background={
N("/image/BG/bg1.jpg"),
N("/image/BG/bg2.png"),
}
c=nil
gc.setCanvas()

204
timer.lua
View File

@@ -34,10 +34,14 @@ function Tmr.load()
loadnum=loadnum+1 loadnum=loadnum+1
if loadnum==15 then if loadnum==15 then
stat.run=stat.run+1 stat.run=stat.run+1
gotoScene("main") gotoScene("intro","none")
end end
end end
end end
function Tmr.intro()
count=count+1
if count==200 then count=80 end
end
function Tmr.play(dt) function Tmr.play(dt)
frame=frame+1 frame=frame+1
stat.gametime=stat.gametime+dt stat.gametime=stat.gametime+dt
@@ -65,55 +69,40 @@ function Tmr.play(dt)
end end
-- Update attack beam -- Update attack beam
if count then if frame<180 then
count=count-1 if frame==179 then
if count==0 then gameStart()
count=nil elseif frame%60==0 then
sysSFX("start")
for P=1,#players do
P=players[P]
_G.P=P
setmetatable(_G,P.index)
P.control=true
P.timing=true
resetblock()
end
setmetatable(_G,nil)
elseif count%60==0 then
sysSFX("ready") sysSFX("ready")
end end
for p=1,#players do
if count then P=players[p]
for p=1,#players do if P.keyPressing[1]or P.keyPressing[2]then
P=players[p] P.moving=P.moving+sgn(P.moving)
setmetatable(_G,P.index) else
if keyPressing[1]or keyPressing[2]then P.moving=0
P.moving=moving+sgn(moving)
else
P.moving=0
end
end end
return nil
end end
end--Start counting,include pre-das return nil
end--Counting,include pre-das
for p=1,#players do for p=1,#players do
P=players[p] P=players[p]
setmetatable(_G,P.index) if P.timing then P.time=P.time+dt end
if timing then P.time=time+dt end if P.alive then
if alive then
local v=0 local v=0
for i=2,10 do v=v+i*(i-1)*7.2/(frame-keyTime[i])end P.keySpeed=keySpeed*.99+v*.1 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-dropTime[i])end P.dropSpeed=dropSpeed*.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 --Update speeds
if P.ai and waiting<=0 then if P.ai and P.waiting<=0 then
P.ai.controlDelay=P.ai.controlDelay-1 P.ai.controlDelay=P.ai.controlDelay-1
if P.ai.controlDelay==0 then if P.ai.controlDelay==0 then
if #P.ai.controls>0 then if #P.ai.controls>0 then
pressKey(P.ai.controls[1],P) pressKey(P.ai.controls[1],P)
releaseKey(P.ai.controls[1],P) releaseKey(P.ai.controls[1],P)
rem(P.ai.controls,1) rem(P.ai.controls,1)
P.ai.controlDelay=P.ai.controlDelay0+rnd(3) P.ai.controlDelay=P.ai.controlDelay0+1
else else
AI_getControls(P.ai.controls) AI_getControls(P.ai.controls)
P.ai.controlDelay=2*P.ai.controlDelay0 P.ai.controlDelay=2*P.ai.controlDelay0
@@ -121,31 +110,31 @@ function Tmr.play(dt)
end end
end end
for j=1,#field do for i=1,10 do for j=1,#P.field do for i=1,10 do
if visTime[j][i]>0 then P.visTime[j][i]=visTime[j][i]-1 end if P.visTime[j][i]>0 then P.visTime[j][i]=P.visTime[j][i]-1 end
end end end end
--Fresh visible time --Fresh visible time
if keyPressing[1]or keyPressing[2]then if P.keyPressing[1]or P.keyPressing[2]then
P.moving=moving+sgn(moving) P.moving=P.moving+sgn(P.moving)
local d=abs(moving)-gameEnv.das local d=abs(P.moving)-P.gameEnv.das
if d>1 then if d>1 then
if gameEnv.arr>0 then if P.gameEnv.arr>0 then
if d%gameEnv.arr==0 then if d%P.gameEnv.arr==0 then
act[moving>0 and"moveRight"or"moveLeft"](true) act[P.moving>0 and"moveRight"or"moveLeft"](true)
end end
else else
act[moving>0 and"insRight"or"insLeft"]() act[P.moving>0 and"insRight"or"insLeft"]()
end end
end end
else else
P.moving=0 P.moving=0
end end
if keyPressing[7]then if P.keyPressing[7]and not P.keyPressing[9]then
P.downing=downing+1 P.downing=P.downing+1
local d=abs(downing)-gameEnv.sddas local d=abs(P.downing)-P.gameEnv.sddas
if d>1 then if d>1 then
if gameEnv.sdarr>0 then if P.gameEnv.sdarr>0 then
if d%gameEnv.sdarr==0 then if d%P.gameEnv.sdarr==0 then
act.down1() act.down1()
end end
else else
@@ -155,97 +144,108 @@ function Tmr.play(dt)
else else
P.downing=0 P.downing=0
end end
if falling>0 then if modeEnv.royaleMode then
P.falling=falling-1 if P.keyPressing[9]then
if falling<=0 then P.swappingAtkMode=min(P.swappingAtkMode+2,30)
if #field>clearing[1]then SFX("fall")end else
for i=1,#clearing do P.swappingAtkMode=P.swappingAtkMode+((#P.field>15 and P.swappingAtkMode>4 or P.swappingAtkMode>8)and -1 or 1)
removeRow(field,clearing[i])
removeRow(visTime,clearing[i])
end
P.clearing={}
end end
--Rows cleared drop end
elseif waiting>0 then if P.falling>0 then
P.waiting=waiting-1 P.falling=P.falling-1
if waiting<=0 then 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[1]do
rem(P.clearing)
end
end
elseif P.waiting>0 then
P.waiting=P.waiting-1
if P.waiting<=0 then
resetblock() resetblock()
end end
else else
if cy~=y_img then if P.cy~=P.y_img then
if dropDelay>0 then if P.dropDelay>0 then
P.dropDelay=dropDelay-1 P.dropDelay=P.dropDelay-1
else else
drop() drop()
P.dropDelay=gameEnv.drop P.dropDelay=P.gameEnv.drop
if P.freshTime<=gameEnv.freshLimit then if P.freshTime<=P.gameEnv.freshLimit then
P.lockDelay=gameEnv.lock P.lockDelay=P.gameEnv.lock
end end
end end
else else
if lockDelay>0 then P.lockDelay=lockDelay-1 if P.lockDelay>0 then P.lockDelay=P.lockDelay-1
else drop() else drop()
end end
end end
end end
P.b2b1=P.b2b1*.93+P.b2b*.07 P.b2b1=P.b2b1*.92+P.b2b*.08
if P.b2b>500 then
P.b2b=P.b2b-.2
elseif P.b2b>100 then
P.b2b=P.b2b-.15
end
--Alive --Alive
else else
P.keySpeed=keySpeed*.96+cstat.key/time*60*.04 P.keySpeed=P.keySpeed*.96+P.cstat.key/P.time*60*.04
P.dropSpeed=dropSpeed*.96+cstat.piece/time*60*.04 P.dropSpeed=P.dropSpeed*.96+P.cstat.piece/P.time*60*.04
--Final average speeds --Final average speeds
if falling>0 then if P.falling>0 then
P.falling=falling-1 P.falling=P.falling-1
if falling<=0 then if P.falling<=0 then
if #field>clearing[1]then SFX("fall")end if #P.field>P.clearing[1]then
for i=1,#clearing do SFX("fall")
removeRow(field,clearing[i]) if P.id==1 then VIB(1)end
removeRow(visTime,clearing[i]) end
for i=1,#P.clearing do
removeRow(P.field,P.clearing[i])
removeRow(P.visTime,P.clearing[i])
end end
P.clearing={} P.clearing={}
end end
end--Rows cleared drop end--Rows cleared drop
if P.counter<40 then if P.endCounter<40 then
for j=1,#field do for i=1,10 do for j=1,#P.field do for i=1,10 do
if visTime[j][i]<20 then P.visTime[j][i]=visTime[j][i]+.5 end if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
end end--Make field visible end end--Make field visible
end end
if P.b2b1>0 then P.b2b1=max(P.b2b1-3,0)end if P.b2b1>0 then P.b2b1=max(P.b2b1-3,0)end
--Dead --Dead
end end
for i=#bonus,1,-1 do for i=#P.bonus,1,-1 do
if bonus[i].inf then local b=P.bonus[i]
if bonus[i].t<30 then if b.inf then
bonus[i].t=bonus[i].t+1 if b.t<30 then
b.t=b.t+.5
end end
else else
bonus[i].t=bonus[i].t+1 b.t=b.t+b.speed
if bonus[i].t==60 then rem(bonus,i)end if b.t>=60 then rem(P.bonus,i)end
end end
end end
for i=#task,1,-1 do for i=#P.task,1,-1 do
if task[i]()then rem(task,i)end if P.task[i]()then rem(P.task,i)end
end end
for i=#atkBuffer,1,-1 do for i=#P.atkBuffer,1,-1 do
local atk=atkBuffer[i] local atk=P.atkBuffer[i]
atk.time=atk.time+1 atk.time=atk.time+1
if not atk.sent then if not atk.sent then
if atk.countdown>0 then if atk.countdown>0 then
atk.countdown=atk.countdown-1 atk.countdown=atk.countdown-garbageSpeed
end end
else else
if atk.time>20 then if atk.time>20 then
rem(atkBuffer,i) rem(P.atkBuffer,i)
end end
end end
end end
if fieldBeneath>0 then P.fieldBeneath=fieldBeneath-3 end if P.fieldBeneath>0 then P.fieldBeneath=max(P.fieldBeneath-pushSpeed,0)end
PTC.dust[p]:update(dt) if not P.small then
PTC.dust[p]:update(dt)
end
end
if modeEnv.royaleMode and frame%60==0 then
freshMostDangerous()
end end
setmetatable(_G,nil)
end end

View File

@@ -15,9 +15,8 @@ function without(t,v)
end end
return true return true
end end
function mStr(s,x,y)gc.printf(s,x-500,y,1000,"center")end function mStr(s,x,y)
function convert(x,y) gc.printf(s,x-250,y,500,"center")
return x*screenK,(y-screenM)*screenK
end end
function getNewRow(val) function getNewRow(val)
@@ -53,14 +52,221 @@ function getNewBlock()
BGblock.next=BGblock.next%7+1 BGblock.next=BGblock.next%7+1
return t return t
end end
--Background animation
function timeSort(a,b) function timeSort(a,b)
return a.time>b.time return a.time>b.time
end end
function stencil_miniTitle()
for i=1,#miniTitle_rect do
gc.rectangle("fill",unpack(miniTitle_rect[i]))
end
end
function stencil_field() function stencil_field()
gc.rectangle("fill",0,-10,300,610) gc.rectangle("fill",150,60,300,610)
end end
function stencil_field_small() function stencil_field_small()
gc.rectangle("fill",0,0,300,600) gc.rectangle("fill",0,0,300,600)
end end
--Single use --Single-usage funcs
function VIB(t)
if setting.vib>0 then
love.system.vibrate(vibrateLevel[setting.vib+t])
end
end
function sysSFX(s,v)
if setting.sfx then
local n=1
while sfx[s][n]:isPlaying()do
n=n+1
if not sfx[s][n]then
sfx[s][n]=sfx[s][n-1]:clone()
sfx[s][n]:seek(0)
break
end
end
sfx[s][n]:setVolume(v or 1)
sfx[s][n]:play()
end
end
function SFX(s,v)
if setting.sfx and not P.ai then
local n=1
while sfx[s][n]:isPlaying()do
n=n+1
if not sfx[s][n]then
sfx[s][n]=sfx[s][n-1]:clone()
sfx[s][n]:seek(0)
break
end
end
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
bgmPlaying=s
end
end
function gotoScene(s,style)
if not sceneSwaping and s~=scene then
style=style or"deck"
sceneSwaping={
tar=s,style=style,
time=swap[style][1],mid=swap[style][2],
draw=swap[style].d
}
Buttons.sel=nil
end
end
function back()
local t=prevMenu[scene]
if type(t)=="string"then
gotoScene(t)
else
t()
end
end
function loadData()
userData:open("r")
--local t=string.splitS(love.math.decompress(userdata,"zlib"),"\r\n")
local t=string.splitS(userData:read(),"\r\n")
userData: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=="run"or t=="game"or t=="gametime"or t=="piece"or t=="row"or t=="atk"or t=="key"or t=="rotate"or t=="hold"or t=="spin"then
v=toN(v)if not v or v<0 then v=0 end
stat[t]=v
end
end
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")
--t=love.math.compress(t,"zlib"):getString()
userData:open("w")
userData:write(t)
userData:close()
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")
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"or t=="bgblock"then
setting[t]=v=="true"
elseif t=="vib"then
setting.vib=toN(v:match("[0123]"))or 0
elseif t=="fullscreen"then
setting.fullscreen=v=="true"
love.window.setFullscreen(setting.fullscreen)
elseif t=="keymap"then
v=string.splitS(v,"/")
for i=1,16 do
local v1=string.splitS(v[i],",")
for j=1,#v1 do
setting.keyMap[i][j]=v1[j]
end
end
elseif t=="keylib"then
v=string.splitS(v,"/")
for i=1,4 do
local v1=string.splitS(v[i],",")
for j=1,#v1 do
setting.keyLib[i][j]=toN(v1[j])
end
for j=1,#setting.keyLib[i]do
local v=setting.keyLib[i][j]
if int(v)~=v or v>=9 or v<=0 then
setting.keyLib[i]={i}
break
end
end
end
elseif t=="virtualkey"then
v=string.splitS(v,"/")
for i=1,10 do
if not v[i]then goto c end
virtualkey[i]=string.splitS(v[i],",")
for j=1,4 do
virtualkey[i][j]=toN(virtualkey[i][j])
end
::c::
end
elseif t=="virtualkeyAlpha"then
setting.virtualkeyAlpha=int(abs(toN(v)))
elseif t=="virtualkeyIcon"or t=="virtualkeySwitch"then
setting[t]=v=="true"
elseif t=="frameMul"then
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
setting[t]=v=="true"
end
end
end
end
function saveSetting()
local vk={}
for i=1,10 do
for j=1,4 do
virtualkey[i][j]=int(virtualkey[i][j]+.5)
end--Saving a integer is better?
vk[i]=table.concat(virtualkey[i],",")
end--pre-pack virtualkey setting
local map={}
for i=1,16 do
map[i]=table.concat(setting.keyMap[i],",")
end
local lib={}
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("vib=",setting.vib),
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")
--t=love.math.compress(t,"zlib"):getString()
userSetting:open("w")
userSetting:write(t)
userSetting:close()
end