Alpha V0.3+

This commit is contained in:
MrZ_26
2020-02-04 19:26:49 +08:00
parent 30bbf1b1db
commit dd7beca9ce
39 changed files with 357 additions and 253 deletions

0
BGM/32000Hz 86kbps Normal file
View File

View File

@@ -34,8 +34,9 @@ Buttons={
end, end,
up=4,down=7,left=6 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=435,y=220,w=320,h=60,rgb=color.green,t="Advanced settings",code=function()gotoScene("setting2")end,up=1,down=7,right=5},
{x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end,up=6}, {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={
{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},
@@ -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=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=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=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=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=430,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[7]end,code=function()gamepadsetting,keysetting=7 end,up=15,down=17,left=7,right=28},
{x=540,y=490,w=230,h=45,rgb=color.white,t=function()return setting.gamepad[8]end,code=function()gamepadsetting,keysetting=8 end,up=16,down=18,left=8,right=28}, {x=540,y=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,40 @@ 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}, {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 --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=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 --27~28
}, },
setting3={
{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,down=4,right=2},
{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--Make virtualkey neat
end,down=5,left=1,right=3},
{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,down=6,left=2},
{x=500,y=410,w=120,h=80,rgb=color.white,t="Icon",code=function()
setting.virtualkeyIcon=not setting.virtualkeyIcon
--Switch virtualkey icon
end,up=1,right=6},
{x=640,y=410,w=120,h=80,rgb=color.white,t="Back",code=function()back()end,up=2,left=4,right=3},
{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,up=3,left=5},
},
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},
}, },
@@ -86,26 +118,19 @@ for k,v in pairs(Buttons)do
end end
end end
gamepad={ virtualkey={
{x=80,y=-80,r=80},--moveLeft {80,720-80,6400,80},--moveLeft
{x=240,y=-80,r=80},--moveRight {240,720-80,6400,80},--moveRight
{x=-240,y=-80,r=80},--rotRight {1280-240,720-80,6400,80},--rotRight
{x=-400,y=-80,r=80},--rotLeft {1280-400,720-80,6400,80},--rotLeft
{x=-240,y=-240,r=80},--rotFlip {1280-240,720-240,6400,80},--rotFlip
{x=-80,y=-80,r=80},--hardDrop {1280-80,720-80,6400,80},--hardDrop
{x=-80,y=-240,r=80},--softDrop {1280-80,720-240,6400,80},--softDrop
{x=-80,y=-400,r=80},--hold {1280-80,720-400,6400,80},--hold
{x=80,y=80,r=80},--restart {80,80,6400,80},--restart
} --[[
--[[
{x=0,y=0,r=0},--toLeft {x=0,y=0,r=0},--toLeft
{x=0,y=0,r=0},--toRight {x=0,y=0,r=0},--toRight
{x=0,y=0,r=0},--toDown {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

@@ -5,11 +5,10 @@ function love.conf(t)
t.version="11.1" t.version="11.1"
t.console=X t.console=X
t.accelerometerjoystick=X--Enable the accelerometer on iOS and Android by exposing it as a Joystick (boolean) t.accelerometerjoystick=X--Enable the accelerometer on iOS and Android by exposing it as a Joystick (boolean)
t.externalstorage=X
t.gammacorrect=true t.gammacorrect=true
-- t.audio.mixwithsystem=true--Keep background music playing when opening LOVE (boolean, iOS and Android only) t.audio.mixwithsystem=true--Switch on to keep background music playing
t.window.title="Techmino V0.2" t.window.title="Techmino V0.3"
t.window.icon="/image/icon.png" t.window.icon="/image/icon.png"
t.window.width=1280 t.window.width=1280
t.window.height=720 t.window.height=720
@@ -43,6 +42,7 @@ function love.conf(t)
t.modules.sound=true t.modules.sound=true
t.modules.timer=true t.modules.timer=true
t.modules.touch=true t.modules.touch=true
t.modules.physics=X t.modules.physics=X
t.modules.thread=X t.modules.thread=X
t.modules.video=X t.modules.video=X

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) function buttonControl_key(i)
if i=="up"or i=="down"or i=="left"or i=="right"then if i=="up"or i=="down"or i=="left"or i=="right"then
if not Buttons.sel then if not Buttons.sel then
@@ -71,13 +86,18 @@ function love.mousepressed(x,y,k,t,num)
end end
function love.mousereleased(x,y,k,t,num) function love.mousereleased(x,y,k,t,num)
end end
function love.touchpressed(id,x,y) function love.touchpressed(id,x,y)
if not touching then if not touching then
touching=id touching=id
love.mousemoved(x,y) love.mousemoved(x,y)
mouseShow=false
end
if scene=="play"then
local t=onVirtualkey(x,y)
if t then
pressKey(t)
end
end end
mouseShow=false
end end
function love.touchreleased(id,x,y) function love.touchreleased(id,x,y)
if id==touching then if id==touching then
@@ -91,12 +111,10 @@ function love.touchreleased(id,x,y)
Buttons.sel=nil Buttons.sel=nil
mouseShow=false mouseShow=false
end end
if scene=="play"and #tc.getTouches()==0 then if scene=="play"then
for K=1,#gamepad do local t=onVirtualkey(x,y)
if gamepad[K].press then if t then
releaseKey(K) releaseKey(t)
break
end
end end
end end
end end
@@ -106,6 +124,32 @@ 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
local l=tc.getTouches()
for n=1,#virtualkey do
local b=virtualkey[n]
local p=false
for i=1,#l do
local x,y=convert(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then
p=true
break
end
end
if not p and players[1].keyPressing then
releaseKey(n)
end
end
elseif scene=="setting3"then
x,y=convert(x,y)
dx,dy=dx*screenK,dy*screenK
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
end
end end
function love.keypressed(i) function love.keypressed(i)

View File

@@ -14,8 +14,11 @@ function game.main()
scene="main" scene="main"
curBG="none" curBG="none"
BGM("blank") BGM("blank")
collectgarbage()
end end
function game.mode() function game.mode()
savedata()
if players then restockRow()end--recycle row used in-game
scene="mode" scene="mode"
curBG="none" curBG="none"
BGM("blank") BGM("blank")
@@ -31,13 +34,19 @@ function game.setting()
scene="setting" scene="setting"
curBG="none" curBG="none"
BGM("blank") BGM("blank")
end end--Normal setting
function game.setting2() function game.setting2()
scene="setting2" scene="setting2"
curBG="none" curBG="none"
keyssetting=nil keyssetting=nil
BGM("blank") BGM("blank")
end end--Advanced setting and keyboard&joystick setting
function game.setting3()
scene="setting3"
curBG="game1"
keyssetting=nil
BGM("blank")
end--Touch setting
function game.help() function game.help()
scene="help" scene="help"
curBG="none" curBG="none"

BIN
image/BG/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

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.

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

View File

@@ -1,13 +1,14 @@
loseReason={"Finished","Block out"}
blockName={"Z","S","L","J","T","O","I"} blockName={"Z","S","L","J","T","O","I"}
clearName={"Single","Double","Triple"} clearName={"Single","Double","Triple"}
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","restart","toLeft","toRight","toDown"} 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"} 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} blockPos={4,4,4,4,4,5,4}
renATK={[0]=0,0,0,1,1,2,2,3,3,3}--4 else renATK={[0]=0,0,0,1,1,2,2,3,3,4,4,4}--3 else
b2bATK={3,5,8} 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} 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_lock={10,9,8,7,6}
death_wait={6,5,4,3,2} death_wait={6,5,4,3,2}
death_fall={10,8,7,6,5} death_fall={10,8,7,6,5}
percent0to5={[0]="0%","20%","40%","60%","80%","100%",}

319
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 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 int,ceil,abs,rnd,max,min,sin,cos,atan,pi=math.floor,math.ceil,math.abs,math.random,math.max,math.min,math.sin,math.cos,math.atan,math.pi
sub,gsub,find,format,byte,char=string.sub,string.gsub,string.find,string.format,string.byte,string.char sub,gsub,find,format,byte,char=string.sub,string.gsub,string.find,string.format,string.byte,string.char
@@ -40,8 +40,9 @@ end
ww,wh=gc.getWidth(),gc.getHeight() 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 mx,my,mouseShow=-20,-20,false
ms.setVisible(false)
focus=true focus=true
do do
@@ -50,9 +51,9 @@ do
Android=2, Android=2,
} }
system=l[love.system.getOS()] system=l[love.system.getOS()]
touching=nil--touching ID
l=nil l=nil
end end
touching=nil--1st touching ID
scene="" scene=""
gamemode="" gamemode=""
@@ -60,19 +61,16 @@ bgmPlaying=nil
curBG="none" curBG="none"
BGblock={ct=140} BGblock={ct=140}
languages={"eng"}
prevMenu={ prevMenu={
load=love.event.quit, load=love.event.quit,
ready="mode", ready="mode",
play=function() play="mode",
restockRow()
gotoScene("mode")
end,
mode="main", mode="main",
help="main", help="main",
stat="main", stat="main",
setting="main", setting="main",
setting2="setting", setting2="setting",
setting3="setting",
intro="quit", intro="quit",
main="quit", main="quit",
} }
@@ -81,37 +79,36 @@ kb.setKeyRepeat(false)
kb.setTextInput(false) kb.setTextInput(false)
--Disable system key repeat --Disable system key repeat
Texts={ Text={
eng={ load={"Loading textures","Loading BGM","Loading SFX","Finished",},
load={"Loading textures","Loading BGM","Loading SFX","Finished",}, stat={
stat={ "Games run:",
"Games run:", "Games played:",
"Games played:", "Game time:",
"Game time:", "Total block used:",
"Total block used:", "Total rows cleared:",
"Total rows cleared:", "Total lines sent:",
"Total lines sent:", "Total key pressed:",
"Total key pressed:", "Total rotate:",
"Total rotate:", "Total hold:",
"Total hold:", "Total spin:",
"Total spin:", },
}, help={
help={ "I think you don't need \"help\".",
"I think you don't need \"help\".", "THIS IS NOT TETRIS,and doesn't use SRS.",
"THIS IS NOT TETRIS,and doesn't use SRS.", "But just play like playing TOP/C2/KOS/TGM3",
"But just play like playing TOP/C2/KOS/TGM3", "Game is not public now,DO NOT DISTIRBUTE",
"Game is not public now,DO NOT DISTIRBUTE", "",
"", "Powered by LOVE2D",
"Powered by LOVE2D", "Author:MrZ E-mail:1046101471@qq.com",
"Author:MrZ E-mail:1046101471@qq.com", "Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ",
"Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ", "Tool used:VScode,GFIE,Beepbox,Goldwave",
"Tool used:VScode,GFIE,Beepbox,Goldwave", "Special thanks:TOP,C2,KOS,TGM3,GFIE,and YOU!!",
"Special thanks:TOP,C2,KOS,TGM3,GFIE,and YOU!!", "Any bugs/suggestions to me.",
"Any bugs/suggestions to me.",
},
}, },
} }
numFonts={} numFonts={}
Fonts={}
function numFont(s) function numFont(s)
if numFonts[s]then if numFonts[s]then
gc.setFont(numFonts[s]) gc.setFont(numFonts[s])
@@ -122,9 +119,7 @@ function numFont(s)
end end
currentFont=s currentFont=s
end end
Fonts={}for i=1,#languages do Fonts[languages[i]]={}end function setFont(s)
fontLib={
eng=function(s)
if s~=currentFont then if s~=currentFont then
if Fonts[s]then if Fonts[s]then
gc.setFont(Fonts[s]) gc.setFont(Fonts[s])
@@ -135,20 +130,7 @@ eng=function(s)
end end
currentFont=s currentFont=s
end end
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,
}
sfx={ sfx={
"button", "button",
@@ -248,12 +230,9 @@ attackColor={
end, end,
}--3 animation-colorsets of attack buffer bar }--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("TRS")--load block&TRS kick
require("lists") require("lists")--load lists
gameEnv0={ gameEnv0={
das=10,arr=2, das=10,arr=2,
@@ -265,9 +244,22 @@ gameEnv0={
sequence=1,visible=1, sequence=1,visible=1,
_20G=false,target=9e99, _20G=false,target=9e99,
freshLimit=9e99, freshLimit=9e99,
key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT","DOWN"}, 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"}, 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={ randomMethod={
function() function()
@@ -322,7 +314,7 @@ loadmode={
reach=Event.gameover.win, reach=Event.gameover.win,
} }
createPlayer(1,340,15) createPlayer(1,340,15)
curBG="game1" curBG="strap"
BGM("reason") BGM("reason")
end, end,
gmroll=function() gmroll=function()
@@ -337,7 +329,7 @@ loadmode={
arr=1, arr=1,
} }
createPlayer(1,340,15) createPlayer(1,340,15)
curBG="game3" curBG="glow"
BGM("push") BGM("push")
end, end,
marathon=function() marathon=function()
@@ -350,7 +342,7 @@ loadmode={
freshLimit=15, freshLimit=15,
} }
createPlayer(1,340,15) createPlayer(1,340,15)
curBG="game1" curBG="strap"
BGM("way") BGM("way")
end, end,
death=function() death=function()
@@ -390,13 +382,14 @@ loadmode={
end end
end--AIs end--AIs
curBG="game2" curBG="game3"
BGM("race") BGM("race")
end, end,
solo=function() solo=function()
modeEnv={ modeEnv={
wait=1, wait=1,
fall=1, fall=1,
freshLimit=15,
} }
createPlayer(1,20,15)--Player createPlayer(1,20,15)--Player
createPlayer(2,660,85,.9,2)--AI createPlayer(2,660,85,.9,2)--AI
@@ -411,11 +404,11 @@ loadmode={
wait=1, wait=1,
fall=1, fall=1,
visible=0, visible=0,
freshLimit=8, freshLimit=10,
} }
createPlayer(1,340,15) createPlayer(1,340,15)
curBG="game1" curBG="glow"
BGM("push") BGM("push")
end, end,
asymsolo=function() asymsolo=function()
@@ -423,6 +416,7 @@ loadmode={
wait=1, wait=1,
fall=1, fall=1,
visible=2, visible=2,
freshLimit=15,
} }
createPlayer(1,20,15)--Player createPlayer(1,20,15)--Player
createPlayer(2,660,85,.9,2)--AI createPlayer(2,660,85,.9,2)--AI
@@ -574,6 +568,19 @@ setting={
ghost=true,center=true, ghost=true,center=true,
key={"left","right","x","z","c","up","down","space","r","LEFT","RIGHT","DOWN"}, 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"}, 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,
} }
stat={ stat={
run=0, run=0,
@@ -594,33 +601,20 @@ function string.splitS(s,sep)
sep=sep or"/" sep=sep or"/"
local t={} local t={}
repeat repeat
local i=find(s,sep) local i=find(s,sep)or #s+1
ins(t,sub(s,1,i-1)) ins(t,sub(s,1,i-1))
s=sub(s,i+#sep) s=sub(s,i+#sep)
until #s==0 until #s==0
return t return t
end end
function string.concat(t,sep) function sgn(i)return i>0 and 1 or i<0 and -1 or 0 end--Row numbe is A-uth-or's id!
sep=sep or"/" function stringPack(s,v)return s..toS(v)end
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 without(t,v) function without(t,v)
for i=1,#t do for i=1,#t do
if t[i]==v then return nil end if t[i]==v then return nil end
end end
return true return true
end 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 mStr(s,x,y)gc.printf(s,x-500,y,1000,"center")end
function convert(x,y) function convert(x,y)
return x*screenK,(y-screenM)*screenK return x*screenK,(y-screenM)*screenK
@@ -689,13 +683,16 @@ function resetGameData()
PTC.dust[i]=PTC.dust[0]:clone() PTC.dust[i]=PTC.dust[0]:clone()
PTC.dust[i]:start() PTC.dust[i]:start()
end end
for i=1,#virtualkey do
virtualkey[i].press=false
end
stat.game=stat.game+1 stat.game=stat.game+1
freeRow={} freeRow={}
collectgarbage()
for i=1,50*#players do for i=1,50*#players do
freeRow[i]={0,0,0,0,0,0,0,0,0,0} freeRow[i]={0,0,0,0,0,0,0,0,0,0}
end end
collectgarbage()
end end
function startGame(mode) function startGame(mode)
--rec="" --rec=""
@@ -725,14 +722,22 @@ function loaddata()
elseif t=="fullscreen"then elseif t=="fullscreen"then
setting.fullscreen=v=="true" setting.fullscreen=v=="true"
love.window.setFullscreen(setting.fullscreen) 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 elseif t=="keyset"then
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=="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"
--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
@@ -748,27 +753,38 @@ function loaddata()
end end
end end
function savedata() function savedata()
local t="" local vk={}
t=t..stringPack("sfx=",setting.sfx) for i=1,9 do
t=t..stringPack("bgm=",setting.bgm) for j=1,4 do
t=t..stringPack("fullscreen=",setting.fullscreen) virtualkey[i][j]=int(virtualkey[i][j]+.5)
t=t..stringPack("lang=",setting.lang) end--Saving a integer is better?
vk[i]=table.concat(virtualkey[i],",")
end--pre-pack virtualkey setting
t=t..stringPack("run=",stat.run) local t=table.concat({
t=t..stringPack("game=",stat.game) stringPack("sfx=",setting.sfx),
t=t..stringPack("gametime=",stat.gametime) stringPack("bgm=",setting.bgm),
t=t..stringPack("piece=",stat.piece) stringPack("fullscreen=",setting.fullscreen),
t=t..stringPack("row=",stat.row)
t=t..stringPack("atk=",stat.atk) stringPack("run=",stat.run),
t=t..stringPack("key=",stat.key) stringPack("game=",stat.game),
t=t..stringPack("rotate=",stat.rotate) stringPack("gametime=",stat.gametime),
t=t..stringPack("hold=",stat.hold) stringPack("piece=",stat.piece),
t=t..stringPack("spin=",stat.spin) stringPack("row=",stat.row),
t=t..stringPack("das=",setting.das) stringPack("atk=",stat.atk),
t=t..stringPack("arr=",setting.arr) stringPack("key=",stat.key),
t=t..stringPack("sddas=",setting.sddas) stringPack("rotate=",stat.rotate),
t=t..stringPack("sdarr=",setting.sdarr) stringPack("hold=",stat.hold),
t=t..stringPack("keyset=",string.concat(setting.key)) 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("virtualkey=",table.concat(vk,"/")),
stringPack("virtualkeyAlpha=",setting.virtualkeyAlpha),
stringPack("virtualkeyIcon=",setting.virtualkeyIcon),
},"\r\n")
--t=love.math.compress(t,"zlib"):getString() --t=love.math.compress(t,"zlib"):getString()
userdata:open("w") userdata:open("w")
userdata:write(t) userdata:write(t)
@@ -1059,7 +1075,7 @@ function drop()
SFX("spin_"..cc) SFX("spin_"..cc)
stat.spin=stat.spin+1 stat.spin=stat.spin+1
elseif #clearing<#field then elseif #clearing<#field then
P.b2b=P.b2b-400 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
@@ -1174,7 +1190,7 @@ function keyDown.play(key)
local k=players[1].gameEnv.key local k=players[1].gameEnv.key
for i=1,11 do for i=1,11 do
if key==k[i]then if key==k[i]then
pressKey(i,players[1]) pressKey(i)
break break
end end
end end
@@ -1206,7 +1222,7 @@ function gamepadDown.play(key)
local k=players[1].gameEnv.gamepad local k=players[1].gameEnv.gamepad
for i=1,11 do for i=1,11 do
if key==k[i]then if key==k[i]then
pressKey(i,players[1]) pressKey(i)
break break
end end
end end
@@ -1278,7 +1294,7 @@ function love.update(dt)
end end
--scene swapping & Timer --scene swapping & Timer
end end
function love.draw()print(mouseShow) function love.draw()
Pnt.BG[curBG]() Pnt.BG[curBG]()
gc.setColor(1,1,1,.3) gc.setColor(1,1,1,.3)
for n=1,#BGblock do for n=1,#BGblock do
@@ -1308,9 +1324,6 @@ function love.draw()print(mouseShow)
numFont(20)gc.setColor(1,1,1) numFont(20)gc.setColor(1,1,1)
gc.print(tm.getFPS(),0,700) gc.print(tm.getFPS(),0,700)
gc.print(gcinfo(),0,680) gc.print(gcinfo(),0,680)
-- numFont(80)
-- gc.print(gcinfo(),400,370)
--if gcinfo()>500 then collectgarbage()end --if gcinfo()>500 then collectgarbage()end
end end
function love.resize(x,y) function love.resize(x,y)
@@ -1320,18 +1333,7 @@ function love.resize(x,y)
gc.scale(1/screenK,1/screenK) gc.scale(1/screenK,1/screenK)
gc.translate(0,screenM) gc.translate(0,screenM)
end 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() function love.run()
love.focus(true)
local frameT=Timer() local frameT=Timer()
tm.step() tm.step()
love.resize(nil,gc.getHeight()) love.resize(nil,gc.getHeight())
@@ -1340,19 +1342,35 @@ function love.run()
return function() return function()
love.event.pump() love.event.pump()
for name,a,b,c,d,e,f in love.event.poll()do for name,a,b,c,d,e,f in love.event.poll()do
if name=="quit"then if name=="quit"then return 0 end
savedata()
return 0
end
love.handlers[name](a,b,c,d,e,f) love.handlers[name](a,b,c,d,e,f)
end end
-- if focus then if focus then
tm.step() tm.step()
love.update(tm.getDelta()) love.update(tm.getDelta())
gc.clear(1,1,1) gc.clear()
love.draw() love.draw()
gc.present() gc.present()
-- end 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 while Timer()-frameT<1/60 do end
frameT=Timer() frameT=Timer()
end end
@@ -1360,30 +1378,22 @@ end
--System callbacks --System callbacks
do--Texture/Image 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") titleImage=gc.newImage("/image/title.png")
gc.setCanvas() 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 end
do--Particle do--Particle
PTC={dust={}}--Particle systems PTC={dust={}}--Particle systems
@@ -1420,11 +1430,10 @@ do--Particle
gc.setCanvas() gc.setCanvas()
end end
c=nil c=nil
userdata=fs.newFile("userdata") userdata=fs.newFile("userdata")
if fs.getInfo("userdata")then if fs.getInfo("userdata")then
loaddata() loaddata()
end end
stat.run=stat.run+1 stat.run=stat.run+1
setFont=fontLib[setting.lang]
Text=Texts[setting.lang]

109
paint.lua
View File

@@ -77,22 +77,48 @@ function drawPixel(y,x,id,alpha)
gc.setColor(1,1,1,alpha) gc.setColor(1,1,1,alpha)
gc.draw(blockSkin[id],30*x-30,600-30*y) gc.draw(blockSkin[id],30*x-30,600-30*y)
end end
function drawVirtualkey()
gc.setLineWidth(10)
gc.setColor(1,1,1,setting.virtualkeyAlpha*.2)
for i=1,#virtualkey do
local b=virtualkey[i]
gc.circle("line",b[1],b[2],b[4]-5)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,2*b[4]*.0125,nil,18,18)end
end
end
Pnt={BG={}} Pnt={BG={}}
function Pnt.BG.none() function Pnt.BG.none()
gc.clear(.1,.1,.1) gc.clear(.2,.2,.2)
end
function Pnt.BG.glow()
local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05
gc.clear(t,t,t)
end end
function Pnt.BG.game1() function Pnt.BG.game1()
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(background[1],640,360,Timer()*.15,nil,nil,768,768) gc.draw(background[1],640,360,Timer()*.15,12,nil,64,64)
end end
function Pnt.BG.game2() function Pnt.BG.game2()
gc.setColor(1,.5,.5) gc.setColor(1,.5,.5)
gc.draw(background[1],640,360,Timer()*.2,nil,nil,768,768) gc.draw(background[1],640,360,Timer()*.2,12,nil,64,64)
end end
function Pnt.BG.game3() function Pnt.BG.game3()
gc.setColor(.6,.6,1) gc.setColor(.6,.6,1)
gc.draw(background[1],640,360,Timer()*.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 end
function Pnt.load() function Pnt.load()
@@ -109,7 +135,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.2",370,150) gc.print("Alpha V0.3",370,150)
if system==2 then if system==2 then
gc.print("Android",530,110) gc.print("Android",530,110)
end end
@@ -121,7 +147,7 @@ function Pnt.play()
setmetatable(_G,P.index) setmetatable(_G,P.index)
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,.8)gc.rectangle("fill",0,0,600,690)--Black Background gc.setColor(0,0,0,.7)gc.rectangle("fill",0,0,600,690)--Black Background
gc.setLineWidth(3) gc.setLineWidth(3)
gc.setColor(1,1,1)gc.rectangle("line",0,0,600,690)--Big frame gc.setColor(1,1,1)gc.rectangle("line",0,0,600,690)--Big frame
gc.translate(150,70) gc.translate(150,70)
@@ -247,19 +273,21 @@ function Pnt.play()
bonus[i]:draw() bonus[i]:draw()
end--Effects end--Effects
gc.setColor(1,1,1) if P.size>.3 then
setFont(40) gc.setColor(1,1,1)
gc.print(format("%0.2f",time),-125,530)--Draw time setFont(40)
if mesDisp[gamemode]then mesDisp[gamemode]()end--Draw other message gc.print(format("%0.2f",time),-125,530)--Draw time
if mesDisp[gamemode]then mesDisp[gamemode]()end--Draw other message
setFont(15) setFont(15)
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.print("BPM",380,490) gc.print("BPM",380,490)
gc.print("KPM",335,580) gc.print("KPM",335,580)
setFont(30) setFont(30)
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--Draw players end--Draw players
gc.setColor(1,1,1) gc.setColor(1,1,1)
@@ -268,13 +296,7 @@ function Pnt.play()
end end
setmetatable(_G,nil) setmetatable(_G,nil)
if system==2 then if system==2 then
gc.setColor(1,1,1,.8) drawVirtualkey()
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
end end
end end
function Pnt.setting2() function Pnt.setting2()
@@ -292,31 +314,42 @@ function Pnt.setting2()
gc.print("<<",keysetting and 380 or 670,60*(keysetting or gamepadsetting)-10) gc.print("<<",keysetting and 380 or 670,60*(keysetting or gamepadsetting)-10)
end end
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() function Pnt.help()
setFont(32) setFont(32)
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,11 do for i=1,11 do
mStr(Text.help[i],640,15+43*i) mStr(Text.help[i],640,15+43*i)
end end
gc.draw(img.title[setting.lang],180,600,.2,.7+.05*sin(Timer()*2),nil,140,100) gc.draw(titleImage,180,600,.2,.7+.05*sin(Timer()*2),nil,140,100)
end end
function Pnt.stat() function Pnt.stat()
setFont(30) setFont(30)
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,10 do for i=1,10 do
gc.print(Text.stat[i],250,20+40*i) gc.print(Text.stat[i],350,20+40*i)
end end
gc.print(stat.run,600,60) gc.print(stat.run,650,60)
gc.print(stat.game,600,100) gc.print(stat.game,650,100)
gc.print(format("%0.2f",stat.gametime).."s",600,140) gc.print(format("%0.2f",stat.gametime).."s",650,140)
gc.print(stat.piece,600,180) gc.print(stat.piece,650,180)
gc.print(stat.row,600,220) gc.print(stat.row,650,220)
gc.print(stat.atk,600,260) gc.print(stat.atk,650,260)
gc.print(stat.key,600,300) gc.print(stat.key,650,300)
gc.print(stat.rotate,600,340) gc.print(stat.rotate,650,340)
gc.print(stat.hold,600,380) gc.print(stat.hold,650,380)
gc.print(stat.spin,600,420) 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 end

View File

@@ -56,23 +56,6 @@ function Tmr.play(dt)
end end
-- Update attack beam -- 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 if count then
count=count-1 count=count-1
if count==0 then if count==0 then