Compare commits

...

12 Commits

Author SHA1 Message Date
MrZ_26
d02048f0dc 0.8.8 2020-02-18 23:05:10 +08:00
MrZ_26
4da080c6f5 0.8.7 2020-02-14 19:26:57 +08:00
MrZ_26
5f62127f28 0.8.6 2020-02-14 00:22:15 +08:00
MrZ_26
f6835c2118 0.8.5- 2020-02-12 23:49:24 +08:00
MrZ_26
3155bc48ef 0.8.4α 2020-02-04 20:33:46 +08:00
MrZ_26
c1b334963b 0.8.3α 2020-02-04 19:41:15 +08:00
MrZ_26
0dbdc9fe42 0.8.2+α 2020-02-04 19:40:51 +08:00
MrZ_26
324435d51a 0.8.2α 2020-02-04 19:40:34 +08:00
MrZ_26
1c384ca51a 0.8.2α 2020-02-04 19:40:21 +08:00
MrZ_26
e196790e2c 0.8.1α 2020-02-04 19:38:58 +08:00
MrZ_26
659a50300d 0.8.0α 2020-02-04 19:38:48 +08:00
MrZ_26
918d17ad9a 0.7.35α 2020-02-04 19:38:28 +08:00
140 changed files with 8767 additions and 4404 deletions

BIN
SFX/click.ogg Normal file

Binary file not shown.

BIN
SFX/enter.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
SFX/finesseError.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
VOICE/egg_1.ogg Normal file

Binary file not shown.

BIN
VOICE/egg_2.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
VOICE/nya_happy_4.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_sad_1.ogg Normal file

Binary file not shown.

153
class.lua
View File

@@ -31,7 +31,10 @@ function clearTask(opt)
end
end
local button={type="button"}
local button={
type="button",
ATV=0,--activating time(0~8)
}
function newButton(x,y,w,h,color,font,code,hide,N)
local _={
x=x-w*.5,y=y-h*.5,
@@ -43,37 +46,56 @@ function newButton(x,y,w,h,color,font,code,hide,N)
next=N,
}for k,v in next,button do _[k]=v end return _
end
function button:reset()
self.ATV=0
end
function button:isAbove(x,y)
return x>self.x and x<self.x+self.w and y>self.y and y<self.y+self.h
return x>self.x-self.ATV and x<self.x+self.w+2*self.ATV and y>self.y-self.ATV and y<self.y+self.h+2*self.ATV
end
function button:FX()
sysFX[#sysFX+1]={0,0,10,self.x,self.y,self.w,self.h}
--[0=ripple],timer,duration,x,y,w,h
sysFX[#sysFX+1]={0,0,10,self.x-self.ATV,self.y-self.ATV,self.w+2*self.ATV,self.h+2*self.ATV}
--0[ripple],timer,duration,x,y,w,h
end
function button:update()
if widget_sel==self then
if self.ATV<8 then self.ATV=self.ATV+1 end
else
if self.ATV>0 then self.ATV=self.ATV-1 end
end
end
function button:draw()
local C=self.color
gc.setColor(C)
gc.setLineWidth(3)gc.rectangle("line",self.x,self.y,self.w,self.h,4)
gc.setColor(C[1],C[2],C[3],.4)
gc.setLineWidth(5)gc.rectangle("line",self.x,self.y,self.w,self.h,4)
if self==widget_sel then
gc.rectangle("fill",self.x,self.y,self.w,self.h,4)
end--Highlight when Selected
local x,y,w,h=self.x,self.y,self.w,self.h
local r,g,b=unpack(self.color)
gc.setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
gc.rectangle("fill",x-self.ATV,y-self.ATV,w+2*self.ATV,h+2*self.ATV)
if self.ATV>0 then
gc.setLineWidth(4)
gc.setColor(1,1,1,self.ATV*.125)
gc.rectangle("line",x-self.ATV+2,y-self.ATV+2,w+2*self.ATV-4,h+2*self.ATV-4)
end
local t=self.text
if t then
if type(t)=="function"then t=t()end
setFont(self.font)
local y0=self.y+self.h*.5-self.font*.7
gc.printf(t,self.x-2,y0-1,self.w,"center")
gc.setColor(C)
gc.printf(t,self.x,y0,self.w,"center")
local y0=y+h*.5-self.font*.7
gc.setColor(1,1,1,.3)
gc.printf(t,x-2,y0-2,w,"center")
gc.printf(t,x-2,y0+2,w,"center")
gc.printf(t,x+2,y0-2,w,"center")
gc.printf(t,x+2,y0+2,w,"center")
gc.setColor(r*.5,g*.5,b*.5)
gc.printf(t,x,y0,w,"center")
end
end
function button:getInfo()
print(format("x=%d,y=%d,w=%d,h=%d,font=%d",self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font))
end
local switch={type="switch"}
local switch={
type="switch",
ATV=0,--activating time(0~8)
CHK=0,--check alpha(0~6)
}
function newSwitch(x,y,font,disp,code,hide,N)
local _={
x=x,y=y,font=font,
@@ -83,28 +105,38 @@ function newSwitch(x,y,font,disp,code,hide,N)
next=N,
}for k,v in next,switch do _[k]=v end return _
end
function switch:isAbove(x,y)
return x>self.x and x<self.x+100 and y>self.y-20 and y<self.y+20
function switch:reset()
self.ATV=0
self.CHK=0
end
function switch:FX()
sysFX[#sysFX+1]=self.disp()and
{1,0,15,1,.4,.4,self.x,self.y-20,50,40,0}--Switched on
or{1,0,15,.4,1,.4,self.x+50,self.y-20,50,40,0}--Switched off
--[1=square fade],timer,duration,r,g,b,x,y,w,h
function switch:isAbove(x,y)
return x>self.x and x<self.x+50 and y>self.y-25 and y<self.y+25
end
function switch:update()
local _=self.ATV
if widget_sel==self then if _<8 then self.ATV=_+1 end
else if _>0 then self.ATV=_-1 end
end
_=self.CHK
if self:disp()then if _<6 then self.CHK=_+1 end
else if _>0 then self.CHK=_-1 end
end
end
function switch:draw()
local x,y=self.x,self.y-20
if self.disp()then
gc.setColor(.6,1,.6)
gc.rectangle("fill",x+50,y,50,40,3)
--ON
else
gc.setColor(1,.6,.6)
gc.rectangle("fill",x,y,50,40,3)
--OFF
end--switch
gc.setColor(1,1,1,self==widget_sel and 1 or .6)
gc.setLineWidth(3)gc.rectangle("line",x-3,y-3,106,46,5)
local x,y=self.x,self.y-25
if self.ATV>0 then
gc.setColor(1,1,1,self.ATV*.08)
gc.rectangle("fill",x,y,50,50)
end
if self.CHK>0 then
gc.setColor(.9,1,.9,self.CHK/6)
gc.setLineWidth(6)
gc.line(x+5,y+25,x+18,y+38,x+45,y+11)
end
--checked
gc.setLineWidth(4)
gc.setColor(1,1,1,.6+self.ATV*.05)
gc.rectangle("line",x,y,50,50)
--frame
local t=self.text
if t then
@@ -117,7 +149,11 @@ function switch:getInfo()
print(format("x=%d,y=%d,font=%d",self.x,self.y,self.font))
end
local slider={type="slider"}
local slider={
type="slider",
ATV=0,--activating time(0~8)
pos=0,--position shown
}
function newSlider(x,y,w,unit,font,change,disp,code,hide,N)
local _={
x=x,y=y,
@@ -130,35 +166,52 @@ function newSlider(x,y,w,unit,font,change,disp,code,hide,N)
next=N,
}for k,v in next,slider do _[k]=v end return _
end
function slider:reset()
self.ATV=0
self.pos=0
end
function slider:isAbove(x,y)
return x>self.x-10 and x<self.x+self.w+10 and y>self.y-20 and y<self.y+20
end
function slider:FX(pos)
sysFX[#sysFX+1]={1,0,10,1,1,1,self.x+self.w*pos/self.unit-8,self.y-15,17,30}
--[1=square fade],timer,duration,r,g,b,x,y,w,h
function slider:update()
if widget_sel==self then
if self.ATV<6 then self.ATV=self.ATV+1 end
else
if self.ATV>0 then self.ATV=self.ATV-1 end
end
if not(self.hide and self.hide())then
self.pos=self.pos*.7+self.disp()*.3
end
end
function slider:draw()
local S=self==widget_sel
gc.setColor(1,1,1,S and 1 or .5)
local x,y=self.x,self.y
gc.setColor(1,1,1,.5+self.ATV*.06)
gc.setLineWidth(2)
local x1,x2=self.x,self.x+self.w
local x1,x2=x,x+self.w
for p=0,self.unit do
local x=x1+(x2-x1)*p/self.unit
gc.line(x,self.y+7,x,self.y-7)
gc.line(x,y+7,x,y-7)
end
--units
gc.setLineWidth(5)
gc.line(x1,self.y,x2,self.y)
gc.setLineWidth(4)
gc.line(x1,y,x2,y)
--axis
gc.setColor(1,1,1)
gc.rectangle("fill",x1+(x2-x1)*self.disp()/self.unit-8,self.y-15,17,30)
--block
local t=self.text
if t then
gc.setColor(1,1,1)
setFont(self.font)
gc.printf(t,self.x-312,self.y-self.font*.7,300,"right")
gc.printf(t,x-312,y-self.font*.7,300,"right")
end
--text
local x,y,w,h=x1+(x2-x1)*self.pos/self.unit-10-self.ATV*.5,y-16-self.ATV,20+self.ATV,32+2*self.ATV
gc.setColor(.8,.8,.8)
gc.rectangle("fill",x,y,w,h)
if self.ATV>0 then
gc.setLineWidth(2)
gc.setColor(1,1,1,self.ATV*.16)
gc.rectangle("line",x+1,y+1,w-2,h-2)
end
--block
end
function slider:getInfo()
print(format("x=%d,y=%d,w=%d",self.x,self.y,self.w))

View File

@@ -1,41 +1,35 @@
math.randomseed(os.time())
gameVersion="Alpha V0.7.34"
gameVersion="Alpha V0.8.8"
function love.conf(t)
t.identity="Techmino"--Save directory name
t.version="11.1"
t.console=X
t.gammacorrect=X
t.appendidentity=X--If search files in source before save directory
t.accelerometerjoystick=X--If exposing accelerometer on iOS and Android as a Joystick
t.audio.mixwithsystem=true--Switch on to keep sysBGM
t.console=false
t.gammacorrect=false
t.appendidentity=false--Search files in source before save directory
t.accelerometerjoystick=false--ios/android加速度计=摇杆
t.audio.mixwithsystem=true
local W=t.window
if math.random()>.26 then
W.title="Techmino "..gameVersion
else
math.randomseed(tonumber(os.date("%Y%j")))
W.title="Your lucky number today:"..math.random(100,626)
end
W.title="Techmino "..gameVersion
W.icon="/image/icon.png"
W.width,W.height=1280,720
W.minwidth,W.minheight=640,360
W.borderless=X
W.resizable=1
W.borderless=false
W.resizable=true
W.fullscreentype="desktop"--"exclusive"
W.fullscreen=X
W.vsync=0--0∞fps
W.msaa=X--The number of samples to use with multi-sampled antialiasing (number)
W.depth=X--Bits per sample in the depth buffer
W.stencil=1--The number of bits per sample in the stencil buffer
W.fullscreen=false
W.vsync=0--0:∞fps
W.msaa=false--The number of samples to use with multi-sampled antialiasing (number)
W.depth=0--Bits per sample in the depth buffer
W.stencil=1--Bits per sample in the stencil buffer
W.display=1--Monitor ID
W.highdpi=X--Enable high-dpi mode for the window on a Retina display (boolean)
W.highdpi=false--Enable high-dpi mode for the window on a Retina display (boolean)
W.x,W.y=nil
local M=t.modules
M.window,M.system,M.event=1,1,1
M.audio,M.sound=1,1
M.math,M.data=1,1
M.timer,M.graphics,M.font,M.image=1,1,1,1
M.mouse,M.touch,M.keyboard,M.joystick=1,1,1,1
M.physics,M.thread,M.video=X
M.window,M.system,M.event=true,true,true
M.audio,M.sound=true,true
M.math,M.data=true,true
M.timer,M.graphics,M.font,M.image=true,true,true,true
M.mouse,M.touch,M.keyboard,M.joystick=true,true,true,true
M.physics,M.thread,M.video=false,false,false
end

File diff suppressed because it is too large Load Diff

View File

@@ -1,26 +1,29 @@
setting={
das=10,arr=2,
sddas=0,sdarr=2,
quickR=true,swap=true,
reTime=10,
maxNext=6,
quickR=true,
swap=true,
fine=false,
--game
ghost=true,center=true,
smo=true,grid=false,
dropFX=3,
shakeFX=1,
shakeFX=2,
atkFX=3,
frameMul=100,
--
fullscreen=false,
bg=true,
bgblock=true,
bgspace=true,
lang=1,
skin=1,
--graphic
sfx=10,bgm=7,
vib=3,voc=0,
vib=0,voc=0,
stereo=6,
--sound
@@ -32,12 +35,12 @@ setting={
{},{},{},{},{},{},{},
--joystick
},
VKSwitch=true,
VKTrack=true,--If tracked
VKDodge=false,--If repel
VKTchW=3,--Touch Weight
VKCurW=4,--CurPos Weight
VKIcon=true,
VKSwitch=false,--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,
--control
}

View File

@@ -1,89 +1,55 @@
游戏方法:
控制系统提供的一个个方块,每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话)
完成当前游戏模式中的目标或者是活到最后即算胜利.
控制系统提供的一个个四联方块(左右移动和旋转90,180,270度),每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话)
活到最后或者完成目标即胜利.
旋转系统:
使用Techmino专属旋转系统,细节不赘述
使用Techmino专属旋转系统
细节不赘述
spin判定:
结合了不可移动判定和三角判定,是否为mini也与这二者有关,细节不赘述
结合了不可移动判定和三角判定,是否为mini也与判定过程数据有关
细节不赘述
攻击系统:
消1/2/3/4攻击0/1/2/4
spin1/2/3攻击2/4/6,若mini则减半
b2b:增加1~2(tetris)/1~3(spin)攻击
b3b:满b2b效果+1额外抵挡
PC:其它攻击与6~8(本局内递增)取高+2额外抵挡
连击:0,0,1,1,2,2,3,3,4,4,3……
普通消除:
1/2/3/4攻击0.25/1.25/2.25/4
特殊消除:
spin1/2/3攻击2/4/6,若mini则减半
B2B:加1(techrash/spin1/spin2)或2(spin3)攻击
B3B:在B2B效果之上再+1攻击和+1额外抵挡
连击:0,0,1,1,2,2,3,3,4,4,3……
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)
PC:将上述伤害之和开根号,再+6~10(本局内递增)+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)
根据上述规则计算后,向下取整,攻击打出
back to back(B2B)点数说明:
B2B点数的范围在0~1200
在40及以上特殊消除时B2B,在1000以上特殊消除时B3B,1200封顶
消四+100
空spin加20,不超过1000
spin1~3+50/100/180 (mini*.5)
普通消除-250
1000以上空放一块-40(不减到低于1000)
分数系统:
玩得越牛逼得分越高嗷(
攻击延迟:
消2/3的攻击生效最快,消四其次,spin攻击生效较慢,高连击生效最慢
b2b或者b3b增加攻击力的同时也会减缓一点生效速度,mini大幅减缓生效速度
B2B或者B3B增加攻击力的同时也会减缓一点生效速度,mini大幅减缓生效速度
抵消逻辑:
发动攻击时,若缓冲条有攻击则先用额外抵挡再用攻击力1:1抵消最先受到的攻击
没有用上的额外抵挡会被丢弃,最后剩下的攻击力会发送给对手
back to back(B2B)点数说明:
B2B点数的范围在0~1200,在点数>=40时进行特殊消除为B2B,>1000时特殊消除为B3B
普通消除-250
spin1/2/3:+50/100/180(mini减半)
消四:+100
空spin:+20,此法得到的点数不能超过1000
当点数在1000以上时空放一块-40(不减到低于1000)
模式说明:
竞速:
用你最快的速度消除40行(据难度而定)吧!
马拉松:
根据总消行数,速度会逐渐加快,消除两百行吧!(easy和hard就是normal开始和结束的速度,消除200行不加速)
大师:
马拉松进化版,如果觉得马拉松太简单了久玩这个吧,每一个难度都是一层境界,L难度和U难度攒到500点数通关,final难度为上级者专属游戏模式,不建议游玩.
经典:
使用低速控制设置在高速下落时尽可能消除更多的行,没有通关目标.(到90有"彩蛋")
:
闲得无聊,只是想单纯地打打块地时候可以玩此模式,无重力消除200行.
无尽:
无尽模式,边上会显示玩家的消行数和攻击效率,适合科研(术语).
单挑:
和一个电脑玩家单挑,带加号的和最后一个模式是超强机器人(仅限Windows平台),试试你能稳定打败多难的对手吧!
回合制:
玩法同单挑模式,只不过只有当一个人放下一个方块后另一个人才能放下一块.
仅TSD:
这个模式中,玩家必须用TSD(T spin double)的方式消除,否则直接判负,你能连续打出多少个TSD呢?
隐形:
根据不同难度,场地内(甚至当前方块)会隐形,看看你能活多久吧!(GM难度为类似TGM3的GM Roll,用于上级者练习)
挖掘:
每隔一定时间,系统会向场地的低端添加一行垃圾行,间隔会随着波数增加而越来越短,你能顶住几波呢?
生存:
每隔一定时间,系统会向玩家的垃圾缓冲槽中添加垃圾行,释放速度和间隔会随着波数增加而越来越短,玩家可以将其抵消也可以让其释放,尽可能活更久的时间.
防守:
系统会向玩家的垃圾缓冲槽中添加难消除的垃圾行,释放速度和间隔会随着波数增加而越来越短,玩家要尽量抵消他们来让自己存活更久.
进攻:
当玩家的攻击缓冲槽空时,系统会向玩家的垃圾缓冲槽中添加大量的垃圾行(高难度下后期甚至会远超过20),释放速度和间隔都会随着波数增加而越来越短,垃圾上涨速度也会提升.赶紧在其释放之前将攻击抵消到不会一下致命的量!
科研:
玩家只被允许做特殊消除(spin/全消/消四),在带+的难度中不允许消四,U难度下玩家甚至只被允许每一个方块都使用最简操作控制,任何违反规则的行为都会判负.
C4W练习:(或者说是4w练习)
系统直接提供给玩家"留4列"的场地,玩家可以自由练习4w消除,该技巧在某些时候实战很有用.(需要学会spin,否则意义不是很大)
全清训练:
系统会连续给玩家提供"标准开局PC套路"的场地和四个方块(不允许使用hold),玩家需要一直完成PC,否则判负.
全清挑战:
在消除一百行的限制内,你能全清几次?
49人混战:
许多玩家同时进行一局游戏其它的是AI,不是真人).随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力.
玩家可选四个攻击模式:
1.随机:每次攻击后10%随机挑选一个玩家锁定
2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家
3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新)
4.反击:攻击所有锁定自己的玩家AOE,若无则伏击随机玩家
坚持到最后的玩家就是胜利者.
99人混战:
同49人混战,只是增加到了99名玩家,难度系数也有调整,对设备的要求也较高.
干旱:
系统提供的方块序列变得奇怪了!你能消除100行不死吗,或者,多快?
多人:
使用键盘或者多个手柄(也许?)
自定义:
玩家可以自由调整下落速度等等几乎大多数设置(不包括上述各种游戏模式的特殊效果),也可以画一个场地去消除或者是作为提示模板来玩方块拼图.在拼图模式下,按功能键切换是否显示提示模板.其中打"X"的格子不允许有方块,空的格子可以是任何状态,玩家能获得的七种普通方块必须完全符合,垃圾行方块的为止只要有方块就可以,但是不能是空气,玩家拼出自己画的图后就会判定胜利.
混战模式说明:
许多玩家同时进行一局游戏对手都是AI,不是真人).随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力.
玩家可选四个攻击模式:
1.随机:每次攻击后10%随机挑选一个玩家锁定
2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家
3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新)
4.反击:攻击所有锁定自己的玩家攻击AOE,若未被任何人锁定则伏击随机玩家
坚持到最后的玩家就是胜利者.
自定义模式说明:
玩家可以自由调整大多数参数(不包括上述各种游戏模式的特殊效果),也可以画一个场地去消除或者是作为提示模板来进行拼图模式.
在拼图模式下,按功能键切换是否展示提示.其中打"X"的格子不允许有方块,空的格子可以是任何状态,普通的七种彩色方块必须颜色对应,垃圾行方块的为止只要有方块就可以,但是不能是空气,玩家拼出自己画的图后就会判定胜利.

BIN
font.ttf

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

BIN
image/BG/bg1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 B

After

Width:  |  Height:  |  Size: 155 B

BIN
image/mess/speedLimit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
image/miya/ch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

BIN
image/miya/f1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
image/miya/f2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
image/miya/f3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
image/miya/f4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
image/modeIcon/custom.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 767 B

BIN
image/modeIcon/puzzle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1023 B

BIN
image/modeIcon/solo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

BIN
image/modeIcon/timer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
image/modeIcon/zen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -9,6 +9,7 @@ local actName={
"落在最左:","落在最右:","列在最左:","列在最右:",
}
return{
lang="中文",
atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
@@ -31,14 +32,14 @@ return{
speedup="速度加快",
win="胜利",
finish="结束",
lose="失败",
pause="暂停",
finish="结束",
pauseCount="暂停统计",
custom="自定义游戏",
customOption={
drop="下落延迟:",
drop="下落速度:",
lock="锁定延迟:",
wait="放块延迟:",
fall="消行延迟:",
@@ -53,7 +54,7 @@ return{
bgm="背景音乐:",
},
customVal={
drop={"[20G]",1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
drop={"0G","1/180G","1/60G","1/40G","1/30G","1/25G","1/20G","1/18G","1/16G","1/14G","1/12G","1/10G","1/9G","1/8G","1/7G","1/6G","1/5G","1/4G","1/3G","1/2G","1G","2G","4G","8G","20G"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
@@ -67,7 +68,7 @@ return{
},
softdropdas="软降DAS:",
softdroparr="软降ARR:",
snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
snapLevelName={"无吸附","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
keyboard="键盘",joystick="手柄",
space="空格",enter="回车",
ctrlSetHelp="方向键选择/翻页,回车修改,esc返回",
@@ -76,43 +77,24 @@ return{
setting_sound="声音设置",
musicRoom="音乐室",
nowPlaying="正在播放:",
recSavingError="纪录保存失败:",
settingSaved="设置已保存",
settingSavingError="设置保存失败:",
statSavingError="数据保存失败:",
unlockSavingError="解锁保存失败",
copySuccess="已复制到剪切板",
dataCorrupted="数据损坏",
VKTchW="触摸点权重",
VKOrgW="原始点权重",
VKCurW="当前点权重",
noScore="暂无成绩",
highScore="最佳成绩",
newRecord="打破纪录",
errorMsg="Techmino遇到了问题,需要重新启动.\n我们已收集了一些错误信息,你可以向作者进行反馈.",
actName=actName,
modeName={
[0]="自定义",
"竞速","马拉松","大师","经典","","无尽","单挑","回合制","仅TSD","隐形",
"挖掘","生存","防守","进攻","科研",
"C4W练习","全清训练","全清挑战","49人混战","99人混战","干旱","多人",
},
modeInfo={
sprint="挑战世界纪录",
marathon="尝试坚持到最后",
master="成为方块大师",
classic="高速经典",
zen="无重力消除200行",
infinite="科研沙盒",
solo="打败AI",
round="下棋",
tsd="尽可能做TSD",
blind="最强大脑",
dig="核能挖掘机",
survivor="你能存活多久?",
defender="防守练习",
attacker="进攻练习",
tech="尽可能不要普通消除",
c4wtrain="无 限 连 击",
pctrain="熟悉全清定式的组合",
pcchallenge="100行内尽可能多PC",
techmino49="49人混战",
techmino99="99人混战",
drought="异常序列",
hotseat="友尽模式",
},
load={"加载语音ing","加载音乐ing","加载音效ing","加载完成",},
load={[0]="加载完成","加载语音ing","加载音乐ing","加载音效ing","加载模式ing","加载乱七八糟的东西ing"},
tips={
"不是动画,真的在加载!",
"大满贯10连击消四全清!",
@@ -132,7 +114,7 @@ return{
"20G本质是一套全新的游戏规则",
"不要在上课时玩游戏!",
"本游戏难度上限很高,做好心理准备",
"方块可以不是休闲游戏",
"本游戏可不是休闲游戏",
"调到特殊的日期也不会发生什么的",
"3.1415926535897932384",
"2.7182818284590452353",
@@ -141,10 +123,11 @@ return{
"有疑问?先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~",
"不要按F8",
"秘密代码:626",
"秘密数字:626",
"CLASSIC SEXY RUSSIAN BLOCKS",
"戴上耳机获得最佳体验",
"戴上耳机获得最佳体验",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
"(第一次才准)今日幸运数字:"..math.random(100,626),
},
stat={
"游戏运行次数:",
@@ -169,7 +152,7 @@ return{
},
help={
"好像也没啥好帮助的吧?就当是关于了",
"这只是一个方块游戏,请勿过度解读和随意联想",
"这只是一个普通的方块游戏,请勿称此游戏为某某某方块",
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
"游戏还在测试阶段,请 勿 外 传",
"",
@@ -190,11 +173,10 @@ return{
]],
support="支持作者",
group="官方QQ群",
warning=" 止 私 自 传 播",
warning="止直接传播游戏本体",
WidgetText={
main={
lang="文-Lang",
qplay="快速开始",
lang="言/A",
play="开始",
setting="设置",
music="音乐室",
@@ -203,12 +185,9 @@ return{
quit="退出",
},
mode={
up="",
down="",
left="",
right="",
draw="画图(Q)",
setting="参数(E)",
start="开始",
custom="自定义(C)",
back=BK,
},
music={
@@ -223,9 +202,6 @@ return{
down="",
left="",
right="",
start1="消除开始",
start2="拼图开始",
draw="画图(D)",
set1="40行(1)",
set2="1v1(2)",
set3="无尽(3)",
@@ -249,6 +225,9 @@ return{
gb5="",
space="×",
clear="清除",
demo="演示模式",
copy="复制",
paste="粘贴",
back=BK,
},
play={
@@ -257,7 +236,8 @@ return{
pause={
resume= "继续",
restart="重新开始",
setting="设置",
sfx="音效",
bgm="音乐",
quit= "退出",
},
setting_game={
@@ -267,6 +247,8 @@ return{
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
reTime="开局等待时间",
maxNext="最大预览数量",
quickR="快速重新开始",
swap="组合键切换攻击模式",
fine="极简操作提示音",
@@ -282,7 +264,7 @@ return{
center="旋转中心",
skin="皮肤",
bg="背景",
bgblock="背景动画",
bgspace="星空背景",
smo="平滑下落",
dropFX="下落特效等级",
shakeFX="晃动特效等级",
@@ -298,23 +280,18 @@ return{
bgm="音乐",
vib="震动",
voc="语音",
stereo="双声道",
stereo="立体声",
back=BK,
},
setting_key={
back=BK,
},
setting_touch={
hide="显示虚拟按键",
track="按键自动跟踪",
tkset="跟踪设置",
default="默认组合",
snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return setting.VKAlpha.."0%"end,
icon="图标",
size="大小",
toggle="开关",
snap=function()return text.snapLevelName[sceneTemp.snap]end,
option="选项",
back=BK,
size="大小",
},
setting_touchSwitch={
b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4],
@@ -324,6 +301,11 @@ return{
b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20],
norm="标准",
pro="专业",
hide="显示虚拟按键",
track="按键自动跟踪",
icon="图标",
tkset="跟踪设置",
alpha="透明度",
back=BK,
},
setting_trackSetting={

View File

@@ -9,6 +9,7 @@ local actName={
"落在最左:","落在最右:","列在最左:","列在最右:",
}
return{
lang="全中文",
atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
@@ -31,14 +32,14 @@ return{
speedup="速度加快",
win="胜利",
finish="结束",
lose="失败",
pause="暂停",
finish="结束",
pauseCount="暂停统计",
custom="自定义游戏",
customOption={
drop="下落延迟:",
drop="下落速度:",
lock="锁定延迟:",
wait="放块延迟:",
fall="消行延迟:",
@@ -53,7 +54,7 @@ return{
bgm="背景音乐:",
},
customVal={
drop={"[20G]",1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
drop={"0G","1/180G","1/60G","1/40G","1/30G","1/25G","1/20G","1/18G","1/16G","1/14G","1/12G","1/10G","1/9G","1/8G","1/7G","1/6G","1/5G","1/4G","1/3G","1/2G","1G","2G","4G","8G","20G"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
@@ -67,7 +68,7 @@ return{
},
softdropdas="软降DAS:",
softdroparr="软降ARR:",
snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
snapLevelName={"无吸附","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
keyboard="键盘",joystick="手柄",
space="空格",enter="回车",
ctrlSetHelp="方向键选择/翻页,回车修改,esc返回",
@@ -76,43 +77,24 @@ return{
setting_sound="声音设置",
musicRoom="音乐室",
nowPlaying="正在播放:",
recSavingError="纪录保存失败:",
settingSaved="设置已保存",
settingSavingError="设置保存失败:",
statSavingError="数据保存失败:",
unlockSavingError="解锁保存失败",
copySuccess="已复制到剪切板",
dataCorrupted="数据损坏",
VKTchW="触摸点权重",
VKOrgW="原始点权重",
VKCurW="当前点权重",
noScore="暂无成绩",
highScore="最佳成绩",
newRecord="打破纪录",
errorMsg="Techmino遇到了问题,需要重新启动.\n我们已收集了一些错误信息,你可以向作者进行反馈.",
actName=actName,
modeName={
[0]="自定义",
"竞速","马拉松","大师","经典","","无尽","单挑","回合制","仅TSD","隐形",
"挖掘","生存","防守","进攻","科研",
"C4W练习","全清训练","全清挑战","49人混战","99人混战","干旱","多人",
},
modeInfo={
sprint="挑战世界纪录",
marathon="尝试坚持到最后",
master="成为方块大师",
classic="高速经典",
zen="无重力消除200行",
infinite="科研沙盒",
solo="打败AI",
round="下棋",
tsd="尽可能做T旋双清",
blind="最强大脑",
dig="核能挖掘机",
survivor="你能存活多久?",
defender="防守练习",
attacker="进攻练习",
tech="尽可能不要普通消除!",
c4wtrain="无 限 连 击",
pctrain="熟悉全清定式的组合",
pcchallenge="100行内尽可能多全清",
techmino49="49人混战",
techmino99="99人混战",
drought="异常序列",
hotseat="友尽模式",
},
load={"加载语音ing","加载音乐ing","加载音效ing","加载完成",},
load={[0]="加载完成","加载语音ing","加载音乐ing","加载音效ing","加载模式ing","加载乱七八糟的东西ing"},
tips={
"不是动画,真的在加载!",
"大满贯10连击消四全清!",
@@ -132,7 +114,7 @@ return{
"20G本质是一套全新的游戏规则",
"不要在上课时玩游戏!",
"本游戏难度上限很高,做好心理准备",
"方块可以不是休闲游戏",
"本游戏可不是休闲游戏",
"调到特殊的日期也不会发生什么的",
"3.1415926535897932384",
"2.7182818284590452353",
@@ -141,10 +123,11 @@ return{
"有疑问?先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~",
"不要按F8",
"秘密代码:626",
"秘密数字:626",
"CLASSIC SEXY RUSSIAN BLOCKS",
"戴上耳机获得最佳体验",
"戴上耳机获得最佳体验",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
"(第一次才准)今日幸运数字:"..math.random(100,626),
},
stat={
"游戏运行次数:",
@@ -169,7 +152,7 @@ return{
},
help={
"好像也没啥好帮助的吧?就当是关于了",
"这只是一个方块游戏,请勿过度解读和随意联想",
"这只是一个普通的方块游戏,请勿称此游戏为某某某方块",
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
"游戏还在测试阶段,请 勿 外 传",
"",
@@ -190,11 +173,10 @@ return{
]],
support="支持作者",
group="官方QQ群",
warning=" 止 私 自 传 播",
warning="止直接传播游戏本体",
WidgetText={
main={
lang="全-Lang",
qplay="快速开始",
lang="言/A",
play="开始",
setting="设置",
music="音乐室",
@@ -203,12 +185,9 @@ return{
quit="退出",
},
mode={
up="",
down="",
left="",
right="",
draw="画图(Q)",
setting="参数(E)",
start="开始",
custom="自定义(C)",
back=BK,
},
music={
@@ -223,9 +202,6 @@ return{
down="",
left="",
right="",
start1="消除开始",
start2="拼图开始",
draw="画图(D)",
set1="40行(1)",
set2="1v1(2)",
set3="无尽(3)",
@@ -249,6 +225,9 @@ return{
gb5="",
space="×",
clear="清除",
demo="演示模式",
copy="复制",
paste="粘贴",
back=BK,
},
play={
@@ -257,7 +236,8 @@ return{
pause={
resume= "继续",
restart="重新开始",
setting="设置",
sfx="音效",
bgm="音乐",
quit= "退出",
},
@@ -268,6 +248,8 @@ return{
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
reTime="开局等待时间",
maxNext="最大预览数量",
quickR="快速重新开始",
swap="组合键切换攻击模式",
fine="极简操作提示音",
@@ -283,7 +265,7 @@ return{
center="旋转中心",
skin="皮肤",
bg="背景",
bgblock="背景动画",
bgspace="星空背景",
smo="平滑下落",
dropFX="下落特效等级",
shakeFX="晃动特效等级",
@@ -299,23 +281,18 @@ return{
bgm="音乐",
vib="震动",
voc="语音",
stereo="双声道",
stereo="立体声",
back=BK,
},
setting_key={
back=BK,
},
setting_touch={
hide="显示虚拟按键",
track="按键自动跟踪",
tkset="跟踪设置",
default="默认组合",
snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return setting.VKAlpha.."0%"end,
icon="图标",
size="大小",
toggle="开关",
snap=function()return text.snapLevelName[sceneTemp.snap]end,
option="选项",
back=BK,
size="大小",
},
setting_touchSwitch={
b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4],
@@ -325,6 +302,11 @@ return{
b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20],
norm="标准",
pro="专业",
hide="显示虚拟按键",
track="按键自动跟踪",
icon="图标",
tkset="跟踪设置",
alpha="透明度",
back=BK,
},
setting_trackSetting={
@@ -346,4 +328,4 @@ return{
back=BK,
},
},
}
}--译

View File

@@ -7,6 +7,7 @@ local actName={
"Left Drop:","Right Drop:","Left INS:","Right INS:",
}
return{
lang="English",
atkModeName={"Random","Badges","K.O.s","Counters"},
royale_remain=function(n)return n.." Players Remain"end,
cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
@@ -29,14 +30,14 @@ return{
speedup="Speed up",
win="WIN",
finish="FINISH",
lose="LOSE",
pause="PAUSE",
finish="FINISH",
pauseCount="Pause Count",
custom="Custom Game",
customOption={
drop="Drop delay:",
drop="Drop speed:",
lock="Lock delay:",
wait="Next piece delay:",
fall="Clear row delay:",
@@ -51,7 +52,7 @@ return{
bgm="BGM:",
},
customVal={
drop={"[20G]",1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
drop={"0G","1/180G","1/60G","1/40G","1/30G","1/25G","1/20G","1/18G","1/16G","1/14G","1/12G","1/10G","1/9G","1/8G","1/7G","1/6G","1/5G","1/4G","1/3G","1/2G","1G","2G","4G","8G","20G"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
@@ -74,43 +75,24 @@ return{
setting_sound="Sound setting",
musicRoom="Music Room",
nowPlaying="Now Playing:",
recSavingError="Failed to save record:",
settingSaved="Setting saved",
settingSavingError="Failed to save setting:",
statSavingError="Failed to save stat:",
unlockSavingError="Failed to save unlock:",
copySuccess="Copy Success",
dataCorrupted="Data Corrupted",
VKTchW="Touch weight",
VKOrgW="Origion weight",
VKCurW="CurPos weight",
noScore="No Score Yet",
highScore="Highscore",
newRecord="New Rocord",
errorMsg="Techmino ran into a problem and needs to restart.\nWe collected some error info,and you can send them to author.",
actName=actName,
modeName={
[0]="Custom",
"Sprint","Marathon","Master","Classic","Zen","Infinite","1v1","Round","TSD-only","Blind",
"Dig","Survivor","Defender","Attacker","Tech",
"C4W Train","PC Train","PC Challenge","Techmino49","Techmino99","Drought","Hotseat",
},
modeInfo={
sprint="Speed run",
marathon="Survive and reach target",
master="To be Grand Master",
classic="Vintage car drag racing",
zen="Clear 200 Lines without gravity",
infinite="Infinite game,infinite happiness",
solo="Beat AI",
round="Chess?",
tsd="Make more T-spin-doubles",
blind="Invisible board",
dig="Downstack!",
survivor="Survive Longer!",
defender="Hand them!",
attacker="Attacking better then defending",
tech="Don't do normal clear",
c4wtrain="Infinite combo",
pctrain="Let's learn some PCs",
pcchallenge="Make PCs in 100 Lines",
techmino49="Melee fight with 48 AIs",
techmino99="Melee fight with 98 AIs",
drought="ERRSEQ flood attack",
hotseat="",
},
load={"Loading VOICE","Loading BGM","Loading SFX","Finished",},
load={[0]="Finished","Loading VOICE","Loading BGM","Loading SFX","Loading modes","Loading other things"},
tips={
"Not animation,real loading!",
"Back to Back 10 combo Techrash PC!",
@@ -139,11 +121,12 @@ return{
"Find out what's in the setting!",
"Any suggestions to author!",
"DO NOT PRESS F8",
"Secret code:626",
"Secret num:626",
"Techmino=Technique+Tetromino",
"CLASSIC SEXY RUSSIAN BLOCKS",
"Headphones for better experience",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
"(first effective)Your luck number today:"..math.random(100,626),
},
stat={
"Games run:",
@@ -168,7 +151,7 @@ return{
},
help={
"I don't think you need \"help\".",
"THIS IS ONLY A BLOCK GAME",
"THIS IS ONLY A BLOCK GAME,not T****s",
"But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,so DO NOT DISTIRBUTE",
"",
@@ -189,11 +172,10 @@ Lib used:
]],
support="Support Author",
group="Official QQ Group",
warning="DO NOT DISTRIBUTE",
warning="DO NOT SHARE APP",
WidgetText={
main={
lang="文-Lang",
qplay="Qplay",
lang="言/A",
play="Play",
setting="Settings",
music="Music room",
@@ -202,12 +184,9 @@ Lib used:
quit="Quit",
},
mode={
up="",
down="",
left="",
right="",
draw="Draw(Q)",
setting="Setting(E)",
start="Start",
custom="Custom(C)",
back=BK,
},
music={
@@ -222,9 +201,6 @@ Lib used:
down="",
left="",
right="",
start1="Clear Start",
start2="Puzzle Start",
draw="Draw(D)",
set1="40L(1)",
set2="1v1(2)",
set3="infinite(3)",
@@ -248,6 +224,9 @@ Lib used:
gb5="",
space="×",
clear="Clear",
demo="Demo",
copy="Copy",
paste="Paste",
back=BK,
},
play={
@@ -256,7 +235,8 @@ Lib used:
pause={
resume="Resume",
restart="Restart",
setting="Setting",
sfx="SFX",
bgm="BGM",
quit="Quit",
},
setting_game={
@@ -266,6 +246,8 @@ Lib used:
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
reTime="Delay before game",
maxNext="Max next count",
quickR="Quick restart",
swap="Combo key to change ATK mode",
fine="Finesse error SFX",
@@ -281,7 +263,7 @@ Lib used:
center="Center",
skin="Skin",
bg="Background",
bgblock="BG animation",
bgspace="BG space",
smo="Smoooth drop",
dropFX="Drop FX level",
shakeFX="Shake FX level",
@@ -304,16 +286,11 @@ Lib used:
back=BK,
},
setting_touch={
hide="Show Virtual Key",
track="Auto track",
tkset="Track setting",
default="Defaults",
snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return setting.VKAlpha.."0%"end,
icon="Icon",
size="Size",
toggle="Toggle",
snap=function()return text.snapLevelName[sceneTemp.snap]end,
option="Option",
back=BK,
size="Size",
},
setting_touchSwitch={
b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4],
@@ -323,6 +300,11 @@ Lib used:
b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20],
norm="Normal",
pro="Professioanl",
hide="Show Virtual Key",
track="Auto track",
icon="Icon",
tkset="Track setting",
alpha="Alpha",
back=BK,
},
setting_trackSetting={

436
list.lua
View File

@@ -1,4 +1,3 @@
local mobile=system=="Android"or system=="iOS"
actName={
"moveLeft","moveRight",
"rotRight","rotLeft","rotFlip",
@@ -34,8 +33,10 @@ color={
darkGrey={.3,.3,.3},
white={1,1,1},
bronze={.7,.4,0},
orange={1,.6,0},
lightOrange={1,.7,.3},
darkOrange={.6,.4,0},
purple={.5,0,1},
lightPurple={.8,.4,1},
darkPurple={.3,0,.6},
@@ -57,7 +58,8 @@ blockColor={
}
sfx={
"welcome",
"error","error_long",
"click","enter",
"finesseError","finesseError_long",
--Stereo sfxs(cannot set position)
"button","swipe",
"ready","start","win","fail","collect",
@@ -70,6 +72,8 @@ sfx={
"spin_0","spin_1","spin_2","spin_3",
"emit","blip_1","blip_2",
"perfectclear",
"error",
--Mono sfxs
}
bgm={
@@ -89,14 +93,18 @@ bgm={
"shining terminal",
"end",
}
voiceBank={}
voiceBank={}--{{srcs1},{srcs2},...}
voiceName={
"zspin","sspin","lspin","jspin","tspin","ospin","ispin",
"single","double","triple","techrash",
"mini","b2b","b3b","pc",
"win","lose",
"bye",
"nya","voc_nya",
"nya",
"happy",
"doubt",
"sad",
"egg",
}
voiceList={
zspin={"zspin_1","zspin_2","zspin_3"},
@@ -120,7 +128,10 @@ voiceList={
lose={"lose_1","lose_2","lose_3"},
bye={"bye_1","bye_2"},
nya={"nya_1","nya_2","nya_3","nya_4"},
voc_nya={"nya_11","nya_12","nya_13","nya_21","nya_22"},
happy={"nya_happy_1","nya_happy_2","nya_happy_3","nya_happy_4"},
doubt={"nya_doubt_1","nya_doubt_2"},
sad={"nya_sad_1"},
egg={"egg_1","egg_2"},
}
musicID={
@@ -151,7 +162,7 @@ customID={
"bg","bgm",
}
customRange={
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
drop={1e99,180,60,40,30,25,20,18,16,14,12,10,9,8,7,6,5,4,3,2,1,.5,.25,.125,0},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
@@ -167,415 +178,4 @@ customRange={
}
RCPB={10,33,200,33,105,5,105,60}
snapLevelValue={1,10,20,40,60,80}
up0to4={[0]="000%UP","025%UP","050%UP","075%UP","100%UP",}
modeID={
[0]="custom",
"sprint","marathon","master","classic","zen","infinite","solo","round","tsd","blind",
"dig","survivor","defender","attacker","tech",
"c4wtrain","pctrain","pcchallenge","techmino49","techmino99","drought","hotseat",
}
local O,_=true,false
blocks={
{[0]={{_,O,O},{O,O,_}},{{O,_},{O,O},{_,O}}},
{[0]={{O,O,_},{_,O,O}},{{_,O},{O,O},{O,_}}},
{[0]={{O,O,O},{_,_,O}},{{O,O},{O,_},{O,_}},{{O,_,_},{O,O,O}},{{_,O},{_,O},{O,O}}},
{[0]={{O,O,O},{O,_,_}},{{O,_},{O,_},{O,O}},{{_,_,O},{O,O,O}},{{O,O},{_,O},{_,O}}},
{[0]={{O,O,O},{_,O,_}},{{O,_},{O,O},{O,_}},{{_,O,_},{O,O,O}},{{_,O},{O,O},{_,O}}},
{[0]={{O,O},{O,O}},{{O,O},{O,O}}},
{[0]={{O,O,O,O}},{{O},{O},{O},{O}}},
}
local l={1,2,6,7}for i=1,4 do blocks[l[i]][2],blocks[l[i]][3]=blocks[l[i]][0],blocks[l[i]][1]end
for i=1,7 do blocks[i+7]=blocks[i]end
local virtualkeySet={
{
{1, 80, 720-200, 80},--moveLeft
{2, 320, 720-200, 80},--moveRight
{3, 1280-80, 720-200, 80},--rotRight
{4, 1280-200, 720-80, 80},--rotLeft
{5, 1280-200, 720-320, 80},--rotFlip
{6, 200, 720-320, 80},--hardDrop
{7, 200, 720-80, 80},--softDrop
{8, 1280-320, 720-200, 80},--hold
{9, 1280-80, 280, 80},--func
{10,80, 280, 80},--restart
},--Farter's set,thanks
{
{1, 1280-320, 720-200, 80},--moveLeft
{2, 1280-80, 720-200, 80},--moveRight
{3, 200, 720-80, 80},--rotRight
{4, 80, 720-200, 80},--rotLeft
{5, 200, 720-320, 80},--rotFlip
{6, 1280-200, 720-320, 80},--hardDrop
{7, 1280-200, 720-80, 80},--softDrop
{8, 320, 720-200, 80},--hold
{9, 80, 280, 80},--func
{10,1280-80, 280, 80},--restart
},--Mirrored farter's set,sknaht
{
{1, 80, 720-80, 80},--moveLeft
{2, 240, 720-80, 80},--moveRight
{3, 1280-240, 720-80, 80},--rotRight
{4, 1280-400, 720-80, 80},--rotLeft
{5, 1280-240, 720-240, 80},--rotFlip
{6, 1280-80, 720-80, 80},--hardDrop
{7, 1280-80, 720-240, 80},--softDrop
{8, 1280-80, 720-400, 80},--hold
{9, 80, 360, 80},--func
{10,80, 80, 80},--restart
},--Author's set,not recommend
{
{1, 1280-400, 720-80, 80},--moveLeft
{2, 1280-80, 720-80, 80},--moveRight
{3, 240, 720-80, 80},--rotRight
{4, 80, 720-80, 80},--rotLeft
{5, 240, 720-240, 80},--rotFlip
{6, 1280-240, 720-240, 80},--hardDrop
{7, 1280-240, 720-80, 80},--softDrop
{8, 1280-80, 720-240, 80},--hold
{9, 80, 720-240, 80},--func
{10,80, 320, 80},--restart
},--Keyboard set
{
{10,70, 50,27},--restart
{9, 130, 50,27},--func
{4, 190, 50,27},--rotLeft
{3, 250, 50,27},--rotRight
{5, 310, 50,27},--rotFlip
{1, 370, 50,27},--moveLeft
{2, 430, 50,27},--moveRight
{8, 490, 50,27},--hold
{7, 550, 50,27},--softDrop1
{6, 610, 50,27},--hardDrop
{11,670, 50,27},--insLeft
{12,730, 50,27},--insRight
{13,790, 50,27},--insDown
{14,850, 50,27},--down1
{15,910, 50,27},--down4
{16,970, 50,27},--down10
{17,1030, 50,27},--dropLeft
{18,1090, 50,27},--dropRight
{19,1150, 50,27},--addLeft
{20,1210, 50,27},--addRight
},--PC key feedback(top&in a row)
}
local customSet={
{20,20,1,1,7,1,1,1,3,4,1,2,3},
{18,20,1,1,7,1,1,1,8,3,8,3,3},
{22,22,1,1,7,3,1,1,8,4,1,7,7},
{20,20,1,1,7,1,1,3,8,3,1,7,8},
{1,11,8,11,4,1,2,1,8,3,1,4,9},
}
local function useDefaultSet(n)
for i=1,#customSet[n]do
customSel[i]=customSet[n][i]
end
curBG=customRange.bg[customSel[12]]
BGM(customRange.bgm[customSel[13]])
end
--λFuncs for widgets
local function SETdisp(k)
return function()
return setting[k]
end
end
local function SETsto(k)
return function(i)setting[k]=i end
end
local function SETrev(k)
return function()
setting[k]=not setting[k]
end
end
local function pressKey(k)
return function()
love.keypressed(k)
end
end
local function setPen(i)
return function()
pen=i
end
end
local function VKAdisp(n)
return function()
return VK_org[n].ava
end
end
local function VKAcode(n)
return function()
VK_org[n].ava=not VK_org[n].ava
end
end
local C=color
-- T1,T2=0,0
Widget={
load={},intro={},quit={},
main={
play= newButton(150,280,200,160,C.red, 60,function()scene.push()scene.swapTo("mode")end, nil,"setting"),
setting=newButton(370,280,200,160,C.lightBlue, 50,function()scene.push()scene.swapTo("setting_game")end, nil,"music"),
music= newButton(590,280,200,160,C.lightPurple,37,function()scene.push()scene.swapTo("music")end, nil,"help"),
help= newButton(150,460,200,160,C.yellow, 55,function()scene.push()scene.swapTo("help")end, nil,"stat"),
stat= newButton(370,460,200,160,C.cyan, 48,function()scene.push()scene.swapTo("stat")end, nil,"qplay"),
qplay= newButton(540,415,100,70,C.lightGreen, 28,function()scene.push()loadGame(modeSel,levelSel)end, nil,"lang"),
lang= newButton(590,505,200,70,C.lightRed, 50,function()
setting.lang=setting.lang%#langName+1
swapLanguage(setting.lang)
end,nil,"quit"),
-- S1= newSlider(520,550,380,10,10,nil,function()return T1 end,function(i)T1=i end),
-- S2= newSlider(520,590,380,10,10,nil,function()return T2 end,function(i)T2=i end),
quit= newButton(370,620,280,100,C.lightGrey, 60,function()VOICE("bye")scene.swapTo("quit","slowFade")end,nil,"play"),
},
mode={
up= newButton(1000, 210,200,140,C.white, 80,pressKey("up"), function()return modeSel==1 end),
down= newButton(1000, 430,200,140,C.white, 80,pressKey("down"), function()return modeSel==#modeID end),
left= newButton(190, 160,100,80, C.white, 40,pressKey("left"), function()return levelSel==1 end),
right= newButton(350, 160,100,80, C.white, 40,pressKey("right"), function()return levelSel==#modes[modeID[modeSel]].level end),
start= newButton(1000, 600,250,100,C.green, 50,function()scene.push()loadGame(modeSel,levelSel)end),
custom= newButton(275, 420,200,90, C.yellow, 40,function()scene.push()scene.swapTo("custom")end),
back= newButton(640, 630,230,90, C.white, 45,scene.back),
},
music={
bgm= newSlider(760, 80,400,10,40,nil,SETdisp("bgm"),function(i)setting.bgm=i;BGM(bgmPlaying)end),
up= newButton(1100, 200,120,120,C.white,60,pressKey("up")),
play= newButton(1100, 340,120,120,C.white,40,pressKey("space"),function()return setting.bgm==0 end),
down= newButton(1100, 480,120,120,C.white,60,pressKey("down")),
back= newButton(640, 630,230,90, C.white,45,scene.back),
},
custom={
up= newButton(1000, 220,100,100,C.white, 50,function()sel=(sel-2)%#customID+1 end),
down= newButton(1000, 460,100,100,C.white, 50,function()sel=sel%#customID+1 end),
left= newButton(880, 340,100,100,C.white, 50,pressKey("left")),
right= newButton(1120, 340,100,100,C.white, 50,pressKey("right")),
start1= newButton(880, 580,220,70, C.green, 40,function()scene.push()loadGame(0,1)end),
start2= newButton(1120, 580,220,70, C.lightPurple, 40,function()scene.push()loadGame(0,2)end),
draw= newButton(1000, 90, 190,85, C.cyan, 40,function()scene.push()scene.swapTo("draw")end),
set1= newButton(640, 160,240,75, C.lightRed, 40,function()useDefaultSet(1)end),
set2= newButton(640, 250,240,75, C.lightRed, 40,function()useDefaultSet(2)end),
set3= newButton(640, 340,240,75, C.lightRed, 40,function()useDefaultSet(3)end),
set4= newButton(640, 430,240,75, C.lightRed, 40,function()useDefaultSet(4)end),
set5= newButton(640, 520,240,75, C.lightRed, 40,function()useDefaultSet(5)end),
back= newButton(640, 630,180,60, C.white, 40,scene.back),
},
draw={
block1= newButton(920, 80, 120,120,C.red, 65,setPen(1)),
block2= newButton(1060, 80, 120,120,C.green, 65,setPen(2)),
block3= newButton(1200, 80, 120,120,C.orange, 65,setPen(3)),
block4= newButton(920, 220,120,120,C.blue, 65,setPen(4)),
block5= newButton(1060, 220,120,120,C.magenta, 65,setPen(5)),
block6= newButton(1200, 220,120,120,C.yellow, 65,setPen(6)),
block7= newButton(920, 360,120,120,C.cyan, 65,setPen(7)),
gb1= newButton(1060, 360,120,120,C.darkGrey, 65,setPen(9)),
gb2= newButton(1200, 360,120,120,C.grey, 65,setPen(10)),
gb3= newButton(920, 500,120,120,C.darkPurple, 65,setPen(11)),
gb4= newButton(1060, 500,120,120,C.darkRed, 65,setPen(12)),
gb5= newButton(1200, 500,120,120,C.darkGreen, 65,setPen(13)),
clear= newButton(780, 80, 120,120,C.white, 45,pressKey("delete")),
any= newButton(780, 220,120,120,C.lightGrey, 45,setPen(0)),
space= newButton(780, 360,120,120,C.grey, 70,setPen(-1)),
back= newButton(1200, 640,120,120,C.white, 40,scene.back),
},
play={
pause= newButton(1235,45,80,80,C.white,30,pauseGame),
},
pause={
resume= newButton(640,290,240,100,C.white,50,resumeGame),
restart=newButton(640,445,240,100,C.white,50,function()
clearTask("play")
updateStat()
resetGameData()
scene.swapTo("play","none")
end),
setting=newButton(1150,80,200,100,C.yellow,45,function()
scene.push()
scene.swapTo("setting_sound")
end),
quit= newButton(640,600,240,100,C.white,50,scene.back),
},
setting_game={
graphic=newButton(200,80,240,80,C.lightGreen,40,function()scene.swapTo("setting_graphic")end, nil,"sound"),
sound= newButton(1080,80,240,80,C.lightGreen,40,function()scene.swapTo("setting_sound")end, nil,"dasD"),
dasD= newButton(180,230,50,50,C.white,40,function()
setting.das=(setting.das-1)%31
if setting.arr>setting.das then
setting.arr=setting.das
Widget.setting_game.arrD:FX()
SFX("blip_1",.4)
end
end,nil,"dasU"),
dasU= newButton(400,230,50,50,C.white,40,function()
setting.das=(setting.das+1)%31
if setting.arr>setting.das then
setting.das=setting.arr
Widget.setting_game.arrD:FX()
SFX("blip_1",.4)
end
end,nil,"arrD"),
arrD= newButton(500,230,50,50,C.white,40,function()
setting.arr=(setting.arr-1)%16
if setting.arr>setting.das then
setting.das=setting.arr
Widget.setting_game.dasU:FX()
SFX("blip_1",.4)
end
end,nil,"arrU"),
arrU= newButton(720,230,50,50,C.white,40,function()
setting.arr=(setting.arr+1)%16
if setting.arr>setting.das then
setting.das=setting.arr
Widget.setting_game.dasU:FX()
SFX("blip_1",.4)
end
end,nil,"sddasD"),
sddasD= newButton(180,340,50,50,C.white,40, function()setting.sddas=(setting.sddas-1)%11 end, nil,"sddasU"),
sddasU= newButton(400,340,50,50,C.white,40, function()setting.sddas=(setting.sddas+1)%11 end, nil,"sdarrD"),
sdarrD= newButton(500,340,50,50,C.white,40, function()setting.sdarr=(setting.sdarr-1)%4 end, nil,"sdarrU"),
sdarrU= newButton(720,340,50,50,C.white,40, function()setting.sdarr=(setting.sdarr+1)%4 end, nil,"quickR"),
quickR= newSwitch(560,430,40,SETdisp("quickR"), SETrev("quickR"), nil,"swap"),
swap= newSwitch(560,510,25,SETdisp("swap"), SETrev("swap"), nil,"fine"),
fine= newSwitch(560,590,25,SETdisp("fine"), SETrev("fine"), nil,"ctrl"),
ctrl= newButton(1020,230,320,80,C.white,40,function()scene.push()scene.swapTo("setting_key")end, nil,"touch"),
touch= newButton(1020,340,320,80,C.white,40,function()scene.push()scene.swapTo("setting_touch")end,nil,"back"),
back= newButton(1160,600,160,160,C.white,55,scene.back,nil,"graphic"),
},
setting_graphic={
sound= newButton(200,80,240,80,C.lightGreen,40,function()scene.swapTo("setting_sound")end, nil,"game"),
game= newButton(1080,80,240,80,C.lightGreen,40,function()scene.swapTo("setting_game")end, nil,"ghost"),
ghost= newSwitch(310,180,40,SETdisp("ghost"), SETdisp("ghost"), nil,"center"),
center= newSwitch(580,180,40,SETdisp("center"), SETdisp("center"), nil,"smo"),
smo= newSwitch(310,260,25,SETdisp("smo"), SETdisp("smo"), nil,"grid"),
grid= newSwitch(580,260,40,SETdisp("grid"), SETdisp("grid"), nil,"dropFX"),
dropFX= newSlider(310,350,373,3,40,nil,SETdisp("dropFX"), SETsto("dropFX"), nil,"shakeFX"),
shakeFX=newSlider(310,430,373,3,40,nil,SETdisp("shakeFX"), SETsto("shakeFX"), nil,"atkFX"),
atkFX= newSlider(310,510,373,3,40,nil,SETdisp("atkFX"), SETsto("atkFX"), nil,"frame"),
frame= newSlider(310,590,373,10,40,nil,function()return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4 end,function(i)setting.frameMul=i<5 and 5*i+20 or 10*i end,nil,"fullscreen"),
fullscreen=newSwitch(990,180,40,SETdisp("fullscreen"),function()
setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen)
if not setting.fullscreen then
love.resize(love.graphics.getWidth(),love.graphics.getHeight())
end
end,nil,"bg"),
bg= newSwitch(990,250,40,SETdisp("bg"),SETrev("bg"),nil,"bgblock"),
bgblock=newSwitch(990,330,40,SETdisp("bgblock"),SETrev("bgblock"),nil,"skin"),--if not setting.bgblock then for i=1,16 do FX_BGblock.list[i].v=3*FX_BGblock.list[i].v end end
skin= newButton(860,470,120,60,C.white,40,function()
setting.skin=setting.skin%8+1
changeBlockSkin(setting.skin)
end,nil,"back"),
back= newButton(1160,600,160,160,C.white,55,scene.back,nil,"sound"),
},
setting_sound={
game= newButton(200,80,240,80,C.lightGreen,40,function()scene.swapTo("setting_game")end, nil,"graphic"),
graphic=newButton(1080,80,240,80,C.lightGreen,40,function()scene.swapTo("setting_graphic")end, nil,"sfx"),
sfx= newSlider(180,250,400,10,40,function()SFX("blip_1")end, SETdisp("sfx"), SETsto("sfx"), nil,"bgm"),
bgm= newSlider(750,250,400,10,40,function()BGM(bgmPlaying or"blank")end, SETdisp("bgm"), SETsto("bgm"), nil,"vib"),
vib= newSlider(180,440,400,5,40, function()VIB(1)end, SETdisp("vib"), SETsto("vib"), nil,"voc"),
voc= newSlider(750,440,400,10,40,function()VOICE("nya")end, SETdisp("voc"), SETsto("voc"), nil,"stereo"),
stereo= newSlider(180,630,400,10,40,function()SFX("move",1,-1)SFX("lock",1,1)end, SETdisp("stereo"), SETsto("stereo"),nil,"back"),
back=newButton(1160,600,160,160,C.white,55,scene.back,nil,"game"),
},
setting_key={
back=newButton(1140,650,200,80,C.white,50,scene.back),
},
setting_touch={
hide= newSwitch(810,140,45,SETdisp("VKSwitch"),SETrev("VKSwitch")),
track= newSwitch(810,220,45,SETdisp("VKTrack"),SETrev("VKTrack")),
tkset= newButton(450,220,170,80,C.white,30,function()
scene.push()
scene.swapTo("setting_trackSetting")
end,function()return not setting.VKTrack end),
default=newButton(450,320,170,80,C.white,40,function()
local D=virtualkeySet[defaultSel]
for i=1,#VK_org do
VK_org[i].ava=false
end
for n=1,#D do
local T=D[n]
if T[1]then
local B=VK_org[n]
B.ava=true
B.x,B.y,B.r=T[2],T[3],T[4]
end
end--Replace keys
defaultSel=defaultSel%5+1
end),
snap= newButton(640,320,170,80,C.white,40,function()
snapLevel=snapLevel%6+1
end),
--VK=T,70,50,27/T,130,50,27/T,190,50,27/T,250,50,27/T,310,50,27/T,370,50,27/T,430,50,27/T,490,50,27/T,550,50,27/T,610,50,27/T,670,50,27/T,730,50,27/T,790,50,27/T,850,50,27/T,910,50,27/T,970,50,27/T,739,789,897/T,1090,50,27/T,1150,50,27/T,1210,50,27
alpha= newButton(830,320,170,80,C.white,45,function()
setting.VKAlpha=(setting.VKAlpha+1)%11
--Adjust virtualkey alpha
end),
icon= newButton(495,420,260,80,C.white,45,SETrev("VKIcon")),
--Switch virtualkey icon
size= newButton(785,420,260,80,C.white,45,function()
if sel then
local B=VK_org[sel]
B.r=B.r+10
if B.r>=150 then B.r=B.r-110 end
end
end),
toggle= newButton(495,520,260,80,C.white,45,function()
scene.push()
scene.swapTo("setting_touchSwitch")
end),
back= newButton(785,520,260,80,C.white,45,scene.back),
},
setting_touchSwitch={
b1= newSwitch(300,80, 40,VKAdisp(1),VKAcode(1)),
b2= newSwitch(300,140, 40,VKAdisp(2),VKAcode(2)),
b3= newSwitch(300,200, 40,VKAdisp(3),VKAcode(3)),
b4= newSwitch(300,260, 40,VKAdisp(4),VKAcode(4)),
b5= newSwitch(300,320, 40,VKAdisp(5),VKAcode(5)),
b6= newSwitch(300,380, 40,VKAdisp(6),VKAcode(6)),
b7= newSwitch(300,440, 40,VKAdisp(7),VKAcode(7)),
b8= newSwitch(300,500, 40,VKAdisp(8),VKAcode(8)),
b9= newSwitch(300,560, 40,VKAdisp(9),VKAcode(9)),
b10= newSwitch(300,620, 40,VKAdisp(10),VKAcode(10)),
b11= newSwitch(760,80, 40,VKAdisp(11),VKAcode(11)),
b12= newSwitch(760,140, 40,VKAdisp(12),VKAcode(12)),
b13= newSwitch(760,200, 40,VKAdisp(13),VKAcode(13)),
b14= newSwitch(760,260, 40,VKAdisp(14),VKAcode(14)),
b15= newSwitch(760,320, 40,VKAdisp(15),VKAcode(15)),
b16= newSwitch(760,380, 40,VKAdisp(16),VKAcode(16)),
b17= newSwitch(760,440, 40,VKAdisp(17),VKAcode(17)),
b18= newSwitch(760,500, 40,VKAdisp(18),VKAcode(18)),
b19= newSwitch(760,560, 40,VKAdisp(19),VKAcode(19)),
b20= newSwitch(760,620, 40,VKAdisp(20),VKAcode(20)),
norm= newButton(1080,150,240,80,C.white,50,function()for i=1,20 do VK_org[i].ava=i<11 end end),
pro= newButton(1080,300,240,80,C.white,40,function()for i=1,20 do VK_org[i].ava=true end end),
back= newButton(1080,600,240,80,C.white,50,scene.back),
},
setting_trackSetting={
VKDodge= newSwitch(400,200, 40,SETdisp("VKDodge"),SETrev("VKDodge")),
VKTchW= newSlider(140,310,1000,10,40,nil,SETdisp("VKTchW"),function(i)setting.VKTchW=i;setting.VKCurW=math.max(setting.VKCurW,i)end),
VKCurW= newSlider(140,370,1000,10,40,nil,SETdisp("VKCurW"),function(i)setting.VKCurW=i;setting.VKTchW=math.min(setting.VKTchW,i)end),
back= newButton(1080,600,240,80,C.white,50,scene.back),
},
help={
his= newButton(1050,520,230,60,C.white,40,function()scene.push()scene.swapTo("history")end,nil,"back"),
qq= newButton(1050,600,230,60,C.white,40,function()love.system.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end, function()return mobile end,"his"),
back= newButton(640, 600,180,60,C.white,40,scene.back,nil,"qq"),
},
history={
prev= newButton(1155,170,180,180,C.white,70,pressKey("up"),function()return sel==1 end),
next= newButton(1155,400,180,180,C.white,70,pressKey("down"),function()return sel==#updateLog-22 end),
back= newButton(1155,600,180,90,C.white,40,scene.back),
},
stat={
path= newButton(980,620,250,60,C.white,30,function()love.system.openURL(love.filesystem.getSaveDirectory())end,function()return mobile end,"back"),
back= newButton(640,620,180,60,C.white,40,scene.back,nil,"path"),
},
}
for _,L in next,Widget do
for _,W in next,L do
if W.next then
W.next,L[W.next].prev=L[W.next],W
end
end
end
widget_sel=nil--selected widget object
snapLevelValue={1,10,20,40,60,80}

948
main.lua

File diff suppressed because it is too large Load Diff

70
modes/GM.lua Normal file
View File

@@ -0,0 +1,70 @@
local int,max,min=math.floor,math.max,math.min
local sectionName={"M7","M8","M9","M","MK","MV","MO","MM","GM"}
local function score(P)
local F=false
if P.modeData.point<70 then--if Less then MM
local R=#P.cleared
if R==0 then return end
if R==4 then R=10 end
P.modeData.point=P.modeData.point+R
P.modeData.event=sectionName[int(P.modeData.point*.1)+1]
end
end
return{
name={
"宗师",
"宗师",
"GrandMaster",
},
level={
"GM",
"GM",
"GM",
},
info={
"成为方块大师",
"成为方块大师",
"To be Grand Master",
},
color=color.lightBlue,
env={
_20G=true,
drop=0,lock=15,
wait=10,fall=15,
next=3,
visible="fast",
freshLimit=15,
dropPiece=score,
task=function(P)
if P.stat.time>=53.5 then
P.modeData.point=min(P.modeData.point+16,80)
P.modeData.event=sectionName[int(P.modeData.point*.1)+1]
Event.win(P,"finish")
end
end,
minarr=1,
bg="game3",bgm="shining terminal",
},
load=function()
newPlayer(1,340,15)
players[1].modeData.event="M7"
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.grade,-82,170)
setFont(55)
mStr(P.modeData.event,-82,110)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
end,
score=function(P)return{P.modeData.point,P.stat.score}end,
scoreDisp=function(D)return sectionName[int(D[1]*.1)+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)
local P=P.modeData.point
return P==80 and 5 or P>=70 and 4 or P>=60 and 3 or P>=40 and 2 or P>=20 and 1 or P>=5 and 0
end,
}

72
modes/attacker_hard.lua Normal file
View File

@@ -0,0 +1,72 @@
local int,rnd=math.floor,math.random
return{
name={
"进攻",
"进攻",
"Attacker",
},
level={
"困难",
"困难",
"HARD",
},
info={
"进攻练习",
"进攻练习",
"Attacking better then defending",
},
color=color.magenta,
env={
drop=30,lock=60,
fall=12,
freshLimit=15,
pushSpeed=2,
task=function(P)
if not P.control then return end
if P.atkBuffer.sum==0 then
local p=#P.atkBuffer+1
local B,D=P.atkBuffer,P.modeData
local t
if D.event<20 then
t=1500-30*D.event--1500~900
B[p]= {pos=rnd(4,7),amount=12,countdown=t,cd0=t,time=0,sent=false,lv=3}
B[p+1]= {pos=rnd(3,8),amount=10,countdown=t,cd0=t,time=0,sent=false,lv=4}
else
t=900-10*(D.event-20)--900~600
B[p]= {pos=rnd(10),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=4}
B[p+1]= {pos=rnd(4,7),amount=8,countdown=t,cd0=t,time=0,sent=false,lv=5}
end
B.sum=B.sum+22
P.stat.recv=P.stat.recv+22
if D.event<50 then
D.event=D.event+1
D.point=int(72e4/t)*.1
if D.event==20 then
P:showText(text.great,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=3
elseif D.event==50 then
P:showText(text.maxspeed,0,-140,100,"appear",.6)
end
end
end
end,
bg="game3",bgm="push",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr("24",-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.nextWave,-82,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(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.event
return W>100 and 4 or W>=80 and 3 or W>=50 and 2 or W>=20 and 1 or W>=5 and 0
end,
}

View File

@@ -0,0 +1,85 @@
local int,rnd=math.floor,math.random
return{
name={
"进攻",
"进攻",
"Attacker",
},
level={
"极限",
"极限",
"ULTIMATE",
},
info={
"进攻练习",
"进攻练习",
"Attacking better then defending",
},
color=color.lightYellow,
env={
drop=5,lock=60,
fall=8,
freshLimit=15,
task=function(P)
if not P.control then return end
if P.atkBuffer.sum<2 then
local p=#P.atkBuffer+1
local B,D=P.atkBuffer,P.modeData
local s,t
if D.event<10 then
t=1000-20*D.event--1000~800
B[p]= {pos=rnd(5,6),amount=10,countdown=t,cd0=t,time=0,sent=false,lv=3}
B[p+1]= {pos=rnd(4,7),amount=12,countdown=t,cd0=t,time=0,sent=false,lv=4}
s=22
elseif D.event<20 then
t=800-20*(D.event-15)--800~600
B[p]= {pos=rnd(3,8),amount=11,countdown=t,cd0=t,time=0,sent=false,lv=4}
B[p+1]= {pos=rnd(4,7),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=5}
s=25
else
t=600-15*(D.event-30)--600~450
B[p]= {pos=rnd(2)*9-8,amount=12,countdown=t,cd0=t,time=0,sent=false,lv=5}
B[p+1]= {pos=rnd(3,8),amount=16,countdown=t,cd0=t,time=0,sent=false,lv=5}
s=28
end
B.sum=B.sum+s
P.stat.recv=P.stat.recv+s
if D.event<45 then
D.event=D.event+1
D.point=int(s*36e3/t)*.1
if D.event==10 then
P:showText(text.great,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=4
elseif D.event==20 then
P:showText(text.awesome,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=5
elseif D.event==30 then
P:showText(text.maxspeed,0,-140,100,"appear",.6)
end
end
end
end,
bg="game4",bgm="shining terminal",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr(
P.modeData.event<10 and 22
or P.modeData.event<20 and 25
or 28
,-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.nextWave,-82,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(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.event
return 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,
}

55
modes/bigbang.lua Normal file
View File

@@ -0,0 +1,55 @@
local format=string.format
local function getField()
local F={}
return F
end
local function newField(P)
end
return{
name={
"大爆炸",
"大爆炸",
"Big Bang",
},
level={
"简单",
"简单",
"EASY",
},
info={
"All-spin 入门教程",
"All-spin 入门教程",
"All-spin Tutorial!",
},
color=color.grey,
env={
drop=1e99,lock=1e99,
hold=false,
dropPiece=Event.lose,
task=nil,
bg="game1",bgm="newera",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(60)
for i=1,5 do
mStr("UNFINISHED",120+10*i,100+50*i)
end
end,
score=function(P)return{P.modeData.event,P.stat.extraRate}end,
scoreDisp=function(D)return D[1].."Stage "..format("%.2f",D[2]).."%"end,
comp=function(a,b)return a[1]>b[1]end,
getRank=function(P)
local W=P.modeData.event
return
W>=150 and 5 or
W>=100 and 4 or
W>=70 and 3 or
W>=40 and 2 or
W>=20 and 1 or
1
end,
}

56
modes/blind_easy.lua Normal file
View File

@@ -0,0 +1,56 @@
local min=math.min
return{
name={
"隐形",
"隐形",
"Blind",
},
level={
"半隐",
"半隐",
"HALF",
},
info={
"最强大脑",
"最强大脑",
"Invisible board",
},
color=color.cyan,
env={
drop=30,lock=45,
visible="time",
dropPiece=Event.reach_winCheck,
freshLimit=10,
target=200,
bg="glow",bgm="newera",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
end,
score=function(P)return{min(P.stat.row or 200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(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,
}

58
modes/blind_hard.lua Normal file
View File

@@ -0,0 +1,58 @@
local min=math.min
return{
name={
"隐形",
"隐形",
"Blind",
},
level={
"瞬隐",
"瞬隐",
"SUDDEN",
},
info={
"最强大脑",
"最强大脑",
"Invisible board",
},
color=color.magenta,
env={
drop=15,lock=45,
fall=10,lock=60,
center=false,
visible="none",
dropPiece=Event.reach_winCheck,
freshLimit=15,
target=200,
bg="rgb",bgm="secret7th",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
end,
score=function(P)return{min(P.stat.row or 200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(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<=150 and 5 or
T<=210 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,
}

58
modes/blind_lunatic.lua Normal file
View File

@@ -0,0 +1,58 @@
local min=math.min
return{
name={
"隐形",
"隐形",
"Blind",
},
level={
"瞬隐+",
"瞬隐+",
"SUDDEN+",
},
info={
"最强大脑",
"最强大脑",
"Invisible board",
},
color=color.red,
env={
drop=10,lock=60,
fall=5,
center=false,ghost=false,
visible="none",
dropPiece=Event.reach_winCheck,
freshLimit=15,
target=200,
bg="rgb",bgm="secret8th",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
end,
score=function(P)return{min(P.stat.row or 200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(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>=100 and 2 or
L>=40 and 1 or
L>=1 and 0
end
end,
}

57
modes/blind_normal.lua Normal file
View File

@@ -0,0 +1,57 @@
local min=math.min
return{
name={
"隐形",
"隐形",
"Blind",
},
level={
"全隐",
"全隐",
"ALL",
},
info={
"最强大脑",
"最强大脑",
"Invisible board",
},
color=color.green,
env={
drop=15,lock=45,
freshLimit=10,
visible="fast",
dropPiece=Event.reach_winCheck,
freshLimit=10,
target=200,
bg="glow",bgm="reason",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
end,
score=function(P)return{min(P.stat.row or 200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(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<=150 and 5 or
T<=210 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,
}

53
modes/blind_ultimate.lua Normal file
View File

@@ -0,0 +1,53 @@
local min=math.min
return{
name={
"隐形",
"隐形",
"Blind",
},
level={
"啥都不剩隐",
"啥都不剩隐",
"NOTHING",
},
info={
"最强大脑",
"最强大脑",
"Invisible board",
},
color=color.red,
env={
drop=30,lock=60,
fall=5,
block=false,
center=false,ghost=false,
visible="none",
dropPiece=Event.reach_winCheck,
freshLimit=15,
target=200,
bg="rgb",bgm="secret7th",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
end,
score=function(P)return{min(P.stat.row or 200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(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>=100 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

@@ -0,0 +1,87 @@
local rnd,min=math.random,math.min
local function check_c4w(P)
for i=1,#P.cleared do
P.field[#P.field+1]=getNewRow(10)
P.visTime[#P.visTime+1]=getNewRow(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
if #P.cleared==0 then
Event.lose(P)
else
if P.combo>P.modeData.point then
P.modeData.point=P.combo
end
if P.stat.row>=100 then
Event.win(P,"finish")
end
end
end
return{
name={
"C4W练习",
"中四宽练习",
"C4W Train",
},
level={
"疯狂",
"疯狂",
"LUNATIC",
},
info={
"无 限 连 击",
"无 限 连 击",
"Infinite combo",
},
color=color.red,
env={
drop=5,lock=30,
dropPiece=check_c4w,
freshLimit=15,ospin=false,
bg="rgb",bgm="newera",
},
load=function()
newPlayer(1,340,15)
local P=players[1]
local F=P.field
for i=1,24 do
F[i]=getNewRow(10)
P.visTime[i]=getNewRow(20)
for x=4,7 do F[i][x]=0 end
end
local r=rnd(6)
if r==1 then F[1][5],F[1][4],F[2][4]=10,10,10
elseif r==2 then F[1][6],F[1][7],F[2][7]=10,10,10
elseif r==3 then F[1][4],F[2][4],F[2][5]=10,10,10
elseif r==4 then F[1][7],F[2][7],F[2][6]=10,10,10
elseif r==5 then F[1][4],F[1][5],F[1][6]=10,10,10
elseif r==6 then F[1][7],F[1][6],F[1][5]=10,10,10
end
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.combo,-82,310)
mStr(P.modeData.point,-82,400)
mDraw(drawableText.combo,-82,358)
mDraw(drawableText.mxcmb,-82,450)
end,
score=function(P)return{min(P.combo,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..toTime(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.point
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,
}

85
modes/c4wtrain_normal.lua Normal file
View File

@@ -0,0 +1,85 @@
local rnd,min=math.random,math.min
local function check_c4w(P)
for i=1,#P.cleared do
P.field[#P.field+1]=getNewRow(10)
P.visTime[#P.visTime+1]=getNewRow(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
if #P.cleared>0 then
if P.combo>P.modeData.point then
P.modeData.point=P.combo
end
if P.stat.row>=100 then
Event.win(P,"finish")
end
end
end
return{
name={
"C4W练习",
"中四宽练习",
"C4W Train",
},
level={
"普通",
"普通",
"NORMAL",
},
info={
"无 限 连 击",
"无 限 连 击",
"Infinite combo",
},
color=color.green,
env={
drop=30,lock=60,oncehold=false,
dropPiece=check_c4w,
freshLimit=15,ospin=false,
bg="rgb",bgm="newera",
},
load=function()
newPlayer(1,340,15)
local P=players[1]
local F=P.field
for i=1,24 do
F[i]=getNewRow(10)
P.visTime[i]=getNewRow(20)
for x=4,7 do F[i][x]=0 end
end
local r=rnd(6)
if r==1 then F[1][5],F[1][4],F[2][4]=10,10,10
elseif r==2 then F[1][6],F[1][7],F[2][7]=10,10,10
elseif r==3 then F[1][4],F[2][4],F[2][5]=10,10,10
elseif r==4 then F[1][7],F[2][7],F[2][6]=10,10,10
elseif r==5 then F[1][4],F[1][5],F[1][6]=10,10,10
elseif r==6 then F[1][7],F[1][6],F[1][5]=10,10,10
end
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.combo,-82,310)
mStr(P.modeData.point,-82,400)
mDraw(drawableText.combo,-82,358)
mDraw(drawableText.mxcmb,-82,450)
end,
score=function(P)return{min(P.modeData.point,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..toTime(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<=30 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,
}

70
modes/classic_fast.lua Normal file
View File

@@ -0,0 +1,70 @@
local gc=love.graphics
local function check_LVup(P)
if P.stat.row>=P.gameEnv.target then
P.gameEnv.target=P.gameEnv.target+10
if P.gameEnv.target==110 then
P.gameEnv.drop,P.gameEnv.lock=2,2
elseif P.gameEnv.target==200 then
P.gameEnv.drop,P.gameEnv.lock=1,1
end
if P.gameEnv.target>100 then
SFX("reach")
end
end
end
return{
name={
"高速经典",
"高速经典",
"Classic",
},
level={
"CTWC",
"锦标赛",
"CTWC",
},
info={
"高速经典",
"高速经典",
"Vintage car drag racing",
},
color=color.lightBlue,
env={
das=16,arr=6,sddas=2,sdarr=2,
ghost=false,center=false,
drop=3,lock=3,wait=10,fall=25,
next=1,hold=false,
sequence="rnd",
freshLimit=0,
target=10,dropPiece=check_LVup,
bg="rgb",bgm="rockblock",
},
slowmark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(75)
local r=P.gameEnv.target*.1
mStr(r<11 and 18 or r<22 and r+8 or r==22 and"00"or r==23 and"0a"or format("%x",r*10-220),-82,210)
mDraw(drawableText.speedLV,-82,290)
setFont(45)
mStr(P.stat.row,-82,320)
mStr(P.gameEnv.target,-82,370)
gc.rectangle("fill",-125,375,90,4)
end,
score=function(P)return{P.stat.row,P.stat.score}end,
scoreDisp=function(D)return D[1].." Lines "..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>=191 and 4 or
L>=110 and 3 or
L>=50 and 2 or
L>=5 and 1 or
L>=1 and 0
end,
}

80
modes/custom_clear.lua Normal file
View File

@@ -0,0 +1,80 @@
local gc=love.graphics
local int=math.floor
return{
name={
"自定义",
"自定义",
"Custom",
},
level={
"普通",
"普通",
"NORMAL",
},
info={
"画点什么然后把它消除!",
"画点什么然后把它消除!",
"Draw something then clear it!",
},
color=color.white,
env={
dropPiece=Event.reach_winCheck,
},
load=function()
for i=1,#customID do
local k=customID[i]
modeEnv[k]=customRange[k][customSel[i]]
end
modeEnv._20G=modeEnv.drop==0
modeEnv.oncehold=customSel[6]==1
newPlayer(1,340,15)
local L=modeEnv.opponent
if L~=0 then
modeEnv.target=nil
if L<10 then
newPlayer(2,965,360,.5,AITemplate("9S",2*L))
else
newPlayer(2,965,360,.5,AITemplate("CC",L-6,2+int((L-11)*.5),modeEnv.hold,15000+5000*(L-10)))
end
end
preField.h=20
repeat
for i=1,10 do
if preField[preField.h][i]>0 then
goto L
end
end
preField.h=preField.h-1
until preField.h==0
::L::
for _,P in next,players.alive do
local t=P.showTime*3
for y=1,preField.h do
P.field[y]=getNewRow(0)
P.visTime[y]=getNewRow(t)
for x=1,10 do P.field[y][x]=preField[y][x]end
end
end
modeEnv.bg=customRange.bg[customSel[12]]
modeEnv.bgm=customRange.bgm[customSel[13]]
end,
mesDisp=function(P,dx,dy)
setFont(55)
if P.gameEnv.puzzle or P.gameEnv.target>1e10 then
mStr(P.stat.row,-82,225)
mDraw(drawableText.line,-82,290)
else
local R=P.gameEnv.target-P.stat.row
mStr(R>=0 and R or 0,-82,240)
end
if P.gameEnv.puzzle and P.modeData.event==0 then
local m=puzzleMark
for y=1,preField.h do for x=1,10 do
local T=preField[y][x]
if T~=0 then
gc.draw(m[T],30*x-30+dx,600-30*y+dy)
end
end end
end
end,
}

88
modes/custom_puzzle.lua Normal file
View File

@@ -0,0 +1,88 @@
local gc=love.graphics
local int=math.floor
local function puzzleCheck(P)
for y=1,20 do
local L=P.field[y]
for x=1,10 do
local a,b=preField[y][x],L and L[x]or 0
if a~=0 then
if a==-1 then if b>0 then return end
elseif a<8 then if a~=b then return end
elseif a>7 then if b==0 then return end
end
end
end
end
P.modeData.event=1
Event.win(P,"finish")
end
return{
name={
"自定义",
"自定义",
"Custom",
},
level={
"拼图",
"拼图",
"PUZZLE",
},
info={
"画点什么然后把它拼出来吧!",
"画点什么然后把它拼出来吧!",
"Draw something then stack it!",
},
color=color.white,
env={
puzzle=true,
Fkey=function(P)P.modeData.event=1-P.modeData.event end,
dropPiece=puzzleCheck,
},
load=function()
for i=1,#customID do
local k=customID[i]
modeEnv[k]=customRange[k][customSel[i]]
end
modeEnv._20G=modeEnv.drop==0
modeEnv.oncehold=customSel[6]==1
modeEnv.target=0
newPlayer(1,340,15)
local L=modeEnv.opponent
if L~=0 then
modeEnv.target=nil
if L<10 then
newPlayer(2,965,360,.5,AITemplate("9S",2*L))
else
newPlayer(2,965,360,.5,AITemplate("CC",L-6,2+int((L-11)*.5),modeEnv.hold,15000+5000*(L-10)))
end
end
preField.h=20
repeat
for i=1,10 do
if preField[preField.h][i]~=0 then
goto L
end
end
preField.h=preField.h-1
until preField.h==0
::L::
modeEnv.bg=customRange.bg[customSel[12]]
modeEnv.bgm=customRange.bgm[customSel[13]]
end,
mesDisp=function(P)
local dx,dy=P.fieldOff.x,P.fieldOff.y
setFont(55)
mStr(P.stat.row,-82,225)
mDraw(drawableText.line,-82,290)
if P.gameEnv.puzzle and P.modeData.event==0 then
local m=puzzleMark
for y=1,preField.h do for x=1,10 do
local T=preField[y][x]
if T~=0 then
gc.draw(m[T],30*x-30+dx,600-30*y+dy)
end
end end
end
end,
}

View File

@@ -0,0 +1,79 @@
local int,rnd=math.floor,math.random
return{
name={
"防守",
"防守",
"Defender",
},
level={
"疯狂",
"疯狂",
"Lunatic",
},
info={
"防守练习",
"防守练习",
"Hand them!",
},
color=color.red,
env={
drop=5,lock=60,
fall=6,
freshLimit=15,
pushSpeed=2,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
local t=240-2*P.modeData.event
if P.modeData.counter>=t then
P.modeData.counter=0
for _=1,4 do
P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=1,countdown=5*t,cd0=5*t,time=0,sent=false,lv=2}
end
P.atkBuffer.sum=P.atkBuffer.sum+4
P.stat.recv=P.stat.recv+4
local D=P.modeData
if D.event<75 then
D.event=D.event+1
D.point=int(144e3/(240-2*D.event))*.1
if D.event==25 then
P:showText(text.great,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=3
P.dropDelay,P.gameEnv.drop=4,4
elseif D.event==50 then
P:showText(text.awesome,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=4
P.dropDelay,P.gameEnv.drop=3,3
elseif D.event==75 then
P:showText(text.maxspeed,0,-140,100,"appear",.6)
P.dropDelay,P.gameEnv.drop=2,2
end
end
end
end,
bg="game4",bgm="way",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr(P.modeData.point,-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.rpm,-82,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(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.event
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
L>=5 and 0
end,
}

79
modes/defender_normal.lua Normal file
View File

@@ -0,0 +1,79 @@
local int,rnd=math.floor,math.random
return{
name={
"防守",
"防守",
"Defender",
},
level={
"普通",
"普通",
"NORMAL",
},
info={
"防守练习",
"防守练习",
"Hand them!",
},
color=color.green,
env={
drop=30,lock=60,
fall=10,
freshLimit=15,
pushSpeed=1,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
local t=360-P.modeData.event*2
if P.modeData.counter>=t then
P.modeData.counter=0
for _=1,3 do
P.atkBuffer[#P.atkBuffer+1]={pos=rnd(2,9),amount=1,countdown=2*t,cd0=2*t,time=0,sent=false,lv=1}
end
P.atkBuffer.sum=P.atkBuffer.sum+3
P.stat.recv=P.stat.recv+3
local D=P.modeData
if D.event<90 then
D.event=D.event+1
D.point=int(108e3/(360-D.event*2))*.1
if D.event==25 then
P:showText(text.great,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=2
P.dropDelay,P.gameEnv.drop=20,20
elseif D.event==50 then
P:showText(text.awesome,0,-140,100,"appear",.6)
P.gameEnv.pushSpeed=3
P.dropDelay,P.gameEnv.drop=10,10
elseif D.event==90 then
P.dropDelay,P.gameEnv.drop=5,5
P:showText(text.maxspeed,0,-140,100,"appear",.6)
end
end
end
end,
bg="game3",bgm="way",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr(P.modeData.point,-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.rpm,-82,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(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.event
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
L>=3 and 0
end,
}

55
modes/dig_hard.lua Normal file
View File

@@ -0,0 +1,55 @@
local max,rnd=math.max,math.random
return{
name={
"挖掘",
"挖掘",
"Dig",
},
level={
"困难",
"困难",
"HARD",
},
info={
"挖掘练习",
"挖掘练习",
"Downstack!",
},
color=color.magenta,
env={
drop=60,lock=120,
fall=20,
freshLimit=15,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(90,180-P.modeData.event)then
P.modeData.counter=0
P:garbageRise(10,1,rnd(10))
P.modeData.event=P.modeData.event+1
end
end,
bg="game2",bgm="push",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
end,
score=function(P)return{P.modeData.event,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.event
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
L>=5 and 0
end,
}

54
modes/dig_ultimate.lua Normal file
View File

@@ -0,0 +1,54 @@
local max,rnd=math.max,math.random
return{
name={
"挖掘",
"挖掘",
"Dig",
},
level={
"极限",
"极限",
"ULTIMATE",
},
info={
"挖掘练习",
"挖掘练习",
"Downstack!",
},
color=color.lightYellow,
env={
drop=10,lock=30,
freshLimit=15,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(45,80-.3*P.modeData.event)then
P.modeData.counter=0
P:garbageRise(11+P.modeData.event%3,1,rnd(10))
P.modeData.event=P.modeData.event+1
end
end,
bg="game2",bgm="secret7th",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
end,
score=function(P)return{P.modeData.event,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.event
return
W>=120 and 5 or
W>=100 and 4 or
W>=80 and 3 or
W>=50 and 2 or
W>=20 and 1 or
L>=5 and 0
end,
}

54
modes/drought_lunatic.lua Normal file
View File

@@ -0,0 +1,54 @@
local min=math.min
return{
name={
"干旱",
"干旱",
"Drought",
},
level={
"100L",
"100行",
"100L",
},
info={
"后 妈 发 牌",
"后 妈 发 牌",
"ERRSEQ flood attack",
},
color=color.red,
env={
drop=20,lock=60,
sequence="drought2",
target=100,dropPiece=Event.reach_winCheck,
ospin=false,
freshLimit=15,
bg="glow",bgm="reason",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(70)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,280)
end,
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(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<=70 and 5 or
T<=110 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,
}

54
modes/drought_normal.lua Normal file
View File

@@ -0,0 +1,54 @@
local min=math.min
return{
name={
"干旱",
"干旱",
"Drought",
},
level={
"100L",
"100行",
"100L",
},
info={
"你I没了",
"你I没了",
"B a g 6",
},
color=color.green,
env={
drop=20,lock=60,
sequence="drought1",
target=100,dropPiece=Event.reach_winCheck,
ospin=false,
freshLimit=15,
bg="glow",bgm="reason",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(70)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,280)
end,
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(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<=65 and 5 or
T<=100 and 4 or
T<=145 and 3 or
T<=220 and 2 or
1
else
return
L>=50 and 1 or
L>=10 and 0
end
end,
}

29
modes/hotseat_2P.lua Normal file
View File

@@ -0,0 +1,29 @@
return{
name={
"本地多人",
"本地多人",
"Hotseat",
},
level={
"2P",
"2P",
"2P",
},
info={
"友尽模式",
"友尽模式",
"End of friendship",
},
color=color.white,
env={
drop=60,lock=60,
freshLimit=15,
bg="none",bgm="way",
},
load=function()
newPlayer(1,20,15)
newPlayer(2,650,15)
end,
mesDisp=function(P,dx,dy)
end,
}

30
modes/hotseat_3P.lua Normal file
View File

@@ -0,0 +1,30 @@
return{
name={
"本地多人",
"本地多人",
"Hotseat",
},
level={
"3P",
"3P",
"3P",
},
info={
"友尽模式",
"友尽模式",
"End of friendship",
},
color=color.white,
env={
drop=60,lock=60,
freshLimit=15,
bg="none",bgm="way",
},
load=function()
newPlayer(1,20,100,.65)
newPlayer(2,435,100,.65)
newPlayer(3,850,100,.65)
end,
mesDisp=function(P,dx,dy)
end,
}

31
modes/hotseat_4P.lua Normal file
View File

@@ -0,0 +1,31 @@
return{
name={
"本地多人",
"本地多人",
"Hotseat",
},
level={
"4P",
"4P",
"4P",
},
info={
"友尽模式",
"友尽模式",
"End of friendship",
},
color=color.white,
env={
drop=60,lock=60,
freshLimit=15,
bg="none",bgm="way",
},
load=function()
newPlayer(1,25,160,.5)
newPlayer(2,335,160,.5)
newPlayer(3,645,160,.5)
newPlayer(4,955,160,.5)
end,
mesDisp=function(P,dx,dy)
end,
}

47
modes/infinite.lua Normal file
View File

@@ -0,0 +1,47 @@
local format=string.format
return{
name={
"无尽",
"无尽",
"Infinite",
},
level={
"时间杀手 II",
"时间杀手 II",
"Time Killer II",
},
info={
"沙盒",
"沙盒",
"Sandbox",
},
color=color.lightGrey,
env={
drop=1e99,lock=1e99,
oncehold=false,
bg="glow",bgm="infinite",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,370)
mDraw(drawableText.atk,-82,313)
mDraw(drawableText.eff,-82,425)
end,
score=function(P)return{P.stat.score}end,
scoreDisp=function(D)return tostring(D[1])end,
comp=function(a,b)return a[1]>b[1]end,
getRank=function(P)
local L=P.stat.row
return
L>=2600 and 5 or
L>=1500 and 4 or
L>=1000 and 3 or
L>=500 and 2 or
L>=100 and 1 or
L>=20 and 0
end,
}

64
modes/infinite_dig.lua Normal file
View File

@@ -0,0 +1,64 @@
local format,rnd=string.format,math.random
local function check_rise(P)
local L=P.cleared
for i=1,#L do
if L[i]<6 then
P:garbageRise(10,1,rnd(10))
P.modeData.point=P.modeData.point+1
end
end
end
return{
name={
"无尽:挖掘",
"无尽:挖掘",
"Infinite:dig",
},
level={
"时间杀手 III",
"时间杀手 III",
"Time Killer III",
},
info={
"挖呀挖呀挖",
"挖呀挖呀挖",
"Dig to Nether?",
},
color=color.white,
env={
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=check_rise,
pushSpeed=1,
bg="glow",bgm="infinite",
},
load=function()
newPlayer(1,340,15)
for _=1,5 do
players[1]:garbageRise(10,1,rnd(10))
end
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.modeData.point,-82,190)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.line,-82,243)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
end,
score=function(P)return{P.modeData.point}end,
scoreDisp=function(D)return D[1].." Lines"end,
comp=function(a,b)return a[1]>b[1]end,
getRank=function(P)
local L=P.modeData.point
return
L>=626 and 5 or
L>=400 and 4 or
L>=200 and 3 or
L>=100 and 2 or
L>=40 and 1 or
L>=5 and 0
end,
}

68
modes/marathon_hard.lua Normal file
View File

@@ -0,0 +1,68 @@
local gc=love.graphics
local function check(P)
if P.stat.row>=P.gameEnv.target then
local T=P.gameEnv.target
if T==50 then
P.gameEnv.drop=.25
P.gameEnv.target=100
elseif T==100 then
P.gameEnv._20G=true
P.gameEnv.target=200
else
Event.win(P,"finish")
end
end
end
return{
name={
"马拉松",
"马拉松",
"Marathon",
},
level={
"困难",
"困难",
"HARD",
},
info={
"200行20G马拉松",
"200行20G马拉松",
"200L marathon in 20G",
},
color=color.magenta,
env={
drop=.5,fall=30,
target=50,dropPiece=check,
mindas=7,minarr=1,minsdarr=1,
bg="strap",bgm="race",
},
slowmark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.row,-82,320)
mStr(P.gameEnv.target,-82,370)
gc.rectangle("fill",-125,375,90,4)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(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<=270 and 4 or
3
else
return
L>=100 and 2 or
L>=50 and 1 or
L>=10 and 0
end
end,
}

68
modes/marathon_normal.lua Normal file
View File

@@ -0,0 +1,68 @@
local gc=love.graphics
local dropSpeed={[0]=60,50,40,30,25,20,15,12,9,7,5,4,3,2,1,1,.5,.5,.25,.25}
local function check_LVup(P)
local T=P.modeData.point+10
if P.stat.row>=T then
if T==200 then
Event.win(P,"finish")
else
P.gameEnv.drop=dropSpeed[T/10]
P.modeData.point=T
SFX("reach")
end
end
end
return{
name={
"马拉松",
"马拉松",
"Marathon",
},
level={
"普通",
"普通",
"NORMAL",
},
info={
"200行变速马拉松",
"200行变速马拉松",
"200L marathon with acceleration",
},
color=color.green,
env={
fall=30,
target=10,dropPiece=check_LVup,
mindas=7,minarr=1,minsdarr=1,
minsdarr=1,
bg="strap",bgm="way",
},
slowmark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.row,-82,320)
mStr(P.modeData.point+10,-82,370)
gc.rectangle("fill",-125,375,90,4)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(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<=185 and 5 or
T<=250 and 4 or
3
else
return
L>=150 and 2 or
L>=100 and 1 or
L>=20 and 0
end
end,
}

93
modes/master_adavnce.lua Normal file
View File

@@ -0,0 +1,93 @@
local gc=love.graphics
local int=math.floor
local death_lock={12,11,10,9,8}
local death_wait={10,9,8,7,6}
local death_fall={10,9,8,7,6}
local function score(P)
local c=#P.cleared
if c==0 and P.modeData.point%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
P.modeData.point=P.modeData.point+s
if P.modeData.point%100==99 then
SFX("blip_1")
elseif P.modeData.point>=100*(P.modeData.event+1)then
local s=P.modeData.event+1;P.modeData.event=s--level up!
local E=P.gameEnv
curBG=s==1 and"game3"or s==2 and"game4"or s==3 and"game5"or s==4 and"game6"or"game5"
E.lock=death_lock[s]
E.wait=death_wait[s]
E.fall=death_fall[s]
E.das=int(6.9-s*.4)
if s==3 then P.gameEnv.bone=true end
if s==5 then
P.modeData.point,P.modeData.event=500,4
Event.win(P,"finish")
else
P:showText(text.stage(s),0,-120,80,"fly")
end
SFX("reach")
end
end
return{
name={
"大师",
"大师",
"Master",
},
level={
"极限",
"极限",
"ULTIMATE",
},
info={
"进阶20G",
"进阶20G",
"Advanced 20G",
},
color=color.red,
env={
_20G=true,
lock=death_lock[1],
wait=death_wait[1],
fall=death_fall[1],
dropPiece=score,
mindas=6,minarr=1,
freshLimit=15,
bg="game2",bgm="secret7th",
},
slowmark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.modeData.point,-82,320)
mStr((P.modeData.event+1)*100,-82,370)
gc.rectangle("fill",-125,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.row,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..D[2].."L "..toTime(D[3])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and(a[2]<b[2]or a[2]==b[2]and a[3]<b[3]))
end,
getRank=function(P)
local L=P.stat.techrash
local S=P.modeData.point
if S==500 then
return
L>=30 and 5 or
L>=25 and 4 or
3
else
return
S>=426 and 3 or
S>=326 and 2 or
S>=226 and 1 or
S>=50 and 0
end
end,
}

97
modes/master_beginner.lua Normal file
View File

@@ -0,0 +1,97 @@
local gc=love.graphics
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 c=#P.cleared
if c==0 and P.modeData.point%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
P.modeData.point=P.modeData.point+s
if P.modeData.point%100==99 then
SFX("blip_1")
elseif P.modeData.point>=100*(P.modeData.event+1)then
local s=P.modeData.event+1;P.modeData.event=s--level up!
local E=P.gameEnv
curBG=s==1 and"game1"or s==2 and"game2"or s==3 and"game3"or "game4"
E.lock=rush_lock[s]
E.wait=rush_wait[s]
E.fall=rush_fall[s]
E.das=10-s
if s==2 then
P.gameEnv.arr=2
elseif s==4 then
P.gameEnv.bone=true
end
if s==5 then
P.modeData.point,P.modeData.event=500,4
Event.win(P,"finish")
else
P:showText(text.stage(s),0,-120,80,"fly")
end
SFX("reach")
end
end
return{
name={
"大师",
"大师",
"Master",
},
level={
"疯狂",
"疯狂",
"LUNATIC",
},
info={
"初心20G",
"初心20G",
"Beginner 20G",
},
color=color.red,
env={
_20G=true,
lock=rush_lock[1],
wait=rush_wait[1],
fall=rush_fall[1],
dropPiece=score,
das=9,arr=3,
freshLimit=15,
bg="strap",bgm="secret8th",
},
slowmark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.modeData.point,-82,320)
mStr((P.modeData.event+1)*100,-82,370)
gc.rectangle("fill",-125,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.row,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..D[2].."L "..toTime(D[3])end,
comp=function(a,b)
return a[1]>b[1]or(a[1]==b[1]and(a[2]<b[2]or a[2]==b[2]and a[3]<b[3]))
end,
getRank=function(P)
local L=P.stat.techrash
local S=P.modeData.point
if S==500 then
return
L>=30 and 5 or
L>=25 and 4 or
3
else
return
S>=420 and 3 or
S>=250 and 2 or
S>=120 and 1 or
S>=30 and 0
end
end,
}

86
modes/master_final.lua Normal file
View File

@@ -0,0 +1,86 @@
local gc=love.graphics
local int=math.floor
local function score(P)
local c=#P.cleared
if c==0 and P.modeData.point%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
local MD=P.modeData
MD.point=MD.point+s
if MD.point%100==99 then SFX("blip_1")end
if int(MD.point*.01)>MD.event then
local s=MD.event+1;MD.event=s--level up!
P:showText(text.stage(s),0,-120,80,"fly")
local E=P.gameEnv
if s<4 then--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
elseif s<10 then
if s==4 or s==7 then E.das=E.das-1 end
s=s%3
if s==0 then E.lock=E.lock-1
elseif s==1 then E.wait=E.wait-1
elseif s==2 then E.fall=E.fall-1
end
else
MD.point,MD.event=1000,9
Event.win(P,"finish")
end
SFX("reach")
end
end
return{
name={
"大师",
"大师",
"Master",
},
level={
"终点",
"终点",
"FINAL",
},
info={
"究极20G:无法到达的终点",
"究极20G:无法到达的终点",
"Extreme 20G:Unreachable destination",
},
color=color.lightGrey,
env={
_20G=true,lock=12,
wait=10,fall=10,
dropPiece=score,
mindas=5,minarr=1,
freshLimit=15,
easyFresh=false,bone=true,
bg="none",bgm="shining terminal",
},
slowmark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local MD=P.modeData
mStr(MD.point,-82,320)
mStr((MD.event+1)*100,-82,370)
gc.rectangle("fill",-125,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.time}end,
scoreDisp=function(D)return D[1].."P "..toTime(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.point
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
L>=50 and 0
end,
}

View File

@@ -0,0 +1,58 @@
local gc=love.graphics
return{
name={
"全清挑战",
"全清挑战",
"PC Challenge",
},
level={
"困难",
"困难",
"HARD",
},
info={
"100行内刷PC",
"100行内刷全清",
"More PCs in 100L",
},
color=color.magenta,
env={
drop=60,lock=120,
fall=10,
target=100,dropPiece=Event.reach_winCheck,
freshLimit=15,
ospin=false,
bg="rgb",bgm="infinite",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,250)
setFont(75)
mStr(P.stat.pc,-82,350)
mDraw(drawableText.pc,-82,432)
gc.setColor(.5,.5,.5)
if frame>179 then
local y=72*(7-(P.stat.piece+(P.hd.id>0 and 2 or 1))%7)-36
gc.line(320,y,442,y)
end
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(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>=16 and 5 or
L>=13 and 4 or
L>=10 and 3 or
L>=7 and 2 or
L>=4 and 1 or
L>=1 and 0
end,
}

View File

@@ -0,0 +1,58 @@
local gc=love.graphics
return{
name={
"全清挑战",
"全清挑战",
"PC Challenge",
},
level={
"疯狂",
"疯狂",
"LUNATIC",
},
info={
"100行内刷PC",
"100行内刷全清",
"More PCs in 100L",
},
color=color.red,
env={
drop=20,lock=60,
fall=20,
target=100,dropPiece=Event.reach_winCheck,
freshLimit=15,
ospin=false,
bg="rgb",bgm="infinite",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,250)
setFont(75)
mStr(P.stat.pc,-82,350)
mDraw(drawableText.pc,-82,432)
gc.setColor(.5,.5,.5)
if frame>179 then
local y=72*(7-(P.stat.piece+(P.hd.id>0 and 2 or 1))%7)-36
gc.line(320,y,442,y)
end
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(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>=15 and 5 or
L>=12 and 4 or
L>=9 and 3 or
L>=6 and 2 or
L>=3 and 1 or
L>=1 and 0
end,
}

View File

@@ -0,0 +1,57 @@
local gc=love.graphics
return{
name={
"全清挑战",
"全清挑战",
"PC Challenge",
},
level={
"普通",
"普通",
"NORMAL",
},
info={
"100行内刷PC",
"100行内刷全清",
"More PCs in 100L",
},
color=color.green,
env={
oncehold=false,
drop=300,lock=1e99,
target=100,dropPiece=Event.reach_winCheck,
ospin=false,
bg="rgb",bgm="newera",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,250)
setFont(75)
mStr(P.stat.pc,-82,350)
mDraw(drawableText.pc,-82,432)
gc.setColor(.5,.5,.5)
if frame>179 then
local y=72*(7-(P.stat.piece+(P.hd.id>0 and 2 or 1))%7)-36
gc.line(320,y,442,y)
end
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(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>=25 and 5 or
L>=20 and 4 or
L>=16 and 3 or
L>=13 and 2 or
L>=10 and 1 or
L>=1 and 0
end,
}

115
modes/pctrain_lunatic.lua Normal file
View File

@@ -0,0 +1,115 @@
local int,rnd=math.floor,math.random
local ins=table.insert
local pc_drop={50,45,40,35,30,26,22,18,15,12}
local pc_lock={55,50,45,40,36,32,30}
local pc_fall={18,16,14,12,10,9,8,7,6}
local PCbase=require("parts/PCbase")
local PClist=require("parts/PClist")
local function task_PC(P)
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter==21 then
local t=P.stat.pc%2
for i=1,4 do
local r=getNewRow(0)
for j=1,10 do
r[j]=PCbase[4*t+i][j]
end
ins(P.field,1,r)
ins(P.visTime,1,getNewRow(20))
end
P.fieldBeneath=P.fieldBeneath+120
P.curY=P.curY+4
P:freshgho()
return true
end
end
local function newPC(P)
local r=P.field;r=r[#r]
if r then
local c=0
for i=1,10 do if r[i]>0 then c=c+1 end end
if c<5 then
Event.lose(P)
end
end
if P.stat.piece%4==0 and #P.field==0 then
P.modeData.event=P.modeData.event==0 and 1 or 0
local r=rnd(#PClist)
local f=P.modeData.event==0
for i=1,4 do
local b=PClist[r][i]
if f then
if b<3 then b=3-b
elseif b<5 then b=7-b
end
end
P.next[#P.next+1]={bk=blocks[b][0],id=b,color=b,name=b}--P:newNext(b)'s simple version!
end
P.modeData.counter=P.stat.piece==0 and 20 or 0
newTask(task_PC,P)
local s=P.stat.pc*.5
if int(s)==s and s>0 then
P.gameEnv.drop=pc_drop[s]or 10
P.gameEnv.lock=pc_lock[s]or 20
P.gameEnv.fall=pc_fall[s]or 5
if s==10 then
P:showText(text.maxspeed,0,-140,100,"appear",.6)
else
P:showText(text.speedup,0,-140,40,"appear",.8)
end
end
end
end
return{
name={
"全清训练",
"全清训练",
"PC Train",
},
level={
"疯狂",
"疯狂",
"LUNATIC",
},
info={
"简易PC题库,熟悉全清定式的组合",
"简易全清题库,熟悉全清定式的组合",
"Let's learn some PCs",
},
color=color.red,
env={
next=4,
hold=false,
drop=60,lock=60,
fall=20,
sequence="none",
freshLimit=15,
dropPiece=newPC,
ospin=false,
bg="rgb",bgm="newera",
},
load=function()
newPlayer(1,340,15)
newPC(players[1])
end,
mesDisp=function(P,dx,dy)
setFont(75)
mStr(P.stat.pc,-82,330)
mDraw(drawableText.pc,-82,412)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(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>=1 and 0
end,
}

98
modes/pctrain_normal.lua Normal file
View File

@@ -0,0 +1,98 @@
local rnd=math.random
local ins=table.insert
local PCbase=require("parts/PCbase")
local PClist=require("parts/PClist")
local function task_PC(P)
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter==21 then
local t=P.stat.pc%2
for i=1,4 do
local r=getNewRow(0)
for j=1,10 do
r[j]=PCbase[4*t+i][j]
end
ins(P.field,1,r)
ins(P.visTime,1,getNewRow(20))
end
P.fieldBeneath=P.fieldBeneath+120
P.curY=P.curY+4
P:freshgho()
return true
end
end
local function newPC(P)
local r=P.field;r=r[#r]
if r then
local c=0
for i=1,10 do if r[i]>0 then c=c+1 end end
if c<5 then
Event.lose(P)
end
end
if P.stat.piece%4==0 and #P.field==0 then
P.modeData.event=P.modeData.event==0 and 1 or 0
local r=rnd(#PClist)
local f=P.modeData.event==0
for i=1,4 do
local b=PClist[r][i]
if f then
if b<3 then b=3-b
elseif b<5 then b=7-b
end
end
P.next[#P.next+1]={bk=blocks[b][0],id=b,color=b,name=b}--P:newNext(b)'s simple version!
end
P.modeData.counter=P.stat.piece==0 and 20 or 0
newTask(task_PC,P)
end
end
return{
name={
"全清训练",
"全清训练",
"PC Train",
},
level={
"普通",
"普通",
"NORMAL",
},
info={
"简易PC题库,熟悉全清定式的组合",
"简易全清题库,熟悉全清定式的组合",
"Let's learn some PCs",
},
color=color.green,
env={
next=4,
hold=false,
drop=150,lock=150,
fall=20,
sequence="none",
dropPiece=newPC,
ospin=false,
bg="rgb",bgm="newera",
},
load=function()
newPlayer(1,340,15)
newPC(players[1])
end,
mesDisp=function(P,dx,dy)
setFont(75)
mStr(P.stat.pc,-82,330)
mDraw(drawableText.pc,-82,412)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(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>=100 and 5 or
L>=60 and 4 or
L>=40 and 3 or
L>=25 and 2 or
L>=15 and 1 or
L>=1 and 0
end,
}

56
modes/round_1.lua Normal file
View File

@@ -0,0 +1,56 @@
local function update_round(P)
if #players.alive>1 then
P.control=false
local ID=P.id
repeat
ID=ID+1
if not players[ID]then ID=1 end
until players[ID].alive or ID==P.id
players[ID].control=true
end
end
return{
name={
"回合制",
"回合制",
"Turn-Base",
},
level={
"简单",
"简单",
"EASY",
},
info={
"下棋模式",
"下棋模式",
"Chess?",
},
color=color.cyan,
env={
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=update_round,
bg="game2",bgm="push",
},
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",10))
end,
mesDisp=function(P,dx,dy)
end,
score=function(P)return{P.stat.piece,P.stat.time}end,
scoreDisp=function(D)return D[1].." Pieces "..toTime(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)
if P.result=="WIN"then
local T=P.stat.piece
return
T<=20 and 5 or
T<=26 and 4 or
T<=40 and 3 or
T<=60 and 2 or
1
end
end,
}

56
modes/round_2.lua Normal file
View File

@@ -0,0 +1,56 @@
local function update_round(P)
if #players.alive>1 then
P.control=false
local ID=P.id
repeat
ID=ID+1
if not players[ID]then ID=1 end
until players[ID].alive or ID==P.id
players[ID].control=true
end
end
return{
name={
"回合制",
"回合制",
"Turn-Base",
},
level={
"普通",
"普通",
"NORMAL",
},
info={
"下棋模式",
"下棋模式",
"Chess?",
},
color=color.green,
env={
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=update_round,
bg="game2",bgm="push",
},
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",10))
end,
mesDisp=function(P,dx,dy)
end,
score=function(P)return{P.stat.piece,P.stat.time}end,
scoreDisp=function(D)return D[1].." Pieces "..toTime(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)
if P.result=="WIN"then
local T=P.stat.piece
return
T<=30 and 5 or
T<=40 and 4 or
T<=55 and 3 or
T<=70 and 2 or
1
end
end,
}

56
modes/round_3.lua Normal file
View File

@@ -0,0 +1,56 @@
local function update_round(P)
if #players.alive>1 then
P.control=false
local ID=P.id
repeat
ID=ID+1
if not players[ID]then ID=1 end
until players[ID].alive or ID==P.id
players[ID].control=true
end
end
return{
name={
"回合制",
"回合制",
"Turn-Base",
},
level={
"困难",
"困难",
"HARD",
},
info={
"下棋模式",
"下棋模式",
"Chess?",
},
color=color.magenta,
env={
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=update_round,
bg="game2",bgm="push",
},
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",10))
end,
mesDisp=function(P,dx,dy)
end,
score=function(P)return{P.stat.piece,P.stat.time}end,
scoreDisp=function(D)return D[1].." Pieces "..toTime(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)
if P.result=="WIN"then
local T=P.stat.piece
return
T<=35 and 5 or
T<=45 and 4 or
T<=65 and 3 or
T<=85 and 2 or
1
end
end,
}

56
modes/round_4.lua Normal file
View File

@@ -0,0 +1,56 @@
local function update_round(P)
if #players.alive>1 then
P.control=false
local ID=P.id
repeat
ID=ID+1
if not players[ID]then ID=1 end
until players[ID].alive or ID==P.id
players[ID].control=true
end
end
return{
name={
"回合制",
"回合制",
"Turn-Base",
},
level={
"疯狂",
"疯狂",
"LUNATIC",
},
info={
"下棋模式",
"下棋模式",
"Chess?",
},
color=color.red,
env={
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=update_round,
bg="game2",bgm="push",
},
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",10))
end,
mesDisp=function(P,dx,dy)
end,
score=function(P)return{P.stat.piece,P.stat.time}end,
scoreDisp=function(D)return D[1].." Pieces "..toTime(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)
if P.result=="WIN"then
local T=P.stat.piece
return
T<=40 and 5 or
T<=50 and 4 or
T<=75 and 3 or
T<=100 and 2 or
1
end
end,
}

56
modes/round_5.lua Normal file
View File

@@ -0,0 +1,56 @@
local function update_round(P)
if #players.alive>1 then
P.control=false
local ID=P.id
repeat
ID=ID+1
if not players[ID]then ID=1 end
until players[ID].alive or ID==P.id
players[ID].control=true
end
end
return{
name={
"回合制",
"回合制",
"Turn-Base",
},
level={
"极限",
"极限",
"ULTIMATE",
},
info={
"下棋模式",
"下棋模式",
"Chess?",
},
color=color.lightYellow,
env={
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=update_round,
bg="game2",bgm="push",
},
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",10))
end,
mesDisp=function(P,dx,dy)
end,
score=function(P)return{P.stat.piece,P.stat.time}end,
scoreDisp=function(D)return D[1].." Pieces "..toTime(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)
if P.result=="WIN"then
local T=P.stat.piece
return
T<=50 and 5 or
T<=60 and 4 or
T<=80 and 3 or
T<=100 and 2 or
1
end
end,
}

43
modes/solo_1.lua Normal file
View File

@@ -0,0 +1,43 @@
return{
name={
"单挑",
"单挑",
"Battle",
},
level={
"简单",
"简单",
"EASY",
},
info={
"打败AI",
"打败电脑",
"Beat AI",
},
color=color.cyan,
env={
drop=60,lock=60,
freshLimit=15,
bg="game2",bgm="race",
},
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",3))
end,
mesDisp=function(P,dx,dy)
end,
score=function(P)return{P.stat.time}end,
scoreDisp=function(D)return toTime(D[1])end,
comp=function(a,b)return a[1]<b[1]end,
getRank=function(P)
if P.result=="WIN"then
local T=P.stat.time
return
T<=15 and 5 or
T<=25 and 4 or
T<=40 and 3 or
T<=80 and 2 or
1
end
end,
}

43
modes/solo_2.lua Normal file
View File

@@ -0,0 +1,43 @@
return{
name={
"单挑",
"单挑",
"Battle",
},
level={
"普通",
"普通",
"NORMAL",
},
info={
"打败AI",
"打败AI",
"Beat AI",
},
color=color.green,
env={
drop=60,lock=60,
freshLimit=15,
bg="game2",bgm="race",
},
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",5))
end,
mesDisp=function(P,dx,dy)
end,
score=function(P)return{P.stat.time}end,
scoreDisp=function(D)return toTime(D[1])end,
comp=function(a,b)return a[1]<b[1]end,
getRank=function(P)
if P.result=="WIN"then
local T=P.stat.time
return
T<=16 and 5 or
T<=28 and 4 or
T<=45 and 3 or
T<=90 and 2 or
1
end
end,
}

43
modes/solo_3.lua Normal file
View File

@@ -0,0 +1,43 @@
return{
name={
"单挑",
"单挑",
"Battle",
},
level={
"困难",
"困难",
"HARD",
},
info={
"打败AI",
"打败AI",
"Beat AI",
},
color=color.magenta,
env={
drop=60,lock=60,
freshLimit=15,
bg="game2",bgm="race",
},
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",7))
end,
mesDisp=function(P,dx,dy)
end,
score=function(P)return{P.stat.time}end,
scoreDisp=function(D)return toTime(D[1])end,
comp=function(a,b)return a[1]<b[1]end,
getRank=function(P)
if P.result=="WIN"then
local T=P.stat.time
return
T<=17 and 5 or
T<=26 and 4 or
T<=45 and 3 or
T<=60 and 2 or
1
end
end,
}

43
modes/solo_4.lua Normal file
View File

@@ -0,0 +1,43 @@
return{
name={
"单挑",
"单挑",
"Battle",
},
level={
"疯狂",
"疯狂",
"LUNATIC",
},
info={
"打败AI",
"打败AI",
"Beat AI",
},
color=color.red,
env={
drop=60,lock=60,
freshLimit=15,
bg="game2",bgm="race",
},
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",8))
end,
mesDisp=function(P,dx,dy)
end,
score=function(P)return{P.stat.time}end,
scoreDisp=function(D)return toTime(D[1])end,
comp=function(a,b)return a[1]<b[1]end,
getRank=function(P)
if P.result=="WIN"then
local T=P.stat.time
return
T<=18 and 5 or
T<=30 and 4 or
T<=50 and 3 or
T<=70 and 2 or
1
end
end,
}

43
modes/solo_5.lua Normal file
View File

@@ -0,0 +1,43 @@
return{
name={
"单挑",
"单挑",
"Battle",
},
level={
"极限",
"极限",
"ULTIMATE",
},
info={
"打败AI",
"打败AI",
"Beat AI",
},
color=color.lightYellow,
env={
drop=60,lock=60,
freshLimit=15,
bg="game2",bgm="race",
},
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",9))
end,
mesDisp=function(P,dx,dy)
end,
score=function(P)return{P.stat.time}end,
scoreDisp=function(D)return toTime(D[1])end,
comp=function(a,b)return a[1]<b[1]end,
getRank=function(P)
if P.result=="WIN"then
local T=P.stat.time
return
T<=20 and 5 or
T<=30 and 4 or
T<=45 and 3 or
T<=60 and 2 or
1
end
end,
}

54
modes/sprint_10.lua Normal file
View File

@@ -0,0 +1,54 @@
local gc=love.graphics
local rnd=math.random
return{
name={
"竞速",
"竞速",
"Sprint",
},
level={
"10L",
"10行",
"10L",
},
info={
"消除10行",
"消除10行",
"Clear 10 lines",
},
color=color.cyan,
env={
drop=60,lock=60,
target=10,dropPiece=Event.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P)
local dx,dy=P.fieldOff.x,P.fieldOff.y
setFont(55)
local r=10-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
gc.line(dx,600-30*r+dy,300+dx,600-30*r+dy)
end
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(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.row<10 then return end
local T=P.stat.time
return
T<=7 and 5 or
T<=10 and 4 or
T<=25 and 3 or
T<=40 and 2 or
T<=60 and 1 or
0
end,
}

54
modes/sprint_100.lua Normal file
View File

@@ -0,0 +1,54 @@
local gc=love.graphics
local rnd=math.random
return{
name={
"竞速",
"竞速",
"Sprint",
},
level={
"100L",
"100行",
"100L",
},
info={
"消除100行",
"消除100行",
"Clear 100 lines",
},
color=color.orange,
env={
drop=60,lock=60,
target=100,dropPiece=Event.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P)
local dx,dy=P.fieldOff.x,P.fieldOff.y
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
gc.line(dx,600-30*r+dy,300+dx,600-30*r+dy)
end
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(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.row<100 then return end
local T=P.stat.time
return
T<=60 and 5 or
T<=90 and 4 or
T<=130 and 3 or
T<=200 and 2 or
T<=270 and 1 or
0
end,
}

54
modes/sprint_1000.lua Normal file
View File

@@ -0,0 +1,54 @@
local gc=love.graphics
local rnd=math.random
return{
name={
"竞速",
"竞速",
"Sprint",
},
level={
"1000L",
"1000行",
"1000L",
},
info={
"消除1000行",
"消除1000行",
"Clear 1000 lines",
},
color=color.lightGrey,
env={
drop=60,lock=60,
target=1000,dropPiece=Event.reach_winCheck,
bg="strap",bgm="push",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P)
local dx,dy=P.fieldOff.x,P.fieldOff.y
setFont(55)
local r=1000-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
gc.line(dx,600-30*r+dy,300+dx,600-30*r+dy)
end
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(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.row<1000 then return end
local T=P.stat.time
return
T<=626 and 5 or
T<=1000 and 4 or
T<=1400 and 3 or
T<=2200 and 2 or
T<=3000 and 1 or
0
end,
}

54
modes/sprint_20.lua Normal file
View File

@@ -0,0 +1,54 @@
local gc=love.graphics
local rnd=math.random
return{
name={
"竞速",
"竞速",
"Sprint",
},
level={
"20L",
"20行",
"20L",
},
info={
"消除20行",
"消除20行",
"Clear 20 lines",
},
color=color.lightBlue,
env={
drop=60,lock=60,
target=20,dropPiece=Event.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P)
local dx,dy=P.fieldOff.x,P.fieldOff.y
setFont(55)
local r=20-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
gc.line(dx,600-30*r+dy,300+dx,600-30*r+dy)
end
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(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.row<20 then return end
local T=P.stat.time
return
T<=13 and 5 or
T<=18 and 4 or
T<=45 and 3 or
T<=70 and 2 or
T<=100 and 1 or
0
end,
}

54
modes/sprint_40.lua Normal file
View File

@@ -0,0 +1,54 @@
local gc=love.graphics
local rnd=math.random
return{
name={
"竞速",
"竞速",
"Sprint",
},
level={
"40L",
"40行",
"40L",
},
info={
"消除40行",
"消除40行",
"Clear 40 lines",
},
color=color.green,
env={
drop=60,lock=60,
target=40,dropPiece=Event.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P)
local dx,dy=P.fieldOff.x,P.fieldOff.y
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
gc.line(dx,600-30*r+dy,300+dx,600-30*r+dy)
end
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(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.row<40 then return end
local T=P.stat.time
return
T<=25 and 5 or
T<=32 and 4 or
T<=40 and 3 or
T<=62 and 2 or
T<=126 and 1 or
0
end,
}

54
modes/sprint_400.lua Normal file
View File

@@ -0,0 +1,54 @@
local gc=love.graphics
local rnd=math.random
return{
name={
"竞速",
"竞速",
"Sprint",
},
level={
"400L",
"400行",
"400L",
},
info={
"消除400行",
"消除400行",
"Clear 400 lines",
},
color=color.red,
env={
drop=60,lock=60,
target=400,dropPiece=Event.reach_winCheck,
bg="strap",bgm="push",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P)
local dx,dy=P.fieldOff.x,P.fieldOff.y
setFont(55)
local r=400-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
gc.line(dx,600-30*r+dy,300+dx,600-30*r+dy)
end
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(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.row<400 then return end
local T=P.stat.time
return
T<=255 and 5 or
T<=330 and 4 or
T<=420 and 3 or
T<=626 and 2 or
T<=1000 and 1 or
0
end,
}

57
modes/survivor_easy.lua Normal file
View File

@@ -0,0 +1,57 @@
local max,rnd=math.max,math.random
return{
name={
"生存",
"生存",
"Survivor",
},
level={
"简单",
"简单",
"EASY",
},
info={
"你能存活多久?",
"你能存活多久?",
"Survive Longer!",
},
color=color.cyan,
env={
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(60,150-2*P.modeData.event)and P.atkBuffer.sum<4 then
P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1}
P.atkBuffer.sum=P.atkBuffer.sum+1
P.stat.recv=P.stat.recv+1
if P.modeData.event==45 then P:showText(text.maxspeed,0,-140,100,"appear",.6)end
P.modeData.counter=0
P.modeData.event=P.modeData.event+1
end
end,
bg="glow",bgm="newera",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(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.event
return
W>=100 and 5 or
W>=60 and 4 or
W>=45 and 3 or
W>=30 and 2 or
W>=15 and 1 or
W>=5 and 0
end,
}

62
modes/survivor_hard.lua Normal file
View File

@@ -0,0 +1,62 @@
local max,rnd=math.max,math.random
return{
name={
"生存",
"生存",
"Survivor",
},
level={
"困难",
"困难",
"HARD",
},
info={
"你能存活多久?",
"你能存活多久?",
"Survive Longer!",
},
color=color.magenta,
env={
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(60,180-2*P.modeData.event)and P.atkBuffer.sum<15 then
P.atkBuffer[#P.atkBuffer+1]=
P.modeData.event%3<2 and
{pos=rnd(10),amount=1,countdown=0,cd0=0,time=0,sent=false,lv=1}
or
{pos=rnd(10),amount=3,countdown=60,cd0=60,time=0,sent=false,lv=2}
local R=(P.modeData.event%3<2 and 1 or 3)
P.atkBuffer.sum=P.atkBuffer.sum+R
P.stat.recv=P.stat.recv+R
if P.modeData.event==60 then P:showText(text.maxspeed,0,-140,100,"appear",.6)end
P.modeData.counter=0
P.modeData.event=P.modeData.event+1
end
end,
bg="glow",bgm="newera",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(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.event
return
W>=90 and 5 or
W>=60 and 4 or
W>=45 and 3 or
W>=30 and 2 or
W>=15 and 1 or
W>=5 and 0
end,
}

View File

@@ -0,0 +1,58 @@
local max,rnd=math.max,math.random
return{
name={
"生存",
"生存",
"Survivor",
},
level={
"疯狂",
"疯狂",
"LUNATIC",
},
info={
"你能存活多久?",
"你能存活多久?",
"Survive Longer!",
},
color=color.red,
env={
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(60,150-P.modeData.event)and P.atkBuffer.sum<20 then
local t=max(60,90-P.modeData.event)
P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3}
P.atkBuffer.sum=P.atkBuffer.sum+4
P.stat.recv=P.stat.recv+4
if P.modeData.event==60 then P:showText(text.maxspeed,0,-140,100,"appear",.6)end
P.modeData.counter=0
P.modeData.event=P.modeData.event+1
end
end,
bg="glow",bgm="newera",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(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.event
return
W>=110 and 5 or
W>=80 and 4 or
W>=55 and 3 or
W>=30 and 2 or
W>=15 and 1 or
W>=5 and 0
end,
}

62
modes/survivor_normal.lua Normal file
View File

@@ -0,0 +1,62 @@
local max,rnd=math.max,math.random
return{
name={
"生存",
"生存",
"Survivor",
},
level={
"普通",
"普通",
"NORMAL",
},
info={
"你能存活多久?",
"你能存活多久?",
"Survive Longer!",
},
color=color.green,
env={
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(90,180-2*P.modeData.event)and P.atkBuffer.sum<8 then
local d=P.modeData.event+1
P.atkBuffer[#P.atkBuffer+1]=
d%4==0 and{pos=rnd(10),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1}or
d%4==1 and{pos=rnd(10),amount=2,countdown=70,cd0=70,time=0,sent=false,lv=1}or
d%4==2 and{pos=rnd(10),amount=3,countdown=80,cd0=80,time=0,sent=false,lv=2}or
d%4==3 and{pos=rnd(10),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3}
P.atkBuffer.sum=P.atkBuffer.sum+d%4+1
P.stat.recv=P.stat.recv+d%4+1
if P.modeData.event==45 then P:showText(text.maxspeed,0,-140,100,"appear",.6)end
P.modeData.counter=0
P.modeData.event=d
end
end,
bg="glow",bgm="newera",
},
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(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.event
return
W>=80 and 5 or
W>=55 and 4 or
W>=45 and 3 or
W>=30 and 2 or
W>=15 and 1 or
W>=5 and 0
end,
}

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