Compare commits

...

2 Commits
v0.2 ... v0.4

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
55 changed files with 919 additions and 671 deletions

0
BGM/32000Hz 86kbps Normal file
View File

View File

@@ -2,13 +2,13 @@ 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
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

10
TRS.lua
View File

@@ -48,7 +48,7 @@ do
},
[5]={
[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}},
[21]={{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}},
[30]={{0,0},{1,0},{-2,0},{1,-2},{-2,1}},
[03]={{0,0},{-1,0},{2,0},{-1,2},{2,-1}},
[02]={{0,0},{-1,0},{1,0},{0,1}},
[20]={{0,0},{1,0},{-1,0},{0,-1}},
[13]={{0,0},{1,0}},
[31]={{0,0},{-1,0}},
[02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}},
[20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}},
[13]={{0,0},{0,-1},{-1,0},{1,0},{0,1}},
[31]={{0,0},{0,-1},{1,0},{-1,0},{0,1}},
}
}TRS[3],TRS[4],TRS[6]=TRS[2],TRS[1],TRS[1]
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=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=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=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},
@@ -22,7 +22,7 @@ Buttons={
},
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=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},
@@ -34,10 +34,11 @@ Buttons={
end,
up=4,down=7,left=6
},
{x=435,y=250,w=320,h=60,rgb=color.white,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,up=6},
{x=435,y=220,w=320,h=60,rgb=color.green,t="Advanced settings",code=function()gotoScene("setting2")end,up=1,down=7,right=5},
{x=435,y=300,w=320,h=60,rgb=color.yellow,t="Touch settings",code=function()gotoScene("setting3")end,up=6,down=8,right=5},
{x=640,y=590,w=210,h=60,rgb=color.white,t="Save&Back",code=function()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=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},
@@ -52,7 +53,7 @@ Buttons={
{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=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=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=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=28},
{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},
@@ -69,9 +70,43 @@ Buttons={
{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=9,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
},
setting3={--Touch setting
{x=640,y=210,w=400,h=80,rgb=color.white,t=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,code=function()
setting.virtualkeySwitch=not setting.virtualkeySwitch
end},
{x=500,y=310,w=120,h=80,rgb=color.white,t="Reset",code=function()
for K=1,#virtualkey do
local b,b0=virtualkey[K],gameEnv0.virtualkey[K]
b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4]
end--Reset virtualkey
end},
{x=640,y=310,w=120,h=80,rgb=color.white,t="Snap",code=function()
for K=1,#virtualkey do
local b=virtualkey[K]
b[1],b[2]=int(b[1]*.025+.5)*40,int(b[2]*.025+.5)*40
end--Snap all keys
end},
{x=780,y=310,w=120,h=80,rgb=color.white,t=function()return percent0to5[setting.virtualkeyAlpha]end,code=function()
setting.virtualkeyAlpha=(setting.virtualkeyAlpha+1)%6
--Adjust virtualkey alpha
end},
{x=500,y=410,w=120,h=80,rgb=color.white,t="Icon",code=function()
setting.virtualkeyIcon=not setting.virtualkeyIcon
--Switch virtualkey icon
end},
{x=640,y=410,w=120,h=80,rgb=color.white,t="Back",code=function()back()end},
{x=780,y=410,w=120,h=80,rgb=color.white,t="Size",code=function()
for K=1,#virtualkey do
local b=virtualkey[K]
b[4]=b[4]+10
if b[4]==150 then b[4]=40 end
b[3]=b[4]^2
end
end},
},
help={
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end},
},
@@ -86,26 +121,19 @@ for k,v in pairs(Buttons)do
end
end
gamepad={
{x=80,y=-80,r=80},--moveLeft
{x=240,y=-80,r=80},--moveRight
{x=-240,y=-80,r=80},--rotRight
{x=-400,y=-80,r=80},--rotLeft
{x=-240,y=-240,r=80},--rotFlip
{x=-80,y=-80,r=80},--hardDrop
{x=-80,y=-240,r=80},--softDrop
{x=-80,y=-400,r=80},--hold
{x=80,y=80,r=80},--restart
}
--[[
virtualkey={
{80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight
{1280-240,720-80,6400,80},--rotRight
{1280-400,720-80,6400,80},--rotLeft
{1280-240,720-240,6400,80},--rotFlip
{1280-80,720-80,6400,80},--hardDrop
{1280-80,720-240,6400,80},--softDrop
{1280-80,720-400,6400,80},--hold
{80,80,6400,80},--restart
--[[
{x=0,y=0,r=0},--toLeft
{x=0,y=0,r=0},--toRight
{x=0,y=0,r=0},--toDown
]]
for i=1,#gamepad do
gamepad[i].press=false
if gamepad[i].x<0 then gamepad[i].x=1280+gamepad[i].x end
if gamepad[i].y<0 then gamepad[i].y=720+gamepad[i].y end
gamepad[i].r0=gamepad[i].r
gamepad[i].r=gamepad[i].r0^2
end
]]
}

View File

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

View File

@@ -1,3 +1,18 @@
function onVirtualkey(x,y)
local x,y=convert(x,y)
local d2,nearest,distance
for K=1,#virtualkey do
local b=virtualkey[K]
d2=(x-b[1])^2+(y-b[2])^2
if d2<b[3]then
if not nearest or d2<distance then
nearest,distance=K,d2
end
end
end
return nearest
end
function buttonControl_key(i)
if i=="up"or i=="down"or i=="left"or i=="right"then
if not Buttons.sel then
@@ -71,13 +86,18 @@ function love.mousepressed(x,y,k,t,num)
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
mouseShow=false
end
function love.touchreleased(id,x,y)
if id==touching then
@@ -91,12 +111,10 @@ function love.touchreleased(id,x,y)
Buttons.sel=nil
mouseShow=false
end
if scene=="play"and #tc.getTouches()==0 then
for K=1,#gamepad do
if gamepad[K].press then
releaseKey(K)
break
end
if scene=="play"and setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
releaseKey(t)
end
end
end
@@ -106,6 +124,32 @@ function love.touchmoved(id,x,y,dx,dy)
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
function love.keypressed(i)

View File

@@ -14,8 +14,11 @@ function game.main()
scene="main"
curBG="none"
BGM("blank")
collectgarbage()
end
function game.mode()
savedata()
if players then restockRow()end--recycle row used in-game
scene="mode"
curBG="none"
BGM("blank")
@@ -31,13 +34,19 @@ function game.setting()
scene="setting"
curBG="none"
BGM("blank")
end
end--Normal setting
function game.setting2()
scene="setting2"
curBG="none"
keyssetting=nil
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()
scene="help"
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

Binary file not shown.

Before

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

Before

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

Before

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

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

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

View File

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 219 B

View File

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 219 B

View File

Before

Width:  |  Height:  |  Size: 243 B

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

View File

Before

Width:  |  Height:  |  Size: 220 B

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

View File

@@ -1,13 +0,0 @@
loseReason={"Finished","Block out"}
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,3}--4 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}

587
main.lua
View File

@@ -1,4 +1,4 @@
gc,kb,ms,tc,tm,fs=love.graphics,love.keyboard,love.mouse,love.touch,love.timer,love.filesystem
gc,kb,ms,tc,tm,fs,wd=love.graphics,love.keyboard,love.mouse,love.touch,love.timer,love.filesystem,love.window
toN,toS=tonumber,tostring
int,ceil,abs,rnd,max,min,sin,cos,atan,pi=math.floor,math.ceil,math.abs,math.random,math.max,math.min,math.sin,math.cos,math.atan,math.pi
sub,gsub,find,format,byte,char=string.sub,string.gsub,string.find,string.format,string.byte,string.char
@@ -40,8 +40,9 @@ end
ww,wh=gc.getWidth(),gc.getHeight()
Timer=tm.getTime--Easy get time
Timer=tm.getTime--Easy&Quick to get time!
mx,my,mouseShow=-20,-20,false
ms.setVisible(false)
focus=true
do
@@ -49,10 +50,10 @@ do
Windows=1,
Android=2,
}
system=l[love.system.getOS()]
touching=nil--touching ID
system=l[love.system.getOS()]or 0
l=nil
end
touching=nil--1st touching ID
scene=""
gamemode=""
@@ -60,19 +61,16 @@ bgmPlaying=nil
curBG="none"
BGblock={ct=140}
languages={"eng"}
prevMenu={
load=love.event.quit,
ready="mode",
play=function()
restockRow()
gotoScene("mode")
end,
play="mode",
mode="main",
help="main",
stat="main",
setting="main",
setting2="setting",
setting3="setting",
intro="quit",
main="quit",
}
@@ -81,37 +79,36 @@ kb.setKeyRepeat(false)
kb.setTextInput(false)
--Disable system key repeat
Texts={
eng={
load={"Loading textures","Loading BGM","Loading SFX","Finished",},
stat={
"Games run:",
"Games played:",
"Game time:",
"Total block used:",
"Total rows cleared:",
"Total lines sent:",
"Total key pressed:",
"Total rotate:",
"Total hold:",
"Total spin:",
},
help={
"I think you don't need \"help\".",
"THIS IS NOT TETRIS,and doesn't use SRS.",
"But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,DO NOT DISTIRBUTE",
"",
"Powered by LOVE2D",
"Author:MrZ E-mail:1046101471@qq.com",
"Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ",
"Tool used:VScode,GFIE,Beepbox,Goldwave",
"Special thanks:TOP,C2,KOS,TGM3,GFIE,and YOU!!",
"Any bugs/suggestions to me.",
},
Text={
load={"Loading textures","Loading BGM","Loading SFX","Finished",},
stat={
"Games run:",
"Games played:",
"Game time:",
"Total block used:",
"Total rows cleared:",
"Total lines sent:",
"Total key pressed:",
"Total rotate:",
"Total hold:",
"Total spin:",
},
help={
"I think you don't need \"help\".",
"THIS IS NOT TETRIS,and doesn't use SRS.",
"But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,DO NOT DISTIRBUTE",
"",
"Powered by LOVE2D",
"Author:MrZ E-mail:1046101471@qq.com",
"Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ",
"Tool used:VScode,GFIE,Beepbox,Goldwave",
"Special thanks:TOP,C2,KOS,TGM3,GFIE,and YOU!!",
"Any bugs/suggestions to me.",
},
}
numFonts={}
Fonts={}
function numFont(s)
if numFonts[s]then
gc.setFont(numFonts[s])
@@ -122,9 +119,7 @@ function numFont(s)
end
currentFont=s
end
Fonts={}for i=1,#languages do Fonts[languages[i]]={}end
fontLib={
eng=function(s)
function setFont(s)
if s~=currentFont then
if Fonts[s]then
gc.setFont(Fonts[s])
@@ -135,20 +130,7 @@ eng=function(s)
end
currentFont=s
end
end,
chi=function(s)
if s~=currentFont then
if Fonts[setting.lang][s]then
gc.setFont(Fonts[setting.lang][s])
else
local t=gc.newFont("hei.ttf",s-5,"normal")
Fonts[setting.lang][s]=t
gc.setFont(t)
end
currentFont=s
end
end,
}
end
sfx={
"button",
@@ -173,48 +155,48 @@ FX={
flash=0,--Black screen(frame)
shake=0,--Screen shake(frame)
beam={},--Attack beam
appear=function(t)
appear=function(t,a)
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)
end,
fly=function(t)
fly=function(t,a)
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)
end,
stretch=function(t)
stretch=function(t,a)
gc.push("transform")
setFont(t.font)
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
mStr(t.text,0,-t.font*.5)
gc.pop()
end,
drive=function(t)
drive=function(t,a)
gc.push("transform")
setFont(t.font)
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
mStr(t.text,0,-t.font*.5)
gc.pop()
end,
spin=function(t)
spin=function(t,a)
gc.push("transform")
setFont(t.font)
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.rotate((20-t.t)^2*.0015)
end
mStr(t.text,0,-t.font*.5)
gc.pop()
end,
flicker=function(t)
flicker=function(t,a)
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)
end,
}
@@ -222,38 +204,9 @@ function stencil_field()
gc.rectangle("fill",0,-10,300,610)
end
--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
}
-- for k,v in pairs(color) do
-- v[1],v[2],v[3]=255*v[1],255*v[2],255*v[3]
-- end
require("TRS")--load block&TRS kick
require("lists")
require("list")--load lists
gameEnv0={
das=10,arr=2,
@@ -265,9 +218,22 @@ gameEnv0={
sequence=1,visible=1,
_20G=false,target=9e99,
freshLimit=9e99,
key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT","DOWN"},
gamepad={"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","leftshoulder","LEFT","RIGHT","DOWN"},
reach=function()end,--Called when reach row target
virtualkey={
{80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight
{1280-240,720-80,6400,80},--rotRight
{1280-400,720-80,6400,80},--rotLeft
{1280-240,720-240,6400,80},--rotFlip
{1280-80,720-80,6400,80},--hardDrop
{1280-80,720-240,6400,80},--softDrop
{1280-80,720-400,6400,80},--hold
{80,80,6400,80},--restart
},
reach=function()end,
--these three is actually no use,only provide a key
}
randomMethod={
function()
@@ -322,7 +288,7 @@ loadmode={
reach=Event.gameover.win,
}
createPlayer(1,340,15)
curBG="game1"
curBG="strap"
BGM("reason")
end,
gmroll=function()
@@ -337,7 +303,7 @@ loadmode={
arr=1,
}
createPlayer(1,340,15)
curBG="game3"
curBG="glow"
BGM("push")
end,
marathon=function()
@@ -350,7 +316,7 @@ loadmode={
freshLimit=15,
}
createPlayer(1,340,15)
curBG="game1"
curBG="strap"
BGM("way")
end,
death=function()
@@ -369,7 +335,7 @@ loadmode={
curBG="game2"
BGM("push")
end,
tetris21=function()
tetris41=function()
modeEnv={
wait=1,
fall=1,
@@ -377,26 +343,27 @@ loadmode={
createPlayer(1,340,15)--Player
local n=2
for i=1,2 do
for i=1,4 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
end
end
for i=8,9 do
for i=9,12 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
end
end--AIs
curBG="game2"
curBG="game3"
BGM("race")
end,
solo=function()
modeEnv={
wait=1,
fall=1,
freshLimit=15,
}
createPlayer(1,20,15)--Player
createPlayer(2,660,85,.9,2)--AI
@@ -411,11 +378,11 @@ loadmode={
wait=1,
fall=1,
visible=0,
freshLimit=8,
freshLimit=10,
}
createPlayer(1,340,15)
curBG="game1"
curBG="glow"
BGM("push")
end,
asymsolo=function()
@@ -423,6 +390,7 @@ loadmode={
wait=1,
fall=1,
visible=2,
freshLimit=15,
}
createPlayer(1,20,15)--Player
createPlayer(2,660,85,.9,2)--AI
@@ -537,7 +505,7 @@ mesDisp={
death=function()
mStr(P.cstat.row.."/"..gameEnv.target,-75,250)
end,
tetris21=function()
tetris41=function()
gc.print("Remain",-140,450)
gc.print("Attack",-130,305)
setFont(80)
@@ -574,6 +542,20 @@ setting={
ghost=true,center=true,
key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT","DOWN"},
gamepad={"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","leftshoulder","LEFT","RIGHT","DOWN"},
virtualkey={
{80,720-80,6400,80},--moveLeft
{240,720-80,6400,80},--moveRight
{1280-240,720-80,6400,80},--rotRight
{1280-400,720-80,6400,80},--rotLeft
{1280-240,720-240,6400,80},--rotFlip
{1280-80,720-80,6400,80},--hardDrop
{1280-80,720-240,6400,80},--softDrop
{1280-80,720-400,6400,80},--hold
{80,80,6400,80},--restart
},
virtualkeyAlpha=3,
virtualkeyIcon=true,
virtualkeySwitch=false,
}
stat={
run=0,
@@ -594,33 +576,20 @@ function string.splitS(s,sep)
sep=sep or"/"
local t={}
repeat
local i=find(s,sep)
local i=find(s,sep)or #s+1
ins(t,sub(s,1,i-1))
s=sub(s,i+#sep)
until #s==0
return t
end
function string.concat(t,sep)
sep=sep or"/"
local s=""
for i=1,#t do
s=s..t[i]..sep
end
return s
end
function sgn(i)return i>0 and 1 or i<0 and -1 or 0 end
function stringPack(s,v)return s..toS(v).."\r\n"end
function sgn(i)return i>0 and 1 or i<0 and -1 or 0 end--Row numbe is A-uth-or's id!
function stringPack(s,v)return s..toS(v)end
function without(t,v)
for i=1,#t do
if t[i]==v then return nil end
end
return true
end
function nextLanguage()
for i=1,#languages do
if setting.lang==languages[i]then return languages[i+1]or"eng"end
end
end
function mStr(s,x,y)gc.printf(s,x-500,y,1000,"center")end
function convert(x,y)
return x*screenK,(y-screenM)*screenK
@@ -689,13 +658,16 @@ function resetGameData()
PTC.dust[i]=PTC.dust[0]:clone()
PTC.dust[i]:start()
end
for i=1,#virtualkey do
virtualkey[i].press=false
end
stat.game=stat.game+1
freeRow={}
collectgarbage()
for i=1,50*#players do
freeRow[i]={0,0,0,0,0,0,0,0,0,0}
end
collectgarbage()
end
function startGame(mode)
--rec=""
@@ -725,14 +697,28 @@ function loaddata()
elseif t=="fullscreen"then
setting.fullscreen=v=="true"
love.window.setFullscreen(setting.fullscreen)
elseif t=="lang"then
if not Fonts[v]then v="eng"end
setting.lang=v
setFont=fontLib[v]
elseif t=="keyset"then
v=string.splitS(v)
for i=#v+1,8 do v[i]="N/A"end
setting.key=v
elseif t=="gamepadset"then
v=string.splitS(v)
for i=#v+1,8 do v[i]="N/A"end
setting.gamepad=v
elseif t=="virtualkey"then
v=string.splitS(v,"/")
for i=1,9 do
virtualkey[i]=string.splitS(v[i],",")
for j=1,4 do
virtualkey[i][j]=toN(virtualkey[i][j])
end
end
elseif t=="virtualkeyAlpha"then
setting.virtualkeyAlpha=int(abs(toN(v)))
elseif t=="virtualkeyIcon"then
setting.virtualkeyIcon=v=="true"
elseif t=="virtualkeySwitch"then
setting.virtualkeySwitch=v=="true"
--Settings
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
@@ -748,27 +734,40 @@ function loaddata()
end
end
function savedata()
local t=""
t=t..stringPack("sfx=",setting.sfx)
t=t..stringPack("bgm=",setting.bgm)
t=t..stringPack("fullscreen=",setting.fullscreen)
t=t..stringPack("lang=",setting.lang)
local vk={}
for i=1,9 do
for j=1,4 do
virtualkey[i][j]=int(virtualkey[i][j]+.5)
end--Saving a integer is better?
vk[i]=table.concat(virtualkey[i],",")
end--pre-pack virtualkey setting
t=t..stringPack("run=",stat.run)
t=t..stringPack("game=",stat.game)
t=t..stringPack("gametime=",stat.gametime)
t=t..stringPack("piece=",stat.piece)
t=t..stringPack("row=",stat.row)
t=t..stringPack("atk=",stat.atk)
t=t..stringPack("key=",stat.key)
t=t..stringPack("rotate=",stat.rotate)
t=t..stringPack("hold=",stat.hold)
t=t..stringPack("spin=",stat.spin)
t=t..stringPack("das=",setting.das)
t=t..stringPack("arr=",setting.arr)
t=t..stringPack("sddas=",setting.sddas)
t=t..stringPack("sdarr=",setting.sdarr)
t=t..stringPack("keyset=",string.concat(setting.key))
local t=table.concat({
stringPack("sfx=",setting.sfx),
stringPack("bgm=",setting.bgm),
stringPack("fullscreen=",setting.fullscreen),
stringPack("run=",stat.run),
stringPack("game=",stat.game),
stringPack("gametime=",stat.gametime),
stringPack("piece=",stat.piece),
stringPack("row=",stat.row),
stringPack("atk=",stat.atk),
stringPack("key=",stat.key),
stringPack("rotate=",stat.rotate),
stringPack("hold=",stat.hold),
stringPack("spin=",stat.spin),
stringPack("das=",setting.das),
stringPack("arr=",setting.arr),
stringPack("sddas=",setting.sddas),
stringPack("sdarr=",setting.sdarr),
stringPack("keyset=",table.concat(setting.key,"/")),
stringPack("gamepadset=",table.concat(setting.gamepad,"/")),
stringPack("virtualkey=",table.concat(vk,"/")),
stringPack("virtualkeyAlpha=",setting.virtualkeyAlpha),
stringPack("virtualkeyIcon=",setting.virtualkeyIcon),
stringPack("virtualkeySwitch=",setting.virtualkeySwitch),
},"\r\n")
--t=love.math.compress(t,"zlib"):getString()
userdata:open("w")
userdata:write(t)
@@ -781,6 +780,7 @@ function createPlayer(id,x,y,size,AIspeed,data)
local P=players[id]
P.index={__index=P}
P.x,P.y,P.size=x,y,size or 1
P.small=P.size<.3
if AIspeed then
P.ai={
@@ -847,16 +847,20 @@ end
function showText(text,type,font,dy)
ins(P.bonus,{t=0,text=text,draw=FX[type],font=font,dy=dy or 0})
end
function createBeam(s,r,level)--Player id
s,r=players[s],players[r]
ins(FX.beam,{
s.x+(30*(cx+sc[2]-1)-30+15+150)*s.size,
s.y+(600-30*(cy+sc[1]-1)+15+70)*s.size,
r.x+308*r.size,
r.y+450*r.size,
t=0,
lv=level,
})
function createBeam(s,r,lv)--Player id
S,R=players[s],players[r]
local x1,y1,x2,y2
if S.small then
x1,y1=S.x+(30*(cx+sc[2]-1)+15)*S.size,S.y+(600-30*(cy+sc[1]-1)+15)*S.size
else
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
end
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
function freshgho()
if not P.gameEnv._20G then
@@ -958,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 ir,ic=#icb,#icb[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]
for i=1,#iki do
if not ifoverlap(icb,ix+iki[i][1],iy+iki[i][2])then
ix,iy=ix+iki[i][1],iy+iki[i][2]
t=true
t=i
break
end
end
@@ -972,11 +976,13 @@ function spin(d,ifpre)
P.sc,P.cb=isc,icb
P.r,P.c=ir,ic
P.dir=(dir+d)%4
P.spinLast=true
P.spinLast=t
freshgho()--May cancel spinLast
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")
stat.rotate=stat.rotate+1
if id==1 then
stat.rotate=stat.rotate+1
end
end
end
function hold(ifpre)
@@ -993,15 +999,18 @@ function hold(ifpre)
if ifoverlap(cb,cx,cy) then lock()Event.gameover.lose()end
P.holded=true
SFX(ifpre and"prehold"or"hold")
stat.hold=stat.hold+1
if id==1 then
stat.hold=stat.hold+1
end
end
end
function drop()
if cy==y_img then
ins(dropTime,1,frame)rem(dropTime,11)--update speed dial
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 c=0
if solid(x-1,y+1)then c=c+1 end
@@ -1010,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 c>2 then
dospin=true
dospin=dospin+(spinLast==2 and 1 or 2)
end
end
end--Triangle spin system
end--Three point
if dospin==0 then dospin=false end
lock()
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
if cc==4 then
@@ -1031,7 +1041,7 @@ function drop()
csend=4
end
P.b2b=P.b2b+100
sendTime=120
sendTime=60
P.cstat.tetris=P.cstat.tetris+1
elseif cc>0 then
if dospin then
@@ -1054,44 +1064,45 @@ function drop()
sendTime=sendTime+60
P.b2b=P.b2b+90+10*cc
else
P.b2b=P.b2b+80+20*cc
P.b2b=P.b2b+70+30*cc
end
SFX("spin_"..cc)
stat.spin=stat.spin+1
if id==1 then
stat.spin=stat.spin+1
end
elseif #clearing<#field then
P.b2b=P.b2b-400
P.b2b=P.b2b-300
showText(clearName[cc],"appear",50)
csend=cc-1
sendTime=20+csend*20
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
P.combo=0
if dospin then
showText(blockName[bn].." spin","appear",50)
SFX("spin_0")
P.b2b=b2b+30
P.b2b=b2b+40
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)
if combo>2 then
showText(renName[min(combo,20)],combo<10 and"appear"or"flicker",20+combo*3,60)
end
sendTime=sendTime+20*combo
if cc>0 then
SFX("clear_"..cc)
SFX("ren_"..min(combo,11))
end
if b2b<0 then
P.b2b=0
elseif b2b>600 then
P.b2b=600
end
P.b2b=max(min(b2b,600),0)
if csend>0 then
if mini then csend=int(csend*.7)end
@@ -1107,12 +1118,18 @@ function drop()
if P.atkBuffer[1].amount==0 then
rem(P.atkBuffer,1)
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
if csend>0 and #players.alive>1 then garbageSend(P.id,csend,sendTime)end
elseif cc==0 then
garbageRelease()
end--Send attack
stat.piece,stat.row=stat.piece+1,stat.row+cc
if id==1 then
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
if P.cstat.row>=gameEnv.target then
gameEnv.reach()
@@ -1164,7 +1181,7 @@ function garbageRelease()
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
@@ -1174,7 +1191,7 @@ function keyDown.play(key)
local k=players[1].gameEnv.key
for i=1,11 do
if key==k[i]then
pressKey(i,players[1])
pressKey(i)
break
end
end
@@ -1206,7 +1223,7 @@ function gamepadDown.play(key)
local k=players[1].gameEnv.gamepad
for i=1,11 do
if key==k[i]then
pressKey(i,players[1])
pressKey(i)
break
end
end
@@ -1236,195 +1253,21 @@ end
wheelmoved={}
--Warning,these are not system callbacks!
require("texture")--Texture/Image
require("particle")--Particle
require("BGblock")--BG block module
require("ai")--AI module
require("timer")--Timer
require("paint")--Paint
require("game_scene")--Game scenes swapping
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()print(mouseShow)
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)
-- numFont(80)
-- gc.print(gcinfo(),400,370)
--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.focus(f)
focus=f
if f then
ms.setVisible(false)
if bgmPlaying then bgm[bgmPlaying]:play()end
else
ms.setVisible(true)
if bgmPlaying then bgm[bgmPlaying]:pause()end
end
end
function love.run()
love.focus(true)
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
savedata()
return 0
end
love.handlers[name](a,b,c,d,e,f)
end
-- if focus then
tm.step()
love.update(tm.getDelta())
gc.clear(1,1,1)
love.draw()
gc.present()
-- end
while Timer()-frameT<1/60 do end
frameT=Timer()
end
end
--System callbacks
do--Texture/Image
mouseIcon=gc.newImage("/image/mouseIcon.png")
local p=gc.newImage("/image/block.png")
local l={}
gc.setColor(1,1,1)
for i=1,13 do
l[i]=gc.newCanvas(30,30)
gc.setCanvas(l[i])
gc.draw(p,30-30*i)
end
blockSkin=l
l={}
for i=1,1 do
local p=gc.newImage("/image/BG/"..i..".png")
l[i]=gc.newCanvas(1536,1536)
gc.setCanvas(l[i])
gc.draw(p,nil,nil,nil,12,12)
end
background=l
gamepadIcon={}
for i=1,9 do
gamepadIcon[i]=gc.newImage("/image/gamepadIcon/"..(actName[i])..".png")
end
titleImage=gc.newImage("/image/title.png")
gc.setCanvas()
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")
if fs.getInfo("userdata")then
loaddata()
elseif system==2 then
setting.virtualkeySwitch=true
end
stat.run=stat.run+1
setFont=fontLib[setting.lang]
Text=Texts[setting.lang]
stat.run=stat.run+1

449
paint.lua
View File

@@ -43,14 +43,15 @@ function drawButton()
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)
local t=B.t
if type(t)=="function"then t=t()
end
if type(t)=="function"then t=t()end
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)
mStr(t,B.x-1,B.y-1-currentFont*.5)
mStr(t,B.x-1,B.y+1-currentFont*.5)
mStr(t,B.x+1,B.y-1-currentFont*.5)
mStr(t,B.x+1,B.y+1-currentFont*.5)
local y0=B.y-1-currentFont*.5
mStr(t,B.x-1,y0)
mStr(t,B.x+1,y0)
mStr(t,B.x-1,y0+2)
mStr(t,B.x+1,y0+2)
gc.setColor(B.rgb)
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)
@@ -62,37 +63,57 @@ function drawDial(x,y,speed)
gc.translate(x,y)
gc.setColor(1,1,1)
mStr(int(speed),0,-14)
gc.setColor(.6,.6,.6)gc.setLineWidth(5)
gc.circle("line",0,0,30)
gc.setColor(1,1,1)gc.setLineWidth(2)
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.draw(dialCircle,0,0,nil,nil,nil,32,32)
gc.setColor(1,1,1,.6)
gc.draw(dialNeedle,0,0,2.0944+(speed<=175 and .020944*speed or 4.712389-52.35988/(speed-125)),nil,nil,5,4)
gc.pop()
end
function drawPixel(y,x,id,alpha)
gc.setColor(1,1,1,alpha)
gc.draw(blockSkin[id],30*x-30,600-30*y)
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={}}
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
function Pnt.BG.game1()
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
function Pnt.BG.game2()
gc.setColor(1,.5,.5)
gc.draw(background[1],640,360,Timer()*.2,nil,nil,768,768)
gc.draw(background[1],640,360,Timer()*.2,12,nil,64,64)
end
function Pnt.BG.game3()
gc.setColor(.6,.6,1)
gc.draw(background[1],640,360,Timer()*.25,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
function Pnt.load()
@@ -109,7 +130,7 @@ end
function Pnt.main()
gc.setColor(1,1,1)
setFont(30)
gc.print("Alpha V0.2",370,150)
gc.print("Alpha V0.4",370,150)
if system==2 then
gc.print("Android",530,110)
end
@@ -119,28 +140,27 @@ function Pnt.play()
for p=1,#players do
P=players[p]
setmetatable(_G,P.index)
gc.push("transform")
gc.translate(x,y)gc.scale(size)--Scale
gc.setColor(0,0,0,.8)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)
love.graphics.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)
if P.small then
gc.push("transform")
gc.translate(x,y)gc.scale(size)--Scale
gc.setColor(0,0,0,.5)gc.rectangle("fill",0,0,300,600)--Black Background
gc.setLineWidth(3)
gc.translate(10,15)
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
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
end--Field
if gameEnv.ghost then
for i=1,r do for j=1,c do
if cb[i][j]>0 then
@@ -148,133 +168,212 @@ function Pnt.play()
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.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",-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
if waiting<=0 then
gc.setColor(2,2,2)
for i=1,r do for j=1,c do
if cb[i][j]>0 then
drawPixel(i+cy-1,j+cx-1,bn,1)
end
end end--Block
end
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(1,1,1)
gc.rectangle("fill",-15,600,10,-b2b1)
gc.setColor(1,.4,.4)
gc.rectangle("line",-20,600-100,15,2)
gc.setColor(.4,.4,1)
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.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)
--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()
end--Draw starting counter
for i=1,#bonus do
bonus[i]:draw()
end--Effects
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
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
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
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()
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--Draw players
gc.setColor(1,1,1)
for i=1,3 do
gc.draw(PTC.attack[i])
end
setmetatable(_G,nil)
if system==2 then
gc.setColor(1,1,1,.8)
gc.setLineWidth(5)
for i=1,#gamepad do
local k=gamepad[i]
gc.circle("line",k.x,k.y,k.r0)
gc.draw(gamepadIcon[i],k.x,k.y,nil,3,nil,18,18)
end
if setting.virtualkeySwitch then
drawVirtualkey()
end
end
function Pnt.setting2()
@@ -285,6 +384,7 @@ function Pnt.setting2()
setFont(35)
mStr("DAS:"..setting.das,828,73)
mStr("ARR:"..setting.arr,1043,73)
gc.print("Keyboard Joystick",223,10)
for i=1,9 do
gc.printf(actName_show[i]..":",0,60*i-8,180,"right")
end
@@ -292,31 +392,42 @@ function Pnt.setting2()
gc.print("<<",keysetting and 380 or 670,60*(keysetting or gamepadsetting)-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
function Pnt.help()
setFont(32)
gc.setColor(1,1,1)
for i=1,11 do
mStr(Text.help[i],640,15+43*i)
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
function Pnt.stat()
setFont(30)
gc.setColor(1,1,1)
for i=1,10 do
gc.print(Text.stat[i],250,20+40*i)
gc.print(Text.stat[i],350,20+40*i)
end
gc.print(stat.run,600,60)
gc.print(stat.game,600,100)
gc.print(format("%0.2f",stat.gametime).."s",600,140)
gc.print(stat.piece,600,180)
gc.print(stat.row,600,220)
gc.print(stat.atk,600,260)
gc.print(stat.key,600,300)
gc.print(stat.rotate,600,340)
gc.print(stat.hold,600,380)
gc.print(stat.spin,600,420)
gc.print(stat.run,650,60)
gc.print(stat.game,650,100)
gc.print(format("%0.2f",stat.gametime).."s",650,140)
gc.print(stat.piece,650,180)
gc.print(stat.row,650,220)
gc.print(stat.atk,650,260)
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(img.title[setting.lang],260,570,.2+.07*sin(Timer()*3),.8,nil,250,60)
gc.draw(titleImage,260,570,.2+.07*sin(Timer()*3),.8,nil,250,60)
end

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
local b=FX.beam[i]
b.t=b.t+1
local t=b.t*.025
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 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 t==1 then
if t0==1 then
rem(FX.beam,i)
end
end
@@ -56,23 +57,6 @@ function Tmr.play(dt)
end
-- Update attack beam
local list=tc.getTouches()
for K=1,#gamepad do
local b=gamepad[K]
local press=false
for k,v in ipairs(list)do
local x,y=convert(tc.getPosition(v))
if (x-b.x)^2+(y-b.y)^2<b.r then
press=true
end
end
if b.press~=press then
(press and pressKey or releaseKey)(K)
b.press=press
end
end
--Touch system
if count then
count=count-1
if count==0 then