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)
t.identity="Techmino"--SaveDir name
t.version="11.1"

View File

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

View File

@@ -3,12 +3,10 @@
活到最后或者完成目标即胜利.
旋转系统:
使用Techmino专属旋转系统
细节懒得写(?)
使用Techmino专属旋转系统,细节懒得写(
spin判定:
结合了不可移动判定和三角判定,是否为mini也与判定过程数据有关
细节也懒得写(?)
结合了不可移动判定和三角判定,是否为mini也与判定过程数据有关,细节也懒得写(
攻击系统:
普通消除:
@@ -48,11 +46,11 @@ back to back(B2B)点数说明:
1.随机:每次攻击后10%随机挑选一个玩家锁定
2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家
3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新)
4.反击:攻击所有锁定自己的玩家攻击AOE,若未被任何人锁定则击随机玩家
4.反击:攻击所有锁定自己的玩家攻击AOE,若未被任何人锁定则击随机玩家(不锁定)
坚持到最后的玩家就是胜利者.
自定义模式说明:
玩家可以自由调整大多数参数(不包括上述各种游戏模式的特殊效果),也可以画一个场地去消除或者是作为提示模板来进行拼图模式.
在拼图模式下,按功能键切换是否展示提示.其中打"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
local T=P.stat.piece
return
T<=30 and 5 or
T<=40 and 4 or
T<=55 and 3 or
T<=70 and 2 or
T<=23 and 5 or
T<=26 and 4 or
T<=40 and 3 or
T<=60 and 2 or
1
end
end,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -338,7 +338,7 @@ function Pnt.draw()
local pen=sceneTemp.pen
if pen>0 then
gc.setLineWidth(13)
gc.setColor(skin.libColor[pen])
gc.setColor(SKIN.libColor[pen])
gc.rectangle("line",565,460,70,70)
elseif pen==-1 then
gc.setLineWidth(5)
@@ -354,7 +354,7 @@ function Pnt.draw()
local _
for i=1,7 do
_=setting.skin[i]
gc.setColor(skin.libColor[_])
gc.setColor(SKIN.libColor[_])
mStr(text.block[i],500+65*_,65)
end
end
@@ -434,7 +434,7 @@ function Pnt.pause()
if T<1 or gameResult then Pnt.play()end
--Dark BG
local _=T
if gameResult then _=_*.6 end
if gameResult then _=_*.7 end
gc.setColor(.15,.15,.15,_)
gc.push("transform")
gc.origin()
@@ -689,7 +689,7 @@ end
function Pnt.stat()
local chart=sceneTemp.chart
setFont(24)
local _,__=skin.libColor,setting.skin
local _,__=SKIN.libColor,setting.skin
local A,B=chart.A1,chart.A2
for x=1,7 do
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}}
-------------------------------------------------Cold clear
local CCblockID={4,3,5,6,1,2,0}
if system~="Windows"then goto SKIP end
require("CCloader")
BOT={
getConf= cc.get_default_config ,--()options,weights
--setConf= cc.set_options ,--(options,hold,20g,bag7)
if system=="Windows"then
require("CCloader")
BOT={
getConf= cc.get_default_config ,--()options,weights
--setConf= cc.set_options ,--(options,hold,20g,bag7)
new= cc.launch_async ,--(options,weights)bot
addNext= cc.add_next_piece_async ,--(bot,piece)
update= cc.reset_async ,--(bot,field,b2b,combo)
think= cc.request_next_move ,--(bot)
getMove= cc.poll_next_move ,--(bot)success,hold,move
ifDead= cc.is_dead_async ,--(bot)dead
destroy= cc.destroy_async ,--(bot)
new= cc.launch_async ,--(options,weights)bot
addNext= cc.add_next_piece_async ,--(bot,piece)
update= cc.reset_async ,--(bot,field,b2b,combo)
think= cc.request_next_move ,--(bot)
getMove= cc.poll_next_move ,--(bot)success,hold,move
ifDead= cc.is_dead_async ,--(bot)dead
destroy= cc.destroy_async ,--(bot)
setHold= cc.set_hold ,--(opt,bool)
set20G= cc.set_20g ,--(opt,bool)
setBag= cc.set_bag7 ,--(opt,bool)
setNode= cc.set_max_nodes ,--(opt,bool)
free= cc.free ,--(opt/wei)
}
function CC_updateField(P)
local F,i={},1
for y=1,#P.field do
for x=1,10 do
F[i],i=P.field[y][x]>0,i+1
setHold= cc.set_hold ,--(opt,bool)
set20G= cc.set_20g ,--(opt,bool)
setBag= cc.set_bag7 ,--(opt,bool)
setNode= cc.set_max_nodes ,--(opt,bool)
free= cc.free ,--(opt/wei)
}
function CC_updateField(P)
local F,i={},1
for y=1,#P.field do
for x=1,10 do
F[i],i=P.field[y][x]>0,i+1
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
while i<400 do
F[i],i=false,i+1
end
BOT.update(P.AI_bot,F,P.b2b>=100,P.combo)
end
function CC_switch20G(P)
P.AIdata._20G=true
P.AI_keys={}
BOT.destroy(P.AI_bot)
local opt,wei=BOT.getConf()
BOT.setHold(opt,P.AIdata.hold)
BOT.set20G(opt,P.AIdata._20G)
BOT.setBag(opt,P.AIdata.bag7)
BOT.setNode(opt,P.AIdata.node)
P.AI_bot=BOT.new(opt,wei)
BOT.free(opt)BOT.free(wei)
for i=1,P.AIdata.next do
BOT.addNext(P.AI_bot,CCblockID[P.next[i].id])
end
CC_updateField(P)
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)
function CC_switch20G(P)
P.AIdata._20G=true
P.AI_keys={}
BOT.destroy(P.AI_bot)
local opt,wei=BOT.getConf()
BOT.setHold(opt,P.AIdata.hold)
BOT.set20G(opt,P.AIdata._20G)
BOT.setBag(opt,P.AIdata.bag7)
BOT.setNode(opt,P.AIdata.node)
P.AI_bot=BOT.new(opt,wei)
BOT.free(opt)BOT.free(wei)
for i=1,P.AIdata.next do
BOT.addNext(P.AI_bot,CCblockID[P.next[i].id])
end
CC_updateField(P)
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()
BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])
collectgarbage()
P:newNext()
BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])
collectgarbage()
end
end
::SKIP::
-------------------------------------------------⑨Stack setup
local dirCount={1,1,3,3,3,0,1}
local spinOffset={
@@ -231,10 +231,8 @@ AI_think={
end
end
::L::
if #Tfield>0 then
while #Tfield>0 do
freeRow.discard(rem(Tfield,1))
goto L
end--Release cache
local p=#ctrl+1
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 scr=scr
local BGinit,BGresize,BGupdate,BGdraw,BGdiscard={},{},{},{},{}
local BGvars={_G=_G}
@@ -136,7 +135,7 @@ end--Lightning
function BGinit.game6()
t=0
colorLib=_G.skin.libColor
colorLib=_G.SKIN.libColor
colorSet=_G.setting.skin
miniBlock=_G.miniBlock
end
@@ -180,34 +179,37 @@ end
function BGinit.space()
stars={}
for i=1,2600,5 do
local s=0.75*2^(rnd()*1.5)
local s=rnd(4)
stars[i]=s --size
stars[i+1]=rnd(W) --x
stars[i+2]=rnd(H) --y
stars[i+1]=rnd(W)-10 --x
stars[i+2]=rnd(H)-10 --y
stars[i+3]=(rnd()-.5)*.01*s --vx
stars[i+4]=(rnd()-.5)*.01*s --vy
end--800 var
end
function BGresize.space(w,h)
W,H=w+100,h+100
W,H=w+20,h+20
BGinit.space()
end
function BGupdate.space(dt)
local s=stars
for i=1,2600,5 do
stars[i+1]=(stars[i+1]+stars[i+3])%W
stars[i+2]=(stars[i+2]+stars[i+4])%H
s[i+1]=(s[i+1]+s[i+3])%W
s[i+2]=(s[i+2]+s[i+4])%H
end--star moving
end
function BGdraw.space()
gc.clear(.2,.2,.2)
if not stars[1]then return end
gc.translate(-50,-50)
gc.translate(-10,-10)
gc.setColor(.8,.8,.8)
for i=1,2600,5 do
local x,y=stars[i+1],stars[i+2]
gc.circle("fill",x,y,stars[i])
local s=stars
local x,y=s[i+1],s[i+2]
s=s[i]
gc.rectangle("fill",x,y,s,s)
end
gc.translate(50,50)
gc.translate(10,10)
end
function BGdiscard.space()
stars={}

View File

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

View File

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

View File

@@ -1,3 +1,4 @@
do return end
--LIGHT MODULE(Optimized by MrZ,Original on github/love2d community/simple-love-lights)
--Heavily based on mattdesl's libGDX implementation:
--https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows

View File

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

View File

@@ -3,6 +3,8 @@ local rnd=math.random
local mStr=mStr
local rem=table.remove
local texts={}
local textFX={}
function textFX.appear(t)
mStr(t.text,t.x,t.y-t.font*.7)
@@ -64,11 +66,14 @@ function textFX.beat(t)
end
function textFX.mark(t)
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)
end
local TEXT={}
function TEXT.clear()
texts={}
end
function TEXT.getText(text,x,y,font,style,spd,stop)
return{
c=0,
@@ -94,6 +99,7 @@ function TEXT.show(text,x,y,font,style,spd,stop)
}
end
function TEXT.update(list)
if not list then list=texts end
for i=#list,1,-1 do
local t=list[i]
t.c=t.c+t.spd
@@ -108,6 +114,7 @@ function TEXT.update(list)
end
end
function TEXT.draw(list)
if not list then list=texts end
for i=1,#list do
local t=list[i]
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
return function(t)
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)
end
local N=1
::L::
if N<=P.gameEnv.next and P.next[N]then
while N<=P.gameEnv.next and P.next[N]do
local id=P.next[N].id
_=P.color[id]
gc.setColor(_[1],_[2],_[3],.3)
_=miniBlock[id]
gc.draw(_,285,40*N-10,nil,16,nil,_:getWidth(),_:getHeight()*.5)
N=N+1
goto L
end
--Next
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
P.clearingRow={}
end
end::stop::
end
::stop::
if P.endCounter<40 then
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
@@ -867,7 +866,7 @@ function player.createBeam(P,R,send,time,target,color,clear,spin,mini,combo)
end
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
radius=10+3*send+100/(target+4)
local t=clear%10
@@ -992,7 +991,7 @@ function player.garbageSend(P,R,send,time,...)
end
function player.garbageRelease(P)
local n,flag=1
::L::
while true do
local A=P.atkBuffer[n]
if A and A.countdown<=0 and not A.sent then
P:garbageRise(12+A.lv,A.amount,A.pos)
@@ -1002,10 +1001,9 @@ function player.garbageRelease(P)
n=n+1
flag=true
else
goto E
break
end
goto L
::E::
end
if flag and P.AI_mode=="CC"then CC_updateField(P)end
end
function player.garbageRise(P,color,amount,pos)
@@ -1435,12 +1433,9 @@ function player.drop(P)--Place piece
end
--清除超高特效
_=#P.clearingRow
::L::if _>0 then
if P.clearingRow[_]>#P.field then
P.clearingRow[_]=nil
_=_-1
goto L
end
while _>0 and P.clearingRow[_]>#P.field do
P.clearingRow[_]=nil
_=_-1
end
if P.clearingRow[1]then
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
send=int(send*(1+P.strength*.25))
--Badge Buff
if send==0 then goto L end
if send>0 then
P:showText(send,0,80,35,"zoomout")
if exblock==0 then goto L end
P:showText(exblock,0,120,20,"zoomout")
::L::
if exblock>0 then
P:showText(exblock,0,120,20,"zoomout")
end
end
send=send+exblock
local k=0
::R::
if P.atkBuffer.sum>0 and send>0 then
::F::
if send>0 and P.atkBuffer.sum>0 then
local A
repeat
k=k+1
local A=P.atkBuffer[k]
A=P.atkBuffer[k]
if not A then goto E end
if A.sent then goto F end
until not A.sent
if send>=A.amount then
send=send-A.amount
P.atkBuffer.sum=P.atkBuffer.sum-A.amount
@@ -1771,12 +1768,9 @@ local function gameOver()
local L=M.records
local p=#L--排名数-1
if p>0 then
::L::
if M.comp(D,L[p])then--是否靠前
while M.comp(D,L[p])do--是否靠前
p=p-1
if p>0 then
goto L
end
if p==0 then break end
end
end
if p<10 then
@@ -1791,6 +1785,7 @@ local function gameOver()
end
end
end--Save record
function player.die(P)--Same thing when win/lose,not really die!
P.alive=false
P.timing=false
@@ -2228,7 +2223,7 @@ function newDemoPlayer(id,x,y,size)
if ENV.shakeFX==0 then ENV.shakeFX=nil end
P.color={}
for _=1,7 do
P.color[_]=skin.libColor[ENV.skin[_]]
P.color[_]=SKIN.libColor[ENV.skin[_]]
end
P.cur={bk={{}},id=0,color=0,name=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={}
for _=1,7 do
P.color[_]=skin.libColor[ENV.skin[_]]
P.color[_]=SKIN.libColor[ENV.skin[_]]
end
P.showTime=visible_opt[ENV.visible]
@@ -2550,7 +2545,7 @@ function newPlayer(id,x,y,size)
P.color={}
for _=1,7 do
P.color[_]=skin.libColor[ENV.skin[_]]
P.color[_]=SKIN.libColor[ENV.skin[_]]
end
P.showTime=visible_opt[ENV.visible]

View File

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

View File

@@ -8,52 +8,51 @@ local Tmr={}
function Tmr.load()
local t=Timer()
local S=sceneTemp
::R::
--L={stage,curPos,curLen}
if S.phase==1 then
VOC.loadOne(S.cur)
elseif S.phase==2 then
BGM.loadOne(S.cur)
elseif S.phase==3 then
SFX.loadOne(S.cur)
elseif S.phase==4 then
IMG.loadOne(S.cur)
elseif S.phase==5 then
local m=modes[S.cur]
modes[S.cur]=require("modes/"..m[1])
local M=modes[S.cur]
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.unlock=m.unlock
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/custom.png")
elseif S.phase==6 then
--------------------------Loading some other things here?
skin.load()
stat.run=stat.run+1
--------------------------
SFX.play("welcome_sfx")
VOC.play("welcome")
else
repeat
if S.phase==1 then
VOC.loadOne(S.cur)
elseif S.phase==2 then
BGM.loadOne(S.cur)
elseif S.phase==3 then
SFX.loadOne(S.cur)
elseif S.phase==4 then
IMG.loadOne(S.cur)
elseif S.phase==5 then
local m=modes[S.cur]
modes[S.cur]=require("modes/"..m[1])
local M=modes[S.cur]
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.unlock=m.unlock
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/custom.png")
elseif S.phase==6 then
--------------------------Loading some other things here?
SKIN.load()
stat.run=stat.run+1
--------------------------
SFX.play("welcome_sfx")
VOC.play("welcome")
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.tar=S.cur
if S.cur>62.6 then
SCN.swapTo("intro","none")
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
return
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
until not S.skip or SCN.swapping
end
function Tmr.intro()
sceneTemp=sceneTemp+1
@@ -235,7 +234,7 @@ function Tmr.play(dt)
if frame%120==0 then
if modeEnv.royaleMode then freshMostDangerous()end
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
end

View File

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

View File

@@ -43,14 +43,14 @@ Future outlook:
New mode:
game Abbr. test
backfire
finesse exam(3next,1pt/mino,drop to score)
finesse exam(3next, 1pt/mino, drop to score)
round-based dig
Infinite battle
Bigbang
Rhythm
Combo
Square
Shifting field(left/right)
bigbang
rhythm
combo
aquare
field shifting(left/right)
task-based survival
Other:
mod system with:
block hidden
@@ -59,18 +59,33 @@ Future outlook:
low-hidden
next hidden
field flip(LR/UD)
no fail(infinite revive)
no fail(∞ lives)
防沉迷系统
lang setting page
warning FX(Graphic)
game recording
powerinfo switch
new virtualWidgets like joysticks
custom sequence
splashing block
more FXs & 3d features & animations
cool backgrounds
more graphic FXs & 3D features & animations
Encrypt source code(compile to byte code)
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
new:
@@ -84,11 +99,14 @@ Future outlook:
no drop/lock FX in two hardest hidden modes, make them harder
TSD-easy will auto finish when reach 20TSDs
solo/round AI setting changed
debug mode text&SFX when enter recording mode
launching sound is divided to SFX&VOC two parts
show text when entering debug mode
SFX when enter recording mode
remove full speed loading
code:
launching sound divided to SFX&VOC two parts
delete many "goto"s
vocal system moduled
language system moduled
language system moduled, easier to add new languages
fixed:
forgot to load language
error animation in control setting
@@ -117,9 +135,9 @@ Future outlook:
new randomizer for drought2
half-clear judging method changed
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
add alipay paycode to help page
better sequence randomizer
code:
first shader applied for white frame of falling block
many many module packed, easy to manage
@@ -136,7 +154,7 @@ Future outlook:
give every update a name!
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
Author.dignity-=1
fixed:
@@ -218,10 +236,11 @@ Future outlook:
some O-spin error
error line counting when pc(full b2b)
0.8.10:
new BGM:Distortion(master-final)
all background darker
better error page
0.8.10:Cool Update
new:
new BGM:Distortion(master-final)
all background darker
cooler error page
fixed:
error when finish master/ultra mode
shakeFX no effect when below 3
@@ -456,15 +475,19 @@ Future outlook:
bugs fixed(AI control error)
0.7.13:
Chinese game name: 方块研究所
SUPER COOL instant moving effect
new b2b bar style & animation
new transition animation
change difficulty of master mode
adjust delay algorithm(probably cause controlfeel changing, please reset your DAS setting)
code reconstructed
bugs fixed(error when seq=his, size of custom oppo)
debug key change to F8
new:
Chinese game name: 方块研究所
SUPER COOL instant moving effect
new b2b bar style & animation
new transition animation
change:
change difficulty of master mode
adjust delay algorithm(probably cause controlfeel changing, please reset your DAS setting)
code reconstructed
debug key change to F8
fixed:
error when seq=his
error game area size of custom opponent
0.7.12:Total Update
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 pressKey(k)return function()love.keypressed(k) end end
function setPen(i) return function()sceneTemp.pen=i end end
function prevSkin(n)return function()skin.prev(n) end end
function nextSkin(n)return function()skin.next(n) end end
function nextDir(n) return function()skin.rotate(n) end end
function prevSkin(n)return function()SKIN.prev(n) end end
function nextSkin(n)return function()SKIN.next(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 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"),
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"),
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"),
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"),
@@ -260,8 +260,8 @@ local Widget={
back=newButton(1140,650,200,80,C.white,45,SCN.back),
},
setting_skin={
prev= newButton(700,100,140,100,C.white,50,function()skin.prevSet()end),
next= newButton(860,100,140,100,C.white,50,function()skin.nextSet()end),
prev= newButton(700,100,140,100,C.white,50,function()SKIN.prevSet()end),
next= newButton(860,100,140,100,C.white,50,function()SKIN.nextSet()end),
prev1= newButton(130,230,90,65,C.white,30,prevSkin(1)),
prev2= newButton(270,230,90,65,C.white,30,prevSkin(2)),
prev3= newButton(410,230,90,65,C.white,30,prevSkin(3)),
@@ -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),
hide= newSwitch(1170,200, 40,SETval("VKSwitch"),SETrev("VKSwitch")),
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")),
tkset= newButton(1120,400,240,80,C.white,32,function()
tkset= newButton(1120,420,240,80,C.white,32,function()
SCN.push()
SCN.swapTo("setting_trackSetting")
end,function()return not setting.VKTrack end),
alpha= newSlider(840,490,400,10,40,nil,SETval("VKAlpha"),SETsto("VKAlpha")),
back= newButton(1100,600,240,80,C.white,45,SCN.back),
alpha= newSlider(840,540,400,10,40,nil,SETval("VKAlpha"),SETsto("VKAlpha")),
back= newButton(1120,620,200,80,C.white,45,SCN.back),
},
setting_trackSetting={
VKDodge=newSwitch(400,200, 35,SETval("VKDodge"),SETrev("VKDodge")),