Compare commits

...

5 Commits

Author SHA1 Message Date
MrZ_26
4c4bae854f Alpha V0.4 2020-02-04 19:27:13 +08:00
MrZ_26
dd7beca9ce Alpha V0.3+ 2020-02-04 19:26:49 +08:00
MrZ_26
30bbf1b1db Alpha V0.2 2020-02-04 19:26:27 +08:00
MrZ_26
a85da670c8 Alpha V0.1+ 2020-02-04 19:26:04 +08:00
MrZ_26
2436a2d0bf 0.190727α 2020-02-04 19:25:11 +08:00
55 changed files with 1437 additions and 865 deletions

14
BGblock.lua Normal file
View File

@@ -0,0 +1,14 @@
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

Binary file not shown.

20
TRS.lua
View File

@@ -8,7 +8,15 @@ blocks={
{[0]={{1,1,1,1}},{{1},{1},{1},{1}},{{1,1,1,1}},{{1},{1},{1},{1}}},--I {[0]={{1,1,1,1}},{{1},{1},{1},{1}},{{1,1,1,1}},{{1},{1},{1},{1}}},--I
} }
do do
scs={{1,2},{1,2},{1,2},{1,2},{1,2},{1.5,1.5},{.5,2.5}} scs={
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1,2},{2,1},{2,2},{2,2}},
{[0]={1.5,1.5},{1.5,1.5},{1.5,1.5},{1.5,1.5},},
{[0]={.5,2.5},{2.5,0.5},{1.5,2.5},{2.5,1.5}},
}
TRS={ TRS={
[1]={ [1]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,1}}, [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,1}},
@@ -40,7 +48,7 @@ do
}, },
[5]={ [5]={
[01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[10]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}},
[12]={{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}}, [21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}},
[23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, [23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}},
@@ -61,10 +69,10 @@ do
[32]={{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}}, [30]={{0,0},{1,0},{-2,0},{1,-2},{-2,1}},
[03]={{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}}, [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
[20]={{0,0},{1,0},{-1,0},{0,-1}}, [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{0,0},{1,0}}, [13]={{0,0},{0,-1},{-1,0},{1,0},{0,1}},
[31]={{0,0},{-1,0}}, [31]={{0,0},{0,-1},{1,0},{-1,0},{0,1}},
} }
}TRS[3],TRS[4],TRS[6]=TRS[2],TRS[1],TRS[1] }TRS[3],TRS[4],TRS[6]=TRS[2],TRS[1],TRS[1]
end end

71
ai.lua
View File

@@ -8,7 +8,7 @@ FilledLines
TetrisShape TetrisShape
BlockedWells; BlockedWells;
]] ]]
spinNeed={2,2,4,4,4,1,2} dirCount={1,1,3,3,3,0,1}
spinOffset={ spinOffset={
{1,0,0},--S {1,0,0},--S
{1,0,0},--Z {1,0,0},--Z
@@ -18,27 +18,28 @@ 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
function ifoverlapAI(field,bk,x,y)
if x<1 or x+#bk[1]>11 or y<1 then return true end function ifoverlapAI(f,bk,x,y)
if y>#field then return nil end if y<1 then return true end
if y>#f then return nil end
for i=1,#bk do for j=1,#bk[1]do for i=1,#bk do for j=1,#bk[1]do
if field[y+i-1]and bk[i][j]>0 and field[y+i-1][x+j-1]>0 then return true end if f[y+i-1]and bk[i][j]>0 and f[y+i-1][x+j-1]>0 then return true end
end end end end
end end
function resetField(f0,start) function resetField(f0,f,start)
while field[start]do while f[start]do
rem(field,start) removeRow(f,start)
end end
for i=start,#f0 do for i=start,#f0 do
field[i]={} f[i]=getNewRow()
for j=1,10 do for j=1,10 do
field[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,cb,cx,cy)
local highest=0 local highest=0
local height={} local height=getNewRow()
local rough=0 local rough=0
local clear=0 local clear=0
local hole=0 local hole=0
@@ -49,7 +50,7 @@ function getScore(field,cb,cx,cy)
if field[i][j]==0 then f=false;break end if field[i][j]==0 then f=false;break end
end end
if f then if f then
rem(field,i) removeRow(field,i)
clear=clear+1 clear=clear+1
end end
end end
@@ -63,61 +64,67 @@ function getScore(field,cb,cx,cy)
if x>3 and x<8 and h>highest then highest=h end if x>3 and x<8 and h>highest then highest=h end
if h>1 then if h>1 then
for h=h-1,1,-1 do for h=h-1,1,-1 do
if field[h][x]==0 then hole=hole+1 end if field[h][x]==0 then hole=hole+1 if hole>5 then break end end
end end
end end
end end
for x=1,9 do for x=1,9 do
local dh=abs(height[x]-height[x]) local dh=abs(height[x]-height[x])
if dh>1 then if dh>1 then
rough=rough+dh^1.5 rough=rough+min(dh^2,10)
end end
end end
ins(freeRow,height)
return return
-highest*5 -highest*5
-rough*20 -rough*15
-cy*15 -cy*20
-#cb*10
+clear^2*4 +clear^2*4
-hole*20 -hole*15
end end
--controlname:mL,mR,rR,rL,rF,hD,sD,H,LL,RR --controlname:mL,mR,rR,rL,rF,hD,sD,H,LL,RR
function AI_getControls(ctrl) function AI_getControls(ctrl)
local field_org,cb,cx,cy={} local Tfield={}--test field
for i=1,#field do local field_org=field
field_org[i]={} for i=1,#field_org do
Tfield[i]=getNewRow()
for j=1,10 do for j=1,10 do
field_org[i][j]=field[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,1 do
local bn=ifhold==0 and bn or hn>0 and hn or nxt[1] local bn=ifhold==0 and bn or hn>0 and hn or nxt[1]
for dir=0,spinNeed[bn]-1 do--for each direction for dir=0,dirCount[bn] do--for each direction
cb=blocks[bn][dir] local cb=blocks[bn][dir]
for cx=1,11-#cb[1]do--for each positioon for cx=1,11-#cb[1]do--for each positioon
cy=#field+1 local cy=#Tfield+1
while not ifoverlapAI(field,cb,cx,cy-1)do while not ifoverlapAI(Tfield,cb,cx,cy-1)do
cy=cy-1 cy=cy-1
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 field[y]then field[y]={0,0,0,0,0,0,0,0,0,0}end if not Tfield[y]then Tfield[y]=getNewRow()end
for j=1,#cb[1]do for j=1,#cb[1]do
if cb[i][j]~=0 then if cb[i][j]~=0 then
field[y][cx+j-1]=1 Tfield[y][cx+j-1]=1
end end
end end
end--simulate lock end--simulate lock
local score=getScore(field,cb,cx,cy) local score=getScore(Tfield,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,cy) resetField(field_org,Tfield,cy)
end end
end end
end--ifHold end--ifHold loop
while #Tfield>0 do
removeRow(Tfield,1)
end--Release cache
cb,cx,cy=cb_org,cx_org,cy_org
if best.hold then if best.hold then
ins(ctrl,8) ins(ctrl,8)
end end
@@ -127,7 +134,7 @@ function AI_getControls(ctrl)
ins(ctrl,5) ins(ctrl,5)
elseif best.dir==3 then elseif best.dir==3 then
ins(ctrl,4) ins(ctrl,4)
end--rotate end--hold&rotate
best.x=best.x-spinOffset[best.bn][best.dir] best.x=best.x-spinOffset[best.bn][best.dir]
local n=blockPos[best.bn]<best.x and 2 or 1 local n=blockPos[best.bn]<best.x and 2 or 1
for i=1,abs(blockPos[best.bn]-best.x)do for i=1,abs(blockPos[best.bn]-best.x)do

View File

@@ -2,57 +2,110 @@ Buttons={
load={}, load={},
intro={}, intro={},
main={ main={
{x=240,y=300,w=320,h=60,rgb=color.red,t="Play",code=function()gotoScene("mode")end}, {x=250,y=300,w=330,h=60,rgb=color.red,t="Play",code=function()gotoScene("mode")end,down=2},
{x=240,y=380,w=320,h=60,rgb=color.blue,t="Settings",code=function()gotoScene("setting")end}, {x=250,y=380,w=330,h=60,rgb=color.blue,t="Settings",code=function()gotoScene("setting")end,up=1,down=3},
{x=155,y=460,w=150,h=60,rgb=color.yellow,t="Help",code=function()gotoScene("help")end}, {x=165,y=460,w=160,h=60,rgb=color.yellow,t="Help",code=function()gotoScene("help")end,up=2,down=5,right=4},
{x=325,y=460,w=150,h=60,rgb=color.cyan,t="Statistics",code=function()gotoScene("stat")end}, {x=335,y=460,w=160,h=60,rgb=color.cyan,t="Statistics",code=function()gotoScene("stat")end,up=2,down=5,left=3},
{x=240,y=540,w=320,h=60,rgb=color.grey,t="Quit",code=function()gotoScene("quit")end}, {x=250,y=540,w=330,h=60,rgb=color.grey,t="Quit",code=function()gotoScene("quit")end,up=3},
}, },
mode={ mode={
{x=330,y=140,w=280,h=70,rgb=color.white,t="40 Lines",code=function()startGame("sprint")end}, {x=330,y=140,w=280,h=70,rgb=color.white,t="40 Lines",code=function()startGame("sprint")end,down=4,right=2},
{x=640,y=140,w=280,h=70,rgb=color.white,t="Zen",code=function()startGame("zen")end}, {x=640,y=140,w=280,h=70,rgb=color.white,t="Zen",code=function()startGame("zen")end,down=5,left=1,right=3},
{x=950,y=140,w=280,h=70,rgb=color.white,t="GM Roll",code=function()startGame("gmroll")end}, {x=950,y=140,w=280,h=70,rgb=color.white,t="GM Roll",code=function()startGame("gmroll")end,down=6,left=2},
{x=330,y=250,w=280,h=70,rgb=color.white,t="Marathon",code=function()startGame("marathon")end}, {x=330,y=250,w=280,h=70,rgb=color.white,t="Marathon",code=function()startGame("marathon")end,up=1,down=7,right=5},
{x=330,y=360,w=280,h=70,rgb=color.white,t="Death",code=function()startGame("death")end}, {x=640,y=250,w=280,h=70,rgb=color.white,t="Tetris 41",code=function()startGame("tetris41")end,up=2,down=8,left=4,right=6},
{x=640,y=250,w=280,h=70,rgb=color.white,t="Tetris 25",code=function()startGame("tetris25")end}, {x=950,y=250,w=280,h=70,rgb=color.white,t="Blind",code=function()startGame("blind")end,up=3,down=9,left=5},
{x=640,y=360,w=280,h=70,rgb=color.white,t="AI Solo",code=function()startGame("solo")end}, {x=330,y=360,w=280,h=70,rgb=color.white,t="Death",code=function()startGame("death")end,up=4,down=10,right=8},
{x=950,y=250,w=280,h=70,rgb=color.white,t="Blind",code=function()startGame("blind")end}, {x=640,y=360,w=280,h=70,rgb=color.white,t="AI Solo",code=function()startGame("solo")end,up=5,down=10,right=9,left=7},
{x=950,y=360,w=280,h=70,rgb=color.white,t="Asymmetry Solo",code=function()startGame("asymsolo")end}, {x=950,y=360,w=280,h=70,rgb=color.white,t="Asymmetry Solo",code=function()startGame("asymsolo")end,up=6,down=10,left=8},
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()gotoScene("main")end}, {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()gotoScene("main")end,up=8},
}, },
play={ play={
{x=1230,y=30,w=80,h=40,rgb=color.white,t="Back",code=function()gotoScene("mode")end},
}, },
setting={ setting={--Normal setting
{x=330,y=100,w=200,h=60,rgb=color.white,t=function()return setting.ghost and"Ghost ON"or"Ghost OFF"end,code=function()setting.ghost=not setting.ghost end}, {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},
{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}, {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},
{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}, {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},
{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.bgmBGM("blank")end}, {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},
{x=870,y=260,w=340,h=60,rgb=color.white,t=function()return setting.fullscreen and"Disable fullscreen"or"Enable fullscreen"end, {x=870,y=260,w=340,h=60,rgb=color.white,t=function()return setting.fullscreen and"Disable fullscreen"or"Enable fullscreen"end,
code=function() code=function()
setting.fullscreen=not setting.fullscreen setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen) love.window.setFullscreen(setting.fullscreen)
end end,
up=4,down=7,left=6
}, },
{x=390,y=250,w=320,h=60,rgb=color.white,t="Advanced settings",code=function()gotoScene("setting2")end}, {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=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end}, {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()back()end,up=6},
}, },
setting2={ setting2={--Advanced setting
{x=850,y=90,w=40,h=40,rgb=color.white,t="-",code=function()setting.das=(setting.das-1)%31 end,hold=true}, {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=1210,y=90,w=40,h=40,rgb=color.white,t="+",code=function()setting.das=(setting.das+1)%31 end,hold=true}, {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=1260,y=90,w=40,h=40,rgb=color.white,t="-",code=function()setting.arr=(setting.arr-1)%16 end,hold=true}, {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=1430,y=90,w=40,h=40,rgb=color.white,t="+",code=function()setting.arr=(setting.arr+1)%16 end,hold=true}, {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=420,y=70,w=190,h=45,rgb=color.white,t=function()return setting.key[1]end,code=function()keysetting=1 end}, {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=420,y=130,w=190,h=45,rgb=color.white,t=function()return setting.key[2]end,code=function()keysetting=2 end}, {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=420,y=190,w=190,h=45,rgb=color.white,t=function()return setting.key[3]end,code=function()keysetting=3 end}, {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=420,y=250,w=190,h=45,rgb=color.white,t=function()return setting.key[4]end,code=function()keysetting=4 end}, {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=420,y=310,w=190,h=45,rgb=color.white,t=function()return setting.key[5]end,code=function()keysetting=5 end}, {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=27,right=18},
{x=420,y=370,w=190,h=45,rgb=color.white,t=function()return setting.key[6]end,code=function()keysetting=6 end}, --1~9
{x=420,y=430,w=190,h=45,rgb=color.white,t=function()return setting.key[7]end,code=function()keysetting=7 end}, {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=420,y=490,w=190,h=45,rgb=color.white,t=function()return setting.key[8]end,code=function()keysetting=8 end}, {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=19},
{x=420,y=550,w=190,h=45,rgb=color.white,t=function()return setting.key[9]end,code=function()keysetting=9 end}, {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=23},
{x=420,y=630,w=120,h=55,rgb=color.white,t="Reset",code=function()setting.key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT"}end}, {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=23},
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()keysetting=nil;back()end}, {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=23},
{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=28},
{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=28},
{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=28},
{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=27,left=9,right=28},
--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=28,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=28,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=28,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=28,left=25},
--23~26
{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=28},
{x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()keysetting=nil;back()end,up=24,left=27},
--27~28
},
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={ help={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end}, {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end},
@@ -60,32 +113,27 @@ Buttons={
stat={ stat={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end}, {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end},
}, },
sel=nil,--selected button Obj sel=nil,--selected button id(integer)
pressing=0,--pressing time
} }
for k,v in pairs(Buttons)do for k,v in pairs(Buttons)do
if type(v)=="table"then for i=1,#v do
for i=1,#v do v[i].alpha=0
v[i].alpha=0
end
end end
end end
gamePad={ virtualkey={
{x=0,y=0,r=60},--moveLeft {80,720-80,6400,80},--moveLeft
{x=0,y=0,r=60},--moveRight {240,720-80,6400,80},--moveRight
{x=0,y=0,r=60},--rotLeft {1280-240,720-80,6400,80},--rotRight
{x=0,y=0,r=60},--rotRight {1280-400,720-80,6400,80},--rotLeft
{x=0,y=0,r=60},--rotFlip {1280-240,720-240,6400,80},--rotFlip
{x=0,y=0,r=60},--hardDrop {1280-80,720-80,6400,80},--hardDrop
{x=0,y=0,r=60},--softDrop {1280-80,720-240,6400,80},--softDrop
{x=0,y=0,r=60},--hold {1280-80,720-400,6400,80},--hold
{x=0,y=0,r=60},--restart {80,80,6400,80},--restart
{x=0,y=0,r=60},--toLeft --[[
{x=0,y=0,r=60},--toRight {x=0,y=0,r=0},--toLeft
{x=0,y=0,r=60},--toDown {x=0,y=0,r=0},--toRight
} {x=0,y=0,r=0},--toDown
for i=1,#gamePad do ]]
gamePad[i].press=false }
gamePad[i].r=gamePad[i].r^2
end

View File

@@ -1,49 +1,48 @@
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"--The name of the save directory (string)
t.appendidentity=X--Search files in source directory before save directory (boolean) t.appendidentity=X--Search files in source directory before save directory (boolean)
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--Enable the accelerometer on iOS and Android by exposing it as a Joystick (boolean)
t.externalstorage=X t.gammacorrect=true
t.gammacorrect=true t.audio.mixwithsystem=true--Switch on to keep background music playing
-- t.audio.mixwithsystem=true--Keep background music playing when opening LOVE (boolean, iOS and Android only)
t.window.title="Techmino Alpha" local W=t.window
t.window.icon="/image/icon.png" W.title="Techmino V0.4"
t.window.width=1280 W.icon="/image/icon.png"
t.window.height=720 W.width,W.height=1280,720
t.window.borderless=X W.borderless=X
t.window.resizable=true W.resizable=true
t.window.minwidth=640 W.minwidth,W.minheight=640,360
t.window.minheight=360 W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string)
t.window.fullscreen=X W.fullscreen=X
t.window.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string) W.vsync=1
t.window.vsync=1 W.msaa=X--The number of samples to use with multi-sampled antialiasing (number)
t.window.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
t.window.depth=X--The number of bits per sample in the depth buffer W.stencil=1--The number of bits per sample in the stencil buffer
t.window.stencil=1--The number of bits per sample in the stencil buffer W.display=1--Monitor ID
t.window.display=1--Index of the monitor to show the window in (number) W.highdpi=X--Enable high-dpi mode for the window on a Retina display (boolean)
t.window.highdpi=X--Enable high-dpi mode for the window on a Retina display (boolean) W.x,W.y=nil
t.window.x=nil
t.window.y=nil local M=t.modules
M.window=true
t.modules.audio=true M.system=true
t.modules.data=true M.audio=true
t.modules.event=true M.data=true
t.modules.font=true M.event=true
t.modules.graphics=true M.font=true
t.modules.image=true M.graphics=true
t.modules.joystick=X M.image=true
t.modules.keyboard=true M.joystick=true
t.modules.math=true M.keyboard=true
t.modules.mouse=true M.math=true
t.modules.physics=X M.mouse=true
t.modules.sound=true M.sound=true
t.modules.system=true M.timer=true
t.modules.thread=X M.touch=true
t.modules.timer=true
t.modules.touch=X M.physics=X
t.modules.video=X M.thread=X
t.modules.window=true M.video=X
end end

View File

@@ -1,77 +1,196 @@
function love.mousemoved(x,y) function onVirtualkey(x,y)
mx,my=mouseConvert(x,y) local x,y=convert(x,y)
Buttons.sel=nil local d2,nearest,distance
for i=1,#Buttons[scene]do for K=1,#virtualkey do
local B=Buttons[scene][i] local b=virtualkey[K]
if not(B.hide and B.hide())then d2=(x-b[1])^2+(y-b[2])^2
if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then if d2<b[3]then
Buttons.sel=B if not nearest or d2<distance then
return nil nearest,distance=K,d2
end end
end end
end end
if not Buttons.sel then Buttons.pressing=0 end return nearest
end end
function love.mousepressed(x,y,k)
mx,my=mouseConvert(x,y) function buttonControl_key(i)
if mouseDown[scene]then mouseDown[scene](mx,my,k)end if i=="up"or i=="down"or i=="left"or i=="right"then
if k==1 then if not Buttons.sel then
Buttons.sel=1
else
Buttons.sel=Buttons[scene][Buttons.sel][i]or Buttons.sel
end
elseif i=="space"or i=="return"then
if not sceneSwaping and Buttons.sel then if not sceneSwaping and Buttons.sel then
local B=Buttons.sel local B=Buttons[scene][Buttons.sel]
if B.hold then Buttons.pressing=max(Buttons.pressing,1)end B.code()
B.alpha=1
sysSFX("button")
end
end
mouseShow=false
end
function buttonControl_gamepad(i)
if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then
if not Buttons.sel then
Buttons.sel=1
mouseShow=false
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
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
mouseShow=false
end
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)
if not t then
mouseShow=true
mx,my=convert(x,y)
if mouseDown[scene]then mouseDown[scene](mx,my,k)end
if k==1 then
if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel]
B.code()
B.alpha=1
Buttons.sel=nil
love.mousemoved(x,y)
sysSFX("button")
end
elseif k==3 then
back()
end
end
end
function love.mousereleased(x,y,k,t,num)
end
function love.touchpressed(id,x,y)
if not touching then
touching=id
love.mousemoved(x,y)
mouseShow=false
end
if scene=="play"and setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
pressKey(t)
end
end
end
function love.touchreleased(id,x,y)
if id==touching then
touching=nil
if Buttons.sel then
local B=Buttons[scene][Buttons.sel]
B.code() B.code()
B.alpha=1 B.alpha=1
Buttons.sel=nil Buttons.sel=nil
love.mousemoved(x,y)
SFX("button")
end end
elseif k==3 then Buttons.sel=nil
back() mouseShow=false
end end
end if scene=="play"and setting.virtualkeySwitch then
function love.mousereleased(x,y,k) local t=onVirtualkey(x,y)
Buttons.pressing=0 if t then
end releaseKey(t)
end
function love.touchpressed(id,x,y)
ins(touches,id)
end
function love.touchrealeased(id,x,y)
for i=1,#touches do
if touches[i]==id then rem(touches,i)break 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
touching=nil
end
if scene=="play"and setting.virtualkeySwitch then
local l=tc.getTouches()
for n=1,#virtualkey do
local b=virtualkey[n]
local p=false
for i=1,#l do
local x,y=convert(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then
p=true
break
end
end
if not p and players[1].keyPressing then
releaseKey(n)
end
end
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
function love.keypressed(i) function love.keypressed(i)
--[[
if Buttons.sel then
local b=Buttons.sel
if i=="up"then b.y=b.y-10
elseif i=="down"then b.y=b.y+10
elseif i=="left"then b.x=b.x-10
elseif i=="right"then b.x=b.x+10
elseif i=="k"then b.w=b.w-10
elseif i=="l"then b.w=b.w+10
elseif i==","then b.h=b.h-10
elseif i=="."then b.h=b.h+10
elseif i=="s"then
print("")
for i=1,#Buttons[scene]do
local b=Buttons[scene][i]
print(b.t,b.x,b.y,b.w,b.h)
end
end
end]]
if keyDown[scene]then keyDown[scene](i) if keyDown[scene]then keyDown[scene](i)
elseif i=="escape"then back() elseif i=="escape"or i=="back"then back()
else buttonControl_key(i)
end end
end end
function love.keyreleased(i) function love.keyreleased(i)
if keyUp[scene]then keyUp[scene](i) if keyUp[scene]then keyUp[scene](i)
end end
end end
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)
elseif i=="back"then return back()
else buttonControl_gamepad(i)
end
end
function love.gamepadreleased(joystick,i)
if gamepadUp[scene]then gamepadUp[scene](i)
end
end
function love.wheelmoved(x,y) function love.wheelmoved(x,y)
if wheelmoved[scene]then wheelmoved[scene](x,y)end if wheelmoved[scene]then wheelmoved[scene](x,y)end
end end

View File

@@ -2,7 +2,6 @@ game={}
function game.load() function game.load()
scene="load" scene="load"
curBG="none" curBG="none"
mouseShow=true
loading=1--Loading mode loading=1--Loading mode
loadnum=1--Loading counter loadnum=1--Loading counter
loadprogress=0--Loading bar loadprogress=0--Loading bar
@@ -10,38 +9,44 @@ end
function game.intro() function game.intro()
scene="intro" scene="intro"
curBG="none" curBG="none"
mouseShow=true
end end
function game.main() function game.main()
scene="main" scene="main"
curBG="none" curBG="none"
mouseShow=true
BGM("blank") BGM("blank")
collectgarbage()
end end
function game.mode() function game.mode()
savedata()
if players then restockRow()end--recycle row used in-game
scene="mode" scene="mode"
curBG="none" curBG="none"
mouseShow=true
BGM("blank") BGM("blank")
end end
function game.play() function game.play()
scene="play" scene="play"
--curBG="game1" --curBG="game1"
resetGameData() resetGameData()
collectgarbage() sysSFX("ready")
SFX("ready") mouseShow=false
end end
function game.setting() function game.setting()
scene="setting" scene="setting"
curBG="none" curBG="none"
BGM("blank") BGM("blank")
end end--Normal setting
function game.setting2() function game.setting2()
scene="setting2" scene="setting2"
curBG="none" curBG="none"
keyssetting=nil keyssetting=nil
BGM("blank") BGM("blank")
end end--Advanced setting and keyboard&joystick setting
function game.setting3()
scene="setting3"
curBG="game1"
keyssetting=nil
BGM("blank")
end--Touch setting
function game.help() function game.help()
scene="help" scene="help"
curBG="none" curBG="none"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

BIN
image/BG/bg1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
image/BG/bg2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
image/attack/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

BIN
image/attack/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 882 B

BIN
image/attack/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 973 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

BIN
image/block/1/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

BIN
image/block/1/10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 B

BIN
image/block/1/11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

BIN
image/block/1/12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 575 B

BIN
image/block/1/13.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

BIN
image/block/1/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 584 B

BIN
image/block/1/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

BIN
image/block/1/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

BIN
image/block/1/5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 533 B

BIN
image/block/1/6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 B

BIN
image/block/1/7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 B

BIN
image/block/1/8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

BIN
image/block/1/9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

BIN
image/mess/dialCircle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
image/mess/dialNeedle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

BIN
image/mess/mouseIcon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

BIN
image/mess/spinCenter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 B

BIN
image/mess/title.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

Before

Width:  |  Height:  |  Size: 201 B

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

BIN
image/virtualkey/hold.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

70
list.lua Normal file
View File

@@ -0,0 +1,70 @@
blockName={"Z","S","L","J","T","O","I"}
clearName={"Single","Double","Triple"}
color={
red={1,0,0},
green={0,1,0},
blue={.2,.2,1},
yellow={1,1,0},
purple={1,0,1},
cyan={0,1,1},
lightRed={1,.5,.5},
lightGreen={.5,1,.5},
lightBlue={.6,.6,1},
lightYellow={1,1,.5},
lightPurple={1,.5,1},
lightCyan={.5,1,1},
white={1,1,1},
grey={.6,.6,.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
}
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","restart","toLeft","toRight","toDown"}
actName_show={"move left","move right","rotate right","rotate left","rotate flip","hard drop","soft drop","hold","restart","toLeft","toRight","toDown"}
blockPos={4,4,4,4,4,5,4}
renATK={[0]=0,0,0,1,1,2,2,3,3,4,4}--3 else
renName={
[0]="","","",
"Combo 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 !",
"MEGACMB",
}
b2bATK={3,5,8}
marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0}
death_lock={10,9,8,7,6}
death_wait={6,5,4,3,2}
death_fall={10,8,7,6,5}
percent0to5={[0]="0%","20%","40%","60%","80%","100%",}

836
main.lua

File diff suppressed because it is too large Load Diff

532
paint.lua
View File

@@ -10,26 +10,26 @@ swapDeck_data={
{7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8}, {7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8},
}--Block id [ZSLJTOI] ,dir,x,y }--Block id [ZSLJTOI] ,dir,x,y
swap={ swap={
none={2,1,d=function()end}, none={2,1,d=function()end},
flash={8,1,d=function()gc.clear(1,1,1)end}, flash={8,1,d=function()gc.clear(1,1,1)end},
deck={42,1,d=function() deck={42,1,d=function()
local t=sceneSwaping.time local t=sceneSwaping.time
gc.setColor(1,1,1) gc.setColor(1,1,1)
if t>6 then if t>6 then
for i=1,43-t do for i=1,43-t do
local bn=swapDeck_data[i][1] local bn=swapDeck_data[i][1]
local b=blocks[bn][swapDeck_data[i][2]] local b=blocks[bn][swapDeck_data[i][2]]
local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4] local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4]
for y=1,#b do for x=1,#b[1]do for y=1,#b do for x=1,#b[1]do
if b[y][x]>0 then if b[y][x]>0 then
gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3) gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3)
end end
end end end end
end
else
gc.clear(1,1,1)
end end
else
gc.clear(1,1,1)
end end
end
}, },
}--Scene swapping animations }--Scene swapping animations
@@ -37,20 +37,21 @@ function drawButton()
for i=1,#Buttons[scene]do for i=1,#Buttons[scene]do
local B=Buttons[scene][i] local B=Buttons[scene][i]
if not(B.hide and B.hide())then if not(B.hide and B.hide())then
local t=B==Buttons.sel and .3 or 0 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) gc.setColor(B.rgb[1],B.rgb[2],B.rgb[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)
local t=B.t local t=B.t
if type(t)=="function"then t=t() if type(t)=="function"then t=t()end
end
gc.setColor(B.rgb[1],B.rgb[2],B.rgb[3],.3) gc.setColor(B.rgb[1],B.rgb[2],B.rgb[3],.3)
gc.setLineWidth(5)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h) gc.setLineWidth(5)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h)
mStr(t,B.x-1,B.y-1-currentFont*.5) local y0=B.y-1-currentFont*.5
mStr(t,B.x-1,B.y+1-currentFont*.5) mStr(t,B.x-1,y0)
mStr(t,B.x+1,B.y-1-currentFont*.5) mStr(t,B.x+1,y0)
mStr(t,B.x+1,B.y+1-currentFont*.5) mStr(t,B.x-1,y0+2)
mStr(t,B.x+1,y0+2)
gc.setColor(B.rgb) gc.setColor(B.rgb)
gc.setLineWidth(3)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h) gc.setLineWidth(3)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h)
mStr(t,B.x,B.y-currentFont*.5) mStr(t,B.x,B.y-currentFont*.5)
@@ -62,82 +63,104 @@ function drawDial(x,y,speed)
gc.translate(x,y) gc.translate(x,y)
gc.setColor(1,1,1) gc.setColor(1,1,1)
mStr(int(speed),0,-14) mStr(int(speed),0,-14)
gc.setColor(.6,.6,.6)gc.setLineWidth(5) gc.draw(dialCircle,0,0,nil,nil,nil,32,32)
gc.circle("line",0,0,30) gc.setColor(1,1,1,.6)
gc.setColor(1,1,1)gc.setLineWidth(2) gc.draw(dialNeedle,0,0,2.0944+(speed<=175 and .020944*speed or 4.712389-52.35988/(speed-125)),nil,nil,5,4)
gc.circle("line",0,0,30)
gc.rotate(2.0944+(speed<=175 and .020944*speed or 4.712389-52.35988/(speed-125)))
gc.setColor(.4,.4,.4,.5)gc.setLineWidth(5)
gc.line(0,0,22,0)
gc.setColor(.6,.6,.6,.5)gc.setLineWidth(3)
gc.line(0,0,22,0)
gc.pop() gc.pop()
end end
function drawPixel(y,x,id,alpha) function drawPixel(y,x,id,alpha)
gc.setColor(1,1,1,alpha) gc.setColor(1,1,1,alpha)
gc.draw(blockSkin[id],30*x-30,600-30*y) gc.draw(blockSkin[id],30*x-30,600-30*y)
end end
function drawVirtualkey()
gc.setLineWidth(10)
gc.setColor(1,1,1,setting.virtualkeyAlpha*.2)
for i=1,#virtualkey do
local b=virtualkey[i]
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
end
end
Pnt={BG={}} Pnt={BG={}}
function Pnt.BG.none() function Pnt.BG.none()
gc.clear(.1,.1,.1) gc.clear(.2,.2,.2)
end
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
gc.clear(t,t,t)
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,nil,nil,768,768) gc.draw(background[1],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()*.15,nil,nil,768,768) gc.draw(background[1],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()*.15,nil,nil,768,768) gc.draw(background[1],640,360,Timer()*.25,12,nil,64,64)
end
function Pnt.BG.rgb()
gc.clear(
sin(Timer()*1.2)*.15+.5,
sin(Timer()*1.5)*.15+.5,
sin(Timer()*1.9)*.15+.5
)
end
function Pnt.BG.strap()
gc.setColor(1,1,1)
local x=Timer()%32*40
gc.draw(background[2],x,0,nil,10)
gc.draw(background[2],x-1280,0,nil,10)
end end
function Pnt.load() function Pnt.load()
if loadprogress then gc.setLineWidth(4)
gc.setLineWidth(4) gc.setColor(1,1,1,.5)
gc.setColor(.8,.8,.8) gc.rectangle("fill",340,340,loadprogress*640,40)
gc.rectangle("fill",340,340,loadprogress*640,40) gc.setColor(1,1,1)
gc.setColor(1,1,1) gc.rectangle("line",340,340,640,40)
gc.rectangle("line",340,340,640,40) setFont(30)
setFont(30) mStr(Text.load[loading],640,345)
mStr("Loading...",640,345) setFont(20)
end mStr("not animation,real loading!",640,392)
end end
function Pnt.main() function Pnt.main()
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(30) setFont(30)
gc.print("Alpha 0.0.19726",370,150) gc.print("Alpha V0.4",370,150)
gc.draw(img.title[setting.lang],30,30) if system==2 then
gc.print("Android",530,110)
end
gc.draw(titleImage,30,30)
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) setmetatable(_G,P.index)
gc.push("transform") if P.small then
gc.translate(x,y)gc.scale(size)--Scale gc.push("transform")
gc.setColor(0,0,0,.8)gc.rectangle("fill",0,0,600,690)--Black Background gc.translate(x,y)gc.scale(size)--Scale
gc.setLineWidth(3) gc.setColor(0,0,0,.5)gc.rectangle("fill",0,0,300,600)--Black Background
gc.setColor(1,1,1)gc.rectangle("line",0,0,600,690)--Big frame gc.setLineWidth(3)
gc.translate(150,70) gc.translate(10,15)
gc.stencil(stencil_field, "replace", 1) gc.stencil(stencil_field, "replace", 1)
gc.translate(0,fieldBeneath) gc.translate(0,fieldBeneath)
love.graphics.setStencilTest("equal",1) gc.setStencilTest("equal",1)
for j=1,#field do for j=1,#field do
if falling<=0 or without(clearing,j)then if falling<=0 or without(clearing,j)then
for i=1,10 do for i=1,10 do
if field[j][i]>0 then if field[j][i]>0 then
drawPixel(j,i,field[j][i],min(visTime[j][i],20)*.05) drawPixel(j,i,field[j][i],min(visTime[j][i],20)*.05)
end
end end
else
gc.setColor(1,1,1,falling/gameEnv.fall)
gc.rectangle("fill",0,600-30*j,320,30)
end end
else end--Field
gc.setColor(1,1,1,falling/gameEnv.fall)
gc.rectangle("fill",0,600-30*j,320,30)
end
end--Field
if waiting<=0 then
if gameEnv.ghost then if gameEnv.ghost then
for i=1,r do for j=1,c do for i=1,r do for j=1,c do
if cb[i][j]>0 then if cb[i][j]>0 then
@@ -145,143 +168,239 @@ function Pnt.play()
end end
end end end end
end--Ghost end--Ghost
gc.setColor(1,1,1,lockDelay/gameEnv.lock) if waiting<=0 then
for i=1,r do for j=1,c do gc.setColor(2,2,2)
if cb[i][j]>0 then for i=1,r do for j=1,c do
gc.rectangle("fill",30*(j+cx-1)-34,596-30*(i+cy-1),38,38) if cb[i][j]>0 then
end drawPixel(i+cy-1,j+cx-1,bn,1)
end end--BlockShade(lockdelay indicator) end
for i=1,r do for j=1,c do end end--Block
if cb[i][j]>0 then
drawPixel(i+cy-1,j+cx-1,bn,1)
end
end end--Block
if gameEnv.center then
local x=30*(cx+sc[2]-1)-30+15
gc.circle("fill",x,600-30*(cy+sc[1]-1)+15,4)
gc.setColor(1,1,1,.5)
gc.circle("fill",x,600-30*(y_img+sc[1]-1)+15,4)
end--Rotate center
end
gc.setColor(1,1,1)
gc.draw(PTC.dust[p])--Draw game field
love.graphics.setStencilTest()--In-playField mask
gc.translate(0,-fieldBeneath)
gc.setColor(1,1,1)gc.rectangle("line",-1,-1,300,600)--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(1,0,0)
gc.rectangle("fill",302,600-h,8,-bar+5)
gc.setColor(1,1,0)
gc.rectangle("fill",302,600-h+(-bar+5),8,-(-bar+5)*(1-a.countdown/a.cd0))
--Timing
else
gc.setColor(1,(sin((Timer()-i)*20)+1)*.5,0)
gc.rectangle("fill",302,600-h,8,-bar+5)
--Warning
end
else
gc.setColor(1,0,0)
bar=bar*(20-a.time)*.05
gc.rectangle("fill",302,600-h,8,-bar+5)
--Disappear
end
h=h+bar
if h>600 then break end
end--Buffer line
setFont(40)
if gameEnv.hold then
gc.setColor(1,1,1)
gc.print("Hold",-113,0)
for i=1,#hb do
for j=1,#hb[1] do
if hb[i][j]>0 then
drawPixel(i+17.5-#hb*.5,j-2.5-#hb[1]*.5,holded and 13 or hn,1)
end
end
end
end--Hold
for N=1,gameEnv.next do
gc.setColor(1,1,1)
gc.print("Next",336,0)
local b=nb[N]
for i=1,#b do
for j=1,#b[1] do
if b[i][j]>0 then
drawPixel(i+20-2.4*N-#b*.5,j+12.5-#b[1]*.5,nxt[N],1)
end
end
end
end--Next
if count then
gc.push("transform")
gc.translate(155,220)
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(100) gc.draw(PTC.dust[p])--Draw game field
if count%60>45 then gc.scale(1+(count%60-45)^2*.01,1)end gc.setStencilTest()--In-playField mask
mStr(int(count/60+1),0,0) 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
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
else
gc.setColor(attackColor[a.lv][1])
bar=bar*(20-a.time)*.05
gc.rectangle("fill",305,600-h,8,-bar+5)
--Disappear
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()
end--Draw starting counter
for i=1,#bonus do
bonus[i]:draw()
end--Effects
gc.setColor(1,1,1)
setFont(40)
gc.print(format("%0.2f",time),-125,530)--Draw time
if mesDisp[gamemode]then mesDisp[gamemode]()end--Draw other message
setFont(15)
gc.setColor(1,1,1)
gc.print("BPM",380,490)
gc.print("KPM",335,580)
setFont(30)
drawDial(350,520,dropSpeed)
drawDial(400,570,keySpeed)
--Speed dials
gc.pop()
end--Draw players
gc.setLineWidth(3)
for i=1,#FX.beam do
local b=FX.beam[i]
local t=b.t/30
if t<.25 then
t=t*4
gc.setColor(1,1,1,4*t)
gc.line(b[1],b[2],b[1]+t*(b[3]-b[1]),b[2]+t*(b[4]-b[2]))
elseif t<.75 then
gc.setColor(1,1,1)
gc.line(b[1],b[2],b[3],b[4])
else else
t=4*t-3 gc.push("transform")
gc.setColor(1,1,1,4-4*t) gc.translate(x,y)gc.scale(size)--Scale
gc.line(b[1]+t*(b[3]-b[1]),b[2]+t*(b[4]-b[2]),b[3],b[4]) gc.setColor(0,0,0,.7)gc.rectangle("fill",0,0,600,690)--Black Background
gc.setLineWidth(3)
gc.setColor(1,1,1)gc.rectangle("line",0,0,600,690)--Big frame
gc.translate(150,70)
gc.stencil(stencil_field, "replace", 1)
gc.translate(0,fieldBeneath)
gc.setStencilTest("equal",1)
for j=1,#field do
if falling<=0 or without(clearing,j)then
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
gc.setColor(1,1,1,falling/gameEnv.fall)
gc.rectangle("fill",0,600-30*j,320,30)
end
end--Field
if waiting<=0 then
if gameEnv.ghost then
for i=1,r do for j=1,c do
if cb[i][j]>0 then
drawPixel(i+y_img-1,j+cx-1,bn,.3)
end
end end
end--Ghost
gc.setColor(1,1,1,lockDelay/gameEnv.lock)
for i=1,r do for j=1,c do
if cb[i][j]>0 then
gc.rectangle("fill",30*(j+cx-1)-34,596-30*(i+cy-1),38,38)
end
end end--BlockShade(lockdelay indicator)
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
if gameEnv.center then
local x=30*(cx+sc[2]-1)-30+15
gc.draw(spinCenter,x,600-30*(cy+sc[1]-1)+15,nil,nil,nil,4,4)
gc.setColor(1,1,1,.5)
gc.draw(spinCenter,x,600-30*(y_img+sc[1]-1)+15,nil,nil,nil,4,4)
end--Rotate center
end
gc.setColor(1,1,1)
gc.draw(PTC.dust[p])--Draw game field
gc.setStencilTest()--In-playField mask
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
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
else
gc.setColor(attackColor[a.lv][1])
bar=bar*(20-a.time)*.05
gc.rectangle("fill",305,600-h,8,-bar+5)
--Disappear
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)
gc.setColor(color.red)
gc.rectangle("line",-20,600-100,15,2)
gc.setColor(color.blue)
gc.rectangle("line",-20,600-480,15,2)
--B2B bar
setFont(40)
if gameEnv.hold then
gc.setColor(1,1,1)
gc.print("Hold",-113,0)
for i=1,#hb do
for j=1,#hb[1] do
if hb[i][j]>0 then
drawPixel(i+17.5-#hb*.5,j-2.5-#hb[1]*.5,holded and 13 or hn,1)
end
end
end
end--Hold
for N=1,gameEnv.next do
gc.setColor(1,1,1)
gc.print("Next",336,0)
local b=nb[N]
for i=1,#b do
for j=1,#b[1] do
if b[i][j]>0 then
drawPixel(i+20-2.4*N-#b*.5,j+12.5-#b[1]*.5,nxt[N],1)
end
end
end
end--Next
if count then
gc.push("transform")
gc.translate(155,220)
gc.setColor(1,1,1)
setFont(100)
if count%60>45 then gc.scale(1+(count%60-45)^2*.01,1)end
mStr(int(count/60+1),0,0)
gc.pop()
end--Draw starting counter
for i=1,#bonus do
local a=#field>(9-bonus[i].dy*.03333)and .7 or 1
bonus[i]:draw(a)
end--Effects
gc.setColor(1,1,1)
setFont(40)
gc.print(format("%0.2f",time),-125,530)--Draw time
if mesDisp[gamemode]then mesDisp[gamemode]()end--Draw other message
setFont(15)
gc.setColor(1,1,1)
gc.print("BPM",380,490)
gc.print("KPM",335,580)
setFont(30)
drawDial(350,520,dropSpeed)
drawDial(400,570,keySpeed)
--Speed dials
gc.pop()
end end
end--Draw players
gc.setColor(1,1,1)
for i=1,3 do
gc.draw(PTC.attack[i])
end end
setmetatable(_G,nil) setmetatable(_G,nil)
if setting.virtualkeySwitch then
drawVirtualkey()
end
end end
function Pnt.setting2() function Pnt.setting2()
gc.setColor(1,1,1)
setFont(18)
mStr("softdropDAS:"..setting.sddas,828,140)
mStr("softdropARR:"..setting.sdarr,1043,140)
setFont(35) setFont(35)
gc.setColor(1,1,1) mStr("DAS:"..setting.das,828,73)
mStr("DAS:"..setting.das,330,72) mStr("ARR:"..setting.arr,1043,73)
mStr("ARR:"..setting.arr,545,72) gc.print("Keyboard Joystick",223,10)
gc.setColor(1,1,1)
for i=1,9 do for i=1,9 do
gc.printf(actName_show[i]..":",100,60*i-8,200,"right") gc.printf(actName_show[i]..":",0,60*i-8,180,"right")
end end
if keysetting then if keysetting or gamepadsetting then
setFont(35) gc.print("<<",keysetting and 380 or 670,60*(keysetting or gamepadsetting)-10)
gc.print("<<",550,60*keysetting-10) end
end
function Pnt.setting3()
drawVirtualkey()
gc.setLineWidth(3)
gc.setColor(1,1,1,sin(Timer()*4)*.1+.1)
for i=1,31 do
gc.line(40*i,0,40*i,720)
end
for i=1,17 do
gc.line(0,40*i,1280,40*i)
end end
end end
function Pnt.help() function Pnt.help()
@@ -290,20 +409,25 @@ function Pnt.help()
for i=1,11 do for i=1,11 do
mStr(Text.help[i],640,15+43*i) mStr(Text.help[i],640,15+43*i)
end end
gc.draw(img.title[setting.lang],180,600,.2,.7+.05*sin(Timer()*2),nil,140,100) gc.draw(titleImage,180,600,.2,.7+.05*sin(Timer()*2),nil,140,100)
end end
function Pnt.stat() function Pnt.stat()
setFont(30) setFont(30)
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,6 do for i=1,10 do
gc.print(Text.stat[i],250,20+40*i) gc.print(Text.stat[i],350,20+40*i)
end end
gc.print(stat.run,600,60) gc.print(stat.run,650,60)
gc.print(stat.game,600,100) gc.print(stat.game,650,100)
gc.print(format("%0.2f",stat.gametime).."s",600,140) gc.print(format("%0.2f",stat.gametime).."s",650,140)
gc.print(stat.piece,600,180) gc.print(stat.piece,650,180)
gc.print(stat.row,600,220) gc.print(stat.row,650,220)
gc.print(stat.atk,600,260) gc.print(stat.atk,650,260)
gc.draw(img.title[setting.lang],180,600,.2,.7+.05*sin(Timer()*2),nil,140,100) gc.print(stat.key,650,300)
gc.print(stat.rotate,650,340)
gc.print(stat.hold,650,380)
gc.print(stat.spin,650,420)
gc.draw(titleImage,260,570,.2+.07*sin(Timer()*3),.8,nil,250,60)
end end

33
particle.lua Normal file
View File

@@ -0,0 +1,33 @@
PTC={dust={}}--Particle systems
c=gc.newCanvas(6,6)gc.setCanvas(c)
gc.clear(1,1,1)
PTC.dust[0]=gc.newParticleSystem(c,1000)
PTC.dust[0]:setParticleLifetime(.2,.3)
PTC.dust[0]:setEmissionRate(0)
PTC.dust[0]:setLinearAcceleration(-1500,-200,1500,200)
PTC.dust[0]:setColors(1,1,1,.5,1,1,1,0)
c:release()
--Dust particles
PTC.attack={}
PTC.attack[1]=gc.newParticleSystem(gc.newImage("/image/attack/1.png"),200)
PTC.attack[1]:setParticleLifetime(.25)
PTC.attack[1]:setEmissionRate(0)
PTC.attack[1]:setSpin(10)
PTC.attack[1]:setColors(1,1,1,.7,1,1,1,0)
PTC.attack[2]=gc.newParticleSystem(gc.newImage("/image/attack/2.png"),200)
PTC.attack[2]:setParticleLifetime(.3)
PTC.attack[2]:setEmissionRate(0)
PTC.attack[2]:setSpin(8)
PTC.attack[2]:setColors(1,1,1,.7,1,1,1,0)
PTC.attack[3]=gc.newParticleSystem(gc.newImage("/image/attack/3.png"),200)
PTC.attack[3]:setParticleLifetime(.4)
PTC.attack[3]:setEmissionRate(0)
PTC.attack[3]:setSpin(6)
PTC.attack[3]:setColors(1,1,1,.7,1,1,1,0)
--Attack particles
gc.setCanvas()
c=nil

120
system.lua Normal file
View File

@@ -0,0 +1,120 @@
function love.update(dt)
--[[
if players then
for k,v in pairs(players[1])do
if rawget(_G,k)then print(k)end
end
end--check player data flew(debugging)
]]
for i=#BGblock,1,-1 do
BGblock[i].y=BGblock[i].y+BGblock[i].v
if BGblock[i].y>720 then rem(BGblock,i)end
end
BGblock.ct=BGblock.ct-1
if BGblock.ct==0 then
ins(BGblock,getNewBlock())
BGblock.ct=rnd(20,30)
end
--Background blocks update
if sceneSwaping then
sceneSwaping.time=sceneSwaping.time-1
if sceneSwaping.time==sceneSwaping.mid then
for i=1,#Buttons[scene]do
Buttons[scene][i].alpha=0
end--Reset buttons' state
game[sceneSwaping.tar]()
Buttons.sel=nil
elseif sceneSwaping.time==0 then
sceneSwaping=nil
end
elseif Tmr[scene]then
Tmr[scene](dt)
end
--scene swapping & Timer
end
function love.receiveData(id,data)
return nil
end
function love.draw()
Pnt.BG[curBG]()
gc.setColor(1,1,1,.3)
for n=1,#BGblock do
local b,img=BGblock[n].b,blockSkin[BGblock[n].bn]
local size=BGblock[n].size
for i=1,#b do for j=1,#b[1]do
if b[i][j]>0 then
gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size)
end
end end--Block
end
if Pnt[scene]then Pnt[scene]()end
setFont(40)
drawButton()
if mouseShow and not touching then
gc.setColor(1,1,1)
gc.draw(mouseIcon,mx,my,nil,nil,nil,10,10)
end
if sceneSwaping then sceneSwaping.draw()end
gc.setColor(0,0,0)
if screenM>0 then
gc.rectangle("fill",0,0,1280,-screenM)
gc.rectangle("fill",0,720,1280,screenM)
end--Draw black side
numFont(20)gc.setColor(1,1,1)
gc.print(tm.getFPS(),0,700)
gc.print(gcinfo(),0,680)
--if gcinfo()>500 then collectgarbage()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
function love.run()
local frameT=Timer()
tm.step()
love.resize(nil,gc.getHeight())
game.load()--System scene Launch
math.randomseed(os.time()*626)--true A-lthour's ID!
return function()
love.event.pump()
for name,a,b,c,d,e,f in love.event.poll()do
if name=="quit"then return 0 end
love.handlers[name](a,b,c,d,e,f)
end
if focus then
tm.step()
-- love.receiveData(id,data)
love.update(tm.getDelta())
gc.clear()
love.draw()
gc.present()
if not wd.hasFocus()then
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()
end
end

20
texture.lua Normal file
View File

@@ -0,0 +1,20 @@
local N=gc.newImage
titleImage=N("/image/mess/title.png")
mouseIcon=N("/image/mess/mouseIcon.png")
spinCenter=N("/image/mess/spinCenter.png")
dialCircle=N("/image/mess/dialCircle.png")
dialNeedle=N("/image/mess/dialNeedle.png")
blockSkin={}
for i=1,13 do
blockSkin[i]=N("/image/block/1/"..i..".png")
end
background={}
gc.setColor(1,1,1)
background={
N("/image/BG/bg1.jpg"),
N("/image/BG/bg2.png"),
}
virtualkeyIcon={}
for i=1,9 do
virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png")
end

View File

@@ -22,7 +22,7 @@ function Tmr.load()
end end
elseif loading==3 then elseif loading==3 then
if loadnum<=#sfx then if loadnum<=#sfx then
sfx[sfx[loadnum]]=love.audio.newSource("/SFX/"..sfx[loadnum]..".ogg","static") sfx[sfx[loadnum]]={love.audio.newSource("/SFX/"..sfx[loadnum]..".ogg","static")}
loadprogress=loadnum/#sfx loadprogress=loadnum/#sfx
loadnum=loadnum+1 loadnum=loadnum+1
else else
@@ -40,11 +40,28 @@ 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
for i=#FX.beam,1,-1 do
local b=FX.beam[i]
b.t=b.t+1
local t0=b.t*.025--t in [0,1]
local t=(sin(1.5*(2*t0-1))+1)*.5
PTC.attack[b.lv]:setPosition(b[1]+(b[3]-b[1])*t,b[2]+(b[4]-b[2])*t)
PTC.attack[b.lv]:emit(1)
if t0==1 then
rem(FX.beam,i)
end
end
for i=1,3 do
PTC.attack[i]:update(dt)
end
-- Update attack beam
if count then if count then
count=count-1 count=count-1
if count==0 then if count==0 then
count=nil count=nil
SFX("start") sysSFX("start")
for P=1,#players do for P=1,#players do
P=players[P] P=players[P]
_G.P=P _G.P=P
@@ -55,10 +72,22 @@ function Tmr.play(dt)
end end
setmetatable(_G,nil) setmetatable(_G,nil)
elseif count%60==0 then elseif count%60==0 then
SFX("ready") sysSFX("ready")
end end
return nil
end--Start counting if count then
for p=1,#players do
P=players[p]
setmetatable(_G,P.index)
if keyPressing[1]or keyPressing[2]then
P.moving=moving+sgn(moving)
else
P.moving=0
end
end
return nil
end
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) setmetatable(_G,P.index)
@@ -104,8 +133,17 @@ function Tmr.play(dt)
P.moving=0 P.moving=0
end end
if keyPressing[7]then if keyPressing[7]then
act.softDrop()
P.downing=downing+1 P.downing=downing+1
local d=abs(downing)-gameEnv.sddas
if d>1 then
if gameEnv.sdarr>0 then
if d%gameEnv.sdarr==0 then
act.down1()
end
else
act.toDown()
end
end
else else
P.downing=0 P.downing=0
end end
@@ -114,8 +152,8 @@ function Tmr.play(dt)
if falling<=0 then if falling<=0 then
if #field>clearing[1]then SFX("fall")end if #field>clearing[1]then SFX("fall")end
for i=1,#clearing do for i=1,#clearing do
rem(field,clearing[i]) removeRow(field,clearing[i])
rem(visTime,clearing[i]) removeRow(visTime,clearing[i])
end end
P.clearing={} P.clearing={}
end end
@@ -139,6 +177,7 @@ function Tmr.play(dt)
end end
end end
end end
if P.b2b>480 then P.b2b=P.b2b-1 end
else--Alive else--Alive
P.keySpeed=keySpeed*.96+cstat.key/time*60*.04 P.keySpeed=keySpeed*.96+cstat.key/time*60*.04
P.dropSpeed=dropSpeed*.96+cstat.piece/time*60*.04 P.dropSpeed=dropSpeed*.96+cstat.piece/time*60*.04
@@ -148,16 +187,15 @@ function Tmr.play(dt)
if falling<=0 then if falling<=0 then
if #field>clearing[1]then SFX("fall")end if #field>clearing[1]then SFX("fall")end
for i=1,#clearing do for i=1,#clearing do
rem(field,clearing[i]) removeRow(field,clearing[i])
rem(visTime,clearing[i]) removeRow(visTime,clearing[i])
end end
P.clearing={} P.clearing={}
end end
end--Rows cleared drop end--Rows cleared drop
for j=1,#field do for i=1,10 do for j=1,#field do for i=1,10 do
if visTime[j][i]<20 then P.visTime[j][i]=visTime[j][i]+.5 end if visTime[j][i]<20 then P.visTime[j][i]=visTime[j][i]+.5 end
end end end end--Make field visible
--Make field visible
end--Dead end--Dead
for i=#bonus,1,-1 do for i=#bonus,1,-1 do
bonus[i].t=bonus[i].t+1 bonus[i].t=bonus[i].t+1
@@ -179,14 +217,9 @@ function Tmr.play(dt)
end end
end end
end end
if fieldBeneath>0 then P.fieldBeneath=fieldBeneath-2 end if fieldBeneath>0 then P.fieldBeneath=fieldBeneath-3 end
P.b2b1=P.b2b1*.95+P.b2b*.05
PTC.dust[p]:update(dt) PTC.dust[p]:update(dt)
end end
for i=#FX.beam,1,-1 do
FX.beam[i].t=FX.beam[i].t+1
if FX.beam[i].t>30 then
rem(FX.beam,i)
end
end
setmetatable(_G,nil) setmetatable(_G,nil)
end end

View File

@@ -31,7 +31,7 @@ act={
end end
end, end,
softDrop=function() softDrop=function()
act.toDown() if cy~=y_img then P.cy=cy-1 end
P.downing=1 P.downing=1
end, end,
rotRight=function()spin(1)end, rotRight=function()spin(1)end,
@@ -43,8 +43,8 @@ act={
resetGameData() resetGameData()
count=60+26--Althour'z neim count=60+26--Althour'z neim
end, end,
down1=function()drop()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 drop()else break end 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, 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, 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, toRight=function()while not ifoverlap(cb,cx+1,cy)do P.cx,P.lockDelay=cx+1,gameEnv.lock;freshgho()end end,