Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
08883b952f | ||
|
|
76fab86692 | ||
|
|
725eb4e26f | ||
|
|
486a64cca3 | ||
|
|
8e5f6f8b7c | ||
|
|
c0149d5830 | ||
|
|
28d5136e95 | ||
|
|
2768fa748b | ||
|
|
00026bc46b | ||
|
|
7d63386410 | ||
|
|
e88553bc00 | ||
|
|
4652be7067 | ||
|
|
ed0f8031d0 | ||
|
|
15df07ae3f | ||
|
|
57857ceb67 | ||
|
|
527352ce15 | ||
|
|
b8f57f5a1c | ||
|
|
d02048f0dc | ||
|
|
4da080c6f5 | ||
|
|
5f62127f28 | ||
|
|
f6835c2118 | ||
|
|
3155bc48ef | ||
|
|
c1b334963b | ||
|
|
0dbdc9fe42 | ||
|
|
324435d51a | ||
|
|
1c384ca51a | ||
|
|
e196790e2c |
BIN
BGM/distortion.ogg
Normal file
BIN
BGM/far.ogg
Normal file
BIN
BGM/oxygen.ogg
Normal file
BIN
SFX/click.ogg
Normal file
BIN
SFX/enter.ogg
Normal file
BIN
SFX/error.ogg
BIN
SFX/finesseError.ogg
Normal file
BIN
SFX/virtualKey.ogg
Normal file
BIN
SFX/welcome.ogg
BIN
SFX/welcome_sfx.ogg
Normal file
BIN
VOICE/egg_1.ogg
Normal file
BIN
VOICE/egg_2.ogg
Normal file
BIN
VOICE/nya_31.ogg
BIN
VOICE/nya_happy_4.ogg
Normal file
BIN
VOICE/nya_sad_1.ogg
Normal file
BIN
VOICE/welcome_voc.ogg
Normal file
1042
callback.lua
Normal file
165
class.lua
@@ -1,165 +0,0 @@
|
||||
local gc=love.graphics
|
||||
local rem=table.remove
|
||||
local format=string.format
|
||||
Task={}
|
||||
function newTask(code,P,data)
|
||||
Task[#Task+1]={
|
||||
code=code,
|
||||
P=P,
|
||||
data=data,
|
||||
}
|
||||
end
|
||||
function clearTask(opt)
|
||||
if opt=="all"then
|
||||
local i=#Task
|
||||
while i>0 do
|
||||
Task[i]=nil
|
||||
i=i-1
|
||||
end
|
||||
elseif opt=="play"then
|
||||
for i=#Task,1,-1 do
|
||||
if Task[i].P then
|
||||
rem(Task,i)
|
||||
end
|
||||
end
|
||||
else--Player table
|
||||
for i=#Task,1,-1 do
|
||||
if Task[i].P==opt then
|
||||
rem(Task,i)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local button={type="button"}
|
||||
function newButton(x,y,w,h,color,font,code,hide,N)
|
||||
local _={
|
||||
x=x-w*.5,y=y-h*.5,
|
||||
w=w,h=h,
|
||||
color=color,
|
||||
font=font,
|
||||
code=code,
|
||||
hide=hide,
|
||||
next=N,
|
||||
}for k,v in next,button do _[k]=v end return _
|
||||
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
|
||||
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
|
||||
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 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")
|
||||
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"}
|
||||
function newSwitch(x,y,font,disp,code,hide,N)
|
||||
local _={
|
||||
x=x,y=y,font=font,
|
||||
disp=disp,
|
||||
code=code,
|
||||
hide=hide,
|
||||
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
|
||||
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
|
||||
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)
|
||||
--frame
|
||||
local t=self.text
|
||||
if t then
|
||||
gc.setColor(1,1,1)
|
||||
setFont(self.font)
|
||||
gc.printf(t,x-412,y+20-self.font*.7,400,"right")
|
||||
end
|
||||
end
|
||||
function switch:getInfo()
|
||||
print(format("x=%d,y=%d,font=%d",self.x,self.y,self.font))
|
||||
end
|
||||
|
||||
local slider={type="slider"}
|
||||
function newSlider(x,y,w,unit,font,change,disp,code,hide,N)
|
||||
local _={
|
||||
x=x,y=y,
|
||||
w=w,unit=unit,
|
||||
font=font,
|
||||
change=change,
|
||||
disp=disp,
|
||||
code=code,
|
||||
hide=hide,
|
||||
next=N,
|
||||
}for k,v in next,slider do _[k]=v end return _
|
||||
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
|
||||
end
|
||||
function slider:draw()
|
||||
local S=self==widget_sel
|
||||
gc.setColor(1,1,1,S and 1 or .5)
|
||||
gc.setLineWidth(2)
|
||||
local x1,x2=self.x,self.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)
|
||||
end
|
||||
--units
|
||||
gc.setLineWidth(5)
|
||||
gc.line(x1,self.y,x2,self.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")
|
||||
end
|
||||
end
|
||||
function slider:getInfo()
|
||||
print(format("x=%d,y=%d,w=%d",self.x,self.y,self.w))
|
||||
end
|
||||
45
conf.lua
@@ -1,36 +1,35 @@
|
||||
math.randomseed(os.time())
|
||||
gameVersion="Alpha V0.8.0"
|
||||
gameVersion="Alpha V0.8.22"
|
||||
function love.conf(t)
|
||||
t.identity="Techmino"--Save directory name
|
||||
t.identity="Techmino"--folder 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=true--search files in source before save directory
|
||||
t.accelerometerjoystick=false--accelerometer=joystick on ios/android
|
||||
t.audio.mixwithsystem=true
|
||||
|
||||
local W=t.window
|
||||
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.display=1--Monitor ID
|
||||
W.highdpi=X--Enable high-dpi mode for the window on a Retina display (boolean)
|
||||
W.fullscreen=false
|
||||
W.vsync=0--infinite fps
|
||||
W.msaa=false--num of samples to use with multi-sampled antialiasing
|
||||
W.depth=0--bits/samp of depth buffer
|
||||
W.stencil=1--bits/samp of stencil buffer
|
||||
W.display=1--monitor ID
|
||||
W.highdpi=false--high-dpi mode for the window on a Retina display
|
||||
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
|
||||
1726
dataList.lua
@@ -1,88 +0,0 @@
|
||||
setting={
|
||||
das=10,arr=2,
|
||||
sddas=0,sdarr=2,
|
||||
quickR=true,swap=true,
|
||||
fine=false,
|
||||
--game
|
||||
|
||||
ghost=true,center=true,
|
||||
smo=true,grid=false,
|
||||
dropFX=3,
|
||||
shakeFX=1,
|
||||
atkFX=3,
|
||||
frameMul=100,
|
||||
--
|
||||
fullscreen=false,
|
||||
bg=true,
|
||||
bgblock=true,
|
||||
lang=1,
|
||||
skin=1,
|
||||
--graphic
|
||||
|
||||
sfx=10,bgm=7,
|
||||
vib=3,voc=0,
|
||||
stereo=6,
|
||||
--sound
|
||||
|
||||
keyMap={
|
||||
{"left","right","x","z","c","up","down","space","tab","r"},
|
||||
{},{},{},{},{},{},{},
|
||||
--keyboard
|
||||
{"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","x","leftshoulder"},
|
||||
{},{},{},{},{},{},{},
|
||||
--joystick
|
||||
},
|
||||
VKSwitch=true,
|
||||
VKTrack=true,--If tracked
|
||||
VKDodge=false,--If repel
|
||||
VKTchW=3,--Touch Weight
|
||||
VKCurW=4,--CurPos Weight
|
||||
VKIcon=true,
|
||||
VKAlpha=3,
|
||||
--control
|
||||
}
|
||||
local L=setting.keyMap
|
||||
for i=1,#L do
|
||||
for j=1,20 do
|
||||
if not L[i][j]then
|
||||
L[i][j]=""
|
||||
end
|
||||
end
|
||||
end
|
||||
stat={
|
||||
run=0,game=0,time=0,
|
||||
extraPiece=0,extraRate=0,
|
||||
key=0,rotate=0,hold=0,piece=0,row=0,
|
||||
atk=0,send=0,recv=0,pend=0,
|
||||
clear_1=0,clear_2=0,clear_3=0,clear_4=0,
|
||||
spin_0=0,spin_1=0,spin_2=0,spin_3=0,
|
||||
b2b=0,b3b=0,pc=0,score=0,
|
||||
}
|
||||
--Things related to virtualkey
|
||||
local O,_=true,false
|
||||
VK_org={--Original set,for restore VK' position
|
||||
{ava=O,x=80, y=720-200, r=80},--moveLeft
|
||||
{ava=O,x=320, y=720-200, r=80},--moveRight
|
||||
{ava=O,x=1280-80, y=720-200, r=80},--rotRight
|
||||
{ava=O,x=1280-200, y=720-80, r=80},--rotLeft
|
||||
{ava=O,x=1280-200, y=720-320, r=80},--rotFlip
|
||||
{ava=O,x=200, y=720-320, r=80},--hardDrop
|
||||
{ava=O,x=200, y=720-80, r=80},--softDrop
|
||||
{ava=O,x=1280-320, y=720-200, r=80},--hold
|
||||
{ava=O,x=1280-80, y=280, r=80},--func
|
||||
{ava=O,x=80, y=280, r=80},--restart
|
||||
{ava=_,x=100, y=50, r=80},--insLeft
|
||||
{ava=_,x=200, y=50, r=80},--insRight
|
||||
{ava=_,x=300, y=50, r=80},--insDown
|
||||
{ava=_,x=400, y=50, r=80},--down1
|
||||
{ava=_,x=500, y=50, r=80},--down4
|
||||
{ava=_,x=600, y=50, r=80},--down10
|
||||
{ava=_,x=700, y=50, r=80},--dropLeft
|
||||
{ava=_,x=800, y=50, r=80},--dropRight
|
||||
{ava=_,x=900, y=50, r=80},--addToLeft
|
||||
{ava=_,x=1000, y=50, r=80},--addToRight
|
||||
}
|
||||
virtualkey={}
|
||||
for i=1,#VK_org do
|
||||
virtualkey[i]={}
|
||||
end
|
||||
170
document.txt
@@ -1,89 +1,115 @@
|
||||
(ENG ver. below)
|
||||
游戏方法:
|
||||
控制系统提供的一个个方块,每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话)
|
||||
完成当前游戏模式中的目标或者是活到最后即算胜利.
|
||||
系统会提供的一个个四联骨牌("方块",总共7种),玩家需要控制(左右移动和旋转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,spin再加0.5*消行数攻击,二者都+1额外抵挡
|
||||
堆楼连击:0,0,1,1,2,2,2,3,3,3,4,4,3, 之后都是2
|
||||
挖掘连击:0,0,1,1,2,2,3,3,4,4,4, 之后都是5
|
||||
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)
|
||||
半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+2,额外抵挡+2
|
||||
全消:将上述伤害之和开根号,再+6~12(本局内递增)+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变为原来40%)
|
||||
消四:+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"的格子不允许有方块,空的格子可以是任何状态,普通的七种彩色方块必须颜色对应,垃圾行方块的为止只要有方块就可以,但是不能是空气,玩家拼出自己画的图后就会判定胜利.
|
||||
|
||||
Gameplay:
|
||||
System will offer a series of tetrominoes ("Pieces". There are 7 types), and the player needs to control [them] (move left and right, rotate 90, 180 or 270 degrees), filling a row on the play field will clear it, attack will be sent depending on the type of the line clear (if there is an opponent)
|
||||
Survive till the last or complete the level's goal to win.
|
||||
|
||||
Rotation system:
|
||||
Uses Techmino's custom rotation system. Too lazy to write the details
|
||||
|
||||
Spin detection:
|
||||
Combines immobile and 3-corner detection, and whether a spin is mini also depends on the data used for detection. Also too lazy to write the details
|
||||
|
||||
Attack system:
|
||||
Regular line clears:
|
||||
Single/Double/Triple/Techrash sends 0.25/1.25/2.25/4
|
||||
Special line clears:
|
||||
Spin Single/Double/Triple sends 2/4/6, half if Mini
|
||||
B2B: +1 (Techrash/Spin Single/Spin Double) or +2 (Spin Triple)
|
||||
B2B2B/B3B: In addition to B2B, +1 if Techrash, +(0.5 * lines cleared) if Spin, and in both cases +1 additional blocking
|
||||
Wide Combo: 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 3, then 2 afterwards
|
||||
Dig Combo: 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, then 5 afterwards
|
||||
Special line clears will increase B2B gauge, making later special line clears have B2B or B2B2B bonus (see below)
|
||||
Half Perfect Clear (a Perfect Clear "with blocks left below". If it's an I clearing 1 line, then the remaining blocks must not be player-placed): Attack +2, Extra Blocking +2
|
||||
Perfect Clear: square root all damage above, then +6 to +12 attack (increases within a round) and +2 extra blocking. (note: if lines cleared in this round >4, then B2B gauge will be filled)
|
||||
After calculating all above, the damage value will be rounded down then sent
|
||||
|
||||
Score system:
|
||||
The more impressive you play, the more score you get
|
||||
|
||||
Attack delay:
|
||||
Attack from Doubles/Triples take effect the faster, then Techrash, Spins send rather slow attack, and high combos will send the slowest
|
||||
B2B or B2B2B, while they increase lines sent, they also increase the attack delay. Minis will greatly increase delay.
|
||||
|
||||
Countering:
|
||||
When you send attack, if there is garbage in queue, extra blocking will be used first, then attack, countering the earliest attack at a 1:1 ratio.
|
||||
Unused extra blocking will be discarded, then remaining attack will be sent to your opponent.
|
||||
|
||||
Back to Back (B2B) gauge:
|
||||
The B2B gauge ranges from 0 to 1,200. Special line clears are B2B if the gauge is >=40, B2B2B if >1,000.
|
||||
A regular line clear -250
|
||||
Spin Single/Double/Triple +50/100/180 (x40% if Mini)
|
||||
Techrash +100
|
||||
Spin without clearing lines +20, but gauge cannot exceed 1,000 with this method
|
||||
When gauge is above 1,000, a drop without clearing lines -40 (cannot drop below 1,000 with this method)
|
||||
|
||||
Battle Royale modes:
|
||||
Many players play within one game (all opponents are bots, not real players). As players get eliminated, blocks fall faster, and garbage take effect faster, as well as rise faster. KO-ing another player grants you one badge plus all badge that player has, increasing your attack power.
|
||||
Players can select one of 4 attack modes:
|
||||
1. Random: Every time you attack, 10% chance to lock onto a random player.
|
||||
2. Badges: After you attack or when your target dies, lock onto the player with the most badges.
|
||||
3. KOs: After you attack or when your target dies, lock onto the player with the highest field. (This refreshes every second)
|
||||
4. Counter: attack all players locking onto yourself. Your attack will be sent to all of them. If you are not targetted, you attack a random player (not locking).
|
||||
The last survivor wins.
|
||||
|
||||
Custom mode:
|
||||
You can freely adjust most parameters (not including special effects of other game modes), and you can also draw a field to clear or make a template to build.
|
||||
In build (puzzle) mode, you can toggle template display with Function key. Cells with a X cannot have blocks; empty cells can be in any state; regular colored cells have to be made of the corresponding block; garbage-colored cells can be any block but not air. Once you make the shape, you will win.
|
||||
|
||||
附录Appendix:
|
||||
ZXC's cool O-spin map:XY0BCgAwCAIR7v9vHtUSt8AS0xKqgpnNGyXkrmFNePf6qi3BbQPrHT2Owxe6D66NeKi86dwB
|
||||
BIN
image/BG/bg1.jpg
|
Before Width: | Height: | Size: 6.3 KiB |
BIN
image/BG/bg2.png
|
Before Width: | Height: | Size: 1.4 KiB |
BIN
image/block.png
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 140 B |
BIN
image/mess/ctrlSpeedLimit.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
image/mess/electric.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 31 KiB |
BIN
image/mess/pay1.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
image/mess/pay2.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 147 B After Width: | Height: | Size: 155 B |
BIN
image/mess/speedLimit.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
image/miya/ch.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
image/miya/f1.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
image/miya/f2.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
image/miya/f3.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
image/miya/f4.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
image/skin/ball(shaw).png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
image/skin/colored_bone(mrz).png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
image/skin/contrast(mrz).png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
image/skin/glow(mrz).png
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
BIN
image/skin/jelly(miya).png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
image/skin/normal(mrz).png
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
image/skin/plastic(mrz).png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
image/skin/pure(mrz).png
Normal file
|
After Width: | Height: | Size: 578 B |
BIN
image/skin/smooth(mrz).png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
image/skin/steel(kulumi).png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
image/skin/text_bone(mrz).png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
image/skin/white_bone(mrz).png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
350
language/chi.lua
@@ -1,350 +0,0 @@
|
||||
local BK="返回"
|
||||
local actName={
|
||||
"左移:","右移:",
|
||||
"顺时针旋转:","逆时针旋转:","180°旋转:",
|
||||
"硬降:","软降:",
|
||||
"暂存:","功能键:",
|
||||
"重新开始:",
|
||||
"左瞬移:","右瞬移:","软降到底:","软降一格:","软降四格:","软降十格:",
|
||||
"落在最左:","落在最右:","列在最左:","列在最右:",
|
||||
}
|
||||
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"},
|
||||
techrash="Techrash",
|
||||
techrashB2B="B2B Techrash",
|
||||
techrashB3B="B2B2B Techrash",
|
||||
block={"Z","S","L","J","T","O","I"},
|
||||
clear={" single"," double"," triple"},
|
||||
spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
|
||||
b2b="B2B ",b3b="B2B2B ",
|
||||
mini="Mini",
|
||||
PC="Perfect Clear",
|
||||
hold="暂存",next="下一个",
|
||||
|
||||
stage=function(n)return"关卡 "..n end,
|
||||
great="Great!",
|
||||
awesome="Awesome.",
|
||||
continue="Continue.",
|
||||
maxspeed="最高速度",
|
||||
speedup="速度加快",
|
||||
|
||||
win="胜利",
|
||||
finish="结束",
|
||||
lose="失败",
|
||||
pause="暂停",
|
||||
pauseCount="暂停统计",
|
||||
|
||||
custom="自定义游戏",
|
||||
customOption={
|
||||
drop="下落延迟:",
|
||||
lock="锁定延迟:",
|
||||
wait="放块延迟:",
|
||||
fall="消行延迟:",
|
||||
next="序列数量:",
|
||||
hold="暂存:",
|
||||
sequence="序列:",
|
||||
visible="可见性:",
|
||||
target="目标行数:",
|
||||
freshLimit="锁延刷新次数:",
|
||||
opponent="对手速度等级:",
|
||||
bg="背景:",
|
||||
bgm="背景音乐:",
|
||||
},
|
||||
customVal={
|
||||
drop={"[20G]",1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"∞"},
|
||||
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,
|
||||
next=nil,
|
||||
hold={"开","关","无限"},
|
||||
sequence={"bag7","his4","随机"},
|
||||
visible={"可见","半隐","全隐","瞬隐"},
|
||||
target={10,20,40,100,200,500,1000,"∞"},
|
||||
freshLimit={0,8,15,"∞"},
|
||||
opponent={"无电脑","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
|
||||
},
|
||||
softdropdas="软降DAS:",
|
||||
softdroparr="软降ARR:",
|
||||
snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
|
||||
keyboard="键盘",joystick="手柄",
|
||||
space="空格",enter="回车",
|
||||
ctrlSetHelp="方向键选择/翻页,回车修改,esc返回",
|
||||
setting_game="游戏设置",
|
||||
setting_graphic="画面设置",
|
||||
setting_sound="声音设置",
|
||||
musicRoom="音乐室",
|
||||
nowPlaying="正在播放:",
|
||||
VKTchW="触摸点权重",
|
||||
VKOrgW="原始点权重",
|
||||
VKCurW="当前点权重",
|
||||
|
||||
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","加载完成",},
|
||||
tips={
|
||||
"不是动画,真的在加载!",
|
||||
"大满贯10连击消四全清!",
|
||||
"<方块研究所>有一个Nspire-CX版本!",
|
||||
"B2B2B???",
|
||||
"B2B2B2B存在吗?",
|
||||
"MEGACMB!",
|
||||
"ALLSPIN!",
|
||||
"O spin triple!",
|
||||
"Miya:喵!",
|
||||
"225238922 哔哩哔哩 干杯~",
|
||||
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
|
||||
"合群了就会消失,但是消失不代表没有意义",
|
||||
"学会使用两个旋转键,三个更好",
|
||||
"更小的DAS和ARR拥有更高的操作上限(如果你还能控制得了的话)",
|
||||
"注意到\"旋转\"到底对方块做了些什么吗?",
|
||||
"20G本质是一套全新的游戏规则",
|
||||
"不要在上课时玩游戏!",
|
||||
"本游戏难度上限很高,做好心理准备",
|
||||
"方块可以不是个休闲游戏",
|
||||
"调到特殊的日期也不会发生什么的",
|
||||
"3.1415926535897932384",
|
||||
"2.7182818284590452353",
|
||||
"Let-The-Bass-Kick!",
|
||||
"使用love2d引擎制作",
|
||||
"有疑问?先看设置有没有你想要的",
|
||||
"有建议的话可以把信息反馈给作者~",
|
||||
"不要按F8",
|
||||
"秘密数字:626",
|
||||
"CLASSIC SEXY RUSSIAN BLOCKS",
|
||||
"戴上耳机以获得最佳体验",
|
||||
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
|
||||
"(第一次才准)今日幸运数字:"..math.random(100,626),
|
||||
},
|
||||
stat={
|
||||
"游戏运行次数:",
|
||||
"游戏局数:",
|
||||
"游戏时间:",
|
||||
"按键数:",
|
||||
"旋转数:",
|
||||
"Hold次数:",
|
||||
"方块使用数:",
|
||||
"消行数:",
|
||||
"攻击数:",
|
||||
"发送数:",
|
||||
"接收数:",
|
||||
"上涨数:",
|
||||
"消除数:",
|
||||
"Spin数:",
|
||||
"B2B数:",
|
||||
"PC数:",
|
||||
"效率:",
|
||||
"多余操作:",
|
||||
"最简操作率:",
|
||||
},
|
||||
help={
|
||||
"好像也没啥好帮助的吧?就当是关于了",
|
||||
"这只是一个方块游戏,请勿过度解读和随意联想",
|
||||
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
|
||||
"游戏还在测试阶段,请 勿 外 传",
|
||||
"",
|
||||
"使用LOVE2D引擎",
|
||||
"作者:MrZ 邮箱:1046101471@qq.com",
|
||||
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:Miya",
|
||||
"特别感谢:Farter,Flyz,196,Teatube,T830,[所有测试人员]和 你!",
|
||||
"错误或者建议请附带相关信息发送到作者邮箱~",
|
||||
},
|
||||
used=[[
|
||||
使用工具:
|
||||
Beepbox
|
||||
GFIE
|
||||
Goldwave
|
||||
使用库:
|
||||
Cold_Clear[MinusKelvin]
|
||||
simple-love-lights[dylhunn]
|
||||
]],
|
||||
support="支持作者",
|
||||
group="官方QQ群",
|
||||
warning="禁 止 私 自 传 播",
|
||||
WidgetText={
|
||||
main={
|
||||
lang="Lang",
|
||||
qplay="快速开始",
|
||||
play="开始",
|
||||
setting="设置",
|
||||
music="音乐室",
|
||||
stat="统计信息",
|
||||
help="帮助",
|
||||
quit="退出",
|
||||
},
|
||||
mode={
|
||||
up="↑",
|
||||
down="↓",
|
||||
left="←",
|
||||
right="→",
|
||||
start="开始",
|
||||
custom="自定义(C)",
|
||||
back=BK,
|
||||
},
|
||||
music={
|
||||
bgm="BGM",
|
||||
up="↑",
|
||||
play="播放",
|
||||
down="↓",
|
||||
back=BK,
|
||||
},
|
||||
custom={
|
||||
up="↑",
|
||||
down="↓",
|
||||
left="←",
|
||||
right="→",
|
||||
start1="消除开始",
|
||||
start2="拼图开始",
|
||||
draw="画图(D)",
|
||||
set1="40行(1)",
|
||||
set2="1v1(2)",
|
||||
set3="无尽(3)",
|
||||
set4="隐形(4)",
|
||||
set5="极限(5)",
|
||||
back=BK,
|
||||
},
|
||||
draw={
|
||||
any="不定",
|
||||
block1="Z",
|
||||
block2="S",
|
||||
block3="L",
|
||||
block4="J",
|
||||
block5="T",
|
||||
block6="O",
|
||||
block7="I",
|
||||
gb1="■",
|
||||
gb2="■",
|
||||
gb3="■",
|
||||
gb4="■",
|
||||
gb5="■",
|
||||
space="×",
|
||||
clear="清除",
|
||||
back=BK,
|
||||
},
|
||||
play={
|
||||
pause="暂停",
|
||||
},
|
||||
pause={
|
||||
resume= "继续",
|
||||
restart="重新开始",
|
||||
setting="设置",
|
||||
quit= "退出",
|
||||
},
|
||||
setting_game={
|
||||
graphic="←画面设置",
|
||||
sound="声音设置→",
|
||||
dasD="-",dasU="+",
|
||||
arrD="-",arrU="+",
|
||||
sddasD="-",sddasU="+",
|
||||
sdarrD="-",sdarrU="+",
|
||||
quickR="快速重新开始",
|
||||
swap="组合键切换攻击模式",
|
||||
fine="极简操作提示音",
|
||||
ctrl="键位设置",
|
||||
touch="触屏设置",
|
||||
back=BK,
|
||||
},
|
||||
setting_graphic={
|
||||
sound="←声音设置",
|
||||
game="游戏设置→",
|
||||
ghost="阴影",
|
||||
grid="网格",
|
||||
center="旋转中心",
|
||||
skin="皮肤",
|
||||
bg="背景",
|
||||
bgblock="背景动画",
|
||||
smo="平滑下落",
|
||||
dropFX="下落特效等级",
|
||||
shakeFX="晃动特效等级",
|
||||
atkFX="攻击特效等级",
|
||||
fullscreen="全屏",
|
||||
frame="绘制帧率",
|
||||
back=BK,
|
||||
},
|
||||
setting_sound={
|
||||
game="←游戏设置",
|
||||
graphic="画面设置→",
|
||||
sfx="音效",
|
||||
bgm="音乐",
|
||||
vib="震动",
|
||||
voc="语音",
|
||||
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="开关",
|
||||
back=BK,
|
||||
},
|
||||
setting_touchSwitch={
|
||||
b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4],
|
||||
b5= actName[5],b6=actName[6],b7=actName[7],b8=actName[8],
|
||||
b9= actName[9],b10=actName[10],b11=actName[11],b12=actName[12],
|
||||
b13=actName[13],b14=actName[14],b15=actName[15],b16=actName[16],
|
||||
b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20],
|
||||
norm="标准",
|
||||
pro="专业",
|
||||
back=BK,
|
||||
},
|
||||
setting_trackSetting={
|
||||
VKDodge="自动避让",
|
||||
back=BK,
|
||||
},
|
||||
help={
|
||||
his="历史",
|
||||
qq="作者QQ",
|
||||
back=BK,
|
||||
},
|
||||
history={
|
||||
prev="↑",
|
||||
next="↓",
|
||||
back=BK,
|
||||
},
|
||||
stat={
|
||||
path="打开存储目录",
|
||||
back=BK,
|
||||
},
|
||||
},
|
||||
}--文
|
||||
@@ -1,351 +0,0 @@
|
||||
local BK="返回"
|
||||
local actName={
|
||||
"左移:","右移:",
|
||||
"顺时针旋转:","逆时针旋转:","180°旋转:",
|
||||
"硬降:","软降:",
|
||||
"暂存:","功能键:",
|
||||
"重新开始:",
|
||||
"左瞬移:","右瞬移:","软降到底:","软降一格:","软降四格:","软降十格:",
|
||||
"落在最左:","落在最右:","列在最左:","列在最右:",
|
||||
}
|
||||
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"},
|
||||
techrash="四清",
|
||||
techrashB2B="满贯 四清",
|
||||
techrashB3B="大满贯 四清",
|
||||
block={"Z","S","L","J","T","O","I"},
|
||||
clear={"单清","双清","三清"},
|
||||
spin={"Z型回旋","S型回旋","L型回旋","J型回旋","T型回旋","O型回旋","I型回旋"},
|
||||
b2b="满贯",b3b="大满贯",
|
||||
mini="迷你",
|
||||
PC="场地全清",
|
||||
hold="暂存",next="下一个",
|
||||
|
||||
stage=function(n)return"关卡 "..n end,
|
||||
great="不错!",
|
||||
awesome="精彩。",
|
||||
continue="继续。",
|
||||
maxspeed="最高速度",
|
||||
speedup="速度加快",
|
||||
|
||||
win="胜利",
|
||||
finish="结束",
|
||||
lose="失败",
|
||||
pause="暂停",
|
||||
pauseCount="暂停统计",
|
||||
|
||||
custom="自定义游戏",
|
||||
customOption={
|
||||
drop="下落延迟:",
|
||||
lock="锁定延迟:",
|
||||
wait="放块延迟:",
|
||||
fall="消行延迟:",
|
||||
next="序列数量:",
|
||||
hold="暂存:",
|
||||
sequence="序列:",
|
||||
visible="可见性:",
|
||||
target="目标行数:",
|
||||
freshLimit="锁延刷新次数:",
|
||||
opponent="对手速度等级:",
|
||||
bg="背景:",
|
||||
bgm="背景音乐:",
|
||||
},
|
||||
customVal={
|
||||
drop={"[20G]",1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"∞"},
|
||||
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,
|
||||
next=nil,
|
||||
hold={"开","关","无限"},
|
||||
sequence={"bag7","his4","随机"},
|
||||
visible={"可见","半隐","全隐","瞬隐"},
|
||||
target={10,20,40,100,200,500,1000,"∞"},
|
||||
freshLimit={0,8,15,"∞"},
|
||||
opponent={"无电脑","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
|
||||
},
|
||||
softdropdas="软降DAS:",
|
||||
softdroparr="软降ARR:",
|
||||
snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
|
||||
keyboard="键盘",joystick="手柄",
|
||||
space="空格",enter="回车",
|
||||
ctrlSetHelp="方向键选择/翻页,回车修改,esc返回",
|
||||
setting_game="游戏设置",
|
||||
setting_graphic="画面设置",
|
||||
setting_sound="声音设置",
|
||||
musicRoom="音乐室",
|
||||
nowPlaying="正在播放:",
|
||||
VKTchW="触摸点权重",
|
||||
VKOrgW="原始点权重",
|
||||
VKCurW="当前点权重",
|
||||
|
||||
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","加载完成",},
|
||||
tips={
|
||||
"不是动画,真的在加载!",
|
||||
"大满贯10连击消四全清!",
|
||||
"<方块研究所>有一个Nspire-CX版本!",
|
||||
"B2B2B???",
|
||||
"B2B2B2B存在吗?",
|
||||
"MEGACMB!",
|
||||
"ALLSPIN!",
|
||||
"O型回旋三清!",
|
||||
"Miya:喵!",
|
||||
"225238922 哔哩哔哩 干杯~",
|
||||
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
|
||||
"合群了就会消失,但是消失不代表没有意义",
|
||||
"学会使用两个旋转键,三个更好",
|
||||
"更小的DAS和ARR拥有更高的操作上限(如果你还能控制得了的话)",
|
||||
"注意到\"旋转\"到底对方块做了些什么吗?",
|
||||
"20G本质是一套全新的游戏规则",
|
||||
"不要在上课时玩游戏!",
|
||||
"本游戏难度上限很高,做好心理准备",
|
||||
"方块可以不是个休闲游戏",
|
||||
"调到特殊的日期也不会发生什么的",
|
||||
"3.1415926535897932384",
|
||||
"2.7182818284590452353",
|
||||
"Let-The-Bass-Kick!",
|
||||
"使用love2d引擎制作",
|
||||
"有疑问?先看设置有没有你想要的",
|
||||
"有建议的话可以把信息反馈给作者~",
|
||||
"不要按F8",
|
||||
"秘密数字:626",
|
||||
"CLASSIC SEXY RUSSIAN BLOCKS",
|
||||
"戴上耳机以获得最佳体验",
|
||||
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
|
||||
"(第一次才准)今日幸运数字:"..math.random(100,626),
|
||||
},
|
||||
stat={
|
||||
"游戏运行次数:",
|
||||
"游戏局数:",
|
||||
"游戏时间:",
|
||||
"按键数:",
|
||||
"旋转数:",
|
||||
"暂存次数:",
|
||||
"方块使用:",
|
||||
"消行数:",
|
||||
"攻击行数:",
|
||||
"发送数:",
|
||||
"接收数:",
|
||||
"上涨数:",
|
||||
"消除数:",
|
||||
"旋转消行数:",
|
||||
"满贯数:",
|
||||
"全清数:",
|
||||
"效率:",
|
||||
"多余操作:",
|
||||
"最简操作率:",
|
||||
},
|
||||
help={
|
||||
"好像也没啥好帮助的吧?就当是关于了",
|
||||
"这只是一个方块游戏,请勿过度解读和随意联想",
|
||||
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
|
||||
"游戏还在测试阶段,请 勿 外 传",
|
||||
"",
|
||||
"使用LOVE2D引擎",
|
||||
"作者:MrZ 邮箱:1046101471@qq.com",
|
||||
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:Miya",
|
||||
"特别感谢:Farter,Flyz,196,Teatube,T830,[所有测试人员]和 你!",
|
||||
"错误或者建议请附带相关信息发送到作者邮箱~",
|
||||
},
|
||||
used=[[
|
||||
使用工具:
|
||||
Beepbox
|
||||
GFIE
|
||||
Goldwave
|
||||
使用库:
|
||||
Cold_Clear[MinusKelvin]
|
||||
simple-love-lights[dylhunn]
|
||||
]],
|
||||
support="支持作者",
|
||||
group="官方QQ群",
|
||||
warning="禁 止 私 自 传 播",
|
||||
WidgetText={
|
||||
main={
|
||||
lang="Lang",
|
||||
qplay="快速开始",
|
||||
play="开始",
|
||||
setting="设置",
|
||||
music="音乐室",
|
||||
stat="统计信息",
|
||||
help="帮助",
|
||||
quit="退出",
|
||||
},
|
||||
mode={
|
||||
up="↑",
|
||||
down="↓",
|
||||
left="←",
|
||||
right="→",
|
||||
start="开始",
|
||||
custom="自定义(C)",
|
||||
back=BK,
|
||||
},
|
||||
music={
|
||||
bgm="BGM",
|
||||
up="↑",
|
||||
play="播放",
|
||||
down="↓",
|
||||
back=BK,
|
||||
},
|
||||
custom={
|
||||
up="↑",
|
||||
down="↓",
|
||||
left="←",
|
||||
right="→",
|
||||
start1="消除开始",
|
||||
start2="拼图开始",
|
||||
draw="画图(D)",
|
||||
set1="40行(1)",
|
||||
set2="1v1(2)",
|
||||
set3="无尽(3)",
|
||||
set4="隐形(4)",
|
||||
set5="极限(5)",
|
||||
back=BK,
|
||||
},
|
||||
draw={
|
||||
any="不定",
|
||||
block1="Z",
|
||||
block2="S",
|
||||
block3="L",
|
||||
block4="J",
|
||||
block5="T",
|
||||
block6="O",
|
||||
block7="I",
|
||||
gb1="■",
|
||||
gb2="■",
|
||||
gb3="■",
|
||||
gb4="■",
|
||||
gb5="■",
|
||||
space="×",
|
||||
clear="清除",
|
||||
back=BK,
|
||||
},
|
||||
play={
|
||||
pause="暂停",
|
||||
},
|
||||
pause={
|
||||
resume= "继续",
|
||||
restart="重新开始",
|
||||
setting="设置",
|
||||
quit= "退出",
|
||||
},
|
||||
|
||||
setting_game={
|
||||
graphic="←画面设置",
|
||||
sound="声音设置→",
|
||||
dasD="-",dasU="+",
|
||||
arrD="-",arrU="+",
|
||||
sddasD="-",sddasU="+",
|
||||
sdarrD="-",sdarrU="+",
|
||||
quickR="快速重新开始",
|
||||
swap="组合键切换攻击模式",
|
||||
fine="极简操作提示音",
|
||||
ctrl="键位设置",
|
||||
touch="触屏设置",
|
||||
back=BK,
|
||||
},
|
||||
setting_graphic={
|
||||
sound="←声音设置",
|
||||
game="游戏设置→",
|
||||
ghost="阴影",
|
||||
grid="网格",
|
||||
center="旋转中心",
|
||||
skin="皮肤",
|
||||
bg="背景",
|
||||
bgblock="背景动画",
|
||||
smo="平滑下落",
|
||||
dropFX="下落特效等级",
|
||||
shakeFX="晃动特效等级",
|
||||
atkFX="攻击特效等级",
|
||||
fullscreen="全屏",
|
||||
frame="绘制帧率",
|
||||
back=BK,
|
||||
},
|
||||
setting_sound={
|
||||
game="←游戏设置",
|
||||
graphic="画面设置→",
|
||||
sfx="音效",
|
||||
bgm="音乐",
|
||||
vib="震动",
|
||||
voc="语音",
|
||||
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="开关",
|
||||
back=BK,
|
||||
},
|
||||
setting_touchSwitch={
|
||||
b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4],
|
||||
b5= actName[5],b6=actName[6],b7=actName[7],b8=actName[8],
|
||||
b9= actName[9],b10=actName[10],b11=actName[11],b12=actName[12],
|
||||
b13=actName[13],b14=actName[14],b15=actName[15],b16=actName[16],
|
||||
b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20],
|
||||
norm="标准",
|
||||
pro="专业",
|
||||
back=BK,
|
||||
},
|
||||
setting_trackSetting={
|
||||
VKDodge="自动避让",
|
||||
back=BK,
|
||||
},
|
||||
help={
|
||||
his="历史",
|
||||
qq="作者QQ",
|
||||
back=BK,
|
||||
},
|
||||
history={
|
||||
prev="↑",
|
||||
next="↓",
|
||||
back=BK,
|
||||
},
|
||||
stat={
|
||||
path="打开存储目录",
|
||||
back=BK,
|
||||
},
|
||||
},
|
||||
}
|
||||
349
language/eng.lua
@@ -1,349 +0,0 @@
|
||||
local BK="Back"
|
||||
local actName={
|
||||
"Move Left:","Move Right:",
|
||||
"Rotate Right:","Rotate Left:","Rotate Flip:",
|
||||
"Hard Drop:","Soft Drop:","Hold:","Function:","Restart:",
|
||||
"Instant Left:","Instant Right:","Ins Down:","Down 1:","Down 4:","Down 10:",
|
||||
"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"},
|
||||
techrash="Techrash",
|
||||
techrashB2B="B2B Techrash",
|
||||
techrashB3B="B2B2B Techrash",
|
||||
block={"Z","S","L","J","T","O","I"},
|
||||
clear={" single"," double"," triple"},
|
||||
spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
|
||||
b2b="B2B ",b3b="B2B2B ",
|
||||
mini="Mini",
|
||||
PC="Perfect Clear",
|
||||
hold="Hold",next="Next",
|
||||
|
||||
stage=function(n)return"STAGE "..n end,
|
||||
great="Great!",
|
||||
awesome="Awesome.",
|
||||
continue="Continue.",
|
||||
maxspeed="Max speed",
|
||||
speedup="Speed up",
|
||||
|
||||
win="WIN",
|
||||
finish="FINISH",
|
||||
lose="LOSE",
|
||||
pause="PAUSE",
|
||||
pauseCount="Pause Count",
|
||||
|
||||
custom="Custom Game",
|
||||
customOption={
|
||||
drop="Drop delay:",
|
||||
lock="Lock delay:",
|
||||
wait="Next piece delay:",
|
||||
fall="Clear row delay:",
|
||||
next="Next count:",
|
||||
hold="Hold:",
|
||||
sequence="Sequence:",
|
||||
visible="Visible:",
|
||||
target="Line limit:",
|
||||
freshLimit="Lock fresh limit:",
|
||||
opponent="Opponent speed:",
|
||||
bg="Background:",
|
||||
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,"∞"},
|
||||
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,
|
||||
next=nil,
|
||||
hold={"ON","OFF","FREE"},
|
||||
sequence={"bag7","his4","random"},
|
||||
visible={"normal","time","invisible","sudden"},
|
||||
target={10,20,40,100,200,500,1000,"∞"},
|
||||
freshLimit={0,8,15,"∞"},
|
||||
opponent={"No CPU","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
|
||||
},
|
||||
softdropdas="Down DAS:",
|
||||
softdroparr="Down ARR:",
|
||||
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"},
|
||||
keyboard="Keyboard",joystick="Joystick",
|
||||
space="Space",enter="Enter",
|
||||
ctrlSetHelp="Arrowkey to select/change slot,Enter to change,Esc back",
|
||||
setting_game="Game setting",
|
||||
setting_graphic="Graphic setting",
|
||||
setting_sound="Sound setting",
|
||||
musicRoom="Music Room",
|
||||
nowPlaying="Now Playing:",
|
||||
VKTchW="Touch weight",
|
||||
VKOrgW="Origion weight",
|
||||
VKCurW="CurPos weight",
|
||||
|
||||
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",},
|
||||
tips={
|
||||
"Not animation,real loading!",
|
||||
"Back to Back 10 combo Techrash PC!",
|
||||
"Techmino has a Nspire-CX edition!",
|
||||
"B2B2B???",
|
||||
"Is B2B2B2B possible?",
|
||||
"MEGACMB!",
|
||||
"ALLSPIN!",
|
||||
"O spin triple!",
|
||||
"Miya:Nya!",
|
||||
"225238922 Bilibili cheers!",
|
||||
"Playing too much = taking drugs",
|
||||
"Disappearing doesn't mean useless",
|
||||
"Try to use two rotate button,three better",
|
||||
"Small DAS&ARR can make you faster,if you can control block correctly",
|
||||
"Have you noticed what does \"rotating\" do to block?",
|
||||
"20G actually is a brand new game rule",
|
||||
"Do not play game in class!",
|
||||
"This game can be very hard,be mentally perpared",
|
||||
"This in not a casual game",
|
||||
"Nothing will happen when some special day come",
|
||||
"3.1415926535897932384",
|
||||
"2.7182818284590452353",
|
||||
"Let-The-Bass-Kick!",
|
||||
"Powered by love2d",
|
||||
"Find out what's in the setting!",
|
||||
"Any suggestions to author!",
|
||||
"DO NOT PRESS F8",
|
||||
"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:",
|
||||
"Games played:",
|
||||
"Game time:",
|
||||
"Key pressed:",
|
||||
"Rotate:",
|
||||
"Hold:",
|
||||
"Block used:",
|
||||
"Lines cleared:",
|
||||
"Attack:",
|
||||
"Sent:",
|
||||
"Receive:",
|
||||
"Pend:",
|
||||
"Clear:",
|
||||
"Spin:",
|
||||
"B2B:",
|
||||
"PC:",
|
||||
"Efficiency:",
|
||||
"Finesse error:",
|
||||
"Finesse rate:",
|
||||
},
|
||||
help={
|
||||
"I don't think you need \"help\".",
|
||||
"THIS IS ONLY A BLOCK GAME",
|
||||
"But just play like playing TOP/C2/KOS/TGM3",
|
||||
"Game is not public now,so DO NOT DISTIRBUTE",
|
||||
"",
|
||||
"Powered by LOVE2D",
|
||||
"Author:MrZ E-mail:1046101471@qq.com",
|
||||
"Program:MrZ Art:MrZ Music:MrZ SFX:MrZ VOICE:Miya",
|
||||
"Special thanks:Farter,Flyz,196,Teatube,T830,[all test staff] and YOU!",
|
||||
"Any bugs/suggestions to my E-mail.",
|
||||
},
|
||||
used=[[
|
||||
Tool used:
|
||||
Beepbox
|
||||
GFIE
|
||||
Goldwave
|
||||
Lib used:
|
||||
Cold_Clear[MinusKelvin]
|
||||
simple-love-lights[dylhunn]
|
||||
]],
|
||||
support="Support Author",
|
||||
group="Official QQ Group",
|
||||
warning="DO NOT DISTRIBUTE",
|
||||
WidgetText={
|
||||
main={
|
||||
lang="Lang",
|
||||
qplay="Qplay",
|
||||
play="Play",
|
||||
setting="Settings",
|
||||
music="Music room",
|
||||
stat="Statistics",
|
||||
help="Help",
|
||||
quit="Quit",
|
||||
},
|
||||
mode={
|
||||
up="↑",
|
||||
down="↓",
|
||||
left="←",
|
||||
right="→",
|
||||
start="Start",
|
||||
custom="Custom(C)",
|
||||
back=BK,
|
||||
},
|
||||
music={
|
||||
bgm="BGM",
|
||||
up="↑",
|
||||
play="Play",
|
||||
down="↓",
|
||||
back=BK,
|
||||
},
|
||||
custom={
|
||||
up="↑",
|
||||
down="↓",
|
||||
left="←",
|
||||
right="→",
|
||||
start1="Clear Start",
|
||||
start2="Puzzle Start",
|
||||
draw="Draw(D)",
|
||||
set1="40L(1)",
|
||||
set2="1v1(2)",
|
||||
set3="infinite(3)",
|
||||
set4="blind(4)",
|
||||
set5="master(5)",
|
||||
back=BK,
|
||||
},
|
||||
draw={
|
||||
any="ANY",
|
||||
block1="Z",
|
||||
block2="S",
|
||||
block3="L",
|
||||
block4="J",
|
||||
block5="T",
|
||||
block6="O",
|
||||
block7="I",
|
||||
gb1="■",
|
||||
gb2="■",
|
||||
gb3="■",
|
||||
gb4="■",
|
||||
gb5="■",
|
||||
space="×",
|
||||
clear="Clear",
|
||||
back=BK,
|
||||
},
|
||||
play={
|
||||
pause="Pause",
|
||||
},
|
||||
pause={
|
||||
resume="Resume",
|
||||
restart="Restart",
|
||||
setting="Setting",
|
||||
quit="Quit",
|
||||
},
|
||||
setting_game={
|
||||
graphic="←Graphic",
|
||||
sound="Sound→",
|
||||
dasD="-",dasU="+",
|
||||
arrD="-",arrU="+",
|
||||
sddasD="-",sddasU="+",
|
||||
sdarrD="-",sdarrU="+",
|
||||
quickR="Quick restart",
|
||||
swap="Combo key to change ATK mode",
|
||||
fine="Finesse error SFX",
|
||||
ctrl="Key Setting",
|
||||
touch="Touch Setting",
|
||||
back=BK,
|
||||
},
|
||||
setting_graphic={
|
||||
sound="←Sound",
|
||||
game="Game→",
|
||||
ghost="Ghost",
|
||||
grid="Grid",
|
||||
center="Center",
|
||||
skin="Skin",
|
||||
bg="Background",
|
||||
bgblock="BG animation",
|
||||
smo="Smoooth drop",
|
||||
dropFX="Drop FX level",
|
||||
shakeFX="Shake FX level",
|
||||
atkFX="ATK FX level",
|
||||
fullscreen="Fullscreen",
|
||||
frame="draw FPS",
|
||||
back=BK,
|
||||
},
|
||||
setting_sound={
|
||||
game="←Game",
|
||||
graphic="Graphic→",
|
||||
sfx="SFX",
|
||||
bgm="BGM",
|
||||
vib="VIB",
|
||||
voc="VOC",
|
||||
stereo="Stereo",
|
||||
back=BK,
|
||||
},
|
||||
setting_key={
|
||||
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",
|
||||
back=BK,
|
||||
},
|
||||
setting_touchSwitch={
|
||||
b1= actName[1],b2=actName[2],b3=actName[3],b4=actName[4],
|
||||
b5= actName[5],b6=actName[6],b7=actName[7],b8=actName[8],
|
||||
b9= actName[9],b10=actName[10],b11=actName[11],b12=actName[12],
|
||||
b13=actName[13],b14=actName[14],b15=actName[15],b16=actName[16],
|
||||
b17=actName[17],b18=actName[18],b19=actName[19],b20=actName[20],
|
||||
norm="Normal",
|
||||
pro="Professioanl",
|
||||
back=BK,
|
||||
},
|
||||
setting_trackSetting={
|
||||
VKDodge="Auto Dodge",
|
||||
back=BK,
|
||||
},
|
||||
help={
|
||||
his="History",
|
||||
qq="Author's qq",
|
||||
back=BK,
|
||||
},
|
||||
history={
|
||||
prev="↑",
|
||||
next="↓",
|
||||
back=BK,
|
||||
},
|
||||
stat={
|
||||
path="Open Data Folder",
|
||||
back=BK,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
#define PI 3.14
|
||||
extern float xresolution;
|
||||
//从1D距离map采样
|
||||
float samp(vec2 coord,float r,Image u_texture){
|
||||
return step(r,Texel(u_texture,coord).r);
|
||||
}
|
||||
vec4 effect(vec4 color,Image texture,vec2 texture_coords,vec2 screen_coords){
|
||||
//直角转极坐标,用于采样1D材质的y总是0
|
||||
vec2 norm=texture_coords.st*2.-1.;
|
||||
float r=length(norm);
|
||||
vec2 tc=vec2((atan(norm.y,norm.x)+PI)/(2.*PI),0.);
|
||||
//根据离光源距离放大模糊系数,模拟影子淡出
|
||||
float blur=(1./xresolution)*smoothstep(0.,1.,r);
|
||||
|
||||
//简易高斯模糊
|
||||
float sum=
|
||||
samp(vec2(tc.x-4.*blur,tc.y),r,texture)*.5
|
||||
+samp(vec2(tc.x-3.*blur,tc.y),r,texture)*.9
|
||||
+samp(vec2(tc.x-2.*blur,tc.y),r,texture)*.12
|
||||
+samp(vec2(tc.x-1.*blur,tc.y),r,texture)*.15
|
||||
|
||||
+samp(tc,r,texture)*.16//The center tex coord,which gives us hard shadows.
|
||||
+samp(vec2(tc.x+1.*blur,tc.y),r,texture)*.15
|
||||
+samp(vec2(tc.x+2.*blur,tc.y),r,texture)*.12
|
||||
+samp(vec2(tc.x+3.*blur,tc.y),r,texture)*.9
|
||||
+samp(vec2(tc.x+4.*blur,tc.y),r,texture)*.5;
|
||||
//sum值为亮度(0~1)
|
||||
//乘上距离得到逐渐变淡的光线
|
||||
return vec4(vec3(1.),sum*smoothstep(1.,.1,r));
|
||||
}
|
||||
593
list.lua
@@ -1,593 +0,0 @@
|
||||
local mobile=system=="Android"or system=="iOS"
|
||||
actName={
|
||||
"moveLeft","moveRight",
|
||||
"rotRight","rotLeft","rotFlip",
|
||||
"hardDrop","softDrop",
|
||||
"hold","func",
|
||||
"restart",
|
||||
"insLeft","insRight","insDown","down1","down4","down10",
|
||||
"dropLeft","dropRight","addLeft","addRight",--Super contorl system
|
||||
}
|
||||
color={
|
||||
red={1,0,0},
|
||||
green={0,1,0},
|
||||
blue={.2,.2,1},
|
||||
yellow={1,1,0},
|
||||
magenta={1,0,1},
|
||||
cyan={0,1,1},
|
||||
grey={.6,.6,.6},
|
||||
|
||||
lightRed={1,.5,.5},
|
||||
lightGreen={.5,1,.5},
|
||||
lightBlue={.6,.6,1},
|
||||
lightYellow={1,1,.5},
|
||||
lightMagenta={1,.5,1},
|
||||
lightCyan={.5,1,1},
|
||||
lightGrey={.8,.8,.8},
|
||||
|
||||
darkRed={.6,0,0},
|
||||
darkGreen={0,.6,0},
|
||||
darkBlue={0,0,.6},
|
||||
darkYellow={.6,.6,0},
|
||||
darkMagenta={.6,0,.6},
|
||||
darkCyan={0,.6,.6},
|
||||
darkGrey={.3,.3,.3},
|
||||
|
||||
white={1,1,1},
|
||||
orange={1,.6,0},
|
||||
lightOrange={1,.7,.3},
|
||||
purple={.5,0,1},
|
||||
lightPurple={.8,.4,1},
|
||||
darkPurple={.3,0,.6},
|
||||
}
|
||||
blockColor={
|
||||
color.red,
|
||||
color.green,
|
||||
color.orange,
|
||||
color.blue,
|
||||
color.magenta,
|
||||
color.yellow,
|
||||
color.cyan,
|
||||
color.darkGreen,
|
||||
color.grey,
|
||||
color.lightGrey,
|
||||
color.darkPurple,
|
||||
color.darkRed,
|
||||
color.darkGreen,
|
||||
}
|
||||
sfx={
|
||||
"welcome",
|
||||
"error","error_long",
|
||||
--Stereo sfxs(cannot set position)
|
||||
"button","swipe",
|
||||
"ready","start","win","fail","collect",
|
||||
"move","rotate","rotatekick","hold",
|
||||
"prerotate","prehold",
|
||||
"lock","drop","fall",
|
||||
"reach",
|
||||
"ren_1","ren_2","ren_3","ren_4","ren_5","ren_6","ren_7","ren_8","ren_9","ren_10","ren_11","ren_mega",
|
||||
"clear_1","clear_2","clear_3","clear_4",
|
||||
"spin_0","spin_1","spin_2","spin_3",
|
||||
"emit","blip_1","blip_2",
|
||||
"perfectclear",
|
||||
--Mono sfxs
|
||||
}
|
||||
bgm={
|
||||
"blank",
|
||||
"way",
|
||||
"race",
|
||||
"newera",
|
||||
"push",
|
||||
"reason",
|
||||
"infinite",
|
||||
"cruelty",
|
||||
"final",
|
||||
"secret7th",
|
||||
"secret8th",
|
||||
"rockblock",
|
||||
"8-bit happiness",
|
||||
"shining terminal",
|
||||
"end",
|
||||
}
|
||||
voiceBank={}
|
||||
voiceName={
|
||||
"zspin","sspin","lspin","jspin","tspin","ospin","ispin",
|
||||
"single","double","triple","techrash",
|
||||
"mini","b2b","b3b","pc",
|
||||
"win","lose",
|
||||
"bye",
|
||||
"nya","voc_nya",
|
||||
}
|
||||
voiceList={
|
||||
zspin={"zspin_1","zspin_2","zspin_3"},
|
||||
sspin={"sspin_1","sspin_2","sspin_3","sspin_4","sspin_5","sspin_6"},
|
||||
lspin={"lspin_1","lspin_2"},
|
||||
jspin={"jspin_1","jspin_2","jspin_3","jspin_4"},
|
||||
tspin={"tspin_1","tspin_2","tspin_3","tspin_4","tspin_5","tspin_6"},
|
||||
ospin={"ospin_1","ospin_2","ospin_3"},
|
||||
ispin={"ispin_1","ispin_2","ispin_3"},
|
||||
|
||||
single={"single_1","single_2","single_3","single_4","single_5","single_6","single_7"},
|
||||
double={"double_1","double_2","double_3","double_4","double_5"},
|
||||
triple={"triple_1","triple_2","triple_3","triple_4","triple_5","triple_6","triple_7"},
|
||||
techrash={"techrash_1","techrash_2","techrash_3","techrash_4"},
|
||||
|
||||
mini={"mini_1","mini_2","mini_3"},
|
||||
b2b={"b2b_1","b2b_2","b2b_3"},
|
||||
b3b={"b3b_1","b3b_2"},
|
||||
pc={"pc_1","pc_2"},
|
||||
win={"win_1","win_2","win_3","win_4","win_5","win_6","win_6","win_7"},
|
||||
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"},
|
||||
}
|
||||
|
||||
musicID={
|
||||
"blank",
|
||||
"way",
|
||||
"race",
|
||||
"newera",
|
||||
"push",
|
||||
"reason",
|
||||
"infinite",
|
||||
"secret7th",
|
||||
"secret8th",
|
||||
"shining terminal",
|
||||
"rockblock",
|
||||
"8-bit happiness",
|
||||
"cruelty",
|
||||
"final",
|
||||
"end",
|
||||
}
|
||||
customID={
|
||||
"drop","lock",
|
||||
"wait","fall",
|
||||
"next","hold",
|
||||
"sequence","visible",
|
||||
"target",
|
||||
"freshLimit",
|
||||
"opponent",
|
||||
"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},
|
||||
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},
|
||||
next={0,1,2,3,4,5,6},
|
||||
hold={true,false,true},
|
||||
sequence={"bag7","his4","rnd"},
|
||||
visible={"show","time","fast","none"},
|
||||
target={10,20,40,100,200,500,1000,1e99},
|
||||
freshLimit={0,8,15,1e99},
|
||||
opponent={0,1,2,3,4,5,11,12,13,14,15,16},
|
||||
bg={"none","game1","game2","game3","strap","rgb","glow","matrix"},
|
||||
bgm={"blank","way","race","newera","push","reason","infinite","secret7th","secret8th","rockblock"},
|
||||
}
|
||||
|
||||
RCPB={10,33,200,33,105,5,105,60}
|
||||
snapLevelValue={1,10,20,40,60,80}
|
||||
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
|
||||
local skinName={
|
||||
"Normal(MrZ)",
|
||||
"Jelly(Miya)",
|
||||
"Plastic(MrZ)",
|
||||
"Glow(MrZ)",
|
||||
"Pure(MrZ)",
|
||||
"Text Bone(MrZ)",
|
||||
"Colored Bone(MrZ)",
|
||||
"white Bone(MrZ)",
|
||||
}
|
||||
-- T1,T2=0,0
|
||||
Widget={
|
||||
load={},intro={},quit={},
|
||||
main={
|
||||
play= newButton(150,280,200,160,C.red, 55,function()scene.push()scene.swapTo("mode")end, nil,"setting"),
|
||||
setting=newButton(370,280,200,160,C.lightBlue, 45,function()scene.push()scene.swapTo("setting_game")end, nil,"music"),
|
||||
music= newButton(590,280,200,160,C.lightPurple,32,function()scene.push()scene.swapTo("music")end, nil,"help"),
|
||||
help= newButton(150,460,200,160,C.yellow, 50,function()scene.push()scene.swapTo("help")end, nil,"stat"),
|
||||
stat= newButton(370,460,200,160,C.cyan, 43,function()scene.push()scene.swapTo("stat")end, nil,"qplay"),
|
||||
qplay= newButton(540,415,100,70,C.lightGreen, 23,function()scene.push()loadGame(modeSel,levelSel)end, nil,"lang"),
|
||||
lang= newButton(590,505,200,70,C.lightRed, 45,function()
|
||||
setting.lang=setting.lang%#langName+1
|
||||
swapLanguage(setting.lang)
|
||||
TEXT(text.lang,795,500,50,"appear",1.6)
|
||||
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, 55,function()VOICE("bye")scene.swapTo("quit","slowFade")end,nil,"play"),
|
||||
},
|
||||
mode={
|
||||
up= newButton(1000, 210,200,140,C.white, 75,pressKey("up"), function()return modeSel==1 end),
|
||||
down= newButton(1000, 430,200,140,C.white, 75,pressKey("down"), function()return modeSel==#modeID end),
|
||||
left= newButton(190, 160,100,80, C.white, 35,pressKey("left"), function()return levelSel==1 end),
|
||||
right= newButton(350, 160,100,80, C.white, 35,pressKey("right"), function()return levelSel==#modes[modeID[modeSel]].level end),
|
||||
start= newButton(1000, 600,250,100,C.green, 45,function()scene.push()loadGame(modeSel,levelSel)end),
|
||||
custom= newButton(275, 420,200,90, C.yellow, 35,function()scene.push()scene.swapTo("custom")end),
|
||||
back= newButton(640, 630,230,90, C.white, 40,scene.back),
|
||||
},
|
||||
music={
|
||||
bgm= newSlider(760, 80,400,10,35,nil,SETdisp("bgm"),function(i)setting.bgm=i;BGM(bgmPlaying)end),
|
||||
up= newButton(1100, 200,120,120,C.white,55,pressKey("up")),
|
||||
play= newButton(1100, 340,120,120,C.white,35,pressKey("space"),function()return setting.bgm==0 end),
|
||||
down= newButton(1100, 480,120,120,C.white,55,pressKey("down")),
|
||||
back= newButton(640, 630,230,90, C.white,40,scene.back),
|
||||
},
|
||||
custom={
|
||||
up= newButton(1000, 220,100,100,C.white, 45,function()sel=(sel-2)%#customID+1 end),
|
||||
down= newButton(1000, 460,100,100,C.white, 45,function()sel=sel%#customID+1 end),
|
||||
left= newButton(880, 340,100,100,C.white, 45,pressKey("left")),
|
||||
right= newButton(1120, 340,100,100,C.white, 45,pressKey("right")),
|
||||
start1= newButton(880, 580,220,70, C.green, 35,function()scene.push()loadGame(0,1)end),
|
||||
start2= newButton(1120, 580,220,70, C.lightPurple, 35,function()scene.push()loadGame(0,2)end),
|
||||
draw= newButton(1000, 90, 190,85, C.cyan, 35,function()scene.push()scene.swapTo("draw")end),
|
||||
set1= newButton(640, 160,240,75, C.lightRed, 35,function()useDefaultSet(1)end),
|
||||
set2= newButton(640, 250,240,75, C.lightRed, 35,function()useDefaultSet(2)end),
|
||||
set3= newButton(640, 340,240,75, C.lightRed, 35,function()useDefaultSet(3)end),
|
||||
set4= newButton(640, 430,240,75, C.lightRed, 35,function()useDefaultSet(4)end),
|
||||
set5= newButton(640, 520,240,75, C.lightRed, 35,function()useDefaultSet(5)end),
|
||||
back= newButton(640, 630,180,60, C.white, 35,scene.back),
|
||||
},
|
||||
draw={
|
||||
block1= newButton(920, 80, 120,120,C.red, 60,setPen(1)),
|
||||
block2= newButton(1060, 80, 120,120,C.green, 60,setPen(2)),
|
||||
block3= newButton(1200, 80, 120,120,C.orange, 60,setPen(3)),
|
||||
block4= newButton(920, 220,120,120,C.blue, 60,setPen(4)),
|
||||
block5= newButton(1060, 220,120,120,C.magenta, 60,setPen(5)),
|
||||
block6= newButton(1200, 220,120,120,C.yellow, 60,setPen(6)),
|
||||
block7= newButton(920, 360,120,120,C.cyan, 60,setPen(7)),
|
||||
gb1= newButton(1060, 360,120,120,C.darkGrey, 60,setPen(9)),
|
||||
gb2= newButton(1200, 360,120,120,C.grey, 60,setPen(10)),
|
||||
gb3= newButton(920, 500,120,120,C.darkPurple, 60,setPen(11)),
|
||||
gb4= newButton(1060, 500,120,120,C.darkRed, 60,setPen(12)),
|
||||
gb5= newButton(1200, 500,120,120,C.darkGreen, 60,setPen(13)),
|
||||
clear= newButton(780, 80, 120,120,C.white, 40,pressKey("delete")),
|
||||
any= newButton(780, 220,120,120,C.lightGrey, 40,setPen(0)),
|
||||
space= newButton(780, 360,120,120,C.grey, 65,setPen(-1)),
|
||||
back= newButton(1200, 640,120,120,C.white, 35,scene.back),
|
||||
},
|
||||
play={
|
||||
pause= newButton(1235,45,80,80,C.white,25,pauseGame),
|
||||
},
|
||||
pause={
|
||||
resume= newButton(640,290,240,100,C.white,45,resumeGame),
|
||||
restart=newButton(640,445,240,100,C.white,45,function()
|
||||
clearTask("play")
|
||||
updateStat()
|
||||
resetGameData()
|
||||
scene.swapTo("play","none")
|
||||
end),
|
||||
setting=newButton(1150,80,200,100,C.yellow,40,function()
|
||||
scene.push()
|
||||
scene.swapTo("setting_sound")
|
||||
end),
|
||||
quit= newButton(640,600,240,100,C.white,45,scene.back),
|
||||
},
|
||||
setting_game={
|
||||
graphic=newButton(200,80,240,80,C.lightGreen,35,function()scene.swapTo("setting_graphic")end, nil,"sound"),
|
||||
sound= newButton(1080,80,240,80,C.lightGreen,35,function()scene.swapTo("setting_sound")end, nil,"dasD"),
|
||||
dasD= newButton(180,230,50,50,C.white,35,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,35,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,35,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,35,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,35, function()setting.sddas=(setting.sddas-1)%11 end, nil,"sddasU"),
|
||||
sddasU= newButton(400,340,50,50,C.white,35, function()setting.sddas=(setting.sddas+1)%11 end, nil,"sdarrD"),
|
||||
sdarrD= newButton(500,340,50,50,C.white,35, function()setting.sdarr=(setting.sdarr-1)%4 end, nil,"sdarrU"),
|
||||
sdarrU= newButton(720,340,50,50,C.white,35, function()setting.sdarr=(setting.sdarr+1)%4 end, nil,"quickR"),
|
||||
quickR= newSwitch(560,430,35,SETdisp("quickR"), SETrev("quickR"), nil,"swap"),
|
||||
swap= newSwitch(560,510,20,SETdisp("swap"), SETrev("swap"), nil,"fine"),
|
||||
fine= newSwitch(560,590,20,SETdisp("fine"), SETrev("fine"), nil,"ctrl"),
|
||||
ctrl= newButton(1020,230,320,80,C.white,35,function()scene.push()scene.swapTo("setting_key")end, nil,"touch"),
|
||||
touch= newButton(1020,340,320,80,C.white,35,function()scene.push()scene.swapTo("setting_touch")end,nil,"back"),
|
||||
back= newButton(1160,600,160,160,C.white,50,scene.back,nil,"graphic"),
|
||||
},
|
||||
setting_graphic={
|
||||
sound= newButton(200,80,240,80,C.lightGreen,35,function()scene.swapTo("setting_sound")end, nil,"game"),
|
||||
game= newButton(1080,80,240,80,C.lightGreen,35,function()scene.swapTo("setting_game")end, nil,"ghost"),
|
||||
ghost= newSwitch(310,180,35,SETdisp("ghost"), SETdisp("ghost"), nil,"center"),
|
||||
center= newSwitch(580,180,35,SETdisp("center"), SETdisp("center"), nil,"smo"),
|
||||
smo= newSwitch(310,260,25,SETdisp("smo"), SETdisp("smo"), nil,"grid"),
|
||||
grid= newSwitch(580,260,30,SETdisp("grid"), SETdisp("grid"), nil,"dropFX"),
|
||||
dropFX= newSlider(310,350,373,3,35,nil,SETdisp("dropFX"), SETsto("dropFX"), nil,"shakeFX"),
|
||||
shakeFX=newSlider(310,430,373,3,35,nil,SETdisp("shakeFX"), SETsto("shakeFX"), nil,"atkFX"),
|
||||
atkFX= newSlider(310,510,373,3,35,nil,SETdisp("atkFX"), SETsto("atkFX"), nil,"frame"),
|
||||
frame= newSlider(310,590,373,10,35,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,35,SETdisp("bg"),SETrev("bg"),nil,"bgblock"),
|
||||
bgblock=newSwitch(990,330,35,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(810,420,120,60,C.white,35,function()
|
||||
local _=setting.skin%8+1
|
||||
setting.skin=_
|
||||
changeBlockSkin(_)
|
||||
TEXT(skinName[_],850,475,28,"appear")
|
||||
end,nil,"back"),
|
||||
back= newButton(1160,600,160,160,C.white,50,scene.back,nil,"sound"),
|
||||
},
|
||||
setting_sound={
|
||||
game= newButton(200,80,240,80,C.lightGreen,35,function()scene.swapTo("setting_game")end, nil,"graphic"),
|
||||
graphic=newButton(1080,80,240,80,C.lightGreen,35,function()scene.swapTo("setting_graphic")end, nil,"sfx"),
|
||||
sfx= newSlider(180,250,400,10,35,function()SFX("blip_1")end, SETdisp("sfx"), SETsto("sfx"), nil,"bgm"),
|
||||
bgm= newSlider(750,250,400,10,35,function()BGM(bgmPlaying or"blank")end, SETdisp("bgm"), SETsto("bgm"), nil,"vib"),
|
||||
vib= newSlider(180,440,400,5 ,35,function()VIB(1)end, SETdisp("vib"), SETsto("vib"), nil,"voc"),
|
||||
voc= newSlider(750,440,400,10,35,function()VOICE("nya")end, SETdisp("voc"), SETsto("voc"), nil,"stereo"),
|
||||
stereo= newSlider(180,630,400,10,35,function()SFX("move",1,-1)SFX("lock",1,1)end, SETdisp("stereo"), SETsto("stereo"),nil,"back"),
|
||||
back=newButton(1160,600,160,160,C.white,50,scene.back,nil,"game"),
|
||||
},
|
||||
setting_key={
|
||||
back=newButton(1140,650,200,80,C.white,45,scene.back),
|
||||
},
|
||||
setting_touch={
|
||||
hide= newSwitch(810,140,40,SETdisp("VKSwitch"),SETrev("VKSwitch")),
|
||||
track= newSwitch(810,220,40,SETdisp("VKTrack"),SETrev("VKTrack")),
|
||||
tkset= newButton(450,220,170,80,C.white,25,function()
|
||||
scene.push()
|
||||
scene.swapTo("setting_trackSetting")
|
||||
end,function()return not setting.VKTrack end),
|
||||
default=newButton(450,320,170,80,C.white,35,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,35,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,40,function()
|
||||
setting.VKAlpha=(setting.VKAlpha+1)%11
|
||||
--Adjust virtualkey alpha
|
||||
end),
|
||||
icon= newButton(495,420,260,80,C.white,40,SETrev("VKIcon")),
|
||||
--Switch virtualkey icon
|
||||
size= newButton(785,420,260,80,C.white,40,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,40,function()
|
||||
scene.push()
|
||||
scene.swapTo("setting_touchSwitch")
|
||||
end),
|
||||
back= newButton(785,520,260,80,C.white,40,scene.back),
|
||||
},
|
||||
setting_touchSwitch={
|
||||
b1= newSwitch(300,80, 35,VKAdisp(1),VKAcode(1)),
|
||||
b2= newSwitch(300,140, 35,VKAdisp(2),VKAcode(2)),
|
||||
b3= newSwitch(300,200, 35,VKAdisp(3),VKAcode(3)),
|
||||
b4= newSwitch(300,260, 35,VKAdisp(4),VKAcode(4)),
|
||||
b5= newSwitch(300,320, 35,VKAdisp(5),VKAcode(5)),
|
||||
b6= newSwitch(300,380, 35,VKAdisp(6),VKAcode(6)),
|
||||
b7= newSwitch(300,440, 35,VKAdisp(7),VKAcode(7)),
|
||||
b8= newSwitch(300,500, 35,VKAdisp(8),VKAcode(8)),
|
||||
b9= newSwitch(300,560, 35,VKAdisp(9),VKAcode(9)),
|
||||
b10= newSwitch(300,620, 35,VKAdisp(10),VKAcode(10)),
|
||||
b11= newSwitch(760,80, 35,VKAdisp(11),VKAcode(11)),
|
||||
b12= newSwitch(760,140, 35,VKAdisp(12),VKAcode(12)),
|
||||
b13= newSwitch(760,200, 35,VKAdisp(13),VKAcode(13)),
|
||||
b14= newSwitch(760,260, 35,VKAdisp(14),VKAcode(14)),
|
||||
b15= newSwitch(760,320, 35,VKAdisp(15),VKAcode(15)),
|
||||
b16= newSwitch(760,380, 35,VKAdisp(16),VKAcode(16)),
|
||||
b17= newSwitch(760,440, 35,VKAdisp(17),VKAcode(17)),
|
||||
b18= newSwitch(760,500, 35,VKAdisp(18),VKAcode(18)),
|
||||
b19= newSwitch(760,560, 35,VKAdisp(19),VKAcode(19)),
|
||||
b20= newSwitch(760,620, 35,VKAdisp(20),VKAcode(20)),
|
||||
norm= newButton(1080,150,240,80,C.white,45,function()for i=1,20 do VK_org[i].ava=i<11 end end),
|
||||
pro= newButton(1080,300,240,80,C.white,35,function()for i=1,20 do VK_org[i].ava=true end end),
|
||||
back= newButton(1080,600,240,80,C.white,45,scene.back),
|
||||
},
|
||||
setting_trackSetting={
|
||||
VKDodge=newSwitch(400,200, 35,SETdisp("VKDodge"),SETrev("VKDodge")),
|
||||
VKTchW= newSlider(140,310,1000,10,35,nil,SETdisp("VKTchW"),function(i)setting.VKTchW=i;setting.VKCurW=math.max(setting.VKCurW,i)end),
|
||||
VKCurW= newSlider(140,370,1000,10,35,nil,SETdisp("VKCurW"),function(i)setting.VKCurW=i;setting.VKTchW=math.min(setting.VKTchW,i)end),
|
||||
back= newButton(1080,600,240,80,C.white,45,scene.back),
|
||||
},
|
||||
help={
|
||||
his= newButton(1050,520,230,60,C.white,35,function()scene.push()scene.swapTo("history")end,nil,"back"),
|
||||
qq= newButton(1050,600,230,60,C.white,35,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,35,scene.back,nil,"qq"),
|
||||
},
|
||||
history={
|
||||
prev= newButton(1155,170,180,180,C.white,65,pressKey("up"),function()return sel==1 end),
|
||||
next= newButton(1155,400,180,180,C.white,65,pressKey("down"),function()return sel==#updateLog-22 end),
|
||||
back= newButton(1155,600,180,90,C.white,35,scene.back),
|
||||
},
|
||||
stat={
|
||||
path= newButton(980,620,250,60,C.white,25,function()love.system.openURL(love.filesystem.getSaveDirectory())end,function()return mobile end,"back"),
|
||||
back= newButton(640,620,180,60,C.white,35,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
|
||||
57
modes/GM.lua
Normal file
@@ -0,0 +1,57 @@
|
||||
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.clearedRow
|
||||
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{
|
||||
color=color.lightBlue,
|
||||
env={
|
||||
noFly=true,
|
||||
minarr=1,
|
||||
_20G=true,
|
||||
drop=0,lock=15,
|
||||
wait=15,fall=6,
|
||||
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]
|
||||
P:win("finish")
|
||||
end
|
||||
end,
|
||||
bg="aura",bgm="far",
|
||||
},
|
||||
slowMark=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
players[1].modeData.event="M7"
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mText(drawableText.line,-81,300)
|
||||
mText(drawableText.techrash,-81,420)
|
||||
mText(drawableText.grade,-81,170)
|
||||
setFont(55)
|
||||
mStr(P.modeData.event,-81,110)
|
||||
setFont(75)
|
||||
mStr(P.stat.row,-81,220)
|
||||
mStr(P.stat.clear_S[4],-81,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,
|
||||
}
|
||||
64
modes/attacker_hard.lua
Normal file
@@ -0,0 +1,64 @@
|
||||
local int,rnd=math.floor,math.random
|
||||
return{
|
||||
color=color.magenta,
|
||||
env={
|
||||
drop=30,lock=60,
|
||||
fall=12,
|
||||
freshLimit=15,
|
||||
pushSpeed=2,
|
||||
task=function(P)
|
||||
if not(P.control and SCN.cur=="play")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:showTextF(text.great,0,-140,100,"appear",.6)
|
||||
P.gameEnv.pushSpeed=3
|
||||
elseif D.event==50 then
|
||||
P:showTextF(text.maxspeed,0,-140,100,"appear",.6)
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
bg="game3",bgm="push",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(55)
|
||||
mStr(P.modeData.event,-81,200)
|
||||
mStr("24",-81,320)
|
||||
mText(drawableText.wave,-81,260)
|
||||
mText(drawableText.nextWave,-81,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>=60 and 3 or
|
||||
W>=40 and 2 or
|
||||
W>=20 and 1 or
|
||||
W>=5 and 0
|
||||
end,
|
||||
}
|
||||
77
modes/attacker_ultimate.lua
Normal file
@@ -0,0 +1,77 @@
|
||||
local int,rnd=math.floor,math.random
|
||||
return{
|
||||
color=color.lightYellow,
|
||||
env={
|
||||
drop=5,lock=60,
|
||||
fall=8,
|
||||
freshLimit=15,
|
||||
task=function(P)
|
||||
if not(P.control and SCN.cur=="play")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:showTextF(text.great,0,-140,100,"appear",.6)
|
||||
P.gameEnv.pushSpeed=4
|
||||
elseif D.event==20 then
|
||||
P:showTextF(text.awesome,0,-140,100,"appear",.6)
|
||||
P.gameEnv.pushSpeed=5
|
||||
elseif D.event==30 then
|
||||
P:showTextF(text.maxspeed,0,-140,100,"appear",.6)
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
bg="game4",bgm="shining terminal",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(55)
|
||||
mStr(P.modeData.event,-81,200)
|
||||
mStr(
|
||||
P.modeData.event<10 and 22
|
||||
or P.modeData.event<20 and 25
|
||||
or 28
|
||||
,-81,320)
|
||||
mText(drawableText.wave,-81,260)
|
||||
mText(drawableText.nextWave,-81,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>=50 and 5 or
|
||||
W>=40 and 4 or
|
||||
W>=30 and 3 or
|
||||
W>=20 and 2 or
|
||||
W>=10 and 1 or
|
||||
W>=5 and 0
|
||||
end,
|
||||
}
|
||||
37
modes/bigbang.lua
Normal file
@@ -0,0 +1,37 @@
|
||||
local format=string.format
|
||||
local function getField()
|
||||
local F={}
|
||||
return F
|
||||
end
|
||||
local function newField(P)
|
||||
|
||||
end
|
||||
return{
|
||||
color=color.lightGrey,
|
||||
env={
|
||||
drop=1e99,lock=1e99,
|
||||
hold=false,
|
||||
dropPiece=function(P)P:lose()end,
|
||||
task=nil,
|
||||
bg="game1",bgm="newera",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
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,
|
||||
}
|
||||
42
modes/blind_easy.lua
Normal file
@@ -0,0 +1,42 @@
|
||||
local min=math.min
|
||||
return{
|
||||
color=color.cyan,
|
||||
env={
|
||||
drop=30,lock=45,
|
||||
visible="time",
|
||||
dropPiece=PLY.reach_winCheck,
|
||||
freshLimit=10,
|
||||
target=200,
|
||||
bg="glow",bgm="newera",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mText(drawableText.line,-81,300)
|
||||
mText(drawableText.techrash,-81,420)
|
||||
setFont(75)
|
||||
mStr(P.stat.row,-81,220)
|
||||
mStr(P.stat.clear_S[4],-81,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,
|
||||
}
|
||||
47
modes/blind_hard.lua
Normal file
@@ -0,0 +1,47 @@
|
||||
local gc=love.graphics
|
||||
local min=math.min
|
||||
return{
|
||||
color=color.magenta,
|
||||
env={
|
||||
drop=15,lock=45,
|
||||
fall=10,lock=60,
|
||||
center=false,
|
||||
visible="none",
|
||||
dropPiece=PLY.reach_winCheck,
|
||||
freshLimit=15,
|
||||
target=200,
|
||||
bg="rgb",bgm="secret7th",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mText(drawableText.line,-81,300)
|
||||
mText(drawableText.techrash,-81,420)
|
||||
setFont(75)
|
||||
mStr(P.stat.row,-81,220)
|
||||
mStr(P.stat.clear_S[4],-81,340)
|
||||
gc.setColor(1,1,1,.2)
|
||||
gc.draw(IMG.electric,-26,120,0,2.6)
|
||||
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,
|
||||
}
|
||||
48
modes/blind_lunatic.lua
Normal file
@@ -0,0 +1,48 @@
|
||||
local gc=love.graphics
|
||||
local min=math.min
|
||||
return{
|
||||
color=color.red,
|
||||
env={
|
||||
drop=10,lock=60,
|
||||
fall=5,
|
||||
center=false,ghost=false,
|
||||
dropFX=0,lockFX=0,
|
||||
visible="none",
|
||||
dropPiece=PLY.reach_winCheck,
|
||||
freshLimit=15,
|
||||
target=200,
|
||||
bg="rgb",bgm="secret8th",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mText(drawableText.line,-81,300)
|
||||
mText(drawableText.techrash,-81,420)
|
||||
setFont(75)
|
||||
mStr(P.stat.row,-81,220)
|
||||
mStr(P.stat.clear_S[4],-81,340)
|
||||
gc.setColor(1,1,1,.2)
|
||||
gc.draw(IMG.electric,-26,120,0,2.6)
|
||||
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,
|
||||
}
|
||||
46
modes/blind_normal.lua
Normal file
@@ -0,0 +1,46 @@
|
||||
local gc=love.graphics
|
||||
local min=math.min
|
||||
return{
|
||||
color=color.green,
|
||||
env={
|
||||
drop=15,lock=45,
|
||||
freshLimit=10,
|
||||
visible="fast",
|
||||
dropPiece=PLY.reach_winCheck,
|
||||
freshLimit=10,
|
||||
target=200,
|
||||
bg="glow",bgm="reason",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mText(drawableText.line,-81,300)
|
||||
mText(drawableText.techrash,-81,420)
|
||||
setFont(75)
|
||||
mStr(P.stat.row,-81,220)
|
||||
mStr(P.stat.clear_S[4],-81,340)
|
||||
gc.setColor(1,1,1,.2)
|
||||
gc.draw(IMG.electric,-26,120,0,2.6)
|
||||
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>=126 and 3 or
|
||||
L>=80 and 2 or
|
||||
L>=40 and 1 or
|
||||
L>=1 and 0
|
||||
end
|
||||
end,
|
||||
}
|
||||
43
modes/blind_ultimate.lua
Normal file
@@ -0,0 +1,43 @@
|
||||
local gc=love.graphics
|
||||
local min=math.min
|
||||
return{
|
||||
color=color.red,
|
||||
env={
|
||||
drop=30,lock=60,
|
||||
fall=5,
|
||||
block=false,
|
||||
center=false,ghost=false,
|
||||
dropFX=0,lockFX=0,
|
||||
visible="none",
|
||||
dropPiece=PLY.reach_winCheck,
|
||||
freshLimit=15,
|
||||
target=200,
|
||||
bg="rgb",bgm="secret7th",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mText(drawableText.line,-81,300)
|
||||
mText(drawableText.techrash,-81,420)
|
||||
setFont(75)
|
||||
mStr(P.stat.row,-81,220)
|
||||
mStr(P.stat.clear_S[4],-81,340)
|
||||
gc.setColor(1,1,1,.2)
|
||||
gc.draw(IMG.electric,-26,120,0,2.6)
|
||||
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,
|
||||
}
|
||||
73
modes/c4wtrain_lunatic.lua
Normal file
@@ -0,0 +1,73 @@
|
||||
local rnd,min=math.random,math.min
|
||||
local function check_c4w(P)
|
||||
for i=1,#P.clearedRow do
|
||||
P.field[#P.field+1]=freeRow.get(13)
|
||||
P.visTime[#P.visTime+1]=freeRow.get(20)
|
||||
for i=4,7 do P.field[#P.field][i]=0 end
|
||||
end
|
||||
if #P.clearedRow==0 then
|
||||
P:lose()
|
||||
else
|
||||
if P.combo>P.modeData.point then
|
||||
P.modeData.point=P.combo
|
||||
end
|
||||
if P.stat.row>=100 then
|
||||
P:win("finish")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return{
|
||||
color=color.red,
|
||||
env={
|
||||
drop=5,lock=30,
|
||||
dropPiece=check_c4w,
|
||||
freshLimit=15,ospin=false,
|
||||
bg="rgb",bgm="oxygen",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
local P=players[1]
|
||||
local F=P.field
|
||||
for i=1,24 do
|
||||
F[i]=freeRow.get(13)
|
||||
P.visTime[i]=freeRow.get(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]=13,13,13
|
||||
elseif r==2 then F[1][6],F[1][7],F[2][7]=13,13,13
|
||||
elseif r==3 then F[1][4],F[2][4],F[2][5]=13,13,13
|
||||
elseif r==4 then F[1][7],F[2][7],F[2][6]=13,13,13
|
||||
elseif r==5 then F[1][4],F[1][5],F[1][6]=13,13,13
|
||||
elseif r==6 then F[1][7],F[1][6],F[1][5]=13,13,13
|
||||
end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(45)
|
||||
mStr(P.combo,-81,310)
|
||||
mStr(P.modeData.point,-81,400)
|
||||
mText(drawableText.combo,-81,358)
|
||||
mText(drawableText.mxcmb,-81,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.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,
|
||||
}
|
||||
71
modes/c4wtrain_normal.lua
Normal file
@@ -0,0 +1,71 @@
|
||||
local rnd,min=math.random,math.min
|
||||
local function check_c4w(P)
|
||||
for i=1,#P.clearedRow do
|
||||
P.field[#P.field+1]=freeRow.get(13)
|
||||
P.visTime[#P.visTime+1]=freeRow.get(20)
|
||||
for i=4,7 do P.field[#P.field][i]=0 end
|
||||
end
|
||||
if #P.clearedRow>0 then
|
||||
if P.combo>P.modeData.point then
|
||||
P.modeData.point=P.combo
|
||||
end
|
||||
if P.stat.row>=100 then
|
||||
P:win("finish")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return{
|
||||
color=color.green,
|
||||
env={
|
||||
drop=30,lock=60,oncehold=false,
|
||||
dropPiece=check_c4w,
|
||||
freshLimit=15,ospin=false,
|
||||
bg="rgb",bgm="oxygen",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
local P=players[1]
|
||||
local F=P.field
|
||||
for i=1,24 do
|
||||
F[i]=freeRow.get(13)
|
||||
P.visTime[i]=freeRow.get(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]=13,13,13
|
||||
elseif r==2 then F[1][6],F[1][7],F[2][7]=13,13,13
|
||||
elseif r==3 then F[1][4],F[2][4],F[2][5]=13,13,13
|
||||
elseif r==4 then F[1][7],F[2][7],F[2][6]=13,13,13
|
||||
elseif r==5 then F[1][4],F[1][5],F[1][6]=13,13,13
|
||||
elseif r==6 then F[1][7],F[1][6],F[1][5]=13,13,13
|
||||
end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(45)
|
||||
mStr(P.combo,-81,310)
|
||||
mStr(P.modeData.point,-81,400)
|
||||
mText(drawableText.combo,-81,358)
|
||||
mText(drawableText.mxcmb,-81,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,
|
||||
}
|
||||
57
modes/classic_fast.lua
Normal file
@@ -0,0 +1,57 @@
|
||||
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.play("reach")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return{
|
||||
color=color.lightBlue,
|
||||
env={
|
||||
noFly=true,
|
||||
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,
|
||||
face={0,0,2,2,2,0,0},
|
||||
target=10,dropPiece=check_LVup,
|
||||
bg="rgb",bgm="rockblock",
|
||||
},
|
||||
slowMark=true,
|
||||
load=function()
|
||||
PLY.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),-81,210)
|
||||
mText(drawableText.speedLV,-81,290)
|
||||
setFont(45)
|
||||
mStr(P.stat.row,-81,320)
|
||||
mStr(P.gameEnv.target,-81,370)
|
||||
gc.rectangle("fill",-125,375,90,4)
|
||||
end,
|
||||
score=function(P)return{P.stat.score,P.stat.row}end,
|
||||
scoreDisp=function(D)return D[1].." "..D[2].." Lines"end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
return
|
||||
L>=200 and 5 or
|
||||
L>=191 and 4 or
|
||||
L>=110 and 3 or
|
||||
L>=50 and 2 or
|
||||
L>=5 and 1 or
|
||||
L>=1 and 0
|
||||
end,
|
||||
}
|
||||
66
modes/custom_clear.lua
Normal file
@@ -0,0 +1,66 @@
|
||||
local gc=love.graphics
|
||||
local int=math.floor
|
||||
return{
|
||||
color=color.white,
|
||||
env={
|
||||
dropPiece=PLY.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
|
||||
PLY.newPlayer(1,340,15)
|
||||
local L=modeEnv.opponent
|
||||
if L~=0 then
|
||||
modeEnv.target=nil
|
||||
if L<10 then
|
||||
PLY.newAIPlayer(2,965,360,.5,AITemplate("9S",2*L))
|
||||
else
|
||||
PLY.newAIPlayer(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]=freeRow.get(0)
|
||||
P.visTime[y]=freeRow.get(t)
|
||||
for x=1,10 do P.field[y][x]=preField[y][x]end
|
||||
end
|
||||
P.garbageBeneath=preField.h
|
||||
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,-81,225)
|
||||
mText(drawableText.line,-81,290)
|
||||
else
|
||||
local R=P.gameEnv.target-P.stat.row
|
||||
mStr(R>=0 and R or 0,-81,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,
|
||||
}
|
||||
73
modes/custom_puzzle.lua
Normal file
@@ -0,0 +1,73 @@
|
||||
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<12 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
|
||||
P:win("finish")
|
||||
end
|
||||
|
||||
return{
|
||||
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
|
||||
PLY.newPlayer(1,340,15)
|
||||
local L=modeEnv.opponent
|
||||
if L~=0 then
|
||||
modeEnv.target=nil
|
||||
if L<10 then
|
||||
PLY.newAIPlayer(2,965,360,.5,AITemplate("9S",2*L))
|
||||
else
|
||||
PLY.newAIPlayer(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,-81,225)
|
||||
mText(drawableText.line,-81,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,
|
||||
}
|
||||
66
modes/defender_lunatic.lua
Normal file
@@ -0,0 +1,66 @@
|
||||
local int,rnd=math.floor,math.random
|
||||
return{
|
||||
color=color.red,
|
||||
env={
|
||||
drop=5,lock=60,
|
||||
fall=6,
|
||||
next=3,
|
||||
freshLimit=15,
|
||||
pushSpeed=2,
|
||||
task=function(P)
|
||||
if not(P.control and SCN.cur=="play")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:showTextF(text.great,0,-140,100,"appear",.6)
|
||||
P.gameEnv.pushSpeed=3
|
||||
P.dropDelay,P.gameEnv.drop=4,4
|
||||
elseif D.event==50 then
|
||||
P:showTextF(text.awesome,0,-140,100,"appear",.6)
|
||||
P.gameEnv.pushSpeed=4
|
||||
P.dropDelay,P.gameEnv.drop=3,3
|
||||
elseif D.event==75 then
|
||||
P:showTextF(text.maxspeed,0,-140,100,"appear",.6)
|
||||
P.dropDelay,P.gameEnv.drop=2,2
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
bg="game4",bgm="shining terminal",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(55)
|
||||
mStr(P.modeData.event,-81,200)
|
||||
mStr(P.modeData.point,-81,320)
|
||||
mText(drawableText.wave,-81,260)
|
||||
mText(drawableText.rpm,-81,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
|
||||
W>=5 and 0
|
||||
end,
|
||||
}
|
||||
66
modes/defender_normal.lua
Normal file
@@ -0,0 +1,66 @@
|
||||
local int,rnd=math.floor,math.random
|
||||
return{
|
||||
color=color.green,
|
||||
env={
|
||||
drop=30,lock=60,
|
||||
fall=10,
|
||||
next=3,
|
||||
freshLimit=15,
|
||||
pushSpeed=1,
|
||||
task=function(P)
|
||||
if not(P.control and SCN.cur=="play")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:showTextF(text.great,0,-140,100,"appear",.6)
|
||||
P.gameEnv.pushSpeed=2
|
||||
P.dropDelay,P.gameEnv.drop=20,20
|
||||
elseif D.event==50 then
|
||||
P:showTextF(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:showTextF(text.maxspeed,0,-140,100,"appear",.6)
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
bg="game3",bgm="way",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(55)
|
||||
mStr(P.modeData.event,-81,200)
|
||||
mStr(P.modeData.point,-81,320)
|
||||
mText(drawableText.wave,-81,260)
|
||||
mText(drawableText.rpm,-81,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
|
||||
W>=3 and 0
|
||||
end,
|
||||
}
|
||||
43
modes/dig_hard.lua
Normal file
@@ -0,0 +1,43 @@
|
||||
local max,rnd=math.max,math.random
|
||||
return{
|
||||
color=color.magenta,
|
||||
env={
|
||||
drop=60,lock=120,
|
||||
fall=20,
|
||||
freshLimit=15,
|
||||
task=function(P)
|
||||
if not(P.control and SCN.cur=="play")then return end
|
||||
local D=P.modeData
|
||||
D.counter=D.counter+1
|
||||
if D.counter>=max(90,180-D.event)then
|
||||
P:garbageRise(10,1,rnd(10))
|
||||
P.stat.recv=P.stat.recv+1
|
||||
D.counter=0
|
||||
D.event=D.event+1
|
||||
end
|
||||
end,
|
||||
bg="game2",bgm="push",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,-81,310)
|
||||
mText(drawableText.wave,-81,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
|
||||
P.stat.row>=5 and 0
|
||||
end,
|
||||
}
|
||||
42
modes/dig_ultimate.lua
Normal file
@@ -0,0 +1,42 @@
|
||||
local max,rnd=math.max,math.random
|
||||
return{
|
||||
color=color.lightYellow,
|
||||
env={
|
||||
drop=10,lock=30,
|
||||
freshLimit=15,
|
||||
task=function(P)
|
||||
if not(P.control and SCN.cur=="play")then return end
|
||||
local D=P.modeData
|
||||
D.counter=D.counter+1
|
||||
if D.counter>=max(30,80-.3*D.event)then
|
||||
P:garbageRise(11+D.event%3,1,rnd(10))
|
||||
P.stat.recv=P.stat.recv+1
|
||||
D.counter=0
|
||||
D.event=D.event+1
|
||||
end
|
||||
end,
|
||||
bg="game2",bgm="secret7th",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,-81,310)
|
||||
mText(drawableText.wave,-81,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
|
||||
P.stat.row>=5 and 0
|
||||
end,
|
||||
}
|
||||
119
modes/drought_lunatic.lua
Normal file
@@ -0,0 +1,119 @@
|
||||
local rnd,min,rem=math.random,math.min,table.remove
|
||||
return{
|
||||
color=color.red,
|
||||
env={
|
||||
drop=20,lock=60,
|
||||
sequence=function(P)
|
||||
for i=1,3 do P:getNext(7)end
|
||||
end,
|
||||
freshMethod=function(P)
|
||||
if not P.next[1] then
|
||||
local height=freeRow.get(0)
|
||||
local max=#P.field
|
||||
for x=1,10 do
|
||||
local h=max
|
||||
while P.field[h][x]==0 and h>1 do
|
||||
h=h-1
|
||||
end
|
||||
height[x]=h
|
||||
end--get heights
|
||||
height[11]=999
|
||||
|
||||
local res={1,1,2,2,3,4}
|
||||
local d=0
|
||||
local A
|
||||
for i=1,10 do
|
||||
d=d+height[i]
|
||||
end
|
||||
if d<40 or P.stat.row>2*42 then
|
||||
A=#res+1
|
||||
for i=A,A+5 do
|
||||
res[i]=1
|
||||
res[i+6]=2
|
||||
end
|
||||
goto END
|
||||
end
|
||||
|
||||
--give I when no hole
|
||||
d=-999--height difference
|
||||
--A=hole mark
|
||||
for x=2,11 do
|
||||
local _=height[x]-height[x-1]
|
||||
if d<-2 and _>2 then
|
||||
A=true
|
||||
end
|
||||
d=_
|
||||
end
|
||||
if not A then
|
||||
A=#res+1
|
||||
res[A]=7
|
||||
res[A+1]=7
|
||||
res[A+2]=7
|
||||
end
|
||||
|
||||
--give O when no d=0/give T when no d=1
|
||||
d=0--d=0 count
|
||||
A=0--d=1 count
|
||||
for x=2,10 do
|
||||
local _=height[x]-height[x-1]
|
||||
if _==0 then
|
||||
d=d+1
|
||||
elseif _==1 or _==-1 then
|
||||
A=A+1
|
||||
end
|
||||
end
|
||||
if d<3 then
|
||||
A=#res+1
|
||||
res[A]=6
|
||||
res[A+1]=6
|
||||
res[A+2]=6
|
||||
end
|
||||
if A<3 then
|
||||
A=#res+1
|
||||
res[A]=5
|
||||
res[A+1]=5
|
||||
res[A+2]=5
|
||||
res[A+3]=5
|
||||
res[A+4]=5
|
||||
end
|
||||
|
||||
::END::
|
||||
freeRow.discard(height)
|
||||
P:getNext(res[rnd(#res)])
|
||||
end
|
||||
end,
|
||||
target=100,dropPiece=PLY.reach_winCheck,
|
||||
next=1,hold=false,
|
||||
ospin=false,
|
||||
freshLimit=15,
|
||||
bg="glow",bgm="reason",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.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,-81,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,
|
||||
}
|
||||
42
modes/drought_normal.lua
Normal file
@@ -0,0 +1,42 @@
|
||||
local min=math.min
|
||||
return{
|
||||
color=color.green,
|
||||
env={
|
||||
drop=20,lock=60,
|
||||
sequence="bag",
|
||||
bag={1,1,2,2,3,3,4,4,5,5,6,6},
|
||||
target=100,dropPiece=PLY.reach_winCheck,
|
||||
next=3,
|
||||
ospin=false,
|
||||
freshLimit=15,
|
||||
bg="glow",bgm="reason",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.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,-81,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,
|
||||
}
|
||||
32
modes/infinite.lua
Normal file
@@ -0,0 +1,32 @@
|
||||
local format=string.format
|
||||
return{
|
||||
color=color.lightGrey,
|
||||
env={
|
||||
drop=1e99,lock=1e99,
|
||||
oncehold=false,
|
||||
bg="glow",bgm="infinite",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(45)
|
||||
mStr(P.stat.atk,-81,260)
|
||||
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,370)
|
||||
mText(drawableText.atk,-81,313)
|
||||
mText(drawableText.eff,-81,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,
|
||||
}
|
||||
47
modes/infinite_dig.lua
Normal file
@@ -0,0 +1,47 @@
|
||||
local format,rnd=string.format,math.random
|
||||
local function check_rise(P)
|
||||
if #P.clearedRow==0 then
|
||||
for i=1,8-P.garbageBeneath do
|
||||
P:garbageRise(13,1,rnd(10))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return{
|
||||
color=color.white,
|
||||
env={
|
||||
drop=1e99,lock=1e99,
|
||||
oncehold=false,
|
||||
dropPiece=check_rise,
|
||||
pushSpeed=1,
|
||||
bg="glow",bgm="infinite",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
for _=1,8 do
|
||||
players[1]:garbageRise(13,1,rnd(10))
|
||||
end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(45)
|
||||
mStr(P.stat.dig,-81,190)
|
||||
mStr(P.stat.atk,-81,310)
|
||||
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
|
||||
mText(drawableText.line,-81,243)
|
||||
mText(drawableText.atk,-81,363)
|
||||
mText(drawableText.eff,-81,475)
|
||||
end,
|
||||
score=function(P)return{P.stat.dig}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.stat.dig
|
||||
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,
|
||||
}
|
||||
55
modes/marathon_hard.lua
Normal file
@@ -0,0 +1,55 @@
|
||||
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
|
||||
P:win("finish")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return{
|
||||
color=color.magenta,
|
||||
env={
|
||||
noFly=true,
|
||||
mindas=7,minarr=1,minsdarr=1,
|
||||
drop=.5,wait=8,fall=20,
|
||||
target=50,dropPiece=check,
|
||||
bg="strap",bgm="push",
|
||||
},
|
||||
pauseLimit=true,
|
||||
slowMark=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(45)
|
||||
mStr(P.stat.row,-81,320)
|
||||
mStr(P.gameEnv.target,-81,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,
|
||||
}
|
||||
55
modes/marathon_normal.lua
Normal file
@@ -0,0 +1,55 @@
|
||||
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
|
||||
P:win("finish")
|
||||
else
|
||||
P.gameEnv.drop=dropSpeed[T/10]
|
||||
P.modeData.point=T
|
||||
SFX.play("reach")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return{
|
||||
color=color.green,
|
||||
env={
|
||||
noFly=true,
|
||||
minsdarr=1,
|
||||
wait=8,fall=20,
|
||||
target=10,dropPiece=check_LVup,
|
||||
mindas=7,minarr=1,minsdarr=1,
|
||||
bg="strap",bgm="push",
|
||||
},
|
||||
pauseLimit=true,
|
||||
slowMark=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(45)
|
||||
mStr(P.stat.row,-81,320)
|
||||
mStr(P.modeData.point+10,-81,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<=226 and 5 or
|
||||
T<=262 and 4 or
|
||||
3
|
||||
else
|
||||
return
|
||||
L>=150 and 2 or
|
||||
L>=100 and 1 or
|
||||
L>=20 and 0
|
||||
end
|
||||
end,
|
||||
}
|
||||
79
modes/master_adavnce.lua
Normal file
@@ -0,0 +1,79 @@
|
||||
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.clearedRow
|
||||
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.play("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
|
||||
BG.set(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
|
||||
P:win("finish")
|
||||
else
|
||||
P:showTextF(text.stage(s),0,-120,80,"fly")
|
||||
end
|
||||
SFX.play("reach")
|
||||
end
|
||||
end
|
||||
|
||||
return{
|
||||
color=color.red,
|
||||
env={
|
||||
noFly=true,
|
||||
mindas=6,minarr=1,
|
||||
_20G=true,
|
||||
lock=death_lock[1],
|
||||
wait=death_wait[1],
|
||||
fall=death_fall[1],
|
||||
dropPiece=score,
|
||||
freshLimit=15,
|
||||
bg="game2",bgm="secret7th",
|
||||
},
|
||||
slowMark=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(45)
|
||||
mStr(P.modeData.point,-81,320)
|
||||
mStr((P.modeData.event+1)*100,-81,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 S=P.modeData.point
|
||||
if S==500 then
|
||||
local L=P.stat.clear_S[4]
|
||||
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,
|
||||
}
|
||||
83
modes/master_beginner.lua
Normal file
@@ -0,0 +1,83 @@
|
||||
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.clearedRow
|
||||
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.play("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
|
||||
BG.set(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
|
||||
P:win("finish")
|
||||
else
|
||||
P:showTextF(text.stage(s),0,-120,80,"fly")
|
||||
end
|
||||
SFX.play("reach")
|
||||
end
|
||||
end
|
||||
|
||||
return{
|
||||
color=color.red,
|
||||
env={
|
||||
noFly=true,
|
||||
das=9,arr=3,
|
||||
_20G=true,
|
||||
lock=rush_lock[1],
|
||||
wait=rush_wait[1],
|
||||
fall=rush_fall[1],
|
||||
dropPiece=score,
|
||||
freshLimit=15,
|
||||
bg="strap",bgm="secret8th",
|
||||
},
|
||||
slowMark=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(45)
|
||||
mStr(P.modeData.point,-81,320)
|
||||
mStr((P.modeData.event+1)*100,-81,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 S=P.modeData.point
|
||||
if S==500 then
|
||||
local L=P.stat.clear_S[4]
|
||||
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,
|
||||
}
|
||||
72
modes/master_final.lua
Normal file
@@ -0,0 +1,72 @@
|
||||
local gc=love.graphics
|
||||
local int=math.floor
|
||||
local function score(P)
|
||||
local c=#P.clearedRow
|
||||
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.play("blip_1")end
|
||||
if int(MD.point*.01)>MD.event then
|
||||
local s=MD.event+1;MD.event=s--level up!
|
||||
P:showTextF(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
|
||||
P:win("finish")
|
||||
end
|
||||
SFX.play("reach")
|
||||
end
|
||||
end
|
||||
|
||||
return{
|
||||
color=color.lightGrey,
|
||||
env={
|
||||
noFly=true,
|
||||
mindas=5,minarr=1,
|
||||
_20G=true,lock=12,
|
||||
wait=10,fall=10,
|
||||
dropPiece=score,
|
||||
freshLimit=15,
|
||||
easyFresh=false,bone=true,
|
||||
bg="none",bgm="distortion",
|
||||
},
|
||||
slowMark=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
setFont(45)
|
||||
local MD=P.modeData
|
||||
mStr(MD.point,-81,320)
|
||||
mStr((MD.event+1)*100,-81,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
|
||||
S>=50 and 0
|
||||
end,
|
||||
}
|
||||
38
modes/pcchallenge_hard.lua
Normal file
@@ -0,0 +1,38 @@
|
||||
local gc=love.graphics
|
||||
return{
|
||||
color=color.magenta,
|
||||
env={
|
||||
drop=60,lock=120,
|
||||
fall=10,
|
||||
target=100,dropPiece=PLY.reach_winCheck,
|
||||
freshLimit=15,
|
||||
ospin=false,
|
||||
bg="rgb",bgm="infinite",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.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,-81,250)
|
||||
|
||||
setFont(75)
|
||||
mStr(P.stat.pc,-81,350)
|
||||
mText(drawableText.pc,-81,432)
|
||||
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,
|
||||
}
|
||||