0.8.18:Details Update II

This commit is contained in:
MrZ_26
2020-05-01 02:33:36 +08:00
parent 00026bc46b
commit 2768fa748b
35 changed files with 1580 additions and 1555 deletions

1231
callback.lua Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
gameVersion="Alpha V0.8.17" gameVersion="Alpha V0.8.18"
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"

View File

@@ -2,7 +2,7 @@ setting={
das=10,arr=2, das=10,arr=2,
sddas=0,sdarr=2, sddas=0,sdarr=2,
ihs=true,irs=true,ims=true, ihs=true,irs=true,ims=true,
reTime=10, reTime=4,
maxNext=6, maxNext=6,
quickR=true, quickR=true,
swap=true, swap=true,
@@ -34,7 +34,8 @@ setting={
stereo=6, stereo=6,
--sound --sound
VKSound=true,--if SFX VKSFX=3,--SFX volume
VKVIB=0,--VIB
VKSwitch=false,--if disp VKSwitch=false,--if disp
VKTrack=false,--if tracked VKTrack=false,--if tracked
VKDodge=false,--if dodge VKDodge=false,--if dodge

View File

@@ -3,12 +3,10 @@
活到最后或者完成目标即胜利. 活到最后或者完成目标即胜利.
旋转系统: 旋转系统:
使用Techmino专属旋转系统 使用Techmino专属旋转系统,细节懒得写(
细节懒得写(?)
spin判定: spin判定:
结合了不可移动判定和三角判定,是否为mini也与判定过程数据有关 结合了不可移动判定和三角判定,是否为mini也与判定过程数据有关,细节也懒得写(
细节也懒得写(?)
攻击系统: 攻击系统:
普通消除: 普通消除:
@@ -48,11 +46,11 @@ back to back(B2B)点数说明:
1.随机:每次攻击后10%随机挑选一个玩家锁定 1.随机:每次攻击后10%随机挑选一个玩家锁定
2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家 2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家
3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新) 3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新)
4.反击:攻击所有锁定自己的玩家攻击AOE,若未被任何人锁定则击随机玩家 4.反击:攻击所有锁定自己的玩家攻击AOE,若未被任何人锁定则击随机玩家(不锁定)
坚持到最后的玩家就是胜利者. 坚持到最后的玩家就是胜利者.
自定义模式说明: 自定义模式说明:
玩家可以自由调整大多数参数(不包括上述各种游戏模式的特殊效果),也可以画一个场地去消除或者是作为提示模板来进行拼图模式. 玩家可以自由调整大多数参数(不包括上述各种游戏模式的特殊效果),也可以画一个场地去消除或者是作为提示模板来进行拼图模式.
在拼图模式下,按功能键切换是否展示提示.其中打"X"的格子不允许有方块,空的格子可以是任何状态,普通的七种彩色方块必须颜色对应,垃圾行方块的为止只要有方块就可以,但是不能是空气,玩家拼出自己画的图后就会判定胜利. 在拼图模式下,按功能键切换是否展示提示.其中打"X"的格子不允许有方块,空的格子可以是任何状态,普通的七种彩色方块必须颜色对应,垃圾行方块的为止只要有方块就可以,但是不能是空气,玩家拼出自己画的图后就会判定胜利.
附录: 附录:
ZXC的Ospin地图:XY0BCgAwCAIR7v9vHtUSt8AS0xKqgpnNGyXkrmFNePf6qi3BbQPrHT2Owxe6D66NeKi86dwB ZXC的Ospin地图:XY0BCgAwCAIR7v9vHtUSt8AS0xKqgpnNGyXkrmFNePf6qi3BbQPrHT2Owxe6D66NeKi86dwB

1290
main.lua

File diff suppressed because it is too large Load Diff

View File

@@ -32,10 +32,10 @@ return{
if P.result=="WIN"then if P.result=="WIN"then
local T=P.stat.piece local T=P.stat.piece
return return
T<=30 and 5 or T<=23 and 5 or
T<=40 and 4 or T<=26 and 4 or
T<=55 and 3 or T<=40 and 3 or
T<=70 and 2 or T<=60 and 2 or
1 1
end end
end, end,

View File

@@ -32,10 +32,10 @@ return{
if P.result=="WIN"then if P.result=="WIN"then
local T=P.stat.piece local T=P.stat.piece
return return
T<=35 and 5 or T<=30 and 5 or
T<=45 and 4 or T<=40 and 4 or
T<=65 and 3 or T<=55 and 3 or
T<=85 and 2 or T<=75 and 2 or
1 1
end end
end, end,

View File

@@ -32,10 +32,10 @@ return{
if P.result=="WIN"then if P.result=="WIN"then
local T=P.stat.piece local T=P.stat.piece
return return
T<=40 and 5 or T<=30 and 5 or
T<=50 and 4 or T<=40 and 4 or
T<=75 and 3 or T<=55 and 3 or
T<=100 and 2 or T<=75 and 2 or
1 1
end end
end, end,

View File

@@ -32,10 +32,10 @@ return{
if P.result=="WIN"then if P.result=="WIN"then
local T=P.stat.piece local T=P.stat.piece
return return
T<=50 and 5 or T<=30 and 5 or
T<=60 and 4 or T<=40 and 4 or
T<=80 and 3 or T<=55 and 3 or
T<=100 and 2 or T<=75 and 2 or
1 1
end end
end, end,

View File

@@ -19,10 +19,10 @@ return{
if P.result=="WIN"then if P.result=="WIN"then
local T=P.stat.time local T=P.stat.time
return return
T<=15 and 5 or T<=20 and 5 or
T<=25 and 4 or T<=25 and 4 or
T<=40 and 3 or T<=35 and 3 or
T<=80 and 2 or T<=60 and 2 or
1 1
end end
end, end,

View File

@@ -19,10 +19,10 @@ return{
if P.result=="WIN"then if P.result=="WIN"then
local T=P.stat.time local T=P.stat.time
return return
T<=16 and 5 or T<=20 and 5 or
T<=28 and 4 or T<=25 and 4 or
T<=45 and 3 or T<=40 and 3 or
T<=90 and 2 or T<=62 and 2 or
1 1
end end
end, end,

View File

@@ -19,9 +19,9 @@ return{
if P.result=="WIN"then if P.result=="WIN"then
local T=P.stat.time local T=P.stat.time
return return
T<=17 and 5 or T<=20 and 5 or
T<=26 and 4 or T<=25 and 4 or
T<=45 and 3 or T<=35 and 3 or
T<=60 and 2 or T<=60 and 2 or
1 1
end end

View File

@@ -19,10 +19,10 @@ return{
if P.result=="WIN"then if P.result=="WIN"then
local T=P.stat.time local T=P.stat.time
return return
T<=18 and 5 or T<=20 and 5 or
T<=30 and 4 or T<=25 and 4 or
T<=50 and 3 or T<=35 and 3 or
T<=70 and 2 or T<=60 and 2 or
1 1
end end
end, end,

View File

@@ -20,8 +20,8 @@ return{
local T=P.stat.time local T=P.stat.time
return return
T<=20 and 5 or T<=20 and 5 or
T<=30 and 4 or T<=25 and 4 or
T<=45 and 3 or T<=35 and 3 or
T<=60 and 2 or T<=60 and 2 or
1 1
end end

View File

@@ -33,7 +33,7 @@ return{
T<=90 and 4 or T<=90 and 4 or
T<=130 and 3 or T<=130 and 3 or
T<=200 and 2 or T<=200 and 2 or
T<=270 and 1 or T<=360 and 1 or
0 0
end, end,
} }

View File

@@ -32,8 +32,8 @@ return{
T<=626 and 5 or T<=626 and 5 or
T<=1000 and 4 or T<=1000 and 4 or
T<=1400 and 3 or T<=1400 and 3 or
T<=2200 and 2 or T<=2260 and 2 or
T<=3000 and 1 or T<=3260 and 1 or
0 0
end, end,
} }

View File

@@ -31,8 +31,8 @@ return{
return return
T<=13 and 5 or T<=13 and 5 or
T<=18 and 4 or T<=18 and 4 or
T<=45 and 3 or T<=32.6 and 3 or
T<=80 and 2 or T<=62.6 and 2 or
T<=126 and 1 or T<=126 and 1 or
0 0
end, end,

View File

@@ -31,8 +31,8 @@ return{
return return
T<=26 and 5 or T<=26 and 5 or
T<=32.6 and 4 or T<=32.6 and 4 or
T<=40 and 3 or T<=52.6 and 3 or
T<=62 and 2 or T<=92.9 and 2 or
T<=183 and 1 or T<=183 and 1 or
0 0
end, end,

View File

@@ -29,11 +29,11 @@ return{
if P.stat.row<400 then return end if P.stat.row<400 then return end
local T=P.stat.time local T=P.stat.time
return return
T<=255 and 5 or T<=62,255 and 5 or
T<=330 and 4 or T<=90,326 and 4 or
T<=420 and 3 or T<=130,462 and 3 or
T<=626 and 2 or T<=200,626 and 2 or
T<=1000 and 1 or T<=360,1260 and 1 or
0 0
end, end,
} }

View File

@@ -338,7 +338,7 @@ function Pnt.draw()
local pen=sceneTemp.pen local pen=sceneTemp.pen
if pen>0 then if pen>0 then
gc.setLineWidth(13) gc.setLineWidth(13)
gc.setColor(skin.libColor[pen]) gc.setColor(SKIN.libColor[pen])
gc.rectangle("line",565,460,70,70) gc.rectangle("line",565,460,70,70)
elseif pen==-1 then elseif pen==-1 then
gc.setLineWidth(5) gc.setLineWidth(5)
@@ -354,7 +354,7 @@ function Pnt.draw()
local _ local _
for i=1,7 do for i=1,7 do
_=setting.skin[i] _=setting.skin[i]
gc.setColor(skin.libColor[_]) gc.setColor(SKIN.libColor[_])
mStr(text.block[i],500+65*_,65) mStr(text.block[i],500+65*_,65)
end end
end end
@@ -434,7 +434,7 @@ function Pnt.pause()
if T<1 or gameResult then Pnt.play()end if T<1 or gameResult then Pnt.play()end
--Dark BG --Dark BG
local _=T local _=T
if gameResult then _=_*.6 end if gameResult then _=_*.7 end
gc.setColor(.15,.15,.15,_) gc.setColor(.15,.15,.15,_)
gc.push("transform") gc.push("transform")
gc.origin() gc.origin()
@@ -689,7 +689,7 @@ end
function Pnt.stat() function Pnt.stat()
local chart=sceneTemp.chart local chart=sceneTemp.chart
setFont(24) setFont(24)
local _,__=skin.libColor,setting.skin local _,__=SKIN.libColor,setting.skin
local A,B=chart.A1,chart.A2 local A,B=chart.A1,chart.A2
for x=1,7 do for x=1,7 do
gc.setColor(_[__[x]]) gc.setColor(_[__[x]])

View File

@@ -19,64 +19,64 @@ local blockPos={4,4,4,4,4,5,4}
local scs={{1,2},{1,2},{1,2},{1,2},{1,2},{1.5,1.5},{0.5,2.5}} local scs={{1,2},{1,2},{1,2},{1,2},{1,2},{1.5,1.5},{0.5,2.5}}
-------------------------------------------------Cold clear -------------------------------------------------Cold clear
local CCblockID={4,3,5,6,1,2,0} local CCblockID={4,3,5,6,1,2,0}
if system~="Windows"then goto SKIP end if system=="Windows"then
require("CCloader") require("CCloader")
BOT={ BOT={
getConf= cc.get_default_config ,--()options,weights getConf= cc.get_default_config ,--()options,weights
--setConf= cc.set_options ,--(options,hold,20g,bag7) --setConf= cc.set_options ,--(options,hold,20g,bag7)
new= cc.launch_async ,--(options,weights)bot new= cc.launch_async ,--(options,weights)bot
addNext= cc.add_next_piece_async ,--(bot,piece) addNext= cc.add_next_piece_async ,--(bot,piece)
update= cc.reset_async ,--(bot,field,b2b,combo) update= cc.reset_async ,--(bot,field,b2b,combo)
think= cc.request_next_move ,--(bot) think= cc.request_next_move ,--(bot)
getMove= cc.poll_next_move ,--(bot)success,hold,move getMove= cc.poll_next_move ,--(bot)success,hold,move
ifDead= cc.is_dead_async ,--(bot)dead ifDead= cc.is_dead_async ,--(bot)dead
destroy= cc.destroy_async ,--(bot) destroy= cc.destroy_async ,--(bot)
setHold= cc.set_hold ,--(opt,bool) setHold= cc.set_hold ,--(opt,bool)
set20G= cc.set_20g ,--(opt,bool) set20G= cc.set_20g ,--(opt,bool)
setBag= cc.set_bag7 ,--(opt,bool) setBag= cc.set_bag7 ,--(opt,bool)
setNode= cc.set_max_nodes ,--(opt,bool) setNode= cc.set_max_nodes ,--(opt,bool)
free= cc.free ,--(opt/wei) free= cc.free ,--(opt/wei)
} }
function CC_updateField(P) function CC_updateField(P)
local F,i={},1 local F,i={},1
for y=1,#P.field do for y=1,#P.field do
for x=1,10 do for x=1,10 do
F[i],i=P.field[y][x]>0,i+1 F[i],i=P.field[y][x]>0,i+1
end
end end
while i<400 do
F[i],i=false,i+1
end
BOT.update(P.AI_bot,F,P.b2b>=100,P.combo)
end end
while i<400 do function CC_switch20G(P)
F[i],i=false,i+1 P.AIdata._20G=true
end P.AI_keys={}
BOT.update(P.AI_bot,F,P.b2b>=100,P.combo) BOT.destroy(P.AI_bot)
end local opt,wei=BOT.getConf()
function CC_switch20G(P) BOT.setHold(opt,P.AIdata.hold)
P.AIdata._20G=true BOT.set20G(opt,P.AIdata._20G)
P.AI_keys={} BOT.setBag(opt,P.AIdata.bag7)
BOT.destroy(P.AI_bot) BOT.setNode(opt,P.AIdata.node)
local opt,wei=BOT.getConf() P.AI_bot=BOT.new(opt,wei)
BOT.setHold(opt,P.AIdata.hold) BOT.free(opt)BOT.free(wei)
BOT.set20G(opt,P.AIdata._20G) for i=1,P.AIdata.next do
BOT.setBag(opt,P.AIdata.bag7) BOT.addNext(P.AI_bot,CCblockID[P.next[i].id])
BOT.setNode(opt,P.AIdata.node) end
P.AI_bot=BOT.new(opt,wei) CC_updateField(P)
BOT.free(opt)BOT.free(wei) P.hd={bk={{}},id=0,color=0,name=0}P.holded=false
for i=1,P.AIdata.next do P.cur=rem(P.next,1)
BOT.addNext(P.AI_bot,CCblockID[P.next[i].id]) P.sc,P.dir=scs[P.cur.id],0
end P.r,P.c=#P.cur.bk,#P.cur.bk[1]
CC_updateField(P) P.curX,P.curY=blockPos[P.cur.id],21+ceil(P.fieldBeneath/30)-P.r+min(int(#P.field*.2),2)
P.hd={bk={{}},id=0,color=0,name=0}P.holded=false
P.cur=rem(P.next,1)
P.sc,P.dir=scs[P.cur.id],0
P.r,P.c=#P.cur.bk,#P.cur.bk[1]
P.curX,P.curY=blockPos[P.cur.id],21+ceil(P.fieldBeneath/30)-P.r+min(int(#P.field*.2),2)
P:newNext() P:newNext()
BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id]) BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])
collectgarbage() collectgarbage()
end
end end
::SKIP::
-------------------------------------------------⑨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={
@@ -231,10 +231,8 @@ AI_think={
end end
end end
::L:: while #Tfield>0 do
if #Tfield>0 then
freeRow.discard(rem(Tfield,1)) freeRow.discard(rem(Tfield,1))
goto L
end--Release cache end--Release cache
local p=#ctrl+1 local p=#ctrl+1
if best.hold then if best.hold then

View File

@@ -3,7 +3,6 @@ local int,ceil,rnd,abs=math.floor,math.ceil,math.random,math.abs
local max,min,sin,cos=math.max,math.min,math.sin,math.cos local max,min,sin,cos=math.max,math.min,math.sin,math.cos
local scr=scr local scr=scr
local BGinit,BGresize,BGupdate,BGdraw,BGdiscard={},{},{},{},{} local BGinit,BGresize,BGupdate,BGdraw,BGdiscard={},{},{},{},{}
local BGvars={_G=_G} local BGvars={_G=_G}
@@ -136,7 +135,7 @@ end--Lightning
function BGinit.game6() function BGinit.game6()
t=0 t=0
colorLib=_G.skin.libColor colorLib=_G.SKIN.libColor
colorSet=_G.setting.skin colorSet=_G.setting.skin
miniBlock=_G.miniBlock miniBlock=_G.miniBlock
end end
@@ -180,34 +179,37 @@ end
function BGinit.space() function BGinit.space()
stars={} stars={}
for i=1,2600,5 do for i=1,2600,5 do
local s=0.75*2^(rnd()*1.5) local s=rnd(4)
stars[i]=s --size stars[i]=s --size
stars[i+1]=rnd(W) --x stars[i+1]=rnd(W)-10 --x
stars[i+2]=rnd(H) --y stars[i+2]=rnd(H)-10 --y
stars[i+3]=(rnd()-.5)*.01*s --vx stars[i+3]=(rnd()-.5)*.01*s --vx
stars[i+4]=(rnd()-.5)*.01*s --vy stars[i+4]=(rnd()-.5)*.01*s --vy
end--800 var end--800 var
end end
function BGresize.space(w,h) function BGresize.space(w,h)
W,H=w+100,h+100 W,H=w+20,h+20
BGinit.space()
end end
function BGupdate.space(dt) function BGupdate.space(dt)
local s=stars
for i=1,2600,5 do for i=1,2600,5 do
stars[i+1]=(stars[i+1]+stars[i+3])%W s[i+1]=(s[i+1]+s[i+3])%W
stars[i+2]=(stars[i+2]+stars[i+4])%H s[i+2]=(s[i+2]+s[i+4])%H
end--star moving end--star moving
end end
function BGdraw.space() function BGdraw.space()
gc.clear(.2,.2,.2) gc.clear(.2,.2,.2)
if not stars[1]then return end if not stars[1]then return end
gc.translate(-50,-50) gc.translate(-10,-10)
gc.setColor(.8,.8,.8) gc.setColor(.8,.8,.8)
for i=1,2600,5 do for i=1,2600,5 do
local x,y=stars[i+1],stars[i+2] local s=stars
gc.circle("fill",x,y,stars[i]) local x,y=s[i+1],s[i+2]
s=s[i]
gc.rectangle("fill",x,y,s,s)
end end
gc.translate(50,50) gc.translate(10,10)
end end
function BGdiscard.space() function BGdiscard.space()
stars={} stars={}

View File

@@ -23,6 +23,7 @@ function BGM.loadAll()
end end
function BGM.play(s) function BGM.play(s)
if setting.bgm==0 then if setting.bgm==0 then
BGM.playing=BGM.list[s]
BGM.suspend,BGM.nowPlay=s BGM.suspend,BGM.nowPlay=s
return return
elseif not s then elseif not s then

View File

@@ -2,6 +2,7 @@ local langList={
{ {
anykey="按任意键继续", anykey="按任意键继续",
newVersion="检测到更新!存档格式可能更新", newVersion="检测到更新!存档格式可能更新",
marking="游戏作者:MrZ_26\n出现此水印则为非法录屏上传",
lang="中文", lang="中文",
atkModeName={"随机","徽章","击杀","反击"}, atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end, royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
@@ -146,10 +147,10 @@ local langList={
"使用LOVE2D引擎", "使用LOVE2D引擎",
"作者:MrZ 邮箱:1046101471@qq.com", "作者:MrZ 邮箱:1046101471@qq.com",
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:MrZ/Miya", "程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:MrZ/Miya",
"特别感谢:Flyz,Farter,196,Teatube,T830,[所有内测人员]和 你!", "特别感谢:Flyz,Farter,196,Teatube,[所有内测人员]和 你!",
"", "",
"错误或者建议请附带截图发送到内测群或者作者邮箱~", "错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过唯一内测群1057456078进行免费下载/更新", "仅通过唯一内测群822023725进行免费下载/更新",
"其他渠道获得游戏皆有被修改/植入病毒的风险,程序只申请了震动&联网权限!", "其他渠道获得游戏皆有被修改/植入病毒的风险,程序只申请了震动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)", "若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~", "请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -305,7 +306,8 @@ local langList={
pro="专业", pro="专业",
hide="显示虚拟按键", hide="显示虚拟按键",
track="按键自动跟踪", track="按键自动跟踪",
sound="按键音效", sfx="按键音效",
vib="按键震动",
icon="图标", icon="图标",
tkset="跟踪设置", tkset="跟踪设置",
alpha="透明度", alpha="透明度",
@@ -411,6 +413,7 @@ local langList={
{ {
anykey="按任意键继续", anykey="按任意键继续",
newVersion="检测到更新!存档格式可能更新", newVersion="检测到更新!存档格式可能更新",
marking="游戏作者:MrZ_26\n出现此水印则为非法录屏上传",
lang="全中文", lang="全中文",
atkModeName={"随机","徽章","击杀","反击"}, atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end, royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
@@ -465,7 +468,7 @@ local langList={
freshLimit={0,8,15,""}, freshLimit={0,8,15,""},
opponent={"无电脑","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"}, opponent={"无电脑","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
}, },
snapLevelName={"无吸附","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"}, snapLevelName={"无吸附","10像素吸附","20像素吸附","40像素吸附","60像素吸附","80像素吸附"},
setting_game="游戏设置", setting_game="游戏设置",
setting_graphic="画面设置", setting_graphic="画面设置",
setting_sound="声音设置", setting_sound="声音设置",
@@ -508,7 +511,7 @@ local langList={
"落在最左:","落在最右:","列在最左:","列在最右:", "落在最左:","落在最右:","列在最左:","列在最右:",
}, },
load={[0]="加载完成","加载语音ing","加载音乐ing","加载音效ing","加载图片ing","加载模式ing","加载乱七八糟的东西ing"}, load={[0]="加载完成","正在加载语音","正在加载音乐","正在加载音效","正在加载图片","正在加载模式","正在加载乱七八糟的东西"},
pauseStat={ pauseStat={
"时间:", "时间:",
"按键/旋转/暂存:", "按键/旋转/暂存:",
@@ -553,10 +556,10 @@ local langList={
"使用LOVE2D引擎", "使用LOVE2D引擎",
"作者:MrZ 邮箱:1046101471@qq.com", "作者:MrZ 邮箱:1046101471@qq.com",
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:MrZ/Miya", "程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:MrZ/Miya",
"特别感谢:Flyz,Farter,196,Teatube,T830,[所有内测人员]和 你!", "特别感谢:Flyz,Farter,196,Teatube,[所有内测人员]和 你!",
"", "",
"错误或者建议请附带截图发送到内测群或者作者邮箱~", "错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过唯一内测群1057456078进行免费下载/更新", "仅通过内测群822023725进行免费下载/更新",
"其他渠道获得游戏皆有被修改/植入病毒的风险,程序只申请了震动&联网权限!", "其他渠道获得游戏皆有被修改/植入病毒的风险,程序只申请了震动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)", "若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~", "请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -711,7 +714,8 @@ local langList={
pro="专业", pro="专业",
hide="显示虚拟按键", hide="显示虚拟按键",
track="按键自动跟踪", track="按键自动跟踪",
sound="按键音效", sfx="按键音效",
vib="按键震动",
icon="图标", icon="图标",
tkset="跟踪设置", tkset="跟踪设置",
alpha="透明度", alpha="透明度",
@@ -817,6 +821,7 @@ local langList={
{ {
anykey="Any Key to Continue", anykey="Any Key to Continue",
newVersion="Updating detected! Saving format may changed", newVersion="Updating detected! Saving format may changed",
marking="Author:MrZ_26\nIllegal recording if u see this",
lang="English", lang="English",
atkModeName={"Random","Badges","K.O.s","Counters"}, atkModeName={"Random","Badges","K.O.s","Counters"},
royale_remain=function(n)return n.." Players Remain"end, royale_remain=function(n)return n.." Players Remain"end,
@@ -956,10 +961,10 @@ local langList={
"Powered by LOVE2D", "Powered by LOVE2D",
"Author:MrZ E-mail:1046101471@qq.com", "Author:MrZ E-mail:1046101471@qq.com",
"Program:MrZ Art:MrZ Music:MrZ SFX:MrZ VOICE:MrZ/Miya", "Program:MrZ Art:MrZ Music:MrZ SFX:MrZ VOICE:MrZ/Miya",
"Special thanks:Flyz,Farter,196,Teatube,T830,[all test staff] and YOU!", "Special thanks:Flyz,Farter,196,Teatube,[all test staff] and YOU!",
"", "",
"Any bugs/suggestions to my E-mail.(may with screenshot)", "Any bugs/suggestions to my E-mail.(may with screenshot)",
"Only released in test group for FREE", "Only released in discord.gg/f9pUvkh for FREE",
"Game downloaded from other way may implanted with virus", "Game downloaded from other way may implanted with virus",
"Only network/vibrating permission applied", "Only network/vibrating permission applied",
"Author is not responsible for any loss by edited game", "Author is not responsible for any loss by edited game",
@@ -1115,7 +1120,8 @@ local langList={
pro="Professioanl", pro="Professioanl",
hide="Show Virtual Key", hide="Show Virtual Key",
track="Auto track", track="Auto track",
sound="SFX", sfx="SFX",
vib="VIB",
icon="Icon", icon="Icon",
tkset="Track setting", tkset="Track setting",
alpha="Alpha", alpha="Alpha",

View File

@@ -1,3 +1,4 @@
do return end
--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

View File

@@ -19,10 +19,10 @@ local list={
"colored_bone(mrz)", "colored_bone(mrz)",
"white_bone(mrz)", "white_bone(mrz)",
} }
local skin={} local SKIN={}
skin.lib={} SKIN.lib={}
skin.libMini={} SKIN.libMini={}
skin.libColor={ SKIN.libColor={
color.red, color.red,
color.orange, color.orange,
color.yellow, color.yellow,
@@ -41,7 +41,7 @@ skin.libColor={
color.darkRed, color.darkRed,
color.darkGreen, color.darkGreen,
} }
function skin.load() function SKIN.load()
local _ local _
gc.push() gc.push()
gc.origin() gc.origin()
@@ -49,36 +49,36 @@ function skin.load()
gc.setColor(1,1,1) gc.setColor(1,1,1)
for i=1,#list do for i=1,#list do
local I=gc.newImage("/image/skin/"..list[i]..".png") local I=gc.newImage("/image/skin/"..list[i]..".png")
skin.lib[i],skin.libMini[i]={},{}--30/6 SKIN.lib[i],SKIN.libMini[i]={},{}--30/6
for j=1,11 do for j=1,11 do
skin.lib[i][j]=C(30,30) SKIN.lib[i][j]=C(30,30)
gc.draw(I,30-30*j,0) gc.draw(I,30-30*j,0)
skin.libMini[i][j]=C(6,6) SKIN.libMini[i][j]=C(6,6)
gc.draw(I,6-6*j,0,nil,.2) gc.draw(I,6-6*j,0,nil,.2)
end end
for j=1,6 do for j=1,6 do
skin.lib[i][11+j]=C(30,30) SKIN.lib[i][11+j]=C(30,30)
gc.draw(I,30-30*j,-30) gc.draw(I,30-30*j,-30)
skin.libMini[i][11+j]=C(6,6) SKIN.libMini[i][11+j]=C(6,6)
gc.draw(I,6-6*j,-6,nil,.2) gc.draw(I,6-6*j,-6,nil,.2)
end end
I:release() I:release()
end end
skin.change(setting.skinSet) SKIN.change(setting.skinSet)
puzzleMark={} puzzleMark={}
gc.setLineWidth(3) gc.setLineWidth(3)
for i=1,11 do for i=1,11 do
puzzleMark[i]=C(30,30) puzzleMark[i]=C(30,30)
_=skin.libColor[i] _=SKIN.libColor[i]
gc.setColor(_[1],_[2],_[3],.6) gc.setColor(_[1],_[2],_[3],.6)
gc.rectangle("line",5,5,20,20) gc.rectangle("line",5,5,20,20)
gc.rectangle("line",10,10,10,10) gc.rectangle("line",10,10,10,10)
end end
for i=12,17 do for i=12,17 do
puzzleMark[i]=C(30,30) puzzleMark[i]=C(30,30)
gc.setColor(skin.libColor[i]) gc.setColor(SKIN.libColor[i])
gc.rectangle("line",7,7,16,16) gc.rectangle("line",7,7,16,16)
end end
_=C(30,30) _=C(30,30)
@@ -93,34 +93,34 @@ function skin.load()
gc.pop() gc.pop()
end end
local L=#list local L=#list
function skin.prevSet()--prev skin_set function SKIN.prevSet()--prev skin_set
local _=(setting.skinSet-2)%L+1 local _=(setting.skinSet-2)%L+1
setting.skinSet=_ setting.skinSet=_
skin.change(_) SKIN.change(_)
_=list[_] _=list[_]
TEXT.show(_,1100,100,int(300/#_)+5,"fly") TEXT.show(_,1100,100,int(300/#_)+5,"fly")
end end
function skin.nextSet()--next skin_set function SKIN.nextSet()--next skin_set
local _=setting.skinSet%L+1 local _=setting.skinSet%L+1
setting.skinSet=_ setting.skinSet=_
skin.change(_) SKIN.change(_)
_=list[_] _=list[_]
TEXT.show(_,1100,100,int(300/#_)+5,"fly") TEXT.show(_,1100,100,int(300/#_)+5,"fly")
end end
function skin.prev(i)--prev skin for [i] function SKIN.prev(i)--prev skin for [i]
local _=setting.skin local _=setting.skin
_[i]=(_[i]-2)%11+1 _[i]=(_[i]-2)%11+1
end end
function skin.next(i)--next skin for [i] function SKIN.next(i)--next skin for [i]
local _=setting.skin local _=setting.skin
_[i]=_[i]%11+1 _[i]=_[i]%11+1
end end
function skin.rotate(i)--change direction of [i] function SKIN.rotate(i)--change direction of [i]
setting.face[i]=(setting.face[i]+1)%4 setting.face[i]=(setting.face[i]+1)%4
SFX.play("rotate") SFX.play("rotate")
end end
function skin.change(i)--change to skin_set[i] function SKIN.change(i)--change to skin_set[i]
blockSkin=skin.lib[i] blockSkin=SKIN.lib[i]
blockSkinMini=skin.libMini[i] blockSkinMini=SKIN.libMini[i]
end end
return skin return SKIN

View File

@@ -3,6 +3,8 @@ local rnd=math.random
local mStr=mStr local mStr=mStr
local rem=table.remove local rem=table.remove
local texts={}
local textFX={} local textFX={}
function textFX.appear(t) function textFX.appear(t)
mStr(t.text,t.x,t.y-t.font*.7) mStr(t.text,t.x,t.y-t.font*.7)
@@ -64,11 +66,14 @@ function textFX.beat(t)
end end
function textFX.mark(t) function textFX.mark(t)
local _,_,_,T=gc.getColor() local _,_,_,T=gc.getColor()
gc.setColor(1,1,1,T*.06626) gc.setColor(1,1,1,T*.08)
mStr(t.text,t.x,t.y-t.font*.7) mStr(t.text,t.x,t.y-t.font*.7)
end end
local TEXT={} local TEXT={}
function TEXT.clear()
texts={}
end
function TEXT.getText(text,x,y,font,style,spd,stop) function TEXT.getText(text,x,y,font,style,spd,stop)
return{ return{
c=0, c=0,
@@ -94,6 +99,7 @@ function TEXT.show(text,x,y,font,style,spd,stop)
} }
end end
function TEXT.update(list) function TEXT.update(list)
if not list then list=texts end
for i=#list,1,-1 do for i=#list,1,-1 do
local t=list[i] local t=list[i]
t.c=t.c+t.spd t.c=t.c+t.spd
@@ -108,6 +114,7 @@ function TEXT.update(list)
end end
end end
function TEXT.draw(list) function TEXT.draw(list)
if not list then list=texts end
for i=1,#list do for i=1,#list do
local t=list[i] local t=list[i]
local p=t.c local p=t.c

View File

@@ -1,4 +1,4 @@
local level={0,.015,.02,.03,.04,.05,.06,.07,.08,.09} local level={0,0,.015,.02,.03,.04,.05,.06,.07,.08}
local _=love.system.vibrate local _=love.system.vibrate
return function(t) return function(t)
local L=setting.vib local L=setting.vib

View File

@@ -547,15 +547,13 @@ local function Pdraw_demo(P)
gc.draw(_,15,30,nil,16,nil,0,_:getHeight()*.5) gc.draw(_,15,30,nil,16,nil,0,_:getHeight()*.5)
end end
local N=1 local N=1
::L:: while N<=P.gameEnv.next and P.next[N]do
if N<=P.gameEnv.next and P.next[N]then
local id=P.next[N].id local id=P.next[N].id
_=P.color[id] _=P.color[id]
gc.setColor(_[1],_[2],_[3],.3) gc.setColor(_[1],_[2],_[3],.3)
_=miniBlock[id] _=miniBlock[id]
gc.draw(_,285,40*N-10,nil,16,nil,_:getWidth(),_:getHeight()*.5) gc.draw(_,285,40*N-10,nil,16,nil,_:getWidth(),_:getHeight()*.5)
N=N+1 N=N+1
goto L
end end
--Next --Next
gc.setColor(1,1,1) gc.setColor(1,1,1)
@@ -811,7 +809,8 @@ local function Pupdate_dead(P,dt)
if P.human and P.gameEnv.fall>0 and #P.field+L>P.clearingRow[L]then SFX.play("fall")end if P.human and P.gameEnv.fall>0 and #P.field+L>P.clearingRow[L]then SFX.play("fall")end
P.clearingRow={} P.clearingRow={}
end end
end::stop:: end
::stop::
if P.endCounter<40 then if P.endCounter<40 then
for j=1,#P.field do for i=1,10 do for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
@@ -867,7 +866,7 @@ function player.createBeam(P,R,send,time,target,color,clear,spin,mini,combo)
end end
local radius,corner local radius,corner
local a,r,g,b=1,unpack(skin.libColor[color]) local a,r,g,b=1,unpack(SKIN.libColor[color])
if clear>10 then if clear>10 then
radius=10+3*send+100/(target+4) radius=10+3*send+100/(target+4)
local t=clear%10 local t=clear%10
@@ -992,7 +991,7 @@ function player.garbageSend(P,R,send,time,...)
end end
function player.garbageRelease(P) function player.garbageRelease(P)
local n,flag=1 local n,flag=1
::L:: while true do
local A=P.atkBuffer[n] local A=P.atkBuffer[n]
if A and A.countdown<=0 and not A.sent then if A and A.countdown<=0 and not A.sent then
P:garbageRise(12+A.lv,A.amount,A.pos) P:garbageRise(12+A.lv,A.amount,A.pos)
@@ -1002,10 +1001,9 @@ function player.garbageRelease(P)
n=n+1 n=n+1
flag=true flag=true
else else
goto E break
end end
goto L end
::E::
if flag and P.AI_mode=="CC"then CC_updateField(P)end if flag and P.AI_mode=="CC"then CC_updateField(P)end
end end
function player.garbageRise(P,color,amount,pos) function player.garbageRise(P,color,amount,pos)
@@ -1435,12 +1433,9 @@ function player.drop(P)--Place piece
end end
--清除超高特效 --清除超高特效
_=#P.clearingRow _=#P.clearingRow
::L::if _>0 then while _>0 and P.clearingRow[_]>#P.field do
if P.clearingRow[_]>#P.field then P.clearingRow[_]=nil
P.clearingRow[_]=nil _=_-1
_=_-1
goto L
end
end end
if P.clearingRow[1]then if P.clearingRow[1]then
P.falling=P.gameEnv.fall P.falling=P.gameEnv.fall
@@ -1595,20 +1590,22 @@ function player.drop(P)--Place piece
if exblock then exblock=int(exblock*(1+P.strength*.25))end if exblock then exblock=int(exblock*(1+P.strength*.25))end
send=int(send*(1+P.strength*.25)) send=int(send*(1+P.strength*.25))
--Badge Buff --Badge Buff
if send==0 then goto L end if send>0 then
P:showText(send,0,80,35,"zoomout") P:showText(send,0,80,35,"zoomout")
if exblock==0 then goto L end if exblock>0 then
P:showText(exblock,0,120,20,"zoomout") P:showText(exblock,0,120,20,"zoomout")
::L:: end
end
send=send+exblock send=send+exblock
local k=0 local k=0
::R:: ::R::
if P.atkBuffer.sum>0 and send>0 then if send>0 and P.atkBuffer.sum>0 then
::F:: local A
repeat
k=k+1 k=k+1
local A=P.atkBuffer[k] A=P.atkBuffer[k]
if not A then goto E end if not A then goto E end
if A.sent then goto F end until not A.sent
if send>=A.amount then if send>=A.amount then
send=send-A.amount send=send-A.amount
P.atkBuffer.sum=P.atkBuffer.sum-A.amount P.atkBuffer.sum=P.atkBuffer.sum-A.amount
@@ -1771,12 +1768,9 @@ local function gameOver()
local L=M.records local L=M.records
local p=#L--排名数-1 local p=#L--排名数-1
if p>0 then if p>0 then
::L:: while M.comp(D,L[p])do--是否靠前
if M.comp(D,L[p])then--是否靠前
p=p-1 p=p-1
if p>0 then if p==0 then break end
goto L
end
end end
end end
if p<10 then if p<10 then
@@ -1791,6 +1785,7 @@ local function gameOver()
end end
end end
end--Save record end--Save record
function player.die(P)--Same thing when win/lose,not really die! function player.die(P)--Same thing when win/lose,not really die!
P.alive=false P.alive=false
P.timing=false P.timing=false
@@ -2228,7 +2223,7 @@ function newDemoPlayer(id,x,y,size)
if ENV.shakeFX==0 then ENV.shakeFX=nil end if ENV.shakeFX==0 then ENV.shakeFX=nil end
P.color={} P.color={}
for _=1,7 do for _=1,7 do
P.color[_]=skin.libColor[ENV.skin[_]] P.color[_]=SKIN.libColor[ENV.skin[_]]
end end
P.cur={bk={{}},id=0,color=0,name=0} P.cur={bk={{}},id=0,color=0,name=0}
P.sc,P.dir,P.r,P.c={0,0},0,0,0 P.sc,P.dir,P.r,P.c={0,0},0,0,0
@@ -2430,7 +2425,7 @@ function newAIPlayer(id,x,y,size,AIdata)
P.color={} P.color={}
for _=1,7 do for _=1,7 do
P.color[_]=skin.libColor[ENV.skin[_]] P.color[_]=SKIN.libColor[ENV.skin[_]]
end end
P.showTime=visible_opt[ENV.visible] P.showTime=visible_opt[ENV.visible]
@@ -2550,7 +2545,7 @@ function newPlayer(id,x,y,size)
P.color={} P.color={}
for _=1,7 do for _=1,7 do
P.color[_]=skin.libColor[ENV.skin[_]] P.color[_]=SKIN.libColor[ENV.skin[_]]
end end
P.showTime=visible_opt[ENV.visible] P.showTime=visible_opt[ENV.visible]

View File

@@ -1,6 +1,8 @@
local gc=love.graphics
local int,log=math.floor,math.log local int,log=math.floor,math.log
local sin,cos=math.sin,math.cos local sin,cos=math.sin,math.cos
local max,format=math.max,string.format local max,format=math.max,string.format
local scr=scr
local SCN={ local SCN={
cur="load",--Current scene cur="load",--Current scene
swapping=false,--ifSwapping swapping=false,--ifSwapping
@@ -235,7 +237,6 @@ local sceneInit={
love.event.quit() love.event.quit()
end, end,
} }
local gc=love.graphics
local swap={ local swap={
none={1,0,NULL}, none={1,0,NULL},
flash={8,1,function()gc.clear(1,1,1)end}, flash={8,1,function()gc.clear(1,1,1)end},

View File

@@ -8,52 +8,51 @@ local Tmr={}
function Tmr.load() function Tmr.load()
local t=Timer() local t=Timer()
local S=sceneTemp local S=sceneTemp
::R:: repeat
--L={stage,curPos,curLen} if S.phase==1 then
if S.phase==1 then VOC.loadOne(S.cur)
VOC.loadOne(S.cur) elseif S.phase==2 then
elseif S.phase==2 then BGM.loadOne(S.cur)
BGM.loadOne(S.cur) elseif S.phase==3 then
elseif S.phase==3 then SFX.loadOne(S.cur)
SFX.loadOne(S.cur) elseif S.phase==4 then
elseif S.phase==4 then IMG.loadOne(S.cur)
IMG.loadOne(S.cur) elseif S.phase==5 then
elseif S.phase==5 then local m=modes[S.cur]
local m=modes[S.cur] modes[S.cur]=require("modes/"..m[1])
modes[S.cur]=require("modes/"..m[1]) local M=modes[S.cur]
local M=modes[S.cur] M.saveFileName,M.id=m[1],m.id
M.saveFileName,M.id=m[1],m.id M.x,M.y,M.size,M.shape=m.x,m.y,m.size,m.shape
M.x,M.y,M.size,M.shape=m.x,m.y,m.size,m.shape M.unlock=m.unlock
M.unlock=m.unlock M.records=FILE.loadRecord(m[1])or M.score and{}
M.records=FILE.loadRecord(m[1])or M.score and{} -- M.icon=gc.newImage("image/modeIcon/"..m.icon..".png")
-- M.icon=gc.newImage("image/modeIcon/"..m.icon..".png") -- M.icon=gc.newImage("image/modeIcon/custom.png")
-- M.icon=gc.newImage("image/modeIcon/custom.png") elseif S.phase==6 then
elseif S.phase==6 then --------------------------Loading some other things here?
--------------------------Loading some other things here? SKIN.load()
skin.load() stat.run=stat.run+1
stat.run=stat.run+1 --------------------------
-------------------------- SFX.play("welcome_sfx")
SFX.play("welcome_sfx") VOC.play("welcome")
VOC.play("welcome") else
else S.cur=S.cur+1
S.tar=S.cur
if S.cur>62.6 then
SCN.swapTo("intro","none")
end
return
end
S.cur=S.cur+1 S.cur=S.cur+1
S.tar=S.cur if S.cur>S.tar then
if S.cur>62.6 then S.phase=S.phase+1
SCN.swapTo("intro","none") S.cur=1
S.tar=S.list[S.phase]
if not S.tar then
S.phase=0
S.tar=1
end
end end
return until not S.skip or SCN.swapping
end
S.cur=S.cur+1
if S.cur>S.tar then
S.phase=S.phase+1
S.cur=1
S.tar=S.list[S.phase]
if not S.tar then
S.phase=0
S.tar=1
end
end
if S.skip and not SCN.swapping then goto R end
end end
function Tmr.intro() function Tmr.intro()
sceneTemp=sceneTemp+1 sceneTemp=sceneTemp+1
@@ -235,7 +234,7 @@ function Tmr.play(dt)
if frame%120==0 then if frame%120==0 then
if modeEnv.royaleMode then freshMostDangerous()end if modeEnv.royaleMode then freshMostDangerous()end
if marking and rnd()<.2 then if marking and rnd()<.2 then
TEXT.show("游戏作者:MrZ_26\n出现此水印则为非法录屏上传",rnd(162,scr.w-162),rnd(126,scr.h-200),40,"mark",.626) TEXT.show(text.marking,rnd(162,scr.w-162),rnd(126,scr.h-200),40,"mark",.626)
end--mark 2s each 10s end--mark 2s each 10s
end end
end end

View File

@@ -98,11 +98,11 @@ function pasteBoard()
_,str=pcall(data.decompress,"string","deflate",str) _,str=pcall(data.decompress,"string","deflate",str)
if not _ then goto ERROR end if not _ then goto ERROR end
p=1 p=1
::LOOP:: while true do
_=byte(str,p)--1byte _=byte(str,p)--1byte
if not _ then if not _ then
if fX~=1 then goto ERROR if fX~=1 then goto ERROR
else goto FINISH else break
end end
end--str end end--str end
__=_%32-1--block id __=_%32-1--block id
@@ -112,22 +112,19 @@ function pasteBoard()
if fX<10 then if fX<10 then
fX=fX+1 fX=fX+1
else else
if fY==20 then goto FINISH end if fY==20 then break end
fX=1;fY=fY+1 fX=1;fY=fY+1
end end
p=p+1 p=p+1
goto LOOP end
::FINISH:: for y=fY+1,20 do
for y=fY+1,20 do for x=1,10 do
for x=1,10 do preField[y][x]=0
preField[y][x]=0
end
end end
goto END end
::ERROR:: do return end
TEXT.show(text.dataCorrupted,350,360,35,"flicker",.5) ::ERROR::TEXT.show(text.dataCorrupted,350,360,35,"flicker",.5)
::END::
end end
function mergeStat(stat,Δ) function mergeStat(stat,Δ)
@@ -252,7 +249,7 @@ function resetPartGameData()
pauseCount=0 pauseCount=0
destroyPlayers() destroyPlayers()
curMode.load() curMode.load()
texts={} TEXT.clear()
for i=1,#players do for i=1,#players do
if players.dust then if players.dust then
players.dust:reset() players.dust:reset()
@@ -298,7 +295,7 @@ function resetGameData()
BG.set(modeEnv.bg) BG.set(modeEnv.bg)
BGM.play(modeEnv.bgm) BGM.play(modeEnv.bgm)
texts={} TEXT.clear()
FX_badge={} FX_badge={}
FX_attack={} FX_attack={}
if modeEnv.royaleMode then if modeEnv.royaleMode then

View File

@@ -43,14 +43,14 @@ Future outlook:
New mode: New mode:
game Abbr. test game Abbr. test
backfire backfire
finesse exam(3next,1pt/mino,drop to score) finesse exam(3next, 1pt/mino, drop to score)
round-based dig round-based dig
Infinite battle bigbang
Bigbang rhythm
Rhythm combo
Combo aquare
Square field shifting(left/right)
Shifting field(left/right) task-based survival
Other: Other:
mod system with: mod system with:
block hidden block hidden
@@ -59,18 +59,33 @@ Future outlook:
low-hidden low-hidden
next hidden next hidden
field flip(LR/UD) field flip(LR/UD)
no fail(infinite revive) no fail(∞ lives)
防沉迷系统 防沉迷系统
lang setting page
warning FX(Graphic) warning FX(Graphic)
game recording game recording
powerinfo switch powerinfo switch
new virtualWidgets like joysticks new virtualWidgets like joysticks
custom sequence custom sequence
splashing block splashing block
more FXs & 3d features & animations cool backgrounds
more graphic FXs & 3D features & animations
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) smarter CC(think of garbage buffer)
0.8.18:Details Update II
new:
adjustable virtualkey SFX & VIB
changed:
add discord link in ENG mode
change par time/piece of sprint/battle/round mode
info on pause page more clearly
faster spaceBG rendering
updateLog editted
code:
delete all removable "goto"s!
callback system moduled, main.lua easy to read
0.8.17:Details Update 0.8.17:Details Update
new: new:
@@ -84,11 +99,14 @@ Future outlook:
no drop/lock FX in two hardest hidden modes, make them harder no drop/lock FX in two hardest hidden modes, make them harder
TSD-easy will auto finish when reach 20TSDs TSD-easy will auto finish when reach 20TSDs
solo/round AI setting changed solo/round AI setting changed
debug mode text&SFX when enter recording mode show text when entering debug mode
launching sound is divided to SFX&VOC two parts SFX when enter recording mode
remove full speed loading
code:
launching sound divided to SFX&VOC two parts
delete many "goto"s delete many "goto"s
vocal system moduled vocal system moduled
language system moduled language system moduled, easier to add new languages
fixed: fixed:
forgot to load language forgot to load language
error animation in control setting error animation in control setting
@@ -117,9 +135,9 @@ Future outlook:
new randomizer for drought2 new randomizer for drought2
half-clear judging method changed half-clear judging method changed
new background system(well, it doesn't look much different but space BG) new background system(well, it doesn't look much different but space BG)
better sequence randomizer
now can loading at full speed with Dblclick/space/enter now can loading at full speed with Dblclick/space/enter
add alipay paycode to help page add alipay paycode to help page
better sequence randomizer
code: code:
first shader applied for white frame of falling block first shader applied for white frame of falling block
many many module packed, easy to manage many many module packed, easy to manage
@@ -136,7 +154,7 @@ Future outlook:
give every update a name! give every update a name!
changed: changed:
animation time of lock effect little changed animation time of lock effect little changed
bone block of skin: ball changed bone block of ball-skin changed
AI change target more slowly AI change target more slowly
Author.dignity-=1 Author.dignity-=1
fixed: fixed:
@@ -218,10 +236,11 @@ Future outlook:
some O-spin error some O-spin error
error line counting when pc(full b2b) error line counting when pc(full b2b)
0.8.10: 0.8.10:Cool Update
new BGM:Distortion(master-final) new:
all background darker new BGM:Distortion(master-final)
better error page all background darker
cooler error page
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
@@ -456,15 +475,19 @@ Future outlook:
bugs fixed(AI control error) bugs fixed(AI control error)
0.7.13: 0.7.13:
Chinese game name: 方块研究所 new:
SUPER COOL instant moving effect Chinese game name: 方块研究所
new b2b bar style & animation SUPER COOL instant moving effect
new transition animation new b2b bar style & animation
change difficulty of master mode new transition animation
adjust delay algorithm(probably cause controlfeel changing, please reset your DAS setting) change:
code reconstructed change difficulty of master mode
bugs fixed(error when seq=his, size of custom oppo) adjust delay algorithm(probably cause controlfeel changing, please reset your DAS setting)
debug key change to F8 code reconstructed
debug key change to F8
fixed:
error when seq=his
error game area size of custom opponent
0.7.12:Total Update 0.7.12:Total Update
AI learned to switch attack mode AI learned to switch attack mode

View File

@@ -93,9 +93,9 @@ function SETsto(k) return function(i)setting[k]=i end end
function SETrev(k) return function()setting[k]=not setting[k] end end function SETrev(k) return function()setting[k]=not setting[k] end end
function pressKey(k)return function()love.keypressed(k) end end function pressKey(k)return function()love.keypressed(k) end end
function setPen(i) return function()sceneTemp.pen=i end end function setPen(i) return function()sceneTemp.pen=i end end
function prevSkin(n)return function()skin.prev(n) end end function prevSkin(n)return function()SKIN.prev(n) end end
function nextSkin(n)return function()skin.next(n) end end function nextSkin(n)return function()SKIN.next(n) end end
function nextDir(n) return function()skin.rotate(n) end end function nextDir(n) return function()SKIN.rotate(n) end end
function VKAdisp(n) return function()return VK_org[n].ava end end function VKAdisp(n) return function()return VK_org[n].ava end end
function VKAcode(n) return function()VK_org[n].ava=not VK_org[n].ava end end function VKAcode(n) return function()VK_org[n].ava=not VK_org[n].ava end end
@@ -235,7 +235,7 @@ local Widget={
graphic=newButton(1080,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_graphic")end, nil,"sfx"), graphic=newButton(1080,80,240,80,C.lightCyan,35,function()SCN.swapTo("setting_graphic")end, nil,"sfx"),
sfx= newSlider(180,250,400,10,35,function()SFX.play("blip_1")end, SETval("sfx"), SETsto("sfx"), nil,"bgm"), sfx= newSlider(180,250,400,10,35,function()SFX.play("blip_1")end, SETval("sfx"), SETsto("sfx"), nil,"bgm"),
bgm= newSlider(750,250,400,10,35,function()BGM.freshVolume()end, SETval("bgm"), SETsto("bgm"), nil,"vib"), bgm= newSlider(750,250,400,10,35,function()BGM.freshVolume()end, SETval("bgm"), SETsto("bgm"), nil,"vib"),
vib= newSlider(180,440,400,5 ,28,function()VIB(1)end, SETval("vib"), SETsto("vib"), nil,"voc"), vib= newSlider(180,440,400,5 ,28,function()VIB(2)end, SETval("vib"), SETsto("vib"), nil,"voc"),
voc= newSlider(750,440,400,10,32,function()VOC.play("nya")end, SETval("voc"), SETsto("voc"), nil,"stereo"), voc= newSlider(750,440,400,10,32,function()VOC.play("nya")end, SETval("voc"), SETsto("voc"), nil,"stereo"),
stereo= newSlider(180,630,400,10,35,function()SFX.play("move",1,-1)SFX.play("lock",1,1)end, SETval("stereo"), SETsto("stereo"),function()return setting.sfx==0 end,"back"), stereo= newSlider(180,630,400,10,35,function()SFX.play("move",1,-1)SFX.play("lock",1,1)end, SETval("stereo"), SETsto("stereo"),function()return setting.sfx==0 end,"back"),
back= newButton(1140,650,200,80,C.white,40,SCN.back,nil,"game"), back= newButton(1140,650,200,80,C.white,40,SCN.back,nil,"game"),
@@ -260,8 +260,8 @@ local Widget={
back=newButton(1140,650,200,80,C.white,45,SCN.back), back=newButton(1140,650,200,80,C.white,45,SCN.back),
}, },
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(130,230,90,65,C.white,30,prevSkin(1)), prev1= newButton(130,230,90,65,C.white,30,prevSkin(1)),
prev2= newButton(270,230,90,65,C.white,30,prevSkin(2)), prev2= newButton(270,230,90,65,C.white,30,prevSkin(2)),
prev3= newButton(410,230,90,65,C.white,30,prevSkin(3)), prev3= newButton(410,230,90,65,C.white,30,prevSkin(3)),
@@ -350,14 +350,15 @@ local Widget={
pro= newButton(1120,100, 240,80,C.white,35,function()for i=1,20 do VK_org[i].ava=true end end), pro= newButton(1120,100, 240,80,C.white,35,function()for i=1,20 do VK_org[i].ava=true end end),
hide= newSwitch(1170,200, 40,SETval("VKSwitch"),SETrev("VKSwitch")), hide= newSwitch(1170,200, 40,SETval("VKSwitch"),SETrev("VKSwitch")),
track= newSwitch(1170,300, 35,SETval("VKTrack"),SETrev("VKTrack")), track= newSwitch(1170,300, 35,SETval("VKTrack"),SETrev("VKTrack")),
sound= newSwitch(850,400, 35,SETval("VKSound"),SETrev("VKSound")), sfx= newSlider(800,380,180,4,40,function()SFX.play("virtualKey",setting.VKSFX*.25)end,SETval("VKSFX"),SETsto("VKSFX")),
vib= newSlider(800,460,180,2,40,function()VIB(setting.VKVIB)end,SETval("VKVIB"),SETsto("VKVIB")),
icon= newSwitch(850,300, 40,SETval("VKIcon"),SETrev("VKIcon")), icon= newSwitch(850,300, 40,SETval("VKIcon"),SETrev("VKIcon")),
tkset= newButton(1120,400,240,80,C.white,32,function() tkset= newButton(1120,420,240,80,C.white,32,function()
SCN.push() SCN.push()
SCN.swapTo("setting_trackSetting") SCN.swapTo("setting_trackSetting")
end,function()return not setting.VKTrack end), end,function()return not setting.VKTrack end),
alpha= newSlider(840,490,400,10,40,nil,SETval("VKAlpha"),SETsto("VKAlpha")), alpha= newSlider(840,540,400,10,40,nil,SETval("VKAlpha"),SETsto("VKAlpha")),
back= newButton(1100,600,240,80,C.white,45,SCN.back), back= newButton(1120,620,200,80,C.white,45,SCN.back),
}, },
setting_trackSetting={ setting_trackSetting={
VKDodge=newSwitch(400,200, 35,SETval("VKDodge"),SETrev("VKDodge")), VKDodge=newSwitch(400,200, 35,SETval("VKDodge"),SETrev("VKDodge")),