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 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 ins,rem=table.insert,table.remove
local BG
local scr=scr
@@ -58,13 +59,158 @@ back.flink={
end
end,
}--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={
init=function()
t=rnd()*3600
BG.resize(scr.w,scr.h)
end,
resize=function(w,h)
SHADER.aura:send("w",w*scr.dpi)
SHADER.aura:send("w",scr.W)
SHADER.aura:send("h",h*scr.dpi)
end,
update=function(dt)
@@ -77,13 +223,13 @@ back.aura={
gc.setShader()
end,
}--Cool liquid background
back.game1={
back.bg1={
init=function()
t=0
BG.resize(scr.w)
end,
resize=function(w)
SHADER.gradient1:send("w",w*scr.dpi)
SHADER.gradient1:send("w",scr.W)
end,
update=function(dt)
t=t+dt
@@ -95,7 +241,7 @@ back.game1={
gc.setShader()
end,
}--Horizonal red-blue gradient
back.game2={
back.bg2={
init=function()
t=0
BG.resize(nil,scr.h)
@@ -113,13 +259,13 @@ back.game2={
gc.setShader()
end,
}--Vertical red-green gradient
back.game3={
back.rainbow={
init=function()
t=0
BG.resize(scr.w,scr.h)
end,
resize=function(w,h)
SHADER.rgb1:send("w",w*scr.dpi)
SHADER.rgb1:send("w",scr.W)
SHADER.rgb1:send("h",h*scr.dpi)
end,
update=function(dt)
@@ -132,13 +278,13 @@ back.game3={
gc.setShader()
end,
}--Colorful RGB
back.game4={
back.rainbow2={
init=function()
t=0
BG.resize(scr.w,scr.h)
end,
resize=function(w,h)
SHADER.rgb2:send("w",w*scr.dpi)
SHADER.rgb2:send("w",scr.W)
SHADER.rgb2:send("h",h*scr.dpi)
end,
update=function(dt)
@@ -151,7 +297,7 @@ back.game4={
gc.setShader()
end,
}--Blue RGB
back.game5={
back.lightning={
init=function()
t=0
end,
@@ -168,7 +314,7 @@ back.game5={
local blocks=require("parts/mino")
local scs=require("parts/spinCenters")
back.game6={
back.lightning2={
init=function()
t=0
colorLib=_G.SKIN.libColor
@@ -251,7 +397,7 @@ back.space={
gc.translate(10,10)
end,
discard=function()
stars={}
stars=nil
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.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.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.event then bg.event= NULL end setfenv(bg.event ,BGvars)
if not bg.discard then bg.discard=NULL end setfenv(bg.discard ,BGvars)
end
BG={
@@ -270,6 +417,11 @@ BG={
update=NULL,
draw=back.none.draw,
}
function BG.send(data)
if BG.event then
BG.event(data)
end
end
function BG.set(bg,data)
if bg==BG.cur or not setting.bg then return end
if BG.discard then
@@ -282,8 +434,9 @@ function BG.set(bg,data)
BG.init=bg.init or NULL
BG.resize=bg.resize or NULL
BG.update=bg.update or NULL
BG.discard=bg.discard or NULL
BG.draw=bg.draw or NULL
BG.event=bg.event or NULL
BG.discard=bg.discard or NULL
BG.init()
end
return BG

View File

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

View File

@@ -170,13 +170,15 @@ function keyDown.calculator(k)
end
S.sym="="
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
elseif S.val==196022 then
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)
SFX.play("clear")
elseif S.val==72943816 then
S.pass=true
for name,M in next,Modes do
if not modeRanks[name]then
modeRanks[name]=M.score and 0 or 6
@@ -185,14 +187,27 @@ function keyDown.calculator(k)
FILE.saveUnlock()
TEXT.show("\68\69\86\58\85\78\76\79\67\75\65\76\76",640,360,60,"stretch",.6)
SFX.play("clear_2")
elseif S.val==137926261379 then
SCN.goto("debug")
elseif S.val==1379e8+2626e4+1379 then
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
elseif k=="space"then
if S.pass then
SCN.goto("load")
end
elseif k=="escape"then
S.val,S.reg,S.sym=0
elseif k=="delete"then
S.val=0
elseif k=="space"and S.pass then
SCN.swapTo("intro")
end
end
@@ -203,6 +218,8 @@ function keyDown.load(k)
elseif k=="s"then
marking=nil
sceneTemp.skip=true
elseif k=="escape"then
SCN.back()
end
end
function touchDown.load(id,x,y)
@@ -215,8 +232,12 @@ function mouseDown.intro(x,y,k)
if k==2 then
VOC.play("bye")
SCN.back()
elseif newVersionLaunch then
SCN.push("main","fade")
SCN.swapTo("history","fade")
TEXT.show(text.newVersion,640,200,30,"fly",.3)
else
SCN.goto("main")
SCN.go("main")
end
end
function touchDown.intro(id,x,y)
@@ -339,7 +360,7 @@ function keyDown.mode(key)
end
elseif mapCam.sel=="custom_clear" or mapCam.sel=="custom_puzzle" then
if key=="e"then
SCN.goto("custom")
SCN.go("custom")
end
end
end
@@ -396,7 +417,7 @@ function keyDown.custom(key)
BGM.play(customRange.bgm[customSel[sel]])
end
elseif key=="q"then
SCN.goto("sequence")
SCN.go("sequence")
elseif key=="e"then
SCN.swapTo("draw","swipe")
elseif #key==1 then
@@ -429,8 +450,20 @@ function keyDown.sequence(key)
local C=s.cur+1
ins(preBag,C,key)
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
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
local C=s.cur+1
ins(preBag,C,i)
@@ -458,18 +491,6 @@ function keyDown.sequence(key)
else
sceneTemp.sure=50
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
@@ -685,7 +706,7 @@ function keyDown.pause(key)
elseif key=="escape"then
resumeGame()
elseif key=="s"then
SCN.goto("setting_sound")
SCN.go("setting_sound")
elseif key=="r"then
TASK.clear("play")
resetGameData()
@@ -1069,6 +1090,71 @@ function love.focus(f)
pauseGame()
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 devColor={
color.white,
@@ -1092,7 +1178,7 @@ function love.run()
local FCT=0--Framedraw counter
love.resize(gc.getWidth(),gc.getHeight())
SCN.init(setting.lock and "calculator"or"load")--Scene Launch
SCN.init("load")--Scene Launch
marking=true
return function()
@@ -1162,7 +1248,7 @@ function love.run()
--Draw scene swapping animation
if SCN.swapping then
_=SCN.swap
_=SCN.stat
_.draw(_.time)
end
@@ -1184,8 +1270,8 @@ function love.run()
for i=1,#LIST do
gc.rectangle("fill",900+2*i,_,2,-LIST[i]*4000)
end
if devMode==3 then WAIT(.26)
elseif devMode==4 then WAIT(.626)
if devMode==3 then WAIT(.1)
elseif devMode==4 then WAIT(.5)
end
end
@@ -1197,9 +1283,9 @@ function love.run()
if Timer()-lastFreshPow>2 and setting.powerInfo and loadingFinished then
updatePowerInfo()
lastFreshPow=Timer()
_=gc.getWidth()
if _~=scr.w then
love.resize(_,gc.getHeight())
if gc.getWidth()~=scr.w then
love.resize(gc.getWidth(),gc.getHeight())
TEXT.show("resized",200,100,30,"stretch")
end
end

View File

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

View File

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

View File

@@ -13,14 +13,15 @@ function sceneInit.calculator()
val=0,
sym=false,
pass=false,
tip=require("parts/getTip"),
}
end
function sceneInit.load()
sceneTemp={
phase=1,--Loading stage
cur=1,--Counter
tar=#VOC.name,--Loading bar lenth(current)
tip=require("parts/getTip"),
tar=#VOC.name,--Loading bar length(current)
tip=setting.appLock or require("parts/getTip"),
list={
#VOC.name,
#BGM.list,
@@ -48,16 +49,9 @@ function sceneInit.main()
BG.set("space")
BGM.play("blank")
game.frame=0
game.recording=false
game.replaying=false
game.seed=1046101471
game.rec={}
modeEnv={}
destroyPlayers()
--Create demo player
destroyPlayers()
PLY.newDemoPlayer(1,900,35,1.1)
end
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/%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.b2b,S.b3b,S.pc,S.hpc),
format("%d[%.2f%%]",S.extraPiece,100*max(1-S.extraRate/S.piece,0)),
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)),
},
--From right-down, 60 degree each
radar={
(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.send/S.time*60, --SendPM
S.piece/S.time*24, --LinePM
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",
}
local _=sceneTemp
@@ -204,7 +198,7 @@ function sceneInit.setting_control()
dir=1,
wait=30,
}
BG.set("game1")
BG.set("bg1")
end
function sceneInit.setting_key()
sceneTemp={
@@ -214,7 +208,7 @@ function sceneInit.setting_key()
}
end
function sceneInit.setting_touch()
BG.set("game3")
BG.set("rainbow")
sceneTemp={
default=1,
snap=1,
@@ -271,7 +265,7 @@ function sceneInit.stat()
end
end
function sceneInit.history()
BG.set("game3")
BG.set("rainbow")
sceneTemp={
text=require("parts/updateLog"),--Text list
pos=1,--Scroll pos
@@ -329,7 +323,7 @@ end
local SCN={
cur="load",--Current scene
swapping=false,--If Swapping
swap={
stat={
tar=nil, --Swapping target
style=nil, --Swapping style
mid=nil, --Loading point
@@ -340,7 +334,7 @@ local SCN={
}--Scene datas, returned
function SCN.swapUpdate()
local S=SCN.swap
local S=SCN.stat
S.time=S.time-1
if S.time==S.mid then
SCN.init(S.tar,SCN.cur)
@@ -395,7 +389,7 @@ local swap={
end},
}--Scene swapping animations
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
SCN.swapping=true
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]
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)
end
function SCN.back()

View File

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

View File

@@ -99,37 +99,37 @@ newSlider=WIDGET.newSlider
local Widgets={
load={},intro={},quit={},
calculator={
newKey({name="_1", x=300,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="_3", x=500,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="_5", x=400,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="_7", x=300,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="_9", x=500,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="<", x=400,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=600,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=600,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("/")}),
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}),
newKey({name="_1", x=150,y=300,w=90,h=90, color="white", font=50,code=pressKey("1")}),
newKey({name="_2", x=250,y=300,w=90,h=90, color="white", font=50,code=pressKey("2")}),
newKey({name="_3", x=350,y=300,w=90,h=90, color="white", font=50,code=pressKey("3")}),
newKey({name="_4", x=150,y=400,w=90,h=90, color="white", font=50,code=pressKey("4")}),
newKey({name="_5", x=250,y=400,w=90,h=90, color="white", font=50,code=pressKey("5")}),
newKey({name="_6", x=350,y=400,w=90,h=90, color="white", font=50,code=pressKey("6")}),
newKey({name="_7", x=150,y=500,w=90,h=90, color="white", font=50,code=pressKey("7")}),
newKey({name="_8", x=250,y=500,w=90,h=90, color="white", font=50,code=pressKey("8")}),
newKey({name="_9", x=350,y=500,w=90,h=90, color="white", font=50,code=pressKey("9")}),
newKey({name="_0", x=150,y=600,w=90,h=90, color="white", font=50,code=pressKey("0")}),
newKey({name="<", x=250,y=600,w=90,h=90, color="lRed", font=50,code=pressKey("backspace")}),
newKey({name="=", x=350,y=600,w=90,h=90, color="lYellow",font=50,code=pressKey("return")}),
newKey({name="+", x=450,y=300,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=450,y=500,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=640,y=600,w=180,h=90, color="lGreen", font=40,code=pressKey("space"),hide=function()return not sceneTemp.pass end}),
},
main={
newButton({name="play", x=150,y=280,w=200,h=160,color="lRed", font=55,code=function()SCN.goto("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="music", x=590,y=280,w=200,h=160,color="lPurple",font=32,code=function()SCN.goto("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="stat", x=370,y=460,w=200,h=160,color="lCyan", font=43,code=function()SCN.goto("stat")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.go("setting_game")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.go("help")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="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}),
},
mode={
newButton({name="setting", x=1100,y=540,w=240,h=90,color="lGreen", font=40,code=function()
SCN.goto("custom")
SCN.go("custom")
end,
hide=function()
return mapCam.sel~="custom_clear" and mapCam.sel~="custom_puzzle"
@@ -238,18 +238,18 @@ local Widgets={
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="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="key", x=640, y=220, w=320,h=80, color="lGreen", font=35,code=function()SCN.goto("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="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.go("setting_key")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="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()
SCN.goto("setting_skin")
SCN.go("setting_skin")
end}),
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="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}),
},
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="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")}),
newSlider({name="lockFX", x=350, y=340,w=373,unit=3, 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="clearFX", x=350, y=460,w=373,unit=3, font=32,disp=SETval("clearFX"), code=SETsto("clearFX")}),
newSlider({name="shakeFX", x=350, y=520,w=373,unit=5, font=32,disp=SETval("shakeFX"), code=SETsto("shakeFX")}),
newSlider({name="atkFX", x=350, y=580,w=373,unit=5, font=32,disp=SETval("atkFX"), code=SETsto("atkFX")}),
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=390,w=373,unit=5, font=32,disp=SETval("dropFX"), code=SETsto("dropFX")}),
newSlider({name="moveFX", x=350, y=440,w=373,unit=5, font=32,disp=SETval("moveFX"), code=SETsto("moveFX")}),
newSlider({name="clearFX", x=350, y=490,w=373,unit=5, font=32,disp=SETval("clearFX"), code=SETsto("clearFX")}),
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,
disp=function()
return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4
@@ -390,7 +391,7 @@ local Widgets={
end}),
newButton({name="option", x=520,y=180,w=170,h=80,color="white",font=40,
code=function()
SCN.goto("setting_touchSwitch")
SCN.go("setting_touchSwitch")
end}),
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,
@@ -436,7 +437,7 @@ local Widgets={
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,
code=function()
SCN.goto("setting_trackSetting")
SCN.go("setting_trackSetting")
end,
hide=function()
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}),
},
help={
newButton({name="staff", x=980, y=500,w=150,h=80,color="white",font=32,code=function()SCN.goto("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="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.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="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)
t.identity="Techmino"--Saving folder
t.version="11.1"

BIN
font.ttf

Binary file not shown.

View File

@@ -1,11 +1,11 @@
--[[
______ __ _
/_ __/___ _____ / /_ ____ ___ (_)____ ____
/ / / _ \ / ___// __ \ / __ `__ \ / // __ \ / __ \
/ / / __// /__ / / / // / / / / // // / / // /_/ /
/_/ \___/ \___//_/ /_//_/ /_/ /_//_//_/ /_/ \____/
Techmino is my first "huge project"
optimization is welcomed if you also love tetromino game
______ __ _
/_ __/___ _____ / /_ ____ ___ (_)____ ____
/ / / _ \ / ___// __ \ / __ `__ \ / // __ \ / __ \
/ / / __// /__ / / / // / / / / // // / / // /_/ /
/_/ \___/ \___//_/ /_//_/ /_/ /_//_//_/ /_/ \____/
Techmino is my first "huge project"
optimization is welcomed if you also love tetromino game
]]--
--?
@@ -19,7 +19,6 @@ love.keyboard.setTextInput(false)
love.mouse.setVisible(false)
system=love.system.getOS()
game={}
mapCam={
sel=nil,--Selected mode ID
@@ -41,8 +40,8 @@ preField={h=20}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
preBag={}
game={
frame=0, --Frame count
result=0, --Game result
frame=0, --Frame count
result=false, --Game result (string)
pauseTime=0, --Time paused
pauseCount=0, --Pausing count
garbageSpeed=1, --Garbage timing speed
@@ -50,7 +49,16 @@ game={
warnLVL=0, --Warning level (show)
recording=false, --If recording
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
players={alive={}}--Players data
curMode=nil--Current mode object
@@ -91,6 +99,9 @@ else
setting.swap=false
setting.vib=2
setting.powerInfo=true
setting.fullscreen=true
love.window.setFullscreen(true)
love.resize(love.graphics.getWidth(),love.graphics.getHeight())
end
end
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
--Update modeRanks
R=modeRanks
for k,v in next,R do
if type(k)=="number"then
R[Modes[k].name],R[k]=R[k]
break
do
local R=modeRanks
for k,v in next,R do
if type(k)=="number"then
if Modes[k]and not R[Modes[k].name]then
R[Modes[k].name]=v
end
R[k]=nil
end
end
if R.master_adavnce then
R.master_advance,R.master_adavnce=R.master_adavnce
end
if not text.modes[stat.lastPlay]then
stat.lastPlay="sprint_10"
end
end
if R.master_adavnce then
R.master_advance,R.master_adavnce=R.master_adavnce
end
if not text.modes[stat.lastPlay]then
stat.lastPlay="sprint_10"
end
--Update data file
S=stat
if type(setting.spawn)~="number"then
setting.spawn=0
end
if S.version~=gameVersion then
S.version=gameVersion
TEXT.show(text.newVersion,640,200,30,"fly",.3)
newVersionLaunch=true
--Update data file
local S=stat
if type(setting.spawn)~="number"then
setting.spawn=0
end
if S.version~=gameVersion then
S.version=gameVersion
newVersionLaunch=true
fs.remove("sprintPenta.dat")
fs.remove("master_adavnce.dat")
fs.remove("master_beginner.dat")
end
R,S=nil
fs.remove("sprintPenta.dat")
fs.remove("master_adavnce.dat")
fs.remove("master_beginner.dat")
end
end

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -31,7 +31,11 @@ return{
end
modeEnv._20G=modeEnv.drop==0
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
PLY.newPlayer(1,340,15)
local L=modeEnv.opponent

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,9 +1,28 @@
local format=string.format
local function check_rise(P)
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
P:garbageRise(13,1,P:RND(10))
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
@@ -13,8 +32,8 @@ return{
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=check_rise,
pushSpeed=1,
bg="glow",bgm="infinite",
pushSpeed=1.2,
bg="wing",bgm="infinite",
},
load=function()
PLY.newPlayer(1,340,15)

View File

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

View File

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

View File

@@ -17,7 +17,7 @@ local function score(P)
--Level up!
local s=P.modeData.event+1;P.modeData.event=s
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.wait=death_wait[s]
E.fall=death_fall[s]
@@ -44,7 +44,7 @@ return{
fall=death_fall[1],
dropPiece=score,
freshLimit=15,
bg="game2",bgm="secret7th",
bg="bg2",bgm="secret7th",
},
slowMark=true,
load=function()

View File

@@ -16,7 +16,7 @@ local function score(P)
--Level up!
local s=P.modeData.event+1;P.modeData.event=s
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.wait=rush_wait[s]
E.fall=rush_fall[s]
@@ -48,7 +48,7 @@ return{
fall=rush_fall[1],
dropPiece=score,
freshLimit=15,
bg="game1",bgm="secret8th",
bg="bg1",bgm="secret8th",
},
slowMark=true,
load=function()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget,
pushSpeed=2,
freshLimit=15,
bg="game3",bgm="rockblock",
bg="rainbow",bgm="rockblock",
},
load=function()
royaleData={
@@ -33,7 +33,7 @@ return{
}
PLY.newPlayer(1,340,15)
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
local r=rnd(2,49)
if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(2,5)))
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
n=n+1
end end
@@ -51,7 +51,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(2,5)))
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
n=n+1
end end

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget,
pushSpeed=2,
freshLimit=15,
bg="game3",bgm="rockblock",
bg="rainbow",bgm="rockblock",
},
load=function()
royaleData={
@@ -33,7 +33,7 @@ return{
}
PLY.newPlayer(1,340,15)
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
local r=rnd(2,49)
if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(4,7)))
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
n=n+1
end end
@@ -51,7 +51,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(4,7)))
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
n=n+1
end end

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget,
pushSpeed=2,
freshLimit=15,
bg="game3",bgm="rockblock",
bg="rainbow",bgm="rockblock",
},
load=function()
royaleData={
@@ -33,7 +33,7 @@ return{
}
PLY.newPlayer(1,340,15)
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
local r=rnd(2,49)
if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(8,10)))
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
n=n+1
end end
@@ -51,7 +51,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(8,10)))
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
n=n+1
end end

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget,
pushSpeed=2,
freshLimit=15,
bg="game3",bgm="rockblock",
bg="rainbow",bgm="rockblock",
},
load=function()
royaleData={
@@ -33,7 +33,7 @@ return{
}
PLY.newPlayer(1,340,15)
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
local r=rnd(2,99)
if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(2,5)))
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
n=n+1
end end
@@ -51,7 +51,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(2,5)))
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
n=n+1
end end

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget,
pushSpeed=2,
freshLimit=15,
bg="game3",bgm="rockblock",
bg="rainbow",bgm="rockblock",
},
load=function()
royaleData={
@@ -33,7 +33,7 @@ return{
}
PLY.newPlayer(1,340,15)
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
local r=rnd(2,99)
if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(4,7)))
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
n=n+1
end end
@@ -51,7 +51,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(4,7)))
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
n=n+1
end end

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget,
pushSpeed=2,
freshLimit=15,
bg="game3",bgm="rockblock",
bg="rainbow",bgm="rockblock",
},
load=function()
royaleData={
@@ -33,7 +33,7 @@ return{
}
PLY.newPlayer(1,340,15)
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
local r=rnd(2,99)
if L[r]then L[r],t=false,t-1 end
@@ -43,7 +43,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,46*i-36,97*j-72,.068,AITemplate("9S",rnd(8,10)))
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
n=n+1
end end
@@ -51,7 +51,7 @@ return{
if L[n]then
PLY.newAIPlayer(n,46*i+264,97*j-72,.068,AITemplate("9S",rnd(8,10)))
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
n=n+1
end end

View File

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

View File

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

View File

@@ -1,12 +1,10 @@
--[[
HighestBlock
HorizontalTransitions
VerticalTransitions
BlockedCells
Wells
FilledLines
4deepShape
BlockedWells;
BlockedWells
]]
local int,ceil,min,abs,rnd=math.floor,math.ceil,math.min,math.abs,math.random
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 scs={{0,1},{0,1},{0,1},{0,1},{0,1},{.5,.5},{-.5,1.5}}
-------------------------------------------------Cold clear
local CCblockID={4,3,6,5,1,2,0}
if system=="Windows"then
require("CCloader")
local CCblockID={6,5,4,3,2,1,0}
CCloader_filename={
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={
getConf= cc.get_default_config ,--()options,weights
--setConf= cc.set_options ,--(options,hold,20g,bag7)
@@ -29,12 +50,12 @@ if system=="Windows"then
addNext= cc.add_next_piece_async ,--(bot,piece)
update= cc.reset_async ,--(bot,field,b2b,combo)
think= cc.request_next_move ,--(bot)
getMove= cc.poll_next_move ,--(bot)success,hold,move
ifDead= cc.is_dead_async ,--(bot)dead
getMove= cc.poll_next_move ,--(bot)success,dest,hold,move
destroy= cc.destroy_async ,--(bot)
setHold= cc.set_hold ,--(opt,bool)
set20G= cc.set_20g ,--(opt,bool)
setPCLoop= cc.set_pcloop ,--(opt,bool)
setBag= cc.set_bag7 ,--(opt,bool)
setNode= cc.set_max_nodes ,--(opt,bool)
free= cc.free ,--(opt/wei)
@@ -66,7 +87,8 @@ if system=="Windows"then
BOT.addNext(P.AI_bot,CCblockID[P.next[i].id])
end
CC_updateField(P)
P.hd={bk={{}},id=0,color=0,name=0}P.holded=false
P.hd=nil
P.holded=false
P.cur=rem(P.next,1)
P.sc,P.dir=scs[P.cur.id],0
P.r,P.c=#P.cur.bk,#P.cur.bk[1]
@@ -80,6 +102,7 @@ if system=="Windows"then
collectgarbage()
end
end
loadCC()
-------------------------------------------------9 Stack setup
local dirCount={1,1,3,3,3,0,1}
local spinOffset={
@@ -218,7 +241,7 @@ return{
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]
for cx=1,11-#cb[1]do--Each pos
local cy=#Tfield+1
@@ -282,9 +305,17 @@ return{
return 2
end,
function(P,ctrl)--Poll keys
if BOT.ifDead(P.AI_bot)then ins(ctrl,6)return 3 end
local success,hold,move=BOT.getMove(P.AI_bot)
if success then
local success,dest,hold,move=BOT.getMove(P.AI_bot)
if success==2 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
while move[1]do
local m=rem(move,1)

View File

@@ -10,7 +10,7 @@ setting={
reTime=4,
autoPause=true,
fine=false,
lock=false,
appLock=false,
lang=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},
@@ -21,7 +21,8 @@ setting={
smooth=true,grid=false,
bagLine=false,
lockFX=2,
dropFX=3,
dropFX=2,
moveFX=2,
clearFX=2,
shakeFX=2,
atkFX=3,

View File

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

View File

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

View File

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

View File

@@ -84,14 +84,14 @@ local TRS={
},--Z
{},--S
{
[01]={{-1, 0},{-1, 1},{ 0,-2},{ 1, 1}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}},
[01]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{ 1, 1}},
[10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 1, 2}},
[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}},
[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}},
[32]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{-1, 1}},
[23]={{ 1, 0},{ 1,-1},{ 1, 1},{ 0,-2},{ 1,-2}},
[21]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 1},{ 0,-2},{-1,-2}},
[32]={{-1, 0},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{-1, 1}},
[23]={{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
[02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}},
[20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0}},
@@ -114,13 +114,15 @@ local TRS={
},--T
function(P,d)
if P.human then SFX.fieldPlay("rotate",nil,P)end
P:freshLockDelay()
if not P.gameEnv.ospin then return end
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
local D=P.spinSeq%100*10+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
local L=OspinList[i]
if D==L[1]then
@@ -136,7 +138,7 @@ local TRS={
P.dir,P.sc=dir,scs[id][dir]
P.spinLast=2
P.stat.rotate=P.stat.rotate+1
P:freshgho()
P:freshBlock(false,true)
P.spinSeq=0
SFX.fieldPlay("rotatekick",nil,P)
return
@@ -145,17 +147,18 @@ local TRS={
end
else
P.spinSeq=0
P:freshBlock(true,true)
end
end,--O
{
[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}},
[30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 2}},
[12]={{-1, 0},{ 2, 0},{ 0,-1},{-1, 2},{ 2,-1}},
[21]={{-2, 0},{ 1, 0},{ 0, 1},{ 1,-2},{-2, 1}},
[32]={{ 1, 0},{-2, 0},{ 0,-1},{ 1, 2},{-2,-1}},
[23]={{ 2, 0},{-1, 0},{ 0, 1},{-1,-2},{ 2, 1}},
[30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}},
[12]={{-1, 0},{ 2, 0},{ 2,-1},{ 0,-1},{-1, 2}},
[21]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}},
[32]={{ 1, 0},{-2, 0},{-2,-1},{ 0,-1},{ 1, 2}},
[23]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}},
[02]={{-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}},
@@ -213,10 +216,10 @@ local TRS={
[31]={{-1, 0},{ 1, 1},{ 2, 0}},
},--T5
{
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{-1,-3}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 1, 3}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-3}},
[30]={{-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}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
[30]={{-1, 0},{-1,-1},{ 0,-2},{-1, 2}},
[12]={{ 1, 0},{ 1,-1},{ 1, 1}},
[21]={{-1,-1},{-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}},
[10]={{ 0, 1},{ 1, 0},{ 0,-2},{ 1,-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}},
[21]={{ 0,-1},{ 0,-2}},
[32]={{ 1, 0},{-1, 0}},
@@ -256,18 +259,18 @@ local TRS={
},--W
function(P,d)
if P.human then SFX.fieldPlay("rotate",nil,P)end
P:freshLockDelay()
local iki=XspinList[d]
for test=1,#iki do
local x,y=P.curX+iki[test][1],P.curY+iki[test][2]
if not P:ifoverlap(P.cur.bk,x,y)then
P.curX,P.curY=x,y
P.spinLast=1
P:freshgho()
P:freshBlock(false,true)
P.stat.rotate=P.stat.rotate+1
return
end
end
P:freshBlock(true,true)
end,--X
{
[01]={{-1, 0},{-1, 1},{ 0,-3},{-1, 1},{-1, 2},{ 0, 1}},
@@ -285,14 +288,14 @@ local TRS={
},--J5
{},--L5
{
[01]={{-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}},
[03]={{ 0,-1},{ 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}},
[01]={{-1, 0},{-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, 0},{ 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}},
[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}},
[23]={{ 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]={{ 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}},
[20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}},
[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}
title={
{
@@ -114,6 +115,12 @@ title={
5878, 463,
},
}
for _,C in next,title do
for i=1,#C do
C[i]=C[i]*.1626
end
end
--[[
title2={}
for i=1,#title do title2[i]=title[i]end
title2[5]={
@@ -140,12 +147,22 @@ title2[5]={
3001, 1280,
2779, 1280,
}
for _,C in next,title do
for i=1,#C do
C[i]=C[i]*.1626
]]
title_fan={}
for i=1,8 do
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
customID={
"drop","lock",
"wait","fall",
@@ -168,7 +185,7 @@ customRange={
target={10,20,40,100,200,500,1000,1e99},
freshLimit={0,8,15,1e99},
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"},
}
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,
bagLine=false,
text=true,
lockFX=2,dropFX=3,
clearFX=2,shakeFX=3,
lockFX=2,
dropFX=2,
moveFX=2,
clearFX=2,
shakeFX=3,
drop=60,lock=60,
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[2]=finesseList[1]--S=Z
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={
none=NULL,
bag=function(P)
@@ -243,12 +246,21 @@ local function updateFXs(P,dt)
--DropFX
for i=#P.dropFX,1,-1 do
local S=P.dropFX[i]
S[6]=S[6]+S[7]*dt
if S[6]>1 then
S[5]=S[5]+S[6]*dt
if S[5]>1 then
rem(P.dropFX,i)
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
for i=#P.clearFX,1,-1 do
local S=P.clearFX[i]
@@ -410,15 +422,15 @@ local function Pupdate_alive(P,dt)
--Try spawn new block
if not P.control then goto stop end
if P.waiting==0 then P:popNext()end
if P.waiting>=0 then
P.waiting=P.waiting-1
if P.waiting<0 then P:popNext()end
goto stop
end
--Natural block falling
if P.cur then
if P.curY~=P.imgY then
if P.curY>P.imgY then
local D=P.dropDelay
if D>1 then
P.dropDelay=D-1
@@ -426,18 +438,24 @@ local function Pupdate_alive(P,dt)
end
if D==1 then
if P.gameEnv.moveFX and P.gameEnv.block then
P:createMoveFX("down")
end
P.curY=P.curY-1
else
local _=P.curY-P.imgY--Max fall dist
D=1/D--Fall dist
if D<_ then
P.curY=P.curY-D
-- assert(P.curY==int(P.curY),"y:"..P.curY.." fall:"..D.." D_env:"..P.gameEnv.drop)
if D>P.curY-P.imgY then D=P.curY-P.imgY end
if P.gameEnv.moveFX and P.gameEnv.block then
for i=1,D do
P:createMoveFX("down")
P.curY=P.curY-1
end
else
P.curY=P.imgY
P.curY=P.curY-D
end
-- assert(P.curY==int(P.curY),"y:"..P.curY.." fall:"..D.." D_env:"..P.gameEnv.drop)
end
P:freshMinY()
P:freshBlock(true,true)
P.spinLast=false
if P.imgY~=P.curY then
@@ -533,25 +551,29 @@ end
local function drawFXs(P)
--LockFX
for i=1,#P.lockFX do
_=P.lockFX[i]
if _[3]<.5 then
gc.setColor(1,1,1,2*_[3])
gc.rectangle("fill",_[1],_[2],60*_[3],30)
local S=P.lockFX[i]
if S[3]<.5 then
gc.setColor(1,1,1,2*S[3])
gc.rectangle("fill",S[1],S[2],60*S[3],30)
else
gc.setColor(1,1,1,2-2*_[3])
gc.rectangle("fill",_[1]+30,_[2],60*_[3]-60,30)
gc.setColor(1,1,1,2-2*S[3])
gc.rectangle("fill",S[1]+30,S[2],60*S[3]-60,30)
end
end
--DropFX
for i=1,#P.dropFX do
_=P.dropFX[i]
gc.setColor(1,1,1,.6-_[6]*.6)
for x=_[2],_[4]do
for y=_[5],_[3]do
drawPixel(y,x,_[1])
end
end
local S=P.dropFX[i]
gc.setColor(1,1,1,.6-S[5]*.6)
local w=30*S[3]*(1-S[5]*.5)
gc.rectangle("fill",30*S[1]-30+15*S[3]-w*.5,600-30*S[2],w,30*S[4])
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
--ClearFX
@@ -636,7 +658,7 @@ local function Pdraw_norm(P)
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)
local trans=P.lockDelay/P.gameEnv.lock
if P.gameEnv.block then
@@ -680,13 +702,18 @@ local function Pdraw_norm(P)
::E::
gc.setScissor()
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.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
if P.gameEnv.easyFresh then
gc.setColor(1,1,1)
else
gc.setColor(1,.26,.26)
end
if P.lockDelay>=0 then
gc.rectangle("fill",0,602,300*P.lockDelay/P.gameEnv.lock,6)--Lock delay indicator
end
@@ -811,6 +838,12 @@ local function Pdraw_norm(P)
mStr(format("%.2f",P.stat.time),-81,518)--Time
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
gc.setColor(1,1,1)
curMode.mesDisp(P)
@@ -979,11 +1012,11 @@ end
--------------------------<FX>--------------------------
function player.showText(P,text,dx,dy,font,style,spd,stop)
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
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
local function without(L,e)
for i=1,#L do
@@ -993,7 +1026,7 @@ local function without(L,e)
end
function player.createLockFX(P)
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
local y=P.curY+i-1
@@ -1007,9 +1040,49 @@ function player.createLockFX(P)
end
end
end
function player.createDropFX(P,x1,y1,x2,y2)--x1<x2,y1>y2!
if P.gameEnv.block and y1>=y2 then
P.dropFX[#P.dropFX+1]={P.cur.color,x1,y1,x2,y2,0,12-2*P.gameEnv.dropFX}
function player.creatDropFX(P,x,y,w,h)--TODO, remake dropFX
ins(P.dropFX,{x,y,w,h,0,13-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
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
a=.35
end
FX_attack[#FX_attack+1]={
ins(FX_attack,{
x=x1,y=y1,--Current pos
x1=x1,y1=y1,--Start 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,
t=0,
drag={},--Afterimage coordinate list
}
})
end
function player.newTask(P,code,data)
local L=P.tasks
L[#L+1]={
ins(L,{
code=code,
data=data,
}
})
end
--------------------------</FX>--------------------------
@@ -1215,7 +1288,7 @@ function player.garbageRise(P,color,amount,pos)
_=P.dropFX[i]
_[3],_[5]=_[3]+amount,_[5]+amount
end
if #P.field>40 then P:lose()end
if #P.field>42 then P:lose()end
end
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.curY=P.curY+#L
P.imgY=P.imgY+#L
P:freshgho()
P:freshBlock(false,false)
end
function player.pushNext(P,L,mir)
for i=1,#L do
@@ -1288,67 +1361,74 @@ function player.changeAtk(P,R)
end
if R then
P.atking=R
R.atker[#R.atker+1]=P
ins(R.atker,P)
else
P.atking=nil
end
end
function player.freshgho(P)
if not P.cur then return end
P.imgY=min(#P.field+1,P.curY)
function player.freshBlock(P,keepGhost,control,system)
if not keepGhost and P.cur then
P.imgY=min(#P.field+1,P.curY)
if P.gameEnv._20G or P.keyPressing[7]and P.gameEnv.sdarr==0 then
local _=P.imgY
if P.gameEnv._20G or P.keyPressing[7]and P.gameEnv.sdarr==0 then
local _=P.imgY
--Move ghost to bottom
while not P:ifoverlap(P.cur.bk,P.curX,P.imgY-1)do
P.imgY=P.imgY-1
end
--Cancel spinLast
if _~=P.imgY then
P.spinLast=false
end
--Create FX if dropped
if P.curY>P.imgY then
if P.gameEnv.dropFX then
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.imgY+P.r-1)
--Move ghost to bottom
while not P:ifoverlap(P.cur.bk,P.curX,P.imgY-1)do
P.imgY=P.imgY-1
end
if P.gameEnv.shakeFX then
P.fieldOff.vy=P.gameEnv.shakeFX*.5
--Cancel spinLast
if _~=P.imgY then
P.spinLast=false
end
--Create FX if dropped
if P.curY>P.imgY then
if P.gameEnv.dropFX and P.gameEnv.block and P.curY-P.imgY-P.r>-1 then
P:creatDropFX(P.curX,P.curY-1,P.c,P.curY-P.imgY-P.r+1)
end
if P.gameEnv.shakeFX then
P.fieldOff.vy=P.gameEnv.shakeFX*.5
end
P.curY=P.imgY
end
else
while not P:ifoverlap(P.cur.bk,P.curX,P.imgY-1)do
P.imgY=P.imgY-1
end
P.curY=P.imgY
end
else
while not P:ifoverlap(P.cur.bk,P.curX,P.imgY-1)do
P.imgY=P.imgY-1
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
local d,d0=P.lockDelay,P.gameEnv.lock
if d<d0 and(P.freshTime<P.gameEnv.freshLimit or P.curY<P.minY)then
if P.lockDelay<P.gameEnv.lock then
P.dropDelay=P.gameEnv.drop
if control then
if P.gameEnv.easyFresh 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
end
if P.curY<P.minY then
P.minY=P.curY
P.dropDelay=P.gameEnv.drop
P.lockDelay=P.gameEnv.lock
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
P.freshTime=P.freshTime+1
P.lockDelay=min(d+d0*.6,d0)
end
end
function player.freshMinY(P)
if P.curY<P.minY then
P.freshTime=max(P.freshTime-1,0)
P.minY=P.curY
P.lockDelay=P.gameEnv.lock
end
end
function player.lock(P)
local dest=P.AI_dest
local has_dest=dest~=nil
for i=1,P.r do
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
@@ -1356,9 +1436,25 @@ function player.lock(P)
if P.cur.bk[i][j]then
P.field[y][P.curX+j-1]=P.cur.color
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
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
function player.spin(P,d,ifpre)
local iki=P.RS[P.cur.id]
@@ -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]
iki=iki[P.dir*10+idir]
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)
return
end
@@ -1378,17 +1476,17 @@ function player.spin(P,d,ifpre)
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
ix,iy=x,y
if P.gameEnv.dropFX then
P:createDropFX(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY)
if P.gameEnv.moveFX and P.gameEnv.block then
P:createMoveFX()
end
P.curX,P.curY,P.dir=ix,iy,idir
P.sc,P.cur.bk=scs[P.cur.id][idir],icb
P.r,P.c=ir,ic
P.spinLast=test==2 and 0 or 1
if not ifpre then P:freshgho()end
P:freshLockDelay()
P:freshMinY()
if iki[test][2]>0 then
if not ifpre then
P:freshBlock(false,true)
end
if iki[test][2]>0 and not P.gameEnv.easyFresh then
P.freshTime=P.freshTime+1
end
@@ -1487,8 +1585,10 @@ function player.hold(P,ifpre)
end
if C then
P:resetBlock()
P:freshgho()
P.dropDelay,P.lockDelay,P.freshTime=P.gameEnv.drop,P.gameEnv.lock,max(P.freshTime-5,0)
P:freshBlock(false,true)
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
end
@@ -1501,7 +1601,7 @@ end
function player.getNext(P,n)
local E=P.gameEnv
P.next[#P.next+1]={bk=blocks[n][E.face[n]],id=n,color=E.bone and 12 or E.skin[n],name=n}
ins(P.next,{bk=blocks[n][E.face[n]],id=n,color=E.bone and 12 or E.skin[n],name=n})
end
function player.popNext(P)--Pop next queue to hand
P.holded=false
@@ -1519,7 +1619,7 @@ function player.popNext(P)--Pop next queue to hand
BOT.addNext(P.AI_bot,CCblockID[next.id])
end
end
local _=P.keyPressing
--IHS
if _[8]and P.gameEnv.hold and P.gameEnv.ihs then
@@ -1529,15 +1629,23 @@ function player.popNext(P)--Pop next queue to hand
P:resetBlock()
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:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end
P:freshgho()
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then
P:lock()
P:lose()
end
P:freshBlock(false,true,true)
end
--IHdS
if _[6]then P.act.hardDrop(P)_[6]=false end
if _[6]then
P.act.hardDrop(P)
_[6]=false
end
end
end
@@ -1624,7 +1732,7 @@ function player.drop(P)--Place piece
--Create clearing FX
if cc>0 and P.gameEnv.clearFX then
local l=P.clearedRow
local t=6-P.gameEnv.clearFX*1.5
local t=7-P.gameEnv.clearFX*1
for i=1,cc do
ins(P.clearFX,{l[i],0,t})
end
@@ -1634,8 +1742,13 @@ function player.drop(P)--Place piece
if P.gameEnv.lockFX then
if cc==0 then
P:createLockFX()
elseif P.lockFX[1]then
P.lockFX={}
else
_=#P.lockFX
if _>0 then
for i=1,_ do
rem(P.lockFX)
end
end
end
end
@@ -1942,7 +2055,7 @@ function player.drop(P)--Place piece
if P.dropSpeed>60 then
dropScore=dropScore*P.dropSpeed/60
elseif P.dropSpeed>120 then
dropScore=dropScore*1,2*P.dropSpeed/120
dropScore=dropScore*1.2*P.dropSpeed/120
elseif P.dropSpeed>180 then
dropScore=dropScore*1.5*P.dropSpeed/180
end
@@ -2237,9 +2350,11 @@ function player.act.moveLeft(P,auto)
end
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.gameEnv.moveFX and P.gameEnv.block then
P:createMoveFX("left")
end
P.curX=P.curX-1
P:freshgho()
P:freshLockDelay()
P:freshBlock(false,true)
if P.human and P.curY==P.imgY then SFX.play("move")end
if not auto then P.moving=0 end
P.spinLast=false
@@ -2262,9 +2377,11 @@ function player.act.moveRight(P,auto)
end
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.gameEnv.moveFX and P.gameEnv.block then
P:createMoveFX("right")
end
P.curX=P.curX+1
P:freshgho()
P:freshLockDelay()
P:freshBlock(false,true)
if P.human and P.curY==P.imgY then SFX.play("move")end
if not auto then P.moving=0 end
P.spinLast=false
@@ -2303,9 +2420,9 @@ function player.act.hardDrop(P)
end
P.keyPressing[6]=false
elseif P.control and P.waiting==-1 and P.cur then
if P.curY~=P.imgY then
if P.gameEnv.dropFX then
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.imgY+P.r-1)
if P.curY>P.imgY then
if P.gameEnv.dropFX and P.gameEnv.block and P.curY-P.imgY-P.r>-1 then
P:creatDropFX(P.curX,P.curY-1,P.c,P.curY-P.imgY-P.r+1)
end
P.curY=P.imgY
P.spinLast=false
@@ -2330,9 +2447,9 @@ function player.act.softDrop(P)
else
P.downing=1
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:freshMinY()
P:freshBlock(true,true)
P.spinLast=false
end
end
@@ -2356,14 +2473,13 @@ function player.act.insLeft(P,auto)
if P.gameEnv.nofly or not P.cur then return end
local x0=P.curX
while not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)do
P.curX=P.curX-1
if P.gameEnv.dropFX then
P:createDropFX(P.curX+P.c,P.curY+P.r-1,P.curX+P.c,P.curY)
if P.gameEnv.moveFX and P.gameEnv.block then
P:createMoveFX("left")
end
P:freshgho()
P.curX=P.curX-1
P:freshBlock(false,true)
end
if P.curX~=x0 then
P:freshLockDelay()
P.spinLast=false
end
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
local x0=P.curX
while not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)do
P.curX=P.curX+1
if P.gameEnv.dropFX then
P:createDropFX(P.curX-1,P.curY+P.r-1,P.curX-1,P.curY)
if P.gameEnv.moveFX and P.gameEnv.block then
P:createMoveFX("right")
end
P:freshgho()
P.curX=P.curX+1
P:freshBlock(false,true)
end
if P.curX~=x0 then
P:freshLockDelay()
P.spinLast=false
end
if P.gameEnv.shakeFX then
@@ -2399,29 +2514,32 @@ function player.act.insRight(P,auto)
end
end
function player.act.insDown(P)
if P.curY~=P.imgY and P.cur then
if P.gameEnv.dropFX then
P:createDropFX(P.curX,P.curY+1,P.curX+P.c-1,P.imgY+P.r-1)
if P.curY>P.imgY and P.cur then
if P.gameEnv.dropFX and P.gameEnv.block and P.curY-P.imgY-P.r>-1 then
P:creatDropFX(P.curX,P.curY-1,P.c,P.curY-P.imgY-P.r+1)
end
if P.gameEnv.shakeFX then
P.fieldOff.vy=P.gameEnv.shakeFX*.5
end
P.curY,P.lockDelay,P.spinLast=P.imgY,P.gameEnv.lock,false
P:freshMinY()
P:freshBlock(true,true)
end
end
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:freshMinY()
P:freshBlock(true,true)
P.spinLast=false
end
end
function player.act.down4(P)
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:freshMinY()
P:freshBlock(true,true)
P.spinLast=false
else
return
@@ -2431,9 +2549,9 @@ end
function player.act.down10(P)
if P.cur then
for _=1,10 do
if P.curY~=P.imgY then
if P.curY>P.imgY then
P.curY=P.curY-1
P:freshMinY()
P:freshBlock(true,true)
P.spinLast=false
else
return
@@ -2466,14 +2584,16 @@ function player.act.zangiRight(P)
P.act.hardDrop(P)
end
--Give operations a num name
A=player.act
T={
A.moveLeft ,A.moveRight, A.rotRight, A.rotLeft,
A.rot180 ,A.hardDrop, A.softDrop, A.hold,
A.func ,A.restart, A.insLeft, A.insRight,
A.insDown ,A.down1, A.down4, A.down10,
A.dropLeft ,A.dropRight, A.zangiLeft,A.zangiRight
}for i=1,20 do A[i]=T[i]end;A,T=nil
do
local A=player.act
local T={
A.moveLeft ,A.moveRight, A.rotRight, A.rotLeft,
A.rot180 ,A.hardDrop, A.softDrop, A.hold,
A.func ,A.restart, A.insLeft, A.insRight,
A.insDown ,A.down1, A.down4, A.down10,
A.dropLeft ,A.dropRight, A.zangiLeft,A.zangiRight
}for i=1,20 do A[i]=T[i]end
end
--------------------------</Control>--------------------------
--------------------------<Generator>--------------------------
@@ -2567,7 +2687,7 @@ local function newEmptyPlayer(id,x,y,size)
P.fieldBeneath=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.bonus={}--Texts
@@ -2579,15 +2699,20 @@ end
local function loadGameEnv(P)--Load gameEnv
P.gameEnv={}--Current game setting environment
local ENV=P.gameEnv
local E
--Load game settings
for k,v in next,gameEnv0 do
if modeEnv[k]~=nil then
v=modeEnv[k] --Mode setting
-- DBP("mode-"..k..":"..tostring(v))
elseif game.setting[k]~=nil then
v=game.setting[k] --Game setting
-- DBP("game-"..k..":"..tostring(v))
elseif setting[k]~=nil then
v=setting[k] --Global setting
-- DBP("global-"..k..":"..tostring(v))
-- else
-- DBP("default-"..k..":"..tostring(v))
end
ENV[k]=v --Default setting
end
@@ -2623,6 +2748,7 @@ local function applyGameEnv(P)--Finish gameEnv processing
if ENV.lockFX==0 then ENV.lockFX=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.shakeFX==0 then ENV.shakeFX=nil end
end
@@ -2696,8 +2822,11 @@ function PLY.newDemoPlayer(id,x,y,size)
ghost=setting.ghost,center=setting.center,
smooth=setting.smooth,grid=setting.grid,
text=setting.text,
lockFX=setting.lockFX,dropFX=setting.dropFX,
clearFX=setting.clearFX,shakeFX=setting.shakeFX,
lockFX=setting.lockFX,
dropFX=setting.dropFX,
moveFX=setting.moveFX,
clearFX=setting.clearFX,
shakeFX=setting.shakeFX,
_20G=false,bone=false,
drop=1e99,lock=1e99,
@@ -2745,9 +2874,9 @@ end
function PLY.newRemotePlayer(id,x,y,size,actions)
local P=newEmptyPlayer(id,x,y,size)
P.human=false -- 录像不是人为操作
P.remote=true -- 远程操作
-- 开发中
P.human=false
P.remote=true
-- P.updateAction=buildActionFunctionFromActions(P, actions)
loadGameEnv(P)
@@ -2761,6 +2890,7 @@ function PLY.newAIPlayer(id,x,y,size,AIdata)
ENV.text=false
ENV.lockFX=nil
ENV.dropFX=nil
ENV.moveFX=nil
ENV.shakeFX=nil
end

View File

@@ -67,7 +67,7 @@ function Tick.throwBadge(data)--{ifAI,Sender,timer}
end
function Tick.autoPause(data)
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 SCN.cur=="play"then
pauseGame()

View File

@@ -6,62 +6,57 @@ local S=[=[
靏鸖龘龘 込余 saki
模电
[rmb10+]:
八零哥 蕴空之灵 gggf127 dtg
ThTsOd Fireboos 金巧 10元
立斐 Deep_Sea 时雪 yyangdid
sfqr 心痕 Sasoric 夏小亚 仁参
乐↗乐↘ 喜欢c4w的ztcjoin 面包 蠢熏
潘一栗 Lied 星街书婉 祝西 829
e m*12 我永远爱白银诺艾尔(鹏 PCX
八零哥 蕴空之灵 gggf127 dtg ThTsOd
Fireboos 金巧 10元 立斐 Deep_Sea
时雪 yyangdid sfqr 心痕 Sasoric
夏小亚 仁参 乐↗乐↘ 喜欢c4w的ztcjoin
面包 蠢熏 潘一栗 Lied 星街书婉 祝西
829 e m*12 我永远爱白银诺艾尔(鹏 PCX
kagura77 呆喂 GlowingEmbers 轩辕辚
HimuroAki TCV100 tech有养成系统了@7065
HAGE KANOBU 闪电和拐棍 葡萄味的曼妥思
世界沃德 蓝绿 天生的魔法师 琳雨空
T8779.易缄 吃水榴莲 诗情画意 星姐阿夸双推Man暗炎
[*炎] [*Y] aaa222 [**城] cnDD
红桃老给 昭庭玲秋 旋树墩 火花工作室
Cosine
世界沃德 蓝绿 天生的魔法师 琳雨空 T8779.易缄
吃水榴莲 诗情画意 星姐阿夸双推Man暗炎 [*炎]
[*Y] aaa222 [**城] cnDD 红桃老给
昭庭玲秋 旋树墩 火花工作室 Cosine 天上_飞
Thanks!!!
Future outlook:
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 zen
symmetry
hidden: sound only
infinite PC challenge
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
square
task survival
symmetry
game Abbr. test
parkour
Other:
mod system with:
block/field/up/low hidden
next[1] hidden
next[1-n] hidden
field flip(LR/UD)
no fail(∞ lives)
mini games:
15 puzzle (with hidden mode)
2048 (with next (with deadly mode))
2048 (with next/deadly mode)
mine sweeper
tank battle
new AI: task-Z
cool backgrounds
'Encrypt'(compile to byte code)
better drop FX
60+ fps supporting
in-game document
game recording
save recordings
full-key control
drag control for mobile device
new widgets (joystick etc.)
@@ -69,6 +64,55 @@ Future outlook:
more graphic FXs & 3D features & animations
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
新内容:
设置增加软件锁选项,打开游戏后进入伪装界面