0.8.15Bug Fixed

This commit is contained in:
MrZ_26
2020-04-02 22:50:10 +08:00
parent 4652be7067
commit e88553bc00
42 changed files with 410 additions and 327 deletions

25
ai.lua
View File

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

View File

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

View File

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

View File

@@ -19,7 +19,8 @@ spin判定:
B3B:在B2B效果之上消四再加1,spin再加0.5*消行数攻击,二者都+1额外抵挡 B3B:在B2B效果之上消四再加1,spin再加0.5*消行数攻击,二者都+1额外抵挡
连击:0,0,1,1,2,2,2,3,3,4,3,2…(后面都是2) 连击:0,0,1,1,2,2,2,3,3,4,3,2…(后面都是2)
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文) 特殊消除会增加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)) local _,mes=F:write(dumpTable(L))
F:flush()F:close() F:flush()F:close()
if not _ then 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
end end
function delRecord(N) function delRecord(N)
@@ -115,7 +115,7 @@ function saveUnlock()
local _,mes=F:write(dumpTable(modeRanks)) local _,mes=F:write(dumpTable(modeRanks))
F:flush()F:close() F:flush()F:close()
if not _ then 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
end end
@@ -140,7 +140,7 @@ function saveData()
local _,mes=F:write(dumpTable(stat)) local _,mes=F:write(dumpTable(stat))
F:flush()F:close() F:flush()F:close()
if not _ then 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
end end
@@ -165,7 +165,7 @@ function saveSetting()
local _,mes=F:write(dumpTable(setting)) local _,mes=F:write(dumpTable(setting))
F:flush()F:close() F:flush()F:close()
if _ then TEXT(text.settingSaved,1140,650,40,"sudden",.5) 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
end end
@@ -186,7 +186,7 @@ function saveKeyMap()
local _,mes=F:write(dumpTable(keyMap)) local _,mes=F:write(dumpTable(keyMap))
F:flush()F:close() F:flush()F:close()
if _ then TEXT(text.keyMapSaved,1140,650,26,"sudden",.5) 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
end end
@@ -207,7 +207,7 @@ function saveVK()
local _,mes=F:write(dumpTable(VK_org)) local _,mes=F:write(dumpTable(VK_org))
F:flush()F:close() F:flush()F:close()
if _ then TEXT(text.VKSaved,1140,650,26,"sudden",.5) 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
end end

View File

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

View File

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

View File

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

View File

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

View File

@@ -42,10 +42,10 @@ return{
D.event=D.event+1 D.event=D.event+1
D.point=int(72e4/t)*.1 D.point=int(72e4/t)*.1
if D.event==20 then 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 P.gameEnv.pushSpeed=3
elseif D.event==50 then 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 end
end end

View File

@@ -48,13 +48,13 @@ return{
D.event=D.event+1 D.event=D.event+1
D.point=int(s*36e3/t)*.1 D.point=int(s*36e3/t)*.1
if D.event==10 then 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 P.gameEnv.pushSpeed=4
elseif D.event==20 then 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 P.gameEnv.pushSpeed=5
elseif D.event==30 then 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 end
end end

View File

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

View File

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

View File

@@ -37,15 +37,15 @@ return{
D.event=D.event+1 D.event=D.event+1
D.point=int(144e3/(240-2*D.event))*.1 D.point=int(144e3/(240-2*D.event))*.1
if D.event==25 then 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.gameEnv.pushSpeed=3
P.dropDelay,P.gameEnv.drop=4,4 P.dropDelay,P.gameEnv.drop=4,4
elseif D.event==50 then 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.gameEnv.pushSpeed=4
P.dropDelay,P.gameEnv.drop=3,3 P.dropDelay,P.gameEnv.drop=3,3
elseif D.event==75 then 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 P.dropDelay,P.gameEnv.drop=2,2
end end
end end

View File

@@ -37,16 +37,16 @@ return{
D.event=D.event+1 D.event=D.event+1
D.point=int(108e3/(360-D.event*2))*.1 D.point=int(108e3/(360-D.event*2))*.1
if D.event==25 then 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.gameEnv.pushSpeed=2
P.dropDelay,P.gameEnv.drop=20,20 P.dropDelay,P.gameEnv.drop=20,20
elseif D.event==50 then 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.gameEnv.pushSpeed=3
P.dropDelay,P.gameEnv.drop=10,10 P.dropDelay,P.gameEnv.drop=10,10
elseif D.event==90 then elseif D.event==90 then
P.dropDelay,P.gameEnv.drop=5,5 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 end
end end

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -12,7 +12,7 @@ local function score(P)
if MD.point%100==99 then SFX.play("blip_1")end if MD.point%100==99 then SFX.play("blip_1")end
if int(MD.point*.01)>MD.event then if int(MD.point*.01)>MD.event then
local s=MD.event+1;MD.event=s--level up! 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 local E=P.gameEnv
if s<4 then--first 300 if s<4 then--first 300
if s~=1 then E.lock=E.lock-1 end 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 P.modeData.counter=P.modeData.counter+1
if P.modeData.counter==21 then if P.modeData.counter==21 then
local t=P.stat.pc%2 local t=P.stat.pc%2
local S=P.gameEnv.skin
for i=1,4 do for i=1,4 do
local r=freeRow.get(0) local r=freeRow.get(0)
for j=1,10 do for j=1,10 do
r[j]=PCbase[4*t+i][j] local _=PCbase[4*t+i][j]
r[j]=S[_]or 0
end end
ins(P.field,1,r) ins(P.field,1,r)
ins(P.visTime,1,freeRow.get(20)) ins(P.visTime,1,freeRow.get(20))
@@ -44,7 +46,7 @@ local function newPC(P)
elseif b<5 then b=7-b elseif b<5 then b=7-b
end end
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 end
P.modeData.counter=P.stat.piece==0 and 20 or 0 P.modeData.counter=P.stat.piece==0 and 20 or 0
newTask(task_PC,P) newTask(task_PC,P)
@@ -54,9 +56,9 @@ local function newPC(P)
P.gameEnv.lock=pc_lock[s]or 20 P.gameEnv.lock=pc_lock[s]or 20
P.gameEnv.fall=pc_fall[s]or 5 P.gameEnv.fall=pc_fall[s]or 5
if s==10 then if s==10 then
P:showText(text.maxspeed,0,-140,100,"appear",.6) P:showTextF(text.maxspeed,0,-140,100,"appear",.6)
else else
P:showText(text.speedup,0,-140,40,"appear",.8) P:showTextF(text.speedup,0,-140,40,"appear",.8)
end end
end end
end end

View File

@@ -6,10 +6,12 @@ local function task_PC(P)
P.modeData.counter=P.modeData.counter+1 P.modeData.counter=P.modeData.counter+1
if P.modeData.counter==21 then if P.modeData.counter==21 then
local t=P.stat.pc%2 local t=P.stat.pc%2
local S=P.gameEnv.skin
for i=1,4 do for i=1,4 do
local r=freeRow.get(0) local r=freeRow.get(0)
for j=1,10 do for j=1,10 do
r[j]=PCbase[4*t+i][j] local _=PCbase[4*t+i][j]
r[j]=S[_]or 0
end end
ins(P.field,1,r) ins(P.field,1,r)
ins(P.visTime,1,freeRow.get(20)) ins(P.visTime,1,freeRow.get(20))
@@ -40,7 +42,7 @@ local function newPC(P)
elseif b<5 then b=7-b elseif b<5 then b=7-b
end end
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 end
P.modeData.counter=P.stat.piece==0 and 20 or 0 P.modeData.counter=P.stat.piece==0 and 20 or 0
newTask(task_PC,P) 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[#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.atkBuffer.sum=P.atkBuffer.sum+1
P.stat.recv=P.stat.recv+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.counter=0
P.modeData.event=P.modeData.event+1 P.modeData.event=P.modeData.event+1
end end

View File

@@ -31,7 +31,7 @@ return{
local R=(P.modeData.event%3<2 and 1 or 3) local R=(P.modeData.event%3<2 and 1 or 3)
P.atkBuffer.sum=P.atkBuffer.sum+R P.atkBuffer.sum=P.atkBuffer.sum+R
P.stat.recv=P.stat.recv+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.counter=0
P.modeData.event=P.modeData.event+1 P.modeData.event=P.modeData.event+1
end 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[#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.atkBuffer.sum=P.atkBuffer.sum+4
P.stat.recv=P.stat.recv+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.counter=0
P.modeData.event=P.modeData.event+1 P.modeData.event=P.modeData.event+1
end 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} 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.atkBuffer.sum=P.atkBuffer.sum+d%4+1
P.stat.recv=P.stat.recv+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.counter=0
P.modeData.event=d P.modeData.event=d
end 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[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.atkBuffer.sum=P.atkBuffer.sum+20
P.stat.recv=P.stat.recv+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.counter=0
P.modeData.event=P.modeData.event+1 P.modeData.event=P.modeData.event+1
end end

View File

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

View File

@@ -91,8 +91,8 @@ local TRS={
[02]={{0,0},{-1,0}, {1,0}, {0,-1}, {0,1} }, [02]={{0,0},{-1,0}, {1,0}, {0,-1}, {0,1} },
[20]={{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} }, [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 }for i=1,7 do collect(TRS[i])end
local AIRS={ local AIRS={
[1]={ [1]={

View File

@@ -1,13 +1,12 @@
--LIGHT MODULE(Optimized by MrZ,Original on github/love2d community/simple-love-lights) --LIGHT MODULE(Optimized by MrZ,Original on github/love2d community/simple-love-lights)
--Heavily based on mattdesl's libGDX implementation: --Heavily based on mattdesl's libGDX implementation:
--https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows --https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows
--Private--
local gc=love.graphics local gc=love.graphics
local C=gc.clear local C=gc.clear
local shadowMapShader=gc.newShader("shader/shadowMap.cs")--Shader for caculating the 1D shadow map. 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. local lightRenderShader=gc.newShader("shader/lightRender.cs")--Shader for rendering blurred lights and shadows.
Lights={}--Lightsource objects local Lights={}--Lightsource objects
local Lights=Lights
--Private--
local function move(L,x,y) local function move(L,x,y)
L.x,L.y=x,y L.x,L.y=x,y
end end
@@ -51,18 +50,18 @@ local function draw(L)
--复位 --复位
end end
--Public-- --Public--
function drawLight() function Lights.draw()
for i=1,#Lights do for i=1,#Lights do
Lights[i]:draw() Lights[i]:draw()
end end
end end
function clearLight(L) function Lights.clear(L)
for i=1,#Lights do for i=#Lights,1,-1 do
Lights[i]:destroy() Lights[i]:destroy()
Lights[i]=nil Lights[i]=nil
end end
end end
function addLight(x,y,R,F) function Lights.add(x,y,R,F)
local id=#Lights+1 local id=#Lights+1
Lights[id]={ Lights[id]={
id=id, id=id,
@@ -77,4 +76,5 @@ function addLight(x,y,R,F)
draw=draw, draw=draw,
destroy=destroy, destroy=destroy,
} }
end end
return Lights

View File

@@ -75,7 +75,7 @@ voiceList={
mini={"mini_1","mini_2","mini_3"}, mini={"mini_1","mini_2","mini_3"},
b2b={"b2b_1","b2b_2","b2b_3"}, b2b={"b2b_1","b2b_2","b2b_3"},
b3b={"b3b_1","b3b_2"}, 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"}, win={"win_1","win_2","win_3","win_4","win_5","win_6","win_6","win_7"},
lose={"lose_1","lose_2","lose_3"}, lose={"lose_1","lose_2","lose_3"},
bye={"bye_1","bye_2"}, bye={"bye_1","bye_2"},

View File

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

View File

@@ -51,9 +51,9 @@ function space.draw()
if not stars[1]then return end if not stars[1]then return end
gc.translate(-50,-50) gc.translate(-50,-50)
gc.setLineWidth(7) 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.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.circle("fill",planet.x,planet.y,planet.r)
gc.setColor(.9,.9,.9) gc.setColor(.9,.9,.9)
for i=1,2600,5 do for i=1,2600,5 do

View File

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

View File

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

View File

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