Compare commits

..

50 Commits

Author SHA1 Message Date
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
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
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
59 changed files with 917 additions and 485 deletions

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

@@ -173,10 +173,12 @@ function keyDown.calculator(k)
if S.val==626 then
S.pass=true
elseif S.val==196022 then
S.pass=true
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
@@ -186,12 +188,12 @@ function keyDown.calculator(k)
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")
SCN.go("debug")
end
end
elseif k=="space"then
if S.pass then
SCN.goto("load")
SCN.swapTo("intro")
end
end
end
@@ -203,6 +205,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 +219,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 +347,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 +404,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 +437,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 +478,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 +693,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 +1077,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 +1165,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 +1235,7 @@ function love.run()
--Draw scene swapping animation
if SCN.swapping then
_=SCN.swap
_=SCN.stat
_.draw(_.time)
end
@@ -1184,8 +1257,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 +1270,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={
@@ -111,13 +111,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 +314,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 +641,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 +674,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 +745,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 +762,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

@@ -48,16 +48,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 +124,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 +197,7 @@ function sceneInit.setting_control()
dir=1,
wait=30,
}
BG.set("game1")
BG.set("bg1")
end
function sceneInit.setting_key()
sceneTemp={
@@ -214,7 +207,7 @@ function sceneInit.setting_key()
}
end
function sceneInit.setting_touch()
BG.set("game3")
BG.set("rainbow")
sceneTemp={
default=1,
snap=1,
@@ -271,7 +264,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 +322,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 +333,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 +388,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 +400,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.5"
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)
@@ -108,8 +119,11 @@ if fs.getInfo("tech_ultimate+.dat")then fs.remove("tech_ultimate+.dat")end
R=modeRanks
for k,v in next,R do
if type(k)=="number"then
R[Modes[k].name],R[k]=R[k]
break
local save=v
if not R[Modes[k].name]then
R[Modes[k].name]=v
end
R[k]=nil
end
end
if R.master_adavnce then
@@ -126,7 +140,6 @@ if type(setting.spawn)~="number"then
end
if S.version~=gameVersion then
S.version=gameVersion
TEXT.show(text.newVersion,640,200,30,"fly",.3)
newVersionLaunch=true
fs.remove("sprintPenta.dat")

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,7 +4,7 @@ return{
color=color.magenta,
env={
drop=15,lock=45,
fall=10,lock=60,
fall=10,
center=false,
visible="none",
dropPiece=PLY.reach_winCheck,

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={

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget,
pushSpeed=2,
freshLimit=15,
bg="game3",bgm="rockblock",
bg="rainbow",bgm="rockblock",
},
load=function()
royaleData={

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget,
pushSpeed=2,
freshLimit=15,
bg="game3",bgm="rockblock",
bg="rainbow",bgm="rockblock",
},
load=function()
royaleData={

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget,
pushSpeed=2,
freshLimit=15,
bg="game3",bgm="rockblock",
bg="rainbow",bgm="rockblock",
},
load=function()
royaleData={

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget,
pushSpeed=2,
freshLimit=15,
bg="game3",bgm="rockblock",
bg="rainbow",bgm="rockblock",
},
load=function()
royaleData={

View File

@@ -24,7 +24,7 @@ return{
Fkey=selectTarget,
pushSpeed=2,
freshLimit=15,
bg="game3",bgm="rockblock",
bg="rainbow",bgm="rockblock",
},
load=function()
royaleData={

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

@@ -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

@@ -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",
@@ -29,7 +28,6 @@ if setting.lang==1 or setting.lang==2 then
"DT炮=TSD+TST炮",
"Cultris II也很好玩!",
"COOL!!",
"CLASSIC SEXY RUSSIAN BLOCKS",
"BT炮=beta炮",
"B2B2B2B存在吗?",
"B2B2B???",
@@ -39,7 +37,8 @@ if setting.lang==1 or setting.lang==2 then
"有疑问? 先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~",
"学会使用两个旋转键, 三个更好",
"享受特色旋转系统!",
"新人请千万记住,打好基础,不要太早学那些花里胡哨的",
"享受Tech的特色旋转系统!",
"无聊翻翻设置是好习惯",
"我的世界好玩!",
"提前旋转等设置可以用来救命",
@@ -49,9 +48,11 @@ if setting.lang==1 or setting.lang==2 then
"少女祈祷中",
"扫雷好玩!",
"哦,我的上帝",
"你可以长按R键重新开始游戏(也不是很长)",
"你可以从统计页面打开游戏存档目录",
"你好 世界!",
"魔方好玩!",
"喵!",
"免费吃鸡方块",
"秘密数字:626",
"每个虚拟按键都可以隐藏/显示",
@@ -60,6 +61,8 @@ if setting.lang==1 or setting.lang==2 then
"没学过编曲,音乐都是自己凭感觉写的,觉得不好听就设置里关了吧",
"联网还没做呢, 别急",
"键位是可以自定义的",
"健康小贴士:上厕所太用力容易脑出血(尤其是老年人!)",
"健康小贴士:不要熬夜,真的容易猝死",
"合群了就会消失, 但是消失不代表没有意义",
"更小的DAS和ARR拥有更高的操作上限(如果你还能控制得了的话)",
"俄罗斯方块环游记也不错!",
@@ -68,7 +71,6 @@ if setting.lang==1 or setting.lang==2 then
"戴上耳机以获得最佳体验",
"大满贯10连击消四全清!",
"打好块没有捷径,多练",
"你可以长按R键重新开始游戏(也不是很长)",
"茶娘 可爱!",
"草(日本语)",
"不要在上课时玩游戏!",
@@ -90,6 +92,7 @@ if setting.lang==1 or setting.lang==2 then
"2.7182818284590452353",
"15puzzle好玩!",
"11renPC!",
"100行内23PC来一个?",
"1, 2, 9!!!!!",
"<方块研究所>有一个Nspire-CX版本!",
"↑↑↓↓←→←→BABA",
@@ -111,8 +114,8 @@ elseif setting.lang==3 then
"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 +143,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 +158,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 +166,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 +225,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 +245,10 @@ elseif setting.lang==5 then
"我一个滑铲就挖了个11renPC",
"我曾经在极度愤怒的时候15秒消了40行",
"天天F3F3,怕别人不知道你菜?",
"天天卖弱,你一定把把150apm吧?",
"天天催更催更,你咋不来帮忙开发啊,真以为作者很强催催啥都有?",
"设置都看过一遍了吗?明明都能调还嫌这嫌那,可牛逼了您",
"少玩点,多眨眼,到时候瞎了别怪我没提醒你",
"人只用一只手都能玩,你呢?",
"没那水平别天天整什么花里胡哨的,人玩几年你想几天赶上?",
"满口PCDT信天翁,还会点别的么?",
@@ -253,6 +257,7 @@ elseif setting.lang==5 then
"还搁这玩手机呢,作业做完了?",
"除了雨宫太阳你还认识谁?Jonas知道吗?Ajanba听过吗?",
"不会吧不会吧,真的还有人不能随手Tspin?",
"别会个c4w就以为自己多强,这是基本功罢了",
"60lpm?拍硬降刷的吧",
"4pps不是人均水平?",
"40行还要40多秒,就这?",
@@ -260,9 +265,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,7 +114,6 @@ 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
@@ -136,7 +135,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
@@ -146,16 +145,17 @@ local TRS={
else
P.spinSeq=0
end
P:freshBlock(true,true)
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}},
@@ -256,18 +256,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}},

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,
@@ -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,64 +1361,69 @@ 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)
@@ -1370,7 +1448,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 +1458,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 +1567,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 +1583,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 +1601,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 +1611,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 +1714,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 +1724,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 +2037,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 +2332,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 +2359,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 +2402,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 +2429,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 +2455,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 +2477,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 +2496,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 +2531,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
@@ -2567,7 +2667,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 +2679,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 +2728,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 +2802,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 +2854,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 +2870,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,21 +6,20 @@ 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:
@@ -28,11 +27,13 @@ Future outlook:
PUYO
game tutorial
finesse tutorial/exam(3next, 1pt/mino, drop to score)
easy finesse (only revert current)
game Abbr. test
backfire
round-based dig
bigbang
rhythm
KPP-locked
combo
square
field shifting(left/right)
@@ -42,21 +43,19 @@ Future outlook:
symmetry
hidden: sound only
reverb (often repeat a piece many times)
KPP-locked
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
@@ -69,6 +68,45 @@ Future outlook:
more graphic FXs & 3D features & animations
network game
0.10.5: 特效更新 FX update
新内容:
瞬移特效独立为瞬降和移动(旋转)特效,增加移动特效滑条,各特效范围均为0~5
增加两个莫名其妙的背景(放在无尽和限时打分)
把之前不小心弄丢的自制蓝屏报错界面捡回来了
改动:
雷达图OPM参数改为ADPM
调整J/L/I的踢墙表
根据锁延刷新模式决定锁延指示条颜色
增加无尽挖掘连挖提示,挖完后下一波立即升起
new English translation by @MattMayuga#8789
修改100/400/1000L的评级要求
支持加载部分老版本存档
软件锁界面出现时机调整,按钮位置调整
调整混战模式倍率影响边框颜色的范围
代码:
重命名大多数背景
重构createXxxFX函数
修复:
几个设置大标题样式统一
有消行延迟+出块等待时连续硬降出现神秘现象
垃圾行上涨不刷新ghost
粘贴序列bug
可以用键盘复制粘贴序列
每次启动游戏ai是一样的块序
0.10.4: 漏洞修复 Bug Fix
代码:
修改场景模块方法名
软件锁变量名从lock改为appLock
使用linter整理代码
重构锁延相关代码,freshgho,freshLockDelay,freshMinY合并为freshBlock
修复:
BPM120~180之间分数计算不正确
进不指定锁延的模式就报错
锁延机制错误(这次真修好了)
游戏结束后马上暂停并解除还会自动暂停(之前没修好)
提前硬降失效
0.10.3: 软件锁 APP Lock
新内容:
设置增加软件锁选项,打开游戏后进入伪装界面