Compare commits

...

1 Commits

Author SHA1 Message Date
MrZ_26
c14124d00c 0.7.30α 2020-02-04 19:37:25 +08:00
32 changed files with 1420 additions and 996 deletions

Binary file not shown.

View File

@@ -70,7 +70,7 @@ function button:draw()
end end
end end
function button:getInfo() function button:getInfo()
print(format("x=%d,y=%d,w=%d,h=%d,font=%d",self.x,self.y,self.w,self.h,self.font)) print(format("x=%d,y=%d,w=%d,h=%d,font=%d",self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font))
end end
local switch={type="switch"} local switch={type="switch"}

View File

@@ -1,4 +1,5 @@
gameVersion="Alpha V0.7.28" math.randomseed(os.time())
gameVersion="Alpha V0.7.30"
function love.conf(t) function love.conf(t)
t.identity="Techmino"--Save directory name t.identity="Techmino"--Save directory name
t.version="11.1" t.version="11.1"
@@ -9,7 +10,12 @@ function love.conf(t)
t.audio.mixwithsystem=true--Switch on to keep sysBGM t.audio.mixwithsystem=true--Switch on to keep sysBGM
local W=t.window local W=t.window
W.title=math.random()>.01 and "Techmino "..gameVersion or"MrZ NB!" if math.random()>.26 then
W.title="Techmino "..gameVersion
else
math.randomseed(tonumber(os.date("%Y%j")))
W.title="Your lucky number today:"..math.random(100,626)
end
W.icon="/image/icon.png" W.icon="/image/icon.png"
W.width,W.height=1280,720 W.width,W.height=1280,720
W.minwidth,W.minheight=640,360 W.minwidth,W.minheight=640,360

View File

@@ -63,252 +63,251 @@ local function AITemplate(type,speedLV,next,hold,node)
} }
end end
end end
loadmode={ loadmode={}
sprint=function() function loadmode.sprint()
newPlayer(1,340,15) newPlayer(1,340,15)
end, end
marathon=function() function loadmode.marathon()
newPlayer(1,340,15) newPlayer(1,340,15)
end, end
master=function() function loadmode.master()
newPlayer(1,340,15) newPlayer(1,340,15)
end, end
classic=function() function loadmode.classic()
newPlayer(1,340,15) newPlayer(1,340,15)
end, end
zen=function() function loadmode.zen()
newPlayer(1,340,15) newPlayer(1,340,15)
end, end
infinite=function() function loadmode.infinite()
newPlayer(1,340,15) newPlayer(1,340,15)
if curMode.lv==2 then if curMode.lv==2 then
pushSpeed=1
for i=1,5 do
players[1]:garbageRise(10,1,rnd(10))
end
end
end,
solo=function()
newPlayer(1,340,15)
if curMode.lv==1 then
newPlayer(2,965,360,.5,AITemplate("9S",3))
elseif curMode.lv==2 then
newPlayer(2,965,360,.5,AITemplate("CC",2,2,false,10000))
elseif curMode.lv==3 then
newPlayer(2,965,360,.5,AITemplate("9S",6))
elseif curMode.lv==4 then
newPlayer(2,965,360,.5,AITemplate("CC",5,2,true,20000))
elseif curMode.lv==5 then
newPlayer(2,965,360,.5,AITemplate("9S",9))
elseif curMode.lv==6 then
newPlayer(2,965,360,.5,AITemplate("CC",8,3,true,30000))
elseif curMode.lv==7 then
newPlayer(2,965,360,.5,AITemplate("9S",10))
elseif curMode.lv==8 then
newPlayer(2,965,360,.5,AITemplate("CC",9,3,true,40000))
elseif curMode.lv==9 then
newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,80000))
end
end,
round=function()
newPlayer(1,340,15)
if curMode.lv==1 then
newPlayer(2,965,360,.5,AITemplate("9S",10))
elseif curMode.lv==2 then
newPlayer(2,965,360,.5,AITemplate("CC",10,2,false,10000))
elseif curMode.lv==3 then
newPlayer(2,965,360,.5,AITemplate("CC",10,3,true,30000))
elseif curMode.lv==4 then
newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,60000))
elseif curMode.lv==5 then
newPlayer(2,965,360,.5,AITemplate("CC",10,6,true,100000))
end
garbageSpeed=1e4
end,
tsd=function()
newPlayer(1,340,15)
end,
blind=function()
newPlayer(1,340,15)
end,
dig=function()
newPlayer(1,340,15)
pushSpeed=1 pushSpeed=1
end, for _=1,5 do
survivor=function() players[1]:garbageRise(10,1,rnd(10))
newPlayer(1,340,15)
pushSpeed=curMode.lv>2 and 2 or 1
end,
defender=function()
newPlayer(1,340,15)
if curMode.lv==1 then
pushSpeed=1
elseif curMode.lv==2 then
pushSpeed=2
end end
end, end
attacker=function() end
newPlayer(1,340,15) function loadmode.solo()
if curMode.lv==1 then newPlayer(1,340,15)
pushSpeed=2 if curMode.lv==1 then
newPlayer(2,965,360,.5,AITemplate("9S",3))
elseif curMode.lv==2 then
newPlayer(2,965,360,.5,AITemplate("CC",2,2,false,10000))
elseif curMode.lv==3 then
newPlayer(2,965,360,.5,AITemplate("9S",6))
elseif curMode.lv==4 then
newPlayer(2,965,360,.5,AITemplate("CC",5,2,true,20000))
elseif curMode.lv==5 then
newPlayer(2,965,360,.5,AITemplate("9S",9))
elseif curMode.lv==6 then
newPlayer(2,965,360,.5,AITemplate("CC",8,3,true,30000))
elseif curMode.lv==7 then
newPlayer(2,965,360,.5,AITemplate("9S",10))
elseif curMode.lv==8 then
newPlayer(2,965,360,.5,AITemplate("CC",9,3,true,40000))
elseif curMode.lv==9 then
newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,80000))
end
end
function loadmode.round()
newPlayer(1,340,15)
if curMode.lv==1 then
newPlayer(2,965,360,.5,AITemplate("9S",10))
elseif curMode.lv==2 then
newPlayer(2,965,360,.5,AITemplate("CC",10,2,false,10000))
elseif curMode.lv==3 then
newPlayer(2,965,360,.5,AITemplate("CC",10,3,true,30000))
elseif curMode.lv==4 then
newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,60000))
elseif curMode.lv==5 then
newPlayer(2,965,360,.5,AITemplate("CC",10,6,true,100000))
end
garbageSpeed=1e4
end
function loadmode.tsd()
newPlayer(1,340,15)
end
function loadmode.blind()
newPlayer(1,340,15)
end
function loadmode.dig()
newPlayer(1,340,15)
pushSpeed=1
end
function loadmode.survivor()
newPlayer(1,340,15)
pushSpeed=curMode.lv>2 and 2 or 1
end
function loadmode.defender()
newPlayer(1,340,15)
if curMode.lv==1 then
pushSpeed=1
elseif curMode.lv==2 then
pushSpeed=2
end
end
function loadmode.attacker()
newPlayer(1,340,15)
if curMode.lv==1 then
pushSpeed=2
end
end
function loadmode.tech()
newPlayer(1,340,15)
end
function loadmode.c4wtrain()
newPlayer(1,340,15)
local P=players[1]
local F=P.field
for i=1,24 do
F[i]=getNewRow(10)
P.visTime[i]=getNewRow(20)
for x=4,7 do F[i][x]=0 end
end
local r=rnd(6)
if r==1 then F[1][5],F[1][4],F[2][4]=10,10,10
elseif r==2 then F[1][6],F[1][7],F[2][7]=10,10,10
elseif r==3 then F[1][4],F[2][4],F[2][5]=10,10,10
elseif r==4 then F[1][7],F[2][7],F[2][6]=10,10,10
elseif r==5 then F[1][4],F[1][5],F[1][6]=10,10,10
elseif r==6 then F[1][7],F[1][6],F[1][5]=10,10,10
end
end
function loadmode.pctrain()
newPlayer(1,340,15)
Event.newPC(players[1])
end
function loadmode.pcchallenge()
newPlayer(1,340,15)
end
function loadmode.techmino49()
newPlayer(1,340,15)
local LV=curMode.lv
if LV==3 then players[1].gameEnv.drop=15 end
local L={}for i=1,49 do L[i]=true end
local t=system~="Windows"and 0 or 2*LV
while t>0 do
local r=rnd(2,49)
if L[r]then L[r],t=false,t-1 end
end
local min,max
if LV==1 then min,max=4,6
elseif LV==2 then min,max=4,8
elseif LV==3 then min,max=8,10
end
local n=2
for i=1,4 do for j=1,6 do
if L[n]then
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(min,max)))
else
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000))
end end
end, n=n+1
tech=function() end end
newPlayer(1,340,15) for i=9,12 do for j=1,6 do
end, if L[n]then
c4wtrain=function() newPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(min,max)))
newPlayer(1,340,15) else
local P=players[1] newPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000))
local F=P.field
for i=1,24 do
F[i]=getNewRow(10)
P.visTime[i]=getNewRow(20)
for x=4,7 do F[i][x]=0 end
end end
local r=rnd(6) n=n+1
if r==1 then F[1][5],F[1][4],F[2][4]=10,10,10 end end
elseif r==2 then F[1][6],F[1][7],F[2][7]=10,10,10 end
elseif r==3 then F[1][4],F[2][4],F[2][5]=10,10,10 function loadmode.techmino99()
elseif r==4 then F[1][7],F[2][7],F[2][6]=10,10,10 newPlayer(1,340,15)
elseif r==5 then F[1][4],F[1][5],F[1][6]=10,10,10 local LV=curMode.lv
elseif r==6 then F[1][7],F[1][6],F[1][5]=10,10,10 if LV==3 then players[1].gameEnv.drop=15 end
local L={}for i=1,100 do L[i]=true end
local t=system~="Windows"and 0 or 1+3*LV
while t>0 do
local r=rnd(2,99)
if L[r]then L[r],t=false,t-1 end
end
local min,max
if LV==1 then min,max=4,6
elseif LV==2 then min,max=4,8
elseif LV==3 then min,max=8,10
end
local n=2
for i=1,7 do for j=1,7 do
if L[n]then
newPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(min,max)))
else
newPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000))
end end
end, n=n+1
pctrain=function() end end
newPlayer(1,340,15) for i=15,21 do for j=1,7 do
Event.newPC(players[1]) if L[n]then
end, newPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(min,max)))
pcchallenge=function() else
newPlayer(1,340,15) newPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000))
end,
techmino49=function()
newPlayer(1,340,15)
local LV=curMode.lv
if LV==3 then players[1].gameEnv.drop=15 end
local L={}for i=1,49 do L[i]=true end
local t=system~="Windows"and 0 or 2*LV
while t>0 do
local r=rnd(2,49)
if L[r]then L[r],t=false,t-1 end
end end
local min,max n=n+1
if LV==1 then min,max=4,6 end end
elseif LV==2 then min,max=4,8 end
elseif LV==3 then min,max=8,10 function loadmode.drought()
newPlayer(1,340,15)
end
function loadmode.hotseat()
if curMode.lv==1 then
newPlayer(1,20,15)
newPlayer(2,650,15)
elseif curMode.lv==2 then
newPlayer(1,20,100,.65)
newPlayer(2,435,100,.65)
newPlayer(3,850,100,.65)
elseif curMode.lv==3 then
newPlayer(1,25,160,.5)
newPlayer(2,335,160,.5)
newPlayer(3,645,160,.5)
newPlayer(4,955,160,.5)
end
end
function loadmode.custom()
for i=1,#customID do
local k=customID[i]
modeEnv[k]=customRange[k][customSel[i]]
end
modeEnv._20G=modeEnv.drop==0
modeEnv.oncehold=customSel[6]==1
if curMode.lv==2 then
modeEnv.target=0
end
newPlayer(1,340,15)
local L=modeEnv.opponent
if L~=0 then
modeEnv.target=nil
if L<10 then
newPlayer(2,965,360,.5,AITemplate("9S",2*L))
else
newPlayer(2,965,360,.5,AITemplate("CC",L-6,2+int((L-11)*.5),modeEnv.hold,15000+5000*(L-10)))
end end
local n=2 end
for i=1,4 do for j=1,6 do preField.h=20
if L[n]then repeat
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(min,max))) for i=1,10 do
else if preField[preField.h][i]>0 or curMode.lv==2 and preField[preField.h][i]==-1 then
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000)) goto L
end
n=n+1
end end
for i=9,12 do for j=1,6 do
if L[n]then
newPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(min,max)))
else
newPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000))
end
n=n+1
end end
end,
techmino99=function()
newPlayer(1,340,15)
local LV=curMode.lv
if LV==3 then players[1].gameEnv.drop=15 end
local L={}for i=1,100 do L[i]=true end
local t=system~="Windows"and 0 or 1+3*LV
while t>0 do
local r=rnd(2,99)
if L[r]then L[r],t=false,t-1 end
end
local min,max
if LV==1 then min,max=4,6
elseif LV==2 then min,max=4,8
elseif LV==3 then min,max=8,10
end
local n=2
for i=1,7 do for j=1,7 do
if L[n]then
newPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(min,max)))
else
newPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000))
end
n=n+1
end end
for i=15,21 do for j=1,7 do
if L[n]then
newPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(min,max)))
else
newPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(min,max)-1,LV+1,true,LV*10000))
end
n=n+1
end end
end,
drought=function()
newPlayer(1,340,15)
end,
hotseat=function()
if curMode.lv==1 then
newPlayer(1,20,15)
newPlayer(2,650,15)
elseif curMode.lv==2 then
newPlayer(1,20,100,.65)
newPlayer(2,435,100,.65)
newPlayer(3,850,100,.65)
elseif curMode.lv==3 then
newPlayer(1,25,160,.5)
newPlayer(2,335,160,.5)
newPlayer(3,645,160,.5)
newPlayer(4,955,160,.5)
end
end,
custom=function()
for i=1,#customID do
local k=customID[i]
modeEnv[k]=customRange[k][customSel[i]]
end
modeEnv._20G=modeEnv.drop==0
modeEnv.oncehold=customSel[6]==1
if curMode.lv==2 then
modeEnv.target=0
end
newPlayer(1,340,15)
local L=modeEnv.opponent
if L~=0 then
modeEnv.target=nil
if L<10 then
newPlayer(2,965,360,.5,AITemplate("9S",2*L))
else
newPlayer(2,965,360,.5,AITemplate("CC",L-6,2+int((L-11)*.5),modeEnv.hold,15000+5000*(L-10)))
end end
end end
preField.h=20 preField.h=preField.h-1
repeat until preField.h==0
for i=1,10 do ::L::
if preField[preField.h][i]>0 or curMode.lv==2 and preField[preField.h][i]==-1 then if curMode.lv==1 then
goto L for _,P in next,players.alive do
end local t=P.showTime*3
end for y=1,preField.h do
preField.h=preField.h-1 P.field[y]=getNewRow(0)
until preField.h==0 P.visTime[y]=getNewRow(t)
::L:: for x=1,10 do P.field[y][x]=preField[y][x]end
if curMode.lv==1 then
for _,P in next,players.alive do
local t=P.showTime*3
for y=1,preField.h do
P.field[y]=getNewRow(0)
P.visTime[y]=getNewRow(t)
for x=1,10 do P.field[y][x]=preField[y][x]end
end
end end
end end
modeEnv.bg=customRange.bg[customSel[12]] end
modeEnv.bgm=customRange.bgm[customSel[13]] modeEnv.bg=customRange.bg[customSel[12]]
end, modeEnv.bgm=customRange.bgm[customSel[13]]
} end
-------------------------<Events>------------------------- -------------------------<Events>-------------------------
Event={null=NULL} Event={null=NULL}
function Event.reach_winCheck(P) function Event.reach_winCheck(P)
@@ -809,7 +808,7 @@ function Event_task.defender_normal(P)
local t=360-P.modeData.event*2 local t=360-P.modeData.event*2
if P.counter>=t then if P.counter>=t then
P.counter=0 P.counter=0
for i=1,3 do for _=1,3 do
P.atkBuffer[#P.atkBuffer+1]={pos=rnd(2,9),amount=1,countdown=2*t,cd0=2*t,time=0,sent=false,lv=1} P.atkBuffer[#P.atkBuffer+1]={pos=rnd(2,9),amount=1,countdown=2*t,cd0=2*t,time=0,sent=false,lv=1}
end end
P.atkBuffer.sum=P.atkBuffer.sum+3 P.atkBuffer.sum=P.atkBuffer.sum+3
@@ -839,7 +838,7 @@ function Event_task.defender_lunatic(P)
local t=240-2*P.modeData.event local t=240-2*P.modeData.event
if P.counter>=t then if P.counter>=t then
P.counter=0 P.counter=0
for i=1,4 do for _=1,4 do
P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=1,countdown=5*t,cd0=5*t,time=0,sent=false,lv=2} P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=1,countdown=5*t,cd0=5*t,time=0,sent=false,lv=2}
end end
P.atkBuffer.sum=P.atkBuffer.sum+4 P.atkBuffer.sum=P.atkBuffer.sum+4
@@ -944,9 +943,7 @@ function Event_task.PC(P)
ins(P.visTime,1,getNewRow(20)) ins(P.visTime,1,getNewRow(20))
end end
P.fieldBeneath=P.fieldBeneath+120 P.fieldBeneath=P.fieldBeneath+120
for i=1,#P.clearing do P.curY=P.curY+4
P.clearing[i]=P.clearing[i]+4
end
P:freshgho() P:freshgho()
return true return true
end end

95
default_data.lua Normal file
View File

@@ -0,0 +1,95 @@
setting={
das=10,arr=2,
sddas=0,sdarr=2,
quickR=true,swap=true,
fine=false,
--game
ghost=true,center=true,
smo=true,grid=false,
dropFX=3,
shakeFX=3,
atkFX=3,
frameMul=100,
--
fullscreen=false,
bg=true,
bgblock=true,
lang=1,
skin=1,
--graphic
sfx=8,bgm=6,
vib=3,voc=0,
--sound
keyMap={
{"left","right","x","z","c","up","down","space","tab","r"},
{},{},{},{},{},{},{},
--keyboard
{"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","x","leftshoulder"},
{},{},{},{},{},{},{},
--joystick
},
VKSwitch=true,
VKTrack=true,--If tracked
VKTchW=3,--Touch Weight
VKCurW=4,--CurPos Weight
VKIcon=true,
VKAlpha=3,
--control
}
local L=setting.keyMap
for i=1,#L do
for j=1,20 do
if not L[i][j]then
L[i][j]=""
end
end
end
stat={
run=0,game=0,time=0,
extraPiece=0,extraRate=0,
key=0,rotate=0,hold=0,piece=0,row=0,
atk=0,send=0,recv=0,pend=0,
clear_1=0,clear_2=0,clear_3=0,clear_4=0,
spin_0=0,spin_1=0,spin_2=0,spin_3=0,
b2b=0,b3b=0,pc=0,score=0,
}
--Things related to virtualkey
function restoreVirtualKey()
for i=1,#VK_org do
local B,O=virtualkey[i],VK_org[i]
B.ava=O.ava
B.x=O.x
B.y=O.y
B.r=O.r
end
end
local O,_=true,false
VK_org={--Original set,for restore VK' position
{ava=O,x=80, y=720-200, r=80},--moveLeft
{ava=O,x=320, y=720-200, r=80},--moveRight
{ava=O,x=1280-80, y=720-200, r=80},--rotRight
{ava=O,x=1280-200, y=720-80, r=80},--rotLeft
{ava=O,x=1280-200, y=720-320, r=80},--rotFlip
{ava=O,x=200, y=720-320, r=80},--hardDrop
{ava=O,x=200, y=720-80, r=80},--softDrop
{ava=O,x=1280-320, y=720-200, r=80},--hold
{ava=O,x=1280-80, y=280, r=80},--func
{ava=O,x=80, y=280, r=80},--restart
{ava=_,x=100, y=50, r=80},--insLeft
{ava=_,x=200, y=50, r=80},--insRight
{ava=_,x=300, y=50, r=80},--insDown
{ava=_,x=400, y=50, r=80},--down1
{ava=_,x=500, y=50, r=80},--down4
{ava=_,x=600, y=50, r=80},--down10
{ava=_,x=700, y=50, r=80},--dropLeft
{ava=_,x=800, y=50, r=80},--dropRight
{ava=_,x=900, y=50, r=80},--addToLeft
{ava=_,x=1000, y=50, r=80},--addToRight
}
virtualkey={}
for i=1,#VK_org do
virtualkey[i]={}
end

View File

@@ -1,31 +1,89 @@
攻击系统: 游戏方法:
消1/2/3/4攻击0/1/2/4 控制系统提供的一个个方块,每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话)
spin1/2/3攻击2/4/6,若mini则减半 完成当前游戏模式中的目标或者是活到最后即算胜利.
b2b增加1~2(tetris)/1~3(spin)攻击
b3b满b2b效果+1额外抵挡 旋转系统:
PC其它攻击与6~8(本局内递增)取高+2额外抵挡 使用Techmino专属旋转系统,细节不赘述
连击0,0,1,1,2,2,3,3,4,4,3……
spin判定:
结合了不可移动判定和三角判定,是否为mini也与这二者有关,细节不赘述
攻击系统:
消1/2/3/4攻击0/1/2/4
spin1/2/3攻击2/4/6,若mini则减半
b2b:增加1~2(tetris)/1~3(spin)攻击
b3b:满b2b效果+1额外抵挡
PC:其它攻击与6~8(本局内递增)取高+2额外抵挡
连击:0,0,1,1,2,2,3,3,4,4,3……
back to back(B2B)点数说明:
B2B点数的范围在0~1200
在40及以上特殊消除时B2B,在1000以上特殊消除时B3B,1200封顶
消四+100
空spin加20,不超过1000
spin1~3+50/100/180 (mini*.5)
普通消除-250
1000以上空放一块-40(不减到低于1000)
攻击延迟:
消2/3的攻击生效最快,消四其次,spin攻击生效较慢,高连击生效最慢
b2b或者b3b增加攻击力的同时也会减缓一点生效速度,mini大幅减缓生效速度
抵消逻辑:
发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力1:1抵消最先受到的攻击
没有用上的额外抵挡会被丢弃,最后剩下的攻击力会发送给对手
抵消逻辑:发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力抵消受到的攻击,多余的攻击力会发送给对手,没有用上的额外抵挡会被丢弃。 模式说明:
竞速:
用你最快的速度消除40行(据难度而定)吧!
攻击延迟消2/3的攻击生效最快消四其次spin攻击生效较慢高连击生效最慢b2b或者b3b增加攻击力的同时也会减缓一点生效时间mini大幅增加生效时间。 马拉松:
根据总消行数,速度会逐渐加快,消除两百行吧!(easy和hard就是normal开始和结束的速度,消除200行不加速)
大师:
back to back点数说明取值范围0~1200 马拉松进化版,如果觉得马拉松太简单了久玩这个吧,每一个难度都是一层境界,L难度和U难度攒到500点数通关,final难度为上级者专属游戏模式,不建议游玩.
在40及以上特殊消除时b2b,在1000以上特殊消除时b3b,1200封顶 经典:
消四+100 使用低速控制设置在高速下落时尽可能消除更多的行,没有通关目标.(到90有"彩蛋")
空spin加20不超过1000 禅:
spin1~3+50/100/180 (mini*.5) 闲得无聊,只是想单纯地打打块地时候可以玩此模式,无重力消除200行.
普通消除-250 无尽:
1000以上空放一块-40(不减到低于1000) 无尽模式,边上会显示玩家的消行数和攻击效率,适合科研(术语).
单挑:
和一个电脑玩家单挑,带加号的和最后一个模式是超强机器人(仅限Windows平台),试试你能稳定打败多难的对手吧!
吃鸡模式: 回合制:
许多玩家同时进行一局游戏其它的是AI不是真人坚持到最后的玩家胜利。随着玩家数量的减少方块下落/垃圾生效速度/垃圾升起速度都会增加。淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力。 玩法同单挑模式,只不过只有当一个人放下一个方块后另一个人才能放下一块.
玩家可选四个攻击模式: 仅TSD:
1.随机每次攻击后10%随机锁定一个玩家 这个模式中,玩家必须用TSD(T spin double)的方式消除,否则直接判负,你能连续打出多少个TSD呢?
2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家 隐形:
3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新) 根据不同难度,场地内(甚至当前方块)会隐形,看看你能活多久吧!(GM难度为类似TGM3的GM Roll,用于上级者练习)
4.反击攻击所有锁定自己的玩家AOE若无则伏击随机玩家 挖掘:
每隔一定时间,系统会向场地的低端添加一行垃圾行,间隔会随着波数增加而越来越短,你能顶住几波呢?
生存:
每隔一定时间,系统会向玩家的垃圾缓冲槽中添加垃圾行,释放速度和间隔会随着波数增加而越来越短,玩家可以将其抵消也可以让其释放,尽可能活更久的时间.
防守:
系统会向玩家的垃圾缓冲槽中添加难消除的垃圾行,释放速度和间隔会随着波数增加而越来越短,玩家要尽量抵消他们来让自己存活更久.
进攻:
当玩家的攻击缓冲槽空时,系统会向玩家的垃圾缓冲槽中添加大量的垃圾行(高难度下后期甚至会远超过20),释放速度和间隔都会随着波数增加而越来越短,垃圾上涨速度也会提升.赶紧在其释放之前将攻击抵消到不会一下致命的量!
科研:
玩家只被允许做特殊消除(spin/全消/消四),在带+的难度中不允许消四,U难度下玩家甚至只被允许每一个方块都使用最简操作控制,任何违反规则的行为都会判负.
C4W练习:(或者说是4w练习)
系统直接提供给玩家"留4列"的场地,玩家可以自由练习4w消除,该技巧在某些时候实战很有用.(需要学会spin,否则意义不是很大)
全清训练:
系统会连续给玩家提供"标准开局PC套路"的场地和四个方块(不允许使用hold),玩家需要一直完成PC,否则判负.
全清挑战:
在消除一百行的限制内,你能全清几次?
49人混战:
许多玩家同时进行一局游戏其它的是AI,不是真人).随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力.
玩家可选四个攻击模式:
1.随机:每次攻击后10%随机挑选一个玩家锁定
2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家
3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新)
4.反击:攻击所有锁定自己的玩家AOE,若无则伏击随机玩家
坚持到最后的玩家就是胜利者.
99人混战:
同49人混战,只是增加到了99名玩家,难度系数也有调整,对设备的要求也较高.
干旱:
系统提供的方块序列变得奇怪了!你能消除100行不死吗,或者,多快?
多人:
使用键盘或者多个手柄(也许?)
自定义:
玩家可以自由调整下落速度等等几乎大多数设置(不包括上述各种游戏模式的特殊效果),也可以画一个场地去消除或者是作为提示模板来玩方块拼图.在拼图模式下,按功能键切换是否显示提示模板.其中打"X"的格子不允许有方块,空的格子可以是任何状态,玩家能获得的七种普通方块必须完全符合,垃圾行方块的为止只要有方块就可以,但是不能是空气,玩家拼出自己画的图后就会判定胜利.

BIN
font.ttf

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 40 KiB

BIN
image/virtualkey.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

View File

@@ -1,4 +1,13 @@
local BK="返回" local BK="返回"
local actName={
"左移:","右移:",
"顺时针旋转:","逆时针旋转:","180°旋转:",
"硬降:","软降:",
"暂存:","功能键:",
"重新开始:",
"左瞬移:","右瞬移:","软降到底:","软降一格:","软降四格:","软降十格:",
"落在最左:","落在最右:","列在最左:","列在最右:",
}
return{ return{
atkModeName={"随机","徽章","击杀","反击"}, atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end, royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
@@ -67,8 +76,11 @@ return{
setting_sound="声音设置", setting_sound="声音设置",
musicRoom="音乐室", musicRoom="音乐室",
nowPlaying="正在播放:", nowPlaying="正在播放:",
VKTchW="触摸点权重",
VKOrgW="原始点权重",
VKCurW="当前点权重",
actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","功能键:","重新开始:","左瞬移:","右瞬移:","软降到底:"}, actName=actName,
modeName={ modeName={
[0]="自定义", [0]="自定义",
"竞速","马拉松","大师","经典","","无尽","单挑","回合制","仅TSD","隐形", "竞速","马拉松","大师","经典","","无尽","单挑","回合制","仅TSD","隐形",
@@ -128,6 +140,8 @@ return{
"使用love2d引擎制作", "使用love2d引擎制作",
"有疑问?先看设置有没有你想要的", "有疑问?先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~", "有建议的话可以把信息反馈给作者~",
"不要按F8",
"秘密代码:626",
"CLASSIC SEXY RUSSIAN BLOCKS", "CLASSIC SEXY RUSSIAN BLOCKS",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI "LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
}, },
@@ -149,7 +163,8 @@ return{
"B2B数:", "B2B数:",
"PC数:", "PC数:",
"效率:", "效率:",
"多余操作:" "多余操作:",
"最简操作率:",
}, },
help={ help={
"好像也没啥好帮助的吧?就当是关于了", "好像也没啥好帮助的吧?就当是关于了",
@@ -210,11 +225,11 @@ return{
start1="消除开始", start1="消除开始",
start2="拼图开始", start2="拼图开始",
draw="画图(D)", draw="画图(D)",
set1="40行", set1="40行(1)",
set2="1v1", set2="1v1(2)",
set3="无尽", set3="无尽(3)",
set4="隐形", set4="隐形(4)",
set5="极限", set5="极限(5)",
back=BK, back=BK,
}, },
draw={ draw={
@@ -283,16 +298,32 @@ return{
voc="语音", voc="语音",
back=BK, back=BK,
}, },
setting_control={ setting_key={
back=BK, back=BK,
}, },
setting_touch={ setting_touch={
hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end, hide="显示虚拟按键",
track="按键自动跟踪",
tkset="跟踪设置",
default="默认组合", default="默认组合",
snap=function()return text.snapLevelName[snapLevel]end, snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return setting.virtualkeyAlpha.."0%"end, alpha=function()return setting.VKAlpha.."0%"end,
icon="图标", icon="图标",
size="大小", size="大小",
toggle="开关",
back=BK,
},
setting_touchSwitch={
b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4],
b5= actName[5],b6=actName[6],b7=actName[7],b8=actName[8],
b9= actName[9],b10=actName[10],b11=actName[11],b12=actName[12],
b13=actName[13],b14=actName[14],b15=actName[15],b16=actName[16],
b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20],
norm="标准",
pro="专业",
back=BK,
},
setting_trackSetting={
back=BK, back=BK,
}, },
help={ help={

View File

@@ -1,4 +1,13 @@
local BK="返回" local BK="返回"
local actName={
"左移:","右移:",
"顺时针旋转:","逆时针旋转:","180°旋转:",
"硬降:","软降:",
"暂存:","功能键:",
"重新开始:",
"左瞬移:","右瞬移:","软降到底:","软降一格:","软降四格:","软降十格:",
"落在最左:","落在最右:","列在最左:","列在最右:",
}
return{ return{
atkModeName={"随机","徽章","击杀","反击"}, atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end, royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
@@ -67,8 +76,11 @@ return{
setting_sound="声音设置", setting_sound="声音设置",
musicRoom="音乐室", musicRoom="音乐室",
nowPlaying="正在播放:", nowPlaying="正在播放:",
VKTchW="触摸点权重",
VKOrgW="原始点权重",
VKCurW="当前点权重",
actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","功能键:","重新开始:","左瞬移:","右瞬移:","软降到底:"}, actName=actName,
modeName={ modeName={
[0]="自定义", [0]="自定义",
"竞速","马拉松","大师","经典","","无尽","单挑","回合制","仅TSD","隐形", "竞速","马拉松","大师","经典","","无尽","单挑","回合制","仅TSD","隐形",
@@ -128,6 +140,8 @@ return{
"使用love2d引擎制作", "使用love2d引擎制作",
"有疑问?先看设置有没有你想要的", "有疑问?先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~", "有建议的话可以把信息反馈给作者~",
"不要按F8",
"秘密代码:626",
"CLASSIC SEXY RUSSIAN BLOCKS", "CLASSIC SEXY RUSSIAN BLOCKS",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI "LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
}, },
@@ -149,7 +163,8 @@ return{
"满贯数:", "满贯数:",
"全清数:", "全清数:",
"效率:", "效率:",
"多余操作:" "多余操作:",
"最简操作率:",
}, },
help={ help={
"好像也没啥好帮助的吧?就当是关于了", "好像也没啥好帮助的吧?就当是关于了",
@@ -210,11 +225,11 @@ return{
start1="消除开始", start1="消除开始",
start2="拼图开始", start2="拼图开始",
draw="画图(D)", draw="画图(D)",
set1="40行", set1="40行(1)",
set2="1v1", set2="1v1(2)",
set3="无尽", set3="无尽(3)",
set4="隐形", set4="隐形(4)",
set5="极限", set5="极限(5)",
back=BK, back=BK,
}, },
draw={ draw={
@@ -284,16 +299,32 @@ return{
voc="语音", voc="语音",
back=BK, back=BK,
}, },
setting_control={ setting_key={
back=BK, back=BK,
}, },
setting_touch={ setting_touch={
hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end, hide="显示虚拟按键",
track="按键自动跟踪",
tkset="跟踪设置",
default="默认组合", default="默认组合",
snap=function()return text.snapLevelName[snapLevel]end, snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return setting.virtualkeyAlpha.."0%"end, alpha=function()return setting.VKAlpha.."0%"end,
icon="图标", icon="图标",
size="大小", size="大小",
toggle="开关",
back=BK,
},
setting_touchSwitch={
b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4],
b5= actName[5],b6=actName[6],b7=actName[7],b8=actName[8],
b9= actName[9],b10=actName[10],b11=actName[11],b12=actName[12],
b13=actName[13],b14=actName[14],b15=actName[15],b16=actName[16],
b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20],
norm="标准",
pro="专业",
back=BK,
},
setting_trackSetting={
back=BK, back=BK,
}, },
help={ help={

View File

@@ -1,4 +1,11 @@
local BK="Back" local BK="Back"
local actName={
"Move Left:","Move Right:",
"Rotate Right:","Rotate Left:","Rotate Flip:",
"Hard Drop:","Soft Drop:","Hold:","Function:","Restart:",
"Instant Left:","Instant Right:","Ins Down:","Down 1:","Down 4:","Down 10:",
"Left Drop:","Right Drop:","Left INS:","Right INS:",
}
return{ return{
atkModeName={"Random","Badges","K.O.s","Counters"}, atkModeName={"Random","Badges","K.O.s","Counters"},
royale_remain=function(n)return n.." Players Remain"end, royale_remain=function(n)return n.." Players Remain"end,
@@ -67,8 +74,11 @@ return{
setting_sound="Sound setting", setting_sound="Sound setting",
musicRoom="Music Room", musicRoom="Music Room",
nowPlaying="Now Playing:", nowPlaying="Now Playing:",
VKTchW="Touch weight",
VKOrgW="Origion weight",
VKCurW="CurPos weight",
actName={"Move Left:","Move Right:","Rotate Right:","Rotate Left:","Rotate Flip:","Hard Drop:","Soft Drop:","Hold:","Function:","Restart:","Instant Left:","Instant Right:","Ins Down:"}, actName=actName,
modeName={ modeName={
[0]="Custom", [0]="Custom",
"Sprint","Marathon","Master","Classic","Zen","Infinite","1v1","Round","TSD-only","Blind", "Sprint","Marathon","Master","Classic","Zen","Infinite","1v1","Round","TSD-only","Blind",
@@ -128,6 +138,8 @@ return{
"Powered by love2d", "Powered by love2d",
"Find out what's in the setting!", "Find out what's in the setting!",
"Any suggestions to author!", "Any suggestions to author!",
"DO NOT PRESS F8",
"Secret code:626",
"Techmino=Technique+Tetromino", "Techmino=Technique+Tetromino",
"CLASSIC SEXY RUSSIAN BLOCKS", "CLASSIC SEXY RUSSIAN BLOCKS",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI "LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
@@ -150,7 +162,8 @@ return{
"B2B:", "B2B:",
"PC:", "PC:",
"Efficiency:", "Efficiency:",
"Fineese:" "Finesse error:",
"Finesse rate:",
}, },
help={ help={
"I don't think you need \"help\".", "I don't think you need \"help\".",
@@ -211,11 +224,11 @@ Lib used:
start1="Clear Start", start1="Clear Start",
start2="Puzzle Start", start2="Puzzle Start",
draw="Draw(D)", draw="Draw(D)",
set1="40L", set1="40L(1)",
set2="1v1", set2="1v1(2)",
set3="infinite", set3="infinite(3)",
set4="blind", set4="blind(4)",
set5="master", set5="master(5)",
back=BK, back=BK,
}, },
draw={ draw={
@@ -253,7 +266,7 @@ Lib used:
sdarrD="-",sdarrU="+", sdarrD="-",sdarrU="+",
quickR="Quick restart", quickR="Quick restart",
swap="Combo key to change ATK mode", swap="Combo key to change ATK mode",
fine="Fineese error SFX", fine="Finesse error SFX",
ctrl="Key Setting", ctrl="Key Setting",
touch="Touch Setting", touch="Touch Setting",
back=BK, back=BK,
@@ -284,16 +297,32 @@ Lib used:
voc="VOC", voc="VOC",
back=BK, back=BK,
}, },
setting_control={ setting_key={
back=BK, back=BK,
}, },
setting_touch={ setting_touch={
hide=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end, hide="Show Virtual Key",
track="Auto track",
tkset="Track setting",
default="Defaults", default="Defaults",
snap=function()return text.snapLevelName[snapLevel]end, snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return setting.virtualkeyAlpha.."0%"end, alpha=function()return setting.VKAlpha.."0%"end,
icon="Icon", icon="Icon",
size="Size", size="Size",
toggle="Toggle",
back=BK,
},
setting_touchSwitch={
b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4],
b5= actName[5],b6=actName[6],b7=actName[7],b8=actName[8],
b9= actName[9],b10=actName[10],b11=actName[11],b12=actName[12],
b13=actName[13],b14=actName[14],b15=actName[15],b16=actName[16],
b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20],
norm="Normal",
pro="Professioanl",
back=BK,
},
setting_trackSetting={
back=BK, back=BK,
}, },
help={ help={

349
list.lua
View File

@@ -1,6 +1,13 @@
local mobile=system=="Android"or system=="iOS" local mobile=system=="Android"or system=="iOS"
actName={
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","func","restart","insLeft","insRight","insDown"} "moveLeft","moveRight",
"rotRight","rotLeft","rotFlip",
"hardDrop","softDrop",
"hold","func",
"restart",
"insLeft","insRight","insDown","down1","down4","down10",
"dropLeft","dropRight","addLeft","addRight",--Super contorl system
}
color={ color={
red={1,0,0}, red={1,0,0},
green={0,1,0}, green={0,1,0},
@@ -203,65 +210,76 @@ for i=1,7 do blocks[i+7]=blocks[i]end
local virtualkeySet={ local virtualkeySet={
{ {
{80,720-200,6400,80},--moveLeft {1, 80, 720-200, 80},--moveLeft
{320,720-200,6400,80},--moveRight {2, 320, 720-200, 80},--moveRight
{1280-80,720-200,6400,80},--rotRight {3, 1280-80, 720-200, 80},--rotRight
{1280-200,720-80,6400,80},--rotLeft {4, 1280-200, 720-80, 80},--rotLeft
{1280-200,720-320,6400,80},--rotFlip {5, 1280-200, 720-320, 80},--rotFlip
{200,720-320,6400,80},--hardDrop {6, 200, 720-320, 80},--hardDrop
{200,720-80,6400,80},--softDrop {7, 200, 720-80, 80},--softDrop
{1280-320,720-200,6400,80},--hold {8, 1280-320, 720-200, 80},--hold
{1280-80,280,6400,80},--func {9, 1280-80, 280, 80},--func
{80,280,6400,80},--restart {10,80, 280, 80},--restart
},--Farter's set 3 },--Farter's set,thanks
{ {
{1280-320,720-200,6400,80},--moveLeft {1, 1280-320, 720-200, 80},--moveLeft
{1280-80,720-200,6400,80},--moveRight {2, 1280-80, 720-200, 80},--moveRight
{200,720-80,6400,80},--rotRight {3, 200, 720-80, 80},--rotRight
{80,720-200,6400,80},--rotLeft {4, 80, 720-200, 80},--rotLeft
{200,720-320,6400,80},--rotFlip {5, 200, 720-320, 80},--rotFlip
{1280-200,720-320,6400,80},--hardDrop {6, 1280-200, 720-320, 80},--hardDrop
{1280-200,720-80,6400,80},--softDrop {7, 1280-200, 720-80, 80},--softDrop
{320,720-200,6400,80},--hold {8, 320, 720-200, 80},--hold
{80,280,6400,80},--func {9, 80, 280, 80},--func
{1280-80,280,6400,80},--restart {10,1280-80, 280, 80},--restart
},--Mirrored farter's set 3
},--Mirrored farter's set,sknaht
{ {
{80,720-80,6400,80},--moveLeft {1, 80, 720-80, 80},--moveLeft
{240,720-80,6400,80},--moveRight {2, 240, 720-80, 80},--moveRight
{1280-240,720-80,6400,80},--rotRight {3, 1280-240, 720-80, 80},--rotRight
{1280-400,720-80,6400,80},--rotLeft {4, 1280-400, 720-80, 80},--rotLeft
{1280-240,720-240,6400,80},--rotFlip {5, 1280-240, 720-240, 80},--rotFlip
{1280-80,720-80,6400,80},--hardDrop {6, 1280-80, 720-80, 80},--hardDrop
{1280-80,720-240,6400,80},--softDrop {7, 1280-80, 720-240, 80},--softDrop
{1280-80,720-400,6400,80},--hold {8, 1280-80, 720-400, 80},--hold
{80,360,6400,80},--func {9, 80, 360, 80},--func
{80,80,6400,80},--restart {10,80, 80, 80},--restart
},--Author's set },--Author's set,not recommend
{ {
{1280-400,720-80,6400,80},--moveLeft {1, 1280-400, 720-80, 80},--moveLeft
{1280-80,720-80,6400,80},--moveRight {2, 1280-80, 720-80, 80},--moveRight
{240,720-80,6400,80},--rotRight {3, 240, 720-80, 80},--rotRight
{80,720-80,6400,80},--rotLeft {4, 80, 720-80, 80},--rotLeft
{240,720-240,6400,80},--rotFlip {5, 240, 720-240, 80},--rotFlip
{1280-240,720-240,6400,80},--hardDrop {6, 1280-240, 720-240, 80},--hardDrop
{1280-240,720-80,6400,80},--softDrop {7, 1280-240, 720-80, 80},--softDrop
{1280-80,720-240,6400,80},--hold {8, 1280-80, 720-240, 80},--hold
{80,720-240,6400,80},--func {9, 80, 720-240, 80},--func
{80,320,6400,80},--restart {10,80, 320, 80},--restart
},--Keyboard set },--Keyboard set
{ {
{1200-370,40,1600,40},--moveLeft {10,70, 50,27},--restart
{1200-280,40,1600,40},--moveRight {9, 130, 50,27},--func
{1200-530,40,1600,40},--rotRight {4, 190, 50,27},--rotLeft
{1200-610,40,1600,40},--rotLeft {3, 250, 50,27},--rotRight
{1200-450,40,1600,40},--rotFlip {5, 310, 50,27},--rotFlip
{1200-50,40,1600,40},--hardDrop {1, 370, 50,27},--moveLeft
{1200-130,40,1600,40},--softDrop {2, 430, 50,27},--moveRight
{1200-210,40,1600,40},--hold {8, 490, 50,27},--hold
{1200-690,40,1600,40},--func {7, 550, 50,27},--softDrop1
{1200-770,40,1600,40},--restart {6, 610, 50,27},--hardDrop
},--PC key feedback {11,670, 50,27},--insLeft
{12,730, 50,27},--insRight
{13,790, 50,27},--insDown
{14,850, 50,27},--down1
{15,910, 50,27},--down4
{16,970, 50,27},--down10
{17,1030, 50,27},--dropLeft
{18,1090, 50,27},--dropRight
{19,1150, 50,27},--addLeft
{20,1210, 50,27},--addRight
},--PC key feedback(top&in a row)
} }
local customSet={ local customSet={
{20,20,1,1,7,1,1,1,3,4,1,2,3}, {20,20,1,1,7,1,1,1,3,4,1,2,3},
@@ -277,69 +295,79 @@ local function useDefaultSet(n)
curBG=customRange.bg[customSel[12]] curBG=customRange.bg[customSel[12]]
BGM(customRange.bgm[customSel[13]]) BGM(customRange.bgm[customSel[13]])
end end
local function VKAdisp(n)
return function()
return VK_org[n].ava
end
end
local function VKAcode(n)
return function()
VK_org[n].ava=not VK_org[n].ava
end
end
Widget={ Widget={
load={},intro={},quit={}, load={},intro={},quit={},
main={ main={
play= newButton(150,280,200,160,color.red, 60,function()gotoScene("mode")end, nil,"setting"), play= newButton(150,280,200,160,color.red, 60,function()scene.push()scene.swapTo("mode")end, nil,"setting"),
setting=newButton(370,280,200,160,color.lightBlue, 50,function()gotoScene("setting_game")end, nil,"music"), setting=newButton(370,280,200,160,color.lightBlue, 50,function()scene.push()scene.swapTo("setting_game")end, nil,"music"),
music= newButton(590,280,200,160,color.lightPurple,37,function()gotoScene("music")end, nil,"help"), music= newButton(590,280,200,160,color.lightPurple,37,function()scene.push()scene.swapTo("music")end, nil,"help"),
help= newButton(150,460,200,160,color.yellow, 55,function()gotoScene("help")end, nil,"stat"), help= newButton(150,460,200,160,color.yellow, 55,function()scene.push()scene.swapTo("help")end, nil,"stat"),
stat= newButton(370,460,200,160,color.cyan, 48,function()gotoScene("stat")end, nil,"qplay"), stat= newButton(370,460,200,160,color.cyan, 48,function()scene.push()scene.swapTo("stat")end, nil,"qplay"),
qplay= newButton(540,415,100,70,color.lightGreen, 28,function()loadGame(modeSel,levelSel)end, nil,"lang"), qplay= newButton(540,415,100,70,color.lightGreen, 28,function()scene.push()loadGame(modeSel,levelSel)end, nil,"lang"),
lang= newButton(590,505,200,70,color.lightRed, 50,function() lang= newButton(590,505,200,70,color.lightRed, 50,function()
setting.lang=setting.lang%#langName+1 setting.lang=setting.lang%#langName+1
swapLanguage(setting.lang) swapLanguage(setting.lang)
end,nil,"quit"), end,nil,"quit"),
quit= newButton(370,620,280,100,color.lightGrey, 60,function()gotoScene("quit")end, nil,"play"), quit= newButton(370,620,280,100,color.lightGrey, 60,function()scene.swapTo("quit")end, nil,"play"),
}, },
mode={ mode={
up= newButton(1000,210,200,140,color.white, 80,function()love.keypressed("up")end,function()return modeSel==1 end), up= newButton(1000, 210,200,140,color.white, 80,function()love.keypressed("up")end,function()return modeSel==1 end),
down= newButton(1000,430,200,140,color.white, 80,function()love.keypressed("down")end,function()return modeSel==#modeID end), down= newButton(1000, 430,200,140,color.white, 80,function()love.keypressed("down")end,function()return modeSel==#modeID end),
left= newButton(190, 160,100,80, color.white,40,function()love.keypressed("left")end,function()return levelSel==1 end), left= newButton(190, 160,100,80, color.white, 40,function()love.keypressed("left")end,function()return levelSel==1 end),
right= newButton(350, 160,100,80, color.white,40,function()love.keypressed("right")end,function()return levelSel==#modeLevel[modeID[modeSel]]end), right= newButton(350, 160,100,80, color.white, 40,function()love.keypressed("right")end,function()return levelSel==#modeLevel[modeID[modeSel]]end),
start= newButton(1000,600,250,100,color.green, 50,function()loadGame(modeSel,levelSel)end), start= newButton(1000, 600,250,100,color.green, 50,function()scene.push()loadGame(modeSel,levelSel)end),
custom= newButton(275, 420,200,90, color.yellow,40,function()gotoScene("custom")end), custom= newButton(275, 420,200,90, color.yellow, 40,function()scene.push()scene.swapTo("custom")end),
back= newButton(640, 630,230,90, color.white,45,back), back= newButton(640, 630,230,90, color.white, 45,scene.back),
}, },
music={ music={
bgm= newSlider(760,80,400,8,40,nil,function()return setting.bgm end,function(i)setting.bgm=i;BGM(bgmPlaying)end), bgm= newSlider(760, 80,400,8,40,nil,function()return setting.bgm end,function(i)setting.bgm=i;BGM(bgmPlaying)end),
up= newButton(1100,200,120,120,color.white,60,function()love.keypressed("up")end), up= newButton(1100, 200,120,120,color.white,60,function()love.keypressed("up")end),
play= newButton(1100,340,120,120,color.white,40,function()love.keypressed("space")end,function()return setting.bgm==0 end), play= newButton(1100, 340,120,120,color.white,40,function()love.keypressed("space")end,function()return setting.bgm==0 end),
down= newButton(1100,480,120,120,color.white,60,function()love.keypressed("down")end), down= newButton(1100, 480,120,120,color.white,60,function()love.keypressed("down")end),
back= newButton(640, 630,230,90, color.white,45,back), back= newButton(640, 630,230,90, color.white,45,scene.back),
}, },
custom={ custom={
up= newButton(1000,220,100,100,color.white, 50,function()sel=(sel-2)%#customID+1 end), up= newButton(1000, 220,100,100,color.white, 50,function()sel=(sel-2)%#customID+1 end),
down= newButton(1000,460,100,100,color.white, 50,function()sel=sel%#customID+1 end), down= newButton(1000, 460,100,100,color.white, 50,function()sel=sel%#customID+1 end),
left= newButton(880, 340,100,100,color.white, 50,function()love.keypressed("left")end), left= newButton(880, 340,100,100,color.white, 50,function()love.keypressed("left")end),
right= newButton(1120,340,100,100,color.white, 50,function()love.keypressed("right")end), right= newButton(1120, 340,100,100,color.white, 50,function()love.keypressed("right")end),
start1= newButton(880, 580,220,70, color.green, 40,function()loadGame(0,1)end), start1= newButton(880, 580,220,70, color.green, 40,function()scene.push()loadGame(0,1)end),
start2= newButton(1120,580,220,70, color.lightPurple, 40,function()loadGame(0,2)end), start2= newButton(1120, 580,220,70, color.lightPurple, 40,function()scene.push()loadGame(0,2)end),
draw= newButton(1000,90, 190,85, color.cyan, 40,function()gotoScene("draw")end), draw= newButton(1000, 90, 190,85, color.cyan, 40,function()scene.push()scene.swapTo("draw")end),
set1= newButton(640, 160,240,75, color.lightRed, 40,function()useDefaultSet(1)end), set1= newButton(640, 160,240,75, color.lightRed, 40,function()useDefaultSet(1)end),
set2= newButton(640, 250,240,75, color.lightRed, 40,function()useDefaultSet(2)end), set2= newButton(640, 250,240,75, color.lightRed, 40,function()useDefaultSet(2)end),
set3= newButton(640, 340,240,75, color.lightRed, 40,function()useDefaultSet(3)end), set3= newButton(640, 340,240,75, color.lightRed, 40,function()useDefaultSet(3)end),
set4= newButton(640, 430,240,75, color.lightRed, 40,function()useDefaultSet(4)end), set4= newButton(640, 430,240,75, color.lightRed, 40,function()useDefaultSet(4)end),
set5= newButton(640, 520,240,75, color.lightRed, 40,function()useDefaultSet(5)end), set5= newButton(640, 520,240,75, color.lightRed, 40,function()useDefaultSet(5)end),
back= newButton(640, 630,180,60, color.white, 40,back), back= newButton(640, 630,180,60, color.white, 40,scene.back),
}, },
draw={ draw={
any= newButton(700, 80, 120,120,color.lightGrey, 45,function()pen=0 end), block1= newButton(920, 80, 120,120,color.red, 65,function()pen=1 end),
block1= newButton(840, 80, 120,120,color.red, 65,function()pen=1 end), block2= newButton(1060, 80, 120,120,color.green, 65,function()pen=2 end),
block2= newButton(980, 80, 120,120,color.green, 65,function()pen=2 end), block3= newButton(1200, 80, 120,120,color.orange, 65,function()pen=3 end),
block3= newButton(1120,80, 120,120,color.orange, 65,function()pen=3 end), block4= newButton(920, 220,120,120,color.blue, 65,function()pen=4 end),
block4= newButton(840, 220,120,120,color.blue, 65,function()pen=4 end), block5= newButton(1060, 220,120,120,color.magenta, 65,function()pen=5 end),
block5= newButton(980, 220,120,120,color.magenta, 65,function()pen=5 end), block6= newButton(1200, 220,120,120,color.yellow, 65,function()pen=6 end),
block6= newButton(1120,220,120,120,color.yellow, 65,function()pen=6 end), block7= newButton(920, 360,120,120,color.cyan, 65,function()pen=7 end),
block7= newButton(840, 360,120,120,color.cyan, 65,function()pen=7 end), gb1= newButton(1060, 360,120,120,color.darkGrey, 65,function()pen=9 end),
gb1= newButton(980, 360,120,120,color.darkGrey, 65,function()pen=9 end), gb2= newButton(1200, 360,120,120,color.grey, 65,function()pen=10 end),
gb2= newButton(1120,360,120,120,color.grey, 65,function()pen=10 end), gb3= newButton(920, 500,120,120,color.darkPurple, 65,function()pen=11 end),
gb3= newButton(840, 500,120,120,color.darkPurple, 65,function()pen=11 end), gb4= newButton(1060, 500,120,120,color.darkRed, 65,function()pen=12 end),
gb4= newButton(980, 500,120,120,color.darkRed, 65,function()pen=12 end), gb5= newButton(1200, 500,120,120,color.darkGreen, 65,function()pen=13 end),
gb5= newButton(1120,500,120,120,color.darkGreen, 65,function()pen=13 end), clear= newButton(780, 80, 120,120,color.white, 45,function()love.keypressed("delete")end),
space= newButton(840, 640,120,120,color.grey, 70,function()pen=-1 end), any= newButton(780, 220,120,120,color.lightGrey, 45,function()pen=0 end),
clear= newButton(1120,640,120,120,color.white, 45,function()love.keypressed("delete")end), space= newButton(780, 360,120,120,color.grey, 70,function()pen=-1 end),
back= newButton(1235,45, 80, 80, color.white, 35,back), back= newButton(1200, 640,120,120,color.white, 40,scene.back),
}, },
play={ play={
pause= newButton(1235,45,80,80,color.white,30,pauseGame), pause= newButton(1235,45,80,80,color.white,30,pauseGame),
@@ -350,15 +378,15 @@ Widget={
clearTask("play") clearTask("play")
updateStat() updateStat()
resetGameData() resetGameData()
gotoScene("play","none") scene.swapTo("play","none")
end), end),
quit= newButton(640,600,240,100,color.white,50,back), quit= newButton(640,600,240,100,color.white,50,scene.back),
}, },
setting_game={ setting_game={
graphic=newButton(200,80,240,80,color.lightGreen,40,function()gotoScene("setting_graphic")end, nil,"sound"), graphic=newButton(200,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_graphic")end, nil,"sound"),
sound= newButton(1080,80,240,80,color.lightGreen,40,function()gotoScene("setting_sound")end, nil,"dasD"), sound= newButton(1080,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_sound")end, nil,"dasD"),
dasD= newButton(180,230,50,50,color.white,40,function()setting.das=(setting.das-1)%31 end,nil,"dasU"), dasD= newButton(180,230,50,50,color.white,40,function()setting.das=(setting.das-1)%31 end, nil,"dasU"),
dasU= newButton(400,230,50,50,color.white,40,function()setting.das=(setting.das+1)%31 end,nil,"arrD"), dasU= newButton(400,230,50,50,color.white,40,function()setting.das=(setting.das+1)%31 end, nil,"arrD"),
arrD= newButton(500,230,50,50,color.white,40,function() arrD= newButton(500,230,50,50,color.white,40,function()
setting.arr=(setting.arr-1)%16 setting.arr=(setting.arr-1)%16
if setting.arr>setting.das then if setting.arr>setting.das then
@@ -382,13 +410,13 @@ Widget={
quickR= newSwitch(560,430,40,function()return setting.quickR end,function()setting.quickR=not setting.quickR end, nil,"swap"), quickR= newSwitch(560,430,40,function()return setting.quickR end,function()setting.quickR=not setting.quickR end, nil,"swap"),
swap= newSwitch(560,510,25,function()return setting.swap end,function()setting.swap=not setting.swap end, nil,"fine"), swap= newSwitch(560,510,25,function()return setting.swap end,function()setting.swap=not setting.swap end, nil,"fine"),
fine= newSwitch(560,590,25,function()return setting.fine end,function()setting.fine=not setting.fine end, nil,"ctrl"), fine= newSwitch(560,590,25,function()return setting.fine end,function()setting.fine=not setting.fine end, nil,"ctrl"),
ctrl= newButton(1020,230,320,80,color.white,40,function()gotoScene("setting_control")end, nil,"touch"), ctrl= newButton(1020,230,320,80,color.white,40,function()scene.push()scene.swapTo("setting_key")end, nil,"touch"),
touch= newButton(1020,340,320,80,color.white,40,function()gotoScene("setting_touch")end, nil,"back"), touch= newButton(1020,340,320,80,color.white,40,function()scene.push()scene.swapTo("setting_touch")end, nil,"back"),
back= newButton(1160,600,160,160,color.white,55,back,nil,"graphic"), back= newButton(1160,600,160,160,color.white,55,scene.back,nil,"graphic"),
}, },
setting_graphic={ setting_graphic={
sound= newButton(200,80,240,80,color.lightGreen,40,function()gotoScene("setting_sound")end, nil,"game"), sound= newButton(200,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_sound")end, nil,"game"),
game= newButton(1080,80,240,80,color.lightGreen,40,function()gotoScene("setting_game")end, nil,"ghost"), game= newButton(1080,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_game")end, nil,"ghost"),
ghost= newSwitch(310,180,40,function()return setting.ghost end, function()setting.ghost= not setting.ghost end, nil,"center"), ghost= newSwitch(310,180,40,function()return setting.ghost end, function()setting.ghost= not setting.ghost end, nil,"center"),
center= newSwitch(580,180,40,function()return setting.center end, function()setting.center= not setting.center end, nil,"smo"), center= newSwitch(580,180,40,function()return setting.center end, function()setting.center= not setting.center end, nil,"smo"),
smo= newSwitch(310,260,25,function()return setting.smo end, function()setting.smo= not setting.smo end, nil,"grid"), smo= newSwitch(310,260,25,function()return setting.smo end, function()setting.smo= not setting.smo end, nil,"grid"),
@@ -412,65 +440,110 @@ Widget={
setting.skin=setting.skin%8+1 setting.skin=setting.skin%8+1
changeBlockSkin(setting.skin) changeBlockSkin(setting.skin)
end,nil,"back"), end,nil,"back"),
back= newButton(1160,600,160,160,color.white,55,back,nil,"sound"), back= newButton(1160,600,160,160,color.white,55,scene.back,nil,"sound"),
}, },
setting_sound={ setting_sound={
game= newButton(200,80,240,80,color.lightGreen,40,function()gotoScene("setting_game")end, nil,"graphic"), game= newButton(200,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_game")end, nil,"graphic"),
graphic=newButton(1080,80,240,80,color.lightGreen,40,function()gotoScene("setting_graphic")end, nil,"sfx"), graphic=newButton(1080,80,240,80,color.lightGreen,40,function()scene.swapTo("setting_graphic")end, nil,"sfx"),
sfx=newSlider(180,250,400,8,40,function()SFX("blip_1")end, function()return setting.sfx end,function(i)setting.sfx=i end,nil,"bgm"), sfx=newSlider(180,250,400,8,40,function()SFX("blip_1")end, function()return setting.sfx end,function(i)setting.sfx=i end,nil,"bgm"),
bgm=newSlider(750,250,400,8,40,function()BGM(bgmPlaying or"blank")end, function()return setting.bgm end,function(i)setting.bgm=i end,nil,"vib"), bgm=newSlider(750,250,400,8,40,function()BGM(bgmPlaying or"blank")end, function()return setting.bgm end,function(i)setting.bgm=i end,nil,"vib"),
vib=newSlider(180,440,400,5,40,function()VIB(1)end, function()return setting.vib end,function(i)setting.vib=i end,nil,"voc"), vib=newSlider(180,440,400,5,40,function()VIB(1)end, function()return setting.vib end,function(i)setting.vib=i end,nil,"voc"),
voc=newSlider(750,440,400,8,40,function()VOICE("nya")end, function()return setting.voc end,function(i)setting.voc=i end,nil,"back"), voc=newSlider(750,440,400,8,40,function()VOICE("nya")end, function()return setting.voc end,function(i)setting.voc=i end,nil,"back"),
back=newButton(1160,600,160,160,color.white,55,back,nil,"game"), back=newButton(1160,600,160,160,color.white,55,scene.back,nil,"game"),
}, },
setting_control={ setting_key={
back=newButton(840,630,180,60,color.white,40,back), back=newButton(1140,650,200,80,color.white,50,scene.back),
}, },
setting_touch={ setting_touch={
hide= newButton(640,210,500,80,color.white,45,function() hide= newSwitch(810,140,45,function()return setting.VKSwitch end,function()setting.VKSwitch=not setting.VKSwitch end),
setting.virtualkeySwitch=not setting.virtualkeySwitch track= newSwitch(810,220,45,function()return setting.VKTrack end,function()setting.VKTrack=not setting.VKTrack end),
end), tkset= newButton(450,220,170,80,color.white,30,function()
default=newButton(450,310,170,80,color.white,40,function() scene.push()
for K=1,#virtualkey do scene.swapTo("setting_trackSetting")
local b,b0=virtualkey[K],virtualkeySet[defaultSel][K] end,function()return not setting.VKTrack end),
b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4] default=newButton(450,320,170,80,color.white,40,function()
end--Default virtualkey local D=virtualkeySet[defaultSel]
for i=1,#VK_org do
VK_org[i].ava=false
end
for n=1,#D do
local T=D[n]
if T[1]then
local B=VK_org[n]
B.ava=true
B.x,B.y,B.r=T[2],T[3],T[4]
end
end--Replace keys
defaultSel=defaultSel%5+1 defaultSel=defaultSel%5+1
end), end),
snap= newButton(640,310,170,80,color.white,40,function() snap= newButton(640,320,170,80,color.white,40,function()
snapLevel=snapLevel%6+1 snapLevel=snapLevel%6+1
end), end),
alpha= newButton(830,310,170,80,color.white,45,function() --VK=T,70,50,27/T,130,50,27/T,190,50,27/T,250,50,27/T,310,50,27/T,370,50,27/T,430,50,27/T,490,50,27/T,550,50,27/T,610,50,27/T,670,50,27/T,730,50,27/T,790,50,27/T,850,50,27/T,910,50,27/T,970,50,27/T,739,789,897/T,1090,50,27/T,1150,50,27/T,1210,50,27
setting.virtualkeyAlpha=(setting.virtualkeyAlpha+1)%11 alpha= newButton(830,320,170,80,color.white,45,function()
setting.VKAlpha=(setting.VKAlpha+1)%11
--Adjust virtualkey alpha --Adjust virtualkey alpha
end), end),
icon= newButton(450,410,170,80,color.white,45,function() icon= newButton(495,420,260,80,color.white,45,function()
setting.virtualkeyIcon=not setting.virtualkeyIcon setting.VKIcon=not setting.VKIcon
--Switch virtualkey icon --Switch virtualkey icon
end), end),
size= newButton(830,410,170,80,color.white,45,function() size= newButton(785,420,260,80,color.white,45,function()
if sel then if sel then
local b=virtualkey[sel] local B=VK_org[sel]
b[4]=b[4]+10 B.r=B.r+10
if b[4]==150 then b[4]=40 end if B.r>=150 then B.r=B.r-110 end
b[3]=b[4]^2
end end
end), end),
back= newButton(640,410,170,80,color.white,45,back), toggle= newButton(495,520,260,80,color.white,45,function()
scene.push()
scene.swapTo("setting_touchSwitch")
end),
back= newButton(785,520,260,80,color.white,45,scene.back),
},
setting_touchSwitch={
b1= newSwitch(300,80, 40,VKAdisp(1),VKAcode(1)),
b2= newSwitch(300,140, 40,VKAdisp(2),VKAcode(2)),
b3= newSwitch(300,200, 40,VKAdisp(3),VKAcode(3)),
b4= newSwitch(300,260, 40,VKAdisp(4),VKAcode(4)),
b5= newSwitch(300,320, 40,VKAdisp(5),VKAcode(5)),
b6= newSwitch(300,380, 40,VKAdisp(6),VKAcode(6)),
b7= newSwitch(300,440, 40,VKAdisp(7),VKAcode(7)),
b8= newSwitch(300,500, 40,VKAdisp(8),VKAcode(8)),
b9= newSwitch(300,560, 40,VKAdisp(9),VKAcode(9)),
b10= newSwitch(300,620, 40,VKAdisp(10),VKAcode(10)),
b11= newSwitch(760,80, 40,VKAdisp(11),VKAcode(11)),
b12= newSwitch(760,140, 40,VKAdisp(12),VKAcode(12)),
b13= newSwitch(760,200, 40,VKAdisp(13),VKAcode(13)),
b14= newSwitch(760,260, 40,VKAdisp(14),VKAcode(14)),
b15= newSwitch(760,320, 40,VKAdisp(15),VKAcode(15)),
b16= newSwitch(760,380, 40,VKAdisp(16),VKAcode(16)),
b17= newSwitch(760,440, 40,VKAdisp(17),VKAcode(17)),
b18= newSwitch(760,500, 40,VKAdisp(18),VKAcode(18)),
b19= newSwitch(760,560, 40,VKAdisp(19),VKAcode(19)),
b20= newSwitch(760,620, 40,VKAdisp(20),VKAcode(20)),
norm= newButton(1080,150,240,80,color.white,50,function()for i=1,20 do VK_org[i].ava=i<11 end end),
pro= newButton(1080,300,240,80,color.white,40,function()for i=1,20 do VK_org[i].ava=true end end),
back= newButton(1080,600,240,80,color.white,50,scene.back),
},
setting_trackSetting={
VKTchW= newSlider(140,310,1000,10,40,nil,function()return setting.VKTchW end,function(i)setting.VKTchW=i;setting.VKCurW=math.max(setting.VKCurW,i)end),
VKCurW= newSlider(140,370,1000,10,40,nil,function()return setting.VKCurW end,function(i)setting.VKCurW=i;setting.VKTchW=math.min(setting.VKTchW,i)end),
back= newButton(1080,600,240,80,color.white,50,scene.back),
}, },
help={ help={
his= newButton(1050,520,230,60,color.white,40,function()gotoScene("history")end,nil,"back"), his= newButton(1050,520,230,60,color.white,40,function()scene.push()scene.swapTo("history")end,nil,"back"),
qq= newButton(1050,600,230,60,color.white,40,function()love.system.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end, function()return mobile end,"his"), qq= newButton(1050,600,230,60,color.white,40,function()love.system.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end, function()return mobile end,"his"),
back= newButton(640, 600,180,60,color.white,40,back,nil,"qq"), back= newButton(640, 600,180,60,color.white,40,scene.back,nil,"qq"),
}, },
history={ history={
prev= newButton(1155,170,180,180,color.white,70,function()love.keypressed("up")end,function()return sel==1 end), prev= newButton(1155,170,180,180,color.white,70,function()love.keypressed("up")end,function()return sel==1 end),
next= newButton(1155,400,180,180,color.white,70,function()love.keypressed("down")end,function()return sel==#updateLog-22 end), next= newButton(1155,400,180,180,color.white,70,function()love.keypressed("down")end,function()return sel==#updateLog-22 end),
back= newButton(1155,600,180,90,color.white,40,back), back= newButton(1155,600,180,90,color.white,40,scene.back),
}, },
stat={ stat={
path= newButton(980,620,250,60,color.white,30,function()love.system.openURL(love.filesystem.getSaveDirectory())end,function()return mobile end,"back"), path= newButton(980,620,250,60,color.white,30,function()love.system.openURL(love.filesystem.getSaveDirectory())end,function()return mobile end,"back"),
back= newButton(640,620,180,60,color.white,40,back,nil,"path"), back= newButton(640,620,180,60,color.white,40,scene.back,nil,"path"),
}, },
} }
for S,L in next,Widget do for S,L in next,Widget do

523
main.lua
View File

@@ -14,21 +14,26 @@ NULL=function()end
system=sys.getOS() system=sys.getOS()
local xOy=love.math.newTransform() local xOy=love.math.newTransform()
local mx,my,mouseShow=-20,-20,false local mx,my,mouseShow=-20,-20,false
local touching--1st touching ID local touching--第一触摸ID
modeSel,levelSel=1,3--Initialize mode selection local devMode=0
modeSel,levelSel=1,3--初始模式选择
players={alive={},human=0} players={alive={},human=0}
scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1} scr={x=0,y=0,w=gc.getWidth(),h=gc.getHeight(),k=1}
local scr=scr local scr=scr
scene=""
curBG="none" curBG="none"
bgmPlaying=nil bgmPlaying=nil
voiceQueue={free=0} voiceQueue={free=0}
local devMode=0 virtualkeyDown,virtualkeyPressTime={},{}
for i=1,20 do
virtualkeyDown[i]=X
virtualkeyPressTime[i]=0
end
kb.setKeyRepeat(true) kb.setKeyRepeat(true)
kb.setTextInput(false) kb.setTextInput(false)
ms.setVisible(false) ms.setVisible(false)
--Application Vars
------------------------------------------------------------- -------------------------------------------------------------
local Fonts={} local Fonts={}
function setFont(s) function setFont(s)
@@ -50,96 +55,9 @@ for i=1,10 do preField[i]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}end
for i=11,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end for i=11,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
freeRow={L=40}for i=1,40 do freeRow[i]={0,0,0,0,0,0,0,0,0,0}end freeRow={L=40}for i=1,40 do freeRow[i]={0,0,0,0,0,0,0,0,0,0}end
--Game system Vars --Game system Vars
setting={
das=10,arr=2,
sddas=0,sdarr=2,
quickR=true,swap=true,
fine=false,
--game
ghost=true,center=true,
smo=true,grid=false,
dropFX=3,
shakeFX=3,
atkFX=3,
frameMul=100,
--
fullscreen=false,
bg=true,
bgblock=true,
lang=1,
skin=1,
--graphic
sfx=8,bgm=6,
vib=3,voc=0,
--sound
keyMap={
{"left","right","x","z","c","up","down","space","tab","r","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},--keyboard
{"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","x","leftshoulder","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},
{"","","","","","","","","","","","",""},--joystick
},
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,
--control
}
stat={
run=0,game=0,time=0,
extraPiece=0,extraRate=0,
key=0,rotate=0,hold=0,piece=0,row=0,
atk=0,send=0,recv=0,pend=0,
clear_1=0,clear_2=0,clear_3=0,clear_4=0,
spin_0=0,spin_1=0,spin_2=0,spin_3=0,
b2b=0,b3b=0,pc=0,score=0,
}
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,360,6400,80},--func
{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
]]
}
virtualkeyDown={X,X,X,X,X,X,X,X,X,X}
virtualkeyPressTime={0,0,0,0,0,0,0,0,0,0,0,0,0}
--User datas&settings
------------------------------------------------------------- -------------------------------------------------------------
scene=require("scene")
require("default_data")
require("class") require("class")
require("ai") require("ai")
require("toolfunc") require("toolfunc")
@@ -202,100 +120,14 @@ local function getNewBlock()
FX_BGblock.next=FX_BGblock.next%7+1 FX_BGblock.next=FX_BGblock.next%7+1
return t return t
end end
local sceneInit={
load=function()
loading=1--Loading mode
loadnum=1--Loading counter
loadprogress=0--Loading bar(0~1)
loadTip=text.tips[rnd(#text.tips)]
end,
intro=function()
count=0
BGM("blank")
updatePowerInfo()
end,
main=function()
modeEnv={}
if not players[1]then
newDemoPlayer(1,900,35,1.1)
end--create demo player
collectgarbage()
end,
music=function()
if bgmPlaying then
for i=1,#musicID do
if musicID[i]==bgmPlaying then
sel=i
return
end
end
else
sel=1
end
end,
mode=function()
curBG="none"
destroyPlayers()
BGM("blank")
end,
custom=function()
sel=sel or 1
destroyPlayers()
curBG=customRange.bg[customSel[12]]
BGM(customRange.bgm[customSel[13]])
end,
draw=function()
curBG="none"
clearSureTime=0
pen,sx,sy=1,1,1
end,
play=function()
kb.setKeyRepeat(false)
restartCount=0
if needResetGameData then
resetGameData()
needResetGameData=nil
end
end,
pause=function()
end,
setting_game=function()
curBG="none"
end,
setting_control=function()
curBoard=1
keyboardSet=1
joystickSet=1
keyboardSetting=false
joystickSetting=false
end,
setting_touch=function()
curBG="game1"
defaultSel=1
sel=nil
snapLevel=1
end,
help=function()
curBG="none"
end,
history=function()
updateLog=require"updateLog"
curBG="lightGrey"
sel=1
end,
quit=function()
love.timer.sleep(.3)
love.event.quit()
end,
}
local function onVirtualkey(x,y) local function onVirtualkey(x,y)
local d2,nearest,distance local d1,nearest,distance
for K=1,#virtualkey do for K=1,#virtualkey do
local b=virtualkey[K] local b=virtualkey[K]
d2=(x-b[1])^2+(y-b[2])^2 d1=(x-b.x)^2+(y-b.y)^2
if d2<b[3]then if d1<b.r^2 then
if not nearest or d2<distance then if not nearest or d1<distance then
nearest,distance=K,d2 nearest,distance=K,d1
end end
end end
end end
@@ -326,19 +158,22 @@ local keyDown,keyUp={},{}
local gamepadDown,gamepadUp={},{} local gamepadDown,gamepadUp={},{}
function mouseDown.intro(x,y,k) function mouseDown.intro(x,y,k)
if k==2 then if k==2 then
back() scene.back()
else else
gotoScene("main") scene.push()
scene.swapTo("main")
end end
end end
function touchDown.intro(id,x,y) function touchDown.intro(id,x,y)
gotoScene("main") scene.push()
scene.swapTo("main")
end end
function keyDown.intro(key) function keyDown.intro(key)
if key=="escape"then if key=="escape"then
back() scene.back()
else else
gotoScene("main") scene.push()
scene.swapTo("main")
end end
end end
@@ -368,11 +203,12 @@ function keyDown.mode(key)
levelSel=levelSel+1 levelSel=levelSel+1
end end
elseif key=="return"then elseif key=="return"then
loadGame(modeSel,levelSel) scene.push()loadGame(modeSel,levelSel)
elseif key=="c"then elseif key=="c"then
gotoScene("custom") scene.push()
scene.swapTo("custom")
elseif key=="escape"then elseif key=="escape"then
back() scene.back()
end end
end end
@@ -395,7 +231,7 @@ function keyDown.music(key)
BGM() BGM()
end end
elseif key=="escape"then elseif key=="escape"then
back() scene.back()
end end
end end
@@ -419,13 +255,24 @@ function keyDown.custom(key)
elseif key=="up"then elseif key=="up"then
sel=(sel-2)%#customID+1 sel=(sel-2)%#customID+1
elseif key=="d"then elseif key=="d"then
gotoScene("draw") scene.push()
scene.swapTo("draw")
elseif key=="return"then elseif key=="return"then
loadGame(0,1) scene.push()loadGame(0,1)
elseif key=="space"then elseif key=="space"then
loadGame(0,2) scene.push()loadGame(0,2)
elseif key=="1"then
Widget.custom.set1.code()
elseif key=="2"then
Widget.custom.set2.code()
elseif key=="3"then
Widget.custom.set3.code()
elseif key=="4"then
Widget.custom.set4.code()
elseif key=="5"then
Widget.custom.set5.code()
elseif key=="escape"then elseif key=="escape"then
back() scene.back()
end end
end end
@@ -488,97 +335,127 @@ function keyDown.draw(key)
elseif key=="backspace"or key=="lalt"then elseif key=="backspace"or key=="lalt"then
pen=0 pen=0
elseif key=="escape"then elseif key=="escape"then
back() scene.back()
else else
pen=string.find("123qwea#sdzxc",key)or pen pen=string.find("123qwea#sdzxc",key)or pen
end end
end end
function keyDown.setting_control(key) function keyDown.setting_key(key)
if key=="escape"then if key=="escape"then
if keyboardSetting then if keyboardSetting then
keyboardSetting=false keyboardSetting=false
SFX("error",.5)
else else
back() scene.back()
end end
elseif keyboardSetting then elseif keyboardSetting then
for l=1,8 do for l=1,8 do
for y=1,13 do for y=1,20 do
if setting.keyMap[l][y]==key then if setting.keyMap[l][y]==key then
setting.keyMap[l][y]="" setting.keyMap[l][y]=""
end end
end end
end end
setting.keyMap[curBoard][keyboardSet]=key setting.keyMap[curBoard][keyboardSet]=key
SFX("reach",.5)
keyboardSetting=false keyboardSetting=false
elseif key=="return"then elseif key=="return"then
keyboardSetting=true keyboardSetting=true
SFX("lock",.5)
elseif key=="up"then elseif key=="up"then
keyboardSet=max(keyboardSet-1,1) if keyboardSet>1 then
keyboardSet=keyboardSet-1
SFX("move",.5)
end
elseif key=="down"then elseif key=="down"then
keyboardSet=min(keyboardSet+1,13) if keyboardSet<20 then
keyboardSet=keyboardSet+1
SFX("move",.5)
end
elseif key=="left"then elseif key=="left"then
curBoard=max(curBoard-1,1) if curBoard>1 then
curBoard=curBoard-1
SFX("rotate",.5)
end
elseif key=="right"then elseif key=="right"then
curBoard=min(curBoard+1,8) if curBoard<8 then
curBoard=curBoard+1
SFX("rotate",.5)
end
end end
end end
function gamepadDown.setting_control(key) function gamepadDown.setting_key(key)
if key=="back"then if key=="back"then
if joystickSetting then if joystickSetting then
joystickSetting=false joystickSetting=false
SFX("error",.5)
else else
back() scene.back()
end end
elseif joystickSetting then elseif joystickSetting then
for l=9,16 do for l=9,16 do
for y=1,12 do for y=1,20 do
if setting.keyMap[l][y]==key then if setting.keyMap[l][y]==key then
setting.keyMap[l][y]="" setting.keyMap[l][y]=""
end end
end end
end end
setting.keyMap[8+curBoard][joystickSet]=key setting.keyMap[8+curBoard][joystickSet]=key
SFX("reach",.5)
joystickSetting=false joystickSetting=false
elseif key=="start"then elseif key=="start"then
joystickSetting=true joystickSetting=true
SFX("lock",.5)
elseif key=="up"then elseif key=="up"then
joystickSet=max(joystickSet-1,1) if joystickSet>1 then
joystickSet=joystickSet-1
SFX("move",.5)
end
elseif key=="down"then elseif key=="down"then
joystickSet=min(joystickSet+1,12) if joystickSet<20 then
joystickSet=joystickSet+1
SFX("move",.5)
end
elseif key=="left"then elseif key=="left"then
curBoard=max(curBoard-1,1) if curBoard>1 then
curBoard=curBoard-1
SFX("rotate",.5)
end
elseif key=="right"then elseif key=="right"then
curBoard=min(curBoard+1,8) if curBoard<8 then
curBoard=curBoard+1
SFX("rotate",.5)
end
end end
end end
function mouseDown.setting_touch(x,y,k) function mouseDown.setting_touch(x,y,k)
if k==2 then back()end if k==2 then scene.back()end
for K=1,#virtualkey do for K=1,#VK_org do
local b=virtualkey[K] local B=VK_org[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then if (x-B.x)^2+(y-B.y)^2<B.r^2 then
sel=K sel=K
end end
end end
end end
function mouseMove.setting_touch(x,y,dx,dy) function mouseMove.setting_touch(x,y,dx,dy)
if sel and ms.isDown(1)then if sel and ms.isDown(1)then
local b=virtualkey[sel] local B=VK_org[sel]
b[1],b[2]=b[1]+dx,b[2]+dy B.x,B.y=B.x+dx,B.y+dy
end end
end end
function mouseUp.setting_touch(x,y,k) function mouseUp.setting_touch(x,y,k)
if sel then if sel then
local b=virtualkey[sel] local B=VK_org[sel]
local k=snapLevelValue[snapLevel] local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k B.x,B.y=int(B.x/k+.5)*k,int(B.y/k+.5)*k
end end
end end
function touchDown.setting_touch(id,x,y) function touchDown.setting_touch(id,x,y)
for K=1,#virtualkey do for K=1,#VK_org do
local b=virtualkey[K] local B=VK_org[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then if (x-B.x)^2+(y-B.y)^2<B.r^2 then
sel=K sel=K
end end
end end
@@ -587,43 +464,60 @@ function touchUp.setting_touch(id,x,y)
if sel then if sel then
x,y=xOy:inverseTransformPoint(x,y) x,y=xOy:inverseTransformPoint(x,y)
if sel then if sel then
local b=virtualkey[sel] local B=VK_org[sel]
local k=snapLevelValue[snapLevel] local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k B.x,B.y=int(B.x/k+.5)*k,int(B.y/k+.5)*k
end end
end end
end end
function touchMove.setting_touch(id,x,y,dx,dy) function touchMove.setting_touch(id,x,y,dx,dy)
if sel then if sel then
local b=virtualkey[sel] local B=VK_org[sel]
b[1],b[2]=b[1]+dx,b[2]+dy B.x,B.y=B.x+dx,B.y+dy
end end
end end
function keyDown.pause(key) function keyDown.pause(key)
if key=="escape"then if key=="escape"then
back() scene.back()
elseif key=="return"or key=="space"then elseif key=="return"or key=="space"then
resumeGame() resumeGame()
elseif key=="r"and kb.isDown("lctrl","rctrl")then elseif key=="r"and kb.isDown("lctrl","rctrl")then
clearTask("play") clearTask("play")
updateStat() updateStat()
resetGameData() resetGameData()
gotoScene("play","none") scene.swapTo("play","none")
end--Restart with ctrl+R end--Ctrl+R重开
end end
function touchDown.play(id,x,y) function touchDown.play(id,x,y)
if setting.virtualkeySwitch then if setting.VKSwitch then
local t=onVirtualkey(x,y) local t=onVirtualkey(x,y)
if t then if t then
players[1]:pressKey(t) players[1]:pressKey(t)
if setting.VKTrack then
local B=virtualkey[t]
for i=1,#virtualkey do
local b=virtualkey[i]
local d=B.r+b.r-((B.x-b.x)^2+(B.y-b.y)^2)^.5--碰撞深度(负数=间隔距离)
if d>0 then
b.x=b.x+(b.x-B.x)*d*b.r*.00005
b.y=b.y+(b.y-B.y)*d*b.r*.00005
end
end
--按钮软碰撞(做不来hhh随便做一个,效果还行!)
local O=VK_org[t]
local _FW,_CW=setting.VKTchW*.1,1-setting.VKCurW*.1
local _OW=1-_FW-_CW
B.x,B.y=x*_FW+B.x*_CW+O.x*_OW,y*_FW+B.y*_CW+O.y*_OW
--按钮自动跟随:手指位置,当前位置,原始位置,权重取决于设置
end
VIB(0) VIB(0)
end end
end end
end end
function touchUp.play(id,x,y) function touchUp.play(id,x,y)
if setting.virtualkeySwitch then if setting.VKSwitch then
local t=onVirtualkey(x,y) local t=onVirtualkey(x,y)
if t then if t then
players[1]:releaseKey(t) players[1]:releaseKey(t)
@@ -631,26 +525,28 @@ function touchUp.play(id,x,y)
end end
end end
function touchMove.play(id,x,y,dx,dy) function touchMove.play(id,x,y,dx,dy)
if setting.virtualkeySwitch then if setting.VKSwitch then
local l=tc.getTouches() local l=tc.getTouches()
for n=1,#virtualkey do for n=1,#virtualkey do
local b=virtualkey[n] local B=virtualkey[n]
for i=1,#l do for i=1,#l do
local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i])) local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then goto L end if(x-B.x)^2+(y-B.y)^2<=B.r^2 then
goto nextButton
end
end end
players[1]:releaseKey(n) players[1]:releaseKey(n)
::L:: ::nextButton::
end end
end end
end end
function keyDown.play(key) function keyDown.play(key)
if key=="escape"and not sceneSwaping then if key=="escape"and not scene.swapping then
return(frame<180 and back or pauseGame)() return(frame<180 and back or pauseGame)()
end end
local m=setting.keyMap local m=setting.keyMap
for p=1,players.human do for p=1,players.human do
for k=1,12 do for k=1,20 do
if key==m[2*p-1][k]or key==m[2*p][k]then if key==m[2*p-1][k]or key==m[2*p][k]then
players[p]:pressKey(k) players[p]:pressKey(k)
return return
@@ -661,7 +557,7 @@ end
function keyUp.play(key) function keyUp.play(key)
local m=setting.keyMap local m=setting.keyMap
for p=1,players.human do for p=1,players.human do
for k=1,12 do for k=1,20 do
if key==m[2*p-1][k]or key==m[2*p][k]then if key==m[2*p-1][k]or key==m[2*p][k]then
players[p]:releaseKey(k) players[p]:releaseKey(k)
return return
@@ -670,10 +566,10 @@ function keyUp.play(key)
end end
end end
function gamepadDown.play(key) function gamepadDown.play(key)
if key=="back"then back()return end if key=="back"then scene.back()return end
local m=setting.keyMap local m=setting.keyMap
for p=1,players.human do for p=1,players.human do
for k=1,12 do for k=1,20 do
if key==m[2*p+7][k]or key==m[2*p+8][k]then if key==m[2*p+7][k]or key==m[2*p+8][k]then
players[p]:pressKey(k) players[p]:pressKey(k)
return return
@@ -684,7 +580,7 @@ end
function gamepadUp.play(key) function gamepadUp.play(key)
local m=setting.keyMap local m=setting.keyMap
for p=1,players.human do for p=1,players.human do
for k=1,12 do for k=1,20 do
if key==m[2*p+7][k]or key==m[2*p+8][k]then if key==m[2*p+7][k]or key==m[2*p+8][k]then
players[p]:releaseKey(k) players[p]:releaseKey(k)
return return
@@ -702,7 +598,7 @@ function keyDown.history(key)
elseif key=="down"then elseif key=="down"then
sel=min(sel+5,#updateLog-22) sel=min(sel+5,#updateLog-22)
elseif key=="escape"then elseif key=="escape"then
back() scene.back()
end end
end end
------------------------------------------------------------- -------------------------------------------------------------
@@ -742,10 +638,10 @@ local function widgetControl_key(i)
if widget_sel then if widget_sel then
widget_sel=kb.isDown("lshift")and widget_sel.prev or widget_sel.next or widget_sel widget_sel=kb.isDown("lshift")and widget_sel.prev or widget_sel.next or widget_sel
else else
widget_sel=select(2,next(Widget[scene])) widget_sel=select(2,next(Widget[scene.cur]))
end end
elseif i=="space"or i=="return"then elseif i=="space"or i=="return"then
if not sceneSwaping and widget_sel then if not scene.swapping and widget_sel then
widgetPress(widget_sel) widgetPress(widget_sel)
end end
else else
@@ -770,10 +666,10 @@ local function widgetControl_gamepad(i)
if widget_sel then if widget_sel then
widget_sel=i=="dpup"and widget_sel.prev or widget_sel.next or widget_sel widget_sel=i=="dpup"and widget_sel.prev or widget_sel.next or widget_sel
else else
widget_sel=select(2,next(Widget[scene])) widget_sel=select(2,next(Widget[scene.cur]))
end end
elseif i=="start"then elseif i=="start"then
if not sceneSwaping and widget_sel then if not scene.swapping and widget_sel then
local W=widget_sel local W=widget_sel
if W.hide and W.hide()then widget_sel=nil end if W.hide and W.hide()then widget_sel=nil end
if W.type=="button"then if W.type=="button"then
@@ -791,15 +687,16 @@ local function widgetControl_gamepad(i)
end end
end end
function love.mousepressed(x,y,k,t,num) function love.mousepressed(x,y,k,t,num)
if devMode>0 then print(x,y)end
if t then return end if t then return end
mx,my=xOy:inverseTransformPoint(x,y) mx,my=xOy:inverseTransformPoint(x,y)
if mouseDown[scene]then if mouseDown[scene.cur]then
mouseDown[scene](mx,my,k) mouseDown[scene.cur](mx,my,k)
elseif k==2 then elseif k==2 then
back() scene.back()
end end
if k==1 then if k==1 then
if widget_sel and not sceneSwaping then if widget_sel and not scene.swapping then
widgetPress(widget_sel,mx,my) widgetPress(widget_sel,mx,my)
end end
end end
@@ -809,14 +706,14 @@ function love.mousemoved(x,y,dx,dy,t)
if t then return end if t then return end
mx,my=xOy:inverseTransformPoint(x,y) mx,my=xOy:inverseTransformPoint(x,y)
dx,dy=dx/scr.k,dy/scr.k dx,dy=dx/scr.k,dy/scr.k
if mouseMove[scene]then if mouseMove[scene.cur]then
mouseMove[scene](mx,my,dx,dy) mouseMove[scene.cur](mx,my,dx,dy)
end end
if ms.isDown(1)and widget_sel then if ms.isDown(1)and widget_sel then
widgetDrag(widget_sel,mx,my,dx,dy) widgetDrag(widget_sel,mx,my,dx,dy)
else else
widget_sel=nil widget_sel=nil
for _,W in next,Widget[scene]do for _,W in next,Widget[scene.cur]do
if not(W.hide and W.hide())and W:isAbove(mx,my)then if not(W.hide and W.hide())and W:isAbove(mx,my)then
widget_sel=W widget_sel=W
return return
@@ -828,12 +725,12 @@ end
function love.mousereleased(x,y,k,t,num) function love.mousereleased(x,y,k,t,num)
if t then return end if t then return end
mx,my=xOy:inverseTransformPoint(x,y) mx,my=xOy:inverseTransformPoint(x,y)
if mouseUp[scene]then if mouseUp[scene.cur]then
mouseUp[scene](mx,my,k) mouseUp[scene.cur](mx,my,k)
end end
end end
function love.wheelmoved(x,y) function love.wheelmoved(x,y)
if wheelmoved[scene]then wheelmoved[scene](x,y)end if wheelmoved[scene.cur]then wheelmoved[scene.cur](x,y)end
end end
function love.touchpressed(id,x,y) function love.touchpressed(id,x,y)
@@ -842,20 +739,20 @@ function love.touchpressed(id,x,y)
touching=id touching=id
love.touchmoved(id,x,y,0,0) love.touchmoved(id,x,y,0,0)
end end
if touchDown[scene]then if touchDown[scene.cur]then
touchDown[scene](id,xOy:inverseTransformPoint(x,y)) touchDown[scene.cur](id,xOy:inverseTransformPoint(x,y))
end end
end end
function love.touchmoved(id,x,y,dx,dy) function love.touchmoved(id,x,y,dx,dy)
x,y=xOy:inverseTransformPoint(x,y) x,y=xOy:inverseTransformPoint(x,y)
if touchMove[scene]then if touchMove[scene.cur]then
touchMove[scene](id,x,y,dx/scr.k,dy/scr.k) touchMove[scene.cur](id,x,y,dx/scr.k,dy/scr.k)
end end
if widget_sel then if widget_sel then
widgetDrag(widget_sel,x,y,dx,dy) widgetDrag(widget_sel,x,y,dx,dy)
else else
widget_sel=nil widget_sel=nil
for _,W in next,Widget[scene]do for _,W in next,Widget[scene.cur]do
if not(W.hide and W.hide())and W:isAbove(x,y)then if not(W.hide and W.hide())and W:isAbove(x,y)then
widget_sel=W widget_sel=W
return return
@@ -870,13 +767,13 @@ function love.touchreleased(id,x,y)
x,y=xOy:inverseTransformPoint(x,y) x,y=xOy:inverseTransformPoint(x,y)
if id==touching then if id==touching then
touching=nil touching=nil
if widget_sel and not sceneSwaping then if widget_sel and not scene.swapping then
widgetPress(widget_sel,x,y) widgetPress(widget_sel,x,y)
end end
widget_sel=nil widget_sel=nil
end end
if touchUp[scene]then if touchUp[scene.cur]then
touchUp[scene](id,x,y) touchUp[scene.cur](id,x,y)
end end
end end
function love.keypressed(i) function love.keypressed(i)
@@ -910,14 +807,14 @@ function love.keypressed(i)
end end
end end
else else
if keyDown[scene]then keyDown[scene](i) if keyDown[scene.cur]then keyDown[scene.cur](i)
elseif i=="escape"or i=="back"then back() elseif i=="escape"then scene.back()
else widgetControl_key(i) else widgetControl_key(i)
end end
end end
end end
function love.keyreleased(i) function love.keyreleased(i)
if keyUp[scene]then keyUp[scene](i)end if keyUp[scene.cur]then keyUp[scene.cur](i)end
end end
local keyMirror={ local keyMirror={
@@ -930,20 +827,20 @@ local keyMirror={
} }
function love.gamepadpressed(joystick,i) function love.gamepadpressed(joystick,i)
mouseShow=false mouseShow=false
if gamepadDown[scene]then gamepadDown[scene](i) if gamepadDown[scene.cur]then gamepadDown[scene.cur](i)
elseif keyDown[scene]then keyDown[scene](keyMirror[i]or i) elseif keyDown[scene.cur]then keyDown[scene.cur](keyMirror[i]or i)
elseif i=="back"then back() elseif i=="back"then scene.back()
else widgetControl_gamepad(i) else widgetControl_gamepad(i)
end end
end end
function love.gamepadreleased(joystick,i) function love.gamepadreleased(joystick,i)
if gamepadUp[scene]then gamepadUp[scene](i) if gamepadUp[scene.cur]then gamepadUp[scene.cur](i)
end end
end end
--[[ --[[
function love.joystickpressed(js,k)end function love.joystickpressed(js,k)end
function love.joystickaxis(js,axis,valend function love.joystickaxis(js,axis,val)end
function love.joystickhat(js,hat,dirend function love.joystickhat(js,hat,dir)end
function love.sendData(data)end function love.sendData(data)end
function love.receiveData(id,data)end function love.receiveData(id,data)end
]] ]]
@@ -964,7 +861,7 @@ function love.resize(w,h)
gc.replaceTransform(xOy) gc.replaceTransform(xOy)
end end
function love.focus(f) function love.focus(f)
if system~="Android" and not f and scene=="play"then pauseGame()end if system~="Android" and not f and scene.cur=="play"then pauseGame()end
end end
function love.update(dt) function love.update(dt)
-- if players then for k,v in pairs(players[1])do -- if players then for k,v in pairs(players[1])do
@@ -990,28 +887,25 @@ function love.update(dt)
FX_BGblock.tm=rnd(20,30) FX_BGblock.tm=rnd(20,30)
end end
end end
if sceneSwaping then if scene.swapping then
sceneSwaping.time=sceneSwaping.time-1 local S=scene.swap
if sceneSwaping.time==sceneSwaping.mid then S.time=S.time-1
for k,W in next,Widget[scene]do if S.time==S.mid then
if W.type=="button"then scene.cur=S.tar
W.alpha=0 scene.init(S.tar)
end--Reset widgets' alpha
end
widget_sel=nil widget_sel=nil
scene=sceneSwaping.tar --此时场景切换
if sceneInit[scene] then sceneInit[scene]()end end
--scene swapped! if S.time==0 then
elseif sceneSwaping.time==0 then scene.swapping=false
sceneSwaping=nil
end end
end end
if Tmr[scene]then if Tmr[scene.cur]then
Tmr[scene](dt) Tmr[scene.cur](dt)
end end
for i=#Task,1,-1 do for i=#Task,1,-1 do
local T=Task[i] local T=Task[i]
if(not T.P or T.P and scene=="play")and T.code(T.P,T.data)then if T.code(T.P,T.data)then
rem(Task,i) rem(Task,i)
end end
end end
@@ -1042,8 +936,8 @@ function love.update(dt)
end end
end end
end end
-- for k,W in next,Widget[scene]do -- for k,W in next,Widget[scene.cur]do
-- end--update Widgets -- end--更新控件
end end
local scs={1,2,1,2,1,2,1,2,1,2,1.5,1.5,.5,2.5} local scs={1,2,1,2,1,2,1,2,1,2,1.5,1.5,.5,2.5}
local FPS=love.timer.getFPS local FPS=love.timer.getFPS
@@ -1059,9 +953,9 @@ function love.draw()
gc.draw(img,FX_BGblock[n].x+(j-1)*30*size,FX_BGblock[n].y+(i-1)*30*size,nil,size) gc.draw(img,FX_BGblock[n].x+(j-1)*30*size,FX_BGblock[n].y+(i-1)*30*size,nil,size)
end end
end end end end
end end--Draw BG falling blocks
if Pnt[scene]then Pnt[scene]()end if Pnt[scene.cur]then Pnt[scene.cur]()end
for k,W in next,Widget[scene]do for k,W in next,Widget[scene.cur]do
if not(W.hide and W.hide())then if not(W.hide and W.hide())then
W:draw() W:draw()
end end
@@ -1070,7 +964,7 @@ function love.draw()
local r=Timer()*.5 local r=Timer()*.5
gc.setColor(1,1,1,min(1-math.abs(1-r%1*2),.3)) gc.setColor(1,1,1,min(1-math.abs(1-r%1*2),.3))
r=int(r)%7+1 r=int(r)%7+1
gc.draw(mouseBlock[r],mx,my,Timer()%3.1416*4,20,20,scs[2*r]-.5,#blocks[r][0]-scs[2*r-1]+.5) gc.draw(miniBlock[r],mx,my,Timer()%3.1416*4,20,20,scs[2*r]-.5,#blocks[r][0]-scs[2*r-1]+.5)
gc.setColor(1,1,1,.5)gc.circle("fill",mx,my,5) gc.setColor(1,1,1,.5)gc.circle("fill",mx,my,5)
gc.setColor(1,1,1)gc.circle("fill",mx,my,3) gc.setColor(1,1,1)gc.circle("fill",mx,my,3)
end--Awesome mouse! end--Awesome mouse!
@@ -1085,27 +979,27 @@ function love.draw()
gc.setColor(1,1,1,1-S[2]/S[3]) gc.setColor(1,1,1,1-S[2]/S[3])
local r=(10*S[2]/S[3])^1.2 local r=(10*S[2]/S[3])^1.2
gc.rectangle("line",S[4]-r,S[5]-r,S[6]+2*r,S[7]+2*r) gc.rectangle("line",S[4]-r,S[5]-r,S[6]+2*r,S[7]+2*r)
--Ripple --按钮波纹
elseif S[1]==1 then elseif S[1]==1 then
gc.setColor(S[4],S[5],S[6],1-S[2]/S[3]) gc.setColor(S[4],S[5],S[6],1-S[2]/S[3])
gc.rectangle("fill",S[7],S[8],S[9],S[10],2) gc.rectangle("fill",S[7],S[8],S[9],S[10],2)
--Shade --开关/滑条残影
end end
end--sysFXs end--sysFXs
if sceneSwaping then if scene.swapping then
sceneSwaping.draw() scene.swap.draw(scene.swap.time)
end--Swaping animation end--Swapping animation
if scr.r~=.5625 then if scr.r~=.5625 then
gc.setColor(0,0,0) gc.setColor(0,0,0)
if scr.r>.5625 then if scr.r>.5625 then
local d=(scr.h-scr.w*9/16)*.5/scr.k local d=(scr.h-scr.w*9/16)*.5/scr.k
gc.rectangle("fill",0,0,1280,-d) gc.rectangle("fill",0,0,1280,-d)
gc.rectangle("fill",0,720,1280,d) gc.rectangle("fill",0,720,1280,d)
else--high else--高窗口
local d=(scr.w-scr.h*16/9)*.5/scr.k local d=(scr.w-scr.h*16/9)*.5/scr.k
gc.rectangle("fill",0,0,-d,720) gc.rectangle("fill",0,0,-d,720)
gc.rectangle("fill",1280,0,d,720) gc.rectangle("fill",1280,0,d,720)
end--wide end--扁窗口
end--Black side end--Black side
setFont(20) setFont(20)
gc.setColor(1,1,1) gc.setColor(1,1,1)
@@ -1121,12 +1015,12 @@ function love.draw()
end end
function love.run() function love.run()
local T=love.timer local T=love.timer
local lastFrame,lastUpdatePowerInfo=T.getTime(),T.getTime() local lastFrame,lastFreshPow=T.getTime(),T.getTime()
local readyDrawFrame=0 local readyDrawFrame=0
local mini=love.window.isMinimized local mini=love.window.isMinimized
local PUMP,POLL=love.event.pump,love.event.poll local PUMP,POLL=love.event.pump,love.event.poll
love.resize(gc.getWidth(),gc.getHeight()) love.resize(gc.getWidth(),gc.getHeight())
scene="load"sceneInit.load()--System Launch scene.init("load")--Scene Launch
return function() return function()
PUMP() PUMP()
for N,a,b,c,d,e in POLL()do for N,a,b,c,d,e in POLL()do
@@ -1149,14 +1043,14 @@ function love.run()
gc.present() gc.present()
end end
end end
repeat while Timer()-lastFrame<.0158 do
if Timer()-lastUpdatePowerInfo>5 then T.sleep(.001)
updatePowerInfo() end
lastUpdatePowerInfo=Timer()
end
until Timer()-lastFrame>.013
T.sleep(.002)
lastFrame=Timer() lastFrame=Timer()
if Timer()-lastFreshPow>5 then
updatePowerInfo()
lastFreshPow=Timer()
end
end end
end end
@@ -1168,8 +1062,9 @@ end
if fs.getInfo("usersetting")then if fs.getInfo("usersetting")then
loadSetting() loadSetting()
elseif system=="Android"or system=="iOS" then elseif system=="Android"or system=="iOS" then
setting.virtualkeySwitch=true
setting.swap=false setting.swap=false
else
setting.VKSwitch=false
end end
math.randomseed(os.time()*626) math.randomseed(os.time()*626)
swapLanguage(setting.lang) swapLanguage(setting.lang)

133
paint.lua
View File

@@ -51,7 +51,9 @@ local function dataOpt(i)
elseif i==14 then elseif i==14 then
return format("%0.2f",stat.atk/stat.row) return format("%0.2f",stat.atk/stat.row)
elseif i==15 then elseif i==15 then
return stat.extraPiece.."["..(int(stat.extraRate/stat.piece*10000)*.01).."%]" return stat.extraPiece
elseif i==16 then
return max(100-int(stat.extraRate/stat.piece*10000)*.01,0).."%"
end end
end end
local statOptL={ local statOptL={
@@ -177,29 +179,36 @@ local function drawAtkPointer(x,y)
gc.circle("line",x,y,30*(1+a),6) gc.circle("line",x,y,30*(1+a),6)
end end
local function VirtualkeyPreview() local function VirtualkeyPreview()
for i=1,#virtualkey do if setting.VKSwitch then
local c=sel==i and .8 or 1 for i=1,#VK_org do
gc.setColor(c,c,c,setting.virtualkeyAlpha*.1) local B=VK_org[i]
local b=virtualkey[i] if B.ava then
gc.setLineWidth(b[4]*.07) local c=sel==i and .6 or 1
gc.circle("line",b[1],b[2],b[4]-5) gc.setColor(c,1,c,setting.VKAlpha*.1)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,b[4]*.025,nil,18,18)end gc.setLineWidth(B.r*.07)
gc.circle("line",B.x,B.y,B.r)
if setting.VKIcon then gc.draw(VKIcon[i],B.x,B.y,nil,B.r*.025,nil,18,18)end
end
end
end end
end end
local function drawVirtualkey() local function drawVirtualkey()
local a=setting.virtualkeyAlpha*.1 local a=setting.VKAlpha*.1
for i=1,#virtualkey do for i=1,#virtualkey do
if i~=9 or modeEnv.Fkey then if i~=9 or modeEnv.Fkey then
local p,b=virtualkeyDown[i],virtualkey[i] local B=virtualkey[i]
if p then gc.setColor(.7,.7,.7,a) if B.ava then
else gc.setColor(1,1,1,a) local _=virtualkeyDown[i]and gc.setColor(.7,.7,.7,a)or gc.setColor(1,1,1,a)--Dark magic
end gc.setLineWidth(B.r*.07)
gc.setLineWidth(b[4]*.07) local ΔY=virtualkeyPressTime[i]
gc.circle("line",b[1],b[2]+virtualkeyPressTime[i],b[4]-5) gc.circle("line",B.x,B.y+ΔY,B.r)--Outline circle
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2]+virtualkeyPressTime[i],nil,b[4]*.025,nil,18,18)end if setting.VKIcon then
if virtualkeyPressTime[i]>0 then gc.draw(VKIcon[i],B.x,B.y+ΔY,nil,B.r*.025,nil,18,18)
gc.setColor(1,1,1,a*virtualkeyPressTime[i]*.1) end--Icon
gc.circle("line",b[1],b[2],b[4]*(1.4-virtualkeyPressTime[i]*.04)) if ΔY>0 then
gc.setColor(1,1,1,a*ΔY*.1)
gc.circle("line",B.x,B.y,B.r*(1.4-ΔY*.04))
end--Ripple
end end
end end
end end
@@ -272,7 +281,7 @@ function Pnt.BG.game6()
end end
gc.setColor(.3,.3,.3) gc.setColor(.3,.3,.3)
local r=7-int(Timer()*.5)%7 local r=7-int(Timer()*.5)%7
gc.draw(mouseBlock[r],640,360,Timer()%3.1416*6,400,400,scs[2*r]-.5,#blocks[r][0]-scs[2*r-1]+.5) gc.draw(miniBlock[r],640,360,Timer()%3.1416*6,400,400,scs[2*r]-.5,#blocks[r][0]-scs[2*r-1]+.5)
end--Fast lightning&spining tetromino end--Fast lightning&spining tetromino
local matrixT={}for i=0,15 do matrixT[i]={}for j=0,8 do matrixT[i][j]=love.math.noise(i,j)+2 end end local matrixT={}for i=0,15 do matrixT[i]={}for j=0,8 do matrixT[i][j]=love.math.noise(i,j)+2 end end
function Pnt.BG.matrix() function Pnt.BG.matrix()
@@ -413,12 +422,12 @@ function Pnt.draw()
gc.translate(-200,-60) gc.translate(-200,-60)
if clearSureTime>0 then if clearSureTime>0 then
gc.setColor(1,1,1,clearSureTime*.02) gc.setColor(1,1,1,clearSureTime*.02)
gc.draw(drawableText.question,1100,570) gc.draw(drawableText.question,760,11)
end end
if pen>0 then if pen>0 then
gc.setLineWidth(13) gc.setLineWidth(13)
gc.setColor(blockColor[pen]) gc.setColor(blockColor[pen])
gc.rectangle("line",945,605,70,70) gc.rectangle("line",746,460,70,70)
elseif pen==-1 then elseif pen==-1 then
gc.setLineWidth(5) gc.setLineWidth(5)
gc.setColor(.9,.9,.9) gc.setColor(.9,.9,.9)
@@ -453,7 +462,7 @@ function Pnt.play()
gc.pop() gc.pop()
end--FX animation end--FX animation
gc.setColor(1,1,1) gc.setColor(1,1,1)
if setting.virtualkeySwitch then drawVirtualkey()end if setting.VKSwitch then drawVirtualkey()end
if modeEnv.royaleMode then if modeEnv.royaleMode then
for i=1,#FX_badge do for i=1,#FX_badge do
local b=FX_badge[i] local b=FX_badge[i]
@@ -501,9 +510,9 @@ function Pnt.pause()
gc.print(text.stat[i+3],110,30*i+270) gc.print(text.stat[i+3],110,30*i+270)
gc.print(dataOpt(i),305,30*i+270) gc.print(dataOpt(i),305,30*i+270)
end end
for i=9,15 do for i=9,16 do
gc.print(text.stat[i+3],860,30*i+30) gc.print(text.stat[i+3],860,30*i+30)
gc.print(dataOpt(i),1000,30*i+30) gc.print(dataOpt(i),1050,30*i+30)
end end
setFont(40) setFont(40)
if system~="Android"then if system~="Android"then
@@ -532,40 +541,54 @@ function Pnt.setting_sound()
gc.setColor(1,1,1) gc.setColor(1,1,1)
mDraw(drawableText.setting_sound,640,15) mDraw(drawableText.setting_sound,640,15)
end end
function Pnt.setting_control() function Pnt.setting_key()
local a=.3+sin(Timer()*15)*.1 local a=.3+sin(Timer()*15)*.1
if keyboardSetting then if keyboardSetting then gc.setColor(1,.3,.3,a)else gc.setColor(1,.7,.7,a)end
gc.setColor(1,.5,.5,a) gc.rectangle("fill",
else keyboardSet<11 and 240 or 840,
gc.setColor(.9,.9,.9,a) 45*keyboardSet+20-450*int(keyboardSet/11),
end 200,45
gc.rectangle("fill",240,40*keyboardSet-10,200,40) )
if joystickSetting then if joystickSetting then gc.setColor(.3,.3,.1,a)else gc.setColor(.7,.7,1,a)end
gc.setColor(1,.5,.5,a) gc.rectangle("fill",
else joystickSet<11 and 440 or 1040,
gc.setColor(.9,.9,.9,a) 45*joystickSet+20-450*int(joystickSet/11),
end 200,45
gc.rectangle("fill",440,40*joystickSet-10,200,40) )
--Selection rect
gc.setColor(1,.3,.3)
mDraw(drawableText.keyboard,340,35)
mDraw(drawableText.keyboard,940,35)
gc.setColor(.3,.3,1)
mDraw(drawableText.joystick,540,35)
mDraw(drawableText.joystick,1140,35)
gc.setColor(1,1,1) gc.setColor(1,1,1)
setFont(25) setFont(31)
for y=1,13 do for N=1,20 do
mStr(text.actName[y],150,40*y-5) if N<11 then
for x=1,2 do gc.printf(text.actName[N],47,45*N+22,180,"right")
mStr(setting.keyMap[curBoard+x*8-8][y],200*x+140,40*y-3) mStr(setting.keyMap[curBoard][N],340,45*N+22)
mStr(setting.keyMap[curBoard+8][N],540,45*N+22)
else
gc.printf(text.actName[N],647,45*N-428,180,"right")
mStr(setting.keyMap[curBoard][N],940,45*N-428)
mStr(setting.keyMap[curBoard+8][N],1040,45*N-428)
end end
gc.line(40,40*y-10,640,40*y-10)
end end
for x=1,4 do gc.setLineWidth(2)
gc.line(200*x-160,30,200*x-160,550) for x=40,1240,200 do
gc.line(x,65,x,515)
end
for y=65,515,45 do
gc.line(40,y,1240,y)
end end
gc.line(40,550,640,550)
mDraw(drawableText.keyboard,340,0)
mDraw(drawableText.joystick,540,0)
gc.draw(drawableText.ctrlSetHelp,50,620)
setFont(40) setFont(40)
gc.print("P"..int(curBoard*.5+.5).."/P4",420,560) gc.print("Player:",170,590)
gc.print(curBoard.."/8",580,560) gc.print(int(curBoard*.5+.5),300,590)
gc.print(curBoard.."/8",580,590)
gc.draw(drawableText.ctrlSetHelp,50,650)
end end
function Pnt.setting_touch() function Pnt.setting_touch()
VirtualkeyPreview() VirtualkeyPreview()
@@ -581,6 +604,12 @@ function Pnt.setting_touch()
end end
end end
end end
function Pnt.setting_trackSetting()
gc.setColor(1,1,1)
mDraw(drawableText.VKTchW,140+50*setting.VKTchW,260)
mDraw(drawableText.VKOrgW,140+50*setting.VKTchW+50*setting.VKCurW,320)
mDraw(drawableText.VKCurW,640+50*setting.VKCurW,380)
end
function Pnt.help() function Pnt.help()
setFont(30) setFont(30)
gc.setColor(1,1,1) gc.setColor(1,1,1)

View File

@@ -192,7 +192,7 @@ local TMP1={
TMP1[2]=TMP1[1] TMP1[2]=TMP1[1]
TMP1[4]=TMP1[3] TMP1[4]=TMP1[3]
TMP1[5]=TMP1[3] TMP1[5]=TMP1[3]
local fineeseCtrlPar=TMP1 local finesseCtrlPar=TMP1
TMP1,TMP2,TMP3,TMP4=nil----------release TMP1,TMP2,TMP3,TMP4=nil----------release
local CCblockID={4,3,5,6,1,2,0} local CCblockID={4,3,5,6,1,2,0}
local freshMethod={ local freshMethod={
@@ -516,7 +516,7 @@ function newDemoPlayer(id,x,y,size)
P.ctrlCount=0 P.ctrlCount=0
local bag1={1,2,3,4,5,6,7} local bag1={1,2,3,4,5,6,7}
for i=1,7 do for _=1,7 do
P:newNext(rem(bag1,rnd(#bag1))) P:newNext(rem(bag1,rnd(#bag1)))
end end
P.freshNext=freshMethod.bag7 P.freshNext=freshMethod.bag7
@@ -628,28 +628,28 @@ function newPlayer(id,x,y,size,AIdata)
P.freshTime=0 P.freshTime=0
P.spinLast,P.lastClear=false,nil P.spinLast,P.lastClear=false,nil
P.spinSeq=0--for Ospin,each digit mean a spin P.spinSeq=0--for Ospin,each digit mean a spin
P.ctrlCount=0--key press time,for fineese check P.ctrlCount=0--key press time,for finesse check
P.his={rnd(7),rnd(7),rnd(7),rnd(7)} P.his={rnd(7),rnd(7),rnd(7),rnd(7)}
local s=P.gameEnv.sequence local s=P.gameEnv.sequence
if s=="bag7"or s=="his4"then if s=="bag7"or s=="his4"then
local bag1={1,2,3,4,5,6,7} local bag1={1,2,3,4,5,6,7}
for i=1,7 do for _=1,7 do
P:newNext(rem(bag1,rnd(#bag1))) P:newNext(rem(bag1,rnd(#bag1)))
end end
elseif s=="rnd"then elseif s=="rnd"then
for i=1,6 do for _=1,6 do
local r=rnd(7) local r=rnd(7)
P:newNext(r) P:newNext(r)
end end
elseif s=="drought1"then elseif s=="drought1"then
local bag1={1,2,3,4,5,6} local bag1={1,2,3,4,5,6}
for i=1,6 do for _=1,6 do
P:newNext(rem(bag1,rnd(#bag1))) P:newNext(rem(bag1,rnd(#bag1)))
end end
elseif s=="drought2"then elseif s=="drought2"then
local bag1={1,2,3,4,6,6} local bag1={1,2,3,4,6,6}
for i=1,6 do for _=1,6 do
P:newNext(rem(bag1,rnd(#bag1))) P:newNext(rem(bag1,rnd(#bag1)))
end end
end end
@@ -1139,15 +1139,13 @@ function player.draw(P)
if P.gameEnv.hold then if P.gameEnv.hold then
mDraw(drawableText.hold,-82,-10) mDraw(drawableText.hold,-82,-10)
if P.holded then gc.setColor(.6,.6,.6)end if P.holded then gc.setColor(.6,.5,.5)end
for i=1,#P.hd.bk do local B=P.hd.bk
local B=P.hd.bk for i=1,#B do for j=1,#B[1]do
for j=1,#B[1]do if B[i][j]then
if B[i][j]then drawPixel(i+17.5-#B*.5,j-2.7-#B[1]*.5,P.hd.color)
drawPixel(i+17.5-#B*.5,j-2.7-#B[1]*.5,P.hd.color)
end
end end
end end end
end--Hold end--Hold
gc.setColor(1,1,1) gc.setColor(1,1,1)
mDraw(drawableText.next,381,-10) mDraw(drawableText.next,381,-10)
@@ -1264,7 +1262,20 @@ function player.demoDraw(P)
end end
end end--Block end end--Block
end end
::E:: gc.setColor(1,1,1,.3)
local N=miniBlock[P.hd.id]
if N then
gc.draw(N,15,30,nil,16,nil,0,N:getHeight()*.5)
end
local N=1
::L::
if N<=P.gameEnv.next and P.next[N]then
local p=miniBlock[P.next[N].id]
gc.draw(p,285,40*N-10,nil,16,nil,p:getWidth(),p:getHeight()*.5)
N=N+1
goto L
end
--Next
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.draw(PTC.dust[P.id]) gc.draw(PTC.dust[P.id])
gc.translate(-P.fieldOffX,-P.fieldOffY) gc.translate(-P.fieldOffX,-P.fieldOffY)
@@ -1377,8 +1388,8 @@ local function checkrow(P,start,height)--(cy,r)
c=c+1 c=c+1
if not P.small then if not P.small then
local S=PTC.dust[P.id] local S=PTC.dust[P.id]
for k=1,120 do for _=1,100 do
S:setPosition(rnd(300),600-30*h+rnd(30)) S:setPosition(rnd(300),630-30*(h+c)+rnd(30))
S:emit(2) S:emit(2)
end end
end end
@@ -1403,11 +1414,15 @@ end
function player:fineError(rate) function player:fineError(rate)
self.stat.extraPiece=self.stat.extraPiece+1 self.stat.extraPiece=self.stat.extraPiece+1
self.stat.extraRate=self.stat.extraRate+rate self.stat.extraRate=self.stat.extraRate+rate
if self.gameEnv.fineKill then if self.human then
SFX("error_long") if self.gameEnv.fineKill then
SFX("error_long")
Event.lose(self)
elseif setting.fine then
SFX("error")
end
elseif self.gameEnv.fineKill then
Event.lose(self) Event.lose(self)
else
SFX("error")
end end
end end
function player:garbageSend(R,send,time,...) function player:garbageSend(R,send,time,...)
@@ -1482,9 +1497,9 @@ function player:freshTarget()
self:changeAtk(randomTarget(self)) self:changeAtk(randomTarget(self))
end end
elseif self.atkMode==2 then elseif self.atkMode==2 then
self:changeAtk(P~=mostBadge and mostBadge or secBadge or randomTarget(self)) self:changeAtk(self~=mostBadge and mostBadge or secBadge or randomTarget(self))
elseif self.atkMode==3 then elseif self.atkMode==3 then
self:changeAtk(P~=mostDangerous and mostDangerous or secDangerous or randomTarget(self)) self:changeAtk(self~=mostDangerous and mostDangerous or secDangerous or randomTarget(self))
elseif self.atkMode==4 then elseif self.atkMode==4 then
for i=1,#self.atker do for i=1,#self.atker do
if not self.atker[i].alive then if not self.atker[i].alive then
@@ -1728,7 +1743,7 @@ function player:spin(d,ifpre)
end end
function player:hold(ifpre) function player:hold(ifpre)
if not self.holded and self.waiting==-1 and self.gameEnv.hold then if not self.holded and self.waiting==-1 and self.gameEnv.hold then
--Fineese check --Finesse check
local H,B=self.hd,self.cur local H,B=self.hd,self.cur
if H and H.id==B.id and H.name==B.name then if H and H.id==B.id and H.name==B.name then
self:fineError(1.5) self:fineError(1.5)
@@ -1780,7 +1795,7 @@ function player:resetblock()
if self.AI_mode=="CC"then BOT.addNext(self.AI_bot,CCblockID[self.next[self.AIdata.next].id])end if self.AI_mode=="CC"then BOT.addNext(self.AI_bot,CCblockID[self.next[self.AIdata.next].id])end
self.sc,self.dir=scs[self.cur.id][0],0--spin center/direction self.sc,self.dir=scs[self.cur.id][0],0--spin center/direction
self.r,self.c=#self.cur.bk,#self.cur.bk[1]--row/column self.r,self.c=#self.cur.bk,#self.cur.bk[1]--row/column
self.curX,self.curY=blockPos[self.cur.id],21+ceil(self.fieldBeneath/30)-self.r+min(int(#self.field*.2),2) self.curX,self.curY=blockPos[self.cur.id],21+ceil(self.fieldBeneath/30)+min(int(#self.field*.15)-self.r,0)--初始高度7格+1,14格+2(非I)
self.dropDelay,self.lockDelay,self.freshTime=self.gameEnv.drop,self.gameEnv.lock,0 self.dropDelay,self.lockDelay,self.freshTime=self.gameEnv.drop,self.gameEnv.lock,0
if self.keyPressing[8]then self:hold(true)end if self.keyPressing[8]then self:hold(true)end
@@ -1840,8 +1855,9 @@ function player:drop()--(Place piece)
dospin=false dospin=false
end end
if self.gameEnv.fine then --极简检测
if self.curY>18 then goto 通过测试 end if self.curY>18 then goto 通过测试 end--高处易误判
do
local y0=self.curY local y0=self.curY
local x,c=self.curX,self.c local x,c=self.curX,self.c
local B=self.cur.bk local B=self.cur.bk
@@ -1868,14 +1884,16 @@ function player:drop()--(Place piece)
dir=dir-2 dir=dir-2
end end
end--SZI的逆态视为顺态 end--SZI的逆态视为顺态
local R,I=self.ctrlCount,fineeseCtrlPar[id][dir][self.curX]--Real key/Ideal key local R,I=self.ctrlCount,finesseCtrlPar[id][dir][self.curX]--Real key/Ideal key
local d=R-I local d=R-I
if d<=0 then if d<=0 then
goto 通过测试 goto 通过测试
end end
if I==0 then I=.67 end if I==0 then I=1 end
self:fineError(R/I) local rate=R/I
end--极简检测 if rate>2.5 then rate=2.5 end
self:fineError(rate)
end
::通过测试:: ::通过测试::
if cc>0 then if cc>0 then
@@ -2240,19 +2258,6 @@ function player.act.restart(P)
resetPartGameData() resetPartGameData()
end end
end end
function player.act.insDown(P)
if P.curY~=P.y_img then
if not P.small then
if setting.dropFX>0 then
P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
end
if setting.shakeFX>0 then
P.fieldOffY=2*setting.shakeFX
end
end
P.curY,P.lockDelay,P.spinLast=P.y_img,P.gameEnv.lock,false
end
end
function player.act.insLeft(P,auto) function player.act.insLeft(P,auto)
local x0,y0=P.curX,P.curY local x0,y0=P.curX,P.curY
while not ifoverlap(P,P.cur.bk,P.curX-1,P.curY)do while not ifoverlap(P,P.cur.bk,P.curX-1,P.curY)do
@@ -2295,6 +2300,19 @@ function player.act.insRight(P,auto)
P.ctrlCount=P.ctrlCount+1 P.ctrlCount=P.ctrlCount+1
end end
end end
function player.act.insDown(P)
if P.curY~=P.y_img then
if not P.small then
if setting.dropFX>0 then
P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
end
if setting.shakeFX>0 then
P.fieldOffY=2*setting.shakeFX
end
end
P.curY,P.lockDelay,P.spinLast=P.y_img,P.gameEnv.lock,false
end
end
function player.act.down1(P) function player.act.down1(P)
if P.curY~=P.y_img then if P.curY~=P.y_img then
P.curY=P.curY-1 P.curY=P.curY-1
@@ -2302,7 +2320,7 @@ function player.act.down1(P)
end end
end end
function player.act.down4(P) function player.act.down4(P)
for i=1,4 do for _=1,4 do
if P.curY~=P.y_img then if P.curY~=P.y_img then
P.curY=P.curY-1 P.curY=P.curY-1
P.spinLast=false P.spinLast=false
@@ -2311,5 +2329,35 @@ function player.act.down4(P)
end end
end end
end end
function player.act.quit(P)P:lose()end function player.act.down10(P)
for _=1,10 do
if P.curY~=P.y_img then
P.curY=P.curY-1
P.spinLast=false
else
break
end
end
end
function player.act.dropLeft(P)
P.act.insLeft(P)
P.act.hardDrop(P)
end
function player.act.dropRight(P)
P.act.insRight(P)
P.act.hardDrop(P)
end
function player.act.addLeft(P)
P.act.insLeft(P)
P.act.insDown(P)
P.act.insRight(P)
P.act.hardDrop(P)
end
function player.act.addRight(P)
P.act.insRight(P)
P.act.insDown(P)
P.act.insLeft(P)
P.act.hardDrop(P)
end
-------------------------</Controls>------------------------- -------------------------</Controls>-------------------------

199
scene.lua Normal file
View File

@@ -0,0 +1,199 @@
local scene={
cur="load",--Current scene
swapping=false,--ifSwapping
swap={
tar=nil, --Swapping target
style=nil, --Swapping target
mid=nil, --Loading point
time=nil, --Full swap time
draw=nil, --Swap draw
},
seq={"quit","slowFade"},--Back sequence
}
local sceneInit={
quit=love.event.quit,
load=function()
loading=1--Loading mode
loadnum=1--Loading counter
loadprogress=0--Loading bar(0~1)
loadTip=text.tips[math.random(#text.tips)]
end,
intro=function()
count=0
BGM("blank")
end,
main=function()
curBG="none"
BGM("blank")
destroyPlayers()
modeEnv={}
if not players[1]then
newDemoPlayer(1,900,35,1.1)
end--create demo player
collectgarbage()
end,
music=function()
if bgmPlaying then
for i=1,#musicID do
if musicID[i]==bgmPlaying then
sel=i
return
end
end
else
sel=1
end
end,
mode=function()
curBG="none"
BGM("blank")
destroyPlayers()
end,
custom=function()
sel=sel or 1
destroyPlayers()
curBG=customRange.bg[customSel[12]]
BGM(customRange.bgm[customSel[13]])
end,
draw=function()
curBG="none"
clearSureTime=0
pen,sx,sy=1,1,1
end,
play=function()
love.keyboard.setKeyRepeat(false)
restartCount=0
if needResetGameData then
resetGameData()
needResetGameData=nil
end
end,
pause=function()
end,
setting_game=function()
curBG="none"
end,
setting_key=function()
curBoard=1
keyboardSet=1
joystickSet=1
keyboardSetting=false
joystickSetting=false
end,
setting_touch=function()
curBG="game2"
defaultSel=1
sel=nil
snapLevel=1
end,
setting_touchSwitch=function()
curBG="matrix"
end,
help=function()
curBG="none"
end,
history=function()
updateLog=require"updateLog"
curBG="lightGrey"
sel=1
end,
quit=function()
love.timer.sleep(.3)
love.event.quit()
end,
}
local swapDeck_data={
{4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1},
{1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2},
{3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2},
{2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4},
{7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5},
{3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6},
{2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7},
{5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8},
{7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8},
}--Block id [ZSLJTOI] ,dir,x,y
local gc=love.graphics
local swap={
none={1,0,NULL},
flash={8,1,function()gc.clear(1,1,1)end},
fade={30,15,function(t)
local t=t>15 and 2-t/15 or t/15
gc.setColor(0,0,0,t)
gc.rectangle("fill",0,0,1280,720)
end},
slowFade={120,40,function(t)
local t=t>40 and 1.5-t/80 or t/40
gc.setColor(0,0,0,t)
gc.rectangle("fill",0,0,1280,720)
end},
deck={50,8,function(t)
gc.setColor(1,1,1)
if t>8 then
local t=t<15 and 15 or t
for i=1,51-t do
local bn=swapDeck_data[i][1]
local b=blocks[bn][swapDeck_data[i][2]]
local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4]
for y=1,#b do for x=1,#b[1]do
if b[y][x]then
gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3)
end
end end
end
end
if t<17 then
gc.setColor(1,1,1,1-(t>8 and t-8 or 8-t)*.125)
gc.rectangle("fill",0,0,1280,720)
end
end},
}--Scene swapping animations
local backFunc={
load=love.event.quit,
pause=function()
love.keyboard.setKeyRepeat(true)
updateStat()
saveData()
clearTask("play")
end,
setting_game=function()
saveSetting()
end,
}
function scene.init(s)
if sceneInit[s]then sceneInit[s]()end
end
function scene.push(tar,style)
if not scene.swapping then
local m=#scene.seq
scene.seq[m+1]=tar or scene.cur
scene.seq[m+2]=style or"fade"
end
end
function scene.swapTo(tar,style)
local S=scene.swap
if not scene.swapping and tar~=scene.cur then
scene.swapping=true
if not style then style="fade"end
S.tar=tar
S.style=style
S.time=swap[style][1]
S.mid=swap[style][2]
S.draw=swap[style][3]
widget_sel=nil
if style~="none"then SFX("swipe")end
end
end
function scene.back()
if not scene.swapping then
if backFunc[scene.cur] then backFunc[scene.cur]()end
--func when scene end
local m=#scene.seq
if m>0 then
scene.swapTo(scene.seq[m-1],scene.seq[m])
scene.seq[m],scene.seq[m-1]=nil
--Poll&Back to preScene
end
end
end
return scene

View File

@@ -1,5 +1,6 @@
local gc=love.graphics local gc=love.graphics
local N,c=gc.newImage local N,c=gc.newImage
local int=math.floor
local function T(s,t)return gc.newText(setFont(s),t)end local function T(s,t)return gc.newText(setFont(s),t)end
local function C(x,y) local function C(x,y)
c=gc.newCanvas(x,y) c=gc.newCanvas(x,y)
@@ -15,16 +16,18 @@ for i=1,13 do
blockSkinmini[i]=C(6,6) blockSkinmini[i]=C(6,6)
end end
virtualkeyIcon={} local VKI=N("/image/virtualkey.png")
for i=1,10 do VKIcon={}
virtualkeyIcon[i]=N("/image/virtualkey/"..actName[i]..".png") for i=1,#actName do
VKIcon[i]=C(36,36)
gc.draw(VKI,(i-1)%5*-36,int((i-1)*.2)*-36)
end end
gc.setColor(1,1,1) gc.setColor(1,1,1)
mouseBlock={} miniBlock={}
for i=1,7 do for i=1,7 do
local b=blocks[i][0] local b=blocks[i][0]
mouseBlock[i]=C(#b[1],#b) miniBlock[i]=C(#b[1],#b)
gc.setColor(blockColor[i]) gc.setColor(blockColor[i])
for y=1,#b do for x=1,#b[1]do for y=1,#b do for x=1,#b[1]do
if b[y][x]then if b[y][x]then
@@ -68,9 +71,12 @@ drawableText={
custom=T(80), custom=T(80),
setting_game=T(80),setting_graphic=T(80),setting_sound=T(80), setting_game=T(80),setting_graphic=T(80),setting_sound=T(80),
keyboard=T(25),joystick=T(25), keyboard=T(25),joystick=T(25),
ctrlSetHelp=T(25), ctrlSetHelp=T(30),
musicRoom=T(80), musicRoom=T(80),
nowPlaying=T(50), nowPlaying=T(50),
warning=T(30), warning=T(30),
VKTchW=T(30),
VKOrgW=T(30),
VKCurW=T(30),
} }
c=gc.setCanvas() gc.setCanvas()

View File

@@ -47,7 +47,7 @@ function Tmr.load()
loadnum=loadnum+1 loadnum=loadnum+1
if loadnum==48 then if loadnum==48 then
stat.run=stat.run+1 stat.run=stat.run+1
gotoScene("intro","none") scene.swapTo("intro","none")
end end
end end
end end

View File

@@ -73,12 +73,15 @@ local drawableTextLoad={
"next","hold", "next","hold",
"pause","finish", "pause","finish",
"custom", "custom",
"setting_game","setting_graphic","setting_sound", "setting_game",
"setting_graphic",
"setting_sound",
"keyboard","joystick", "keyboard","joystick",
"ctrlSetHelp", "ctrlSetHelp",
"musicRoom", "musicRoom",
"nowPlaying", "nowPlaying",
"warning", "warning",
"VKTchW","VKOrgW","VKCurW",
} }
function swapLanguage(l) function swapLanguage(l)
text=require("language/"..langID[l]) text=require("language/"..langID[l])
@@ -194,103 +197,12 @@ function BGM(s)
end end
end end
local swapDeck_data={
{4,0,1,1},{6,0,15,1},{5,0,9,1},{6,0,6,1},
{1,0,3,1},{3,0,12,1},{1,1,8,1},{2,1,4,2},
{3,2,13,2},{4,1,12,2},{5,2,1,2},{7,1,11,2},
{2,1,9,3},{3,0,6,3},{4,2,14,3},{1,0,4,4},
{7,1,1,4},{6,0,2,4},{5,2,6,4},{6,0,14,5},
{3,3,15,5},{4,0,7,6},{7,1,10,5},{5,0,2,6},
{2,1,1,7},{1,0,4,6},{4,1,13,5},{1,1,6,7},
{5,3,11,5},{3,2,11,7},{6,0,8,7},{4,2,12,8},
{7,0,8,9},{1,0,2,8},{5,2,4,8},{6,0,15,8},
}--Block id [ZSLJTOI] ,dir,x,y
local swap={
none={2,1,d=NULL},
flash={8,1,d=function()gc.clear(1,1,1)end},
fade={30,15,d=function()
local t=1-abs(sceneSwaping.time*.06667-1)
gc.setColor(0,0,0,t)
gc.rectangle("fill",0,0,1280,720)
end},
deck={50,8,d=function()
local t=sceneSwaping.time
gc.setColor(1,1,1)
if t>8 then
local t=max(t,15)
for i=1,51-t do
local bn=swapDeck_data[i][1]
local b=blocks[bn][swapDeck_data[i][2]]
local cx,cy=swapDeck_data[i][3],swapDeck_data[i][4]
for y=1,#b do for x=1,#b[1]do
if b[y][x]then
gc.draw(blockSkin[bn],80*(cx+x-2),80*(10-cy-y),nil,8/3)
end
end end
end
end
if t<17 then
gc.setColor(1,1,1,(8-abs(t-8))*.125)
gc.rectangle("fill",0,0,1280,720)
end
end},
}--Scene swapping animations
function gotoScene(s,style)
if not sceneSwaping and s~=scene then
style=style or"fade"
sceneSwaping={
tar=s,style=style,
time=swap[style][1],mid=swap[style][2],
draw=swap[style].d
}
widget_sel=nil
if style~="none"then
SFX("swipe")
end
end
end
function updateStat() function updateStat()
local S=players[1].stat local S=players[1].stat
for k,v in next,S do for k,v in next,S do
stat[k]=stat[k]+S[k] stat[k]=stat[k]+S[k]
end end
end end
local prevMenu={
load=love.event.quit,
intro="quit",
main="intro",
music="main",
mode="main",
custom="mode",
draw="custom",
play=function()
kb.setKeyRepeat(true)
updateStat()
saveData()
clearTask("play")
gotoScene(curMode.id~="custom"and"mode"or"custom","deck")
end,
setting_game=function()
saveSetting()
gotoScene("main")
end,
setting_control="setting_game",
setting_touch= "setting_game",
help="main",
history="help",
stat="main",
}
prevMenu.pause=prevMenu.play
prevMenu.setting_graphic=prevMenu.setting_game
prevMenu.setting_sound=prevMenu.setting_game
function back()
local t=prevMenu[scene]
if type(t)=="string"then
gotoScene(t)
else
t()
end
end
function randomTarget(P) function randomTarget(P)
if #players.alive>1 then if #players.alive>1 then
@@ -380,10 +292,10 @@ function pauseGame()
end end
end end
end end
gotoScene("pause","none") scene.swapTo("pause","none")
end end
function resumeGame() function resumeGame()
gotoScene("play","fade") scene.swapTo("play","fade")
end end
function loadGame(mode,level) function loadGame(mode,level)
--rec={} --rec={}
@@ -391,7 +303,7 @@ function loadGame(mode,level)
drawableText.modeName:set(text.modeName[mode]) drawableText.modeName:set(text.modeName[mode])
drawableText.levelName:set(modeLevel[modeID[mode]][level]) drawableText.levelName:set(modeLevel[modeID[mode]][level])
needResetGameData=true needResetGameData=true
gotoScene("play","deck") scene.swapTo("play","deck")
end end
function resetPartGameData() function resetPartGameData()
frame=30 frame=30
@@ -407,9 +319,7 @@ function resetPartGameData()
players[i]:changeAtk(randomTarget(players[i])) players[i]:changeAtk(randomTarget(players[i]))
end end
end end
for i=1,#virtualkey do restoreVirtualKey()
virtualkey[i].press=false
end
collectgarbage() collectgarbage()
end end
function resetGameData() function resetGameData()
@@ -451,14 +361,16 @@ function resetGameData()
garbageSpeed=.3 garbageSpeed=.3
pushSpeed=2 pushSpeed=2
end end
for i=1,#virtualkey do restoreVirtualKey()
virtualkey[i].press=false
end
stat.game=stat.game+1 stat.game=stat.game+1
local m,p=#freeRow,40*#players+1 local m,p=#freeRow,40*#players+1
while freeRow[p]do while freeRow[p]do
m,freeRow[m]=m-1 m,freeRow[m]=m-1
end end
for i=1,20 do
virtualkeyDown[i]=X
virtualkeyPressTime[i]=0
end
freeRow.L=#freeRow freeRow.L=#freeRow
SFX("ready") SFX("ready")
collectgarbage() collectgarbage()
@@ -473,6 +385,8 @@ function gameStart()
end end
end end
local dataOpt={ local dataOpt={
"run","game","time", "run","game","time",
"extraPiece","extraRate", "extraPiece","extraRate",
@@ -485,9 +399,6 @@ local dataOpt={
function loadData() function loadData()
userData:open("r") userData:open("r")
local t=userData:read() local t=userData:read()
if not find(t,"spin")then
t=love.data.decompress("string","zlib",t)
end
t=splitS(t,"\r\n") t=splitS(t,"\r\n")
userData:close() userData:close()
for i=1,#t do for i=1,#t do
@@ -515,12 +426,10 @@ function saveData()
userData:write(t) userData:write(t)
userData:close() userData:close()
end end
function loadSetting() function loadSetting()
userSetting:open("r") userSetting:open("r")
local t=userSetting:read() local t=userSetting:read()
if not find(t,"virtual")then
t=love.data.decompress("string","zlib",t)
end
t=splitS(t,"\r\n") t=splitS(t,"\r\n")
userSetting:close() userSetting:close()
for i=1,#t do for i=1,#t do
@@ -534,12 +443,16 @@ function loadSetting()
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=="virtualkeyAlpha"then
setting.virtualkeyAlpha=min(int(abs(toN(v))),10)
elseif elseif
--三个触摸设置项
t=="VKTchW"or t=="VKCurW"or t=="VKAlpha"
then
setting.VKTchW=min(int(abs(toN(v))),10)
elseif
--开关设置们
t=="ghost"or t=="center"or t=="grid"or t=="swap"or t=="ghost"or t=="center"or t=="grid"or t=="swap"or
t=="quickR"or t=="fine"or t=="bgblock"or t=="smo"or t=="quickR"or t=="fine"or t=="bgblock"or t=="smo"or
t=="virtualkeyIcon"or t=="virtualkeySwitch" t=="VKSwitch"or t=="VKTrack"or t=="VKIcon"
then then
setting[t]=v=="true" setting[t]=v=="true"
elseif t=="frameMul"then elseif t=="frameMul"then
@@ -561,14 +474,15 @@ function loadSetting()
setting.keyMap[i][j]=v1[j] setting.keyMap[i][j]=v1[j]
end end
end end
elseif t=="virtualkey"then elseif t=="VK"then
v=splitS(v,"/") v=splitS(v,"/")
for i=1,10 do local SK
for i=1,#v do
if v[i]then if v[i]then
virtualkey[i]=splitS(v[i],",") SK=splitS(v[i],",")
for j=1,4 do local K=VK_org[i]
virtualkey[i][j]=toN(virtualkey[i][j]) K.ava=SK[1]=="T"
end K.x,K.y,K.r=toN(SK[2]),toN(SK[3]),toN(SK[4])
end end
end end
end end
@@ -598,17 +512,21 @@ local saveOpt={
"sfx","bgm", "sfx","bgm",
"vib","voc", "vib","voc",
"virtualkeyAlpha", "VKSwitch",
"virtualkeyIcon", "VKTrack",
"virtualkeySwitch", "VKIcon",
"VKAlpha",
} }
function saveSetting() function saveSetting()
local vk={} local vk={}--virtualkey table
for i=1,10 do for i=1,#VK_org do
for j=1,4 do local V=VK_org[i]
virtualkey[i][j]=int(virtualkey[i][j]+.5) vk[i]=concat({
end--Saving a integer is better? V.ava and"T"or"F",
vk[i]=concat(virtualkey[i],",") int(V.x+.5),
int(V.y+.5),
V.r,
},",")
end--pre-pack virtualkey setting end--pre-pack virtualkey setting
local map={} local map={}
for i=1,16 do for i=1,16 do
@@ -616,11 +534,10 @@ function saveSetting()
end end
local t={ local t={
"keymap="..toS(concat(map,"/")), "keymap="..toS(concat(map,"/")),
"virtualkey="..toS(concat(vk,"/")), "VK="..toS(concat(vk,"/")),
} }
for i=1,#saveOpt do for i=1,#saveOpt do
t[i+2]=saveOpt[i].."="..toS(setting[saveOpt[i]]) t[#t+1]=saveOpt[i].."="..toS(setting[saveOpt[i]])
--not always i+2!
end end
t=concat(t,"\r\n") t=concat(t,"\r\n")
userSetting:open("w") userSetting:open("w")

View File

@@ -4,16 +4,16 @@ Patron(rmb10+):
[D*a]? [D*a]?
Future outlook: Future outlook:
Normal Things: Normal Things:
in-game setting(scene-sequence system)
powerinfo switch
splashing block
ajustable next count ajustable next count
bag line in all mode bag line in all mode
force fineese mode
highscore of most modes highscore of most modes
custom block color/direction custom block color/direction
custom sequence custom block sequence
virtual key switch(all keys)
combo mode combo mode
infinite c4w mode auto GUI in any screen size
any screen size
CC smarter(think of gaebage buffer) CC smarter(think of gaebage buffer)
fineese/bigbang mode & easier CTWC fineese/bigbang mode & easier CTWC
new AI:task-Z new AI:task-Z
@@ -24,8 +24,18 @@ Future outlook:
infinite 1v1 infinite 1v1
square mode square mode
more FXs & 3d features & animations more FXs & 3d features & animations
0.7.29:
auto-tracking virtual key,adjustable parameters!
can switch on/off virtuakeys
add 7 more key
better finesse rate calculating
block generating position on Y-axis changed
new icon for android
can use preset in custom mode with keyboard
adjusted GUI
many bug fixed
0.7.28: 0.7.28:
add fineese check add fineese check(almost useful)
code optimized code optimized
0.7.27: 0.7.27:
super O transform system super O transform system