Compare commits

...

1 Commits

Author SHA1 Message Date
MrZ_26
e88553bc00 0.8.15Bug Fixed 2020-04-30 01:23:11 +08:00
42 changed files with 410 additions and 327 deletions

25
ai.lua
View File

@@ -80,14 +80,14 @@ end
-------------------------------------------------⑨Stack setup
local dirCount={1,1,3,3,3,0,1}
local spinOffset={
{1,0,0},--S
{1,0,0},--Z
{1,0,0},--L
{1,0,0},--J
{1,0,0},--T
{0,0,0},--O
{2,0,1},--I
}for i=1,7 do spinOffset[i][0]=0 end
{[0]=0,1,0,0},--Z
{[0]=0,1,0,0},--L
{[0]=0,1,0,0},--J
{[0]=0,1,0,0},--T
{[0]=0,1,0,0},--S
{[0]=0,0,0,0},--O
{[0]=0,2,0,1},--I
}
local FCL={
[1]={
{{11},{11,2},{1},{},{2},{2,2},{12,1},{12}},
@@ -106,10 +106,7 @@ local FCL={
{{11},{11,2},{1},{},{2},{12,1},{12},},
{{4,11},{11,4},{11,3},{1,4},{4},{3},{2,3},{12,4},{12,3},{3,12},},
},
}
FCL[2]=FCL[1]
FCL[4]=FCL[3]
FCL[5]=FCL[3]
}FCL[2],FCL[4],FCL[5]=FCL[1],FCL[3],FCL[3]
local LclearScore={[0]=0,-200,-120,-80,200}
local HclearScore={[0]=0,100,140,200,500}
local function ifoverlapAI(f,bk,x,y)
@@ -256,7 +253,7 @@ AI_think={
P.AI_delay=P.AI_delay0
if Timer()-P.modeData.point>P.modeData.event then
P.modeData.point=Timer()
P.modeData.event=P.AI_delay0+rnd(2,10)
P.modeData.event=P.AI_delay0+rnd(5,15)
P:changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.3 and 2 or 3)
end
return 1
@@ -294,7 +291,7 @@ AI_think={
P.AI_delay=P.AI_delay0
if Timer()-P.modeData.point>P.modeData.event then
P.modeData.point=Timer()
P.modeData.event=P.AI_delay0+rnd(2,10)
P.modeData.event=P.AI_delay0+rnd(5,15)
P:changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.3 and 2 or 3)
end
return 1

View File

@@ -1,4 +1,4 @@
gameVersion="Alpha V0.8.14"
gameVersion="Alpha V0.8.15"
function love.conf(t)
t.identity="Techmino"--SaveDir name
t.version="11.1"
@@ -17,7 +17,7 @@ function love.conf(t)
W.resizable=true
W.fullscreentype="desktop"--"exclusive"
W.fullscreen=false
W.vsync=0--0:∞fps
W.vsync=0--∞fps
W.msaa=false--num of samples to use with multi-sampled antialiasing
W.depth=0--bits/samp of depth buffer
W.stencil=1--bits/samp of stencil buffer

View File

@@ -7,6 +7,10 @@ setting={
swap=true,
fine=false,
autoPause=true,
lang=1,
skinSet=1,
skin={1,5,2,8,10,3,7},
face={0,0,0,0,0,0,0},
--game
@@ -18,12 +22,10 @@ setting={
atkFX=3,
frameMul=100,
text=true,
fullscreen=false,
bg=true,
bgspace=true,
lang=1,
skinSet=1,
skin={1,5,2,8,10,3,7},
--graphic
sfx=10,bgm=7,
@@ -47,7 +49,7 @@ stat={
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,
pc=0,c=0,b2b=0,b3b=0,score=0,
lastPlay=1,--last played mode ID
}
keyMap={

View File

@@ -19,7 +19,8 @@ spin判定:
B3B:在B2B效果之上消四再加1,spin再加0.5*消行数攻击,二者都+1额外抵挡
连击:0,0,1,1,2,2,2,3,3,4,3,2…(后面都是2)
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)
PC:将上述伤害之和开根号,再+6~10(本局内递增)+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)
半全消("下方有剩余方块"的全消):伤害+2,额外抵挡+2
全消:将上述伤害之和开根号,再+6~10(本局内递增)+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)
根据上述规则计算后,向下取整,攻击打出
分数系统:

View File

@@ -89,7 +89,7 @@ function saveRecord(N,L)
local _,mes=F:write(dumpTable(L))
F:flush()F:close()
if not _ then
TEXT(text.recSavingError..mes,1140,650,20,"sudden",.5)
TEXT(text.recSavingError..(mes or"unknown error"),1140,650,20,"sudden",.5)
end
end
function delRecord(N)
@@ -115,7 +115,7 @@ function saveUnlock()
local _,mes=F:write(dumpTable(modeRanks))
F:flush()F:close()
if not _ then
TEXT(text.unlockSavingError..mes,1140,650,20,"sudden",.5)
TEXT(text.unlockSavingError..(mes or"unknown error"),1140,650,20,"sudden",.5)
end
end
@@ -140,7 +140,7 @@ function saveData()
local _,mes=F:write(dumpTable(stat))
F:flush()F:close()
if not _ then
TEXT(text.statSavingError..mes,1140,650,20,"sudden",.5)
TEXT(text.statSavingError..(mes or"unknown error"),1140,650,20,"sudden",.5)
end
end
@@ -165,7 +165,7 @@ function saveSetting()
local _,mes=F:write(dumpTable(setting))
F:flush()F:close()
if _ then TEXT(text.settingSaved,1140,650,40,"sudden",.5)
else TEXT(text.settingSavingError..mes,1140,650,20,"sudden",.5)
else TEXT(text.settingSavingError..(mes or"unknown error"),1140,650,20,"sudden",.5)
end
end
@@ -186,7 +186,7 @@ function saveKeyMap()
local _,mes=F:write(dumpTable(keyMap))
F:flush()F:close()
if _ then TEXT(text.keyMapSaved,1140,650,26,"sudden",.5)
else TEXT(text.keyMapSavingError..mes,1140,650,20,"sudden",.5)
else TEXT(text.keyMapSavingError..(mes or"unknown error"),1140,650,20,"sudden",.5)
end
end
@@ -207,7 +207,7 @@ function saveVK()
local _,mes=F:write(dumpTable(VK_org))
F:flush()F:close()
if _ then TEXT(text.VKSaved,1140,650,26,"sudden",.5)
else TEXT(text.VKSavingError..mes,1140,650,20,"sudden",.5)
else TEXT(text.VKSavingError..(mes or"unknown error"),1140,650,20,"sudden",.5)
end
end

View File

@@ -22,6 +22,7 @@ return{
b2b="B2B ",b3b="B2B2B ",
mini="Mini",
PC="Perfect Clear",
C="Clear",
hold="暂存",next="下一个",
stage=function(n)return"关卡 "..n end,
@@ -248,6 +249,7 @@ return{
dropFX="下落特效等级",
shakeFX="晃动特效等级",
atkFX="攻击特效等级",
text="消行文本",
fullscreen="全屏",
frame="绘制帧率",
back=BK,

View File

@@ -22,6 +22,7 @@ return{
b2b="满贯",b3b="大满贯",
mini="迷你",
PC="场地全清",
C="场地半清",
hold="暂存",next="下一个",
stage=function(n)return"关卡 "..n end,
@@ -176,7 +177,7 @@ return{
},
mode={
draw="画图(Q)",
custon="参数(E)",
custom="参数(E)",
start="开始",
back=BK,
},
@@ -245,6 +246,7 @@ return{
dropFX="下落特效等级",
shakeFX="晃动特效等级",
atkFX="攻击特效等级",
text="消行文本",
fullscreen="全屏",
frame="绘制帧率",
back=BK,

View File

@@ -20,6 +20,7 @@ return{
b2b="B2B ",b3b="B2B2B ",
mini="Mini",
PC="Perfect Clear",
C="Clear",
hold="Hold",next="Next",
stage=function(n)return"STAGE "..n end,
@@ -244,6 +245,7 @@ Lib used:
dropFX="Drop FX level",
shakeFX="Shake FX level",
atkFX="ATK FX level",
text="Line-clear text",
fullscreen="Fullscreen",
frame="draw FPS",
back=BK,
@@ -276,8 +278,8 @@ Lib used:
prev5="",next5="",spin5="R",
prev6="",next6="",spin6="R",
prev7="",next7="",spin7="R",
skinR="reset Color",
faceR="reset Dir",
skinR="Reset Color",
faceR="Reset Dir.",
back=BK,
},
setting_touch={

View File

@@ -677,7 +677,7 @@ function touchMove.play(id,x,y,dx,dy)
end
function keyDown.play(key)
if key=="escape"then
(frame<180 and scene.back or pauseGame)()
pauseGame()
return
end
local m=keyMap

View File

@@ -42,10 +42,10 @@ return{
D.event=D.event+1
D.point=int(72e4/t)*.1
if D.event==20 then
P:showText(text.great,0,-140,100,"appear",.6)
P:showTextF(text.great,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=3
elseif D.event==50 then
P:showText(text.maxspeed,0,-140,100,"appear",.6)
P:showTextF(text.maxspeed,0,-140,100,"appear",.6)
end
end
end

View File

@@ -48,13 +48,13 @@ return{
D.event=D.event+1
D.point=int(s*36e3/t)*.1
if D.event==10 then
P:showText(text.great,0,-140,100,"appear",.6)
P:showTextF(text.great,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=4
elseif D.event==20 then
P:showText(text.awesome,0,-140,100,"appear",.6)
P:showTextF(text.awesome,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=5
elseif D.event==30 then
P:showText(text.maxspeed,0,-140,100,"appear",.6)
P:showTextF(text.maxspeed,0,-140,100,"appear",.6)
end
end
end

View File

@@ -1,7 +1,7 @@
local rnd,min=math.random,math.min
local function check_c4w(P)
for i=1,#P.clearedRow do
P.field[#P.field+1]=freeRow.get(10)
P.field[#P.field+1]=freeRow.get(13)
P.visTime[#P.visTime+1]=freeRow.get(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
@@ -46,17 +46,17 @@ return{
local P=players[1]
local F=P.field
for i=1,24 do
F[i]=freeRow.get(10)
F[i]=freeRow.get(13)
P.visTime[i]=freeRow.get(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
if r==1 then F[1][5],F[1][4],F[2][4]=13,13,13
elseif r==2 then F[1][6],F[1][7],F[2][7]=13,13,13
elseif r==3 then F[1][4],F[2][4],F[2][5]=13,13,13
elseif r==4 then F[1][7],F[2][7],F[2][6]=13,13,13
elseif r==5 then F[1][4],F[1][5],F[1][6]=13,13,13
elseif r==6 then F[1][7],F[1][6],F[1][5]=13,13,13
end
end,
mesDisp=function(P,dx,dy)

View File

@@ -1,7 +1,7 @@
local rnd,min=math.random,math.min
local function check_c4w(P)
for i=1,#P.clearedRow do
P.field[#P.field+1]=freeRow.get(10)
P.field[#P.field+1]=freeRow.get(13)
P.visTime[#P.visTime+1]=freeRow.get(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
@@ -44,17 +44,17 @@ return{
local P=players[1]
local F=P.field
for i=1,24 do
F[i]=freeRow.get(10)
F[i]=freeRow.get(13)
P.visTime[i]=freeRow.get(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
if r==1 then F[1][5],F[1][4],F[2][4]=13,13,13
elseif r==2 then F[1][6],F[1][7],F[2][7]=13,13,13
elseif r==3 then F[1][4],F[2][4],F[2][5]=13,13,13
elseif r==4 then F[1][7],F[2][7],F[2][6]=13,13,13
elseif r==5 then F[1][4],F[1][5],F[1][6]=13,13,13
elseif r==6 then F[1][7],F[1][6],F[1][5]=13,13,13
end
end,
mesDisp=function(P,dx,dy)

View File

@@ -37,15 +37,15 @@ return{
D.event=D.event+1
D.point=int(144e3/(240-2*D.event))*.1
if D.event==25 then
P:showText(text.great,0,-140,100,"appear",.6)
P:showTextF(text.great,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=3
P.dropDelay,P.gameEnv.drop=4,4
elseif D.event==50 then
P:showText(text.awesome,0,-140,100,"appear",.6)
P:showTextF(text.awesome,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=4
P.dropDelay,P.gameEnv.drop=3,3
elseif D.event==75 then
P:showText(text.maxspeed,0,-140,100,"appear",.6)
P:showTextF(text.maxspeed,0,-140,100,"appear",.6)
P.dropDelay,P.gameEnv.drop=2,2
end
end

View File

@@ -37,16 +37,16 @@ return{
D.event=D.event+1
D.point=int(108e3/(360-D.event*2))*.1
if D.event==25 then
P:showText(text.great,0,-140,100,"appear",.6)
P:showTextF(text.great,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=2
P.dropDelay,P.gameEnv.drop=20,20
elseif D.event==50 then
P:showText(text.awesome,0,-140,100,"appear",.6)
P:showTextF(text.awesome,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=3
P.dropDelay,P.gameEnv.drop=10,10
elseif D.event==90 then
P.dropDelay,P.gameEnv.drop=5,5
P:showText(text.maxspeed,0,-140,100,"appear",.6)
P:showTextF(text.maxspeed,0,-140,100,"appear",.6)
end
end
end

View File

@@ -2,7 +2,7 @@ return{
name={
"本地多人",
"本地多人",
"Hotseat",
"Multiplayer",
},
level={
"2P",
@@ -10,8 +10,8 @@ return{
"2P",
},
info={
"友尽模式",
"友尽模式",
"友尽模式(非联网/局域网)",
"友尽模式(非联网/局域网)",
"End of friendship",
},
color=color.white,

View File

@@ -2,7 +2,7 @@ return{
name={
"本地多人",
"本地多人",
"Hotseat",
"Multiplayer",
},
level={
"3P",
@@ -10,8 +10,8 @@ return{
"3P",
},
info={
"友尽模式",
"友尽模式",
"友尽模式(非联网/局域网)",
"友尽模式(非联网/局域网)",
"End of friendship",
},
color=color.white,

View File

@@ -2,7 +2,7 @@ return{
name={
"本地多人",
"本地多人",
"Hotseat",
"Multiplayer",
},
level={
"4P",
@@ -10,8 +10,8 @@ return{
"4P",
},
info={
"友尽模式",
"友尽模式",
"友尽模式(非联网/局域网)",
"友尽模式(非联网/局域网)",
"End of friendship",
},
color=color.white,

View File

@@ -26,7 +26,7 @@ local function score(P)
P.modeData.point,P.modeData.event=500,4
P:win("finish")
else
P:showText(text.stage(s),0,-120,80,"fly")
P:showTextF(text.stage(s),0,-120,80,"fly")
end
SFX.play("reach")
end

View File

@@ -30,7 +30,7 @@ local function score(P)
P.modeData.point,P.modeData.event=500,4
P:win("finish")
else
P:showText(text.stage(s),0,-120,80,"fly")
P:showTextF(text.stage(s),0,-120,80,"fly")
end
SFX.play("reach")
end

View File

@@ -12,7 +12,7 @@ local function score(P)
if MD.point%100==99 then SFX.play("blip_1")end
if int(MD.point*.01)>MD.event then
local s=MD.event+1;MD.event=s--level up!
P:showText(text.stage(s),0,-120,80,"fly")
P:showTextF(text.stage(s),0,-120,80,"fly")
local E=P.gameEnv
if s<4 then--first 300
if s~=1 then E.lock=E.lock-1 end

View File

@@ -9,10 +9,12 @@ local function task_PC(P)
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter==21 then
local t=P.stat.pc%2
local S=P.gameEnv.skin
for i=1,4 do
local r=freeRow.get(0)
for j=1,10 do
r[j]=PCbase[4*t+i][j]
local _=PCbase[4*t+i][j]
r[j]=S[_]or 0
end
ins(P.field,1,r)
ins(P.visTime,1,freeRow.get(20))
@@ -44,7 +46,7 @@ local function newPC(P)
elseif b<5 then b=7-b
end
end
P.next[#P.next+1]={bk=blocks[b][0],id=b,color=b,name=b}--P:newNext(b)'s simple version!
P:getNext(b)
end
P.modeData.counter=P.stat.piece==0 and 20 or 0
newTask(task_PC,P)
@@ -54,9 +56,9 @@ local function newPC(P)
P.gameEnv.lock=pc_lock[s]or 20
P.gameEnv.fall=pc_fall[s]or 5
if s==10 then
P:showText(text.maxspeed,0,-140,100,"appear",.6)
P:showTextF(text.maxspeed,0,-140,100,"appear",.6)
else
P:showText(text.speedup,0,-140,40,"appear",.8)
P:showTextF(text.speedup,0,-140,40,"appear",.8)
end
end
end

View File

@@ -6,10 +6,12 @@ local function task_PC(P)
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter==21 then
local t=P.stat.pc%2
local S=P.gameEnv.skin
for i=1,4 do
local r=freeRow.get(0)
for j=1,10 do
r[j]=PCbase[4*t+i][j]
local _=PCbase[4*t+i][j]
r[j]=S[_]or 0
end
ins(P.field,1,r)
ins(P.visTime,1,freeRow.get(20))
@@ -40,7 +42,7 @@ local function newPC(P)
elseif b<5 then b=7-b
end
end
P.next[#P.next+1]={bk=blocks[b][0],id=b,color=b,name=b}--P:newNext(b)'s simple version!
P:getNext(b)
end
P.modeData.counter=P.stat.piece==0 and 20 or 0
newTask(task_PC,P)

View File

@@ -26,7 +26,7 @@ return{
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 P:showText(text.maxspeed,0,-140,100,"appear",.6)end
if P.modeData.event==45 then P:showTextF(text.maxspeed,0,-140,100,"appear",.6)end
P.modeData.counter=0
P.modeData.event=P.modeData.event+1
end

View File

@@ -31,7 +31,7 @@ return{
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 P:showText(text.maxspeed,0,-140,100,"appear",.6)end
if P.modeData.event==60 then P:showTextF(text.maxspeed,0,-140,100,"appear",.6)end
P.modeData.counter=0
P.modeData.event=P.modeData.event+1
end

View File

@@ -27,7 +27,7 @@ return{
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 P:showText(text.maxspeed,0,-140,100,"appear",.6)end
if P.modeData.event==60 then P:showTextF(text.maxspeed,0,-140,100,"appear",.6)end
P.modeData.counter=0
P.modeData.event=P.modeData.event+1
end

View File

@@ -31,7 +31,7 @@ return{
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 P:showText(text.maxspeed,0,-140,100,"appear",.6)end
if P.modeData.event==45 then P:showTextF(text.maxspeed,0,-140,100,"appear",.6)end
P.modeData.counter=0
P.modeData.event=d
end

View File

@@ -33,7 +33,7 @@ return{
P.atkBuffer[p+3]={pos=rnd(10),amount=6,countdown=1.5*t,cd0=1.5*t,time=0,sent=false,lv=5}
P.atkBuffer.sum=P.atkBuffer.sum+20
P.stat.recv=P.stat.recv+20
if P.modeData.event==31 then P:showText(text.maxspeed,0,-140,100,"appear",.6)end
if P.modeData.event==31 then P:showTextF(text.maxspeed,0,-140,100,"appear",.6)end
P.modeData.counter=0
P.modeData.event=P.modeData.event+1
end

View File

@@ -153,14 +153,13 @@ function Pnt.BG.game5()
else gc.clear(0,0,0)
end
end--Lightning
local miniBlockColor={}
function Pnt.BG.game6()
local t=1.2-Timer()%10%3%1.2
if t<.3 then gc.clear(t,t,t)
else gc.clear(0,0,0)
end
local R=7-int(Timer()*.5)%7
local _=miniBlockColor[R]
local _=skin.libColor[setting.skin[R]]
gc.setColor(_[1],_[2],_[3],.1)
gc.draw(miniBlock[R],640,360,Timer()%3.1416*6,400,400,scs[R][0][2]-.5,#blocks[R][0]-scs[R][0][1]+.5)
end--Fast lightning&spining tetromino
@@ -497,13 +496,11 @@ function Pnt.pause()
gc.rectangle("fill",0,0,scr.w,scr.h)
gc.pop()
setFont(25)
gc.setColor(1,1,1,T)
if pauseCount>0 then
t=curMode.pauseLimit and pauseTime>30
if t then gc.setColor(1,.4,.4,T)end
gc.setColor(1,.4,.4,T)
gc.print(text.pauseCount..":["..pauseCount.."] "..format("%.2f",pauseTime).."s",110,150)
if t then gc.setColor(1,1,1,T)end
end
gc.setColor(1,1,1,T)
for i=1,7 do
gc.print(text.pauseStat[i],95,30*i+310)
gc.print(sceneTemp[i],305,30*i+310)
@@ -564,10 +561,10 @@ function Pnt.setting_control()
--Floating number
setFont(30)
local _=setting
mStr(_.das,226+35*_.das,150)
mStr(_.arr,226+35*_.arr,240)
mStr(_.sddas,226+35*_.sddas,330)
mStr(_.sdarr,226+35*_.sdarr,420)
mStr(_.das,226+35*_.das,145)
mStr(_.arr,226+35*_.arr,235)
mStr(_.sddas,226+35*_.sddas,325)
mStr(_.sdarr,226+35*_.sdarr,415)
--Testing O mino
_=blockSkin[setting.skin[6]]
@@ -633,17 +630,17 @@ function Pnt.setting_skin()
for N=1,7 do
local face=setting.face[N]
local B=blocks[N][face]
local x,y=-30+140*N-scs[N][face][2]*30,335+scs[N][face][1]*30
local x,y=-25+140*N-scs[N][face][2]*30,325+scs[N][face][1]*30
local col=#B[1]
for i=1,#B do for j=1,col do
if B[i][j]then
gc.draw(blockSkin[setting.skin[N]],x+30*j,y-30*i)
end
end end
gc.circle("fill",-15+140*N,350,sin(Timer()*10)+5)
gc.circle("fill",-10+140*N,340,sin(Timer()*10)+5)
end
for i=1,5 do
gc.draw(blockSkin[12+i],1110,140+60*i,nil,2)
for i=1,6 do
gc.draw(blockSkin[11+i],1110,100+60*i,nil,2)
end
gc.draw(drawableText.setting_skin,80,50)
end

View File

@@ -91,8 +91,8 @@ local TRS={
[02]={{0,0},{-1,0}, {1,0}, {0,-1}, {0,1} },
[20]={{0,0},{1,0}, {-1,0}, {0,1}, {0,-1} },
[13]={{0,0},{0,-1}, {-1,0}, {1,0}, {0,1} },
[31]={{0,0},{1,0}, {-1,0}},
}
[31]={{0,0},{0,-1}, {1,0}, {-1,0}, {0,1} },
}--I
}for i=1,7 do collect(TRS[i])end
local AIRS={
[1]={

View File

@@ -1,13 +1,12 @@
--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
--Private--
local gc=love.graphics
local C=gc.clear
local shadowMapShader=gc.newShader("shader/shadowMap.cs")--Shader for caculating the 1D shadow map.
local lightRenderShader=gc.newShader("shader/lightRender.cs")--Shader for rendering blurred lights and shadows.
Lights={}--Lightsource objects
local Lights=Lights
--Private--
local Lights={}--Lightsource objects
local function move(L,x,y)
L.x,L.y=x,y
end
@@ -51,18 +50,18 @@ local function draw(L)
--复位
end
--Public--
function drawLight()
function Lights.draw()
for i=1,#Lights do
Lights[i]:draw()
end
end
function clearLight(L)
for i=1,#Lights do
function Lights.clear(L)
for i=#Lights,1,-1 do
Lights[i]:destroy()
Lights[i]=nil
end
end
function addLight(x,y,R,F)
function Lights.add(x,y,R,F)
local id=#Lights+1
Lights[id]={
id=id,
@@ -77,4 +76,5 @@ function addLight(x,y,R,F)
draw=draw,
destroy=destroy,
}
end
end
return Lights

View File

@@ -75,7 +75,7 @@ voiceList={
mini={"mini_1","mini_2","mini_3"},
b2b={"b2b_1","b2b_2","b2b_3"},
b3b={"b3b_1","b3b_2"},
pc={"perfectclear_1","perfectclear_2"},
pc={"clear_1","clear_2"},
win={"win_1","win_2","win_3","win_4","win_5","win_6","win_6","win_7"},
lose={"lose_1","lose_2","lose_3"},
bye={"bye_1","bye_2"},

View File

@@ -17,7 +17,7 @@ SFX.list={
"clear_1","clear_2","clear_3","clear_4",
"spin_0","spin_1","spin_2","spin_3",
"emit","blip_1","blip_2",
"perfectclear",
"clear",
"error",
--Mono sfxs

View File

@@ -51,9 +51,9 @@ function space.draw()
if not stars[1]then return end
gc.translate(-50,-50)
gc.setLineWidth(7)
gc.setColor(planet.R,planet.G,planet.B,.1626)
gc.setColor(planet.R,planet.G,planet.B,.026)
gc.circle("line",planet.x,planet.y,planet.r+1)
gc.setColor(planet.R,.6,planet.B,.26)
gc.setColor(planet.R,.6,planet.B,.0626)
gc.circle("fill",planet.x,planet.y,planet.r)
gc.setColor(.9,.9,.9)
for i=1,2600,5 do

View File

@@ -13,6 +13,7 @@ local gameEnv0={
quickR=true,swap=true,
ghost=true,center=true,
smooth=false,grid=false,
text=true,
lockFX=3,dropFX=3,
shakeFX=3,
@@ -53,14 +54,9 @@ local spinSCR={--[blockName][row]
--B2BMUL:1.2/2.0
--Techrash:1K;MUL:1.3/1.8
--Mini*=.6
local visible_opt={show=1e99,time=300,fast=20,none=5}
local visible_opt={show=1e99,time=300,fast=20,none=0}
local reAtk={0,0,1,1,1,2,2,3,3}
local reDef={0,1,1,2,3,3,4,4,5}
local spinName={"zspin","sspin","lspin","jspin","tspin","ospin","ispin"}
local clearName={"single","double","triple"}
local spin_n={[0]="spin_0","spin_1","spin_2","spin_3"}
local clear_n={"clear_1","clear_2","clear_3","clear_4"}
local ren_n={}for i=1,11 do ren_n[i]="ren_"..i end
local initCenterX={6,6,6,6,6,6.5,6.5}--1 added
local initCenterY={22,22,22,22,22,22.5,21.5}--1 added
local CCblockID={4,3,5,6,1,2,0}
@@ -69,7 +65,7 @@ local kickList=require("parts/kickList")
local finesseCtrlPar={
[1]={
{1,2,1,0,1,2,2,1},
{2,2,3,1,1,2,3,2,2},
{2,2,2,1,1,2,3,2,2},
},--Z
[3]={
{1,2,1,0,1,2,2,1},
@@ -92,42 +88,42 @@ local CCblockID={4,3,5,6,1,2,0}
local freshMethod={
none=NULL,
bag7=function(P)
if #P.next<6 then
local bag={1,2,3,4,5,6,7}
::L::P:getNext(rem(bag,rnd(#bag)))
if bag[1]then goto L end
end
local bag={1,2,3,4,5,6,7}
::L::P:getNext(rem(bag,rnd(#bag)))
if bag[1]then goto L end
end,
his4=function(P)
if #P.next<6 then
local j,i=0
repeat
i,j=rnd(7),j+1
until i~=P.his[1]and i~=P.his[2]and i~=P.his[3]and i~=P.his[4]
P:getNext(i)
rem(P.his,1)P.his[4]=i
end
local i
local j=0
repeat
i=rnd(7)
j=j+1
until i~=P.his[1]and i~=P.his[2]and i~=P.his[3]and i~=P.his[4]and j<6
P:getNext(i)
rem(P.his,1)P.his[4]=i
end,
rnd=function(P)
::L::local i=rnd(7)
if i==P.next[5].id then goto L end
local i
::L::i=rnd(7)
if P.next[1]and i==P.next[#P.next].id then goto L end
P:getNext(i)
end,--random
end,
drought1=function(P)
if #P.next<6 then
local bag={1,2,3,4,5,6}
::L::P:getNext(rem(bag,rnd(#bag)))
if bag[1]then goto L end
end
local bag={1,2,3,4,5,6}
::L::P:getNext(rem(bag,rnd(#bag)))
if bag[1]then goto L end
end,
drought2=function(P)
if #P.next<6 then
local bag={1,1,1,1,2,2,2,2,6,6,6,6,3,3,4,4,5,7}
::L::P:getNext(rem(bag,rnd(#bag)))
if bag[1]then goto L end
end
local bag={1,1,1,1,2,2,2,2,6,6,6,6,3,3,4,4,5,7}
::L::P:getNext(rem(bag,rnd(#bag)))
if bag[1]then goto L end
end,
}
local spinName={"zspin","sspin","lspin","jspin","tspin","ospin","ispin"}
local clearName={"single","double","triple"}
local spin_n={[0]="spin_0","spin_1","spin_2","spin_3"}
local clear_n={"clear_1","clear_2","clear_3","clear_4"}
local ren_n={}for i=1,11 do ren_n[i]="ren_"..i end
-------------------------</GameData>------------------------
--------------------------<Pnt/Upd>-------------------------
@@ -394,7 +390,7 @@ end
local function Pdraw_small(P)
P.frameWait=P.frameWait-1
if P.frameWait==0 then
P.frameWait=8
P.frameWait=10
gc.setCanvas(P.canvas)
gc.clear(0,0,0,.4)
gc.push("transform")
@@ -607,7 +603,7 @@ local function Pupdate_alive(P,dt)
P.AI_stage=AI_think[P.AI_mode][P.AI_stage](P,C)
elseif P.AI_delay<=0 then
P:pressKey(C[1])P:releaseKey(C[1])
local k=#C for i=1,k do C[i]=C[i+1]end--table.remove(C,1)
rem(C,1)
P.AI_delay=P.AI_delay0*2
end
end
@@ -712,7 +708,7 @@ local function Pupdate_alive(P,dt)
end
end
if not P.control then goto stop end
if P.waiting==0 then P:freshNext()end
if P.waiting==0 then P:popNext()end
if P.waiting>=0 then
P.waiting=P.waiting-1
goto stop
@@ -797,10 +793,13 @@ player={}local player=player
----------------------------<FX>----------------------------
local textFX=textFX
function player.showText(P,text,dx,dy,font,style,spd,stop)
if P.bonus then
if P.gameEnv.text then
P.bonus[#P.bonus+1]=getTEXT(text,150+dx,300+dy,font*P.size,style,spd,stop)
end
end
function player.showTextF(P,text,dx,dy,font,style,spd,stop)
P.bonus[#P.bonus+1]=getTEXT(text,150+dx,300+dy,font*P.size,style,spd,stop)
end
local function without(L,e)
for i=1,#L do
if L[i]==e then return end
@@ -809,7 +808,7 @@ local function without(L,e)
end
function player.createLockFX(P)
local BK=P.cur.bk
local t=.1-P.gameEnv.lockFX*.02
local t=.3-P.gameEnv.lockFX*.06
for i=1,P.r do
local y=P.curY+i-1
if without(P.clearedRow,y)then
@@ -821,7 +820,7 @@ function player.createLockFX(P)
end
end
end
function player.createShade(P,x1,y1,x2,y2)--x1<x2,y1>y2!
function player.createDropFX(P,x1,y1,x2,y2)--x1<x2,y1>y2!
if P.gameEnv.block and y1>=y2 then
P.dropFX[#P.dropFX+1]={5,P.cur.color,x1,y1,x2,y2}
end
@@ -1077,7 +1076,7 @@ function player.freshgho(P)
end
if P.curY>P.y_img then
if P.gameEnv.dropFX then
P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
end
if P.gameEnv.shakeFX then
P.fieldOff.vy=P.gameEnv.shakeFX*.5
@@ -1170,7 +1169,7 @@ function player.spin(P,d,ifpre)
do return end
::spin::
if P.gameEnv.dropFX then
P:createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY)
P:createDropFX(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY)
end
local y0=P.curY
P.curX,P.curY,P.dir=ix,iy,idir
@@ -1217,7 +1216,9 @@ function player.hold(P,ifpre)
P.hd.bk=blocks[hid][P.gameEnv.face[hid]]
if P.cur.id==0 then
P.cur=rem(P.next,1)
P:newNext()
if #P.next<P.gameEnv.next then
P:newNext()
end
if P.AI_mode=="CC"then BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])end
end
P:resetBlock()
@@ -1233,17 +1234,19 @@ function player.hold(P,ifpre)
end
end
function player.getNext(P,n)
P.next[#P.next+1]={bk=blocks[n][P.gameEnv.face[n]],id=n,color=P.gameEnv.bone and 12 or P.gameEnv.skin[n],name=n}
local E=P.gameEnv
P.next[#P.next+1]={bk=blocks[n][E.face[n]],id=n,color=E.bone and 12 or E.skin[n],name=n}
end
--function player.newNext()--check/add new next to next queue,defined when create player
function player.freshNext(P)
function player.popNext(P)--pop next queue to hand
P.holded=false
P.spinLast=false
P.spinSeq=0
P.ctrlCount=0
P.cur=rem(P.next,1)
P:newNext()
if #P.next<P.gameEnv.next then
P:newNext()
end
if P.AI_mode=="CC"then BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])end
local _=P.keyPressing
if P.gameEnv.hold and _[8]then
@@ -1278,6 +1281,8 @@ function player.drop(P)--Place piece
P.dropTime[11]=ins(P.dropTime,1,frame)--update speed dial
local cmb=P.combo
P.waiting=P.gameEnv.wait
local clear--if (perfect)clear
local cc=0--cleared row
local send,exblock=0,0--Send&Send Time
local cscore,sendTime=0,0
local dospin=0
@@ -1305,7 +1310,6 @@ function player.drop(P)--Place piece
--清空消行列表
if P.clearedRow[1]then P.clearedRow={}end
--消行
local cc=0
for i=0,P.r-1 do
local h=P.curY+i
if P:ckfull(h)then
@@ -1321,13 +1325,15 @@ function player.drop(P)--Place piece
end
end
end
_=#P.clearingRow
::L::if _>0 and P.clearingRow[_]>#P.field then
P.clearingRow[_]=nil
_=_-1
goto L
--处理锁定特效
if P.gameEnv.lockFX then
if cc==0 then
P:createLockFX()
elseif P.lockFX[1]then
P.lockFX={}
end
end
if P.clearingRow[1]then P.falling=P.gameEnv.fall end
--处理锁定特效
if P.gameEnv.lockFX then
@@ -1381,14 +1387,32 @@ function player.drop(P)--Place piece
end
end
end
else
finesse=true
end
::L2::
--移除消去的行
for i=cc,1,-1 do
_=P.clearedRow[i]
freeRow.discard(rem(P.field,_))
freeRow.discard(rem(P.visTime,_))
if cc>0 then
for i=cc,1,-1 do
_=P.clearedRow[i]
freeRow.discard(rem(P.field,_))
freeRow.discard(rem(P.visTime,_))
end
end
--清除超高特效
_=#P.clearingRow
::L::if _>0 then
if P.clearingRow[_]>#P.field then
P.clearingRow[_]=nil
_=_-1
goto L
end
end
if P.clearingRow[1]then
P.falling=P.gameEnv.fall
elseif cc==P.r then
clear=true
end
if not finesse then--极简判定:操作判断法
@@ -1489,7 +1513,7 @@ function player.drop(P)--Place piece
SFX.play(spin_n[cc])
VOICE(spinName[P.cur.name],CHN)
end
elseif #P.field>0 then
elseif not clear then
P.b2b=max(P.b2b-250,0)
P:showText(text.clear[cc],0,-30,27+cc*3,"appear",(8-cc)*.3)
send=cc-.75
@@ -1508,21 +1532,31 @@ function player.drop(P)--Place piece
P:showText(text.cmb[min(cmb,20)],0,25,15+min(cmb,25)*3,cmb<10 and"appear"or"flicker")
cscore=cscore+min(20*cmb,300)*cc
end
if #P.field==0 then
P:showText(text.PC,0,-80,50,"flicker")
send=send^.5+min(6+P.stat.pc,10)
exblock=exblock+2
sendTime=sendTime+60
if P.stat.row+cc>4 then
P.b2b=1200
cscore=cscore+300*min(6+P.stat.pc,10)
if clear then
if #P.field==0 then
P:showText(text.PC,0,-80,50,"flicker")
send=send^.5+min(6+P.stat.pc,10)
exblock=exblock+2
sendTime=sendTime+120
if P.stat.row+cc>4 then
P.b2b=1200
cscore=cscore+300*min(6+P.stat.pc,10)
else
cscore=cscore+626
end
P.stat.pc=P.stat.pc+1
P.lastClear=P.cur.id*10+5
else
P:showText(text.C,0,-80,50,"fly")
send=send+2
exblock=exblock+2
sendTime=sendTime+60
cscore=cscore+626
P.stat.c=P.stat.c+1
P.lastClear=cc
end
P.stat.pc=P.stat.pc+1
P.lastClear=P.cur.id*10+5
if P.human then
SFX.play("perfectclear")
SFX.play("clear")
VOICE("pc",CHN)
end
end
@@ -1698,7 +1732,7 @@ local function gameOver()
end
if p<10 then
if p==0 then
P:showText(text.newRecord,0,-100,100,"beat",.5)
P:showTextF(text.newRecord,0,-100,100,"beat",.5)
end
D.date=os.date("%Y/%m/%d %H:%M")
ins(L,p+1,D)
@@ -1748,9 +1782,9 @@ function player.win(P,result)
end
newTask(Event_task.finish,P)
if curMode.id=="custom_puzzle"then
P:showText(text.win,0,0,90,"beat",.4)
P:showTextF(text.win,0,0,90,"beat",.4)
else
P:showText(text.win,0,0,90,"beat",.5,.2)
P:showTextF(text.win,0,0,90,"beat",.5,.2)
end
if P.human then
gameOver()
@@ -1779,7 +1813,7 @@ function player.lose(P)
if modeEnv.royaleMode then
P:changeAtk()
P.modeData.event=#players.alive+1
P:showText(P.modeData.event,0,-120,60,"appear",1,12)
P:showTextF(P.modeData.event,0,-120,60,"appear",1,12)
P.strength=0
if P.lastRecv then
local A,i=P,0
@@ -1816,7 +1850,7 @@ function player.lose(P)
end
end
P.gameEnv.keepVisible=P.gameEnv.visible~="show"
P:showText(text.lose,0,0,90,"appear",.5,.2)
P:showTextF(text.lose,0,0,90,"appear",.5,.2)
if P.human then
gameResult="lose"
SFX.play("fail")
@@ -1917,7 +1951,7 @@ function player.act.hardDrop(P)
elseif P.control and P.waiting==-1 then
if P.curY~=P.y_img then
if P.gameEnv.dropFX then
P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
end
P.curY=P.y_img
P.spinLast=false
@@ -1969,7 +2003,7 @@ function player.act.insLeft(P,auto)
while not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)do
P.curX=P.curX-1
if P.gameEnv.dropFX then
P:createShade(P.curX+P.c,P.curY+P.r-1,P.curX+P.c,P.curY)
P:createDropFX(P.curX+P.c,P.curY+P.r-1,P.curX+P.c,P.curY)
end
P:freshgho()
end
@@ -1991,7 +2025,7 @@ function player.act.insRight(P,auto)
while not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)do
P.curX=P.curX+1
if P.gameEnv.dropFX then
P:createShade(P.curX-1,P.curY+P.r-1,P.curX-1,P.curY)
P:createDropFX(P.curX-1,P.curY+P.r-1,P.curX-1,P.curY)
end
P:freshgho()
end
@@ -2010,7 +2044,7 @@ end
function player.act.insDown(P)
if P.curY~=P.y_img then
if P.gameEnv.dropFX then
P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
end
if P.gameEnv.shakeFX then
P.fieldOff.vy=P.gameEnv.shakeFX*.5
@@ -2094,7 +2128,7 @@ function newDemoPlayer(id,x,y,size)
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,
pc=0,b2b=0,b3b=0,
pc=0,c=0,b2b=0,b3b=0,
}
P.modeData={point=0,event=0,counter=0}
P.keyTime={}P.keySpeed=0
@@ -2111,6 +2145,7 @@ function newDemoPlayer(id,x,y,size)
quickR=true,swap=true,
ghost=setting.ghost,center=setting.center,
smooth=setting.smooth,grid=setting.grid,
text=setting.text,
lockFX=setting.lockFX,dropFX=setting.dropFX,
shakeFX=setting.shakeFX,
@@ -2122,7 +2157,7 @@ function newDemoPlayer(id,x,y,size)
ospin=true,
sequence="bag7",
face={0,0,0,0,0,0,0},
skin={1,5,2,8,10,3,7},
skin=setting.skin,
pushSpeed=3,
block=true,
@@ -2154,15 +2189,8 @@ function newDemoPlayer(id,x,y,size)
P.spinSeq=0
P.ctrlCount=0
local bag1={1,2,3,4,5,6,7}
for _=1,7 do
P:getNext(rem(bag1,rnd(#bag1)))
end
P.newNext=freshMethod.bag7
if ENV.sequence==1 then P.bag={}
elseif ENV.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.next.id[i+3]end
elseif ENV.sequence==3 then
end
P:newNext()
P.human=false
P.AI_mode="CC"
@@ -2202,7 +2230,7 @@ function newDemoPlayer(id,x,y,size)
P.dust=clearDust:clone()
P.dust:start()
P:freshNext()
P:popNext()
end
function newPlayer(id,x,y,size,AIdata)
players[id]={id=id}
@@ -2239,7 +2267,7 @@ function newPlayer(id,x,y,size,AIdata)
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,
pc=0,b2b=0,b3b=0,
pc=0,c=0,b2b=0,b3b=0,
}--Current gamestat
P.modeData={point=0,event=0,counter=0}--data use by mode
P.keyTime={}for i=1,10 do P.keyTime[i]=-1e5 end P.keySpeed=0
@@ -2281,33 +2309,11 @@ function newPlayer(id,x,y,size,AIdata)
P.ctrlCount=0--key press time,for finesse check
P.his={rnd(7),rnd(7),rnd(7),rnd(7)}
local s=ENV.sequence
if s=="bag7"or s=="his4"then
local bag1={1,2,3,4,5,6,7}
for _=1,7 do
P:getNext(rem(bag1,rnd(#bag1)))
end
elseif s=="rnd"then
for _=1,6 do
local r=rnd(7)
P:getNext(r)
end
elseif s=="drought1"then
local bag1={1,2,3,4,5,6}
for _=1,6 do
P:getNext(rem(bag1,rnd(#bag1)))
end
elseif s=="drought2"then
local bag1={1,2,3,4,6,6}
for _=1,6 do
P:getNext(rem(bag1,rnd(#bag1)))
end
end
P.newNext=freshMethod[ENV.sequence]
if ENV.sequence==1 then P.bag={}--Bag7
elseif ENV.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.next.id[i+3]end--History4
elseif ENV.sequence==3 then--Pure random
if ENV.sequence~="none"then
while #P.next<P.gameEnv.next do
P:newNext()
end
end
if AIdata then
@@ -2351,6 +2357,7 @@ function newPlayer(id,x,y,size,AIdata)
ENV.next=min(ENV.next,setting.maxNext)
end
if P.small then
ENV.text=false
ENV.lockFX=nil
ENV.dropFX=nil
ENV.shakeFX=nil
@@ -2378,6 +2385,7 @@ function newPlayer(id,x,y,size,AIdata)
P.score1,P.b2b1=0,0
P.dropFX,P.lockFX={},{}
P.bonus={}--texts
P.endCounter=0--used after gameover
P.result=nil--string:"WIN"/"K.O."

View File

@@ -97,7 +97,7 @@ local sceneInit={
S.clear_1.."/"..S.clear_2.."/"..S.clear_3.."/"..S.clear_4,
"["..S.spin_0.."]/"..S.spin_1.."/"..S.spin_2.."/"..S.spin_3,
S.b2b.."[+"..S.b3b.."]",
S.pc,
S.pc.."["..S.c.."]",
format("%.3f",S.atk/S.row),
S.extraPiece,
format("%.2f%%",100*max(1-S.extraRate/S.piece,0)),
@@ -160,7 +160,7 @@ local sceneInit={
format("%d/%d/%d/%d",S.clear_1,S.clear_2,S.clear_3,S.clear_4),
format("[%d]/%d/%d/%d",S.spin_0,S.spin_1,S.spin_2,S.spin_3),
S.b2b.."[+"..S.b3b.."]",
S.pc,
S.pc.."["..S.c.."]",
format("%.2f",S.atk/S.row),
format("%d[%.3f%%]",S.extraPiece,100*max(1-S.extraRate/S.piece,0)),
}

View File

@@ -357,7 +357,7 @@ function gameStart()
SFX.play("start")
for P=1,#players do
P=players[P]
P:freshNext()
P:popNext()
P.timing=true
P.control=true
end

View File

@@ -1,8 +1,10 @@
local S=[=[
"Patron"(rmb10+)(ordered by first char):
八零哥
dtg
Fireboos
gggf127
加油啊,钉钉动了的大哥哥(T3228)
金巧
乐↗乐↘
立斐
@@ -22,14 +24,15 @@ local S=[=[
Future outlook:
New mode:
finesse
useful game Abbr. test
finesse exam(3next,1pt/mino,drop to score)
round-based dig
Infinite battle
Bigbang
Rhythm
Combo
Square
Shifting field
Shifting field(left/right)
Other:
bag sep-line switch
game recording
@@ -41,19 +44,40 @@ Future outlook:
Encrypt source code(compile to byte code)
new AI:task-Z
CC smarter(think of garbage buffer)
0.8.14:
0.8.15:Bug Fixed
new:
can switch line-clear text now
new attack way "Clear"(half-clear)
give every update a name!
changed:
animation time of lock effect little changed
AI change target more slowly
Author.dignity-=1
fixed:
180° I spin kicklist error
AI will kill itself when spawn dir. of mino changed
error when reach 400 in 20G(Lunatic)
error block color in modes with starting field
cannot play pctrain mode
0.8.14:Cool FX
new:
click/tap/any-key to skip loading animation
lock animation
changed:
display scene info when error
//many optimization
code:
many optimization
fixed:
error when attack
error garbage line color
error in finesse checking
some times error when touch screen
0.8.13:
touch/press release with no press,then error
0.8.13:O-spin Update++
new:
a independent page to set DAS/ARR,with an animation for preview
changed:
@@ -66,7 +90,8 @@ Future outlook:
ospin error in 0.8.12
memory leakage in t49/t99
new behavior of widgets
0.8.12:
0.8.12:Bountful Update
new:
layout setting:skin system with customizable block color/direction
more information when pause
@@ -80,12 +105,13 @@ Future outlook:
canceled invalid game
easier to unlock custom mode
some text changed
//better line-clear process
//merge event.lua to player.lua
//new skin image format
//same format for all file
//better virtualkey-scanning opportunity,bit faster when many AI
//some player-method name changed
code:
better line-clear process
merge event.lua to player.lua
new skin image format
same format for all file
better virtualkey-scanning opportunity,bit faster when many AI
some player-method name changed
fixed:
an error of pause button
score may be float number
@@ -93,7 +119,8 @@ Future outlook:
crash when paste illegal data to drawing mode
stage reset problem in t49/t99 mode
wrong info in tech-L/U/U+ mode
0.8.11:
0.8.11:Total Update
changed:
better rule of checking invalid game
can setting when pause
@@ -105,7 +132,8 @@ Future outlook:
must hold R to restart when finished the game
sth about screen size
some O-spin error
line counting when pc(full b2b)
error line counting when pc(full b2b)
0.8.10:
new BGM:Distortion(master-final)
all background darker
@@ -113,16 +141,17 @@ Future outlook:
fixed:
error when finish master/ultra mode
shakeFX no effect when below 3
0.8.9:
0.8.9:System Detail Update
invalid game when pause too much
quick play re-added
new BGM:Oxygen(c4w&pc training)
space background little changed
fixed:
touch/press release with no press(don't know why)
0.8.8+:
0.8.8+:Bug-Fix Update
fixed many fatal bugs
0.8.8:
0.8.8:Space BG Update
background now is cool space with "planets" and "stars",not boring falling tetrominos!
records with date
adjustable waiting time before start
@@ -136,20 +165,23 @@ Future outlook:
cannot press invisible func key
fixed:some mode error
add many fatal bugs
0.8.7:
0.8.7:Game Detail Update
better user experience in mode selecting
support 2^n G falling speed
speed of marathon mode changed
shorter clipboard string(when air above)
attack system/score system little changed
fixed:rank system,some mode error when enter(again!)
0.8.6:
0.8.6:System Detail Update
gamepad can adjust key
add SFX when enter game
map GUI little adjusted
event system little changed(no ctrl when scene swapping)
fixed:rank system,some mode error when enter
0.8.5-:
0.8.5-:Exploration Update
mode map!Brandly new GUI for mode selecting
mode unlock system,not that scary for noob
every mode has rank calculating method(may some mistakes/inappropriate number)
@@ -160,49 +192,59 @@ Future outlook:
better widget performence
remove Qplay
many bug fixed
0.8.4:
0.8.4:Miya Update+
vocal more natural(important,may cause new bug)
a bit better performence on mobile devices
fatal bug fixed
0.8.3:
0.8.3:Miya Update
new widget appearence
cuter miya
0.8.2+:
GUI adjusted
0.8.2:Graphics Update
miya figure added
0.8.2:
new widget appearence
GUI adjusted
bug fixed
0.8.1:
0.8.1:Power Info Update
more FX level
better battery info displaying
3 next in GMroll
bug fixed
0.8.0:
0.8.0:Small Update
remake text system
more details
bug fixed
0.7.35:
0.7.35:Bug Fixed
bug fixed
0.7.34:
0.7.34:Voice Update+
replace most voice
shaking FX more natural
0.7.33+:
0.7.33+:Bot Update
MORE POWERFUL 9-stack AI
add stereo-setting slider
code optimized
bug fixed
0.7.32:
0.7.32:Virtualkey Update+
Blind-GM now show section directly
easier&more standard classic mode
can switch Virtualkey's auto dodging
in-game setting
code optimized
bug fixed
0.7.31:
0.7.31:Stereo Update
stereo system
fixed a problem in finesse calculating
0.7.30:
0.7.30:Virtualkey Update
auto-tracking virtual key,adjustable parameters!
can switch on/off virtuakeys
add 7 more key
@@ -212,22 +254,27 @@ Future outlook:
can use preset in custom mode with keyboard
adjusted GUI
many bug fixed
0.7.28:
0.7.28:Finesse Update
add fineese check(almost useful)
code optimized
0.7.27:
0.7.27:O-spin Update+
super O transform system
optimized light system(no used)
bug fixed
0.7.26:
0.7.26:Bug Fixed
new skin
import light lib
many bug fixed
0.7.25:
0.7.25:Demo Update
demo play at main menu
ALMOST reconstructed WHOLE PLAYER SYSTEM,NEED TEST
many bug fixed
0.7.24(0.7.23):
0.7.23/24:Feast of Hearing
REMAKE ALL BGM!
more settings with brand new GUI!
new mode:Master-Final
@@ -239,7 +286,8 @@ Future outlook:
louder sound
code optimized
many bugs fixed
0.7.22:
0.7.22:Graphics Update
scoring system
smooth dropping
can change FX level
@@ -254,20 +302,23 @@ Future outlook:
compressed setting/data
support 10% step alpha of virtual key
many code optimized&bugs fixed
0.7.21:
0.7.21:Title Update
new title image
more GUI details
many bugs fixed
0.7.20:
0.7.20:Music Room Update
add music room
change block/space apperance in draw mode
field shake animation
default sets of custom options
can set BG/BGM in custom mode
bug fixed
0.7.19:
secret option!
macOS version!
0.7.19:Voice Update
voice system added(voice by Miya)
support macOS!
new mode:C4W training
rendering of royale mode optimized again
add "free cell" in draw mode
@@ -275,14 +326,16 @@ Future outlook:
new difficulty in infinite mode
new background/sound effect in master mode
bug fixed
0.7.18:
0.7.18:Skin Update
3 new block skins!(one skin origional by Miya(nya~))
better restarting(to prevent mistakenly touching)
switch display of puzzle mode
adjust UI
code optimized
default custom options changed to as infinite mode
0.7.17:
0.7.17:Pause Update
display game stats when pause
more options in statistics
better pausing
@@ -291,28 +344,33 @@ Future outlook:
adjust vibrate level for mobile devices
little optimized
bugs fixed
0.7.16:
bugs fixed
0.7.16:Game Detail Update
change rules of custom puzzle mode
change rules of TSD mode
better pausing
speed optimized
adjust difficulty of dig mode
0.7.15:
bugs fixed
0.7.15:Puzzle Update
can make puzzle by drawing mode
can pause game with animation
change icon of "Functional key"
speed optimized
bugs fixed
0.7.14:
0.7.14:Creativity Update
drawing mode in custom game
adjustable virtual keys with mouse
speed optimized
rotate also create shade
0.7.13+:
0.7.13+:Small Update
change difficulty of survivor mode
little game rule change
bugs fixed(AI control error)
0.7.13:
Chinese game name:方块研究所
SUPER COOL instant moving effect
@@ -323,7 +381,8 @@ Future outlook:
code reconstructed
bugs fixed(error when seq=his,size of custom oppo)
debug key change to F8
0.7.12:
0.7.12:Total Update
AI learned to switch attack mode
seperate master mode from marathon mode
master mode more interesting
@@ -336,7 +395,8 @@ Future outlook:
swap target by combo key/press
some Chinese translaton edited
[reconstruct event system]
0.7.11:
0.7.11:Total Update
some Chinese translaton edited
add bone block in 2 hardest marathon(new block-fresh system)
play sound when get badges in royale mode
@@ -347,35 +407,40 @@ Future outlook:
fix 6 next in classic mode
add QR code in help page
change some detials
0.7.10:
更完全的中文翻译
0.7.10:Small Update
full Chinese translation
add Classic mode
change O spin's behaviour
fix bugs
0.7.9:
bugs fixed
0.7.9:O-spin Update
O spin is a lie
better attacking pointer
language system
change rotate system
change BGM&BG set
code optimized
fix bugs
0.7.8:
bugs fixed
0.7.8:Performance Update
GPU usage decreased much more than before
add virtual key animation
display player's rank after death in royale mode
fix sequence error of PC training mode
adjust difficulty of suvivor mode
code optimized
fix bugs
0.7.7:
bugs fixed
0.7.7:Mode Update
add dig mode
add survivor mode
combine some modes
change some GUI
more SFXs
fix bugs
0.7.6:
bugs fixed
0.7.6:Mode Update
new font
add DIFFICULTY selection
virtual keys give visual feedback(PC/phone)
@@ -387,7 +452,8 @@ Future outlook:
more FXs in royale mode
fix all attacking bug of royale mode
change sequence of TSD-only mode to bag7
0.7.5:
0.7.5:Total Update
reduce difficuly of PC training mode,and add more patterns
reduce difficuly of death mode
add PC challenge mode
@@ -401,16 +467,19 @@ Future outlook:
adjust GUI of royale mode
change sequence of TSD-only mode
royale mode use LESS GPU
0.7.4:
0.7.4:Bug Update
add a lot of bugs
0.7.3:
0.7.3:Game Detail Update
add infinite target in custom
fix TSD-only mode result+1 when finishing with a wrong clear
change sequence generator of TSD-only mode
GUI position edited
Fix Screen flow
smarter AI
0.7.2:
0.7.2:Mode Update
add PC training mode
add TSD-only mode
remove non-sense s/z spin double

View File

@@ -262,16 +262,15 @@ local Widget={
dropFX= newSlider(310,410,373,5,35,nil, SETval("dropFX"), SETsto("dropFX"), nil,"shakeFX"),
shakeFX=newSlider(310,480,373,5,35,nil, SETval("shakeFX"), SETsto("shakeFX"), nil,"atkFX"),
atkFX= newSlider(310,550,373,5,35,nil, SETval("atkFX"), SETsto("atkFX"), nil,"frame"),
frame= newSlider(310,620,373,10,35,nil,function()return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4 end,function(i)setting.frameMul=i<5 and 5*i+20 or 10*i end,nil,"fullscreen"),
fullscreen=newSwitch(990,180,40,SETval("fullscreen"),function()
frame= newSlider(310,620,373,10,35,nil,function()return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4 end,function(i)setting.frameMul=i<5 and 5*i+20 or 10*i end,nil,"text"),
text= newSwitch(990,180,35,SETval("text"),SETrev("text"),nil,"fullscreen"),
fullscreen=newSwitch(990,260,35,SETval("fullscreen"),function()
setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen)
if not setting.fullscreen then
love.resize(love.graphics.getWidth(),love.graphics.getHeight())
end
love.resize(love.graphics.getWidth(),love.graphics.getHeight())
end,nil,"bg"),
bg= newSwitch(990,250,35,SETval("bg"),SETrev("bg"),nil,"bgspace"),
bgspace=newSwitch(990,330,35,SETval("bgspace"),function()
bg= newSwitch(990,330,35,SETval("bg"),SETrev("bg"),nil,"bgspace"),
bgspace=newSwitch(990,410,35,SETval("bgspace"),function()
setting.bgspace=not setting.bgspace
if setting.bgspace then
space.new()
@@ -308,32 +307,32 @@ local Widget={
setting_skin={
prev= newButton(700,100,140,100,C.white,50,function()skin.prevSet()end),
next= newButton(860,100,140,100,C.white,50,function()skin.nextSet()end),
prev1= newButton(125,240,90,65,C.white,30,prevSkin(1)),
prev2= newButton(265,240,90,65,C.white,30,prevSkin(2)),
prev3= newButton(405,240,90,65,C.white,30,prevSkin(3)),
prev4= newButton(545,240,90,65,C.white,30,prevSkin(4)),
prev5= newButton(685,240,90,65,C.white,30,prevSkin(5)),
prev6= newButton(825,240,90,65,C.white,30,prevSkin(6)),
prev7= newButton(965,240,90,65,C.white,30,prevSkin(7)),
prev1= newButton(130,230,90,65,C.white,30,prevSkin(1)),
prev2= newButton(270,230,90,65,C.white,30,prevSkin(2)),
prev3= newButton(410,230,90,65,C.white,30,prevSkin(3)),
prev4= newButton(550,230,90,65,C.white,30,prevSkin(4)),
prev5= newButton(690,230,90,65,C.white,30,prevSkin(5)),
prev6= newButton(830,230,90,65,C.white,30,prevSkin(6)),
prev7= newButton(970,230,90,65,C.white,30,prevSkin(7)),
next1= newButton(125,460,90,65,C.white,30,nextSkin(1)),
next2= newButton(265,460,90,65,C.white,30,nextSkin(2)),
next3= newButton(405,460,90,65,C.white,30,nextSkin(3)),
next4= newButton(545,460,90,65,C.white,30,nextSkin(4)),
next5= newButton(685,460,90,65,C.white,30,nextSkin(5)),
next6= newButton(825,460,90,65,C.white,30,nextSkin(6)),
next7= newButton(965,460,90,65,C.white,30,nextSkin(7)),
next1= newButton(130,450,90,65,C.white,30,nextSkin(1)),
next2= newButton(270,450,90,65,C.white,30,nextSkin(2)),
next3= newButton(410,450,90,65,C.white,30,nextSkin(3)),
next4= newButton(550,450,90,65,C.white,30,nextSkin(4)),
next5= newButton(690,450,90,65,C.white,30,nextSkin(5)),
next6= newButton(830,450,90,65,C.white,30,nextSkin(6)),
next7= newButton(970,450,90,65,C.white,30,nextSkin(7)),
spin1= newButton(125,550,90,65,C.white,30,nextDir(1)),
spin2= newButton(265,550,90,65,C.white,30,nextDir(2)),
spin3= newButton(405,550,90,65,C.white,30,nextDir(3)),
spin4= newButton(545,550,90,65,C.white,30,nextDir(4)),
spin5= newButton(685,550,90,65,C.white,30,nextDir(5)),
--spin6=newButton(825,550,90,65,C.white,30,nextDir(6)),--O cannot rotate
spin7= newButton(965,550,90,65,C.white,30,nextDir(7)),
spin1= newButton(130,540,90,65,C.white,30,nextDir(1)),
spin2= newButton(270,540,90,65,C.white,30,nextDir(2)),
spin3= newButton(410,540,90,65,C.white,30,nextDir(3)),
spin4= newButton(550,540,90,65,C.white,30,nextDir(4)),
spin5= newButton(690,540,90,65,C.white,30,nextDir(5)),
--spin6=newButton(825,540,90,65,C.white,30,nextDir(6)),--cannot rotate O
spin7= newButton(970,540,90,65,C.white,30,nextDir(7)),
skinR= newButton(200,650,180,80,C.lightPurple,35,function()setting.skin={1,5,2,8,10,3,7}SFX.play("hold")end),
faceR= newButton(480,650,180,80,C.lightRed,35,function()setting.face={0,0,0,0,0,0,0}SFX.play("rotate")end),
skinR= newButton(200,640,220,80,C.lightPurple,35,function()setting.skin={1,5,2,8,10,3,7}SFX.play("rotate")end),
faceR= newButton(480,640,220,80,C.lightRed,35,function()setting.face={0,0,0,0,0,0,0}SFX.play("hold")end),
back= newButton(1140,650,200,80,C.white,40,scene.back),
},
setting_touch={