整 理 代 码
(应该没有改到字符串里面的东西吧…)起码不直接影响运行
This commit is contained in:
Submodule Zframework updated: b48282a5f4...779c841f1a
124
main.lua
124
main.lua
@@ -16,15 +16,15 @@
|
||||
|
||||
|
||||
--Var leak check
|
||||
-- setmetatable(_G,{__newindex=function(self,k,v)print('>>'..k..string.rep(" ",26-#k),debug.traceback():match("\n.-\n\t(.-): "))rawset(self,k,v)end})
|
||||
-- setmetatable(_G,{__newindex=function(self,k,v) print('>>'..k..string.rep(" ",26-#k),debug.traceback():match("\n.-\n\t(.-): "))rawset(self,k,v) end})
|
||||
|
||||
--System Global Vars Declaration
|
||||
local fs=love.filesystem
|
||||
VERSION=require"version"
|
||||
TIME=love.timer.getTime
|
||||
SYSTEM=love.system.getOS()if SYSTEM=='OS X'then SYSTEM='macOS'end
|
||||
SYSTEM=love.system.getOS() if SYSTEM=='OS X' then SYSTEM='macOS' end
|
||||
FNNS=SYSTEM:find'\79\83'--What does FNSF stand for? IDK so don't ask me lol
|
||||
MOBILE=SYSTEM=='Android'or SYSTEM=='iOS'
|
||||
MOBILE=SYSTEM=='Android' or SYSTEM=='iOS'
|
||||
|
||||
--Global Vars & Settings
|
||||
SFXPACKS={'chiptune'}
|
||||
@@ -60,7 +60,7 @@ BGM.setMaxSources(5)
|
||||
VOC.setDiversion(.62)
|
||||
|
||||
WIDGET.setOnChange(function()
|
||||
if SCN.cur~='custom_field'then
|
||||
if SCN.cur~='custom_field' then
|
||||
local colorList=THEME.getThemeColor()
|
||||
if not colorList then return end
|
||||
local rnd=math.random
|
||||
@@ -88,11 +88,11 @@ string.split=STRING.split
|
||||
FILE.clear('')
|
||||
|
||||
--Create directories
|
||||
for _,v in next,{'conf','record','replay','cache','lib'}do
|
||||
for _,v in next,{'conf','record','replay','cache','lib'} do
|
||||
local info=fs.getInfo(v)
|
||||
if not info then
|
||||
fs.createDirectory(v)
|
||||
elseif info.type~='directory'then
|
||||
elseif info.type~='directory' then
|
||||
fs.remove(v)
|
||||
fs.createDirectory(v)
|
||||
end
|
||||
@@ -104,8 +104,8 @@ require'parts.gameFuncs'
|
||||
|
||||
--Load shader files from SOURCE ONLY
|
||||
SHADER={}
|
||||
for _,v in next,fs.getDirectoryItems('parts/shaders')do
|
||||
if FILE.isSafe('parts/shaders/'..v)then
|
||||
for _,v in next,fs.getDirectoryItems('parts/shaders') do
|
||||
if FILE.isSafe('parts/shaders/'..v) then
|
||||
local name=v:sub(1,-6)
|
||||
SHADER[name]=love.graphics.newShader('parts/shaders/'..name..'.glsl')
|
||||
end
|
||||
@@ -155,14 +155,14 @@ do--Z.setCursor
|
||||
_=DSCP[R][0]
|
||||
GC.draw(TEXTURE.miniBlock[R],x,y,time%math.pi*4,8,8,2*_[2]+1,2*(#BLOCKS[R][0]-_[1])-1)
|
||||
GC.setColor(1,1,1)
|
||||
GC.draw(love.mouse.isDown(1)and holdImg or normImg,x,y,nil,nil,nil,8,8)
|
||||
GC.draw(love.mouse.isDown(1) and holdImg or normImg,x,y,nil,nil,nil,8,8)
|
||||
end
|
||||
end)
|
||||
end
|
||||
Z.setOnFnKeys({
|
||||
function()MES.new('check',PROFILE.switch()and"profile start!"or"profile report copied!")end,
|
||||
function()MES.new('info',("System:%s[%s]\nluaVer:%s\njitVer:%s\njitVerNum:%s"):format(SYSTEM,jit.arch,_VERSION,jit.version,jit.version_num))end,
|
||||
function()MES.new('error',"挂了")end,
|
||||
function() MES.new('check',PROFILE.switch() and "profile start!" or "profile report copied!") end,
|
||||
function() MES.new('info',("System:%s[%s]\nluaVer:%s\njitVer:%s\njitVerNum:%s"):format(SYSTEM,jit.arch,_VERSION,jit.version,jit.version_num)) end,
|
||||
function() MES.new('error',"挂了") end,
|
||||
function()
|
||||
if GAME.playing and not GAME.net then
|
||||
for _=1,8 do
|
||||
@@ -174,9 +174,9 @@ Z.setOnFnKeys({
|
||||
end
|
||||
end
|
||||
end,
|
||||
function()print(BG.locked)end,
|
||||
function()for k,v in next,_G do print(k,v)end end,
|
||||
function()if love['_openConsole']then love['_openConsole']()end end,
|
||||
function() print(BG.locked) end,
|
||||
function() for k,v in next,_G do print(k,v) end end,
|
||||
function() if love['_openConsole'] then love['_openConsole']() end end,
|
||||
})
|
||||
Z.setOnGlobalKey('f11',function()
|
||||
SETTING.fullscreen=not SETTING.fullscreen
|
||||
@@ -218,7 +218,7 @@ do--Z.setOnFocus
|
||||
TASK.new(task_autoSoundOn)
|
||||
end
|
||||
else
|
||||
if SCN.cur=='game'and SETTING.autoPause then
|
||||
if SCN.cur=='game' and SETTING.autoPause then
|
||||
pauseGame()
|
||||
end
|
||||
if SETTING.autoMute and SCN.cur~='music' then
|
||||
@@ -232,13 +232,13 @@ Z.setOnQuit(destroyPlayers)
|
||||
|
||||
--Load settings and statistics
|
||||
if
|
||||
not(
|
||||
pcall(TABLE.cover, loadFile('conf/user', '-json -canSkip')or loadFile('conf/user', '-luaon -canSkip')or{},USER) and
|
||||
pcall(TABLE.cover, loadFile('conf/unlock', '-json -canSkip')or loadFile('conf/unlock', '-luaon -canSkip')or{},RANKS) and
|
||||
pcall(TABLE.update,loadFile('conf/settings', '-json -canSkip')or loadFile('conf/settings', '-luaon -canSkip')or{},SETTING) and
|
||||
pcall(TABLE.coverR,loadFile('conf/data', '-json -canSkip')or loadFile('conf/data', '-luaon -canSkip')or{},STAT) and
|
||||
pcall(TABLE.cover, loadFile('conf/key', '-json -canSkip')or loadFile('conf/key', '-luaon -canSkip')or{},KEY_MAP) and
|
||||
pcall(TABLE.cover, loadFile('conf/virtualkey','-json -canSkip')or loadFile('conf/virtualkey','-luaon -canSkip')or{},VK_ORG)
|
||||
not (
|
||||
pcall(TABLE.cover, loadFile('conf/user', '-json -canSkip') or loadFile('conf/user', '-luaon -canSkip') or{},USER) and
|
||||
pcall(TABLE.cover, loadFile('conf/unlock', '-json -canSkip') or loadFile('conf/unlock', '-luaon -canSkip') or{},RANKS) and
|
||||
pcall(TABLE.update,loadFile('conf/settings', '-json -canSkip') or loadFile('conf/settings', '-luaon -canSkip') or{},SETTING) and
|
||||
pcall(TABLE.coverR,loadFile('conf/data', '-json -canSkip') or loadFile('conf/data', '-luaon -canSkip') or{},STAT) and
|
||||
pcall(TABLE.cover, loadFile('conf/key', '-json -canSkip') or loadFile('conf/key', '-luaon -canSkip') or{},KEY_MAP) and
|
||||
pcall(TABLE.cover, loadFile('conf/virtualkey','-json -canSkip') or loadFile('conf/virtualkey','-luaon -canSkip') or{},VK_ORG)
|
||||
)
|
||||
then
|
||||
MES.new('error',"An error occured during loading, and some data was lost.")
|
||||
@@ -351,8 +351,8 @@ SKIN.load{
|
||||
--Initialize sound libs
|
||||
SFX.init((function()--[Warning] Not loading files here, just get the list of sound needed
|
||||
local L={}
|
||||
for _,v in next,fs.getDirectoryItems('media/effect/chiptune/')do
|
||||
if FILE.isSafe('media/effect/chiptune/'..v,"Dangerous file : %SAVE%/media/effect/chiptune/"..v)then
|
||||
for _,v in next,fs.getDirectoryItems('media/effect/chiptune/') do
|
||||
if FILE.isSafe('media/effect/chiptune/'..v,"Dangerous file : %SAVE%/media/effect/chiptune/"..v) then
|
||||
table.insert(L,v:sub(1,-5))
|
||||
end
|
||||
end
|
||||
@@ -360,8 +360,8 @@ SFX.init((function()--[Warning] Not loading files here, just get the list of sou
|
||||
end)())
|
||||
BGM.init((function()
|
||||
local L={}
|
||||
for _,v in next,fs.getDirectoryItems('media/music')do
|
||||
if FILE.isSafe('media/music/'..v,"Dangerous file : %SAVE%/media/music/"..v)then
|
||||
for _,v in next,fs.getDirectoryItems('media/music') do
|
||||
if FILE.isSafe('media/music/'..v,"Dangerous file : %SAVE%/media/music/"..v) then
|
||||
L[v:sub(1,-5)]='media/music/'..v
|
||||
end
|
||||
end
|
||||
@@ -398,9 +398,9 @@ LANG.init('zh',
|
||||
block=BLOCK_NAMES
|
||||
},
|
||||
(function()
|
||||
local tipMeta={__call=function(L)return L[math.random(#L)]end}
|
||||
local tipMeta={__call=function(L) return L[math.random(#L)] end}
|
||||
return function(L)
|
||||
if type(rawget(L,'getTip'))=='table'then setmetatable(L.getTip,tipMeta)end
|
||||
if type(rawget(L,'getTip'))=='table' then setmetatable(L.getTip,tipMeta) end
|
||||
setmetatable(L,{__index=function(self,k)
|
||||
local mes="No Text ("..SETTING.locale.."): "..k
|
||||
LOG(mes)
|
||||
@@ -415,16 +415,16 @@ LANG.init('zh',
|
||||
table.insert(_LOADTIMELIST_,("Initialize Parts: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
--Load background files from SOURCE ONLY
|
||||
for _,v in next,fs.getDirectoryItems('parts/backgrounds')do
|
||||
if FILE.isSafe('parts/backgrounds/'..v)and v:sub(-3)=='lua'then
|
||||
for _,v in next,fs.getDirectoryItems('parts/backgrounds') do
|
||||
if FILE.isSafe('parts/backgrounds/'..v) and v:sub(-3)=='lua' then
|
||||
local name=v:sub(1,-5)
|
||||
BG.add(name,require('parts.backgrounds.'..name))
|
||||
end
|
||||
end
|
||||
BG.remList('none')BG.remList('gray')BG.remList('custom')
|
||||
--Load scene files from SOURCE ONLY
|
||||
for _,v in next,fs.getDirectoryItems('parts/scenes')do
|
||||
if FILE.isSafe('parts/scenes/'..v)then
|
||||
for _,v in next,fs.getDirectoryItems('parts/scenes') do
|
||||
if FILE.isSafe('parts/scenes/'..v) then
|
||||
local sceneName=v:sub(1,-5)
|
||||
SCN.add(sceneName,require('parts.scenes.'..sceneName))
|
||||
LANG.addScene(sceneName)
|
||||
@@ -433,13 +433,13 @@ end
|
||||
--Load mode files
|
||||
for i=1,#MODES do
|
||||
local m=MODES[i]--Mode template
|
||||
if FILE.isSafe('parts/modes/'..m.name)then
|
||||
if FILE.isSafe('parts/modes/'..m.name) then
|
||||
TABLE.complete(require('parts.modes.'..m.name),MODES[i])
|
||||
MODES[m.name],MODES[i]=MODES[i]
|
||||
end
|
||||
end
|
||||
for _,v in next,fs.getDirectoryItems('parts/modes')do
|
||||
if FILE.isSafe('parts/modes/'..v)and not MODES[v:sub(1,-5)]then
|
||||
for _,v in next,fs.getDirectoryItems('parts/modes') do
|
||||
if FILE.isSafe('parts/modes/'..v) and not MODES[v:sub(1,-5)] then
|
||||
local M={name=v:sub(1,-5)}
|
||||
local modeData=require('parts.modes.'..M.name)
|
||||
if modeData.env then
|
||||
@@ -455,10 +455,10 @@ table.insert(_LOADTIMELIST_,("Load Files: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
do
|
||||
local needSave
|
||||
|
||||
if not fs.getInfo('conf/data')then
|
||||
if not fs.getInfo('conf/data') then
|
||||
needSave=true
|
||||
end
|
||||
if type(STAT.version)~='number'then
|
||||
if type(STAT.version)~='number' then
|
||||
STAT.version=0
|
||||
needSave=true
|
||||
end
|
||||
@@ -471,10 +471,10 @@ do
|
||||
end
|
||||
if STAT.version==1506 then
|
||||
local temp1,temp2
|
||||
if fs.getInfo('record/master_l.rec')then
|
||||
if fs.getInfo('record/master_l.rec') then
|
||||
temp1=fs.read('record/master_l.rec')
|
||||
end
|
||||
if fs.getInfo('record/master_u.rec')then
|
||||
if fs.getInfo('record/master_u.rec') then
|
||||
temp2=fs.read('record/master_u.rec')
|
||||
end
|
||||
if temp1 then
|
||||
@@ -534,16 +534,16 @@ do
|
||||
end
|
||||
if STAT.version~=VERSION.code then
|
||||
for k,v in next,MODE_UPDATE_MAP do
|
||||
if RANKS[k]then
|
||||
if RANKS[k] then
|
||||
RANKS[v]=RANKS[k]
|
||||
RANKS[k]=nil
|
||||
end
|
||||
k='record/'..k
|
||||
if fs.getInfo(k..'.dat')then
|
||||
if fs.getInfo(k..'.dat') then
|
||||
fs.write('record/'..v..'.rec',fs.read(k..'.dat'))
|
||||
fs.remove(k..'.dat')
|
||||
end
|
||||
if fs.getInfo(k..'.rec')then
|
||||
if fs.getInfo(k..'.rec') then
|
||||
fs.write('record/'..v..'.rec',fs.read(k..'.rec'))
|
||||
fs.remove(k..'.rec')
|
||||
end
|
||||
@@ -554,12 +554,12 @@ do
|
||||
SETTING.appLock,SETTING.dataSaving,SETTING.swap,SETTING.autoLogin=nil
|
||||
if not SETTING.VKSkin then SETTING.VKSkin=1 end
|
||||
for _,v in next,SETTING.skin do if v<1 or v>17 then v=17 end end
|
||||
if not RSlist[SETTING.RS]then SETTING.RS='TRS'end
|
||||
if SETTING.ghostType=='greyCell'then SETTING.ghostType='grayCell'end
|
||||
if type(SETTING.skinSet)=='number'then SETTING.skinSet='crystal_scf'end
|
||||
if not TABLE.find({8,10,13,17,22,29,37,47,62,80,100},SETTING.frameMul)then SETTING.frameMul=100 end
|
||||
if not RSlist[SETTING.RS] then SETTING.RS='TRS' end
|
||||
if SETTING.ghostType=='greyCell' then SETTING.ghostType='grayCell' end
|
||||
if type(SETTING.skinSet)=='number' then SETTING.skinSet='crystal_scf' end
|
||||
if not TABLE.find({8,10,13,17,22,29,37,47,62,80,100},SETTING.frameMul) then SETTING.frameMul=100 end
|
||||
if SETTING.cv then SETTING.vocPack,SETTING.cv=SETTING.cv end
|
||||
if type(SETTING.bg)~='string'then SETTING.bg='on'end
|
||||
if type(SETTING.bg)~='string' then SETTING.bg='on' end
|
||||
if SETTING.skin[18]==10 then SETTING.skin[18]=4 end
|
||||
if SETTING.reTime>3 or SETTING.reTime<.5 then SETTING.reTime=2 end
|
||||
if SETTING.locale=='zh_full' then SETTING.locale='zh' end
|
||||
@@ -571,26 +571,26 @@ do
|
||||
if RANKS.master_u then RANKS.master_h,RANKS.master_u=RANKS.master_u needSave=true end
|
||||
for _,v in next,VK_ORG do v.color=nil end
|
||||
for name,rank in next,RANKS do
|
||||
if type(name)=='number'or type(rank)~='number'then
|
||||
if type(name)=='number' or type(rank)~='number' then
|
||||
RANKS[name]=nil
|
||||
needSave=true
|
||||
else
|
||||
local M=MODES[name]
|
||||
if M and M.unlock and rank>0 then
|
||||
for _,unlockName in next,M.unlock do
|
||||
if not RANKS[unlockName]then
|
||||
if not RANKS[unlockName] then
|
||||
RANKS[unlockName]=0
|
||||
needSave=true
|
||||
end
|
||||
end
|
||||
end
|
||||
if not(M and M.x)then
|
||||
if not (M and M.x) then
|
||||
RANKS[name]=nil
|
||||
needSave=true
|
||||
end
|
||||
end
|
||||
end
|
||||
if not MODES[STAT.lastPlay]then
|
||||
if not MODES[STAT.lastPlay] then
|
||||
STAT.lastPlay='sprint_10l'
|
||||
needSave=true
|
||||
end
|
||||
@@ -615,14 +615,14 @@ end
|
||||
applySettings()
|
||||
|
||||
--Load replays
|
||||
for _,fileName in next,fs.getDirectoryItems('replay')do
|
||||
if fileName:sub(12,12):match("[a-zA-Z]")then
|
||||
for _,fileName in next,fs.getDirectoryItems('replay') do
|
||||
if fileName:sub(12,12):match("[a-zA-Z]") then
|
||||
local date,mode,version,player,seed,setting,mod
|
||||
local fileData=fs.read('replay/'..fileName)
|
||||
date, fileData=STRING.readLine(fileData)date=date:gsub("[a-zA-Z]","")
|
||||
mode, fileData=STRING.readLine(fileData)mode=MODE_UPDATE_MAP[mode]or mode
|
||||
mode, fileData=STRING.readLine(fileData)mode=MODE_UPDATE_MAP[mode] or mode
|
||||
version,fileData=STRING.readLine(fileData)
|
||||
player, fileData=STRING.readLine(fileData)if player=="Local Player"then player="Stacker"end
|
||||
player, fileData=STRING.readLine(fileData) if player=="Local Player" then player="Stacker" end
|
||||
local success
|
||||
success,fileData=pcall(love.data.decompress,'string','zlib',fileData)
|
||||
if not success then goto BREAK_cannotParse end
|
||||
@@ -658,16 +658,16 @@ for _,fileName in next,fs.getDirectoryItems('replay')do
|
||||
local rep=DATA.parseReplay('replay/'..fileName)
|
||||
table.insert(REPLAY,rep)
|
||||
end
|
||||
table.sort(REPLAY,function(a,b)return a.fileName>b.fileName end)
|
||||
table.sort(REPLAY,function(a,b) return a.fileName>b.fileName end)
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Initialize Data: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i])end
|
||||
for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i]) end
|
||||
|
||||
--Launch testing task if launch param received
|
||||
if TABLE.find(arg,'--test')then
|
||||
if TABLE.find(arg,'--test') then
|
||||
TASK.new(function()
|
||||
while not LOADED do coroutine.yield()end
|
||||
while not LOADED do coroutine.yield() end
|
||||
|
||||
LOG("\27[92m\27[1mAutomatic Test Started\27[0m")
|
||||
BGM.setVol(0)SFX.setVol(0)
|
||||
@@ -675,7 +675,7 @@ if TABLE.find(arg,'--test')then
|
||||
TEST.yieldUntilNextScene()
|
||||
|
||||
for k,mode in next,MODES do
|
||||
if k~='netBattle'then
|
||||
if k~='netBattle' then
|
||||
LOG("Scanning mode: "..mode.name)
|
||||
loadGame(mode.name,true)
|
||||
TEST.yieldUntilNextScene()
|
||||
@@ -690,7 +690,7 @@ if TABLE.find(arg,'--test')then
|
||||
TASK.new(function()
|
||||
while true do
|
||||
coroutine.yield()
|
||||
if Z.getErr(1)then break end
|
||||
if Z.getErr(1) then break end
|
||||
end
|
||||
LOG("\27[91m\27[1mAutomatic Test Failed :(\27[0m\nThe error message is:\n"..table.concat(Z.getErr(1).mes,"\n").."\27[91m\nAborting\27[0m")
|
||||
TEST.yieldN(60)
|
||||
|
||||
@@ -175,7 +175,7 @@ do
|
||||
if P.gameEnv.ospin then
|
||||
local x,y=P.curX,P.curY
|
||||
local C=P.cur
|
||||
if y==P.ghoY and((P:solid(x-1,y)or P:solid(x-1,y+1)))and(P:solid(x+2,y)or P:solid(x+2,y+1))then
|
||||
if y==P.ghoY and ((P:solid(x-1,y) or P:solid(x-1,y+1))) and (P:solid(x+2,y) or P:solid(x+2,y+1)) then
|
||||
if P.sound then
|
||||
SFX.play('rotatekick',nil,P:getCenterX()*.15)
|
||||
end
|
||||
@@ -186,15 +186,15 @@ do
|
||||
return end
|
||||
for i=1,#OspinList do
|
||||
local L=OspinList[i]
|
||||
if C.spinSeq==L[1]then
|
||||
if C.spinSeq==L[1] then
|
||||
local id,dir=L[2],L[3]
|
||||
local bk=BLOCKS[id][dir]
|
||||
x,y=P.curX+L[4],P.curY+L[5]
|
||||
if
|
||||
not P:ifoverlap(bk,x,y)and(
|
||||
L[6]>0 or(P:ifoverlap(bk,x-1,y)and P:ifoverlap(bk,x+1,y))
|
||||
)and(
|
||||
L[6]==2 or(P:ifoverlap(bk,x,y-1)and P:ifoverlap(bk,x,y+1))
|
||||
not P:ifoverlap(bk,x,y) and (
|
||||
L[6]>0 or (P:ifoverlap(bk,x-1,y) and P:ifoverlap(bk,x+1,y))
|
||||
) and (
|
||||
L[6]==2 or (P:ifoverlap(bk,x,y-1) and P:ifoverlap(bk,x,y+1))
|
||||
)
|
||||
then
|
||||
C.id=id
|
||||
@@ -329,13 +329,13 @@ do
|
||||
[31]={'+0+0','+0-1','+1+0'},
|
||||
},--W
|
||||
function(P,d)
|
||||
if P.type=='human'then
|
||||
if P.type=='human' then
|
||||
SFX.play('rotate',nil,P:getCenterX()*.15)
|
||||
end
|
||||
local kickData=XspinList[d]
|
||||
for test=1,#kickData do
|
||||
local x,y=P.curX+kickData[test][1],P.curY+kickData[test][2]
|
||||
if not P:ifoverlap(P.cur.bk,x,y)then
|
||||
if not P:ifoverlap(P.cur.bk,x,y) then
|
||||
P.curX,P.curY=x,y
|
||||
P.spinLast=1
|
||||
P:freshBlock('move')
|
||||
@@ -488,8 +488,8 @@ do
|
||||
}--I
|
||||
}
|
||||
}
|
||||
for i=2,5 do SRS.kickTable[i]=SRS.kickTable[1]end
|
||||
for i=8,29 do SRS.kickTable[i]=SRS.kickTable[1]end
|
||||
for i=2,5 do SRS.kickTable[i]=SRS.kickTable[1] end
|
||||
for i=8,29 do SRS.kickTable[i]=SRS.kickTable[1] end
|
||||
end
|
||||
|
||||
local SRS_plus
|
||||
@@ -541,8 +541,8 @@ do
|
||||
}--I
|
||||
}
|
||||
}
|
||||
for i=2,5 do SRS_plus.kickTable[i]=SRS_plus.kickTable[1]end
|
||||
for i=8,29 do SRS_plus.kickTable[i]=SRS_plus.kickTable[1]end
|
||||
for i=2,5 do SRS_plus.kickTable[i]=SRS_plus.kickTable[1] end
|
||||
for i=8,29 do SRS_plus.kickTable[i]=SRS_plus.kickTable[1] end
|
||||
end
|
||||
|
||||
local SRS_X
|
||||
@@ -579,8 +579,8 @@ do
|
||||
false,--I
|
||||
}
|
||||
}
|
||||
for i=2,5 do SRS_X.kickTable[i]=SRS_X.kickTable[1]end
|
||||
for i=7,29 do SRS_X.kickTable[i]=TRS.kickTable[i]end
|
||||
for i=2,5 do SRS_X.kickTable[i]=SRS_X.kickTable[1] end
|
||||
for i=7,29 do SRS_X.kickTable[i]=TRS.kickTable[i] end
|
||||
SRS_X.kickTable[10]=SRS_X.kickTable[1]--P
|
||||
SRS_X.kickTable[11]=SRS_X.kickTable[1]--Q
|
||||
end
|
||||
@@ -628,8 +628,8 @@ do
|
||||
if i==6 or i==18 then
|
||||
a,b=b,a
|
||||
end
|
||||
list[i][01]=a;list[i][10]=b;list[i][03]=b;list[i][30]=a
|
||||
list[i][12]=a;list[i][21]=b;list[i][32]=b;list[i][23]=a
|
||||
list[i][01]=a; list[i][10]=b; list[i][03]=b; list[i][30]=a
|
||||
list[i][12]=a; list[i][21]=b; list[i][32]=b; list[i][23]=a
|
||||
end
|
||||
BiRS={
|
||||
centerTex=GC.DO{10,10,
|
||||
@@ -653,9 +653,9 @@ do
|
||||
end
|
||||
local dx,dy=0,0 do
|
||||
local pressing=P.keyPressing
|
||||
if pressing[1]and P:ifoverlap(C.bk,P.curX-1,P.curY)then dx=dx-1 end
|
||||
if pressing[2]and P:ifoverlap(C.bk,P.curX+1,P.curY)then dx=dx+1 end
|
||||
if pressing[7]and P:ifoverlap(C.bk,P.curX,P.curY-1)then dy= -1 end
|
||||
if pressing[1] and P:ifoverlap(C.bk,P.curX-1,P.curY) then dx=dx-1 end
|
||||
if pressing[2] and P:ifoverlap(C.bk,P.curX+1,P.curY) then dx=dx+1 end
|
||||
if pressing[7] and P:ifoverlap(C.bk,P.curX,P.curY-1) then dy= -1 end
|
||||
end
|
||||
while true do
|
||||
for test=1,#kickList do
|
||||
@@ -666,7 +666,7 @@ do
|
||||
(P.freshTime>0 or fdy<=0)
|
||||
then
|
||||
local x,y=ix+fdx,iy+fdy
|
||||
if not P:ifoverlap(icb,x,y)then
|
||||
if not P:ifoverlap(icb,x,y) then
|
||||
if P.gameEnv.moveFX and P.gameEnv.block then
|
||||
P:createMoveFX()
|
||||
end
|
||||
@@ -685,7 +685,7 @@ do
|
||||
local sfx
|
||||
if ifpre then
|
||||
sfx='prerotate'
|
||||
elseif P:ifoverlap(icb,x,y+1)and P:ifoverlap(icb,x-1,y)and P:ifoverlap(icb,x+1,y)then
|
||||
elseif P:ifoverlap(icb,x,y+1) and P:ifoverlap(icb,x-1,y) and P:ifoverlap(icb,x+1,y) then
|
||||
sfx='rotatekick'
|
||||
P:_rotateField(d)
|
||||
else
|
||||
@@ -1009,15 +1009,15 @@ local RSlist={
|
||||
}
|
||||
|
||||
for _,rs in next,RSlist do
|
||||
if not rs.centerDisp then rs.centerDisp=TABLE.new(true,29)end
|
||||
if not rs.centerDisp then rs.centerDisp=TABLE.new(true,29) end
|
||||
if not rs.centerPos then rs.centerPos=defaultCenterPos end
|
||||
if not rs.centerTex then rs.centerTex=defaultCenterTex end
|
||||
|
||||
--Make all string vec to the same table vec
|
||||
for _,set in next,rs.kickTable do
|
||||
if type(set)=='table'then
|
||||
if type(set)=='table' then
|
||||
for _,list in next,set do
|
||||
if type(list[1])=='string'then
|
||||
if type(list[1])=='string' then
|
||||
_strToVec(list)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -43,8 +43,8 @@ function back.draw()
|
||||
local M=mino[i]
|
||||
local b=M.block
|
||||
for y=1,#b do
|
||||
for x=1,#b[1]do
|
||||
if b[y][x]then
|
||||
for x=1,#b[1] do
|
||||
if b[y][x] then
|
||||
gc_draw(M.texture,M.x+(x-1)*30*M.k,M.y-y*30*M.k,nil,M.k)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -61,7 +61,7 @@ function back.draw()
|
||||
|
||||
gc_setLineWidth(6)
|
||||
gc_setColor(.8,.9,1,.3)
|
||||
for i=1,#SVG_TITLE_FAN do gc_polygon('line',SVG_TITLE_FAN[i])end
|
||||
for i=1,#SVG_TITLE_FAN do gc_polygon('line',SVG_TITLE_FAN[i]) end
|
||||
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(1,.5,.7,.3)
|
||||
|
||||
@@ -37,7 +37,7 @@ function back.update(dt)
|
||||
local x,y,color=F.x,F.y,F.color
|
||||
if F.big then
|
||||
SFX.play('fall',.5)
|
||||
for _=1,rnd(62,126)do
|
||||
for _=1,rnd(62,126) do
|
||||
ins(particle,{
|
||||
x=x,y=y,
|
||||
color=color,
|
||||
@@ -48,7 +48,7 @@ function back.update(dt)
|
||||
end
|
||||
else
|
||||
SFX.play('clear_1',.4)
|
||||
for _=1,rnd(16,26)do
|
||||
for _=1,rnd(16,26) do
|
||||
ins(particle,{
|
||||
x=x,y=y,
|
||||
color=color,
|
||||
|
||||
@@ -9,7 +9,7 @@ local ceil=math.ceil
|
||||
local back={}
|
||||
|
||||
local t
|
||||
local matrixT={}for i=1,50 do matrixT[i]={}for j=1,50 do matrixT[i][j]=love.math.noise(i,j)+2 end end
|
||||
local matrixT={} for i=1,50 do matrixT[i]={} for j=1,50 do matrixT[i][j]=love.math.noise(i,j)+2 end end
|
||||
function back.init()
|
||||
t=math.random()*2600
|
||||
end
|
||||
@@ -21,7 +21,7 @@ function back.draw()
|
||||
local k=SCR.k
|
||||
gc_scale(k)
|
||||
local Y=ceil(SCR.h/80/k)
|
||||
for x=1,ceil(SCR.w/80/k)do
|
||||
for x=1,ceil(SCR.w/80/k) do
|
||||
for y=1,Y do
|
||||
gc_setColor(1,1,1,sin(x+matrixT[x][y]*t)*.04+.04)
|
||||
gc_rectangle('fill',80*x,80*y,-80,-80)
|
||||
|
||||
@@ -32,7 +32,7 @@ function back.update(dt)
|
||||
end
|
||||
function back.draw()
|
||||
gc.clear(.08,.08,.084)
|
||||
if not stars[1]then return end
|
||||
if not stars[1] then return end
|
||||
gc.translate(-10,-10)
|
||||
gc.setColor(1,1,1,.6)
|
||||
for i=1,1260,5 do
|
||||
|
||||
@@ -38,8 +38,8 @@ local FCL={
|
||||
local LclearScore={[0]=0,-200,-150,-100,200}
|
||||
local HclearScore={[0]=0,100,140,200,500}
|
||||
local function _ifoverlapAI(f,bk,x,y)
|
||||
for i=1,#bk do for j=1,#bk[1]do
|
||||
if f[y+i-1]and bk[i][j]and f[y+i-1][x+j-1]>0 then
|
||||
for i=1,#bk do for j=1,#bk[1] do
|
||||
if f[y+i-1] and bk[i][j] and f[y+i-1][x+j-1]>0 then
|
||||
return true
|
||||
end
|
||||
end end
|
||||
@@ -157,28 +157,28 @@ function bot_9s.thread(bot)
|
||||
if ifhold==0 then
|
||||
bn=P.cur and P.cur.id
|
||||
else
|
||||
bn=P.holdQueue[1]and P.holdQueue[1].id or P.nextQueue[1]and P.nextQueue[1].id
|
||||
bn=P.holdQueue[1] and P.holdQueue[1].id or P.nextQueue[1] and P.nextQueue[1].id
|
||||
end
|
||||
if bn then
|
||||
for dir=0,dirCount[bn]do--Each dir
|
||||
for dir=0,dirCount[bn] do--Each dir
|
||||
local cb=BLOCKS[bn][dir]
|
||||
for cx=1,11-#cb[1]do--Each pos
|
||||
for cx=1,11-#cb[1] do--Each pos
|
||||
local cy=#Tfield+1
|
||||
|
||||
--Move to bottom
|
||||
while cy>1 and not _ifoverlapAI(Tfield,cb,cx,cy-1)do
|
||||
while cy>1 and not _ifoverlapAI(Tfield,cb,cx,cy-1) do
|
||||
cy=cy-1
|
||||
end
|
||||
|
||||
--Simulate lock
|
||||
for i=1,#cb do
|
||||
local y=cy+i-1
|
||||
if not Tfield[y]then
|
||||
if not Tfield[y] then
|
||||
Tfield[y]=getRow(0)
|
||||
end
|
||||
local L=Tfield[y]
|
||||
for j=1,#cb[1]do
|
||||
if cb[i][j]then
|
||||
for j=1,#cb[1] do
|
||||
if cb[i][j] then
|
||||
L[cx+j-1]=1
|
||||
end
|
||||
end
|
||||
|
||||
@@ -21,7 +21,7 @@ function bot_cc:checkDest(b2b,atk,exblock,yomi)
|
||||
local CB=self.P.cur.bk
|
||||
for k=1,#dest,2 do
|
||||
local r=CB[dest[k+1]-self.P.curY+2]
|
||||
if not r or not r[dest[k]-self.P.curX+2]then
|
||||
if not r or not r[dest[k]-self.P.curX+2] then
|
||||
print('wrong place')
|
||||
self:lockWrongPlace()
|
||||
self.P.destFX=nil
|
||||
@@ -76,7 +76,7 @@ function bot_cc:thread()
|
||||
if hold then--Hold
|
||||
keys[1]=8
|
||||
end
|
||||
while move[1]do
|
||||
while move[1] do
|
||||
local m=rem(move,1)
|
||||
if m<4 then
|
||||
ins(keys,m+1)
|
||||
@@ -105,7 +105,7 @@ function bot_cc:updateField()
|
||||
end end
|
||||
while i<=400 do F[i],i=false,i+1 end
|
||||
local y = P:getNextSpawn()-1
|
||||
if not pcall(self.ccBot.reset,self.ccBot,F,P.b2b,P.combo,P.stat.pc,P.stat.row,y)then
|
||||
if not pcall(self.ccBot.reset,self.ccBot,F,P.b2b,P.combo,P.stat.pc,P.stat.row,y) then
|
||||
print("CC is dead ("..P.id..")","error")
|
||||
for y=#F0,1,-1 do
|
||||
local s=""
|
||||
|
||||
@@ -14,9 +14,9 @@ function baseBot.update(bot)
|
||||
local keys=bot.keys
|
||||
if P.control and P.cur then
|
||||
bot.delay=bot.delay-1
|
||||
if not keys[1]then
|
||||
if not keys[1] then
|
||||
if bot.runningThread then
|
||||
if not pcall(bot.runningThread)then
|
||||
if not pcall(bot.runningThread) then
|
||||
bot.runningThread=false
|
||||
end
|
||||
else
|
||||
@@ -61,17 +61,17 @@ local AISpeed={60,50,42,34,27,21,16,12,9,6}
|
||||
}
|
||||
]]
|
||||
function BOT.template(arg)
|
||||
if arg.type=='CC'then
|
||||
if arg.type=='CC' then
|
||||
return{
|
||||
type='CC',
|
||||
next=arg.next,
|
||||
hold=arg.hold,
|
||||
delay=AISpeed[arg.speedLV],
|
||||
node=arg.node,
|
||||
bag=(arg.randomizer or'bag')=='bag',
|
||||
bag=(arg.randomizer or 'bag')=='bag',
|
||||
_20G=arg._20G,
|
||||
}
|
||||
elseif arg.type=='9S'then
|
||||
elseif arg.type=='9S' then
|
||||
return{
|
||||
type='9S',
|
||||
delay=math.floor(AISpeed[arg.speedLV]),
|
||||
@@ -82,7 +82,7 @@ end
|
||||
|
||||
function BOT.new(P,data)
|
||||
local bot={P=P,data=data}
|
||||
if data.type=="CC"then
|
||||
if data.type=="CC" then
|
||||
P:setRS('TRS')
|
||||
bot.keys={}
|
||||
bot.bufferedNexts={}
|
||||
@@ -107,8 +107,8 @@ function BOT.new(P,data)
|
||||
local cc_lua=require"parts.bot.bot_cc"
|
||||
setmetatable(bot,{__index=function(self,k)
|
||||
return
|
||||
self.ccBot[k]and function(_,...)self.ccBot[k](self.ccBot,...)end or
|
||||
cc_lua[k]and function(_,...)cc_lua[k](self,...)end or
|
||||
self.ccBot[k] and function(_,...)self.ccBot[k](self.ccBot,...) end or
|
||||
cc_lua[k] and function(_,...)cc_lua[k](self,...) end or
|
||||
assert(baseBot[k],"No CC action called "..k)
|
||||
end})
|
||||
|
||||
@@ -127,7 +127,7 @@ function BOT.new(P,data)
|
||||
end
|
||||
bot.runningThread=coroutine.wrap(cc_lua.thread)
|
||||
bot.runningThread(bot)
|
||||
else--if data.type=="9S"then--9s or else
|
||||
else--if data.type=="9S" then--9s or else
|
||||
TABLE.cover(baseBot,bot)
|
||||
TABLE.cover(require"parts.bot.bot_9s",bot)
|
||||
P:setRS('TRS')
|
||||
|
||||
@@ -18,7 +18,7 @@ function DATA.copySequence()
|
||||
|
||||
local count=1
|
||||
for i=1,#BAG+1 do
|
||||
if BAG[i+1]~=BAG[i]or count==64 then
|
||||
if BAG[i+1]~=BAG[i] or count==64 then
|
||||
str=str..char(96+BAG[i])
|
||||
if count>1 then
|
||||
str=str..char(32+count)
|
||||
@@ -67,7 +67,7 @@ local fieldMeta={__index=function(self,h)
|
||||
return self[h]
|
||||
end}
|
||||
function DATA.newBoard(f)--Generate a new board
|
||||
return setmetatable(f and TABLE.shift(f)or{},fieldMeta)
|
||||
return setmetatable(f and TABLE.shift(f) or{},fieldMeta)
|
||||
end
|
||||
function DATA.copyBoard(page)--Copy the [page] board
|
||||
local F=FIELD[page or 1]
|
||||
@@ -95,7 +95,7 @@ function DATA.pasteBoard(str,page)--Paste [str] data to [page] board
|
||||
if not page then
|
||||
page=1
|
||||
end
|
||||
if not FIELD[page]then
|
||||
if not FIELD[page] then
|
||||
FIELD[page]=DATA.newBoard()
|
||||
end
|
||||
local F=FIELD[page]
|
||||
@@ -158,7 +158,7 @@ function DATA.copyMission()
|
||||
|
||||
local count=1
|
||||
for i=1,#MISSION+1 do
|
||||
if MISSION[i+1]~=MISSION[i]or count==13 then
|
||||
if MISSION[i+1]~=MISSION[i] or count==13 then
|
||||
_=33+MISSION[i]
|
||||
str=str..char(_)
|
||||
if count>1 then
|
||||
@@ -186,7 +186,7 @@ function DATA.pasteMission(str)
|
||||
end
|
||||
else
|
||||
if b>=34 and b<=114 then
|
||||
if ENUM_MISSION[reg]then
|
||||
if ENUM_MISSION[reg] then
|
||||
ins(MISSION,reg)
|
||||
reg=b-33
|
||||
else
|
||||
@@ -211,8 +211,8 @@ function DATA.copyQuestArgs()
|
||||
local ENV=CUSTOMENV
|
||||
local str=""..
|
||||
ENV.holdCount..
|
||||
(ENV.ospin and"O"or"Z")..
|
||||
(ENV.missionKill and"M"or"Z")..
|
||||
(ENV.ospin and "O" or "Z")..
|
||||
(ENV.missionKill and "M" or "Z")..
|
||||
ENV.sequence
|
||||
return str
|
||||
end
|
||||
@@ -252,8 +252,8 @@ function DATA.dumpRecording(list,ptr)
|
||||
local out=""
|
||||
local buffer,buffer2=""
|
||||
if not ptr then ptr=1 end
|
||||
local prevFrm=list[ptr-2]or 0
|
||||
while list[ptr]do
|
||||
local prevFrm=list[ptr-2] or 0
|
||||
while list[ptr] do
|
||||
--Flush buffer
|
||||
if #buffer>10 then
|
||||
out=out..buffer
|
||||
@@ -298,7 +298,7 @@ function DATA.pumpRecording(str,L)
|
||||
local len=#str
|
||||
local p=1
|
||||
|
||||
local curFrm=L[#L-1]or 0
|
||||
local curFrm=L[#L-1] or 0
|
||||
local code
|
||||
while p<=len do
|
||||
--Read delta time
|
||||
@@ -338,7 +338,7 @@ do--function DATA.saveReplay()
|
||||
function DATA.saveReplay()
|
||||
--Filtering modes that cannot be saved
|
||||
for _,v in next,noRecList do
|
||||
if GAME.curModeName:find(v)then
|
||||
if GAME.curModeName:find(v) then
|
||||
MES.new('error',"Cannot save recording of this mode now!")
|
||||
return
|
||||
end
|
||||
@@ -346,7 +346,7 @@ do--function DATA.saveReplay()
|
||||
|
||||
--Write file
|
||||
local fileName=os.date("replay/%Y_%m_%d_%H%M%S.rep")
|
||||
if not love.filesystem.getInfo(fileName)then
|
||||
if not love.filesystem.getInfo(fileName) then
|
||||
love.filesystem.write(fileName,
|
||||
love.data.compress('string','zlib',
|
||||
JSON.encode{
|
||||
@@ -378,7 +378,7 @@ end
|
||||
function DATA.parseReplayData(fileName,fileData,ifFull)
|
||||
local success,metaData,rep
|
||||
|
||||
if not(fileData and #fileData>0)then goto BREAK_cannotParse end
|
||||
if not (fileData and #fileData>0) then goto BREAK_cannotParse end
|
||||
|
||||
--Decompress file
|
||||
success,fileData=pcall(love.data.decompress,'string','zlib',fileData)
|
||||
@@ -390,8 +390,8 @@ function DATA.parseReplayData(fileName,fileData,ifFull)
|
||||
if not metaData then goto BREAK_cannotParse end
|
||||
|
||||
--Convert ancient replays
|
||||
metaData.mode=MODE_UPDATE_MAP[metaData.mode]or metaData.mode
|
||||
if not MODES[metaData.mode]then goto BREAK_cannotParse end
|
||||
metaData.mode=MODE_UPDATE_MAP[metaData.mode] or metaData.mode
|
||||
if not MODES[metaData.mode] then goto BREAK_cannotParse end
|
||||
|
||||
--Create replay object
|
||||
rep={
|
||||
|
||||
@@ -3,7 +3,7 @@ return{
|
||||
if P.garbageBeneath==0 then
|
||||
local D=P.modeData
|
||||
D.finished=D.finished+1
|
||||
if FIELD[D.finished+1]then
|
||||
if FIELD[D.finished+1] then
|
||||
P.waiting=26
|
||||
for i=#P.field,1,-1 do
|
||||
P.field[i],P.visTime[i]=nil
|
||||
|
||||
@@ -13,7 +13,7 @@ return{
|
||||
end
|
||||
end
|
||||
for i=1,#PLY_ALIVE do
|
||||
if PLY_ALIVE[i].sid==(minMaxID==1e99 and minID or minMaxID)then
|
||||
if PLY_ALIVE[i].sid==(minMaxID==1e99 and minID or minMaxID) then
|
||||
PLY_ALIVE[i].control=true
|
||||
return
|
||||
end
|
||||
|
||||
@@ -13,7 +13,7 @@ return{
|
||||
end
|
||||
end
|
||||
for i=1,#PLY_ALIVE do
|
||||
if PLY_ALIVE[i].sid==(minMaxID==1e99 and minID or minMaxID)then
|
||||
if PLY_ALIVE[i].sid==(minMaxID==1e99 and minID or minMaxID) then
|
||||
PLY_ALIVE[i].control=true
|
||||
return
|
||||
end
|
||||
|
||||
@@ -16,8 +16,8 @@ return{
|
||||
D.counter=D.counter+1
|
||||
local t=
|
||||
D.wave<=60 and 240-2*D.wave or
|
||||
D.wave<=120 and 120-(D.wave-60)or
|
||||
D.wave<=180 and math.floor(60-(D.wave-120)*.5)or
|
||||
D.wave<=120 and 120-(D.wave-60) or
|
||||
D.wave<=180 and math.floor(60-(D.wave-120)*.5) or
|
||||
30
|
||||
if D.counter>=t then
|
||||
D.counter=0
|
||||
|
||||
@@ -10,7 +10,7 @@ return{
|
||||
if P.control then
|
||||
local D=P.modeData
|
||||
D.timer=D.timer+1
|
||||
if D.timer>=math.max(90,180-D.wave)then
|
||||
if D.timer>=math.max(90,180-D.wave) then
|
||||
P:garbageRise(21,1,P:getHolePos())
|
||||
P.stat.recv=P.stat.recv+1
|
||||
D.timer=0
|
||||
|
||||
@@ -10,7 +10,7 @@ return{
|
||||
if P.control then
|
||||
local D=P.modeData
|
||||
D.timer=D.timer+1
|
||||
if D.timer>=math.max(30,80-.3*D.wave)then
|
||||
if D.timer>=math.max(30,80-.3*D.wave) then
|
||||
P:garbageRise(20+D.wave%5,1,P:getHolePos())
|
||||
P.stat.recv=P.stat.recv+1
|
||||
D.timer=0
|
||||
|
||||
@@ -14,11 +14,11 @@ return{
|
||||
hook_drop=function(P)
|
||||
local flag
|
||||
local l=P.lastPiece
|
||||
if P.combo>1 then flag=true;P:showText("2x",0,-220,40,'flicker',.3)end
|
||||
if l.spin then flag=true;P:showText("spin",0,-180,40,'flicker',.3)end
|
||||
if l.row>1 then flag=true;P:showText("1+",0,-140,40,'flicker',.3)end
|
||||
if l.hpc then flag=true;P:showText("HPC",0,-100,40,'flicker',.3)end
|
||||
if l.pc then P:showText("PC",0,-90,100,'beat',.5)end
|
||||
if P.combo>1 then flag=true;P:showText("2x",0,-220,40,'flicker',.3) end
|
||||
if l.spin then flag=true;P:showText("spin",0,-180,40,'flicker',.3) end
|
||||
if l.row>1 then flag=true;P:showText("1+",0,-140,40,'flicker',.3) end
|
||||
if l.hpc then flag=true;P:showText("HPC",0,-100,40,'flicker',.3) end
|
||||
if l.pc then P:showText("PC",0,-90,100,'beat',.5) end
|
||||
if flag then
|
||||
P:lose()
|
||||
else
|
||||
|
||||
@@ -32,7 +32,7 @@ return{
|
||||
if s~=3 then E.fall=E.fall-1 end
|
||||
D.target=D.target+100
|
||||
elseif s<10 then
|
||||
if s==5 then BGM.play('distortion')end
|
||||
if s==5 then BGM.play('distortion') end
|
||||
P:stageComplete(s)
|
||||
if s==4 or s==7 then E.das=E.das-1 end
|
||||
if s%3==0 then E.lock=E.lock-1
|
||||
|
||||
@@ -204,7 +204,7 @@ return{
|
||||
|
||||
P.gameEnv.drop=getGrav(spd_lvl)
|
||||
|
||||
if(P.gameEnv.drop==0) then
|
||||
if (P.gameEnv.drop==0) then
|
||||
P:set20G(true)
|
||||
end
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ return{
|
||||
if c==0 and D.pt%100==99 then
|
||||
if D.pt<1000 then
|
||||
hidetimer=0-inv_wait[(P.modeData.pt/100-(P.modeData.pt%100)/100)+1]
|
||||
if c>0 then hidetimer=hidetimer-inv_fall[(P.modeData.pt/100-(P.modeData.pt%100)/100)+1]end
|
||||
if c>0 then hidetimer=hidetimer-inv_fall[(P.modeData.pt/100-(P.modeData.pt%100)/100)+1] end
|
||||
end
|
||||
return
|
||||
end
|
||||
@@ -35,7 +35,7 @@ return{
|
||||
held=false
|
||||
if D.pt<1000 then
|
||||
hidetimer=0-inv_wait[(P.modeData.pt/100-(P.modeData.pt%100)/100)+1]
|
||||
if c>0 then hidetimer=hidetimer-inv_fall[(P.modeData.pt/100-(P.modeData.pt%100)/100)+1]end
|
||||
if c>0 then hidetimer=hidetimer-inv_fall[(P.modeData.pt/100-(P.modeData.pt%100)/100)+1] end
|
||||
end
|
||||
|
||||
if D.pt%100==99 then
|
||||
@@ -78,7 +78,7 @@ return{
|
||||
held=true
|
||||
end
|
||||
hidetimer=hidetimer+1
|
||||
if hidetimer>inv_hide[(P.modeData.pt/100-(P.modeData.pt%100)/100)+1]then
|
||||
if hidetimer>inv_hide[(P.modeData.pt/100-(P.modeData.pt%100)/100)+1] then
|
||||
P.gameEnv.block=false
|
||||
else
|
||||
P.gameEnv.block=true
|
||||
|
||||
@@ -36,7 +36,7 @@ return
|
||||
SFX.play('reach')
|
||||
elseif T==26 then--Stage 3: dig to bottom
|
||||
P:stageComplete(3)
|
||||
if not P.holdQueue[1]then--1 up if ban hold
|
||||
if not P.holdQueue[1] then--1 up if ban hold
|
||||
P.life=P.life+1
|
||||
end
|
||||
P.waiting=45
|
||||
@@ -44,7 +44,7 @@ return
|
||||
ENV.skin[3],ENV.skin[4]=ENV.skin[4],ENV.skin[3]
|
||||
|
||||
for i=1,10 do
|
||||
if P.field[i]then
|
||||
if P.field[i] then
|
||||
for j=1,10 do
|
||||
if P.field[i][j]>0 then
|
||||
P.field[i][j]=17
|
||||
@@ -137,7 +137,7 @@ return
|
||||
elseif T==259 then--Stage 9: ending
|
||||
P:stageComplete(9)
|
||||
P.life=P.life+1
|
||||
for i=1,7 do ENV.skin[i]=P.holeRND:random(16)end
|
||||
for i=1,7 do ENV.skin[i]=P.holeRND:random(16) end
|
||||
|
||||
P:setInvisible(40)
|
||||
ENV.lock=15
|
||||
|
||||
@@ -11,7 +11,7 @@ local function task_PC(P)
|
||||
P:pushNextList(L,symmetry)
|
||||
|
||||
P.control=false
|
||||
if P.frameRun>180 then for _=1,26 do coroutine.yield()end end
|
||||
if P.frameRun>180 then for _=1,26 do coroutine.yield() end end
|
||||
P.control=true
|
||||
|
||||
local base=PCbase[difficulty]
|
||||
@@ -31,9 +31,9 @@ local function _check(P)
|
||||
|
||||
if P.stat.pc%4==0 and P.stat.pc>0 and P.stat.pc<=40 then
|
||||
local s=P.stat.pc/4
|
||||
P.gameEnv.drop=pc_drop[s]or 10
|
||||
P.gameEnv.lock=pc_lock[s]or 25
|
||||
P.gameEnv.fall=pc_fall[s]or 4
|
||||
P.gameEnv.drop=pc_drop[s] or 10
|
||||
P.gameEnv.lock=pc_lock[s] or 25
|
||||
P.gameEnv.fall=pc_fall[s] or 4
|
||||
if s==10 then
|
||||
P:_showText(text.maxspeed,0,-140,100,'appear',.6)
|
||||
end
|
||||
|
||||
@@ -8,13 +8,13 @@ local PCtype={
|
||||
1,2,3,
|
||||
}
|
||||
local function task_PC(P)
|
||||
local difficulty=PCtype[P.stat.pc+1]or 3
|
||||
local difficulty=PCtype[P.stat.pc+1] or 3
|
||||
local L=PClist[difficulty][P.holeRND:random(#PClist[difficulty])]
|
||||
local symmetry=P.holeRND:random()>.5
|
||||
P:pushNextList(L,symmetry)
|
||||
|
||||
P.control=false
|
||||
if P.frameRun>180 then for _=1,26 do coroutine.yield()end end
|
||||
if P.frameRun>180 then for _=1,26 do coroutine.yield() end end
|
||||
P.control=true
|
||||
|
||||
local base=PCbase[difficulty]
|
||||
|
||||
@@ -46,7 +46,7 @@ local function generateGuide(num)
|
||||
end
|
||||
|
||||
return{
|
||||
fkey1=function(P)P.modeData.showGuide=not P.modeData.showGuide end,
|
||||
fkey1=function(P) P.modeData.showGuide=not P.modeData.showGuide end,
|
||||
mesDisp=function(P)
|
||||
mText(TEXTOBJ.grade,63,190)
|
||||
mText(TEXTOBJ.line,63,310)
|
||||
|
||||
@@ -9,16 +9,16 @@ return{
|
||||
task=function(P)
|
||||
coroutine.yield()
|
||||
while true do
|
||||
for _=1,P.holeRND:random(40,200)do coroutine.yield()end
|
||||
for _=1,P.holeRND:random(40,200) do coroutine.yield() end
|
||||
local r=P.holeRND:random(7)
|
||||
if r==1 then
|
||||
if P.cur and not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then
|
||||
if P.cur and not P:ifoverlap(P.cur.bk,P.curX-1,P.curY) then
|
||||
P:createMoveFX('left')
|
||||
P.curX=P.curX-1
|
||||
P:freshBlock('move')
|
||||
end
|
||||
elseif r==2 then
|
||||
if P.cur and not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then
|
||||
if P.cur and not P:ifoverlap(P.cur.bk,P.curX-1,P.curY) then
|
||||
P:createMoveFX('left')
|
||||
P.curX=P.curX-1
|
||||
P:freshBlock('move')
|
||||
|
||||
@@ -19,7 +19,7 @@ return{
|
||||
for y=1,#F do
|
||||
local l=F[y]
|
||||
for x=1,5 do
|
||||
if l[x]>0 and l[11-x]>0 and oppo[l[x]]~=l[11-x]then
|
||||
if l[x]>0 and l[11-x]>0 and oppo[l[x]]~=l[11-x] then
|
||||
P:lose()
|
||||
return
|
||||
end
|
||||
|
||||
@@ -10,7 +10,7 @@ return{
|
||||
if P.control then
|
||||
local D=P.modeData
|
||||
D.timer=D.timer+1
|
||||
if D.timer>=math.max(60,150-2*D.wave)and P.atkBufferSum<4 then
|
||||
if D.timer>=math.max(60,150-2*D.wave) and P.atkBufferSum<4 then
|
||||
if D.wave==100 then
|
||||
P:win('finish')
|
||||
else
|
||||
|
||||
@@ -10,7 +10,7 @@ return{
|
||||
if P.control then
|
||||
local D=P.modeData
|
||||
D.timer=D.timer+1
|
||||
if D.timer>=math.max(60,180-2*D.wave)and P.atkBufferSum<15 then
|
||||
if D.timer>=math.max(60,180-2*D.wave) and P.atkBufferSum<15 then
|
||||
if D.wave==90 then
|
||||
P:win('finish')
|
||||
else
|
||||
|
||||
@@ -10,7 +10,7 @@ return{
|
||||
if P.control then
|
||||
local D=P.modeData
|
||||
D.timer=D.timer+1
|
||||
if D.timer>=math.max(60,150-D.wave)and P.atkBufferSum<20 then
|
||||
if D.timer>=math.max(60,150-D.wave) and P.atkBufferSum<20 then
|
||||
if D.wave==110 then
|
||||
P:win('finish')
|
||||
else
|
||||
|
||||
@@ -10,15 +10,15 @@ return{
|
||||
if P.control then
|
||||
local D=P.modeData
|
||||
D.timer=D.timer+1
|
||||
if D.timer>=math.max(90,180-2*D.wave)and P.atkBufferSum<8 then
|
||||
if D.timer>=math.max(90,180-2*D.wave) and P.atkBufferSum<8 then
|
||||
if D.wave==80 then
|
||||
P:win('finish')
|
||||
else
|
||||
local d=D.wave+1
|
||||
table.insert(P.atkBuffer,
|
||||
d%4==0 and{line=generateLine(P.holeRND:random(10)),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1}or
|
||||
d%4==1 and{line=generateLine(P.holeRND:random(10)),amount=2,countdown=70,cd0=70,time=0,sent=false,lv=1}or
|
||||
d%4==2 and{line=generateLine(P.holeRND:random(10)),amount=3,countdown=80,cd0=80,time=0,sent=false,lv=2}or
|
||||
d%4==0 and{line=generateLine(P.holeRND:random(10)),amount=1,countdown=60,cd0=60,time=0,sent=false,lv=1} or
|
||||
d%4==1 and{line=generateLine(P.holeRND:random(10)),amount=2,countdown=70,cd0=70,time=0,sent=false,lv=1} or
|
||||
d%4==2 and{line=generateLine(P.holeRND:random(10)),amount=3,countdown=80,cd0=80,time=0,sent=false,lv=2} or
|
||||
d%4==3 and{line=generateLine(P.holeRND:random(10)),amount=4,countdown=90,cd0=90,time=0,sent=false,lv=3}
|
||||
)
|
||||
P.atkBufferSum=P.atkBufferSum+d%4+1
|
||||
|
||||
@@ -10,7 +10,7 @@ return{
|
||||
if P.control then
|
||||
local D=P.modeData
|
||||
D.timer=D.timer+1
|
||||
if D.timer>=math.max(300,600-10*D.wave)and P.atkBufferSum<20 then
|
||||
if D.timer>=math.max(300,600-10*D.wave) and P.atkBufferSum<20 then
|
||||
if D.wave==35 then
|
||||
P:win('finish')
|
||||
else
|
||||
|
||||
@@ -15,7 +15,7 @@ return{
|
||||
local C=P.lastPiece
|
||||
if C.row>0 then
|
||||
if C.row==4 then
|
||||
if TABLE.find(P.modeData.history,C.curX)then
|
||||
if TABLE.find(P.modeData.history,C.curX) then
|
||||
P:showText("STACK",0,-140,40,'flicker',.3)
|
||||
P:lose()
|
||||
else
|
||||
|
||||
@@ -4,7 +4,7 @@ return{
|
||||
GC.mStr(P.modeData.tsd,63,250)
|
||||
mText(TEXTOBJ.tsd,63,315)
|
||||
local L=P.modeData.history
|
||||
if L[1]and L[1]==L[2]and L[1]==L[3]then
|
||||
if L[1] and L[1]==L[2] and L[1]==L[3] then
|
||||
PLY.draw.applyField(P)
|
||||
GC.setColor(1,.3,.3,.2)
|
||||
GC.rectangle('fill',30*L[1]-30,0,30,600)
|
||||
@@ -16,7 +16,7 @@ return{
|
||||
if C.row>0 then
|
||||
if C.id==5 and C.row==2 and C.spin then
|
||||
local L=P.modeData.history
|
||||
if L[1]==C.centX and L[1]==L[2]and L[1]==L[3]then
|
||||
if L[1]==C.centX and L[1]==L[2] and L[1]==L[3] then
|
||||
P:showText("STACK",0,-140,40,'flicker',.3)
|
||||
P:lose()
|
||||
else
|
||||
|
||||
@@ -15,7 +15,7 @@ return{
|
||||
local C=P.lastPiece
|
||||
if C.row>0 then
|
||||
if C.id==5 and C.row==2 and C.spin then
|
||||
if TABLE.find(P.modeData.history,C.centX)then
|
||||
if TABLE.find(P.modeData.history,C.centX) then
|
||||
P:showText("STACK",0,-140,40,'flicker',.3)
|
||||
P:lose()
|
||||
else
|
||||
|
||||
@@ -22,7 +22,7 @@ return{
|
||||
P.modeData.section=1
|
||||
while true do
|
||||
coroutine.yield()
|
||||
while P.stat.frame>=warnTime[P.modeData.section]do
|
||||
while P.stat.frame>=warnTime[P.modeData.section] do
|
||||
if P.modeData.section<9 then
|
||||
P.modeData.section=P.modeData.section+1
|
||||
playReadySFX(3,.7+P.modeData.section*.03)
|
||||
|
||||
@@ -52,20 +52,20 @@ do--function tryDelete()
|
||||
end
|
||||
end
|
||||
do--function loadFile(name,args), function saveFile(data,name,args)
|
||||
local t=setmetatable({},{__index=function()return"'$1' loading failed: $2"end})
|
||||
local t=setmetatable({},{__index=function() return"'$1' loading failed: $2" end})
|
||||
function loadFile(name,args)
|
||||
local text=text or t
|
||||
if not args then args=''end
|
||||
if not args then args='' end
|
||||
local res,mes=pcall(FILE.load,name,args)
|
||||
if res then
|
||||
return mes
|
||||
else
|
||||
if mes:find'open error'then
|
||||
if mes:find'open error' then
|
||||
MES.new('error',text.loadError_open:repD(name,""))
|
||||
elseif mes:find'unknown mode'then
|
||||
elseif mes:find'unknown mode' then
|
||||
MES.new('error',text.loadError_errorMode:repD(name,args))
|
||||
elseif mes:find'no file'then
|
||||
if not args:sArg'-canSkip'then
|
||||
elseif mes:find'no file' then
|
||||
if not args:sArg'-canSkip' then
|
||||
MES.new('error',text.loadError_noFile:repD(name,""))
|
||||
end
|
||||
elseif mes then
|
||||
@@ -82,12 +82,12 @@ do--function loadFile(name,args), function saveFile(data,name,args)
|
||||
return true
|
||||
else
|
||||
MES.new('error',
|
||||
mes:find'duplicate'and
|
||||
text.saveError_duplicate:repD(name)or
|
||||
mes:find'encode error'and
|
||||
text.saveError_encode:repD(name)or
|
||||
mes:find'duplicate' and
|
||||
text.saveError_duplicate:repD(name) or
|
||||
mes:find'encode error' and
|
||||
text.saveError_encode:repD(name) or
|
||||
mes and
|
||||
text.saveError_other:repD(name,mes)or
|
||||
text.saveError_other:repD(name,mes) or
|
||||
text.saveError_unknown:repD(name)
|
||||
)
|
||||
end
|
||||
@@ -115,7 +115,7 @@ do--function applySettings()
|
||||
text=LANG.get(SETTING.locale)
|
||||
WIDGET.setLang(text.WidgetText)
|
||||
for k,v in next,TEXTOBJ do
|
||||
if rawget(text,k)then
|
||||
if rawget(text,k) then
|
||||
v:set(text[k])
|
||||
end
|
||||
end
|
||||
@@ -144,23 +144,23 @@ do--function applySettings()
|
||||
|
||||
--Apply saturs
|
||||
local m
|
||||
m=saturateValues[SETTING.blockSatur]or saturateValues.normal
|
||||
m=saturateValues[SETTING.blockSatur] or saturateValues.normal
|
||||
SHADER.blockSatur:send('b',m[1])
|
||||
SHADER.blockSatur:send('k',m[2])
|
||||
m=saturateValues[SETTING.fieldSatur]or saturateValues.normal
|
||||
m=saturateValues[SETTING.fieldSatur] or saturateValues.normal
|
||||
SHADER.fieldSatur:send('b',m[1])
|
||||
SHADER.fieldSatur:send('k',m[2])
|
||||
|
||||
--Apply BG
|
||||
if SETTING.bg=='on'then
|
||||
if SETTING.bg=='on' then
|
||||
BG.unlock()
|
||||
BG.set()
|
||||
elseif SETTING.bg=='off'then
|
||||
elseif SETTING.bg=='off' then
|
||||
BG.unlock()
|
||||
BG.set('fixColor',SETTING.bgAlpha,SETTING.bgAlpha,SETTING.bgAlpha)
|
||||
BG.lock()
|
||||
elseif SETTING.bg=='custom'then
|
||||
if love.filesystem.getInfo('conf/customBG')then
|
||||
elseif SETTING.bg=='custom' then
|
||||
if love.filesystem.getInfo('conf/customBG') then
|
||||
local res,image=pcall(GC.newImage,love.filesystem.newFile('conf/customBG'))
|
||||
if res then
|
||||
BG.unlock()
|
||||
@@ -265,7 +265,7 @@ function royaleLevelup()
|
||||
for _,P in next,PLY_ALIVE do
|
||||
P.gameEnv.drop=spd
|
||||
end
|
||||
if GAME.curMode.name:find("_u")then
|
||||
if GAME.curMode.name:find("_u") then
|
||||
for i=1,#PLY_ALIVE do
|
||||
local P=PLY_ALIVE[i]
|
||||
P.gameEnv.drop=int(P.gameEnv.drop*.4)
|
||||
@@ -347,7 +347,7 @@ function setField(P,page)
|
||||
local F=FIELD[page]
|
||||
local height=0
|
||||
for y=#F,1,-1 do
|
||||
if notEmptyLine(F[y])then
|
||||
if notEmptyLine(F[y]) then
|
||||
height=y
|
||||
break
|
||||
end
|
||||
@@ -374,7 +374,7 @@ function freshDate(args)
|
||||
STAT.date=date
|
||||
STAT.todayTime=0
|
||||
getItem('zTicket',1)
|
||||
if not args:find'q'then
|
||||
if not args:find'q' then
|
||||
MES.new('info',text.newDay)
|
||||
end
|
||||
saveStats()
|
||||
@@ -383,7 +383,7 @@ function freshDate(args)
|
||||
end
|
||||
function legalGameTime()--Check if today's playtime is legal
|
||||
if
|
||||
SETTING.locale:find'zh'and
|
||||
SETTING.locale:find'zh' and
|
||||
RANKS.sprint_10l<4 and
|
||||
(not RANKS.sprint_40l or RANKS.sprint_40l<3)
|
||||
then
|
||||
@@ -411,12 +411,12 @@ end
|
||||
|
||||
function mergeStat(stat,delta)--Merge delta stat. to global stat.
|
||||
for k,v in next,delta do
|
||||
if type(v)=='table'then
|
||||
if type(stat[k])=='table'then
|
||||
if type(v)=='table' then
|
||||
if type(stat[k])=='table' then
|
||||
mergeStat(stat[k],v)
|
||||
end
|
||||
else
|
||||
if stat[k]then
|
||||
if stat[k] then
|
||||
stat[k]=stat[k]+v
|
||||
end
|
||||
end
|
||||
@@ -439,7 +439,7 @@ function destroyPlayers()--Destroy all player objects, restore freerows and free
|
||||
if P.canvas then
|
||||
P.canvas:release()
|
||||
end
|
||||
while P.field[1]do
|
||||
while P.field[1] do
|
||||
rem(P.field)
|
||||
rem(P.visTime)
|
||||
end
|
||||
@@ -453,7 +453,7 @@ function pauseGame()
|
||||
for i=1,#PLAYERS do
|
||||
local l=PLAYERS[i].keyPressing
|
||||
for j=1,#l do
|
||||
if l[j]then
|
||||
if l[j] then
|
||||
PLAYERS[i]:releaseKey(j)
|
||||
end
|
||||
end
|
||||
@@ -462,7 +462,7 @@ function pauseGame()
|
||||
for i=1,20 do
|
||||
VK.release(i)
|
||||
end
|
||||
if not(GAME.result or GAME.replaying)then
|
||||
if not (GAME.result or GAME.replaying) then
|
||||
GAME.pauseCount=GAME.pauseCount+1
|
||||
end
|
||||
SCN.swapTo('pause','none')
|
||||
@@ -472,12 +472,12 @@ function applyCustomGame()--Apply CUSTOMENV, BAG, MISSION
|
||||
for k,v in next,CUSTOMENV do
|
||||
GAME.modeEnv[k]=v
|
||||
end
|
||||
if BAG[1]then
|
||||
if BAG[1] then
|
||||
GAME.modeEnv.seqData=BAG
|
||||
else
|
||||
GAME.modeEnv.seqData=nil
|
||||
end
|
||||
if MISSION[1]then
|
||||
if MISSION[1] then
|
||||
GAME.modeEnv.mission=MISSION
|
||||
else
|
||||
GAME.modeEnv.mission=nil
|
||||
@@ -485,8 +485,8 @@ function applyCustomGame()--Apply CUSTOMENV, BAG, MISSION
|
||||
end
|
||||
function loadGame(mode,ifQuickPlay,ifNet)--Load a mode and go to game scene
|
||||
freshDate()
|
||||
if legalGameTime()then
|
||||
if not MODES[mode]and FILE.isSafe('parts/modes/'..mode) then
|
||||
if legalGameTime() then
|
||||
if not MODES[mode] and FILE.isSafe('parts/modes/'..mode) then
|
||||
MODES[mode]=require('parts.modes.'..mode)
|
||||
MODES[mode].name=mode
|
||||
end
|
||||
@@ -503,9 +503,9 @@ function loadGame(mode,ifQuickPlay,ifNet)--Load a mode and go to game scene
|
||||
if ifNet then
|
||||
SCN.go('net_game','swipeD')
|
||||
else
|
||||
local modeText=text.modes[mode]or{"["..MODES[mode].name.."]",""}
|
||||
local modeText=text.modes[mode] or{"["..MODES[mode].name.."]",""}
|
||||
TEXTOBJ.modeName:set(modeText[1].." "..modeText[2])
|
||||
SCN.go('game',ifQuickPlay and'swipeD'or'fade_togame')
|
||||
SCN.go('game',ifQuickPlay and 'swipeD' or 'fade_togame')
|
||||
playSFX('enter')
|
||||
end
|
||||
end
|
||||
@@ -531,10 +531,10 @@ function gameOver()--Save record
|
||||
if R>0 then
|
||||
GAME.rank=R
|
||||
end
|
||||
if not GAME.replaying and M.score and scoreValid()then
|
||||
if RANKS[M.name]then--Old rank exist
|
||||
if not GAME.replaying and M.score and scoreValid() then
|
||||
if RANKS[M.name] then--Old rank exist
|
||||
local needSave
|
||||
if R>RANKS[M.name]then
|
||||
if R>RANKS[M.name] then
|
||||
RANKS[M.name]=R
|
||||
needSave=true
|
||||
end
|
||||
@@ -543,7 +543,7 @@ function gameOver()--Save record
|
||||
for i=1,#M.unlock do
|
||||
local m=M.unlock[i]
|
||||
local n=MODES[m].name
|
||||
if not RANKS[n]then
|
||||
if not RANKS[n] then
|
||||
if MODES[m].x then
|
||||
RANKS[n]=0
|
||||
end
|
||||
@@ -560,7 +560,7 @@ function gameOver()--Save record
|
||||
local L=M.records
|
||||
local p=#L--Rank-1
|
||||
if p>0 then
|
||||
while M.comp(D,L[p])do--If higher rank
|
||||
while M.comp(D,L[p]) do--If higher rank
|
||||
p=p-1
|
||||
if p==0 then break end
|
||||
end
|
||||
@@ -568,7 +568,7 @@ function gameOver()--Save record
|
||||
if p<10 then
|
||||
if p==0 then
|
||||
P:_showText(text.newRecord,0,-100,100,'beat',.5)
|
||||
if SETTING.autoSave and DATA.saveReplay()then
|
||||
if SETTING.autoSave and DATA.saveReplay() then
|
||||
GAME.saved=true
|
||||
playSFX('connected')
|
||||
MES.new('check',text.saveDone)
|
||||
@@ -576,7 +576,7 @@ function gameOver()--Save record
|
||||
end
|
||||
D.date=os.date("%Y/%m/%d %H:%M")
|
||||
ins(L,p+1,D)
|
||||
if L[11]then L[11]=nil end
|
||||
if L[11] then L[11]=nil end
|
||||
saveFile(L,('record/%s.rec'):format(M.name),'-luaon')
|
||||
end
|
||||
end
|
||||
@@ -584,7 +584,7 @@ function gameOver()--Save record
|
||||
end
|
||||
end
|
||||
function trySave()
|
||||
if not GAME.statSaved and PLAYERS[1]and PLAYERS[1].type=='human'and(PLAYERS[1].frameRun>300 or GAME.result)then
|
||||
if not GAME.statSaved and PLAYERS[1] and PLAYERS[1].type=='human' and (PLAYERS[1].frameRun>300 or GAME.result) then
|
||||
GAME.statSaved=true
|
||||
STAT.game=STAT.game+1
|
||||
mergeStat(STAT,PLAYERS[1].stat)
|
||||
@@ -605,35 +605,35 @@ do--function freshPlayerPosition(sudden)
|
||||
--6~17
|
||||
(function()
|
||||
local L={{340,75,1}}
|
||||
for i=1,4 do ins(L,{15,-160+180*i,.25})end
|
||||
for i=1,4 do ins(L,{180,-160+180*i,.25})end
|
||||
for i=1,4 do ins(L,{950,-160+180*i,.25})end
|
||||
for i=1,4 do ins(L,{1120,-160+180*i,.25})end
|
||||
for i=1,4 do ins(L,{15,-160+180*i,.25}) end
|
||||
for i=1,4 do ins(L,{180,-160+180*i,.25}) end
|
||||
for i=1,4 do ins(L,{950,-160+180*i,.25}) end
|
||||
for i=1,4 do ins(L,{1120,-160+180*i,.25}) end
|
||||
return L
|
||||
end)(),
|
||||
--18~31
|
||||
(function()
|
||||
local L={{340,75,1}}
|
||||
for i=1,5 do ins(L,{10, -100+135*i,.18})end
|
||||
for i=1,5 do ins(L,{120, -100+135*i,.18})end
|
||||
for i=1,5 do ins(L,{230, -100+135*i,.18})end
|
||||
for i=1,5 do ins(L,{940, -100+135*i,.18})end
|
||||
for i=1,5 do ins(L,{1050,-100+135*i,.18})end
|
||||
for i=1,5 do ins(L,{1160,-100+135*i,.18})end
|
||||
for i=1,5 do ins(L,{10, -100+135*i,.18}) end
|
||||
for i=1,5 do ins(L,{120, -100+135*i,.18}) end
|
||||
for i=1,5 do ins(L,{230, -100+135*i,.18}) end
|
||||
for i=1,5 do ins(L,{940, -100+135*i,.18}) end
|
||||
for i=1,5 do ins(L,{1050,-100+135*i,.18}) end
|
||||
for i=1,5 do ins(L,{1160,-100+135*i,.18}) end
|
||||
return L
|
||||
end)(),
|
||||
--32~49
|
||||
(function()
|
||||
local L={{340,75,1}}
|
||||
for i=1,4 do for j=1,6 do ins(L,{78*i-54,115*j-98,.09})end end
|
||||
for i=9,12 do for j=1,6 do ins(L,{78*i+267,115*j-98,.09})end end
|
||||
for i=1,4 do for j=1,6 do ins(L,{78*i-54,115*j-98,.09}) end end
|
||||
for i=9,12 do for j=1,6 do ins(L,{78*i+267,115*j-98,.09}) end end
|
||||
return L
|
||||
end)(),
|
||||
--50~99
|
||||
(function()
|
||||
local L={{340,75,1}}
|
||||
for i=1,7 do for j=1,7 do ins(L,{46*i-36,97*j-72,.068})end end
|
||||
for i=15,21 do for j=1,7 do ins(L,{46*i+264,97*j-72,.068})end end
|
||||
for i=1,7 do for j=1,7 do ins(L,{46*i-36,97*j-72,.068}) end end
|
||||
for i=15,21 do for j=1,7 do ins(L,{46*i+264,97*j-72,.068}) end end
|
||||
return L
|
||||
end)(),
|
||||
}
|
||||
@@ -653,8 +653,8 @@ do--function freshPlayerPosition(sudden)
|
||||
elseif #L<=99 then posList=posLists[5]
|
||||
else error("TOO MANY PLAYERS!")
|
||||
end
|
||||
local method=sudden and'setPosition'or'movePosition'
|
||||
for i=1,#L do L[i][method](L[i],unpack(posList[i]))end
|
||||
local method=sudden and 'setPosition' or 'movePosition'
|
||||
for i=1,#L do L[i][method](L[i],unpack(posList[i])) end
|
||||
end
|
||||
end
|
||||
do--function dumpBasicConfig()
|
||||
@@ -716,7 +716,7 @@ do--function resetGameData(args)
|
||||
local function _copyGameSetting()
|
||||
local S={}
|
||||
for _,key in next,gameSetting do
|
||||
if type(SETTING[key])=='table'then
|
||||
if type(SETTING[key])=='table' then
|
||||
S[key]=TABLE.shift(SETTING[key])
|
||||
else
|
||||
S[key]=SETTING[key]
|
||||
@@ -725,19 +725,19 @@ do--function resetGameData(args)
|
||||
return S
|
||||
end
|
||||
function resetGameData(args,seed)
|
||||
if not args then args=""end
|
||||
if not args then args="" end
|
||||
trySave()
|
||||
|
||||
GAME.result=false
|
||||
GAME.rank=0
|
||||
GAME.warnLVL0=0
|
||||
GAME.warnLVL=0
|
||||
if args:find'r'then
|
||||
if args:find'r' then
|
||||
GAME.frameStart=0
|
||||
GAME.recording=false
|
||||
GAME.replaying=true
|
||||
else
|
||||
GAME.frameStart=args:find'n'and 0 or 180-SETTING.reTime*60
|
||||
GAME.frameStart=args:find'n' and 0 or 180-SETTING.reTime*60
|
||||
GAME.seed=seed or math.random(1046101471,2662622626)
|
||||
GAME.pauseTime=0
|
||||
GAME.pauseCount=0
|
||||
@@ -761,12 +761,12 @@ do--function resetGameData(args)
|
||||
VK.restore()
|
||||
|
||||
local bg=GAME.modeEnv.bg
|
||||
BG.set(type(bg)=='string'and bg or type(bg)=='table'and bg[math.random(#bg)])
|
||||
BG.set(type(bg)=='string' and bg or type(bg)=='table' and bg[math.random(#bg)])
|
||||
local bgm=GAME.modeEnv.bgm
|
||||
BGM.play(type(bgm)=='string'and bgm or type(bgm)=='table'and bgm[math.random(#bgm)])
|
||||
BGM.play(type(bgm)=='string' and bgm or type(bgm)=='table' and bgm[math.random(#bgm)])
|
||||
|
||||
TEXT.clear()
|
||||
if GAME.modeEnv.eventSet=='royale'then
|
||||
if GAME.modeEnv.eventSet=='royale' then
|
||||
for i=1,#PLAYERS do
|
||||
PLAYERS[i]:changeAtk(randomTarget(PLAYERS[i]))
|
||||
end
|
||||
@@ -825,23 +825,6 @@ end
|
||||
|
||||
--Game draw
|
||||
do--function drawSelfProfile()
|
||||
local lvColor={COLOR.J,COLOR.A,COLOR.C,COLOR.N,COLOR.S,COLOR.V,COLOR.P,COLOR.M,COLOR.W,COLOR.R,COLOR.O,COLOR.Y}
|
||||
local lvIcon=setmetatable({},{__index=function(self,lv)
|
||||
local c=lvColor[int((lv-1)/26)+1]or COLOR.Z
|
||||
|
||||
local img=GC.DO{25,25,
|
||||
{"clear",0,0,0,0},
|
||||
{"setLW",2},
|
||||
{"setCL",c[1],c[2],c[3],.6},
|
||||
{"fRect",2,2,21,21,2},
|
||||
{"setCL",c},
|
||||
{"dRect",2,2,21,21,2},
|
||||
{"setCL",COLOR.Z},
|
||||
{"mText",(lv-1)%26+1,13,-1},
|
||||
}
|
||||
rawset(self,lv,img)
|
||||
return img
|
||||
end})
|
||||
local name
|
||||
local textObj,scaleK,width,offY
|
||||
function drawSelfProfile()
|
||||
@@ -857,7 +840,7 @@ do--function drawSelfProfile()
|
||||
gc_draw(selfAvatar,-72,8,nil,.5)
|
||||
|
||||
--Draw username
|
||||
if name~=USERS.getUsername(USER.uid)then
|
||||
if name~=USERS.getUsername(USER.uid) then
|
||||
name=USERS.getUsername(USER.uid)
|
||||
textObj=GC.newText(getFont(30),name)
|
||||
width=textObj:getWidth()
|
||||
@@ -892,13 +875,13 @@ end
|
||||
|
||||
|
||||
--Widget function shortcuts
|
||||
function backScene()SCN.back()end
|
||||
function backScene() SCN.back() end
|
||||
do--function goScene(name,style)
|
||||
local cache={}
|
||||
function goScene(name,style)
|
||||
local hash=style and name..style or name
|
||||
if not cache[hash]then
|
||||
cache[hash]=function()SCN.go(name,style)end
|
||||
if not cache[hash] then
|
||||
cache[hash]=function() SCN.go(name,style) end
|
||||
end
|
||||
return cache[hash]
|
||||
end
|
||||
@@ -907,8 +890,8 @@ do--function swapScene(name,style)
|
||||
local cache={}
|
||||
function swapScene(name,style)
|
||||
local hash=style and name..style or name
|
||||
if not cache[hash]then
|
||||
cache[hash]=function()SCN.swapTo(name,style)end
|
||||
if not cache[hash] then
|
||||
cache[hash]=function() SCN.swapTo(name,style) end
|
||||
end
|
||||
return cache[hash]
|
||||
end
|
||||
@@ -916,8 +899,8 @@ end
|
||||
do--function pressKey(k)
|
||||
local cache={}
|
||||
function pressKey(k)
|
||||
if not cache[k]then
|
||||
cache[k]=function()love.keypressed(k)end
|
||||
if not cache[k] then
|
||||
cache[k]=function() love.keypressed(k) end
|
||||
end
|
||||
return cache[k]
|
||||
end
|
||||
@@ -931,13 +914,13 @@ do--CUS/SETXXX(k)
|
||||
'VKSwitch','VKIcon','VKTrack','VKDodge',
|
||||
'simpMode',
|
||||
}
|
||||
function CUSval(k)return function()return CUSTOMENV[k]end end
|
||||
function ROOMval(k)return function()return ROOMENV[k]end end
|
||||
function SETval(k)return function()return SETTING[k]end end
|
||||
function CUSrev(k)return function()CUSTOMENV[k]=not CUSTOMENV[k]end end
|
||||
function ROOMrev(k)return function()ROOMENV[k]=not ROOMENV[k]end end
|
||||
function SETrev(k)return function()if TABLE.find(warnList,k)then trySettingWarn()end SETTING[k]=not SETTING[k]end end
|
||||
function CUSsto(k)return function(i)CUSTOMENV[k]=i end end
|
||||
function ROOMsto(k)return function(i)ROOMENV[k]=i end end
|
||||
function SETsto(k)return function(i)if TABLE.find(warnList,k)then trySettingWarn()end SETTING[k]=i end end
|
||||
function CUSval(k) return function() return CUSTOMENV[k] end end
|
||||
function ROOMval(k) return function() return ROOMENV[k] end end
|
||||
function SETval(k) return function() return SETTING[k] end end
|
||||
function CUSrev(k) return function() CUSTOMENV[k]=not CUSTOMENV[k] end end
|
||||
function ROOMrev(k) return function() ROOMENV[k]=not ROOMENV[k] end end
|
||||
function SETrev(k) return function() if TABLE.find(warnList,k) then trySettingWarn() end SETTING[k]=not SETTING[k] end end
|
||||
function CUSsto(k) return function(i) CUSTOMENV[k]=i end end
|
||||
function ROOMsto(k) return function(i) ROOMENV[k]=i end end
|
||||
function SETsto(k) return function(i) if TABLE.find(warnList,k) then trySettingWarn() end SETTING[k]=i end end
|
||||
end
|
||||
|
||||
@@ -6,13 +6,13 @@ BLOCK_NAMES={
|
||||
'J5','L5','R','Y','N','H','I5',
|
||||
'I3','C','I2','O1'
|
||||
}
|
||||
BLOCK_CHARS={}for i=1,#BLOCK_NAMES do BLOCK_CHARS[i]=CHAR.mino[BLOCK_NAMES[i]]end
|
||||
BLOCK_CHARS={} for i=1,#BLOCK_NAMES do BLOCK_CHARS[i]=CHAR.mino[BLOCK_NAMES[i]] end
|
||||
BLOCK_COLORS={
|
||||
COLOR.R,COLOR.F,COLOR.O,COLOR.Y,COLOR.L,COLOR.J,COLOR.G,COLOR.A,
|
||||
COLOR.C,COLOR.N,COLOR.S,COLOR.B,COLOR.V,COLOR.P,COLOR.M,COLOR.W,
|
||||
COLOR.dH,COLOR.D,COLOR.lY,COLOR.H,COLOR.lH,COLOR.dV,COLOR.dR,COLOR.dG,
|
||||
}
|
||||
RANK_CHARS={'B','A','S','U','X'}for i=1,#RANK_CHARS do RANK_CHARS[i]=CHAR.icon['rank'..RANK_CHARS[i]]end
|
||||
RANK_CHARS={'B','A','S','U','X'} for i=1,#RANK_CHARS do RANK_CHARS[i]=CHAR.icon['rank'..RANK_CHARS[i]] end
|
||||
RANK_COLORS={
|
||||
{.8,.86,.9},
|
||||
{.6,.9,.7},
|
||||
@@ -131,8 +131,8 @@ do--SVG_TITLE_FILL, SVG_TITLE_LINE
|
||||
|
||||
SVG_TITLE_LINE=TABLE.shift(SVG_TITLE_FILL)
|
||||
SVG_TITLE_LINE[8],SVG_TITLE_LINE[9]={},{}
|
||||
for j=1,16 do SVG_TITLE_LINE[8][j]=SVG_TITLE_FILL[8][j]end
|
||||
for j=19,#SVG_TITLE_FILL[8]-2 do SVG_TITLE_LINE[9][j-18]=SVG_TITLE_FILL[8][j]end
|
||||
for j=1,16 do SVG_TITLE_LINE[8][j]=SVG_TITLE_FILL[8][j] end
|
||||
for j=19,#SVG_TITLE_FILL[8]-2 do SVG_TITLE_LINE[9][j-18]=SVG_TITLE_FILL[8][j] end
|
||||
end
|
||||
do--SVG_TITLE_FAN
|
||||
SVG_TITLE_FAN={}
|
||||
@@ -166,7 +166,7 @@ do--MISSIONENUM
|
||||
for k,v in next,L do ENUM_MISSION[k]=v end
|
||||
end
|
||||
do--TEXTOBJ
|
||||
local function T(s,t)return love.graphics.newText(getFont(s),t)end
|
||||
local function T(s,t) return love.graphics.newText(getFont(s),t) end
|
||||
TEXTOBJ={
|
||||
modeName=T(30),
|
||||
|
||||
@@ -347,93 +347,93 @@ do--Mod data
|
||||
{no=0,id="NX",name="next",
|
||||
key="q",x=80,y=230,color='lO',
|
||||
list={0,1,2,3,4,5,6},
|
||||
func=function(P,O)P.gameEnv.nextCount=O end,
|
||||
func=function(P,O) P.gameEnv.nextCount=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=1,id="HL",name="hold",
|
||||
key="w",x=200,y=230,color='lO',
|
||||
list={0,1,2,3,4,5,6},
|
||||
func=function(P,O)P.gameEnv.holdCount=O end,
|
||||
func=function(P,O) P.gameEnv.holdCount=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=2,id="FL",name="hideNext",
|
||||
key="e",x=320,y=230,color='lA',
|
||||
list={1,2,3,4,5},
|
||||
func=function(P,O)P.gameEnv.nextStartPos=O+1 end,
|
||||
func=function(P,O) P.gameEnv.nextStartPos=O+1 end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=3,id="IH",name="infHold",
|
||||
key="r",x=440,y=230,color='lA',
|
||||
func=function(P)P.gameEnv.infHold=true end,
|
||||
func=function(P) P.gameEnv.infHold=true end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=4,id="HB",name="hideBlock",
|
||||
key="y",x=680,y=230,color='lV',
|
||||
func=function(P)P.gameEnv.block=false end,
|
||||
func=function(P) P.gameEnv.block=false end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=5,id="HG",name="hideGhost",
|
||||
key="u",x=800,y=230,color='lV',
|
||||
func=function(P)P.gameEnv.ghost=false end,
|
||||
func=function(P) P.gameEnv.ghost=false end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=6,id="HD",name="hidden",
|
||||
key="i",x=920,y=230,color='lP',
|
||||
list={'easy','slow','medium','fast','none'},
|
||||
func=function(P,O)P.gameEnv.visible=O end,
|
||||
func=function(P,O) P.gameEnv.visible=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=7,id="HB",name="hideBoard",
|
||||
key="o",x=1040,y=230,color='lP',
|
||||
list={'down','up','all'},
|
||||
func=function(P,O)P.gameEnv.hideBoard=O end,
|
||||
func=function(P,O) P.gameEnv.hideBoard=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=8,id="FB",name="flipBoard",
|
||||
key="p",x=1160,y=230,color='lJ',
|
||||
list={'U-D','L-R','180'},
|
||||
func=function(P,O)P.gameEnv.flipBoard=O end,
|
||||
func=function(P,O) P.gameEnv.flipBoard=O end,
|
||||
unranked=true,
|
||||
},
|
||||
|
||||
{no=9,id="DT",name="dropDelay",
|
||||
key="a",x=140,y=350,color='lR',
|
||||
list={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
|
||||
func=function(P,O)P.gameEnv.drop=O end,
|
||||
func=function(P,O) P.gameEnv.drop=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=10,id="LT",name="lockDelay",
|
||||
key="s",x=260,y=350,color='lR',
|
||||
list={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
|
||||
func=function(P,O)P.gameEnv.lock=O end,
|
||||
func=function(P,O) P.gameEnv.lock=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=11,id="ST",name="waitDelay",
|
||||
key="d",x=380,y=350,color='lR',
|
||||
list={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
func=function(P,O)P.gameEnv.wait=O end,
|
||||
func=function(P,O) P.gameEnv.wait=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=12,id="CT",name="fallDelay",
|
||||
key="f",x=500,y=350,color='lR',
|
||||
list={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
func=function(P,O)P.gameEnv.fall=O end,
|
||||
func=function(P,O) P.gameEnv.fall=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=13,id="LF",name="life",
|
||||
key="j",x=860,y=350,color='lY',
|
||||
list={0,1,2,3,5,10,15,26,42,87,500},
|
||||
func=function(P,O)P.gameEnv.life=O end,
|
||||
func=function(P,O) P.gameEnv.life=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=14,id="FB",name="forceB2B",
|
||||
key="k",x=980,y=350,color='lY',
|
||||
func=function(P)P.gameEnv.b2bKill=true end,
|
||||
func=function(P) P.gameEnv.b2bKill=true end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=15,id="PF",name="forceFinesse",
|
||||
key="l",x=1100,y=350,color='lY',
|
||||
func=function(P)P.gameEnv.fineKill=true end,
|
||||
func=function(P) P.gameEnv.fineKill=true end,
|
||||
unranked=true,
|
||||
},
|
||||
|
||||
@@ -467,19 +467,19 @@ do--Mod data
|
||||
{no=19,id="CS",name="customSeq",
|
||||
key="b",x=680,y=470,color='lB',
|
||||
list={'bag','bagES','his','hisPool','c2','rnd','mess','reverb'},
|
||||
func=function(P,O)P.gameEnv.sequence=O end,
|
||||
func=function(P,O) P.gameEnv.sequence=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=20,id="PS",name="pushSpeed",
|
||||
key="n",x=800,y=470,color='lB',
|
||||
list={.5,1,2,3,5,15,1e99},
|
||||
func=function(P,O)P.gameEnv.pushSpeed=O end,
|
||||
func=function(P,O) P.gameEnv.pushSpeed=O end,
|
||||
unranked=true,
|
||||
},
|
||||
{no=21,id="BN",name="boneBlock",
|
||||
key="m",x=920,y=470,color='lB',
|
||||
list={'on','off'},
|
||||
func=function(P,O)P.gameEnv.bone=O=='on'end,
|
||||
func=function(P,O) P.gameEnv.bone=O=='on' end,
|
||||
unranked=true,
|
||||
},
|
||||
}
|
||||
@@ -719,8 +719,8 @@ do--Userdata tables
|
||||
piece=0,row=0,dig=0,
|
||||
atk=0,digatk=0,
|
||||
send=0,recv=0,pend=0,off=0,
|
||||
clear=(function()local L={}for i=1,29 do L[i]={0,0,0,0,0,0}end return L end)(),
|
||||
spin=(function()local L={}for i=1,29 do L[i]={0,0,0,0,0,0,0}end return L end)(),
|
||||
clear=(function() local L={} for i=1,29 do L[i]={0,0,0,0,0,0} end return L end)(),
|
||||
spin=(function() local L={} for i=1,29 do L[i]={0,0,0,0,0,0,0} end return L end)(),
|
||||
pc=0,hpc=0,b2b=0,b3b=0,score=0,
|
||||
lastPlay='sprint_10l',--Last played mode ID
|
||||
item=setmetatable({},{__index=function(self,k)
|
||||
|
||||
@@ -125,13 +125,13 @@ return{
|
||||
"support afdian aidadian",
|
||||
"org",
|
||||
FNNS and "The contents in this entry were hidden due to platform restrictions. Feel free to discuss these contents on our Discord server." or "To donate to Techmino via Aifadian, use the globe icon on the bottom right to open the URL. Aifadian charges a 6% transaction fee off your purchase.",
|
||||
FNNS and"https://youtu.be/dQw4w9WgXcQ"or"https://afdian.net/@MrZ_26",
|
||||
FNNS and "https://youtu.be/dQw4w9WgXcQ" or "https://afdian.net/@MrZ_26",
|
||||
},
|
||||
{"Support 3",
|
||||
"support p\97\116\114\101\111\110",
|
||||
"org",
|
||||
FNNS and "The contents in this entry were hidden due to platform restrictions. Feel free to discuss these contents on our Discord server." or "To donate to Techmino via P\97\116\114\101\111\110, click on the globe icon on the bottom right to open the URL. Notice that P\97\116\114\101\111\110 may charge you a service fee for transactions over a certain amount.",
|
||||
FNNS and"https://youtu.be/dQw4w9WgXcQ"or"https://www.p\97\116\114\101\111\110.com/techmino",
|
||||
FNNS and "https://youtu.be/dQw4w9WgXcQ" or "https://www.p\97\116\114\101\111\110.com/techmino",
|
||||
},
|
||||
|
||||
--Games
|
||||
@@ -891,7 +891,7 @@ return{
|
||||
{"Rolling",
|
||||
"rolling",
|
||||
"term",
|
||||
"Another method of fast-tapping in high-gravity (around 1G) modes (with slow DAS/ARR setting).\nWhen you perform rolling, you fix the position of one hand and the controller, and then tap the back of the controller with fingers on your other hand repeatedly. This method allows even faster speeds than hypertapping (see “Hypertapping” for more)and requires much less effort.\nThis method was first discovered by Cheez-fish, and he has once achieved a tapping speed of more than 20 Hz.",
|
||||
"Another method of fast-tapping in high-gravity (around 1G) modes (with slow DAS/ARR setting).\nWhen you perform rolling, you fix the position of one hand and the controller, and then tap the back of the controller with fingers on your other hand repeatedly. This method allows even faster speeds than hypertapping (see “Hypertapping” for more) and requires much less effort.\nThis method was first discovered by Cheez-fish, and he has once achieved a tapping speed of more than 20 Hz.",
|
||||
},
|
||||
{"Passthrough",
|
||||
"pingthrough",
|
||||
|
||||
@@ -89,13 +89,13 @@ return{
|
||||
"support afdian サポート 寄付 支援",
|
||||
"org",
|
||||
FNNS and "この機能はプラットフォームのポリシー制限が原因で使えません。うちらのDiscordサーバーでこの機能に関して話してください。ちなみに、ここにあるURLはリックくんです。" or "AifadianでTechminoに寄付する場合、 右下の地球儀のアイコンからURLを開いてください。注意としてAifadianは支払いの際に6%の手数料が取られます。",
|
||||
FNNS and"https://youtu.be/dQw4w9WgXcQ"or"https://afdian.net/@MrZ_26",
|
||||
FNNS and "https://youtu.be/dQw4w9WgXcQ" or "https://afdian.net/@MrZ_26",
|
||||
},
|
||||
{"サポート3",
|
||||
"support サポート 寄付 支援 p\97\116\114\101\111\110",
|
||||
"org",
|
||||
FNNS and "この機能はプラットフォームのポリシー制限が原因で使えません。うちらのDiscordサーバーでこの機能に関して話してください。ちなみに、ここにあるURLはリックくんです。" or "P\97\116\114\101\111\110でTechminoに寄付する場合、 右下の地球儀のアイコンからURLを開いてください。注意としてP\97\116\114\101\111\110は支払いの際に7.9%の手数料、さらに3ドル以上の支払いの際に0.30米ドル分の手数料が取られます。",
|
||||
FNNS and"https://youtu.be/dQw4w9WgXcQ"or"https://www.p\97\116\114\101\111\110.com/techmino",
|
||||
FNNS and "https://youtu.be/dQw4w9WgXcQ" or "https://www.p\97\116\114\101\111\110.com/techmino",
|
||||
},
|
||||
|
||||
--Games
|
||||
@@ -828,7 +828,7 @@ return{
|
||||
{"Rolling",
|
||||
"rolling",
|
||||
"term",
|
||||
"Another method of fast-tapping in high-gravity (around 1G) modes (with slow DAS/ARR setting).\nWhen you perform rolling, you fix the position of one hand and the controller, and then tap the back of the controller with fingers on your other hand repeatedly. This method allows even faster moving speeds than hypertapping (see \"Hypertapping\" for more)and requires much less effort.\nThis method was first discovered by Cheez-fish and he has once achieved a tapping speed of more than 20 Hz.",
|
||||
"Another method of fast-tapping in high-gravity (around 1G) modes (with slow DAS/ARR setting).\nWhen you perform rolling, you fix the position of one hand and the controller, and then tap the back of the controller with fingers on your other hand repeatedly. This method allows even faster moving speeds than hypertapping (see \"Hypertapping\" for more) and requires much less effort.\nThis method was first discovered by Cheez-fish and he has once achieved a tapping speed of more than 20 Hz.",
|
||||
},
|
||||
{"Passthrough",
|
||||
"pingthrough",
|
||||
|
||||
@@ -117,13 +117,13 @@ return{
|
||||
"support aifadian afdian zanzhu daqian",
|
||||
"org",
|
||||
"Afdian",
|
||||
FNNS and"https://b23.tv/BV1uT4y1P7CX"or"https://afdian.net/@MrZ_26",
|
||||
FNNS and "https://b23.tv/BV1uT4y1P7CX" or "https://afdian.net/@MrZ_26",
|
||||
},
|
||||
{"赞助3",
|
||||
"support zanzhu daqian",
|
||||
"org",
|
||||
"P\97\116\114\101\111\110",
|
||||
FNNS and"https://b23.tv/BV1uT4y1P7CX"or"https://www.p\97\116\114\101\111\110.com/techmino",
|
||||
FNNS and "https://b23.tv/BV1uT4y1P7CX" or "https://www.p\97\116\114\101\111\110.com/techmino",
|
||||
},
|
||||
|
||||
--游戏(题库)
|
||||
|
||||
@@ -205,8 +205,8 @@ return{
|
||||
"Make sure to get the game only from official sources,",
|
||||
"as we can’t make sure you’re safe if you got it elsewhere.",
|
||||
"The author is not responsible for any modifications.",
|
||||
FNNS and"/"or"While the game is free, donations are appreciated.",
|
||||
FNNS and"/"or"Check Zictionary for more",
|
||||
FNNS and "/" or "While the game is free, donations are appreciated.",
|
||||
FNNS and "/" or "Check Zictionary for more",
|
||||
},
|
||||
staff={
|
||||
"ORIGINALLY BY MrZ",
|
||||
@@ -919,7 +919,7 @@ return{
|
||||
"Headphones recommended for a better experience.",
|
||||
"Hello world!",
|
||||
"I3 and L3 are the only two unique triminoes.",
|
||||
"if a==true",
|
||||
" if a==true",
|
||||
"Increase your frame rate for a better experience.",
|
||||
"Initial [insert action] system can save you.",
|
||||
"Is B2B2B2B possible?",
|
||||
@@ -967,7 +967,7 @@ return{
|
||||
"What about 23 PCs in 100 lines?",
|
||||
"What about 26 TSDs?",
|
||||
"What is this cheap UI & music smh",
|
||||
"while(false)",
|
||||
" while (false)",
|
||||
"You are a Grand Master!",
|
||||
"You are welcome to help us to make BGMs and SFXs!",
|
||||
"You can connect a keyboard to your phone or tablet (not functional on iOS though).",
|
||||
|
||||
@@ -205,8 +205,8 @@ return{
|
||||
"Por favor descarga el juego únicamente desde los sitios oficiales,",
|
||||
"ya que no podemos asegurar que sea seguro si proviene de otro lado.",
|
||||
"El autor no se responabiliza por daños ocasionados debido a modificaciones del juego.",
|
||||
FNNS and"/"or"El juego es gratuito, pero se aprecian donaciones.",
|
||||
FNNS and"/"or"Ve el Zictionary (en inglés) para más info.",
|
||||
FNNS and "/" or "El juego es gratuito, pero se aprecian donaciones.",
|
||||
FNNS and "/" or "Ve el Zictionary (en inglés) para más info.",
|
||||
},
|
||||
staff={
|
||||
"ORIGINAL DE MrZ",
|
||||
|
||||
@@ -172,8 +172,8 @@ return{
|
||||
"Ce jeu est gratuit et est uniquement disponible via discord.gg/f9pUvkh",
|
||||
"Ne téléchargez pas ce jeu depuis une autre source au risque d'avoir des virus,",
|
||||
"et vous n'avez besoin que des permissions de vibration et de communication réseau pour les versions mobiles !",
|
||||
FNNS and"/"or"Le créateur n'est pas responsable pour n'importe quel type de perte de données suite à une modification du jeu.",
|
||||
-- FNNS and"/"or"Check Zictionary for more",
|
||||
FNNS and "/" or "Le créateur n'est pas responsable pour n'importe quel type de perte de données suite à une modification du jeu.",
|
||||
-- FNNS and "/" or "Check Zictionary for more",
|
||||
},
|
||||
staff={
|
||||
"À L'ORIGINE PAR MrZ",
|
||||
|
||||
@@ -206,8 +206,8 @@ return{
|
||||
"Pastikan untuk mendapat permainan ini hanya dari sumber resmi,",
|
||||
"karena kita tidak bisa meyakinkan Anda aman jika Anda mendapat permainan ini dari sumber lain.",
|
||||
"Penciptanya tidak bertanggung jawab untuk modifikasi.",
|
||||
FNNS and"/"or"Permainan ini gratis, tetapi sumbangan sangat dihargai.",
|
||||
-- FNNS and"/"or"Check Zictionary for more",
|
||||
FNNS and "/" or "Permainan ini gratis, tetapi sumbangan sangat dihargai.",
|
||||
-- FNNS and "/" or "Check Zictionary for more",
|
||||
},
|
||||
staff={
|
||||
"ASLI OLEH MrZ",
|
||||
@@ -911,7 +911,7 @@ return{
|
||||
"Headphone direkomendasikan untuk pengalaman yang lebih baik.",
|
||||
"Hello world!",
|
||||
"Hanya ada 2 jenis trimino, yaitu I3 dan L3.",
|
||||
"if a==true",
|
||||
" if a==true",
|
||||
"Tingkatkan frekuensi gambar Anda untuk pengalaman yang lebih baik.",
|
||||
"Sistem [tindakan] awal dapat menyelamatkan Anda.",
|
||||
"Apakah B2B2B2B mungkin?",
|
||||
@@ -955,7 +955,7 @@ return{
|
||||
"Bagaimana dengan 20 PCs?",
|
||||
"Bagaimana dengan 23 PCs dalam 100 baris?",
|
||||
"Bagaimana dengan 26 TSDs?",
|
||||
"while(false)",
|
||||
" while (false)",
|
||||
"Anda adalah seorang jago!",
|
||||
"Anda dipersilakan untuk membantu kami membuat musik dan efek suara!",
|
||||
"Anda dapat menghubungkan keyboard ke ponsel atau tablet Anda (tetapi tidak berfungsi di iOS).",
|
||||
|
||||
@@ -207,8 +207,8 @@ return{
|
||||
"ゲームは、必ず公式から入手してください",
|
||||
"他から入手した場合は、安全性を保証しません",
|
||||
"同時に作者は、責任を負いません",
|
||||
FNNS and"/"or"ゲーム自体は無料ですが、寄付できるならありがたいです。",
|
||||
FNNS and"/"or"詳しくはZictionaryをご覧ください",
|
||||
FNNS and "/" or "ゲーム自体は無料ですが、寄付できるならありがたいです。",
|
||||
FNNS and "/" or "詳しくはZictionaryをご覧ください",
|
||||
},
|
||||
staff={
|
||||
"作者「MrZ」",
|
||||
@@ -952,7 +952,7 @@ getTip={refuseCopy=true,
|
||||
"Techminoは\"Technique\"と\"Tetromino\"を掛け合わせ造語です!",
|
||||
"Techminoプレイヤーの未来はあなた達のものです!",
|
||||
"TetroDictionary is now available in English.",
|
||||
"while(false)",
|
||||
" while (false)",
|
||||
"ZS JL T O I",
|
||||
"ゲーム内にはモード選択マップからじゃ入れない隠しモードがいくつかあります!",
|
||||
"このゲームでは全てのSpinに火力補正があります!",
|
||||
|
||||
@@ -194,8 +194,8 @@ return{
|
||||
"certifique-se de pegar o jogo de fontes oficiais;",
|
||||
"binários obtidos em outros lugares pode conter malware.",
|
||||
"O autor não é responsável por qualquer binários modificados",
|
||||
FNNS and"/"or"O jogo é gratis, mas doações são apreciadas.",
|
||||
-- FNNS and"/"or"Check Zictionary for more",
|
||||
FNNS and "/" or "O jogo é gratis, mas doações são apreciadas.",
|
||||
-- FNNS and "/" or "Check Zictionary for more",
|
||||
},
|
||||
staff={
|
||||
"ORIGINALMENTE POR MrZ",
|
||||
@@ -890,7 +890,7 @@ return{
|
||||
"Tem alguma sugestão? Posta elas em nosso Discord!",
|
||||
"Fones recomendados para uma melhor experiência.",
|
||||
"Olá mundo!",
|
||||
"if a==true",
|
||||
" if a==true",
|
||||
"Aumente sua frame rate para uma experiência melhor.",
|
||||
"O sistema de [ação] inicial pode salvar sua vida.",
|
||||
"Será B2B2B2B possível?",
|
||||
@@ -925,7 +925,7 @@ return{
|
||||
"Que tal 20 PCs?",
|
||||
"Que tal 23 PCs em 100 linhas?",
|
||||
"Que tal 26 TSDs?",
|
||||
"while(false)",
|
||||
" while (false)",
|
||||
"Você e um Grand Master!",
|
||||
"Pode conectar um teclado ao seu celular!",
|
||||
"Você pode fazer spins com 28 de 29 minoes!",
|
||||
|
||||
@@ -542,7 +542,7 @@ return{
|
||||
getTip=function()
|
||||
local L="!@#$%^&*()-=_+[]{}\\|;:\'\",<.>/?"
|
||||
local s=""
|
||||
for _=1,math.random(16,26)do
|
||||
for _=1,math.random(16,26) do
|
||||
local p=math.random(#L)
|
||||
s=s..L:sub(p,p)
|
||||
end
|
||||
|
||||
@@ -206,8 +206,8 @@ return{
|
||||
"仅通过官网 *暂无域名,见词典* 免费下载/更新",
|
||||
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
|
||||
"若由于被修改的本游戏产生的各种损失作者不负责(怎么负责啊我又没法管)",
|
||||
FNNS and"/"or"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
FNNS and"/"or"更多信息见小z词典",
|
||||
FNNS and "/" or "请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
FNNS and "/" or "更多信息见小z词典",
|
||||
},
|
||||
staff={
|
||||
"原作者 MrZ",
|
||||
@@ -1011,7 +1011,7 @@ return{
|
||||
"git commit",
|
||||
"git push -f",
|
||||
"hello world",
|
||||
"if a==true",
|
||||
" if a==true",
|
||||
"l-=-1",
|
||||
"shutdown -h now",
|
||||
"sudo rm -rf /*",
|
||||
@@ -1021,7 +1021,7 @@ return{
|
||||
"Techmino.exe 已停止工作",
|
||||
"TechminOS coming s∞n",
|
||||
"viod main[]",
|
||||
"while(false)",
|
||||
" while (false)",
|
||||
|
||||
-- 其他乱七八糟梗
|
||||
"啊哈哈哈哈哈,T块来咯",
|
||||
|
||||
@@ -62,10 +62,10 @@ return{
|
||||
|
||||
page="Page=",
|
||||
|
||||
cc_fixed="if (AI==CC and Sequence==Fixed) then Error(); end",
|
||||
cc_swap="if (AI==CC and Hold.Mode==Swap) then Error(); end",
|
||||
ai_prebag="if (AI==true and Ctm.Seq~=Tetromino) then Error(); end",
|
||||
ai_mission="if (AI==true and Ctm.Mission~=true) then Error(); end",
|
||||
cc_fixed=" if (AI==CC and Sequence==Fixed) then Error(); end",
|
||||
cc_swap=" if (AI==CC and Hold.Mode==Swap) then Error(); end",
|
||||
ai_prebag=" if (AI==true and Ctm.Seq~=Tetromino) then Error(); end",
|
||||
ai_mission=" if (AI==true and Ctm.Mission~=true) then Error(); end",
|
||||
switchSpawnSFX="SpawnSFX=false",
|
||||
needRestart="NeedRestart=true",
|
||||
|
||||
@@ -96,7 +96,7 @@ return{
|
||||
|
||||
noScore="NoScore=true",
|
||||
modeLocked="Locked=true",
|
||||
unlockHint="if (PreviousMode<=B) then Unlock();",
|
||||
unlockHint=" if (PreviousMode<=B) then Unlock();",
|
||||
highScore="HighScore",
|
||||
newRecord="NewRecord=true",
|
||||
|
||||
@@ -206,8 +206,8 @@ return{
|
||||
"仅通过官网 *暂无域名,见词典* 免费下载/更新",
|
||||
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
|
||||
"若由于被修改的本游戏产生的各种损失作者不负责(怎么负责啊我又没法管)",
|
||||
FNNS and"/"or"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
FNNS and"/"or"更多信息见小z词典*/",
|
||||
FNNS and "/" or "请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
FNNS and "/" or "更多信息见小z词典*/",
|
||||
},
|
||||
staff={
|
||||
"原作者 MrZ",
|
||||
|
||||
@@ -206,8 +206,8 @@ return{
|
||||
"僅透過內測QQ群/discord伺服器進行免費下載/更新",
|
||||
"從其他渠道獲得遊戲皆有被修改/加入廣告/植入病毒的風險,程序只申請了振動&網路權限!",
|
||||
"若由於被修改的本遊戲產生的各種損失作者概不負責(我怎麼負責啊跟我有什麼關係)",
|
||||
FNNS and"/"or"請從正規途徑獲得最新版,遊戲現為免費,不過有打賞當然感謝啦~",
|
||||
FNNS and"/"or"更多資訊見小z詞典"
|
||||
FNNS and "/" or "請從正規途徑獲得最新版,遊戲現為免費,不過有打賞當然感謝啦~",
|
||||
FNNS and "/" or "更多資訊見小z詞典"
|
||||
},
|
||||
staff={
|
||||
"原作者 MrZ",
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
eventSet='attacker_h',
|
||||
bg='rainbow2',bgm='shining terminal',
|
||||
},
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.modeData.wave,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Waves "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
return
|
||||
|
||||
@@ -6,9 +6,9 @@ return{
|
||||
eventSet='attacker_u',
|
||||
bg='rainbow2',bgm='shining terminal',
|
||||
},
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.modeData.wave,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Waves "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
return
|
||||
|
||||
@@ -13,9 +13,9 @@ return{
|
||||
end,
|
||||
bg='tunnel',bgm='echo',
|
||||
},
|
||||
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(math.floor(P.stat.atk),100),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Attack "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.atk
|
||||
if L>=100 then
|
||||
|
||||
@@ -13,9 +13,9 @@ return{
|
||||
end,
|
||||
bg='blockhole',bgm='echo',
|
||||
},
|
||||
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(math.floor(P.stat.atk),100),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Attack "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.atk
|
||||
if L>=100 then
|
||||
|
||||
@@ -12,9 +12,9 @@ return{
|
||||
end,
|
||||
bg='tunnel',bgm='echo',
|
||||
},
|
||||
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(math.floor(P.stat.atk),100),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Attack "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.atk
|
||||
if L>=100 then
|
||||
|
||||
@@ -13,9 +13,9 @@ return{
|
||||
end,
|
||||
bg='blockhole',bgm='echo',
|
||||
},
|
||||
score=function(P)return{math.min(math.floor(P.stat.atk),100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(math.floor(P.stat.atk),100),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Attack "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.atk
|
||||
if L>=100 then
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
eventSet='big_h',
|
||||
bg='cubes',bgm='push',
|
||||
},
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,200),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
eventSet='big_n',
|
||||
bg='bg2',bgm='push',
|
||||
},
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,200),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
eventSet='checkLine_200',
|
||||
bg='glow',bgm='sugar fairy',
|
||||
},
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,200),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
|
||||
@@ -10,9 +10,9 @@ return{
|
||||
eventSet='checkLine_200',
|
||||
bg='rgb',bgm='sugar fairy',
|
||||
},
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,200),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
|
||||
@@ -11,9 +11,9 @@ return{
|
||||
eventSet='checkLine_200',
|
||||
bg='rgb',bgm='sugar fairy',
|
||||
},
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,200),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
eventSet='checkLine_200',
|
||||
bg='glow',bgm='sugar fairy',
|
||||
},
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,200),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
|
||||
@@ -10,9 +10,9 @@ return{
|
||||
eventSet='checkLine_100',
|
||||
bg='rgb',bgm='far',
|
||||
},
|
||||
score=function(P)return{math.min(P.stat.row,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,100),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
return
|
||||
|
||||
@@ -59,9 +59,9 @@ return{
|
||||
MES.new('warn',text.switchSpawnSFX)
|
||||
end
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,40),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{min(P.stat.row,40),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
return
|
||||
|
||||
@@ -6,9 +6,9 @@ return{
|
||||
eventSet='c4wBase',
|
||||
bg='rgb',bgm='oxygen',
|
||||
},
|
||||
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.modeData.maxCombo,100),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Combo "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.modeData.maxCombo
|
||||
if L==100 then
|
||||
|
||||
@@ -6,9 +6,9 @@ return{
|
||||
eventSet='c4wBase',
|
||||
bg='rgb',bgm='oxygen',
|
||||
},
|
||||
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.modeData.maxCombo,100),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Combo "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L==100 then
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
bg='rgb',bgm='1980s',
|
||||
},
|
||||
slowMark=true,
|
||||
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,
|
||||
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
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
bg='rgb',bgm='1980s',
|
||||
},
|
||||
slowMark=true,
|
||||
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,
|
||||
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
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
bg='rgb',bgm='1980s',
|
||||
},
|
||||
slowMark=true,
|
||||
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,
|
||||
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
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
bg='rgb',bgm='1980s',
|
||||
},
|
||||
slowMark=true,
|
||||
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,
|
||||
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
|
||||
|
||||
@@ -12,9 +12,9 @@ return{
|
||||
PLY.newPlayer(1)
|
||||
local AItype=GAME.modeEnv.opponent:sub(1,2)
|
||||
local AIlevel=tonumber(GAME.modeEnv.opponent:sub(-1))
|
||||
if AItype=='9S'then
|
||||
if AItype=='9S' then
|
||||
PLY.newAIPlayer(2,BOT.template{type='9S',speedLV=2*AIlevel,hold=true})
|
||||
elseif AItype=='CC'then
|
||||
elseif AItype=='CC' then
|
||||
PLY.newAIPlayer(2,BOT.template{type='CC',speedLV=2*AIlevel-1,next=math.floor(AIlevel*.5+1),hold=true,node=20000+5000*AIlevel})
|
||||
end
|
||||
|
||||
|
||||
@@ -3,14 +3,14 @@ local ply_applyField=PLY.draw.applyField
|
||||
|
||||
return{
|
||||
env={
|
||||
fkey1=function(P)P.modeData.showMark=1-P.modeData.showMark end,
|
||||
fkey1=function(P) P.modeData.showMark=1-P.modeData.showMark end,
|
||||
hook_drop=function(P)
|
||||
local D=P.modeData
|
||||
local F=FIELD[D.finished+1]
|
||||
for y=1,#F do
|
||||
local L=P.field[y]
|
||||
for x=1,10 do
|
||||
local a,b=F[y][x],L and L[x]or 0
|
||||
local a,b=F[y][x],L and L[x] or 0
|
||||
if a~=0 then
|
||||
if a==-1 then if b>0 then return end
|
||||
elseif a<12 then if a~=b then return end
|
||||
@@ -20,7 +20,7 @@ return{
|
||||
end
|
||||
end
|
||||
D.finished=D.finished+1
|
||||
if FIELD[D.finished+1]then
|
||||
if FIELD[D.finished+1] then
|
||||
P.waiting=26
|
||||
for _=#P.field,1,-1 do
|
||||
P.field[_],P.visTime[_]=nil
|
||||
@@ -54,9 +54,9 @@ return{
|
||||
local AItype=GAME.modeEnv.opponent:sub(1,2)
|
||||
local AIlevel=tonumber(GAME.modeEnv.opponent:sub(-1))
|
||||
PLY.newPlayer(1)
|
||||
if AItype=='9S'then
|
||||
if AItype=='9S' then
|
||||
PLY.newAIPlayer(2,BOT.template{type='9S',speedLV=2*AIlevel,hold=true})
|
||||
elseif AItype=='CC'then
|
||||
elseif AItype=='CC' then
|
||||
PLY.newAIPlayer(2,BOT.template{type='CC',speedLV=2*AIlevel-1,next=math.floor(AIlevel*.5+1),hold=true,node=20000+5000*AIlevel})
|
||||
end
|
||||
end,
|
||||
|
||||
@@ -6,9 +6,9 @@ return{
|
||||
eventSet='defender_l',
|
||||
bg='rainbow2',bgm='storm',
|
||||
},
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.modeData.wave,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Waves "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
return
|
||||
|
||||
@@ -6,9 +6,9 @@ return{
|
||||
eventSet='defender_n',
|
||||
bg='rainbow2',bgm='storm',
|
||||
},
|
||||
score=function(P)return{P.modeData.wave,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.modeData.wave,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Waves "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
return
|
||||
|
||||
@@ -4,9 +4,9 @@ return{
|
||||
eventSet='dig_100l',
|
||||
bg='bg2',bgm='way',
|
||||
},
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.stat.time,P.stat.piece} end,
|
||||
scoreDisp=function(D) return STRING.time(D[1]).." "..D[2].." Pieces" end,
|
||||
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<100 then return end
|
||||
local T=P.stat.time
|
||||
|
||||
@@ -4,9 +4,9 @@ return{
|
||||
eventSet='dig_10l',
|
||||
bg='bg1',bgm='way',
|
||||
},
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.stat.time,P.stat.piece} end,
|
||||
scoreDisp=function(D) return STRING.time(D[1]).." "..D[2].." Pieces" end,
|
||||
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<10 then return end
|
||||
local T=P.stat.time
|
||||
|
||||
@@ -4,9 +4,9 @@ return{
|
||||
eventSet='dig_400l',
|
||||
bg='bg2',bgm='way',
|
||||
},
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.stat.time,P.stat.piece} end,
|
||||
scoreDisp=function(D) return STRING.time(D[1]).." "..D[2].." Pieces" end,
|
||||
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<400 then return end
|
||||
local T=P.stat.time
|
||||
|
||||
@@ -4,9 +4,9 @@ return{
|
||||
eventSet='dig_40l',
|
||||
bg='bg1',bgm='way',
|
||||
},
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return STRING.time(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.stat.time,P.stat.piece} end,
|
||||
scoreDisp=function(D) return STRING.time(D[1]).." "..D[2].." Pieces" end,
|
||||
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<40 then return end
|
||||
local T=P.stat.time
|
||||
|
||||
@@ -4,9 +4,9 @@ return{
|
||||
eventSet='dig_100l',
|
||||
bg='bg2',bgm='way',
|
||||
},
|
||||
score=function(P)return{P.stat.piece,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..STRING.time(D[2]) end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.stat.piece,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Pieces "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<100 then return end
|
||||
local P=P.stat.piece
|
||||
|
||||
@@ -4,9 +4,9 @@ return{
|
||||
eventSet='dig_10l',
|
||||
bg='bg1',bgm='way',
|
||||
},
|
||||
score=function(P)return{P.stat.piece,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..STRING.time(D[2]) end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.stat.piece,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Pieces "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<10 then return end
|
||||
local P=P.stat.piece
|
||||
|
||||
@@ -4,9 +4,9 @@ return{
|
||||
eventSet='dig_400l',
|
||||
bg='bg2',bgm='way',
|
||||
},
|
||||
score=function(P)return{P.stat.piece,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..STRING.time(D[2]) end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.stat.piece,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Pieces "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<400 then return end
|
||||
local P=P.stat.piece
|
||||
|
||||
@@ -4,9 +4,9 @@ return{
|
||||
eventSet='dig_40l',
|
||||
bg='bg1',bgm='way',
|
||||
},
|
||||
score=function(P)return{P.stat.piece,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Pieces "..STRING.time(D[2]) end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.stat.piece,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Pieces "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]<b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<40 then return end
|
||||
local P=P.stat.piece
|
||||
|
||||
@@ -6,9 +6,9 @@ return{
|
||||
eventSet='dig_h',
|
||||
bg='bg2',bgm='shift',
|
||||
},
|
||||
score=function(P)return{P.modeData.wave,P.stat.row}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.modeData.wave,P.stat.row} end,
|
||||
scoreDisp=function(D) return D[1].." Waves "..D[2].." Lines" end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
return
|
||||
|
||||
@@ -30,9 +30,9 @@ return{
|
||||
P.stat.dig_quad = 0
|
||||
end,
|
||||
},
|
||||
score=function(P)return{P.stat.dig_quad,P.stat.piece}end,
|
||||
scoreDisp=function(D)return D[1].." Techrash "..D[2].." Pieces"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.dig_quad,P.stat.piece} end,
|
||||
scoreDisp=function(D) return D[1].." Techrash "..D[2].." Pieces" end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local dig = P.stat.dig_quad
|
||||
local piece = P.stat.piece
|
||||
|
||||
@@ -5,9 +5,9 @@ return{
|
||||
eventSet='dig_u',
|
||||
bg='bg2',bgm='shift',
|
||||
},
|
||||
score=function(P)return{P.modeData.wave,P.stat.row}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.modeData.wave,P.stat.row} end,
|
||||
scoreDisp=function(D) return D[1].." Waves "..D[2].." Lines" end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.wave
|
||||
return
|
||||
|
||||
@@ -3,10 +3,10 @@ return{
|
||||
env={
|
||||
drop=20,lock=60,
|
||||
sequence=function(P)
|
||||
for _=1,3 do P:getNext(7)end
|
||||
for _=1,3 do P:getNext(7) end
|
||||
while true do
|
||||
coroutine.yield()
|
||||
if not P.nextQueue[1]then
|
||||
if not P.nextQueue[1] then
|
||||
local height=TABLE.new(0,10)
|
||||
local max=#P.field
|
||||
if max>0 then
|
||||
@@ -44,7 +44,7 @@ return{
|
||||
if tempDeltaHei<-2 and deltaHei>2 then
|
||||
break
|
||||
elseif x==11 then
|
||||
for _=1,3 do ins(wei,7)end
|
||||
for _=1,3 do ins(wei,7) end
|
||||
else
|
||||
tempDeltaHei=deltaHei
|
||||
end
|
||||
@@ -62,10 +62,10 @@ return{
|
||||
end
|
||||
end
|
||||
if flatCount<3 then
|
||||
for _=1,3 do ins(wei,6)end
|
||||
for _=1,3 do ins(wei,6) end
|
||||
end
|
||||
if stairCount<3 then
|
||||
for _=1,4 do ins(wei,5)end
|
||||
for _=1,4 do ins(wei,5) end
|
||||
end
|
||||
end
|
||||
P:getNext(wei[P.seqRND:random(#wei)])
|
||||
@@ -78,9 +78,9 @@ return{
|
||||
eventSet='checkLine_100',
|
||||
bg='blockfall',bgm='reason',
|
||||
},
|
||||
score=function(P)return{math.min(P.stat.row,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,100),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=100 then
|
||||
|
||||
@@ -9,9 +9,9 @@ return{
|
||||
eventSet='checkLine_100',
|
||||
bg='blockfall',bgm='reason',
|
||||
},
|
||||
score=function(P)return{math.min(P.stat.row,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,100),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=100 then
|
||||
|
||||
@@ -15,12 +15,12 @@ local function check_rise(P)
|
||||
if L==0 then
|
||||
P:_showText(text.awesome,0,-120,80,'beat',.6)
|
||||
SFX.play('pc')
|
||||
if BG.cur=='wing'then BG.send(26)end
|
||||
if BG.cur=='wing' then BG.send(26) end
|
||||
for _=1,8 do
|
||||
P:garbageRise(13,1,generateLine(P.holeRND:random(10)))
|
||||
end
|
||||
else
|
||||
if BG.cur=='wing'then BG.send(#P.clearedRow)end
|
||||
if BG.cur=='wing' then BG.send(#P.clearedRow) end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
bg='cubes',bgm='push',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,200),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
bg='bg2',bgm='push',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{P.stat.score,P.stat.row,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..D[2].."L "..STRING.time(D[3])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,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].."P "..D[2].."L "..STRING.time(D[3]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
return P.stat.row>=26 and 0
|
||||
end,
|
||||
|
||||
@@ -7,9 +7,9 @@ return{
|
||||
bg='bg2',bgm='push',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,200),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
|
||||
@@ -6,9 +6,9 @@ return{
|
||||
bg='blockspace',bgm='hope',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{P.modeData.rankPoint,P.stat.score}end,
|
||||
scoreDisp=function(D)return sectionName[math.floor(D[1]/10)+1].." "..D[2]end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]>b[2]end,
|
||||
score=function(P) return{P.modeData.rankPoint,P.stat.score} end,
|
||||
scoreDisp=function(D) return sectionName[math.floor(D[1]/10)+1].." "..D[2] end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]>b[2] end,
|
||||
getRank=function(P)
|
||||
P=P.modeData.rankPoint
|
||||
return
|
||||
|
||||
@@ -5,9 +5,9 @@ return{
|
||||
bg='lightning',bgm='rectification',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{P.modeData.pt,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{P.modeData.pt,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].."P "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local S=P.modeData.pt
|
||||
return
|
||||
|
||||
@@ -15,8 +15,8 @@ return{
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P) return {P.modeData.gradePts,P.stat.time} end,
|
||||
scoreDisp=function(D) return(gradeList[D[1]]or D[1]).." "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])end,
|
||||
scoreDisp=function(D) return(gradeList[D[1]] or D[1]).." "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or (a[1]==b[1] and a[2]<b[2]) end,
|
||||
getRank=function(P)
|
||||
local G=P.modeData.gradePts
|
||||
return
|
||||
|
||||
@@ -6,10 +6,10 @@ return{
|
||||
bg='bg2',bgm='secret7th',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{P.modeData.pt,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
|
||||
score=function(P) return{P.modeData.pt,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].."P "..STRING.time(D[2]) end,
|
||||
comp=function(a,b)
|
||||
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
|
||||
return a[1]>b[1] or (a[1]==b[1] and a[2]<b[2])
|
||||
end,
|
||||
getRank=function(P)
|
||||
local S=P.modeData.pt
|
||||
|
||||
@@ -6,10 +6,10 @@ return{
|
||||
bg='glow',bgm='sugar fairy',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{P.modeData.pt,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
|
||||
score=function(P) return{P.modeData.pt,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].."P "..STRING.time(D[2]) end,
|
||||
comp=function(a,b)
|
||||
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
|
||||
return a[1]>b[1] or (a[1]==b[1] and a[2]<b[2])
|
||||
end,
|
||||
getRank=function(P)
|
||||
local S=P.modeData.pt
|
||||
|
||||
@@ -5,9 +5,9 @@ return{
|
||||
bg='bg2',bgm='super7th',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
score=function(P) return{math.min(P.stat.row,200),P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].." Lines "..STRING.time(D[2]) end,
|
||||
comp=function(a,b) return a[1]>b[1] or a[1]==b[1] and a[2]<b[2] end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
return
|
||||
|
||||
@@ -6,10 +6,10 @@ return{
|
||||
bg='bg1',bgm='secret8th',
|
||||
},
|
||||
slowMark=true,
|
||||
score=function(P)return{P.modeData.pt,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..STRING.time(D[2])end,
|
||||
score=function(P) return{P.modeData.pt,P.stat.time} end,
|
||||
scoreDisp=function(D) return D[1].."P "..STRING.time(D[2]) end,
|
||||
comp=function(a,b)
|
||||
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
|
||||
return a[1]>b[1] or (a[1]==b[1] and a[2]<b[2])
|
||||
end,
|
||||
getRank=function(P)
|
||||
local S=P.modeData.pt
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user