Compare commits

..

36 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
54 changed files with 724 additions and 335 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
@@ -191,7 +193,7 @@ function keyDown.calculator(k)
end
elseif k=="space"then
if S.pass then
SCN.swapTo("load")
SCN.swapTo("intro")
end
end
end
@@ -217,6 +219,10 @@ 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.go("main")
end
@@ -431,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)
@@ -460,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
@@ -1071,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,
@@ -1094,7 +1165,7 @@ function love.run()
local FCT=0--Framedraw counter
love.resize(gc.getWidth(),gc.getHeight())
SCN.init(setting.appLock and "calculator"or"load")--Scene Launch
SCN.init("load")--Scene Launch
marking=true
return function()
@@ -1199,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="速度加快",
@@ -124,7 +125,7 @@ local langList={
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={
"D'PM",
"OPM",
"ADPM",
"APM",
"SPM",
"L'PM",
@@ -152,7 +153,7 @@ local langList={
"",
"使用LOVE2D引擎",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过内测群1080457319进行免费下载/更新",
"仅通过内测群1127702001进行免费下载/更新",
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -161,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, 蕴空之灵,",
@@ -182,7 +185,7 @@ local langList={
simple-love-lights[dylhunn]
]],
support="支持作者",
group="官方QQ群(如果没有被暗改的话就是这个):1080457319",
group="官方QQ群(如果没有被暗改的话就是这个):1127702001",
WidgetText={
calculator={
_1="1",_2="2",_3="3",
@@ -244,6 +247,7 @@ local langList={
back="返回",
},
draw={
b12="[ ]",
any="不定",
space="×",
clear="清除",
@@ -288,6 +292,7 @@ local langList={
bagLine="包分界线",
lockFX="锁定特效等级",
dropFX="下落特效等级",
moveFX="移动特效等级",
clearFX="消除特效等级",
shakeFX="晃动特效等级",
atkFX="攻击特效等级",
@@ -488,6 +493,7 @@ local langList={
stage=function(n)return"关卡 "..n end,
great="不错!",
awesome="精彩。",
almost="差一点!",
continue="继续。",
maxspeed="最高速度",
speedup="速度加快",
@@ -592,7 +598,7 @@ local langList={
radar={"","","","","",""},
radarData={
"防/分",
"/分",
"/分",
"攻/分",
"送/分",
"行/分",
@@ -619,7 +625,7 @@ local langList={
"从TO/C2/KOS/TGM3/JS等方块获得过灵感",
"",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过内测群1080457319进行免费下载/更新",
"仅通过内测群1127702001进行免费下载/更新",
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -628,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, 蕴空之灵,",
"茶管, [所有内测人员]",
@@ -649,7 +656,7 @@ local langList={
simple-love-lights[dylhunn]
]],
support="支持作者",
group="官方QQ群(如果没有被暗改的话就是这个):1080457319",
group="官方QQ群(如果没有被暗改的话就是这个):1127702001",
WidgetText={
calculator={
_1="1",_2="2",_3="3",
@@ -711,6 +718,7 @@ local langList={
back="返回",
},
draw={
b12="[ ]",
any="不定",
space="×",
clear="清除",
@@ -755,6 +763,7 @@ local langList={
bagLine="包分界线",
lockFX="锁定特效等级",
dropFX="下落特效等级",
moveFX="移动特效等级",
clearFX="消除特效等级",
shakeFX="晃动特效等级",
atkFX="攻击特效等级",
@@ -938,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",
@@ -988,36 +998,36 @@ 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:",
switchSpawnSFX="Switch on spawn SFX to play",
@@ -1026,7 +1036,7 @@ local langList={
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",
@@ -1056,7 +1066,7 @@ local langList={
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={
"D'PM",
"OPM",
"ADPM",
"APM",
"SPM",
"L'PM",
@@ -1082,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",
@@ -1095,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",
@@ -1121,7 +1133,7 @@ local langList={
main={
play="Play",
setting="Settings",
music="Music room",
music="Music Room",
stat="Statistics",
help="Help",
qplay="Q. Play",
@@ -1151,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={
@@ -1167,6 +1179,7 @@ local langList={
back="Back",
},
draw={
b12="[ ]",
any="Erase",
space="×",
clear="Clear",
@@ -1189,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",
appLock="App Lock(pw=626)",
appLock="App Lock (Password: 626)",
back="Back",
},
setting_video={
@@ -1208,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={
@@ -1272,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",
@@ -1309,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",
},
},
@@ -1345,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?"},
@@ -1389,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."},
},
},
{
@@ -1411,6 +1425,7 @@ local langList={
stage=function(n)return"::"..n.."::"end,
great="!~",
awesome="!!~",
almost="...!",
continue="~~",
maxspeed="!!!",
speedup="~!~",
@@ -1510,7 +1525,7 @@ local langList={
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={
"D'PM",
"OPM",
"ADPM",
"APM",
"SPM",
"L'PM",
@@ -1549,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, 蕴空之灵,",
@@ -1559,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",
@@ -1621,6 +1638,7 @@ local langList={
back="X",
},
draw={
b12="[ ]",
any="_",
space="×",
clear="XXX",
@@ -1665,6 +1683,7 @@ local langList={
bagLine="123|123",
lockFX="↓_~",
dropFX="↓~",
moveFX="←→~",
clearFX="↓↓↓~",
shakeFX="~|~|~",
atkFX="→→~",
@@ -1865,6 +1884,7 @@ local langList={
stage=function(n)return"关卡 "..n end,
great="不错的",
awesome="您很强",
almost="太舒服了",
continue="您继续",
maxspeed="速度封顶",
speedup="速度加快",
@@ -1971,7 +1991,7 @@ local langList={
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
radarData={
"D'PM",
"OPM",
"ADPM",
"APM",
"SPM",
"L'PM",
@@ -1989,8 +2009,8 @@ local langList={
"挖掘/挖掘攻击:",
"效率/挖掘效率:",
"多余操作/极简率:",
"满贯/大满贯:",
"全/半清:",
"牛逼/很牛逼:",
"消光/消半截:",
},
help={
"既然你能玩到这个游戏,应该也不需要什么帮助吧?",
@@ -1999,7 +2019,7 @@ local langList={
"",
"使用LOVE2D引擎",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过内测群1080457319进行免费下载/更新",
"仅通过内测群1127702001进行免费下载/更新",
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -2029,7 +2049,7 @@ local langList={
simple-love-lights[dylhunn]
]],
support="支持作者",
group="官方QQ群(如果没有被暗改的话就是这个):1080457319",
group="官方QQ群(如果没有被暗改的话就是这个):1127702001",
WidgetText={
calculator={
_1="1",_2="2",_3="3",
@@ -2091,6 +2111,7 @@ local langList={
back="返回",
},
draw={
b12="[ ]",
any="不定",
space="×",
clear="清除",
@@ -2135,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

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
@@ -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,23 +99,23 @@ 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.go("mode")end}),
@@ -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

View File

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

@@ -99,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)
@@ -116,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
@@ -134,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

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

@@ -20,7 +20,7 @@ return{
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,
@@ -41,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

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

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}},
@@ -149,13 +149,13 @@ local TRS={
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}},

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,16 +438,22 @@ 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:freshBlock(true,true)
P.spinLast=false
@@ -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
@@ -985,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
@@ -999,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
@@ -1013,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)
@@ -1069,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
@@ -1079,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>--------------------------
@@ -1221,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}
@@ -1244,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:freshBlock(true,false)
P:freshBlock(false,false)
end
function player.pushNext(P,L,mir)
for i=1,#L do
@@ -1294,7 +1361,7 @@ 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
@@ -1317,8 +1384,8 @@ function player.freshBlock(P,keepGhost,control,system)
--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)
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
@@ -1334,12 +1401,12 @@ function player.freshBlock(P,keepGhost,control,system)
if control then
if P.gameEnv.easyFresh then
local d,d0=P.lockDelay,P.gameEnv.lock
if d<d0 and P.freshTime<P.gameEnv.freshLimit 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=min(d+d0*.6,d0)
P.lockDelay=d0
P.dropDelay=P.gameEnv.drop
end
if P.curY<P.minY then
@@ -1391,8 +1458,8 @@ 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
@@ -1516,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
@@ -1647,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
@@ -1657,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
@@ -2260,6 +2332,9 @@ 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:freshBlock(false,true)
if P.human and P.curY==P.imgY then SFX.play("move")end
@@ -2284,6 +2359,9 @@ 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:freshBlock(false,true)
if P.human and P.curY==P.imgY then SFX.play("move")end
@@ -2323,10 +2401,10 @@ function player.act.hardDrop(P)
P:changeAtkMode(3)
end
P.keyPressing[6]=false
elseif P.control and P.waiting<=0 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)
elseif P.control and P.waiting==-1 and P.cur then
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
@@ -2351,7 +2429,7 @@ 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:freshBlock(true,true)
P.spinLast=false
@@ -2377,10 +2455,10 @@ 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.curX=P.curX-1
P:freshBlock(false,true)
end
if P.curX~=x0 then
@@ -2399,10 +2477,10 @@ 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.curX=P.curX+1
P:freshBlock(false,true)
end
if P.curX~=x0 then
@@ -2418,9 +2496,9 @@ 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
@@ -2430,7 +2508,10 @@ function player.act.insDown(P)
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:freshBlock(true,true)
P.spinLast=false
@@ -2438,7 +2519,7 @@ function player.act.down1(P)
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:freshBlock(true,true)
P.spinLast=false
@@ -2450,7 +2531,7 @@ 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:freshBlock(true,true)
P.spinLast=false
@@ -2586,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
@@ -2647,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
@@ -2720,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,
@@ -2785,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

@@ -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,32 @@ 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
代码:
修改场景模块方法名