Compare commits

..

19 Commits

Author SHA1 Message Date
MrZ_26
830f0ffbed Alpha V0.7.16 2020-02-04 19:33:52 +08:00
MrZ_26
849e5b586e Alpha V0.7.15 2020-02-04 19:33:41 +08:00
MrZ_26
f82e979f9c Alpha V0.7.14 2020-02-04 19:33:20 +08:00
MrZ_26
c9a3e3ce1b Alpha V0.7.13+ 2020-02-04 19:33:03 +08:00
MrZ_26
72dcb84662 Alpha V0.7.12 2020-02-04 19:32:38 +08:00
MrZ_26
4af2126254 Alpha V0.7.11 2020-02-04 19:32:26 +08:00
MrZ_26
42d7b1be94 Alpha V0.7.10 2020-02-04 19:32:10 +08:00
MrZ_26
a31474c43a Alpha V0.7.9 2020-02-04 19:31:45 +08:00
MrZ_26
75c7955bb5 Alpha V0.7.8 2020-02-04 19:31:31 +08:00
MrZ_26
c35152cf6e Alpha V0.7.7 2020-02-04 19:31:17 +08:00
MrZ_26
1b0ad009b0 Alpha V0.7.6 2020-02-04 19:30:59 +08:00
MrZ_26
e7c797bf14 Alpha V0.7.5 2020-02-04 19:30:42 +08:00
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
MrZ_26
bdee7fba03 Alpha V0.6.8 2020-02-04 19:28:44 +08:00
MrZ_26
d8cbfa72ac Alpha V0.6.5 2020-02-04 19:28:33 +08:00
MrZ_26
31fd2c0e72 Alpha V0.6 2020-02-04 19:28:01 +08:00
69 changed files with 4703 additions and 2006 deletions

Binary file not shown.

BIN
BGM/cruelty.ogg Normal file

Binary file not shown.

BIN
BGM/end.ogg Normal file

Binary file not shown.

BIN
BGM/final.ogg Normal file

Binary file not shown.

BIN
BGM/infinite.ogg Normal file

Binary file not shown.

BIN
BGM/newera.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
BGM/rockblock.ogg Normal file

Binary file not shown.

BIN
BGM/secret7th.ogg Normal file

Binary file not shown.

BIN
BGM/secret8th.ogg Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -1,14 +0,0 @@
local count=0
BGblockList={}for i=1,16 do BGblockList[i]={}end
function getNewBlock()
count=count+1
if count==17 then count=1 end
local t=BGblockList[count]
t.bn,t.size=rnd(7),2+3*rnd()
t.b=blocks[t.bn][rnd(0,3)]
t.x=rnd(-#t.b[1]*t.size*30+100,1180)
t.y=-#t.b*30*t.size
t.v=t.size*(1+rnd())
return t
end

BIN
SFX/blip_1.ogg Normal file

Binary file not shown.

BIN
SFX/blip_2.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
SFX/collect.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
SFX/emit.ogg Normal file

Binary file not shown.

BIN
SFX/fail.ogg Normal file

Binary file not shown.

BIN
SFX/lock.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
SFX/swipe.ogg Normal file

Binary file not shown.

BIN
SFX/win.ogg Normal file

Binary file not shown.

111
ai.lua
View File

@@ -5,7 +5,7 @@ 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}
@@ -18,146 +18,157 @@ 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 end
for i=1,#bk do for j=1,#bk[1]do for i=1,#bk do for j=1,#bk[1]do
if f[y+i-1]and bk[i][j]>0 and f[y+i-1][x+j-1]>0 then return true end if f[y+i-1]and bk[i][j]and f[y+i-1][x+j-1]>0 then return true end
end end end end
end end
function resetField(f0,f,start) function resetField(f0,f,start)
while f[start]do ::L::if f[start]then
removeRow(f,start) removeRow(f,start)
goto L
end end
for i=start,#f0 do for i=start,#f0 do
f[i]=getNewRow() f[i]=getNewRow(0)
for j=1,10 do for j=1,10 do
f[i][j]=f0[i][j] f[i][j]=f0[i][j]
end end
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(0)
local rough=0
local clear=0 local clear=0
local hole=0 local hole=0
for i=cy+#cb-1,cy,-1 do for i=cy+#cb-1,cy,-1 do
local f=true
for j=1,10 do for j=1,10 do
if field[i][j]==0 then f=false;break end if field[i][j]==0 then goto L end
end end
if f then
removeRow(field,i) removeRow(field,i)
clear=clear+1 clear=clear+1
end ::L::
end end
if #field==0 then return 9e99 end--PC best if #field==0 then return 9e99 end--PC best
for x=1,10 do for x=1,10 do
local h=#field local h=#field
while field[h][x]==0 and h>1 do ::L::if field[h][x]==0 and h>1 then
h=h-1 h=h-1
goto L
end end
height[x]=h height[x]=h
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-40-mh1*30 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(0)
for j=1,10 do for j=1,10 do
Tfield[i][j]=field_org[i][j] Tfield[i][j]=field_org[i][j]
end end
end end
local best={x=1,dir=0,hold=false,score=-9e99} local best={x=1,dir=0,hold=false,score=-9e99}
for ifhold=0,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.cur.id or P.hold.id>0 and P.hold.id or P.next[1].id
for dir=0,dirCount[bn] do--each dir for dir=0,dirCount[bn] do--each dir
local cb=blocks[bn][dir] local cb=blocks[bn][dir]
for cx=1,11-#cb[1]do--each pos for cx=1,11-#cb[1]do--each pos
local cy=#Tfield+1 local cy=#Tfield+1
while not ifoverlapAI(Tfield,cb,cx,cy-1)do ::L::if not ifoverlapAI(Tfield,cb,cx,cy-1)then
cy=cy-1 cy=cy-1
goto L
end--move to bottom end--move to bottom
for i=1,#cb do for i=1,#cb do
local y=cy+i-1 local y=cy+i-1
if not Tfield[y]then Tfield[y]=getNewRow()end if not Tfield[y]then Tfield[y]=getNewRow(0)end
for j=1,#cb[1]do for j=1,#cb[1]do
if cb[i][j]~=0 then if cb[i][j]then
Tfield[y][cx+j-1]=1 Tfield[y][cx+j-1]=1
end end
end end
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 ::L::
if #Tfield>0 then
removeRow(Tfield,1) removeRow(Tfield,1)
goto L
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
end end

View File

@@ -1,5 +1,106 @@
local gc,tm=love.graphics,love.timer
local ms,kb,tc=love.mouse,love.keyboard,love.touch
local wd=love.window
local setFont=setFont
local Timer=tm.getTime
local scr=scr
local xOy=love.math.newTransform()
local focus=true
local mx,my,mouseShow=-20,-20,false
local touching=nil--1st touching ID
local sceneInit={
load=function()
curBG="none"
loading=1--Loading mode
loadnum=1--Loading counter
loadprogress=0--Loading bar(0~1)
loadTip=text.tips[rnd(#text.tips)]
end,
intro=function()
curBG="none"
count=0
BGM("blank")
end,
main=function()
curBG="none"
collectgarbage()
end,
mode=function()
saveData()
modeSel=modeSel or 1
levelSel=levelSel or 3
curBG="none"
BGM("blank")
end,
custom=function()
optSel=optSel or 1
curBG="matrix"
BGM("blank")
end,
draw=function()
kb.setKeyRepeat(true)
clearSureTime=0
pen=1
sx,sy=1,1
curBG="none"
end,
play=function()
if needResetGameData then
resetGameData()
needResetGameData=nil
end
sysSFX("ready")
end,
pause=function()
pauseTime=0
end,
setting=function()
curBG="none"
end,
setting2=function()
curBG="none"
curBoard=1
keyboardSet=1
joystickSet=1
keyboardSetting=false
joystickSetting=false
end,--Control settings
setting3=function()
curBG="game1"
defaultSel=1
sel=nil
snapLevel=1
end,--Touch setting
help=function()
curBG="none"
end,
stat=function()
curBG="none"
end,
quit=function()
love.event.quit()
end,
}
BGblockList={}for i=1,16 do BGblockList[i]={v=0}end
local BGblock={tm=150,next=7,ct=0}
local function getNewBlock()
BGblock.ct=BGblock.ct+1
if BGblock.ct==17 then BGblock.ct=1 end
local t=BGblockList[BGblock.ct]
t.bn,t.size=BGblock.next,2+3*rnd()
t.b=blocks[t.bn][rnd(0,3)]
t.x=rnd(-#t.b[1]*t.size*30+100,1180)
t.y=-#t.b*30*t.size
t.v=t.size*(1+rnd())
BGblock.next=BGblock.next%7+1
return t
end
local scs={{1,2},nil,nil,nil,nil,{1.5,1.5},{0.5,2.5}}for i=2,5 do scs[i]=scs[1]end
function onVirtualkey(x,y) function onVirtualkey(x,y)
local x,y=convert(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]
@@ -12,37 +113,34 @@ function onVirtualkey(x,y)
end end
return nearest return nearest
end end
function buttonControl_key(i) function buttonControl_key(i)
if i=="up"or i=="down"or i=="left"or i=="right"then if i=="up"or i=="down"or i=="left"or i=="right"then
if not Buttons.sel then if Buttons.sel then
Buttons.sel=1 Buttons.sel=Buttons[scene][Buttons.sel[i]]or Buttons.sel
else else
Buttons.sel=Buttons[scene][Buttons.sel][i]or Buttons.sel Buttons.sel=select(2,next(Buttons[scene]))
mouseShow=false
end end
elseif i=="space"or i=="return"then elseif i=="space"or i=="return"then
if not sceneSwaping and Buttons.sel then if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel] Buttons.sel.alpha=1
B.code() Buttons.sel.code()
B.alpha=1
sysSFX("button") sysSFX("button")
end end
end end
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 Buttons.sel then
Buttons.sel=1 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
mouseShow=false
else else
Buttons.sel=Buttons[scene][Buttons.sel][i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]or Buttons.sel Buttons.sel=select(2,next(Buttons[scene]))
mouseShow=false
end end
elseif i=="start"then elseif i=="start"then
if not sceneSwaping and Buttons.sel then if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel] Buttons.sel.alpha=1
B.code() Buttons.sel.code()
B.alpha=1
sysSFX("button") sysSFX("button")
end end
end end
@@ -50,245 +148,531 @@ function buttonControl_gamepad(i)
end end
mouseDown={} mouseDown={}
function mouseDown.intro(x,y,k)
if k==2 then
back()
else
gotoScene("main")
end
end
function mouseDown.draw(x,y,k)
mouseMove.draw(x,y)
end
function mouseDown.setting3(x,y,k)
if k==2 then back()end
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
sel=K
end
end
end
mouseMove={}
function mouseMove.draw(x,y,dx,dy)
sx,sy=int((x-200)/30)+1,20-int((y-60)/30)
if sx<1 or sx>10 then sx=nil end
if sy<1 or sy>20 then sy=nil end
if sx and sy and ms.isDown(1,2)then
preField[sy][sx]=ms.isDown(1)and pen or 0
end
end
function mouseMove.setting3(x,y,dx,dy)
if sel and ms.isDown(1)then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
mouseUp={}
function mouseUp.setting3(x,y,k)
if sel then
local b=virtualkey[sel]
local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k
end
end
wheelmoved={}
function wheelmoved.draw(x,y)
if y<0 then
pen=pen+1
if pen==8 then pen=9 elseif pen==14 then pen=0 end
else
pen=pen-1
if pen==8 then pen=7 elseif pen==-1 then pen=13 end
end
end
function wheelmoved.mode(x,y)
modeSel=min(max(modeSel+(y>0 and -1 or 1),1),#modeID)
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
end
touchDown={}
function touchDown.intro(id,x,y)
gotoScene("main")
end
function touchDown.draw(id,x,y)
end
function touchDown.setting3(id,x,y)
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
sel=K
end
end
end
function touchDown.play(id,x,y)
if setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
pressKey(t,players[1])
end
end
end
touchUp={}
function touchUp.setting3(id,x,y)
if sel then
x,y=xOy:inverseTransformPoint(x,y)
if sel then
local b=virtualkey[sel]
local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k
end
end
end
function touchUp.play(id,x,y)
if setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
releaseKey(t,players[1])
end
end
end
touchMove={}
function touchMove.setting3(id,x,y,dx,dy)
if sel then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
function touchMove.draw(id,x,y,dx,dy)
sx,sy=int((x-200)/30)+1,20-int((y-60)/30)
if sx<1 or sx>10 then sx=nil end
if sy<1 or sy>20 then sy=nil end
if sx and sy then
preField[sy][sx]=pen
end
end
function touchMove.play(id,x,y,dx,dy)
if setting.virtualkeySwitch then
local l=tc.getTouches()
for n=1,#virtualkey do
local b=virtualkey[n]
for i=1,#l do
local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then goto L end
end
releaseKey(n,players[1])
::L::
end
end
end
keyDown={} 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 elseif key=="escape"then
back() back()
end end
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=="d"then
gotoScene("draw")
elseif key=="return"then
loadGame(0,1)
elseif key=="space"then
loadGame(0,2)
elseif key=="escape"then
back()
end
end
function keyDown.draw(key)
if key=="delete"then
Buttons.draw.clear.code()
elseif key=="up"or key=="down"or key=="left"or key=="right"then
if not sx then sx=1 end
if not sy then sy=1 end
if key=="up"and sy<20 then sy=sy+1
elseif key=="down"and sy>1 then sy=sy-1
elseif key=="left"and sx>1 then sx=sx-1
elseif key=="right"and sx<10 then sx=sx+1
end
if kb.isDown("space")then
preField[sy][sx]=pen
end
elseif key=="space"then
if sx and sy then
preField[sy][sx]=pen
end
elseif key=="backspace"then
pen=0
elseif key=="escape"then
back()
else
pen=find("123qwea#sdzxc",key)or pen
end
end
function keyDown.setting2(key) function keyDown.setting2(key)
if key=="escape"then if key=="escape"then
back() if keyboardSetting then
keysetting,gamepadsetting=nil keyboardSetting=false
elseif keysetting then
setting.key[keysetting]=key
keysetting,gamepadsetting=nil
else else
buttonControl_key(key) back()
end
elseif keyboardSetting then
for l=1,8 do
for y=1,13 do
if setting.keyMap[l][y]==key then
setting.keyMap[l][y]=""
end
end
end
setting.keyMap[curBoard][keyboardSet]=key
keyboardSetting=false
elseif key=="return"then
keyboardSetting=true
elseif key=="up"then
keyboardSet=max(keyboardSet-1,1)
elseif key=="down"then
keyboardSet=min(keyboardSet+1,13)
elseif key=="left"then
curBoard=max(curBoard-1,1)
elseif key=="right"then
curBoard=min(curBoard+1,8)
end end
end end
function keyDown.play(key) function keyDown.play(key)
local k=players[1].gameEnv.key if key=="escape"then pauseGame()end
for i=1,11 do local m=setting.keyMap
if key==k[i]then for p=1,human do
pressKey(i) local lib=setting.keyLib[p]
break for s=1,#lib do
for k=1,12 do
if key==m[lib[s]][k]then
pressKey(k,players[p])
return
end end
end end
if key=="escape"then back()end end
end
end
function keyDown.pause(key)
if key=="escape"then
back()
elseif key=="return"or key=="space"then
resumeGame()
end
end end
keyUp={} keyUp={}
function keyUp.play(key) function keyUp.play(key)
local k=players[1].gameEnv.key local m=setting.keyMap
for i=1,10 do for p=1,human do
if key==k[i]then local lib=setting.keyLib[p]
releaseKey(i,players[1]) for s=1,#lib do
break for k=1,12 do
if key==m[lib[s]][k]then
releaseKey(k,players[p])
return
end
end
end end
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
end end
function gamepadDown.setting2(key) function gamepadDown.setting2(key)
if key=="back"then if key=="back"then
back() if joystickSetting then
keysetting,gamepadsetting=nil joystickSetting=false
elseif gamepadsetting then
setting.gamepad[gamepadsetting]=key
keysetting,gamepadsetting=nil
else else
buttonControl_gamepad(key) back()
end
elseif joystickSetting then
for l=9,16 do
for y=1,12 do
if setting.keyMap[l][y]==key then
setting.keyMap[l][y]=""
end
end
end
setting.keyMap[8+curBoard][joystickSet]=key
joystickSetting=false
elseif key=="start"then
joystickSetting=true
elseif key=="up"then
joystickSet=max(joystickSet-1,1)
elseif key=="down"then
joystickSet=min(joystickSet+1,12)
elseif key=="left"then
curBoard=max(curBoard-1,1)
elseif key=="right"then
curBoard=min(curBoard+1,8)
end end
end end
function gamepadDown.play(key) function gamepadDown.play(key)
local k=players[1].gameEnv.gamepad if key=="back"then back()return end
for i=1,11 do local m=setting.keyMap
if key==k[i]then for p=1,4 do
pressKey(i) local lib=setting.keyLib[p]
break for s=1,#lib do
for k=1,12 do
if key==m[8+lib[s]][k]then
pressKey(k,players[p])
return
end
end
end end
end end
if key=="escape"then back()end
end end
gamepadUp={} gamepadUp={}
function gamepadUp.play(key) function gamepadUp.play(key)
local k=players[1].gameEnv.gamepad local m=setting.keyMap
for i=1,10 do for p=1,4 do
if key==k[i]then local lib=setting.keyLib[p]
releaseKey(i,players[1]) for s=1,#lib do
break for k=1,12 do
if key==m[8+lib[s]][k]then
releaseKey(k,players[p])
return
end
end end
end end
end end
wheelmoved={}
function wheelmoved.mode(x,y)
modeSel=min(max(modeSel-sgn(y),1),#modeID)
end end
--Warning,these are not system callbacks!
function love.mousemoved(x,y,dx,dy,t)
if not t then
mouseShow=true
mx,my=convert(x,y)
Buttons.sel=nil
for i=1,#Buttons[scene]do
local B=Buttons[scene][i]
if not(B.hide and B.hide())then
if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then
Buttons.sel=i
return nil
end
end
end
end
end
function love.mousepressed(x,y,k,t,num) function love.mousepressed(x,y,k,t,num)
if not t then if t then return end
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
mouseDown[scene](mx,my,k)
elseif k==2 then
back()
end
if k==1 then if k==1 then
if not sceneSwaping and Buttons.sel then if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel] local B=Buttons.sel
B.code() B.code()
B.alpha=1 B.alpha=1
Buttons.sel=nil Buttons.sel=nil
love.mousemoved(x,y) love.mousemoved(x,y,0,0)
sysSFX("button") sysSFX("button")
end end
elseif k==3 then end
back() end
function love.mousemoved(x,y,dx,dy,t)
if t then return end
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
Buttons.sel=nil
if mouseMove[scene]then
mouseMove[scene](mx,my,dx/scr.k,dy/scr.k)
end
for _,B in next,Buttons[scene]do
if not(B.hide and B.hide())then
if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then
Buttons.sel=B
return
end
end end
end end
end end
function love.mousereleased(x,y,k,t,num) function love.mousereleased(x,y,k,t,num)
if t then return end
mx,my=xOy:inverseTransformPoint(x,y)
if mouseUp[scene]then
mouseUp[scene](mx,my,k)
end end
end
function love.wheelmoved(x,y)
if wheelmoved[scene]then wheelmoved[scene](x,y)end
end
function love.touchpressed(id,x,y) function love.touchpressed(id,x,y)
if not touching then if not touching then
touching=id touching=id
love.mousemoved(x,y) love.mousemoved(x,y,0,0)
mouseShow=false mouseShow=false
end end
if scene=="play"and setting.virtualkeySwitch then if touchDown[scene]then
local t=onVirtualkey(x,y) touchDown[scene](id,xOy:inverseTransformPoint(x,y))
if t then
pressKey(t)
end
end end
end end
function love.touchreleased(id,x,y) function love.touchreleased(id,x,y)
if id==touching then if id==touching then
touching=nil touching=nil
if Buttons.sel then if Buttons.sel then
local B=Buttons[scene][Buttons.sel] local B=Buttons.sel
B.code() B.code()
B.alpha=1 B.alpha=1
Buttons.sel=nil Buttons.sel=nil
sysSFX("button")
end end
Buttons.sel=nil Buttons.sel=nil
mouseShow=false mouseShow=false
end end
if scene=="play"and setting.virtualkeySwitch then if touchUp[scene]then
local t=onVirtualkey(x,y) touchUp[scene](id,xOy:inverseTransformPoint(x,y))
if t then
releaseKey(t)
end
end end
end end
function love.touchmoved(id,x,y,dx,dy) function love.touchmoved(id,x,y,dx,dy)
love.mousemoved(x,y)
mouseShow=false
if not Buttons.sel then if not Buttons.sel then
touching=nil touching=nil
end end
if scene=="play"and setting.virtualkeySwitch then x,y=xOy:inverseTransformPoint(x,y)
local l=tc.getTouches() if touchMove[scene]then
for n=1,#virtualkey do touchMove[scene](id,x,y,dx/scr.k,dy/scr.k)
local b=virtualkey[n]
local p=false
for i=1,#l do
local x,y=convert(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then
p=true
break
end end
end for _,B in next,Buttons[scene]do
if not p and players[1].keyPressing then if not(B.hide and B.hide())then
releaseKey(n) if abs(x-B.x)<B.w*.5 and abs(y-B.y)<B.h*.5 then
end Buttons.sel=B
end return
elseif scene=="setting3"then
x,y=convert(x,y)
dx,dy=dx*screenK,dy*screenK
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
b[1],b[2]=b[1]+dx,b[2]+dy
end end
end end
end end
end end
function love.keypressed(i) function love.keypressed(i)
if i=="f8"then devMode=not devMode end
if devMode then
if i=="k"then
P=players.alive[rnd(#players.alive)]
Event_gameover.lose()
--Test code here
elseif i=="q"then
for k,B in next,Buttons[scene]do
print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h))
end
elseif i=="s"then
print(scr.x,scr.y,scr.w,scr.h,scr.k)
elseif Buttons.sel then
local B=Buttons.sel
if i=="left"then B.x=B.x-10
elseif i=="right"then B.x=B.x+10
elseif i=="up"then B.y=B.y-10
elseif i=="down"then B.y=B.y+10
elseif i==","then B.w=B.w-10
elseif i=="."then B.w=B.w+10
elseif i=="/"then B.h=B.h-10
elseif i=="'"then B.h=B.h+10
end
end
else
if keyDown[scene]then keyDown[scene](i) if keyDown[scene]then keyDown[scene](i)
elseif i=="escape"or i=="back"then back() elseif i=="escape"or i=="back"then back()
else buttonControl_key(i) else buttonControl_key(i)
end end
end end
mouseShow=false
end
function love.keyreleased(i) function love.keyreleased(i)
if keyUp[scene]then keyUp[scene](i) if keyUp[scene]then keyUp[scene](i)
end end
end end
function love.gamepadpressed(joystick,i) function love.gamepadpressed(joystick,i)
if scene~="play"or scene=="setting2"and not gamepadsetting then
if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then
if not Buttons.sel then
Buttons.sel=1
mouseShow=false
else
Buttons.sel=Buttons[scene][Buttons.sel][i]or Buttons.sel
end
elseif i=="start"then
if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel]
B.code()
B.alpha=1
sysSFX("button")
end
end
end
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)
end end
end end
--[[
function love.wheelmoved(x,y) function love.joystickpressed(js,k)end
if wheelmoved[scene]then wheelmoved[scene](x,y)end function love.joystickaxis(js,axis,valend
function love.joystickhat(js,hat,dirend
function love.sendData(data)end
function love.receiveData(id,data)end
]]
function love.lowmemory()
collectgarbage()
end
function love.resize(w,h)
if w>=h then scr.w,scr.h=w,h
else scr.w,scr.h=h,w
end
scr.r=h/w
if h/w>=.5625 then
scr.k=w/1280
scr.x,scr.y=0,(h-w*9/16)*.5
else
scr.k=h/720
scr.x,scr.y=(w-h*16/9)*.5,0
end
xOy=xOy:setTransformation(w*.5,h*.5,nil,scr.k,nil,640,360)
gc.replaceTransform(xOy)
collectgarbage()
end
function love.focus(f)
if not f and wd.isMinimized()and scene=="play"then pauseGame()end
end end
function love.update(dt) function love.update(dt)
--[[ --[[
if players then if players then
@@ -301,115 +685,101 @@ function love.update(dt)
BGblock[i].y=BGblock[i].y+BGblock[i].v BGblock[i].y=BGblock[i].y+BGblock[i].v
if BGblock[i].y>720 then rem(BGblock,i)end if BGblock[i].y>720 then rem(BGblock,i)end
end end
BGblock.ct=BGblock.ct-1 if setting.bgblock then
if BGblock.ct==0 then BGblock.tm=BGblock.tm-1
if BGblock.tm==0 then
ins(BGblock,getNewBlock()) ins(BGblock,getNewBlock())
BGblock.ct=rnd(20,30) BGblock.tm=rnd(20,30)
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
for i=1,#Buttons[scene]do for k,B in next,Buttons[scene]do
Buttons[scene][i].alpha=0 B.alpha=0
end--Reset buttons' state end--Reset buttons' alpha
game[sceneSwaping.tar]() scene=sceneSwaping.tar
sceneInit[scene]()
Buttons.sel=nil Buttons.sel=nil
elseif sceneSwaping.time==0 then elseif sceneSwaping.time==0 then
sceneSwaping=nil sceneSwaping=nil
end end
elseif Tmr[scene]then end
if Tmr[scene]then
Tmr[scene](dt) Tmr[scene](dt)
end end
--scene swapping & Timer for i=#Task,1,-1 do
Task[i]:update()
end end
function love.receiveData(id,data) updateButton()
return nil
end end
function love.draw() function love.draw()
Pnt.BG[curBG]() gc.discard()--SPEED UPUPUP!
gc.setColor(1,1,1,.3) Pnt.BG[setting.bg and curBG or"grey"]()
gc.setColor(1,1,1,.2)
for n=1,#BGblock do for n=1,#BGblock do
local b,img=BGblock[n].b,blockSkin[BGblock[n].bn] local b,img=BGblock[n].b,blockSkin[BGblock[n].bn]
local size=BGblock[n].size local size=BGblock[n].size
for i=1,#b do for j=1,#b[1]do for i=1,#b do for j=1,#b[1]do
if b[i][j]>0 then if b[i][j]then
gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size) gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size)
end end
end end--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][2]-.5,#blocks[r][0]-scs[r][1]+.5)
gc.setColor(1,1,1,.5)
gc.circle("fill",mx,my,5)
gc.setColor(1,1,1) 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
if scr.r==.5625 then goto L end
if scr.r>.5625 then
gc.setColor(0,0,0) gc.setColor(0,0,0)
if screenM>0 then gc.rectangle("fill",0,0,1280,scr.w*9/16-scr.h)
gc.rectangle("fill",0,0,1280,-screenM) gc.rectangle("fill",0,720,1280,scr.h-scr.w*9/16)
gc.rectangle("fill",0,720,1280,screenM) else
end--Draw black side gc.setColor(0,0,0)
gc.rectangle("fill",0,0,scr.h*16/9-scr.w,720)
setFont(20)gc.setColor(1,1,1) gc.rectangle("fill",1280,0,scr.w-scr.h*16/9,720)
gc.print(tm.getFPS(),0,700) end
gc.print(gcinfo(),0,680) ::L::
--if gcinfo()>500 then collectgarbage()end setFont(20)gc.setColor(1,1,1)
gc.print(tm.getFPS(),5,700)
if devMode then
gc.print(gcinfo(),5,680)
gc.print(#freeRow or 0,5,660)
end end
function love.resize(x,y)
screenK=1280/gc.getWidth()
screenM=(gc.getHeight()*16/9-gc.getWidth())/2
gc.origin()
gc.scale(1/screenK,1/screenK)
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()) scene="load"sceneInit.load()--System Launch
game.load()--System scene Launch
math.randomseed(os.time()*626)--true A-lthour's ID!
return function() return function()
love.event.pump() love.event.pump()
for name,a,b,c,d,e,f in love.event.poll()do for name,a,b,c,d,e,f in love.event.poll()do
if name=="quit"then return 0 end if name=="quit"then return 0 end
love.handlers[name](a,b,c,d,e,f) if love[name]then love[name](a,b,c,d,e,f)end
end end
if focus then
tm.step() tm.step()
-- love.receiveData(id,data) -- love.receiveData(id,data)
love.update(tm.getDelta()) love.update(tm.getDelta())
readyDrawFrame=readyDrawFrame+setting.frameMul readyDrawFrame=readyDrawFrame+setting.frameMul
if readyDrawFrame>=100 then if readyDrawFrame>=100 then
readyDrawFrame=readyDrawFrame-100 readyDrawFrame=readyDrawFrame-100
gc.clear()
love.draw() love.draw()
gc.present() gc.present()
end end
if not wd.hasFocus()then ::L::if Timer()-frameT<1/60 then goto L end
focus=false
ms.setVisible(true)
if bgmPlaying then bgm[bgmPlaying]:pause()end
if scene=="play"then
for i=1,#players[1].keyPressing do
if players[1].keyPressing[i]then
releaseKey(i)
end
end
end
end
else
tm.sleep(.1)
if wd.hasFocus()then
focus=true
ms.setVisible(false)
if bgmPlaying then bgm[bgmPlaying]:play()end
end
end
while Timer()-frameT<1/60 do end
frameT=Timer() frameT=Timer()
tm.sleep(.001)
end end
end end

BIN
cb.ttf

Binary file not shown.

44
class.lua Normal file
View File

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

View File

@@ -1,26 +1,26 @@
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.5" W.title="Techmino V0.7.16"
W.icon="/image/icon.png" W.icon="/image/icon.png"
W.width,W.height=1280,720 W.width,W.height=1280,720
W.minwidth,W.minheight=640,360
W.borderless=X W.borderless=X
W.resizable=true W.resizable=true
W.minwidth,W.minheight=640,360
W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string) W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string)
W.fullscreen=X W.fullscreen=X
W.vsync=1 W.vsync=0--0→∞fps
W.msaa=X--The number of samples to use with multi-sampled antialiasing (number) W.msaa=X--The number of samples to use with multi-sampled antialiasing (number)
W.depth=X--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

1080
dataList.lua Normal file

File diff suppressed because it is too large Load Diff

BIN
font.ttf Normal file

Binary file not shown.

View File

@@ -1,63 +0,0 @@
game={}
function game.load()
scene="load"
curBG="none"
loading=1--Loading mode
loadnum=1--Loading counter
loadprogress=0--Loading bar
end
function game.intro()
scene="intro"
curBG="none"
end
function game.main()
scene="main"
curBG="none"
BGM("blank")
collectgarbage()
end
function game.mode()
saveData()
modeSel=modeSel or 1
if players then restockRow()end--collectGarbage
scene="mode"
curBG="none"
BGM("blank")
end
function game.play()
scene="play"
--curBG="game1"
resetGameData()
sysSFX("ready")
mouseShow=false
end
function game.setting()
scene="setting"
curBG="none"
BGM("blank")
end--Normal setting
function game.setting2()
scene="setting2"
curBG="none"
keyssetting=nil
BGM("blank")
end--Advanced setting and keyboard&joystick setting
function game.setting3()
scene="setting3"
curBG="game1"
keyssetting=nil
BGM("blank")
end--Touch setting
function game.help()
scene="help"
curBG="none"
BGM("blank")
end
function game.stat()
scene="stat"
curBG="none"
BGM("blank")
end
function game.quit()
love.event.quit()
end

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.5 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

View File

Before

Width:  |  Height:  |  Size: 404 B

After

Width:  |  Height:  |  Size: 404 B

View File

Before

Width:  |  Height:  |  Size: 882 B

After

Width:  |  Height:  |  Size: 882 B

View File

Before

Width:  |  Height:  |  Size: 973 B

After

Width:  |  Height:  |  Size: 973 B

BIN
image/mess/badge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 B

BIN
image/mess/groupcode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
image/mess/light.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

BIN
image/mess/lightBulb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 638 B

BIN
image/mess/paycode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

BIN
image/virtualkey/func.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

230
language/chi.lua Normal file
View File

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

230
language/eng.lua Normal file
View File

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

672
list.lua
View File

@@ -1,9 +1,13 @@
local gc=love.graphics
local sys=love.system
local fs=love.filesystem
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","func","restart","insLeft","insRight","insDown"}
color={ color={
red={1,0,0}, red={1,0,0},
green={0,1,0}, green={0,1,0},
blue={.2,.2,1}, blue={.2,.2,1},
yellow={1,1,0}, yellow={1,1,0},
purple={1,0,1}, magenta={1,0,1},
cyan={0,1,1}, cyan={0,1,1},
grey={.6,.6,.6}, grey={.6,.6,.6},
@@ -11,351 +15,167 @@ color={
lightGreen={.5,1,.5}, lightGreen={.5,1,.5},
lightBlue={.6,.6,1}, lightBlue={.6,.6,1},
lightYellow={1,1,.5}, lightYellow={1,1,.5},
lightPurple={1,.5,1}, lightMagenta={1,.5,1},
lightCyan={.5,1,1}, lightCyan={.5,1,1},
lightGrey={.8,.8,.8}, lightGrey={.8,.8,.8},
darkRed={.6,0,0},
darkGreen={0,.6,0},
darkBlue={0,0,.6},
darkYellow={.6,.6,0},
darkMagenta={.6,0,.6},
darkCyan={0,.6,.6},
darkGrey={.3,.3,.3}, darkGrey={.3,.3,.3},
white={1,1,1}, white={1,1,1},
orange={1,.6,0} orange={1,.6,0},
lightOrange={1,.7,.3},
purple={.5,0,1},
lightPurple={.8,.4,1},
darkPurple={.3,0,.6},
} }
attackColor={
{color.red,color.yellow},
{color.red,color.purple},
{color.blue,color.white},
animate={
function(t)
gc.setColor(1,t,0)
end,
function(t)
gc.setColor(1,0,t)
end,
function(t)
gc.setColor(t,t,1)
end,
}--3 animation-colorsets of attack buffer bar
}
blockName={"Z","S","L","J","T","O","I"}
blockColor={ blockColor={
color.red, color.red,
color.green, color.green,
color.orange, color.orange,
color.blue, color.blue,
color.purple, color.magenta,
color.yellow, color.yellow,
color.cyan, color.cyan,
color.darkGreen,
color.darkGrey,
color.grey,
color.darkPurple,
color.darkRed,
color.darkGreen,
} }
clearName={"Single","Double","Triple"} sfx={
spinName={[0]={}} "button","swipe",
for i=1,3 do
spinName[i]={}
for j=1,7 do
spinName[i][j]=blockName[j].." spin "..clearName[i]
end
end
for j=1,7 do
spinName[0][j]=blockName[j].." spin"
end
prevMenu={ "ready","start","win","fail","collect",
load=love.event.quit, "move","rotate","rotatekick","hold",
ready="mode", "prerotate","prehold",
play="mode", "lock","drop","fall",
mode="main", "reach",
help="main", "ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","ren_10","ren_11",
stat="main", "clear_1","clear_2","clear_3","clear_4",
setting="main", "spin_0","spin_1","spin_2","spin_3",
setting2="setting", "emit","blip_1","blip_2",
setting3="setting", "perfectclear",
intro="quit", }
main="quit", bgm={
"blank",
"way",
"race",
"newera",
"push",
"reason",
"infinite",
"cruelty",
"final",
"secret7th",
"secret8th",
"rockblock",
"end",
} }
modeID={"sprint","marathon","zen","solo","death","blind","tetris41","asymsolo","gmroll",} customID={
modeName={"Sprint","Marathon","Zen","Solo","Death","Blind","Tetris 41","Asymmetry solo","GM roll",} "drop",
modeInfo={ "lock",
sprint="Clear 40 Lines", "wait",
marathon="Clear 200 Lines", "fall",
zen="Clear 200 Lines without gravity", "next",
solo="Beat AI", "hold",
death="Survive under terrible speed", "sequence",
blind="Invisible board!", "visible",
tetris41="Melee fight with 40 AIs", "target",
asymsolo=" See-->", "freshLimit",
gmroll="Who want to be the grand master?", "opponent",
}
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={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
next={0,1,2,3,4,5,6},
hold={true,false,true},
sequence={"bag7","his4","rnd"},
visible={"show","time","fast","none"},
target={10,20,40,100,200,500,1000,1e99},
freshLimit={0,8,15,1e99},
opponent={0,60,30,20,15,10,7,5,4,3,2,1},
} }
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","restart","toLeft","toRight","toDown"} RCPB={10,33,200,33,105,5,105,60}
actName_show={"move left","move right","rotate right","rotate left","rotate flip","hard drop","soft drop","hold","restart","toLeft","toRight","toDown"} snapLevelValue={1,10,20,40,60,80}
blockPos={4,4,4,4,4,5,4} up0to4={[0]="000%UP","025%UP","050%UP","075%UP","100%UP",}
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",}
b2bATK={3,5,8}
spin_n={"spin_1","spin_2","spin_3"}
clear_n={"clear_1","clear_2","clear_3","clear_4"}
ren_n={"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","ren_10","ren_11"}
percent0to5={[0]="0%","20%","40%","60%","80%","100%",} percent0to5={[0]="0%","20%","40%","60%","80%","100%",}
marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0} modeID={
death_lock={10,9,8,7,6} [0]="custom",
death_wait={6,5,4,3,2} "sprint","marathon","master","classic","zen","infinite","solo","tsd","blind","dig","survivor","tech",
death_fall={10,8,7,6,5} "pctrain","pcchallenge","techmino41","techmino99","drought","hotseat",
act={
moveLeft=function(auto)
if not auto then P.moving=-1 end
if not ifoverlap(cb,cx-1,cy)then
P.cx=cx-1
freshgho()
freshLockDelay()
if cy==y_img then SFX("move")end
P.spinLast=false
end
end,
moveRight=function(auto)
if not auto then P.moving=1 end
if not ifoverlap(cb,cx+1,cy)then
P.cx=cx+1
freshgho()
freshLockDelay()
if cy==y_img then SFX("move")end
P.spinLast=false
end
end,
hardDrop=function()
if P.waiting<=0 then
if cy~=y_img then
P.cy=y_img
P.spinLast=false
SFX("drop")
end
drop()
P.keyPressing[6]=false
end
end,
softDrop=function()
if cy~=y_img then P.cy=cy-1 end
P.downing=1
end,
rotRight=function()spin(1)end,
rotLeft=function()spin(-1)end,
rotFlip=function()spin(2)end,
hold=function()hold()end,
--Player movements
restart=function()
resetGameData()
count=60+26--Althour'z neim
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,
toDown=function()if cy~= y_img then P.cy,P.lockDelay,P.spinLast=y_img,gameEnv.lock,false end end,
toLeft=function()while not ifoverlap(cb,cx-1,cy)do P.cx,P.lockDelay=cx-1,gameEnv.lock;freshgho()end end,
toRight=function()while not ifoverlap(cb,cx+1,cy)do P.cx,P.lockDelay=cx+1,gameEnv.lock;freshgho()end end,
quit=function()Event.gameover.lose()end,
--System movements
} }
modeLevel={
sprint={"10L","20L","40L","100L","400L","1000L"},
marathon={"EASY","NORMAL","HARD"},
master={"LUNATIC","ULTIMATE"},
classic={"CTWC"},
zen={"NORMAL"},
infinite={"NORMAL"},
solo={"EASY","NORMAL","HARD","LUNATIC"},
tsd={"NORMAL","HARD"},
blind={"EASY","HARD","HARD+","LUNATIC","ULTIMATE","GM"},
dig={"NORMAL","LUNATIC"},
survivor={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
tech={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
pctrain={"NORMAL","EXTRA"},
pcchallenge={"NORMAL","HARD","LUNATIC"},
techmino41={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
techmino99={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
drought={"NORMAL","MESS"},
hotseat={"2P","3P","4P",},
custom={"Normal","Puzzle"},
}
local t,f=true,false
blocks={ 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]={{f,t,t},{t,t,f}},{{t,f},{t,t},{f,t}}},
{[0]={{1,1,0},{0,1,1}},{{0,1},{1,1},{1,0}},{{1,1,0},{0,1,1}},{{0,1},{1,1},{1,0}}}, {[0]={{t,t,f},{f,t,t}},{{f,t},{t,t},{t,f}}},
{[0]={{1,1,1},{0,0,1}},{{1,1},{1,0},{1,0}},{{1,0,0},{1,1,1}},{{0,1},{0,1},{1,1}}}, {[0]={{t,t,t},{f,f,t}},{{t,t},{t,f},{t,f}},{{t,f,f},{t,t,t}},{{f,t},{f,t},{t,t}}},
{[0]={{1,1,1},{1,0,0}},{{1,0},{1,0},{1,1}},{{0,0,1},{1,1,1}},{{1,1},{0,1},{0,1}}}, {[0]={{t,t,t},{t,f,f}},{{t,f},{t,f},{t,t}},{{f,f,t},{t,t,t}},{{t,t},{f,t},{f,t}}},
{[0]={{1,1,1},{0,1,0}},{{1,0},{1,1},{1,0}},{{0,1,0},{1,1,1}},{{0,1},{1,1},{0,1}}}, {[0]={{t,t,t},{f,t,f}},{{t,f},{t,t},{t,f}},{{f,t,f},{t,t,t}},{{f,t},{t,t},{f,t}}},
{[0]={{1,1},{1,1}},{{1,1},{1,1}},{{1,1},{1,1}},{{1,1},{1,1}}}, {[0]={{t,t},{t,t}},{{t,t},{t,t}}},
{[0]={{1,1,1,1}},{{1},{1},{1},{1}},{{1,1,1,1}},{{1},{1},{1},{1}}}, {[0]={{t,t,t,t}},{{t},{t},{t},{t}}},
} }
scs={ local l={1,2,6,7}for i=1,4 do blocks[l[i]][2],blocks[l[i]][3]=blocks[l[i]][0],blocks[l[i]][1]end
{[0]={1,2},{2,1},{2,2},{2,2}}, for i=1,7 do blocks[i+7]=blocks[i]end
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1.5,1.5},{1.5,1.5},{1.5,1.5},{1.5,1.5},},
{[0]={0.5,2.5},{2.5,0.5},{1.5,2.5},{2.5,1.5}},
}
TRS={
[1]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,1}},
[10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}},
[12]={{0,0},{1,0},{1,-1},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}},
[32]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}},
[30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}},
[03]={{0,0},{1,0},{1,1},{0,-2},{1,-2}},
[02]={{0,0},{1,0},{-1,0},{0,-1},{0,1}},
[20]={{0,0},{-1,0},{1,0},{0,1},{0,-1}},
[13]={{0,0},{0,1},{0,-1},{-1,0},{1,0},{0,2}},
[31]={{0,0},{0,-1},{0,1},{1,0},{-1,0},{0,2}},
},
[2]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[10]={{0,0},{1,0},{1,-1},{0,2},{1,2}},
[12]={{0,0},{1,0},{1,-1},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}},
[32]={{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},{0,1}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
[20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{0,0},{0,-1},{0,1},{1,0},{-1,0},{0,2}},
[31]={{0,0},{0,1},{0,-1},{-1,0},{1,0},{0,2}},
},
[5]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}},
[12]={{0,0},{1,0},{1,-1},{0,2},{1,2}},
[21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}},
[32]={{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},{0,1}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
[20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{0,0},{0,-1},{0,1},{1,0},{-1,0},{0,2}},
[31]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}},
},
[7]={
[01]={{0,0},{-2,0},{1,0},{-2,-1},{1,2}},
[10]={{0,0},{2,0},{-1,0},{2,1},{-1,-2}},
[12]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}},
[21]={{0,0},{1,0},{-2,0},{1,-2},{-2,1}},
[23]={{0,0},{2,0},{-1,0},{2,1},{-1,-2}},
[32]={{0,0},{-2,0},{1,0},{-2,-1},{1,2}},
[30]={{0,0},{1,0},{-2,0},{1,-2},{-2,1}},
[03]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
[20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{0,0},{0,-1},{-1,0},{1,0},{0,1}},
[31]={{0,0},{0,-1},{1,0},{-1,0},{0,1}},
}
}TRS[3],TRS[4]=TRS[2],TRS[1]
Buttons={ local virtualkeySet={
load={}, {
intro={}, {80,720-200,6400,80},--moveLeft
main={ {320,720-200,6400,80},--moveRight
{x=250,y=300,w=330,h=60,rgb=color.red,t="Play",code=function()gotoScene("mode")end,down=2}, {1280-80,720-200,6400,80},--rotRight
{x=250,y=380,w=330,h=60,rgb=color.blue,t="Settings",code=function()gotoScene("setting")end,up=1,down=3}, {1280-200,720-80,6400,80},--rotLeft
{x=165,y=460,w=160,h=60,rgb=color.yellow,t="Help",code=function()gotoScene("help")end,up=2,down=5,right=4}, {1280-200,720-320,6400,80},--rotFlip
{x=335,y=460,w=160,h=60,rgb=color.cyan,t="Statistics",code=function()gotoScene("stat")end,up=2,down=5,left=3}, {200,720-320,6400,80},--hardDrop
{x=250,y=540,w=330,h=60,rgb=color.grey,t="Quit",code=function()gotoScene("quit")end,up=3}, {200,720-80,6400,80},--softDrop
}, {1280-320,720-200,6400,80},--hold
mode={ {1280-80,280,6400,80},--func
{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}, {80,280,6400,80},--restart
{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}, },--Farter's set 3
{x=1000,y=600,w=180,h=80,rgb=color.green,t="Start",hide=function()return not setting.virtualkeySwitch end,code=function()startGame(modeID[modeSel])end}, {
{x=640,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()gotoScene("main")end}, {1280-320,720-200,6400,80},--moveLeft
}, {1280-80,720-200,6400,80},--moveRight
play={ {200,720-80,6400,80},--rotRight
}, {80,720-200,6400,80},--rotLeft
setting={--Normal setting {200,720-320,6400,80},--rotFlip
{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=6,right=2}, {1280-200,720-320,6400,80},--hardDrop
{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=6,left=1,right=3}, {1280-200,720-80,6400,80},--softDrop
{x=870,y=100,w=340,h=60,rgb=color.white,t=function()return setting.sfx and"Disable SFX"or"Enable SFX"end,code=function()setting.sfx=not setting.sfx end,down=4,left=2}, {320,720-200,6400,80},--hold
{x=870,y=180,w=340,h=60,rgb=color.white,t=function()return setting.bgm and"Disable BGM"or"Enable BGM"end,code=function()BGM()setting.bgm=not setting.bgm;BGM("blank")end,up=3,down=5,left=2}, {80,280,6400,80},--func
{x=870,y=260,w=340,h=60,rgb=color.white,t=function()return setting.fullscreen and"Disable fullscreen"or"Enable fullscreen"end, {1280-80,280,6400,80},--restart
code=function() },--Mirrored farter's set 3
setting.fullscreen=not setting.fullscreen {
love.window.setFullscreen(setting.fullscreen)
if not setting.fullscreen then
love.resize(gc.getWidth(),gc.getHeight())
end
end,
up=4,down=7,left=6
},
{x=435,y=220,w=320,h=60,rgb=color.green,t="Advanced settings",code=function()gotoScene("setting2")end,up=1,down=7,right=5},
{x=435,y=300,w=320,h=60,rgb=color.yellow,t="Touch settings",code=function()gotoScene("setting3")end,up=6,down=8,right=5},
{x=640,y=590,w=210,h=60,rgb=color.white,t="Save&Back",code=function()saveSetting()back()end,up=6},
},
setting2={--Advanced setting
{x=290,y=70 ,w=160,h=45,rgb=color.white,t=function()return setting.key[1]end,code=function()keysetting,gamepadsetting=1 end,up=1,down=2,right=10},
{x=290,y=130,w=160,h=45,rgb=color.white,t=function()return setting.key[2]end,code=function()keysetting,gamepadsetting=2 end,up=1,down=3,right=11},
{x=290,y=190,w=160,h=45,rgb=color.white,t=function()return setting.key[3]end,code=function()keysetting,gamepadsetting=3 end,up=2,down=4,right=12},
{x=290,y=250,w=160,h=45,rgb=color.white,t=function()return setting.key[4]end,code=function()keysetting,gamepadsetting=4 end,up=3,down=5,right=13},
{x=290,y=310,w=160,h=45,rgb=color.white,t=function()return setting.key[5]end,code=function()keysetting,gamepadsetting=5 end,up=4,down=6,right=14},
{x=290,y=370,w=160,h=45,rgb=color.white,t=function()return setting.key[6]end,code=function()keysetting,gamepadsetting=6 end,up=5,down=7,right=15},
{x=290,y=430,w=160,h=45,rgb=color.white,t=function()return setting.key[7]end,code=function()keysetting,gamepadsetting=7 end,up=6,down=8,right=16},
{x=290,y=490,w=160,h=45,rgb=color.white,t=function()return setting.key[8]end,code=function()keysetting,gamepadsetting=8 end,up=7,down=9,right=17},
{x=290,y=550,w=160,h=45,rgb=color.white,t=function()return setting.key[9]end,code=function()keysetting,gamepadsetting=9 end,up=8,down=28,right=18},
--1~9
{x=540,y=70 ,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[1]end,code=function()gamepadsetting,keysetting=1 end,up=10,down=11,left=1,right=19},
{x=540,y=130,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[2]end,code=function()gamepadsetting,keysetting=2 end,up=10,down=12,left=2,right=23},
{x=540,y=190,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[3]end,code=function()gamepadsetting,keysetting=3 end,up=11,down=13,left=3,right=27},
{x=540,y=250,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[4]end,code=function()gamepadsetting,keysetting=4 end,up=12,down=14,left=4,right=27},
{x=540,y=310,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[5]end,code=function()gamepadsetting,keysetting=5 end,up=13,down=15,left=5,right=27},
{x=540,y=370,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[6]end,code=function()gamepadsetting,keysetting=6 end,up=14,down=16,left=6,right=29},
{x=540,y=430,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[7]end,code=function()gamepadsetting,keysetting=7 end,up=15,down=17,left=7,right=29},
{x=540,y=490,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[8]end,code=function()gamepadsetting,keysetting=8 end,up=16,down=18,left=8,right=29},
{x=540,y=550,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[9]end,code=function()gamepadsetting,keysetting=9 end,up=17,down=28,left=9,right=29},
--10~18
{x=745,y=90,w=40,h=40,rgb=color.white,t="-",code=function()setting.das=(setting.das-1)%31 end,left=10,right=20,down=23},
{x=910,y=90,w=40,h=40,rgb=color.white,t="+",code=function()setting.das=(setting.das+1)%31 end,left=19,right=21,down=24},
{x=960,y=90,w=40,h=40,rgb=color.white,t="-",code=function()setting.arr=(setting.arr-1)%16 end,left=20,right=22,down=25},
{x=1125,y=90,w=40,h=40,rgb=color.white,t="+",code=function()setting.arr=(setting.arr+1)%16 end,left=21,down=26},
--19~22
{x=745,y=150,w=40,h=40,rgb=color.white,t="-",code=function()setting.sddas=(setting.sddas-1)%11 end,up=19,down=27,left=10,right=24},
{x=910,y=150,w=40,h=40,rgb=color.white,t="+",code=function()setting.sddas=(setting.sddas+1)%11 end,up=20,down=27,left=23,right=25},
{x=960,y=150,w=40,h=40,rgb=color.white,t="-",code=function()setting.sdarr=(setting.sdarr-1)%6 end,up=21,down=27,left=24,right=26},
{x=1125,y=150,w=40,h=40,rgb=color.white,t="+",code=function()setting.sdarr=(setting.sdarr+1)%4 end,up=22,down=27,left=25},
--23~26
{x=935,y=220,w=320,h=65,rgb=color.white,t=function()return "frameDraw:"..setting.frameMul.."%"end,code=function()
setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10)
if setting.frameMul>100 then setting.frameMul=25 end
end,up=24,down=29,left=11},
{x=405,y=630,w=130,h=60,rgb=color.white,t="Reset",code=function()for i=1,#setting.key do setting.key[i]=gameEnv0.key[i] end end,up=9,right=29},
{x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()keysetting=nil;back()end,up=24,left=28},
--27~29
},
setting3={--Touch setting
{x=640,y=210,w=400,h=80,rgb=color.white,t=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,code=function()
setting.virtualkeySwitch=not setting.virtualkeySwitch
end},
{x=500,y=310,w=120,h=80,rgb=color.white,t="Reset",code=function()
for K=1,#virtualkey do
local b,b0=virtualkey[K],gameEnv0.virtualkey[K]
b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4]
end--Reset virtualkey
end},
{x=640,y=310,w=120,h=80,rgb=color.white,t="Snap",code=function()
for K=1,#virtualkey do
local b=virtualkey[K]
b[1],b[2]=int(b[1]*.025+.5)*40,int(b[2]*.025+.5)*40
end--Snap all keys
end},
{x=780,y=310,w=120,h=80,rgb=color.white,t=function()return percent0to5[setting.virtualkeyAlpha]end,code=function()
setting.virtualkeyAlpha=(setting.virtualkeyAlpha+1)%6
--Adjust virtualkey alpha
end},
{x=500,y=410,w=120,h=80,rgb=color.white,t="Icon",code=function()
setting.virtualkeyIcon=not setting.virtualkeyIcon
--Switch virtualkey icon
end},
{x=640,y=410,w=120,h=80,rgb=color.white,t="Back",code=function()back()end},
{x=780,y=410,w=120,h=80,rgb=color.white,t="Size",code=function()
for K=1,#virtualkey do
local b=virtualkey[K]
b[4]=b[4]+10
if b[4]==150 then b[4]=40 end
b[3]=b[4]^2
end
end},
},
help={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end},
},
stat={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end},
},
sel=nil,--selected button id(integer)
}
for k,v in pairs(Buttons)do
for i=1,#v do
v[i].alpha=0
end
end
virtualkey={
{80,720-80,6400,80},--moveLeft {80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight {240,720-80,6400,80},--moveRight
{1280-240,720-80,6400,80},--rotRight {1280-240,720-80,6400,80},--rotRight
@@ -364,39 +184,191 @@ 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},--func
{80,80,6400,80},--restart {80,80,6400,80},--restart
--[[ },--Author's set
{x=0,y=0,r=0},--toLeft {
{x=0,y=0,r=0},--toRight {1280-400,720-80,6400,80},--moveLeft
{x=0,y=0,r=0},--toDown {1280-80,720-80,6400,80},--moveRight
]] {240,720-80,6400,80},--rotRight
{80,720-80,6400,80},--rotLeft
{240,720-240,6400,80},--rotFlip
{1280-240,720-240,6400,80},--hardDrop
{1280-240,720-80,6400,80},--softDrop
{1280-80,720-240,6400,80},--hold
{80,720-240,6400,80},--func
{80,320,6400,80},--restart
},--Keyboard set
{
{1200-360,40,1600,40},--moveLeft
{1200-280,40,1600,40},--moveRight
{1200-520,40,1600,40},--rotRight
{1200-600,40,1600,40},--rotLeft
{1200-440,40,1600,40},--rotFlip
{1200-40,40,1600,40},--hardDrop
{1200-120,40,1600,40},--softDrop
{1200-200,40,1600,40},--hold
{1200-680,40,1600,40},--func
{1200-760,40,1600,40},--restart
},--PC key feedback
} }
Buttons={
load={},
intro={},
main={
play= {x=380,y=300,w=240,h=240,rgb=color.red,f=70,code=function()gotoScene("mode")end,down="stat",right="setting"},
setting={x=640,y=300,w=240,h=240,rgb=color.lightBlue,f=55,code=function()gotoScene("setting")end,down="stat",left="play",right="help"},
stat= {x=640,y=560,w=240,h=240,rgb=color.cyan,f=55,code=function()gotoScene("stat")end,up="setting",left="play",right="help"},
help= {x=900,y=560,w=240,h=240,rgb=color.yellow,f=55,code=function()gotoScene("help")end,up="setting",left="stat",right="quit"},
quit= {x=1180,y=620,w=120,h=120,rgb=color.lightGrey,f=50,code=function()gotoScene("quit")end,up="setting",left="help"},
},
mode={
up= {x=1000,y=210,w=200,h=140, rgb=color.white, f=64, code=function()keyDown.mode("up")end, hide=function()return modeSel==1 end,},
down= {x=1000,y=430,w=200,h=140, rgb=color.white, f=80, code=function()keyDown.mode("down")end, hide=function()return modeSel==#modeID end,},
left= {x=190, y=160,w=100,h=80, rgb=color.white, code=function()keyDown.mode("left")end, hide=function()return levelSel==1 end,},
right= {x=350, y=160,w=100,h=80, rgb=color.white, code=function()keyDown.mode("right")end,hide=function()return levelSel==#modeLevel[modeID[modeSel]]end,},
start={ x=1000, y=600,w=250,h=100, rgb=color.green, f=50, code=function()
loadGame(modeSel,levelSel)end},
custom= {x=275, y=420,w=200,h=90, rgb=color.yellow, code=function()gotoScene("custom")end},
back= {x=640, y=630,w=230,h=90, rgb=color.white, f=45, code=back},
},
custom={
up= {x=1000,y=220, w=100, h=100, rgb=color.white, code=function()optSel=(optSel-2)%#customID+1 end},
down= {x=1000,y=460, w=100, h=100, rgb=color.white,f=50, code=function()optSel=optSel%#customID+1 end},
left= {x=880, y=340, w=100, h=100, rgb=color.white,f=50, code=function()local k=customID[optSel]customSel[k]=(customSel[k]-2)%#customRange[k]+1 end},
right= {x=1120,y=340, w=100, h=100, rgb=color.white,f=50, code=function()local k=customID[optSel]customSel[k]=customSel[k]%#customRange[k]+1 end},
start1= {x=880, y=580, w=220, h=70, rgb=color.green, code=function()loadGame(0,1)end},
start2= {x=1120,y=580, w=220, h=70, rgb=color.lightPurple, code=function()loadGame(0,2)end},
draw= {x=1000,y=90, w=190, h=85, rgb=color.cyan, code=function()gotoScene("draw")end},
back= {x=640, y=630 ,w=180, h=60, rgb=color.white, code=back},
},
draw={
block1= {x=840, y=80,w=120,h=120, f=65, rgb=color.red, code=function()pen=1 end},
block2= {x=980, y=80,w=120,h=120, f=65, rgb=color.green, code=function()pen=2 end},
block3= {x=1120,y=80,w=120,h=120, f=65, rgb=color.orange, code=function()pen=3 end},
block4= {x=840, y=220,w=120,h=120, f=65, rgb=color.blue, code=function()pen=4 end},
block5= {x=980, y=220,w=120,h=120, f=65, rgb=color.magenta, code=function()pen=5 end},
block6= {x=1120,y=220,w=120,h=120, f=65, rgb=color.yellow, code=function()pen=6 end},
block7= {x=840, y=360,w=120,h=120, f=65, rgb=color.cyan, code=function()pen=7 end},
gb1= {x=980, y=360,w=120,h=120, f=65, rgb=color.darkGrey, code=function()pen=9 end},
gb2= {x=1120,y=360,w=120,h=120, f=65, rgb=color.grey, code=function()pen=10 end},
gb3= {x=840, y=500,w=120,h=120, f=65, rgb=color.darkPurple,code=function()pen=11 end},
gb4= {x=980, y=500,w=120,h=120, f=65, rgb=color.darkRed, code=function()pen=12 end},
gb5= {x=1120,y=500,w=120,h=120, f=65, rgb=color.darkGreen,code=function()pen=13 end},
erase= {x=840, y=640,w=120,h=120, f=70, rgb=color.grey, code=function()pen=0 end},
clear= {x=1120,y=640,w=120,h=120, rgb=color.white, code=function()
if clearSureTime>0 then
for y=1,20 do for x=1,10 do preField[y][x]=0 end end
clearSureTime=0
else
clearSureTime=50
end
end},
back= {x=1235,y=45,w=80,h=80, f=35, rgb=color.white, code=back},
},
play={
pause={x=1235,y=45,w=80,h=80,rgb=color.white,f=30,code=pauseGame},
},
pause={
resume= {x=640,y=400,w=240,h=100, rgb=color.white,f=50,code=resumeGame},
quit= {x=640,y=550,w=240,h=100, rgb=color.white,f=50,code=back},
},
setting={--Normal setting
ghost= {x=290, y=90, w=210, h=60, rgb=color.white,code=function()setting.ghost=not setting.ghost end,down="grid",right="center"},
center= {x=505, y=90, w=210, h=60, rgb=color.white,code=function()setting.center=not setting.center end,down="swap",left="ghost",right="sfx"},
grid= {x=290, y=160, w=210, h=60, rgb=color.white,code=function()setting.grid=not setting.grid end,up="ghost",down="fxs",right="swap"},
swap= {x=505, y=160, w=210, h=60,f=28, rgb=color.white,code=function()setting.swap=not setting.swap end,up="center",down="bg",left="grid",right="vib"},
fxs= {x=290, y=230, w=210, h=60, rgb=color.white,code=function()setting.fxs=not setting.fxs end,up="grid",down="dasU",right="bg"},
bg= {x=505, y=230, w=210, h=60, rgb=color.white,code=function()setting.bg=not setting.bg end,up="swap",down="arrD",right="fullscreen"},
Text={ dasD= {x=210, y=300, w=50, h=50, rgb=color.white,code=function()setting.das=(setting.das-1)%31 end,up="fxs",down="sddasD",right="dasU"},
load={"Loading textures","Loading BGM","Loading SFX","Finished",}, dasU= {x=370, y=300, w=50, h=50, rgb=color.white,code=function()setting.das=(setting.das+1)%31 end,up="fxs",down="sddasU",left="dasD",right="arrD"},
stat={ arrD= {x=425, y=300, w=50, h=50, rgb=color.white,code=function()setting.arr=(setting.arr-1)%16 end,up="bg",down="sdarrD",left="dasU",right="arrU"},
"Games run:", arrU= {x=585, y=300, w=50, h=50, rgb=color.white,code=function()setting.arr=(setting.arr+1)%16 end,up="bg",down="sdarrU",left="arrD",right="bgblock"},--3~6
"Games played:", sddasD= {x=210, y=370, w=50, h=50, rgb=color.white,code=function()setting.sddas=(setting.sddas-1)%11 end,up="dasD",down="lang",right="sddasU"},
"Game time:", sddasU= {x=370, y=370, w=50, h=50, rgb=color.white,code=function()setting.sddas=(setting.sddas+1)%11 end,up="dasU",down="lang",left="sddasD",right="sdarrD"},
"Total block used:", sdarrD= {x=425, y=370, w=50, h=50, rgb=color.white,code=function()setting.sdarr=(setting.sdarr-1)%4 end,up="arrD",down="lang",left="sddasU",right="sdarrU"},
"Total rows cleared:", sdarrU= {x=585, y=370, w=50, h=50, rgb=color.white,code=function()setting.sdarr=(setting.sdarr+1)%4 end,up="arrU",down="lang",left="sdarrD",right="frame"},
"Total lines sent:",
"Total key pressed:", sfx= {x=760,y=90, w=160, h=60, rgb=color.white,code=function()setting.sfx=not setting.sfx end,down="vib",left="center",right="bgm"},
"Total rotate:", bgm= {x=940,y=90, w=160, h=60, rgb=color.white,code=function()
"Total hold:", BGM()
"Total spin:", setting.bgm=not setting.bgm
BGM("blank")
end,down="vib",left="sfx"},
vib= {x=850,y=160, w=340,h=60,rgb=color.white, code=function()
setting.vib=(setting.vib+1)%5
VIB(2)
end,up="sfx",down="fullscreen",left="swap"},
fullscreen= {x=850,y=230, w=340,h=60,rgb=color.white, code=function()
setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen)
if not setting.fullscreen then
love.resize(gc.getWidth(),gc.getHeight())
end
end,up="vib",down="bgblock",left="bg"},
bgblock={x=850,y=300, w=340,h=60,rgb=color.white, code=function()
setting.bgblock=not setting.bgblock
if not setting.bgblock then
for i=1,16 do
BGblockList[i].v=3*BGblockList[i].v
end
end
end,up="fullscreen",down="frame",left="arrU"},
frame= {x=850,y=370, w=340,h=60,rgb=color.white, code=function()
setting.frameMul=setting.frameMul+(setting.frameMul<50 and 5 or 10)
if setting.frameMul>100 then setting.frameMul=25 end
end,up="bgblock",down="control",left="sdarrU"},
control={x=850,y=440, w=340,h=60,rgb=color.green, code=function()gotoScene("setting2")end,up="frame",down="touch",left="lang"},
touch= {x=850,y=510, w=340,h=60,rgb=color.yellow,code=function()gotoScene("setting3")end,up="control",down="back",left="lang"},
lang= {x=280,y=510, w=200,h=60,rgb=color.red, code=function()
setting.lang=setting.lang%#langName+1
swapLanguage(setting.lang)
end,up="sddasD",down="back",right="touch"},
back= {x=640,y=620, w=300,h=70,rgb=color.white, code=back,up="touch"},
},
setting2={--Control setting
back={x=840,y=630,w=180,h=60,rgb=color.white,code=back},
},
setting3={--Touch setting
back={x=640,y=410,w=170,h=80,f=45,code=back},
hide={x=640,y=210,w=500,h=80,f=45,code=function()
setting.virtualkeySwitch=not setting.virtualkeySwitch
end},
default={x=450,y=310,w=170,h=80,code=function()
for K=1,#virtualkey do
local b,b0=virtualkey[K],virtualkeySet[defaultSel][K]
b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4]
end--Default virtualkey
defaultSel=defaultSel%5+1
end},
snap={x=640,y=310,w=170,h=80,code=function()
snapLevel=snapLevel%6+1
end},
alpha={x=830,y=310,w=170,h=80,f=45,code=function()
setting.virtualkeyAlpha=(setting.virtualkeyAlpha+1)%6
--Adjust virtualkey alpha
end},
icon={x=450,y=410,w=170,h=80,f=45,code=function()
setting.virtualkeyIcon=not setting.virtualkeyIcon
--Switch virtualkey icon
end},
size={x=830,y=410,w=170,h=80,f=45,code=function()
if sel then
local b=virtualkey[sel]
b[4]=b[4]+10
if b[4]==150 then b[4]=40 end
b[3]=b[4]^2
end
end},
}, },
help={ help={
"I think you don't need \"help\".", back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="qq"},
"THIS IS NOT TETRIS,and SRS NOT USED.", qq={x=980,y=590,w=230,h=60,hide=function()return system=="Android"end,rgb=color.white,code=function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,left="back"},
"But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,so DO NOT DISTIRBUTE",
"",
"Powered by LOVE2D",
"Author:MrZ E-mail:1046101471@qq.com",
"Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ",
"Tool used:VScode,GFIE,Beepbox,Goldwave",
"Special thanks:farter,teatube,flyz,and YOU!!",
"Any bugs/suggestions to my E-mail.",
}, },
stat={
back={x=640,y=590,w=180,h=60,rgb=color.white,code=back,right="path"},
path={x=980,y=590,w=250,h=60,f=30,hide=function()return system=="Android"end,rgb=color.white,code=function()sys.openURL(fs.getSaveDirectory())end,left="back"},
},
sel=nil,--selected button id(integer)
} }

478
main.lua
View File

@@ -1,404 +1,109 @@
gc,kb,ms,tc,tm,fs,wd=love.graphics,love.keyboard,love.mouse,love.touch,love.timer,love.filesystem,love.window local gc,tm=love.graphics,love.timer
toN,toS=tonumber,tostring local ms,kb=love.mouse,love.keyboard
local fs,sys=love.filesystem,love.system
int,ceil,abs,rnd,max,min,sin,cos,atan,pi=math.floor,math.ceil,math.abs,math.random,math.max,math.min,math.sin,math.cos,math.atan,math.pi int,ceil,abs,rnd,max,min,sin,cos,atan,pi=math.floor,math.ceil,math.abs,math.random,math.max,math.min,math.sin,math.cos,math.atan,math.pi
sub,gsub,find,format,byte,char=string.sub,string.gsub,string.find,string.format,string.byte,string.char sub,gsub,find,format,byte,char=string.sub,string.gsub,string.find,string.format,string.byte,string.char
ins,rem,sort=table.insert,table.remove,table.sort ins,rem,sort=table.insert,table.remove,table.sort
math.randomseed(os.time()*626)
null=function()end
ww,wh=gc.getWidth(),gc.getHeight() system=sys.getOS()
Timer=tm.getTime--Easy&Quick to get time! scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1}
mx,my,mouseShow=-20,-20,false
focus=true
system=love.system.getOS()
touching=nil--1st touching ID
scene="" scene=""
gamemode=""
bgmPlaying=nil bgmPlaying=nil
curBG="none" curBG="none"
BGblock={ct=140}
kb.setKeyRepeat(false) kb.setKeyRepeat(false)
kb.setTextInput(false) kb.setTextInput(false)
ms.setVisible(false) ms.setVisible(false)
Fonts={} local Fonts={}
function setFont(s) function setFont(s)
if s~=currentFont then if s~=currentFont then
if Fonts[s]then if Fonts[s]then
gc.setFont(Fonts[s]) gc.setFont(Fonts[s])
else else
local t=gc.setNewFont("cb.ttf",s) local t=gc.setNewFont("font.ttf",s-5)
Fonts[s]=t Fonts[s]=t
gc.setFont(t) gc.setFont(t)
end end
currentFont=s currentFont=s
end end
return Fonts[s]
end end
sfx={
"button",
"ready","start",
"move","rotate","rotatekick","hold",
"prerotate","prehold",
"drop","fall",
"reach",
"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","ren_10","ren_11",
"clear_1","clear_2","clear_3","clear_4",
"spin_0","spin_1","spin_2","spin_3",
"perfectclear",
}
bgm={
"blank",
"way",
"race",
"push",
"reason",
}
--System data
gameEnv0={ gameEnv0={
das=10,arr=2, das=10,arr=2,
sddas=0,sdarr=2, sddas=0,sdarr=2,
ghost=true,center=true, ghost=true,center=true,
grid=false,swap=true,
_20G=false,bone=false,
drop=30,lock=45, drop=30,lock=45,
wait=0,fall=20, wait=0,fall=0,
next=6,hold=true, next=6,hold=true,oncehold=true,
sequence=1,visible=1, sequence="bag7",
_20G=false,target=9e99,
freshLimit=9e99,
key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT","DOWN"}, block=true,
gamepad={"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","leftshoulder","LEFT","RIGHT","DOWN"}, keepVisible=true,visible="show",
virtualkey={ Fkey=false,puzzle=false,ospin=true,
{80,720-80,6400,80},--moveLeft freshLimit=1e99,target=1e99,reach=null,
{240,720-80,6400,80},--moveRight bg="none",bgm="race"
{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,80,6400,80},--restart
},
reach=function()end,
--these three is actually no use,only provide a key
} }
randomMethod={ customSel={
function() drop=20,
P.bn,P.cb=rem(nxt,1),rem(nb,1) lock=20,
if #nxt<6 then
local bag={1,2,3,4,5,6,7}
for i=1,7 do
ins(nxt,rem(bag,rnd(8-i)))
end
end
for i=6,#nxt do
nb[i]=blocks[nxt[i]][0]
end
end,
function()
P.bn,P.cb=rem(nxt,1),rem(nb,1)
for j=1,4 do
local i,f=rnd(7)
for k=1,4 do
if i==his[k]then f=true end
end
if not f then break end
end
P.nxt[6],P.nb[6]=i,blocks[i][0]
rem(his,1)ins(his,i)
end,
function()
P.bn,P.cb=rem(nxt,1),rem(nb,1)
repeat i=rnd(7)until i~=nxt[5]
P.nxt[6],P.nb[6]=i,blocks[i][0]
end,
}
loadmode={
sprint=function()
modeEnv={
wait=1, wait=1,
fall=1, fall=1,
target=40, next=7,
reach=Event.gameover.win, hold=1,
sequence=1,
visible=1,
target=4,
freshLimit=3,
opponent=1,
} }
createPlayer(1,340,15) preField={}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
curBG="game1" freeRow={}
BGM("race") for i=1,40 do
end, freeRow[i]={0,0,0,0,0,0,0,0,0,0}
zen=function()
modeEnv={
drop=1e99,
lock=1e99,
wait=1,
fall=1,
target=200,
reach=Event.gameover.win,
}
createPlayer(1,340,15)
curBG="strap"
BGM("reason")
end,
gmroll=function()
modeEnv={
drop=0,
lock=15,
wait=10,
fall=15,
_20G=true,
visible=0,
freshLimit=15,
arr=1,
}
createPlayer(1,340,15)
curBG="glow"
BGM("push")
end,
marathon=function()
modeEnv={
drop=60,
wait=1,
fall=20,
target=10,
reach=Event.marathon_reach,
freshLimit=15,
}
createPlayer(1,340,15)
curBG="strap"
BGM("way")
end,
death=function()
modeEnv={
_20G=true,
drop=0,
lock=10,
wait=6,
fall=10,
target=50,
reach=Event.death_reach,
freshLimit=15,
arr=1,
}
createPlayer(1,340,15)
curBG="game2"
BGM("push")
end,
tetris41=function()
modeEnv={
wait=1,
fall=1,
}
createPlayer(1,340,15)--Player
local n=2
for i=1,4 do
for j=1,5 do
createPlayer(n,75*i-48,142*j-130,.19,rnd(10))
n=n+1
end end
end
for i=9,12 do
for j=1,5 do
createPlayer(n,75*i+292,142*j-130,.19,rnd(10))
n=n+1
end
end--AIs
curBG="game3"
BGM("race")
end,
solo=function()
modeEnv={
wait=1,
fall=1,
freshLimit=15,
}
createPlayer(1,20,15)--Player
createPlayer(2,660,85,.9,1)--AI
curBG="game2"
BGM("race")
end,
blind=function()
modeEnv={
drop=15,
lock=30,
wait=1,
fall=1,
visible=0,
freshLimit=10,
}
createPlayer(1,340,15)
curBG="glow"
BGM("push")
end,
asymsolo=function()
modeEnv={
wait=1,
fall=1,
visible=2,
freshLimit=15,
}
createPlayer(1,20,15)--Player
createPlayer(2,660,85,.9,2)--AI
curBG="game2"
BGM("race")
end,
}
Event={
gameover={
win=function()
P.alive=false
P.control=false
P.timing=false
P.waiting=1e99
P.control=false
gameover=0
P.b2b=0
ins(task,Event.task.win)
end,
lose=function()
P.alive=false
P.control=false
P.timing=false
P.waiting=1e99
P.b2b=0
gameover=0
for i=1,#players.alive do
if players.alive[i]==P.id then
rem(players.alive,i)
break
end
end
for i=1,#P.atkBuffer do
P.atkBuffer[i].sent=true
P.atkBuffer[i].time=0
end
ins(task,Event.task.lose)
end,
},
marathon_reach=function()
local s=int(P.cstat.row*.1)
if s>=20 then
Event.gameover.win()
else
gameEnv.drop=marathon_drop[s]
if s==18 then gameEnv._20G=true end
gameEnv.target=s*10+10
end
end,
death_reach=function()
if gameEnv.target==250 then
Event.gameover.win()
else
gameEnv.target=gameEnv.target+50
local t=gameEnv.target/50
gameEnv.lock=death_lock[t]
gameEnv.wait=death_wait[t]
gameEnv.fall=death_fall[t]
showText("STAGE "..t,"fly",80,-120)
SFX("reach")
end
end,
task={
win=function()
gameover=gameover+1
if gameover%3==0 then
local j=gameover/3
if j<=#field then
for i=1,10 do
if field[j][i]>0 then field[j][i]=13 end
end
if j==#field then gameover=50 end
end
end
if gameover>80 then
return true
end
end,
lose=function()
gameover=gameover+1
if gameover%3==0 then
local j=gameover/3
if field[j]then
for i=1,10 do
if field[j][i]>0 then field[j][i]=13 end
end
else
return true
end
end
end,
},
}
mesDisp={
--Default:font=40,white
sprint=function()
setFont(75)
mStr(max(40-P.cstat.row,0),-75,280)
end,
zen=function()
setFont(75)
mStr(max(200-P.cstat.row,0),-75,280)
end,
gmroll=function()
setFont(35)
gc.print("Tetris",-120,390)
setFont(80)
mStr(cstat.tetris,-75,420)
end,
marathon=function()
setFont(50)
mStr(P.cstat.row,-75,330)
mStr(gameEnv.target,-75,380)
gc.line(-120,377,-30,377)
end,
death=function()
setFont(50)
mStr(P.cstat.row,-75,330)
mStr(gameEnv.target,-75,380)
gc.line(-120,377,-30,377)
end,
tetris41=function()
gc.print("Remain",-140,450)
gc.print("Attack",-130,305)
setFont(80)
mStr(#players.alive,-75,380)
mStr(cstat.atk,-75,240)
end,
blind=function()
setFont(35)
gc.print("Rows",-115,220)
gc.print("Tetris",-120,390)
setFont(80)
mStr(P.cstat.row,-75,250)
mStr(cstat.tetris,-75,420)
end,
solo=function()
gc.print("Attack",-130,365)
setFont(80)
mStr(cstat.atk,-75,300)
end,
asymsolo=function()
gc.print("Attack",-132,365)
setFont(80)
mStr(cstat.atk,-75,300)
end,
}
--Game system Data --Game system Data
setting={ setting={
sfx=true,bgm=true, ghost=true,center=true,
fullscreen=false, grid=false,swap=true,
lang="eng", fxs=true,bg=true,
das=10,arr=2, das=10,arr=2,
sddas=0,sdarr=2, sddas=0,sdarr=2,
ghost=true,center=true,
key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT","DOWN"}, sfx=true,bgm=true,vib=3,
gamepad={"dpleft","dpright","a","b","y","dpup","dpdown","RB","LB","LEFT","RIGHT","DOWN"}, fullscreen=false,
bgblock=true,
lang=1,
keyMap={
{"left","right","x","z","c","up","down","space","tab","r","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","x","leftshoulder","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
},--keyboard & joystick
keyLib={
{1},
{2},
{3},
{4},
},--Players' key setting(s)
virtualkey={ virtualkey={
{80,720-80,6400,80},--moveLeft {80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight {240,720-80,6400,80},--moveRight
@@ -427,22 +132,39 @@ stat={
rotate=0, rotate=0,
spin=0, spin=0,
} }
--User Data&User Setting virtualkey={
--------------------------------Warning!_G is __indexed to players[n] when changing any player's data! {80,720-80,6400,80},--moveLeft
require("list") {240,720-80,6400,80},--moveRight
require("texture") {1280-240,720-80,6400,80},--rotRight
require("BGblock") {1280-400,720-80,6400,80},--rotLeft
require("ai") {1280-240,720-240,6400,80},--rotFlip
require("toolfunc") {1280-80,720-80,6400,80},--hardDrop
require("sysfunc") {1280-80,720-240,6400,80},--softDrop
require("gamefunc") {1280-80,720-400,6400,80},--hold
require("timer") {80,360,6400,80},--func
require("paint") {80,80,6400,80},--restart
require("game_scene") --[[
require("call&sys") {x=0,y=0,r=0},--toLeft
{x=0,y=0,r=0},--toRight
{x=0,y=0,r=0},--toDown
]]
userData=fs.newFile("userData") }
userSetting=fs.newFile("userSetting") virtualkeyDown={false,false,false,false,false,false,false,false,false,false,false,false,false}
virtualkeyPressTime={0,0,0,0,0,0,0,0,0,0,0,0,0}
--User Data&User Setting
require"toolfunc"
require"list"
require"class"
require"gamefunc"
require"ai"
require"timer"
require"paint"
require"call&sys"
require"dataList"
require"texture"
userData,userSetting=fs.newFile("userdata"),fs.newFile("usersetting")
if fs.getInfo("userdata")then if fs.getInfo("userdata")then
loadData() loadData()
end end
@@ -450,4 +172,6 @@ if fs.getInfo("usersetting")then
loadSetting() loadSetting()
elseif system=="Android" or system=="iOS"then elseif system=="Android" or system=="iOS"then
setting.virtualkeySwitch=true setting.virtualkeySwitch=true
setting.swap=false
end end
swapLanguage(setting.lang)

774
paint.lua
View File

@@ -1,57 +1,80 @@
swapDeck_data={ local gc=love.graphics
{4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1}, local mt=love.math
{1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2}, local setFont=setFont
{3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2}, local Timer=love.timer.getTime
{2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4},
{7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5}, local attackColor={
{3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6}, {color.darkGrey,color.white},
{2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7}, {color.grey,color.white},
{5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8}, {color.lightPurple,color.white},
{7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8}, {color.lightRed,color.white},
}--Block id [ZSLJTOI] ,dir,x,y {color.darkGreen,color.cyan},
swap={ }
none={2,1,d=function()end}, local frameColor={
flash={8,1,d=function()gc.clear(1,1,1)end}, [0]=color.white,
deck={42,1,d=function() color.lightGreen,
local t=sceneSwaping.time color.lightBlue,
gc.setColor(1,1,1) color.lightPurple,
if t>6 then color.lightOrange,
for i=1,43-t do }
local bn=swapDeck_data[i][1] local modeLevelColor={
local b=blocks[bn][swapDeck_data[i][2]] EASY=color.cyan,
local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4] NORMAL=color.green,
for y=1,#b do for x=1,#b[1]do HARD=color.magenta,
if b[y][x]>0 then ["HARD+"]=color.darkMagenta,
gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3) LUNATIC=color.red,
end EXTRA=color.lightMagenta,
end end ULTIMATE=color.lightYellow,
end
else MESS=color.lightGrey,
gc.clear(1,1,1) GM=color.blue,
DEATH=color.lightRed,
CTWC=color.lightBlue,
["10L"]=color.cyan,
["20L"]=color.lightBlue,
["40L"]=color.green,
["100L"]=color.orange,
["400L"]=color.red,
["1000L"]=color.darkRed,
}
local miniTitle_rect={
{2,0,5,1},{4,1,1,6},
{9,0,4,1},{9,3,4,1},{9,6,4,1},{8,0,1,7},
{15,0,3,1},{15,6,3,1},{14,0,1,7},
{19,0,1,7},{23,0,1,7},{20,3,3,1},
{0,8,1,6},{6,8,1,6},{1,9,1,1},{2,10,1,1},{3,11,1,1},{4,10,1,1},{5,9,1,1},
{8,8,5,1},{8,13,5,1},{10,9,1,4},
{14,8,1,6},{19,8,1,6},{15,9,1,1},{16,10,1,1},{17,11,1,1},{18,12,1,1},
{21,8,5,1},{21,13,5,1},{21,9,1,4},{25,9,1,4},
}
local function stencil_miniTitle()
for i=1,#miniTitle_rect do
gc.rectangle("fill",unpack(miniTitle_rect[i]))
end end
end end
},
}--Scene swapping animations
FX={ FX={
flash=0,--Black screen(frame) flash=0,--Black screen(frame)
shake=0,--Screen shake(frame) shake=0,--Screen shake(frame)
beam={},--Attack beam beam={},--Attack beam
badge={},--badge thrown
appear=function(t,a) appear=function(t,a)
setFont(t.font) setFont(t.font)
gc.setColor(1,1,1,min((30-abs(t.t-30))*.05,1)*a) gc.setColor(1,1,1,a)
mStr(t.text,150,250-t.font*.5+t.dy) mStr(t.text,150,250-t.font*.5+t.dy)
end, end,
fly=function(t,a) fly=function(t,a)
setFont(t.font) setFont(t.font)
gc.setColor(1,1,1,min((30-abs(t.t-30))*.05,1)*a) gc.setColor(1,1,1,a)
mStr(t.text,150+(t.t-15)^3*.005,250-t.font*.5+t.dy) mStr(t.text,150+(t.t-15)^3*.005,250-t.font*.5+t.dy)
end, end,
stretch=function(t,a) stretch=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,min((30-abs(t.t-30))*.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,
@@ -59,86 +82,139 @@ 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,min((30-abs(t.t-30))*.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,min((30-abs(t.t-30))*.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,min((30-abs(t.t-30))*.05,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,
zoomout=function(t,a)
gc.push("transform")
setFont(t.font)
local k=t.t^.5*.1+1
gc.translate(150,290+t.dy)
gc.scale(k,k)
gc.setColor(1,1,1,a)
mStr(t.text,0,-t.font*.5-5)
gc.pop()
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)-.45
gc.scale(k,k)
end
gc.setColor(1,1,1,a)
mStr(t.text,0,-t.font*.5-5)
gc.pop()
end, end,
} }
function drawButton() function updateButton()
for i=1,#Buttons[scene]do for k,B in next,Buttons[scene]do
local B=Buttons[scene][i] local t=B==Buttons.sel and .4 or 0
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 B.alpha=abs(B.alpha-t)>.02 and(B.alpha+(B.alpha<t and .02 or -.02))or t
if B.alpha>t then B.alpha=B.alpha-.02 elseif B.alpha<t then B.alpha=B.alpha+.02 end if B.alpha>t then B.alpha=B.alpha-.02 elseif B.alpha<t then B.alpha=B.alpha+.02 end
gc.setColor(B.rgb[1],B.rgb[2],B.rgb[3],B.alpha) end
end
function drawButton()
for k,B in next,Buttons[scene]do
if not(B.hide and B.hide())then
local C=B.rgb or color.white
gc.setColor(C[1],C[2],C[3],B.alpha)
gc.rectangle("fill",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h) gc.rectangle("fill",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h)
gc.setColor(B.rgb[1],B.rgb[2],B.rgb[3],.3) gc.setColor(C)
gc.setLineWidth(5)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)
gc.setColor(C[1],C[2],C[3],.3)
gc.setLineWidth(5)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
local t=B.t local t=B.t
local y0 local y0
if t then if t then
if type(t)=="function"then t=t()end if type(t)=="function"then t=t()end
setFont(B.f or 40) setFont(B.f or 40)
y0=B.y-1-currentFont*.5 y0=B.y-currentFont*.64
mStr(t,B.x-1,y0) gc.printf(t,B.x-201,y0+2,400,"center")
mStr(t,B.x+1,y0) gc.printf(t,B.x-199,y0+2,400,"center")
mStr(t,B.x-1,y0+2) gc.printf(t,B.x-201,y0,400,"center")
mStr(t,B.x+1,y0+2) gc.printf(t,B.x-199,y0,400,"center")
end gc.setColor(C)
gc.setColor(B.rgb)
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)
end end
end end
end end
function drawDial(x,y,speed) function drawDial(x,y,speed)
gc.push("transform")
gc.translate(x,y)
gc.setColor(1,1,1) gc.setColor(1,1,1)
mStr(int(speed),0,-14) mStr(int(speed),x,y-18)
gc.draw(dialCircle,0,0,nil,nil,nil,32,32) gc.draw(dialCircle,x,y,nil,nil,nil,32,32)
gc.setColor(1,1,1,.6) 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.draw(dialNeedle,x,y,2.094+(speed<=175 and .02094*speed or 4.712-52.36/(speed-125)),nil,nil,5,4)
gc.pop()
end end
function drawPixel(y,x,id,alpha) function drawPixel(y,x,id)
gc.setColor(1,1,1,alpha)
gc.draw(blockSkin[id],30*x-30,600-30*y) gc.draw(blockSkin[id],30*x-30,600-30*y)
end end
function drawVirtualkey() function drawAtkPointer(x,y)
gc.setLineWidth(10) local t=sin(Timer()*20)
gc.setColor(1,1,1,setting.virtualkeyAlpha*.2) gc.setColor(.2,.7+t*.2,1,.6+t*.4)
gc.circle("fill",x,y,25,6)
local a=Timer()*3%1*.8
gc.setColor(0,.6,1,.8-a)
gc.circle("line",x,y,30*(1+a),6)
end
function VirtualkeyPreview()
for i=1,#virtualkey do for i=1,#virtualkey do
local c=sel==i and .8 or 1
gc.setColor(c,c,c,setting.virtualkeyAlpha*.2)
local b=virtualkey[i] local b=virtualkey[i]
gc.setLineWidth(b[4]*.07)
gc.circle("line",b[1],b[2],b[4]-5) gc.circle("line",b[1],b[2],b[4]-5)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,2*b[4]*.0125,nil,18,18)end if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,b[4]*.025,nil,18,18)end
end
end
function drawVirtualkey()
local a=setting.virtualkeyAlpha*.2
local P=players[1]
for i=1,#virtualkey do
if i~=9 or modeEnv.Fkey then
local p,b=virtualkeyDown[i],virtualkey[i]
if p then gc.setColor(.7,.7,.7,a)
else gc.setColor(1,1,1,a)
end
gc.setLineWidth(b[4]*.07)
gc.circle("line",b[1],b[2]+virtualkeyPressTime[i],b[4]-5)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2]+virtualkeyPressTime[i],nil,b[4]*.025,nil,18,18)end
if virtualkeyPressTime[i]>0 then
gc.setColor(1,1,1,a*virtualkeyPressTime[i]*.1)
gc.circle("line",b[1],b[2],b[4]*(1.4-virtualkeyPressTime[i]*.04))
end
end
end end
end end
Pnt={BG={}} Pnt={BG={}}
function Pnt.BG.none() function Pnt.BG.none()
gc.clear(.2,.2,.2) gc.clear(.15,.15,.15)
end
function Pnt.BG.grey()
gc.clear(.3,.3,.3)
end end
function Pnt.BG.glow() function Pnt.BG.glow()
local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05 local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05
@@ -146,15 +222,15 @@ function Pnt.BG.glow()
end end
function Pnt.BG.game1() function Pnt.BG.game1()
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(background[1],640,360,Timer()*.15,12,nil,64,64) gc.draw(background1,640,360,Timer()*.15,12,nil,64,64)
end end
function Pnt.BG.game2() function Pnt.BG.game2()
gc.setColor(1,.5,.5) gc.setColor(1,.5,.5)
gc.draw(background[1],640,360,Timer()*.2,12,nil,64,64) gc.draw(background1,640,360,Timer()*.2,12,nil,64,64)
end end
function Pnt.BG.game3() function Pnt.BG.game3()
gc.setColor(.6,.6,1) gc.setColor(.6,.6,1)
gc.draw(background[1],640,360,Timer()*.25,12,nil,64,64) gc.draw(background1,640,360,Timer()*.25,12,nil,64,64)
end end
function Pnt.BG.rgb() function Pnt.BG.rgb()
gc.clear( gc.clear(
@@ -166,196 +242,253 @@ end
function Pnt.BG.strap() function Pnt.BG.strap()
gc.setColor(1,1,1) gc.setColor(1,1,1)
local x=Timer()%32*40 local x=Timer()%32*40
gc.draw(background[2],x,0,nil,10) gc.draw(background2,x,0,nil,10)
gc.draw(background[2],x-1280,0,nil,10) gc.draw(background2,x-1280,0,nil,10)
end
local matrixT={}for i=0,15 do matrixT[i]={}for j=0,8 do matrixT[i][j]=mt.noise(i,j)+2 end end
function Pnt.BG.matrix()
gc.clear(.15,.15,.15)
for i=0,15 do
for j=0,8 do
local t=sin(matrixT[i][j]*Timer())*.2+.2
gc.setColor(1,1,1,t)
gc.rectangle("fill",80*i,80*j,80,80)
end
end
end end
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,5)
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.rectangle("line",340,340,640,40) gc.rectangle("line",300,330,680,60,5)
setFont(40)
mStr(text.load[loading],640,335)
setFont(30) setFont(30)
mStr(Text.load[loading],640,345) mStr(loadTip,640,400)
setFont(20) end
mStr("not animation,real loading!",640,392) 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,.06)
for i=41,5,-2 do
gc.setLineWidth(i)
gc.line(200+(count-80)*25,130,(count-80)*25,590)
end
gc.setStencilTest()
end end
function Pnt.main() function Pnt.main()
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(titleImage,300,30)
setFont(30) setFont(30)
gc.print("Alpha V0.5",370,150) gc.print("Alpha V0.7.16",290,140)
gc.print(system,530,110) gc.print(system,800,110)
gc.draw(titleImage,30,30)
end end
function Pnt.mode() function Pnt.mode()
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(text.modeInfo[modeID[modeSel]],270,255)
setFont(80) setFont(80)
gc.setColor(color.grey) gc.setColor(color.grey)
mStr(modeName[modeSel],643,283) mStr(text.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(text.modeName[i],640,310+70*(i-modeSel)-f*.5)
end end
end end
end end
function Pnt.custom()
gc.setColor(1,1,1,.3+sin(Timer()*8)*.2)
gc.rectangle("fill",25,95+40*optSel,465,40)
setFont(80)
gc.setColor(.8,.8,.8)gc.print(text.custom,20,20)
gc.setColor(1,1,1)gc.print(text.custom,22,23)
setFont(40)
for i=1,#customID do
local k=customID[i]
local y=90+40*i
gc.printf(text.customOption[k],30,y,320,"right")
if text.customVal[k]then
gc.print(text.customVal[k][customSel[k]],350,y)
else
gc.print(customRange[k][customSel[k]],350,y)
end
end
end
function Pnt.draw()
gc.translate(200,60)
gc.setColor(1,1,1,.2)
gc.setLineWidth(1)
for x=1,9 do gc.line(30*x,0,30*x,600)end
for y=0,19 do gc.line(0,30*y,300,30*y)end
gc.setColor(1,1,1)
gc.setLineWidth(3)
gc.rectangle("line",-2,-2,304,604)
for y=1,20 do for x=1,10 do
if preField[y][x]>0 then
drawPixel(y,x,preField[y][x])
end
end end
if sx and sy then
gc.setLineWidth(2)
gc.rectangle("line",30*sx-30,600-30*sy,30,30)
end
gc.translate(-200,-60)
if clearSureTime>0 then
gc.setColor(1,1,1,clearSureTime*.02)
gc.draw(drawableText.question,1100,570)
end
if pen>0 then
gc.setLineWidth(13)
gc.setColor(blockColor[pen])
gc.rectangle("line",945,605,70,70)
else
gc.setColor(.8,.8,.8)
gc.draw(drawableText.x,950,560)
end
end
function Pnt.play() function Pnt.play()
for p=1,#players do for p=1,#players do
P=players[p] P=players[p]
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)--Position
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,60,120)--Background
gc.setLineWidth(3) gc.translate(0,P.fieldBeneath*.2)
gc.translate(10,15) gc.setScissor(scr.x+P.x*scr.k,scr.y+P.y*scr.k,60*P.size*scr.k,120*P.size*scr.k)
gc.stencil(stencil_field, "replace", 1) gc.setColor(1,1,1,P.result and max(20-P.endCounter,0)*.05 or 1)
gc.translate(0,fieldBeneath) local h=#P.clearing
gc.setStencilTest("equal",1) for j=int(P.fieldBeneath/30+1),#P.field do
for j=1,#field do if j==P.clearing[h]and P.falling>-1 then
if falling<=0 or without(clearing,j)then h=h-1
for i=1,10 do
if field[j][i]>0 then
drawPixel(j,i,field[j][i],min(visTime[j][i],20)*.05)
end
end
else else
gc.setColor(1,1,1,falling/gameEnv.fall) for i=1,10 do
gc.rectangle("fill",0,600-30*j,320,30) if P.field[j][i]>0 then
gc.draw(blockSkinmini[P.field[j][i]],6*i-6,120-6*j)
end
end
end end
end--Field end--Field
if gameEnv.ghost then gc.setScissor()
for i=1,r do for j=1,c do gc.translate(0,-P.fieldBeneath*.2)
if cb[i][j]>0 then gc.setLineWidth(2)
drawPixel(i+y_img-1,j+cx-1,bn,.3) gc.setColor(frameColor[P.strength])gc.rectangle("line",-1,-1,62,122)--Draw boarder
end if modeEnv.royaleMode then
end end
end--Ghost
if waiting<=0 then
gc.setColor(2,2,2)
for i=1,r do for j=1,c do
if cb[i][j]>0 then
drawPixel(i+cy-1,j+cx-1,bn,1)
end
end end--Block
end
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(PTC.dust[p])--Draw game field for i=1,P.strength do
gc.setStencilTest()--In-playField mask gc.draw(badgeIcon,12*i-7,4,nil,.5)
gc.translate(0,-fieldBeneath)
gc.setColor(1,1,1)gc.rectangle("line",-2,-12,304,614)--Draw boarder
local h=0
for i=1,#atkBuffer do
local a=atkBuffer[i]
local bar=a.amount*30
if not a.sent then
if a.time<20 then
bar=bar*(20*a.time)^.5*.05
--Appear
end end
if a.countdown>0 then
gc.setColor(attackColor[a.lv][1])
gc.rectangle("fill",305,600-h,8,-bar+5)
gc.setColor(attackColor[a.lv][2])
gc.rectangle("fill",305,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",305,600-h,8,-bar+5)
--Warning
end end
else if P.result then
gc.setColor(attackColor[a.lv][1]) gc.setColor(1,1,1,min(P.endCounter,60)*.01)
bar=bar*(20-a.time)*.05 setFont(22)mStr(P.result,32,47)
gc.rectangle("fill",305,600-h,8,-bar+5) setFont(20)mStr(P.rank,30,82)
--Disappear if P.killMark then
gc.setLineWidth(4)
gc.setColor(1,0,0,min(P.endCounter,25)*.04)
gc.circle("line",31,60,84-2*min(P.endCounter,30))
end
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,-b2b1)
--B2B bar
for i=1,#bonus do
local a=#field>9-bonus[i].dy*.03333 and .6 or 1
bonus[i]:draw(a)
end--Effects
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)--Position
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)--Background
gc.setLineWidth(3) gc.setLineWidth(7)
gc.setColor(1,1,1)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.translate(150,70)
gc.stencil(stencil_field, "replace", 1) if P.gameEnv.grid then
gc.translate(0,fieldBeneath) gc.setLineWidth(1)
gc.setStencilTest("equal",1) gc.setColor(1,1,1,.2)
for j=1,#field do for x=1,9 do gc.line(30*x,-10,30*x,600)end
if falling<=0 or without(clearing,j)then for y=0,19 do gc.line(0,30*y,300,30*y)end
for i=1,10 do end--Grid lines
if field[j][i]>0 then gc.translate(0,P.fieldBeneath)
drawPixel(j,i,field[j][i],min(visTime[j][i],20)*.05) gc.setScissor(scr.x+P.absFieldPos[1]*scr.k,scr.y+P.absFieldPos[2]*scr.k,300*P.size*scr.k,610*P.size*scr.k)
end local h=#P.clearing
end for j=int(P.fieldBeneath/30+1),#P.field do
else if j==P.clearing[h]and P.falling>-1 then
gc.setColor(1,1,1,falling/gameEnv.fall) h=h-1
gc.setColor(1,1,1,P.falling/P.gameEnv.fall)
gc.rectangle("fill",0,600-30*j,320,30) gc.rectangle("fill",0,600-30*j,320,30)
else
for i=1,10 do
if P.field[j][i]>0 then
gc.setColor(1,1,1,min(P.visTime[j][i]*.05,1))
drawPixel(j,i,P.field[j][i])
end
end
end end
end--Field end--Field
if waiting<=0 then for i=1,#P.shade do
if gameEnv.ghost then local S=P.shade[i]
for i=1,r do for j=1,c do gc.setColor(1,1,1,S[1]*.12)
if cb[i][j]>0 then for x=S[3],S[5]do
drawPixel(i+y_img-1,j+cx-1,bn,.3) for y=S[6],S[4]do
drawPixel(y,x,S[2])
end
end
end--shade FX
if P.waiting==-1 then
if P.gameEnv.ghost then
gc.setColor(1,1,1,.3)
for i=1,P.r do for j=1,P.c do
if P.cur.bk[i][j]then
drawPixel(i+P.y_img-1,j+P.curX-1,P.cur.color)
end end
end end end end
end--Ghost end--Ghost
gc.setColor(1,1,1,lockDelay/gameEnv.lock) if P.gameEnv.block then
for i=1,r do for j=1,c do gc.setColor(1,1,1,P.lockDelay/P.gameEnv.lock)
if cb[i][j]>0 then for i=1,P.r do for j=1,P.c do
gc.rectangle("fill",30*(j+cx-1)-34,596-30*(i+cy-1),38,38) if P.cur.bk[i][j]then
gc.rectangle("fill",30*(j+P.curX-1)-33,597-30*(i+P.curY-1),36,36)
end end
end end--BlockShade(lockdelay indicator) end end--BlockShade(lockdelay indicator)
for i=1,r do for j=1,c do gc.setColor(1,1,1)
if cb[i][j]>0 then for i=1,P.r do for j=1,P.c do
drawPixel(i+cy-1,j+cx-1,bn,1) if P.cur.bk[i][j]then
drawPixel(i+P.curY-1,j+P.curX-1,P.cur.color)
end end
end end--Block end end--Block
if gameEnv.center then end
local x=30*(cx+sc[2]-1)-30+15 if P.gameEnv.center then
gc.draw(spinCenter,x,600-30*(cy+sc[1]-1)+15,nil,nil,nil,4,4) gc.setColor(1,1,1)
local x=30*(P.curX+P.sc[2]-1)-30+15
gc.draw(spinCenter,x,600-30*(P.curY+P.sc[1]-1)+15,nil,nil,nil,4,4)
gc.setColor(1,1,1,.5) gc.setColor(1,1,1,.5)
gc.draw(spinCenter,x,600-30*(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])
gc.setStencilTest()--In-playField mask --Draw game field
gc.translate(0,-fieldBeneath) gc.setScissor()--In-playField mask
gc.setColor(1,1,1)gc.rectangle("line",-2,-12,304,614)--Draw boarder gc.translate(0,-P.fieldBeneath)
gc.setLineWidth(3)
gc.setColor(1,1,1)
gc.rectangle("line",-1,-11,302,612)--Draw boarder
gc.setLineWidth(2)
gc.rectangle("line",301,0,16,601.5)--Draw atkBuffer boarder
local h=0 local h=0
for i=1,#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
@@ -363,57 +496,65 @@ 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",305,600-h,8,-bar+5) gc.rectangle("fill",304,599-h,11,-bar+3)
gc.setColor(attackColor[a.lv][2]) gc.setColor(attackColor[a.lv][2])
gc.rectangle("fill",305,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0)) gc.rectangle("fill",304,599-h+(-bar+3),11,-(-bar+3)*(1-a.countdown/a.cd0))
--Timing --Timing
else else
attackColor.animate[a.lv]((sin((Timer()-i)*20)+1)*.5) local t=sin((Timer()-i)*30)*.5+.5
gc.rectangle("fill",305,600-h,8,-bar+5) local c1,c2=attackColor[a.lv][1],attackColor[a.lv][2]
gc.setColor(c1[1]*t+c2[1]*(1-t),c1[2]*t+c2[2]*(1-t),c1[3]*t+c2[3]*(1-t))
gc.rectangle("fill",304,599-h,11,-bar+3)
--Warning --Warning
end end
else else
gc.setColor(attackColor[a.lv][1]) gc.setColor(attackColor[a.lv][1])
bar=bar*(20-a.time)*.05 bar=bar*(20-a.time)*.05
gc.rectangle("fill",305,600-h,8,-bar+5) gc.rectangle("fill",304,599-h,11,-bar+2)
--Disappear --Disappear
end end
h=h+bar h=h+bar
if h>600 then break end
end--Buffer line end--Buffer line
local a,b=P.b2b,P.b2b1 if a>b then a,b=b,a end
gc.setColor(b2b<100 and color.white or b2b<=480 and color.lightRed or color.lightBlue) gc.setColor(.8,1,.2)
gc.rectangle("fill",-15,600,10,-b2b1) gc.rectangle("fill",-15,599.5,11,-b*.5)
gc.setColor(color.red) gc.setColor(P.b2b<40 and color.white or P.b2b<=1e3 and color.lightRed or color.lightBlue)
gc.rectangle("line",-20,600-100,15,2) gc.rectangle("fill",-15,599.5,11,-a*.5)
gc.setColor(color.blue) gc.setColor(1,1,1,.5+sin(Timer()*30)*.5)
gc.rectangle("line",-20,600-480,15,2) gc.rectangle("fill",-16,b<40 and 578.5 or 98.5,13,3)
--B2B bar
setFont(40)
gc.setColor(1,1,1) gc.setColor(1,1,1)
if gameEnv.hold then gc.rectangle("line",-17,-3,16,604.5)--Draw b2b bar boarder
gc.print("Hold",-113,0) --B2B indictator
for i=1,#hb do
for j=1,#hb[1] do if P.gameEnv.hold then
if hb[i][j]>0 then gc.setColor(1,1,1)
drawPixel(i+17.5-#hb*.5,j-2.5-#hb[1]*.5,holded and 13 or hn,1) gc.draw(drawableText.hold,-124,-10)
for i=1,#P.hold.bk do
for j=1,#P.hold.bk[1] do
if P.hold.bk[i][j]then
drawPixel(i+17.5-#P.hold.bk*.5,j-2.7-#P.hold.bk[1]*.5,P.holded and 9 or P.hold.color)
end end
end end
end end
end--Hold end--Hold
gc.print("Next",336,0) gc.draw(drawableText.next,340,-10)
for N=1,gameEnv.next do local N=1
local b=nb[N] ::L::
for i=1,#b do local b,c=P.next[N].bk,P.next[N].color
for j=1,#b[1] do gc.setColor(1,1,1)
if b[i][j]>0 then for i=1,#b do for j=1,#b[1] do
drawPixel(i+20-2.4*N-#b*.5,j+12.5-#b[1]*.5,nxt[N],1) if b[i][j]then
drawPixel(i+20-2.4*N-#b*.5,j+12.7-#b[1]*.5,c)
end end
end end end
end N=N+1
end--Next if N<=P.gameEnv.next and P.next[N]then goto L end
if count then --Next
gc.setColor(.8,.8,.8)
gc.draw(drawableText.modeName,-135,-65)
gc.draw(drawableText.levelName,437-drawableText.levelName:getWidth(),-65)
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)
@@ -422,81 +563,155 @@ 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
local a=#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))
bonus[i]:draw(a)
end--Effects end--Effects
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(40) setFont(35)
gc.print(format("%0.2f",time),-125,530)--Draw time mStr(format("%.2f",P.time),-82,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) gc.draw(drawableText.bpm,390,490)
gc.print("KPM",335,580) gc.draw(drawableText.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
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,3 do gc.draw(PTC.attack[1])
gc.draw(PTC.attack[i]) gc.draw(PTC.attack[2])
gc.draw(PTC.attack[3])
if setting.virtualkeySwitch then drawVirtualkey()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 .5+sin(1.5*(b.t/20-1.5))*.5 or 1
gc.setColor(1,1,1,b.t<10 and b.t*.1 or b.t<50 and 1 or(60-b.t)*.1)
gc.draw(badgeIcon,b[1]+(b[3]-b[1])*t,b[2]+(b[4]-b[2])*t,nil,nil,nil,14,14)
end end
setmetatable(_G,nil) P=players[1]
if setting.virtualkeySwitch then gc.setLineWidth(5)
drawVirtualkey() gc.setColor(.8,1,0,.2)
for i=1,#players[1].atker do
local p=players[1].atker[i]
gc.line(p.centerX,p.centerY,P.centerX,P.centerY)
end end
if P.atkMode~=4 then
if P.atking then drawAtkPointer(P.atking.centerX,P.atking.centerY)end
else
for i=1,#players[1].atker do
local p=players[1].atker[i]
drawAtkPointer(p.centerX,p.centerY)
end
end
end
end
function Pnt.pause()
Pnt.play()
gc.setColor(0,0,0,pauseTime*.015)
gc.rectangle("fill",0,0,1280,720)
if system~="Android"then
setFont(40)
gc.setColor(1,1,1,pauseTime*.02)
mStr(text.space.."/"..text.enter,640,300)
gc.print("ESC",610,598)
end
setFont(120)
gc.setColor(1,1,1)
mStr(text.pause,640,140-12*(5-pauseTime*.1)^2)
end
function Pnt.setting()
gc.setColor(1,1,1)
setFont(35)
mStr("DAS:"..setting.das,290,278)
mStr("ARR:"..setting.arr,506,278)
setFont(18)
mStr(text.softdropdas..setting.sddas,290,361)
mStr(text.softdroparr..setting.sdarr,506,361)
end end
function Pnt.setting2() function Pnt.setting2()
local a=.3+sin(Timer()*15)*.1
if keyboardSetting then
gc.setColor(1,.5,.5,a)
else
gc.setColor(.9,.9,.9,a)
end
gc.rectangle("fill",240,40*keyboardSet-10,200,40)
if joystickSetting then
gc.setColor(1,.5,.5,a)
else
gc.setColor(.9,.9,.9,a)
end
gc.rectangle("fill",440,40*joystickSet-10,200,40)
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(18) setFont(25)
mStr("softdropDAS:"..setting.sddas,828,140) for y=1,13 do
mStr("softdropARR:"..setting.sdarr,1043,140) mStr(text.actName[y],150,40*y-5)
setFont(35) for x=1,2 do
mStr("DAS:"..setting.das,828,73) mStr(setting.keyMap[curBoard+x*8-8][y],200*x+140,40*y-3)
mStr("ARR:"..setting.arr,1043,73)
gc.print("Keyboard Joystick",223,10)
for i=1,9 do
gc.printf(actName_show[i]..":",0,60*i-8,180,"right")
end end
if keysetting or gamepadsetting then gc.line(40,40*y-10,640,40*y-10)
gc.print("<<",keysetting and 380 or 670,60*(keysetting or gamepadsetting)-10)
end end
for x=1,4 do
gc.line(200*x-160,30,200*x-160,550)
end
gc.line(40,550,640,550)
mStr(text.keyboard,340,0)
mStr(text.joystick,540,0)
gc.print(text.setting2Help,50,620)
setFont(40)
gc.print("< P"..curBoard.."/P8 >",430,570)
end end
function Pnt.setting3() function Pnt.setting3()
drawVirtualkey() VirtualkeyPreview()
local d=snapLevelValue[snapLevel]
if d>=10 then
gc.setLineWidth(3) gc.setLineWidth(3)
gc.setColor(1,1,1,sin(Timer()*4)*.1+.1) gc.setColor(1,1,1,sin(Timer()*4)*.1+.1)
for i=1,31 do for i=1,1280/d-1 do
gc.line(40*i,0,40*i,720) gc.line(d*i,0,d*i,720)
end
for i=1,720/d-1 do
gc.line(0,d*i,1280,d*i)
end end
for i=1,17 do
gc.line(0,40*i,1280,40*i)
end end
end end
function Pnt.help() 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)
gc.draw(payCode,20,20)
gc.draw(groupCode,1080,20)
gc.setColor(1,1,1,sin(Timer()*10)*.5+.5)
setFont(35)
mStr(text.support,150,283)
setFont(25)
mStr(text.group,1170,210)
end end
function Pnt.stat() function Pnt.stat()
setFont(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)end
gc.print(Text.stat[i],350,20+40*i)
end
gc.print(stat.run,650,60) gc.print(stat.run,650,60)
gc.print(stat.game,650,100) gc.print(stat.game,650,100)
gc.print(format("%0.2f",stat.gametime).."s",650,140) gc.print(format("%0.1fhr",stat.gametime*2.78e-4),650,140)
gc.print(stat.piece,650,180) gc.print(stat.piece,650,180)
gc.print(stat.row,650,220) gc.print(stat.row,650,220)
gc.print(stat.atk,650,260) gc.print(stat.atk,650,260)
@@ -504,6 +719,5 @@ function Pnt.stat()
gc.print(stat.rotate,650,340) gc.print(stat.rotate,650,340)
gc.print(stat.hold,650,380) gc.print(stat.hold,650,380)
gc.print(stat.spin,650,420) gc.print(stat.spin,650,420)
gc.draw(titleImage,260,570,.2+.07*sin(Timer()*3),.8,nil,250,60) gc.draw(titleImage,260,570,.2+.07*sin(Timer()*3),.8,nil,250,60)
end end

View File

@@ -1,178 +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 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
if P.id>1 then
v=1/(#players.alive-1)
-- if v<.02 then return nil 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=="keyset"then
v=string.splitS(v)
for i=#v+1,8 do v[i]="N/A"end
setting.key=v
elseif t=="gamepadset"then
v=string.splitS(v)
for i=#v+1,8 do v[i]="N/A"end
setting.gamepad=v
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 t=table.concat({
stringPack("sfx=",setting.sfx),
stringPack("bgm=",setting.bgm),
stringPack("fullscreen=",setting.fullscreen),
stringPack("das=",setting.das),
stringPack("arr=",setting.arr),
stringPack("sddas=",setting.sddas),
stringPack("sdarr=",setting.sdarr),
stringPack("keyset=",table.concat(setting.key,"/")),
stringPack("gamepadset=",table.concat(setting.gamepad,"/")),
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,57 +1,95 @@
setFont(80) local gc=love.graphics
charV=gc.newText(Fonts[80],"v") local N,c=gc.newImage
local N=gc.newImage local function T(s,t)return gc.newText(setFont(s),t)end
titleImage=N("/image/mess/title.png") local 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")
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={ local blockImg=N("/image/block/1.png")
N("/image/BG/bg1.jpg"), blockSkin,blockSkinmini={},{}
N("/image/BG/bg2.png"), 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
blockImg:release()
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 y=1,#b do for x=1,#b[1]do
if b[y][x]then
gc.rectangle("fill",x-1,#b-y,1,1)
end
end end
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
PTC.attack={} PTC.attack={}
PTC.attack[1]=gc.newParticleSystem(gc.newImage("/image/attack/1.png"),200) PTC.attack[1]=gc.newParticleSystem(N("/image/mess/atk1.png"),200)
PTC.attack[1]:setParticleLifetime(.25) PTC.attack[1]:setParticleLifetime(.25)
PTC.attack[1]:setEmissionRate(0) PTC.attack[1]:setEmissionRate(0)
PTC.attack[1]:setSpin(10) PTC.attack[1]:setSpin(10)
PTC.attack[1]:setColors(1,1,1,.7,1,1,1,0) PTC.attack[1]:setColors(1,1,1,.7,1,1,1,0)
PTC.attack[2]=gc.newParticleSystem(gc.newImage("/image/attack/2.png"),200) PTC.attack[2]=gc.newParticleSystem(N("/image/mess/atk2.png"),200)
PTC.attack[2]:setParticleLifetime(.3) PTC.attack[2]:setParticleLifetime(.3)
PTC.attack[2]:setEmissionRate(0) PTC.attack[2]:setEmissionRate(0)
PTC.attack[2]:setSpin(8) PTC.attack[2]:setSpin(8)
PTC.attack[2]:setColors(1,1,1,.7,1,1,1,0) PTC.attack[2]:setColors(1,1,1,.7,1,1,1,0)
PTC.attack[3]=gc.newParticleSystem(gc.newImage("/image/attack/3.png"),200) PTC.attack[3]=gc.newParticleSystem(N("/image/mess/atk3.png"),200)
PTC.attack[3]:setParticleLifetime(.4) PTC.attack[3]:setParticleLifetime(.4)
PTC.attack[3]:setEmissionRate(0) PTC.attack[3]:setEmissionRate(0)
PTC.attack[3]:setSpin(6) 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")
dialCircle=N("/image/mess/dialCircle.png")
dialNeedle=N("/image/mess/dialNeedle.png")
badgeIcon=N("/image/mess/badge.png")
spinCenter=N("/image/mess/spinCenter.png")
lightBulb=N("/image/mess/lightBulb.png")
light=N("/image/mess/light.png")
background1=N("/image/BG/bg1.jpg")
background2=N("/image/BG/bg2.png")
groupCode=N("/image/mess/groupcode.png")
payCode=N("/image/mess/paycode.png")
drawableText={
question=T(100,"?"),
x=T(110,"×"),
bpm=T(15,"BPM"),
kpm=T(15,"KPM"),
modeName=T(30),
levelName=T(30),
next=T(40),
hold=T(40),
}
c=gc.setCanvas()

266
timer.lua
View File

@@ -1,10 +1,13 @@
local wd=love.window
local Timer=love.timer.getTime
Tmr={} Tmr={}
function Tmr.load() function Tmr.load()
if loading==1 then if loading==1 then
loadnum=loadnum+1 loadnum=loadnum+1
loadprogress=loadnum/10 loadprogress=loadnum/10
if loadnum==5 then if loadnum==5 then
--require("load_texture") --require("texture")
elseif loadnum==10 then elseif loadnum==10 then
loadnum=1 loadnum=1
loading=2 loading=2
@@ -13,6 +16,7 @@ function Tmr.load()
if loadnum<=#bgm then if loadnum<=#bgm then
bgm[bgm[loadnum]]=love.audio.newSource("/BGM/"..bgm[loadnum]..".ogg","stream") bgm[bgm[loadnum]]=love.audio.newSource("/BGM/"..bgm[loadnum]..".ogg","stream")
bgm[bgm[loadnum]]:setLooping(true) bgm[bgm[loadnum]]:setLooping(true)
bgm[bgm[loadnum]]:setVolume(0)
loadprogress=loadnum/#bgm loadprogress=loadnum/#bgm
loadnum=loadnum+1 loadnum=loadnum+1
else else
@@ -34,10 +38,17 @@ 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.draw()
if clearSureTime>0 then clearSureTime=clearSureTime-1 end
end
function Tmr.play(dt) function Tmr.play(dt)
frame=frame+1 frame=frame+1
stat.gametime=stat.gametime+dt stat.gametime=stat.gametime+dt
@@ -53,177 +64,220 @@ function Tmr.play(dt)
rem(FX.beam,i) rem(FX.beam,i)
end end
end end
for i=1,3 do for i=#FX.badge,1,-1 do
PTC.attack[i]:update(dt) local b=FX.badge[i]
b.t=b.t+1
if b.t==60 then
rem(FX.badge,i)
end end
-- Update attack beam
if count then
count=count-1
if count==0 then
count=nil
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 end
setmetatable(_G,nil) for i=1,#virtualkey do
elseif count%60==0 then if virtualkeyPressTime[i]>0 then
virtualkeyPressTime[i]=virtualkeyPressTime[i]-1
end
end
PTC.attack[1]:update(dt)
PTC.attack[2]:update(dt)
PTC.attack[3]:update(dt)
if frame<180 then
if frame==179 then
gameStart()
elseif frame%60==0 then
sysSFX("ready") sysSFX("ready")
end end
if count then
for p=1,#players do for p=1,#players do
P=players[p] P=players[p]
setmetatable(_G,P.index) if P.keyPressing[1]or P.keyPressing[2]then
if keyPressing[1]or keyPressing[2]then P.moving=P.moving+(P.moving>0 and 1 or -1)
P.moving=moving+sgn(moving)
else else
P.moving=0 P.moving=0
end end
end end
return nil return
end end--Counting,include pre-das,directy RETURN
end--Start 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 if not P.small 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 modeEnv.royaleMode then
if P.keyPressing[9]then
P.swappingAtkMode=min(P.swappingAtkMode+2,30)
else
P.swappingAtkMode=P.swappingAtkMode+((#P.field>15 and P.swappingAtkMode>4 or P.swappingAtkMode>8)and -1 or 1)
end
end
end
if P.ai then if P.ai and P.waiting==-1 then
P.ai.controlDelay=P.ai.controlDelay-1 P.ai.controlDelay=P.ai.controlDelay-1
if P.ai.controlDelay==0 then if P.ai.controlDelay==0 then
if #P.ai.controls>0 then if #P.ai.controls>0 then
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=P.ai.controlDelay0+2
if Timer()-P.cstat.point>P.cstat.event then
P.cstat.point=Timer()
P.cstat.event=P.ai.controlDelay0+rnd(2,10)
changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.35 and 2 or 3)
end end
end end
end end
end
for j=1,#field do for i=1,10 do if not P.keepVisible then
if visTime[j][i]>0 then P.visTime[j][i]=visTime[j][i]-1 end for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]>0 then P.visTime[j][i]=P.visTime[j][i]-1 end
end end end end
--Fresh visible time end--Fresh visible time
if keyPressing[1]or keyPressing[2]then
P.moving=moving+sgn(moving) if P.keyPressing[1]or P.keyPressing[2]then
local d=abs(moving)-gameEnv.das P.moving=P.moving+(P.moving>0 and 1 or -1)
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"toRight"or"toLeft"]() 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 local d=abs(P.downing)-P.gameEnv.sddas
local d=abs(downing)-gameEnv.sddas P.downing=P.downing+1
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
act.toDown() act.insDown()
end end
end end
else else
P.downing=0 P.downing=0
end end
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 goto stop end
if #field>clearing[1]then SFX("fall")end if P.gameEnv.fall>0 and #P.field>P.clearing[1]then SFX("fall")end
for i=1,#clearing do for i=1,#P.clearing do
removeRow(field,clearing[i]) removeRow(P.field,P.clearing[i])
removeRow(visTime,clearing[i]) removeRow(P.visTime,P.clearing[i])
end end
P.clearing={} ::L::
rem(P.clearing)
if P.clearing[1]then goto L end
end end
--Rows cleared drop if P.waiting>=0 then
elseif waiting>0 then P.waiting=P.waiting-1
P.waiting=waiting-1 if P.waiting==-1 then resetblock()end
if waiting<=0 then goto stop
resetblock() end
if P.curY~=P.y_img then
if P.dropDelay>=0 then
P.dropDelay=P.dropDelay-1
if P.dropDelay>=0 then goto stop end
end end
else
if cy~=y_img then
if dropDelay>1 then
P.dropDelay=dropDelay-1
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
else else
if lockDelay>0 then P.lockDelay=lockDelay-1 P.lockDelay=P.lockDelay-1
else drop() if P.lockDelay>=0 then goto stop end
drop()
end end
::stop::
if P.b2b1==P.b2b then
elseif P.b2b1<P.b2b then
P.b2b1=min(P.b2b1*.98+P.b2b*.02+.4,P.b2b)
else
P.b2b1=max(P.b2b1*.95+P.b2b*.05-.6,P.b2b)
end end
end --Alive
if P.b2b>480 then P.b2b=P.b2b-1 end else
else--Alive if not P.small then
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 modeEnv.royaleMode then
P.falling=falling-1 P.swappingAtkMode=min(P.swappingAtkMode+2,30)
if falling<=0 then
if #field>clearing[1]then SFX("fall")end
for i=1,#clearing do
removeRow(field,clearing[i])
removeRow(visTime,clearing[i])
end end
P.clearing={}
end end
end--Rows cleared drop if P.falling>=0 then
for j=1,#field do for i=1,10 do P.falling=P.falling-1
if visTime[j][i]<20 then P.visTime[j][i]=visTime[j][i]+.5 end if P.falling>=0 then goto stop end
if P.gameEnv.fall>0 and #P.field>P.clearing[1]then SFX("fall")end
for i=1,#P.clearing do
removeRow(P.field,P.clearing[i])
removeRow(P.visTime,P.clearing[i])
end
::L::
rem(P.clearing)
if P.clearing[1]then goto L end
end::stop::
if P.endCounter<40 then
for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
end end--Make field visible end end--Make field visible
end--Dead
for i=#bonus,1,-1 do
bonus[i].t=bonus[i].t+1
if bonus[i].t>60 then rem(bonus,i)end
end end
for i=#task,1,-1 do if P.b2b1>0 then P.b2b1=max(0,P.b2b1*.92-1)end
if task[i]()then rem(task,i)end --Dead
end end
for i=#atkBuffer,1,-1 do for i=#P.shade,1,-1 do
local atk=atkBuffer[i] local S=P.shade[i]
S[1]=S[1]-1
if S[1]==0 then
rem(P.shade,i)
end
end
for i=#P.bonus,1,-1 do
local b=P.bonus[i]
if b.inf then
if b.t<30 then
b.t=b.t+.5
end
else
b.t=b.t+b.speed
if b.t>=60 then rem(P.bonus,i)end
end
end
for i=#P.atkBuffer,1,-1 do
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
P.b2b1=P.b2b1*.96 if not P.small then
PTC.dust[p]:update(dt) PTC.dust[p]:update(dt)
end end
setmetatable(_G,nil) end
if modeEnv.royaleMode and frame%120==0 then freshMostDangerous()end
end
function Tmr.pause(dt)
if not wd.isMinimized()and pauseTime<50 then
pauseTime=pauseTime+1
end
end end

View File

@@ -1,35 +1,30 @@
function string.splitS(s,sep) local tm=love.timer
sep=sep or"/" local gc=love.graphics
local kb=love.keyboard
local setFont=setFont
local toN,toS=tonumber,tostring
local function splitS(s,sep)
local t={} local t={}
repeat ::L::
local i=find(s,sep)or #s+1 local i=find(s,sep)or #s+1
ins(t,sub(s,1,i-1)) ins(t,sub(s,1,i-1))
s=sub(s,i+#sep) s=sub(s,i+#sep)
until #s==0 if #s~=0 then goto L end
return t return t
end end
function sgn(i)return i>0 and 1 or i<0 and -1 or 0 end--Row numbe is A-uth-or's id! function mStr(s,x,y)
function stringPack(s,v)return s..toS(v)end gc.printf(s,x-300,y,600,"center")
function without(t,v)
for i=1,#t do
if t[i]==v then return nil end
end
return true
end
function mStr(s,x,y)gc.printf(s,x-500,y,1000,"center")end
function convert(x,y)
return x*screenK,(y-screenM)*screenK
end end
function getNewRow(val) function getNewRow(val)
if not val then val=0 end
local t=rem(freeRow) local t=rem(freeRow)
for i=1,10 do for i=1,10 do
t[i]=val or 0 t[i]=val
end end
--clear a row and move to active list --clear a row and move to active list
if #freeRow==0 then if #freeRow==0 then
for i=1,20 do for i=1,10 do
ins(freeRow,{0,0,0,0,0,0,0,0,0,0}) ins(freeRow,{0,0,0,0,0,0,0,0,0,0})
end end
end end
@@ -39,20 +34,352 @@ end
function removeRow(t,k) function removeRow(t,k)
ins(freeRow,rem(t,k)) ins(freeRow,rem(t,k))
end end
function restockRow()
for p=1,#players do --Single-usage funcs
local f,f2=players[p].field,players[p].visTime langName={"中文","English"}
while #f>0 do local langID={"chi","eng"}
removeRow(f,1) function swapLanguage(l)
removeRow(f2,1) text=require("language/"..langID[l])
Buttons.sel=nil
for S,L in next,Buttons do
for N,B in next,L do
B.alpha=0
B.t=text.ButtonText[S][N]
end end
end end
drawableText.next:set(text.next)
drawableText.hold:set(text.hold)
if royaleCtrlPad then royaleCtrlPad:release()end
gc.push("transform")
gc.origin()
royaleCtrlPad=gc.newCanvas(300,100)
gc.setCanvas(royaleCtrlPad)
gc.setColor(1,1,1)
setFont(25)
gc.setLineWidth(2)
for i=1,4 do
gc.rectangle("line",RCPB[2*i-1],RCPB[2*i],90,35,8,4)
mStr(text.atkModeName[i],RCPB[2*i-1]+45,RCPB[2*i]+3)
end
gc.setCanvas()
gc.pop()
collectgarbage()
end
local vibrateLevel={0,0,.03,.04,.05,.07,.9}
function VIB(t)
if setting.vib>0 then
love.system.vibrate(vibrateLevel[setting.vib+t])
end
end
function sysSFX(s,v)
if setting.sfx then
local n=1
::L::if sfx[s][n]:isPlaying()then
n=n+1
if not sfx[s][n]then
sfx[s][n]=sfx[s][n-1]:clone()
sfx[s][n]:seek(0)
goto quit
end
goto L
end::quit::
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
::L::if sfx[s][n]:isPlaying()then
n=n+1
if not sfx[s][n]then
sfx[s][n]=sfx[s][n-1]:clone()
sfx[s][n]:seek(0)
goto quit
end
goto L
end::quit::
sfx[s][n]:setVolume(v or 1)
sfx[s][n]:play()
end
end
function BGM(s)
if setting.bgm and bgmPlaying~=s then
if bgmPlaying then newTask(Event_task.bgmFadeOut,nil,bgmPlaying)end
for i=1,#Task do
if Task[i].code==Event_task.bgmFadeIn then
Task[i].code=Event_task.bgmFadeOut
end
end
if s then
newTask(Event_task.bgmFadeIn,nil,s)
bgm[s]:play()
end
bgmPlaying=s
end
end end
function timeSort(a,b) local swapDeck_data={
return a.time>b.time {4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1},
{1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2},
{3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2},
{2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4},
{7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5},
{3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6},
{2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7},
{5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8},
{7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8},
}--Block id [ZSLJTOI] ,dir,x,y
local swap={
none={2,1,d=function()end},
flash={8,1,d=function()gc.clear(1,1,1)end},
fade={30,15,d=function()
local t=1-abs(sceneSwaping.time*.06667-1)
gc.setColor(0,0,0,t)
gc.rectangle("fill",0,0,1280,720)
end},
deck={50,8,d=function()
local t=sceneSwaping.time
gc.setColor(1,1,1)
if t>8 then
local t=max(t,15)
for i=1,51-t do
local bn=swapDeck_data[i][1]
local b=blocks[bn][swapDeck_data[i][2]]
local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4]
for y=1,#b do for x=1,#b[1]do
if b[y][x]then
gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3)
end end
function stencil_field() end end
gc.rectangle("fill",0,-10,300,610) end
end
if t<17 then
gc.setColor(1,1,1,(8-abs(t-8))*.125)
gc.rectangle("fill",0,0,1280,720)
end
end},
}--Scene swapping animations
function gotoScene(s,style)
if not sceneSwaping and s~=scene then
style=style or"fade"
sceneSwaping={
tar=s,style=style,
time=swap[style][1],mid=swap[style][2],
draw=swap[style].d
}
Buttons.sel=nil
if style~="none"then
sysSFX("swipe")
end
end
end
local prevMenu={
load=love.event.quit,
intro="quit",
main="intro",
mode="main",
custom="mode",
draw=function()
kb.setKeyRepeat(false)
gotoScene("custom")
end,
ready="mode",
play=function()
clearTask("play")
gotoScene(curMode.id~="custom"and"mode"or"custom","deck")
end,
pause=function()
clearTask("play")
gotoScene(curMode.id~="custom"and"mode"or"custom","deck")
end,
help="main",
stat="main",
setting=function()
saveSetting()
gotoScene("main")
end,
setting2="setting",
setting3="setting",
}
function back()
local t=prevMenu[scene]
if type(t)=="string"then
gotoScene(t)
else
t()
end
end
function pauseGame()
if bgmPlaying then bgm[bgmPlaying]:pause()end
for i=1,#players.alive do
local l=players.alive[i].keyPressing
for j=1,#l do
if l[j]then
releaseKey(j,players.alive[i])
end
end
end
gotoScene("pause","none")
end
function resumeGame()
if bgmPlaying then bgm[bgmPlaying]:play()end
gotoScene("play","fade")
end
local dataOpt={
"run",
"game",
"gametime",
"piece",
"row",
"atk",
"key",
"rotate",
"hold",
"spin",
}
local saveOpt={
"ghost","center",
"grid","swap",
"fxs","bg",
"das","arr",
"sddas","sdarr",
"lang",
"sfx","bgm",
"vib",
"fullscreen",
"bgblock",
"virtualkeyAlpha",
"virtualkeyIcon",
"virtualkeySwitch",
"frameMul",
}
function loadData()
userData:open("r")
--local t=splitS(love.math.decompress(userdata,"zlib"),"\r\n")
local t=splitS(userData:read(),"\r\n")
userData:close()
for i=1,#t do
local i=t[i]
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={}
for i=1,#dataOpt do
ins(t,dataOpt[i].."="..toS(stat[dataOpt[i]]))
end
t=table.concat(t,"\r\n")
--t=love.math.compress(t,"zlib"):getString()
userData:open("w")
userData:write(t)
userData:close()
end
function loadSetting()
userSetting:open("r")
--local t=splitS(love.math.decompress(userdata,"zlib"),"\r\n")
local t=splitS(userSetting:read(),"\r\n")
userSetting:close()
for i=1,#t do
local i=t[i]
if find(i,"=")then
local t=sub(i,1,find(i,"=")-1)
local v=sub(i,find(i,"=")+1)
if t=="sfx"or t=="bgm"or t=="bgblock"then
setting[t]=v=="true"
elseif t=="vib"then
setting.vib=toN(v:match("[01234]"))or 0
elseif t=="fullscreen"then
setting.fullscreen=v=="true"
love.window.setFullscreen(setting.fullscreen)
elseif t=="keymap"then
v=splitS(v,"/")
for i=1,16 do
local v1=splitS(v[i],",")
for j=1,#v1 do
setting.keyMap[i][j]=v1[j]
end
end
elseif t=="keylib"then
v=splitS(v,"/")
for i=1,4 do
local v1=splitS(v[i],",")
for j=1,#v1 do
setting.keyLib[i][j]=toN(v1[j])
end
for j=1,#setting.keyLib[i]do
local v=setting.keyLib[i][j]
if int(v)~=v or v>=9 or v<=0 then
setting.keyLib[i]={i}
break
end
end
end
elseif t=="virtualkey"then
v=splitS(v,"/")
for i=1,10 do
if not v[i]then goto c end
virtualkey[i]=splitS(v[i],",")
for j=1,4 do
virtualkey[i][j]=toN(virtualkey[i][j])
end
::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"or t=="grid"or t=="swap"or t=="fxs"or t=="bg"then
setting[t]=v=="true"
elseif t=="lang"then
setting[t]=toN(v:match("[12]"))or 1
end
end
end
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={
"keymap="..toS(table.concat(map,"/")),
"keylib="..toS(table.concat(lib,"/")),
"virtualkey="..toS(table.concat(vk,"/")),
}
for i=1,#saveOpt do
ins(t,saveOpt[i].."="..toS(setting[saveOpt[i]]))
end
t=table.concat(t,"\r\n")
--t=love.math.compress(t,"zlib"):getString()
userSetting:open("w")
userSetting:write(t)
userSetting:close()
end end
--Single use