Compare commits

..

1 Commits
v0.3 ... v0.4

Author SHA1 Message Date
MrZ_26
4c4bae854f Alpha V0.4 2020-02-04 19:27:13 +08:00
26 changed files with 625 additions and 481 deletions

10
TRS.lua
View File

@@ -48,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}},
@@ -69,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

View File

@@ -13,7 +13,7 @@ Buttons={
{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=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,down=6,left=2}, {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,up=1,down=7,right=5}, {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=640,y=250,w=280,h=70,rgb=color.white,t="Tetris 21",code=function()startGame("tetris21")end,up=2,down=8,left=4,right=6}, {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=950,y=250,w=280,h=70,rgb=color.white,t="Blind",code=function()startGame("blind")end,up=3,down=9,left=5}, {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=330,y=360,w=280,h=70,rgb=color.white,t="Death",code=function()startGame("death")end,up=4,down=10,right=8}, {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=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=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},
@@ -22,7 +22,7 @@ Buttons={
}, },
play={ play={
}, },
setting={ setting={--Normal setting
{x=330,y=100,w=200,h=60,rgb=color.white,t=function()return setting.ghost and"Ghost ON"or"Ghost OFF"end,code=function()setting.ghost=not setting.ghost end,down=6,right=2}, {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,down=6,left=1,right=3}, {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,down=4,left=2}, {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},
@@ -38,7 +38,7 @@ Buttons={
{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=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}, {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=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=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=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=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},
@@ -73,28 +73,31 @@ Buttons={
{x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()keysetting=nil;back()end,up=24,left=27}, {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 --27~28
}, },
setting3={ 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() {x=500,y=310,w=120,h=80,rgb=color.white,t="Reset",code=function()
for K=1,#virtualkey do for K=1,#virtualkey do
local b,b0=virtualkey[K],gameEnv0.virtualkey[K] local b,b0=virtualkey[K],gameEnv0.virtualkey[K]
b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4] b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4]
end--Reset virtualkey end--Reset virtualkey
end,down=4,right=2}, end},
{x=640,y=310,w=120,h=80,rgb=color.white,t="Snap",code=function() {x=640,y=310,w=120,h=80,rgb=color.white,t="Snap",code=function()
for K=1,#virtualkey do for K=1,#virtualkey do
local b=virtualkey[K] local b=virtualkey[K]
b[1],b[2]=int(b[1]*.025+.5)*40,int(b[2]*.025+.5)*40 b[1],b[2]=int(b[1]*.025+.5)*40,int(b[2]*.025+.5)*40
end--Make virtualkey neat end--Snap all keys
end,down=5,left=1,right=3}, end},
{x=780,y=310,w=120,h=80,rgb=color.white,t=function()return percent0to5[setting.virtualkeyAlpha]end,code=function() {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 setting.virtualkeyAlpha=(setting.virtualkeyAlpha+1)%6
--Adjust virtualkey alpha --Adjust virtualkey alpha
end,down=6,left=2}, end},
{x=500,y=410,w=120,h=80,rgb=color.white,t="Icon",code=function() {x=500,y=410,w=120,h=80,rgb=color.white,t="Icon",code=function()
setting.virtualkeyIcon=not setting.virtualkeyIcon setting.virtualkeyIcon=not setting.virtualkeyIcon
--Switch virtualkey icon --Switch virtualkey icon
end,up=1,right=6}, end},
{x=640,y=410,w=120,h=80,rgb=color.white,t="Back",code=function()back()end,up=2,left=4,right=3}, {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() {x=780,y=410,w=120,h=80,rgb=color.white,t="Size",code=function()
for K=1,#virtualkey do for K=1,#virtualkey do
local b=virtualkey[K] local b=virtualkey[K]
@@ -102,7 +105,7 @@ Buttons={
if b[4]==150 then b[4]=40 end if b[4]==150 then b[4]=40 end
b[3]=b[4]^2 b[3]=b[4]^2
end end
end,up=3,left=5}, 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},

View File

@@ -8,42 +8,41 @@ function love.conf(t)
t.gammacorrect=true t.gammacorrect=true
t.audio.mixwithsystem=true--Switch on to keep background music playing t.audio.mixwithsystem=true--Switch on to keep background music playing
t.window.title="Techmino V0.3" 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--Monitor ID 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
t.modules.window=true local M=t.modules
t.modules.system=true 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=true 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.sound=true M.mouse=true
t.modules.timer=true M.sound=true
t.modules.touch=true M.timer=true
M.touch=true
t.modules.physics=X M.physics=X
t.modules.thread=X M.thread=X
t.modules.video=X M.video=X
end end

View File

@@ -92,7 +92,7 @@ function love.touchpressed(id,x,y)
love.mousemoved(x,y) love.mousemoved(x,y)
mouseShow=false mouseShow=false
end end
if scene=="play"then if scene=="play"and setting.virtualkeySwitch then
local t=onVirtualkey(x,y) local t=onVirtualkey(x,y)
if t then if t then
pressKey(t) pressKey(t)
@@ -111,7 +111,7 @@ function love.touchreleased(id,x,y)
Buttons.sel=nil Buttons.sel=nil
mouseShow=false mouseShow=false
end end
if scene=="play"then if scene=="play"and setting.virtualkeySwitch then
local t=onVirtualkey(x,y) local t=onVirtualkey(x,y)
if t then if t then
releaseKey(t) releaseKey(t)
@@ -124,7 +124,7 @@ function love.touchmoved(id,x,y,dx,dy)
if not Buttons.sel then if not Buttons.sel then
touching=nil touching=nil
end end
if scene=="play"then if scene=="play"and setting.virtualkeySwitch then
local l=tc.getTouches() local l=tc.getTouches()
for n=1,#virtualkey do for n=1,#virtualkey do
local b=virtualkey[n] local b=virtualkey[n]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 378 B

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

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

View File

Before

Width:  |  Height:  |  Size: 638 B

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

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%",}

View File

@@ -1,14 +0,0 @@
blockName={"Z","S","L","J","T","O","I"}
clearName={"Single","Double","Triple"}
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,4}--3 else
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%",}

340
main.lua
View File

@@ -50,7 +50,7 @@ do
Windows=1, Windows=1,
Android=2, Android=2,
} }
system=l[love.system.getOS()] system=l[love.system.getOS()]or 0
l=nil l=nil
end end
touching=nil--1st touching ID touching=nil--1st touching ID
@@ -155,48 +155,48 @@ 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
appear=function(t) appear=function(t,a)
setFont(t.font) setFont(t.font)
gc.setColor(1,1,1,min((30-abs(t.t-30))*.05,1)*(#field>9 and .7 or 1)) gc.setColor(1,1,1,min((30-abs(t.t-30))*.05,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) fly=function(t,a)
setFont(t.font) setFont(t.font)
gc.setColor(1,1,1,min((30-abs(t.t-30))*.05,1)*(#field>9 and .7 or 1)) gc.setColor(1,1,1,min((30-abs(t.t-30))*.05,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) 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)*(#field>9 and .7 or 1)) 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
mStr(t.text,0,-t.font*.5) mStr(t.text,0,-t.font*.5)
gc.pop() gc.pop()
end, end,
drive=function(t) drive=function(t,a)
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)*(#field>9 and .7 or 1)) 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) mStr(t.text,0,-t.font*.5)
gc.pop() gc.pop()
end, end,
spin=function(t) 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)*(#field>9 and .7 or 1)) 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) mStr(t.text,0,-t.font*.5)
gc.pop() gc.pop()
end, end,
flicker=function(t) flicker=function(t,a)
setFont(t.font) setFont(t.font)
gc.setColor(1,1,1,min((30-abs(t.t-30))*.05,1)*(#field>9 and .8 or 1)*(rnd()+.5)) gc.setColor(1,1,1,min((30-abs(t.t-30))*.05,1)*a*(rnd()+.5))
mStr(t.text,150,250-t.font*.5+t.dy) mStr(t.text,150,250-t.font*.5+t.dy)
end, end,
} }
@@ -204,35 +204,9 @@ function stencil_field()
gc.rectangle("fill",0,-10,300,610) gc.rectangle("fill",0,-10,300,610)
end end
--System data --System data
color={
red={1,0,0},
green={0,1,0},
blue={0,0,1},
yellow={1,1,0},
purple={1,0,1},
cyan={0,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
}
require("TRS")--load block&TRS kick require("TRS")--load block&TRS kick
require("lists")--load lists require("list")--load lists
gameEnv0={ gameEnv0={
das=10,arr=2, das=10,arr=2,
@@ -361,7 +335,7 @@ loadmode={
curBG="game2" curBG="game2"
BGM("push") BGM("push")
end, end,
tetris21=function() tetris41=function()
modeEnv={ modeEnv={
wait=1, wait=1,
fall=1, fall=1,
@@ -369,15 +343,15 @@ loadmode={
createPlayer(1,340,15)--Player createPlayer(1,340,15)--Player
local n=2 local n=2
for i=1,2 do for i=1,4 do
for j=1,5 do for j=1,5 do
createPlayer(n,150*i-115,142*j-130,.19,rnd(4)+1) createPlayer(n,75*i-48,142*j-130,.19,rnd(4)+1)
n=n+1 n=n+1
end end
end end
for i=8,9 do for i=9,12 do
for j=1,5 do for j=1,5 do
createPlayer(n,150*i-210,142*j-130,.19,rnd(4)+1) createPlayer(n,75*i+292,142*j-130,.19,rnd(4)+1)
n=n+1 n=n+1
end end
end--AIs end--AIs
@@ -531,7 +505,7 @@ mesDisp={
death=function() death=function()
mStr(P.cstat.row.."/"..gameEnv.target,-75,250) mStr(P.cstat.row.."/"..gameEnv.target,-75,250)
end, end,
tetris21=function() tetris41=function()
gc.print("Remain",-140,450) gc.print("Remain",-140,450)
gc.print("Attack",-130,305) gc.print("Attack",-130,305)
setFont(80) setFont(80)
@@ -581,6 +555,7 @@ setting={
}, },
virtualkeyAlpha=3, virtualkeyAlpha=3,
virtualkeyIcon=true, virtualkeyIcon=true,
virtualkeySwitch=false,
} }
stat={ stat={
run=0, run=0,
@@ -726,6 +701,10 @@ function loaddata()
v=string.splitS(v) v=string.splitS(v)
for i=#v+1,8 do v[i]="N/A"end for i=#v+1,8 do v[i]="N/A"end
setting.key=v 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 elseif t=="virtualkey"then
v=string.splitS(v,"/") v=string.splitS(v,"/")
for i=1,9 do for i=1,9 do
@@ -738,6 +717,8 @@ function loaddata()
setting.virtualkeyAlpha=int(abs(toN(v))) setting.virtualkeyAlpha=int(abs(toN(v)))
elseif t=="virtualkeyIcon"then elseif t=="virtualkeyIcon"then
setting.virtualkeyIcon=v=="true" setting.virtualkeyIcon=v=="true"
elseif t=="virtualkeySwitch"then
setting.virtualkeySwitch=v=="true"
--Settings --Settings
elseif t=="das"or t=="arr"or t=="sddas"or t=="sdarr"then elseif t=="das"or t=="arr"or t=="sddas"or t=="sdarr"then
v=toN(v)if not v or v<0 then v=0 end v=toN(v)if not v or v<0 then v=0 end
@@ -781,9 +762,11 @@ function savedata()
stringPack("sddas=",setting.sddas), stringPack("sddas=",setting.sddas),
stringPack("sdarr=",setting.sdarr), stringPack("sdarr=",setting.sdarr),
stringPack("keyset=",table.concat(setting.key,"/")), stringPack("keyset=",table.concat(setting.key,"/")),
stringPack("gamepadset=",table.concat(setting.gamepad,"/")),
stringPack("virtualkey=",table.concat(vk,"/")), stringPack("virtualkey=",table.concat(vk,"/")),
stringPack("virtualkeyAlpha=",setting.virtualkeyAlpha), stringPack("virtualkeyAlpha=",setting.virtualkeyAlpha),
stringPack("virtualkeyIcon=",setting.virtualkeyIcon), stringPack("virtualkeyIcon=",setting.virtualkeyIcon),
stringPack("virtualkeySwitch=",setting.virtualkeySwitch),
},"\r\n") },"\r\n")
--t=love.math.compress(t,"zlib"):getString() --t=love.math.compress(t,"zlib"):getString()
userdata:open("w") userdata:open("w")
@@ -797,6 +780,7 @@ function createPlayer(id,x,y,size,AIspeed,data)
local P=players[id] local P=players[id]
P.index={__index=P} P.index={__index=P}
P.x,P.y,P.size=x,y,size or 1 P.x,P.y,P.size=x,y,size or 1
P.small=P.size<.3
if AIspeed then if AIspeed then
P.ai={ P.ai={
@@ -863,16 +847,20 @@ end
function showText(text,type,font,dy) function showText(text,type,font,dy)
ins(P.bonus,{t=0,text=text,draw=FX[type],font=font,dy=dy or 0}) ins(P.bonus,{t=0,text=text,draw=FX[type],font=font,dy=dy or 0})
end end
function createBeam(s,r,level)--Player id function createBeam(s,r,lv)--Player id
s,r=players[s],players[r] S,R=players[s],players[r]
ins(FX.beam,{ local x1,y1,x2,y2
s.x+(30*(cx+sc[2]-1)-30+15+150)*s.size, if S.small then
s.y+(600-30*(cy+sc[1]-1)+15+70)*s.size, x1,y1=S.x+(30*(cx+sc[2]-1)+15)*S.size,S.y+(600-30*(cy+sc[1]-1)+15)*S.size
r.x+308*r.size, else
r.y+450*r.size, x1,y1=S.x+(30*(cx+sc[2]-1)-30+15+150)*S.size,S.y+(600-30*(cy+sc[1]-1)+15+70)*S.size
t=0, end
lv=level, if R.small then
}) x2,y2=R.x+150*R.size,R.y+300*R.size
else
x2,y2=R.x+308*R.size,R.y+450*R.size
end
ins(FX.beam,{x1,y1,x2,y2,t=0,lv=lv})
end end
function freshgho() function freshgho()
if not P.gameEnv._20G then if not P.gameEnv._20G then
@@ -974,12 +962,12 @@ function spin(d,ifpre)
local isc=d==1 and{c-sc[2]+1,sc[1]}or d==-1 and{sc[2],r-sc[1]+1}or{r-sc[1]+1,c-sc[2]+1} local isc=d==1 and{c-sc[2]+1,sc[1]}or d==-1 and{sc[2],r-sc[1]+1}or{r-sc[1]+1,c-sc[2]+1}
local ir,ic=#icb,#icb[1] local ir,ic=#icb,#icb[1]
local ix,iy=cx+sc[2]-isc[2],cy+sc[1]-isc[1] local ix,iy=cx+sc[2]-isc[2],cy+sc[1]-isc[1]
local t=false--if spin available local t--succssful num
local iki=TRS[bn][dir*10+(dir+d)%4] local iki=TRS[bn][dir*10+(dir+d)%4]
for i=1,#iki do for i=1,#iki do
if not ifoverlap(icb,ix+iki[i][1],iy+iki[i][2])then if not ifoverlap(icb,ix+iki[i][1],iy+iki[i][2])then
ix,iy=ix+iki[i][1],iy+iki[i][2] ix,iy=ix+iki[i][1],iy+iki[i][2]
t=true t=i
break break
end end
end end
@@ -988,12 +976,14 @@ function spin(d,ifpre)
P.sc,P.cb=isc,icb P.sc,P.cb=isc,icb
P.r,P.c=ir,ic P.r,P.c=ir,ic
P.dir=(dir+d)%4 P.dir=(dir+d)%4
P.spinLast=true P.spinLast=t
freshgho()--May cancel spinLast freshgho()--May cancel spinLast
freshLockDelay() freshLockDelay()
SFX(ifpre and"prerotate"or ifoverlap(cb,cx,cy+1)and ifoverlap(cb,cx-1,cy)and ifoverlap(cb,cx+1,cy)and"rotatekick"or"rotate") SFX(ifpre and"prerotate"or ifoverlap(cb,cx,cy+1)and ifoverlap(cb,cx-1,cy)and ifoverlap(cb,cx+1,cy)and"rotatekick"or"rotate")
if id==1 then
stat.rotate=stat.rotate+1 stat.rotate=stat.rotate+1
end end
end
end end
function hold(ifpre) function hold(ifpre)
if not holded and waiting<=0 and gameEnv.hold then if not holded and waiting<=0 and gameEnv.hold then
@@ -1009,15 +999,18 @@ function hold(ifpre)
if ifoverlap(cb,cx,cy) then lock()Event.gameover.lose()end if ifoverlap(cb,cx,cy) then lock()Event.gameover.lose()end
P.holded=true P.holded=true
SFX(ifpre and"prehold"or"hold") SFX(ifpre and"prehold"or"hold")
if id==1 then
stat.hold=stat.hold+1 stat.hold=stat.hold+1
end end
end
end end
function drop() function drop()
if cy==y_img then if cy==y_img then
ins(dropTime,1,frame)rem(dropTime,11)--update speed dial ins(dropTime,1,frame)rem(dropTime,11)--update speed dial
P.waiting=gameEnv.wait P.waiting=gameEnv.wait
local dospin=bn~=6 and ifoverlap(cb,cx-1,cy)and ifoverlap(cb,cx+1,cy)and ifoverlap(cb,cx,cy+1)
if bn<6 and not dospin and bn<6 and spinLast then local dospin=bn~=6 and ifoverlap(cb,cx-1,cy)and ifoverlap(cb,cx+1,cy)and ifoverlap(cb,cx,cy+1)and 1 or 0
if bn<6 and spinLast then
local x,y=cx+sc[2]-1,cy+sc[1]-1 local x,y=cx+sc[2]-1,cy+sc[1]-1
local c=0 local c=0
if solid(x-1,y+1)then c=c+1 end if solid(x-1,y+1)then c=c+1 end
@@ -1026,13 +1019,14 @@ function drop()
if solid(x-1,y-1)then c=c+1 end if solid(x-1,y-1)then c=c+1 end
if solid(x+1,y-1)then c=c+1 end if solid(x+1,y-1)then c=c+1 end
if c>2 then if c>2 then
dospin=true dospin=dospin+(spinLast==2 and 1 or 2)
end end
end end
end--Triangle spin system end--Three point
if dospin==0 then dospin=false end
lock() lock()
local cc,csend,sendTime=checkrow(cy,r),0,0--Currect clear&send&sendTime local cc,csend,sendTime=checkrow(cy,r),0,0--Currect clear&send&sendTime
local mini=dospin and cc<r local mini=dospin==1 and cc<3 and cc<r
P.combo=P.combo+1--combo=0 is under P.combo=P.combo+1--combo=0 is under
if cc==4 then if cc==4 then
@@ -1047,7 +1041,7 @@ function drop()
csend=4 csend=4
end end
P.b2b=P.b2b+100 P.b2b=P.b2b+100
sendTime=120 sendTime=60
P.cstat.tetris=P.cstat.tetris+1 P.cstat.tetris=P.cstat.tetris+1
elseif cc>0 then elseif cc>0 then
if dospin then if dospin then
@@ -1070,44 +1064,45 @@ function drop()
sendTime=sendTime+60 sendTime=sendTime+60
P.b2b=P.b2b+90+10*cc P.b2b=P.b2b+90+10*cc
else else
P.b2b=P.b2b+80+20*cc P.b2b=P.b2b+70+30*cc
end end
SFX("spin_"..cc) SFX("spin_"..cc)
if id==1 then
stat.spin=stat.spin+1 stat.spin=stat.spin+1
end
elseif #clearing<#field then elseif #clearing<#field then
P.b2b=P.b2b-300 P.b2b=P.b2b-300
showText(clearName[cc],"appear",50) showText(clearName[cc],"appear",50)
csend=cc-1 csend=cc-1
sendTime=20+csend*20 sendTime=20+csend*20
end end
if #clearing==#field then
showText("Perfect Clear","flicker",70,-80)
csend=csend+6
sendTime=sendTime+30
SFX("perfectclear")
P.b2b=b2b+150
end
else else
P.combo=0 P.combo=0
if dospin then if dospin then
showText(blockName[bn].." spin","appear",50) showText(blockName[bn].." spin","appear",50)
SFX("spin_0") SFX("spin_0")
P.b2b=b2b+30 P.b2b=b2b+40
end end
end end
if cc>0 and #clearing==#field then
showText("Perfect Clear","flicker",70)
csend=csend+6
sendTime=sendTime+30
SFX("perfectclear")
P.b2b=b2b+100
end
csend=csend+(renATK[combo]or 4) csend=csend+(renATK[combo]or 4)
if combo>2 then
showText(renName[min(combo,20)],combo<10 and"appear"or"flicker",20+combo*3,60)
end
sendTime=sendTime+20*combo sendTime=sendTime+20*combo
if cc>0 then if cc>0 then
SFX("clear_"..cc) SFX("clear_"..cc)
SFX("ren_"..min(combo,11)) SFX("ren_"..min(combo,11))
end end
P.b2b=max(min(b2b,600),0)
if b2b<0 then
P.b2b=0
elseif b2b>600 then
P.b2b=600
end
if csend>0 then if csend>0 then
if mini then csend=int(csend*.7)end if mini then csend=int(csend*.7)end
@@ -1123,12 +1118,18 @@ function drop()
if P.atkBuffer[1].amount==0 then if P.atkBuffer[1].amount==0 then
rem(P.atkBuffer,1) rem(P.atkBuffer,1)
end end
if P.atkBuffer[1]and csend==0 then
local s=P.atkBuffer[1].amount
P.atkBuffer[1].lv=s<4 and 1 or s<7 and 2 or 3
end
end end
if csend>0 and #players.alive>1 then garbageSend(P.id,csend,sendTime)end if csend>0 and #players.alive>1 then garbageSend(P.id,csend,sendTime)end
elseif cc==0 then elseif cc==0 then
garbageRelease() garbageRelease()
end--Send attack end--Send attack
if id==1 then
stat.piece,stat.row=stat.piece+1,stat.row+cc stat.piece,stat.row=stat.piece+1,stat.row+cc
end
P.cstat.piece,P.cstat.row=P.cstat.piece+1,P.cstat.row+cc P.cstat.piece,P.cstat.row=P.cstat.piece+1,P.cstat.row+cc
if P.cstat.row>=gameEnv.target then if P.cstat.row>=gameEnv.target then
gameEnv.reach() gameEnv.reach()
@@ -1180,7 +1181,7 @@ function garbageRelease()
end end
end end
--------------------------------Warning!_G is __indexed to players[n]! --------------------------------Warning!_G is __indexed to players[n] when changing any player's data!
require("user_actions")--Game control functions require("user_actions")--Game control functions
@@ -1252,188 +1253,21 @@ end
wheelmoved={} wheelmoved={}
--Warning,these are not system callbacks! --Warning,these are not system callbacks!
require("texture")--Texture/Image
require("particle")--Particle
require("BGblock")--BG block module require("BGblock")--BG block module
require("ai")--AI module require("ai")--AI module
require("timer")--Timer require("timer")--Timer
require("paint")--Paint require("paint")--Paint
require("game_scene")--Game scenes swapping require("game_scene")--Game scenes swapping
require("control")--User system control require("control")--User system control
require("system")--Love Engine functions
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.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.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
--System callbacks
do--Texture/Image
titleImage=gc.newImage("/image/title.png")
mouseIcon=gc.newImage("/image/mouseIcon.png")
blockSkin={}
for i=1,13 do
blockSkin[i]=gc.newImage("/image/block/1/"..i..".png")
end
background={}
gc.setColor(1,1,1)
background={}
for i=1,2 do
background[i]=gc.newImage("/image/BG/"..i..".png")
end
virtualkeyIcon={}
for i=1,9 do
virtualkeyIcon[i]=gc.newImage("/image/virtualkey/"..(actName[i])..".png")
end
end
do--Particle
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()
end
c=nil
userdata=fs.newFile("userdata") userdata=fs.newFile("userdata")
if fs.getInfo("userdata")then if fs.getInfo("userdata")then
loaddata() loaddata()
elseif system==2 then
setting.virtualkeySwitch=true
end end
stat.run=stat.run+1 stat.run=stat.run+1

160
paint.lua
View File

@@ -43,14 +43,15 @@ function drawButton()
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,15 +63,9 @@ 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)
@@ -135,7 +130,7 @@ end
function Pnt.main() function Pnt.main()
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(30) setFont(30)
gc.print("Alpha V0.3",370,150) gc.print("Alpha V0.4",370,150)
if system==2 then if system==2 then
gc.print("Android",530,110) gc.print("Android",530,110)
end end
@@ -145,15 +140,15 @@ 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)
if P.small then
gc.push("transform") gc.push("transform")
gc.translate(x,y)gc.scale(size)--Scale gc.translate(x,y)gc.scale(size)--Scale
gc.setColor(0,0,0,.7)gc.rectangle("fill",0,0,600,690)--Black Background gc.setColor(0,0,0,.5)gc.rectangle("fill",0,0,300,600)--Black Background
gc.setLineWidth(3) gc.setLineWidth(3)
gc.setColor(1,1,1)gc.rectangle("line",0,0,600,690)--Big frame gc.translate(10,15)
gc.translate(150,70)
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
@@ -166,7 +161,6 @@ function Pnt.play()
gc.rectangle("fill",0,600-30*j,320,30) gc.rectangle("fill",0,600-30*j,320,30)
end end
end--Field end--Field
if waiting<=0 then
if 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
@@ -174,27 +168,17 @@ 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
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 for i=1,r do for j=1,c do
if cb[i][j]>0 then if cb[i][j]>0 then
drawPixel(i+cy-1,j+cx-1,bn,1) drawPixel(i+cy-1,j+cx-1,bn,1)
end end
end end--Block 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 end
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(PTC.dust[p])--Draw game field gc.draw(PTC.dust[p])--Draw game field
love.graphics.setStencilTest()--In-playField mask gc.setStencilTest()--In-playField mask
gc.translate(0,-fieldBeneath) gc.translate(0,-fieldBeneath)
gc.setColor(1,1,1)gc.rectangle("line",-2,-12,304,614)--Draw boarder gc.setColor(1,1,1)gc.rectangle("line",-2,-12,304,614)--Draw boarder
@@ -228,11 +212,104 @@ function Pnt.play()
if h>600 then break end if h>600 then break end
end--Buffer line end--Buffer line
gc.setColor(1,1,1) gc.setColor(b2b<100 and color.white or b2b<=480 and color.lightRed or color.lightBlue)
gc.rectangle("fill",-15,600,10,-b2b1) gc.rectangle("fill",-15,600,10,-b2b1)
gc.setColor(1,.4,.4) --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()
else
gc.push("transform")
gc.translate(x,y)gc.scale(size)--Scale
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.rectangle("line",-20,600-100,15,2)
gc.setColor(.4,.4,1) gc.setColor(color.blue)
gc.rectangle("line",-20,600-480,15,2) gc.rectangle("line",-20,600-480,15,2)
--B2B bar --B2B bar
@@ -270,10 +347,10 @@ function Pnt.play()
gc.pop() gc.pop()
end--Draw starting counter end--Draw starting counter
for i=1,#bonus do for i=1,#bonus do
bonus[i]:draw() local a=#field>(9-bonus[i].dy*.03333)and .7 or 1
bonus[i]:draw(a)
end--Effects end--Effects
if P.size>.3 then
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(40) setFont(40)
gc.print(format("%0.2f",time),-125,530)--Draw time gc.print(format("%0.2f",time),-125,530)--Draw time
@@ -287,15 +364,15 @@ function Pnt.play()
drawDial(350,520,dropSpeed) drawDial(350,520,dropSpeed)
drawDial(400,570,keySpeed) drawDial(400,570,keySpeed)
--Speed dials --Speed dials
end
gc.pop() gc.pop()
end
end--Draw players end--Draw players
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,3 do for i=1,3 do
gc.draw(PTC.attack[i]) gc.draw(PTC.attack[i])
end end
setmetatable(_G,nil) setmetatable(_G,nil)
if system==2 then if setting.virtualkeySwitch then
drawVirtualkey() drawVirtualkey()
end end
end end
@@ -307,6 +384,7 @@ function Pnt.setting2()
setFont(35) setFont(35)
mStr("DAS:"..setting.das,828,73) mStr("DAS:"..setting.das,828,73)
mStr("ARR:"..setting.arr,1043,73) mStr("ARR:"..setting.arr,1043,73)
gc.print("Keyboard Joystick",223,10)
for i=1,9 do for i=1,9 do
gc.printf(actName_show[i]..":",0,60*i-8,180,"right") gc.printf(actName_show[i]..":",0,60*i-8,180,"right")
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

@@ -44,10 +44,11 @@ function Tmr.play(dt)
for i=#FX.beam,1,-1 do for i=#FX.beam,1,-1 do
local b=FX.beam[i] local b=FX.beam[i]
b.t=b.t+1 b.t=b.t+1
local t=b.t*.025 local t0=b.t*.025--t in [0,1]
PTC.attack[b.lv]:setPosition(b[1]+(b[3]-b[1])*t,b[2]+(b[4]-b[2])*t-100*(4*t*(1-t))) 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) PTC.attack[b.lv]:emit(1)
if t==1 then if t0==1 then
rem(FX.beam,i) rem(FX.beam,i)
end end
end end