Compare commits

...

6 Commits

Author SHA1 Message Date
MrZ_26
4652be7067 0.8.14 2020-04-30 01:23:11 +08:00
MrZ_26
ed0f8031d0 0.8.13 2020-04-30 01:23:11 +08:00
MrZ_26
15df07ae3f 0.8.12 2020-04-30 01:22:06 +08:00
MrZ_26
57857ceb67 0.8.11 2020-02-22 00:47:35 +08:00
MrZ_26
527352ce15 0.8.10 2020-02-20 00:44:51 +08:00
MrZ_26
b8f57f5a1c 0.8.9 2020-02-19 17:41:23 +08:00
139 changed files with 3510 additions and 2891 deletions

BIN
BGM/distortion.ogg Normal file

Binary file not shown.

BIN
BGM/oxygen.ogg Normal file

Binary file not shown.

Binary file not shown.

22
ai.lua
View File

@@ -72,7 +72,7 @@ function CC_switch20G(P)
P.r,P.c=#P.cur.bk,#P.cur.bk[1]
P.curX,P.curY=blockPos[P.cur.id],21+ceil(P.fieldBeneath/30)-P.r+min(int(#P.field*.2),2)
P:freshNext()
P:newNext()
BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])
collectgarbage()
end
@@ -120,11 +120,12 @@ local function ifoverlapAI(f,bk,x,y)
end end
end
local function resetField(f0,f,start)
while f[start]do
removeRow(f,start)
for _=#f,start,-1 do
freeRow.discard(f[_])
f[_]=nil
end
for i=start,#f0 do
f[i]=getNewRow(0)
f[i]=freeRow.get(0)
for j=1,10 do
f[i][j]=f0[i][j]
end
@@ -133,7 +134,7 @@ end
local function getScore(field,cb,cy)
local score=0
local highest=0
local height=getNewRow(0)
local height=freeRow.get(0)
local clear=0
local hole=0
@@ -141,7 +142,7 @@ local function getScore(field,cb,cy)
for j=1,10 do
if field[i][j]==0 then goto L end
end
removeRow(field,i)
freeRow.discard(rem(field,i))
clear=clear+1
::L::
end
@@ -174,8 +175,7 @@ local function getScore(field,cb,cy)
end
sdh=sdh+min(dh^1.6,20)
end
freeRow[#freeRow+1]=height
freeRow.L=freeRow.L+1
freeRow.discard(height)
score=
-#field*30
-#cb*15
@@ -201,7 +201,7 @@ AI_think={
local Tfield={}--test field
local field_org=P.field
for i=1,#field_org do
Tfield[i]=getNewRow(0)
Tfield[i]=freeRow.get(0)
for j=1,10 do
Tfield[i][j]=field_org[i][j]
end
@@ -218,7 +218,7 @@ AI_think={
end--move to bottom
for i=1,#cb do
local y=cy+i-1
if not Tfield[y]then Tfield[y]=getNewRow(0)end
if not Tfield[y]then Tfield[y]=freeRow.get(0)end
for j=1,#cb[1]do
if cb[i][j]then
Tfield[y][cx+j-1]=1
@@ -236,7 +236,7 @@ AI_think={
::L::
if #Tfield>0 then
removeRow(Tfield,1)
freeRow.discard(rem(Tfield,1))
goto L
end--Release cache
local p=#ctrl+1

View File

@@ -1,10 +1,10 @@
gameVersion="Alpha V0.8.8"
gameVersion="Alpha V0.8.14"
function love.conf(t)
t.identity="Techmino"--Save directory name
t.identity="Techmino"--SaveDir name
t.version="11.1"
t.console=false
t.gammacorrect=false
t.appendidentity=false--Search files in source before save directory
t.appendidentity=true--Search files in source before save directory
t.accelerometerjoystick=false--ios/android加速度计=摇杆
t.audio.mixwithsystem=true
@@ -18,11 +18,11 @@ function love.conf(t)
W.fullscreentype="desktop"--"exclusive"
W.fullscreen=false
W.vsync=0--0:∞fps
W.msaa=false--The number of samples to use with multi-sampled antialiasing (number)
W.depth=0--Bits per sample in the depth buffer
W.stencil=1--Bits per sample in the stencil buffer
W.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--Enable high-dpi mode for the window on a Retina display (boolean)
W.highdpi=false--High-dpi mode for the window on a Retina display
W.x,W.y=nil
local M=t.modules

View File

@@ -6,10 +6,13 @@ setting={
quickR=true,
swap=true,
fine=false,
autoPause=true,
face={0,0,0,0,0,0,0},
--game
ghost=true,center=true,
smo=true,grid=false,
smooth=true,grid=false,
lockFX=2,
dropFX=3,
shakeFX=2,
atkFX=3,
@@ -19,7 +22,8 @@ setting={
bg=true,
bgspace=true,
lang=1,
skin=1,
skinSet=1,
skin={1,5,2,8,10,3,7},
--graphic
sfx=10,bgm=7,
@@ -27,14 +31,6 @@ setting={
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=false,--if disp
VKTrack=false,--if tracked
VKDodge=false,--if dodge
@@ -44,14 +40,6 @@ setting={
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,
@@ -60,32 +48,40 @@ stat={
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,
lastPlay=1,--last played mode ID
}
keyMap={
{"left","right","x","z","c","up","down","space","tab","r"},
{},{},{},{},{},{},{},
--keyboard
{"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","x","leftshoulder"},
{},{},{},{},{},{},{},
--joystick
}
for i=1,#keyMap do for j=1,20 do
if not keyMap[i][j]then keyMap[i][j]=""end
end end
--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
{ava=true, x=80, y=720-200, r=80},--moveLeft
{ava=true, x=320, y=720-200, r=80},--moveRight
{ava=true, x=1280-80, y=720-200, r=80},--rotRight
{ava=true, x=1280-200, y=720-80, r=80},--rotLeft
{ava=true, x=1280-200, y=720-320, r=80},--rot180
{ava=true, x=200, y=720-320, r=80},--hardDrop
{ava=true, x=200, y=720-80, r=80},--softDrop
{ava=true, x=1280-320, y=720-200, r=80},--hold
{ava=true, x=1280-80, y=280, r=80},--func
{ava=true, x=80, y=280, r=80},--restart
{ava=false, x=100, y=50, r=80},--insLeft
{ava=false, x=200, y=50, r=80},--insRight
{ava=false, x=300, y=50, r=80},--insDown
{ava=false, x=400, y=50, r=80},--down1
{ava=false, x=500, y=50, r=80},--down4
{ava=false, x=600, y=50, r=80},--down10
{ava=false, x=700, y=50, r=80},--dropLeft
{ava=false, x=800, y=50, r=80},--dropRight
{ava=false, x=900, y=50, r=80},--addToLeft
{ava=false, x=1000, y=50, r=80},--addToRight
}
virtualkey={}
for i=1,#VK_org do
virtualkey[i]={}
end
virtualkey={}for i=1,#VK_org do virtualkey[i]={}end

View File

@@ -1,14 +1,14 @@
游戏方法:
控制系统提供的一个个四联方块(左右移动和旋转90,180,270度),每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话)
系统提供的一个个四联骨牌("方块",总共7种),玩家需要控制(左右移动和旋转90,180,270度),每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话)
活到最后或者完成目标即胜利.
旋转系统:
使用Techmino专属旋转系统
细节不赘述
细节懒得写(?)
spin判定:
结合了不可移动判定和三角判定,是否为mini也与判定过程数据有关
细节不赘述
细节也懒得写(?)
攻击系统:
普通消除:
@@ -16,14 +16,14 @@ spin判定:
特殊消除:
spin1/2/3攻击2/4/6,若mini则减半
B2B:加1(techrash/spin1/spin2)或2(spin3)攻击
B3B:在B2B效果之上再+1攻击和+1额外抵挡
连击:0,0,1,1,2,2,3,3,4,4,3……
B3B:在B2B效果之上消四再加1,spin再加0.5*消行数攻击,二者都+1额外抵挡
连击:0,0,1,1,2,2,2,3,3,4,3,2…(后面都是2)
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)
PC:将上述伤害之和开根号,再+6~10(本局内递增)+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)
根据上述规则计算后,向下取整,攻击打出
分数系统:
玩得越牛逼得分越高嗷(
操作越牛逼得分越高嗷(
攻击延迟:
消2/3的攻击生效最快,消四其次,spin攻击生效较慢,高连击生效最慢

223
file.lua Normal file
View File

@@ -0,0 +1,223 @@
local fs=love.filesystem
local int,max,min=math.floor,math.max,math.min
local sub,find=string.sub,string.find
local toN,toS=tonumber,tostring
local concat=table.concat
local FILE={
data= fs.newFile("data.dat"),
setting=fs.newFile("setting.dat"),
VK= fs.newFile("virtualkey.dat"),
keyMap= fs.newFile("key.dat"),
unlock= fs.newFile("unlock.dat"),
}
local function splitS(s,sep)
local t,n={},1
repeat
local p=find(s,sep)or #s+1
t[n]=sub(s,1,p-1)
n=n+1
s=sub(s,p+#sep)
until #s==0
return t
end
local tabs={
[0]="",
"\t",
"\t\t",
"\t\t\t",
"\t\t\t\t",
"\t\t\t\t\t",
}
local function dumpTable(L,t)
local s
if t then
s="{\n"
else
s="return{\n"
t=1
end
local count=1
for k,v in next,L do
local T=type(k)
if T=="number"then
if k==count then
k="";count=count+1
else
k="["..k.."]="
end
elseif T=="string"then k=k.."="
elseif T=="boolean"then k="["..k.."]="
else error("Error key type!")
end
T=type(v)
if T=="number"then v=tostring(v)
elseif T=="string"then v="\""..v.."\""
elseif T=="table"then v=dumpTable(v,t+1)
elseif T=="boolean"then v=tostring(v)
else error("Error data type!")
end
s=s..tabs[t]..k..v..",\n"
end
return s..tabs[t-1].."}"
end
local function addToTable(G,base)--push all values to base
for k,v in next,G do
if type(v)=="table"and type(base[k])=="table"then
addToTable(v,base[k])
else
base[k]=v
end
end
end
function loadRecord(N)
local F=fs.newFile(N..".dat")
if F:open("r")then
local s=loadstring(F:read())
F:close()
if s then
setfenv(s,{})
return s()
else
return{}
end
end
end
function saveRecord(N,L)
local F=fs.newFile(N..".dat")
F:open("w")
local _,mes=F:write(dumpTable(L))
F:flush()F:close()
if not _ then
TEXT(text.recSavingError..mes,1140,650,20,"sudden",.5)
end
end
function delRecord(N)
fs.remove(N..".dat")
end
function loadUnlock()
local F=FILE.unlock
if F:open("r")then
local s=F:read()
if s:sub(1,6)~="return"then s="return{"..s.."}"end
s=loadstring(s)
F:close()
if s then
setfenv(s,{})
modeRanks=s()
end
end
end
function saveUnlock()
local F=FILE.unlock
F:open("w")
local _,mes=F:write(dumpTable(modeRanks))
F:flush()F:close()
if not _ then
TEXT(text.unlockSavingError..mes,1140,650,20,"sudden",.5)
end
end
function loadData()
local F=FILE.data
if F:open("r")then
local s=F:read()
if s:sub(1,6)~="return"then
s="return{"..s:gsub("\n",",").."}"
end
s=loadstring(s)
F:close()
if s then
setfenv(s,{})
addToTable(s(),stat)
end
end
end
function saveData()
local F=FILE.data
F:open("w")
local _,mes=F:write(dumpTable(stat))
F:flush()F:close()
if not _ then
TEXT(text.statSavingError..mes,1140,650,20,"sudden",.5)
end
end
function loadSetting()
local F=FILE.setting
if F:open("r")then
local s=F:read()
if s:sub(1,6)~="return"then
s="return{"..s:gsub("\n",",").."}"
end
s=loadstring(s)
F:close()
if s then
setfenv(s,{})
addToTable(s(),setting)
end
end
end
function saveSetting()
local F=FILE.setting
F:open("w")
local _,mes=F:write(dumpTable(setting))
F:flush()F:close()
if _ then TEXT(text.settingSaved,1140,650,40,"sudden",.5)
else TEXT(text.settingSavingError..mes,1140,650,20,"sudden",.5)
end
end
function loadKeyMap()
local F=FILE.keyMap
if F:open("r")then
local s=loadstring(F:read())
F:close()
if s then
setfenv(s,{})
addToTable(s(),keyMap)
end
end
end
function saveKeyMap()
local F=FILE.keyMap
F:open("w")
local _,mes=F:write(dumpTable(keyMap))
F:flush()F:close()
if _ then TEXT(text.keyMapSaved,1140,650,26,"sudden",.5)
else TEXT(text.keyMapSavingError..mes,1140,650,20,"sudden",.5)
end
end
function loadVK()
local F=FILE.VK
if F:open("r")then
local s=loadstring(F:read())
F:close()
if s then
setfenv(s,{})
addToTable(s(),VK_org)
end
end
end
function saveVK()
local F=FILE.VK
F:open("w")
local _,mes=F:write(dumpTable(VK_org))
F:flush()F:close()
if _ then TEXT(text.VKSaved,1140,650,26,"sudden",.5)
else TEXT(text.VKSavingError..mes,1140,650,20,"sudden",.5)
end
end
if fs.getInfo("unlock.dat")then loadUnlock()end
if fs.getInfo("data.dat")then loadData()end
if fs.getInfo("key.dat")then loadKeyMap()end
if fs.getInfo("virtualkey.dat")then loadVK()end
if fs.getInfo("setting.dat")then loadSetting()
elseif system=="Android"or system=="iOS" then
setting.VKSwitch=true
setting.swap=false
setting.vib=2
end

BIN
font.ttf

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 767 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1023 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 915 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

BIN
image/skin/ball(shaw).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
image/skin/glow(mrz).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

BIN
image/skin/jelly(miya).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

BIN
image/skin/normal(mrz).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

BIN
image/skin/plastic(mrz).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
image/skin/pure(mrz).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

BIN
image/skin/smooth(mrz).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -69,19 +69,28 @@ return{
softdropdas="软降DAS:",
softdroparr="软降ARR:",
snapLevelName={"无吸附","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
keyboard="键盘",joystick="手柄",
space="空格",enter="回车",
ctrlSetHelp="方向键选择/翻页,回车修改,esc返回",
setting_game="游戏设置",
setting_graphic="画面设置",
setting_sound="声音设置",
setting_control="控制设置",
setting_skin="外观设置",
preview="预览",
keyboard="键盘",joystick="手柄",
ctrlSetHelp="方向键选择/翻页,回车修改,esc返回",
musicRoom="音乐室",
nowPlaying="正在播放:",
recSavingError="纪录保存失败:",
settingSaved="设置已保存",
settingSavingError="设置保存失败:",
statSavingError="数据保存失败:",
unlockSavingError="解锁保存失败",
keyMapSaved="键位设置已保存",
keyMapSavingError="键位保存失败:",
VKSaved="虚拟按键设置已保存",
VKSavingError="虚拟按键保存失败:",
statSavingError="统计保存失败:",
unlockSavingError="解锁保存失败:",
recSavingError="纪录保存失败:",
needRestart="重新开始以生效",
copySuccess="已复制到剪切板",
dataCorrupted="数据损坏",
VKTchW="触摸点权重",
@@ -95,39 +104,21 @@ return{
actName=actName,
load={[0]="加载完成","加载语音ing","加载音乐ing","加载音效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),
pauseStat={
"时间:",
"按键/旋转/暂存:",
"使用方块:",
"消行数:",
"攻击数:",
"发送数:",
"接收数:",
"直接消除数:",
"旋转消除数:",
"满贯数:",
"全清数:",
"效率:",
"多余操作方块:",
"最简操作率:",
},
stat={
"游戏运行次数:",
@@ -135,32 +126,33 @@ return{
"游戏时间:",
"按键数:",
"旋转数:",
"Hold次数:",
"方块使用:",
"暂存数:",
"方块使用:",
"消行数:",
"攻击数:",
"发送数:",
"攻击(发送)数:",
"接收数:",
"上涨数:",
"消除数:",
"Spin数:",
"B2B数:",
"PC数:",
"直接消除数:",
"旋转消除数:",
"满贯数:",
"全清数:",
"效率:",
"多余操作:",
"最简操作率:",
},
help={
"好像也没啥好帮助的吧?就当是关于了",
"这只是一个普通的方块游戏,请勿称此游戏为某某某方块",
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
"游戏还在测试阶段,请 勿 外 传",
"TO/C2/KOS/TGM3/JS等方块获得过灵感",
"",
"使用LOVE2D引擎",
"作者:MrZ 邮箱:1046101471@qq.com",
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:Miya",
"特别感谢:Farter,Flyz,196,Teatube,T830,[所有测人员]和 你!",
"错误或者建议请附带相关信息发送到作者邮箱~",
"特别感谢:Flyz,Farter,196,Teatube,T830,[所有测人员]和 你!",
"",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过唯一内测群1057456078进行免费下载/更新",
"其他渠道获得游戏皆有被修改/植入病毒的风险,程序只申请了震动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
},
used=[[
使用工具:
@@ -173,20 +165,20 @@ return{
]],
support="支持作者",
group="官方QQ群",
warning="禁止直接传播游戏本体",
WidgetText={
main={
lang="言/A",
play="开始",
setting="设置",
music="音乐室",
stat="统计信息",
help="帮助",
qplay="快速开始",
lang="言/A",
quit="退出",
},
mode={
draw="画图(Q)",
setting="参数(E)",
custom="参数(E)",
start="开始",
back=BK,
},
@@ -211,21 +203,9 @@ return{
},
draw={
any="不定",
block1="Z",
block2="S",
block3="L",
block4="J",
block5="T",
block6="O",
block7="I",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
space="×",
clear="清除",
demo="演示模式",
demo="不显示×",
copy="复制",
paste="粘贴",
back=BK,
@@ -234,26 +214,25 @@ return{
pause="暂停",
},
pause={
resume= "继续",
restart="重新开始",
sfx="音效",
bgm="音乐",
quit= "退出",
resume= "继续(空格)",
restart="重新开始(R)",
setting="设置(S)",
quit= "退出(esc)",
},
setting_game={
graphic="←画面设置",
sound="声音设置→",
dasD="-",dasU="+",
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
ctrl="控制设置",
reTime="开局等待时间",
maxNext="最大预览数量",
autoPause="自动暂停",
layout="外观",
key="键位设置",
touch="触屏设置",
quickR="快速重新开始",
autoPause="自动暂停",
swap="组合键切换攻击模式",
fine="极简操作提示音",
ctrl="键位设置",
touch="触屏设置",
back=BK,
},
setting_graphic={
@@ -262,10 +241,10 @@ return{
ghost="阴影",
grid="网格",
center="旋转中心",
skin="皮肤",
bg="背景",
bgspace="星空背景",
smo="平滑下落",
smooth="平滑下落",
lockFX="锁定特效等级",
dropFX="下落特效等级",
shakeFX="晃动特效等级",
atkFX="攻击特效等级",
@@ -283,9 +262,28 @@ return{
stereo="立体声",
back=BK,
},
setting_control={
das="DAS",arr="ARR",
sddas="软降DAS",sdarr="软降ARR",
reset="重置",
back=BK,
},
setting_key={
back=BK,
},
setting_skin={
prev="",next="",
prev1="",next1="",spin1="R",
prev2="",next2="",spin2="R",
prev3="",next3="",spin3="R",
prev4="",next4="",spin4="R",
prev5="",next5="",spin5="R",
prev6="",next6="",spin6="R",
prev7="",next7="",spin7="R",
skinR="重置配色",
faceR="重置方向",
back=BK,
},
setting_touch={
default="默认组合",
snap=function()return text.snapLevelName[sceneTemp.snap]end,

View File

@@ -66,22 +66,29 @@ return{
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="声音设置",
setting_control="控制设置",
setting_skin="外观设置",
preview="预览",
keyboard="键盘",joystick="手柄",
ctrlSetHelp="方向键选择/翻页,回车修改,esc返回",
musicRoom="音乐室",
nowPlaying="正在播放:",
recSavingError="纪录保存失败:",
settingSaved="设置已保存",
settingSavingError="设置保存失败:",
statSavingError="数据保存失败:",
unlockSavingError="解锁保存失败",
keyMapSaved="键位设置已保存",
keyMapSavingError="键位保存失败:",
VKSaved="虚拟按键设置已保存",
VKSavingError="虚拟按键保存失败:",
statSavingError="统计保存失败:",
unlockSavingError="解锁保存失败:",
recSavingError="纪录保存失败:",
needRestart="重新开始以生效",
copySuccess="已复制到剪切板",
dataCorrupted="数据损坏",
VKTchW="触摸点权重",
@@ -95,39 +102,21 @@ return{
actName=actName,
load={[0]="加载完成","加载语音ing","加载音乐ing","加载音效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),
pauseStat={
"时间:",
"按键/旋转/暂存:",
"使用方块:",
"消行数:",
"攻击数:",
"发送数:",
"接收数:",
"直接消除数:",
"旋转消除数:",
"满贯数:",
"全清数:",
"效率:",
"多余操作方块:",
"最简操作率:",
},
stat={
"游戏运行次数:",
@@ -135,32 +124,33 @@ return{
"游戏时间:",
"按键数:",
"旋转数:",
"暂存数:",
"暂存数:",
"方块使用:",
"消行数:",
"攻击数:",
"发送数:",
"攻击(发送)数:",
"接收数:",
"上涨数:",
"消除数:",
"旋转消行数:",
"直接消除数:",
"旋转消除数:",
"满贯数:",
"全清数:",
"效率:",
"多余操作:",
"最简操作率:",
},
help={
"好像也没啥好帮助的吧?就当是关于了",
"这只是一个普通的方块游戏,请勿称此游戏为某某某方块",
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
"游戏还在测试阶段,请 勿 外 传",
"TO/C2/KOS/TGM3/JS等方块获得过灵感",
"",
"使用LOVE2D引擎",
"作者:MrZ 邮箱:1046101471@qq.com",
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:Miya",
"特别感谢:Farter,Flyz,196,Teatube,T830,[所有测人员]和 你!",
"错误或者建议请附带相关信息发送到作者邮箱~",
"特别感谢:Flyz,Farter,196,Teatube,T830,[所有测人员]和 你!",
"",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过唯一内测群1057456078进行免费下载/更新",
"其他渠道获得游戏皆有被修改/植入病毒的风险,程序只申请了震动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
},
used=[[
使用工具:
@@ -173,20 +163,20 @@ return{
]],
support="支持作者",
group="官方QQ群",
warning="禁止直接传播游戏本体",
WidgetText={
main={
lang="言/A",
play="开始",
setting="设置",
music="音乐室",
stat="统计信息",
help="帮助",
qplay="快速开始",
lang="言/A",
quit="退出",
},
mode={
draw="画图(Q)",
setting="参数(E)",
custon="参数(E)",
start="开始",
back=BK,
},
@@ -211,21 +201,9 @@ return{
},
draw={
any="不定",
block1="Z",
block2="S",
block3="L",
block4="J",
block5="T",
block6="O",
block7="I",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
space="×",
clear="清除",
demo="演示模式",
demo="不显示×",
copy="复制",
paste="粘贴",
back=BK,
@@ -234,27 +212,24 @@ return{
pause="暂停",
},
pause={
resume= "继续",
restart="重新开始",
sfx="音效",
bgm="音乐",
quit= "退出",
resume= "继续(空格)",
restart="重新开始(R)",
setting="设置(S)",
quit= "退出(esc)",
},
setting_game={
graphic="←画面设置",
sound="声音设置→",
dasD="-",dasU="+",
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
ctrl="控制设置",
reTime="开局等待时间",
maxNext="最大预览数量",
autoPause="自动暂停",
layout="外观",
key="键位设置",
touch="触屏设置",
quickR="快速重新开始",
swap="组合键切换攻击模式",
fine="极简操作提示音",
ctrl="键位设置",
touch="触屏设置",
back=BK,
},
setting_graphic={
@@ -263,10 +238,10 @@ return{
ghost="阴影",
grid="网格",
center="旋转中心",
skin="皮肤",
bg="背景",
bgspace="星空背景",
smo="平滑下落",
smooth="平滑下落",
lockFX="锁定特效等级",
dropFX="下落特效等级",
shakeFX="晃动特效等级",
atkFX="攻击特效等级",
@@ -284,9 +259,28 @@ return{
stereo="立体声",
back=BK,
},
setting_control={
das="首次移动延迟",arr="移动重复延迟",
sddas="首次软降延迟",sdarr="软降重复延迟",
reset="重置",
back=BK,
},
setting_key={
back=BK,
},
setting_skin={
prev="",next="",
prev1="",next1="",spin1="",
prev2="",next2="",spin2="",
prev3="",next3="",spin3="",
prev4="",next4="",spin4="",
prev5="",next5="",spin5="",
prev6="",next6="",spin6="",
prev7="",next7="",spin7="",
skinR="重置配色",
faceR="重置方向",
back=BK,
},
setting_touch={
default="默认组合",
snap=function()return text.snapLevelName[sceneTemp.snap]end,

View File

@@ -1,7 +1,7 @@
local BK="Back"
local actName={
"Move Left:","Move Right:",
"Rotate Right:","Rotate Left:","Rotate Flip:",
"Rotate Right:","Rotate Left:","Rotate 180°:",
"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:",
@@ -64,22 +64,29 @@ return{
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",
setting_control="Control Setting",
setting_skin="Layout Setting",
preview="Preview",
keyboard="Keyboard",joystick="Joystick",
ctrlSetHelp="Arrowkey to select/change slot,Enter to change,Esc back",
musicRoom="Music Room",
nowPlaying="Now Playing:",
recSavingError="Failed to save record:",
settingSaved="Setting saved",
settingSaved="Setting Saved",
settingSavingError="Failed to save setting:",
keyMapSaved="Key setting saved",
keyMapSavingError="Failed to save key setting:",
VKSaved="virtual key saved",
VKSavingError="Failed to save virtual key:",
statSavingError="Failed to save stat:",
unlockSavingError="Failed to save unlock:",
recSavingError="Failed to save record:",
needRestart="Effective after restart",
copySuccess="Copy Success",
dataCorrupted="Data Corrupted",
VKTchW="Touch weight",
@@ -93,40 +100,21 @@ return{
actName=actName,
load={[0]="Finished","Loading VOICE","Loading BGM","Loading SFX","Loading modes","Loading other things"},
tips={
"Not animation,real loading!",
"Back to Back 10 combo Techrash PC!",
"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),
pauseStat={
"Time:",
"Key/Rot./Hold:",
"Block used:",
"Lines:",
"Attack:",
"Send:",
"Receive:",
"Clear:",
"Spin:",
"B2B:",
"PC:",
"Efficiency:",
"Finesse err:",
"Finesse rate:",
},
stat={
"Games run:",
@@ -137,29 +125,30 @@ return{
"Hold:",
"Block used:",
"Lines cleared:",
"Attack:",
"Sent:",
"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,not T****s",
"But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,so DO NOT DISTIRBUTE",
"But just play like playing TO/C2/KOS/TGM3",
"",
"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.",
"Special thanks:Flyz,Farter,196,Teatube,T830,[all test staff] and YOU!",
"",
"Any bugs/suggestions to my E-mail.(may with screenshot)",
"Only released in test group for FREE",
"Game downloaded from other way may implanted with virous",
"Only network/vibrating permission applied",
"Author is not responsible for any loss by eddited game",
},
used=[[
Tool used:
@@ -172,20 +161,20 @@ Lib used:
]],
support="Support Author",
group="Official QQ Group",
warning="DO NOT SHARE APP",
WidgetText={
main={
lang="言/A",
play="Play",
setting="Settings",
music="Music room",
stat="Statistics",
help="Help",
qplay="qPlay",
lang="言/A",
quit="Quit",
},
mode={
draw="Draw(Q)",
setting="Setting(E)",
custom="Setting(E)",
start="Start",
back=BK,
},
@@ -209,22 +198,10 @@ Lib used:
back=BK,
},
draw={
any="ANY",
block1="Z",
block2="S",
block3="L",
block4="J",
block5="T",
block6="O",
block7="I",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
any="Erase",
space="×",
clear="Clear",
demo="Demo",
demo="Don't show ×",
copy="Copy",
paste="Paste",
back=BK,
@@ -233,26 +210,25 @@ Lib used:
pause="Pause",
},
pause={
resume="Resume",
restart="Restart",
sfx="SFX",
bgm="BGM",
quit="Quit",
resume="Resume(space)",
restart="Restart(R)",
setting="Setting(S)",
quit="Quit(esc)",
},
setting_game={
graphic="←Graphic",
sound="Sound→",
dasD="-",dasU="+",
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
ctrl="Control setting",
reTime="Delay before game",
maxNext="Max next count",
autoPause="Auto pause",
layout="Layout",
key="Key Setting",
touch="Touch Setting",
quickR="Quick restart",
autoPause="Auto pause",
swap="Combo key to change ATK mode",
fine="Finesse error SFX",
ctrl="Key Setting",
touch="Touch Setting",
back=BK,
},
setting_graphic={
@@ -261,10 +237,10 @@ Lib used:
ghost="Ghost",
grid="Grid",
center="Center",
skin="Skin",
bg="Background",
bgspace="BG space",
smo="Smoooth drop",
smooth="Smooth drop",
lockFX="Lock FX level",
dropFX="Drop FX level",
shakeFX="Shake FX level",
atkFX="ATK FX level",
@@ -277,14 +253,33 @@ Lib used:
graphic="Graphic→",
sfx="SFX",
bgm="BGM",
vib="VIB",
voc="VOC",
vib="Vibration",
voc="Vocal",
stereo="Stereo",
back=BK,
},
setting_control={
das="DAS",arr="ARR",
sddas="softdrop DAS",sdarr="softdrop ARR",
reset="Reset",
back=BK,
},
setting_key={
back=BK,
},
setting_skin={
prev="",next="",
prev1="",next1="",spin1="R",
prev2="",next2="",spin2="R",
prev3="",next3="",spin3="R",
prev4="",next4="",spin4="R",
prev5="",next5="",spin5="R",
prev6="",next6="",spin6="R",
prev7="",next7="",spin7="R",
skinR="reset Color",
faceR="reset Dir",
back=BK,
},
setting_touch={
default="Defaults",
snap=function()return text.snapLevelName[sceneTemp.snap]end,

435
main.lua
View File

@@ -10,10 +10,8 @@ local Timer=love.timer.getTime
local int,rnd,max,min=math.floor,math.random,math.max,math.min
local abs=math.abs
local rem=table.remove
package.path="?.lua"--boost
function NULL()end
--Libs
--LIBs
-------------------------------------------------------------
system=sys.getOS()
local xOy=love.math.newTransform()
@@ -28,6 +26,7 @@ scr={x=0,y=0,w=0,h=0,rad=0,k=1}--x,y,wid,hei,radius,scale K
local scr=scr
mapCam={
sel=nil,--selected mode ID
x=0,y=0,k=1,--camera pos/k
x1=0,y1=0,k1=1,--camera pos/k shown
--basic paras
@@ -39,15 +38,9 @@ mapCam={
--for auto zooming when enter/leave scene
}
curBG="none"
bgmPlaying=nil
voiceQueue={free=0}
texts={}
widget_sel=nil--selected widget object
virtualkeyDown,virtualkeyPressTime={},{}
for i=1,20 do
virtualkeyDown[i]=X
virtualkeyPressTime[i]=0
end
kb.setKeyRepeat(true)
kb.setTextInput(false)
@@ -56,14 +49,24 @@ ms.setVisible(false)
-------------------------------------------------------------
customSel={1,22,1,1,7,3,1,1,8,4,1,1,1}
preField={h=20}
for i=1,10 do preField[i]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}end
for i=11,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
freeRow={L=40}for i=1,40 do freeRow[i]={0,0,0,0,0,0,0,0,0,0}end
for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
-- blockSkin,blockSkinMini={},{}--redefined in skin.change
--Game system Vars
-------------------------------------------------------------
require("parts/list")
space=require("parts/space")local space=space
setFont=require("parts/font")
setFont=require("parts/setfont")
freeRow=require("parts/freeRow")
blocks=require("parts/mino")
VIB=require("parts/vib")
SFX=require("parts/sfx")
BGM=require("parts/bgm")
require("parts/voice")
Event_task=require("parts/task")
AITemplate=require("parts/AITemplate")
require("parts/modes")
skin=require("parts/skin")
-- require("parts/light")
-- require("parts/shader")
scene=require("scene")
@@ -71,12 +74,10 @@ require("default_data")
require("class")
require("ai")
require("toolfunc")
require("sound")
require("file")
require("text")
require("list")
require("player")
Widget=require("widgetList")
require("dataList")
require("texture")
local Tmr=require("timer")
local Pnt=require("paint")
@@ -177,6 +178,16 @@ local touchDown,touchUp,touchMove={},{},{}
local keyDown,keyUp={},{}
local gamepadDown,gamepadUp={},{}
function mouseDown.load()
sceneTemp.skip=true
end
function keyDown.load()
sceneTemp.skip=true
end
function touchDown.load()
sceneTemp.skip=true
end
function mouseDown.intro(x,y,k)
if k==2 then
VOICE("bye")
@@ -248,7 +259,7 @@ function mouseClick.mode(x,y,k)
local __=onMode(x,y)
if _~=__ then
if __ then
SFX("click")
SFX.play("click")
cam.moving=true
_=modes[__]
cam.x=_.x*cam.k+180
@@ -317,10 +328,11 @@ function keyDown.music(key)
elseif key=="up"then
sceneTemp=(sceneTemp-2)%#musicID+1
elseif key=="return"or key=="space"then
if bgmPlaying~=musicID[sceneTemp]then
BGM(musicID[sceneTemp])
if BGM.nowPlay~=musicID[sceneTemp]then
SFX.play("click")
BGM.play(musicID[sceneTemp])
else
BGM()
BGM.stop()
end
elseif key=="escape"then
scene.back()
@@ -334,14 +346,14 @@ function keyDown.custom(key)
if sel==12 then
curBG=customRange.bg[customSel[12]]
elseif sel==13 then
BGM(customRange.bgm[customSel[13]])
BGM.play(customRange.bgm[customSel[13]])
end
elseif key=="right"then
customSel[sel]=customSel[sel]%#customRange[customID[sel]]+1
if sel==12 then
curBG=customRange.bg[customSel[sel]]
elseif sel==13 then
BGM(customRange.bgm[customSel[sel]])
BGM.play(customRange.bgm[customSel[sel]])
end
elseif key=="down"then
sceneTemp=sel%#customID+1
@@ -398,23 +410,13 @@ function touchMove.draw(id,x,y,dx,dy)
end
end
local penKey={
["1"]=1,["2"]=2,["3"]=3,
q=4, w=5, e=6,
a=7, s=9, d=10,
z=11, x=12, c=13,
tab=0, backspace=0,
lshift=-1, lalt=-1,
q=1,w=2,e=3,r=4,t=5,y=6,u=7,i=8,o=9,p=10,["["]=11,
a=12,s=13,d=14,f=15,g=16,h=17,
z=0,x=-1,
}
function keyDown.draw(key)
local sx,sy,pen=sceneTemp.x,sceneTemp.y,sceneTemp.pen
if key=="delete"then
if sceneTemp.sure>15 then
for y=1,20 do for x=1,10 do preField[y][x]=0 end end
sceneTemp.sure=0
else
sceneTemp.sure=50
end
elseif key=="up"or key=="down"or key=="left"or key=="right"then
if key=="up"or key=="down"or key=="left"or key=="right"then
if not sx then sx=1 end
if not sy then sy=1 end
if key=="up"and sy<20 then sy=sy+1
@@ -425,6 +427,13 @@ function keyDown.draw(key)
if kb.isDown("space")then
preField[sy][sx]=pen
end
elseif key=="delete"then
if sceneTemp.sure>20 then
for y=1,20 do for x=1,10 do preField[y][x]=0 end end
sceneTemp.sure=0
else
sceneTemp.sure=50
end
elseif key=="space"then
if sx and sy then
preField[sy][sx]=pen
@@ -448,12 +457,14 @@ function mouseDown.setting_sound(x,y,k)
if t>1 then
VOICE((t<1.5 or t>15)and"doubt"or rnd()<.8 and"happy"or"egg")
sceneTemp.last=Timer()
if rnd()<.26 then
if rnd()<.0626 then
for i=1,#modes do
local M=modes[i]
for i=1,#M.unlock do
local m=M.unlock[i]
modeRanks[m]=modes[m].score and(modeRanks[m]and max(modeRanks[m],0)or 0)or 6
if not modeRanks[m]then
modeRanks[m]=modes[m].score and 0 or 6
end
end
end
saveUnlock()
@@ -471,45 +482,45 @@ function keyDown.setting_key(key)
if key=="escape"then
if s.kS then
s.kS=false
SFX("finesseError",.5)
SFX.play("finesseError",.5)
else
scene.back()
end
elseif s.kS then
for l=1,8 do
for y=1,20 do
if setting.keyMap[l][y]==key then
setting.keyMap[l][y]=""
if keyMap[l][y]==key then
keyMap[l][y]=""
goto L
end
end
end
::L::
setting.keyMap[s.board][s.kb]=key
SFX("reach",.5)
keyMap[s.board][s.kb]=key
SFX.play("reach",.5)
s.kS=false
elseif key=="return"then
s.kS=true
SFX("lock",.5)
SFX.play("lock",.5)
elseif key=="up"then
if s.kb>1 then
s.kb=s.kb-1
SFX("move",.5)
SFX.play("move",.5)
end
elseif key=="down"then
if s.kb<20 then
s.kb=s.kb+1
SFX("move",.5)
SFX.play("move",.5)
end
elseif key=="left"then
if s.board>1 then
s.board=s.board-1
SFX("rotate",.5)
SFX.play("rotate",.5)
end
elseif key=="right"then
if s.board<8 then
s.board=s.board+1
SFX("rotate",.5)
SFX.play("rotate",.5)
end
end
end
@@ -518,45 +529,45 @@ function gamepadDown.setting_key(key)
if key=="back"then
if s.jS then
s.jS=false
SFX("finesseError",.5)
SFX.play("finesseError",.5)
else
scene.back()
end
elseif s.jS then
for l=9,16 do
for y=1,20 do
if setting.keyMap[l][y]==key then
setting.keyMap[l][y]=""
if keyMap[l][y]==key then
keyMap[l][y]=""
goto L
end
end
end
::L::
setting.keyMap[8+s.board][s.js]=key
SFX("reach",.5)
keyMap[8+s.board][s.js]=key
SFX.play("reach",.5)
s.jS=false
elseif key=="start"then
s.jS=true
SFX("lock",.5)
SFX.play("lock",.5)
elseif key=="dpup"then
if s.js>1 then
s.js=s.js-1
SFX("move",.5)
SFX.play("move",.5)
end
elseif key=="dpdown"then
if s.js<20 then
s.js=s.js+1
SFX("move",.5)
SFX.play("move",.5)
end
elseif key=="dpleft"then
if s.board>1 then
s.board=s.board-1
SFX("rotate",.5)
SFX.play("rotate",.5)
end
elseif key=="dpright"then
if s.board<8 then
s.board=s.board+1
SFX("rotate",.5)
SFX.play("rotate",.5)
end
end
end
@@ -598,14 +609,17 @@ end
function keyDown.pause(key)
if key=="escape"then
scene.back()
elseif key=="return"or key=="space"then
elseif key=="space"then
resumeGame()
elseif key=="r"and kb.isDown("lctrl","rctrl")then
elseif key=="s"then
scene.push()
scene.swapTo("setting_sound")
elseif key=="r"then
clearTask("play")
updateStat()
resetGameData()
scene.swapTo("play","none")
end--Ctrl+R重开
end
end
function touchDown.play(id,x,y)
@@ -613,11 +627,12 @@ function touchDown.play(id,x,y)
local t=onVirtualkey(x,y)
if t then
players[1]:pressKey(t)
virtualkey[t].isDown=true
virtualkey[t].pressTime=10
if setting.VKTrack then
local B=virtualkey[t]
--按钮软碰撞(做不来hhh随便做一个,效果还行!)
if setting.VKDodge then
for i=1,#virtualkey do
if setting.VKDodge then--按钮软碰撞(做不来hhh随便做一个,效果还行!)
for i=1,#virtualkey do
local b=virtualkey[i]
local d=B.r+b.r-((B.x-b.x)^2+(B.y-b.y)^2)^.5--碰撞深度(负数=间隔距离)
if d>0 then
@@ -629,8 +644,8 @@ function touchDown.play(id,x,y)
local O=VK_org[t]
local _FW,_CW=setting.VKTchW*.1,1-setting.VKCurW*.1
local _OW=1-_FW-_CW
B.x,B.y=x*_FW+B.x*_CW+O.x*_OW,y*_FW+B.y*_CW+O.y*_OW
--按钮自动跟随:手指位置,当前位置,原始位置,权重取决于设置
B.x,B.y=x*_FW+B.x*_CW+O.x*_OW,y*_FW+B.y*_CW+O.y*_OW
end
VIB(0)
end
@@ -662,25 +677,30 @@ function touchMove.play(id,x,y,dx,dy)
end
function keyDown.play(key)
if key=="escape"then
(frame<180 and back or pauseGame)()
(frame<180 and scene.back or pauseGame)()
return
end
local m=setting.keyMap
local m=keyMap
for p=1,players.human do
for k=1,20 do
if key==m[2*p-1][k]or key==m[2*p][k]then
players[p]:pressKey(k)
if p==1 then
virtualkey[k].isDown=true
virtualkey[k].pressTime=10
end
return
end
end
end
end
function keyUp.play(key)
local m=setting.keyMap
local m=keyMap
for p=1,players.human do
for k=1,20 do
if key==m[2*p-1][k]or key==m[2*p][k]then
players[p]:releaseKey(k)
if p==1 then virtualkey[k].isDown=false end
return
end
end
@@ -688,36 +708,40 @@ function keyUp.play(key)
end
function gamepadDown.play(key)
if key=="back"then scene.back()return end
local m=setting.keyMap
local m=keyMap
for p=1,players.human do
for k=1,20 do
if key==m[2*p+7][k]or key==m[2*p+8][k]then
players[p]:pressKey(k)
if p==1 then
virtualkey[k].isDown=true
virtualkey[k].pressTime=10
end
return
end
end
end
end
function gamepadUp.play(key)
local m=setting.keyMap
local m=keyMap
for p=1,players.human do
for k=1,20 do
if key==m[2*p+7][k]or key==m[2*p+8][k]then
players[p]:releaseKey(k)
if p==1 then virtualkey[k].isDown=false end
return
end
end
end
end
function wheelMoved.history(x,y)
wheelScroll(y)
end
function keyDown.history(key)
if key=="up"then
sceneTemp[2]=max(sceneTemp[2]-10,1)
sceneTemp[2]=max(sceneTemp[2]-3,1)
elseif key=="down"then
sceneTemp[2]=min(sceneTemp[2]+10,#sceneTemp[1]-22)
sceneTemp[2]=min(sceneTemp[2]+3,#sceneTemp[1]-22)
elseif key=="escape"then
scene.back()
end
@@ -727,11 +751,11 @@ local function widgetPress(W,x,y)
if W.type=="button"then
W.code()
W:FX()
SFX("button")
SFX.play("button")
VOICE("nya")
elseif W.type=="switch"then
W.code()
SFX("move",.6)
SFX.play("move",.6)
elseif W.type=="slider"then
if not x then return end
local p,P=W.disp(),x<W.x and 0 or x>W.x+W.w and W.unit or int((x-W.x)*W.unit/W.w+.5)
@@ -799,7 +823,7 @@ local function widgetControl_gamepad(i)
end
end
end
local lastX,lastY--last clickDown pos
local lastX,lastY=0,0--last clickDown pos
function love.mousepressed(x,y,k,t,num)
if t then return end
mouseShow=true
@@ -816,8 +840,7 @@ function love.mousepressed(x,y,k,t,num)
widgetPress(widget_sel,mx,my)
end
end
lastX=mx
lastY=my
lastX,lastY=mx,my
end
function love.mousemoved(x,y,dx,dy,t)
if t then return end
@@ -828,8 +851,10 @@ function love.mousemoved(x,y,dx,dy,t)
if mouseMove[scene.cur]then
mouseMove[scene.cur](mx,my,dx,dy)
end
if ms.isDown(1)and widget_sel then
widgetDrag(widget_sel,mx,my,dx,dy)
if ms.isDown(1) then
if widget_sel then
widgetDrag(widget_sel,mx,my,dx,dy)
end
else
widget_sel=nil
for _,W in next,Widget[scene.cur]do
@@ -847,7 +872,7 @@ function love.mousereleased(x,y,k,t,num)
if mouseUp[scene.cur]then
mouseUp[scene.cur](mx,my,k)
end
if(mx-lastX)^2+(my-lastY)^2<26 and mouseClick[scene.cur]then
if lastX and(mx-lastX)^2+(my-lastY)^2<26 and mouseClick[scene.cur]then
mouseClick[scene.cur](mx,my,k)
end
end
@@ -864,9 +889,10 @@ function love.touchpressed(id,x,y)
love.touchmoved(id,x,y,0,0)
end
touchDist=nil--reset distance
lastX,lastY=xOy:inverseTransformPoint(x,y)
x,y=xOy:inverseTransformPoint(x,y)
lastX,lastY=x,y
if touchDown[scene.cur]then
touchDown[scene.cur](id,lastX,lastY)
touchDown[scene.cur](id,x,y)
end
end
function love.touchmoved(id,x,y,dx,dy)
@@ -876,18 +902,19 @@ function love.touchmoved(id,x,y,dx,dy)
touchMove[scene.cur](id,x,y,dx/scr.k,dy/scr.k)
end
if widget_sel then
widgetDrag(widget_sel,x,y,dx,dy)
if touching then
widgetDrag(widget_sel,x,y,dx,dy)
end
else
widget_sel=nil
for _,W in next,Widget[scene.cur]do
if not(W.hide and W.hide())and W:isAbove(x,y)then
widget_sel=W
return
end
end
end
if not widget_sel then
touching=nil
if not widget_sel then
touching=nil
end
end
end
function love.touchreleased(id,x,y)
@@ -913,19 +940,26 @@ function love.keypressed(i)
if i=="f8"then devMode=0
elseif i=="f9"then devMode=1
elseif i=="f10"then devMode=2
elseif i=="f11"then devMode=3
elseif devMode==2 then
if i=="k"then
for i=1,8 do
local P=players.alive[rnd(#players.alive)]
P.lastRecv=players[1]
Event.lose(P)
if P~=players[1]then
P.lastRecv=players[1]
P:lose()
end
end
--Test code here
elseif i=="q"then
local W=widget_sel
if W then W:getInfo()end
elseif i=="f3"then
error("Techmino:挂了")
elseif i=="e"then
error("Error Test")
for k,v in next,_G do
print(k,v)
end
elseif widget_sel then
local W=widget_sel
if i=="left"then W.x=W.x-10
@@ -1024,18 +1058,13 @@ function love.resize(w,h)
scr.x,scr.y=(w-h*16/9)*.5,0
end
xOy=xOy:setTransformation(w*.5,h*.5,nil,scr.k,nil,640,360)
if setting.bgspace then
space.resize(w,h)
space.new()
end
if setting.bgspace then space.new()end
end
function love.focus(f)
if system~="Android" and not f and scene.cur=="play"then pauseGame()end
if scene.cur=="play"and not f and setting.autoPause then pauseGame()end
end
function love.update(dt)
if setting.bgspace then
space.update()
end
local function love_update(dt)
if setting.bgspace then space.update()end
for i=#sysFX,1,-1 do
local S=sysFX[i]
S[2]=S[2]+1
@@ -1061,8 +1090,8 @@ function love.update(dt)
local S=scene.swap
S.time=S.time-1
if S.time==S.mid then
scene.init(S.tar,scene.cur)
scene.cur=S.tar
scene.init(S.tar)
for _,W in next,Widget[S.tar]do
W:reset()
end--重置控件
@@ -1074,8 +1103,8 @@ function love.update(dt)
scene.swapping=false
end
end
local i=Tmr[scene.cur]
if i then i(dt)end
local _=Tmr[scene.cur]
if _ then _(dt)end
for i=#Task,1,-1 do
local T=Task[i]
if T.code(T.P,T.data)then
@@ -1100,7 +1129,7 @@ function love.update(dt)
Q.s=Q[2]and 2 or 4
elseif Q.s==2 then--播放1,准备2
if Q[1]:getDuration()-Q[1]:tell()<.08 then
Q[2]=getVoice(Q[2])--Bug:no voice called Q[2](may fixed)
Q[2]=getVoice(Q[2])
Q[2]:setVolume(setting.voc*.1)
Q[2]:play()
Q.s=3
@@ -1113,90 +1142,20 @@ function love.update(dt)
Q.s=Q[2]and 2 or 4
end
elseif Q.s==4 then--最后播放
if not Q[1].isPlaying(Q[1])then--Bug:Q[1] is nil
if not Q[1].isPlaying(Q[1])then
Q[1]=nil
Q.s=0
end
end
end
--更新控件
for _,W in next,Widget[scene.cur]do
W:update()
end--更新控件
end
function love.errorhandler(msg)
local PUMP,POLL=love.event.pump,love.event.poll
love.mouse.setVisible(true)
love.audio.stop()
local err={"Error:"..msg}
local trace=debug.traceback("",2)
local c=2
for l in string.gmatch(trace,"(.-)\n")do
if c>2 then
if not string.find(l,"boot")then
err[c]=string.gsub(l,"^\t*","")
c=c+1
end
else
err[2]="Traceback"
c=3
end
end
print(table.concat(err,"\n"),1,c-2)
-- err=err:gsub("%[string \"(.-)\"%]","%1")
local CAP
local function _(_)CAP=gc.newImage(_)end
gc.captureScreenshot(_)
local T=0
return function()
PUMP()
for e,a,b in POLL()do
if e=="quit"or a=="escape"then
destroyPlayers()
return 1
elseif a=="return"or a=="start"then
destroyPlayers()
return"restart"
elseif e=="resize"then
T=2
love.resize(a,b)
end
end
T=T+1
if T==1 then
if sfx.error then
SFX("error",.8)
end
elseif T==2 then
gc.clear(.3,.5,.9)
elseif T==3 then
gc.setColor(1,1,1)
gc.push("transform")
gc.replaceTransform(xOy)
gc.draw(CAP,100,365,nil,512/CAP:getWidth(),288/CAP:getHeight())
gc.pop()
elseif T==4 then
gc.push("transform")
gc.replaceTransform(xOy)
setFont(120)
gc.print(":(",100,40)
setFont(38)
gc.printf(text.errorMsg,100,200,1280-100)
setFont(20)
gc.print(err[1],626,360)
gc.print("TRACEBACK",626,410)
for i=4,#err-2 do
gc.print(err[i],626,355+20*i)
end
gc.pop()
end
gc.present()
love.timer.sleep(.1)
end
end
local scs={1,2,1,2,1,2,1,2,1,2,1.5,1.5,.5,2.5}
local FPS=love.timer.getFPS
function love.draw()
local function love_draw()
gc.discard()--SPEED UPUPUP!
Pnt.BG[setting.bg and curBG or"grey"]()
if setting.bgspace then
@@ -1212,9 +1171,10 @@ function love.draw()
end--Draw widgets
if mouseShow then
local r=Timer()*.5
gc.setColor(1,1,1,min(1-math.abs(1-r%1*2),.3))
r=int(r)%7+1
gc.draw(miniBlock[r],mx,my,Timer()%3.1416*4,20,20,scs[2*r]-.5,#blocks[r][0]-scs[2*r-1]+.5)
local R=int(r)%7+1
local _=skin.libColor[setting.skin[R]]
gc.setColor(_[1],_[2],_[3],min(1-abs(1-r%1*2),.3))
gc.draw(miniBlock[R],mx,my,Timer()%3.1416*4,20,20,scs[2*R]-.5,#blocks[R][0]-scs[2*R-1]+.5)
gc.setColor(1,1,1,.5)gc.circle("fill",mx,my,5)
gc.setColor(1,1,1)gc.circle("fill",mx,my,3)
end--Awesome mouse!
@@ -1242,7 +1202,7 @@ function love.draw()
gc.pop()
gc.setColor(1,1,1)
if powerInfoCanvas then
gc.draw(powerInfoCanvas)
gc.draw(powerInfoCanvas,0,0,0,scr.k)
end--Power Info
if scene.swapping then
local _=scene.swap
@@ -1255,12 +1215,17 @@ function love.draw()
if devMode>0 then
gc.setColor(1,1,devMode==2 and .6 or 1)
gc.print("Cache used:"..gcinfo(),5,_-20)
gc.print("Free Row:"..#freeRow.."/"..freeRow.L,5,_-40)
gc.print("Free Row:"..freeRow.getCount(),5,_-40)
gc.print("Mouse:"..mx.." "..my,5,_-60)
gc.print("Voices:"..#voiceQueue,5,_-80)
gc.print("Tasks:"..#Task,5,_-100)
if devMode==3 then
love.timer.sleep(.5)
end
end--DEV info
end
love.draw,love.update=NULL,NULL
function love.run()
local T=love.timer
local sleep=T.sleep
@@ -1282,19 +1247,19 @@ function love.run()
end
end
T.step()
love.update(T.getDelta())
love_update(T.getDelta())
if not mini()then
readyDrawFrame=readyDrawFrame+setting.frameMul
if readyDrawFrame>=100 then
readyDrawFrame=readyDrawFrame-100
love.draw()
love_draw()
gc.present()
end
end
if Timer()-lastFrame<.058 then
sleep(.01)
end
while Timer()-lastFrame<.0158 do
while Timer()-lastFrame<.0159 do
sleep(.001)
end--try easily control 60FPS
lastFrame=Timer()
@@ -1304,38 +1269,70 @@ function love.run()
end
end
end
-------------------------------------------------------------
local F=love.filesystem
if F.getInfo("data")then
F.write("data.dat",F.read("data"))
F.remove("data")
end
if F.getInfo("userdata")then
F.write("data.dat",F.read("userdata"))
F.remove("userdata")
function love.errorhandler(msg)
local PUMP,POLL=love.event.pump,love.event.poll
love.mouse.setVisible(true)
love.audio.stop()
local err={"Error:"..msg}
local trace=debug.traceback("",2)
local c=2
for l in string.gmatch(trace,"(.-)\n")do
if c>2 then
if not string.find(l,"boot")then
err[c]=string.gsub(l,"^\t*","")
c=c+1
end
else
err[2]="Traceback"
c=3
end
end
print(table.concat(err,"\n"),1,c-2)
gc.reset()
local CAP
local function _(_)CAP=gc.newImage(_)end
gc.captureScreenshot(_)
gc.present()
setting.sfx=setting.voc--only for error "voice" played with voice volume,not saved
if SFX.list.error then SFX.play("error",.8)end
local BGcolor=rnd()>.026 and{.3,.5,.9},{.62,.3,.926}
local needDraw=true
return function()
PUMP()
for E,a,b,c,d,e in POLL()do
if E=="quit"or a=="escape"then
destroyPlayers()
return 1
elseif E=="resize"then
love.resize(a,b)
needDraw=true
elseif E=="focus"then
needDraw=true
end
end
if needDraw then
gc.discard()
gc.clear(BGcolor)
gc.setColor(1,1,1)
gc.push("transform")
gc.replaceTransform(xOy)
gc.draw(CAP,100,365,nil,512/CAP:getWidth(),288/CAP:getHeight())
setFont(120)gc.print(":(",100,40)
setFont(38)gc.printf(text.errorMsg,100,200,1280-100)
setFont(20)
gc.print(system.."-"..gameVersion,100,660)
gc.print("scene:"..scene.cur,400,660)
gc.printf(err[1],626,360,1260-626)
gc.print("TRACEBACK",626,426)
for i=4,#err-2 do
gc.print(err[i],626,370+20*i)
end
gc.pop()
gc.present()
needDraw=false
end
love.timer.sleep(.2)
end
end
if F.getInfo("setting")then
F.write("setting.dat",F.read("setting"))
F.remove("setting")
end
if F.getInfo("usersetting")then
F.write("setting.dat",F.read("usersetting"))
F.remove("usersetting")
end
--NEW FILENAME!!!
FILE={
data=F.newFile("data.dat"),
setting=F.newFile("setting.dat"),
unlock=F.newFile("unlock.dat"),
}
if F.getInfo("unlock.dat")then loadUnlock()end
if F.getInfo("data.dat")then loadStat()end
if F.getInfo("setting.dat")then
loadSetting()
elseif system=="Android"or system=="iOS" then
setting.swap=false
setting.VKSwitch=true
setting.vib=3
end
changeLanguage(setting.lang)
changeBlockSkin(setting.skin)
-------------------------------------------------------------Reset data relied on setting
changeLanguage(setting.lang)

View File

@@ -3,7 +3,7 @@ local sectionName={"M7","M8","M9","M","MK","MV","MO","MM","GM"}
local function score(P)
local F=false
if P.modeData.point<70 then--if Less then MM
local R=#P.cleared
local R=#P.clearedRow
if R==0 then return end
if R==4 then R=10 end
P.modeData.point=P.modeData.point+R
@@ -29,9 +29,11 @@ return{
},
color=color.lightBlue,
env={
noFly=true,
minarr=1,
_20G=true,
drop=0,lock=15,
wait=10,fall=15,
wait=15,fall=6,
next=3,
visible="fast",
freshLimit=15,
@@ -40,25 +42,25 @@ return{
if P.stat.time>=53.5 then
P.modeData.point=min(P.modeData.point+16,80)
P.modeData.event=sectionName[int(P.modeData.point*.1)+1]
Event.win(P,"finish")
P:win("finish")
end
end,
minarr=1,
bg="game3",bgm="shining terminal",
},
},
slowMark=true,
load=function()
newPlayer(1,340,15)
players[1].modeData.event="M7"
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.grade,-82,170)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
mDraw(drawableText.grade,-81,170)
setFont(55)
mStr(P.modeData.event,-82,110)
mStr(P.modeData.event,-81,110)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_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,

View File

@@ -22,7 +22,7 @@ return{
freshLimit=15,
pushSpeed=2,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
if P.atkBuffer.sum==0 then
local p=#P.atkBuffer+1
local B,D=P.atkBuffer,P.modeData
@@ -52,15 +52,16 @@ return{
end,
bg="game3",bgm="push",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr("24",-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.nextWave,-82,380)
mStr(P.modeData.event,-81,200)
mStr("24",-81,320)
mDraw(drawableText.wave,-81,260)
mDraw(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,

View File

@@ -21,7 +21,7 @@ return{
fall=8,
freshLimit=15,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
if P.atkBuffer.sum<2 then
local p=#P.atkBuffer+1
local B,D=P.atkBuffer,P.modeData
@@ -60,20 +60,21 @@ return{
end
end,
bg="game4",bgm="shining terminal",
},
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr(P.modeData.event,-81,200)
mStr(
P.modeData.event<10 and 22
or P.modeData.event<20 and 25
or 28
,-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.nextWave,-82,380)
,-81,320)
mDraw(drawableText.wave,-81,260)
mDraw(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,

View File

@@ -18,26 +18,23 @@ return{
"EASY",
},
info={
"All-spin 入门教程",
"All-spin 入门教程",
"All-spin Tutorial!",
"All-spin 入门教程\n未制作完成,下块即通",
"All-spin 入门教程\n未制作完成,下块即通",
"All-spin Tutorial!\nUNFINISHED,drop to win",
},
color=color.grey,
color=color.lightGrey,
env={
drop=1e99,lock=1e99,
hold=false,
dropPiece=Event.lose,
dropPiece=player.lose,
task=nil,
bg="game1",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(60)
for i=1,5 do
mStr("UNFINISHED",120+10*i,100+50*i)
end
end,
score=function(P)return{P.modeData.event,P.stat.extraRate}end,
scoreDisp=function(D)return D[1].."Stage "..format("%.2f",D[2]).."%"end,

View File

@@ -19,20 +19,21 @@ return{
env={
drop=30,lock=45,
visible="time",
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
freshLimit=10,
target=200,
bg="glow",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_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,

View File

@@ -21,20 +21,21 @@ return{
fall=10,lock=60,
center=false,
visible="none",
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
freshLimit=15,
target=200,
bg="rgb",bgm="secret7th",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_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,

View File

@@ -21,20 +21,21 @@ return{
fall=5,
center=false,ghost=false,
visible="none",
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
freshLimit=15,
target=200,
bg="rgb",bgm="secret8th",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_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,

View File

@@ -20,20 +20,21 @@ return{
drop=15,lock=45,
freshLimit=10,
visible="fast",
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
freshLimit=10,
target=200,
bg="glow",bgm="reason",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_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,

View File

@@ -22,20 +22,21 @@ return{
block=false,
center=false,ghost=false,
visible="none",
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
freshLimit=15,
target=200,
bg="rgb",bgm="secret7th",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_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,

View File

@@ -1,18 +1,18 @@
local rnd,min=math.random,math.min
local function check_c4w(P)
for i=1,#P.cleared do
P.field[#P.field+1]=getNewRow(10)
P.visTime[#P.visTime+1]=getNewRow(20)
for i=1,#P.clearedRow do
P.field[#P.field+1]=freeRow.get(10)
P.visTime[#P.visTime+1]=freeRow.get(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
if #P.cleared==0 then
Event.lose(P)
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
Event.win(P,"finish")
P:win("finish")
end
end
end
@@ -21,7 +21,7 @@ return{
name={
"C4W练习",
"中四宽练习",
"C4W Train",
"C4W Training",
},
level={
"疯狂",
@@ -38,15 +38,16 @@ return{
drop=5,lock=30,
dropPiece=check_c4w,
freshLimit=15,ospin=false,
bg="rgb",bgm="newera",
bg="rgb",bgm="oxygen",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
local P=players[1]
local F=P.field
for i=1,24 do
F[i]=getNewRow(10)
P.visTime[i]=getNewRow(20)
F[i]=freeRow.get(10)
P.visTime[i]=freeRow.get(20)
for x=4,7 do F[i][x]=0 end
end
local r=rnd(6)
@@ -60,12 +61,12 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.combo,-82,310)
mStr(P.modeData.point,-82,400)
mDraw(drawableText.combo,-82,358)
mDraw(drawableText.mxcmb,-82,450)
mStr(P.combo,-81,310)
mStr(P.modeData.point,-81,400)
mDraw(drawableText.combo,-81,358)
mDraw(drawableText.mxcmb,-81,450)
end,
score=function(P)return{min(P.combo,100),P.stat.time}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)

View File

@@ -1,16 +1,16 @@
local rnd,min=math.random,math.min
local function check_c4w(P)
for i=1,#P.cleared do
P.field[#P.field+1]=getNewRow(10)
P.visTime[#P.visTime+1]=getNewRow(20)
for i=1,#P.clearedRow do
P.field[#P.field+1]=freeRow.get(10)
P.visTime[#P.visTime+1]=freeRow.get(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
if #P.cleared>0 then
if #P.clearedRow>0 then
if P.combo>P.modeData.point then
P.modeData.point=P.combo
end
if P.stat.row>=100 then
Event.win(P,"finish")
P:win("finish")
end
end
end
@@ -19,7 +19,7 @@ return{
name={
"C4W练习",
"中四宽练习",
"C4W Train",
"C4W Training",
},
level={
"普通",
@@ -36,15 +36,16 @@ return{
drop=30,lock=60,oncehold=false,
dropPiece=check_c4w,
freshLimit=15,ospin=false,
bg="rgb",bgm="newera",
bg="rgb",bgm="oxygen",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
local P=players[1]
local F=P.field
for i=1,24 do
F[i]=getNewRow(10)
P.visTime[i]=getNewRow(20)
F[i]=freeRow.get(10)
P.visTime[i]=freeRow.get(20)
for x=4,7 do F[i][x]=0 end
end
local r=rnd(6)
@@ -58,10 +59,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.combo,-82,310)
mStr(P.modeData.point,-82,400)
mDraw(drawableText.combo,-82,358)
mDraw(drawableText.mxcmb,-82,450)
mStr(P.combo,-81,310)
mStr(P.modeData.point,-81,400)
mDraw(drawableText.combo,-81,358)
mDraw(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,

View File

@@ -8,7 +8,7 @@ local function check_LVup(P)
P.gameEnv.drop,P.gameEnv.lock=1,1
end
if P.gameEnv.target>100 then
SFX("reach")
SFX.play("reach")
end
end
end
@@ -31,32 +31,34 @@ 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,
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(75)
local r=P.gameEnv.target*.1
mStr(r<11 and 18 or r<22 and r+8 or r==22 and"00"or r==23 and"0a"or format("%x",r*10-220),-82,210)
mDraw(drawableText.speedLV,-82,290)
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)
mDraw(drawableText.speedLV,-81,290)
setFont(45)
mStr(P.stat.row,-82,320)
mStr(P.gameEnv.target,-82,370)
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,P.stat.score}end,
scoreDisp=function(D)return D[1].." Lines "..D[2]end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]>b[2]end,
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

View File

@@ -18,7 +18,7 @@ return{
},
color=color.white,
env={
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
},
load=function()
for i=1,#customID do
@@ -50,8 +50,8 @@ return{
for _,P in next,players.alive do
local t=P.showTime*3
for y=1,preField.h do
P.field[y]=getNewRow(0)
P.visTime[y]=getNewRow(t)
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
end
@@ -61,11 +61,11 @@ return{
mesDisp=function(P,dx,dy)
setFont(55)
if P.gameEnv.puzzle or P.gameEnv.target>1e10 then
mStr(P.stat.row,-82,225)
mDraw(drawableText.line,-82,290)
mStr(P.stat.row,-81,225)
mDraw(drawableText.line,-81,290)
else
local R=P.gameEnv.target-P.stat.row
mStr(R>=0 and R or 0,-82,240)
mStr(R>=0 and R or 0,-81,240)
end
if P.gameEnv.puzzle and P.modeData.event==0 then
local m=puzzleMark

View File

@@ -7,14 +7,14 @@ local function puzzleCheck(P)
local a,b=preField[y][x],L and L[x]or 0
if a~=0 then
if a==-1 then if b>0 then return end
elseif a<8 then if a~=b then return end
elseif a<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
Event.win(P,"finish")
P:win("finish")
end
return{
@@ -73,8 +73,8 @@ return{
mesDisp=function(P)
local dx,dy=P.fieldOff.x,P.fieldOff.y
setFont(55)
mStr(P.stat.row,-82,225)
mDraw(drawableText.line,-82,290)
mStr(P.stat.row,-81,225)
mDraw(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

View File

@@ -22,7 +22,7 @@ return{
freshLimit=15,
pushSpeed=2,
task=function(P)
if not P.control then return end
if not(P.control and scene.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
@@ -51,17 +51,18 @@ return{
end
end
end,
bg="game4",bgm="way",
bg="game4",bgm="shining terminal",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr(P.modeData.point,-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.rpm,-82,380)
mStr(P.modeData.event,-81,200)
mStr(P.modeData.point,-81,320)
mDraw(drawableText.wave,-81,260)
mDraw(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,
@@ -74,6 +75,6 @@ return{
W>=55 and 3 or
W>=30 and 2 or
W>=20 and 1 or
L>=5 and 0
W>=5 and 0
end,
}

View File

@@ -22,7 +22,7 @@ return{
freshLimit=15,
pushSpeed=1,
task=function(P)
if not P.control then return end
if not(P.control and scene.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
@@ -53,15 +53,16 @@ return{
end,
bg="game3",bgm="way",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr(P.modeData.point,-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.rpm,-82,380)
mStr(P.modeData.event,-81,200)
mStr(P.modeData.point,-81,320)
mDraw(drawableText.wave,-81,260)
mDraw(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,
@@ -74,6 +75,6 @@ return{
W>=70 and 3 or
W>=40 and 2 or
W>=10 and 1 or
L>=3 and 0
W>=3 and 0
end,
}

View File

@@ -21,23 +21,25 @@ return{
fall=20,
freshLimit=15,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(90,180-P.modeData.event)then
P.modeData.counter=0
if not(P.control and scene.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.modeData.event=P.modeData.event+1
D.counter=0
D.event=D.event+1
end
end,
bg="game2",bgm="push",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
mStr(P.modeData.event,-81,310)
mDraw(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,
@@ -50,6 +52,6 @@ return{
W>=80 and 3 or
W>=50 and 2 or
W>=20 and 1 or
L>=5 and 0
P.stat.row>=5 and 0
end,
}

View File

@@ -20,23 +20,25 @@ return{
drop=10,lock=30,
freshLimit=15,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(45,80-.3*P.modeData.event)then
P.modeData.counter=0
P:garbageRise(11+P.modeData.event%3,1,rnd(10))
P.modeData.event=P.modeData.event+1
if not(P.control and scene.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))
D.counter=0
D.event=D.event+1
end
end,
bg="game2",bgm="secret7th",
},
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
mStr(P.modeData.event,-81,310)
mDraw(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,
@@ -44,11 +46,11 @@ return{
getRank=function(P)
local W=P.modeData.event
return
W>=120 and 5 or
W>=100 and 4 or
W>=150 and 5 or
W>=110 and 4 or
W>=80 and 3 or
W>=50 and 2 or
W>=20 and 1 or
L>=5 and 0
P.stat.row>=5 and 0
end,
}

View File

@@ -19,18 +19,19 @@ return{
env={
drop=20,lock=60,
sequence="drought2",
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
ospin=false,
freshLimit=15,
bg="glow",bgm="reason",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(70)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,280)
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,

View File

@@ -19,18 +19,19 @@ return{
env={
drop=20,lock=60,
sequence="drought1",
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
ospin=false,
freshLimit=15,
bg="glow",bgm="reason",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(70)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,280)
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,

View File

@@ -6,9 +6,9 @@ return{
"Infinite",
},
level={
"时间杀手 II",
"时间杀手 II",
"Time Killer II",
"",
"",
"",
},
info={
"沙盒",
@@ -26,10 +26,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,370)
mDraw(drawableText.atk,-82,313)
mDraw(drawableText.eff,-82,425)
mStr(P.stat.atk,-81,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,370)
mDraw(drawableText.atk,-81,313)
mDraw(drawableText.eff,-81,425)
end,
score=function(P)return{P.stat.score}end,
scoreDisp=function(D)return tostring(D[1])end,

View File

@@ -1,6 +1,6 @@
local format,rnd=string.format,math.random
local function check_rise(P)
local L=P.cleared
local L=P.clearedRow
for i=1,#L do
if L[i]<6 then
P:garbageRise(10,1,rnd(10))
@@ -16,9 +16,9 @@ return{
"Infinite:dig",
},
level={
"时间杀手 III",
"时间杀手 III",
"Time Killer III",
"",
"",
"",
},
info={
"挖呀挖呀挖",
@@ -41,12 +41,12 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.modeData.point,-82,190)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.line,-82,243)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.modeData.point,-81,190)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.line,-81,243)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,475)
end,
score=function(P)return{P.modeData.point}end,
scoreDisp=function(D)return D[1].." Lines"end,

View File

@@ -9,7 +9,7 @@ local function check(P)
P.gameEnv._20G=true
P.gameEnv.target=200
else
Event.win(P,"finish")
P:win("finish")
end
end
end
@@ -26,25 +26,27 @@ return{
"HARD",
},
info={
"200行20G马拉松",
"200行20G马拉松",
"200L marathon in 20G",
"200行高速马拉松",
"200行高速马拉松",
"200L marathon in high speed",
},
color=color.magenta,
env={
noFly=true,
mindas=7,minarr=1,minsdarr=1,
drop=.5,fall=30,
target=50,dropPiece=check,
mindas=7,minarr=1,minsdarr=1,
bg="strap",bgm="race",
},
slowmark=true,
pauseLimit=true,
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.row,-82,320)
mStr(P.gameEnv.target,-82,370)
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,

View File

@@ -4,11 +4,11 @@ local function check_LVup(P)
local T=P.modeData.point+10
if P.stat.row>=T then
if T==200 then
Event.win(P,"finish")
P:win("finish")
else
P.gameEnv.drop=dropSpeed[T/10]
P.modeData.point=T
SFX("reach")
SFX.play("reach")
end
end
end
@@ -25,26 +25,28 @@ return{
"NORMAL",
},
info={
"200行速马拉松",
"200行速马拉松",
"200行速马拉松",
"200行速马拉松",
"200L marathon with acceleration",
},
color=color.green,
env={
noFly=true,
minsdarr=1,
fall=30,
target=10,dropPiece=check_LVup,
mindas=7,minarr=1,minsdarr=1,
minsdarr=1,
bg="strap",bgm="way",
},
slowmark=true,
pauseLimit=true,
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.row,-82,320)
mStr(P.modeData.point+10,-82,370)
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,

View File

@@ -4,7 +4,7 @@ local death_lock={12,11,10,9,8}
local death_wait={10,9,8,7,6}
local death_fall={10,9,8,7,6}
local function score(P)
local c=#P.cleared
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
@@ -12,7 +12,7 @@ local function score(P)
end
P.modeData.point=P.modeData.point+s
if P.modeData.point%100==99 then
SFX("blip_1")
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
@@ -24,11 +24,11 @@ local function score(P)
if s==3 then P.gameEnv.bone=true end
if s==5 then
P.modeData.point,P.modeData.event=500,4
Event.win(P,"finish")
P:win("finish")
else
P:showText(text.stage(s),0,-120,80,"fly")
end
SFX("reach")
SFX.play("reach")
end
end
@@ -44,29 +44,30 @@ return{
"ULTIMATE",
},
info={
"进阶20G",
"进阶20G",
"Advanced 20G",
"20G:上级者的挑战",
"20G:上级者的挑战",
"20G:For Pro",
},
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,
mindas=6,minarr=1,
freshLimit=15,
bg="game2",bgm="secret7th",
},
slowmark=true,
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.modeData.point,-82,320)
mStr((P.modeData.event+1)*100,-82,370)
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,
@@ -75,9 +76,9 @@ return{
return a[1]>b[1]or(a[1]==b[1]and(a[2]<b[2]or a[2]==b[2]and a[3]<b[3]))
end,
getRank=function(P)
local L=P.stat.techrash
local S=P.modeData.point
if S==500 then
local L=P.stat.clear_4
return
L>=30 and 5 or
L>=25 and 4 or

View File

@@ -3,7 +3,7 @@ local rush_lock={20,18,16,15,14}
local rush_wait={12,10,9,8,7}
local rush_fall={18,16,14,13,12}
local function score(P)
local c=#P.cleared
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
@@ -11,7 +11,7 @@ local function score(P)
end
P.modeData.point=P.modeData.point+s
if P.modeData.point%100==99 then
SFX("blip_1")
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
@@ -28,11 +28,11 @@ local function score(P)
if s==5 then
P.modeData.point,P.modeData.event=500,4
Event.win(P,"finish")
P:win("finish")
else
P:showText(text.stage(s),0,-120,80,"fly")
end
SFX("reach")
SFX.play("reach")
end
end
@@ -48,29 +48,30 @@ return{
"LUNATIC",
},
info={
"初心20G",
"初心20G",
"Beginner 20G",
"20G:初心者适用",
"20G:初心者适用",
"20G:Back to beginner",
},
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,
das=9,arr=3,
freshLimit=15,
bg="strap",bgm="secret8th",
},
slowmark=true,
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.modeData.point,-82,320)
mStr((P.modeData.event+1)*100,-82,370)
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,
@@ -79,9 +80,9 @@ return{
return a[1]>b[1]or(a[1]==b[1]and(a[2]<b[2]or a[2]==b[2]and a[3]<b[3]))
end,
getRank=function(P)
local L=P.stat.techrash
local S=P.modeData.point
if S==500 then
local L=P.stat.clear_4
return
L>=30 and 5 or
L>=25 and 4 or

View File

@@ -1,7 +1,7 @@
local gc=love.graphics
local int=math.floor
local function score(P)
local c=#P.cleared
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
@@ -9,7 +9,7 @@ local function score(P)
end
local MD=P.modeData
MD.point=MD.point+s
if MD.point%100==99 then SFX("blip_1")end
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:showText(text.stage(s),0,-120,80,"fly")
@@ -27,9 +27,9 @@ local function score(P)
end
else
MD.point,MD.event=1000,9
Event.win(P,"finish")
P:win("finish")
end
SFX("reach")
SFX.play("reach")
end
end
@@ -45,29 +45,30 @@ return{
"FINAL",
},
info={
"究极20G:无法到达的终点",
"究极20G:无法到达的终点",
"究极20G:无法触及的终点",
"究极20G:无法触及的终点",
"Extreme 20G:Unreachable destination",
},
color=color.lightGrey,
env={
noFly=true,
mindas=5,minarr=1,
_20G=true,lock=12,
wait=10,fall=10,
dropPiece=score,
mindas=5,minarr=1,
freshLimit=15,
easyFresh=false,bone=true,
bg="none",bgm="shining terminal",
bg="none",bgm="distortion",
},
slowmark=true,
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local MD=P.modeData
mStr(MD.point,-82,320)
mStr((MD.event+1)*100,-82,370)
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,
@@ -81,6 +82,6 @@ return{
S>=600 and 3 or
S>=400 and 2 or
S>=200 and 1 or
L>=50 and 0
S>=50 and 0
end,
}

View File

@@ -19,22 +19,23 @@ return{
env={
drop=60,lock=120,
fall=10,
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
freshLimit=15,
ospin=false,
bg="rgb",bgm="infinite",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,250)
mStr(R>=0 and R or 0,-81,250)
setFont(75)
mStr(P.stat.pc,-82,350)
mDraw(drawableText.pc,-82,432)
mStr(P.stat.pc,-81,350)
mDraw(drawableText.pc,-81,432)
gc.setColor(.5,.5,.5)
if frame>179 then

View File

@@ -19,22 +19,23 @@ return{
env={
drop=20,lock=60,
fall=20,
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
freshLimit=15,
ospin=false,
bg="rgb",bgm="infinite",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,250)
mStr(R>=0 and R or 0,-81,250)
setFont(75)
mStr(P.stat.pc,-82,350)
mDraw(drawableText.pc,-82,432)
mStr(P.stat.pc,-81,350)
mDraw(drawableText.pc,-81,432)
gc.setColor(.5,.5,.5)
if frame>179 then

View File

@@ -19,21 +19,22 @@ return{
env={
oncehold=false,
drop=300,lock=1e99,
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
ospin=false,
bg="rgb",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,250)
mStr(R>=0 and R or 0,-81,250)
setFont(75)
mStr(P.stat.pc,-82,350)
mDraw(drawableText.pc,-82,432)
mStr(P.stat.pc,-81,350)
mDraw(drawableText.pc,-81,432)
gc.setColor(.5,.5,.5)
if frame>179 then

View File

@@ -10,12 +10,12 @@ local function task_PC(P)
if P.modeData.counter==21 then
local t=P.stat.pc%2
for i=1,4 do
local r=getNewRow(0)
local r=freeRow.get(0)
for j=1,10 do
r[j]=PCbase[4*t+i][j]
end
ins(P.field,1,r)
ins(P.visTime,1,getNewRow(20))
ins(P.visTime,1,freeRow.get(20))
end
P.fieldBeneath=P.fieldBeneath+120
P.curY=P.curY+4
@@ -30,7 +30,7 @@ local function newPC(P)
local c=0
for i=1,10 do if r[i]>0 then c=c+1 end end
if c<5 then
Event.lose(P)
P:lose()
end
end
if P.stat.piece%4==0 and #P.field==0 then
@@ -66,7 +66,7 @@ return{
name={
"全清训练",
"全清训练",
"PC Train",
"PC Training",
},
level={
"疯狂",
@@ -88,16 +88,17 @@ return{
freshLimit=15,
dropPiece=newPC,
ospin=false,
bg="rgb",bgm="newera",
bg="rgb",bgm="oxygen",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPC(players[1])
end,
mesDisp=function(P,dx,dy)
setFont(75)
mStr(P.stat.pc,-82,330)
mDraw(drawableText.pc,-82,412)
mStr(P.stat.pc,-81,330)
mDraw(drawableText.pc,-81,412)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(D[2])end,

View File

@@ -7,12 +7,12 @@ local function task_PC(P)
if P.modeData.counter==21 then
local t=P.stat.pc%2
for i=1,4 do
local r=getNewRow(0)
local r=freeRow.get(0)
for j=1,10 do
r[j]=PCbase[4*t+i][j]
end
ins(P.field,1,r)
ins(P.visTime,1,getNewRow(20))
ins(P.visTime,1,freeRow.get(20))
end
P.fieldBeneath=P.fieldBeneath+120
P.curY=P.curY+4
@@ -26,7 +26,7 @@ local function newPC(P)
local c=0
for i=1,10 do if r[i]>0 then c=c+1 end end
if c<5 then
Event.lose(P)
P:lose()
end
end
if P.stat.piece%4==0 and #P.field==0 then
@@ -50,7 +50,7 @@ return{
name={
"全清训练",
"全清训练",
"PC Train",
"PC Training",
},
level={
"普通",
@@ -71,16 +71,17 @@ return{
sequence="none",
dropPiece=newPC,
ospin=false,
bg="rgb",bgm="newera",
bg="rgb",bgm="oxygen",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPC(players[1])
end,
mesDisp=function(P,dx,dy)
setFont(75)
mStr(P.stat.pc,-82,330)
mDraw(drawableText.pc,-82,412)
mStr(P.stat.pc,-81,330)
mDraw(drawableText.pc,-81,412)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(D[2])end,

View File

@@ -14,7 +14,7 @@ return{
name={
"回合制",
"回合制",
"Turn-Base",
"Turn-Based",
},
level={
"简单",

View File

@@ -14,7 +14,7 @@ return{
name={
"回合制",
"回合制",
"Turn-Base",
"Turn-Based",
},
level={
"普通",

View File

@@ -14,7 +14,7 @@ return{
name={
"回合制",
"回合制",
"Turn-Base",
"Turn-Based",
},
level={
"困难",

View File

@@ -14,7 +14,7 @@ return{
name={
"回合制",
"回合制",
"Turn-Base",
"Turn-Based",
},
level={
"疯狂",

View File

@@ -14,7 +14,7 @@ return{
name={
"回合制",
"回合制",
"Turn-Base",
"Turn-Based",
},
level={
"极限",

View File

@@ -20,6 +20,7 @@ return{
freshLimit=15,
bg="game2",bgm="race",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",3))

View File

@@ -20,6 +20,7 @@ return{
freshLimit=15,
bg="game2",bgm="race",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",5))

View File

@@ -20,6 +20,7 @@ return{
freshLimit=15,
bg="game2",bgm="race",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",7))

View File

@@ -20,6 +20,7 @@ return{
freshLimit=15,
bg="game2",bgm="race",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",8))

View File

@@ -20,6 +20,7 @@ return{
freshLimit=15,
bg="game2",bgm="race",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",9))

View File

@@ -19,7 +19,7 @@ return{
color=color.cyan,
env={
drop=60,lock=60,
target=10,dropPiece=Event.reach_winCheck,
target=10,dropPiece=player.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=10-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
@@ -48,7 +48,7 @@ return{
T<=10 and 4 or
T<=25 and 3 or
T<=40 and 2 or
T<=60 and 1 or
T<=62 and 1 or
0
end,
}

View File

@@ -19,7 +19,7 @@ return{
color=color.orange,
env={
drop=60,lock=60,
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
@@ -44,7 +44,7 @@ return{
if P.stat.row<100 then return end
local T=P.stat.time
return
T<=60 and 5 or
T<=62 and 5 or
T<=90 and 4 or
T<=130 and 3 or
T<=200 and 2 or

View File

@@ -19,7 +19,7 @@ return{
color=color.lightGrey,
env={
drop=60,lock=60,
target=1000,dropPiece=Event.reach_winCheck,
target=1000,dropPiece=player.reach_winCheck,
bg="strap",bgm="push",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=1000-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)

View File

@@ -19,7 +19,7 @@ return{
color=color.lightBlue,
env={
drop=60,lock=60,
target=20,dropPiece=Event.reach_winCheck,
target=20,dropPiece=player.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=20-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
@@ -47,8 +47,8 @@ return{
T<=13 and 5 or
T<=18 and 4 or
T<=45 and 3 or
T<=70 and 2 or
T<=100 and 1 or
T<=80 and 2 or
T<=126 and 1 or
0
end,
}

View File

@@ -19,7 +19,7 @@ return{
color=color.green,
env={
drop=60,lock=60,
target=40,dropPiece=Event.reach_winCheck,
target=40,dropPiece=player.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
@@ -44,11 +44,11 @@ return{
if P.stat.row<40 then return end
local T=P.stat.time
return
T<=25 and 5 or
T<=32 and 4 or
T<=26 and 5 or
T<=32.6 and 4 or
T<=40 and 3 or
T<=62 and 2 or
T<=126 and 1 or
T<=183 and 1 or
0
end,
}

View File

@@ -19,7 +19,7 @@ return{
color=color.red,
env={
drop=60,lock=60,
target=400,dropPiece=Event.reach_winCheck,
target=400,dropPiece=player.reach_winCheck,
bg="strap",bgm="push",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=400-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)

View File

@@ -20,7 +20,7 @@ return{
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(60,150-2*P.modeData.event)and P.atkBuffer.sum<4 then
P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1}
@@ -33,13 +33,14 @@ return{
end,
bg="glow",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -20,7 +20,7 @@ return{
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(60,180-2*P.modeData.event)and P.atkBuffer.sum<15 then
P.atkBuffer[#P.atkBuffer+1]=
@@ -38,13 +38,14 @@ return{
end,
bg="glow",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -20,7 +20,7 @@ return{
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(60,150-P.modeData.event)and P.atkBuffer.sum<20 then
local t=max(60,90-P.modeData.event)
@@ -34,13 +34,14 @@ return{
end,
bg="glow",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -20,7 +20,7 @@ return{
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(90,180-2*P.modeData.event)and P.atkBuffer.sum<8 then
local d=P.modeData.event+1
@@ -38,13 +38,14 @@ return{
end,
bg="glow",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -22,7 +22,7 @@ return{
freshLimit=15,
pushSpeed=2,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(300,600-10*P.modeData.event)and P.atkBuffer.sum<20 then
local t=max(300,480-12*P.modeData.event)
@@ -33,20 +33,21 @@ return{
P.atkBuffer[p+3]={pos=rnd(10),amount=6,countdown=1.5*t,cd0=1.5*t,time=0,sent=false,lv=5}
P.atkBuffer.sum=P.atkBuffer.sum+20
P.stat.recv=P.stat.recv+20
P.modeData.counter=0
if P.modeData.event==31 then P:showText(text.maxspeed,0,-140,100,"appear",.6)end
P.modeData.counter=0
P.modeData.event=P.modeData.event+1
end
end,
bg="rgb",bgm="secret7th",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_ultimate(P)
if #P.cleared>0 and P.lastClear<10 or P.lastClear==74 then
Event.lose(P)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
end
end
@@ -26,7 +26,7 @@ return{
drop=30,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_reach_ultimate,
dropPiece=tech_check_ultimate,
bg="matrix",bgm="secret8th",
},
load=function()
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,475)
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,

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_easy(P)
if #P.cleared>0 and P.b2b<40 then
Event.lose(P)
if #P.clearedRow>0 and P.b2b<40 then
P:lose()
end
end
@@ -26,7 +26,7 @@ return{
drop=20,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_reach_easy,
dropPiece=tech_check_easy,
bg="matrix",bgm="secret8th",
},
load=function()
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,475)
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,

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_ultimate(P)
if #P.cleared>0 and P.lastClear<10 or P.lastClear==74 then
Event.lose(P)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
end
end
@@ -26,7 +26,7 @@ return{
_20G=true,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_reach_ultimate,
dropPiece=tech_check_ultimate,
bg="matrix",bgm="secret7th",
},
load=function()
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,475)
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,

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_hard(P)
if #P.cleared>0 and P.lastClear<10 then
Event.lose(P)
if #P.clearedRow>0 and P.lastClear<10 then
P:lose()
end
end
@@ -17,16 +17,16 @@ return{
"LUNATIC",
},
info={
"禁止断B2B",
"禁止断满贯",
"Keep B2B",
"禁止普通消除",
"禁止普通消除",
"No normal clear",
},
color=color.red,
env={
_20G=true,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_reach_hard,
dropPiece=tech_check_hard,
bg="matrix",bgm="secret7th",
},
load=function()
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,475)
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,

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_ultimate(P)
if #P.cleared>0 and P.lastClear<10 or P.lastClear==74 then
Event.lose(P)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
end
end
@@ -26,7 +26,7 @@ return{
oncehold=false,
drop=1e99,lock=1e99,
target=200,
dropPiece=tech_reach_ultimate,
dropPiece=tech_check_ultimate,
bg="matrix",bgm="newera",
},
load=function()
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,475)
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,

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_easy(P)
if #P.cleared>0 and P.b2b<40 then
Event.lose(P)
if #P.clearedRow>0 and P.b2b<40 then
P:lose()
end
end
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,475)
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,

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_ultimate(P)
if #P.cleared>0 and P.lastClear<10 or P.lastClear==74 then
Event.lose(P)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
end
end
@@ -17,28 +17,30 @@ return{
"ULTIMATE+",
},
info={
"禁止普通消除,强制最简操作",
"禁止普通消除,强制最简操作",
"Don't do normal clear,no finesse error",
"仅允许spin与PC,强制最简操作",
"仅允许spin与全清,强制最简操作",
"Spin&PC only,no finesse error",
},
color=color.grey,
env={
arr=0,
drop=1e99,lock=60,
freshLimit=15,
target=200,
fineKill=true,
dropPiece=tech_reach_ultimate,
dropPiece=tech_check_ultimate,
bg="flink",bgm="infinite",
},
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,475)
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,

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_hard(P)
if #P.cleared>0 and P.lastClear<10 then
Event.lose(P)
if #P.clearedRow>0 and P.lastClear<10 then
P:lose()
end
end
@@ -17,28 +17,30 @@ return{
"ULTIMATE",
},
info={
"仅允许spin与PC,强制最简操作",
"仅允许spin与全清,强制最简操作",
"Don't do normal clear,no finesse error",
"禁止普通消除,强制最简操作",
"禁止普通消除,强制最简操作",
"No normal clear,no finesse error",
},
color=color.lightYellow,
env={
arr=0,
drop=1e99,lock=60,
freshLimit=15,
target=200,
fineKill=true,
dropPiece=tech_reach_hard,
dropPiece=tech_check_hard,
bg="flink",bgm="infinite",
},
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,475)
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,

View File

@@ -56,24 +56,24 @@ return{
local n=2
for i=1,4 do for j=1,6 do
if L[n]then
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(4,6)))
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(2,5)))
else
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(4,6)-1,2,true,10000))
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(2,5)-1,2,true,10000))
end
n=n+1
end end
for i=9,12 do for j=1,6 do
if L[n]then
newPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(4,6)))
newPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(2,5)))
else
newPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(4,6)-1,2,true,10000))
newPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(2,5)-1,2,true,10000))
end
n=n+1
end end
end,
mesDisp=function(P,dx,dy)
setFont(35)
mStr(#players.alive.."/49",-82,175)
mStr(#players.alive.."/49",-81,175)
mStr(P.modeData.point,-70,215)
gc.draw(drawableText.ko,-127,225)
setFont(20)

View File

@@ -56,24 +56,24 @@ return{
local n=2
for i=1,4 do for j=1,6 do
if L[n]then
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(4,8)))
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("9S",rnd(4,7)))
else
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(4,8)-1,3,true,20000))
newPlayer(n,78*i-54,115*j-98,.09,AITemplate("CC",rnd(4,7)-1,3,true,20000))
end
n=n+1
end end
for i=9,12 do for j=1,6 do
if L[n]then
newPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(4,8)))
newPlayer(n,78*i+267,115*j-98,.09,AITemplate("9S",rnd(4,7)))
else
newPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(4,8)-1,3,true,20000))
newPlayer(n,78*i+267,115*j-98,.09,AITemplate("CC",rnd(4,7)-1,3,true,20000))
end
n=n+1
end end
end,
mesDisp=function(P,dx,dy)
setFont(35)
mStr(#players.alive.."/49",-82,175)
mStr(#players.alive.."/49",-81,175)
mStr(P.modeData.point,-70,215)
gc.draw(drawableText.ko,-127,225)
setFont(20)

View File

@@ -73,7 +73,7 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(35)
mStr(#players.alive.."/49",-82,175)
mStr(#players.alive.."/49",-81,175)
mStr(P.modeData.point,-70,215)
gc.draw(drawableText.ko,-127,225)
setFont(20)

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