Compare commits

...

3 Commits

Author SHA1 Message Date
MrZ_26
c14124d00c 0.7.30α 2020-02-04 19:37:25 +08:00
MrZ_26
f261906f1a 0.7.28+α 2020-02-04 19:37:06 +08:00
MrZ_26
48b68a876b 0.7.27+α 2020-02-04 19:36:54 +08:00
40 changed files with 2613 additions and 1774 deletions

Binary file not shown.

BIN
SFX/error.ogg Normal file

Binary file not shown.

BIN
SFX/error_long.ogg Normal file

Binary file not shown.

BIN
SFX/welcome.ogg Normal file

Binary file not shown.

11
ai.lua
View File

@@ -72,7 +72,7 @@ function CC_switch20G(P)
P.r,P.c=#P.cur.bk,#P.cur.bk[1]
P.curX,P.curY=blockPos[P.cur.id],21+ceil(P.fieldBeneath/30)-P.r+min(int(#P.field*.2),2)
P.freshNext()
P:freshNext()
BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])
collectgarbage()
end
@@ -119,9 +119,8 @@ local function ifoverlapAI(f,bk,x,y)
end end
end
local function resetField(f0,f,start)
::L::if f[start]then
while f[start]do
removeRow(f,start)
goto L
end
for i=start,#f0 do
f[i]=getNewRow(0)
@@ -148,9 +147,8 @@ local function getScore(field,cb,cy)
if #field==0 then return 1e99 end--PC best
for x=1,10 do
local h=#field
::L::if field[h][x]==0 and h>1 then
while field[h][x]==0 and h>1 do
h=h-1
goto L
end
height[x]=h
if x>3 and x<8 and h>highest then highest=h end
@@ -204,9 +202,8 @@ AI_think={
local cb=blocks[bn][dir]
for cx=1,11-#cb[1]do--each pos
local cy=#Tfield+1
::L::if not ifoverlapAI(Tfield,cb,cx,cy-1)then
while not ifoverlapAI(Tfield,cb,cx,cy-1)do
cy=cy-1
goto L
end--move to bottom
for i=1,#cb do
local y=cy+i-1

View File

@@ -70,7 +70,7 @@ function button:draw()
end
end
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
local switch={type="switch"}

View File

@@ -1,4 +1,5 @@
gameVersion="Alpha V0.7.25"
math.randomseed(os.time())
gameVersion="Alpha V0.7.30"
function love.conf(t)
t.identity="Techmino"--Save directory name
t.version="11.1"
@@ -9,7 +10,12 @@ function love.conf(t)
t.audio.mixwithsystem=true--Switch on to keep sysBGM
local W=t.window
W.title="Techmino "..gameVersion
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.width,W.height=1280,720
W.minwidth,W.minheight=640,360

View File

@@ -1,11 +1,6 @@
local gc=love.graphics
local setFont=setFont
local int,rnd,max,min=math.floor,math.random,math.max,math.min
local format=string.format
local ins,rem=table.insert,table.remove
local function newNext(n)
P.next[#P.next+1]={bk=blocks[n][0],id=n,color=P.gameEnv.bone and 8 or n,name=n}
end
local PCbase={
{3,3,3,0,0,0,0,0,2,2},
{3,6,6,0,0,0,0,2,2,5},
@@ -16,7 +11,7 @@ local PCbase={
{5,5,2,2,0,0,0,6,6,4},
{5,2,2,0,0,0,0,4,4,4},
}
PClist={
local PClist={
{7,7,4,5},{7,7,6,4},{7,7,2,4},{7,7,1,3},{7,7,5,6},{7,7,5,2},{7,7,5,4},{7,7,5,3},
{7,4,1,2},{7,3,5,7},{7,5,4,3},{7,5,1,2},{7,1,4,2},{7,4,2,5},{7,6,4,5},{7,5,4,2},
{7,5,6,4},{7,5,3,6},{7,2,5,6},{7,2,6,4},{7,2,1,3},{7,5,2,7},{7,5,7,2},{7,5,2,3},
@@ -37,7 +32,6 @@ local death_fall={10,9,8,7,6}
local pc_drop={50,45,40,35,30,26,22,18,15,12}
local pc_lock={55,50,45,40,36,32,30}
local pc_fall={18,16,14,12,10,9,8,7,6}
local blockColor=blockColor
local function throwBadge(S,R)--Sender/Receiver
local x1,y1,x2,y2
if S.small then
@@ -58,7 +52,7 @@ local function AITemplate(type,speedLV,next,hold,node)
return{
type="CC",
next=next,
hold=true,--hold,-------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
hold=hold,--hold,-------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
delta=AISpeed[speedLV],
node=node,
}
@@ -69,445 +63,253 @@ local function AITemplate(type,speedLV,next,hold,node)
}
end
end
loadmode={
sprint=function()
newPlayer(1,340,15)
end,
marathon=function()
newPlayer(1,340,15)
end,
master=function()
newPlayer(1,340,15)
end,
classic=function()
newPlayer(1,340,15)
end,
zen=function()
newPlayer(1,340,15)
end,
infinite=function()
newPlayer(1,340,15)
if curMode.lv==2 then
pushSpeed=1
for i=1,5 do
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,25000))
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,35000))
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,50000))
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,100000))
elseif curMode.lv==9 then
newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,200000))
end
end,
round=function()
newPlayer(1,340,15)
if curMode.lv==1 then
newPlayer(2,965,360,.5,AITemplate("9S",nil,10))
elseif curMode.lv==2 then
newPlayer(2,965,360,.5,AITemplate("CC",10,2,false,20000))
elseif curMode.lv==3 then
newPlayer(2,965,360,.5,AITemplate("CC",10,3,true,50000))
elseif curMode.lv==4 then
newPlayer(2,965,360,.5,AITemplate("CC",10,4,true,100000))
elseif curMode.lv==5 then
newPlayer(2,965,360,.5,AITemplate("CC",10,6,true,1000000))
end
garbageSpeed=1e4
end,
tsd=function()
newPlayer(1,340,15)
end,
blind=function()
newPlayer(1,340,15)
end,
dig=function()
newPlayer(1,340,15)
loadmode={}
function loadmode.sprint()
newPlayer(1,340,15)
end
function loadmode.marathon()
newPlayer(1,340,15)
end
function loadmode.master()
newPlayer(1,340,15)
end
function loadmode.classic()
newPlayer(1,340,15)
end
function loadmode.zen()
newPlayer(1,340,15)
end
function loadmode.infinite()
newPlayer(1,340,15)
if curMode.lv==2 then
pushSpeed=1
end,
survivor=function()
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,
attacker=function()
newPlayer(1,340,15)
if curMode.lv==1 then
pushSpeed=2
end
end,
tech=function()
newPlayer(1,340,15)
end,
c4wtrain=function()
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,
pctrain=function()
newPlayer(1,340,15)
Event.newPC(players[1])
end,
pcchallenge=function()
newPlayer(1,340,15)
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
local min,max
if LV==1 then min,max=3,5
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),LV+1,true,LV^2*3500))
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),LV+1,true,LV^2*3500))
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=3,5
elseif LV==2 then min,max=4,9
elseif LV==3 then min,max=7,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),LV+1,true,LV^2*3000))
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),LV+1,true,LV^2*3000))
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),true,15000+5000*(L-10)))
end
end
preField.h=20
repeat
for i=1,10 do
if preField[preField.h][i]>0 or curMode.lv==2 and preField[preField.h][i]==-1 then
goto L
end
end
preField.h=preField.h-1
until preField.h==0
::L::
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
modeEnv.bg=customRange.bg[customSel[12]]
modeEnv.bgm=customRange.bgm[customSel[13]]
end,
}
mesDisp={
--Default:font=35,white
sprint=function(P)
setFont(60)
local r=max(P.gameEnv.target-P.stat.row,0)
mStr(r,-82,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
gc.line(0,600-30*r,300,600-30*r)
end
end,
marathon=function(P)
setFont(50)
mStr(P.stat.row,-82,320)
mStr(P.gameEnv.target,-82,370)
gc.rectangle("fill",-125,375,90,4)
end,
master=function(P)
setFont(50)
mStr(P.modeData.point,-82,320)
mStr((P.modeData.event+1)*100,-82,370)
gc.rectangle("fill",-125,375,90,4)
end,
classic=function(P)
setFont(80)
local r=P.gameEnv.target*.1
mStr(r<11 and 19+r or r==11 and"00"or r==12 and"0a"or format("%x",r*10-110),-82,210)
setFont(20)
mStr("speed level",-82,290)
setFont(50)
mStr(P.stat.row,-82,320)
mStr(P.gameEnv.target,-82,370)
gc.rectangle("fill",-125,375,90,4)
end,
zen=function(P)
setFont(75)
mStr(max(200-P.stat.row,0),-82,280)
end,
infinite=function(P)
setFont(50)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
setFont(20)
mStr("Attack",-82,363)
mStr("Efficiency",-82,475)
end,
tsd=function(P)
setFont(35)
mStr("TSD",-82,407)
setFont(80)
mStr(P.modeData.event,-82,330)
end,
blind=function(P)
setFont(25)
mStr("Rows",-82,300)
mStr("Techrash",-82,420)
if curMode.lv==6 then
mStr("Point",-82,180)
setFont(60)
mStr(P.modeData.point*.1,-82,110)
end
setFont(80)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
end,
dig=function(P)
setFont(70)
mStr(P.modeData.event,-82,310)
setFont(30)
mStr("Wave",-82,375)
end,
survivor=function(P)
setFont(70)
mStr(P.modeData.event,-82,310)
setFont(30)
mStr("Wave",-82,375)
end,
defender=function(P)
setFont(60)
mStr(P.modeData.point,-82,315)
setFont(30)
mStr("RPM",-82,375)
end,
attacker=function(P)
setFont(60)
mStr(P.modeData.point,-82,315)
setFont(30)
mStr("RPM",-82,375)
end,
tech=function(P)
setFont(50)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
setFont(20)
mStr("Attack",-82,363)
mStr("Efficiency",-82,475)
end,
c4wtrain=function(P)
setFont(50)
mStr(max(100-P.stat.row,0),-82,220)
mStr(P.combo,-82,310)
mStr(P.modeData.point,-82,400)
setFont(20)
mStr("combo",-82,358)
mStr("max combo",-82,450)
end,
pctrain=function(P)
setFont(22)
mStr("Perfect Clear",-82,412)
setFont(80)
mStr(P.stat.pc,-82,330)
end,
pcchallenge=function(P)
setFont(22)
mStr("Perfect Clear",-82,432)
setFont(80)
mStr(P.stat.pc,-82,350)
setFont(50)
mStr(max(100-P.stat.row,0),-82,250)
gc.setColor(.5,.5,.5)
if frame>179 then
local y=72*(7-(P.stat.piece+(P.hold.id>0 and 2 or 1))%7)-36
gc.line(320,y,442,y)
end
end,
techmino49=function(P)
setFont(40)
mStr(#players.alive.."/49",-82,175)
mStr(P.ko,-70,215)
setFont(25)
gc.print("KO",-127,225)
gc.setColor(1,.5,0,.6)
gc.print(P.badge,-47,227)
gc.setColor(1,1,1)
setFont(30)
gc.print(up0to4[P.strength],-132,290)
for i=1,P.strength do
gc.draw(badgeIcon,16*i-138,260)
end
end,
techmino99=function(P)
setFont(40)
mStr(#players.alive.."/99",-82,175)
mStr(P.ko,-70,215)
setFont(25)
gc.print("KO",-127,225)
gc.setColor(1,.5,0,.6)
gc.print(P.badge,-47,227)
gc.setColor(1,1,1)
setFont(30)
gc.print(up0to4[P.strength],-132,290)
for i=1,P.strength do
gc.draw(badgeIcon,16*i-138,260)
end
end,
drought=function(P)
setFont(75)
mStr(max(100-P.stat.row,0),-82,280)
end,
custom=function(P)
if P.gameEnv.puzzle or P.gameEnv.target>1e10 then
setFont(25)
mStr("Rows",-82,290)
setFont(60)
mStr(P.stat.row,-82,225)
else
setFont(60)
mStr(max(P.gameEnv.target-P.stat.row,0),-82,240)
end
if P.gameEnv.puzzle and P.modeData.event==0 then
gc.setLineWidth(3)
for y=1,preField.h do for x=1,10 do
local B=preField[y][x]
if B>7 then
gc.setColor(blockColor[B])
gc.rectangle("line",30*x-23,607-30*y,16,16)
elseif B>0 then
local c=blockColor[B]
gc.setColor(c[1],c[2],c[3],.6)
gc.rectangle("line",30*x-25,605-30*y,20,20)
gc.rectangle("line",30*x-20,610-30*y,10,10)
elseif B==-1 then
gc.setColor(1,1,1,.4)
gc.line(30*x-25,605-30*y,30*x-5,625-30*y)
gc.line(30*x-25,625-30*y,30*x-5,605-30*y)
end
end end
for _=1,5 do
players[1]:garbageRise(10,1,rnd(10))
end
end
}
end
function loadmode.solo()
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
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
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
function loadmode.techmino99()
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
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
preField.h=20
repeat
for i=1,10 do
if preField[preField.h][i]>0 or curMode.lv==2 and preField[preField.h][i]==-1 then
goto L
end
end
preField.h=preField.h-1
until preField.h==0
::L::
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
modeEnv.bg=customRange.bg[customSel[12]]
modeEnv.bgm=customRange.bgm[customSel[13]]
end
-------------------------<Events>-------------------------
Event={null=null}
Event={null=NULL}
function Event.reach_winCheck(P)
if P.stat.row>=P.gameEnv.target then
Event.win(P)
@@ -806,8 +608,13 @@ function Event.c4w_reach(P)
end
end
function Event.newPC(P)
if P.curY+P.r>5-P.stat.row%4+#P.clearing then
Event.lose(P)
local r=P.field;r=r[#r]
if r then
local c=0
for i=1,10 do if r[i]>0 then c=c+1 end end
if c<5 then
Event.lose(P)
end
end
if P.stat.piece%4==0 and #P.field==0 then
P.modeData.event=P.modeData.event==0 and 1 or 0
@@ -820,7 +627,7 @@ function Event.newPC(P)
elseif b<5 then b=7-b
end
end
P:newNext(b)
P.next[#P.next+1]={bk=blocks[b][0],id=b,color=b,name=b}--P:newNext(b)'s simple version!
end
P.counter=P.stat.piece==0 and 20 or 0
newTask(Event_task.PC,P)
@@ -906,7 +713,7 @@ function Event_task.dig_normal(P)
P.counter=P.counter+1
if P.counter>=max(90,180-P.modeData.event)then
P.counter=0
garbageRise(10,1,rnd(10))
P:garbageRise(10,1,rnd(10))
P.modeData.event=P.modeData.event+1
end
end
@@ -915,7 +722,7 @@ function Event_task.dig_lunatic(P)
P.counter=P.counter+1
if P.counter>=max(45,80-.3*P.modeData.event)then
P.counter=0
garbageRise(11+P.modeData.event%3,1,rnd(10))
P:garbageRise(11+P.modeData.event%3,1,rnd(10))
P.modeData.event=P.modeData.event+1
end
end
@@ -926,7 +733,7 @@ function Event_task.survivor_easy(P)
P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1}
P.atkBuffer.sum=P.atkBuffer.sum+1
P.stat.recv=P.stat.recv+1
if P.modeData.event==45 then showText(P,text.maxspeed,"appear",100,-140,.6)end
if P.modeData.event==45 then P:showText(text.maxspeed,"appear",100,-140,.6)end
P.counter=0
P.modeData.event=P.modeData.event+1
end
@@ -943,7 +750,7 @@ function Event_task.survivor_normal(P)
d%4==3 and{pos=rnd(10),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3}
P.atkBuffer.sum=P.atkBuffer.sum+d%4+1
P.stat.recv=P.stat.recv+d%4+1
if P.modeData.event==45 then showText(P,text.maxspeed,"appear",100,-140,.6)end
if P.modeData.event==45 then P:showText(text.maxspeed,"appear",100,-140,.6)end
P.counter=0
P.modeData.event=d
end
@@ -960,7 +767,7 @@ function Event_task.survivor_hard(P)
local R=(P.modeData.event%3<2 and 1 or 3)
P.atkBuffer.sum=P.atkBuffer.sum+R
P.stat.recv=P.stat.recv+R
if P.modeData.event==60 then showText(P,text.maxspeed,"appear",100,-140,.6)end
if P.modeData.event==60 then P:showText(text.maxspeed,"appear",100,-140,.6)end
P.counter=0
P.modeData.event=P.modeData.event+1
end
@@ -973,7 +780,7 @@ function Event_task.survivor_lunatic(P)
P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}
P.atkBuffer.sum=P.atkBuffer.sum+4
P.stat.recv=P.stat.recv+4
if P.modeData.event==60 then showText(P,text.maxspeed,"appear",100,-140,.6)end
if P.modeData.event==60 then P:showText(text.maxspeed,"appear",100,-140,.6)end
P.counter=0
P.modeData.event=P.modeData.event+1
end
@@ -991,7 +798,7 @@ function Event_task.survivor_ultimate(P)
P.atkBuffer.sum=P.atkBuffer.sum+20
P.stat.recv=P.stat.recv+20
P.counter=0
if P.modeData.event==31 then showText(P,text.maxspeed,"appear",100,-140,.6)end
if P.modeData.event==31 then P:showText(text.maxspeed,"appear",100,-140,.6)end
P.modeData.event=P.modeData.event+1
end
end
@@ -1001,7 +808,7 @@ function Event_task.defender_normal(P)
local t=360-P.modeData.event*2
if P.counter>=t then
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}
end
P.atkBuffer.sum=P.atkBuffer.sum+3
@@ -1011,16 +818,16 @@ function Event_task.defender_normal(P)
D.event=D.event+1
D.point=int(108e3/(360-D.event*2))*.1
if D.event==25 then
showText(P,text.great,"appear",100,-140,.6)
P:showText(text.great,"appear",100,-140,.6)
pushSpeed=2
P.dropDelay,P.gameEnv.drop=20,20
elseif D.event==50 then
showText(P,text.awesome,"appear",100,-140,.6)
P:showText(text.awesome,"appear",100,-140,.6)
pushSpeed=3
P.dropDelay,P.gameEnv.drop=10,10
elseif D.event==90 then
P.dropDelay,P.gameEnv.drop=5,5
showText(P,text.maxspeed,"appear",100,-140,.6)
P:showText(text.maxspeed,"appear",100,-140,.6)
end
end
end
@@ -1031,7 +838,7 @@ function Event_task.defender_lunatic(P)
local t=240-2*P.modeData.event
if P.counter>=t then
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}
end
P.atkBuffer.sum=P.atkBuffer.sum+4
@@ -1041,15 +848,15 @@ function Event_task.defender_lunatic(P)
D.event=D.event+1
D.point=int(144e3/(240-2*D.event))*.1
if D.event==25 then
showText(P,text.great,"appear",100,-140,.6)
P:showText(text.great,"appear",100,-140,.6)
pushSpeed=3
P.dropDelay,P.gameEnv.drop=4,4
elseif D.event==50 then
showText(P,text.awesome,"appear",100,-140,.6)
P:showText(text.awesome,"appear",100,-140,.6)
pushSpeed=4
P.dropDelay,P.gameEnv.drop=3,3
elseif D.event==75 then
showText(P,text.maxspeed,"appear",100,-140,.6)
P:showText(text.maxspeed,"appear",100,-140,.6)
P.dropDelay,P.gameEnv.drop=2,2
end
end
@@ -1076,10 +883,10 @@ function Event_task.attacker_hard(P)
D.event=D.event+1
D.point=int(72e4/t)*.1
if D.event==20 then
showText(P,text.great,"appear",100,-140,.6)
P:showText(text.great,"appear",100,-140,.6)
pushSpeed=3
elseif D.event==50 then
showText(P,text.maxspeed,"appear",100,-140,.6)
P:showText(text.maxspeed,"appear",100,-140,.6)
end
end
end
@@ -1112,13 +919,13 @@ function Event_task.attacker_ultimate(P)
D.event=D.event+1
D.point=int(s*36e3/t)*.1
if D.event==10 then
showText(P,text.great,"appear",100,-140,.6)
P:showText(text.great,"appear",100,-140,.6)
pushSpeed=4
elseif D.event==20 then
showText(P,text.awesome,"appear",100,-140,.6)
P:showText(text.awesome,"appear",100,-140,.6)
pushSpeed=5
elseif D.event==30 then
showText(P,text.maxspeed,"appear",100,-140,.6)
P:showText(text.maxspeed,"appear",100,-140,.6)
end
end
end
@@ -1136,9 +943,7 @@ function Event_task.PC(P)
ins(P.visTime,1,getNewRow(20))
end
P.fieldBeneath=P.fieldBeneath+120
for i=1,#P.clearing do
P.clearing[i]=P.clearing[i]+4
end
P.curY=P.curY+4
P:freshgho()
return true
end
@@ -1168,7 +973,7 @@ local Fkey_func={
end
P.keyPressing[9]=true
else
changeAtkMode(P.atkMode<3 and P.atkMode+2 or 5-P.atkMode)
P:changeAtkMode(P.atkMode<3 and P.atkMode+2 or 5-P.atkMode)
P.swappingAtkMode=30
end
end,
@@ -1490,6 +1295,20 @@ defaultModeEnv={
dropPiece="tech_reach_ultimate",
bg="matrix",bgm="secret7th",
},
{
drop=1e99,lock=60,
freshLimit=15,
fine=true,fineKill=true,
dropPiece="tech_reach_hard",
bg="flink",bgm="infinite",
},
{
drop=1e99,lock=60,
freshLimit=15,
fine=true,fineKill=true,
dropPiece="tech_reach_ultimate",
bg="flink",bgm="infinite",
},
},
c4wtrain={
{

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额外抵挡
连击0,0,1,1,2,2,3,3,4,4,3……
游戏方法:
控制系统提供的一个个方块,每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话)
完成当前游戏模式中的目标或者是活到最后即算胜利.
旋转系统:
使用Techmino专属旋转系统,细节不赘述
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抵消最先受到的攻击
没有用上的额外抵挡会被丢弃,最后剩下的攻击力会发送给对手
抵消逻辑:发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力抵消受到的攻击,多余的攻击力会发送给对手,没有用上的额外抵挡会被丢弃。
攻击延迟消2/3的攻击生效最快消四其次spin攻击生效较慢高连击生效最慢b2b或者b3b增加攻击力的同时也会减缓一点生效时间mini大幅增加生效时间。
back to back点数说明取值范围0~1200
在40及以上特殊消除时b2b,在1000以上特殊消除时b3b,1200封顶
消四+100
空spin加20不超过1000
spin1~3+50/100/180 (mini*.5)
普通消除-250
1000以上空放一块-40(不减到低于1000)
吃鸡模式:
许多玩家同时进行一局游戏其它的是AI不是真人坚持到最后的玩家胜利。随着玩家数量的减少方块下落/垃圾生效速度/垃圾升起速度都会增加。淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力。
玩家可选四个攻击模式:
1.随机每次攻击后10%随机锁定一个玩家
2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家
3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新)
4.反击攻击所有锁定自己的玩家AOE若无则伏击随机玩家
模式说明:
竞速:
用你最快的速度消除40行(据难度而定)吧!
马拉松:
根据总消行数,速度会逐渐加快,消除两百行吧!(easy和hard就是normal开始和结束的速度,消除200行不加速)
大师:
马拉松进化版,如果觉得马拉松太简单了久玩这个吧,每一个难度都是一层境界,L难度和U难度攒到500点数通关,final难度为上级者专属游戏模式,不建议游玩.
经典:
使用低速控制设置在高速下落时尽可能消除更多的行,没有通关目标.(到90有"彩蛋")
禅:
闲得无聊,只是想单纯地打打块地时候可以玩此模式,无重力消除200行.
无尽:
无尽模式,边上会显示玩家的消行数和攻击效率,适合科研(术语).
单挑:
和一个电脑玩家单挑,带加号的和最后一个模式是超强机器人(仅限Windows平台),试试你能稳定打败多难的对手吧!
回合制:
玩法同单挑模式,只不过只有当一个人放下一个方块后另一个人才能放下一块.
仅TSD:
这个模式中,玩家必须用TSD(T spin double)的方式消除,否则直接判负,你能连续打出多少个TSD呢?
隐形:
根据不同难度,场地内(甚至当前方块)会隐形,看看你能活多久吧!(GM难度为类似TGM3的GM Roll,用于上级者练习)
挖掘:
每隔一定时间,系统会向场地的低端添加一行垃圾行,间隔会随着波数增加而越来越短,你能顶住几波呢?
生存:
每隔一定时间,系统会向玩家的垃圾缓冲槽中添加垃圾行,释放速度和间隔会随着波数增加而越来越短,玩家可以将其抵消也可以让其释放,尽可能活更久的时间.
防守:
系统会向玩家的垃圾缓冲槽中添加难消除的垃圾行,释放速度和间隔会随着波数增加而越来越短,玩家要尽量抵消他们来让自己存活更久.
进攻:
当玩家的攻击缓冲槽空时,系统会向玩家的垃圾缓冲槽中添加大量的垃圾行(高难度下后期甚至会远超过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.

View File

@@ -1,164 +0,0 @@
local gc=love.graphics
local int,rnd=math.floor,math.random
local rem=table.remove
function randomTarget(p)
if #players.alive>1 then
local r
::L::
r=players.alive[rnd(#players.alive)]
if r==p then goto L end
return r
end
end
function freshMostDangerous()
mostDangerous,secDangerous=nil
local m,m2=0,0
for i=1,#players.alive do
local h=#players.alive[i].field
if h>=m then
mostDangerous,secDangerous=players.alive[i],mostDangerous
m,m2=h,m
elseif h>=m2 then
secDangerous=players.alive[i]
m2=h
end
end
end
function freshMostBadge()
mostBadge,secBadge=nil
local m,m2=0,0
for i=1,#players.alive do
local h=players.alive[i].badge
if h>=m then
mostBadge,secBadge=players.alive[i],mostBadge
m,m2=h,m
elseif h>=m2 then
secBadge=players.alive[i]
m2=h
end
end
end
function royaleLevelup()
gameStage=gameStage+1
local spd
if(gameStage==3 or gameStage>4)and players[1].alive then
players[1]:showText(text.royale_remain(#players.alive),"beat",50,-100,.3)
end
if gameStage==2 then
spd=30
elseif gameStage==3 then
spd=15
garbageSpeed=.6
if players[1].alive then BGM("cruelty")end
elseif gameStage==4 then
spd=10
pushSpeed=3
elseif gameStage==5 then
spd=5
garbageSpeed=1
elseif gameStage==6 then
spd=3
if players[1].alive then BGM("final")end
end
for i=1,#players.alive do
players.alive[i].gameEnv.drop=spd
end
if curMode.lv==3 then
for i=1,#players.alive do
local P=players.alive[i]
P.gameEnv.drop=int(P.gameEnv.drop*.3)
if P.gameEnv.drop==0 then
P.curY=P.y_img
P.gameEnv._20G=true
if P.AI_mode=="CC"then CC_switch20G(P)end--little cheating,never mind
end
end
end
end
function loadGame(mode,level)
--rec={}
curMode={id=modeID[mode],lv=level}
drawableText.modeName:set(text.modeName[mode])
drawableText.levelName:set(modeLevel[modeID[mode]][level])
needResetGameData=true
gotoScene("play","deck")
end
function resetPartGameData()
frame=30
destroyPlayers()
loadmode[curMode.id]()
if modeEnv.task then
for i=1,#players do
newTask(Event_task[modeEnv.task],players[i])
end
end
if modeEnv.royaleMode then
for i=1,#players do
players[i]:changeAtk(randomTarget(players[i]))
end
end
for i=1,#virtualkey do
virtualkey[i].press=false
end
collectgarbage()
end
function resetGameData()
gamefinished=false
frame=0
garbageSpeed=1
pushSpeed=3
pauseTime=0--Time paused
pauseCount=0--Times paused
destroyPlayers()
local E=defaultModeEnv[curMode.id]
modeEnv=E[curMode.lv]or E[1]
loadmode[curMode.id]()--bg/bgm need redefine in custom,so up here
if modeEnv.task then
for i=1,#players do
newTask(Event_task[modeEnv.task],players[i])
end
end
curBG=modeEnv.bg
BGM(modeEnv.bgm)
FX_badge={}
FX_attack={}
for _,v in next,PTC.dust do
v:release()
end
for i=1,#players do
if not players[i].small then
PTC.dust[i]=PTC.dust0:clone()
PTC.dust[i]:start()
end
end
if modeEnv.royaleMode then
for i=1,#players do
players[i]:changeAtk(randomTarget(players[i]))
end
mostBadge,mostDangerous,secBadge,secDangerous=nil
gameStage=1
garbageSpeed=.3
pushSpeed=2
end
for i=1,#virtualkey do
virtualkey[i].press=false
end
stat.game=stat.game+1
local m,p=#freeRow,40*#players+1
while freeRow[p]do
m,freeRow[m]=m-1
end
freeRow.L=#freeRow
SFX("ready")
collectgarbage()
end
function gameStart()
SFX("start")
for P=1,#players do
P=players[P]
P:resetblock()
P.timing=true
P.control=true
end
end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 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 actName={
"左移:","右移:",
"顺时针旋转:","逆时针旋转:","180°旋转:",
"硬降:","软降:",
"暂存:","功能键:",
"重新开始:",
"左瞬移:","右瞬移:","软降到底:","软降一格:","软降四格:","软降十格:",
"落在最左:","落在最右:","列在最左:","列在最右:",
}
return{
atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
@@ -67,8 +76,11 @@ return{
setting_sound="声音设置",
musicRoom="音乐室",
nowPlaying="正在播放:",
VKTchW="触摸点权重",
VKOrgW="原始点权重",
VKCurW="当前点权重",
actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","功能键:","重新开始:","左瞬移:","右瞬移:","软降到底:"},
actName=actName,
modeName={
[0]="自定义",
"竞速","马拉松","大师","经典","","无尽","单挑","回合制","仅TSD","隐形",
@@ -103,17 +115,15 @@ return{
load={"加载语音ing","加载音乐ing","加载音效ing","加载完成",},
tips={
"不是动画,真的在加载!",
"整个游戏都是MrZ完成的!",
"大满贯10连击消四全清!",
"<方块研究所>有一个Nspire-CX版本!",
"B2B2B???",
"B2B2B2B存在吗?",
"MEGACMB!",
"ALLSPIN!",
"O型回旋三清?",
"只用一个输入设备就可以游玩了",
"O spin triple!",
"Miya:喵!",
"225238922,哔哩哔哩 干杯~",
"225238922 哔哩哔哩 干杯~",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"合群了就会消失,但是消失不代表没有意义",
"学会使用两个旋转键,三个更好",
@@ -128,9 +138,12 @@ return{
"2.7182818284590452353",
"Let-The-Bass-Kick!",
"使用love2d引擎制作",
"哪里不舒服的话先看看设置有没有你想要",
"有疑问?先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~",
"本游戏不叫铁壳米诺",
"不要按F8",
"秘密代码:626",
"CLASSIC SEXY RUSSIAN BLOCKS",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
},
stat={
"游戏运行次数:",
@@ -150,6 +163,8 @@ return{
"B2B数:",
"PC数:",
"效率:",
"多余操作:",
"最简操作率:",
},
help={
"好像也没啥好帮助的吧?就当是关于了",
@@ -160,10 +175,18 @@ return{
"使用LOVE2D引擎",
"作者:MrZ 邮箱:1046101471@qq.com",
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:Miya",
"使用工具:VScode,GFIE,Beepbox,Goldwave,Cold_Clear",
"特别感谢:Farter,Flyz,196,Teatube,T830,[所有测试人员]和 你!",
"错误或者建议请附带相关信息发送到作者邮箱~",
},
used=[[
使用工具:
Beepbox
GFIE
Goldwave
使用库:
Cold_Clear[MinusKelvin]
simple-love-lights[dylhunn]
]],
support="支持作者",
group="官方QQ群",
warning="禁 止 私 自 传 播",
@@ -202,11 +225,11 @@ return{
start1="消除开始",
start2="拼图开始",
draw="画图(D)",
set1="40行",
set2="1v1",
set3="无尽",
set4="隐形",
set5="极限",
set1="40行(1)",
set2="1v1(2)",
set3="无尽(3)",
set4="隐形(4)",
set5="极限(5)",
back=BK,
},
draw={
@@ -244,6 +267,9 @@ return{
sdarrD="-",sdarrU="+",
quickR="快速重新开始",
swap="组合键切换攻击模式",
fine="极简操作提示音",
ctrl="键位设置",
touch="触屏设置",
back=BK,
},
setting_graphic={
@@ -272,16 +298,32 @@ return{
voc="语音",
back=BK,
},
setting_control={
setting_key={
back=BK,
},
setting_touch={
hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end,
hide="显示虚拟按键",
track="按键自动跟踪",
tkset="跟踪设置",
default="默认组合",
snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return setting.virtualkeyAlpha.."0%"end,
alpha=function()return setting.VKAlpha.."0%"end,
icon="图标",
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,
},
help={

View File

@@ -1,4 +1,13 @@
local BK="返回"
local actName={
"左移:","右移:",
"顺时针旋转:","逆时针旋转:","180°旋转:",
"硬降:","软降:",
"暂存:","功能键:",
"重新开始:",
"左瞬移:","右瞬移:","软降到底:","软降一格:","软降四格:","软降十格:",
"落在最左:","落在最右:","列在最左:","列在最右:",
}
return{
atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
@@ -67,8 +76,11 @@ return{
setting_sound="声音设置",
musicRoom="音乐室",
nowPlaying="正在播放:",
VKTchW="触摸点权重",
VKOrgW="原始点权重",
VKCurW="当前点权重",
actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","功能键:","重新开始:","左瞬移:","右瞬移:","软降到底:"},
actName=actName,
modeName={
[0]="自定义",
"竞速","马拉松","大师","经典","","无尽","单挑","回合制","仅TSD","隐形",
@@ -103,17 +115,15 @@ return{
load={"加载语音ing","加载音乐ing","加载音效ing","加载完成",},
tips={
"不是动画,真的在加载!",
"整个游戏都是MrZ完成的!",
"大满贯10连击消四全清!",
"<方块研究所>有一个Nspire-CX版本!",
"B2B2B???",
"B2B2B2B存在吗?",
"MEGACMB!",
"ALLSPIN!",
"O型回旋三清?",
"只用一个输入设备就可以游玩了",
"O型回旋三清!",
"Miya:喵!",
"225238922,哔哩哔哩 干杯~",
"225238922 哔哩哔哩 干杯~",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"合群了就会消失,但是消失不代表没有意义",
"学会使用两个旋转键,三个更好",
@@ -128,9 +138,12 @@ return{
"2.7182818284590452353",
"Let-The-Bass-Kick!",
"使用love2d引擎制作",
"哪里不舒服的话先看看设置有没有你想要",
"有疑问?先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~",
"郑重声明本游戏不叫[铁壳米诺]",
"不要按F8",
"秘密代码:626",
"CLASSIC SEXY RUSSIAN BLOCKS",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
},
stat={
"游戏运行次数:",
@@ -150,6 +163,8 @@ return{
"满贯数:",
"全清数:",
"效率:",
"多余操作:",
"最简操作率:",
},
help={
"好像也没啥好帮助的吧?就当是关于了",
@@ -160,10 +175,18 @@ return{
"使用LOVE2D引擎",
"作者:MrZ 邮箱:1046101471@qq.com",
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:Miya",
"使用工具:VScode,GFIE,Beepbox,Goldwave,Cold_Clear",
"特别感谢:Farter,Flyz,196,Teatube,T830,[所有测试人员]和 你!",
"错误或者建议请附带相关信息发送到作者邮箱~",
},
used=[[
使用工具:
Beepbox
GFIE
Goldwave
使用库:
Cold_Clear[MinusKelvin]
simple-love-lights[dylhunn]
]],
support="支持作者",
group="官方QQ群",
warning="禁 止 私 自 传 播",
@@ -202,11 +225,11 @@ return{
start1="消除开始",
start2="拼图开始",
draw="画图(D)",
set1="40行",
set2="1v1",
set3="无尽",
set4="隐形",
set5="极限",
set1="40行(1)",
set2="1v1(2)",
set3="无尽(3)",
set4="隐形(4)",
set5="极限(5)",
back=BK,
},
draw={
@@ -245,6 +268,9 @@ return{
sdarrD="-",sdarrU="+",
quickR="快速重新开始",
swap="组合键切换攻击模式",
fine="极简操作提示音",
ctrl="键位设置",
touch="触屏设置",
back=BK,
},
setting_graphic={
@@ -273,16 +299,32 @@ return{
voc="语音",
back=BK,
},
setting_control={
setting_key={
back=BK,
},
setting_touch={
hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end,
hide="显示虚拟按键",
track="按键自动跟踪",
tkset="跟踪设置",
default="默认组合",
snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return setting.virtualkeyAlpha.."0%"end,
alpha=function()return setting.VKAlpha.."0%"end,
icon="图标",
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,
},
help={

View File

@@ -1,4 +1,11 @@
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{
atkModeName={"Random","Badges","K.O.s","Counters"},
royale_remain=function(n)return n.." Players Remain"end,
@@ -67,8 +74,11 @@ return{
setting_sound="Sound setting",
musicRoom="Music Room",
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={
[0]="Custom",
"Sprint","Marathon","Master","Classic","Zen","Infinite","1v1","Round","TSD-only","Blind",
@@ -103,17 +113,15 @@ return{
load={"Loading VOICE","Loading BGM","Loading SFX","Finished",},
tips={
"Not animation,real loading!",
"The WHOLE game is made by MrZ!",
"Back to Back 10 combo Techrash PC!",
"Techmino has a Nspire-CX edition!",
"B2B2B???",
"Is B2B2B2B possible?",
"MEGACMB!",
"ALLSPIN!",
"O spin triple?",
"You can play with any input device!",
"O spin triple!",
"Miya:Nya!",
"225238922,Bilibili cheers!",
"225238922 Bilibili cheers!",
"Playing too much = taking drugs",
"Disappearing doesn't mean useless",
"Try to use two rotate button,three better",
@@ -129,8 +137,12 @@ return{
"Let-The-Bass-Kick!",
"Powered by love2d",
"Find out what's in the setting!",
"Any suggestions to author!~",
"Techmino=Technique+tetromino",
"Any suggestions to author!",
"DO NOT PRESS F8",
"Secret code:626",
"Techmino=Technique+Tetromino",
"CLASSIC SEXY RUSSIAN BLOCKS",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
},
stat={
"Games run:",
@@ -140,7 +152,7 @@ return{
"Rotate:",
"Hold:",
"Block used:",
"Rows cleared:",
"Lines cleared:",
"Attack:",
"Sent:",
"Receive:",
@@ -150,6 +162,8 @@ return{
"B2B:",
"PC:",
"Efficiency:",
"Finesse error:",
"Finesse rate:",
},
help={
"I don't think you need \"help\".",
@@ -159,11 +173,19 @@ return{
"",
"Powered by LOVE2D",
"Author:MrZ E-mail:1046101471@qq.com",
"Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ VOICE:Miya",
"Tool used:VScode,GFIE,Beepbox,Goldwave,Cold_Clear",
"Program:MrZ Art:MrZ Music:MrZ SFX:MrZ VOICE:Miya",
"Special thanks:Farter,Flyz,196,Teatube,T830,[all test staff] and YOU!",
"Any bugs/suggestions to my E-mail.",
},
used=[[
Tool used:
Beepbox
GFIE
Goldwave
Lib used:
Cold_Clear[MinusKelvin]
simple-love-lights[dylhunn]
]],
support="Support Author",
group="Official QQ Group",
warning="DO NOT DISTRIBUTE",
@@ -202,11 +224,11 @@ return{
start1="Clear Start",
start2="Puzzle Start",
draw="Draw(D)",
set1="40L",
set2="1v1",
set3="infinite",
set4="blind",
set5="master",
set1="40L(1)",
set2="1v1(2)",
set3="infinite(3)",
set4="blind(4)",
set5="master(5)",
back=BK,
},
draw={
@@ -244,7 +266,8 @@ return{
sdarrD="-",sdarrU="+",
quickR="Quick restart",
swap="Combo key to change ATK mode",
ctrl="Control Setting",
fine="Finesse error SFX",
ctrl="Key Setting",
touch="Touch Setting",
back=BK,
},
@@ -262,7 +285,7 @@ return{
shakeFX="Shake FX level",
atkFX="ATK FX level",
fullscreen="Fullscreen",
frame="drawFPS",
frame="draw FPS",
back=BK,
},
setting_sound={
@@ -274,16 +297,32 @@ return{
voc="VOC",
back=BK,
},
setting_control={
setting_key={
back=BK,
},
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",
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="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,
},
help={

80
light.lua Normal file
View File

@@ -0,0 +1,80 @@
--LIGHT MODULE(Optimized by MrZ,Original on github/love2d community/simple-love-lights)
--Heavily based on mattdesl's libGDX implementation:
--https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows
local gc=love.graphics
local C=gc.clear
local shadowMapShader=gc.newShader("shadowMapShader.cs")--Shader for caculating the 1D shadow map.
local lightRenderShader=gc.newShader("lightRenderShader.cs")--Shader for rendering blurred lights and shadows.
Lights={}--Lightsource objects
local Lights=Lights
--Private--
local function move(L,x,y)
L.x,L.y=x,y
end
local function setPow(L,pow)
L.size=pow
end
local function destroy(L)
L.blackCanvas:release()
L.shadowCanvas:release()
L.renderCanvas:release()
end
local function draw(L)
local r,g,b,a=love.graphics.getColor()
gc.setCanvas(L.blackCanvas)C()
gc.setCanvas(L.shadowCanvas)C()
gc.setCanvas(L.renderCanvas)C()
lightRenderShader:send("xresolution",L.size);
shadowMapShader:send("yresolution",L.size);
--初始化数据
local X=L.x-L.size*.5
local Y=L.y-L.size*.5
--整束光的左上角
gc.translate(-X,-Y)
L.blackCanvas:renderTo(L.blackFn)
gc.translate(X,Y)
--渲染遮光物
gc.setShader(shadowMapShader)
gc.setCanvas(L.shadowCanvas)
gc.draw(L.blackCanvas)
--根据遮光物渲染阴影画布
gc.setShader(lightRenderShader)
gc.setCanvas(L.renderCanvas)
gc.draw(L.shadowCanvas,0,0,0,1,L.size)
--根据阴影画布渲染光画布
gc.setShader()gc.setCanvas()gc.setBlendMode("add")
--准备渲染
gc.setColor(r,g,b,a)
gc.draw(L.renderCanvas,X,Y+L.size,0,1,-1)
--渲染到屏幕
gc.setBlendMode("alpha")
--复位
end
--Public--
function drawLight()
for i=1,#Lights do
Lights[i]:draw()
end
end
function clearLight(L)
for i=1,#Lights do
Lights[i]:destroy()
Lights[i]=nil
end
end
function addLight(x,y,R,F)
local id=#Lights+1
Lights[id]={
id=id,
x=x,y=y,size=R,
blackCanvas=gc.newCanvas(R,R),--遮挡物画布
shadowCanvas=gc.newCanvas(R,1),--1D视深画布
renderCanvas=gc.newCanvas(R,R),--灯光画布
blackFn=F,--遮挡物绘图函数
--方法
move=move,
setPow=setPow,
draw=draw,
destroy=destroy,
}
end

30
lightRenderShader.cs Normal file
View File

@@ -0,0 +1,30 @@
#define PI 3.14
extern float xresolution;
//从1D距离map采样
float samp(vec2 coord,float r,Image u_texture){
return step(r,Texel(u_texture,coord).r);
}
vec4 effect(vec4 color,Image texture,vec2 texture_coords,vec2 screen_coords){
//直角转极坐标用于采样1D材质的y总是0
vec2 norm=texture_coords.st*2.-1.;
float r=length(norm);
vec2 tc=vec2((atan(norm.y,norm.x)+PI)/(2.*PI),0.);
//根据离光源距离放大模糊系数,模拟影子淡出
float blur=(1./xresolution)*smoothstep(0.,1.,r);
//简易高斯模糊
float sum=
samp(vec2(tc.x-4.*blur,tc.y),r,texture)*.5
+samp(vec2(tc.x-3.*blur,tc.y),r,texture)*.9
+samp(vec2(tc.x-2.*blur,tc.y),r,texture)*.12
+samp(vec2(tc.x-1.*blur,tc.y),r,texture)*.15
+samp(tc,r,texture)*.16//The center tex coord,which gives us hard shadows.
+samp(vec2(tc.x+1.*blur,tc.y),r,texture)*.15
+samp(vec2(tc.x+2.*blur,tc.y),r,texture)*.12
+samp(vec2(tc.x+3.*blur,tc.y),r,texture)*.9
+samp(vec2(tc.x+4.*blur,tc.y),r,texture)*.5;
//sum值为亮度(0~1)
//乘上距离得到逐渐变淡的光线
return vec4(vec3(1.),sum*smoothstep(1.,.1,r));
}

373
list.lua
View File

@@ -1,10 +1,13 @@
local gc=love.graphics
local tc,kb=love.touch,love.keyboard
local sys=love.system
local fs=love.filesystem
local mobile=system=="Android"or system=="iOS"
actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","func","restart","insLeft","insRight","insDown"}
actName={
"moveLeft","moveRight",
"rotRight","rotLeft","rotFlip",
"hardDrop","softDrop",
"hold","func",
"restart",
"insLeft","insRight","insDown","down1","down4","down10",
"dropLeft","dropRight","addLeft","addRight",--Super contorl system
}
color={
red={1,0,0},
green={0,1,0},
@@ -53,12 +56,13 @@ blockColor={
color.darkGreen,
}
sfx={
"welcome",
"button","swipe",
"ready","start","win","fail","collect",
"move","rotate","rotatekick","hold",
"prerotate","prehold",
"lock","drop","fall",
"reach",
"error","error_long","reach",
"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","ren_10","ren_11","ren_mega",
"clear_1","clear_2","clear_3","clear_4",
"spin_0","spin_1","spin_2","spin_3",
@@ -178,10 +182,10 @@ modeLevel={
tsd={"NORMAL","HARD"},
blind={"EASY","HARD","HARD+","LUNATIC","ULTIMATE","GM"},
dig={"NORMAL","LUNATIC"},
survivor={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE","EXTRA"},
survivor={"EASY","NORMAL","HARD","LUNATIC","ULTIMATE"},
defender={"NORMAL","LUNATIC"},
attacker={"HARD","ULTIMATE"},
tech={"NORMAL","NORMAL+","HARD","HARD+","LUNATIC","LUNATIC+",},
tech={"NORMAL","NORMAL+","HARD","HARD+","LUNATIC","LUNATIC+","ULTIMATE","ULTIMATE+",},
c4wtrain={"NORMAL","LUNATIC"},
pctrain={"NORMAL","EXTRA"},
pcchallenge={"NORMAL","HARD","LUNATIC"},
@@ -206,65 +210,76 @@ for i=1,7 do blocks[i+7]=blocks[i]end
local virtualkeySet={
{
{80,720-200,6400,80},--moveLeft
{320,720-200,6400,80},--moveRight
{1280-80,720-200,6400,80},--rotRight
{1280-200,720-80,6400,80},--rotLeft
{1280-200,720-320,6400,80},--rotFlip
{200,720-320,6400,80},--hardDrop
{200,720-80,6400,80},--softDrop
{1280-320,720-200,6400,80},--hold
{1280-80,280,6400,80},--func
{80,280,6400,80},--restart
},--Farter's set 3
{1, 80, 720-200, 80},--moveLeft
{2, 320, 720-200, 80},--moveRight
{3, 1280-80, 720-200, 80},--rotRight
{4, 1280-200, 720-80, 80},--rotLeft
{5, 1280-200, 720-320, 80},--rotFlip
{6, 200, 720-320, 80},--hardDrop
{7, 200, 720-80, 80},--softDrop
{8, 1280-320, 720-200, 80},--hold
{9, 1280-80, 280, 80},--func
{10,80, 280, 80},--restart
},--Farter's set,thanks
{
{1280-320,720-200,6400,80},--moveLeft
{1280-80,720-200,6400,80},--moveRight
{200,720-80,6400,80},--rotRight
{80,720-200,6400,80},--rotLeft
{200,720-320,6400,80},--rotFlip
{1280-200,720-320,6400,80},--hardDrop
{1280-200,720-80,6400,80},--softDrop
{320,720-200,6400,80},--hold
{80,280,6400,80},--func
{1280-80,280,6400,80},--restart
},--Mirrored farter's set 3
{1, 1280-320, 720-200, 80},--moveLeft
{2, 1280-80, 720-200, 80},--moveRight
{3, 200, 720-80, 80},--rotRight
{4, 80, 720-200, 80},--rotLeft
{5, 200, 720-320, 80},--rotFlip
{6, 1280-200, 720-320, 80},--hardDrop
{7, 1280-200, 720-80, 80},--softDrop
{8, 320, 720-200, 80},--hold
{9, 80, 280, 80},--func
{10,1280-80, 280, 80},--restart
},--Mirrored farter's set,sknaht
{
{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
},--Author's set
{1, 80, 720-80, 80},--moveLeft
{2, 240, 720-80, 80},--moveRight
{3, 1280-240, 720-80, 80},--rotRight
{4, 1280-400, 720-80, 80},--rotLeft
{5, 1280-240, 720-240, 80},--rotFlip
{6, 1280-80, 720-80, 80},--hardDrop
{7, 1280-80, 720-240, 80},--softDrop
{8, 1280-80, 720-400, 80},--hold
{9, 80, 360, 80},--func
{10,80, 80, 80},--restart
},--Author's set,not recommend
{
{1280-400,720-80,6400,80},--moveLeft
{1280-80,720-80,6400,80},--moveRight
{240,720-80,6400,80},--rotRight
{80,720-80,6400,80},--rotLeft
{240,720-240,6400,80},--rotFlip
{1280-240,720-240,6400,80},--hardDrop
{1280-240,720-80,6400,80},--softDrop
{1280-80,720-240,6400,80},--hold
{80,720-240,6400,80},--func
{80,320,6400,80},--restart
{1, 1280-400, 720-80, 80},--moveLeft
{2, 1280-80, 720-80, 80},--moveRight
{3, 240, 720-80, 80},--rotRight
{4, 80, 720-80, 80},--rotLeft
{5, 240, 720-240, 80},--rotFlip
{6, 1280-240, 720-240, 80},--hardDrop
{7, 1280-240, 720-80, 80},--softDrop
{8, 1280-80, 720-240, 80},--hold
{9, 80, 720-240, 80},--func
{10,80, 320, 80},--restart
},--Keyboard set
{
{1200-370,40,1600,40},--moveLeft
{1200-280,40,1600,40},--moveRight
{1200-530,40,1600,40},--rotRight
{1200-610,40,1600,40},--rotLeft
{1200-450,40,1600,40},--rotFlip
{1200-50,40,1600,40},--hardDrop
{1200-130,40,1600,40},--softDrop
{1200-210,40,1600,40},--hold
{1200-690,40,1600,40},--func
{1200-770,40,1600,40},--restart
},--PC key feedback
{10,70, 50,27},--restart
{9, 130, 50,27},--func
{4, 190, 50,27},--rotLeft
{3, 250, 50,27},--rotRight
{5, 310, 50,27},--rotFlip
{1, 370, 50,27},--moveLeft
{2, 430, 50,27},--moveRight
{8, 490, 50,27},--hold
{7, 550, 50,27},--softDrop1
{6, 610, 50,27},--hardDrop
{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={
{20,20,1,1,7,1,1,1,3,4,1,2,3},
@@ -280,69 +295,79 @@ local function useDefaultSet(n)
curBG=customRange.bg[customSel[12]]
BGM(customRange.bgm[customSel[13]])
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={
load={},intro={},quit={},
main={
play= newButton(150,280,200,160,color.red, 70,function()gotoScene("mode")end, nil,"setting"),
setting=newButton(370,280,200,160,color.lightBlue, 50,function()gotoScene("setting_game")end, nil,"music"),
music= newButton(590,280,200,160,color.lightPurple,37,function()gotoScene("music")end, nil,"help"),
help= newButton(150,460,200,160,color.yellow, 55,function()gotoScene("help")end, nil,"stat"),
stat= newButton(370,460,200,160,color.cyan, 48,function()gotoScene("stat")end, nil,"qplay"),
qplay= newButton(540,415,100,70,color.lightGreen, 28,function()loadGame(modeSel,levelSel)end, nil,"lang"),
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()scene.push()scene.swapTo("setting_game")end, nil,"music"),
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()scene.push()scene.swapTo("help")end, nil,"stat"),
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()scene.push()loadGame(modeSel,levelSel)end, nil,"lang"),
lang= newButton(590,505,200,70,color.lightRed, 50,function()
setting.lang=setting.lang%#langName+1
swapLanguage(setting.lang)
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={
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),
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),
start= newButton(1000,600,250,100,color.green, 50,function()loadGame(modeSel,levelSel)end),
custom= newButton(275, 420,200,90, color.yellow,40,function()gotoScene("custom")end),
back= newButton(640, 630,230,90, color.white,45,back),
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),
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),
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()scene.push()scene.swapTo("custom")end),
back= newButton(640, 630,230,90, color.white, 45,scene.back),
},
music={
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),
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),
back= newButton(640, 630,230,90, color.white,45,back),
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),
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),
back= newButton(640, 630,230,90, color.white,45,scene.back),
},
custom={
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),
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),
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),
start1= newButton(880, 580,220,70, color.green, 40,function()loadGame(0,1)end),
start2= newButton(1120,580,220,70, color.lightPurple, 40,function()loadGame(0,2)end),
draw= newButton(1000,90, 190,85, color.cyan, 40,function()gotoScene("draw")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()scene.push()loadGame(0,1)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()scene.push()scene.swapTo("draw")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),
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),
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={
any= newButton(700, 80, 120,120,color.lightGrey, 45,function()pen=0 end),
block1= newButton(840, 80, 120,120,color.red, 65,function()pen=1 end),
block2= newButton(980, 80, 120,120,color.green, 65,function()pen=2 end),
block3= newButton(1120,80, 120,120,color.orange, 65,function()pen=3 end),
block4= newButton(840, 220,120,120,color.blue, 65,function()pen=4 end),
block5= newButton(980, 220,120,120,color.magenta, 65,function()pen=5 end),
block6= newButton(1120,220,120,120,color.yellow, 65,function()pen=6 end),
block7= newButton(840, 360,120,120,color.cyan, 65,function()pen=7 end),
gb1= newButton(980, 360,120,120,color.darkGrey, 65,function()pen=9 end),
gb2= newButton(1120,360,120,120,color.grey, 65,function()pen=10 end),
gb3= newButton(840, 500,120,120,color.darkPurple, 65,function()pen=11 end),
gb4= newButton(980, 500,120,120,color.darkRed, 65,function()pen=12 end),
gb5= newButton(1120,500,120,120,color.darkGreen, 65,function()pen=13 end),
space= newButton(840, 640,120,120,color.grey, 70,function()pen=-1 end),
clear= newButton(1120,640,120,120,color.white, 45,function()love.keypressed("delete")end),
back= newButton(1235,45, 80, 80, color.white, 35,back),
block1= newButton(920, 80, 120,120,color.red, 65,function()pen=1 end),
block2= newButton(1060, 80, 120,120,color.green, 65,function()pen=2 end),
block3= newButton(1200, 80, 120,120,color.orange, 65,function()pen=3 end),
block4= newButton(920, 220,120,120,color.blue, 65,function()pen=4 end),
block5= newButton(1060, 220,120,120,color.magenta, 65,function()pen=5 end),
block6= newButton(1200, 220,120,120,color.yellow, 65,function()pen=6 end),
block7= newButton(920, 360,120,120,color.cyan, 65,function()pen=7 end),
gb1= newButton(1060, 360,120,120,color.darkGrey, 65,function()pen=9 end),
gb2= newButton(1200, 360,120,120,color.grey, 65,function()pen=10 end),
gb3= newButton(920, 500,120,120,color.darkPurple, 65,function()pen=11 end),
gb4= newButton(1060, 500,120,120,color.darkRed, 65,function()pen=12 end),
gb5= newButton(1200, 500,120,120,color.darkGreen, 65,function()pen=13 end),
clear= newButton(780, 80, 120,120,color.white, 45,function()love.keypressed("delete")end),
any= newButton(780, 220,120,120,color.lightGrey, 45,function()pen=0 end),
space= newButton(780, 360,120,120,color.grey, 70,function()pen=-1 end),
back= newButton(1200, 640,120,120,color.white, 40,scene.back),
},
play={
pause= newButton(1235,45,80,80,color.white,30,pauseGame),
@@ -353,15 +378,15 @@ Widget={
clearTask("play")
updateStat()
resetGameData()
gotoScene("play","none")
scene.swapTo("play","none")
end),
quit= newButton(640,600,240,100,color.white,50,back),
quit= newButton(640,600,240,100,color.white,50,scene.back),
},
setting_game={
graphic=newButton(200,80,240,80,color.lightGreen,40,function()gotoScene("setting_graphic")end, nil,"sound"),
sound= newButton(1080,80,240,80,color.lightGreen,40,function()gotoScene("setting_sound")end, nil,"dasD"),
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"),
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()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"),
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()
setting.arr=(setting.arr-1)%16
if setting.arr>setting.das then
@@ -382,15 +407,16 @@ Widget={
sddasU= newButton(400,340,50,50,color.white,40,function()setting.sddas=(setting.sddas+1)%11 end, nil,"sdarrD"),
sdarrD= newButton(500,340,50,50,color.white,40,function()setting.sdarr=(setting.sdarr-1)%4 end, nil,"sdarrU"),
sdarrU= newButton(720,340,50,50,color.white,40,function()setting.sdarr=(setting.sdarr+1)%4 end, nil,"quickR"),
quickR= newSwitch(560,440,40,function()return setting.quickR end,function()setting.quickR=not setting.quickR end, nil,"swap"),
swap= newSwitch(560,530,25,function()return setting.swap end,function()setting.swap=not setting.swap end, nil,"ctrl"),
ctrl= newButton(1020,230,320,80,color.white,40,function()gotoScene("setting_control")end, nil,"touch"),
touch= newButton(1020,340,320,80,color.white,40,function()gotoScene("setting_touch")end, nil,"back"),
back= newButton(1160,600,160,160,color.white,55,back,nil,"graphic"),
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"),
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()scene.push()scene.swapTo("setting_key")end, nil,"touch"),
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,scene.back,nil,"graphic"),
},
setting_graphic={
sound= newButton(200,80,240,80,color.lightGreen,40,function()gotoScene("setting_sound")end, nil,"game"),
game= newButton(1080,80,240,80,color.lightGreen,40,function()gotoScene("setting_game")end, nil,"ghost"),
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()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"),
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"),
@@ -403,7 +429,7 @@ Widget={
setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen)
if not setting.fullscreen then
love.resize(gc.getWidth(),gc.getHeight())
love.resize(love.graphics.getWidth(),love.graphics.getHeight())
end
end,nil,"bg"),
bg= newSwitch(990,250,40,function()return setting.bg end,function()setting.bg=not setting.bg end, nil,"bgblock"),
@@ -411,68 +437,113 @@ Widget={
setting.bgblock=not setting.bgblock--if not setting.bgblock then for i=1,16 do FX_BGblock.list[i].v=3*FX_BGblock.list[i].v end end
end,nil,"skin"),
skin= newButton(860,470,120,60,color.white,40,function()
setting.skin=setting.skin%6+1
setting.skin=setting.skin%8+1
changeBlockSkin(setting.skin)
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={
game= newButton(200,80,240,80,color.lightGreen,40,function()gotoScene("setting_game")end, nil,"graphic"),
graphic=newButton(1080,80,240,80,color.lightGreen,40,function()gotoScene("setting_graphic")end, nil,"sfx"),
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()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"),
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"),
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={
back=newButton(840,630,180,60,color.white,40,back),
setting_key={
back=newButton(1140,650,200,80,color.white,50,scene.back),
},
setting_touch={
hide= newButton(640,210,500,80,color.white,45,function()
setting.virtualkeySwitch=not setting.virtualkeySwitch
end),
default=newButton(450,310,170,80,color.white,40,function()
for K=1,#virtualkey do
local b,b0=virtualkey[K],virtualkeySet[defaultSel][K]
b[1],b[2],b[3],b[4]=b0[1],b0[2],b0[3],b0[4]
end--Default virtualkey
hide= newSwitch(810,140,45,function()return setting.VKSwitch end,function()setting.VKSwitch=not setting.VKSwitch end),
track= newSwitch(810,220,45,function()return setting.VKTrack end,function()setting.VKTrack=not setting.VKTrack end),
tkset= newButton(450,220,170,80,color.white,30,function()
scene.push()
scene.swapTo("setting_trackSetting")
end,function()return not setting.VKTrack end),
default=newButton(450,320,170,80,color.white,40,function()
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
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
end),
alpha= newButton(830,310,170,80,color.white,45,function()
setting.virtualkeyAlpha=(setting.virtualkeyAlpha+1)%11
--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
alpha= newButton(830,320,170,80,color.white,45,function()
setting.VKAlpha=(setting.VKAlpha+1)%11
--Adjust virtualkey alpha
end),
icon= newButton(450,410,170,80,color.white,45,function()
setting.virtualkeyIcon=not setting.virtualkeyIcon
icon= newButton(495,420,260,80,color.white,45,function()
setting.VKIcon=not setting.VKIcon
--Switch virtualkey icon
end),
size= newButton(830,410,170,80,color.white,45,function()
size= newButton(785,420,260,80,color.white,45,function()
if sel then
local b=virtualkey[sel]
b[4]=b[4]+10
if b[4]==150 then b[4]=40 end
b[3]=b[4]^2
local B=VK_org[sel]
B.r=B.r+10
if B.r>=150 then B.r=B.r-110 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={
his= newButton(1050,520,230,60,color.white,40,function()gotoScene("history")end,nil,"back"),
qq= newButton(1050,600,230,60,color.white,40,function()sys.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"),
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"),
back= newButton(640, 600,180,60,color.white,40,scene.back,nil,"qq"),
},
history={
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),
back= newButton(1155,600,180,90,color.white,40,back),
back= newButton(1155,600,180,90,color.white,40,scene.back),
},
stat={
path= newButton(980,590,250,60,color.white,30,function()sys.openURL(fs.getSaveDirectory())end,function()return mobile end,"back"),
back= newButton(640,590,180,60,color.white,40,back,nil,"path"),
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,scene.back,nil,"path"),
},
}
for S,L in next,Widget do

571
main.lua

File diff suppressed because it is too large Load Diff

210
paint.lua
View File

@@ -1,6 +1,4 @@
local gc=love.graphics
local mt=love.math
local gmatch=string.gmatch
local setFont=setFont
local int,abs,rnd,max,min,sin=math.floor,math.abs,math.random,math.max,math.min,math.sin
local format=string.format
@@ -52,6 +50,10 @@ local function dataOpt(i)
return stat.pc
elseif i==14 then
return format("%0.2f",stat.atk/stat.row)
elseif i==15 then
return stat.extraPiece
elseif i==16 then
return max(100-int(stat.extraRate/stat.piece*10000)*.01,0).."%"
end
end
local statOptL={
@@ -74,6 +76,8 @@ local function statOpt(i)
return stat.pc
elseif i==17 then
return format("%0.2f",stat.atk/stat.row)
elseif i==18 then
return stat.extraPiece.."["..(int(stat.extraRate/stat.piece*10000)*.01).."%]"
end
end
local miniTitle_rect={
@@ -88,7 +92,8 @@ local miniTitle_rect={
}
local function stencil_miniTitle()
for i=1,#miniTitle_rect do
gc.rectangle("fill",unpack(miniTitle_rect[i]))
local a,b,c,d=unpack(miniTitle_rect[i])
gc.rectangle("fill",250+a*30,150+b*30,c*30,d*30)
end
end
@@ -165,7 +170,6 @@ textFX={
gc.pop()
end,
}
local function drawAtkPointer(x,y)
local t=sin(Timer()*20)
gc.setColor(.2,.7+t*.2,1,.6+t*.4)
@@ -174,38 +178,42 @@ local function drawAtkPointer(x,y)
gc.setColor(0,.6,1,.8-a)
gc.circle("line",x,y,30*(1+a),6)
end
local function VirtualkeyPreview()
for i=1,#virtualkey do
local c=sel==i and .8 or 1
gc.setColor(c,c,c,setting.virtualkeyAlpha*.1)
local b=virtualkey[i]
gc.setLineWidth(b[4]*.07)
gc.circle("line",b[1],b[2],b[4]-5)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2],nil,b[4]*.025,nil,18,18)end
if setting.VKSwitch then
for i=1,#VK_org do
local B=VK_org[i]
if B.ava then
local c=sel==i and .6 or 1
gc.setColor(c,1,c,setting.VKAlpha*.1)
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
local function drawVirtualkey()
local a=setting.virtualkeyAlpha*.1
local a=setting.VKAlpha*.1
for i=1,#virtualkey do
if i~=9 or modeEnv.Fkey then
local p,b=virtualkeyDown[i],virtualkey[i]
if p then gc.setColor(.7,.7,.7,a)
else gc.setColor(1,1,1,a)
end
gc.setLineWidth(b[4]*.07)
gc.circle("line",b[1],b[2]+virtualkeyPressTime[i],b[4]-5)
if setting.virtualkeyIcon then gc.draw(virtualkeyIcon[i],b[1],b[2]+virtualkeyPressTime[i],nil,b[4]*.025,nil,18,18)end
if virtualkeyPressTime[i]>0 then
gc.setColor(1,1,1,a*virtualkeyPressTime[i]*.1)
gc.circle("line",b[1],b[2],b[4]*(1.4-virtualkeyPressTime[i]*.04))
local B=virtualkey[i]
if B.ava then
local _=virtualkeyDown[i]and gc.setColor(.7,.7,.7,a)or gc.setColor(1,1,1,a)--Dark magic
gc.setLineWidth(B.r*.07)
local ΔY=virtualkeyPressTime[i]
gc.circle("line",B.x,B.y+ΔY,B.r)--Outline circle
if setting.VKIcon then
gc.draw(VKIcon[i],B.x,B.y+ΔY,nil,B.r*.025,nil,18,18)
end--Icon
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
local scs={{1,2},nil,nil,nil,nil,{1.5,1.5},{0.5,2.5}}for i=2,5 do scs[i]=scs[1]end
local matrixT={}for i=0,15 do matrixT[i]={}for j=0,8 do matrixT[i][j]=mt.noise(i,j)+2 end end
local Pnt={BG={}}
function Pnt.BG.none()
gc.clear(.15,.15,.15)
@@ -220,6 +228,27 @@ function Pnt.BG.glow()
local t=((sin(Timer()*.5)+sin(Timer()*.7)+sin(Timer()*.9+1)+sin(Timer()*1.5)+sin(Timer()*2+3))+5)*.05
gc.clear(t,t,t)
end
function Pnt.BG.rgb()
gc.clear(
sin(Timer()*1.2)*.15+.5,
sin(Timer()*1.5)*.15+.5,
sin(Timer()*1.9)*.15+.5
)
end
function Pnt.BG.strap()
gc.setColor(1,1,1)
local x=Timer()%32*40
gc.draw(background2,x,0,nil,10)
gc.draw(background2,x-1280,0,nil,10)
end
function Pnt.BG.flink()
local t=.13-Timer()%3%1.7
if t<.25 then
gc.clear(t,t,t)
else
gc.clear(0,0,0)
end
end
function Pnt.BG.game1()
gc.setColor(1,1,1)
gc.draw(background1,640,360,Timer()*.15,12,nil,64,64)
@@ -244,6 +273,7 @@ function Pnt.BG.game5()
else gc.clear(0,0,0)
end
end--Lightning
local scs={1,2,1,2,1,2,1,2,1,2,1.5,1.5,.5,2.5}
function Pnt.BG.game6()
local t=1.2-Timer()%10%3%1.2
if t<.5 then gc.clear(t,t,t)
@@ -251,21 +281,9 @@ function Pnt.BG.game6()
end
gc.setColor(.3,.3,.3)
local r=7-int(Timer()*.5)%7
gc.draw(mouseBlock[r],640,360,Timer()%3.1416*6,400,400,scs[r][2]-.5,#blocks[r][0]-scs[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
function Pnt.BG.rgb()
gc.clear(
sin(Timer()*1.2)*.15+.5,
sin(Timer()*1.5)*.15+.5,
sin(Timer()*1.9)*.15+.5
)
end
function Pnt.BG.strap()
gc.setColor(1,1,1)
local x=Timer()%32*40
gc.draw(background2,x,0,nil,10)
gc.draw(background2,x-1280,0,nil,10)
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()
gc.clear(.15,.15,.15)
for i=0,15 do
@@ -289,14 +307,14 @@ function Pnt.load()
mStr(loadTip,640,400)
end
function Pnt.intro()
gc.push()
gc.translate(250,150)
gc.scale(30)
gc.stencil(stencil_miniTitle,"replace",1)
gc.stencil(stencil_miniTitle,"replace",1)
gc.setStencilTest("equal",1)
gc.setColor(1,1,1,min(count,80)*.005)
gc.rectangle("fill",0,0,26,14)
gc.pop()
gc.push("transform")
gc.translate(250,150)
gc.scale(30)
gc.rectangle("fill",0,0,26,14)
gc.pop()
gc.setColor(1,1,1,.06)
for i=41,5,-2 do
gc.setLineWidth(i)
@@ -404,12 +422,12 @@ function Pnt.draw()
gc.translate(-200,-60)
if clearSureTime>0 then
gc.setColor(1,1,1,clearSureTime*.02)
gc.draw(drawableText.question,1100,570)
gc.draw(drawableText.question,760,11)
end
if pen>0 then
gc.setLineWidth(13)
gc.setColor(blockColor[pen])
gc.rectangle("line",945,605,70,70)
gc.rectangle("line",746,460,70,70)
elseif pen==-1 then
gc.setLineWidth(5)
gc.setColor(.9,.9,.9)
@@ -444,7 +462,7 @@ function Pnt.play()
gc.pop()
end--FX animation
gc.setColor(1,1,1)
if setting.virtualkeySwitch then drawVirtualkey()end
if setting.VKSwitch then drawVirtualkey()end
if modeEnv.royaleMode then
for i=1,#FX_badge do
local b=FX_badge[i]
@@ -488,13 +506,13 @@ function Pnt.pause()
if pauseCount>0 then
gc.print(text.pauseCount..":["..pauseCount.."] "..format("%0.2f",pauseTime).."s",110,150)
end
for i=1,7 do
for i=1,8 do
gc.print(text.stat[i+3],110,30*i+270)
gc.print(dataOpt(i),305,30*i+270)
end
for i=8,14 do
gc.print(text.stat[i+3],860,30*i+60)
gc.print(dataOpt(i),1000,30*i+60)
for i=9,16 do
gc.print(text.stat[i+3],860,30*i+30)
gc.print(dataOpt(i),1050,30*i+30)
end
setFont(40)
if system~="Android"then
@@ -523,40 +541,54 @@ function Pnt.setting_sound()
gc.setColor(1,1,1)
mDraw(drawableText.setting_sound,640,15)
end
function Pnt.setting_control()
function Pnt.setting_key()
local a=.3+sin(Timer()*15)*.1
if keyboardSetting then
gc.setColor(1,.5,.5,a)
else
gc.setColor(.9,.9,.9,a)
end
gc.rectangle("fill",240,40*keyboardSet-10,200,40)
if joystickSetting then
gc.setColor(1,.5,.5,a)
else
gc.setColor(.9,.9,.9,a)
end
gc.rectangle("fill",440,40*joystickSet-10,200,40)
if keyboardSetting then gc.setColor(1,.3,.3,a)else gc.setColor(1,.7,.7,a)end
gc.rectangle("fill",
keyboardSet<11 and 240 or 840,
45*keyboardSet+20-450*int(keyboardSet/11),
200,45
)
if joystickSetting then gc.setColor(.3,.3,.1,a)else gc.setColor(.7,.7,1,a)end
gc.rectangle("fill",
joystickSet<11 and 440 or 1040,
45*joystickSet+20-450*int(joystickSet/11),
200,45
)
--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)
setFont(25)
for y=1,13 do
mStr(text.actName[y],150,40*y-5)
for x=1,2 do
mStr(setting.keyMap[curBoard+x*8-8][y],200*x+140,40*y-3)
setFont(31)
for N=1,20 do
if N<11 then
gc.printf(text.actName[N],47,45*N+22,180,"right")
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
gc.line(40,40*y-10,640,40*y-10)
end
for x=1,4 do
gc.line(200*x-160,30,200*x-160,550)
gc.setLineWidth(2)
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
gc.line(40,550,640,550)
mDraw(drawableText.keyboard,340,0)
mDraw(drawableText.joystick,540,0)
gc.draw(drawableText.ctrlSetHelp,50,620)
setFont(40)
gc.print("P"..int(curBoard*.5+.5).."/P4",420,560)
gc.print(curBoard.."/8",580,560)
gc.print("Player:",170,590)
gc.print(int(curBoard*.5+.5),300,590)
gc.print(curBoard.."/8",580,590)
gc.draw(drawableText.ctrlSetHelp,50,650)
end
function Pnt.setting_touch()
VirtualkeyPreview()
@@ -572,13 +604,21 @@ function Pnt.setting_touch()
end
end
end
function Pnt.help()
setFont(32)
function Pnt.setting_trackSetting()
gc.setColor(1,1,1)
for i=1,11 do
gc.printf(text.help[i],140,15+43*i,1000,"center")
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()
setFont(30)
gc.setColor(1,1,1)
for i=1,#text.help do
gc.printf(text.help[i],140,10+40*i,1000,"center")
end
gc.draw(titleImage,250,600,.2,1+.05*sin(Timer()*2),nil,206,35)
setFont(24)
gc.print(text.used,30,330)
gc.draw(titleImage,280,620,.1,1+.05*sin(Timer()*2),nil,206,35)
gc.setLineWidth(5)
gc.rectangle("line",17,17,260,260)
gc.rectangle("line",1077,17,186,186)
@@ -593,7 +633,7 @@ end
function Pnt.stat()
setFont(28)
gc.setColor(1,1,1)
for i=1,17 do
for i=1,18 do
gc.print(text.stat[i],400,30*i-5)
gc.print(statOpt(i),720,30*i-5)
end

1117
player.lua

File diff suppressed because it is too large Load Diff

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

16
shadowMapShader.cs Normal file
View File

@@ -0,0 +1,16 @@
#define PI 3.14
extern float yresolution;
vec4 effect(vec4 color,Image texture,vec2 texture_coords,vec2 screen_coords){
//Iterate through the occluder map's y-axis.
for(float y=0.;y<yresolution;y++){
//直角转极坐标
vec2 norm=vec2(texture_coords.s,y/yresolution)*2.-1.;
float theta=PI*1.5+norm.x*PI;
float r=(1.+norm.y)*.5;
//y/yresolution为到光源的距离(0~1)
//遮光物采样
vec4 data=Texel(texture,(vec2(-r*sin(theta),-r*cos(theta))*.5+.5));//vec2()..是遮光物采样的coord
if(data.a>.1)return vec4(vec3(y/yresolution),1.);//碰撞检测,像素透明度>.1即透光
}
return vec4(vec3(1),1.);//返回最远距离1
}

View File

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

View File

@@ -41,12 +41,13 @@ function Tmr.load()
for i=1,#sfx do sfx[i]=nil end
loading=4
loadnum=1
SFX("welcome",.2)
end
elseif loading==4 then
loadnum=loadnum+1
if loadnum==15 then
if loadnum==48 then
stat.run=stat.run+1
gotoScene("intro","none")
scene.swapTo("intro","none")
end
end
end

View File

@@ -44,6 +44,7 @@ function destroyPlayers()
players.alive[i]=nil
end
players.human=0
collectgarbage()
end
function getNewRow(val)
local t=rem(freeRow)
@@ -72,12 +73,15 @@ local drawableTextLoad={
"next","hold",
"pause","finish",
"custom",
"setting_game","setting_graphic","setting_sound",
"setting_game",
"setting_graphic",
"setting_sound",
"keyboard","joystick",
"ctrlSetHelp",
"musicRoom",
"nowPlaying",
"warning",
"VKTchW","VKOrgW","VKCurW",
}
function swapLanguage(l)
text=require("language/"..langID[l])
@@ -128,15 +132,14 @@ end
function SFX(s,v)
if setting.sfx>0 then
local n=1
::L::if sfx[s][n]:isPlaying()then
while sfx[s][n]:isPlaying()do
n=n+1
if not sfx[s][n]then
sfx[s][n]=sfx[s][n-1]:clone()
sfx[s][n]:seek(0)
goto quit
break
end
goto L
end::quit::
end
sfx[s][n]:setVolume((v or 1)*setting.sfx*.125)
sfx[s][n]:play()
end
@@ -194,101 +197,88 @@ function BGM(s)
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
function updateStat()
local S=players[1].stat
for k,v in next,S do
stat[k]=stat[k]+S[k]
end
end
function randomTarget(P)
if #players.alive>1 then
local R
repeat
R=players.alive[rnd(#players.alive)]
until R~=P
return R
end
end--return a random opponent for P
function freshMostDangerous()
mostDangerous,secDangerous=nil
local m,m2=0,0
for i=1,#players.alive do
local h=#players.alive[i].field
if h>=m then
mostDangerous,secDangerous=players.alive[i],mostDangerous
m,m2=h,m
elseif h>=m2 then
secDangerous=players.alive[i]
m2=h
end
end
end
function freshMostBadge()
mostBadge,secBadge=nil
local m,m2=0,0
for i=1,#players.alive do
local h=players.alive[i].badge
if h>=m then
mostBadge,secBadge=players.alive[i],mostBadge
m,m2=h,m
elseif h>=m2 then
secBadge=players.alive[i]
m2=h
end
end
end
function royaleLevelup()
gameStage=gameStage+1
local spd
if(gameStage==3 or gameStage>4)and players[1].alive then
players[1]:showText(text.royale_remain(#players.alive),"beat",50,-100,.3)
end
if gameStage==2 then
spd=30
elseif gameStage==3 then
spd=15
garbageSpeed=.6
if players[1].alive then BGM("cruelty")end
elseif gameStage==4 then
spd=10
pushSpeed=3
elseif gameStage==5 then
spd=5
garbageSpeed=1
elseif gameStage==6 then
spd=3
if players[1].alive then BGM("final")end
end
for i=1,#players.alive do
players.alive[i].gameEnv.drop=spd
end
if curMode.lv==3 then
for i=1,#players.alive do
local P=players.alive[i]
P.gameEnv.drop=int(P.gameEnv.drop*.3)
if P.gameEnv.drop==0 then
P.curY=P.y_img
P.gameEnv._20G=true
if P.AI_mode=="CC"then CC_switch20G(P)end--little cheating,never mind
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()
for k,v in next,players[1].stat do
stat[k]=stat[k]+v
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()
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 pauseGame()
pauseTimer=0--Pause timer for animation
if not gamefinished then
@@ -302,13 +292,104 @@ function pauseGame()
end
end
end
gotoScene("pause","none")
scene.swapTo("pause","none")
end
function resumeGame()
gotoScene("play","fade")
scene.swapTo("play","fade")
end
function loadGame(mode,level)
--rec={}
curMode={id=modeID[mode],lv=level}
drawableText.modeName:set(text.modeName[mode])
drawableText.levelName:set(modeLevel[modeID[mode]][level])
needResetGameData=true
scene.swapTo("play","deck")
end
function resetPartGameData()
frame=30
destroyPlayers()
loadmode[curMode.id]()
if modeEnv.task then
for i=1,#players do
newTask(Event_task[modeEnv.task],players[i])
end
end
if modeEnv.royaleMode then
for i=1,#players do
players[i]:changeAtk(randomTarget(players[i]))
end
end
restoreVirtualKey()
collectgarbage()
end
function resetGameData()
gamefinished=false
frame=0
garbageSpeed=1
pushSpeed=3
pauseTime=0--Time paused
pauseCount=0--Times paused
destroyPlayers()
local E=defaultModeEnv[curMode.id]
modeEnv=E[curMode.lv]or E[1]
loadmode[curMode.id]()--bg/bgm need redefine in custom,so up here
if modeEnv.task then
for i=1,#players do
newTask(Event_task[modeEnv.task],players[i])
end
end
curBG=modeEnv.bg
BGM(modeEnv.bgm)
FX_badge={}
FX_attack={}
for _,v in next,PTC.dust do
v:release()
end
for i=1,#players do
if not players[i].small then
PTC.dust[i]=PTC.dust0:clone()
PTC.dust[i]:start()
end
end
if modeEnv.royaleMode then
for i=1,#players do
players[i]:changeAtk(randomTarget(players[i]))
end
mostBadge,mostDangerous,secBadge,secDangerous=nil
gameStage=1
garbageSpeed=.3
pushSpeed=2
end
restoreVirtualKey()
stat.game=stat.game+1
local m,p=#freeRow,40*#players+1
while freeRow[p]do
m,freeRow[m]=m-1
end
for i=1,20 do
virtualkeyDown[i]=X
virtualkeyPressTime[i]=0
end
freeRow.L=#freeRow
SFX("ready")
collectgarbage()
end
function gameStart()
SFX("start")
for P=1,#players do
P=players[P]
P:resetblock()
P.timing=true
P.control=true
end
end
local dataOpt={
"run","game","time",
"extraPiece","extraRate",
"key","rotate","hold","piece","row",
"atk","send","recv","pend",
"clear_1","clear_2","clear_3","clear_4",
@@ -318,9 +399,6 @@ local dataOpt={
function loadData()
userData:open("r")
local t=userData:read()
if not find(t,"spin")then
t=love.data.decompress("string","zlib",t)
end
t=splitS(t,"\r\n")
userData:close()
for i=1,#t do
@@ -344,17 +422,14 @@ function saveData()
t[i]=dataOpt[i].."="..toS(stat[dataOpt[i]])
end
t=concat(t,"\r\n")
t=love.data.compress("string","zlib",t)
userData:open("w")
userData:write(t)
userData:close()
end
function loadSetting()
userSetting:open("r")
local t=userSetting:read()
if not find(t,"virtual")then
t=love.data.decompress("string","zlib",t)
end
t=splitS(t,"\r\n")
userSetting:close()
for i=1,#t do
@@ -368,12 +443,16 @@ function loadSetting()
elseif t=="fullscreen"then
setting.fullscreen=v=="true"
love.window.setFullscreen(setting.fullscreen)
elseif t=="virtualkeyAlpha"then
setting.virtualkeyAlpha=min(int(abs(toN(v))),10)
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=="quickR"or t=="bgblock"or t=="smo"or
t=="virtualkeyIcon"or t=="virtualkeySwitch"
t=="quickR"or t=="fine"or t=="bgblock"or t=="smo"or
t=="VKSwitch"or t=="VKTrack"or t=="VKIcon"
then
setting[t]=v=="true"
elseif t=="frameMul"then
@@ -386,7 +465,7 @@ function loadSetting()
elseif t=="lang"then
setting[t]=toN(v:match("[123]"))or 1
elseif t=="skin"then
setting[t]=toN(v:match("[123456]"))or 1
setting[t]=toN(v:match("[12345678]"))or 1
elseif t=="keymap"then
v=splitS(v,"/")
for i=1,16 do
@@ -395,14 +474,15 @@ function loadSetting()
setting.keyMap[i][j]=v1[j]
end
end
elseif t=="virtualkey"then
elseif t=="VK"then
v=splitS(v,"/")
for i=1,10 do
local SK
for i=1,#v do
if v[i]then
virtualkey[i]=splitS(v[i],",")
for j=1,4 do
virtualkey[i][j]=toN(virtualkey[i][j])
end
SK=splitS(v[i],",")
local K=VK_org[i]
K.ava=SK[1]=="T"
K.x,K.y,K.r=toN(SK[2]),toN(SK[3]),toN(SK[4])
end
end
end
@@ -414,6 +494,7 @@ local saveOpt={
"sddas","sdarr",
"quickR",
"swap",
"fine",
"ghost","center",
"smo","grid",
@@ -431,17 +512,21 @@ local saveOpt={
"sfx","bgm",
"vib","voc",
"virtualkeyAlpha",
"virtualkeyIcon",
"virtualkeySwitch",
"VKSwitch",
"VKTrack",
"VKIcon",
"VKAlpha",
}
function saveSetting()
local vk={}
for i=1,10 do
for j=1,4 do
virtualkey[i][j]=int(virtualkey[i][j]+.5)
end--Saving a integer is better?
vk[i]=concat(virtualkey[i],",")
local vk={}--virtualkey table
for i=1,#VK_org do
local V=VK_org[i]
vk[i]=concat({
V.ava and"T"or"F",
int(V.x+.5),
int(V.y+.5),
V.r,
},",")
end--pre-pack virtualkey setting
local map={}
for i=1,16 do
@@ -449,14 +534,12 @@ function saveSetting()
end
local t={
"keymap="..toS(concat(map,"/")),
"virtualkey="..toS(concat(vk,"/")),
"VK="..toS(concat(vk,"/")),
}
for i=1,#saveOpt do
t[i+2]=saveOpt[i].."="..toS(setting[saveOpt[i]])
--not always i+2!
t[#t+1]=saveOpt[i].."="..toS(setting[saveOpt[i]])
end
t=concat(t,"\r\n")
t=love.data.compress("string","zlib",t)
userSetting:open("w")
userSetting:write(t)
userSetting:close()

View File

@@ -1,23 +1,50 @@
local S=[=[
Patron(rmb10+):
gggf/T080/Ykzl/zxc
[D*a]?
Future outlook:
GUI:
Normal Things:
in-game setting(scene-sequence system)
powerinfo switch
splashing block
ajustable next count
bag line in all mode
highscore of most modes
custom block color/direction
custom sequence
virtual key switch(all keys)
Normal Things:
custom block sequence
combo mode
any screen size
auto GUI in any screen size
CC smarter(think of gaebage buffer)
fineese/bigbang mode & easier CTWC
new AI:task-Z
game recording
TTT mode
Hard Things:
Encrypt source code(JIT to byte code)
Technical things:
Encrypt source code(compile to byte code)
infinite 1v1
square mode
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:
add fineese check(almost useful)
code optimized
0.7.27:
super O transform system
optimized light system(no used)
bug fixed
0.7.26:
new skin
import light lib
many bug fixed
0.7.25:
demo play at main menu
ALMOST reconstructed WHOLE PLAYER SYSTEM,NEED TEST