代码规范:把所有的tab换成空格

This commit is contained in:
MrZ626
2021-08-25 04:28:52 +08:00
parent 8f910f95f4
commit 295e79984f
271 changed files with 35384 additions and 35379 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -5,21 +5,21 @@ local shader=SHADER.aura
local t
function back.init()
t=math.random()*2600
BG.resize(SCR.w,SCR.h)
t=math.random()*2600
BG.resize(SCR.w,SCR.h)
end
function back.resize(_,h)
shader:send('w',SCR.W)
shader:send('h',h*SCR.dpi)
shader:send('w',SCR.W)
shader:send('h',h*SCR.dpi)
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader()
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader()
end
return back

View File

@@ -5,20 +5,20 @@ local shader=SHADER.grad1
local t
function back.init()
t=math.random()*2600
back.resize()
t=math.random()*2600
back.resize()
end
function back.resize()
shader:send('w',SCR.W)
shader:send('w',SCR.W)
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader()
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader()
end
return back

View File

@@ -5,20 +5,20 @@ local shader=SHADER.grad2
local t
function back.init()
t=math.random()*2600
BG.resize(nil,SCR.h)
t=math.random()*2600
BG.resize(nil,SCR.h)
end
function back.resize(_,h)
shader:send('h',h*SCR.dpi)
shader:send('h',h*SCR.dpi)
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader()
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader()
end
return back

View File

@@ -12,55 +12,55 @@ local back={}
local t
local squares
function back.init()
t=26
squares={}
t=26
squares={}
end
function back.update()
t=t-1
if t==0 then
local S={
ang=6.2832*rnd(),
d=SCR.rad*1.05/2,
rotate=6.2832*rnd(),
va=.05-rnd()*.1,
size=SCR.rad*(2+rnd()*3)/100,
texture=SKIN.lib[SETTING.skinSet][rnd(16)],
}
ins(squares,S)
t=rnd(6,12)
end
for i=#squares,1,-1 do
local S=squares[i]
S.d=S.d-SCR.rad/(S.d+60)
if S.d>0 then
S.ang=S.ang+.008
S.rotate=S.rotate+S.va
else
rem(squares,i)
end
end
t=t-1
if t==0 then
local S={
ang=6.2832*rnd(),
d=SCR.rad*1.05/2,
rotate=6.2832*rnd(),
va=.05-rnd()*.1,
size=SCR.rad*(2+rnd()*3)/100,
texture=SKIN.lib[SETTING.skinSet][rnd(16)],
}
ins(squares,S)
t=rnd(6,12)
end
for i=#squares,1,-1 do
local S=squares[i]
S.d=S.d-SCR.rad/(S.d+60)
if S.d>0 then
S.ang=S.ang+.008
S.rotate=S.rotate+S.va
else
rem(squares,i)
end
end
end
function back.draw()
gc_clear(.1,.1,.1)
gc_replaceTransform(SCR.xOy_m)
gc_clear(.1,.1,.1)
gc_replaceTransform(SCR.xOy_m)
--Squares
gc_setColor(1,1,1,.2)
for i=1,#squares do
local S=squares[i]
gc_draw(S.texture,S.d*cos(S.ang),S.d*sin(S.ang),S.rotate,S.size*.026,nil,15,15)
end
--Squares
gc_setColor(1,1,1,.2)
for i=1,#squares do
local S=squares[i]
gc_draw(S.texture,S.d*cos(S.ang),S.d*sin(S.ang),S.rotate,S.size*.026,nil,15,15)
end
--Blackhole
gc_setColor(.07,.07,.07)
gc_circle('fill',0,0,157)
gc_setLineWidth(6)
for i=0,15 do
gc_setColor(.07,.07,.07,1-i*.0666)
gc_circle('line',0,0,160+6*i)
end
--Blackhole
gc_setColor(.07,.07,.07)
gc_circle('fill',0,0,157)
gc_setLineWidth(6)
for i=0,15 do
gc_setColor(.07,.07,.07,1-i*.0666)
gc_circle('line',0,0,160+6*i)
end
end
function back.discard()
squares=nil
squares=nil
end
return back

View File

@@ -10,46 +10,46 @@ local back={}
local t
local mino
function back.init()
t=0
mino={}
t=0
mino={}
end
function back.update()
t=t+1
if t%26==0 then
local r=rnd(7)
local B=BLOCKS[r][rnd(0,3)]
local k=(1+rnd()*2)*SCR.rad/1000
ins(mino,{
x=(SCR.w)*rnd()-15*#B[1],
y=0,
k=k,
vy=k*2,
block=B,
texture=SKIN.lib[SETTING.skinSet][SETTING.skin[r]],
})
end
for i=#mino,1,-1 do
local M=mino[i]
M.y=M.y+M.vy
if M.y-M.k*#M.block*30>SCR.h then rem(mino,i)end
end
t=t+1
if t%26==0 then
local r=rnd(7)
local B=BLOCKS[r][rnd(0,3)]
local k=(1+rnd()*2)*SCR.rad/1000
ins(mino,{
x=(SCR.w)*rnd()-15*#B[1],
y=0,
k=k,
vy=k*2,
block=B,
texture=SKIN.lib[SETTING.skinSet][SETTING.skin[r]],
})
end
for i=#mino,1,-1 do
local M=mino[i]
M.y=M.y+M.vy
if M.y-M.k*#M.block*30>SCR.h then rem(mino,i)end
end
end
function back.draw()
gc_clear(.1,.1,.1)
gc_setColor(1,1,1,.2)
for i=1,#mino do
local M=mino[i]
local b=M.block
for y=1,#b do
for x=1,#b[1]do
if b[y][x]then
gc_draw(M.texture,M.x+(x-1)*30*M.k,M.y-y*30*M.k,nil,M.k)
end
end
end
end
gc_clear(.1,.1,.1)
gc_setColor(1,1,1,.2)
for i=1,#mino do
local M=mino[i]
local b=M.block
for y=1,#b do
for x=1,#b[1]do
if b[y][x]then
gc_draw(M.texture,M.x+(x-1)*30*M.k,M.y-y*30*M.k,nil,M.k)
end
end
end
end
end
function back.discard()
mino=nil
mino=nil
end
return back

View File

@@ -7,48 +7,48 @@ local back={}
local t
local mino
function back.init()
t=0
mino={}
t=0
mino={}
end
function back.update()
t=t+1
if t%10==0 then
local r=rnd(29)
ins(mino,{
bid=r,
block=TEXTURE.miniBlock[r],
color=minoColor[SETTING.skin[r]],
x=SCR.w*rnd(),
y=SCR.h*-.05,
k=SCR.rad/100,
ang=rnd()*6.2832,
vy=.5+rnd()*.4,
vx=rnd()*.4-.2,
va=rnd()*.04-.02,
})
end
for i=#mino,1,-1 do
local P=mino[i]
P.y=P.y+P.vy
if P.y>SCR.h+25 then
rem(mino,i)
else
P.x=P.x+P.vx
P.ang=P.ang+P.va
P.vx=P.vx-.01+rnd()*.02
end
end
t=t+1
if t%10==0 then
local r=rnd(29)
ins(mino,{
bid=r,
block=TEXTURE.miniBlock[r],
color=minoColor[SETTING.skin[r]],
x=SCR.w*rnd(),
y=SCR.h*-.05,
k=SCR.rad/100,
ang=rnd()*6.2832,
vy=.5+rnd()*.4,
vx=rnd()*.4-.2,
va=rnd()*.04-.02,
})
end
for i=#mino,1,-1 do
local P=mino[i]
P.y=P.y+P.vy
if P.y>SCR.h+25 then
rem(mino,i)
else
P.x=P.x+P.vx
P.ang=P.ang+P.va
P.vx=P.vx-.01+rnd()*.02
end
end
end
function back.draw()
gc.clear(.08,.08,.084)
for i=1,#mino do
local C=mino[i]
local c=C.color
gc.setColor(c[1],c[2],c[3],.2)
gc.draw(C.block,C.x,C.y,C.ang,C.k,C.k,C.block:getWidth()/2,C.block:getHeight()/2)
end
gc.clear(.08,.08,.084)
for i=1,#mino do
local C=mino[i]
local c=C.color
gc.setColor(c[1],c[2],c[3],.2)
gc.draw(C.block,C.x,C.y,C.ang,C.k,C.k,C.block:getWidth()/2,C.block:getHeight()/2)
end
end
function back.discard()
mino=nil
mino=nil
end
return back

View File

@@ -11,47 +11,47 @@ local back={}
local t
local mino
function back.init()
t=0
mino={}
t=0
mino={}
end
function back.update()
t=t+1
if t%3==0 then
local r=rnd(29)
ins(mino,{
block=TEXTURE.miniBlock[r],
color=minoColor[SETTING.skin[r]],
ang=6.2832*rnd(),
rotate=6.2832*rnd(),
vr=.05-rnd()*.1,
d=0,
v=.5+rnd(),
})
end
local rad=SCR.rad
for i=#mino,1,-1 do
local M=mino[i]
M.d=M.d+M.v
if M.d>rad*1.05 then
rem(mino,i)
else
M.rotate=M.rotate+M.vr
M.v=M.v*(1+M.d/rad*.05)
end
end
t=t+1
if t%3==0 then
local r=rnd(29)
ins(mino,{
block=TEXTURE.miniBlock[r],
color=minoColor[SETTING.skin[r]],
ang=6.2832*rnd(),
rotate=6.2832*rnd(),
vr=.05-rnd()*.1,
d=0,
v=.5+rnd(),
})
end
local rad=SCR.rad
for i=#mino,1,-1 do
local M=mino[i]
M.d=M.d+M.v
if M.d>rad*1.05 then
rem(mino,i)
else
M.rotate=M.rotate+M.vr
M.v=M.v*(1+M.d/rad*.05)
end
end
end
function back.draw()
gc_clear(.1,.1,.1)
gc_translate(SCR.cx,SCR.cy)
for i=1,#mino do
local M=mino[i]
local c=M.color
gc_setColor(c[1],c[2],c[3],.2)
gc_draw(M.block,M.d*cos(M.ang),M.d*sin(M.ang),M.rotate,(18*M.d/SCR.rad)^1.6,nil,M.block:getWidth()/2,M.block:getHeight()/2)
end
gc_translate(-SCR.cx,-SCR.cy)
gc_clear(.1,.1,.1)
gc_translate(SCR.cx,SCR.cy)
for i=1,#mino do
local M=mino[i]
local c=M.color
gc_setColor(c[1],c[2],c[3],.2)
gc_draw(M.block,M.d*cos(M.ang),M.d*sin(M.ang),M.rotate,(18*M.d/SCR.rad)^1.6,nil,M.block:getWidth()/2,M.block:getHeight()/2)
end
gc_translate(-SCR.cx,-SCR.cy)
end
function back.discard()
mino=nil
mino=nil
end
return back

View File

@@ -11,71 +11,71 @@ local back={}
local t
local squares
function back.init()
t=26
squares={}
t=26
squares={}
end
function back.update(dt)
t=t-1
if t==0 then
local size=SCR.rad*(2+rnd()*3)/100
local S={
x=(SCR.w-size)*rnd(),
y=(SCR.h-size)*rnd(),
vx=0,vy=0,
size=size,
color=COLOR.random_dark(),
}
local speed=SCR.rad*(1+rnd()*2)/6
if rnd()<.5 then
S.vy=26*(.5-rnd())
S.vx=speed
if rnd()<.5 then
S.x=-S.size
else
S.x=SCR.w
S.vx=-S.vx
end
else
S.vx=26*(.5-rnd())
S.vy=speed
if rnd()<.5 then
S.y=-S.size
else
S.y=SCR.h
S.vy=-S.vy
end
end
ins(squares,S)
t=rnd(6,16)
end
for i=#squares,1,-1 do
local S=squares[i]
if
S.vx>0 and S.x>SCR.w or
S.vx<0 and S.x+S.size<0 or
S.vy>0 and S.y>SCR.h or
S.vy<0 and S.y+S.size<0
then
rem(squares,i)
else
S.x=S.x+S.vx*dt
S.y=S.y+S.vy*dt
end
end
t=t-1
if t==0 then
local size=SCR.rad*(2+rnd()*3)/100
local S={
x=(SCR.w-size)*rnd(),
y=(SCR.h-size)*rnd(),
vx=0,vy=0,
size=size,
color=COLOR.random_dark(),
}
local speed=SCR.rad*(1+rnd()*2)/6
if rnd()<.5 then
S.vy=26*(.5-rnd())
S.vx=speed
if rnd()<.5 then
S.x=-S.size
else
S.x=SCR.w
S.vx=-S.vx
end
else
S.vx=26*(.5-rnd())
S.vy=speed
if rnd()<.5 then
S.y=-S.size
else
S.y=SCR.h
S.vy=-S.vy
end
end
ins(squares,S)
t=rnd(6,16)
end
for i=#squares,1,-1 do
local S=squares[i]
if
S.vx>0 and S.x>SCR.w or
S.vx<0 and S.x+S.size<0 or
S.vy>0 and S.y>SCR.h or
S.vy<0 and S.y+S.size<0
then
rem(squares,i)
else
S.x=S.x+S.vx*dt
S.y=S.y+S.vy*dt
end
end
end
function back.draw()
gc_clear(.1,.1,.1)
gc_setLineWidth(6)
for i=1,#squares do
local S=squares[i]
local c=S.color
gc_setColor(c[1],c[2],c[3],.2)
gc_rectangle('line',S.x,S.y,S.size,S.size)
gc_setColor(c[1],c[2],c[3],.3)
gc_rectangle('fill',S.x,S.y,S.size,S.size)
end
gc_clear(.1,.1,.1)
gc_setLineWidth(6)
for i=1,#squares do
local S=squares[i]
local c=S.color
gc_setColor(c[1],c[2],c[3],.2)
gc_rectangle('line',S.x,S.y,S.size,S.size)
gc_setColor(c[1],c[2],c[3],.3)
gc_rectangle('fill',S.x,S.y,S.size,S.size)
end
end
function back.discard()
squares=nil
squares=nil
end
return back

View File

@@ -14,66 +14,66 @@ local back={}
local t
local fan,petal
function back.init()
t=0
fan=title_fan
petal={}
t=0
fan=title_fan
petal={}
end
function back.update()
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>SCR.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
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>SCR.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
function back.draw()
gc_clear(.1,.1,.1)
gc_clear(.1,.1,.1)
gc_replaceTransform(SCR.xOy_m)
gc_translate(0,20*sin(t*.02))
gc_replaceTransform(SCR.xOy_m)
gc_translate(0,20*sin(t*.02))
gc_setLineWidth(320)
gc_setColor(.9,.6,.9,.1)
gc_arc('line','open',0,420,500,-.8*3.1416,-.2*3.1416)
gc_setLineWidth(320)
gc_setColor(.9,.6,.9,.1)
gc_arc('line','open',0,420,500,-.8*3.1416,-.2*3.1416)
gc_setLineWidth(4)
gc_setColor(1,.7,.9,.2)
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(4)
gc_setColor(1,.7,.9,.2)
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(.8,.9,1,.3)
for i=1,8 do gc_polygon('line',fan[i])end
gc_setLineWidth(6)
gc_setColor(.8,.9,1,.3)
for i=1,8 do gc_polygon('line',fan[i])end
gc_setLineWidth(2)
gc_setColor(1,.5,.7,.3)
gc_setLineWidth(2)
gc_setColor(1,.5,.7,.3)
gc_origin()
for i=1,#petal do
local P=petal[i]
gc_ellipse('fill',P.x,P.y,P.rx,P.ry)
end
gc_origin()
for i=1,#petal do
local P=petal[i]
gc_ellipse('fill',P.x,P.y,P.rx,P.ry)
end
end
function back.discard()
petal=nil
petal=nil
end
return back

View File

@@ -11,88 +11,88 @@ local back={}
local t
local firework,particle
function back.init()
t=26
firework,particle={},{}
t=26
firework,particle={},{}
end
function back.update(dt)
t=t-1
if t==0 then
ins(firework,{
x=nil,y=nil,
x0=SCR.w*(rnd()*1.2-.1),
y0=SCR.h*1.5,
x1=SCR.w*(.15+rnd()*.7),
y1=SCR.h*(.15+rnd()*.4),
t=0,
v=.5+rnd(),
color=COLOR.random_dark(),
big=rnd()<.1,
})
t=rnd(26,62)
end
for i=#firework,1,-1 do
local F=firework[i]
local time=F.t^.5
if time>1 then
local x,y,color=F.x,F.y,F.color
if F.big then
SFX.play('fall',.5)
for _=1,rnd(62,126)do
ins(particle,{
x=x,y=y,
color=color,
vx=rnd()*16-8,
vy=rnd()*16-8,
t=1,
})
end
else
SFX.play('clear_1',.4)
for _=1,rnd(16,26)do
ins(particle,{
x=x,y=y,
color=color,
vx=rnd()*8-4,
vy=rnd()*8-4,
t=1,
})
end
end
rem(firework,i)
else
F.t=F.t+dt*F.v
F.x=F.x0*(1-time)+F.x1*time
F.y=F.y0*(1-time)+F.y1*time
end
end
for i=#particle,1,-1 do
local P=particle[i]
if P.t<0 then
rem(particle,i)
else
P.x=P.x+P.vx
P.y=P.y+P.vy
P.vy=P.vy+.04
P.t=P.t-dt*.6
end
end
t=t-1
if t==0 then
ins(firework,{
x=nil,y=nil,
x0=SCR.w*(rnd()*1.2-.1),
y0=SCR.h*1.5,
x1=SCR.w*(.15+rnd()*.7),
y1=SCR.h*(.15+rnd()*.4),
t=0,
v=.5+rnd(),
color=COLOR.random_dark(),
big=rnd()<.1,
})
t=rnd(26,62)
end
for i=#firework,1,-1 do
local F=firework[i]
local time=F.t^.5
if time>1 then
local x,y,color=F.x,F.y,F.color
if F.big then
SFX.play('fall',.5)
for _=1,rnd(62,126)do
ins(particle,{
x=x,y=y,
color=color,
vx=rnd()*16-8,
vy=rnd()*16-8,
t=1,
})
end
else
SFX.play('clear_1',.4)
for _=1,rnd(16,26)do
ins(particle,{
x=x,y=y,
color=color,
vx=rnd()*8-4,
vy=rnd()*8-4,
t=1,
})
end
end
rem(firework,i)
else
F.t=F.t+dt*F.v
F.x=F.x0*(1-time)+F.x1*time
F.y=F.y0*(1-time)+F.y1*time
end
end
for i=#particle,1,-1 do
local P=particle[i]
if P.t<0 then
rem(particle,i)
else
P.x=P.x+P.vx
P.y=P.y+P.vy
P.vy=P.vy+.04
P.t=P.t-dt*.6
end
end
end
function back.draw()
gc_clear(.1,.1,.1)
for i=1,#firework do
local F=firework[i]
gc_setColor(F.color)
gc_circle('fill',F.x,F.y,F.big and 8 or 4)
end
gc_setLineWidth(3)
for i=1,#particle do
local P=particle[i]
local c=P.color
gc_setColor(c[1],c[2],c[3],P.t*.4)
gc_line(P.x,P.y,P.x-P.vx*4,P.y-P.vy*4)
end
gc_clear(.1,.1,.1)
for i=1,#firework do
local F=firework[i]
gc_setColor(F.color)
gc_circle('fill',F.x,F.y,F.big and 8 or 4)
end
gc_setLineWidth(3)
for i=1,#particle do
local P=particle[i]
local c=P.color
gc_setColor(c[1],c[2],c[3],P.t*.4)
gc_line(P.x,P.y,P.x-P.vx*4,P.y-P.vy*4)
end
end
function back.discard()
firework=nil
firework=nil
end
return back

View File

@@ -4,15 +4,15 @@ local back={}
local t
function back.init()
t=math.random()*2600
t=math.random()*2600
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
local t1=.13-t%3%1.9
if t1<.2 then gc.clear(t1,t1,t1)
else gc.clear(0,0,0)
end
local t1=.13-t%3%1.9
if t1<.2 then gc.clear(t1,t1,t1)
else gc.clear(0,0,0)
end
end
return back

View File

@@ -5,13 +5,13 @@ local back={}
local t
function back.init()
t=math.random()*2600
t=math.random()*2600
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
local t1=(sin(t*.5)+sin(t*.7)+sin(t*.9+1)+sin(t*1.5)+sin(t*2+10))*.08
gc.clear(t1,t1,t1)
local t1=(sin(t*.5)+sin(t*.7)+sin(t*.9+1)+sin(t*1.5)+sin(t*2+10))*.08
gc.clear(t1,t1,t1)
end
return back

View File

@@ -8,41 +8,41 @@ local back={}
local lanterns
local t
function back.init()
lanterns={}
t=0
lanterns={}
t=0
end
function back.update(dt)
t=t-dt
local H=SCR.h
if t<=0 then
local size=SCR.rad*(2+rnd()*3)/5/2000
local L={
x=SCR.w*rnd(),
y=H*1.1,
vy=size*2,
size=size,
phase=rnd(),
vp=(.02+.02*rnd())*(rnd(2)*2-3),
}
ins(lanterns,L)
t=rnd(.626,1.626)
end
for i=#lanterns,1,-1 do
local L=lanterns[i]
L.y=L.y-L.vy*dt*60
L.phase=(L.phase+L.vp*dt*60)%1
if L.y<-.1*H then
rem(lanterns,i)
end
end
t=t-dt
local H=SCR.h
if t<=0 then
local size=SCR.rad*(2+rnd()*3)/5/2000
local L={
x=SCR.w*rnd(),
y=H*1.1,
vy=size*2,
size=size,
phase=rnd(),
vp=(.02+.02*rnd())*(rnd(2)*2-3),
}
ins(lanterns,L)
t=rnd(.626,1.626)
end
for i=#lanterns,1,-1 do
local L=lanterns[i]
L.y=L.y-L.vy*dt*60
L.phase=(L.phase+L.vp*dt*60)%1
if L.y<-.1*H then
rem(lanterns,i)
end
end
end
function back.draw()
gc.clear(.08,.08,.084)
gc.setColor(1,1,1,.2)
local img=IMG.lanterns
for i=1,#lanterns do
local L=lanterns[i]
mDraw(img[int(L.phase*6)+1],L.x,L.y,nil,L.size)
end
gc.clear(.08,.08,.084)
gc.setColor(1,1,1,.2)
local img=IMG.lanterns
for i=1,#lanterns do
local L=lanterns[i]
mDraw(img[int(L.phase*6)+1],L.x,L.y,nil,L.size)
end
end
return back

View File

@@ -3,34 +3,34 @@ local gc=love.graphics
local back={}
local upCover do
local L={1,64}
for i=0,63 do
table.insert(L,{'setCL',.6,1,1,i*.01})
table.insert(L,{'fRect',0,63-i,1,1})
end
upCover=GC.DO(L)
local L={1,64}
for i=0,63 do
table.insert(L,{'setCL',.6,1,1,i*.01})
table.insert(L,{'fRect',0,63-i,1,1})
end
upCover=GC.DO(L)
end
local downCover do
local L={1,64}
for i=0,63 do
table.insert(L,{'setCL',1,.5,.8,i*.01})
table.insert(L,{'fRect',0,i,1,1})
end
downCover=GC.DO(L)
local L={1,64}
for i=0,63 do
table.insert(L,{'setCL',1,.5,.8,i*.01})
table.insert(L,{'fRect',0,i,1,1})
end
downCover=GC.DO(L)
end
local W,H
function back.init()
BG.resize(SCR.w,SCR.h)
BG.resize(SCR.w,SCR.h)
end
function back.resize(w,h)
W,H=w,h
W,H=w,h
end
function back.update()
end
function back.draw()
gc.clear(.08,.08,.084)
gc.draw(upCover,0,0,0,W,H*.3/64)
gc.draw(downCover,0,H*.7,0,W,H*.3/64)
gc.clear(.08,.08,.084)
gc.draw(upCover,0,0,0,W,H*.3/64)
gc.draw(downCover,0,H*.7,0,W,H*.3/64)
end
return back

View File

@@ -4,15 +4,15 @@ local back={}
local t
function back.init()
t=math.random()*2600
t=math.random()*2600
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
local t1=2.5-t%20%6%2.5
if t1<.3 then gc.clear(t1,t1,t1)
else gc.clear(0,0,0)
end
local t1=2.5-t%20%6%2.5
if t1<.3 then gc.clear(t1,t1,t1)
else gc.clear(0,0,0)
end
end
return back

View File

@@ -8,19 +8,19 @@ local colorLib=minoColor
local blocks=BLOCKS
local scs=RSlist.TRS.centerPos
function back.init()
t=rnd()*2600
t=rnd()*2600
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
local R=7-int(t*.5%7)
local T=1.2-t%15%6%1.8
if T<.26 then gc.clear(T,T,T)
else gc.clear(0,0,0)
end
local _=colorLib[SETTING.skin[R]]
gc.setColor(_[1],_[2],_[3],.12)
gc.draw(TEXTURE.miniBlock[R],SCR.cx,SCR.cy,t%3.1416*6,400*SCR.k,nil,scs[R][0][2]+.5,#blocks[R][0]-scs[R][0][1]-.5)
local R=7-int(t*.5%7)
local T=1.2-t%15%6%1.8
if T<.26 then gc.clear(T,T,T)
else gc.clear(0,0,0)
end
local _=colorLib[SETTING.skin[R]]
gc.setColor(_[1],_[2],_[3],.12)
gc.draw(TEXTURE.miniBlock[R],SCR.cx,SCR.cy,t%3.1416*6,400*SCR.k,nil,scs[R][0][2]+.5,#blocks[R][0]-scs[R][0][1]-.5)
end
return back

View File

@@ -11,21 +11,21 @@ local back={}
local t
local matrixT={}for i=1,50 do matrixT[i]={}for j=1,50 do matrixT[i][j]=love.math.noise(i,j)+2 end end
function back.init()
t=math.random()*2600
t=math.random()*2600
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
gc_clear(.1,.1,.1)
local k=SCR.k
gc_scale(k)
local Y=ceil(SCR.h/80/k)
for x=1,ceil(SCR.w/80/k)do
for y=1,Y do
gc_setColor(1,1,1,sin(x+matrixT[x][y]*t)*.04+.04)
gc_rectangle('fill',80*x,80*y,-80,-80)
end
end
gc_clear(.1,.1,.1)
local k=SCR.k
gc_scale(k)
local Y=ceil(SCR.h/80/k)
for x=1,ceil(SCR.w/80/k)do
for y=1,Y do
gc_setColor(1,1,1,sin(x+matrixT[x][y]*t)*.04+.04)
gc_rectangle('fill',80*x,80*y,-80,-80)
end
end
end
return back

View File

@@ -5,21 +5,21 @@ local shader=SHADER.rgb1
local t
function back.init()
t=math.random()*2600
BG.resize(SCR.w,SCR.h)
t=math.random()*2600
BG.resize(SCR.w,SCR.h)
end
function back.resize(_,h)
shader:send('w',SCR.W)
shader:send('h',h*SCR.dpi)
shader:send('w',SCR.W)
shader:send('h',h*SCR.dpi)
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader()
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader()
end
return back

View File

@@ -5,21 +5,21 @@ local shader=SHADER.rgb2
local t
function back.init()
t=math.random()*2600
BG.resize(SCR.w,SCR.h)
t=math.random()*2600
BG.resize(SCR.w,SCR.h)
end
function back.resize(_,h)
shader:send('w',SCR.W)
shader:send('h',h*SCR.dpi)
shader:send('w',SCR.W)
shader:send('h',h*SCR.dpi)
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader()
gc.clear(.08,.08,.084)
shader:send('t',t)
gc.setShader(shader)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
gc.setShader()
end
return back

View File

@@ -5,16 +5,16 @@ local back={}
local t
function back.init()
t=math.random()*2600
t=math.random()*2600
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
gc.clear(
sin(t*1.2)*.06+.08,
sin(t*1.5)*.06+.08,
sin(t*1.9)*.06+.08
)
gc.clear(
sin(t*1.2)*.06+.08,
sin(t*1.5)*.06+.08,
sin(t*1.9)*.06+.08
)
end
return back

View File

@@ -9,43 +9,43 @@ local back={}
local t
local snow
function back.init()
t=0
snow={}
t=0
snow={}
end
function back.update()
t=t+1
if t%(t%626>260 and 3 or 6)==0 then
ins(snow,{
x=SCR.w*rnd(),
y=0,
vy=1+rnd()*.6,
vx=rnd()*2-.5,
rx=2+rnd()*2,
ry=2+rnd()*2,
})
end
for i=#snow,1,-1 do
local P=snow[i]
P.y=P.y+P.vy
if P.y>SCR.h then
rem(snow,i)
else
P.x=P.x+P.vx
P.vx=P.vx-.02+rnd()*.04
P.rx=max(min(P.rx+rnd()-.5,4),2)
P.ry=max(min(P.ry+rnd()-.5,5),3)
end
end
t=t+1
if t%(t%626>260 and 3 or 6)==0 then
ins(snow,{
x=SCR.w*rnd(),
y=0,
vy=1+rnd()*.6,
vx=rnd()*2-.5,
rx=2+rnd()*2,
ry=2+rnd()*2,
})
end
for i=#snow,1,-1 do
local P=snow[i]
P.y=P.y+P.vy
if P.y>SCR.h then
rem(snow,i)
else
P.x=P.x+P.vx
P.vx=P.vx-.02+rnd()*.04
P.rx=max(min(P.rx+rnd()-.5,4),2)
P.ry=max(min(P.ry+rnd()-.5,5),3)
end
end
end
function back.draw()
gc.clear(.08,.08,.084)
gc.setColor(.7,.7,.7)
for i=1,#snow do
local P=snow[i]
ellipse('fill',P.x,P.y,P.rx,P.ry)
end
gc.clear(.08,.08,.084)
gc.setColor(.7,.7,.7)
for i=1,#snow do
local P=snow[i]
ellipse('fill',P.x,P.y,P.rx,P.ry)
end
end
function back.discard()
snow=nil
snow=nil
end
return back

View File

@@ -7,40 +7,40 @@ local back={}
local stars
local W,H
function back.init()
stars={}
BG.resize(SCR.w,SCR.h)
stars={}
BG.resize(SCR.w,SCR.h)
end
function back.resize(w,h)
W,H=w+20,h+20
local S=stars
for i=1,1260,5 do
local s=rnd(26,40)*.1
S[i]=s*SCR.k --Size
S[i+1]=rnd(W)-10 --X
S[i+2]=rnd(H)-10 --Y
S[i+3]=(rnd()-.5)*.01*s --Vx
S[i+4]=(rnd()-.5)*.01*s --Vy
end
W,H=w+20,h+20
local S=stars
for i=1,1260,5 do
local s=rnd(26,40)*.1
S[i]=s*SCR.k --Size
S[i+1]=rnd(W)-10 --X
S[i+2]=rnd(H)-10 --Y
S[i+3]=(rnd()-.5)*.01*s--Vx
S[i+4]=(rnd()-.5)*.01*s--Vy
end
end
function back.update()
local S=stars
--Star moving
for i=1,1260,5 do
S[i+1]=(S[i+1]+S[i+3])%W
S[i+2]=(S[i+2]+S[i+4])%H
end
local S=stars
--Star moving
for i=1,1260,5 do
S[i+1]=(S[i+1]+S[i+3])%W
S[i+2]=(S[i+2]+S[i+4])%H
end
end
function back.draw()
gc.clear(.08,.08,.084)
if not stars[1]then return end
gc.translate(-10,-10)
gc.setColor(1,1,1,.6)
for i=1,1260,5 do
rectangle('fill',stars[i+1],stars[i+2],stars[i],stars[i])
end
gc.translate(10,10)
gc.clear(.08,.08,.084)
if not stars[1]then return end
gc.translate(-10,-10)
gc.setColor(1,1,1,.6)
for i=1,1260,5 do
rectangle('fill',stars[i+1],stars[i+2],stars[i],stars[i])
end
gc.translate(10,10)
end
function back.discard()
stars=nil
stars=nil
end
return back

View File

@@ -8,36 +8,36 @@ local ring
local t
local W,H
function back.init()
ring={}
t=26
back.resize(SCR.w,SCR.h)
ring={}
t=26
back.resize(SCR.w,SCR.h)
end
function back.resize(w,h)
W,H=w,h
W,H=w,h
end
function back.update(dt)
t=t-1
if t==0 then
t=rnd(26,62)
ins(ring,0)
end
for i=#ring,1,-1 do
ring[i]=ring[i]+dt
if ring[i]>3.55 then
rem(ring,i)
end
end
t=t-1
if t==0 then
t=rnd(26,62)
ins(ring,0)
end
for i=#ring,1,-1 do
ring[i]=ring[i]+dt
if ring[i]>3.55 then
rem(ring,i)
end
end
end
function back.draw()
gc.clear(.08,.08,.084)
gc.setColor(1,1,1,.1)
for i=1,#ring do
local r=ring[i]^2/12
gc.setLineWidth(30-15/(r+.5))
gc.rectangle('line',W*.5-W*r/2,H*.5-H*r/2,W*r,H*r)
end
gc.clear(.08,.08,.084)
gc.setColor(1,1,1,.1)
for i=1,#ring do
local r=ring[i]^2/12
gc.setLineWidth(30-15/(r+.5))
gc.rectangle('line',W*.5-W*r/2,H*.5-H*r/2,W*r,H*r)
end
end
function back.discard()
ring=nil
ring=nil
end
return back

View File

@@ -6,34 +6,34 @@ local back={}
local t
local txt
function back.init()
t=math.random()*2600
txt=gc.newText(getFont(80),"Welcome To Techmino")
t=math.random()*2600
txt=gc.newText(getFont(80),"Welcome To Techmino")
end
function back.update(dt)
t=t+dt
t=t+dt
end
function back.draw()
if -t%13.55<.1283 then
gc.clear(.2+.1*sin(t),.2+.1*sin(1.26*t),.2+.1*sin(1.626*t))
else
gc.clear(.08,.08,.084)
end
gc.push('transform')
gc.translate(SCR.cx,SCR.cy+20*sin(t*.02))
gc.scale(SCR.k)
gc.scale(1.1626,1.26)
if -t%6.26<.1355 then
gc.translate(60*sin(t*.26),100*sin(t*.626))
end
if -t%12.6<.1626 then
gc.rotate(t+5*sin(.26*t)+5*sin(.626*t))
end
gc.setColor(.4,.6,1,.3)
gc.draw(txt,-883*.5+4*sin(t*.7942),-110*.5+4*sin(t*.7355))
gc.setColor(.5,.7,1,.4)
gc.draw(txt,-883*.5+2*sin(t*.77023),-110*.5+2*sin(t*.7026))
gc.setColor(1,1,1,.5)
gc.draw(txt,-883*.5+3*sin(t*.7283),-110*.5+3*sin(t*.7626))
gc.pop()
if -t%13.55<.1283 then
gc.clear(.2+.1*sin(t),.2+.1*sin(1.26*t),.2+.1*sin(1.626*t))
else
gc.clear(.08,.08,.084)
end
gc.push('transform')
gc.translate(SCR.cx,SCR.cy+20*sin(t*.02))
gc.scale(SCR.k)
gc.scale(1.1626,1.26)
if -t%6.26<.1355 then
gc.translate(60*sin(t*.26),100*sin(t*.626))
end
if -t%12.6<.1626 then
gc.rotate(t+5*sin(.26*t)+5*sin(.626*t))
end
gc.setColor(.4,.6,1,.3)
gc.draw(txt,-883*.5+4*sin(t*.7942),-110*.5+4*sin(t*.7355))
gc.setColor(.5,.7,1,.4)
gc.draw(txt,-883*.5+2*sin(t*.77023),-110*.5+2*sin(t*.7026))
gc.setColor(1,1,1,.5)
gc.draw(txt,-883*.5+3*sin(t*.7283),-110*.5+3*sin(t*.7626))
gc.pop()
end
return back

View File

@@ -3,71 +3,71 @@ local gc=love.graphics
local rnd=math.random
local back={}
local wingColor={
{.3,.9,.9,.2},
{.5,1.,.5,.2},
{.9,.9,.3,.2},
{1.,.7,.3,.2},
{1.,.5,.5,.2},
{.7,.3,1.,.2},
{.5,.5,1.,.2},
{.3,.9,.9,.2},
{.3,.9,.9,.2},
{.5,1.,.5,.2},
{.9,.9,.3,.2},
{1.,.7,.3,.2},
{1.,.5,.5,.2},
{.7,.3,1.,.2},
{.5,.5,1.,.2},
{.3,.9,.9,.2},
}
local bar,crystal
local W,H
function back.init()
bar=gc.newCanvas(41,1)
gc.setCanvas(bar)
gc.push('transform')
gc.origin()
for x=0,20 do
gc.setColor(1,1,1,x/5)
gc.rectangle('fill',x,0,1,1)
gc.rectangle('fill',41-x,0,1,1)
end
gc.pop()
gc.setCanvas()
back.resize()
bar=gc.newCanvas(41,1)
gc.setCanvas(bar)
gc.push('transform')
gc.origin()
for x=0,20 do
gc.setColor(1,1,1,x/5)
gc.rectangle('fill',x,0,1,1)
gc.rectangle('fill',41-x,0,1,1)
end
gc.pop()
gc.setCanvas()
back.resize()
end
function back.resize()
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
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
function back.update()
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
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
function back.draw()
gc.clear(.06,.06,.06)
local sk,sy=SCR.k,H*.8
for i=1,8 do
gc.setColor(wingColor[i])
local B=crystal[i]
gc.draw(bar,B.x,B.y,B.a,sk,sy,20,0)
B=crystal[17-i]
gc.draw(bar,B.x,B.y,B.a,sk,sy,20,0)
end
gc.clear(.06,.06,.06)
local sk,sy=SCR.k,H*.8
for i=1,8 do
gc.setColor(wingColor[i])
local B=crystal[i]
gc.draw(bar,B.x,B.y,B.a,sk,sy,20,0)
B=crystal[17-i]
gc.draw(bar,B.x,B.y,B.a,sk,sy,20,0)
end
end
function back.event(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
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
function back.discard()
bar,crystal=nil
bar,crystal=nil
end
return back

View File

@@ -1,15 +1,15 @@
--[[ControlID:
1~5:mL,mR,rR,rL,rF,
6~10:hD,sD,H,A,R,
11~13:LL,RR,DD
1~5:mL,mR,rR,rL,rF,
6~10:hD,sD,H,A,R,
11~13:LL,RR,DD
]]
--[[Future:
HighestBlock
BlockedCells
Wells
FilledLines
4deepShape
BlockedWells
HighestBlock
BlockedCells
Wells
FilledLines
4deepShape
BlockedWells
]]
local min,abs=math.min,math.abs
local ins,rem=table.insert,table.remove
@@ -17,184 +17,184 @@ local yield=coroutine.yield
local dirCount={1,1,3,3,3,0,1}
local FCL={
[1]={
{{11},{11,2},{1},{},{2},{2,2},{12,1},{12}},
{{11,4},{11,3},{1,4},{4},{3},{2,3},{2,2,3},{12,4},{12,3}},
},
[3]={
{{11},{11,2},{1},{},{2},{2,2},{12,1},{12}},
{{3,11},{11,3},{11,2,3},{1,3},{3},{2,3},{2,2,3},{12,1,3},{12,3}},
{{11,5},{11,2,5},{1,5},{5},{2,5},{2,2,5},{12,1,5},{12,5}},
{{11,4},{11,2,4},{1,4},{4},{2,4},{2,2,4},{12,1,4},{12,4},{4,12}},
},
[6]={
{{11},{11,2},{1,1},{1},{},{2},{2,2},{12,1},{12}},
},
[7]={
{{11},{11,2},{1},{},{2},{12,1},{12}},
{{4,11},{11,4},{11,3},{1,4},{4},{3},{2,3},{12,4},{12,3},{3,12}},
},
[1]={
{{11},{11,2},{1},{},{2},{2,2},{12,1},{12}},
{{11,4},{11,3},{1,4},{4},{3},{2,3},{2,2,3},{12,4},{12,3}},
},
[3]={
{{11},{11,2},{1},{},{2},{2,2},{12,1},{12}},
{{3,11},{11,3},{11,2,3},{1,3},{3},{2,3},{2,2,3},{12,1,3},{12,3}},
{{11,5},{11,2,5},{1,5},{5},{2,5},{2,2,5},{12,1,5},{12,5}},
{{11,4},{11,2,4},{1,4},{4},{2,4},{2,2,4},{12,1,4},{12,4},{4,12}},
},
[6]={
{{11},{11,2},{1,1},{1},{},{2},{2,2},{12,1},{12}},
},
[7]={
{{11},{11,2},{1},{},{2},{12,1},{12}},
{{4,11},{11,4},{11,3},{1,4},{4},{3},{2,3},{12,4},{12,3},{3,12}},
},
}FCL[2],FCL[4],FCL[5]=FCL[1],FCL[3],FCL[3]
local LclearScore={[0]=0,-200,-150,-100,200}
local HclearScore={[0]=0,100,140,200,500}
local function _ifoverlapAI(f,bk,x,y)
for i=1,#bk do for j=1,#bk[1]do
if f[y+i-1]and bk[i][j]and f[y+i-1][x+j-1]>0 then return true end
end end
for i=1,#bk do for j=1,#bk[1]do
if f[y+i-1]and bk[i][j]and f[y+i-1][x+j-1]>0 then return true end
end end
end
local discardRow=FREEROW.discard
local getRow=FREEROW.get
local function _resetField(f0,f,start)
for _=#f,start,-1 do
discardRow(f[_])
f[_]=nil
end
for i=start,#f0 do
f[i]=getRow(0)
for j=1,10 do
f[i][j]=f0[i][j]
end
end
for _=#f,start,-1 do
discardRow(f[_])
f[_]=nil
end
for i=start,#f0 do
f[i]=getRow(0)
for j=1,10 do
f[i][j]=f0[i][j]
end
end
end
local function _getScore(field,cb,cy)
local score=0
local highest=0
local height=getRow(0)
local clear=0
local hole=0
local score=0
local highest=0
local height=getRow(0)
local clear=0
local hole=0
for i=cy+#cb-1,cy,-1 do
for j=1,10 do
if field[i][j]==0 then goto CONTINUE_notFull end
end
discardRow(rem(field,i))
clear=clear+1
::CONTINUE_notFull::
end
if #field==0 then return 1e99 end--PC
for x=1,10 do
local h=#field
while field[h][x]==0 and h>1 do
h=h-1
end
height[x]=h
if x>3 and x<8 and h>highest then highest=h end
if h>1 then
for h1=h-1,1,-1 do
if field[h1][x]==0 then
hole=hole+1
if hole==5 then break end
end
end
end
end
local sdh=0
local h1,mh1=0,0
for x=1,9 do
local dh=abs(height[x]-height[x+1])
if dh==1 then
h1=h1+1
if h1>mh1 then mh1=h1 end
else
h1=0
end
sdh=sdh+min(dh^1.6,20)
end
discardRow(height)
score=
-#field*30
-#cb*15
+(#field>10 and
HclearScore[clear]--Clearing
-hole*70--Hole
-cy*50--Height
-sdh--Sum of DeltaH
or
LclearScore[clear]
-hole*100
-cy*40
-sdh*3
)
if #field>6 then score=score-highest*5+20 end
if mh1>3 then score=score-20-mh1*30 end
return score
for i=cy+#cb-1,cy,-1 do
for j=1,10 do
if field[i][j]==0 then goto CONTINUE_notFull end
end
discardRow(rem(field,i))
clear=clear+1
::CONTINUE_notFull::
end
if #field==0 then return 1e99 end--PC
for x=1,10 do
local h=#field
while field[h][x]==0 and h>1 do
h=h-1
end
height[x]=h
if x>3 and x<8 and h>highest then highest=h end
if h>1 then
for h1=h-1,1,-1 do
if field[h1][x]==0 then
hole=hole+1
if hole==5 then break end
end
end
end
end
local sdh=0
local h1,mh1=0,0
for x=1,9 do
local dh=abs(height[x]-height[x+1])
if dh==1 then
h1=h1+1
if h1>mh1 then mh1=h1 end
else
h1=0
end
sdh=sdh+min(dh^1.6,20)
end
discardRow(height)
score=
-#field*30
-#cb*15
+(#field>10 and
HclearScore[clear]--Clearing
-hole*70--Hole
-cy*50--Height
-sdh--Sum of DeltaH
or
LclearScore[clear]
-hole*100
-cy*40
-sdh*3
)
if #field>6 then score=score-highest*5+20 end
if mh1>3 then score=score-20-mh1*30 end
return score
end
local bot_9s={}
function bot_9s.thread(bot)
local P,data,keys=bot.P,bot.data,bot.keys
while true do
--Thinking
yield()
local Tfield={}--Test field
local best={x=1,dir=0,hold=false,score=-1e99}--Best method
local field_org=P.field
for i=1,#field_org do
Tfield[i]=getRow(0)
for j=1,10 do
Tfield[i][j]=field_org[i][j]
end
end
local P,data,keys=bot.P,bot.data,bot.keys
while true do
--Thinking
yield()
local Tfield={}--Test field
local best={x=1,dir=0,hold=false,score=-1e99}--Best method
local field_org=P.field
for i=1,#field_org do
Tfield[i]=getRow(0)
for j=1,10 do
Tfield[i][j]=field_org[i][j]
end
end
for ifhold=0,data.hold and P.gameEnv.holdCount>0 and 1 or 0 do
--Get block id
local bn
if ifhold==0 then
bn=P.cur and P.cur.id
else
bn=P.holdQueue[1]and P.holdQueue[1].id or P.nextQueue[1]and P.nextQueue[1].id
end
if bn then
for dir=0,dirCount[bn]do--Each dir
local cb=BLOCKS[bn][dir]
for cx=1,11-#cb[1]do--Each pos
local cy=#Tfield+1
for ifhold=0,data.hold and P.gameEnv.holdCount>0 and 1 or 0 do
--Get block id
local bn
if ifhold==0 then
bn=P.cur and P.cur.id
else
bn=P.holdQueue[1]and P.holdQueue[1].id or P.nextQueue[1]and P.nextQueue[1].id
end
if bn then
for dir=0,dirCount[bn]do--Each dir
local cb=BLOCKS[bn][dir]
for cx=1,11-#cb[1]do--Each pos
local cy=#Tfield+1
--Move to bottom
while cy>1 and not _ifoverlapAI(Tfield,cb,cx,cy-1)do
cy=cy-1
end
--Move to bottom
while cy>1 and not _ifoverlapAI(Tfield,cb,cx,cy-1)do
cy=cy-1
end
--Simulate lock
for i=1,#cb do
local y=cy+i-1
if not Tfield[y]then Tfield[y]=getRow(0)end
local L=Tfield[y]
for j=1,#cb[1]do
if cb[i][j]then
L[cx+j-1]=1
end
end
end
local score=_getScore(Tfield,cb,cy)
if score>best.score then
best={bn=bn,x=cx,dir=dir,hold=ifhold==1,score=score}
end
_resetField(field_org,Tfield,cy)
end
end
end
end
if not best.bn then return 1 end
--Simulate lock
for i=1,#cb do
local y=cy+i-1
if not Tfield[y]then Tfield[y]=getRow(0)end
local L=Tfield[y]
for j=1,#cb[1]do
if cb[i][j]then
L[cx+j-1]=1
end
end
end
local score=_getScore(Tfield,cb,cy)
if score>best.score then
best={bn=bn,x=cx,dir=dir,hold=ifhold==1,score=score}
end
_resetField(field_org,Tfield,cy)
end
end
end
end
if not best.bn then return 1 end
--Release cache
while #Tfield>0 do
discardRow(rem(Tfield,1))
end
if best.hold then
ins(keys,8)
end
local l=FCL[best.bn][best.dir+1][best.x]
for i=1,#l do
ins(keys,l[i])
end
ins(keys,6)
--Release cache
while #Tfield>0 do
discardRow(rem(Tfield,1))
end
if best.hold then
ins(keys,8)
end
local l=FCL[best.bn][best.dir+1][best.x]
for i=1,#l do
ins(keys,l[i])
end
ins(keys,6)
--Check if time to change target
yield()
if P.aiRND:random()<.00126 then
P:changeAtkMode(P.aiRND:random()<.85 and 1 or #P.atker>3 and 4 or P.aiRND:random()<.3 and 2 or 3)
end
end
--Check if time to change target
yield()
if P.aiRND:random()<.00126 then
P:changeAtkMode(P.aiRND:random()<.85 and 1 or #P.atker>3 and 4 or P.aiRND:random()<.3 and 2 or 3)
end
end
end
return bot_9s

View File

@@ -1,55 +1,55 @@
--[[ControlID:
1~5:mL,mR,rR,rL,rF,
6~10:hD,sD,H,A,R,
11~13:LL,RR,DD
1~5:mL,mR,rR,rL,rF,
6~10:hD,sD,H,A,R,
11~13:LL,RR,DD
]]
local ins,rem=table.insert,table.remove
local yield=coroutine.yield
local bot_cc={}
function bot_cc:pushNewNext(id)
self.bot:addNext(rem(self.nexts,1))
ins(self.nexts,id)
self.bot:addNext(rem(self.nexts,1))
ins(self.nexts,id)
end
function bot_cc:thread()
local P,keys=self.P,self.keys
local ccBot=self.ccBot
while true do
--Start thinking
yield()
ccBot:think()
local P,keys=self.P,self.keys
local ccBot=self.ccBot
while true do
--Start thinking
yield()
ccBot:think()
--Poll keys
local success,result,dest,hold,move
repeat
yield()
success,result,dest,hold,move=ccBot:getMove()
until not success or result==0 or result==2
if not success then break end
if result==2 then
break
elseif result==0 then
dest[5],dest[6]=dest[1][1],dest[1][2]
dest[7],dest[8]=dest[2][1],dest[2][2]
dest[1],dest[2]=dest[3][1],dest[3][2]
dest[3],dest[4]=dest[4][1],dest[4][2]
P.AI_dest=dest
if hold then keys[1]=8 end--Hold
while move[1]do
local m=rem(move,1)
if m<4 then
ins(keys,m+1)
elseif not P.AIdata._20G then
ins(keys,13)
end
end
ins(keys,6)
end
--Poll keys
local success,result,dest,hold,move
repeat
yield()
success,result,dest,hold,move=ccBot:getMove()
until not success or result==0 or result==2
if not success then break end
if result==2 then
break
elseif result==0 then
dest[5],dest[6]=dest[1][1],dest[1][2]
dest[7],dest[8]=dest[2][1],dest[2][2]
dest[1],dest[2]=dest[3][1],dest[3][2]
dest[3],dest[4]=dest[4][1],dest[4][2]
P.AI_dest=dest
if hold then keys[1]=8 end--Hold
while move[1]do
local m=rem(move,1)
if m<4 then
ins(keys,m+1)
elseif not P.AIdata._20G then
ins(keys,13)
end
end
ins(keys,6)
end
--Check if time to change target
yield()
if P.aiRND:random()<.00126 then
P:changeAtkMode(P.aiRND:random()<.85 and 1 or #P.atker>3 and 4 or P.aiRND:random()<.3 and 2 or 3)
end
end
--Check if time to change target
yield()
if P.aiRND:random()<.00126 then
P:changeAtkMode(P.aiRND:random()<.85 and 1 or #P.atker>3 and 4 or P.aiRND:random()<.3 and 2 or 3)
end
end
end
return bot_cc

View File

@@ -1,35 +1,35 @@
local ins,rem=table.insert,table.remove
local baseBot={
pushNewNext=NULL,
updateField=NULL,
lockWrongPlace=NULL,
switch20G=NULL,
revive=NULL,
pushNewNext=NULL,
updateField=NULL,
lockWrongPlace=NULL,
switch20G=NULL,
revive=NULL,
}
function baseBot.update(bot)
local P=bot.P
local keys=bot.keys
if P.control and P.waiting==-1 then
bot.delay=bot.delay-1
if not keys[1]then
if bot.runningThread then
pcall(bot.runningThread)
else
P:act_hardDrop()
end
elseif bot.delay<=0 then
bot.delay=bot.delay0*.5
P:pressKey(keys[1])P:releaseKey(keys[1])
rem(keys,1)
end
end
local P=bot.P
local keys=bot.keys
if P.control and P.waiting==-1 then
bot.delay=bot.delay-1
if not keys[1]then
if bot.runningThread then
pcall(bot.runningThread)
else
P:act_hardDrop()
end
elseif bot.delay<=0 then
bot.delay=bot.delay0*.5
P:pressKey(keys[1])P:releaseKey(keys[1])
rem(keys,1)
end
end
end
local function _undefMethod(self,k)
print("Undefined method: "..k)
self[k]=NULL
return NULL
print("Undefined method: "..k)
self[k]=NULL
return NULL
end
local botMeta={__index=_undefMethod}
@@ -37,75 +37,75 @@ local BOT={}
local AISpeed={60,50,40,30,20,14,10,6,4,3}
function BOT.template(arg)
if arg.type=='CC'then
if not arg.hold then arg.hold=false else arg.hold=true end
return{
type='CC',
next=arg.next,
hold=arg.hold,
delay=AISpeed[arg.speedLV],
["args.node"]=arg.node,
}
elseif arg.type=='9S'then
return{
type='9S',
delay=math.floor(AISpeed[arg.speedLV]),
hold=arg.hold,
}
end
if arg.type=='CC'then
if not arg.hold then arg.hold=false else arg.hold=true end
return{
type='CC',
next=arg.next,
hold=arg.hold,
delay=AISpeed[arg.speedLV],
["args.node"]=arg.node,
}
elseif arg.type=='9S'then
return{
type='9S',
delay=math.floor(AISpeed[arg.speedLV]),
hold=arg.hold,
}
end
end
function BOT.new(P,data)
local bot={P=P,data=data}
if data.type=="CC"then
-- P:setRS('SRS')
-- bot.keys={}
-- bot.nexts={}
-- bot.delay=data.delay
-- bot.delay0=data.delay
-- if P.gameEnv.holdCount and P.gameEnv.holdCount>1 then P:setHold(1)end
local bot={P=P,data=data}
if data.type=="CC"then
-- P:setRS('SRS')
-- bot.keys={}
-- bot.nexts={}
-- bot.delay=data.delay
-- bot.delay0=data.delay
-- if P.gameEnv.holdCount and P.gameEnv.holdCount>1 then P:setHold(1)end
-- local cc=require"parts.bot.cc_wrapper"
-- local opt,wei=cc.getConf()
-- wei:fastWeights()
-- opt:setHold(P.AIdata.hold)
-- opt:set20G(P.AIdata._20G)
-- opt:setBag(P.AIdata.bag=='bag')
-- opt:setNode(P.AIdata.node)
-- bot.ccBot=cc.new(opt,wei)
-- local cc_lua=require"parts.bot.bot_cc"
-- setmetatable(bot,{__index=function(self,k)
-- if self.ccBot[k]then
-- self.ccBot[k](self.ccBot)
-- elseif cc_lua[k]then
-- cc_lua[k](self)
-- elseif baseBot[k]then
-- baseBot[k](self)
-- end
-- end})
-- local cc=require"parts.bot.cc_wrapper"
-- local opt,wei=cc.getConf()
-- wei:fastWeights()
-- opt:setHold(P.AIdata.hold)
-- opt:set20G(P.AIdata._20G)
-- opt:setBag(P.AIdata.bag=='bag')
-- opt:setNode(P.AIdata.node)
-- bot.ccBot=cc.new(opt,wei)
-- local cc_lua=require"parts.bot.bot_cc"
-- setmetatable(bot,{__index=function(self,k)
-- if self.ccBot[k]then
-- self.ccBot[k](self.ccBot)
-- elseif cc_lua[k]then
-- cc_lua[k](self)
-- elseif baseBot[k]then
-- baseBot[k](self)
-- end
-- end})
-- for i,B in next,P.gameEnv.nextQueue do
-- if i<=data.next then
-- bot:addNext(B.id)
-- else
-- ins(bot.nexts,B.id)
-- end
-- end
-- bot.runningThread=coroutine.wrap(cc_lua.thread)
-- bot.runningThread(bot)
setmetatable(bot,botMeta)
elseif data.type=="9S"or true then--9s or else
TABLE.cover(baseBot,bot)
TABLE.cover(require"parts.bot.bot_9s",bot)
P:setRS('TRS')
bot.keys={}
bot.delay=data.delay
bot.delay0=data.delay
bot.runningThread=coroutine.wrap(bot.thread)
bot.runningThread(bot)
setmetatable(bot,botMeta)
end
return bot
-- for i,B in next,P.gameEnv.nextQueue do
-- if i<=data.next then
-- bot:addNext(B.id)
-- else
-- ins(bot.nexts,B.id)
-- end
-- end
-- bot.runningThread=coroutine.wrap(cc_lua.thread)
-- bot.runningThread(bot)
setmetatable(bot,botMeta)
elseif data.type=="9S"or true then--9s or else
TABLE.cover(baseBot,bot)
TABLE.cover(require"parts.bot.bot_9s",bot)
P:setRS('TRS')
bot.keys={}
bot.delay=data.delay
bot.delay0=data.delay
bot.runningThread=coroutine.wrap(bot.thread)
bot.runningThread(bot)
setmetatable(bot,botMeta)
end
return bot
end
return BOT

View File

@@ -1,43 +1,43 @@
return{
version=VERSION.code,
version=VERSION.code,
--Basic
drop=1e99,
lock=1e99,
wait=0,
fall=0,
--Basic
drop=1e99,
lock=1e99,
wait=0,
fall=0,
--Control
nextCount=6,
holdCount=1,
infHold=true,
phyHold=false,
--Control
nextCount=6,
holdCount=1,
infHold=true,
phyHold=false,
--Visual
bone=false,
--Visual
bone=false,
--Rule
sequence='bag',
fieldH=20,
heightLimit=1e99,
bufferLimit=1e99,
--Rule
sequence='bag',
fieldH=20,
heightLimit=1e99,
bufferLimit=1e99,
ospin=true,
fineKill=false,
b2bKill=false,
easyFresh=true,
deepDrop=false,
visible='show',
freshLimit=1e99,
ospin=true,
fineKill=false,
b2bKill=false,
easyFresh=true,
deepDrop=false,
visible='show',
freshLimit=1e99,
opponent="X",
life=0,
pushSpeed=3,
garbageSpeed=1,
missionKill=false,
opponent="X",
life=0,
pushSpeed=3,
garbageSpeed=1,
missionKill=false,
--Else
bg='blockrain',
bgm='hang out',
--Else
bg='blockrain',
bgm='hang out',
}

View File

@@ -8,423 +8,423 @@ local DATA={}
--Sep symbol: 33 (!)
--Safe char: 34~126
--[[
Count: 34~96
Block: 97~125
Encode: A[B] sequence, A = block ID, B = repeat times, no B means do not repeat.
Example: "abcdefg" is [SZJLTOI], "a^aDb)" is [Z*63,Z*37,S*10]
Count: 34~96
Block: 97~125
Encode: A[B] sequence, A = block ID, B = repeat times, no B means do not repeat.
Example: "abcdefg" is [SZJLTOI], "a^aDb)" is [Z*63,Z*37,S*10]
]]
function DATA.copySequence()
local str=""
local str=""
local count=1
for i=1,#BAG+1 do
if BAG[i+1]~=BAG[i]or count==64 then
str=str..char(96+BAG[i])
if count>1 then
str=str..char(32+count)
count=1
end
else
count=count+1
end
end
local count=1
for i=1,#BAG+1 do
if BAG[i+1]~=BAG[i]or count==64 then
str=str..char(96+BAG[i])
if count>1 then
str=str..char(32+count)
count=1
end
else
count=count+1
end
end
return str
return str
end
function DATA.pasteSequence(str)
TABLE.cut(BAG)
local b,reg
for i=1,#str do
b=byte(str,i)
if not reg then
if b>=97 and b<=125 then
reg=b-96
else
return
end
else
if b>=97 and b<=125 then
ins(BAG,reg)
reg=b-96
elseif b>=34 and b<=96 then
for _=1,b-32 do
ins(BAG,reg)
end
reg=false
end
end
end
if reg then ins(BAG,reg)end
return true
TABLE.cut(BAG)
local b,reg
for i=1,#str do
b=byte(str,i)
if not reg then
if b>=97 and b<=125 then
reg=b-96
else
return
end
else
if b>=97 and b<=125 then
ins(BAG,reg)
reg=b-96
elseif b>=34 and b<=96 then
for _=1,b-32 do
ins(BAG,reg)
end
reg=false
end
end
end
if reg then ins(BAG,reg)end
return true
end
function DATA.newBoard(f)--Generate a new board
if f then
return TABLE.shift(f)
else
local F={}
for i=1,20 do F[i]={0,0,0,0,0,0,0,0,0,0}end
return F
end
if f then
return TABLE.shift(f)
else
local F={}
for i=1,20 do F[i]={0,0,0,0,0,0,0,0,0,0}end
return F
end
end
function DATA.copyBoard(page)--Copy the [page] board
local F=FIELD[page or 1]
local str=""
local H=0
local F=FIELD[page or 1]
local str=""
local H=0
for y=20,1,-1 do
for x=1,10 do
if F[y][x]~=0 then
H=y
goto BREAK_topFound
end
end
end
::BREAK_topFound::
for y=20,1,-1 do
for x=1,10 do
if F[y][x]~=0 then
H=y
goto BREAK_topFound
end
end
end
::BREAK_topFound::
--Encode field
for y=1,H do
local S=""
local L=F[y]
for x=1,10 do
S=S..char(L[x]+1)
end
str=str..S
end
return STRING.packBin(str)
--Encode field
for y=1,H do
local S=""
local L=F[y]
for x=1,10 do
S=S..char(L[x]+1)
end
str=str..S
end
return STRING.packBin(str)
end
function DATA.copyBoards()
local out={}
for i=1,#FIELD do
out[i]=DATA.copyBoard(i)
end
return table.concat(out,"!")
local out={}
for i=1,#FIELD do
out[i]=DATA.copyBoard(i)
end
return table.concat(out,"!")
end
function DATA.pasteBoard(str,page)--Paste [str] data to [page] board
if not page then page=1 end
if not FIELD[page]then FIELD[page]=DATA.newBoard()end
local F=FIELD[page]
if not page then page=1 end
if not FIELD[page]then FIELD[page]=DATA.newBoard()end
local F=FIELD[page]
--Decode
str=STRING.unpackBin(str)
if not str then return end
--Decode
str=STRING.unpackBin(str)
if not str then return end
local fX,fY=1,1--*ptr for Field(r*10+(c-1))
local p=1
while true do
local b=byte(str,p)--1byte
local fX,fY=1,1--*ptr for Field(r*10+(c-1))
local p=1
while true do
local b=byte(str,p)--1byte
--Str end
if not b then
if fX~=1 then
return
else
break
end
end
--Str end
if not b then
if fX~=1 then
return
else
break
end
end
local id=b%32-1--Block id
if id>26 then return end--Illegal blockid
b=int(b/32)--Mode id
local id=b%32-1--Block id
if id>26 then return end--Illegal blockid
b=int(b/32)--Mode id
F[fY][fX]=id
if fX<10 then
fX=fX+1
else
fY=fY+1
if fY>20 then break end
fX=1
end
p=p+1
end
F[fY][fX]=id
if fX<10 then
fX=fX+1
else
fY=fY+1
if fY>20 then break end
fX=1
end
p=p+1
end
for y=fY,20 do
for x=1,10 do
F[y][x]=0
end
end
for y=fY,20 do
for x=1,10 do
F[y][x]=0
end
end
return true
return true
end
--[[
Mission: 34~114
Count: 115~126
Encode: [A] or [AB] sequence, A = mission ID, B = repeat times, no B means do not repeat.
Mission: 34~114
Count: 115~126
Encode: [A] or [AB] sequence, A = mission ID, B = repeat times, no B means do not repeat.
_1=01,_2=02,_3=03,_4=04,
A1=05,A2=06,A3=07,A4=08,
PC=09,
Z1=11,Z2=12,Z3=13,
S1=21,S2=22,S3=23,
J1=31,J2=32,J3=33,
L1=41,L2=42,L3=43,
T1=51,T2=52,T3=53,
O1=61,O2=62,O3=63,O4=64,
I1=71,I2=72,I3=73,I4=74,
_1=01,_2=02,_3=03,_4=04,
A1=05,A2=06,A3=07,A4=08,
PC=09,
Z1=11,Z2=12,Z3=13,
S1=21,S2=22,S3=23,
J1=31,J2=32,J3=33,
L1=41,L2=42,L3=43,
T1=51,T2=52,T3=53,
O1=61,O2=62,O3=63,O4=64,
I1=71,I2=72,I3=73,I4=74,
]]
function DATA.copyMission()
local _
local str=""
local _
local str=""
local count=1
for i=1,#MISSION+1 do
if MISSION[i+1]~=MISSION[i]or count==13 then
_=33+MISSION[i]
str=str..char(_)
if count>1 then
str=str..char(113+count)
count=1
end
else
count=count+1
end
end
local count=1
for i=1,#MISSION+1 do
if MISSION[i+1]~=MISSION[i]or count==13 then
_=33+MISSION[i]
str=str..char(_)
if count>1 then
str=str..char(113+count)
count=1
end
else
count=count+1
end
end
return str
return str
end
function DATA.pasteMission(str)
local b
TABLE.cut(MISSION)
local reg
for i=1,#str do
b=byte(str,i)
if not reg then
if b>=34 and b<=114 then
reg=b-33
else
return
end
else
if b>=34 and b<=114 then
if missionEnum[reg]then
ins(MISSION,reg)
reg=b-33
else
TABLE.cut(MISSION)
return
end
elseif b>=115 and b<=126 then
for _=1,b-113 do
ins(MISSION,reg)
end
reg=false
end
end
end
if reg then ins(MISSION,reg)end
return true
local b
TABLE.cut(MISSION)
local reg
for i=1,#str do
b=byte(str,i)
if not reg then
if b>=34 and b<=114 then
reg=b-33
else
return
end
else
if b>=34 and b<=114 then
if missionEnum[reg]then
ins(MISSION,reg)
reg=b-33
else
TABLE.cut(MISSION)
return
end
elseif b>=115 and b<=126 then
for _=1,b-113 do
ins(MISSION,reg)
end
reg=false
end
end
end
if reg then ins(MISSION,reg)end
return true
end
function DATA.copyQuestArgs()
local ENV=CUSTOMENV
local str=""..
ENV.holdCount..
(ENV.ospin and"O"or"Z")..
(ENV.missionKill and"M"or"Z")..
ENV.sequence
return str
local ENV=CUSTOMENV
local str=""..
ENV.holdCount..
(ENV.ospin and"O"or"Z")..
(ENV.missionKill and"M"or"Z")..
ENV.sequence
return str
end
function DATA.pasteQuestArgs(str)
if #str<4 then return end
local ENV=CUSTOMENV
ENV.holdCount= str:byte(1)-48
ENV.ospin= str:byte(2)~=90
ENV.missionKill= str:byte(3)~=90
ENV.sequence= str:sub(4)
return true
if #str<4 then return end
local ENV=CUSTOMENV
ENV.holdCount= str:byte(1)-48
ENV.ospin= str:byte(2)~=90
ENV.missionKill=str:byte(3)~=90
ENV.sequence= str:sub(4)
return true
end
--[[
Replay file:
a zlib-compressed json table
Replay file:
a zlib-compressed json table
Replay data format (table):
{frame,event, frame,event, ...}
Replay data format (table):
{frame,event, frame,event, ...}
Replay data format (byte): (1 byte each period)
dt, event, dt, event, ...
all data range from 0 to 127
large value will be encoded as 1xxxxxxx(high)-1xxxxxxx-...-0xxxxxxx(low)
Replay data format (byte): (1 byte each period)
dt, event, dt, event, ...
all data range from 0 to 127
large value will be encoded as 1xxxxxxx(high)-1xxxxxxx-...-0xxxxxxx(low)
Example (decoded):
6,1, 20,-1, 0,2, 26,-2, 872,4, ...
This means:
Press key1 at 6f
Release key1 at 26f (6+20)
Press key2 at the same time (26+0)
Release key 2 after 26 frame (26+26)
Press key 4 after 872 frame (52+872)
...
Example (decoded):
6,1, 20,-1, 0,2, 26,-2, 872,4, ...
This means:
Press key1 at 6f
Release key1 at 26f (6+20)
Press key2 at the same time (26+0)
Release key 2 after 26 frame (26+26)
Press key 4 after 872 frame (52+872)
...
]]
function DATA.dumpRecording(list,ptr)
local out=""
local buffer,buffer2=""
if not ptr then ptr=1 end
local prevFrm=list[ptr-2]or 0
while list[ptr]do
--Flush buffer
if #buffer>10 then
out=out..buffer
buffer=""
end
local out=""
local buffer,buffer2=""
if not ptr then ptr=1 end
local prevFrm=list[ptr-2]or 0
while list[ptr]do
--Flush buffer
if #buffer>10 then
out=out..buffer
buffer=""
end
--Encode time
local t=list[ptr]-prevFrm
prevFrm=list[ptr]
if t>=128 then
buffer2=char(t%128)
t=int(t/128)
while t>=128 do
buffer2=char(128+t%128)..buffer2
t=int(t/128)
end
buffer=buffer..char(128+t)..buffer2
else
buffer=buffer..char(t)
end
--Encode time
local t=list[ptr]-prevFrm
prevFrm=list[ptr]
if t>=128 then
buffer2=char(t%128)
t=int(t/128)
while t>=128 do
buffer2=char(128+t%128)..buffer2
t=int(t/128)
end
buffer=buffer..char(128+t)..buffer2
else
buffer=buffer..char(t)
end
--Encode event
t=list[ptr+1]
if t>=128 then
buffer2=char(t%128)
t=int(t/128)
while t>=128 do
buffer2=char(128+t%128)..buffer2
t=int(t/128)
end
buffer=buffer..char(128+t)..buffer2
else
buffer=buffer..char(t)
end
--Encode event
t=list[ptr+1]
if t>=128 then
buffer2=char(t%128)
t=int(t/128)
while t>=128 do
buffer2=char(128+t%128)..buffer2
t=int(t/128)
end
buffer=buffer..char(128+t)..buffer2
else
buffer=buffer..char(t)
end
--Step
ptr=ptr+2
end
return out..buffer,ptr
--Step
ptr=ptr+2
end
return out..buffer,ptr
end
function DATA.pumpRecording(str,L)
local len=#str
local p=1
local len=#str
local p=1
local curFrm=L[#L-1]or 0
local code
while p<=len do
--Read delta time
code=0
local b=byte(str,p)
while b>=128 do
code=code*128+b-128
p=p+1
b=byte(str,p)
end
curFrm=curFrm+code*128+b
L[#L+1]=curFrm
p=p+1
local curFrm=L[#L-1]or 0
local code
while p<=len do
--Read delta time
code=0
local b=byte(str,p)
while b>=128 do
code=code*128+b-128
p=p+1
b=byte(str,p)
end
curFrm=curFrm+code*128+b
L[#L+1]=curFrm
p=p+1
local event=0
b=byte(str,p)
while b>=128 do
event=event*128+b-128
p=p+1
b=byte(str,p)
end
L[#L+1]=event*128+b
p=p+1
end
local event=0
b=byte(str,p)
while b>=128 do
event=event*128+b-128
p=p+1
b=byte(str,p)
end
L[#L+1]=event*128+b
p=p+1
end
end
do--function DATA.saveReplay()
local noRecList={"custom","solo","round","techmino"}
local function _getModList()
local res={}
for _,v in next,GAME.mod do
if v.sel>0 then
ins(res,{v.no,v.sel})
end
end
return res
end
function DATA.saveReplay()
--Filtering modes that cannot be saved
for _,v in next,noRecList do
if GAME.curModeName:find(v)then
MES.new('error',"Cannot save recording of this mode now!")
return
end
end
local noRecList={"custom","solo","round","techmino"}
local function _getModList()
local res={}
for _,v in next,GAME.mod do
if v.sel>0 then
ins(res,{v.no,v.sel})
end
end
return res
end
function DATA.saveReplay()
--Filtering modes that cannot be saved
for _,v in next,noRecList do
if GAME.curModeName:find(v)then
MES.new('error',"Cannot save recording of this mode now!")
return
end
end
--Write file
local fileName=os.date("replay/%Y_%m_%d_%H%M%S.rep")
if not love.filesystem.getInfo(fileName)then
love.filesystem.write(fileName,
love.data.compress('string','zlib',
JSON.encode{
date=os.date("%Y/%m/%d %H:%M:%S"),
mode=GAME.curModeName,
version=VERSION.string,
player=USERS.getUsername(USER.uid),
seed=GAME.seed,
setting=GAME.setting,
mod=_getModList(),
tasUsed=GAME.tasUsed,
}.."\n"..
DATA.dumpRecording(GAME.rep)
)
)
ins(REPLAY,1,DATA.parseReplay(fileName))
return true
else
MES.new('error',"Save failed: File already exists")
end
end
--Write file
local fileName=os.date("replay/%Y_%m_%d_%H%M%S.rep")
if not love.filesystem.getInfo(fileName)then
love.filesystem.write(fileName,
love.data.compress('string','zlib',
JSON.encode{
date=os.date("%Y/%m/%d %H:%M:%S"),
mode=GAME.curModeName,
version=VERSION.string,
player=USERS.getUsername(USER.uid),
seed=GAME.seed,
setting=GAME.setting,
mod=_getModList(),
tasUsed=GAME.tasUsed,
}.."\n"..
DATA.dumpRecording(GAME.rep)
)
)
ins(REPLAY,1,DATA.parseReplay(fileName))
return true
else
MES.new('error',"Save failed: File already exists")
end
end
end
function DATA.parseReplay(fileName,ifFull)
local fileData
--Read file
fileData=love.filesystem.read(fileName)
return DATA.parseReplayData(fileName,fileData,ifFull)
local fileData
--Read file
fileData=love.filesystem.read(fileName)
return DATA.parseReplayData(fileName,fileData,ifFull)
end
function DATA.parseReplayData(fileName,fileData,ifFull)
local success,metaData,rep
local success,metaData,rep
if not(fileData and #fileData>0)then goto BREAK_cannotParse end
if not(fileData and #fileData>0)then goto BREAK_cannotParse end
--Decompress file
success,fileData=pcall(love.data.decompress,'string','zlib',fileData)
if not success then goto BREAK_cannotParse end
--Decompress file
success,fileData=pcall(love.data.decompress,'string','zlib',fileData)
if not success then goto BREAK_cannotParse end
--Load metadata
metaData,fileData=STRING.readLine(fileData)
metaData=JSON.decode(metaData)
if not metaData then goto BREAK_cannotParse end
--Load metadata
metaData,fileData=STRING.readLine(fileData)
metaData=JSON.decode(metaData)
if not metaData then goto BREAK_cannotParse end
--Convert ancient replays
metaData.mode=oldModeNameTable[metaData.mode]or metaData.mode
if not MODES[metaData.mode]then goto BREAK_cannotParse end
--Convert ancient replays
metaData.mode=oldModeNameTable[metaData.mode]or metaData.mode
if not MODES[metaData.mode]then goto BREAK_cannotParse end
--Create replay object
rep={
fileName=fileName,
available=true,
--Create replay object
rep={
fileName=fileName,
available=true,
date=metaData.date,
mode=metaData.mode,
version=metaData.version,
player=metaData.player,
date=metaData.date,
mode=metaData.mode,
version=metaData.version,
player=metaData.player,
seed=metaData.seed,
setting=metaData.setting,
mod=metaData.mod,
tasUsed=metaData.tasUsed,
}
if ifFull then rep.data=fileData end
do return rep end
seed=metaData.seed,
setting=metaData.setting,
mod=metaData.mod,
tasUsed=metaData.tasUsed,
}
if ifFull then rep.data=fileData end
do return rep end
--Create unavailable replay object
::BREAK_cannotParse::
return{
fileName=fileName,
available=false,
}
--Create unavailable replay object
::BREAK_cannotParse::
return{
fileName=fileName,
available=false,
}
end
return DATA

View File

@@ -2,36 +2,36 @@ local FREEROW={}
local L={}--Storage
local len=0--Length
function FREEROW.reset(num)
if num<len then
for i=len,num+1,-1 do
L[i]=nil
end
elseif num>len then
for i=len+1,num do
L[i]={0,0,0,0,0,0,0,0,0,0,garbage=false}
end
end
len=num
if num<len then
for i=len,num+1,-1 do
L[i]=nil
end
elseif num>len then
for i=len+1,num do
L[i]={0,0,0,0,0,0,0,0,0,0,garbage=false}
end
end
len=num
end
function FREEROW.get(val,ifGarbage)
if len==0 then
for i=1,10 do
L[i]={0,0,0,0,0,0,0,0,0,0,garbage=false}
end
len=len+10
end
local t=L[len]
for i=1,10 do t[i]=val end
t.garbage=ifGarbage==true
L[len]=nil
len=len-1
return t
if len==0 then
for i=1,10 do
L[i]={0,0,0,0,0,0,0,0,0,0,garbage=false}
end
len=len+10
end
local t=L[len]
for i=1,10 do t[i]=val end
t.garbage=ifGarbage==true
L[len]=nil
len=len-1
return t
end
function FREEROW.discard(t)
len=len+1
L[len]=t
len=len+1
L[len]=t
end
function FREEROW.getCount()
return len
return len
end
return FREEROW

File diff suppressed because it is too large Load Diff

View File

@@ -1,151 +1,151 @@
--Complex tables
local function _disableKey(P,key)
table.insert(P.gameEnv.keyCancel,key)
table.insert(P.gameEnv.keyCancel,key)
end
MODOPT={--Mod options
{no=0,id="NX",name="next",
key="q",x=80,y=230,color='lO',
list={0,1,2,3,4,5,6},
func=function(P,O)P.gameEnv.nextCount=O end,
unranked=true,
},
{no=1,id="HL",name="hold",
key="w",x=200,y=230,color='lO',
list={0,1,2,3,4,5,6},
func=function(P,O)P.gameEnv.holdCount=O end,
unranked=true,
},
{no=2,id="FL",name="hideNext",
key="e",x=320,y=230,color='lA',
list={1,2,3,4,5},
func=function(P,O)P.gameEnv.nextStartPos=O+1 end,
unranked=true,
},
{no=3,id="IH",name="infHold",
key="r",x=440,y=230,color='lA',
func=function(P)P.gameEnv.infHold=true end,
unranked=true,
},
{no=4,id="HB",name="hideBlock",
key="y",x=680,y=230,color='lV',
func=function(P)P.gameEnv.block=false end,
unranked=true,
},
{no=5,id="HG",name="hideGhost",
key="u",x=800,y=230,color='lV',
func=function(P)P.gameEnv.ghost=false end,
unranked=true,
},
{no=6,id="HD",name="hidden",
key="i",x=920,y=230,color='lP',
list={'easy','slow','medium','fast','none'},
func=function(P,O)P.gameEnv.visible=O end,
unranked=true,
},
{no=7,id="HB",name="hideBoard",
key="o",x=1040,y=230,color='lP',
list={'down','up','all'},
func=function(P,O)P.gameEnv.hideBoard=O end,
unranked=true,
},
{no=8,id="FB",name="flipBoard",
key="p",x=1160,y=230,color='lJ',
list={'U-D','L-R','180'},
func=function(P,O)P.gameEnv.flipBoard=O end,
unranked=true,
},
{no=0,id="NX",name="next",
key="q",x=80,y=230,color='lO',
list={0,1,2,3,4,5,6},
func=function(P,O)P.gameEnv.nextCount=O end,
unranked=true,
},
{no=1,id="HL",name="hold",
key="w",x=200,y=230,color='lO',
list={0,1,2,3,4,5,6},
func=function(P,O)P.gameEnv.holdCount=O end,
unranked=true,
},
{no=2,id="FL",name="hideNext",
key="e",x=320,y=230,color='lA',
list={1,2,3,4,5},
func=function(P,O)P.gameEnv.nextStartPos=O+1 end,
unranked=true,
},
{no=3,id="IH",name="infHold",
key="r",x=440,y=230,color='lA',
func=function(P)P.gameEnv.infHold=true end,
unranked=true,
},
{no=4,id="HB",name="hideBlock",
key="y",x=680,y=230,color='lV',
func=function(P)P.gameEnv.block=false end,
unranked=true,
},
{no=5,id="HG",name="hideGhost",
key="u",x=800,y=230,color='lV',
func=function(P)P.gameEnv.ghost=false end,
unranked=true,
},
{no=6,id="HD",name="hidden",
key="i",x=920,y=230,color='lP',
list={'easy','slow','medium','fast','none'},
func=function(P,O)P.gameEnv.visible=O end,
unranked=true,
},
{no=7,id="HB",name="hideBoard",
key="o",x=1040,y=230,color='lP',
list={'down','up','all'},
func=function(P,O)P.gameEnv.hideBoard=O end,
unranked=true,
},
{no=8,id="FB",name="flipBoard",
key="p",x=1160,y=230,color='lJ',
list={'U-D','L-R','180'},
func=function(P,O)P.gameEnv.flipBoard=O end,
unranked=true,
},
{no=9,id="DT",name="dropDelay",
key="a",x=140,y=350,color='lR',
list={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
func=function(P,O)P.gameEnv.drop=O end,
unranked=true,
},
{no=10,id="LT",name="lockDelay",
key="s",x=260,y=350,color='lR',
list={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
func=function(P,O)P.gameEnv.lock=O end,
unranked=true,
},
{no=11,id="ST",name="waitDelay",
key="d",x=380,y=350,color='lR',
list={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
func=function(P,O)P.gameEnv.wait=O end,
unranked=true,
},
{no=12,id="CT",name="fallDelay",
key="f",x=500,y=350,color='lR',
list={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
func=function(P,O)P.gameEnv.fall=O end,
unranked=true,
},
{no=13,id="LF",name="life",
key="j",x=860,y=350,color='lY',
list={0,1,2,3,5,10,15,26,42,87,500},
func=function(P,O)P.gameEnv.life=O end,
unranked=true,
},
{no=14,id="FB",name="forceB2B",
key="k",x=980,y=350,color='lY',
func=function(P)P.gameEnv.b2bKill=true end,
unranked=true,
},
{no=15,id="PF",name="forceFinesse",
key="l",x=1100,y=350,color='lY',
func=function(P)P.gameEnv.fineKill=true end,
unranked=true,
},
{no=9,id="DT",name="dropDelay",
key="a",x=140,y=350,color='lR',
list={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
func=function(P,O)P.gameEnv.drop=O end,
unranked=true,
},
{no=10,id="LT",name="lockDelay",
key="s",x=260,y=350,color='lR',
list={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
func=function(P,O)P.gameEnv.lock=O end,
unranked=true,
},
{no=11,id="ST",name="waitDelay",
key="d",x=380,y=350,color='lR',
list={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
func=function(P,O)P.gameEnv.wait=O end,
unranked=true,
},
{no=12,id="CT",name="fallDelay",
key="f",x=500,y=350,color='lR',
list={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
func=function(P,O)P.gameEnv.fall=O end,
unranked=true,
},
{no=13,id="LF",name="life",
key="j",x=860,y=350,color='lY',
list={0,1,2,3,5,10,15,26,42,87,500},
func=function(P,O)P.gameEnv.life=O end,
unranked=true,
},
{no=14,id="FB",name="forceB2B",
key="k",x=980,y=350,color='lY',
func=function(P)P.gameEnv.b2bKill=true end,
unranked=true,
},
{no=15,id="PF",name="forceFinesse",
key="l",x=1100,y=350,color='lY',
func=function(P)P.gameEnv.fineKill=true end,
unranked=true,
},
{no=16,id="TL",name="tele",
key="z",x=200,y=470,color='lH',
func=function(P)
P.gameEnv.das,P.gameEnv.arr=0,0
P.gameEnv.sddas,P.gameEnv.sdarr=0,0
end,
unranked=true,
},
{no=17,id="FX",name="noRotation",
key="x",x=320,y=470,color='lH',
func=function(P)
_disableKey(P,3)
_disableKey(P,4)
_disableKey(P,5)
end,
unranked=true,
},
{no=18,id="GL",name="noMove",
key="c",x=440,y=470,color='lH',
func=function(P)
_disableKey(P,1)_disableKey(P,2)
_disableKey(P,11)_disableKey(P,12)
_disableKey(P,17)_disableKey(P,18)
_disableKey(P,19)_disableKey(P,20)
end,
unranked=true,
},
{no=19,id="CS",name="customSeq",
key="b",x=680,y=470,color='lB',
list={'bag','his','hisPool','c2','rnd','mess','reverb'},
func=function(P,O)P.gameEnv.sequence=O end,
unranked=true,
},
{no=20,id="PS",name="pushSpeed",
key="n",x=800,y=470,color='lB',
list={.5,1,2,3,5,15,1e99},
func=function(P,O)P.gameEnv.pushSpeed=O end,
unranked=true,
},
{no=21,id="BN",name="boneBlock",
key="m",x=920,y=470,color='lB',
list={'on','off'},
func=function(P,O)P.gameEnv.bone=O=='on'end,
unranked=true,
},
{no=16,id="TL",name="tele",
key="z",x=200,y=470,color='lH',
func=function(P)
P.gameEnv.das,P.gameEnv.arr=0,0
P.gameEnv.sddas,P.gameEnv.sdarr=0,0
end,
unranked=true,
},
{no=17,id="FX",name="noRotation",
key="x",x=320,y=470,color='lH',
func=function(P)
_disableKey(P,3)
_disableKey(P,4)
_disableKey(P,5)
end,
unranked=true,
},
{no=18,id="GL",name="noMove",
key="c",x=440,y=470,color='lH',
func=function(P)
_disableKey(P,1)_disableKey(P,2)
_disableKey(P,11)_disableKey(P,12)
_disableKey(P,17)_disableKey(P,18)
_disableKey(P,19)_disableKey(P,20)
end,
unranked=true,
},
{no=19,id="CS",name="customSeq",
key="b",x=680,y=470,color='lB',
list={'bag','his','hisPool','c2','rnd','mess','reverb'},
func=function(P,O)P.gameEnv.sequence=O end,
unranked=true,
},
{no=20,id="PS",name="pushSpeed",
key="n",x=800,y=470,color='lB',
list={.5,1,2,3,5,15,1e99},
func=function(P,O)P.gameEnv.pushSpeed=O end,
unranked=true,
},
{no=21,id="BN",name="boneBlock",
key="m",x=920,y=470,color='lB',
list={'on','off'},
func=function(P,O)P.gameEnv.bone=O=='on'end,
unranked=true,
},
}
for i=1,#MODOPT do
local M=MODOPT[i]
M.sel,M.time=0,0
M.color=COLOR[M.color]
local M=MODOPT[i]
M.sel,M.time=0,0
M.color=COLOR[M.color]
end
--Game tables
@@ -155,216 +155,216 @@ FIELD={}--Field(s) for custom game
BAG={}--Sequence for custom game
MISSION={}--Clearing mission for custom game
GAME={--Global game data
playing=false, --If in-game
init=false, --If need initializing game when enter scene-play
net=false, --If play net game
playing=false, --If in-game
init=false, --If need initializing game when enter scene-play
net=false, --If play net game
result=false, --Game result (string)
rank=0, --Rank reached
pauseTime=0, --Time paused
pauseCount=0, --Pausing count
warnLVL0=0, --Warning level
warnLVL=0, --Warning level (show)
result=false, --Game result (string)
rank=0, --Rank reached
pauseTime=0, --Time paused
pauseCount=0, --Pausing count
warnLVL0=0, --Warning level
warnLVL=0, --Warning level (show)
seed=1046101471, --Game seed
curMode=false, --Current gamemode object
mod={}, --List of loaded mods
modeEnv=false, --Current gamemode environment
setting={}, --Game settings
rep={}, --Recording list, key,time,key,time...
statSaved=true, --If recording saved
recording=false, --If recording
replaying=false, --If replaying
saved=false, --If recording saved
tasUsed=false, --If tasMode used
seed=1046101471, --Game seed
curMode=false, --Current gamemode object
mod={}, --List of loaded mods
modeEnv=false, --Current gamemode environment
setting={}, --Game settings
rep={}, --Recording list, key,time,key,time...
statSaved=true, --If recording saved
recording=false, --If recording
replaying=false, --If replaying
saved=false, --If recording saved
tasUsed=false, --If tasMode used
prevBG=false, --Previous background, for restore BG when quit setting page
prevBG=false, --Previous background, for restore BG when quit setting page
--Data for royale mode
stage=false, --Game stage
mostBadge=false, --Most badge owner
secBadge=false, --Second badge owner
mostDangerous=false,--Most dangerous player
secDangerous=false, --Second dangerous player
--Data for royale mode
stage=false, --Game stage
mostBadge=false, --Most badge owner
secBadge=false, --Second badge owner
mostDangerous=false,--Most dangerous player
secDangerous=false, --Second dangerous player
}
ROYALEDATA={
powerUp=false,
stage=false,
powerUp=false,
stage=false,
}
CUSTOMENV={}
ROOMENV={
--Room config
capacity=10,
--Room config
capacity=10,
--Basic
drop=30,
lock=60,
wait=0,
fall=0,
--Basic
drop=30,
lock=60,
wait=0,
fall=0,
--Control
nextCount=6,
holdCount=1,
infHold=false,
phyHold=false,
--Control
nextCount=6,
holdCount=1,
infHold=false,
phyHold=false,
--Visual
bone=false,
--Visual
bone=false,
--Rule
life=0,
pushSpeed=5,
garbageSpeed=2,
visible='show',
freshLimit=15,
--Rule
life=0,
pushSpeed=5,
garbageSpeed=2,
visible='show',
freshLimit=15,
fieldH=20,
heightLimit=1e99,
bufferLimit=1e99,
fieldH=20,
heightLimit=1e99,
bufferLimit=1e99,
ospin=true,
fineKill=false,
b2bKill=false,
easyFresh=true,
deepDrop=false,
ospin=true,
fineKill=false,
b2bKill=false,
easyFresh=true,
deepDrop=false,
}
REPLAY={}--Replay objects (not include stream data)
--Userdata tables
USER={--User infomation
--Network infos
uid=false,
authToken=false,
--Network infos
uid=false,
authToken=false,
--Local data
xp=0,lv=1,
--Local data
xp=0,lv=1,
}
SETTING={--Settings
--Tuning
das=10,arr=2,
dascut=0,dropcut=0,
sddas=0,sdarr=2,
ihs=true,irs=true,ims=true,
RS='TRS',
swap=true,
--Tuning
das=10,arr=2,
dascut=0,dropcut=0,
sddas=0,sdarr=2,
ihs=true,irs=true,ims=true,
RS='TRS',
swap=true,
--System
reTime=4,
allowTAS=false,
autoPause=true,
menuPos='middle',
fine=false,
autoSave=false,
simpMode=false,
lang=1,
skinSet='crystal_scf',
skin={
1,7,11,3,14,4,9,
1,7,2,6,10,2,13,5,9,15,10,11,3,12,2,16,8,4,
10,13,2,8
},
face={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
--System
reTime=4,
allowTAS=false,
autoPause=true,
menuPos='middle',
fine=false,
autoSave=false,
simpMode=false,
lang=1,
skinSet='crystal_scf',
skin={
1,7,11,3,14,4,9,
1,7,2,6,10,2,13,5,9,15,10,11,3,12,2,16,8,4,
10,13,2,8
},
face={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
--Graphic
ghostType='gray',
block=true,ghost=.3,center=1,
smooth=true,grid=.16,lineNum=.5,
upEdge=true,
bagLine=false,
lockFX=2,
dropFX=2,
moveFX=2,
clearFX=2,
splashFX=2,
shakeFX=2,
atkFX=2,
frameMul=100,
cleanCanvas=false,
blockSatur='normal',
fieldSatur='normal',
--Graphic
ghostType='gray',
block=true,ghost=.3,center=1,
smooth=true,grid=.16,lineNum=.5,
upEdge=true,
bagLine=false,
lockFX=2,
dropFX=2,
moveFX=2,
clearFX=2,
splashFX=2,
shakeFX=2,
atkFX=2,
frameMul=100,
cleanCanvas=false,
blockSatur='normal',
fieldSatur='normal',
text=true,
score=true,
bufferWarn=true,
showSpike=true,
highCam=true,
nextPos=true,
fullscreen=true,
bg=true,
powerInfo=false,
clickFX=true,
warn=true,
text=true,
score=true,
bufferWarn=true,
showSpike=true,
highCam=true,
nextPos=true,
fullscreen=true,
bg=true,
powerInfo=false,
clickFX=true,
warn=true,
--Sound
sfx=1,
sfx_spawn=0,
sfx_warn=.4,
bgm=.7,
stereo=.7,
vib=0,
voc=0,
cv='miya',
--Sound
sfx=1,
sfx_spawn=0,
sfx_warn=.4,
bgm=.7,
stereo=.7,
vib=0,
voc=0,
cv='miya',
--Virtualkey
VKSFX=.2,--SFX volume
VKVIB=0,--VIB
VKSwitch=false,--If disp
VKSkin=1,--If disp
VKTrack=false,--If tracked
VKDodge=false,--If dodge
VKTchW=.3,--Touch-Pos Weight
VKCurW=.4,--Cur-Pos Weight
VKIcon=true,--If disp icon
VKAlpha=.3,
--Virtualkey
VKSFX=.2,--SFX volume
VKVIB=0,--VIB
VKSwitch=false,--If disp
VKSkin=1,--If disp
VKTrack=false,--If tracked
VKDodge=false,--If dodge
VKTchW=.3,--Touch-Pos Weight
VKCurW=.4,--Cur-Pos Weight
VKIcon=true,--If disp icon
VKAlpha=.3,
}
keyMap={--Key setting
keyboard={
left=1,right=2,x=3,z=4,c=5,
up=6,down=7,space=8,a=9,s=10,
r=0,
},
joystick={
dpleft=1,dpright=2,a=3,b=4,y=5,
dpup=6,dpdown=7,rightshoulder=8,x=9,
leftshoulder=0,
},
keyboard={
left=1,right=2,x=3,z=4,c=5,
up=6,down=7,space=8,a=9,s=10,
r=0,
},
joystick={
dpleft=1,dpright=2,a=3,b=4,y=5,
dpup=6,dpdown=7,rightshoulder=8,x=9,
leftshoulder=0,
},
}
VK_org={--Virtualkey layout, refresh all VKs' position with this before each game
{ava=true, x=80, y=720-200, r=80},--moveLeft
{ava=true, x=320, y=720-200, r=80},--moveRight
{ava=true, x=1280-80, y=720-200, r=80},--rotRight
{ava=true, x=1280-200, y=720-80, r=80},--rotLeft
{ava=true, x=1280-200, y=720-320, r=80},--rot180
{ava=true, x=200, y=720-320, r=80},--hardDrop
{ava=true, x=200, y=720-80, r=80},--softDrop
{ava=true, x=1280-320, y=720-200, r=80},--hold
{ava=true, x=80, y=280, r=80},--func1
{ava=true, x=1280-80, y=280, r=80},--func2
{ava=false, x=670, y=50, r=30},--insLeft
{ava=false, x=730, y=50, r=30},--insRight
{ava=false, x=790, y=50, r=30},--insDown
{ava=false, x=850, y=50, r=30},--down1
{ava=false, x=910, y=50, r=30},--down4
{ava=false, x=970, y=50, r=30},--down10
{ava=false, x=1030, y=50, r=30},--dropLeft
{ava=false, x=1090, y=50, r=30},--dropRight
{ava=false, x=1150, y=50, r=30},--zangiLeft
{ava=false, x=1210, y=50, r=30},--zangiRight
{ava=true, x=80, y=720-200,r=80},--moveLeft
{ava=true, x=320, y=720-200,r=80},--moveRight
{ava=true, x=1280-80, y=720-200,r=80},--rotRight
{ava=true, x=1280-200,y=720-80, r=80},--rotLeft
{ava=true, x=1280-200,y=720-320,r=80},--rot180
{ava=true, x=200, y=720-320,r=80},--hardDrop
{ava=true, x=200, y=720-80, r=80},--softDrop
{ava=true, x=1280-320,y=720-200,r=80},--hold
{ava=true, x=80, y=280, r=80},--func1
{ava=true, x=1280-80, y=280, r=80},--func2
{ava=false, x=670, y=50, r=30},--insLeft
{ava=false, x=730, y=50, r=30},--insRight
{ava=false, x=790, y=50, r=30},--insDown
{ava=false, x=850, y=50, r=30},--down1
{ava=false, x=910, y=50, r=30},--down4
{ava=false, x=970, y=50, r=30},--down10
{ava=false, x=1030, y=50, r=30},--dropLeft
{ava=false, x=1090, y=50, r=30},--dropRight
{ava=false, x=1150, y=50, r=30},--zangiLeft
{ava=false, x=1210, y=50, r=30},--zangiRight
}
RANKS={sprint_10l=0}--Ranks of modes
STAT={
version=VERSION.code,
run=0,game=0,time=0,frame=0,
key=0,rotate=0,hold=0,
extraPiece=0,finesseRate=0,
piece=0,row=0,dig=0,
atk=0,digatk=0,
send=0,recv=0,pend=0,off=0,
clear=(function()local L={}for i=1,29 do L[i]={0,0,0,0,0,0}end return L end)(),
spin=(function()local L={}for i=1,29 do L[i]={0,0,0,0,0,0,0}end return L end)(),
pc=0,hpc=0,b2b=0,b3b=0,score=0,
lastPlay='sprint_10l',--Last played mode ID
date=false,
todayTime=0,
version=VERSION.code,
run=0,game=0,time=0,frame=0,
key=0,rotate=0,hold=0,
extraPiece=0,finesseRate=0,
piece=0,row=0,dig=0,
atk=0,digatk=0,
send=0,recv=0,pend=0,off=0,
clear=(function()local L={}for i=1,29 do L[i]={0,0,0,0,0,0}end return L end)(),
spin=(function()local L={}for i=1,29 do L[i]={0,0,0,0,0,0,0}end return L end)(),
pc=0,hpc=0,b2b=0,b3b=0,score=0,
lastPlay='sprint_10l',--Last played mode ID
date=false,
todayTime=0,
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,314 +1,314 @@
return{
loadText={
loadSFX="音效",
loadVoice="语音",
loadFont="字体",
loadModeIcon="模式图标",
loadMode="模式",
loadOther="其他",
finish="走你",
},
playedLong="今天玩很久了,给我注意点",
playedTooMuch="特么再玩小心眼睛瞎掉,爬",
loadText={
loadSFX="音效",
loadVoice="语音",
loadFont="字体",
loadModeIcon="模式图标",
loadMode="模式",
loadOther="其他",
finish="走你",
},
playedLong="今天玩很久了,给我注意点",
playedTooMuch="特么再玩小心眼睛瞎掉,爬",
royale_remain="剩 $1 人",
cmb={nil,"1连","2连","3连","4连","5连","6连","7连","8连","9连","10连!","11连!","12连!","13连!","14连!","15连!","16连!","17连!","18连!","19连!","MEGACMB"},
spin="",
clear={"消一","消二","消三","消四","卧槽","离谱"},
mini="",b2b="牛逼",b3b="很牛逼",
PC="消干净了",HPC="消挺干净",
royale_remain="剩 $1 人",
cmb={nil,"1连","2连","3连","4连","5连","6连","7连","8连","9连","10连!","11连!","12连!","13连!","14连!","15连!","16连!","17连!","18连!","19连!","MEGACMB"},
spin="",
clear={"消一","消二","消三","消四","卧槽","离谱"},
mini="",b2b="牛逼",b3b="很牛逼",
PC="消干净了",HPC="消挺干净",
great="不错的",
awesome="您很强",
almost="太舒服了",
continue="您继续",
maxspeed="速度封顶",
great="不错的",
awesome="您很强",
almost="太舒服了",
continue="您继续",
maxspeed="速度封顶",
speedLV="速度等级",
piece="块数",line="行数",atk="",eff="",
rpm="收每分",tsd="T2",
grade="段位",techrash="消四",
wave="波数",nextWave="下一波",
combo="连击",maxcmb="最大连",
pc="消干净了",ko="淘汰",
speedLV="速度等级",
piece="块数",line="行数",atk="",eff="",
rpm="收每分",tsd="T2",
grade="段位",techrash="消四",
wave="波数",nextWave="下一波",
combo="连击",maxcmb="最大连",
pc="消干净了",ko="淘汰",
win="好了",
lose="挂了",
win="好了",
lose="挂了",
finish="好厉害呀 真帅气呢",
gamewin="成了",
gameover="没了",
finish="好厉害呀 真帅气呢",
gamewin="成了",
gameover="没了",
pause="歇会",
pauseCount="歇多久了",
finesse_ap="",
finesse_fc="全连",
pause="歇会",
pauseCount="歇多久了",
finesse_ap="",
finesse_fc="全连",
noUsername="别闹。",
wrongEmail="别乱输。",
noPassword="注册会不会?",
diffPassword="字不认识?",
noUsername="别闹。",
wrongEmail="别乱输。",
noPassword="注册会不会?",
diffPassword="字不认识?",
ranks={"","","","",""},
ranks={"","","","",""},
createRoomSuccessed="创好了",
started="开了",
spectating="看戏中",
createRoomSuccessed="创好了",
started="开了",
spectating="看戏中",
stat={
"开了几次:",
"玩了几把:",
"玩了多久:",
"按键/旋转/暂存:",
"方块/消行/攻击:",
"接收/抵消/上涨:",
"挖掘/挖掘攻击:",
"效率/挖掘效率:",
"牛逼/很牛逼:",
"消光/消半截:",
"多余操作/极简率:",
},
WidgetText={
setting_game={
title="游戏设置",
stat={
"开了几次:",
"玩了几把:",
"玩了多久:",
"按键/旋转/暂存:",
"方块/消行/攻击:",
"接收/抵消/上涨:",
"挖掘/挖掘攻击:",
"效率/挖掘效率:",
"牛逼/很牛逼:",
"消光/消半截:",
"多余操作/极简率:",
},
WidgetText={
setting_game={
title="游戏设置",
graphic="←改画面",
sound="改声音→",
graphic="←改画面",
sound="改声音→",
ctrl="改控制",
key="改键位",
touch="改触屏",
},
setting_video={
title="改画面",
sound="←改声音",
game="游戏设置→",
ctrl="改控制",
key="改键位",
touch="改触屏",
},
setting_video={
title="改画面",
sound="←改声音",
game="游戏设置→",
block="方块可见",
ghost="阴影",
center="中心",
lineNum="行号",
block="方块可见",
ghost="阴影",
center="中心",
lineNum="行号",
text="招式名",
score="跳分",
warn="要死",
highCam="拉镜",
},
setting_sound={
title="改声音",
text="招式名",
score="跳分",
warn="要死",
highCam="拉镜",
},
setting_sound={
title="改声音",
game="←游戏设置",
graphic="改画面→",
game="←游戏设置",
graphic="改画面→",
bgm="",
spawn="出块",
warn="警告",
vib="嗡嗡",
cv="",
},
setting_control={
title="改控制",
reset="重设",
},
setting_skin={
skinSet="皮肤",
title="改外观",
},
setting_touchSwitch={
basic="阳间",
pro="阴间",
},
about={
staff="游戏谁写的",
his="黑历史",
qq="QQ对线",
},
register={
password2="你懂的",
registering="",
},
sound={
title="音效室",
sfx="音效",
voc="语音",
bgm="",
spawn="出块",
warn="警告",
vib="嗡嗡",
cv="",
},
setting_control={
title="改控制",
reset="重设",
},
setting_skin={
skinSet="皮肤",
title="改外观",
},
setting_touchSwitch={
basic="阳间",
pro="阴间",
},
about={
staff="游戏谁写的",
his="黑历史",
qq="QQ对线",
},
register={
password2="你懂的",
registering="",
},
sound={
title="音效室",
sfx="音效",
voc="语音",
hold="暂存",
prehold="提前暂存",
_pc="消干净了",
hold="暂存",
prehold="提前暂存",
_pc="消干净了",
spin0="空旋转",
spin1="旋转消一",
spin2="旋转消二",
spin3="旋转消三",
spin0="空旋转",
spin1="旋转消一",
spin2="旋转消二",
spin3="旋转消三",
z0="Z旋",
z1="Z旋消一",
z2="Z旋消二",
z3="Z旋消三",
s0="S旋",
s1="S旋消一",
s2="S旋消二",
s3="S旋消三",
z0="Z旋",
z1="Z旋消一",
z2="Z旋消二",
z3="Z旋消三",
s0="S旋",
s1="S旋消一",
s2="S旋消二",
s3="S旋消三",
j0="J旋",
j1="J旋消一",
j2="J旋消二",
j3="J旋消三",
l0="L旋",
l1="L旋消一",
l2="L旋消二",
l3="L旋消三",
j0="J旋",
j1="J旋消一",
j2="J旋消二",
j3="J旋消三",
l0="L旋",
l1="L旋消一",
l2="L旋消二",
l3="L旋消三",
t0="T旋",
t1="T旋消一",
t2="T旋消二",
t3="T旋消三",
o0="O旋",
o1="O旋消一",
o2="O旋消二",
o3="O旋消三",
t0="T旋",
t1="T旋消一",
t2="T旋消二",
t3="T旋消三",
o0="O旋",
o1="O旋消一",
o2="O旋消二",
o3="O旋消三",
i0="I旋",
i1="I旋消一",
i2="I旋消二",
i3="I旋消三",
i0="I旋",
i1="I旋消一",
i2="I旋消二",
i3="I旋消三",
mini="",
b2b="牛逼",
b3b="很牛逼",
pc="消干净了",
},
app_15p={
reset="打乱",
color="",
blind="",
slide="滑动",
pathVis="路径显示",
revKB="键盘反向",
},
app_schulteG={
reset="重开",
rank="尺寸",
blind="",
disappear="消失",
tapFX="动画",
},
savedata={
export="复制走",
import="粘贴到",
unlock="地图",
data="统计",
setting="设置",
vk="虚拟按键",
mini="",
b2b="牛逼",
b3b="很牛逼",
pc="消干净了",
},
app_15p={
reset="打乱",
color="",
blind="",
slide="滑动",
pathVis="路径显示",
revKB="键盘反向",
},
app_schulteG={
reset="重开",
rank="尺寸",
blind="",
disappear="消失",
tapFX="动画",
},
savedata={
export="复制走",
import="粘贴到",
unlock="地图",
data="统计",
setting="设置",
vk="虚拟按键",
couldSave="云存档(测试,炸了别怪我)",
notLogin="[不登录存个锤子]",
upload="上传",
download="下载",
},
},
modes={
['sprint_10l']= {"竞速", "10L", "消10行"},
['sprint_20l']= {"竞速", "20L", "消20行"},
['sprint_40l']= {"竞速", "40L", "消40行"},
['sprint_100l']= {"竞速", "100L", "消100行"},
['sprint_400l']= {"竞速", "400L", "消400行"},
['sprint_1000l']= {"竞速", "1000L", "消1000行"},
['sprintPenta']= {"竞速", "五连块", "离谱"},
['sprintMPH']= {"竞速", "纯净", "听说你反应很快?"},
['dig_10l']= {"挖掘", "10L", "挖10行"},
['dig_40l']= {"挖掘", "40L", "挖40行"},
['dig_100l']= {"挖掘", "100L", "挖100行"},
['dig_400l']= {"挖掘", "400L", "挖400行"},
['dig_1000l']= {"挖掘", "1000L", "挖1000行"},
['drought_n']= {"干旱", "100L", "放轻松,简单得很"},
['drought_l']= {"干旱+", "100L", "有趣的要来了"},
['stack_e']= {"堆叠", "简单", "智力启蒙玩具(确信"},
['stack_h']= {"堆叠", "困难", "智力启蒙玩具(确信"},
['stack_u']= {"堆叠", "极限", "智力启蒙玩具(确信"},
['marathon_n']= {"马拉松", "普通", "休闲模式"},
['marathon_h']= {"马拉松", "困难", "休闲模式"},
['solo_e']= {"单挑", "简单", "鲨AI"},
['solo_n']= {"单挑", "普通", "鲨AI"},
['solo_h']= {"单挑", "困难", "鲨AI"},
['solo_l']= {"单挑", "疯狂", "鲨AI"},
['solo_u']= {"单挑", "极限", "鲨AI"},
['techmino49_e']= {"49人混战", "简单", "这我岂不是乱鲨"},
['techmino49_h']= {"49人混战", "困难", "这我岂不是乱鲨"},
['techmino49_u']= {"49人混战", "极限", "你吃鸡率多少?"},
['techmino99_e']= {"99人混战", "简单", "这我岂不是乱鲨"},
['techmino99_h']= {"99人混战", "困难", "这我岂不是乱鲨"},
['techmino99_u']= {"99人混战", "极限", "你吃鸡率多少?"},
['round_e']= {"回合制", "简单", "下棋"},
['round_n']= {"回合制", "普通", "下棋"},
['round_h']= {"回合制", "困难", "下棋"},
['round_l']= {"回合制", "疯狂", "下棋"},
['round_u']= {"回合制", "极限", "下棋"},
['master_n']= {"大师", "普通", "无脑20G"},
['master_h']= {"大师", "困难", "简单20G"},
['master_final']= {"大师", "终点", "究极20G:真正的游戏"},
['master_ph']= {"大师", "虚幻", "虚幻20G:好玩"},
['master_ex']= {"宗师", "EX", "你行你上"},
['rhythm_e']= {"节奏", "简单", "很无聊的"},
['rhythm_h']= {"节奏", "困难", "好玩么?"},
['rhythm_u']= {"节奏", "极限", "真男人不玩低难度"},
['blind_e']= {"隐形", "半隐", "谁都能玩"},
['blind_n']= {"隐形", "全隐", "稍加练习即可"},
['blind_h']= {"隐形", "瞬隐", "和上一个一样"},
['blind_l']= {"隐形", "瞬隐+", "这个确实挺难的"},
['blind_u']= {"隐形", "啊这", "你准备好了吗"},
['blind_wtf']= {"隐形", "不会吧", "还没准备好"},
['classic_fast']= {"高速经典", "CTWC", "就这?简单"},
['survivor_e']= {"生存", "简单", "这都玩不下去?不会吧"},
['survivor_n']= {"生存", "普通", "呵,这都玩不过?"},
['survivor_h']= {"生存", "困难", "所以呢?"},
['survivor_l']= {"生存", "疯狂", "然后呢?"},
['survivor_u']= {"生存", "极限", "舒服了"},
['attacker_h']= {"进攻", "困难", "进攻练习"},
['attacker_u']= {"进攻", "极限", "进攻练习"},
['defender_n']= {"防守", "普通", "防守练习"},
['defender_l']= {"防守", "疯狂", "防守练习"},
['dig_h']= {"挖掘", "困难", "挖掘练习"},
['dig_u']= {"挖掘", "极限", "挖掘练习"},
['bigbang']= {"大爆炸", "简单", "All-spin 入门教程\n施工中"},
['c4wtrain_n']= {"C4W练习", "普通", "无 限 连 击"},
['c4wtrain_l']= {"C4W练习", "疯狂", "无 限 连 击"},
['pctrain_n']= {"全清训练", "普通", "随便打打"},
['pctrain_l']= {"全清训练", "疯狂", "建议不打"},
['pc_n']= {"全清挑战", "普通", "100行内刷PC"},
['pc_h']= {"全清挑战", "困难", "100行内刷PC"},
['pc_l']= {"全清挑战", "疯狂", "100行内刷PC"},
['pc_inf']= {"无尽全清挑战", "", "你这水平还是先别玩了"},
['tech_n']= {"科研", "普通", "禁止断B2B"},
['tech_n_plus']= {"科研", "普通+", "仅允许spin与PC"},
['tech_h']= {"科研", "困难", "禁止断B2B"},
['tech_h_plus']= {"科研", "困难+", "仅允许spin与PC"},
['tech_l']= {"科研", "疯狂", "禁止断B2B"},
['tech_l_plus']= {"科研", "疯狂+", "仅允许spin与PC"},
['tech_finesse']= {"科研", "极简", "强制最简操作"},
['tech_finesse_f']= {"科研", "极简+", "禁止普通消除,强制最简操作"},
['tsd_e']= {"TSD挑战", "简单", "刷T2"},
['tsd_h']= {"TSD挑战", "困难", "刷T2"},
['tsd_u']= {"TSD挑战", "极限", "刷T2"},
['backfire_n']= {"自攻自受", "普通", "100攻击很少的,冲冲冲"},
['backfire_h']= {"自攻自受", "困难", "你在害怕什么"},
['backfire_l']= {"自攻自受", "疯狂", "别怂啊,打攻击呀"},
['backfire_u']= {"自攻自受", "极限", "能把自己玩死,不会吧"},
['sprintAtk']= {"竞速", "100攻击", "送100行"},
['zen']= {"", "200", "不限时200行"},
['ultra']= {"限时打分", "挑战", "2分钟刷分"},
['infinite']= {"无尽", "", "真的有人会玩这个?"},
['infinite_dig']= {"无尽:挖掘", "", "闲得慌就来挖"},
couldSave="云存档(测试,炸了别怪我)",
notLogin="[不登录存个锤子]",
upload="上传",
download="下载",
},
},
modes={
['sprint_10l']= {"竞速", "10L", "消10行"},
['sprint_20l']= {"竞速", "20L", "消20行"},
['sprint_40l']= {"竞速", "40L", "消40行"},
['sprint_100l']= {"竞速", "100L", "消100行"},
['sprint_400l']= {"竞速", "400L", "消400行"},
['sprint_1000l']= {"竞速", "1000L", "消1000行"},
['sprintPenta']= {"竞速", "五连块", "离谱"},
['sprintMPH']= {"竞速", "纯净", "听说你反应很快?"},
['dig_10l']= {"挖掘", "10L", "挖10行"},
['dig_40l']= {"挖掘", "40L", "挖40行"},
['dig_100l']= {"挖掘", "100L", "挖100行"},
['dig_400l']= {"挖掘", "400L", "挖400行"},
['dig_1000l']= {"挖掘", "1000L", "挖1000行"},
['drought_n']= {"干旱", "100L", "放轻松,简单得很"},
['drought_l']= {"干旱+", "100L", "有趣的要来了"},
['stack_e']= {"堆叠", "简单", "智力启蒙玩具(确信"},
['stack_h']= {"堆叠", "困难", "智力启蒙玩具(确信"},
['stack_u']= {"堆叠", "极限", "智力启蒙玩具(确信"},
['marathon_n']= {"马拉松", "普通", "休闲模式"},
['marathon_h']= {"马拉松", "困难", "休闲模式"},
['solo_e']= {"单挑", "简单", "鲨AI"},
['solo_n']= {"单挑", "普通", "鲨AI"},
['solo_h']= {"单挑", "困难", "鲨AI"},
['solo_l']= {"单挑", "疯狂", "鲨AI"},
['solo_u']= {"单挑", "极限", "鲨AI"},
['techmino49_e']= {"49人混战", "简单", "这我岂不是乱鲨"},
['techmino49_h']= {"49人混战", "困难", "这我岂不是乱鲨"},
['techmino49_u']= {"49人混战", "极限", "你吃鸡率多少?"},
['techmino99_e']= {"99人混战", "简单", "这我岂不是乱鲨"},
['techmino99_h']= {"99人混战", "困难", "这我岂不是乱鲨"},
['techmino99_u']= {"99人混战", "极限", "你吃鸡率多少?"},
['round_e']= {"回合制", "简单", "下棋"},
['round_n']= {"回合制", "普通", "下棋"},
['round_h']= {"回合制", "困难", "下棋"},
['round_l']= {"回合制", "疯狂", "下棋"},
['round_u']= {"回合制", "极限", "下棋"},
['master_n']= {"大师", "普通", "无脑20G"},
['master_h']= {"大师", "困难", "简单20G"},
['master_final']= {"大师", "终点", "究极20G:真正的游戏"},
['master_ph']= {"大师", "虚幻", "虚幻20G:好玩"},
['master_ex']= {"宗师", "EX", "你行你上"},
['rhythm_e']= {"节奏", "简单", "很无聊的"},
['rhythm_h']= {"节奏", "困难", "好玩么?"},
['rhythm_u']= {"节奏", "极限", "真男人不玩低难度"},
['blind_e']= {"隐形", "半隐", "谁都能玩"},
['blind_n']= {"隐形", "全隐", "稍加练习即可"},
['blind_h']= {"隐形", "瞬隐", "和上一个一样"},
['blind_l']= {"隐形", "瞬隐+", "这个确实挺难的"},
['blind_u']= {"隐形", "啊这", "你准备好了吗"},
['blind_wtf']= {"隐形", "不会吧", "还没准备好"},
['classic_fast']= {"高速经典", "CTWC", "就这?简单"},
['survivor_e']= {"生存", "简单", "这都玩不下去?不会吧"},
['survivor_n']= {"生存", "普通", "呵,这都玩不过?"},
['survivor_h']= {"生存", "困难", "所以呢?"},
['survivor_l']= {"生存", "疯狂", "然后呢?"},
['survivor_u']= {"生存", "极限", "舒服了"},
['attacker_h']= {"进攻", "困难", "进攻练习"},
['attacker_u']= {"进攻", "极限", "进攻练习"},
['defender_n']= {"防守", "普通", "防守练习"},
['defender_l']= {"防守", "疯狂", "防守练习"},
['dig_h']= {"挖掘", "困难", "挖掘练习"},
['dig_u']= {"挖掘", "极限", "挖掘练习"},
['bigbang']= {"大爆炸", "简单", "All-spin 入门教程\n施工中"},
['c4wtrain_n']= {"C4W练习", "普通", "无 限 连 击"},
['c4wtrain_l']= {"C4W练习", "疯狂", "无 限 连 击"},
['pctrain_n']= {"全清训练", "普通", "随便打打"},
['pctrain_l']= {"全清训练", "疯狂", "建议不打"},
['pc_n']= {"全清挑战", "普通", "100行内刷PC"},
['pc_h']= {"全清挑战", "困难", "100行内刷PC"},
['pc_l']= {"全清挑战", "疯狂", "100行内刷PC"},
['pc_inf']= {"无尽全清挑战", "", "你这水平还是先别玩了"},
['tech_n']= {"科研", "普通", "禁止断B2B"},
['tech_n_plus']= {"科研", "普通+", "仅允许spin与PC"},
['tech_h']= {"科研", "困难", "禁止断B2B"},
['tech_h_plus']= {"科研", "困难+", "仅允许spin与PC"},
['tech_l']= {"科研", "疯狂", "禁止断B2B"},
['tech_l_plus']= {"科研", "疯狂+", "仅允许spin与PC"},
['tech_finesse']= {"科研", "极简", "强制最简操作"},
['tech_finesse_f']= {"科研", "极简+", "禁止普通消除,强制最简操作"},
['tsd_e']= {"TSD挑战", "简单", "刷T2"},
['tsd_h']= {"TSD挑战", "困难", "刷T2"},
['tsd_u']= {"TSD挑战", "极限", "刷T2"},
['backfire_n']= {"自攻自受", "普通", "100攻击很少的,冲冲冲"},
['backfire_h']= {"自攻自受", "困难", "你在害怕什么"},
['backfire_l']= {"自攻自受", "疯狂", "别怂啊,打攻击呀"},
['backfire_u']= {"自攻自受", "极限", "能把自己玩死,不会吧"},
['sprintAtk']= {"竞速", "100攻击", "送100行"},
['zen']= {"", "200", "不限时200行"},
['ultra']= {"限时打分", "挑战", "2分钟刷分"},
['infinite']= {"无尽", "", "真的有人会玩这个?"},
['infinite_dig']= {"无尽:挖掘", "", "闲得慌就来挖"},
['sprintFix']= {"竞速", "无移动"},
['sprintLock']= {"竞速", "无旋转"},
['sprintSmooth']= {"竞速", "无摩擦"},
['marathon_bfmax']= {"马拉松", "极限"},
['sprintFix']= {"竞速", "无移动"},
['sprintLock']= {"竞速", "无旋转"},
['sprintSmooth']= {"竞速", "无摩擦"},
['marathon_bfmax']= {"马拉松", "极限"},
['master_l']= {"大师", "疯狂"},
['master_u']= {"大师", "极限"},
['master_l']= {"大师", "疯狂"},
['master_u']= {"大师", "极限"},
['custom_clear']= {"自定义", "普通"},
['custom_puzzle']= {"自定义", "拼图"},
},
['custom_clear']= {"自定义", "普通"},
['custom_puzzle']= {"自定义", "拼图"},
},
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,230 +1,230 @@
return{
cmb={nil,"1连击","2连击","3连击","4连击","5连击","6连击","7连击","8连击","9连击","10连击!","11连击!","12连击!","13连击!","14连击!","15连击!","16连击!","17连击!","18连击!","19连击!","巨型连击"},
spin="型回旋",
clear={"单清","双清","三清","四清","五清","六清"},
mini="迷你",b2b="满贯",b3b="大满贯",
PC="场地全清",HPC="场地半清",
cmb={nil,"1连击","2连击","3连击","4连击","5连击","6连击","7连击","8连击","9连击","10连击!","11连击!","12连击!","13连击!","14连击!","15连击!","16连击!","17连击!","18连击!","19连击!","巨型连击"},
spin="型回旋",
clear={"单清","双清","三清","四清","五清","六清"},
mini="迷你",b2b="满贯",b3b="大满贯",
PC="场地全清",HPC="场地半清",
great="不错!",
awesome="精彩。",
almost="差一点!",
continue="继续。",
great="不错!",
awesome="精彩。",
almost="差一点!",
continue="继续。",
speedLV="速度等级",
piece="块数",line="行数",atk="攻击",eff="效率",
rpm="收每分",tsd="T2",
grade="段位",techrash="消四",
wave="波数",nextWave="下一波",
combo="连击",maxcmb="最大连击",
pc="全清",ko="淘汰",
speedLV="速度等级",
piece="块数",line="行数",atk="攻击",eff="效率",
rpm="收每分",tsd="T2",
grade="段位",techrash="消四",
wave="波数",nextWave="下一波",
combo="连击",maxcmb="最大连击",
pc="全清",ko="淘汰",
finesse_ap="完美极简",
finesse_fc="全连击",
finesse_ap="完美极简",
finesse_fc="全连击",
ai_fixed="不能同时开启电脑玩家和固定序列",
ai_prebag="不能同时开启电脑玩家和含有非四连块的自定义序列",
ai_mission="不能同时开启电脑玩家和自定义任务",
ai_fixed="不能同时开启电脑玩家和固定序列",
ai_prebag="不能同时开启电脑玩家和含有非四连块的自定义序列",
ai_mission="不能同时开启电脑玩家和自定义任务",
ranks={"","","","",""},
ranks={"","","","",""},
modInstruction="选择你要使用的模组!\n不同的模组会用不同的方式改变游戏规则,来开发新玩法挑战自我吧!\n提醒:开启一些模组会让成绩无效 你可以用键盘开关模组,按tab重置",
modInfo={
next="预览数量:\n强制使用预览的个数",
hold="暂存数量:\n强制使用暂存的个数",
hideNext="隐藏预览:\n隐藏前几个预览",
infHold="无限暂存:\n可以无限制使用暂存",
forceB2B="强制满贯:\n满贯点数条掉到启动线以下就会结束游戏",
},
pauseStat={
"时间:",
"按键/旋转/暂存:",
"落块:",
"消行/挖掘:",
"攻击/挖掘攻击:",
"上涨/接收/抵消:",
"消除:",
"回旋:",
"(大)满贯/全(半)清:",
"非极简操作:",
},
radar={"","","","","",""},
radarData={"防/分","守/分","攻/分","送/分","行/分","挖/分"},
WidgetText={
mode={
mod="模组(F1)",
},
mod={
title="模组",
},
setting_control={
das="首次移动延迟",arr="移动重复延迟",
sddas="首次软降延迟",sdarr="软降重复延迟",
ihs="提前暂存",
},
setting_skin={
spin1="",spin2="",spin3="",spin4="",spin5="",spin6="",spin7="",
},
customGame={
mod="模组(F1)",
modInstruction="选择你要使用的模组!\n不同的模组会用不同的方式改变游戏规则,来开发新玩法挑战自我吧!\n提醒:开启一些模组会让成绩无效 你可以用键盘开关模组,按tab重置",
modInfo={
next="预览数量:\n强制使用预览的个数",
hold="暂存数量:\n强制使用暂存的个数",
hideNext="隐藏预览:\n隐藏前几个预览",
infHold="无限暂存:\n可以无限制使用暂存",
forceB2B="强制满贯:\n满贯点数条掉到启动线以下就会结束游戏",
},
pauseStat={
"时间:",
"按键/旋转/暂存:",
"落块:",
"消行/挖掘:",
"攻击/挖掘攻击:",
"上涨/接收/抵消:",
"消除:",
"回旋:",
"(大)满贯/全(半)清:",
"非极简操作:",
},
radar={"","","","","",""},
radarData={"防/分","守/分","攻/分","送/分","行/分","挖/分"},
WidgetText={
mode={
mod="模组(F1)",
},
mod={
title="模组",
},
setting_control={
das="首次移动延迟",arr="移动重复延迟",
sddas="首次软降延迟",sdarr="软降重复延迟",
ihs="提前暂存",
},
setting_skin={
spin1="",spin2="",spin3="",spin4="",spin5="",spin6="",spin7="",
},
customGame={
mod="模组(F1)",
nextCount="预览个数",
holdCount="暂存个数",
infHold="无限暂存",
phyHold="物理暂存",
},
sound={
clear1="消一",
clear2="消二",
clear3="消三",
clear4="消四",
spin0="空旋转",
spin1="旋转消一",
spin2="旋转消二",
spin3="旋转消三",
nextCount="预览个数",
holdCount="暂存个数",
infHold="无限暂存",
phyHold="物理暂存",
},
sound={
clear1="消一",
clear2="消二",
clear3="消三",
clear4="消四",
spin0="空旋转",
spin1="旋转消一",
spin2="旋转消二",
spin3="旋转消三",
_1="消一",
_2="消二",
_3="消三",
_4="消四",
z0="Z旋",
z1="Z旋消一",
z2="Z旋消二",
z3="Z旋消三",
s0="S旋",
s1="S旋消一",
s2="S旋消二",
s3="S旋消三",
_1="消一",
_2="消二",
_3="消三",
_4="消四",
z0="Z旋",
z1="Z旋消一",
z2="Z旋消二",
z3="Z旋消三",
s0="S旋",
s1="S旋消一",
s2="S旋消二",
s3="S旋消三",
j0="J旋",
j1="J旋消一",
j2="J旋消二",
j3="J旋消三",
l0="L旋",
l1="L旋消一",
l2="L旋消二",
l3="L旋消三",
j0="J旋",
j1="J旋消一",
j2="J旋消二",
j3="J旋消三",
l0="L旋",
l1="L旋消一",
l2="L旋消二",
l3="L旋消三",
t0="T旋",
t1="T旋消一",
t2="T旋消二",
t3="T旋消三",
o0="O旋",
o1="O旋消一",
o2="O旋消二",
o3="O旋消三",
t0="T旋",
t1="T旋消一",
t2="T旋消二",
t3="T旋消三",
o0="O旋",
o1="O旋消一",
o2="O旋消二",
o3="O旋消三",
i0="I旋",
i1="I旋消一",
i2="I旋消二",
i3="I旋消三",
i0="I旋",
i1="I旋消一",
i2="I旋消二",
i3="I旋消三",
mini="迷你",
b2b="满贯",
b3b="大满贯",
pc="全清",
},
},
modes={
['sprint_10l']= {"竞速", "10行", "消除10行"},
['sprint_20l']= {"竞速", "20行", "消除20行"},
['sprint_40l']= {"竞速", "40行", "消除40行"},
['sprint_100l']= {"竞速", "100行", "消除100行"},
['sprint_400l']= {"竞速", "400行", "消除400行"},
['sprint_1000l']= {"竞速", "1000行", "消除1000行"},
['sprintPenta']= {"竞速", "五连块", "伤脑筋十八块"},
['sprintMPH']= {"竞速", "纯净", "纯随机\n无预览\n无暂存"},
['dig_10l']= {"挖掘", "10L", "挖掘10行"},
['dig_40l']= {"挖掘", "40L", "挖掘40行"},
['dig_100l']= {"挖掘", "100L", "挖掘100行"},
['dig_400l']= {"挖掘", "400L", "挖掘400行"},
['dig_1000l']= {"挖掘", "1000L", "挖掘1000行"},
['drought_n']= {"干旱", "100行", "你I没了"},
['drought_l']= {"干旱+", "100行", "后 妈 发 牌"},
['stack_e']= {"堆积", "简单", "搭积木"},
['stack_h']= {"堆积", "困难", "搭积木"},
['stack_u']= {"堆积", "极限", "搭积木"},
['marathon_n']= {"马拉松", "普通", "200行加速马拉松"},
['marathon_h']= {"马拉松", "困难", "200行高速马拉松"},
['solo_e']= {"单挑", "简单", "打败机器人"},
['solo_n']= {"单挑", "普通", "打败机器人"},
['solo_h']= {"单挑", "困难", "打败机器人"},
['solo_l']= {"单挑", "疯狂", "打败机器人"},
['solo_u']= {"单挑", "极限", "打败机器人"},
['techmino49_e']= {"49人混战", "简单", "49人混战,活到最后"},
['techmino49_h']= {"49人混战", "困难", "49人混战,活到最后"},
['techmino49_u']= {"49人混战", "极限", "49人混战,活到最后"},
['techmino99_e']= {"99人混战", "简单", "99人混战,活到最后"},
['techmino99_h']= {"99人混战", "困难", "99人混战,活到最后"},
['techmino99_u']= {"99人混战", "极限", "99人混战,活到最后"},
['round_e']= {"回合制", "简单", "下棋模式"},
['round_n']= {"回合制", "普通", "下棋模式"},
['round_h']= {"回合制", "困难", "下棋模式"},
['round_l']= {"回合制", "疯狂", "下棋模式"},
['round_u']= {"回合制", "极限", "下棋模式"},
['master_n']= {"大师", "普通", "20G初心者练习"},
['master_h']= {"大师", "困难", "上级者20G挑战"},
['master_final']= {"大师", "终点", "究极20G:无法触及的终点"},
['master_ph']= {"大师", "虚幻", "虚幻20G:???"},
['master_ex']= {"宗师", "EX", "成为方块大师"},
['rhythm_e']= {"节奏", "简单", "200行低速节奏马拉松"},
['rhythm_h']= {"节奏", "困难", "200行中速节奏马拉松"},
['rhythm_u']= {"节奏", "极限", "200行高速节奏马拉松"},
['blind_e']= {"隐形", "半隐", "不强大脑"},
['blind_n']= {"隐形", "全隐", "挺强大脑"},
['blind_h']= {"隐形", "瞬隐", "很强大脑"},
['blind_l']= {"隐形", "瞬隐+", "超强大脑"},
['blind_u']= {"隐形", "啊这", "你准备好了吗"},
['blind_wtf']= {"隐形", "不会吧", "还没准备好"},
['classic_fast']= {"高速经典", "CTWC", "高速经典"},
['survivor_e']= {"生存", "简单", "你能存活多久?"},
['survivor_n']= {"生存", "普通", "你能存活多久?"},
['survivor_h']= {"生存", "困难", "你能存活多久?"},
['survivor_l']= {"生存", "疯狂", "你能存活多久?"},
['survivor_u']= {"生存", "极限", "你能存活多久?"},
['attacker_h']= {"进攻", "困难", "进攻练习"},
['attacker_u']= {"进攻", "极限", "进攻练习"},
['defender_n']= {"防守", "普通", "防守练习"},
['defender_l']= {"防守", "疯狂", "防守练习"},
['dig_h']= {"挖掘", "困难", "挖掘练习"},
['dig_u']= {"挖掘", "极限", "挖掘练习"},
['bigbang']= {"大爆炸", "简单", "All-spin 入门教程\n施工中"},
['c4wtrain_n']= {"中四宽练习", "普通", "无 限 连 击"},
['c4wtrain_l']= {"中四宽练习", "疯狂", "无 限 连 击"},
['pctrain_n']= {"全清训练", "普通", "简易全清题库,熟悉全清定式的组合"},
['pctrain_l']= {"全清训练", "疯狂", "困难PC题库,强算力者进"},
['pc_n']= {"全清挑战", "普通", "100行内刷全清"},
['pc_h']= {"全清挑战", "困难", "100行内刷全清"},
['pc_l']= {"全清挑战", "疯狂", "100行内刷全清"},
['pc_inf']= {"无尽全清挑战", "", "你能连续做多少PC?"},
['tech_n']= {"科研", "普通", "禁止断B2B"},
['tech_n_plus']= {"科研", "普通+", "仅允许回旋与全清"},
['tech_h']= {"科研", "困难", "禁止断B2B"},
['tech_h_plus']= {"科研", "困难+", "仅允许回旋与全清"},
['tech_l']= {"科研", "疯狂", "禁止断B2B"},
['tech_l_plus']= {"科研", "疯狂+", "仅允许spin与PC"},
['tech_finesse']= {"科研", "极简", "强制最简操作"},
['tech_finesse_f']= {"科研", "极简+", "禁止普通消除,强制最简操作"},
['tsd_e']= {"T2挑战", "简单", "你能连续做几个T旋双清?"},
['tsd_h']= {"T2挑战", "困难", "你能连续做几个T旋双清?"},
['tsd_u']= {"T2挑战", "极限", "你能连续做几个T旋双清?"},
['backfire_n']= {"自攻自防", "普通", "打出100攻击"},
['backfire_h']= {"自攻自防", "困难", "打出100攻击"},
['backfire_l']= {"自攻自防", "疯狂", "打出100攻击"},
['backfire_u']= {"自攻自防", "极限", "打出100攻击"},
['sprintAtk']= {"竞速", "100攻击", "打出100攻击"},
['zen']= {"", "200", "不限时200行"},
['ultra']= {"限时打分", "挑战", "在两分钟内尽可能拿到最多的分数"},
['infinite']= {"无尽", "", "沙盒"},
['infinite_dig']= {"无尽:挖掘", "", "挖呀挖呀挖"},
mini="迷你",
b2b="满贯",
b3b="大满贯",
pc="全清",
},
},
modes={
['sprint_10l']= {"竞速", "10行", "消除10行"},
['sprint_20l']= {"竞速", "20行", "消除20行"},
['sprint_40l']= {"竞速", "40行", "消除40行"},
['sprint_100l']= {"竞速", "100行", "消除100行"},
['sprint_400l']= {"竞速", "400行", "消除400行"},
['sprint_1000l']= {"竞速", "1000行", "消除1000行"},
['sprintPenta']= {"竞速", "五连块", "伤脑筋十八块"},
['sprintMPH']= {"竞速", "纯净", "纯随机\n无预览\n无暂存"},
['dig_10l']= {"挖掘", "10L", "挖掘10行"},
['dig_40l']= {"挖掘", "40L", "挖掘40行"},
['dig_100l']= {"挖掘", "100L", "挖掘100行"},
['dig_400l']= {"挖掘", "400L", "挖掘400行"},
['dig_1000l']= {"挖掘", "1000L", "挖掘1000行"},
['drought_n']= {"干旱", "100行", "你I没了"},
['drought_l']= {"干旱+", "100行", "后 妈 发 牌"},
['stack_e']= {"堆积", "简单", "搭积木"},
['stack_h']= {"堆积", "困难", "搭积木"},
['stack_u']= {"堆积", "极限", "搭积木"},
['marathon_n']= {"马拉松", "普通", "200行加速马拉松"},
['marathon_h']= {"马拉松", "困难", "200行高速马拉松"},
['solo_e']= {"单挑", "简单", "打败机器人"},
['solo_n']= {"单挑", "普通", "打败机器人"},
['solo_h']= {"单挑", "困难", "打败机器人"},
['solo_l']= {"单挑", "疯狂", "打败机器人"},
['solo_u']= {"单挑", "极限", "打败机器人"},
['techmino49_e']= {"49人混战", "简单", "49人混战,活到最后"},
['techmino49_h']= {"49人混战", "困难", "49人混战,活到最后"},
['techmino49_u']= {"49人混战", "极限", "49人混战,活到最后"},
['techmino99_e']= {"99人混战", "简单", "99人混战,活到最后"},
['techmino99_h']= {"99人混战", "困难", "99人混战,活到最后"},
['techmino99_u']= {"99人混战", "极限", "99人混战,活到最后"},
['round_e']= {"回合制", "简单", "下棋模式"},
['round_n']= {"回合制", "普通", "下棋模式"},
['round_h']= {"回合制", "困难", "下棋模式"},
['round_l']= {"回合制", "疯狂", "下棋模式"},
['round_u']= {"回合制", "极限", "下棋模式"},
['master_n']= {"大师", "普通", "20G初心者练习"},
['master_h']= {"大师", "困难", "上级者20G挑战"},
['master_final']= {"大师", "终点", "究极20G:无法触及的终点"},
['master_ph']= {"大师", "虚幻", "虚幻20G:???"},
['master_ex']= {"宗师", "EX", "成为方块大师"},
['rhythm_e']= {"节奏", "简单", "200行低速节奏马拉松"},
['rhythm_h']= {"节奏", "困难", "200行中速节奏马拉松"},
['rhythm_u']= {"节奏", "极限", "200行高速节奏马拉松"},
['blind_e']= {"隐形", "半隐", "不强大脑"},
['blind_n']= {"隐形", "全隐", "挺强大脑"},
['blind_h']= {"隐形", "瞬隐", "很强大脑"},
['blind_l']= {"隐形", "瞬隐+", "超强大脑"},
['blind_u']= {"隐形", "啊这", "你准备好了吗"},
['blind_wtf']= {"隐形", "不会吧", "还没准备好"},
['classic_fast']= {"高速经典", "CTWC", "高速经典"},
['survivor_e']= {"生存", "简单", "你能存活多久?"},
['survivor_n']= {"生存", "普通", "你能存活多久?"},
['survivor_h']= {"生存", "困难", "你能存活多久?"},
['survivor_l']= {"生存", "疯狂", "你能存活多久?"},
['survivor_u']= {"生存", "极限", "你能存活多久?"},
['attacker_h']= {"进攻", "困难", "进攻练习"},
['attacker_u']= {"进攻", "极限", "进攻练习"},
['defender_n']= {"防守", "普通", "防守练习"},
['defender_l']= {"防守", "疯狂", "防守练习"},
['dig_h']= {"挖掘", "困难", "挖掘练习"},
['dig_u']= {"挖掘", "极限", "挖掘练习"},
['bigbang']= {"大爆炸", "简单", "All-spin 入门教程\n施工中"},
['c4wtrain_n']= {"中四宽练习", "普通", "无 限 连 击"},
['c4wtrain_l']= {"中四宽练习", "疯狂", "无 限 连 击"},
['pctrain_n']= {"全清训练", "普通", "简易全清题库,熟悉全清定式的组合"},
['pctrain_l']= {"全清训练", "疯狂", "困难PC题库,强算力者进"},
['pc_n']= {"全清挑战", "普通", "100行内刷全清"},
['pc_h']= {"全清挑战", "困难", "100行内刷全清"},
['pc_l']= {"全清挑战", "疯狂", "100行内刷全清"},
['pc_inf']= {"无尽全清挑战", "", "你能连续做多少PC?"},
['tech_n']= {"科研", "普通", "禁止断B2B"},
['tech_n_plus']= {"科研", "普通+", "仅允许回旋与全清"},
['tech_h']= {"科研", "困难", "禁止断B2B"},
['tech_h_plus']= {"科研", "困难+", "仅允许回旋与全清"},
['tech_l']= {"科研", "疯狂", "禁止断B2B"},
['tech_l_plus']= {"科研", "疯狂+", "仅允许spin与PC"},
['tech_finesse']= {"科研", "极简", "强制最简操作"},
['tech_finesse_f']= {"科研", "极简+", "禁止普通消除,强制最简操作"},
['tsd_e']= {"T2挑战", "简单", "你能连续做几个T旋双清?"},
['tsd_h']= {"T2挑战", "困难", "你能连续做几个T旋双清?"},
['tsd_u']= {"T2挑战", "极限", "你能连续做几个T旋双清?"},
['backfire_n']= {"自攻自防", "普通", "打出100攻击"},
['backfire_h']= {"自攻自防", "困难", "打出100攻击"},
['backfire_l']= {"自攻自防", "疯狂", "打出100攻击"},
['backfire_u']= {"自攻自防", "极限", "打出100攻击"},
['sprintAtk']= {"竞速", "100攻击", "打出100攻击"},
['zen']= {"", "200", "不限时200行"},
['ultra']= {"限时打分", "挑战", "在两分钟内尽可能拿到最多的分数"},
['infinite']= {"无尽", "", "沙盒"},
['infinite_dig']= {"无尽:挖掘", "", "挖呀挖呀挖"},
['sprintFix']= {"竞速", "无移动"},
['sprintLock']= {"竞速", "无旋转"},
['sprintSmooth']= {"竞速", "无摩擦"},
['marathon_bfmax']= {"马拉松", "极限"},
['sprintFix']= {"竞速", "无移动"},
['sprintLock']= {"竞速", "无旋转"},
['sprintSmooth']= {"竞速", "无摩擦"},
['marathon_bfmax']= {"马拉松", "极限"},
['master_l']= {"大师", "疯狂"},
['master_u']= {"大师", "极限"},
['custom_clear']= {"自定义", "普通"},
['custom_puzzle']= {"自定义", "拼图"},
},
['master_l']= {"大师", "疯狂"},
['master_u']= {"大师", "极限"},
['custom_clear']= {"自定义", "普通"},
['custom_puzzle']= {"自定义", "拼图"},
},
}

View File

@@ -1,92 +1,92 @@
return STRING.split([=[
Gameplay:
The system will provide you with tetrominoes (4-block pieces),
with a total of 7 types, and the player needs to control them
(move left and right, rotate 90, 180 or 270 degrees).
each row filled with the field will be cleared.
If there is an opponent, an attack will be sent depending on the line clear type
Play until the end or achieve the level's goal to win.
The system will provide you with tetrominoes (4-block pieces),
with a total of 7 types, and the player needs to control them
(move left and right, rotate 90, 180 or 270 degrees).
each row filled with the field will be cleared.
If there is an opponent, an attack will be sent depending on the line clear type
Play until the end or achieve the level's goal to win.
Rotation system:
Uses Techmino's custom rotation system. Too lazy to write the details
Uses Techmino's custom rotation system. Too lazy to write the details
Spin detection:
Satisfies "3 corner" rule +2 points
Satisfies "immobile" rule +2 points
- As long as one of the above is true, it is a Spin
Satisfies "3 corner" rule +2 points
Satisfies "immobile" rule +2 points
- As long as one of the above is true, it is a Spin
If the rotation was not using the second check in the kick table, +1 point
- The Spin is a Mini if it only has 2 points; the piece is one of S, Z, J, L, T; AND the line clear did not clear the entire piece.
If the rotation was not using the second check in the kick table, +1 point
- The Spin is a Mini if it only has 2 points; the piece is one of S, Z, J, L, T; AND the line clear did not clear the entire piece.
Attack system:
Normal line clears (1 to 3 lines):
Sends (lines cleared -0.5) attack
Special line clears:
Spin sends (lines cleared x2) attack,
- B2B sends extra 1/1/2/4/8 for Spin Single/Double/Triple/Techrash/Techrash+
- B2B2B sends (lines cleared x0.5), and +1 extra blocking
- Minis reduces the attack to 25% (x0.25 multiplier)
Non-Spin Techrash/Techrash+ sends (lines cleared) attack,
- B2B sends 1 additional line
- B2B2B will have an attack boost of 50% and +1 extra blocking
Normal line clears (1 to 3 lines):
Sends (lines cleared -0.5) attack
Special line clears:
Spin sends (lines cleared x2) attack,
- B2B sends extra 1/1/2/4/8 for Spin Single/Double/Triple/Techrash/Techrash+
- B2B2B sends (lines cleared x0.5), and +1 extra blocking
- Minis reduces the attack to 25% (x0.25 multiplier)
Non-Spin Techrash/Techrash+ sends (lines cleared) attack,
- B2B sends 1 additional line
- B2B2B will have an attack boost of 50% and +1 extra blocking
Special line clears will the increase B2B gauge, making later special line clears have either a B2B or B2B2B bonus (see below)
Special line clears will the increase B2B gauge, making later special line clears have either a B2B or B2B2B bonus (see below)
Hemi Perfect Clear (a P.C. "with blocks left below". If it's an I clearing 1 line, the remaining blocks must not be player-placed):
Attack +4, Extra Blocking +2
Hemi Perfect Clear (a P.C. "with blocks left below". If it's an I clearing 1 line, the remaining blocks must not be player-placed):
Attack +4, Extra Blocking +2
Perfect Clear (aka All Clear):
Sends 8 to 16 (increments within a game by 2 for every PC) OR every other damage above, whichever is higher,
and +2 extra blocking.
Perfect Clear (aka All Clear):
Sends 8 to 16 (increments within a game by 2 for every PC) OR every other damage above, whichever is higher,
and +2 extra blocking.
Combos: All damage above will be given a (combo x25%) bonus, or (combo x15%) for Single clear (capped at 12 combo),
+1 more attack for 3 Combo or more.
After calculating all above, the damage value will be rounded down then sent
Combos: All damage above will be given a (combo x25%) bonus, or (combo x15%) for Single clear (capped at 12 combo),
+1 more attack for 3 Combo or more.
After calculating all above, the damage value will be rounded down then sent
Score system:
The better you play, the higher the score.
The better you play, the higher the score.
Attack delay:
Attacks from Doubles/Triples take effect the fastest;
Followed by Techrash, Spins, which send slower attacks;
High combos are the slowest;
For B2B or B2B2B, they also increase the attack delay while they increase lines sent;
Minis will greatly increase the delay.
Attacks from Doubles/Triples take effect the fastest;
Followed by Techrash, Spins, which send slower attacks;
High combos are the slowest;
For B2B or B2B2B, they also increase the attack delay while they increase lines sent;
Minis will greatly increase the delay.
Countering:
When you send attacks, if there is garbage in queue,
extra blocking will be used first, then attack, countering the earliest attack at a 1:1 ratio.
Any extra blocking you didn't use will be discarded, and finally the remaining attack power will be sent to your opponent.
When you send attacks, if there is garbage in queue,
extra blocking will be used first, then attack, countering the earliest attack at a 1:1 ratio.
Any extra blocking you didn't use will be discarded, and finally the remaining attack power will be sent to your opponent.
Back to Back (B2B) gauge:
The B2B gauge ranges from 0 to 1,000. Special line clears are B2B if the gauge is >=50, B2B2B if >800.
A regular line clear -250
Spin Single/Double/Triple/Techrash/Techrash+ + 50/100/180/800/1000 (x50% if Mini)
Techrash/Techrash+ + 150/200/...
PC when lines cleared in this round >4, +800
Hemi-PC, +100
Spin (0 lines) +20. Do note that the B2B gauge cannot exceed 800 using this method.
When gauge is above 800, a drop without clearing lines decreases it by 40, but cannot drop below 800
The B2B gauge ranges from 0 to 1,000. Special line clears are B2B if the gauge is >=50, B2B2B if >800.
A regular line clear -250
Spin Single/Double/Triple/Techrash/Techrash+ + 50/100/180/800/1000 (x50% if Mini)
Techrash/Techrash+ + 150/200/...
PC when lines cleared in this round >4, +800
Hemi-PC, +100
Spin (0 lines) +20. Do note that the B2B gauge cannot exceed 800 using this method.
When gauge is above 800, a drop without clearing lines decreases it by 40, but cannot drop below 800
Battle Royale modes:
Many players play a game at the same time (against AI bots, not real players).
As players get eliminated, blocks fall faster, and garbage take effect faster, as well as rise faster.
Eliminate other players to gain a badge and the player's badge to increase your attack power.
Players can choose between four attack modes:
1. Random: Every time you attack, 10% chance to lock onto a random player.
2. Badges: After you attack or when your target dies, lock onto the player with the most badges.
3. KOs: After you attack or when your target dies, lock onto the player with the highest field. (Refreshes every second)
4. Attackers: attack all players locking onto yourself.
Your attack will be sent to all of them. If you are not targetted, you attack a random player (not locking).
When all opponents have been eliminated, the last player in the match is the winner.
Many players play a game at the same time (against AI bots, not real players).
As players get eliminated, blocks fall faster, and garbage take effect faster, as well as rise faster.
Eliminate other players to gain a badge and the player's badge to increase your attack power.
Players can choose between four attack modes:
1. Random: Every time you attack, 10% chance to lock onto a random player.
2. Badges: After you attack or when your target dies, lock onto the player with the most badges.
3. KOs: After you attack or when your target dies, lock onto the player with the highest field. (Refreshes every second)
4. Attackers: attack all players locking onto yourself.
Your attack will be sent to all of them. If you are not targetted, you attack a random player (not locking).
When all opponents have been eliminated, the last player in the match is the winner.
Custom mode:
You can freely adjust most parameters (not including special effects of other game modes).
You can also draw a field to clear or make a template to build.
In build (puzzle) mode, you can toggle template display with Function key:
Cells with a X cannot have blocks;
empty cells can be in any state;
regular colored cells have to be made of the corresponding block;
garbage-colored cells can be any block but not air.
Once you make the shape, you will win.
You can freely adjust most parameters (not including special effects of other game modes).
You can also draw a field to clear or make a template to build.
In build (puzzle) mode, you can toggle template display with Function key:
Cells with a X cannot have blocks;
empty cells can be in any state;
regular colored cells have to be made of the corresponding block;
garbage-colored cells can be any block but not air.
Once you make the shape, you will win.
]=],"\n")

View File

@@ -1,76 +1,76 @@
return STRING.split([=[
游戏方法:
系统会提供的一个个四连骨牌("方块",总共7种)
玩家需要控制(左右移动和旋转90,180,270度)这些骨牌直到下落到场地底部,锁定
每填满场地的一行就会将其消除(如果有对手的话根据消除方式会给对手攻击)
尝试存活更久,或者完成目标即胜利.
系统会提供的一个个四连骨牌("方块",总共7种)
玩家需要控制(左右移动和旋转90,180,270度)这些骨牌直到下落到场地底部,锁定
每填满场地的一行就会将其消除(如果有对手的话根据消除方式会给对手攻击)
尝试存活更久,或者完成目标即胜利.
旋转系统:
使用Techmino专属旋转系统,具体太复杂并且随时可能更改所以不写在这里,可以去parts/kicklist.lua看
使用Techmino专属旋转系统,具体太复杂并且随时可能更改所以不写在这里,可以去parts/kicklist.lua看
spin判定:
满足三角判定+2分
满足不可移动判定+2分
--满足以上之一就算是spin
满足非第二个test+1分
--如果分数只有2,方块是SZJLT之一,并且没有把当前方块整个消除那么就是mini
满足三角判定+2分
满足不可移动判定+2分
--满足以上之一就算是spin
满足非第二个test+1分
--如果分数只有2,方块是SZJLT之一,并且没有把当前方块整个消除那么就是mini
攻击系统:
普通消除:
消<4行打出[消行数-0.5]攻击
特殊消除:
如果是spin,打出[2*消行数]攻击,
B2B攻击+[1/1/2/4/8(spin1~5)]
B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡
mini减至25%
不是spin但是单次消>=4行,打出[消行数]攻击,
B2B攻击+1
B3B攻击+50%,+1额外抵挡
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)
半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+4,额外抵挡+2
全消:全消伤害为8~16(本局内递增2),和上述其他伤害取大,然后+2额外抵挡
连击:每次连击给予上述攻击[连击数*25%(上限12连)(如果只消一行就是15%)]的加成,>=3次时再额外加1攻击
根据上述规则计算后,向下取整,攻击打出
普通消除:
消<4行打出[消行数-0.5]攻击
特殊消除:
如果是spin,打出[2*消行数]攻击,
B2B攻击+[1/1/2/4/8(spin1~5)]
B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡
mini减至25%
不是spin但是单次消>=4行,打出[消行数]攻击,
B2B攻击+1
B3B攻击+50%,+1额外抵挡
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)
半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+4,额外抵挡+2
全消:全消伤害为8~16(本局内递增2),和上述其他伤害取大,然后+2额外抵挡
连击:每次连击给予上述攻击[连击数*25%(上限12连)(如果只消一行就是15%)]的加成,>=3次时再额外加1攻击
根据上述规则计算后,向下取整,攻击打出
分数系统:
分数计算系统非常复杂,而且随时可能更改所以不写在这里,并且计算只跟消除方式等信息有关,和模式设定无关
分数计算系统非常复杂,而且随时可能更改所以不写在这里,并且计算只跟消除方式等信息有关,和模式设定无关
攻击延迟:
消2/3的攻击生效最快,消四其次,spin攻击生效较慢,高连击生效最慢
B2B或者B3B增加攻击力的同时也会减缓一点生效速度,mini大幅减缓生效速度
消2/3的攻击生效最快,消四其次,spin攻击生效较慢,高连击生效最慢
B2B或者B3B增加攻击力的同时也会减缓一点生效速度,mini大幅减缓生效速度
抵消逻辑:
发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力1:1抵消最先受到的攻击
没有用上的额外抵挡会被丢弃,最后剩下的攻击力会发送给对手
发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力1:1抵消最先受到的攻击
没有用上的额外抵挡会被丢弃,最后剩下的攻击力会发送给对手
back to back(B2B)点数说明:
B2B点数的范围在0~1000,在点数>=50时进行特殊消除为B2B,>800时特殊消除为B3B
普通消除:-250
spin1~5:+[50/100/180/800/1000](mini变为原来50%)
消四/五/六:+[150/200/...]
本局内消行数>4时全消:+800
半全消:+100
空spin:+20,此法得到的点数不能超过800
当点数在800以上时空放一块-40(不低于800)
B2B点数的范围在0~1000,在点数>=50时进行特殊消除为B2B,>800时特殊消除为B3B
普通消除:-250
spin1~5:+[50/100/180/800/1000](mini变为原来50%)
消四/五/六:+[150/200/...]
本局内消行数>4时全消:+800
半全消:+100
空spin:+20,此法得到的点数不能超过800
当点数在800以上时空放一块-40(不低于800)
混战模式说明:
许多玩家同时进行一局游戏(对手都是AI,不是真人).
随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.
淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力.
玩家可选四个攻击模式:
1.随机:每次攻击后10%随机挑选一个玩家锁定
2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家
3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新)
4.反击:攻击所有锁定自己的玩家(攻击AOE),若未被任何人锁定则攻击随机玩家(不锁定)
坚持到最后的玩家就是胜利者.
许多玩家同时进行一局游戏(对手都是AI,不是真人).
随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.
淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力.
玩家可选四个攻击模式:
1.随机:每次攻击后10%随机挑选一个玩家锁定
2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家
3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新)
4.反击:攻击所有锁定自己的玩家(攻击AOE),若未被任何人锁定则攻击随机玩家(不锁定)
坚持到最后的玩家就是胜利者.
自定义模式说明:
玩家可以自由调整大多数参数(不包括上述各种游戏模式的特殊效果),
也可以画一个场地去消除或者是作为提示模板来进行拼图模式.
在拼图模式下可以按功能键切换是否展示提示,其中:
打"X"的格子不允许有方块;
空的格子可以是任何状态;
普通的七种彩色方块必须颜色对应;
垃圾行方块的位置只要有方块就可以,但是不能是空气.
玩家拼出画的图后就会判定胜利.
玩家可以自由调整大多数参数(不包括上述各种游戏模式的特殊效果),
也可以画一个场地去消除或者是作为提示模板来进行拼图模式.
在拼图模式下可以按功能键切换是否展示提示,其中:
打"X"的格子不允许有方块;
空的格子可以是任何状态;
普通的七种彩色方块必须颜色对应;
垃圾行方块的位置只要有方块就可以,但是不能是空气.
玩家拼出画的图后就会判定胜利.
]=],"\n")

View File

@@ -1,324 +1,324 @@
do--title
title={
{
53, 60,
1035, 0,
964, 218,
660, 218,
391, 1300,
231, 1154,
415, 218,
0, 218,
},
{
716, 290,
1429, 290,
1312, 462,
875, 489,
821, 695,
1148, 712,
1017, 902,
761, 924,
707, 1127,
1106, 1101,
1198, 1300,
465, 1300,
},
{
1516, 287,
2102, 290,
2036, 464,
1598, 465,
1322, 905,
1395, 1102,
1819, 1064,
1743, 1280,
1286, 1310,
1106, 902,
},
{
2179, 290,
2411, 290,
2272, 688,
2674, 666,
2801, 290,
3041, 290,
2693, 1280,
2464, 1280,
2601, 879,
2199, 897,
2056, 1280,
1828, 1280,
},
{
3123, 290,
3480, 290,
3496, 480,
3664, 290,
4017, 294,
3682, 1280,
3453, 1280,
3697, 578,
3458, 843,
3304, 842,
3251, 561,
3001, 1280,
2779, 1280,
},
{
4088, 290,
4677, 290,
4599, 501,
4426, 502,
4219, 1069,
4388, 1070,
4317, 1280,
3753, 1280,
3822, 1068,
3978, 1068,
4194, 504,
4016, 504,
},
{
4747, 290,
4978, 295,
4921, 464,
5186, 850,
5366, 290,
5599, 295,
5288, 1280,
5051, 1280,
5106, 1102,
4836, 709,
4641, 1280,
4406, 1280,
},
{
5814, 290,
6370, 295,
6471, 415,
6238, 1156,
6058, 1280,
5507, 1280,
5404, 1154,
5635, 416,
-- 5814, 290,
-- 5878, 463,
5770, 542,
5617, 1030,
5676, 1105,
5995, 1106,
6100, 1029,
6255, 541,
6199, 465,
5878, 463,
},
}
for _,C in next,title do
for i=1,#C do
C[i]=C[i]*.1626
end
end
title={
{
53, 60,
1035, 0,
964, 218,
660, 218,
391, 1300,
231, 1154,
415, 218,
0, 218,
},
{
716, 290,
1429, 290,
1312, 462,
875, 489,
821, 695,
1148, 712,
1017, 902,
761, 924,
707, 1127,
1106, 1101,
1198, 1300,
465, 1300,
},
{
1516, 287,
2102, 290,
2036, 464,
1598, 465,
1322, 905,
1395, 1102,
1819, 1064,
1743, 1280,
1286, 1310,
1106, 902,
},
{
2179, 290,
2411, 290,
2272, 688,
2674, 666,
2801, 290,
3041, 290,
2693, 1280,
2464, 1280,
2601, 879,
2199, 897,
2056, 1280,
1828, 1280,
},
{
3123, 290,
3480, 290,
3496, 480,
3664, 290,
4017, 294,
3682, 1280,
3453, 1280,
3697, 578,
3458, 843,
3304, 842,
3251, 561,
3001, 1280,
2779, 1280,
},
{
4088, 290,
4677, 290,
4599, 501,
4426, 502,
4219, 1069,
4388, 1070,
4317, 1280,
3753, 1280,
3822, 1068,
3978, 1068,
4194, 504,
4016, 504,
},
{
4747, 290,
4978, 295,
4921, 464,
5186, 850,
5366, 290,
5599, 295,
5288, 1280,
5051, 1280,
5106, 1102,
4836, 709,
4641, 1280,
4406, 1280,
},
{
5814, 290,
6370, 295,
6471, 415,
6238, 1156,
6058, 1280,
5507, 1280,
5404, 1154,
5635, 416,
-- 5814, 290,
-- 5878, 463,
5770, 542,
5617, 1030,
5676, 1105,
5995, 1106,
6100, 1029,
6255, 541,
6199, 465,
5878, 463,
},
}
for _,C in next,title do
for i=1,#C do
C[i]=C[i]*.1626
end
end
end
do--title_fan
title_fan={}
local sin,cos=math.sin,math.cos
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
title_fan={}
local sin,cos=math.sin,math.cos
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
end
do--missionEnum
missionEnum={
_1=01,_2=02,_3=03,_4=04,
A1=05,A2=06,A3=07,A4=08,
PC=09,
Z1=11,Z2=12,Z3=13,
S1=21,S2=22,S3=23,
J1=31,J2=32,J3=33,
L1=41,L2=42,L3=43,
T1=51,T2=52,T3=53,
O1=61,O2=62,O3=63,O4=64,
I1=71,I2=72,I3=73,I4=74,
}
local L={}
for k,v in next,missionEnum do L[v]=k end
for k,v in next,L do missionEnum[k]=v end
missionEnum={
_1=01,_2=02,_3=03,_4=04,
A1=05,A2=06,A3=07,A4=08,
PC=09,
Z1=11,Z2=12,Z3=13,
S1=21,S2=22,S3=23,
J1=31,J2=32,J3=33,
L1=41,L2=42,L3=43,
T1=51,T2=52,T3=53,
O1=61,O2=62,O3=63,O4=64,
I1=71,I2=72,I3=73,I4=74,
}
local L={}
for k,v in next,missionEnum do L[v]=k end
for k,v in next,L do missionEnum[k]=v end
end
do--drawableText
local function T(s,t)return love.graphics.newText(getFont(s),t)end
drawableText={
modeName=T(30),
local function T(s,t)return love.graphics.newText(getFont(s),t)end
drawableText={
modeName=T(30),
win=T(120),
lose=T(120),
win=T(120),
lose=T(120),
finish=T(90),
gamewin=T(90),
gameover=T(90),
pause=T(90),
finish=T(90),
gamewin=T(90),
gameover=T(90),
pause=T(90),
speedLV=T(20),
piece=T(25),line=T(25),atk=T(20),eff=T(20),
rpm=T(35),tsd=T(35),
grade=T(25),techrash=T(25),
wave=T(30),nextWave=T(30),
combo=T(20),maxcmb=T(20),
pc=T(20),ko=T(25),
speedLV=T(20),
piece=T(25),line=T(25),atk=T(20),eff=T(20),
rpm=T(35),tsd=T(35),
grade=T(25),techrash=T(25),
wave=T(30),nextWave=T(30),
combo=T(20),maxcmb=T(20),
pc=T(20),ko=T(25),
noScore=T(45),highScore=T(30),modeLocked=T(45),
}
noScore=T(45),highScore=T(30),modeLocked=T(45),
}
end
do--BLOCKS
local O,_=true,false
BLOCKS={
--Tetromino
{{_,O,O},{O,O,_}}, --Z
{{O,O,_},{_,O,O}}, --S
{{O,O,O},{O,_,_}}, --J
{{O,O,O},{_,_,O}}, --L
{{O,O,O},{_,O,_}}, --T
{{O,O},{O,O}}, --O
{{O,O,O,O}}, --I
local O,_=true,false
BLOCKS={
--Tetromino
{{_,O,O},{O,O,_}},--Z
{{O,O,_},{_,O,O}},--S
{{O,O,O},{O,_,_}},--J
{{O,O,O},{_,_,O}},--L
{{O,O,O},{_,O,_}},--T
{{O,O},{O,O}}, --O
{{O,O,O,O}}, --I
--Pentomino
{{_,O,O},{_,O,_},{O,O,_}}, --Z5
{{O,O,_},{_,O,_},{_,O,O}}, --S5
{{O,O,O},{O,O,_}}, --P
{{O,O,O},{_,O,O}}, --Q
{{_,O,_},{O,O,O},{O,_,_}}, --F
{{_,O,_},{O,O,O},{_,_,O}}, --E
{{O,O,O},{_,O,_},{_,O,_}}, --T5
{{O,O,O},{O,_,O}}, --U
{{O,O,O},{_,_,O},{_,_,O}}, --V
{{_,O,O},{O,O,_},{O,_,_}}, --W
{{_,O,_},{O,O,O},{_,O,_}}, --X
{{O,O,O,O},{O,_,_,_}}, --J5
{{O,O,O,O},{_,_,_,O}}, --L5
{{O,O,O,O},{_,O,_,_}}, --R
{{O,O,O,O},{_,_,O,_}}, --Y
{{_,O,O,O},{O,O,_,_}}, --N
{{O,O,O,_},{_,_,O,O}}, --H
{{O,O,O,O,O}}, --I5
--Pentomino
{{_,O,O},{_,O,_},{O,O,_}},--Z5
{{O,O,_},{_,O,_},{_,O,O}},--S5
{{O,O,O},{O,O,_}}, --P
{{O,O,O},{_,O,O}}, --Q
{{_,O,_},{O,O,O},{O,_,_}},--F
{{_,O,_},{O,O,O},{_,_,O}},--E
{{O,O,O},{_,O,_},{_,O,_}},--T5
{{O,O,O},{O,_,O}}, --U
{{O,O,O},{_,_,O},{_,_,O}},--V
{{_,O,O},{O,O,_},{O,_,_}},--W
{{_,O,_},{O,O,O},{_,O,_}},--X
{{O,O,O,O},{O,_,_,_}}, --J5
{{O,O,O,O},{_,_,_,O}}, --L5
{{O,O,O,O},{_,O,_,_}}, --R
{{O,O,O,O},{_,_,O,_}}, --Y
{{_,O,O,O},{O,O,_,_}}, --N
{{O,O,O,_},{_,_,O,O}}, --H
{{O,O,O,O,O}}, --I5
--Trimino
{{O,O,O}}, --I3
{{O,O},{_,O}}, --C
--Trimino
{{O,O,O}}, --I3
{{O,O},{_,O}},--C
--Domino
{{O,O}}, --I2
--Domino
{{O,O}},--I2
--Dot
{{O}}, --O1
}
local function _RotCW(B)
local N={}
local r,c=#B,#B[1]--row,col
for x=1,c do
N[x]={}
for y=1,r do
N[x][y]=B[y][c-x+1]
end
end
return N
end
for i=1,#BLOCKS do
local B=BLOCKS[i]
BLOCKS[i]={[0]=B}
for j=1,3 do
B=_RotCW(B)
BLOCKS[i][j]=B
end
end
--Dot
{{O}},--O1
}
local function _RotCW(B)
local N={}
local r,c=#B,#B[1]--row,col
for x=1,c do
N[x]={}
for y=1,r do
N[x][y]=B[y][c-x+1]
end
end
return N
end
for i=1,#BLOCKS do
local B=BLOCKS[i]
BLOCKS[i]={[0]=B}
for j=1,3 do
B=_RotCW(B)
BLOCKS[i][j]=B
end
end
end
oldModeNameTable={
attacker_hard="attacker_h",
attacker_ultimate="attacker_u",
blind_easy="blind_e",
blind_hard="blind_h",
blind_lunatic="blind_l",
blind_normal="blind_n",
blind_ultimate="blind_u",
c4wtrain_lunatic="c4wtrain_l",
c4wtrain_normal="c4wtrain_n",
defender_lunatic="defender_l",
defender_normal="defender_n",
dig_100="dig_100l",
dig_10="dig_10l",
dig_400="dig_400l",
dig_40="dig_40l",
dig_hard="dig_h",
dig_ultimate="dig_u",
drought_lunatic="drought_l",
drought_normal="drought_n",
marathon_hard="marathon_h",
marathon_normal="marathon_n",
pcchallenge_hard="pc_h",
pcchallenge_lunatic="pc_l",
pcchallenge_normal="pc_n",
pctrain_lunatic="pctrain_l",
pctrain_normal="pctrain_n",
round_1="round_e",
round_2="round_h",
round_3="round_l",
round_4="round_n",
round_5="round_u",
solo_1="solo_e",
solo_2="solo_h",
solo_3="solo_l",
solo_4="solo_n",
solo_5="solo_u",
sprint_10="sprint_10l",
sprint_20="sprint_20l",
sprint_40="sprint_40l",
sprint_400="sprint_400l",
sprint_100="sprint_100l",
sprint_1000="sprint_1000l",
survivor_easy="survivor_e",
survivor_hard="survivor_h",
survivor_lunatic="survivor_l",
survivor_normal="survivor_n",
survivor_ultimate="survivor_u",
tech_finesse2="tech_finesse_f",
tech_hard2="tech_h_plus",
tech_hard="tech_h",
tech_lunatic2="tech_l_plus",
tech_lunatic="tech_l",
tech_normal2="tech_n_plus",
tech_normal="tech_n",
techmino49_easy="techmino49_e",
techmino49_hard="techmino49_h",
techmino49_ultimate="techmino49_u",
techmino99_easy="techmino99_e",
techmino99_hard="techmino99_h",
techmino99_ultimate="techmino99_u",
tsd_easy="tsd_e",
tsd_hard="tsd_h",
tsd_ultimate="tsd_u",
GM="master_ex",
master_beginner="master_l",
master_advance="master_u",
master_phantasm="master_ph",
master_extra="master_ex",
attacker_hard="attacker_h",
attacker_ultimate="attacker_u",
blind_easy="blind_e",
blind_hard="blind_h",
blind_lunatic="blind_l",
blind_normal="blind_n",
blind_ultimate="blind_u",
c4wtrain_lunatic="c4wtrain_l",
c4wtrain_normal="c4wtrain_n",
defender_lunatic="defender_l",
defender_normal="defender_n",
dig_100="dig_100l",
dig_10="dig_10l",
dig_400="dig_400l",
dig_40="dig_40l",
dig_hard="dig_h",
dig_ultimate="dig_u",
drought_lunatic="drought_l",
drought_normal="drought_n",
marathon_hard="marathon_h",
marathon_normal="marathon_n",
pcchallenge_hard="pc_h",
pcchallenge_lunatic="pc_l",
pcchallenge_normal="pc_n",
pctrain_lunatic="pctrain_l",
pctrain_normal="pctrain_n",
round_1="round_e",
round_2="round_h",
round_3="round_l",
round_4="round_n",
round_5="round_u",
solo_1="solo_e",
solo_2="solo_h",
solo_3="solo_l",
solo_4="solo_n",
solo_5="solo_u",
sprint_10="sprint_10l",
sprint_20="sprint_20l",
sprint_40="sprint_40l",
sprint_400="sprint_400l",
sprint_100="sprint_100l",
sprint_1000="sprint_1000l",
survivor_easy="survivor_e",
survivor_hard="survivor_h",
survivor_lunatic="survivor_l",
survivor_normal="survivor_n",
survivor_ultimate="survivor_u",
tech_finesse2="tech_finesse_f",
tech_hard2="tech_h_plus",
tech_hard="tech_h",
tech_lunatic2="tech_l_plus",
tech_lunatic="tech_l",
tech_normal2="tech_n_plus",
tech_normal="tech_n",
techmino49_easy="techmino49_e",
techmino49_hard="techmino49_h",
techmino49_ultimate="techmino49_u",
techmino99_easy="techmino99_e",
techmino99_hard="techmino99_h",
techmino99_ultimate="techmino99_u",
tsd_easy="tsd_e",
tsd_hard="tsd_h",
tsd_ultimate="tsd_u",
GM="master_ex",
master_beginner="master_l",
master_advance="master_u",
master_phantasm="master_ph",
master_extra="master_ex",
}
rankColor={
{.6,.3,.3},
{.7,.5,.3},
{.9,.7,.5},
{.6,.9,1},
{.95,.95,.5},
{.6,.3,.3},
{.7,.5,.3},
{.9,.7,.5},
{.6,.9,1},
{.95,.95,.5},
}
minoColor={
COLOR.R,COLOR.F,COLOR.O,COLOR.Y,COLOR.L,COLOR.J,COLOR.G,COLOR.A,
COLOR.C,COLOR.N,COLOR.S,COLOR.B,COLOR.V,COLOR.P,COLOR.M,COLOR.W,
COLOR.dH,COLOR.D,COLOR.lY,COLOR.H,COLOR.lH,COLOR.dV,COLOR.dR,COLOR.dG,
COLOR.R,COLOR.F,COLOR.O,COLOR.Y,COLOR.L,COLOR.J,COLOR.G,COLOR.A,
COLOR.C,COLOR.N,COLOR.S,COLOR.B,COLOR.V,COLOR.P,COLOR.M,COLOR.W,
COLOR.dH,COLOR.D,COLOR.lY,COLOR.H,COLOR.lH,COLOR.dV,COLOR.dR,COLOR.dG,
}

View File

@@ -1,132 +1,132 @@
return{
{name='sprint_10l', x=0, y=0, size=40,shape=1,icon="sprint1", unlock={'sprint_20l','sprint_40l'}},
{name='sprint_20l', x=-200, y=200, size=50,shape=1,icon="sprint1"},
{name='sprint_40l', x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={'dig_10l','sprint_100l','marathon_n','sprintPenta','sprintMPH','stack_e'}},
{name='sprint_100l', x=-200, y=0, size=50,shape=1,icon="sprint2", unlock={'sprint_400l','drought_n'}},
{name='sprint_400l', x=-400, y=0, size=40,shape=1,icon="sprint3", unlock={'sprint_1000l'}},
{name='sprint_1000l', x=-600, y=0, size=40,shape=1,icon="sprint3"},
{name='sprint_10l', x=0, y=0, size=40,shape=1,icon="sprint1", unlock={'sprint_20l','sprint_40l'}},
{name='sprint_20l', x=-200, y=200, size=50,shape=1,icon="sprint1"},
{name='sprint_40l', x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={'dig_10l','sprint_100l','marathon_n','sprintPenta','sprintMPH','stack_e'}},
{name='sprint_100l', x=-200, y=0, size=50,shape=1,icon="sprint2", unlock={'sprint_400l','drought_n'}},
{name='sprint_400l', x=-400, y=0, size=40,shape=1,icon="sprint3", unlock={'sprint_1000l'}},
{name='sprint_1000l', x=-600, y=0, size=40,shape=1,icon="sprint3"},
{name='sprintPenta', x=210, y=-370, size=40,shape=3,icon="tech"},
{name='sprintMPH', x=210, y=-230, size=40,shape=3,icon="tech"},
{name='sprintPenta', x=210, y=-370, size=40,shape=3,icon="tech"},
{name='sprintMPH', x=210, y=-230, size=40,shape=3,icon="tech"},
{name='drought_n', x=-400, y=200, size=40,shape=1,icon="drought", unlock={'drought_l'}},
{name='drought_l', x=-600, y=200, size=40,shape=1,icon="drought"},
{name='drought_n', x=-400, y=200, size=40,shape=1,icon="drought", unlock={'drought_l'}},
{name='drought_l', x=-600, y=200, size=40,shape=1,icon="drought"},
{name='stack_e', x=-200, y=-400, size=40,shape=1,icon="mess", unlock={'stack_h'}},
{name='stack_h', x=-400, y=-400, size=40,shape=1,icon="mess", unlock={'stack_u'}},
{name='stack_u', x=-600, y=-400, size=40,shape=1,icon="mess"},
{name='stack_e', x=-200, y=-400, size=40,shape=1,icon="mess", unlock={'stack_h'}},
{name='stack_h', x=-400, y=-400, size=40,shape=1,icon="mess", unlock={'stack_u'}},
{name='stack_u', x=-600, y=-400, size=40,shape=1,icon="mess"},
{name='dig_10l', x=-200, y=-200, size=40,shape=1,icon="dig_sprint",unlock={'dig_40l'}},
{name='dig_40l', x=-400, y=-200, size=40,shape=1,icon="dig_sprint",unlock={'dig_100l'}},
{name='dig_100l', x=-600, y=-200, size=40,shape=1,icon="dig_sprint",unlock={'dig_400l'}},
{name='dig_400l', x=-800, y=-200, size=40,shape=1,icon="dig_sprint"},
{name='dig_10l', x=-200, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_40l'}},
{name='dig_40l', x=-400, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_100l'}},
{name='dig_100l', x=-600, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_400l'}},
{name='dig_400l', x=-800, y=-200, size=40,shape=1,icon="dig_sprint"},
{name='marathon_n', x=0, y=-600, size=60,shape=1,icon="marathon",unlock={'marathon_h','rhythm_e','solo_e','round_e','blind_e','classic_fast','survivor_e','bigbang','zen'}},
{name='marathon_h', x=0, y=-800, size=50,shape=1,icon="marathon",unlock={'master_n'}},
{name='marathon_n', x=0, y=-600, size=60,shape=1,icon="marathon", unlock={'marathon_h','rhythm_e','solo_e','round_e','blind_e','classic_fast','survivor_e','bigbang','zen'}},
{name='marathon_h', x=0, y=-800, size=50,shape=1,icon="marathon", unlock={'master_n'}},
{name='solo_e', x=-600, y=-1000,size=40,shape=1,icon="solo", unlock={'solo_n'}},
{name='solo_n', x=-800, y=-1000,size=40,shape=1,icon="solo", unlock={'solo_h'}},
{name='solo_h', x=-1000,y=-1000,size=40,shape=1,icon="solo", unlock={'solo_l','techmino49_e'}},
{name='solo_l', x=-1200,y=-1000,size=40,shape=1,icon="solo", unlock={'solo_u'}},
{name='solo_u', x=-1400,y=-1000,size=40,shape=1,icon="solo"},
{name='solo_e', x=-600, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_n'}},
{name='solo_n', x=-800, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_h'}},
{name='solo_h', x=-1000, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_l','techmino49_e'}},
{name='solo_l', x=-1200, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_u'}},
{name='solo_u', x=-1400, y=-1000, size=40,shape=1,icon="solo"},
{name='techmino49_e', x=-1100,y=-1200,size=40,shape=1,icon="t49", unlock={'techmino49_h','techmino99_e'}},
{name='techmino49_h', x=-1100,y=-1400,size=40,shape=1,icon="t49", unlock={'techmino49_u'}},
{name='techmino49_u', x=-1100,y=-1600,size=40,shape=1,icon="t49"},
{name='techmino99_e', x=-1300,y=-1400,size=40,shape=1,icon="t99", unlock={'techmino99_h'}},
{name='techmino99_h', x=-1300,y=-1600,size=40,shape=1,icon="t99", unlock={'techmino99_u'}},
{name='techmino99_u', x=-1300,y=-1800,size=40,shape=1,icon="t99"},
{name='techmino49_e', x=-1100, y=-1200, size=40,shape=1,icon="t49", unlock={'techmino49_h','techmino99_e'}},
{name='techmino49_h', x=-1100, y=-1400, size=40,shape=1,icon="t49", unlock={'techmino49_u'}},
{name='techmino49_u', x=-1100, y=-1600, size=40,shape=1,icon="t49"},
{name='techmino99_e', x=-1300, y=-1400, size=40,shape=1,icon="t99", unlock={'techmino99_h'}},
{name='techmino99_h', x=-1300, y=-1600, size=40,shape=1,icon="t99", unlock={'techmino99_u'}},
{name='techmino99_u', x=-1300, y=-1800, size=40,shape=1,icon="t99"},
{name='round_e', x=-600, y=-800, size=40,shape=1,icon="round", unlock={'round_n'}},
{name='round_n', x=-800, y=-800, size=40,shape=1,icon="round", unlock={'round_h'}},
{name='round_h', x=-1000,y=-800, size=40,shape=1,icon="round", unlock={'round_l'}},
{name='round_l', x=-1200,y=-800, size=40,shape=1,icon="round", unlock={'round_u'}},
{name='round_u', x=-1400,y=-800, size=40,shape=1,icon="round"},
{name='round_e', x=-600, y=-800, size=40,shape=1,icon="round", unlock={'round_n'}},
{name='round_n', x=-800, y=-800, size=40,shape=1,icon="round", unlock={'round_h'}},
{name='round_h', x=-1000, y=-800, size=40,shape=1,icon="round", unlock={'round_l'}},
{name='round_l', x=-1200, y=-800, size=40,shape=1,icon="round", unlock={'round_u'}},
{name='round_u', x=-1400, y=-800, size=40,shape=1,icon="round"},
{name='master_n', x=0, y=-1000,size=40,shape=1,icon="master", unlock={'master_h'}},
{name='master_h', x=0, y=-1200,size=40,shape=3,icon="master", unlock={'master_final','master_ex','master_ph'}},
{name='master_final', x=0, y=-1600,size=40,shape=2,icon="master"},
{name='master_ph', x=-150, y=-1500,size=40,shape=2,icon="master"},
{name='master_ex', x=150, y=-1500,size=40,shape=2,icon="master_ex"},
{name='master_n', x=0, y=-1000, size=40,shape=1,icon="master", unlock={'master_h'}},
{name='master_h', x=0, y=-1200, size=40,shape=3,icon="master", unlock={'master_final','master_ex','master_ph'}},
{name='master_final', x=0, y=-1600, size=40,shape=2,icon="master"},
{name='master_ph', x=-150, y=-1500, size=40,shape=2,icon="master"},
{name='master_ex', x=150, y=-1500, size=40,shape=2,icon="master_ex"},
{name='rhythm_e', x=-350, y=-1000,size=40,shape=1,icon="rhythm", unlock={'rhythm_h'}},
{name='rhythm_h', x=-350, y=-1200,size=40,shape=3,icon="rhythm", unlock={'rhythm_u'}},
{name='rhythm_u', x=-350, y=-1400,size=40,shape=2,icon="rhythm"},
{name='rhythm_e', x=-350, y=-1000, size=40,shape=1,icon="rhythm", unlock={'rhythm_h'}},
{name='rhythm_h', x=-350, y=-1200, size=40,shape=3,icon="rhythm", unlock={'rhythm_u'}},
{name='rhythm_u', x=-350, y=-1400, size=40,shape=2,icon="rhythm"},
{name='blind_e', x=150, y=-700, size=40,shape=1,icon="hidden", unlock={'blind_n'}},
{name='blind_n', x=150, y=-800, size=40,shape=1,icon="hidden", unlock={'blind_h'}},
{name='blind_h', x=150, y=-900, size=35,shape=1,icon="hidden", unlock={'blind_l'}},
{name='blind_l', x=150, y=-1000,size=35,shape=3,icon="hidden", unlock={'blind_u'}},
{name='blind_u', x=150, y=-1100,size=30,shape=3,icon="hidden", unlock={'blind_wtf'}},
{name='blind_wtf', x=150, y=-1200,size=25,shape=2,icon="hidden"},
{name='blind_e', x=150, y=-700, size=40,shape=1,icon="hidden", unlock={'blind_n'}},
{name='blind_n', x=150, y=-800, size=40,shape=1,icon="hidden", unlock={'blind_h'}},
{name='blind_h', x=150, y=-900, size=35,shape=1,icon="hidden", unlock={'blind_l'}},
{name='blind_l', x=150, y=-1000, size=35,shape=3,icon="hidden", unlock={'blind_u'}},
{name='blind_u', x=150, y=-1100, size=30,shape=3,icon="hidden", unlock={'blind_wtf'}},
{name='blind_wtf', x=150, y=-1200, size=25,shape=2,icon="hidden"},
{name='classic_fast', x=-150, y=-950, size=40,shape=2,icon="classic"},
{name='classic_fast', x=-150, y=-950, size=40,shape=2,icon="classic"},
{name='survivor_e', x=300, y=-600, size=40,shape=1,icon="survivor",unlock={'survivor_n'}},
{name='survivor_n', x=500, y=-600, size=40,shape=1,icon="survivor",unlock={'survivor_h','attacker_h','defender_n','dig_h'}},
{name='survivor_h', x=700, y=-600, size=40,shape=1,icon="survivor",unlock={'survivor_l'}},
{name='survivor_l', x=900, y=-600, size=40,shape=3,icon="survivor",unlock={'survivor_u'}},
{name='survivor_u', x=1100, y=-600, size=40,shape=2,icon="survivor"},
{name='survivor_e', x=300, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_n'}},
{name='survivor_n', x=500, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_h','attacker_h','defender_n','dig_h'}},
{name='survivor_h', x=700, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_l'}},
{name='survivor_l', x=900, y=-600, size=40,shape=3,icon="survivor", unlock={'survivor_u'}},
{name='survivor_u', x=1100, y=-600, size=40,shape=2,icon="survivor"},
{name='attacker_h', x=300, y=-800, size=40,shape=1,icon="attack", unlock={'attacker_u'}},
{name='attacker_u', x=300, y=-1000,size=40,shape=1,icon="attack"},
{name='attacker_h', x=300, y=-800, size=40,shape=1,icon="attack", unlock={'attacker_u'}},
{name='attacker_u', x=300, y=-1000, size=40,shape=1,icon="attack"},
{name='defender_n', x=500, y=-800, size=40,shape=1,icon="defend", unlock={'defender_l'}},
{name='defender_l', x=500, y=-1000,size=40,shape=1,icon="defend"},
{name='defender_n', x=500, y=-800, size=40,shape=1,icon="defend", unlock={'defender_l'}},
{name='defender_l', x=500, y=-1000, size=40,shape=1,icon="defend"},
{name='dig_h', x=700, y=-800, size=40,shape=1,icon="dig", unlock={'dig_u'}},
{name='dig_u', x=700, y=-1000,size=40,shape=1,icon="dig"},
{name='dig_h', x=700, y=-800, size=40,shape=1,icon="dig", unlock={'dig_u'}},
{name='dig_u', x=700, y=-1000, size=40,shape=1,icon="dig"},
{name='bigbang', x=400, y=-400, size=50,shape=1,icon="bigbang", unlock={'c4wtrain_n','pctrain_n','tech_n'}},
{name='c4wtrain_n', x=700, y=-400, size=40,shape=1,icon="pc", unlock={'c4wtrain_l'}},
{name='c4wtrain_l', x=900, y=-400, size=40,shape=1,icon="pc"},
{name='bigbang', x=400, y=-400, size=50,shape=1,icon="bigbang", unlock={'c4wtrain_n','pctrain_n','tech_n'}},
{name='c4wtrain_n', x=700, y=-400, size=40,shape=1,icon="pc", unlock={'c4wtrain_l'}},
{name='c4wtrain_l', x=900, y=-400, size=40,shape=1,icon="pc"},
{name='pctrain_n', x=700, y=-250, size=40,shape=1,icon="pc", unlock={'pctrain_l','pc_n'}},
{name='pctrain_l', x=900, y=-250, size=40,shape=1,icon="pc"},
{name='pctrain_n', x=700, y=-250, size=40,shape=1,icon="pc", unlock={'pctrain_l','pc_n'}},
{name='pctrain_l', x=900, y=-250, size=40,shape=1,icon="pc"},
{name='pc_n', x=800, y=-110, size=40,shape=1,icon="pc", unlock={'pc_h'}},
{name='pc_h', x=950, y=-110, size=40,shape=3,icon="pc", unlock={'pc_l','pc_inf'}},
{name='pc_l', x=1100, y=-110, size=40,shape=3,icon="pc"},
{name='pc_inf', x=1100, y=-250, size=40,shape=2,icon="pc"},
{name='pc_n', x=800, y=-110, size=40,shape=1,icon="pc", unlock={'pc_h'}},
{name='pc_h', x=950, y=-110, size=40,shape=3,icon="pc", unlock={'pc_l','pc_inf'}},
{name='pc_l', x=1100, y=-110, size=40,shape=3,icon="pc"},
{name='pc_inf', x=1100, y=-250, size=40,shape=2,icon="pc"},
{name='tech_n', x=400, y=-110, size=40,shape=1,icon="tech", unlock={'tech_n_plus','tech_h','tech_finesse','sprintAtk'}},
{name='tech_n_plus', x=600, y=160, size=40,shape=3,icon="tech", unlock={'tsd_e','backfire_n'}},
{name='tech_h', x=220, y=120, size=40,shape=1,icon="tech", unlock={'tech_h_plus','tech_l'}},
{name='tech_h_plus', x=20, y=150, size=35,shape=3,icon="tech"},
{name='tech_l', x=220, y=280, size=40,shape=1,icon="tech", unlock={'tech_l_plus'}},
{name='tech_l_plus', x=20, y=310, size=35,shape=3,icon="tech"},
{name='tech_n', x=400, y=-110, size=40,shape=1,icon="tech", unlock={'tech_n_plus','tech_h','tech_finesse','sprintAtk'}},
{name='tech_n_plus', x=600, y=160, size=40,shape=3,icon="tech", unlock={'tsd_e','backfire_n'}},
{name='tech_h', x=220, y=120, size=40,shape=1,icon="tech", unlock={'tech_h_plus','tech_l'}},
{name='tech_h_plus', x=20, y=150, size=35,shape=3,icon="tech"},
{name='tech_l', x=220, y=280, size=40,shape=1,icon="tech", unlock={'tech_l_plus'}},
{name='tech_l_plus', x=20, y=310, size=35,shape=3,icon="tech"},
{name='tech_finesse', x=800, y=50, size=40,shape=1,icon="tech", unlock={'tech_finesse_f'}},
{name='tech_finesse_f', x=1000, y=50, size=40,shape=1,icon="tech"},
{name='tech_finesse', x=800, y=50, size=40,shape=1,icon="tech", unlock={'tech_finesse_f'}},
{name='tech_finesse_f',x=1000, y=50, size=40,shape=1,icon="tech"},
{name='tsd_e', x=800, y=200, size=40,shape=1,icon="tsd", unlock={'tsd_h'}},
{name='tsd_h', x=1000, y=200, size=40,shape=1,icon="tsd", unlock={'tsd_u'}},
{name='tsd_u', x=1200, y=200, size=40,shape=1,icon="tsd"},
{name='tsd_e', x=800, y=200, size=40,shape=1,icon="tsd", unlock={'tsd_h'}},
{name='tsd_h', x=1000, y=200, size=40,shape=1,icon="tsd", unlock={'tsd_u'}},
{name='tsd_u', x=1200, y=200, size=40,shape=1,icon="tsd"},
{name='backfire_n', x=800, y=350, size=40,shape=1,icon="backfire",unlock={'backfire_h'}},
{name='backfire_h', x=950, y=350, size=40,shape=1,icon="backfire",unlock={'backfire_l'}},
{name='backfire_l', x=1100, y=350, size=40,shape=3,icon="backfire",unlock={'backfire_u'}},
{name='backfire_u', x=1250, y=350, size=35,shape=2,icon="backfire"},
{name='backfire_n', x=800, y=350, size=40,shape=1,icon="backfire", unlock={'backfire_h'}},
{name='backfire_h', x=950, y=350, size=40,shape=1,icon="backfire", unlock={'backfire_l'}},
{name='backfire_l', x=1100, y=350, size=40,shape=3,icon="backfire", unlock={'backfire_u'}},
{name='backfire_u', x=1250, y=350, size=35,shape=2,icon="backfire"},
{name='sprintAtk', x=400, y=200, size=40,shape=1,icon="sprint2"},
{name='sprintAtk', x=400, y=200, size=40,shape=1,icon="sprint2"},
{name='zen', x=-800, y=-600, size=40,shape=1,icon="zen", unlock={'ultra','infinite','infinite_dig'}},
{name='ultra', x=-1000,y=-600, size=40,shape=1,icon="ultra"},
{name='infinite', x=-1000,y=-400, size=40,shape=1,icon='infinite'},
{name='infinite_dig', x=-800, y=-400, size=40,shape=1,icon="dig"},
{name='zen', x=-800, y=-600, size=40,shape=1,icon="zen", unlock={'ultra','infinite','infinite_dig'}},
{name='ultra', x=-1000, y=-600, size=40,shape=1,icon="ultra"},
{name='infinite', x=-1000, y=-400, size=40,shape=1,icon='infinite'},
{name='infinite_dig', x=-800, y=-400, size=40,shape=1,icon="dig"},
--Secret
{name='sprintFix'},
{name='sprintLock'},
{name='sprintSmooth'},
{name='marathon_bfmax'},
--Secret
{name='sprintFix'},
{name='sprintLock'},
{name='sprintSmooth'},
{name='marathon_bfmax'},
--Old
{name='master_l'},
{name='master_u'},
--Old
{name='master_l'},
{name='master_u'},
--Special
{name='custom_puzzle'},
{name='custom_clear'},
{name="netBattle"},
--Special
{name='custom_puzzle'},
{name='custom_clear'},
{name="netBattle"},
}

View File

@@ -1,108 +1,108 @@
return{
{
{
{4,4,4,3,3,3,7,0,0,0},
{4,1,6,6,2,3,7,0,0,0},
{1,1,6,6,2,2,7,0,0,0},
{1,7,7,7,7,2,7,0,0,0},
},
{
{4,4,4,3,3,3,0,0,0,7},
{4,1,6,6,2,3,0,0,0,7},
{1,1,6,6,2,2,0,0,0,7},
{1,7,7,7,7,2,0,0,0,7},
},
{
{2,7,7,7,7,1,7,0,0,0},
{2,2,6,6,1,1,7,0,0,0},
{3,2,6,6,1,4,7,0,0,0},
{3,3,3,4,4,4,7,0,0,0},
},
{
{2,7,7,7,7,1,0,0,0,7},
{2,2,6,6,1,1,0,0,0,7},
{3,2,6,6,1,4,0,0,0,7},
{3,3,3,4,4,4,0,0,0,7},
},
},--3*4 shape
{
{
{1,1,0,0,0,0,0,3,3,3},
{5,1,1,0,0,0,0,6,6,3},
{5,5,2,2,0,0,0,6,6,4},
{5,2,2,0,0,0,0,4,4,4},
},
{
{1,1,0,0,0,0,0,4,4,4},
{5,1,1,0,0,0,0,4,6,6},
{5,5,2,2,0,0,0,3,6,6},
{5,2,2,0,0,0,0,3,3,3},
},
{
{3,3,3,1,1,0,0,0,0,0},
{6,6,3,5,1,1,0,0,0,0},
{6,6,4,5,5,2,2,0,0,0},
{4,4,4,5,2,2,0,0,0,0},
},
{
{4,4,4,1,1,0,0,0,0,0},
{4,6,6,5,1,1,0,0,0,0},
{3,6,6,5,5,2,2,0,0,0},
{3,3,3,5,2,2,0,0,0,0},
},
},--7 piece opener(right>)(without i)
{
{
{4,4,4,3,3,3,0,0,0,0},
{4,1,6,6,2,3,0,0,0,0},
{1,1,6,6,2,2,0,0,0,0},
{1,7,7,7,7,2,0,0,0,0},
},
{
{2,7,7,7,7,1,0,0,0,0},
{2,2,6,6,1,1,0,0,0,0},
{3,2,6,6,1,4,0,0,0,0},
{3,3,3,4,4,4,0,0,0,0},
},
},--6 piece opener
{
{
{0,0,0,0,0,1,3,5,6,7},
{0,0,0,0,0,1,3,5,6,7},
{0,0,0,0,0,1,3,5,6,7},
{0,0,0,0,0,1,3,5,6,7},
},
{
{1,0,0,0,0,0,3,5,6,7},
{1,0,0,0,0,0,3,5,6,7},
{1,0,0,0,0,0,3,5,6,7},
{1,0,0,0,0,0,3,5,6,7},
},
{
{1,3,0,0,0,0,0,5,6,7},
{1,3,0,0,0,0,0,5,6,7},
{1,3,0,0,0,0,0,5,6,7},
{1,3,0,0,0,0,0,5,6,7},
},
},--4*5
{
{
{0,0,0,0,0,0,1,3,5,7},
{0,0,0,0,0,0,7,1,3,5},
{0,0,0,0,0,0,5,7,1,3},
{0,0,0,0,0,0,3,5,7,1},
},
{
{7,0,0,0,0,0,0,5,3,1},
{7,0,0,0,0,0,0,5,3,1},
{7,0,0,0,0,0,0,5,3,1},
{7,0,0,0,0,0,0,5,3,1},
},
{
{1,3,0,0,0,0,0,0,6,5},
{5,6,0,0,0,0,0,0,3,1},
{5,7,0,0,0,0,0,0,3,1},
{1,3,0,0,0,0,0,0,7,5},
},
},--4*6
{
{
{4,4,4,3,3,3,7,0,0,0},
{4,1,6,6,2,3,7,0,0,0},
{1,1,6,6,2,2,7,0,0,0},
{1,7,7,7,7,2,7,0,0,0},
},
{
{4,4,4,3,3,3,0,0,0,7},
{4,1,6,6,2,3,0,0,0,7},
{1,1,6,6,2,2,0,0,0,7},
{1,7,7,7,7,2,0,0,0,7},
},
{
{2,7,7,7,7,1,7,0,0,0},
{2,2,6,6,1,1,7,0,0,0},
{3,2,6,6,1,4,7,0,0,0},
{3,3,3,4,4,4,7,0,0,0},
},
{
{2,7,7,7,7,1,0,0,0,7},
{2,2,6,6,1,1,0,0,0,7},
{3,2,6,6,1,4,0,0,0,7},
{3,3,3,4,4,4,0,0,0,7},
},
},--3*4 shape
{
{
{1,1,0,0,0,0,0,3,3,3},
{5,1,1,0,0,0,0,6,6,3},
{5,5,2,2,0,0,0,6,6,4},
{5,2,2,0,0,0,0,4,4,4},
},
{
{1,1,0,0,0,0,0,4,4,4},
{5,1,1,0,0,0,0,4,6,6},
{5,5,2,2,0,0,0,3,6,6},
{5,2,2,0,0,0,0,3,3,3},
},
{
{3,3,3,1,1,0,0,0,0,0},
{6,6,3,5,1,1,0,0,0,0},
{6,6,4,5,5,2,2,0,0,0},
{4,4,4,5,2,2,0,0,0,0},
},
{
{4,4,4,1,1,0,0,0,0,0},
{4,6,6,5,1,1,0,0,0,0},
{3,6,6,5,5,2,2,0,0,0},
{3,3,3,5,2,2,0,0,0,0},
},
},--7 piece opener(right>)(without i)
{
{
{4,4,4,3,3,3,0,0,0,0},
{4,1,6,6,2,3,0,0,0,0},
{1,1,6,6,2,2,0,0,0,0},
{1,7,7,7,7,2,0,0,0,0},
},
{
{2,7,7,7,7,1,0,0,0,0},
{2,2,6,6,1,1,0,0,0,0},
{3,2,6,6,1,4,0,0,0,0},
{3,3,3,4,4,4,0,0,0,0},
},
},--6 piece opener
{
{
{0,0,0,0,0,1,3,5,6,7},
{0,0,0,0,0,1,3,5,6,7},
{0,0,0,0,0,1,3,5,6,7},
{0,0,0,0,0,1,3,5,6,7},
},
{
{1,0,0,0,0,0,3,5,6,7},
{1,0,0,0,0,0,3,5,6,7},
{1,0,0,0,0,0,3,5,6,7},
{1,0,0,0,0,0,3,5,6,7},
},
{
{1,3,0,0,0,0,0,5,6,7},
{1,3,0,0,0,0,0,5,6,7},
{1,3,0,0,0,0,0,5,6,7},
{1,3,0,0,0,0,0,5,6,7},
},
},--4*5
{
{
{0,0,0,0,0,0,1,3,5,7},
{0,0,0,0,0,0,7,1,3,5},
{0,0,0,0,0,0,5,7,1,3},
{0,0,0,0,0,0,3,5,7,1},
},
{
{7,0,0,0,0,0,0,5,3,1},
{7,0,0,0,0,0,0,5,3,1},
{7,0,0,0,0,0,0,5,3,1},
{7,0,0,0,0,0,0,5,3,1},
},
{
{1,3,0,0,0,0,0,0,6,5},
{5,6,0,0,0,0,0,0,3,1},
{5,7,0,0,0,0,0,0,3,1},
{1,3,0,0,0,0,0,0,7,5},
},
},--4*6
}

File diff suppressed because one or more lines are too long

View File

@@ -1,58 +1,58 @@
return{
color=COLOR.magenta,
env={
drop=30,lock=60,
fall=12,
freshLimit=15,
pushSpeed=2,
task=function(P)
while true do
YIELD()
if P.control and P.atkBufferSum==0 then
local D=P.modeData
if D.wave<20 then
local t=1500-30*D.wave--1500~900
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=12,countdown=t,cd0=t,time=0,sent=false,lv=3})
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=10,countdown=t,cd0=t,time=0,sent=false,lv=4})
else
local t=900-10*(D.wave-20)--900~600
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=4})
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=8,countdown=t,cd0=t,time=0,sent=false,lv=5})
end
P.atkBufferSum=P.atkBufferSum+22
P.stat.recv=P.stat.recv+22
D.wave=D.wave+1
if D.wave%10==0 then
if D.wave==20 then
P:showTextF(text.great,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=3
elseif D.wave==50 then
P:showTextF(text.maxspeed,0,-140,100,'appear',.6)
end
end
end
end
end,
bg='rainbow2',bgm='shining terminal',
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,63,200)
mStr("22",63,320)
mText(drawableText.wave,63,260)
mText(drawableText.nextWave,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=50 and 5 or
W>=40 and 4 or
W>=30 and 3 or
W>=20 and 2 or
W>=10 and 1 or
W>=5 and 0
end,
color=COLOR.magenta,
env={
drop=30,lock=60,
fall=12,
freshLimit=15,
pushSpeed=2,
task=function(P)
while true do
YIELD()
if P.control and P.atkBufferSum==0 then
local D=P.modeData
if D.wave<20 then
local t=1500-30*D.wave--1500~900
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=12,countdown=t,cd0=t,time=0,sent=false,lv=3})
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=10,countdown=t,cd0=t,time=0,sent=false,lv=4})
else
local t=900-10*(D.wave-20)--900~600
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=4})
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=8,countdown=t,cd0=t,time=0,sent=false,lv=5})
end
P.atkBufferSum=P.atkBufferSum+22
P.stat.recv=P.stat.recv+22
D.wave=D.wave+1
if D.wave%10==0 then
if D.wave==20 then
P:showTextF(text.great,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=3
elseif D.wave==50 then
P:showTextF(text.maxspeed,0,-140,100,'appear',.6)
end
end
end
end
end,
bg='rainbow2',bgm='shining terminal',
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,63,200)
mStr("22",63,320)
mText(drawableText.wave,63,260)
mText(drawableText.nextWave,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=50 and 5 or
W>=40 and 4 or
W>=30 and 3 or
W>=20 and 2 or
W>=10 and 1 or
W>=5 and 0
end,
}

View File

@@ -1,66 +1,66 @@
return{
color=COLOR.lYellow,
env={
drop=5,lock=60,
fall=8,
freshLimit=15,
task=function(P)
while true do
YIELD()
if P.control and P.atkBufferSum<4 then
local D=P.modeData
local s
local t=800-10*D.wave--800~700~600~500
if D.wave<10 then
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(5,6)),amount=9,countdown=t,cd0=t,time=0,sent=false,lv=3})
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=11,countdown=t,cd0=t+62,time=0,sent=false,lv=4})
s=20
elseif D.wave<20 then
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=11,countdown=t,cd0=t,time=0,sent=false,lv=4})
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=13,countdown=t,cd0=t+62,time=0,sent=false,lv=5})
s=24
else
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(2)*9-8),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=5})
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=14,countdown=t+62,cd0=t,time=0,sent=false,lv=5})
s=28
end
P.atkBufferSum=P.atkBufferSum+s
P.stat.recv=P.stat.recv+s
D.wave=D.wave+1
if D.wave%10==0 then
if D.wave==10 then
P:showTextF(text.great,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=4
elseif D.wave==20 then
P:showTextF(text.awesome,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=5
elseif D.wave==30 then
P:showTextF(text.maxspeed,0,-140,100,'appear',.6)
end
end
end
end
end,
bg='rainbow2',bgm='shining terminal',
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,63,200)
mStr(20+4*math.min(math.floor(P.modeData.wave/10),2),63,320)
mText(drawableText.wave,63,260)
mText(drawableText.nextWave,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=50 and 5 or
W>=40 and 4 or
W>=30 and 3 or
W>=20 and 2 or
W>=10 and 1 or
W>=5 and 0
end,
color=COLOR.lYellow,
env={
drop=5,lock=60,
fall=8,
freshLimit=15,
task=function(P)
while true do
YIELD()
if P.control and P.atkBufferSum<4 then
local D=P.modeData
local s
local t=800-10*D.wave--800~700~600~500
if D.wave<10 then
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(5,6)),amount=9,countdown=t,cd0=t,time=0,sent=false,lv=3})
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=11,countdown=t,cd0=t+62,time=0,sent=false,lv=4})
s=20
elseif D.wave<20 then
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=11,countdown=t,cd0=t,time=0,sent=false,lv=4})
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=13,countdown=t,cd0=t+62,time=0,sent=false,lv=5})
s=24
else
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(2)*9-8),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=5})
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=14,countdown=t+62,cd0=t,time=0,sent=false,lv=5})
s=28
end
P.atkBufferSum=P.atkBufferSum+s
P.stat.recv=P.stat.recv+s
D.wave=D.wave+1
if D.wave%10==0 then
if D.wave==10 then
P:showTextF(text.great,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=4
elseif D.wave==20 then
P:showTextF(text.awesome,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=5
elseif D.wave==30 then
P:showTextF(text.maxspeed,0,-140,100,'appear',.6)
end
end
end
end
end,
bg='rainbow2',bgm='shining terminal',
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,63,200)
mStr(20+4*math.min(math.floor(P.modeData.wave/10),2),63,320)
mText(drawableText.wave,63,260)
mText(drawableText.nextWave,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=50 and 5 or
W>=40 and 4 or
W>=30 and 3 or
W>=20 and 2 or
W>=10 and 1 or
W>=5 and 0
end,
}

View File

@@ -1,39 +1,39 @@
return{
color=COLOR.magenta,
env={
drop=10,lock=60,
freshLimit=15,
dropPiece=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,60,generateLine(P.holeRND:random(10)))
end
if P.stat.atk>=100 then
P:win('finish')
end
end,
bg='tunnel',bgm='echo',
},
mesDisp=function(P)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.atk
if L>=100 then
local T=P.stat.time
return
T<50 and 5 or
T<65 and 4 or
T<100 and 3 or
T<130 and 2 or
1
else
return
L>=50 and 0
end
end,
color=COLOR.magenta,
env={
drop=10,lock=60,
freshLimit=15,
dropPiece=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,60,generateLine(P.holeRND:random(10)))
end
if P.stat.atk>=100 then
P:win('finish')
end
end,
bg='tunnel',bgm='echo',
},
mesDisp=function(P)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.atk
if L>=100 then
local T=P.stat.time
return
T<50 and 5 or
T<65 and 4 or
T<100 and 3 or
T<130 and 2 or
1
else
return
L>=50 and 0
end
end,
}

View File

@@ -1,39 +1,39 @@
return{
color=COLOR.red,
env={
drop=5,lock=45,
freshLimit=15,
dropPiece=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,30,generateLine(P.holeRND:random(10)))
end
if P.stat.atk>=100 then
P:win('finish')
end
end,
bg='blackhole',bgm='echo',
},
mesDisp=function(P)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.atk
if L>=100 then
local T=P.stat.time
return
T<55 and 5 or
T<70 and 4 or
T<110 and 3 or
T<150 and 2 or
1
else
return
L>=50 and 0
end
end,
color=COLOR.red,
env={
drop=5,lock=45,
freshLimit=15,
dropPiece=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,30,generateLine(P.holeRND:random(10)))
end
if P.stat.atk>=100 then
P:win('finish')
end
end,
bg='blackhole',bgm='echo',
},
mesDisp=function(P)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.atk
if L>=100 then
local T=P.stat.time
return
T<55 and 5 or
T<70 and 4 or
T<110 and 3 or
T<150 and 2 or
1
else
return
L>=50 and 0
end
end,
}

View File

@@ -1,38 +1,38 @@
return{
color=COLOR.green,
env={
drop=30,lock=60,
dropPiece=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,120,generateLine(P.holeRND:random(10)))
end
if P.stat.atk>=100 then
P:win('finish')
end
end,
bg='tunnel',bgm='echo',
},
mesDisp=function(P)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.atk
if L>=100 then
local T=P.stat.time
return
T<45 and 5 or
T<60 and 4 or
T<90 and 3 or
T<120 and 2 or
1
else
return
L>=50 and 0
end
end,
color=COLOR.green,
env={
drop=30,lock=60,
dropPiece=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,120,generateLine(P.holeRND:random(10)))
end
if P.stat.atk>=100 then
P:win('finish')
end
end,
bg='tunnel',bgm='echo',
},
mesDisp=function(P)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.atk
if L>=100 then
local T=P.stat.time
return
T<45 and 5 or
T<60 and 4 or
T<90 and 3 or
T<120 and 2 or
1
else
return
L>=50 and 0
end
end,
}

View File

@@ -1,39 +1,39 @@
return{
color=COLOR.lYellow,
env={
drop=2,lock=30,
freshLimit=10,
dropPiece=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,0,generateLine(P.holeRND:random(10)))
end
if P.stat.atk>=100 then
P:win('finish')
end
end,
bg='blackhole',bgm='echo',
},
mesDisp=function(P)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.atk
if L>=100 then
local T=P.stat.time
return
T<60 and 5 or
T<80 and 4 or
T<120 and 3 or
T<180 and 2 or
1
else
return
L>=50 and 0
end
end,
color=COLOR.lYellow,
env={
drop=2,lock=30,
freshLimit=10,
dropPiece=function(P)
if P.lastPiece.atk>0 then
P:receive(nil,P.lastPiece.atk,0,generateLine(P.holeRND:random(10)))
end
if P.stat.atk>=100 then
P:win('finish')
end
end,
bg='blackhole',bgm='echo',
},
mesDisp=function(P)
setFont(60)
mStr(P.stat.atk,63,280)
mText(drawableText.atk,63,350)
end,
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.atk
if L>=100 then
local T=P.stat.time
return
T<60 and 5 or
T<80 and 4 or
T<120 and 3 or
T<180 and 2 or
1
else
return
L>=50 and 0
end
end,
}

View File

@@ -1,19 +1,19 @@
return{
color=COLOR.lGray,
env={
drop=1e99,lock=1e99,
holdCount=0,
task=function(P)
while not P.control do YIELD()end
P:pressKey(6)
P:lose()
end,
bg='bg1',bgm='new era',
},
score=function(P)return{P.modeData.event,P.stat.finesseRate*.2/P.stat.piece}end,
scoreDisp=function(D)return("%d Stage %.2f%%"):format(D[1],D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]>b[2]end,
getRank=function()
return 1
end,
color=COLOR.lGray,
env={
drop=1e99,lock=1e99,
holdCount=0,
task=function(P)
while not P.control do YIELD()end
P:pressKey(6)
P:lose()
end,
bg='bg1',bgm='new era',
},
score=function(P)return{P.modeData.event,P.stat.finesseRate*.2/P.stat.piece}end,
scoreDisp=function(D)return("%d Stage %.2f%%"):format(D[1],D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]>b[2]end,
getRank=function()
return 1
end,
}

View File

@@ -1,37 +1,37 @@
local min=math.min
return{
color=COLOR.cyan,
env={
drop=30,lock=45,
visible='easy',
dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end,
freshLimit=10,
bg='glow',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=140 and 5 or
T<=200 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=40 and 1 or
L>=1 and 0
end
end,
color=COLOR.cyan,
env={
drop=30,lock=45,
visible='easy',
dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end,
freshLimit=10,
bg='glow',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=140 and 5 or
T<=200 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=40 and 1 or
L>=1 and 0
end
end,
}

View File

@@ -1,45 +1,45 @@
local gc=love.graphics
local min=math.min
return{
color=COLOR.magenta,
env={
drop=15,lock=45,
fall=10,
dropFX=0,lockFX=0,
visible='none',
score=false,
dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end,
freshLimit=15,
bg='rgb',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
PLY.draw.applyField(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
PLY.draw.cancelField(P)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=180 and 5 or
T<=240 and 4 or
3
else
return
L>=150 and 3 or
L>=90 and 2 or
L>=40 and 1 or
L>=1 and 0
end
end,
color=COLOR.magenta,
env={
drop=15,lock=45,
fall=10,
dropFX=0,lockFX=0,
visible='none',
score=false,
dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end,
freshLimit=15,
bg='rgb',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
PLY.draw.applyField(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
PLY.draw.cancelField(P)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=180 and 5 or
T<=240 and 4 or
3
else
return
L>=150 and 3 or
L>=90 and 2 or
L>=40 and 1 or
L>=1 and 0
end
end,
}

View File

@@ -1,46 +1,46 @@
local gc=love.graphics
local min=math.min
return{
color=COLOR.red,
env={
drop=10,lock=60,
fall=5,
ghost=0,
dropFX=0,lockFX=0,
visible='none',
score=false,
dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end,
freshLimit=15,
bg='rgb',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
PLY.draw.applyField(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
PLY.draw.cancelField(P)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=200 and 5 or
T<=250 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=40 and 1 or
L>=1 and 0
end
end,
color=COLOR.red,
env={
drop=10,lock=60,
fall=5,
ghost=0,
dropFX=0,lockFX=0,
visible='none',
score=false,
dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end,
freshLimit=15,
bg='rgb',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
PLY.draw.applyField(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
PLY.draw.cancelField(P)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=200 and 5 or
T<=250 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=40 and 1 or
L>=1 and 0
end
end,
}

View File

@@ -1,42 +1,42 @@
local gc=love.graphics
local min=math.min
return{
color=COLOR.green,
env={
drop=15,lock=45,
freshLimit=10,
visible='fast',
dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end,
bg='glow',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
PLY.draw.applyField(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
PLY.draw.cancelField(P)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=180 and 5 or
T<=220 and 4 or
3
else
return
L>=126 and 3 or
L>=80 and 2 or
L>=40 and 1 or
L>=1 and 0
end
end,
color=COLOR.green,
env={
drop=15,lock=45,
freshLimit=10,
visible='fast',
dropPiece=function(P)if P.stat.row>=200 then P:win('finish')end end,
bg='glow',bgm='push',
},
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
PLY.draw.applyField(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
PLY.draw.cancelField(P)
end,
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=180 and 5 or
T<=220 and 4 or
3
else
return
L>=126 and 3 or
L>=80 and 2 or
L>=40 and 1 or
L>=1 and 0
end
end,
}

View File

@@ -1,39 +1,39 @@
local gc=love.graphics
local min=math.min
return{
color=COLOR.red,
env={
drop=30,lock=60,
block=false,center=0,ghost=0,
dropFX=0,lockFX=0,
visible='none',
score=false,
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
freshLimit=15,
bg='rgb',bgm='far',
},
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
PLY.draw.applyField(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
PLY.draw.cancelField(P)
end,
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=100 and 5 or
L>=75 and 4 or
L>=50 and 3 or
L>=26 and 2 or
L>=10 and 1 or
L>=1 and 0
end,
color=COLOR.red,
env={
drop=30,lock=60,
block=false,center=0,ghost=0,
dropFX=0,lockFX=0,
visible='none',
score=false,
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
freshLimit=15,
bg='rgb',bgm='far',
},
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
PLY.draw.applyField(P)
gc.setColor(1,1,1,.1)
gc.draw(IMG.electric,0,106,0,2.6)
PLY.draw.cancelField(P)
end,
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=100 and 5 or
L>=75 and 4 or
L>=50 and 3 or
L>=26 and 2 or
L>=10 and 1 or
L>=1 and 0
end,
}

View File

@@ -9,65 +9,65 @@ local boarder=GC.DO{334,620,
local gc=love.graphics
local sin,min=math.sin,math.min
return{
color=COLOR.red,
env={
drop=30,lock=60,
nextCount=1,
block=false,center=0,ghost=0,
dropFX=0,lockFX=0,
visible='none',
dropPiece=function(P)if P.stat.row>=40 then P:win('finish')end end,
freshLimit=15,
bg='none',bgm='far',
},
load=function()
PLY.newPlayer(1)
if SETTING.sfx_spawn==0 then
MES.new('warn',text.switchSpawnSFX)
end
end,
mesDisp=function(P,repMode)
if not GAME.result then
gc.push('transform')
if repMode then
gc.origin()
gc.setColor(.3,.3,.3,.7)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
else
gc.clear(.2,.2,.2)
gc.translate(150,0)
gc.setColor(.5,.5,.5)
--Frame
gc.draw(boarder,-17,-12)
end
gc.pop()
end
color=COLOR.red,
env={
drop=30,lock=60,
nextCount=1,
block=false,center=0,ghost=0,
dropFX=0,lockFX=0,
visible='none',
dropPiece=function(P)if P.stat.row>=40 then P:win('finish')end end,
freshLimit=15,
bg='none',bgm='far',
},
load=function()
PLY.newPlayer(1)
if SETTING.sfx_spawn==0 then
MES.new('warn',text.switchSpawnSFX)
end
end,
mesDisp=function(P,repMode)
if not GAME.result then
gc.push('transform')
if repMode then
gc.origin()
gc.setColor(.3,.3,.3,.7)
gc.rectangle('fill',0,0,SCR.w,SCR.h)
else
gc.clear(.2,.2,.2)
gc.translate(150,0)
gc.setColor(.5,.5,.5)
--Frame
gc.draw(boarder,-17,-12)
end
gc.pop()
end
--Figures
local t=TIME()
gc.setColor(1,1,1,.5+.2*sin(t))
gc.draw(IMG.hbm,-276,-86,0,1.5)
gc.draw(IMG.electric,476,152,0,2.6)
--Figures
local t=TIME()
gc.setColor(1,1,1,.5+.2*sin(t))
gc.draw(IMG.hbm,-276,-86,0,1.5)
gc.draw(IMG.electric,476,152,0,2.6)
--Texts
gc.setColor(.8,.8,.8)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
end,
score=function(P)return{min(P.stat.row,40),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=40 and 5 or
L>=30 and 4 or
L>=20 and 3 or
L>=10 and 2 or
L>=5 and 1 or
L>=2 and 0
end,
--Texts
gc.setColor(.8,.8,.8)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
end,
score=function(P)return{min(P.stat.row,40),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=40 and 5 or
L>=30 and 4 or
L>=20 and 3 or
L>=10 and 2 or
L>=5 and 1 or
L>=2 and 0
end,
}

View File

@@ -1,81 +1,81 @@
local rem=table.remove
local function check_c4w(P)
if P.lastPiece.row==0 then
P:lose()
else
for _=1,P.lastPiece.row do
local h=#P.field
P.field[h+1]=FREEROW.get(20)
P.visTime[h+1]=FREEROW.get(20)
for i=4,7 do P.field[h+1][i]=0 end
end
if P.combo>P.modeData.maxCombo then
P.modeData.maxCombo=P.combo
end
if P.stat.row>=100 then
P:win('finish')
end
end
if P.lastPiece.row==0 then
P:lose()
else
for _=1,P.lastPiece.row do
local h=#P.field
P.field[h+1]=FREEROW.get(20)
P.visTime[h+1]=FREEROW.get(20)
for i=4,7 do P.field[h+1][i]=0 end
end
if P.combo>P.modeData.maxCombo then
P.modeData.maxCombo=P.combo
end
if P.stat.row>=100 then
P:win('finish')
end
end
end
return{
color=COLOR.red,
env={
drop=5,lock=30,
task=function(P)P.modeData.maxCombo=0 end,
dropPiece=check_c4w,
freshLimit=15,ospin=false,
bg='rgb',bgm='oxygen',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
local F=P.field
for i=1,24 do
F[i]=FREEROW.get(20)
P.visTime[i]=FREEROW.get(20)
for x=4,7 do F[i][x]=0 end
end
if P.holeRND:random()<.6 then
local initCell={11,14,12,13,21,24}
for _=1,3 do
_=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
else
local initCell={11,12,13,14,21,22,23,24}
rem(initCell,P.holeRND:random(5,8))
rem(initCell,P.holeRND:random(1,4))
for _=1,6 do
_=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
end
end,
mesDisp=function(P)
setFont(45)
mStr(P.combo,63,310)
mStr(P.modeData.maxCombo,63,400)
mText(drawableText.combo,63,358)
mText(drawableText.maxcmb,63,450)
end,
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.modeData.maxCombo
if L==100 then
local T=P.stat.time
return
T<=40 and 5 or
T<=60 and 4 or
3
else
return
L>=70 and 3 or
L>=40 and 2 or
L>=20 and 1 or
L>=5 and 0
end
end,
color=COLOR.red,
env={
drop=5,lock=30,
task=function(P)P.modeData.maxCombo=0 end,
dropPiece=check_c4w,
freshLimit=15,ospin=false,
bg='rgb',bgm='oxygen',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
local F=P.field
for i=1,24 do
F[i]=FREEROW.get(20)
P.visTime[i]=FREEROW.get(20)
for x=4,7 do F[i][x]=0 end
end
if P.holeRND:random()<.6 then
local initCell={11,14,12,13,21,24}
for _=1,3 do
_=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
else
local initCell={11,12,13,14,21,22,23,24}
rem(initCell,P.holeRND:random(5,8))
rem(initCell,P.holeRND:random(1,4))
for _=1,6 do
_=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
end
end,
mesDisp=function(P)
setFont(45)
mStr(P.combo,63,310)
mStr(P.modeData.maxCombo,63,400)
mText(drawableText.combo,63,358)
mText(drawableText.maxcmb,63,450)
end,
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.modeData.maxCombo
if L==100 then
local T=P.stat.time
return
T<=40 and 5 or
T<=60 and 4 or
3
else
return
L>=70 and 3 or
L>=40 and 2 or
L>=20 and 1 or
L>=5 and 0
end
end,
}

View File

@@ -1,79 +1,79 @@
local rem=table.remove
local function check_c4w(P)
if P.lastPiece.row>0 then
for _=1,#P.clearedRow do
local h=#P.field
P.field[h+1]=FREEROW.get(20)
P.visTime[h+1]=FREEROW.get(20)
for i=4,7 do P.field[h+1][i]=0 end
end
if P.combo>P.modeData.maxCombo then
P.modeData.maxCombo=P.combo
end
if P.stat.row>=100 then
P:win('finish')
end
end
if P.lastPiece.row>0 then
for _=1,#P.clearedRow do
local h=#P.field
P.field[h+1]=FREEROW.get(20)
P.visTime[h+1]=FREEROW.get(20)
for i=4,7 do P.field[h+1][i]=0 end
end
if P.combo>P.modeData.maxCombo then
P.modeData.maxCombo=P.combo
end
if P.stat.row>=100 then
P:win('finish')
end
end
end
return{
color=COLOR.green,
env={
drop=30,lock=60,infHold=true,
task=function(P)P.modeData.maxCombo=0 end,
dropPiece=check_c4w,
freshLimit=15,ospin=false,
bg='rgb',bgm='oxygen',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
local F=P.field
for i=1,24 do
F[i]=FREEROW.get(20)
P.visTime[i]=FREEROW.get(20)
for x=4,7 do F[i][x]=0 end
end
if P.holeRND:random()<.6 then
local initCell={11,14,12,13,21,24}
for _=1,3 do
_=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
else
local initCell={11,12,13,14,21,22,23,24}
rem(initCell,P.holeRND:random(5,8))
rem(initCell,P.holeRND:random(1,4))
for _=1,6 do
_=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
end
end,
mesDisp=function(P)
setFont(45)
mStr(P.combo,63,310)
mStr(P.modeData.maxCombo,63,400)
mText(drawableText.combo,63,358)
mText(drawableText.maxcmb,63,450)
end,
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L==100 then
local T=P.stat.time
return
T<=32 and 5 or
T<=50 and 4 or
T<=80 and 3 or
2
else
return
L>=60 and 2 or
L>=30 and 1 or
L>=10 and 0
end
end,
color=COLOR.green,
env={
drop=30,lock=60,infHold=true,
task=function(P)P.modeData.maxCombo=0 end,
dropPiece=check_c4w,
freshLimit=15,ospin=false,
bg='rgb',bgm='oxygen',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
local F=P.field
for i=1,24 do
F[i]=FREEROW.get(20)
P.visTime[i]=FREEROW.get(20)
for x=4,7 do F[i][x]=0 end
end
if P.holeRND:random()<.6 then
local initCell={11,14,12,13,21,24}
for _=1,3 do
_=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
else
local initCell={11,12,13,14,21,22,23,24}
rem(initCell,P.holeRND:random(5,8))
rem(initCell,P.holeRND:random(1,4))
for _=1,6 do
_=rem(initCell,P.holeRND:random(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
end
end,
mesDisp=function(P)
setFont(45)
mStr(P.combo,63,310)
mStr(P.modeData.maxCombo,63,400)
mText(drawableText.combo,63,358)
mText(drawableText.maxcmb,63,450)
end,
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L==100 then
local T=P.stat.time
return
T<=32 and 5 or
T<=50 and 4 or
T<=80 and 3 or
2
else
return
L>=60 and 2 or
L>=30 and 1 or
L>=10 and 0
end
end,
}

View File

@@ -1,55 +1,55 @@
return{
color=COLOR.lBlue,
env={
das=16,arr=6,sddas=2,sdarr=2,
irs=false,ims=false,
center=0,ghost=0,
smooth=false,
drop=3,lock=3,wait=10,fall=25,
fieldH=19,
nextCount=1,holdCount=false,
RS='Classic',
sequence='rnd',
freshLimit=0,
face={0,0,2,2,2,0,0},
noTele=true,keyCancel={5,6},
task=function(P)P.modeData.target=10 end,
dropPiece=function(P)
local D=P.modeData
if P.stat.row>=D.target then
D.target=D.target+10
if D.target==110 then
P.gameEnv.drop,P.gameEnv.lock=2,2
SFX.play('blip_1')
elseif D.target==200 then
P.gameEnv.drop,P.gameEnv.lock=1,1
SFX.play('blip_1')
else
SFX.play('reach')
end
end
end,
bg='rgb',bgm='magicblock',
},
slowMark=true,
mesDisp=function(P)
setFont(75)
local r=P.modeData.target*.1
mStr(r<11 and 18 or r<22 and r+8 or("%02x"):format(r*10-220),63,210)
mText(drawableText.speedLV,63,290)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
end,
score=function(P)return{P.stat.score,P.stat.row}end,
scoreDisp=function(D)return D[1].." "..D[2].." Lines"end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=191 and 4 or
L>=110 and 3 or
L>=50 and 2 or
L>=5 and 1 or
L>=1 and 0
end,
color=COLOR.lBlue,
env={
das=16,arr=6,sddas=2,sdarr=2,
irs=false,ims=false,
center=0,ghost=0,
smooth=false,
drop=3,lock=3,wait=10,fall=25,
fieldH=19,
nextCount=1,holdCount=false,
RS='Classic',
sequence='rnd',
freshLimit=0,
face={0,0,2,2,2,0,0},
noTele=true,keyCancel={5,6},
task=function(P)P.modeData.target=10 end,
dropPiece=function(P)
local D=P.modeData
if P.stat.row>=D.target then
D.target=D.target+10
if D.target==110 then
P.gameEnv.drop,P.gameEnv.lock=2,2
SFX.play('blip_1')
elseif D.target==200 then
P.gameEnv.drop,P.gameEnv.lock=1,1
SFX.play('blip_1')
else
SFX.play('reach')
end
end
end,
bg='rgb',bgm='magicblock',
},
slowMark=true,
mesDisp=function(P)
setFont(75)
local r=P.modeData.target*.1
mStr(r<11 and 18 or r<22 and r+8 or("%02x"):format(r*10-220),63,210)
mText(drawableText.speedLV,63,290)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
end,
score=function(P)return{P.stat.score,P.stat.row}end,
scoreDisp=function(D)return D[1].." "..D[2].." Lines"end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=191 and 4 or
L>=110 and 3 or
L>=50 and 2 or
L>=5 and 1 or
L>=1 and 0
end,
}

View File

@@ -1,80 +1,80 @@
local function notAir(L)
for i=1,10 do
if L[i]>0 then return true end
end
for i=1,10 do
if L[i]>0 then return true end
end
end
local function setField(P,page)
local F=FIELD[page]
local height=0
for y=20,1,-1 do
if notAir(F[y])then
height=y
break
end
end
local t=P.showTime*3
for y=1,height do
local solid=notAir(F[y])
P.field[y]=FREEROW.get(0,solid)
P.visTime[y]=FREEROW.get(t)
if solid then
for x=1,10 do
P.field[y][x]=F[y][x]
end
P.garbageBeneath=P.garbageBeneath+1
end
end
local F=FIELD[page]
local height=0
for y=20,1,-1 do
if notAir(F[y])then
height=y
break
end
end
local t=P.showTime*3
for y=1,height do
local solid=notAir(F[y])
P.field[y]=FREEROW.get(0,solid)
P.visTime[y]=FREEROW.get(t)
if solid then
for x=1,10 do
P.field[y][x]=F[y][x]
end
P.garbageBeneath=P.garbageBeneath+1
end
end
end
local function checkClear(P)
if P.garbageBeneath==0 then
local D=P.modeData
D.finished=D.finished+1
if FIELD[D.finished+1]then
P.waiting=26
for i=#P.field,1,-1 do
FREEROW.discard(P.field[i])
FREEROW.discard(P.visTime[i])
P.field[i],P.visTime[i]=nil
end
setField(P,D.finished+1)
SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.6,.8,.6)
SFX.play('blip_1')
else
P:win('finish')
end
end
if P.garbageBeneath==0 then
local D=P.modeData
D.finished=D.finished+1
if FIELD[D.finished+1]then
P.waiting=26
for i=#P.field,1,-1 do
FREEROW.discard(P.field[i])
FREEROW.discard(P.visTime[i])
P.field[i],P.visTime[i]=nil
end
setField(P,D.finished+1)
SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.6,.8,.6)
SFX.play('blip_1')
else
P:win('finish')
end
end
end
return{
color=COLOR.white,
env={},
load=function()
applyCustomGame()
color=COLOR.white,
env={},
load=function()
applyCustomGame()
for y=1,20 do
if notAir(FIELD[1][y])then
--Switch clear sprint mode on
GAME.modeEnv.dropPiece=checkClear
goto BREAK_clearMode
end
end
GAME.modeEnv.dropPiece=NULL
::BREAK_clearMode::
PLY.newPlayer(1)
local AItype=GAME.modeEnv.opponent:sub(1,2)
local AIlevel=tonumber(GAME.modeEnv.opponent:sub(-1))
if AItype=='9S'then
PLY.newAIPlayer(2,BOT.template{type='9S',speedLV=2*AIlevel,hold=true})
elseif AItype=='CC'then
PLY.newAIPlayer(2,BOT.template{type='CC',speedLV=2*AIlevel-1,next=math.floor(AIlevel*.5+1),hold=true,node=20000+5000*AIlevel})
end
for y=1,20 do
if notAir(FIELD[1][y])then
--Switch clear sprint mode on
GAME.modeEnv.dropPiece=checkClear
goto BREAK_clearMode
end
end
GAME.modeEnv.dropPiece=NULL
::BREAK_clearMode::
PLY.newPlayer(1)
local AItype=GAME.modeEnv.opponent:sub(1,2)
local AIlevel=tonumber(GAME.modeEnv.opponent:sub(-1))
if AItype=='9S'then
PLY.newAIPlayer(2,BOT.template{type='9S',speedLV=2*AIlevel,hold=true})
elseif AItype=='CC'then
PLY.newAIPlayer(2,BOT.template{type='CC',speedLV=2*AIlevel-1,next=math.floor(AIlevel*.5+1),hold=true,node=20000+5000*AIlevel})
end
for _,P in next,PLY_ALIVE do
setField(P,1)
end
end,
mesDisp=function(P)
setFont(55)
mStr(P.stat.row,63,225)
mText(drawableText.line,63,290)
end,
for _,P in next,PLY_ALIVE do
setField(P,1)
end
end,
mesDisp=function(P)
setFont(55)
mStr(P.stat.row,63,225)
mText(drawableText.line,63,290)
end,
}

View File

@@ -1,70 +1,70 @@
local gc=love.graphics
local gc_draw=gc.draw
local function puzzleCheck(P)
local D=P.modeData
local F=FIELD[D.finished+1]
for y=1,20 do
local L=P.field[y]
for x=1,10 do
local a,b=F[y][x],L and L[x]or 0
if a~=0 then
if a==-1 then if b>0 then return end
elseif a<12 then if a~=b then return end
elseif a>7 then if b==0 then return end
end
end
end
end
D.finished=D.finished+1
if FIELD[D.finished+1]then
P.waiting=26
for _=#P.field,1,-1 do
FREEROW.discard(P.field[_])
FREEROW.discard(P.visTime[_])
P.field[_],P.visTime[_]=nil
end
SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.3,1,.3)
SFX.play('reach')
D.showMark=0
else
D.showMark=1
P:win('finish')
end
local D=P.modeData
local F=FIELD[D.finished+1]
for y=1,20 do
local L=P.field[y]
for x=1,10 do
local a,b=F[y][x],L and L[x]or 0
if a~=0 then
if a==-1 then if b>0 then return end
elseif a<12 then if a~=b then return end
elseif a>7 then if b==0 then return end
end
end
end
end
D.finished=D.finished+1
if FIELD[D.finished+1]then
P.waiting=26
for _=#P.field,1,-1 do
FREEROW.discard(P.field[_])
FREEROW.discard(P.visTime[_])
P.field[_],P.visTime[_]=nil
end
SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.3,1,.3)
SFX.play('reach')
D.showMark=0
else
D.showMark=1
P:win('finish')
end
end
return{
color=COLOR.white,
env={
fkey1=function(P)P.modeData.showMark=1-P.modeData.showMark end,
dropPiece=puzzleCheck,
},
load=function()
applyCustomGame()
local AItype=GAME.modeEnv.opponent:sub(1,2)
local AIlevel=tonumber(GAME.modeEnv.opponent:sub(-1))
PLY.newPlayer(1)
if AItype=='9S'then
PLY.newAIPlayer(2,BOT.template{type='9S',speedLV=2*AIlevel,hold=true})
elseif AItype=='CC'then
PLY.newAIPlayer(2,BOT.template{type='CC',speedLV=2*AIlevel-1,next=math.floor(AIlevel*.5+1),hold=true,node=20000+5000*AIlevel})
end
end,
mesDisp=function(P)
setFont(55)
mStr(P.stat.row,63,225)
mText(drawableText.line,63,290)
PLY.draw.applyField(P)
if P.modeData.showMark==0 then
local mark=TEXTURE.puzzleMark
local F=FIELD[P.modeData.finished+1]
gc.setColor(1,1,1)
for y=1,20 do for x=1,10 do
local T=F[y][x]
if T~=0 then
gc_draw(mark[T],30*x-30,600-30*y)
end
end end
end
PLY.draw.cancelField(P)
end,
color=COLOR.white,
env={
fkey1=function(P)P.modeData.showMark=1-P.modeData.showMark end,
dropPiece=puzzleCheck,
},
load=function()
applyCustomGame()
local AItype=GAME.modeEnv.opponent:sub(1,2)
local AIlevel=tonumber(GAME.modeEnv.opponent:sub(-1))
PLY.newPlayer(1)
if AItype=='9S'then
PLY.newAIPlayer(2,BOT.template{type='9S',speedLV=2*AIlevel,hold=true})
elseif AItype=='CC'then
PLY.newAIPlayer(2,BOT.template{type='CC',speedLV=2*AIlevel-1,next=math.floor(AIlevel*.5+1),hold=true,node=20000+5000*AIlevel})
end
end,
mesDisp=function(P)
setFont(55)
mStr(P.stat.row,63,225)
mText(drawableText.line,63,290)
PLY.draw.applyField(P)
if P.modeData.showMark==0 then
local mark=TEXTURE.puzzleMark
local F=FIELD[P.modeData.finished+1]
gc.setColor(1,1,1)
for y=1,20 do for x=1,10 do
local T=F[y][x]
if T~=0 then
gc_draw(mark[T],30*x-30,600-30*y)
end
end end
end
PLY.draw.cancelField(P)
end,
}

View File

@@ -1,65 +1,65 @@
return{
color=COLOR.red,
env={
drop=5,lock=60,
fall=6,
nextCount=3,
freshLimit=15,
pushSpeed=2,
task=function(P)
while true do
YIELD()
if P.control then
local D=P.modeData
D.counter=D.counter+1
local t=math.max(240-2*D.wave,40)
if D.counter>=t then
D.counter=0
for _=1,4 do
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=5*t,cd0=5*t,time=0,sent=false,lv=2})
end
P.atkBufferSum=P.atkBufferSum+4
P.stat.recv=P.stat.recv+4
D.wave=D.wave+1
if D.wave<=75 then
D.rpm=math.floor(144e3/t)*.1
if D.wave==25 then
P:showTextF(text.great,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=3
P.dropDelay,P.gameEnv.drop=4,4
elseif D.wave==50 then
P:showTextF(text.awesome,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=4
P.dropDelay,P.gameEnv.drop=3,3
elseif D.wave==75 then
P:showTextF(text.maxspeed,0,-140,100,'appear',.6)
P.dropDelay,P.gameEnv.drop=2,2
end
end
end
end
end
end,
bg='rainbow2',bgm='storm',
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,63,200)
mStr(P.modeData.rpm,63,320)
mText(drawableText.wave,63,260)
mText(drawableText.rpm,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=100 and 5 or
W>=80 and 4 or
W>=55 and 3 or
W>=30 and 2 or
W>=20 and 1 or
W>=5 and 0
end,
color=COLOR.red,
env={
drop=5,lock=60,
fall=6,
nextCount=3,
freshLimit=15,
pushSpeed=2,
task=function(P)
while true do
YIELD()
if P.control then
local D=P.modeData
D.counter=D.counter+1
local t=math.max(240-2*D.wave,40)
if D.counter>=t then
D.counter=0
for _=1,4 do
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=5*t,cd0=5*t,time=0,sent=false,lv=2})
end
P.atkBufferSum=P.atkBufferSum+4
P.stat.recv=P.stat.recv+4
D.wave=D.wave+1
if D.wave<=75 then
D.rpm=math.floor(144e3/t)*.1
if D.wave==25 then
P:showTextF(text.great,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=3
P.dropDelay,P.gameEnv.drop=4,4
elseif D.wave==50 then
P:showTextF(text.awesome,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=4
P.dropDelay,P.gameEnv.drop=3,3
elseif D.wave==75 then
P:showTextF(text.maxspeed,0,-140,100,'appear',.6)
P.dropDelay,P.gameEnv.drop=2,2
end
end
end
end
end
end,
bg='rainbow2',bgm='storm',
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,63,200)
mStr(P.modeData.rpm,63,320)
mText(drawableText.wave,63,260)
mText(drawableText.rpm,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=100 and 5 or
W>=80 and 4 or
W>=55 and 3 or
W>=30 and 2 or
W>=20 and 1 or
W>=5 and 0
end,
}

View File

@@ -1,65 +1,65 @@
return{
color=COLOR.green,
env={
drop=30,lock=60,
fall=10,
nextCount=3,
freshLimit=15,
pushSpeed=1,
task=function(P)
while true do
YIELD()
if P.control then
local D=P.modeData
D.counter=D.counter+1
local t=math.max(360-D.wave*2,60)
if D.counter>=t then
D.counter=0
for _=1,3 do
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=2*t,cd0=2*t,time=0,sent=false,lv=1})
end
P.atkBufferSum=P.atkBufferSum+3
P.stat.recv=P.stat.recv+3
D.wave=D.wave+1
if D.wave<=90 then
D.rpm=math.floor(108e3/t)*.1
if D.wave==25 then
P:showTextF(text.great,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=2
P.dropDelay,P.gameEnv.drop=20,20
elseif D.wave==50 then
P:showTextF(text.awesome,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=3
P.dropDelay,P.gameEnv.drop=10,10
elseif D.wave==90 then
P.dropDelay,P.gameEnv.drop=5,5
P:showTextF(text.maxspeed,0,-140,100,'appear',.6)
end
end
end
end
end
end,
bg='rainbow2',bgm='storm',
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,63,200)
mStr(P.modeData.rpm,63,320)
mText(drawableText.wave,63,260)
mText(drawableText.rpm,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=120 and 5 or
W>=100 and 4 or
W>=70 and 3 or
W>=40 and 2 or
W>=10 and 1 or
W>=3 and 0
end,
color=COLOR.green,
env={
drop=30,lock=60,
fall=10,
nextCount=3,
freshLimit=15,
pushSpeed=1,
task=function(P)
while true do
YIELD()
if P.control then
local D=P.modeData
D.counter=D.counter+1
local t=math.max(360-D.wave*2,60)
if D.counter>=t then
D.counter=0
for _=1,3 do
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=1,countdown=2*t,cd0=2*t,time=0,sent=false,lv=1})
end
P.atkBufferSum=P.atkBufferSum+3
P.stat.recv=P.stat.recv+3
D.wave=D.wave+1
if D.wave<=90 then
D.rpm=math.floor(108e3/t)*.1
if D.wave==25 then
P:showTextF(text.great,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=2
P.dropDelay,P.gameEnv.drop=20,20
elseif D.wave==50 then
P:showTextF(text.awesome,0,-140,100,'appear',.6)
P.gameEnv.pushSpeed=3
P.dropDelay,P.gameEnv.drop=10,10
elseif D.wave==90 then
P.dropDelay,P.gameEnv.drop=5,5
P:showTextF(text.maxspeed,0,-140,100,'appear',.6)
end
end
end
end
end
end,
bg='rainbow2',bgm='storm',
},
mesDisp=function(P)
setFont(55)
mStr(P.modeData.wave,63,200)
mStr(P.modeData.rpm,63,320)
mText(drawableText.wave,63,260)
mText(drawableText.rpm,63,380)
end,
score=function(P)return{P.modeData.wave,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=120 and 5 or
W>=100 and 4 or
W>=70 and 3 or
W>=40 and 2 or
W>=10 and 1 or
W>=3 and 0
end,
}

View File

@@ -1,43 +1,43 @@
local function check_rise(P)
for _=1,math.min(8,100-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end
if P.stat.dig==100 then
P:win('finish')
end
for _=1,math.min(8,100-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end
if P.stat.dig==100 then
P:win('finish')
end
end
return{
color=COLOR.green,
env={
pushSpeed=6,
dropPiece=check_rise,
bg='bg2',bgm='way',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(100-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<100 then return end
local T=P.stat.time
return
T<=120 and 5 or
T<=160 and 4 or
T<=240 and 3 or
T<=360 and 2 or
T<=480 and 1 or
0
end,
color=COLOR.green,
env={
pushSpeed=6,
dropPiece=check_rise,
bg='bg2',bgm='way',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(100-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<100 then return end
local T=P.stat.time
return
T<=120 and 5 or
T<=160 and 4 or
T<=240 and 3 or
T<=360 and 2 or
T<=480 and 1 or
0
end,
}

View File

@@ -1,40 +1,40 @@
local function check_rise(P)
if P.stat.dig==10 then
P:win('finish')
end
if P.stat.dig==10 then
P:win('finish')
end
end
return{
color=COLOR.cyan,
env={
pushSpeed=6,
dropPiece=check_rise,
bg='bg1',bgm='way',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(10-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<10 then return end
local T=P.stat.time
return
T<=7 and 5 or
T<=12 and 4 or
T<=20 and 3 or
T<=40 and 2 or
T<=60 and 1 or
0
end,
color=COLOR.cyan,
env={
pushSpeed=6,
dropPiece=check_rise,
bg='bg1',bgm='way',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(10-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<10 then return end
local T=P.stat.time
return
T<=7 and 5 or
T<=12 and 4 or
T<=20 and 3 or
T<=40 and 2 or
T<=60 and 1 or
0
end,
}

View File

@@ -1,43 +1,43 @@
local function check_rise(P)
for _=1,math.min(8,400-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end
if P.stat.dig==400 then
P:win('finish')
end
for _=1,math.min(8,400-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end
if P.stat.dig==400 then
P:win('finish')
end
end
return{
color=COLOR.orange,
env={
pushSpeed=6,
dropPiece=check_rise,
bg='bg2',bgm='way',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(400-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<400 then return end
local T=P.stat.time
return
T<=540 and 5 or
T<=720 and 4 or
T<=960 and 3 or
T<=1500 and 2 or
T<=1800 and 1 or
0
end,
color=COLOR.orange,
env={
pushSpeed=6,
dropPiece=check_rise,
bg='bg2',bgm='way',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(400-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<400 then return end
local T=P.stat.time
return
T<=540 and 5 or
T<=720 and 4 or
T<=960 and 3 or
T<=1500 and 2 or
T<=1800 and 1 or
0
end,
}

View File

@@ -1,43 +1,43 @@
local function check_rise(P)
for _=1,math.min(8,40-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end
if P.stat.dig==40 then
P:win('finish')
end
for _=1,math.min(8,40-P.stat.dig)-P.garbageBeneath do
P:garbageRise(21,1,P:getHolePos())
end
if P.stat.dig==40 then
P:win('finish')
end
end
return{
color=COLOR.lBlue,
env={
pushSpeed=6,
dropPiece=check_rise,
bg='bg1',bgm='way',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(40-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<40 then return end
local T=P.stat.time
return
T<=50 and 5 or
T<=70 and 4 or
T<=90 and 3 or
T<=120 and 2 or
T<=180 and 1 or
0
end,
color=COLOR.lBlue,
env={
pushSpeed=6,
dropPiece=check_rise,
bg='bg1',bgm='way',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,10 do
P:garbageRise(21,1,P:getHolePos())
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(55)
mStr(40-P.stat.dig,63,265)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
if P.stat.dig<40 then return end
local T=P.stat.time
return
T<=50 and 5 or
T<=70 and 4 or
T<=90 and 3 or
T<=120 and 2 or
T<=180 and 1 or
0
end,
}

View File

@@ -1,42 +1,42 @@
return{
color=COLOR.magenta,
env={
drop=60,lock=120,
fall=20,
freshLimit=15,
task=function(P)
while true do
YIELD()
if P.control then
local D=P.modeData
D.timer=D.timer+1
if D.timer>=math.max(90,180-D.wave)then
P:garbageRise(21,1,P:getHolePos())
P.stat.recv=P.stat.recv+1
D.timer=0
D.wave=D.wave+1
end
end
end
end,
bg='bg2',bgm='shift',
},
mesDisp=function(P)
setFont(60)
mStr(P.modeData.wave,63,310)
mText(drawableText.wave,63,375)
end,
score=function(P)return{P.modeData.wave,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=150 and 5 or
W>=110 and 4 or
W>=80 and 3 or
W>=50 and 2 or
W>=20 and 1 or
P.stat.row>=5 and 0
end,
color=COLOR.magenta,
env={
drop=60,lock=120,
fall=20,
freshLimit=15,
task=function(P)
while true do
YIELD()
if P.control then
local D=P.modeData
D.timer=D.timer+1
if D.timer>=math.max(90,180-D.wave)then
P:garbageRise(21,1,P:getHolePos())
P.stat.recv=P.stat.recv+1
D.timer=0
D.wave=D.wave+1
end
end
end
end,
bg='bg2',bgm='shift',
},
mesDisp=function(P)
setFont(60)
mStr(P.modeData.wave,63,310)
mText(drawableText.wave,63,375)
end,
score=function(P)return{P.modeData.wave,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=150 and 5 or
W>=110 and 4 or
W>=80 and 3 or
W>=50 and 2 or
W>=20 and 1 or
P.stat.row>=5 and 0
end,
}

View File

@@ -1,41 +1,41 @@
return{
color=COLOR.lYellow,
env={
drop=10,lock=30,
freshLimit=15,
task=function(P)
while true do
YIELD()
if P.control then
local D=P.modeData
D.timer=D.timer+1
if D.timer>=math.max(30,80-.3*D.wave)then
P:garbageRise(20+D.wave%5,1,P:getHolePos())
P.stat.recv=P.stat.recv+1
D.timer=0
D.wave=D.wave+1
end
end
end
end,
bg='bg2',bgm='shift',
},
mesDisp=function(P)
setFont(60)
mStr(P.modeData.wave,63,310)
mText(drawableText.wave,63,375)
end,
score=function(P)return{P.modeData.wave,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=150 and 5 or
W>=110 and 4 or
W>=80 and 3 or
W>=50 and 2 or
W>=20 and 1 or
P.stat.row>=5 and 0
end,
color=COLOR.lYellow,
env={
drop=10,lock=30,
freshLimit=15,
task=function(P)
while true do
YIELD()
if P.control then
local D=P.modeData
D.timer=D.timer+1
if D.timer>=math.max(30,80-.3*D.wave)then
P:garbageRise(20+D.wave%5,1,P:getHolePos())
P.stat.recv=P.stat.recv+1
D.timer=0
D.wave=D.wave+1
end
end
end
end,
bg='bg2',bgm='shift',
},
mesDisp=function(P)
setFont(60)
mStr(P.modeData.wave,63,310)
mText(drawableText.wave,63,375)
end,
score=function(P)return{P.modeData.wave,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modeData.wave
return
W>=150 and 5 or
W>=110 and 4 or
W>=80 and 3 or
W>=50 and 2 or
W>=20 and 1 or
P.stat.row>=5 and 0
end,
}

View File

@@ -1,110 +1,110 @@
local ins=table.insert
return{
color=COLOR.red,
env={
drop=20,lock=60,
sequence=function(P)
for _=1,3 do P:getNext(7)end
while true do
YIELD()
if not P.nextQueue[1]then
local height=FREEROW.get(0)
local max=#P.field
if max>0 then
--Get heights
for x=1,10 do
local h=max
while P.field[h][x]==0 and h>1 do
h=h-1
end
height[x]=h
end
else
for x=1,10 do
height[x]=0
end
end
height[11]=999
color=COLOR.red,
env={
drop=20,lock=60,
sequence=function(P)
for _=1,3 do P:getNext(7)end
while true do
YIELD()
if not P.nextQueue[1]then
local height=FREEROW.get(0)
local max=#P.field
if max>0 then
--Get heights
for x=1,10 do
local h=max
while P.field[h][x]==0 and h>1 do
h=h-1
end
height[x]=h
end
else
for x=1,10 do
height[x]=0
end
end
height[11]=999
local wei={1,1,2,2,3,4}
local d=0
for i=1,10 do
d=d+height[i]
end
if d<40 or P.stat.row>2*42 then--Low field or almost win, give SZO
for _=1,4 do
ins(wei,1)
ins(wei,2)
ins(wei,6)
end
else
--Give I when no hole
local tempDeltaHei=-999--Height difference
for x=2,11 do
local deltaHei=height[x]-height[x-1]
if tempDeltaHei<-2 and deltaHei>2 then
break
elseif x==11 then
for _=1,3 do ins(wei,7)end
else
tempDeltaHei=deltaHei
end
end
local wei={1,1,2,2,3,4}
local d=0
for i=1,10 do
d=d+height[i]
end
if d<40 or P.stat.row>2*42 then--Low field or almost win, give SZO
for _=1,4 do
ins(wei,1)
ins(wei,2)
ins(wei,6)
end
else
--Give I when no hole
local tempDeltaHei=-999--Height difference
for x=2,11 do
local deltaHei=height[x]-height[x-1]
if tempDeltaHei<-2 and deltaHei>2 then
break
elseif x==11 then
for _=1,3 do ins(wei,7)end
else
tempDeltaHei=deltaHei
end
end
--Give O when no d=0/give T when no d=1
local flatCount=0--d=0 count
local stairCount=0--d=1 count
for x=2,10 do
local _=height[x]-height[x-1]
if _==0 then
flatCount=flatCount+1
elseif _==1 or _==-1 then
stairCount=stairCount+1
end
end
if flatCount<3 then
for _=1,3 do ins(wei,6)end
end
if stairCount<3 then
for _=1,4 do ins(wei,5)end
end
end
--Give O when no d=0/give T when no d=1
local flatCount=0--d=0 count
local stairCount=0--d=1 count
for x=2,10 do
local _=height[x]-height[x-1]
if _==0 then
flatCount=flatCount+1
elseif _==1 or _==-1 then
stairCount=stairCount+1
end
end
if flatCount<3 then
for _=1,3 do ins(wei,6)end
end
if stairCount<3 then
for _=1,4 do ins(wei,5)end
end
end
FREEROW.discard(height)
P:getNext(wei[P.seqRND:random(#wei)])
end
end
end,
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
nextCount=1,holdCount=0,
ospin=false,
freshLimit=15,
bg='blockfall',bgm='reason',
},
mesDisp=function(P)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{math.min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=100 then
local T=P.stat.time
return
T<=110 and 5 or
T<=126 and 4 or
T<=160 and 3 or
T<=240 and 2 or
1
else
return
L>=50 and 1 or
L>=10 and 0
end
end,
FREEROW.discard(height)
P:getNext(wei[P.seqRND:random(#wei)])
end
end
end,
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
nextCount=1,holdCount=0,
ospin=false,
freshLimit=15,
bg='blockfall',bgm='reason',
},
mesDisp=function(P)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{math.min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=100 then
local T=P.stat.time
return
T<=110 and 5 or
T<=126 and 4 or
T<=160 and 3 or
T<=240 and 2 or
1
else
return
L>=50 and 1 or
L>=10 and 0
end
end,
}

View File

@@ -1,40 +1,40 @@
local min=math.min
return{
color=COLOR.green,
env={
drop=20,lock=60,
sequence='bag',
seqData={1,1,2,2,3,3,4,4,5,5,6,6},
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
nextCount=3,
ospin=false,
freshLimit=15,
bg='blockfall',bgm='reason',
},
mesDisp=function(P)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=100 then
local T=P.stat.time
return
T<=80 and 5 or
T<=100 and 4 or
T<=150 and 3 or
T<=210 and 2 or
1
else
return
L>=50 and 1 or
L>=10 and 0
end
end,
color=COLOR.green,
env={
drop=20,lock=60,
sequence='bag',
seqData={1,1,2,2,3,3,4,4,5,5,6,6},
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
nextCount=3,
ospin=false,
freshLimit=15,
bg='blockfall',bgm='reason',
},
mesDisp=function(P)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,265)
PLY.draw.drawTargetLine(P,r)
end,
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=100 then
local T=P.stat.time
return
T<=80 and 5 or
T<=100 and 4 or
T<=150 and 3 or
T<=210 and 2 or
1
else
return
L>=50 and 1 or
L>=10 and 0
end
end,
}

View File

@@ -1,15 +1,15 @@
return{
color=COLOR.white,
env={
drop=1e99,lock=1e99,
infHold=true,
bg='blockfall',bgm='infinite',
},
mesDisp=function(P)
setFont(45)
mStr(("%.1f"):format(P.stat.atk),63,190)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,310)
mText(drawableText.atk,63,243)
mText(drawableText.eff,63,363)
end,
color=COLOR.white,
env={
drop=1e99,lock=1e99,
infHold=true,
bg='blockfall',bgm='infinite',
},
mesDisp=function(P)
setFont(45)
mStr(("%.1f"):format(P.stat.atk),63,190)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,310)
mText(drawableText.atk,63,243)
mText(drawableText.eff,63,363)
end,
}

View File

@@ -1,54 +1,54 @@
local function check_rise(P)
local L=P.garbageBeneath
if #P.clearedRow==0 then
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 _=1,8-L do
P:garbageRise(13,1,generateLine(P.holeRND:random(10)))
end
else
if L==0 then
P:showTextF(text.awesome,0,-120,80,'beat',.6)
SFX.play('clear')
BG.send(26)
for _=1,8 do
P:garbageRise(13,1,generateLine(P.holeRND:random(10)))
end
else
BG.send(#P.clearedRow)
end
end
local L=P.garbageBeneath
if #P.clearedRow==0 then
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 _=1,8-L do
P:garbageRise(13,1,generateLine(P.holeRND:random(10)))
end
else
if L==0 then
P:showTextF(text.awesome,0,-120,80,'beat',.6)
SFX.play('clear')
BG.send(26)
for _=1,8 do
P:garbageRise(13,1,generateLine(P.holeRND:random(10)))
end
else
BG.send(#P.clearedRow)
end
end
end
return{
color=COLOR.white,
env={
drop=1e99,lock=1e99,
infHold=true,
dropPiece=check_rise,
pushSpeed=1.2,
bg='wing',bgm='dream',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,8 do
P:garbageRise(13,1,generateLine(P.holeRND:random(10)))
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(45)
mStr(P.stat.dig,63,190)
mStr(P.stat.atk,63,310)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,420)
mText(drawableText.line,63,243)
mText(drawableText.atk,63,363)
mText(drawableText.eff,63,475)
end,
color=COLOR.white,
env={
drop=1e99,lock=1e99,
infHold=true,
dropPiece=check_rise,
pushSpeed=1.2,
bg='wing',bgm='dream',
},
load=function()
PLY.newPlayer(1)
local P=PLAYERS[1]
for _=1,8 do
P:garbageRise(13,1,generateLine(P.holeRND:random(10)))
end
P.fieldBeneath=0
end,
mesDisp=function(P)
setFont(45)
mStr(P.stat.dig,63,190)
mStr(P.stat.atk,63,310)
mStr(("%.2f"):format(P.stat.atk/P.stat.row),63,420)
mText(drawableText.line,63,243)
mText(drawableText.atk,63,363)
mText(drawableText.eff,63,475)
end,
}

View File

@@ -1,56 +1,56 @@
local dropSpeed={50,40,30,25,20,15,12,9,7,5,4,3,2,1,1,.5,.5,.25,.25}
return{
color=COLOR.yellow,
env={
noTele=true,
drop=60,wait=8,fall=20,
task=function(P)P.modeData.target=10 end,
dropPiece=function(P)
local flag
local l=P.lastPiece
if P.combo>1 then flag=true;P:showText("2x",0,-220,40,'flicker',.3)end
if l.spin then flag=true;P:showText("spin",0,-180,40,'flicker',.3)end
if l.row>1 then flag=true;P:showText("1+",0,-140,40,'flicker',.3)end
if l.pc then flag=true;P:showText("PC",0,-100,40,'flicker',.3)end
if l.hpc then flag=true;P:showText("HPC",0,-100,40,'flicker',.3)end
if flag then
P:lose()
else
local T=P.modeData.target
if P.stat.row>=T then
if T==200 then
P:win('finish')
else
T=T+10
P.gameEnv.drop=dropSpeed[T/10]
P.modeData.target=T
SFX.play('reach')
end
end
end
end,
mindas=7,minarr=1,minsdarr=1,
bg='bg2',bgm='blank',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
PLY.draw.drawTargetLine(P,200-P.stat.row)
end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=400 and 5 or
T<=600 and 4 or
3
else
return
L>=150 and 2 or
L>=80 and 1 or
L>=20 and 0
end
end,
color=COLOR.yellow,
env={
noTele=true,
drop=60,wait=8,fall=20,
task=function(P)P.modeData.target=10 end,
dropPiece=function(P)
local flag
local l=P.lastPiece
if P.combo>1 then flag=true;P:showText("2x",0,-220,40,'flicker',.3)end
if l.spin then flag=true;P:showText("spin",0,-180,40,'flicker',.3)end
if l.row>1 then flag=true;P:showText("1+",0,-140,40,'flicker',.3)end
if l.pc then flag=true;P:showText("PC",0,-100,40,'flicker',.3)end
if l.hpc then flag=true;P:showText("HPC",0,-100,40,'flicker',.3)end
if flag then
P:lose()
else
local T=P.modeData.target
if P.stat.row>=T then
if T==200 then
P:win('finish')
else
T=T+10
P.gameEnv.drop=dropSpeed[T/10]
P.modeData.target=T
SFX.play('reach')
end
end
end
end,
mindas=7,minarr=1,minsdarr=1,
bg='bg2',bgm='blank',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
PLY.draw.drawTargetLine(P,200-P.stat.row)
end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=400 and 5 or
T<=600 and 4 or
3
else
return
L>=150 and 2 or
L>=80 and 1 or
L>=20 and 0
end
end,
}

View File

@@ -1,49 +1,49 @@
return{
color=COLOR.magenta,
env={
noTele=true,
mindas=7,minarr=1,minsdarr=1,
drop=.5,wait=8,fall=20,
task=function(P)P.modeData.target=50 end,
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==50 then
P.gameEnv.drop=.25
P.modeData.target=100
SFX.play('reach')
elseif P.modeData.target==100 then
P:set20G(true)
P.modeData.target=200
SFX.play('reach')
else
P:win('finish')
end
end
end,
noInitSZO=true,
bg='cubes',bgm='push',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
PLY.draw.drawTargetLine(P,200-P.stat.row)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=240 and 5 or
T<=360 and 4 or
3
else
return
L>=100 and 2 or
L>=50 and 1 or
L>=10 and 0
end
end,
color=COLOR.magenta,
env={
noTele=true,
mindas=7,minarr=1,minsdarr=1,
drop=.5,wait=8,fall=20,
task=function(P)P.modeData.target=50 end,
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==50 then
P.gameEnv.drop=.25
P.modeData.target=100
SFX.play('reach')
elseif P.modeData.target==100 then
P:set20G(true)
P.modeData.target=200
SFX.play('reach')
else
P:win('finish')
end
end
end,
noInitSZO=true,
bg='cubes',bgm='push',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
PLY.draw.drawTargetLine(P,200-P.stat.row)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=240 and 5 or
T<=360 and 4 or
3
else
return
L>=100 and 2 or
L>=50 and 1 or
L>=10 and 0
end
end,
}

View File

@@ -1,47 +1,47 @@
local dropSpeed={50,40,30,24,18,14,10,8,6,5,4,3,2,1,1,.5,.5,.25,.25}
return{
color=COLOR.green,
env={
noTele=true,
mindas=7,minarr=1,minsdarr=1,
drop=60,wait=8,fall=20,
task=function(P)P.modeData.target=10 end,
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')
else
P.gameEnv.drop=dropSpeed[P.modeData.target/10]
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
end,
noInitSZO=true,
bg='bg2',bgm='push',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
PLY.draw.drawTargetLine(P,200-P.stat.row)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=240 and 5 or
T<=360 and 4 or
3
else
return
L>=150 and 2 or
L>=100 and 1 or
L>=20 and 0
end
end,
color=COLOR.green,
env={
noTele=true,
mindas=7,minarr=1,minsdarr=1,
drop=60,wait=8,fall=20,
task=function(P)P.modeData.target=10 end,
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')
else
P.gameEnv.drop=dropSpeed[P.modeData.target/10]
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
end,
noInitSZO=true,
bg='bg2',bgm='push',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
PLY.draw.drawTargetLine(P,200-P.stat.row)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
if L>=200 then
local T=P.stat.time
return
T<=240 and 5 or
T<=360 and 4 or
3
else
return
L>=150 and 2 or
L>=100 and 1 or
L>=20 and 0
end
end,
}

View File

@@ -1,68 +1,68 @@
local sectionName={"D","C","B","A","A+","S-","S","S+","S+","SS","SS","U","U","X","X+"}
local passPoint=16
local function score(P)
if P.modeData.rankPoint<140-passPoint then--If Less then X
local R=#P.clearedRow
if R>0 then
if R==4 then R=10 end--Techrash +10
P.modeData.rankPoint=math.min(P.modeData.rankPoint+R,140-passPoint)
P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1]
end
end
if P.modeData.rankPoint<140-passPoint then--If Less then X
local R=#P.clearedRow
if R>0 then
if R==4 then R=10 end--Techrash +10
P.modeData.rankPoint=math.min(P.modeData.rankPoint+R,140-passPoint)
P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1]
end
end
end
return{
color=COLOR.lBlue,
env={
noTele=true,
minarr=1,
drop=0,lock=15,
wait=15,fall=6,
nextCount=3,
sequence='hisPool',
visible='fast',
freshLimit=15,
dropPiece=score,
noInitSZO=true,
task=function(P)
P.modeData.rankPoint=0
P.modeData.rankName=sectionName[1]
while true do
YIELD()
if P.stat.frame>=3600 then
P.modeData.rankPoint=math.min(P.modeData.rankPoint+passPoint,140)
P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1]
P:win('finish')
return
end
end
end,
bg='blockspace',bgm='hope',
},
slowMark=true,
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
mText(drawableText.grade,63,170)
setFont(55)
mStr(P.modeData.rankName,63,110)
setFont(20)
mStr(("%.1f"):format(P.modeData.rankPoint/10),63,198)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
end,
score=function(P)return{P.modeData.rankPoint,P.stat.score}end,
scoreDisp=function(D)return sectionName[math.floor(D[1]/10)+1].." "..D[2]end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]>b[2]end,
getRank=function(P)
P=P.modeData.rankPoint
return
P==140 and 5 or
P>=110 and 4 or
P>=80 and 3 or
P>=50 and 2 or
P>=30 and 1 or
P>=10 and 0
end,
color=COLOR.lBlue,
env={
noTele=true,
minarr=1,
drop=0,lock=15,
wait=15,fall=6,
nextCount=3,
sequence='hisPool',
visible='fast',
freshLimit=15,
dropPiece=score,
noInitSZO=true,
task=function(P)
P.modeData.rankPoint=0
P.modeData.rankName=sectionName[1]
while true do
YIELD()
if P.stat.frame>=3600 then
P.modeData.rankPoint=math.min(P.modeData.rankPoint+passPoint,140)
P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1]
P:win('finish')
return
end
end
end,
bg='blockspace',bgm='hope',
},
slowMark=true,
mesDisp=function(P)
mText(drawableText.line,63,300)
mText(drawableText.techrash,63,420)
mText(drawableText.grade,63,170)
setFont(55)
mStr(P.modeData.rankName,63,110)
setFont(20)
mStr(("%.1f"):format(P.modeData.rankPoint/10),63,198)
setFont(75)
mStr(P.stat.row,63,220)
mStr(P.stat.clears[4],63,340)
end,
score=function(P)return{P.modeData.rankPoint,P.stat.score}end,
scoreDisp=function(D)return sectionName[math.floor(D[1]/10)+1].." "..D[2]end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]>b[2]end,
getRank=function(P)
P=P.modeData.rankPoint
return
P==140 and 5 or
P>=110 and 4 or
P>=80 and 3 or
P>=50 and 2 or
P>=30 and 1 or
P>=10 and 0
end,
}

View File

@@ -1,75 +1,75 @@
local function score(P)
local D=P.modeData
local D=P.modeData
local c=#P.clearedRow
if c==0 and D.pt%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
elseif P.combo>3 then s=s+1
end
D.pt=D.pt+s
local c=#P.clearedRow
if c==0 and D.pt%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
elseif P.combo>3 then s=s+1
end
D.pt=D.pt+s
if D.pt%100==99 then
SFX.play('blip_1')
elseif D.pt>=D.target then--Level up!
s=D.target/100--range from 1 to 9
local E=P.gameEnv
if s<4 then
P:showTextF(text.stage:gsub("$1",s),0,-120,80,'fly')
--First 300
if s~=1 then E.lock=E.lock-1 end
if s~=2 then E.wait=E.wait-1 end
if s~=3 then E.fall=E.fall-1 end
D.target=D.target+100
elseif s<10 then
if s==5 then BGM.play('distortion')end
P:showTextF(text.stage:gsub("$1",s),0,-120,60,'fly',1.26)
if s==4 or s==7 then E.das=E.das-1 end
if s%3==0 then E.lock=E.lock-1
elseif s%3==1 then E.wait=E.wait-1
elseif s%3==2 then E.fall=E.fall-1
end
D.target=D.target+100
else
D.pt=1000
P:win('finish')
end
SFX.play('reach')
end
if D.pt%100==99 then
SFX.play('blip_1')
elseif D.pt>=D.target then--Level up!
s=D.target/100--range from 1 to 9
local E=P.gameEnv
if s<4 then
P:showTextF(text.stage:gsub("$1",s),0,-120,80,'fly')
--First 300
if s~=1 then E.lock=E.lock-1 end
if s~=2 then E.wait=E.wait-1 end
if s~=3 then E.fall=E.fall-1 end
D.target=D.target+100
elseif s<10 then
if s==5 then BGM.play('distortion')end
P:showTextF(text.stage:gsub("$1",s),0,-120,60,'fly',1.26)
if s==4 or s==7 then E.das=E.das-1 end
if s%3==0 then E.lock=E.lock-1
elseif s%3==1 then E.wait=E.wait-1
elseif s%3==2 then E.fall=E.fall-1
end
D.target=D.target+100
else
D.pt=1000
P:win('finish')
end
SFX.play('reach')
end
end
return{
color=COLOR.lGray,
env={
noTele=true,
das=5,arr=1,
drop=0,lock=12,
wait=10,fall=10,
dropPiece=score,
task=function(P)
P.modeData.pt=0
P.modeData.target=100
end,
freshLimit=15,
easyFresh=false,bone=true,
noInitSZO=true,
bg='lightning',bgm='rectification',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local S=P.modeData.pt
return
S>=1000 and 5 or
S>=800 and 4 or
S>=600 and 3 or
S>=400 and 2 or
S>=200 and 1 or
S>=50 and 0
end,
color=COLOR.lGray,
env={
noTele=true,
das=5,arr=1,
drop=0,lock=12,
wait=10,fall=10,
dropPiece=score,
task=function(P)
P.modeData.pt=0
P.modeData.target=100
end,
freshLimit=15,
easyFresh=false,bone=true,
noInitSZO=true,
bg='lightning',bgm='rectification',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local S=P.modeData.pt
return
S>=1000 and 5 or
S>=800 and 4 or
S>=600 and 3 or
S>=400 and 2 or
S>=200 and 1 or
S>=50 and 0
end,
}

View File

@@ -1,93 +1,93 @@
local death_lock={12,11,10,9,8, 7,7,7,7,6}
local death_wait={10,9, 8, 7,6, 6,6,5,5,4}
local death_fall={10,9, 8, 7,6, 6,5,5,4,4}
local death_lock={12,11,10,9,8, 7,7,7,7,6}
local death_wait={10,9, 8, 7,6, 6,6,5,5,4}
local death_fall={10,9, 8, 7,6, 6,5,5,4,4}
local function score(P)
local D=P.modeData
local D=P.modeData
local c=#P.clearedRow
if c==0 and D.pt%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
elseif P.combo>3 then s=s+1
end
D.pt=D.pt+s
local c=#P.clearedRow
if c==0 and D.pt%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
elseif P.combo>3 then s=s+1
end
D.pt=D.pt+s
if D.pt%100==99 then
SFX.play('blip_1')
elseif D.pt>=D.target then--Level up!
s=D.target/100
local E=P.gameEnv
E.lock=death_lock[s]
E.wait=death_wait[s]
E.fall=death_fall[s]
if s==2 then
E.das=5
BG.set('rainbow')
elseif s==4 then
E.das=4
BG.set('rainbow2')
elseif s==5 then
if P.stat.frame>183*60 then
D.pt=500
P:win('finish')
return
else
E.bone=true
P.gameEnv.freshLimit=10
BG.set('glow')
BGM.play('secret7th remix')
end
elseif s==6 then
E.das=3
BG.set('lightning')
elseif s==7 then
E.bone=true
elseif s==10 then
D.pt=1000
P:win('finish')
return
end
D.target=D.target+100
P:showTextF(text.stage:gsub("$1",s),0,-120,80,'beat')
SFX.play('reach')
end
if D.pt%100==99 then
SFX.play('blip_1')
elseif D.pt>=D.target then--Level up!
s=D.target/100
local E=P.gameEnv
E.lock=death_lock[s]
E.wait=death_wait[s]
E.fall=death_fall[s]
if s==2 then
E.das=5
BG.set('rainbow')
elseif s==4 then
E.das=4
BG.set('rainbow2')
elseif s==5 then
if P.stat.frame>183*60 then
D.pt=500
P:win('finish')
return
else
E.bone=true
P.gameEnv.freshLimit=10
BG.set('glow')
BGM.play('secret7th remix')
end
elseif s==6 then
E.das=3
BG.set('lightning')
elseif s==7 then
E.bone=true
elseif s==10 then
D.pt=1000
P:win('finish')
return
end
D.target=D.target+100
P:showTextF(text.stage:gsub("$1",s),0,-120,80,'beat')
SFX.play('reach')
end
end
return{
color=COLOR.red,
env={
noTele=true,
das=6,arr=1,
drop=0,
lock=death_lock[1],
wait=death_wait[1],
fall=death_fall[1],
dropPiece=score,
task=function(P)
P.modeData.pt=0
P.modeData.target=100
end,
freshLimit=15,
noInitSZO=true,
bg='bg2',bgm='secret7th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
end,
getRank=function(P)
local S=P.modeData.pt
return
S>=1000 and 5 or
S>=800 and 4 or
S>=500 and 3 or
S>=300 and 2 or
S>=100 and 1 or
S>=60 and 0
end,
color=COLOR.red,
env={
noTele=true,
das=6,arr=1,
drop=0,
lock=death_lock[1],
wait=death_wait[1],
fall=death_fall[1],
dropPiece=score,
task=function(P)
P.modeData.pt=0
P.modeData.target=100
end,
freshLimit=15,
noInitSZO=true,
bg='bg2',bgm='secret7th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
end,
getRank=function(P)
local S=P.modeData.pt
return
S>=1000 and 5 or
S>=800 and 4 or
S>=500 and 3 or
S>=300 and 2 or
S>=100 and 1 or
S>=60 and 0
end,
}

View File

@@ -2,84 +2,84 @@ local rush_lock={20,18,16,15,14}
local rush_wait={12,10, 9, 8, 7}
local rush_fall={18,16,14,13,12}
local function score(P)
local D=P.modeData
local D=P.modeData
local c=#P.clearedRow
if c==0 and D.pt%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
elseif P.combo>3 then s=s+1
end
D.pt=D.pt+s
local c=#P.clearedRow
if c==0 and D.pt%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
elseif P.combo>3 then s=s+1
end
D.pt=D.pt+s
if D.pt%100==99 then
SFX.play('blip_1')
elseif D.pt>=D.target then--Level up!
s=D.target/100
local E=P.gameEnv
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]
E.das=10-s
if s==2 then
E.arr=2
elseif s==4 then
E.bone=true
end
if D.pt%100==99 then
SFX.play('blip_1')
elseif D.pt>=D.target then--Level up!
s=D.target/100
local E=P.gameEnv
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]
E.das=10-s
if s==2 then
E.arr=2
elseif s==4 then
E.bone=true
end
if s==5 then
D.pt=500
P:win('finish')
else
D.target=D.target+100
P:showTextF(text.stage:gsub("$1",s),0,-120,80,'fly')
end
SFX.play('reach')
end
if s==5 then
D.pt=500
P:win('finish')
else
D.target=D.target+100
P:showTextF(text.stage:gsub("$1",s),0,-120,80,'fly')
end
SFX.play('reach')
end
end
return{
color=COLOR.red,
env={
noTele=true,
das=9,arr=3,
drop=0,
lock=rush_lock[1],
wait=rush_wait[1],
fall=rush_fall[1],
dropPiece=score,
noInitSZO=true,
task=function(P)
P.modeData.pt=0
P.modeData.target=100
end,
freshLimit=15,
bg='bg1',bgm='secret8th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
end,
getRank=function(P)
local S=P.modeData.pt
if S==500 then
local T=P.stat.time
return
T<=170 and 5 or
T<=200 and 4 or
3
else
return
S>=460 and 3 or
S>=350 and 2 or
S>=200 and 1 or
S>=50 and 0
end
end,
color=COLOR.red,
env={
noTele=true,
das=9,arr=3,
drop=0,
lock=rush_lock[1],
wait=rush_wait[1],
fall=rush_fall[1],
dropPiece=score,
noInitSZO=true,
task=function(P)
P.modeData.pt=0
P.modeData.target=100
end,
freshLimit=15,
bg='bg1',bgm='secret8th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
end,
getRank=function(P)
local S=P.modeData.pt
if S==500 then
local T=P.stat.time
return
T<=170 and 5 or
T<=200 and 4 or
3
else
return
S>=460 and 3 or
S>=350 and 2 or
S>=200 and 1 or
S>=50 and 0
end
end,
}

View File

@@ -1,93 +1,93 @@
local rush_lock={20,18,16,15,14, 14,13,12,11,11}
local rush_wait={12,11,11,10,10, 10,10, 9, 9, 9}
local rush_fall={18,16,14,13,12, 12,11,11,10,10}
local rush_lock={20,18,16,15,14, 14,13,12,11,11}
local rush_wait={12,11,11,10,10, 10,10, 9, 9, 9}
local rush_fall={18,16,14,13,12, 12,11,11,10,10}
local function score(P)
local D=P.modeData
local D=P.modeData
local c=#P.clearedRow
if c==0 and D.pt%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
elseif P.combo>3 then s=s+1
end
D.pt=D.pt+s
local c=#P.clearedRow
if c==0 and D.pt%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
elseif P.combo>3 then s=s+1
end
D.pt=D.pt+s
if D.pt%100==99 then
SFX.play('blip_1')
elseif D.pt>=D.target then--Level up!
s=D.target/100
local E=P.gameEnv
E.lock=rush_lock[s]
E.wait=rush_wait[s]
E.fall=rush_fall[s]
if D.pt%100==99 then
SFX.play('blip_1')
elseif D.pt>=D.target then--Level up!
s=D.target/100
local E=P.gameEnv
E.lock=rush_lock[s]
E.wait=rush_wait[s]
E.fall=rush_fall[s]
if s==2 then
E.das=8
BG.set('rainbow')
elseif s==4 then
BG.set('rainbow2')
elseif s==5 then
if P.stat.frame>260*60 then
D.pt=500
P:win('finish')
return
else
P.gameEnv.freshLimit=10
E.das=7
BG.set('glow')
BGM.play('secret8th remix')
end
elseif s==7 then
E.das=6
BG.set('lightning')
elseif s==9 then
E.bone=true
elseif s==10 then
D.pt=1000
P:win('finish')
return
end
D.target=D.target+100
P:showTextF(text.stage:gsub("$1",s),0,-120,80,'fly')
SFX.play('reach')
end
if s==2 then
E.das=8
BG.set('rainbow')
elseif s==4 then
BG.set('rainbow2')
elseif s==5 then
if P.stat.frame>260*60 then
D.pt=500
P:win('finish')
return
else
P.gameEnv.freshLimit=10
E.das=7
BG.set('glow')
BGM.play('secret8th remix')
end
elseif s==7 then
E.das=6
BG.set('lightning')
elseif s==9 then
E.bone=true
elseif s==10 then
D.pt=1000
P:win('finish')
return
end
D.target=D.target+100
P:showTextF(text.stage:gsub("$1",s),0,-120,80,'fly')
SFX.play('reach')
end
end
return{
color=COLOR.red,
env={
noTele=true,
das=10,arr=3,
drop=0,
lock=rush_lock[1],
wait=rush_wait[1],
fall=rush_fall[1],
dropPiece=score,
noInitSZO=true,
task=function(P)
P.modeData.pt=0
P.modeData.target=100
end,
freshLimit=15,
bg='bg1',bgm='secret8th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
end,
getRank=function(P)
local S=P.modeData.pt
return
S>=1000 and 5 or
S>=800 and 4 or
S>=500 and 3 or
S>=300 and 2 or
S>=100 and 1 or
S>=60 and 0
end,
color=COLOR.red,
env={
noTele=true,
das=10,arr=3,
drop=0,
lock=rush_lock[1],
wait=rush_wait[1],
fall=rush_fall[1],
dropPiece=score,
noInitSZO=true,
task=function(P)
P.modeData.pt=0
P.modeData.target=100
end,
freshLimit=15,
bg='bg1',bgm='secret8th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
end,
getRank=function(P)
local S=P.modeData.pt
return
S>=1000 and 5 or
S>=800 and 4 or
S>=500 and 3 or
S>=300 and 2 or
S>=100 and 1 or
S>=60 and 0
end,
}

View File

@@ -1,163 +1,163 @@
return{
color=COLOR.black,
env={
noTele=true,
das=5,arr=1,
drop=0,lock=15,
wait=10,fall=10,
nextCount=2,
sequence='his',
task=function(P)P.modeData.target=12 end,
dropPiece=function(P)
local p=P.modeData.pt+P.lastPiece.row
if p>=P.modeData.target then
local ENV=P.gameEnv
local T=P.modeData.target
--Stage 1: clear 3 techrash
if T==12 then--Stage 2: swap color of S/Z & J/L
P.waiting=30
P.curMission=false
color=COLOR.black,
env={
noTele=true,
das=5,arr=1,
drop=0,lock=15,
wait=10,fall=10,
nextCount=2,
sequence='his',
task=function(P)P.modeData.target=12 end,
dropPiece=function(P)
local p=P.modeData.pt+P.lastPiece.row
if p>=P.modeData.target then
local ENV=P.gameEnv
local T=P.modeData.target
--Stage 1: clear 3 techrash
if T==12 then--Stage 2: swap color of S/Z & J/L
P.waiting=30
P.curMission=false
ENV.skin[1],ENV.skin[2]=ENV.skin[2],ENV.skin[1]
ENV.skin[3],ENV.skin[4]=ENV.skin[4],ENV.skin[3]
ENV.skin[1],ENV.skin[2]=ENV.skin[2],ENV.skin[1]
ENV.skin[3],ENV.skin[4]=ENV.skin[4],ENV.skin[3]
ENV.lock=14
ENV.wait=7
ENV.fall=7
P:setNext(4)
ENV.lock=14
ENV.wait=7
ENV.fall=7
P:setNext(4)
P.modeData.target=26
SFX.play('reach')
elseif T==26 then--Stage 3: dig to bottom
if not P.holdQueue[1]then P.life=P.life+1 end--1 up if ban hold
P.waiting=45
ENV.skin[1],ENV.skin[2]=ENV.skin[2],ENV.skin[1]
ENV.skin[3],ENV.skin[4]=ENV.skin[4],ENV.skin[3]
P.modeData.target=26
SFX.play('reach')
elseif T==26 then--Stage 3: dig to bottom
if not P.holdQueue[1]then P.life=P.life+1 end--1 up if ban hold
P.waiting=45
ENV.skin[1],ENV.skin[2]=ENV.skin[2],ENV.skin[1]
ENV.skin[3],ENV.skin[4]=ENV.skin[4],ENV.skin[3]
for i=1,10 do
if P.field[i]then
for j=1,10 do
if P.field[i][j]>0 then
P.field[i][j]=17
P.visTime[i][j]=15
end
end
for _=1,5 do
P.field[i][P.holeRND:random(10)]=0
end
else
P.field[i]=FREEROW.get(0)
P.visTime[i]=FREEROW.get(30)
for j=1,10 do
if P.holeRND:random()>.9 then
P.field[i][j]=P.holeRND:random(16)
end
end
P.field[i][P.holeRND:random(10)]=0
end
P.field[i].garbage=true
end
P.garbageBeneath=10
for i=1,10 do
P:createClearingFX(i,1.5)
end
SYSFX.newShade(2.5,P.absFieldX,P.y+300*P.size,300*P.size,300*P.size)
for i=1,10 do
if P.field[i]then
for j=1,10 do
if P.field[i][j]>0 then
P.field[i][j]=17
P.visTime[i][j]=15
end
end
for _=1,5 do
P.field[i][P.holeRND:random(10)]=0
end
else
P.field[i]=FREEROW.get(0)
P.visTime[i]=FREEROW.get(30)
for j=1,10 do
if P.holeRND:random()>.9 then
P.field[i][j]=P.holeRND:random(16)
end
end
P.field[i][P.holeRND:random(10)]=0
end
P.field[i].garbage=true
end
P.garbageBeneath=10
for i=1,10 do
P:createClearingFX(i,1.5)
end
SYSFX.newShade(2.5,P.absFieldX,P.y+300*P.size,300*P.size,300*P.size)
ENV.lock=13
ENV.wait=6
ENV.fall=6
P:setNext(5)
ENV.lock=13
ENV.wait=6
ENV.fall=6
P:setNext(5)
P.modeData.target=42
SFX.play('reach')
elseif T==42 then--Stage 4: survive in high speed
if P.garbageBeneath==0 then
P.waiting=30
ENV.lock=11
P:setNext(6)
P:setHold(false)
ENV.bone=true
P.modeData.target=42
SFX.play('reach')
elseif T==42 then--Stage 4: survive in high speed
if P.garbageBeneath==0 then
P.waiting=30
ENV.lock=11
P:setNext(6)
P:setHold(false)
ENV.bone=true
P.modeData.target=62
else
p=41
end
elseif T==62 then--Stage 5: survive without easy-fresh rule
P.life=P.life+1
ENV.lock=13
ENV.wait=5
ENV.fall=5
P.modeData.target=62
else
p=41
end
elseif T==62 then--Stage 5: survive without easy-fresh rule
P.life=P.life+1
ENV.lock=13
ENV.wait=5
ENV.fall=5
ENV.easyFresh=false
ENV.easyFresh=false
P.modeData.target=126
SFX.play('reach')
elseif T==126 then--Stage 6: speed up
P.life=P.life+1
P.modeData.target=126
SFX.play('reach')
elseif T==126 then--Stage 6: speed up
P.life=P.life+1
ENV.lock=11
ENV.wait=4
ENV.fall=4
ENV.lock=11
ENV.wait=4
ENV.fall=4
P.modeData.target=162
elseif T==162 then--Stage 7: speed up+++
P.life=P.life+1
P.modeData.target=162
elseif T==162 then--Stage 7: speed up+++
P.life=P.life+1
ENV.lock=10
ENV.lock=10
P:setHold(true)
P:setInvisible(180)
P:setHold(true)
P:setInvisible(180)
P.modeData.target=226
SFX.play('reach')
elseif T==226 then--Stage 8: final invisible
P.life=P.life+1
P.modeData.target=226
SFX.play('reach')
elseif T==226 then--Stage 8: final invisible
P.life=P.life+1
ENV.bone=false
P:setInvisible(90)
ENV.bone=false
P:setInvisible(90)
P.modeData.target=259
SFX.play('reach')
elseif T==259 then--Stage 9: ending
P.life=P.life+1
for i=1,7 do ENV.skin[i]=P.holeRND:random(16)end
P.modeData.target=259
SFX.play('reach')
elseif T==259 then--Stage 9: ending
P.life=P.life+1
for i=1,7 do ENV.skin[i]=P.holeRND:random(16)end
P:setInvisible(40)
ENV.lock=15
P.curMission=1
ENV.mission={4,4,4,4,4,4,4,4}
ENV.missionKill=false
P:setInvisible(40)
ENV.lock=15
P.curMission=1
ENV.mission={4,4,4,4,4,4,4,4}
ENV.missionKill=false
P.modeData.target=260
p=260
SFX.play('blip_2')
else
p=260
end
end
P.modeData.pt=p
end,
mission={4,4,4,64},
missionKill=true,
freshLimit=12,
noInitSZO=true,
bg='blockspace',bgm='super7th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.result=='win'and 260 or P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local p=P.modeData.pt
return
P.result=='win'and 5 or
p>=226 and 4 or
p>=162 and 3 or
p>=62 and 2 or
p>=42 and 1 or
p>=26 and 0
end,
P.modeData.target=260
p=260
SFX.play('blip_2')
else
p=260
end
end
P.modeData.pt=p
end,
mission={4,4,4,64},
missionKill=true,
freshLimit=12,
noInitSZO=true,
bg='blockspace',bgm='super7th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.result=='win'and 260 or P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local p=P.modeData.pt
return
P.result=='win'and 5 or
p>=226 and 4 or
p>=162 and 3 or
p>=62 and 2 or
p>=42 and 1 or
p>=26 and 0
end,
}

View File

@@ -1,88 +1,88 @@
local death_lock={12,11,10,9,8, 7,7,7,6,6}
local death_wait={10, 9, 8,7,6, 6,5,4,4,3}
local death_fall={10, 9, 8,7,6, 5,5,4,3,3}
local death_lock={12,11,10,9,8, 7,7,7,6,6}
local death_wait={10, 9, 8,7,6, 6,5,4,4,3}
local death_fall={10, 9, 8,7,6, 5,5,4,3,3}
local function score(P)
local D=P.modeData
local D=P.modeData
local c=#P.clearedRow
if c==0 and D.pt%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
elseif P.combo>3 then s=s+1
end
D.pt=D.pt+s
local c=#P.clearedRow
if c==0 and D.pt%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
elseif P.combo>3 then s=s+1
end
D.pt=D.pt+s
if D.pt%100==99 then
SFX.play('blip_1')
elseif D.pt>=D.target then--Level up!
s=D.target/100
local E=P.gameEnv
SFX.play('reach')
E.lock=death_lock[s]
E.wait=death_wait[s]
E.fall=death_fall[s]
E.das=math.floor(6.9-s*.4)
if s==1 then
BG.set('rainbow')
elseif s==2 then
BG.set('rainbow2')
elseif s==3 then
BG.set('glow')
elseif s==5 then
if P.stat.frame>183*60 then
D.pt=500
P:win('finish')
return
else
P.gameEnv.freshLimit=10
BG.set('lightning')
BGM.play('secret7th remix')
end
elseif s==10 then
D.pt=1000
P:win('finish')
return
end
D.target=D.target+100
P:showTextF(text.stage:gsub("$1",s),0,-120,80,'fly')
end
if D.pt%100==99 then
SFX.play('blip_1')
elseif D.pt>=D.target then--Level up!
s=D.target/100
local E=P.gameEnv
SFX.play('reach')
E.lock=death_lock[s]
E.wait=death_wait[s]
E.fall=death_fall[s]
E.das=math.floor(6.9-s*.4)
if s==1 then
BG.set('rainbow')
elseif s==2 then
BG.set('rainbow2')
elseif s==3 then
BG.set('glow')
elseif s==5 then
if P.stat.frame>183*60 then
D.pt=500
P:win('finish')
return
else
P.gameEnv.freshLimit=10
BG.set('lightning')
BGM.play('secret7th remix')
end
elseif s==10 then
D.pt=1000
P:win('finish')
return
end
D.target=D.target+100
P:showTextF(text.stage:gsub("$1",s),0,-120,80,'fly')
end
end
return{
color=COLOR.red,
env={
noTele=true,
das=6,arr=1,
drop=0,
lock=death_lock[1],
wait=death_wait[1],
fall=death_fall[1],
dropPiece=score,
task=function(P)
P.modeData.pt=0
P.modeData.target=100
end,
freshLimit=15,
noInitSZO=true,
bg='bg2',bgm='secret7th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
end,
getRank=function(P)
local S=P.modeData.pt
return
S>=1000 and 5 or
S>=800 and 4 or
S>=500 and 3 or
S>=300 and 2 or
S>=100 and 1 or
S>=50 and 0
end,
color=COLOR.red,
env={
noTele=true,
das=6,arr=1,
drop=0,
lock=death_lock[1],
wait=death_wait[1],
fall=death_fall[1],
dropPiece=score,
task=function(P)
P.modeData.pt=0
P.modeData.target=100
end,
freshLimit=15,
noInitSZO=true,
bg='bg2',bgm='secret7th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
end,
score=function(P)return{P.modeData.pt,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
end,
getRank=function(P)
local S=P.modeData.pt
return
S>=1000 and 5 or
S>=800 and 4 or
S>=500 and 3 or
S>=300 and 2 or
S>=100 and 1 or
S>=50 and 0
end,
}

View File

@@ -1,42 +1,42 @@
local yield=YIELD
local function marginTask(P)
local S=P.stat
while true do yield()if S.frame>90*60 then P.strength=1;P:setFrameColor(1)break end end
while true do yield()if S.frame>135*60 then P.strength=2;P:setFrameColor(2)break end end
while true do yield()if S.frame>180*60 then P.strength=3;P:setFrameColor(3)break end end
while true do yield()if S.frame>260*60 then P.strength=4;P:setFrameColor(4)break end end
local S=P.stat
while true do yield()if S.frame>90*60 then P.strength=1;P:setFrameColor(1)break end end
while true do yield()if S.frame>135*60 then P.strength=2;P:setFrameColor(2)break end end
while true do yield()if S.frame>180*60 then P.strength=3;P:setFrameColor(3)break end end
while true do yield()if S.frame>260*60 then P.strength=4;P:setFrameColor(4)break end end
end
return{
color=COLOR.white,
env={
bg={'bg1','bg2','blackhole','blockfall','blockrain','blockspace','cubes','fan','flink','glow','matrix','rainbow','rainbow2','tunnel'},
bgm={'battle','beat5th','cruelty','distortion','echo','far','final','here','hope','memory','moonbeam','push','rectification','secret7th remix','secret7th','secret8th remix','secret8th','shift','shining terminal','storm','super7th','there','truth','vapor','waterfall'},
},
load=function()
for k,v in next,NET.roomState.roomData do
GAME.modeEnv[k]=v
end
GAME.modeEnv.allowMod=false
GAME.modeEnv.task=marginTask
color=COLOR.white,
env={
bg={'bg1','bg2','blackhole','blockfall','blockrain','blockspace','cubes','fan','flink','glow','matrix','rainbow','rainbow2','tunnel'},
bgm={'battle','beat5th','cruelty','distortion','echo','far','final','here','hope','memory','moonbeam','push','rectification','secret7th remix','secret7th','secret8th remix','secret8th','shift','shining terminal','storm','super7th','there','truth','vapor','waterfall'},
},
load=function()
for k,v in next,NET.roomState.roomData do
GAME.modeEnv[k]=v
end
GAME.modeEnv.allowMod=false
GAME.modeEnv.task=marginTask
local L=TABLE.copy(netPLY.list)
local N=1
for i,p in next,L do
if p.uid==USER.uid then
if p.connected then
PLY.newPlayer(1)
PLAYERS[1].sid=netPLY.getSID(USER.uid)
N=2
end
table.remove(L,i)
break
end
end
for _,p in next,L do
if p.connected then
PLY.newRemotePlayer(N,false,p)
N=N+1
end
end
end,
local L=TABLE.copy(netPLY.list)
local N=1
for i,p in next,L do
if p.uid==USER.uid then
if p.connected then
PLY.newPlayer(1)
PLAYERS[1].sid=netPLY.getSID(USER.uid)
N=2
end
table.remove(L,i)
break
end
end
for _,p in next,L do
if p.connected then
PLY.newRemotePlayer(N,false,p)
N=N+1
end
end
end,
}

View File

@@ -1,35 +1,35 @@
return{
color=COLOR.magenta,
env={
drop=60,lock=120,
fall=10,
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
freshLimit=15,
ospin=false,
bg='rgb',bgm='truth',
},
mesDisp=function(P)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,220)
PLY.draw.drawTargetLine(P,r)
color=COLOR.magenta,
env={
drop=60,lock=120,
fall=10,
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
freshLimit=15,
ospin=false,
bg='rgb',bgm='truth',
},
mesDisp=function(P)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,220)
PLY.draw.drawTargetLine(P,r)
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=24 and 5 or
L>=20 and 4 or
L>=16 and 3 or
L>=12 and 2 or
L>=8 and 1 or
L>=1 and 0
end,
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=24 and 5 or
L>=20 and 4 or
L>=16 and 3 or
L>=12 and 2 or
L>=8 and 1 or
L>=1 and 0
end,
}

View File

@@ -1,42 +1,42 @@
return{
color=COLOR.red,
env={
drop=20,lock=60,
fall=10,
dropPiece=function(P)
if P.lastPiece.pc then
P.gameEnv.heightLimit=4
if P.stat.pc%5==0 then
P.gameEnv.drop=math.max(P.gameEnv.drop-1,1)
end
else
P.gameEnv.heightLimit=P.gameEnv.heightLimit-P.lastPiece.row
end
if #P.field>P.gameEnv.heightLimit then
P:lose()
end
end,
freshLimit=8,
heightLimit=4,
ospin=false,
bg='rgb',bgm='moonbeam',
},
mesDisp=function(P)
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=50 and 5 or
L>=40 and 4 or
L>=30 and 3 or
L>=20 and 2 or
L>=10 and 1 or
L>=5 and 0
end,
color=COLOR.red,
env={
drop=20,lock=60,
fall=10,
dropPiece=function(P)
if P.lastPiece.pc then
P.gameEnv.heightLimit=4
if P.stat.pc%5==0 then
P.gameEnv.drop=math.max(P.gameEnv.drop-1,1)
end
else
P.gameEnv.heightLimit=P.gameEnv.heightLimit-P.lastPiece.row
end
if #P.field>P.gameEnv.heightLimit then
P:lose()
end
end,
freshLimit=8,
heightLimit=4,
ospin=false,
bg='rgb',bgm='moonbeam',
},
mesDisp=function(P)
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=50 and 5 or
L>=40 and 4 or
L>=30 and 3 or
L>=20 and 2 or
L>=10 and 1 or
L>=5 and 0
end,
}

View File

@@ -1,35 +1,35 @@
return{
color=COLOR.red,
env={
drop=20,lock=60,
fall=20,
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
freshLimit=15,
ospin=false,
bg='rgb',bgm='moonbeam',
},
mesDisp=function(P)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,220)
PLY.draw.drawTargetLine(P,r)
color=COLOR.red,
env={
drop=20,lock=60,
fall=20,
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
freshLimit=15,
ospin=false,
bg='rgb',bgm='moonbeam',
},
mesDisp=function(P)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,220)
PLY.draw.drawTargetLine(P,r)
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=24 and 5 or
L>=20 and 4 or
L>=16 and 3 or
L>=12 and 2 or
L>=8 and 1 or
L>=1 and 0
end,
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=24 and 5 or
L>=20 and 4 or
L>=16 and 3 or
L>=12 and 2 or
L>=8 and 1 or
L>=1 and 0
end,
}

View File

@@ -1,33 +1,33 @@
return{
color=COLOR.green,
env={
infHold=true,
drop=150,lock=1e99,
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
bg='rgb',bgm='truth',
},
mesDisp=function(P)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,220)
PLY.draw.drawTargetLine(P,r)
color=COLOR.green,
env={
infHold=true,
drop=150,lock=1e99,
dropPiece=function(P)if P.stat.row>=100 then P:win('finish')end end,
bg='rgb',bgm='truth',
},
mesDisp=function(P)
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,63,220)
PLY.draw.drawTargetLine(P,r)
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=24 and 5 or
L>=20 and 4 or
L>=16 and 3 or
L>=12 and 2 or
L>=8 and 1 or
L>=1 and 0
end,
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=24 and 5 or
L>=20 and 4 or
L>=16 and 3 or
L>=12 and 2 or
L>=8 and 1 or
L>=1 and 0
end,
}

View File

@@ -5,73 +5,73 @@ local PCbase=require"parts.modes.PCbase"
local PClist=require"parts.modes.PClist"
local function task_PC(P)
P.control=false
for _=1,26 do YIELD()end
P.control=true
local base=PCbase[P.modeData.type]
P:pushLineList(base[P.holeRND:random(#base)],P.modeData.symmetry)
P.control=false
for _=1,26 do YIELD()end
P.control=true
local base=PCbase[P.modeData.type]
P:pushLineList(base[P.holeRND:random(#base)],P.modeData.symmetry)
end
local function check(P)
local f=P.field
if #f>0 then
if #f+P.stat.row%4>4 then
P:lose()
end
else
local type=P.stat.pc<10 and 4 or 5
local L=PClist[type][P.holeRND:random(#PClist[type])]
local symmetry=P.holeRND:random()>.5
P.modeData.type=type
P.modeData.symmetry=symmetry
P:pushNextList(L,symmetry)
P.modeData.counter=P.stat.piece==0 and 20 or 0
P:newTask(task_PC)
local f=P.field
if #f>0 then
if #f+P.stat.row%4>4 then
P:lose()
end
else
local type=P.stat.pc<10 and 4 or 5
local L=PClist[type][P.holeRND:random(#PClist[type])]
local symmetry=P.holeRND:random()>.5
P.modeData.type=type
P.modeData.symmetry=symmetry
P:pushNextList(L,symmetry)
P.modeData.counter=P.stat.piece==0 and 20 or 0
P:newTask(task_PC)
local s=P.stat.pc*.25
if math.floor(s)==s and s>0 then
P.gameEnv.drop=pc_drop[s]or 10
P.gameEnv.lock=pc_lock[s]or 25
P.gameEnv.fall=pc_fall[s]or 4
if s==10 then
P:showTextF(text.maxspeed,0,-140,100,'appear',.6)
end
end
end
local s=P.stat.pc*.25
if math.floor(s)==s and s>0 then
P.gameEnv.drop=pc_drop[s]or 10
P.gameEnv.lock=pc_lock[s]or 25
P.gameEnv.fall=pc_fall[s]or 4
if s==10 then
P:showTextF(text.maxspeed,0,-140,100,'appear',.6)
end
end
end
end
return{
color=COLOR.red,
env={
nextCount=5,
holdCount=0,
drop=60,lock=60,
fall=20,
sequence='none',
freshLimit=15,
dropPiece=check,
RS="SRS",
bg='rgb',bgm='oxygen',
},
load=function()
PLY.newPlayer(1)
check(PLAYERS[1])
end,
mesDisp=function(P)
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=50 and 5 or
L>=42 and 4 or
L>=26 and 3 or
L>=18 and 2 or
L>=10 and 1 or
L>=3 and 0
end,
color=COLOR.red,
env={
nextCount=5,
holdCount=0,
drop=60,lock=60,
fall=20,
sequence='none',
freshLimit=15,
dropPiece=check,
RS="SRS",
bg='rgb',bgm='oxygen',
},
load=function()
PLY.newPlayer(1)
check(PLAYERS[1])
end,
mesDisp=function(P)
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=50 and 5 or
L>=42 and 4 or
L>=26 and 3 or
L>=18 and 2 or
L>=10 and 1 or
L>=3 and 0
end,
}

View File

@@ -1,68 +1,68 @@
local PCbase=require"parts.modes.PCbase"
local PClist=require"parts.modes.PClist"
local PCtype={
1,1,1,1,2,
1,1,1,1,3,
1,1,1,2,
1,2,1,3,
1,2,3,
1,1,1,1,2,
1,1,1,1,3,
1,1,1,2,
1,2,1,3,
1,2,3,
}
local function task_PC(P)
P.control=false
for _=1,26 do YIELD()end
P.control=true
local base=PCbase[P.modeData.type]
P:pushLineList(base[P.holeRND:random(#base)],P.modeData.symmetry)
P.control=false
for _=1,26 do YIELD()end
P.control=true
local base=PCbase[P.modeData.type]
P:pushLineList(base[P.holeRND:random(#base)],P.modeData.symmetry)
end
local function check(P)
local r=P.field
if #r>0 then
if #r+P.stat.row%4>4 then
P:lose()
end
else
local type=PCtype[P.stat.pc+1]or 3
local L=PClist[type][P.holeRND:random(#PClist[type])]
local symmetry=P.holeRND:random()>.5
P.modeData.type=type
P.modeData.symmetry=symmetry
P:pushNextList(L,symmetry)
P.modeData.counter=P.stat.piece==0 and 20 or 0
P:newTask(task_PC)
end
local r=P.field
if #r>0 then
if #r+P.stat.row%4>4 then
P:lose()
end
else
local type=PCtype[P.stat.pc+1]or 3
local L=PClist[type][P.holeRND:random(#PClist[type])]
local symmetry=P.holeRND:random()>.5
P.modeData.type=type
P.modeData.symmetry=symmetry
P:pushNextList(L,symmetry)
P.modeData.counter=P.stat.piece==0 and 20 or 0
P:newTask(task_PC)
end
end
return{
color=COLOR.green,
env={
nextCount=4,
holdCount=0,
drop=120,lock=180,
fall=20,
sequence='none',
dropPiece=check,
RS="SRS",
bg='rgb',bgm='oxygen',
},
load=function()
PLY.newPlayer(1)
check(PLAYERS[1])
end,
mesDisp=function(P)
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=62 and 5 or
L>=42 and 4 or
L>=26 and 3 or
L>=18 and 2 or
L>=10 and 1 or
L>=2 and 0
end,
color=COLOR.green,
env={
nextCount=4,
holdCount=0,
drop=120,lock=180,
fall=20,
sequence='none',
dropPiece=check,
RS="SRS",
bg='rgb',bgm='oxygen',
},
load=function()
PLY.newPlayer(1)
check(PLAYERS[1])
end,
mesDisp=function(P)
setFont(60)
mStr(P.stat.pc,63,300)
mText(drawableText.pc,63,370)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.pc
return
L>=62 and 5 or
L>=42 and 4 or
L>=26 and 3 or
L>=18 and 2 or
L>=10 and 1 or
L>=2 and 0
end,
}

View File

@@ -2,73 +2,73 @@ local gc=love.graphics
local dropSpeed={[0]=40,33,27,20,16,12,11,10,9,8,7,6,5,4,3,3,2,2,1,1}
return{
color=COLOR.green,
env={
noTele=true,
lock=1e99,
wait=20,fall=90,
mindas=7,minarr=1,minsdarr=1,
keyCancel={6},
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')
else
P.modeData.bpm=40+2*P.modeData.target/10
P.modeData.beatFrame=math.floor(3600/P.modeData.bpm)
P.gameEnv.fall=P.modeData.beatFrame
P.gameEnv.wait=math.max(P.gameEnv.wait-2,0)
P.gameEnv.drop=dropSpeed[P.modeData.target/10]
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
end,
task=function(P)
P.modeData.target=10
P.modeData.bpm=40
P.modeData.beatFrame=90
P.modeData.counter=90
while true do
YIELD()
P.modeData.counter=P.modeData.counter-1
if P.modeData.counter==0 then
P.modeData.counter=P.modeData.beatFrame
SFX.play('click',.3)
P:switchKey(6,true)
P:pressKey(6)
P:switchKey(6,false)
end
end
end,
bg='bg2',bgm='push',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
color=COLOR.green,
env={
noTele=true,
lock=1e99,
wait=20,fall=90,
mindas=7,minarr=1,minsdarr=1,
keyCancel={6},
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')
else
P.modeData.bpm=40+2*P.modeData.target/10
P.modeData.beatFrame=math.floor(3600/P.modeData.bpm)
P.gameEnv.fall=P.modeData.beatFrame
P.gameEnv.wait=math.max(P.gameEnv.wait-2,0)
P.gameEnv.drop=dropSpeed[P.modeData.target/10]
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
end,
task=function(P)
P.modeData.target=10
P.modeData.bpm=40
P.modeData.beatFrame=90
P.modeData.counter=90
while true do
YIELD()
P.modeData.counter=P.modeData.counter-1
if P.modeData.counter==0 then
P.modeData.counter=P.modeData.beatFrame
SFX.play('click',.3)
P:switchKey(6,true)
P:pressKey(6)
P:switchKey(6,false)
end
end
end,
bg='bg2',bgm='push',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
setFont(30)
mStr(P.modeData.bpm,63,178)
setFont(30)
mStr(P.modeData.bpm,63,178)
gc.setLineWidth(4)
gc.circle('line',63,200,30)
gc.setLineWidth(4)
gc.circle('line',63,200,30)
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',63,200,30+45*beat)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=170 and 4 or
L>=140 and 3 or
L>=100 and 2 or
L>=50 and 1 or
L>=20 and 0
end,
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',63,200,30+45*beat)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=170 and 4 or
L>=140 and 3 or
L>=100 and 2 or
L>=50 and 1 or
L>=20 and 0
end,
}

View File

@@ -2,73 +2,73 @@ local gc=love.graphics
local dropSpeed={[0]=60,50,40,30,24,18,14,10,8,6,5,4,3,2,1,1,.5,.5,.25,.25}
return{
color=COLOR.magenta,
env={
noTele=true,
lock=1e99,
wait=10,fall=60,
mindas=7,minarr=1,minsdarr=1,
keyCancel={6},
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')
else
P.modeData.bpm=60+3*P.modeData.target/10
P.modeData.beatFrame=math.floor(3600/P.modeData.bpm)
P.gameEnv.fall=P.modeData.beatFrame
P.gameEnv.wait=math.max(P.gameEnv.wait-1,0)
P.gameEnv.drop=dropSpeed[P.modeData.target/10]
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
end,
task=function(P)
P.modeData.target=10
P.modeData.bpm=60
P.modeData.beatFrame=60
P.modeData.counter=60
while true do
YIELD()
P.modeData.counter=P.modeData.counter-1
if P.modeData.counter==0 then
P.modeData.counter=P.modeData.beatFrame
SFX.play('click',.3)
P:switchKey(6,true)
P:pressKey(6)
P:switchKey(6,false)
end
end
end,
bg='bg2',bgm='secret8th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
color=COLOR.magenta,
env={
noTele=true,
lock=1e99,
wait=10,fall=60,
mindas=7,minarr=1,minsdarr=1,
keyCancel={6},
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')
else
P.modeData.bpm=60+3*P.modeData.target/10
P.modeData.beatFrame=math.floor(3600/P.modeData.bpm)
P.gameEnv.fall=P.modeData.beatFrame
P.gameEnv.wait=math.max(P.gameEnv.wait-1,0)
P.gameEnv.drop=dropSpeed[P.modeData.target/10]
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
end,
task=function(P)
P.modeData.target=10
P.modeData.bpm=60
P.modeData.beatFrame=60
P.modeData.counter=60
while true do
YIELD()
P.modeData.counter=P.modeData.counter-1
if P.modeData.counter==0 then
P.modeData.counter=P.modeData.beatFrame
SFX.play('click',.3)
P:switchKey(6,true)
P:pressKey(6)
P:switchKey(6,false)
end
end
end,
bg='bg2',bgm='secret8th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
setFont(30)
mStr(P.modeData.bpm,63,178)
setFont(30)
mStr(P.modeData.bpm,63,178)
gc.setLineWidth(4)
gc.circle('line',63,200,30)
gc.setLineWidth(4)
gc.circle('line',63,200,30)
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',63,200,30+45*beat)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=170 and 4 or
L>=140 and 3 or
L>=100 and 2 or
L>=50 and 1 or
L>=20 and 0
end,
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',63,200,30+45*beat)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=170 and 4 or
L>=140 and 3 or
L>=100 and 2 or
L>=50 and 1 or
L>=20 and 0
end,
}

View File

@@ -1,80 +1,80 @@
local gc=love.graphics
return{
color=COLOR.magenta,
env={
noTele=true,
lock=1e99,
drop=.5,
wait=5,fall=30,
das=6,minarr=1,minsdarr=1,
keyCancel={6},
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')
else
P.modeData.bpm=120+2*P.modeData.target/10
P.modeData.beatFrame=math.floor(3600/P.modeData.bpm)
P.gameEnv.fall=P.modeData.beatFrame
P.gameEnv.wait=math.max(P.gameEnv.wait-1,0)
if P.modeData.target==50 then
P.gameEnv.das=5
P.gameEnv.drop=.25
elseif P.modeData.target==100 then
P.gameEnv.das=4
P:set20G(true)
end
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
end,
task=function(P)
P.modeData.target=10
P.modeData.bpm=120
P.modeData.beatFrame=30
P.modeData.counter=30
while true do
YIELD()
P.modeData.counter=P.modeData.counter-1
if P.modeData.counter==0 then
P.modeData.counter=P.modeData.beatFrame
SFX.play('click',.3)
P:switchKey(6,true)
P:pressKey(6)
P:switchKey(6,false)
end
end
end,
bg='bg2',bgm='secret7th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
color=COLOR.magenta,
env={
noTele=true,
lock=1e99,
drop=.5,
wait=5,fall=30,
das=6,minarr=1,minsdarr=1,
keyCancel={6},
dropPiece=function(P)
if P.stat.row>=P.modeData.target then
if P.modeData.target==200 then
P:win('finish')
else
P.modeData.bpm=120+2*P.modeData.target/10
P.modeData.beatFrame=math.floor(3600/P.modeData.bpm)
P.gameEnv.fall=P.modeData.beatFrame
P.gameEnv.wait=math.max(P.gameEnv.wait-1,0)
if P.modeData.target==50 then
P.gameEnv.das=5
P.gameEnv.drop=.25
elseif P.modeData.target==100 then
P.gameEnv.das=4
P:set20G(true)
end
P.modeData.target=P.modeData.target+10
SFX.play('reach')
end
end
end,
task=function(P)
P.modeData.target=10
P.modeData.bpm=120
P.modeData.beatFrame=30
P.modeData.counter=30
while true do
YIELD()
P.modeData.counter=P.modeData.counter-1
if P.modeData.counter==0 then
P.modeData.counter=P.modeData.beatFrame
SFX.play('click',.3)
P:switchKey(6,true)
P:pressKey(6)
P:switchKey(6,false)
end
end
end,
bg='bg2',bgm='secret7th',
},
slowMark=true,
mesDisp=function(P)
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
setFont(30)
mStr(P.modeData.bpm,63,178)
setFont(30)
mStr(P.modeData.bpm,63,178)
gc.setLineWidth(4)
gc.circle('line',63,200,30)
gc.setLineWidth(4)
gc.circle('line',63,200,30)
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',63,200,30+45*beat)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=170 and 4 or
L>=140 and 3 or
L>=100 and 2 or
L>=50 and 1 or
L>=20 and 0
end,
local beat=P.modeData.counter/P.modeData.beatFrame
gc.setColor(1,1,1,1-beat)
gc.setLineWidth(3)
gc.circle('line',63,200,30+45*beat)
end,
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=170 and 4 or
L>=140 and 3 or
L>=100 and 2 or
L>=50 and 1 or
L>=20 and 0
end,
}

Some files were not shown because too many files have changed in this diff Show More