Compare commits

...

74 Commits

Author SHA1 Message Date
MrZ626
ecf037f27d 0.10.6:CC更新 2020-08-26 00:22:54 +08:00
MrZ626
cf5844a2af O卡住的时候旋转不刷新锁定延迟 2020-08-26 00:22:04 +08:00
MrZ626
b2f8abb884 修改中文的tips 2020-08-26 00:21:24 +08:00
MrZ626
128ab01cf0 cc适配代码调整 2020-08-26 00:21:19 +08:00
MrZ626
a62945a71d cc库文件夹添加进gitignore 2020-08-25 02:24:27 +08:00
MrZ626
9ff8cd3aaa 修改UVRY的踢墙表 2020-08-25 02:21:37 +08:00
MrZ626
b1306ac220 隐形-瞬隐模式强制关闭瞬落/锁定特效 2020-08-25 02:21:32 +08:00
MrZ626
57a89c3859 代码/注释整理 2020-08-25 02:21:26 +08:00
MrZ626
610d953803 修复没开软件锁报错 2020-08-25 02:21:12 +08:00
MrZ626
b788f26f50 修复cc不能用的问题 2020-08-25 02:14:24 +08:00
MrZ626
e5f489fbab 代码整理,修复一个读取问题 2020-08-23 00:16:59 +08:00
MrZ626
4786ab59b0 代码整理 2020-08-23 00:16:30 +08:00
MrZ626
8c7e2da69a 软件锁加新功能和彩蛋 2020-08-23 00:16:04 +08:00
MrZ626
f511aa2f6f 软件锁也可显示tip 2020-08-23 00:15:29 +08:00
MrZ_26
46b119601b Merge pull request #22 from Gompyn/AndroidCC
CC for Android(and Linux)
2020-08-22 15:58:37 +08:00
MrZ_26
d4238da156 Merge pull request #21 from Gompyn/resolve-conflict-with-MrZ626/master
adapt cold-clear 45d5276 and update field when block placement is wrong
2020-08-22 15:55:44 +08:00
MrZ_26
f9cf35f746 输入重置码也可解锁游戏 2020-08-22 02:19:14 +08:00
MrZ_26
94519ba147 0.10.5:特效更新 2020-08-22 02:17:48 +08:00
MrZ_26
e397bdcd12 重构createMoveFX 2020-08-22 02:11:29 +08:00
MrZ_26
e8f0efb22c 代码小调整 2020-08-22 02:04:52 +08:00
MrZ_26
7ecadb0ff1 几个设置大标题样式统一 2020-08-22 01:57:06 +08:00
Gompyn
097129bd08 Merge branch 'master' into resolve-conflict-with-MrZ626/master 2020-08-21 20:36:22 +08:00
MrZ_26
59377efa0c 降低两个马拉松的S评级要求 2020-08-21 17:30:23 +08:00
MrZ_26
4040afbbd9 瞬移特效独立为瞬降和移动(旋转)特效,增加移动特效滑条,各特效范围均为0~5 2020-08-21 00:34:39 +08:00
MrZ_26
d362e1cb54 超高死亡高度改为42 2020-08-21 00:30:47 +08:00
MrZ_26
ff9647bd00 修复垃圾行上涨不刷新ghost 2020-08-21 00:30:09 +08:00
MrZ_26
eb2cff0016 调整各评级颜色 2020-08-19 20:51:19 +08:00
MrZ_26
858f2c673b 暂停界面数据排版微调 2020-08-19 20:50:52 +08:00
MrZ_26
4b9cd0cd06 蓝色更亮一点 2020-08-19 20:50:25 +08:00
MrZ_26
7e2c76bf77 调整JLI的踢墙表 2020-08-19 17:48:17 +08:00
MrZ_26
4b02f3b9ee 复原之前自制蓝屏报错界面 2020-08-19 00:21:26 +08:00
MrZ_26
3f7a09ef71 fan背景完善 2020-08-19 00:06:09 +08:00
MrZ_26
fd580dcadc new English translation by @MattMayuga#8789 2020-08-18 23:06:02 +08:00
MrZ_26
6d64590a12 声音设置页面标题颜色浅了 2020-08-18 21:54:50 +08:00
MrZ_26
e5be25b481 有消行延迟+出块等待时连续硬降出现神秘现象 2020-08-18 21:54:29 +08:00
MrZ_26
7f28278378 挖完后下一波8行会立刻升起 2020-08-18 00:38:50 +08:00
MrZ_26
a7112094f6 加入扇子背景 2020-08-18 00:38:28 +08:00
MrZ_26
37d0a106a9 修复粘贴序列bug,可以用键盘复制粘贴 2020-08-17 17:17:52 +08:00
MrZ_26
731bdab8b2 群号修改 2020-08-17 00:42:36 +08:00
MrZ_26
eabf1242aa wing背景细节调整 2020-08-16 22:47:02 +08:00
MrZ_26
ef857643c8 再微调i踢墙表(顺顺逆式) 2020-08-16 22:28:51 +08:00
MrZ_26
2cf64541f2 支持加载部分老版本存档,软件锁界面出现时机调整,按钮位置调整 2020-08-16 21:01:34 +08:00
MrZ_26
b2ba8a84e9 可交互背景系统试验(给无尽挖掘装上了) 2020-08-16 01:19:46 +08:00
MrZ_26
78e3aa2532 staff添加user670,格式规范 2020-08-16 00:31:33 +08:00
MrZ_26
84e253fd8b 调整混战模式玩家边框颜色影响区域,根据锁延刷新模式决定锁延指示条颜色 2020-08-16 00:31:25 +08:00
MrZ_26
1c4d89c425 雷达图OPM参数改为ADPM 2020-08-15 21:48:04 +08:00
MrZ_26
720e7c6c06 无尽挖掘连挖提示语 2020-08-15 19:46:24 +08:00
MrZ_26
e8902d578a 换字库 2020-08-15 18:15:19 +08:00
MrZ_26
e70b6d3218 微调i的踢墙表 2020-08-15 17:53:12 +08:00
MrZ_26
dded42aeef 整理代码 2020-08-15 17:52:08 +08:00
MrZ_26
6cccf2604c 重命名大多数背景 2020-08-15 17:23:59 +08:00
Gompyn
c72dedf7cf try load CCloaders one by one
it will try all available CCloaders in game.love and go back to 9S
if all CCloaders are not available
2020-08-15 02:37:16 +08:00
MrZ_26
f26888beaa 微调yygq语言 2020-08-14 20:20:57 +08:00
MrZ_26
ce4ba0cefd 每次启动游戏ai是一样的块序 2020-08-14 18:23:12 +08:00
MrZ_26
0885f3bfb3 修改100/400/1000L的评级要求 2020-08-14 17:13:02 +08:00
MrZ_26
becc092192 0.10.4:漏洞修复 2020-08-14 00:25:00 +08:00
MrZ_26
185862eabf 锁延机制错误(重构锁延代码) 2020-08-13 23:59:26 +08:00
MrZ_26
19ce62997b 代码整理 2020-08-13 23:53:07 +08:00
MrZ_26
d8c096b06b 修复拼图模式序列准备错误(改了自定义忘了改这个) 2020-08-13 21:43:05 +08:00
MrZ_26
aa836c7028 修复游戏结束后马上暂停并解除还会自动暂停(之前没修好) 2020-08-13 02:42:03 +08:00
MrZ_26
e5e378fa07 更改减速debug模式速度 2020-08-13 02:33:31 +08:00
MrZ_26
230514e34a 一条tip 2020-08-13 02:33:03 +08:00
MrZ_26
d196d73448 修复提前硬降失效 2020-08-13 02:09:30 +08:00
MrZ_26
cb98a9094a 修复计算器切场景bug 2020-08-12 22:57:43 +08:00
MrZ_26
ec036037fe 0.10.4:漏洞修复 2020-08-12 21:56:02 +08:00
MrZ_26
882769bb71 修改场景模块方法名 2020-08-12 21:45:42 +08:00
MrZ_26
ba43e5e6a7 软件锁变量名修改 2020-08-12 18:47:00 +08:00
MrZ_26
09c56d74bd 代码整理 2020-08-12 18:46:52 +08:00
MrZ_26
c78630a31e linter查出的几个小问题 2020-08-12 18:43:42 +08:00
Gompyn
5342d4f6d6 make CC update field *after* locking 2020-07-31 17:19:36 +08:00
Gompyn
6641d402c0 Fix variable scope 2020-07-30 14:30:17 +08:00
Gompyn
86ffc4a207 add CC on android (and Linux btw) 2020-07-29 16:04:35 +08:00
Gompyn
71130bbced make cc update field when block placement is wrong 2020-07-29 15:01:38 +08:00
Gompyn
17d670a1ba adapt cold-clear 45d5276 2020-07-29 14:47:49 +08:00
62 changed files with 1109 additions and 592 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
lib

View File

@@ -1,6 +1,7 @@
local gc=love.graphics local gc=love.graphics
local int,ceil,rnd,abs=math.floor,math.ceil,math.random,math.abs 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 ins,rem=table.insert,table.remove
local BG local BG
local scr=scr local scr=scr
@@ -58,13 +59,158 @@ back.flink={
end end
end, end,
}--Flash after random time }--Flash after random time
local wingColor={
{0., .9, .9,.626},
{.3, 1., .3,.626},
{.9, .9, 0.,.626},
{1., .5, 0.,.626},
{1., .3, .3,.626},
{.5, 0., 1.,.626},
{.3, .3, 1.,.626},
{0., .9, .9,.626},
}
back.wing={
init=function()
gc.setDefaultFilter("linear","linear")
bar=gc.newCanvas(41,1)
gc.push("transform")
gc.origin()
gc.setCanvas(bar)
for x=0,20 do
gc.setColor(1,1,1,x/11)
gc.rectangle("fill",x,0,1,1)
gc.rectangle("fill",41-x,0,1,1)
end
gc.setCanvas()
gc.pop()
BG.resize()
end,
resize=function()
crystal={}
W,H=scr.w,scr.h
for i=1,16 do
crystal[i]={
x=i<9 and W*.05*i or W*.05*(28-i),
y=H*.1,
a=0,
va=0,
f=i<9 and .012-i*.0005 or .012-(17-i)*.0005
}
end
end,
update=function()
for i=1,16 do
local B=crystal[i]
B.a=B.a+B.va
B.va=B.va*.986-B.a*B.f
end
end,
draw=function()
gc.clear(.06,.06,.06)
local sy=H*.8
for i=1,8 do
gc.setColor(wingColor[i])
local B=crystal[i]
gc.draw(bar,B.x,B.y,B.a,1,sy,20,0)
B=crystal[17-i]
gc.draw(bar,B.x,B.y,B.a,1,sy,20,0)
end
end,
event=function(level)
for i=1,8 do
local B=crystal[i]
B.va=B.va+.001*level*(1+rnd())
B=crystal[17-i]
B.va=B.va-.001*level*(1+rnd())
end
end,
discard=function()
bar,crystal=nil
end,
}--Flandre's wing
local _
back.fan={
init=function()
fan=_G.title_fan
t=0
petal={}
BG.resize()
end,
resize=function()
CX,CY=scr.w/2,scr.h/2
W,H=scr.w,scr.h
end,
update=function()
t=t+1
if t%10==0 then
ins(petal,{
x=scr.w*rnd(),
y=0,
vy=2+rnd()*2,
vx=rnd()*2-.5,
rx=4+rnd()*4,
ry=4+rnd()*4,
})
end
for i=#petal,1,-1 do
local P=petal[i]
P.y=P.y+P.vy
if P.y>H then
rem(petal,i)
else
P.x=P.x+P.vx
P.vx=P.vx+rnd()*.01
P.rx=max(min(P.rx+rnd()-.5,10),2)
P.ry=max(min(P.ry+rnd()-.5,10),2)
end
end
end,
draw=function()
gc.push("transform")
gc.translate(CX,CY+20*sin(t*.02))
gc.scale(scr.k)
gc.clear(.1,.1,.1)
gc.setLineWidth(320)
gc.setColor(.3,.2,.3)
gc.arc("line","open",0,420,500,-.8*3.1416,-.2*3.1416)
gc.setLineWidth(4)
gc.setColor(.7,.5,.65)
gc.arc("line","open",0,420,660,-.799*3.1416,-.201*3.1416)
gc.arc("line","open",0,420,340,-.808*3.1416,-.192*3.1416)
gc.line(-281,224,-530,30.5)
gc.line(281,224,530,30.5)
gc.setLineWidth(6)
gc.setColor(.55,.5,.6)
local F=fan
for i=1,8 do
gc.polygon("line",F[i])
end
gc.setLineWidth(2)
gc.setColor(.6,.3,.5)
gc.origin()
for i=1,#petal do
local P=petal[i]
gc.ellipse("fill",P.x,P.y,P.rx,P.ry)
end
gc.pop()
end,
discard=function()
petal=nil
end,
}
back.aura={ back.aura={
init=function() init=function()
t=rnd()*3600 t=rnd()*3600
BG.resize(scr.w,scr.h) BG.resize(scr.w,scr.h)
end, end,
resize=function(w,h) resize=function(w,h)
SHADER.aura:send("w",w*scr.dpi) SHADER.aura:send("w",scr.W)
SHADER.aura:send("h",h*scr.dpi) SHADER.aura:send("h",h*scr.dpi)
end, end,
update=function(dt) update=function(dt)
@@ -77,13 +223,13 @@ back.aura={
gc.setShader() gc.setShader()
end, end,
}--Cool liquid background }--Cool liquid background
back.game1={ back.bg1={
init=function() init=function()
t=0 t=0
BG.resize(scr.w) BG.resize(scr.w)
end, end,
resize=function(w) resize=function(w)
SHADER.gradient1:send("w",w*scr.dpi) SHADER.gradient1:send("w",scr.W)
end, end,
update=function(dt) update=function(dt)
t=t+dt t=t+dt
@@ -95,7 +241,7 @@ back.game1={
gc.setShader() gc.setShader()
end, end,
}--Horizonal red-blue gradient }--Horizonal red-blue gradient
back.game2={ back.bg2={
init=function() init=function()
t=0 t=0
BG.resize(nil,scr.h) BG.resize(nil,scr.h)
@@ -113,13 +259,13 @@ back.game2={
gc.setShader() gc.setShader()
end, end,
}--Vertical red-green gradient }--Vertical red-green gradient
back.game3={ back.rainbow={
init=function() init=function()
t=0 t=0
BG.resize(scr.w,scr.h) BG.resize(scr.w,scr.h)
end, end,
resize=function(w,h) resize=function(w,h)
SHADER.rgb1:send("w",w*scr.dpi) SHADER.rgb1:send("w",scr.W)
SHADER.rgb1:send("h",h*scr.dpi) SHADER.rgb1:send("h",h*scr.dpi)
end, end,
update=function(dt) update=function(dt)
@@ -132,13 +278,13 @@ back.game3={
gc.setShader() gc.setShader()
end, end,
}--Colorful RGB }--Colorful RGB
back.game4={ back.rainbow2={
init=function() init=function()
t=0 t=0
BG.resize(scr.w,scr.h) BG.resize(scr.w,scr.h)
end, end,
resize=function(w,h) resize=function(w,h)
SHADER.rgb2:send("w",w*scr.dpi) SHADER.rgb2:send("w",scr.W)
SHADER.rgb2:send("h",h*scr.dpi) SHADER.rgb2:send("h",h*scr.dpi)
end, end,
update=function(dt) update=function(dt)
@@ -151,7 +297,7 @@ back.game4={
gc.setShader() gc.setShader()
end, end,
}--Blue RGB }--Blue RGB
back.game5={ back.lightning={
init=function() init=function()
t=0 t=0
end, end,
@@ -168,7 +314,7 @@ back.game5={
local blocks=require("parts/mino") local blocks=require("parts/mino")
local scs=require("parts/spinCenters") local scs=require("parts/spinCenters")
back.game6={ back.lightning2={
init=function() init=function()
t=0 t=0
colorLib=_G.SKIN.libColor colorLib=_G.SKIN.libColor
@@ -251,7 +397,7 @@ back.space={
gc.translate(10,10) gc.translate(10,10)
end, end,
discard=function() discard=function()
stars={} stars=nil
end, end,
} }
@@ -260,8 +406,9 @@ for _,bg in next,back do
if not bg.init then bg.init= NULL end setfenv(bg.init ,BGvars) if not bg.init then bg.init= NULL end setfenv(bg.init ,BGvars)
if not bg.resize then bg.resize= NULL end setfenv(bg.resize ,BGvars) if not bg.resize then bg.resize= NULL end setfenv(bg.resize ,BGvars)
if not bg.update then bg.update= NULL end setfenv(bg.update ,BGvars) if not bg.update then bg.update= NULL end setfenv(bg.update ,BGvars)
if not bg.discard then bg.discard=NULL end setfenv(bg.discard ,BGvars)
if not bg.draw then bg.draw= NULL end setfenv(bg.draw ,BGvars) if not bg.draw then bg.draw= NULL end setfenv(bg.draw ,BGvars)
if not bg.event then bg.event= NULL end setfenv(bg.event ,BGvars)
if not bg.discard then bg.discard=NULL end setfenv(bg.discard ,BGvars)
end end
BG={ BG={
@@ -270,6 +417,11 @@ BG={
update=NULL, update=NULL,
draw=back.none.draw, draw=back.none.draw,
} }
function BG.send(data)
if BG.event then
BG.event(data)
end
end
function BG.set(bg,data) function BG.set(bg,data)
if bg==BG.cur or not setting.bg then return end if bg==BG.cur or not setting.bg then return end
if BG.discard then if BG.discard then
@@ -282,8 +434,9 @@ function BG.set(bg,data)
BG.init=bg.init or NULL BG.init=bg.init or NULL
BG.resize=bg.resize or NULL BG.resize=bg.resize or NULL
BG.update=bg.update or NULL BG.update=bg.update or NULL
BG.discard=bg.discard or NULL
BG.draw=bg.draw or NULL BG.draw=bg.draw or NULL
BG.event=bg.event or NULL
BG.discard=bg.discard or NULL
BG.init() BG.init()
end end
return BG return BG

View File

@@ -9,7 +9,7 @@ local color={
lRed={1,.5,.5}, lRed={1,.5,.5},
lGreen={.5,1,.5}, lGreen={.5,1,.5},
lBlue={.6,.6,1}, lBlue={.6,.7,1},
lCyan={.5,1,1}, lCyan={.5,1,1},
lMagenta={1,.5,1}, lMagenta={1,.5,1},
lYellow={1,1,.5}, lYellow={1,1,.5},
@@ -32,7 +32,6 @@ local color={
pink={1,0,.6}, pink={1,0,.6},
grass={.6,1,0}, grass={.6,1,0},
water={0,1,.6}, water={0,1,.6},
bronze={.7,.4,0},
white={1,1,1}, white={1,1,1},
purple={.5,0,1}, purple={.5,0,1},
} }

View File

@@ -170,13 +170,15 @@ function keyDown.calculator(k)
end end
S.sym="=" S.sym="="
S.reg=false S.reg=false
if S.val==626 then if S.val==600+20+6 then
S.pass=true
elseif S.val==196000+022 then
S.pass=true S.pass=true
elseif S.val==196022 then
marking=nil marking=nil
TEXT.show("\68\69\86\58\87\97\116\101\114\109\97\114\107\32\82\101\109\111\118\101\100",640,360,60,"stretch",.6) TEXT.show("\68\69\86\58\87\97\116\101\114\109\97\114\107\32\82\101\109\111\118\101\100",640,360,60,"stretch",.6)
SFX.play("clear") SFX.play("clear")
elseif S.val==72943816 then elseif S.val==72943816 then
S.pass=true
for name,M in next,Modes do for name,M in next,Modes do
if not modeRanks[name]then if not modeRanks[name]then
modeRanks[name]=M.score and 0 or 6 modeRanks[name]=M.score and 0 or 6
@@ -185,14 +187,27 @@ function keyDown.calculator(k)
FILE.saveUnlock() FILE.saveUnlock()
TEXT.show("\68\69\86\58\85\78\76\79\67\75\65\76\76",640,360,60,"stretch",.6) TEXT.show("\68\69\86\58\85\78\76\79\67\75\65\76\76",640,360,60,"stretch",.6)
SFX.play("clear_2") SFX.play("clear_2")
elseif S.val==137926261379 then elseif S.val==1379e8+2626e4+1379 then
SCN.goto("debug") S.pass=true
SCN.go("debug")
elseif S.val==34494 then
error("This is an error testing message.")
elseif S.val==114 then
S.val=514
elseif S.val==114514 then
S.reg=1919810
S.val=114514
elseif S.val==123456789 then
S.reg=123456789
S.val=987654321
end end
end end
elseif k=="space"then elseif k=="escape"then
if S.pass then S.val,S.reg,S.sym=0
SCN.goto("load") elseif k=="delete"then
end S.val=0
elseif k=="space"and S.pass then
SCN.swapTo("intro")
end end
end end
@@ -203,6 +218,8 @@ function keyDown.load(k)
elseif k=="s"then elseif k=="s"then
marking=nil marking=nil
sceneTemp.skip=true sceneTemp.skip=true
elseif k=="escape"then
SCN.back()
end end
end end
function touchDown.load(id,x,y) function touchDown.load(id,x,y)
@@ -215,8 +232,12 @@ function mouseDown.intro(x,y,k)
if k==2 then if k==2 then
VOC.play("bye") VOC.play("bye")
SCN.back() SCN.back()
elseif newVersionLaunch then
SCN.push("main","fade")
SCN.swapTo("history","fade")
TEXT.show(text.newVersion,640,200,30,"fly",.3)
else else
SCN.goto("main") SCN.go("main")
end end
end end
function touchDown.intro(id,x,y) function touchDown.intro(id,x,y)
@@ -339,7 +360,7 @@ function keyDown.mode(key)
end end
elseif mapCam.sel=="custom_clear" or mapCam.sel=="custom_puzzle" then elseif mapCam.sel=="custom_clear" or mapCam.sel=="custom_puzzle" then
if key=="e"then if key=="e"then
SCN.goto("custom") SCN.go("custom")
end end
end end
end end
@@ -396,7 +417,7 @@ function keyDown.custom(key)
BGM.play(customRange.bgm[customSel[sel]]) BGM.play(customRange.bgm[customSel[sel]])
end end
elseif key=="q"then elseif key=="q"then
SCN.goto("sequence") SCN.go("sequence")
elseif key=="e"then elseif key=="e"then
SCN.swapTo("draw","swipe") SCN.swapTo("draw","swipe")
elseif #key==1 then elseif #key==1 then
@@ -429,8 +450,20 @@ function keyDown.sequence(key)
local C=s.cur+1 local C=s.cur+1
ins(preBag,C,key) ins(preBag,C,key)
s.cur=C s.cur=C
elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then
if #preBag>0 then
love.system.setClipboardText("Techmino SEQ:"..copySequence())
TEXT.show(text.copySuccess,640,225,50,"appear",.5)
end
elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then
local str=love.system.getClipboardText()
local p=string.find(str,":")--ptr*
if p then str=string.sub(str,p+1)end
if not pasteSequence(str)then
TEXT.show(text.dataCorrupted,640,225,45,"flicker",.5)
end
elseif #key==1 then elseif #key==1 then
local i=(kb.isDown("lctrl","lshift","lalt","rctrl","rshift","ralt")and minoKey2 or minoKey)[key] local i=(kb.isDown("lshift","lalt","rshift","ralt")and minoKey2 or minoKey)[key]
if i then if i then
local C=s.cur+1 local C=s.cur+1
ins(preBag,C,i) ins(preBag,C,i)
@@ -458,18 +491,6 @@ function keyDown.sequence(key)
else else
sceneTemp.sure=50 sceneTemp.sure=50
end end
elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then
if #preBag>0 then
love.system.setClipboardText("Techmino SEQ:"..copySequence())
TEXT.show(text.copySuccess,640,225,50,"appear",.5)
end
elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then
local str=love.system.getClipboardText()
local p=string.find(str,":")--ptr*
if p then str=string.sub(str,p+1)end
if not pasteSequence(str)then
TEXT.show(text.dataCorrupted,640,225,45,"flicker",.5)
end
end end
end end
end end
@@ -685,7 +706,7 @@ function keyDown.pause(key)
elseif key=="escape"then elseif key=="escape"then
resumeGame() resumeGame()
elseif key=="s"then elseif key=="s"then
SCN.goto("setting_sound") SCN.go("setting_sound")
elseif key=="r"then elseif key=="r"then
TASK.clear("play") TASK.clear("play")
resetGameData() resetGameData()
@@ -1069,6 +1090,71 @@ function love.focus(f)
pauseGame() pauseGame()
end end
end end
function love.errorhandler(msg)
local PUMP,POLL=love.event.pump,love.event.poll
love.mouse.setVisible(true)
love.audio.stop()
local err={"Error:"..msg}
local trace=debug.traceback("",2)
local c=2
for l in string.gmatch(trace,"(.-)\n")do
if c>2 then
if not string.find(l,"boot")then
err[c]=string.gsub(l,"^\t*","")
c=c+1
end
else
err[2]="Traceback"
c=3
end
end
print(table.concat(err,"\n"),1,c-2)
gc.reset()
local CAP
local function _(_)CAP=gc.newImage(_)end
gc.captureScreenshot(_)
gc.present()
setting.sfx=setting.voc--only for error "voice" played with voice volume,not saved
if SFX.list.error then SFX.play("error",.8)end
local BGcolor=rnd()>.026 and{.3,.5,.9}or{.62,.3,.926}
local needDraw=true
return function()
PUMP()
for E,a,b,c,d,e in POLL()do
if E=="quit"or a=="escape"then
destroyPlayers()
return 1
elseif E=="resize"then
love.resize(a,b)
needDraw=true
elseif E=="focus"then
needDraw=true
end
end
if needDraw then
gc.discard()
gc.clear(BGcolor)
gc.setColor(1,1,1)
gc.push("transform")
gc.replaceTransform(xOy)
gc.draw(CAP,100,365,nil,512/CAP:getWidth(),288/CAP:getHeight())
setFont(120)gc.print(":(",100,40)
setFont(38)gc.printf(text.errorMsg,100,200,1280-100)
setFont(20)
gc.print(system.."-"..gameVersion,100,660)
gc.print("scene:"..SCN.cur,400,660)
gc.printf(err[1],626,360,1260-626)
gc.print("TRACEBACK",626,426)
for i=4,#err-2 do
gc.print(err[i],626,370+20*i)
end
gc.pop()
gc.present()
needDraw=false
end
love.timer.sleep(.2)
end
end
local scs={.5,1.5,.5,1.5,.5,1.5,.5,1.5,.5,1.5,1,1,0,2} local scs={.5,1.5,.5,1.5,.5,1.5,.5,1.5,.5,1.5,1,1,0,2}
local devColor={ local devColor={
color.white, color.white,
@@ -1092,7 +1178,7 @@ function love.run()
local FCT=0--Framedraw counter local FCT=0--Framedraw counter
love.resize(gc.getWidth(),gc.getHeight()) love.resize(gc.getWidth(),gc.getHeight())
SCN.init(setting.lock and "calculator"or"load")--Scene Launch SCN.init("load")--Scene Launch
marking=true marking=true
return function() return function()
@@ -1162,7 +1248,7 @@ function love.run()
--Draw scene swapping animation --Draw scene swapping animation
if SCN.swapping then if SCN.swapping then
_=SCN.swap _=SCN.stat
_.draw(_.time) _.draw(_.time)
end end
@@ -1184,8 +1270,8 @@ function love.run()
for i=1,#LIST do for i=1,#LIST do
gc.rectangle("fill",900+2*i,_,2,-LIST[i]*4000) gc.rectangle("fill",900+2*i,_,2,-LIST[i]*4000)
end end
if devMode==3 then WAIT(.26) if devMode==3 then WAIT(.1)
elseif devMode==4 then WAIT(.626) elseif devMode==4 then WAIT(.5)
end end
end end
@@ -1197,9 +1283,9 @@ function love.run()
if Timer()-lastFreshPow>2 and setting.powerInfo and loadingFinished then if Timer()-lastFreshPow>2 and setting.powerInfo and loadingFinished then
updatePowerInfo() updatePowerInfo()
lastFreshPow=Timer() lastFreshPow=Timer()
_=gc.getWidth() if gc.getWidth()~=scr.w then
if _~=scr.w then love.resize(gc.getWidth(),gc.getHeight())
love.resize(_,gc.getHeight()) TEXT.show("resized",200,100,30,"stretch")
end end
end end

View File

@@ -18,6 +18,7 @@ local langList={
stage=function(n)return"关卡 "..n end, stage=function(n)return"关卡 "..n end,
great="Great!", great="Great!",
awesome="Awesome.", awesome="Awesome.",
almost="Almost!",
continue="Continue.", continue="Continue.",
maxspeed="最高速度", maxspeed="最高速度",
speedup="速度加快", speedup="速度加快",
@@ -85,8 +86,6 @@ local langList={
unlockSavingError="解锁保存失败:", unlockSavingError="解锁保存失败:",
recSavingError="纪录保存失败:", recSavingError="纪录保存失败:",
ai_fixed="不能同时开启AI和固定序列",
ai_prebag="不能同时开启AI和自定义序列",
switchSpawnSFX="请开启方块出生音效", switchSpawnSFX="请开启方块出生音效",
needRestart="重新开始以生效", needRestart="重新开始以生效",
@@ -126,7 +125,7 @@ local langList={
radar={"DEF","OFF","ATK","SEND","SPD","DIG"}, radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={ radarData={
"D'PM", "D'PM",
"OPM", "ADPM",
"APM", "APM",
"SPM", "SPM",
"L'PM", "L'PM",
@@ -154,7 +153,7 @@ local langList={
"", "",
"使用LOVE2D引擎", "使用LOVE2D引擎",
"错误或者建议请附带截图发送到内测群或者作者邮箱~", "错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过内测群1080457319进行免费下载/更新", "仅通过内测群1127702001进行免费下载/更新",
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!", "其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)", "若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~", "请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -163,12 +162,14 @@ local langList={
"作者:MrZ 邮箱:1046101471@qq.com", "作者:MrZ 邮箱:1046101471@qq.com",
"使用LOVE2D引擎", "使用LOVE2D引擎",
"", "",
"程序:MrZ, FinnTenzor", "程序: MrZ, FinnTenzor",
"美术:MrZ, (Gnyar)", "美术: MrZ, (Gnyar)",
"音乐:MrZ, (T0722)", "音乐: MrZ, (T0722)",
"音效/语音: MrZ, Miya", "音效/语音: MrZ, Miya",
"演出: 模电, HBM", "演出: 模电, HBM",
"测试:思竣 官网: 渣渣120", "测试: 思竣",
"英文文案: User670",
"官网: 渣渣120",
"", "",
"特别感谢:", "特别感谢:",
"Flyz, Farter, 蕴空之灵,", "Flyz, Farter, 蕴空之灵,",
@@ -184,7 +185,7 @@ local langList={
simple-love-lights[dylhunn] simple-love-lights[dylhunn]
]], ]],
support="支持作者", support="支持作者",
group="官方QQ群(如果没有被暗改的话就是这个):1080457319", group="官方QQ群(如果没有被暗改的话就是这个):1127702001",
WidgetText={ WidgetText={
calculator={ calculator={
_1="1",_2="2",_3="3", _1="1",_2="2",_3="3",
@@ -246,6 +247,7 @@ local langList={
back="返回", back="返回",
}, },
draw={ draw={
b12="[ ]",
any="不定", any="不定",
space="×", space="×",
clear="清除", clear="清除",
@@ -277,7 +279,7 @@ local langList={
autoPause="失去焦点自动暂停", autoPause="失去焦点自动暂停",
swap="组合键切换攻击模式", swap="组合键切换攻击模式",
fine="极简操作提示音", fine="极简操作提示音",
lock="软件锁(密码626)", appLock="软件锁(密码626)",
back="返回", back="返回",
}, },
setting_video={ setting_video={
@@ -290,6 +292,7 @@ local langList={
bagLine="包分界线", bagLine="包分界线",
lockFX="锁定特效等级", lockFX="锁定特效等级",
dropFX="下落特效等级", dropFX="下落特效等级",
moveFX="移动特效等级",
clearFX="消除特效等级", clearFX="消除特效等级",
shakeFX="晃动特效等级", shakeFX="晃动特效等级",
atkFX="攻击特效等级", atkFX="攻击特效等级",
@@ -490,6 +493,7 @@ local langList={
stage=function(n)return"关卡 "..n end, stage=function(n)return"关卡 "..n end,
great="不错!", great="不错!",
awesome="精彩。", awesome="精彩。",
almost="差一点!",
continue="继续。", continue="继续。",
maxspeed="最高速度", maxspeed="最高速度",
speedup="速度加快", speedup="速度加快",
@@ -555,8 +559,6 @@ local langList={
unlockSavingError="解锁保存失败:", unlockSavingError="解锁保存失败:",
recSavingError="纪录保存失败:", recSavingError="纪录保存失败:",
ai_fixed="不能同时开启电脑玩家和固定序列",
ai_prebag="不能同时开启电脑玩家和自定义序列",
switchSpawnSFX="请开启方块出生音效", switchSpawnSFX="请开启方块出生音效",
needRestart="重新开始以生效", needRestart="重新开始以生效",
@@ -596,7 +598,7 @@ local langList={
radar={"","","","","",""}, radar={"","","","","",""},
radarData={ radarData={
"防/分", "防/分",
"/分", "/分",
"攻/分", "攻/分",
"送/分", "送/分",
"行/分", "行/分",
@@ -623,7 +625,7 @@ local langList={
"从TO/C2/KOS/TGM3/JS等方块获得过灵感", "从TO/C2/KOS/TGM3/JS等方块获得过灵感",
"", "",
"错误或者建议请附带截图发送到内测群或者作者邮箱~", "错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过内测群1080457319进行免费下载/更新", "仅通过内测群1127702001进行免费下载/更新",
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!", "其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)", "若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~", "请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -632,13 +634,14 @@ local langList={
"作者:MrZ 邮箱:1046101471@qq.com", "作者:MrZ 邮箱:1046101471@qq.com",
"使用LOVE2D引擎", "使用LOVE2D引擎",
"", "",
"程序:MrZ, FinnTenzor", "程序: MrZ, FinnTenzor",
"美术:MrZ, (T0722, Gnyar)", "美术: MrZ, (T0722, Gnyar)",
"音乐:MrZ, (T0722)", "音乐: MrZ, (T0722)",
"音效/语音: MrZ, Miya", "音效/语音: MrZ, Miya",
"演出: 模电, HBM", "演出: 模电, HBM",
"测试:思竣 官网: 渣渣120", "测试: 思竣",
"", "英文文案: User670",
"官网: 渣渣120",
"特别感谢:", "特别感谢:",
"Flyz, Farter, 蕴空之灵,", "Flyz, Farter, 蕴空之灵,",
"茶管, [所有内测人员]", "茶管, [所有内测人员]",
@@ -653,7 +656,7 @@ local langList={
simple-love-lights[dylhunn] simple-love-lights[dylhunn]
]], ]],
support="支持作者", support="支持作者",
group="官方QQ群(如果没有被暗改的话就是这个):1080457319", group="官方QQ群(如果没有被暗改的话就是这个):1127702001",
WidgetText={ WidgetText={
calculator={ calculator={
_1="1",_2="2",_3="3", _1="1",_2="2",_3="3",
@@ -715,6 +718,7 @@ local langList={
back="返回", back="返回",
}, },
draw={ draw={
b12="[ ]",
any="不定", any="不定",
space="×", space="×",
clear="清除", clear="清除",
@@ -746,7 +750,7 @@ local langList={
autoPause="失去焦点自动暂停", autoPause="失去焦点自动暂停",
swap="组合键切换攻击模式", swap="组合键切换攻击模式",
fine="极简操作提示音", fine="极简操作提示音",
lock="软件锁(密码626)", appLock="软件锁(密码626)",
back="返回", back="返回",
}, },
setting_video={ setting_video={
@@ -759,6 +763,7 @@ local langList={
bagLine="包分界线", bagLine="包分界线",
lockFX="锁定特效等级", lockFX="锁定特效等级",
dropFX="下落特效等级", dropFX="下落特效等级",
moveFX="移动特效等级",
clearFX="消除特效等级", clearFX="消除特效等级",
shakeFX="晃动特效等级", shakeFX="晃动特效等级",
atkFX="攻击特效等级", atkFX="攻击特效等级",
@@ -942,28 +947,29 @@ local langList={
}, },
{ {
anykey="Press any button", anykey="Press any button",
newVersion="Updating detected!", newVersion="Update detected!",
newBigVersion="Big updating detected! Save data altered", newBigVersion="A big update was detected! Save data has been altered.",
marking="Game Author:MrZ_26\nIllegal recording if see this\nAny explanation invalid", marking="Game Author: MrZ_26\nIllegal recording if you can see this\nAny explanation is invalid",
lang="English", lang="English",
atkModeName={"Random","Badges","K.O.s","Attackers"}, atkModeName={"Random","Badges","K.O.s","Attackers"},
royale_remain=function(n)return n.." Players Remaining"end, royale_remain=function(n)return n.." Players Remaining"end,
cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"}, cmb={nil,"1 Combo","2 Combo","3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!!","15 Combo!!","16 Combo!!","17 Combo!!!","18 Combo!!!","19 Combo!!!","MEGACMB"},
block=nil,spin="-spin ", block=nil,spin="-Spin ",
clear={"single","double","triple","Techrash","Techrash+"}, clear={"Single","Double","Triple","Techrash","Techrash+"},
mini="Mini",b2b="B2B ",b3b="B2B2B ", mini="Mini",b2b="B2B ",b3b="B2B2B ",
PC="Perfect Clear",HPC="Clear", PC="Perfect Clear",HPC="Clear",
hold="Hold",next="Next", hold="HOLD",next="NEXT",
replaying="[Replaying]", replaying="[Replay]",
stage=function(n)return"Stage "..n end, stage=function(n)return"Stage "..n end,
great="Great!", great="Great!",
awesome="Awesome!", awesome="Awesome!",
almost="Almost!",
continue="Keep going!", continue="Keep going!",
maxspeed="Max speed!", maxspeed="Max speed!",
speedup="Speed up!", speedup="Speed up!",
win="Win", win="You Win!",
finish="Finish", finish="Finish",
gameover="Game Over", gameover="Game Over",
pause="Pause", pause="Pause",
@@ -992,47 +998,45 @@ local langList={
fall=nil, fall=nil,
next=nil, next=nil,
hold={"On","Off","Inf"}, hold={"On","Off","Inf"},
sequence={"bag","his4","random","loop","fixed"}, sequence={"Bag","His4","Random","Loop","Fixed"},
visible={"normal","slow fade","fast fade","sudden fade"}, visible={"Normal","Slow Fade","Quick Fade","Sudden Fade"},
target={10,20,40,100,200,500,1000,"None"}, target={10,20,40,100,200,500,1000,"None"},
freshLimit={0,8,15,"Inf"}, freshLimit={0,8,15,"Inf"},
opponent={"None","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"}, opponent={"None","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
}, },
sequence="Custom Sequence", sequence="Custom Sequence",
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"}, snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"},
setting_game="Game settings", setting_game="Game Settings",
setting_video="Video settings", setting_video="Video Settings",
setting_sound="Sound settings", setting_sound="Sound Settings",
setting_control="Control Settings", setting_control="Control Settings",
setting_skin="Layout Settings", setting_skin="Layout Settings",
preview="Preview", preview="Preview",
keyboard="Keyboard",joystick="Controller", keyboard="Keyboard",joystick="Controller",
ctrlSetHelp="Arrowkey to select/change slot,Enter to change,Esc back", ctrlSetHelp="Arrow keys: select/change slot, Enter: Change, Esc: Go back",
musicRoom="Music Room", musicRoom="Music Room",
nowPlaying="Now Playing:", nowPlaying="Now Playing:",
page="Page:", page="Page:",
ai_fixed="AI is incompatible with fixed sequence", ai_fixed="The AI is incompatible with fixed sequences.",
ai_prebag="AI is incompatible with custom sequence", ai_prebag="The AI is incompatible with custom sequences.",
settingSaved="Settings Saved", settingSaved="Settings Saved",
settingSavingError="Failed to save settings:", settingSavingError="Failed to save settings:",
keyMapSaved="Key settings saved", keyMapSaved="Key settings saved",
keyMapSavingError="Failed to save key settings:", keyMapSavingError="Failed to save key settings:",
VKSaved="virtual keys saved", VKSaved="Virtual keys saved",
VKSavingError="Failed to save virtual key:", VKSavingError="Failed to save virtual key configuration:",
statSavingError="Failed to save stat:", statSavingError="Failed to save statistics:",
unlockSavingError="Failed to save unlock:", unlockSavingError="Failed to save unlocked content:",
recSavingError="Failed to save record:", recSavingError="Failed to save record:",
ai_fixed="AI is incompatible with fixed sequence",
ai_prebag="AI is incompatible with custom sequence",
switchSpawnSFX="Switch on spawn SFX to play", switchSpawnSFX="Switch on spawn SFX to play",
needRestart="Effective after restart", needRestart="Effective after restart",
copySuccess="Copied successfully", copySuccess="Copied successfully",
dataCorrupted="Data corrupted", dataCorrupted="Data corrupted",
VKTchW="Touch Weight", VKTchW="Touch Weight",
VKOrgW="Origion Weight", VKOrgW="Origin Weight",
VKCurW="Cur. Pos. Weight", VKCurW="Cur. Pos. Weight",
noScore="No Scores Yet", noScore="No Scores Yet",
highScore="Personal Bests", highScore="Personal Bests",
@@ -1062,7 +1066,7 @@ local langList={
radar={"DEF","OFF","ATK","SEND","SPD","DIG"}, radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={ radarData={
"D'PM", "D'PM",
"OPM", "ADPM",
"APM", "APM",
"SPM", "SPM",
"L'PM", "L'PM",
@@ -1088,11 +1092,11 @@ local langList={
"This is just an ordinary block game, not a certain one.", "This is just an ordinary block game, not a certain one.",
"It plays like TO/C2/KOS/TGM3 and others.", "It plays like TO/C2/KOS/TGM3 and others.",
"", "",
"bug reports/suggestions, sent to the author's testing group or email ~", "You can send bug reports or suggestions to the author's testing group or email ~",
"This is a free download available only through discord.gg/f9pUvkh", "This is a free download available only through discord.gg/f9pUvkh",
"The game downloaded from other sources may contain viruses,", "The game downloaded from other sources may contain viruses,",
"and only vibration & networking permissions are needed for mobile versions!", "and only vibration & networking permissions are needed for mobile versions!",
"The author is not responsible for any losses from modifying the game.", "The author is not responsible for any loss of data from modifying the game.",
}, },
staff={ staff={
"Author: MrZ E-mail: 1046101471@qq.com", "Author: MrZ E-mail: 1046101471@qq.com",
@@ -1101,17 +1105,19 @@ local langList={
"Program: MrZ, FinnTenzor", "Program: MrZ, FinnTenzor",
"Art: MrZ, (Gnyar)", "Art: MrZ, (Gnyar)",
"Music: MrZ, (T0722)", "Music: MrZ, (T0722)",
"Voice/ Sound: MrZ, Miya", "Voice & Sound: MrZ, Miya",
"Performance: 模电 HBM", "Performance: 模电, HBM",
"Test: 思竣 Web: 渣渣120", "Test: 思竣",
"Eng Doc: User670",
"Web: 渣渣120",
"", "",
"Special Thanks:", "Special Thanks:",
"Flyz, Farter, 蕴空之灵,", "Flyz, Farter, 蕴空之灵,",
"Teatube, [All test staff]", "Teatube, [All test staff]",
}, },
used="Tool used:\n\tBeepbox\n\tGFIE\n\tGoldwave\nLib used:\n\tCold_Clear[MinusKelvin]\n\tsimple-love-lights[dylhunn]", used="Tools used:\n\tBeepbox\n\tGFIE\n\tGoldwave\nLib used:\n\tCold_Clear[MinusKelvin]\n\tsimple-love-lights[dylhunn]",
support="Support author", support="Support author",
group="Official QQ Group(if not hacked):1080457319", group="Official QQ Group (if not hacked): 1127702001",
WidgetText={ WidgetText={
calculator={ calculator={
_1="1",_2="2",_3="3", _1="1",_2="2",_3="3",
@@ -1127,7 +1133,7 @@ local langList={
main={ main={
play="Play", play="Play",
setting="Settings", setting="Settings",
music="Music room", music="Music Room",
stat="Statistics", stat="Statistics",
help="Help", help="Help",
qplay="Q. Play", qplay="Q. Play",
@@ -1157,7 +1163,7 @@ local langList={
set4="Blind (4)", set4="Blind (4)",
set5="Master (5)", set5="Master (5)",
seq="Advanced(Q)", seq="Advanced(Q)",
draw="Field Edit(E)", draw="Edit Field (E)",
back="Back", back="Back",
}, },
sequence={ sequence={
@@ -1173,6 +1179,7 @@ local langList={
back="Back", back="Back",
}, },
draw={ draw={
b12="[ ]",
any="Erase", any="Erase",
space="×", space="×",
clear="Clear", clear="Clear",
@@ -1195,16 +1202,16 @@ local langList={
setting_game={ setting_game={
graphic="←Video", graphic="←Video",
sound="Sound→", sound="Sound→",
ctrl="Control settings", ctrl="Control Settings",
key="Key Mappings", key="Key Mappings",
touch="Touch Settings", touch="Touch Settings",
reTime="Start Delay", reTime="Start Delay",
maxNext="Next Queue Length", maxNext="Next Queue Length",
layout="Layout", layout="Layout",
autoPause="Pause when lose focus", autoPause="Pause when focus is lost",
swap="Key Combination (Change Atk. Mode)", swap="Key Combination (Change Atk. Mode)",
fine="Finesse Error Sound", fine="Finesse Error Sound",
lock="Game Lock(pw=626)", appLock="App Lock (Password: 626)",
back="Back", back="Back",
}, },
setting_video={ setting_video={
@@ -1214,18 +1221,19 @@ local langList={
smooth="Smooth drop", smooth="Smooth drop",
center="Center", center="Center",
grid="Grid", grid="Grid",
bagLine="Bag line", bagLine="Bag Line",
lockFX="Lock FX level", lockFX="Lock FX Level",
dropFX="Drop FX level", dropFX="Drop FX Level",
clearFX="Clear FX level", moveFX="Move FX Level",
shakeFX="Field Sway level", clearFX="Clear FX Level",
atkFX="ATK. FX level", shakeFX="Field Sway Level",
atkFX="ATK. FX Level",
frame="Render Frame Rate", frame="Render Frame Rate",
text="Action Text", text="Action Text",
warn="Death Alert", warn="Death Alert",
fullscreen="Full Screen", fullscreen="Full Screen",
bg="Background", bg="Background",
power="Power Info.", power="Power Info",
back="Back", back="Back",
}, },
setting_sound={ setting_sound={
@@ -1278,9 +1286,9 @@ local langList={
b13="Ins Down:", b14="Down 1:", b15="Down 4:", b16="Down 10:", b13="Ins Down:", b14="Down 1:", b15="Down 4:", b16="Down 10:",
b17="Left Drop:", b18="Right Drop:", b19="Left Zangi:", b20="Right Zangi:", b17="Left Drop:", b18="Right Drop:", b19="Left Zangi:", b20="Right Zangi:",
norm="Normal", norm="Normal",
pro="Professioanl", pro="Professional",
hide="Show Virtual Key", hide="Show Virtual Key",
track="Auto track", track="Auto Track",
sfx="SFX", sfx="SFX",
vib="VIB", vib="VIB",
icon="Icon", icon="Icon",
@@ -1315,9 +1323,9 @@ local langList={
}, },
debug={ debug={
reset="Reset?", reset="Reset?",
reset1="Reset rank", reset1="Reset ranks",
reset2="Reset data", reset2="Reset data",
reset3="Reset ALL", reset3="Reset all",
back="Back", back="Back",
}, },
}, },
@@ -1351,13 +1359,13 @@ local langList={
["master_beginner"]= {"Master", "LUNATIC", "For 20G beginners."}, ["master_beginner"]= {"Master", "LUNATIC", "For 20G beginners."},
["master_advance"]= {"Master", "ULTIMATE", "Professional 20G challenge!"}, ["master_advance"]= {"Master", "ULTIMATE", "Professional 20G challenge!"},
["master_final"]= {"Master", "FINAL", "20G: Unreachable end point!"}, ["master_final"]= {"Master", "FINAL", "20G: Unreachable end point!"},
["GM"]= {"GrandMaster", "GM", "To be Grand Master"}, ["GM"]= {"GrandMaster", "GM", "To be a Grand Master, take \nthis challenge."},
["blind_easy"]= {"Blind", "HALF", "For novice players."}, ["blind_easy"]= {"Blind", "HALF", "For novice players."},
["blind_normal"]= {"Blind", "ALL", "For intermediate players."}, ["blind_normal"]= {"Blind", "ALL", "For intermediate players."},
["blind_hard"]= {"Blind", "SUDDEN", "For experienced players."}, ["blind_hard"]= {"Blind", "SUDDEN", "For experienced players."},
["blind_lunatic"]= {"Blind", "SUDDEN+", "For professionals."}, ["blind_lunatic"]= {"Blind", "SUDDEN+", "For professionals."},
["blind_ultimate"]= {"Blind", "?", "R U Ready?"}, ["blind_ultimate"]= {"Blind", "?", "Are you ready?"},
["blind_wtf"]= {"Blind", "WTF", "i m not ready"}, ["blind_wtf"]= {"Blind", "WTF", "You're not ready."},
["classic_fast"]= {"Classic", "CTWC", "High-speed classic mode."}, ["classic_fast"]= {"Classic", "CTWC", "High-speed classic mode."},
["survivor_easy"]= {"Survivor", "EASY", "How long can you survive?"}, ["survivor_easy"]= {"Survivor", "EASY", "How long can you survive?"},
["survivor_normal"]= {"Survivor", "NORMAL", "How long can you survive?"}, ["survivor_normal"]= {"Survivor", "NORMAL", "How long can you survive?"},
@@ -1395,7 +1403,7 @@ local langList={
["infinite_dig"]= {"Infinite: Dig", "", "Dig, dig, dig."}, ["infinite_dig"]= {"Infinite: Dig", "", "Dig, dig, dig."},
["custom_clear"]= {"Custom", "NORMAL", "Draw something then clear it!!"}, ["custom_clear"]= {"Custom", "NORMAL", "Draw something then clear it!!"},
["custom_puzzle"]= {"Custom", "PUZZLE", "Draw something then stack it!!"}, ["custom_puzzle"]= {"Custom", "PUZZLE", "Draw something then stack it!!"},
["sprintPenta"]= {"Sprint", "Pentomino", "Puzzle-18"}, ["sprintPenta"]= {"Sprint", "Pentomino", "Clear 40 lines with pentominoes.\n18 pentominoes in each bag."},
}, },
}, },
{ {
@@ -1417,6 +1425,7 @@ local langList={
stage=function(n)return"::"..n.."::"end, stage=function(n)return"::"..n.."::"end,
great="!~", great="!~",
awesome="!!~", awesome="!!~",
almost="...!",
continue="~~", continue="~~",
maxspeed="!!!", maxspeed="!!!",
speedup="~!~", speedup="~!~",
@@ -1516,7 +1525,7 @@ local langList={
radar={"DEF","OFF","ATK","SEND","SPD","DIG"}, radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={ radarData={
"D'PM", "D'PM",
"OPM", "ADPM",
"APM", "APM",
"SPM", "SPM",
"L'PM", "L'PM",
@@ -1555,9 +1564,11 @@ local langList={
"Program: MrZ, FinnTenzor", "Program: MrZ, FinnTenzor",
"Art: MrZ, (Gnyar)", "Art: MrZ, (Gnyar)",
"Music: MrZ, (T0722)", "Music: MrZ, (T0722)",
"Voice/ Sound: MrZ, Miya", "Voice % Sound: MrZ, Miya",
"Performance: 模电 HBM", "Performance: 模电, HBM",
"Test: 思竣 Web: 渣渣120", "Test: 思竣",
"Eng Doc: User670",
"Web: 渣渣120",
"", "",
"Special Thanks:", "Special Thanks:",
"Flyz, Farter, 蕴空之灵,", "Flyz, Farter, 蕴空之灵,",
@@ -1565,7 +1576,7 @@ local langList={
}, },
used="Tool used:\n\tBeepbox\n\tGFIE\n\tGoldwave\nLib used:\n\tCold_Clear[MinusKelvin]\n\tsimple-love-lights[dylhunn]", used="Tool used:\n\tBeepbox\n\tGFIE\n\tGoldwave\nLib used:\n\tCold_Clear[MinusKelvin]\n\tsimple-love-lights[dylhunn]",
support="Support author", support="Support author",
group="Official QQ Group(if not hacked):1080457319", group="Official QQ Group(if not hacked):1127702001",
WidgetText={ WidgetText={
calculator={ calculator={
_1="1",_2="2",_3="3", _1="1",_2="2",_3="3",
@@ -1627,6 +1638,7 @@ local langList={
back="X", back="X",
}, },
draw={ draw={
b12="[ ]",
any="_", any="_",
space="×", space="×",
clear="XXX", clear="XXX",
@@ -1658,7 +1670,7 @@ local langList={
autoPause="A||", autoPause="A||",
swap="=+=+=", swap="=+=+=",
fine="!#!X #!#", fine="!#!X #!#",
lock="?XX(=626)", appLock="?XX(=626)",
back="X", back="X",
}, },
setting_video={ setting_video={
@@ -1671,6 +1683,7 @@ local langList={
bagLine="123|123", bagLine="123|123",
lockFX="↓_~", lockFX="↓_~",
dropFX="↓~", dropFX="↓~",
moveFX="←→~",
clearFX="↓↓↓~", clearFX="↓↓↓~",
shakeFX="~|~|~", shakeFX="~|~|~",
atkFX="→→~", atkFX="→→~",
@@ -1871,6 +1884,7 @@ local langList={
stage=function(n)return"关卡 "..n end, stage=function(n)return"关卡 "..n end,
great="不错的", great="不错的",
awesome="您很强", awesome="您很强",
almost="太舒服了",
continue="您继续", continue="您继续",
maxspeed="速度封顶", maxspeed="速度封顶",
speedup="速度加快", speedup="速度加快",
@@ -1938,8 +1952,6 @@ local langList={
unlockSavingError="解锁保存失败:", unlockSavingError="解锁保存失败:",
recSavingError="纪录保存失败:", recSavingError="纪录保存失败:",
ai_fixed="不能同时开启AI和固定序列",
ai_prebag="不能同时开启AI和自定义序列",
switchSpawnSFX="请开启方块出生音效", switchSpawnSFX="请开启方块出生音效",
needRestart="重新开始以生效", needRestart="重新开始以生效",
@@ -1979,7 +1991,7 @@ local langList={
radar={"DEF","OFF","ATK","SEND","SPD","DIG"}, radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={ radarData={
"D'PM", "D'PM",
"OPM", "ADPM",
"APM", "APM",
"SPM", "SPM",
"L'PM", "L'PM",
@@ -1997,8 +2009,8 @@ local langList={
"挖掘/挖掘攻击:", "挖掘/挖掘攻击:",
"效率/挖掘效率:", "效率/挖掘效率:",
"多余操作/极简率:", "多余操作/极简率:",
"满贯/大满贯:", "牛逼/很牛逼:",
"全/半清:", "消光/消半截:",
}, },
help={ help={
"既然你能玩到这个游戏,应该也不需要什么帮助吧?", "既然你能玩到这个游戏,应该也不需要什么帮助吧?",
@@ -2007,7 +2019,7 @@ local langList={
"", "",
"使用LOVE2D引擎", "使用LOVE2D引擎",
"错误或者建议请附带截图发送到内测群或者作者邮箱~", "错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过内测群1080457319进行免费下载/更新", "仅通过内测群1127702001进行免费下载/更新",
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!", "其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)", "若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~", "请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -2037,7 +2049,7 @@ local langList={
simple-love-lights[dylhunn] simple-love-lights[dylhunn]
]], ]],
support="支持作者", support="支持作者",
group="官方QQ群(如果没有被暗改的话就是这个):1080457319", group="官方QQ群(如果没有被暗改的话就是这个):1127702001",
WidgetText={ WidgetText={
calculator={ calculator={
_1="1",_2="2",_3="3", _1="1",_2="2",_3="3",
@@ -2099,6 +2111,7 @@ local langList={
back="返回", back="返回",
}, },
draw={ draw={
b12="[ ]",
any="不定", any="不定",
space="×", space="×",
clear="清除", clear="清除",
@@ -2130,7 +2143,7 @@ local langList={
autoPause="失去焦点自动暂停", autoPause="失去焦点自动暂停",
swap="组合键切换攻击模式", swap="组合键切换攻击模式",
fine="极简操作提示音", fine="极简操作提示音",
lock="家长锁(密码626)", appLock="家长锁(密码626)",
back="返回", back="返回",
}, },
setting_video={ setting_video={
@@ -2143,6 +2156,7 @@ local langList={
bagLine="包分界线", bagLine="包分界线",
lockFX="锁定特效等级", lockFX="锁定特效等级",
dropFX="下落特效等级", dropFX="下落特效等级",
moveFX="移动特效等级",
clearFX="消除特效等级", clearFX="消除特效等级",
shakeFX="晃动特效等级", shakeFX="晃动特效等级",
atkFX="攻击特效等级", atkFX="攻击特效等级",

View File

@@ -9,11 +9,11 @@ local mStr=mStr
local scr=scr local scr=scr
local scs=require("parts/spinCenters") local scs=require("parts/spinCenters")
local modeRankColor={ local modeRankColor={
color.bronze, --Rank1 color.dRed, --D
color.lGrey, --Rank2 color.dOrange, --C
color.lYellow, --Rank3 color.lYellow, --B
color.lPurple, --Rank4 color.lBlue, --A
color.lCyan, --Rank5 color.lCyan, --S
color.lGreen, --Special color.lGreen, --Special
} }
local rankString={ local rankString={
@@ -101,8 +101,9 @@ function Pnt.calculator()
setFont(45) setFont(45)
if S.reg then gc.printf(S.reg,0,100,720,"right")end if S.reg then gc.printf(S.reg,0,100,720,"right")end
if S.val then gc.printf(S.val,0,150,720,"right")end if S.val then gc.printf(S.val,0,150,720,"right")end
setFont(50)
if S.sym then gc.print(S.sym,126,150)end if S.sym then setFont(50)gc.print(S.sym,126,150)end
if S.pass then setFont(40)mStr(S.tip,640,10)end
end end
function Pnt.load() function Pnt.load()
local S=sceneTemp local S=sceneTemp
@@ -111,6 +112,7 @@ function Pnt.load()
gc.rectangle("fill",300,330,S.cur/S.tar*680,60,5) gc.rectangle("fill",300,330,S.cur/S.tar*680,60,5)
gc.setColor(1,1,1) gc.setColor(1,1,1)
gc.rectangle("line",300,330,680,60,5) gc.rectangle("line",300,330,680,60,5)
if not setting.appLock then
setFont(35) setFont(35)
gc.print(text.load[S.phase],340,335) gc.print(text.load[S.phase],340,335)
if S.phase~=0 then if S.phase~=0 then
@@ -118,6 +120,7 @@ function Pnt.load()
end end
setFont(25) setFont(25)
mStr(S.tip,640,400) mStr(S.tip,640,400)
end
end end
local titleTransform={ local titleTransform={
@@ -312,10 +315,8 @@ end
function Pnt.music() function Pnt.music()
gc.setColor(1,1,1,.3+sin(Timer()*5)*.2) gc.setColor(1,1,1,.3+sin(Timer()*5)*.2)
gc.rectangle("fill",45,98+30*sceneTemp,250,30) gc.rectangle("fill",45,98+30*sceneTemp,250,30)
gc.setColor(.7,.7,.7) gc.setColor(.7,.7,.7)gc.draw(drawableText.musicRoom,20,20)
gc.draw(drawableText.musicRoom,20,20) gc.setColor(1,1,1)gc.draw(drawableText.musicRoom,22,23)
gc.setColor(1,1,1)
gc.draw(drawableText.musicRoom,22,23)
gc.draw(drawableText.nowPlaying,490,390) gc.draw(drawableText.nowPlaying,490,390)
setFont(30) setFont(30)
for i=1,BGM.len do for i=1,BGM.len do
@@ -641,7 +642,7 @@ function Pnt.setting_video()
mText(drawableText.setting_video,640,15) mText(drawableText.setting_video,640,15)
end end
function Pnt.setting_sound() function Pnt.setting_sound()
gc.setColor(1,1,1,.8) gc.setColor(1,1,1)
mText(drawableText.setting_sound,640,15) mText(drawableText.setting_sound,640,15)
local t=Timer() local t=Timer()
local _=sceneTemp.jump local _=sceneTemp.jump
@@ -674,7 +675,8 @@ function Pnt.setting_control()
gc.line(950,530,950,630) gc.line(950,530,950,630)
--Texts --Texts
gc.draw(drawableText.setting_control,80,50) gc.setColor(.7,.7,.7)gc.draw(drawableText.setting_control,80,50)
gc.setColor(1,1,1)gc.draw(drawableText.setting_control,80,50)
setFont(50) setFont(50)
gc.printf(text.preview,320,540,200,"right") gc.printf(text.preview,320,540,200,"right")
@@ -744,7 +746,8 @@ function Pnt.setting_key()
gc.draw(drawableText.ctrlSetHelp,50,650) gc.draw(drawableText.ctrlSetHelp,50,650)
end end
function Pnt.setting_skin() function Pnt.setting_skin()
gc.setColor(1,1,1) gc.setColor(.7,.7,.7)gc.draw(drawableText.setting_skin,80,50)
gc.setColor(1,1,1)gc.draw(drawableText.setting_skin,80,50)
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]
@@ -760,7 +763,6 @@ function Pnt.setting_skin()
for i=1,6 do for i=1,6 do
gc.draw(blockSkin[11+i],570+60*i,610,nil,2) gc.draw(blockSkin[11+i],570+60*i,610,nil,2)
end end
gc.draw(drawableText.setting_skin,80,50)
end end
function Pnt.setting_touch() function Pnt.setting_touch()
gc.setColor(1,1,1) gc.setColor(1,1,1)

View File

@@ -13,14 +13,15 @@ function sceneInit.calculator()
val=0, val=0,
sym=false, sym=false,
pass=false, pass=false,
tip=require("parts/getTip"),
} }
end end
function sceneInit.load() function sceneInit.load()
sceneTemp={ sceneTemp={
phase=1,--Loading stage phase=1,--Loading stage
cur=1,--Counter cur=1,--Counter
tar=#VOC.name,--Loading bar lenth(current) tar=#VOC.name,--Loading bar length(current)
tip=require("parts/getTip"), tip=setting.appLock or require("parts/getTip"),
list={ list={
#VOC.name, #VOC.name,
#BGM.list, #BGM.list,
@@ -48,16 +49,9 @@ function sceneInit.main()
BG.set("space") BG.set("space")
BGM.play("blank") BGM.play("blank")
game.frame=0
game.recording=false
game.replaying=false
game.seed=1046101471
game.rec={}
modeEnv={} modeEnv={}
destroyPlayers()
--Create demo player --Create demo player
destroyPlayers()
PLY.newDemoPlayer(1,900,35,1.1) PLY.newDemoPlayer(1,900,35,1.1)
end end
function sceneInit.music() function sceneInit.music()
@@ -131,20 +125,20 @@ function sceneInit.pause(org)
format("%d(%d-%d)",S.pend,S.recv,S.recv-S.pend), format("%d(%d-%d)",S.pend,S.recv,S.recv-S.pend),
format("%d/%d/%d/%d",S.clears[1],S.clears[2],S.clears[3],S.clears[4]), format("%d/%d/%d/%d",S.clears[1],S.clears[2],S.clears[3],S.clears[4]),
format("(%d)/%d/%d/%d",S.spins[1],S.spins[2],S.spins[3],S.spins[4]), format("(%d)/%d/%d/%d",S.spins[1],S.spins[2],S.spins[3],S.spins[4]),
format("%d/%d;%d/%d",S.b2b,S.b3b,S.pc,S.hpc), format("%d/%d ; %d/%d",S.b2b,S.b3b,S.pc,S.hpc),
format("%d[%.2f%%]",S.extraPiece,100*max(1-S.extraRate/S.piece,0)), format("%d [%.2f%%]",S.extraPiece,100*max(1-S.extraRate/S.piece,0)),
}, },
--From right-down, 60 degree each --From right-down, 60 degree each
radar={ radar={
(S.off+S.dig)/S.time*60,--DefPM (S.off+S.dig)/S.time*60,--DefPM
(S.off)/S.time*60, --OffPM (S.send+S.dig)/S.time*60,--ADPM
S.atk/S.time*60, --AtkPM S.atk/S.time*60, --AtkPM
S.send/S.time*60, --SendPM S.send/S.time*60, --SendPM
S.piece/S.time*24, --LinePM S.piece/S.time*24, --LinePM
S.dig/S.time*60, --DigPM S.dig/S.time*60, --DigPM
}, },
val={1/80,1/40,1/60,1/60,1/100,1/40}, val={1/80,1/80,1/80,1/60,1/100,1/40},
timing=org=="play", timing=org=="play",
} }
local _=sceneTemp local _=sceneTemp
@@ -204,7 +198,7 @@ function sceneInit.setting_control()
dir=1, dir=1,
wait=30, wait=30,
} }
BG.set("game1") BG.set("bg1")
end end
function sceneInit.setting_key() function sceneInit.setting_key()
sceneTemp={ sceneTemp={
@@ -214,7 +208,7 @@ function sceneInit.setting_key()
} }
end end
function sceneInit.setting_touch() function sceneInit.setting_touch()
BG.set("game3") BG.set("rainbow")
sceneTemp={ sceneTemp={
default=1, default=1,
snap=1, snap=1,
@@ -271,7 +265,7 @@ function sceneInit.stat()
end end
end end
function sceneInit.history() function sceneInit.history()
BG.set("game3") BG.set("rainbow")
sceneTemp={ sceneTemp={
text=require("parts/updateLog"),--Text list text=require("parts/updateLog"),--Text list
pos=1,--Scroll pos pos=1,--Scroll pos
@@ -329,7 +323,7 @@ end
local SCN={ local SCN={
cur="load",--Current scene cur="load",--Current scene
swapping=false,--If Swapping swapping=false,--If Swapping
swap={ stat={
tar=nil, --Swapping target tar=nil, --Swapping target
style=nil, --Swapping style style=nil, --Swapping style
mid=nil, --Loading point mid=nil, --Loading point
@@ -340,7 +334,7 @@ local SCN={
}--Scene datas, returned }--Scene datas, returned
function SCN.swapUpdate() function SCN.swapUpdate()
local S=SCN.swap local S=SCN.stat
S.time=S.time-1 S.time=S.time-1
if S.time==S.mid then if S.time==S.mid then
SCN.init(S.tar,SCN.cur) SCN.init(S.tar,SCN.cur)
@@ -395,7 +389,7 @@ local swap={
end}, end},
}--Scene swapping animations }--Scene swapping animations
function SCN.swapTo(tar,style)--Parallel scene swapping, cannot back function SCN.swapTo(tar,style)--Parallel scene swapping, cannot back
local S=SCN.swap local S=SCN.stat
if not SCN.swapping and tar~=SCN.cur then if not SCN.swapping and tar~=SCN.cur then
SCN.swapping=true SCN.swapping=true
if not style then style="fade"end if not style then style="fade"end
@@ -407,7 +401,7 @@ function SCN.swapTo(tar,style)--Parallel scene swapping, cannot back
S.draw=swap[3] S.draw=swap[3]
end end
end end
function SCN.goto(tar,style)--Normal scene swapping, can back function SCN.go(tar,style)--Normal scene swapping, can back
SCN.push()SCN.swapTo(tar,style) SCN.push()SCN.swapTo(tar,style)
end end
function SCN.back() function SCN.back()

View File

@@ -39,18 +39,15 @@ function Tmr.load()
SKIN.load() SKIN.load()
stat.run=stat.run+1 stat.run=stat.run+1
-------------------------- --------------------------
if not setting.appLock then
SFX.play("welcome_sfx") SFX.play("welcome_sfx")
VOC.play("welcome") VOC.play("welcome")
end
else else
S.cur=S.cur+1 S.cur=S.cur+1
S.tar=S.cur S.tar=S.cur
if S.cur>62.6 then if S.cur>62.6 then
if newVersionLaunch then SCN.swapTo(setting.appLock and "calculator"or"intro","none")
SCN.push("intro","fade")
SCN.swapTo("history","fade")
else
SCN.swapTo("intro","none")
end
end end
loadingFinished=true loadingFinished=true
return return
@@ -131,7 +128,7 @@ function Tmr.mode(dt)
cam.x1=cam.x1*.85+x*.15 cam.x1=cam.x1*.85+x*.15
cam.y1=cam.y1*.85+y*.15 cam.y1=cam.y1*.85+y*.15
cam.k1=cam.k1*.85+k*.15 cam.k1=cam.k1*.85+k*.15
local _=SCN.swap.tar local _=SCN.stat.tar
cam.zoomMethod=_=="play"and 1 or _=="mode"and 2 cam.zoomMethod=_=="play"and 1 or _=="mode"and 2
if cam.zoomMethod==1 then if cam.zoomMethod==1 then
if cam.sel then if cam.sel then
@@ -354,8 +351,6 @@ function Tmr.staff(dt)
S.time=S.time+S.v*dt S.time=S.time+S.v*dt
if S.time>45 then if S.time>45 then
S.time=45 S.time=45
elseif S.time<-10 then
S.time=-10
end end
end end
return Tmr return Tmr

View File

@@ -99,37 +99,37 @@ newSlider=WIDGET.newSlider
local Widgets={ local Widgets={
load={},intro={},quit={}, load={},intro={},quit={},
calculator={ calculator={
newKey({name="_1", x=300,y=300,w=90,h=90, color="white", font=50,code=pressKey("1")}), newKey({name="_1", x=150,y=300,w=90,h=90, color="white", font=50,code=pressKey("1")}),
newKey({name="_2", x=400,y=300,w=90,h=90, color="white", font=50,code=pressKey("2")}), newKey({name="_2", x=250,y=300,w=90,h=90, color="white", font=50,code=pressKey("2")}),
newKey({name="_3", x=500,y=300,w=90,h=90, color="white", font=50,code=pressKey("3")}), newKey({name="_3", x=350,y=300,w=90,h=90, color="white", font=50,code=pressKey("3")}),
newKey({name="_4", x=300,y=400,w=90,h=90, color="white", font=50,code=pressKey("4")}), newKey({name="_4", x=150,y=400,w=90,h=90, color="white", font=50,code=pressKey("4")}),
newKey({name="_5", x=400,y=400,w=90,h=90, color="white", font=50,code=pressKey("5")}), newKey({name="_5", x=250,y=400,w=90,h=90, color="white", font=50,code=pressKey("5")}),
newKey({name="_6", x=500,y=400,w=90,h=90, color="white", font=50,code=pressKey("6")}), newKey({name="_6", x=350,y=400,w=90,h=90, color="white", font=50,code=pressKey("6")}),
newKey({name="_7", x=300,y=500,w=90,h=90, color="white", font=50,code=pressKey("7")}), newKey({name="_7", x=150,y=500,w=90,h=90, color="white", font=50,code=pressKey("7")}),
newKey({name="_8", x=400,y=500,w=90,h=90, color="white", font=50,code=pressKey("8")}), newKey({name="_8", x=250,y=500,w=90,h=90, color="white", font=50,code=pressKey("8")}),
newKey({name="_9", x=500,y=500,w=90,h=90, color="white", font=50,code=pressKey("9")}), newKey({name="_9", x=350,y=500,w=90,h=90, color="white", font=50,code=pressKey("9")}),
newKey({name="_0", x=300,y=600,w=90,h=90, color="white", font=50,code=pressKey("0")}), newKey({name="_0", x=150,y=600,w=90,h=90, color="white", font=50,code=pressKey("0")}),
newKey({name="<", x=400,y=600,w=90,h=90, color="lRed", font=50,code=pressKey("backspace")}), newKey({name="<", x=250,y=600,w=90,h=90, color="lRed", font=50,code=pressKey("backspace")}),
newKey({name="=", x=500,y=600,w=90,h=90, color="lYellow",font=50,code=pressKey("return")}), newKey({name="=", x=350,y=600,w=90,h=90, color="lYellow",font=50,code=pressKey("return")}),
newKey({name="+", x=600,y=300,w=90,h=90, color="lBlue", font=50,code=pressKey("+")}), newKey({name="+", x=450,y=300,w=90,h=90, color="lBlue", font=50,code=pressKey("+")}),
newKey({name="-", x=600,y=400,w=90,h=90, color="lBlue", font=50,code=pressKey("-")}), newKey({name="-", x=450,y=400,w=90,h=90, color="lBlue", font=50,code=pressKey("-")}),
newKey({name="*", x=600,y=500,w=90,h=90, color="lBlue", font=50,code=pressKey("*")}), newKey({name="*", x=450,y=500,w=90,h=90, color="lBlue", font=50,code=pressKey("*")}),
newKey({name="/", x=600,y=600,w=90,h=90, color="lBlue", font=50,code=pressKey("/")}), newKey({name="/", x=450,y=600,w=90,h=90, color="lBlue", font=50,code=pressKey("/")}),
newButton({name="play", x=800,y=600,w=180,h=90, color="lGreen", font=40,code=pressKey("space"),hide=function()return not sceneTemp.pass end}), newButton({name="play", x=640,y=600,w=180,h=90, color="lGreen", font=40,code=pressKey("space"),hide=function()return not sceneTemp.pass end}),
}, },
main={ main={
newButton({name="play", x=150,y=280,w=200,h=160,color="lRed", font=55,code=function()SCN.goto("mode")end}), newButton({name="play", x=150,y=280,w=200,h=160,color="lRed", font=55,code=function()SCN.go("mode")end}),
newButton({name="setting", x=370,y=280,w=200,h=160,color="lBlue", font=45,code=function()SCN.goto("setting_game")end}), newButton({name="setting", x=370,y=280,w=200,h=160,color="lBlue", font=45,code=function()SCN.go("setting_game")end}),
newButton({name="music", x=590,y=280,w=200,h=160,color="lPurple",font=32,code=function()SCN.goto("music")end}), newButton({name="music", x=590,y=280,w=200,h=160,color="lPurple",font=32,code=function()SCN.go("music")end}),
newButton({name="help", x=150,y=460,w=200,h=160,color="lYellow",font=50,code=function()SCN.goto("help")end}), newButton({name="help", x=150,y=460,w=200,h=160,color="lYellow",font=50,code=function()SCN.go("help")end}),
newButton({name="stat", x=370,y=460,w=200,h=160,color="lCyan", font=43,code=function()SCN.goto("stat")end}), newButton({name="stat", x=370,y=460,w=200,h=160,color="lCyan", font=43,code=function()SCN.go("stat")end}),
newButton({name="qplay", x=590,y=460,w=200,h=160,color="lOrange",font=43,code=function()SCN.push()loadGame(stat.lastPlay,true)end}), newButton({name="qplay", x=590,y=460,w=200,h=160,color="lOrange",font=43,code=function()SCN.push()loadGame(stat.lastPlay,true)end}),
newButton({name="lang", x=150,y=610,w=160,h=100,color="lGreen", font=45,code=function()SCN.goto("setting_lang")end}), newButton({name="lang", x=150,y=610,w=160,h=100,color="lGreen", font=45,code=function()SCN.go("setting_lang")end}),
newButton({name="quit", x=590,y=610,w=160,h=100,color="lGrey", font=45,code=function()VOC.play("bye")SCN.swapTo("quit","slowFade")end}), newButton({name="quit", x=590,y=610,w=160,h=100,color="lGrey", font=45,code=function()VOC.play("bye")SCN.swapTo("quit","slowFade")end}),
}, },
mode={ mode={
newButton({name="setting", x=1100,y=540,w=240,h=90,color="lGreen", font=40,code=function() newButton({name="setting", x=1100,y=540,w=240,h=90,color="lGreen", font=40,code=function()
SCN.goto("custom") SCN.go("custom")
end, end,
hide=function() hide=function()
return mapCam.sel~="custom_clear" and mapCam.sel~="custom_puzzle" return mapCam.sel~="custom_clear" and mapCam.sel~="custom_puzzle"
@@ -238,18 +238,18 @@ local Widgets={
setting_game={ setting_game={
newButton({name="graphic", x=200, y=80, w=240,h=80, color="lCyan", font=35,code=function()SCN.swapTo("setting_video","swipe")end}), newButton({name="graphic", x=200, y=80, w=240,h=80, color="lCyan", font=35,code=function()SCN.swapTo("setting_video","swipe")end}),
newButton({name="sound", x=1080, y=80, w=240,h=80, color="lCyan", font=35,code=function()SCN.swapTo("setting_sound","swipe")end}), newButton({name="sound", x=1080, y=80, w=240,h=80, color="lCyan", font=35,code=function()SCN.swapTo("setting_sound","swipe")end}),
newButton({name="ctrl", x=290, y=220, w=320,h=80, color="lYellow",font=35,code=function()SCN.goto("setting_control")end}), newButton({name="ctrl", x=290, y=220, w=320,h=80, color="lYellow",font=35,code=function()SCN.go("setting_control")end}),
newButton({name="key", x=640, y=220, w=320,h=80, color="lGreen", font=35,code=function()SCN.goto("setting_key")end}), newButton({name="key", x=640, y=220, w=320,h=80, color="lGreen", font=35,code=function()SCN.go("setting_key")end}),
newButton({name="touch", x=990, y=220, w=320,h=80, color="lBlue", font=35,code=function()SCN.goto("setting_touch")end}), newButton({name="touch", x=990, y=220, w=320,h=80, color="lBlue", font=35,code=function()SCN.go("setting_touch")end}),
newSlider({name="reTime", x=350, y=340, w=300,unit=10, font=30,disp=SETval("reTime"), code=SETsto("reTime")}), newSlider({name="reTime", x=350, y=340, w=300,unit=10, font=30,disp=SETval("reTime"), code=SETsto("reTime")}),
newSlider({name="maxNext", x=350, y=440, w=300,unit=6, font=30,disp=SETval("maxNext"), code=SETsto("maxNext")}), newSlider({name="maxNext", x=350, y=440, w=300,unit=6, font=30,disp=SETval("maxNext"), code=SETsto("maxNext")}),
newButton({name="layout", x=460, y=540, w=140,h=70,color="white", font=35,code=function() newButton({name="layout", x=460, y=540, w=140,h=70,color="white", font=35,code=function()
SCN.goto("setting_skin") SCN.go("setting_skin")
end}), end}),
newSwitch({name="autoPause",x=1080, y=320, font=20,disp=SETval("autoPause"), code=SETrev("autoPause")}), newSwitch({name="autoPause",x=1080, y=320, font=20,disp=SETval("autoPause"), code=SETrev("autoPause")}),
newSwitch({name="swap", x=1080, y=380, font=20,disp=SETval("swap"), code=SETrev("swap")}), newSwitch({name="swap", x=1080, y=380, font=20,disp=SETval("swap"), code=SETrev("swap")}),
newSwitch({name="fine", x=1080, y=440, font=20,disp=SETval("fine"), code=SETrev("fine")}), newSwitch({name="fine", x=1080, y=440, font=20,disp=SETval("fine"), code=SETrev("fine")}),
newSwitch({name="lock", x=1080, y=500, font=20,disp=SETval("lock"), code=SETrev("lock")}), newSwitch({name="appLock", x=1080, y=500, font=20,disp=SETval("appLock"), code=SETrev("appLock")}),
newButton({name="back", x=1140, y=650, w=200,h=80,color="white", font=40,code=BACK}), newButton({name="back", x=1140, y=650, w=200,h=80,color="white", font=40,code=BACK}),
}, },
setting_video={ setting_video={
@@ -260,11 +260,12 @@ local Widgets={
newSwitch({name="center", x=500, y=180,font=35, disp=SETval("center"), code=SETrev("center")}), newSwitch({name="center", x=500, y=180,font=35, disp=SETval("center"), code=SETrev("center")}),
newSwitch({name="grid", x=500, y=260,font=35, disp=SETval("grid"), code=SETrev("grid")}), newSwitch({name="grid", x=500, y=260,font=35, disp=SETval("grid"), code=SETrev("grid")}),
newSwitch({name="bagLine", x=730, y=180,font=30, disp=SETval("bagLine"), code=SETrev("bagLine")}), newSwitch({name="bagLine", x=730, y=180,font=30, disp=SETval("bagLine"), code=SETrev("bagLine")}),
newSlider({name="lockFX", x=350, y=340,w=373,unit=3, font=32,disp=SETval("lockFX"), code=SETsto("lockFX")}), newSlider({name="lockFX", x=350, y=340,w=373,unit=5, font=32,disp=SETval("lockFX"), code=SETsto("lockFX")}),
newSlider({name="dropFX", x=350, y=400,w=373,unit=5, font=32,disp=SETval("dropFX"), code=SETsto("dropFX")}), newSlider({name="dropFX", x=350, y=390,w=373,unit=5, font=32,disp=SETval("dropFX"), code=SETsto("dropFX")}),
newSlider({name="clearFX", x=350, y=460,w=373,unit=3, font=32,disp=SETval("clearFX"), code=SETsto("clearFX")}), newSlider({name="moveFX", x=350, y=440,w=373,unit=5, font=32,disp=SETval("moveFX"), code=SETsto("moveFX")}),
newSlider({name="shakeFX", x=350, y=520,w=373,unit=5, font=32,disp=SETval("shakeFX"), code=SETsto("shakeFX")}), newSlider({name="clearFX", x=350, y=490,w=373,unit=5, font=32,disp=SETval("clearFX"), code=SETsto("clearFX")}),
newSlider({name="atkFX", x=350, y=580,w=373,unit=5, font=32,disp=SETval("atkFX"), code=SETsto("atkFX")}), newSlider({name="shakeFX", x=350, y=540,w=373,unit=5, font=32,disp=SETval("shakeFX"), code=SETsto("shakeFX")}),
newSlider({name="atkFX", x=350, y=590,w=373,unit=5, font=32,disp=SETval("atkFX"), code=SETsto("atkFX")}),
newSlider({name="frame", x=350, y=640,w=373,unit=10,font=30, newSlider({name="frame", x=350, y=640,w=373,unit=10,font=30,
disp=function() disp=function()
return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4 return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4
@@ -390,7 +391,7 @@ local Widgets={
end}), end}),
newButton({name="option", x=520,y=180,w=170,h=80,color="white",font=40, newButton({name="option", x=520,y=180,w=170,h=80,color="white",font=40,
code=function() code=function()
SCN.goto("setting_touchSwitch") SCN.go("setting_touchSwitch")
end}), end}),
newButton({name="back", x=760,y=180,w=170,h=80,color="white",font=40,code=BACK}), newButton({name="back", x=760,y=180,w=170,h=80,color="white",font=40,code=BACK}),
newSlider({name="size", x=450,y=265,w=460,unit=14,font=40, newSlider({name="size", x=450,y=265,w=460,unit=14,font=40,
@@ -436,7 +437,7 @@ local Widgets={
newSwitch({name="icon", x=850, y=300, font=40,disp=SETval("VKIcon"),code=SETrev("VKIcon")}), newSwitch({name="icon", x=850, y=300, font=40,disp=SETval("VKIcon"),code=SETrev("VKIcon")}),
newButton({name="tkset", x=1120, y=420, w=240,h=80,color="white",font=32, newButton({name="tkset", x=1120, y=420, w=240,h=80,color="white",font=32,
code=function() code=function()
SCN.goto("setting_trackSetting") SCN.go("setting_trackSetting")
end, end,
hide=function() hide=function()
return not setting.VKTrack return not setting.VKTrack
@@ -459,8 +460,8 @@ local Widgets={
newButton({name="back", x=640, y=600,w=200,h=80,color="white",font=40,code=BACK}), newButton({name="back", x=640, y=600,w=200,h=80,color="white",font=40,code=BACK}),
}, },
help={ help={
newButton({name="staff", x=980, y=500,w=150,h=80,color="white",font=32,code=function()SCN.goto("staff")end}), newButton({name="staff", x=980, y=500,w=150,h=80,color="white",font=32,code=function()SCN.go("staff")end}),
newButton({name="his", x=1160, y=500,w=150,h=80,color="white",font=32,code=function()SCN.goto("history")end}), newButton({name="his", x=1160, y=500,w=150,h=80,color="white",font=32,code=function()SCN.go("history")end}),
newButton({name="qq", x=1070, y=600,w=200,h=80,color="white",font=32,code=function()love.system.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,hide=mobileHide}), newButton({name="qq", x=1070, y=600,w=200,h=80,color="white",font=32,code=function()love.system.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,hide=mobileHide}),
newButton({name="back", x=640, y=600,w=200,h=80,color="white",font=40,code=BACK}), newButton({name="back", x=640, y=600,w=200,h=80,color="white",font=40,code=BACK}),
}, },

View File

@@ -1,4 +1,4 @@
gameVersion="Alpha V0.10.3" gameVersion="Alpha V0.10.6"
function love.conf(t) function love.conf(t)
t.identity="Techmino"--Saving folder t.identity="Techmino"--Saving folder
t.version="11.1" t.version="11.1"

BIN
font.ttf

Binary file not shown.

View File

@@ -3,9 +3,9 @@
/_ __/___ _____ / /_ ____ ___ (_)____ ____ /_ __/___ _____ / /_ ____ ___ (_)____ ____
/ / / _ \ / ___// __ \ / __ `__ \ / // __ \ / __ \ / / / _ \ / ___// __ \ / __ `__ \ / // __ \ / __ \
/ / / __// /__ / / / // / / / / // // / / // /_/ / / / / __// /__ / / / // / / / / // // / / // /_/ /
/_/ \___/ \___//_/ /_//_/ /_/ /_//_//_/ /_/ \____/ /_/ \___/ \___//_/ /_//_/ /_/ /_//_//_/ /_/ \____/
Techmino is my first "huge project" Techmino is my first "huge project"
optimization is welcomed if you also love tetromino game optimization is welcomed if you also love tetromino game
]]-- ]]--
--? --?
@@ -19,7 +19,6 @@ love.keyboard.setTextInput(false)
love.mouse.setVisible(false) love.mouse.setVisible(false)
system=love.system.getOS() system=love.system.getOS()
game={}
mapCam={ mapCam={
sel=nil,--Selected mode ID sel=nil,--Selected mode ID
@@ -42,7 +41,7 @@ preBag={}
game={ game={
frame=0, --Frame count frame=0, --Frame count
result=0, --Game result result=false, --Game result (string)
pauseTime=0, --Time paused pauseTime=0, --Time paused
pauseCount=0, --Pausing count pauseCount=0, --Pausing count
garbageSpeed=1, --Garbage timing speed garbageSpeed=1, --Garbage timing speed
@@ -50,7 +49,16 @@ game={
warnLVL=0, --Warning level (show) warnLVL=0, --Warning level (show)
recording=false, --If recording recording=false, --If recording
replaying=false, --If replaying replaying=false, --If replaying
rec={}, --Recording list, key-time seed=math.random(999999999),--Game seed
setting={}, --Game settings
rec={}, --Recording list, key,time,key,time...
--Data for royale mode
stage=nil, --Game stage
mostBadge=nil, --Most badge owner
secBadge=nil, --Second badge owner
mostDangerous=nil, --Most dangerous player
secDangerous=nil, --Second dangerous player
}--Global game data }--Global game data
players={alive={}}--Players data players={alive={}}--Players data
curMode=nil--Current mode object curMode=nil--Current mode object
@@ -91,6 +99,9 @@ else
setting.swap=false setting.swap=false
setting.vib=2 setting.vib=2
setting.powerInfo=true setting.powerInfo=true
setting.fullscreen=true
love.window.setFullscreen(true)
love.resize(love.graphics.getWidth(),love.graphics.getHeight())
end end
end end
LANG.set(setting.lang) LANG.set(setting.lang)
@@ -105,32 +116,34 @@ if fs.getInfo("tech_ultimate.dat")then fs.remove("tech_ultimate.dat")end
if fs.getInfo("tech_ultimate+.dat")then fs.remove("tech_ultimate+.dat")end if fs.getInfo("tech_ultimate+.dat")then fs.remove("tech_ultimate+.dat")end
--Update modeRanks --Update modeRanks
R=modeRanks do
for k,v in next,R do local R=modeRanks
for k,v in next,R do
if type(k)=="number"then if type(k)=="number"then
R[Modes[k].name],R[k]=R[k] if Modes[k]and not R[Modes[k].name]then
break R[Modes[k].name]=v
end end
end R[k]=nil
if R.master_adavnce then end
end
if R.master_adavnce then
R.master_advance,R.master_adavnce=R.master_adavnce R.master_advance,R.master_adavnce=R.master_adavnce
end end
if not text.modes[stat.lastPlay]then if not text.modes[stat.lastPlay]then
stat.lastPlay="sprint_10" stat.lastPlay="sprint_10"
end end
--Update data file --Update data file
S=stat local S=stat
if type(setting.spawn)~="number"then if type(setting.spawn)~="number"then
setting.spawn=0 setting.spawn=0
end end
if S.version~=gameVersion then if S.version~=gameVersion then
S.version=gameVersion S.version=gameVersion
TEXT.show(text.newVersion,640,200,30,"fly",.3)
newVersionLaunch=true newVersionLaunch=true
fs.remove("sprintPenta.dat") fs.remove("sprintPenta.dat")
fs.remove("master_adavnce.dat") fs.remove("master_adavnce.dat")
fs.remove("master_beginner.dat") fs.remove("master_beginner.dat")
end
end end
R,S=nil

View File

@@ -34,7 +34,7 @@ return{
end end
end end
end, end,
bg="game4",bgm="way", bg="rainbow2",bgm="way",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -43,7 +43,7 @@ return{
end end
end end
end, end,
bg="game4",bgm="shining terminal", bg="rainbow2",bgm="shining terminal",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -13,7 +13,7 @@ return{
hold=false, hold=false,
dropPiece=function(P)P:lose()end, dropPiece=function(P)P:lose()end,
task=nil, task=nil,
bg="game1",bgm="newera", bg="bg1",bgm="newera",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -4,8 +4,9 @@ return{
color=color.magenta, color=color.magenta,
env={ env={
drop=15,lock=45, drop=15,lock=45,
fall=10,lock=60, fall=10,
center=false, center=false,
dropFX=0,lockFX=0,
visible="none", visible="none",
dropPiece=PLY.reach_winCheck, dropPiece=PLY.reach_winCheck,
freshLimit=15, freshLimit=15,

View File

@@ -7,7 +7,6 @@ return{
freshLimit=10, freshLimit=10,
visible="fast", visible="fast",
dropPiece=PLY.reach_winCheck, dropPiece=PLY.reach_winCheck,
freshLimit=10,
target=200, target=200,
bg="glow",bgm="reason", bg="glow",bgm="reason",
}, },

View File

@@ -31,7 +31,11 @@ return{
end end
modeEnv._20G=modeEnv.drop==0 modeEnv._20G=modeEnv.drop==0
modeEnv.oncehold=customSel[6]==1 modeEnv.oncehold=customSel[6]==1
if preBag[1]then modeEnv.bag=preBag end if preBag[1]then
modeEnv.bag=preBag
else
modeEnv.bag=nil
end
modeEnv.target=0 modeEnv.target=0
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
local L=modeEnv.opponent local L=modeEnv.opponent

View File

@@ -37,7 +37,7 @@ return{
end end
end end
end, end,
bg="game4",bgm="shining terminal", bg="rainbow2",bgm="shining terminal",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -37,7 +37,7 @@ return{
end end
end end
end, end,
bg="game4",bgm="way", bg="rainbow2",bgm="way",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -16,7 +16,7 @@ return{
D.event=D.event+1 D.event=D.event+1
end end
end, end,
bg="game2",bgm="way", bg="bg2",bgm="way",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -15,7 +15,7 @@ return{
D.event=D.event+1 D.event=D.event+1
end end
end, end,
bg="game2",bgm="shining terminal", bg="bg2",bgm="shining terminal",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -1,9 +1,28 @@
local format=string.format local format=string.format
local function check_rise(P) local function check_rise(P)
if #P.clearedRow==0 then if #P.clearedRow==0 then
local L=P.garbageBeneath
if L>0 then
if L<3 then
P:showTextF(text.almost,0,-120,80,"beat",.8)
elseif L<5 then
P:showTextF(text.great,0,-120,80,"fly",.8)
end
end
for i=1,8-P.garbageBeneath do for i=1,8-P.garbageBeneath do
P:garbageRise(13,1,P:RND(10)) P:garbageRise(13,1,P:RND(10))
end end
else
if P.garbageBeneath==0 then
P:showTextF(text.awesome,0,-120,80,"beat",.6)
SFX.play("clear")
BG.send(26)
for i=1,8-P.garbageBeneath do
P:garbageRise(13,1,P:RND(10))
end
else
BG.send(#P.clearedRow)
end
end end
end end
@@ -13,8 +32,8 @@ return{
drop=1e99,lock=1e99, drop=1e99,lock=1e99,
oncehold=false, oncehold=false,
dropPiece=check_rise, dropPiece=check_rise,
pushSpeed=1, pushSpeed=1.2,
bg="glow",bgm="infinite", bg="wing",bgm="infinite",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)

View File

@@ -21,7 +21,7 @@ return{
mindas=7,minarr=1,minsdarr=1, mindas=7,minarr=1,minsdarr=1,
drop=.5,wait=8,fall=20, drop=.5,wait=8,fall=20,
target=50,dropPiece=check, target=50,dropPiece=check,
bg="game2",bgm="push", bg="bg2",bgm="push",
}, },
pauseLimit=true, pauseLimit=true,
slowMark=true, slowMark=true,
@@ -42,7 +42,7 @@ return{
if L>=200 then if L>=200 then
local T=P.stat.time local T=P.stat.time
return return
T<=200 and 5 or T<=230 and 5 or
T<=270 and 4 or T<=270 and 4 or
3 3
else else

View File

@@ -17,11 +17,10 @@ return{
color=color.green, color=color.green,
env={ env={
noFly=true, noFly=true,
minsdarr=1,
wait=8,fall=20, wait=8,fall=20,
target=10,dropPiece=check_LVup, target=10,dropPiece=check_LVup,
mindas=7,minarr=1,minsdarr=1, mindas=7,minarr=1,minsdarr=1,
bg="game2",bgm="push", bg="bg2",bgm="push",
}, },
pauseLimit=true, pauseLimit=true,
slowMark=true, slowMark=true,
@@ -42,8 +41,8 @@ return{
if L>=200 then if L>=200 then
local T=P.stat.time local T=P.stat.time
return return
T<=226 and 5 or T<=230 and 5 or
T<=262 and 4 or T<=270 and 4 or
3 3
else else
return return

View File

@@ -17,7 +17,7 @@ local function score(P)
--Level up! --Level up!
local s=P.modeData.event+1;P.modeData.event=s local s=P.modeData.event+1;P.modeData.event=s
local E=P.gameEnv local E=P.gameEnv
BG.set(s==1 and"game3"or s==2 and"game4"or s==3 and"game5"or s==4 and"game6"or"game5") BG.set(s==1 and"rainbow"or s==2 and"rainbow2"or s==3 and"lightning"or s==4 and"lightning2"or"lightning")
E.lock=death_lock[s] E.lock=death_lock[s]
E.wait=death_wait[s] E.wait=death_wait[s]
E.fall=death_fall[s] E.fall=death_fall[s]
@@ -44,7 +44,7 @@ return{
fall=death_fall[1], fall=death_fall[1],
dropPiece=score, dropPiece=score,
freshLimit=15, freshLimit=15,
bg="game2",bgm="secret7th", bg="bg2",bgm="secret7th",
}, },
slowMark=true, slowMark=true,
load=function() load=function()

View File

@@ -16,7 +16,7 @@ local function score(P)
--Level up! --Level up!
local s=P.modeData.event+1;P.modeData.event=s local s=P.modeData.event+1;P.modeData.event=s
local E=P.gameEnv local E=P.gameEnv
BG.set(s==1 and"game1"or s==2 and"game2"or s==3 and"game3"or "game4") BG.set(s==1 and"bg1"or s==2 and"bg2"or s==3 and"rainbow"or "rainbow2")
E.lock=rush_lock[s] E.lock=rush_lock[s]
E.wait=rush_wait[s] E.wait=rush_wait[s]
E.fall=rush_fall[s] E.fall=rush_fall[s]
@@ -48,7 +48,7 @@ return{
fall=rush_fall[1], fall=rush_fall[1],
dropPiece=score, dropPiece=score,
freshLimit=15, freshLimit=15,
bg="game1",bgm="secret8th", bg="bg1",bgm="secret8th",
}, },
slowMark=true, slowMark=true,
load=function() load=function()

View File

@@ -46,7 +46,7 @@ return{
dropPiece=score, dropPiece=score,
freshLimit=15, freshLimit=15,
easyFresh=false,bone=true, easyFresh=false,bone=true,
bg="none",bgm="distortion", bg="lightning",bgm="distortion",
}, },
slowMark=true, slowMark=true,
load=function() load=function()

View File

@@ -16,7 +16,7 @@ return{
drop=1e99,lock=1e99, drop=1e99,lock=1e99,
oncehold=false, oncehold=false,
dropPiece=update_round, dropPiece=update_round,
bg="game3",bgm="push", bg="rainbow",bgm="push",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)

View File

@@ -16,7 +16,7 @@ return{
drop=1e99,lock=1e99, drop=1e99,lock=1e99,
oncehold=false, oncehold=false,
dropPiece=update_round, dropPiece=update_round,
bg="game3",bgm="push", bg="rainbow",bgm="push",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)

View File

@@ -16,7 +16,7 @@ return{
drop=1e99,lock=1e99, drop=1e99,lock=1e99,
oncehold=false, oncehold=false,
dropPiece=update_round, dropPiece=update_round,
bg="game3",bgm="push", bg="rainbow",bgm="push",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)

View File

@@ -16,7 +16,7 @@ return{
drop=1e99,lock=1e99, drop=1e99,lock=1e99,
oncehold=false, oncehold=false,
dropPiece=update_round, dropPiece=update_round,
bg="game3",bgm="push", bg="rainbow",bgm="push",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)

View File

@@ -16,7 +16,7 @@ return{
drop=1e99,lock=1e99, drop=1e99,lock=1e99,
oncehold=false, oncehold=false,
dropPiece=update_round, dropPiece=update_round,
bg="game3",bgm="push", bg="rainbow",bgm="push",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)

View File

@@ -3,7 +3,7 @@ return{
env={ env={
drop=60,lock=60, drop=60,lock=60,
freshLimit=15, freshLimit=15,
bg="game2",bgm="race", bg="bg2",bgm="race",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -3,7 +3,7 @@ return{
env={ env={
drop=60,lock=60, drop=60,lock=60,
freshLimit=15, freshLimit=15,
bg="game2",bgm="race", bg="bg2",bgm="race",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -3,7 +3,7 @@ return{
env={ env={
drop=60,lock=60, drop=60,lock=60,
freshLimit=15, freshLimit=15,
bg="game2",bgm="race", bg="bg2",bgm="race",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -3,7 +3,7 @@ return{
env={ env={
drop=60,lock=60, drop=60,lock=60,
freshLimit=15, freshLimit=15,
bg="game2",bgm="race", bg="bg2",bgm="race",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -3,7 +3,7 @@ return{
env={ env={
drop=60,lock=60, drop=60,lock=60,
freshLimit=15, freshLimit=15,
bg="game2",bgm="race", bg="bg2",bgm="race",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -5,7 +5,7 @@ return{
env={ env={
drop=60,lock=60, drop=60,lock=60,
target=10,dropPiece=PLY.reach_winCheck, target=10,dropPiece=PLY.reach_winCheck,
bg="game2",bgm="race", bg="bg2",bgm="race",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)

View File

@@ -5,7 +5,7 @@ return{
env={ env={
drop=60,lock=60, drop=60,lock=60,
target=100,dropPiece=PLY.reach_winCheck, target=100,dropPiece=PLY.reach_winCheck,
bg="game2",bgm="race", bg="bg2",bgm="race",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
@@ -33,7 +33,7 @@ return{
T<=90 and 4 or T<=90 and 4 or
T<=136 and 3 or T<=136 and 3 or
T<=196 and 2 or T<=196 and 2 or
T<=260 and 1 or T<=240 and 1 or
0 0
end, end,
} }

View File

@@ -5,7 +5,7 @@ return{
env={ env={
drop=60,lock=60, drop=60,lock=60,
target=1000,dropPiece=PLY.reach_winCheck, target=1000,dropPiece=PLY.reach_winCheck,
bg="game3",bgm="push", bg="rainbow",bgm="push",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
@@ -30,10 +30,10 @@ return{
local T=P.stat.time local T=P.stat.time
return return
T<=626 and 5 or T<=626 and 5 or
T<=888 and 4 or T<=800 and 4 or
T<=1140 and 3 or T<=900 and 3 or
T<=1406 and 2 or T<=1050 and 2 or
T<=1626 and 1 or T<=1200 and 1 or
0 0
end, end,
} }

View File

@@ -5,7 +5,7 @@ return{
env={ env={
drop=60,lock=60, drop=60,lock=60,
target=20,dropPiece=PLY.reach_winCheck, target=20,dropPiece=PLY.reach_winCheck,
bg="game2",bgm="race", bg="bg2",bgm="race",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)

View File

@@ -5,7 +5,7 @@ return{
env={ env={
drop=60,lock=60, drop=60,lock=60,
target=40,dropPiece=PLY.reach_winCheck, target=40,dropPiece=PLY.reach_winCheck,
bg="game2",bgm="race", bg="bg2",bgm="race",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)

View File

@@ -5,7 +5,7 @@ return{
env={ env={
drop=60,lock=60, drop=60,lock=60,
target=400,dropPiece=PLY.reach_winCheck, target=400,dropPiece=PLY.reach_winCheck,
bg="game3",bgm="push", bg="rainbow",bgm="push",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
@@ -30,10 +30,10 @@ return{
local T=P.stat.time local T=P.stat.time
return return
T<=300 and 5 or T<=300 and 5 or
T<=340 and 4 or T<=330 and 4 or
T<=462 and 3 or T<=360 and 3 or
T<=555 and 2 or T<=390 and 2 or
T<=626 and 1 or T<=420 and 1 or
0 0
end, end,
} }

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget, Fkey=selectTarget,
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
bg="game3",bgm="rockblock", bg="rainbow",bgm="rockblock",
}, },
load=function() load=function()
royaleData={ royaleData={
@@ -33,7 +33,7 @@ return{
} }
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
local L={}for i=1,49 do L[i]=true end local L={}for i=1,49 do L[i]=true end
local t=system~="Windows"and 0 or 2 local t=CCloader_filename[system] and 2 or 0
while t>0 do while t>0 do
local r=rnd(2,49) local r=rnd(2,49)
if L[r]then L[r],t=false,t-1 end if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(2,5))) PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(2,5)))
else else
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(2,5)-1,2,true,10000)) PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(3,5),2,true,10000))
end end
n=n+1 n=n+1
end end end end
@@ -51,7 +51,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(2,5))) PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(2,5)))
else else
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(2,5)-1,2,true,10000)) PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(3,5),2,true,10000))
end end
n=n+1 n=n+1
end end end end

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget, Fkey=selectTarget,
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
bg="game3",bgm="rockblock", bg="rainbow",bgm="rockblock",
}, },
load=function() load=function()
royaleData={ royaleData={
@@ -33,7 +33,7 @@ return{
} }
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
local L={}for i=1,49 do L[i]=true end local L={}for i=1,49 do L[i]=true end
local t=system~="Windows"and 0 or 4 local t=CCloader_filename[system] and 4 or 0
while t>0 do while t>0 do
local r=rnd(2,49) local r=rnd(2,49)
if L[r]then L[r],t=false,t-1 end if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(4,7))) PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(4,7)))
else else
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(4,7)-1,3,true,20000)) PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(6,8),3,true,20000))
end end
n=n+1 n=n+1
end end end end
@@ -51,7 +51,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(4,7))) PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(4,7)))
else else
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(4,7)-1,3,true,20000)) PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(6,8),3,true,20000))
end end
n=n+1 n=n+1
end end end end

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget, Fkey=selectTarget,
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
bg="game3",bgm="rockblock", bg="rainbow",bgm="rockblock",
}, },
load=function() load=function()
royaleData={ royaleData={
@@ -33,7 +33,7 @@ return{
} }
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
local L={}for i=1,49 do L[i]=true end local L={}for i=1,49 do L[i]=true end
local t=system~="Windows"and 0 or 6 local t=CCloader_filename[system] and 6 or 0
while t>0 do while t>0 do
local r=rnd(2,49) local r=rnd(2,49)
if L[r]then L[r],t=false,t-1 end if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(8,10))) PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(8,10)))
else else
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(8,10)-1,4,true,30000)) PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(9,10),4,true,30000))
end end
n=n+1 n=n+1
end end end end
@@ -51,7 +51,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(8,10))) PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(8,10)))
else else
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(8,10)-1,4,true,30000)) PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(9,10),4,true,30000))
end end
n=n+1 n=n+1
end end end end

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget, Fkey=selectTarget,
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
bg="game3",bgm="rockblock", bg="rainbow",bgm="rockblock",
}, },
load=function() load=function()
royaleData={ royaleData={
@@ -33,7 +33,7 @@ return{
} }
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
local L={}for i=1,100 do L[i]=true end local L={}for i=1,100 do L[i]=true end
local t=system~="Windows"and 0 or 4 local t=CCloader_filename[system] and 4 or 0
while t>0 do while t>0 do
local r=rnd(2,99) local r=rnd(2,99)
if L[r]then L[r],t=false,t-1 end if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(2,5))) PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(2,5)))
else else
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(2,5)-1,2,true,10000)) PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(3,5),2,true,10000))
end end
n=n+1 n=n+1
end end end end
@@ -51,7 +51,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(2,5))) PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(2,5)))
else else
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(2,5)-1,2,true,10000)) PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(3,5),2,true,10000))
end end
n=n+1 n=n+1
end end end end

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget, Fkey=selectTarget,
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
bg="game3",bgm="rockblock", bg="rainbow",bgm="rockblock",
}, },
load=function() load=function()
royaleData={ royaleData={
@@ -33,7 +33,7 @@ return{
} }
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
local L={}for i=1,100 do L[i]=true end local L={}for i=1,100 do L[i]=true end
local t=system~="Windows"and 0 or 4 local t=CCloader_filename[system] and 4 or 0
while t>0 do while t>0 do
local r=rnd(2,99) local r=rnd(2,99)
if L[r]then L[r],t=false,t-1 end if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(4,7))) PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(4,7)))
else else
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(4,7)-1,3,true,20000)) PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(6,8),3,true,20000))
end end
n=n+1 n=n+1
end end end end
@@ -51,7 +51,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(4,7))) PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(4,7)))
else else
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(4,7)-1,3,true,20000)) PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(6,8),3,true,20000))
end end
n=n+1 n=n+1
end end end end

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget, Fkey=selectTarget,
pushSpeed=2, pushSpeed=2,
freshLimit=15, freshLimit=15,
bg="game3",bgm="rockblock", bg="rainbow",bgm="rockblock",
}, },
load=function() load=function()
royaleData={ royaleData={
@@ -33,7 +33,7 @@ return{
} }
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)
local L={}for i=1,100 do L[i]=true end local L={}for i=1,100 do L[i]=true end
local t=system~="Windows"and 0 or 4 local t=CCloader_filename[system] and 4 or 0
while t>0 do while t>0 do
local r=rnd(2,99) local r=rnd(2,99)
if L[r]then L[r],t=false,t-1 end if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(8,10))) PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(8,10)))
else else
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(8,10)-1,4,true,30000)) PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("CC",rnd(9,10),4,true,30000))
end end
n=n+1 n=n+1
end end end end
@@ -51,7 +51,7 @@ return{
if L[n]then if L[n]then
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(8,10))) PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(8,10)))
else else
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(8,10)-1,4,true,30000)) PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("CC",rnd(9,10),4,true,30000))
end end
n=n+1 n=n+1
end end end end

View File

@@ -20,7 +20,7 @@ return{
end end
end end
end, end,
bg="matrix",bgm="infinite", bg="fan",bgm="infinite",
}, },
slowMark=true, slowMark=true,
pauseLimit=true, pauseLimit=true,

View File

@@ -4,7 +4,7 @@ return{
drop=120,lock=120, drop=120,lock=120,
oncehold=false,target=200, oncehold=false,target=200,
dropPiece=PLY.reach_winCheck, dropPiece=PLY.reach_winCheck,
bg="game2",bgm="infinite", bg="bg2",bgm="infinite",
}, },
load=function() load=function()
PLY.newPlayer(1,340,15) PLY.newPlayer(1,340,15)

View File

@@ -1,12 +1,10 @@
--[[ --[[
HighestBlock HighestBlock
HorizontalTransitions
VerticalTransitions
BlockedCells BlockedCells
Wells Wells
FilledLines FilledLines
4deepShape 4deepShape
BlockedWells; BlockedWells
]] ]]
local int,ceil,min,abs,rnd=math.floor,math.ceil,math.min,math.abs,math.random local int,ceil,min,abs,rnd=math.floor,math.ceil,math.min,math.abs,math.random
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
@@ -18,9 +16,32 @@ local Timer=love.timer.getTime
local blockPos={4,4,4,4,4,5,4} local blockPos={4,4,4,4,4,5,4}
local scs={{0,1},{0,1},{0,1},{0,1},{0,1},{.5,.5},{-.5,1.5}} local scs={{0,1},{0,1},{0,1},{0,1},{0,1},{.5,.5},{-.5,1.5}}
-------------------------------------------------Cold clear -------------------------------------------------Cold clear
local CCblockID={4,3,6,5,1,2,0} local CCblockID={6,5,4,3,2,1,0}
if system=="Windows"then CCloader_filename={
require("CCloader") Windows={"CCloader.dll",{"x86_64","x86"}},
Android={"libCCloader.so",{"arm64-v8a","armeabi-v7a"}},
Linux={"libCCloader.so",{"x86_64"}},
}
local function loadCC()
if not CCloader_filename[system]then return end
local f
for i=1,#CCloader_filename[system][2]do
function f()
local CCloader_f,size=love.filesystem.read("data",table.concat({"lib",system,CCloader_filename[system][2][i],CCloader_filename[system][1]},"/"))
if not CCloader_f then return end
local success,message=love.filesystem.write(CCloader_filename[system][1],CCloader_f,size)
if not success then return end
local success,message=package.loadlib(table.concat({love.filesystem.getSaveDirectory(),CCloader_filename[system][1]},"/"),"luaopen_CCloader")
return success,message
end
f=f()
if f then break end
end
if not f then
CCloader_filename[system]=nil
return
end
f()
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)
@@ -29,12 +50,12 @@ if system=="Windows"then
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,dest,hold,move
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)
setPCLoop= cc.set_pcloop ,--(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)
@@ -66,7 +87,8 @@ if system=="Windows"then
BOT.addNext(P.AI_bot,CCblockID[P.next[i].id]) BOT.addNext(P.AI_bot,CCblockID[P.next[i].id])
end end
CC_updateField(P) CC_updateField(P)
P.hd={bk={{}},id=0,color=0,name=0}P.holded=false P.hd=nil
P.holded=false
P.cur=rem(P.next,1) P.cur=rem(P.next,1)
P.sc,P.dir=scs[P.cur.id],0 P.sc,P.dir=scs[P.cur.id],0
P.r,P.c=#P.cur.bk,#P.cur.bk[1] P.r,P.c=#P.cur.bk,#P.cur.bk[1]
@@ -80,6 +102,7 @@ if system=="Windows"then
collectgarbage() collectgarbage()
end end
end end
loadCC()
-------------------------------------------------9 Stack setup -------------------------------------------------9 Stack setup
local dirCount={1,1,3,3,3,0,1} local dirCount={1,1,3,3,3,0,1}
local spinOffset={ local spinOffset={
@@ -218,7 +241,7 @@ return{
end end
if not bn then goto CTN end if not bn then goto CTN end
for dir=0,dirCount[bn] do--Each dir for dir=0,dirCount[bn]do--Each dir
local cb=blocks[bn][dir] local cb=blocks[bn][dir]
for cx=1,11-#cb[1]do--Each pos for cx=1,11-#cb[1]do--Each pos
local cy=#Tfield+1 local cy=#Tfield+1
@@ -282,9 +305,17 @@ return{
return 2 return 2
end, end,
function(P,ctrl)--Poll keys function(P,ctrl)--Poll keys
if BOT.ifDead(P.AI_bot)then ins(ctrl,6)return 3 end local success,dest,hold,move=BOT.getMove(P.AI_bot)
local success,hold,move=BOT.getMove(P.AI_bot) if success==2 then
if success then ins(ctrl,6)
return 3
elseif success==0 then
for i=1,#dest do
for j=1,#dest[i]do
dest[i][j]=dest[i][j]+1
end
end
P.AI_dest=dest
if hold then ctrl[1]=8 end--Hold if hold then ctrl[1]=8 end--Hold
while move[1]do while move[1]do
local m=rem(move,1) local m=rem(move,1)

View File

@@ -10,7 +10,7 @@ setting={
reTime=4, reTime=4,
autoPause=true, autoPause=true,
fine=false, fine=false,
lock=false, appLock=false,
lang=1, lang=1,
skinSet=1, skinSet=1,
skin={1,5,8,2,10,3,7,1,5,1,5,8,2,10,3,7,10,7,8,2,8,2,1,5,3}, skin={1,5,8,2,10,3,7,1,5,1,5,8,2,10,3,7,10,7,8,2,8,2,1,5,3},
@@ -21,7 +21,8 @@ setting={
smooth=true,grid=false, smooth=true,grid=false,
bagLine=false, bagLine=false,
lockFX=2, lockFX=2,
dropFX=3, dropFX=2,
moveFX=2,
clearFX=2, clearFX=2,
shakeFX=2, shakeFX=2,
atkFX=3, atkFX=3,

View File

@@ -1,6 +1,6 @@
local freeRow={} local freeRow={}
local L={}--Storage local L={}--Storage
local _=0--Lenth local _=0--Length
function freeRow.reset(num) function freeRow.reset(num)
if num<_ then if num<_ then
for i=_,num+1,-1 do for i=_,num+1,-1 do

View File

@@ -164,6 +164,7 @@ function pasteSequence(str)
end end
preBag=bag preBag=bag
sceneTemp.cur=#preBag
return true return true
end end
@@ -310,7 +311,6 @@ function resetGameData()
destroyPlayers() destroyPlayers()
modeEnv=curMode.env modeEnv=curMode.env
math.randomseed(game.seed)
curMode.load()--BG/BGM need redefine in custom,so up here curMode.load()--BG/BGM need redefine in custom,so up here
if modeEnv.task then if modeEnv.task then
for i=1,#players do for i=1,#players do
@@ -363,7 +363,6 @@ function resetPartGameData(replaying)
destroyPlayers() destroyPlayers()
modeEnv=curMode.env modeEnv=curMode.env
math.randomseed(game.seed)
curMode.load() curMode.load()
if modeEnv.task then if modeEnv.task then
for i=1,#players do for i=1,#players do
@@ -388,8 +387,8 @@ 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:popNext()
P.timing=true
P.control=true P.control=true
P.timing=true
P:popNext()
end end
end end

View File

@@ -15,7 +15,6 @@ if setting.lang==1 or setting.lang==2 then
"O spin Triple!", "O spin Triple!",
"nullpomino也很好玩!", "nullpomino也很好玩!",
"Naki 可爱!", "Naki 可爱!",
"Miya:喵!",
"Miya 可爱!", "Miya 可爱!",
"Lua天下第一", "Lua天下第一",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF", "LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
@@ -28,18 +27,28 @@ if setting.lang==1 or setting.lang==2 then
"e^(pi*i)=-1", "e^(pi*i)=-1",
"DT炮=TSD+TST炮", "DT炮=TSD+TST炮",
"Cultris II也很好玩!", "Cultris II也很好玩!",
"Ctrl+W=关闭当前标签页",
"Ctrl+Tab=切换标签页",
"Ctrl+F=查找",
"Ctrl+D=复制一份",
"Ctrl+Alt+Z=查看所有qq消息",
"Ctrl+A=全选",
"Ctrl+鼠标滚轮=缩放",
"COOL!!", "COOL!!",
"CLASSIC SEXY RUSSIAN BLOCKS",
"BT炮=beta炮", "BT炮=beta炮",
"backspace=返回上一个文件目录",
"B2B2B2B存在吗?", "B2B2B2B存在吗?",
"B2B2B???", "B2B2B???",
"Am G F G", "Am G F G",
"Alt+Tab=切换窗口",
"Alt+F4=关闭当前窗口",
"ALLSPIN!", "ALLSPIN!",
"注意到\"旋转\"到底对方块做了些什么吗?", "注意到\"旋转\"到底对方块做了些什么吗?",
"有疑问? 先看设置有没有你想要的", "有疑问? 先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~", "有建议的话可以把信息反馈给作者~",
"学会使用两个旋转键, 三个更好", "学会使用两个旋转键, 三个更好",
"享受特色旋转系统!", "新人请千万记住,打好基础,不要太早学那些花里胡哨的",
"享受Tech的特色旋转系统!",
"无聊翻翻设置是好习惯", "无聊翻翻设置是好习惯",
"我的世界好玩!", "我的世界好玩!",
"提前旋转等设置可以用来救命", "提前旋转等设置可以用来救命",
@@ -48,32 +57,32 @@ if setting.lang==1 or setting.lang==2 then
"使用love2d引擎制作", "使用love2d引擎制作",
"少女祈祷中", "少女祈祷中",
"扫雷好玩!", "扫雷好玩!",
"哦,我的上帝", "你可以长按R键重新开始游戏(也不是很长)",
"你可以从统计页面打开游戏存档目录", "你可以从统计页面打开游戏存档目录",
"你好 世界!",
"魔方好玩!", "魔方好玩!",
"喵!",
"免费吃鸡方块", "免费吃鸡方块",
"秘密数字:626", "秘密数字:626",
"每个虚拟按键都可以隐藏/显示", "每个虚拟按键都可以隐藏/显示,尺寸也可调",
"每个块的出现方向可以自定义", "每个块的出现方向可以自定义",
"没专业美术,程序员审美警告", "专业美术的人,程序员审美警告",
"没学过编曲,音乐都是自己凭感觉写的,觉得不好听就设置里关了吧", "没学过编曲,音乐都是自己凭感觉写的,觉得不好听就设置里关了吧",
"联网还没做呢, 别急", "联网还没做呢, 别急",
"键位是可以自定义的", "键位是可以自定义的",
"健康小贴士:玩游戏多眨眼,不然会干眼病",
"健康小贴士:不要熬夜,真的会猝死",
"合群了就会消失, 但是消失不代表没有意义", "合群了就会消失, 但是消失不代表没有意义",
"更小的DAS和ARR拥有更高的操作上限(如果你还能控制得了的话)", "更小的DAS和ARR拥有更高的操作上限(前提是你能控制得了)",
"俄罗斯方块环游记也不错!", "俄罗斯方块环游记也不错!",
"调到特殊的日期也不会发生什么的", "调到特殊的日期也不会发生什么的",
"低帧率会降低游戏体验", "低帧率会降低游戏体验",
"戴上耳机以获得最佳体验", "戴上耳机以获得最佳体验",
"大满贯10连击消四全清!", "大满贯10连击消四全清!",
"打好块没有捷径,多练", "打好块没有捷径,多练",
"你可以长按R键重新开始游戏(也不是很长)",
"茶娘 可爱!", "茶娘 可爱!",
"草(日本语)", "草(日本语)",
"不要在上课时玩游戏!", "不要在上课时玩游戏!",
"不要盯着bug不放", "不要盯着bug不放",
"不要按F10",
"不是动画,真的在加载!", "不是动画,真的在加载!",
"别问游戏名怎么取的,问就是随便想的", "别问游戏名怎么取的,问就是随便想的",
"本游戏难度上限很高, 做好心理准备", "本游戏难度上限很高, 做好心理准备",
@@ -90,6 +99,7 @@ if setting.lang==1 or setting.lang==2 then
"2.7182818284590452353", "2.7182818284590452353",
"15puzzle好玩!", "15puzzle好玩!",
"11renPC!", "11renPC!",
"100行内23PC来一个?",
"1, 2, 9!!!!!", "1, 2, 9!!!!!",
"<方块研究所>有一个Nspire-CX版本!", "<方块研究所>有一个Nspire-CX版本!",
"↑↑↓↓←→←→BABA", "↑↑↓↓←→←→BABA",
@@ -106,13 +116,14 @@ elseif setting.lang==3 then
"Who is diao", "Who is diao",
"What about 26 TSDs?", "What about 26 TSDs?",
"What about 20 PCs?", "What about 20 PCs?",
"What about 23 PCs in 100 lines?",
"Warning: Programmer Art", "Warning: Programmer Art",
"Try to use two rotate button,three better", "Try to use two rotate button,three better",
"This in not a casual game", "This in not a casual game",
"This game can be very hard,be mentally perpared", "This game can be very hard,be mentally perpared",
"Tetris journey has network battle!", "Tetris journey has network battle!",
"Terraria is fun!",
"Tetralegends is fun!", "Tetralegends is fun!",
"Terraria is fun!",
"Techmino=Technique+Tetromino", "Techmino=Technique+Tetromino",
"Techmino is so fun!", "Techmino is so fun!",
"Techmino has a Nspire-CX edition!", "Techmino has a Nspire-CX edition!",
@@ -140,10 +151,10 @@ elseif setting.lang==3 then
"l-=-1", "l-=-1",
"Is B2B2B2B possible?", "Is B2B2B2B possible?",
"Initial Rotation etc. can save your life", "Initial Rotation etc. can save your life",
"Hold R key to restart game",
"Hello world!", "Hello world!",
"Headphones for better experience", "Headphones for better experience",
"Have you noticed what does \"rotating\" do to block?", "Have you noticed what does \"rotating\" do to block?",
"Hold R key to restart game",
"Find out what's in the setting!", "Find out what's in the setting!",
"Enjoy Tech. Rotation System!", "Enjoy Tech. Rotation System!",
"e^(pi*i/2)=i", "e^(pi*i/2)=i",
@@ -155,8 +166,7 @@ elseif setting.lang==3 then
"Disappearing doesn't mean useless", "Disappearing doesn't mean useless",
"Diao so bully", "Diao so bully",
"COOL!!", "COOL!!",
"CLASSIC SEXY RUSSIAN BLOCKS", "BT cannon=beta cannon",
"BT cannon=beta",
"Back to Back 10 combo Techrash PC!", "Back to Back 10 combo Techrash PC!",
"B2B2B???", "B2B2B???",
"Any suggestions to author!", "Any suggestions to author!",
@@ -164,9 +174,9 @@ elseif setting.lang==3 then
"Also try VVVVVV!", "Also try VVVVVV!",
"Also try Tetr.js!", "Also try Tetr.js!",
"Also try Tetr.io!", "Also try Tetr.io!",
"Also try Nullpomino!",
"Also try Jstris!", "Also try Jstris!",
"Also try Cultris II!", "Also try Cultris II!",
"Also try Nullpomino!",
"ALLSPIN!", "ALLSPIN!",
"少女祈禱中", "少女祈禱中",
"40L WR: 15.654s", "40L WR: 15.654s",
@@ -223,7 +233,7 @@ elseif setting.lang==5 then
--[[23]]"大半夜的在这干啥呢?不睡觉是会猝死的", --[[23]]"大半夜的在这干啥呢?不睡觉是会猝死的",
} }
return time[tonumber(os.date("%H"))+1] return time[tonumber(os.date("%H"))+1]
elseif true or R<.1 then elseif R<.1 then
local int=math.floor local int=math.floor
L={ L={
"平均"..int(stat.row/stat.time*60).."LPM,那可真强呢", "平均"..int(stat.row/stat.time*60).."LPM,那可真强呢",
@@ -243,8 +253,10 @@ elseif setting.lang==5 then
"我一个滑铲就挖了个11renPC", "我一个滑铲就挖了个11renPC",
"我曾经在极度愤怒的时候15秒消了40行", "我曾经在极度愤怒的时候15秒消了40行",
"天天F3F3,怕别人不知道你菜?", "天天F3F3,怕别人不知道你菜?",
"天天卖弱,你一定把把150apm吧?",
"天天催更催更,你咋不来帮忙开发啊,真以为作者很强催催啥都有?", "天天催更催更,你咋不来帮忙开发啊,真以为作者很强催催啥都有?",
"设置都看过一遍了吗?明明都能调还嫌这嫌那,可牛逼了您", "设置都看过一遍了吗?明明都能调还嫌这嫌那,可牛逼了您",
"少玩点,多眨眼,到时候瞎了别怪我没提醒你",
"人只用一只手都能玩,你呢?", "人只用一只手都能玩,你呢?",
"没那水平别天天整什么花里胡哨的,人玩几年你想几天赶上?", "没那水平别天天整什么花里胡哨的,人玩几年你想几天赶上?",
"满口PCDT信天翁,还会点别的么?", "满口PCDT信天翁,还会点别的么?",
@@ -253,6 +265,7 @@ elseif setting.lang==5 then
"还搁这玩手机呢,作业做完了?", "还搁这玩手机呢,作业做完了?",
"除了雨宫太阳你还认识谁?Jonas知道吗?Ajanba听过吗?", "除了雨宫太阳你还认识谁?Jonas知道吗?Ajanba听过吗?",
"不会吧不会吧,真的还有人不能随手Tspin?", "不会吧不会吧,真的还有人不能随手Tspin?",
"别会个c4w就以为自己多强,这是基本功罢了",
"60lpm?拍硬降刷的吧", "60lpm?拍硬降刷的吧",
"4pps不是人均水平?", "4pps不是人均水平?",
"40行还要40多秒,就这?", "40行还要40多秒,就这?",
@@ -260,9 +273,8 @@ elseif setting.lang==5 then
"20连pc不是随手?", "20连pc不是随手?",
"100apm?定式刷的吧", "100apm?定式刷的吧",
"0202年了,还在玩这种小孩子玩的游戏?", "0202年了,还在玩这种小孩子玩的游戏?",
"天天卖弱,你一定把把150apm吧?", "极限20G?那不是随手通",
"别会个c4w就以为自己多强,这是基本功罢了", "全隐40行全消四很难吗??",
"少玩点,多眨眼,到时候瞎了别怪我没提醒你",
} }
end end
end end

View File

@@ -84,14 +84,14 @@ local TRS={
},--Z },--Z
{},--S {},--S
{ {
[01]={{-1, 0},{-1, 1},{ 0,-2},{ 1, 1}}, [01]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{ 1, 1}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}}, [10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 1, 2}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-1},{ 0, 1}}, [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-1},{ 0, 1}},
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1},{-1, 1}}, [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1},{-1, 1}},
[12]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-1},{ 0, 2},{ 1, 2}}, [12]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-1},{ 0, 2},{ 1, 2}},
[21]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{-1,-2}}, [21]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 1},{ 0,-2},{-1,-2}},
[32]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{-1, 1}}, [32]={{-1, 0},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{-1, 1}},
[23]={{ 1, 0},{ 1,-1},{ 1, 1},{ 0,-2},{ 1,-2}}, [23]={{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
[02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}}, [02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}},
[20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}}, [20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0}}, [13]={{ 0,-1},{ 0, 1},{ 1, 0}},
@@ -114,13 +114,15 @@ local TRS={
},--T },--T
function(P,d) function(P,d)
if P.human then SFX.fieldPlay("rotate",nil,P)end if P.human then SFX.fieldPlay("rotate",nil,P)end
P:freshLockDelay()
if not P.gameEnv.ospin then return end if not P.gameEnv.ospin then return end
local x,y=P.curX,P.curY local x,y=P.curX,P.curY
if y==P.imgY and((P:solid(x-1,y)or P:solid(x-1,y+1)))and(P:solid(x+2,y)or P:solid(x+2,y+1))then if y==P.imgY and((P:solid(x-1,y)or P:solid(x-1,y+1)))and(P:solid(x+2,y)or P:solid(x+2,y+1))then
local D=P.spinSeq%100*10+d local D=P.spinSeq%100*10+d
P.spinSeq=D P.spinSeq=D
if D<100 then return end if D<100 then
P:freshBlock(true,true)
return
end
for i=1,#OspinList do for i=1,#OspinList do
local L=OspinList[i] local L=OspinList[i]
if D==L[1]then if D==L[1]then
@@ -136,7 +138,7 @@ local TRS={
P.dir,P.sc=dir,scs[id][dir] P.dir,P.sc=dir,scs[id][dir]
P.spinLast=2 P.spinLast=2
P.stat.rotate=P.stat.rotate+1 P.stat.rotate=P.stat.rotate+1
P:freshgho() P:freshBlock(false,true)
P.spinSeq=0 P.spinSeq=0
SFX.fieldPlay("rotatekick",nil,P) SFX.fieldPlay("rotatekick",nil,P)
return return
@@ -145,17 +147,18 @@ local TRS={
end end
else else
P.spinSeq=0 P.spinSeq=0
P:freshBlock(true,true)
end end
end,--O end,--O
{ {
[01]={{ 0, 1},{ 1, 0},{-2, 0},{-2,-1},{ 1, 2}}, [01]={{ 0, 1},{ 1, 0},{-2, 0},{-2,-1},{ 1, 2}},
[10]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 2}}, [10]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}},
[03]={{ 0, 1},{-1, 0},{ 2, 0},{ 2,-1},{-1, 2}}, [03]={{ 0, 1},{-1, 0},{ 2, 0},{ 2,-1},{-1, 2}},
[30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 2}}, [30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}},
[12]={{-1, 0},{ 2, 0},{ 0,-1},{-1, 2},{ 2,-1}}, [12]={{-1, 0},{ 2, 0},{ 2,-1},{ 0,-1},{-1, 2}},
[21]={{-2, 0},{ 1, 0},{ 0, 1},{ 1,-2},{-2, 1}}, [21]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}},
[32]={{ 1, 0},{-2, 0},{ 0,-1},{ 1, 2},{-2,-1}}, [32]={{ 1, 0},{-2, 0},{-2,-1},{ 0,-1},{ 1, 2}},
[23]={{ 2, 0},{-1, 0},{ 0, 1},{-1,-2},{ 2, 1}}, [23]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}},
[02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}}, [02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}},
[20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}}, [20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}},
[13]={{ 0,-1},{-1, 0},{ 1, 0},{ 0, 1}}, [13]={{ 0,-1},{-1, 0},{ 1, 0},{ 0, 1}},
@@ -213,10 +216,10 @@ local TRS={
[31]={{-1, 0},{ 1, 1},{ 2, 0}}, [31]={{-1, 0},{ 1, 1},{ 2, 0}},
},--T5 },--T5
{ {
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{-1,-3}}, [01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 1, 3}}, [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-3}}, [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
[30]={{-1, 0},{-1,-1},{ 0,-2},{-1, 2},{-1, 3}}, [30]={{-1, 0},{-1,-1},{ 0,-2},{-1, 2}},
[12]={{ 1, 0},{ 1,-1},{ 1, 1}}, [12]={{ 1, 0},{ 1,-1},{ 1, 1}},
[21]={{-1,-1},{-1, 1},{-1,-1}}, [21]={{-1,-1},{-1, 1},{-1,-1}},
[32]={{-1, 0},{-1,-1},{-1, 1}}, [32]={{-1, 0},{-1,-1},{-1, 1}},
@@ -230,7 +233,7 @@ local TRS={
[01]={{ 0, 1},{-1, 0},{ 0,-2},{-1,-2}}, [01]={{ 0, 1},{-1, 0},{ 0,-2},{-1,-2}},
[10]={{ 0, 1},{ 1, 0},{ 0,-2},{ 1,-2}}, [10]={{ 0, 1},{ 1, 0},{ 0,-2},{ 1,-2}},
[03]={{ 0,-1},{ 0, 1},{ 0, 2}}, [03]={{ 0,-1},{ 0, 1},{ 0, 2}},
[30]={{ 0,-1},{ 0,-1},{ 0,-2}}, [30]={{ 0,-1},{ 0, 1},{ 0,-2}},
[12]={{ 0,-1},{ 0, 1}}, [12]={{ 0,-1},{ 0, 1}},
[21]={{ 0,-1},{ 0,-2}}, [21]={{ 0,-1},{ 0,-2}},
[32]={{ 1, 0},{-1, 0}}, [32]={{ 1, 0},{-1, 0}},
@@ -256,18 +259,18 @@ local TRS={
},--W },--W
function(P,d) function(P,d)
if P.human then SFX.fieldPlay("rotate",nil,P)end if P.human then SFX.fieldPlay("rotate",nil,P)end
P:freshLockDelay()
local iki=XspinList[d] local iki=XspinList[d]
for test=1,#iki do for test=1,#iki do
local x,y=P.curX+iki[test][1],P.curY+iki[test][2] local x,y=P.curX+iki[test][1],P.curY+iki[test][2]
if not P:ifoverlap(P.cur.bk,x,y)then if not P:ifoverlap(P.cur.bk,x,y)then
P.curX,P.curY=x,y P.curX,P.curY=x,y
P.spinLast=1 P.spinLast=1
P:freshgho() P:freshBlock(false,true)
P.stat.rotate=P.stat.rotate+1 P.stat.rotate=P.stat.rotate+1
return return
end end
end end
P:freshBlock(true,true)
end,--X end,--X
{ {
[01]={{-1, 0},{-1, 1},{ 0,-3},{-1, 1},{-1, 2},{ 0, 1}}, [01]={{-1, 0},{-1, 1},{ 0,-3},{-1, 1},{-1, 2},{ 0, 1}},
@@ -285,14 +288,14 @@ local TRS={
},--J5 },--J5
{},--L5 {},--L5
{ {
[01]={{-1, 0},{-1, 1},{ 1, 0},{-1, 2},{-1,-1},{ 0,-3},{ 0, 1}}, [01]={{-1, 0},{-1, 0},{-1, 1},{ 1, 0},{-1, 2},{-1,-1},{ 0,-3},{ 0, 1}},
[10]={{-1, 0},{ 1,-1},{ 1, 0},{ 1,-2},{ 1, 1},{ 0, 3},{ 0, 1}}, [10]={{-1, 0},{ 1, 0},{ 1,-1},{ 1, 0},{ 1,-2},{ 1, 1},{ 0, 3},{ 0, 1}},
[03]={{ 0,-1},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}}, [03]={{ 0,-1},{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}},
[30]={{ 0, 1},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}}, [30]={{ 0, 1},{-1, 0},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}},
[12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}}, [12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}},
[21]={{-1, 0},{-1, 1},{ 0, 1},{-1, 2},{ 0, 2},{-1,-1},{ 1, 0},{ 0,-2},{-1,-2}}, [21]={{-1, 0},{-1, 1},{ 0, 1},{-1, 2},{ 0, 2},{-1,-1},{ 1, 0},{ 0,-2},{-1,-2}},
[32]={{-1, 0},{ 0,-1},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}}, [32]={{ 0,-1},{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}},
[23]={{ 1, 0},{ 0, 1},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}}, [23]={{ 0, 1},{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}},
[02]={{ 0,-1},{ 1,-1},{-1, 0},{ 2,-1},{ 0, 1}}, [02]={{ 0,-1},{ 1,-1},{-1, 0},{ 2,-1},{ 0, 1}},
[20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}}, [20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}},
[13]={{-1, 0},{-1,-1},{ 0, 1},{-1,-2}}, [13]={{-1, 0},{-1,-1},{ 0, 1},{-1,-2}},

View File

@@ -1,3 +1,4 @@
local sin,cos=math.sin,math.cos
snapLevelValue={1,10,20,40,60,80} snapLevelValue={1,10,20,40,60,80}
title={ title={
{ {
@@ -114,6 +115,12 @@ title={
5878, 463, 5878, 463,
}, },
} }
for _,C in next,title do
for i=1,#C do
C[i]=C[i]*.1626
end
end
--[[
title2={} title2={}
for i=1,#title do title2[i]=title[i]end for i=1,#title do title2[i]=title[i]end
title2[5]={ title2[5]={
@@ -140,12 +147,22 @@ title2[5]={
3001, 1280, 3001, 1280,
2779, 1280, 2779, 1280,
} }
]]
for _,C in next,title do title_fan={}
for i=1,#C do for i=1,8 do
C[i]=C[i]*.1626 local L={}
title_fan[i]=L
for j=1,#title[i]do
L[j]=title[i][j]
end
for j=1,#L,2 do
local x,y=L[j],L[j+1]--0<x<3041, 290<y<1280
x,y=-(x+240+y*.3)*.002,(y-580)*.9
x,y=y*cos(x),-y*sin(x)--Rec-Pol-Rec
L[j],L[j+1]=x,y+300
end end
end end
customID={ customID={
"drop","lock", "drop","lock",
"wait","fall", "wait","fall",
@@ -168,7 +185,7 @@ customRange={
target={10,20,40,100,200,500,1000,1e99}, target={10,20,40,100,200,500,1000,1e99},
freshLimit={0,8,15,1e99}, freshLimit={0,8,15,1e99},
opponent={0,1,2,3,4,5,11,12,13,14,15,16}, opponent={0,1,2,3,4,5,11,12,13,14,15,16},
bg={"none","game1","game2","game3","aura","rgb","glow","matrix"}, bg={"none","bg1","bg2","rainbow","aura","rgb","glow","matrix"},
bgm={"blank","way","race","newera","push","reason","infinite","secret7th","secret8th","rockblock"}, bgm={"blank","way","race","newera","push","reason","infinite","secret7th","secret8th","rockblock"},
} }
local function T(s,t)return love.graphics.newText(setFont(s),t)end local function T(s,t)return love.graphics.newText(setFont(s),t)end

View File

@@ -18,8 +18,11 @@ local gameEnv0={
smooth=false,grid=false, smooth=false,grid=false,
bagLine=false, bagLine=false,
text=true, text=true,
lockFX=2,dropFX=3, lockFX=2,
clearFX=2,shakeFX=3, dropFX=2,
moveFX=2,
clearFX=2,
shakeFX=3,
drop=60,lock=60, drop=60,lock=60,
wait=0,fall=0, wait=0,fall=0,
@@ -84,7 +87,7 @@ local finesseList={
finesseList[1][3],finesseList[1][4],finesseList[7][3],finesseList[7][4]=finesseList[1][1],finesseList[1][2],finesseList[7][1],finesseList[7][2]--"2-phase" SZI finesseList[1][3],finesseList[1][4],finesseList[7][3],finesseList[7][4]=finesseList[1][1],finesseList[1][2],finesseList[7][1],finesseList[7][2]--"2-phase" SZI
finesseList[2]=finesseList[1]--S=Z finesseList[2]=finesseList[1]--S=Z
finesseList[4],finesseList[5]=finesseList[3],finesseList[3]--J=L=T finesseList[4],finesseList[5]=finesseList[3],finesseList[3]--J=L=T
local CCblockID={4,3,6,5,1,2,0} local CCblockID={6,5,4,3,2,1,0}
local freshPrepare={ local freshPrepare={
none=NULL, none=NULL,
bag=function(P) bag=function(P)
@@ -243,12 +246,21 @@ local function updateFXs(P,dt)
--DropFX --DropFX
for i=#P.dropFX,1,-1 do for i=#P.dropFX,1,-1 do
local S=P.dropFX[i] local S=P.dropFX[i]
S[6]=S[6]+S[7]*dt S[5]=S[5]+S[6]*dt
if S[6]>1 then if S[5]>1 then
rem(P.dropFX,i) rem(P.dropFX,i)
end end
end end
--MoveFX
for i=#P.moveFX,1,-1 do
local S=P.moveFX[i]
S[4]=S[4]+S[5]*dt
if S[4]>1 then
rem(P.moveFX,i)
end
end
--ClearFX --ClearFX
for i=#P.clearFX,1,-1 do for i=#P.clearFX,1,-1 do
local S=P.clearFX[i] local S=P.clearFX[i]
@@ -410,15 +422,15 @@ local function Pupdate_alive(P,dt)
--Try spawn new block --Try spawn new block
if not P.control then goto stop end if not P.control then goto stop 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
if P.waiting<0 then P:popNext()end
goto stop goto stop
end end
--Natural block falling --Natural block falling
if P.cur then if P.cur then
if P.curY~=P.imgY then if P.curY>P.imgY then
local D=P.dropDelay local D=P.dropDelay
if D>1 then if D>1 then
P.dropDelay=D-1 P.dropDelay=D-1
@@ -426,18 +438,24 @@ local function Pupdate_alive(P,dt)
end end
if D==1 then if D==1 then
if P.gameEnv.moveFX and P.gameEnv.block then
P:createMoveFX("down")
end
P.curY=P.curY-1 P.curY=P.curY-1
else else
local _=P.curY-P.imgY--Max fall dist
D=1/D--Fall dist D=1/D--Fall dist
if D<_ then if D>P.curY-P.imgY then D=P.curY-P.imgY end
P.curY=P.curY-D if P.gameEnv.moveFX and P.gameEnv.block then
-- assert(P.curY==int(P.curY),"y:"..P.curY.." fall:"..D.." D_env:"..P.gameEnv.drop) for i=1,D do
P:createMoveFX("down")
P.curY=P.curY-1
end
else else
P.curY=P.imgY P.curY=P.curY-D
end end
-- assert(P.curY==int(P.curY),"y:"..P.curY.." fall:"..D.." D_env:"..P.gameEnv.drop)
end end
P:freshMinY() P:freshBlock(true,true)
P.spinLast=false P.spinLast=false
if P.imgY~=P.curY then if P.imgY~=P.curY then
@@ -533,25 +551,29 @@ end
local function drawFXs(P) local function drawFXs(P)
--LockFX --LockFX
for i=1,#P.lockFX do for i=1,#P.lockFX do
_=P.lockFX[i] local S=P.lockFX[i]
if _[3]<.5 then if S[3]<.5 then
gc.setColor(1,1,1,2*_[3]) gc.setColor(1,1,1,2*S[3])
gc.rectangle("fill",_[1],_[2],60*_[3],30) gc.rectangle("fill",S[1],S[2],60*S[3],30)
else else
gc.setColor(1,1,1,2-2*_[3]) gc.setColor(1,1,1,2-2*S[3])
gc.rectangle("fill",_[1]+30,_[2],60*_[3]-60,30) gc.rectangle("fill",S[1]+30,S[2],60*S[3]-60,30)
end end
end end
--DropFX --DropFX
for i=1,#P.dropFX do for i=1,#P.dropFX do
_=P.dropFX[i] local S=P.dropFX[i]
gc.setColor(1,1,1,.6-_[6]*.6) gc.setColor(1,1,1,.6-S[5]*.6)
for x=_[2],_[4]do local w=30*S[3]*(1-S[5]*.5)
for y=_[5],_[3]do gc.rectangle("fill",30*S[1]-30+15*S[3]-w*.5,600-30*S[2],w,30*S[4])
drawPixel(y,x,_[1])
end
end end
--MoveFX
for i=1,#P.moveFX do
local S=P.moveFX[i]
gc.setColor(1,1,1,.6-S[4]*.6)
drawPixel(S[3],S[2],S[1])
end end
--ClearFX --ClearFX
@@ -636,7 +658,7 @@ local function Pdraw_norm(P)
end end end end
end end
local dy=P.gameEnv.smooth and P.imgY~=P.curY and (min(P.dropDelay,1e99)/P.gameEnv.drop-1)*30 or 0 local dy=P.gameEnv.smooth and P.imgY~=P.curY and(P.dropDelay/P.gameEnv.drop-1)*30 or 0
gc.translate(0,-dy) gc.translate(0,-dy)
local trans=P.lockDelay/P.gameEnv.lock local trans=P.lockDelay/P.gameEnv.lock
if P.gameEnv.block then if P.gameEnv.block then
@@ -680,13 +702,18 @@ local function Pdraw_norm(P)
::E:: ::E::
gc.setScissor() gc.setScissor()
gc.translate(0,-P.fieldBeneath) gc.translate(0,-P.fieldBeneath)
gc.setColor(1,1,1)
gc.rectangle("line",301,0,15,601)--AtkBuffer boarder
gc.rectangle("line",-16,-3,15,604)--B2b bar boarder
gc.setColor(P.frameColor) gc.setColor(P.frameColor)
gc.rectangle("line",-1,-11,302,612)--Boarder gc.rectangle("line",-1,-11,302,612)--Boarder
gc.rectangle("line",301,0,15,601)--AtkBuffer boarder
gc.rectangle("line",-16,-3,15,604)--B2b bar boarder
--LockDelay indicator --LockDelay indicator
if P.gameEnv.easyFresh then
gc.setColor(1,1,1)
else
gc.setColor(1,.26,.26)
end
if P.lockDelay>=0 then if P.lockDelay>=0 then
gc.rectangle("fill",0,602,300*P.lockDelay/P.gameEnv.lock,6)--Lock delay indicator gc.rectangle("fill",0,602,300*P.lockDelay/P.gameEnv.lock,6)--Lock delay indicator
end end
@@ -811,6 +838,12 @@ local function Pdraw_norm(P)
mStr(format("%.2f",P.stat.time),-81,518)--Time mStr(format("%.2f",P.stat.time),-81,518)--Time
mStr(P.score1,-81,560)--Score mStr(P.score1,-81,560)--Score
--Display Ys
-- gc.setLineWidth(6)
-- if P.curY then gc.setColor(1,.4,0,.626)gc.line(0,611-P.curY*30,300,611-P.curY*30)end
-- if P.imgY then gc.setColor(0,1,.4,.626)gc.line(0,615-P.imgY*30,300,615-P.imgY*30)end
-- if P.minY then gc.setColor(0,.4,1,.626)gc.line(0,619-P.minY*30,300,619-P.minY*30)end
--Other messages --Other messages
gc.setColor(1,1,1) gc.setColor(1,1,1)
curMode.mesDisp(P) curMode.mesDisp(P)
@@ -979,11 +1012,11 @@ end
--------------------------<FX>-------------------------- --------------------------<FX>--------------------------
function player.showText(P,text,dx,dy,font,style,spd,stop) function player.showText(P,text,dx,dy,font,style,spd,stop)
if P.gameEnv.text then if P.gameEnv.text then
P.bonus[#P.bonus+1]=TEXT.getText(text,150+dx,300+dy,font*P.size,style,spd,stop) ins(P.bonus,TEXT.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) function player.showTextF(P,text,dx,dy,font,style,spd,stop)
P.bonus[#P.bonus+1]=TEXT.getText(text,150+dx,300+dy,font*P.size,style,spd,stop) ins(P.bonus,TEXT.getText(text,150+dx,300+dy,font*P.size,style,spd,stop))
end end
local function without(L,e) local function without(L,e)
for i=1,#L do for i=1,#L do
@@ -993,7 +1026,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=12-P.gameEnv.lockFX*3 local t=12-P.gameEnv.lockFX*2
for i=1,P.r do for i=1,P.r do
local y=P.curY+i-1 local y=P.curY+i-1
@@ -1007,9 +1040,49 @@ function player.createLockFX(P)
end end
end end
end end
function player.createDropFX(P,x1,y1,x2,y2)--x1<x2,y1>y2! function player.creatDropFX(P,x,y,w,h)--TODO, remake dropFX
if P.gameEnv.block and y1>=y2 then ins(P.dropFX,{x,y,w,h,0,13-2*P.gameEnv.dropFX})
P.dropFX[#P.dropFX+1]={P.cur.color,x1,y1,x2,y2,0,12-2*P.gameEnv.dropFX} end
function player.createMoveFX(P,dir)
local T=10-1.5*P.gameEnv.moveFX
local C=P.cur.color
local x=P.curX-1
local y=P.gameEnv.smooth and P.curY+P.dropDelay/P.gameEnv.drop-2 or P.curY-1
if dir=="left"then
for i=1,P.r do
for j=P.c,1,-1 do
if P.cur.bk[i][j]then
ins(P.moveFX,{C,x+j,y+i,0,T})
break
end
end
end
elseif dir=="right"then
for i=1,P.r do
for j=1,P.c do
if P.cur.bk[i][j]then
ins(P.moveFX,{C,x+j,y+i,0,T})
break
end
end
end
elseif dir=="down"then
for j=1,P.c do
for i=P.r,1,-1 do
if P.cur.bk[i][j]then
ins(P.moveFX,{C,x+j,y+i,0,T})
break
end
end
end
else
for i=1,P.r do
for j=1,P.c do
if P.cur.bk[i][j]then
ins(P.moveFX,{C,x+j,y+i,0,T})
end
end
end
end end
end end
function player.createBeam(P,R,send,time,target,color,clear,spin,combo) function player.createBeam(P,R,send,time,target,color,clear,spin,combo)
@@ -1063,7 +1136,7 @@ function player.createBeam(P,R,send,time,target,color,clear,spin,combo)
radius=radius*.4 radius=radius*.4
a=.35 a=.35
end end
FX_attack[#FX_attack+1]={ ins(FX_attack,{
x=x1,y=y1,--Current pos x=x1,y=y1,--Current pos
x1=x1,y1=y1,--Start pos x1=x1,y1=y1,--Start pos
x2=x2,y2=y2,--End pos x2=x2,y2=y2,--End pos
@@ -1073,14 +1146,14 @@ function player.createBeam(P,R,send,time,target,color,clear,spin,combo)
r=r,g=g,b=b,a=a*(setting.atkFX+5)*.1, r=r,g=g,b=b,a=a*(setting.atkFX+5)*.1,
t=0, t=0,
drag={},--Afterimage coordinate list drag={},--Afterimage coordinate list
} })
end end
function player.newTask(P,code,data) function player.newTask(P,code,data)
local L=P.tasks local L=P.tasks
L[#L+1]={ ins(L,{
code=code, code=code,
data=data, data=data,
} })
end end
--------------------------</FX>-------------------------- --------------------------</FX>--------------------------
@@ -1215,7 +1288,7 @@ function player.garbageRise(P,color,amount,pos)
_=P.dropFX[i] _=P.dropFX[i]
_[3],_[5]=_[3]+amount,_[5]+amount _[3],_[5]=_[3]+amount,_[5]+amount
end end
if #P.field>40 then P:lose()end if #P.field>42 then P:lose()end
end end
local invList={2,1,4,3,5,6,7} local invList={2,1,4,3,5,6,7}
@@ -1238,7 +1311,7 @@ function player.pushLine(P,L,mir)
P.fieldBeneath=P.fieldBeneath+120 P.fieldBeneath=P.fieldBeneath+120
P.curY=P.curY+#L P.curY=P.curY+#L
P.imgY=P.imgY+#L P.imgY=P.imgY+#L
P:freshgho() P:freshBlock(false,false)
end end
function player.pushNext(P,L,mir) function player.pushNext(P,L,mir)
for i=1,#L do for i=1,#L do
@@ -1288,15 +1361,14 @@ function player.changeAtk(P,R)
end end
if R then if R then
P.atking=R P.atking=R
R.atker[#R.atker+1]=P ins(R.atker,P)
else else
P.atking=nil P.atking=nil
end end
end end
function player.freshgho(P) function player.freshBlock(P,keepGhost,control,system)
if not P.cur then return end if not keepGhost and P.cur then
P.imgY=min(#P.field+1,P.curY) P.imgY=min(#P.field+1,P.curY)
if P.gameEnv._20G or P.keyPressing[7]and P.gameEnv.sdarr==0 then if P.gameEnv._20G or P.keyPressing[7]and P.gameEnv.sdarr==0 then
local _=P.imgY local _=P.imgY
@@ -1312,8 +1384,8 @@ function player.freshgho(P)
--Create FX if dropped --Create FX if dropped
if P.curY>P.imgY then if P.curY>P.imgY then
if P.gameEnv.dropFX then if P.gameEnv.dropFX and P.gameEnv.block and P.curY-P.imgY-P.r>-1 then
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.imgY+P.r-1) P:creatDropFX(P.curX,P.curY-1,P.c,P.curY-P.imgY-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
@@ -1325,30 +1397,38 @@ function player.freshgho(P)
P.imgY=P.imgY-1 P.imgY=P.imgY-1
end end
end end
end
function player.freshLockDelay(P)
--Return when fall-fresh but no fall
if not P.gameEnv.easyFresh and P.curY>=P.minY then
return
end end
local d,d0=P.lockDelay,P.gameEnv.lock if control then
if d<d0 and(P.freshTime<P.gameEnv.freshLimit or P.curY<P.minY)then if P.gameEnv.easyFresh then
if P.lockDelay<P.gameEnv.lock then local d0=P.gameEnv.lock
if P.lockDelay<d0 and P.freshTime<P.gameEnv.freshLimit then
if not system then
P.freshTime=P.freshTime+1
end
P.lockDelay=d0
P.dropDelay=P.gameEnv.drop P.dropDelay=P.gameEnv.drop
end end
P.freshTime=P.freshTime+1
P.lockDelay=min(d+d0*.6,d0)
end
end
function player.freshMinY(P)
if P.curY<P.minY then if P.curY<P.minY then
P.freshTime=max(P.freshTime-1,0)
P.minY=P.curY P.minY=P.curY
P.dropDelay=P.gameEnv.drop
P.lockDelay=P.gameEnv.lock P.lockDelay=P.gameEnv.lock
end end
else
if P.curY<P.minY then
P.minY=P.curY
if P.lockDelay<P.gameEnv.lock and P.freshTime<P.gameEnv.freshLimit then
P.freshTime=P.freshTime+1
P.dropDelay=P.gameEnv.drop
P.lockDelay=P.gameEnv.lock
end
end
end
end
end end
function player.lock(P) function player.lock(P)
local dest=P.AI_dest
local has_dest=dest~=nil
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 not P.field[y]then P.field[y],P.visTime[y]=freeRow.get(0),freeRow.get(0)end if not P.field[y]then P.field[y],P.visTime[y]=freeRow.get(0),freeRow.get(0)end
@@ -1356,8 +1436,24 @@ function player.lock(P)
if P.cur.bk[i][j]then if P.cur.bk[i][j]then
P.field[y][P.curX+j-1]=P.cur.color P.field[y][P.curX+j-1]=P.cur.color
P.visTime[y][P.curX+j-1]=P.showTime P.visTime[y][P.curX+j-1]=P.showTime
local x=P.curX+j-1
if dest then
local original_length=#dest
for k=1,original_length do
if x==dest[k][1]and y==dest[k][2]then
rem(dest, k)
break
end end
end end
if #dest~=original_length-1 then
dest=nil
end
end
end
end
end
if has_dest and not dest then
CC_updateField(P)
end end
end end
function player.spin(P,d,ifpre) function player.spin(P,d,ifpre)
@@ -1370,7 +1466,9 @@ function player.spin(P,d,ifpre)
local ix,iy=P.curX+P.sc[2]-isc[2],P.curY+P.sc[1]-isc[1] local ix,iy=P.curX+P.sc[2]-isc[2],P.curY+P.sc[1]-isc[1]
iki=iki[P.dir*10+idir] iki=iki[P.dir*10+idir]
if not iki then if not iki then
if P.gameEnv.easyFresh then P:freshLockDelay()end if P.gameEnv.easyFresh then
P:freshBlock(false,true)
end
SFX.fieldPlay(ifpre and"prerotate"or "rotate",nil,P) SFX.fieldPlay(ifpre and"prerotate"or "rotate",nil,P)
return return
end end
@@ -1378,17 +1476,17 @@ function player.spin(P,d,ifpre)
local x,y=ix+iki[test][1],iy+iki[test][2] local x,y=ix+iki[test][1],iy+iki[test][2]
if not P:ifoverlap(icb,x,y)and(P.freshTime<=P.gameEnv.freshLimit or iki[test][2]<0)then if not P:ifoverlap(icb,x,y)and(P.freshTime<=P.gameEnv.freshLimit or iki[test][2]<0)then
ix,iy=x,y ix,iy=x,y
if P.gameEnv.dropFX then if P.gameEnv.moveFX and P.gameEnv.block then
P:createDropFX(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY) P:createMoveFX()
end end
P.curX,P.curY,P.dir=ix,iy,idir P.curX,P.curY,P.dir=ix,iy,idir
P.sc,P.cur.bk=scs[P.cur.id][idir],icb P.sc,P.cur.bk=scs[P.cur.id][idir],icb
P.r,P.c=ir,ic P.r,P.c=ir,ic
P.spinLast=test==2 and 0 or 1 P.spinLast=test==2 and 0 or 1
if not ifpre then P:freshgho()end if not ifpre then
P:freshLockDelay() P:freshBlock(false,true)
P:freshMinY() end
if iki[test][2]>0 then if iki[test][2]>0 and not P.gameEnv.easyFresh then
P.freshTime=P.freshTime+1 P.freshTime=P.freshTime+1
end end
@@ -1487,8 +1585,10 @@ function player.hold(P,ifpre)
end end
if C then if C then
P:resetBlock() P:resetBlock()
P:freshgho() P:freshBlock(false,true)
P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,max(P.freshTime-5,0) P.dropDelay=P.gameEnv.drop
P.lockDelay=P.gameEnv.lock
P.freshTime=max(P.freshTime-5,0)
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end
end end
@@ -1501,7 +1601,7 @@ end
function player.getNext(P,n) function player.getNext(P,n)
local E=P.gameEnv 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} ins(P.next,{bk=blocks[n][E.face[n]],id=n,color=E.bone and 12 or E.skin[n],name=n})
end end
function player.popNext(P)--Pop next queue to hand function player.popNext(P)--Pop next queue to hand
P.holded=false P.holded=false
@@ -1529,15 +1629,23 @@ function player.popNext(P)--Pop next queue to hand
P:resetBlock() P:resetBlock()
end end
P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,0 P.dropDelay=P.gameEnv.drop
P.lockDelay=P.gameEnv.lock
P.freshTime=0
if P.cur then if P.cur then
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end if P:ifoverlap(P.cur.bk,P.curX,P.curY)then
P:freshgho() P:lock()
P:lose()
end
P:freshBlock(false,true,true)
end end
--IHdS --IHdS
if _[6]then P.act.hardDrop(P)_[6]=false end if _[6]then
P.act.hardDrop(P)
_[6]=false
end
end end
end end
@@ -1624,7 +1732,7 @@ function player.drop(P)--Place piece
--Create clearing FX --Create clearing FX
if cc>0 and P.gameEnv.clearFX then if cc>0 and P.gameEnv.clearFX then
local l=P.clearedRow local l=P.clearedRow
local t=6-P.gameEnv.clearFX*1.5 local t=7-P.gameEnv.clearFX*1
for i=1,cc do for i=1,cc do
ins(P.clearFX,{l[i],0,t}) ins(P.clearFX,{l[i],0,t})
end end
@@ -1634,8 +1742,13 @@ function player.drop(P)--Place piece
if P.gameEnv.lockFX then if P.gameEnv.lockFX then
if cc==0 then if cc==0 then
P:createLockFX() P:createLockFX()
elseif P.lockFX[1]then else
P.lockFX={} _=#P.lockFX
if _>0 then
for i=1,_ do
rem(P.lockFX)
end
end
end end
end end
@@ -1942,7 +2055,7 @@ function player.drop(P)--Place piece
if P.dropSpeed>60 then if P.dropSpeed>60 then
dropScore=dropScore*P.dropSpeed/60 dropScore=dropScore*P.dropSpeed/60
elseif P.dropSpeed>120 then elseif P.dropSpeed>120 then
dropScore=dropScore*1,2*P.dropSpeed/120 dropScore=dropScore*1.2*P.dropSpeed/120
elseif P.dropSpeed>180 then elseif P.dropSpeed>180 then
dropScore=dropScore*1.5*P.dropSpeed/180 dropScore=dropScore*1.5*P.dropSpeed/180
end end
@@ -2237,9 +2350,11 @@ function player.act.moveLeft(P,auto)
end end
elseif P.control and P.waiting==-1 then elseif P.control and P.waiting==-1 then
if P.cur and not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then if P.cur and not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then
if P.gameEnv.moveFX and P.gameEnv.block then
P:createMoveFX("left")
end
P.curX=P.curX-1 P.curX=P.curX-1
P:freshgho() P:freshBlock(false,true)
P:freshLockDelay()
if P.human and P.curY==P.imgY then SFX.play("move")end if P.human and P.curY==P.imgY then SFX.play("move")end
if not auto then P.moving=0 end if not auto then P.moving=0 end
P.spinLast=false P.spinLast=false
@@ -2262,9 +2377,11 @@ function player.act.moveRight(P,auto)
end end
elseif P.control and P.waiting==-1 then elseif P.control and P.waiting==-1 then
if P.cur and not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)then if P.cur and not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)then
if P.gameEnv.moveFX and P.gameEnv.block then
P:createMoveFX("right")
end
P.curX=P.curX+1 P.curX=P.curX+1
P:freshgho() P:freshBlock(false,true)
P:freshLockDelay()
if P.human and P.curY==P.imgY then SFX.play("move")end if P.human and P.curY==P.imgY then SFX.play("move")end
if not auto then P.moving=0 end if not auto then P.moving=0 end
P.spinLast=false P.spinLast=false
@@ -2303,9 +2420,9 @@ function player.act.hardDrop(P)
end end
P.keyPressing[6]=false P.keyPressing[6]=false
elseif P.control and P.waiting==-1 and P.cur then elseif P.control and P.waiting==-1 and P.cur then
if P.curY~=P.imgY then if P.curY>P.imgY then
if P.gameEnv.dropFX then if P.gameEnv.dropFX and P.gameEnv.block and P.curY-P.imgY-P.r>-1 then
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.imgY+P.r-1) P:creatDropFX(P.curX,P.curY-1,P.c,P.curY-P.imgY-P.r+1)
end end
P.curY=P.imgY P.curY=P.imgY
P.spinLast=false P.spinLast=false
@@ -2330,9 +2447,9 @@ function player.act.softDrop(P)
else else
P.downing=1 P.downing=1
if P.control and P.waiting==-1 and P.cur then if P.control and P.waiting==-1 and P.cur then
if P.curY~=P.imgY then if P.curY>P.imgY then
P.curY=P.curY-1 P.curY=P.curY-1
P:freshMinY() P:freshBlock(true,true)
P.spinLast=false P.spinLast=false
end end
end end
@@ -2356,14 +2473,13 @@ function player.act.insLeft(P,auto)
if P.gameEnv.nofly or not P.cur then return end if P.gameEnv.nofly or not P.cur then return end
local x0=P.curX local x0=P.curX
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 if P.gameEnv.moveFX and P.gameEnv.block then
if P.gameEnv.dropFX then P:createMoveFX("left")
P:createDropFX(P.curX+P.c,P.curY+P.r-1,P.curX+P.c,P.curY)
end end
P:freshgho() P.curX=P.curX-1
P:freshBlock(false,true)
end end
if P.curX~=x0 then if P.curX~=x0 then
P:freshLockDelay()
P.spinLast=false P.spinLast=false
end end
if P.gameEnv.shakeFX then if P.gameEnv.shakeFX then
@@ -2379,14 +2495,13 @@ function player.act.insRight(P,auto)
if P.gameEnv.nofly or not P.cur then return end if P.gameEnv.nofly or not P.cur then return end
local x0=P.curX local x0=P.curX
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 if P.gameEnv.moveFX and P.gameEnv.block then
if P.gameEnv.dropFX then P:createMoveFX("right")
P:createDropFX(P.curX-1,P.curY+P.r-1,P.curX-1,P.curY)
end end
P:freshgho() P.curX=P.curX+1
P:freshBlock(false,true)
end end
if P.curX~=x0 then if P.curX~=x0 then
P:freshLockDelay()
P.spinLast=false P.spinLast=false
end end
if P.gameEnv.shakeFX then if P.gameEnv.shakeFX then
@@ -2399,29 +2514,32 @@ function player.act.insRight(P,auto)
end end
end end
function player.act.insDown(P) function player.act.insDown(P)
if P.curY~=P.imgY and P.cur then if P.curY>P.imgY and P.cur then
if P.gameEnv.dropFX then if P.gameEnv.dropFX and P.gameEnv.block and P.curY-P.imgY-P.r>-1 then
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.imgY+P.r-1) P:creatDropFX(P.curX,P.curY-1,P.c,P.curY-P.imgY-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
end end
P.curY,P.lockDelay,P.spinLast=P.imgY,P.gameEnv.lock,false P.curY,P.lockDelay,P.spinLast=P.imgY,P.gameEnv.lock,false
P:freshMinY() P:freshBlock(true,true)
end end
end end
function player.act.down1(P) function player.act.down1(P)
if P.curY~=P.imgY and P.cur then if P.curY>P.imgY and P.cur then
if P.gameEnv.moveFX and P.gameEnv.block then
P:createMoveFX("down")
end
P.curY=P.curY-1 P.curY=P.curY-1
P:freshMinY() P:freshBlock(true,true)
P.spinLast=false P.spinLast=false
end end
end end
function player.act.down4(P) function player.act.down4(P)
for _=1,4 do for _=1,4 do
if P.curY~=P.imgY and P.cur then if P.curY>P.imgY and P.cur then
P.curY=P.curY-1 P.curY=P.curY-1
P:freshMinY() P:freshBlock(true,true)
P.spinLast=false P.spinLast=false
else else
return return
@@ -2431,9 +2549,9 @@ end
function player.act.down10(P) function player.act.down10(P)
if P.cur then if P.cur then
for _=1,10 do for _=1,10 do
if P.curY~=P.imgY then if P.curY>P.imgY then
P.curY=P.curY-1 P.curY=P.curY-1
P:freshMinY() P:freshBlock(true,true)
P.spinLast=false P.spinLast=false
else else
return return
@@ -2466,14 +2584,16 @@ function player.act.zangiRight(P)
P.act.hardDrop(P) P.act.hardDrop(P)
end end
--Give operations a num name --Give operations a num name
A=player.act do
T={ local A=player.act
local T={
A.moveLeft ,A.moveRight, A.rotRight, A.rotLeft, A.moveLeft ,A.moveRight, A.rotRight, A.rotLeft,
A.rot180 ,A.hardDrop, A.softDrop, A.hold, A.rot180 ,A.hardDrop, A.softDrop, A.hold,
A.func ,A.restart, A.insLeft, A.insRight, A.func ,A.restart, A.insLeft, A.insRight,
A.insDown ,A.down1, A.down4, A.down10, A.insDown ,A.down1, A.down4, A.down10,
A.dropLeft ,A.dropRight, A.zangiLeft,A.zangiRight A.dropLeft ,A.dropRight, A.zangiLeft,A.zangiRight
}for i=1,20 do A[i]=T[i]end;A,T=nil }for i=1,20 do A[i]=T[i]end
end
--------------------------</Control>-------------------------- --------------------------</Control>--------------------------
--------------------------<Generator>-------------------------- --------------------------<Generator>--------------------------
@@ -2567,7 +2687,7 @@ local function newEmptyPlayer(id,x,y,size)
P.fieldBeneath=0 P.fieldBeneath=0
P.score1,P.b2b1=0,0 P.score1,P.b2b1=0,0
P.dropFX,P.lockFX,P.clearFX={},{},{} P.dropFX,P.moveFX,P.lockFX,P.clearFX={},{},{},{}
P.tasks={}--Tasks P.tasks={}--Tasks
P.bonus={}--Texts P.bonus={}--Texts
@@ -2579,15 +2699,20 @@ end
local function loadGameEnv(P)--Load gameEnv local function loadGameEnv(P)--Load gameEnv
P.gameEnv={}--Current game setting environment P.gameEnv={}--Current game setting environment
local ENV=P.gameEnv local ENV=P.gameEnv
local E
--Load game settings --Load game settings
for k,v in next,gameEnv0 do for k,v in next,gameEnv0 do
if modeEnv[k]~=nil then if modeEnv[k]~=nil then
v=modeEnv[k] --Mode setting v=modeEnv[k] --Mode setting
-- DBP("mode-"..k..":"..tostring(v))
elseif game.setting[k]~=nil then elseif game.setting[k]~=nil then
v=game.setting[k] --Game setting v=game.setting[k] --Game setting
-- DBP("game-"..k..":"..tostring(v))
elseif setting[k]~=nil then elseif setting[k]~=nil then
v=setting[k] --Global setting v=setting[k] --Global setting
-- DBP("global-"..k..":"..tostring(v))
-- else
-- DBP("default-"..k..":"..tostring(v))
end end
ENV[k]=v --Default setting ENV[k]=v --Default setting
end end
@@ -2623,6 +2748,7 @@ local function applyGameEnv(P)--Finish gameEnv processing
if ENV.lockFX==0 then ENV.lockFX=nil end if ENV.lockFX==0 then ENV.lockFX=nil end
if ENV.dropFX==0 then ENV.dropFX=nil end if ENV.dropFX==0 then ENV.dropFX=nil end
if ENV.moveFX==0 then ENV.moveFX=nil end
if ENV.clearFX==0 then ENV.clearFX=nil end if ENV.clearFX==0 then ENV.clearFX=nil end
if ENV.shakeFX==0 then ENV.shakeFX=nil end if ENV.shakeFX==0 then ENV.shakeFX=nil end
end end
@@ -2696,8 +2822,11 @@ function PLY.newDemoPlayer(id,x,y,size)
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, text=setting.text,
lockFX=setting.lockFX,dropFX=setting.dropFX, lockFX=setting.lockFX,
clearFX=setting.clearFX,shakeFX=setting.shakeFX, dropFX=setting.dropFX,
moveFX=setting.moveFX,
clearFX=setting.clearFX,
shakeFX=setting.shakeFX,
_20G=false,bone=false, _20G=false,bone=false,
drop=1e99,lock=1e99, drop=1e99,lock=1e99,
@@ -2745,9 +2874,9 @@ end
function PLY.newRemotePlayer(id,x,y,size,actions) function PLY.newRemotePlayer(id,x,y,size,actions)
local P=newEmptyPlayer(id,x,y,size) local P=newEmptyPlayer(id,x,y,size)
P.human=false -- 录像不是人为操作 P.human=false
P.remote=true -- 远程操作 P.remote=true
-- 开发中
-- P.updateAction=buildActionFunctionFromActions(P, actions) -- P.updateAction=buildActionFunctionFromActions(P, actions)
loadGameEnv(P) loadGameEnv(P)
@@ -2761,6 +2890,7 @@ function PLY.newAIPlayer(id,x,y,size,AIdata)
ENV.text=false ENV.text=false
ENV.lockFX=nil ENV.lockFX=nil
ENV.dropFX=nil ENV.dropFX=nil
ENV.moveFX=nil
ENV.shakeFX=nil ENV.shakeFX=nil
end end

View File

@@ -67,7 +67,7 @@ function Tick.throwBadge(data)--{ifAI,Sender,timer}
end end
function Tick.autoPause(data) function Tick.autoPause(data)
data[1]=data[1]+1 data[1]=data[1]+1
if SCN.cur~="play"then return end if SCN.cur~="play"then return true end
if data[1]==120 then if data[1]==120 then
if SCN.cur=="play"then if SCN.cur=="play"then
pauseGame() pauseGame()

View File

@@ -6,62 +6,57 @@ local S=[=[
靏鸖龘龘 込余 saki 靏鸖龘龘 込余 saki
模电 模电
[rmb10+]: [rmb10+]:
八零哥 蕴空之灵 gggf127 dtg 八零哥 蕴空之灵 gggf127 dtg ThTsOd
ThTsOd Fireboos 金巧 10元 Fireboos 金巧 10元 立斐 Deep_Sea
立斐 Deep_Sea 时雪 yyangdid 时雪 yyangdid sfqr 心痕 Sasoric
sfqr 心痕 Sasoric 夏小亚 仁参 夏小亚 仁参 乐↗乐↘ 喜欢c4w的ztcjoin
乐↗乐↘ 喜欢c4w的ztcjoin 面包 蠢熏 面包 蠢熏 潘一栗 Lied 星街书婉 祝西
潘一栗 Lied 星街书婉 祝西 829 829 e m*12 我永远爱白银诺艾尔(鹏 PCX
e m*12 我永远爱白银诺艾尔(鹏 PCX
kagura77 呆喂 GlowingEmbers 轩辕辚 kagura77 呆喂 GlowingEmbers 轩辕辚
HimuroAki TCV100 tech有养成系统了@7065 HimuroAki TCV100 tech有养成系统了@7065
HAGE KANOBU 闪电和拐棍 葡萄味的曼妥思 HAGE KANOBU 闪电和拐棍 葡萄味的曼妥思
世界沃德 蓝绿 天生的魔法师 琳雨空 世界沃德 蓝绿 天生的魔法师 琳雨空 T8779.易缄
T8779.易缄 吃水榴莲 诗情画意 星姐阿夸双推Man暗炎 吃水榴莲 诗情画意 星姐阿夸双推Man暗炎 [*炎]
[*炎] [*Y] aaa222 [**城] cnDD [*Y] aaa222 [**城] cnDD 红桃老给
红桃老给 昭庭玲秋 旋树墩 火花工作室 昭庭玲秋 旋树墩 火花工作室 Cosine 天上_飞
Cosine
Thanks!!! Thanks!!!
Future outlook: Future outlook:
New modes: New modes:
PUYO
game tutorial
finesse tutorial/exam(3next, 1pt/mino, drop to score)
game Abbr. test
backfire
round-based dig
bigbang
rhythm
combo
square
field shifting(left/right)
task survival
dig practice dig practice
dig zen dig zen
symmetry infinite PC challenge
hidden: sound only
reverb (often repeat a piece many times) reverb (often repeat a piece many times)
game tutorial
finesse tutorial/exam (3next, 1pt/mino, drop to score)
easy finesse (only revert current)
combo
backfire
bigbang
rhythm
KPP-locked KPP-locked
square
task survival
symmetry
game Abbr. test
parkour parkour
Other: Other:
mod system with: mod system with:
block/field/up/low hidden block/field/up/low hidden
next[1] hidden next[1-n] hidden
field flip(LR/UD) field flip(LR/UD)
no fail(∞ lives) no fail(∞ lives)
mini games: mini games:
15 puzzle (with hidden mode) 15 puzzle (with hidden mode)
2048 (with next (with deadly mode)) 2048 (with next/deadly mode)
mine sweeper mine sweeper
tank battle tank battle
new AI: task-Z new AI: task-Z
cool backgrounds
'Encrypt'(compile to byte code) 'Encrypt'(compile to byte code)
better drop FX
60+ fps supporting 60+ fps supporting
in-game document in-game document
game recording save recordings
full-key control full-key control
drag control for mobile device drag control for mobile device
new widgets (joystick etc.) new widgets (joystick etc.)
@@ -69,6 +64,55 @@ Future outlook:
more graphic FXs & 3D features & animations more graphic FXs & 3D features & animations
network game network game
0.10.6: CC更新 Cold Clear update
新内容:
全平台支持新版CC(也许)
改动:
修改UVRY的踢墙表
修复:
O卡住的时候旋转不刷新锁定延迟
CC在发现重力过大后hold即报错
0.10.5: 特效更新 FX update
新内容:
瞬移特效独立为瞬降和移动(旋转)特效,增加移动特效滑条,各特效范围均为0~5
增加两个莫名其妙的背景(放在无尽和限时打分)
把之前不小心弄丢的自制蓝屏报错界面捡回来了
改动:
雷达图OPM参数改为ADPM
调整J/L/I的踢墙表
根据锁延刷新模式决定锁延指示条颜色
增加无尽挖掘连挖提示,挖完后下一波立即升起
new English translation by @MattMayuga#8789
修改100/400/1000L的评级要求
软件锁界面出现时机调整,按钮位置调整
调整混战模式倍率影响边框颜色的范围
软件锁也可显示tip
代码:
重命名大多数背景
重构create___FX函数
修复:
加载部分老版本存档报错
几个设置大标题样式不统一
有消行延迟+出块等待时连续硬降出现神秘现象
垃圾行上涨不刷新ghost
粘贴序列后光标位置错误
不能用键盘复制粘贴序列
每次启动游戏ai是一样的块序
0.10.4: 漏洞修复 Bug Fix
代码:
修改场景模块方法名
软件锁变量名从lock改为appLock
使用linter整理代码
重构锁延相关代码,freshgho,freshLockDelay,freshMinY合并为freshBlock
修复:
BPM120~180之间分数计算不正确
进不指定锁延的模式就报错
锁延机制错误(这次真修好了)
游戏结束后马上暂停并解除还会自动暂停(之前没修好)
提前硬降失效
0.10.3: 软件锁 APP Lock 0.10.3: 软件锁 APP Lock
新内容: 新内容:
设置增加软件锁选项,打开游戏后进入伪装界面 设置增加软件锁选项,打开游戏后进入伪装界面