Merge branch 'ci_new_online'
This commit is contained in:
Submodule Zframework updated: 5bd04c8ce2...d86dba11ea
18
conf.lua
18
conf.lua
@@ -1,9 +1,9 @@
|
||||
function love.conf(t)
|
||||
t.identity='Techmino'--Saving folder
|
||||
t.identity='Techmino'-- Saving folder
|
||||
t.version="11.1"
|
||||
t.gammacorrect=false
|
||||
t.appendidentity=true--Search files in source then in save directory
|
||||
t.accelerometerjoystick=false--Accelerometer=joystick on ios/android
|
||||
t.appendidentity=true-- Search files in source then in save directory
|
||||
t.accelerometerjoystick=false-- Accelerometer=joystick on ios/android
|
||||
if t.audio then
|
||||
t.audio.mic=false
|
||||
t.audio.mixwithsystem=true
|
||||
@@ -16,12 +16,12 @@ function love.conf(t)
|
||||
W.borderless=false
|
||||
W.resizable=true
|
||||
W.fullscreen=false
|
||||
W.vsync=0--Unlimited FPS
|
||||
W.msaa=0--Multi-sampled antialiasing
|
||||
W.depth=0--Bits/samp of depth buffer
|
||||
W.stencil=1--Bits/samp of stencil buffer
|
||||
W.display=1--Monitor ID
|
||||
W.highdpi=true--High-dpi mode for the window on a Retina display
|
||||
W.vsync=0-- Unlimited FPS
|
||||
W.msaa=0-- Multi-sampled antialiasing
|
||||
W.depth=0-- Bits/samp of depth buffer
|
||||
W.stencil=1-- Bits/samp of stencil buffer
|
||||
W.display=1-- Monitor ID
|
||||
W.highdpi=true-- High-dpi mode for the window on a Retina display
|
||||
W.x,W.y=nil
|
||||
|
||||
local M=t.modules
|
||||
|
||||
214
main.lua
214
main.lua
@@ -15,26 +15,24 @@
|
||||
]]--
|
||||
|
||||
|
||||
--Var leak check
|
||||
-- setmetatable(_G,{__newindex=function(self,k,v)print('>>'..k)print(debug.traceback():match("\n.-\n\t(.-): "))rawset(self,k,v)end})
|
||||
-- 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})
|
||||
|
||||
--System Global Vars Declaration
|
||||
-- System Global Vars Declaration
|
||||
local fs=love.filesystem
|
||||
VERSION=require"version"
|
||||
TIME=love.timer.getTime
|
||||
YIELD=coroutine.yield
|
||||
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'
|
||||
SAVEDIR=fs.getSaveDirectory()
|
||||
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'
|
||||
|
||||
--Global Vars & Settings
|
||||
-- Global Vars & Settings
|
||||
SFXPACKS={'chiptune'}
|
||||
VOCPACKS={'miya','mono','xiaoya','miku'}
|
||||
FIRSTLAUNCH=false
|
||||
DAILYLAUNCH=false
|
||||
|
||||
--System setting
|
||||
-- System setting
|
||||
math.randomseed(os.time()*626)
|
||||
love.setDeprecationOutput(false)
|
||||
love.keyboard.setKeyRepeat(true)
|
||||
@@ -48,7 +46,7 @@ end
|
||||
local _LOADTIMELIST_={}
|
||||
local _LOADTIME_=TIME()
|
||||
|
||||
--Load modules
|
||||
-- Load modules
|
||||
Z=require'Zframework'
|
||||
FONT.load{
|
||||
norm='parts/fonts/proportional.otf',
|
||||
@@ -57,12 +55,12 @@ FONT.load{
|
||||
FONT.setDefault('norm')
|
||||
FONT.setFallback('norm')
|
||||
|
||||
SCR.setSize(1280,720)--Initialize Screen size
|
||||
SCR.setSize(1280,720)-- Initialize Screen size
|
||||
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
|
||||
@@ -76,7 +74,7 @@ end)
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Load Zframework: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
--Create shortcuts
|
||||
-- Create shortcuts
|
||||
setFont=FONT.set
|
||||
getFont=FONT.get
|
||||
mText=GC.simpX
|
||||
@@ -86,15 +84,15 @@ string.repD=STRING.repD
|
||||
string.sArg=STRING.sArg
|
||||
string.split=STRING.split
|
||||
|
||||
--Delete all naked files (from ancient versions)
|
||||
-- Delete all naked files (from ancient versions)
|
||||
FILE.clear('')
|
||||
|
||||
--Create directories
|
||||
for _,v in next,{'conf','record','replay','cache','lib'}do
|
||||
-- Create directories
|
||||
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,10 +102,10 @@ CHAR=require'parts.char'
|
||||
require'parts.gameTables'
|
||||
require'parts.gameFuncs'
|
||||
|
||||
--Load shader files from SOURCE ONLY
|
||||
-- Load shader files from SOURCE ONLY
|
||||
SHADER={}
|
||||
for _,v in next,fs.getDirectoryItems('parts/shaders')do
|
||||
if isSafeFile('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
|
||||
@@ -136,8 +134,8 @@ end})
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Load Parts: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
--Init Zframework
|
||||
do--Z.setCursor
|
||||
-- Init Zframework
|
||||
do-- Z.setCursor
|
||||
local normImg=GC.DO{16,16,
|
||||
{'fCirc',8,8,4},
|
||||
{'setCL',1,1,1,.7},
|
||||
@@ -148,6 +146,7 @@ do--Z.setCursor
|
||||
{'dCirc',8,8,7},
|
||||
{'fCirc',8,8,3},
|
||||
}
|
||||
local _
|
||||
Z.setCursor(function(time,x,y)
|
||||
if not SETTING.sysCursor then
|
||||
local R=math.floor((time+1)/2)%7+1
|
||||
@@ -156,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
|
||||
@@ -175,17 +174,23 @@ 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
|
||||
applySettings()
|
||||
saveSettings()
|
||||
end)
|
||||
Z.setVersionText(VERSION.string)
|
||||
Z.setDebugInfo{
|
||||
{"Cache",gcinfo},
|
||||
{"Tasks",TASK.getCount},
|
||||
{"Voices",VOC.getQueueCount},
|
||||
{"Audios",love.audio.getSourceCount},
|
||||
}
|
||||
do--Z.setOnFocus
|
||||
do-- Z.setOnFocus
|
||||
local function task_autoSoundOff()
|
||||
while true do
|
||||
coroutine.yield()
|
||||
@@ -213,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
|
||||
@@ -223,23 +228,32 @@ do--Z.setOnFocus
|
||||
end
|
||||
end)
|
||||
end
|
||||
Z.setOnQuit(destroyPlayers)
|
||||
Z.setOnBeforeQuit(function()
|
||||
NET.ws_close()
|
||||
TASK.new(function()
|
||||
TEST.yieldT(.26)
|
||||
love.event.quit()
|
||||
end)
|
||||
end)
|
||||
Z.setOnQuit(function()
|
||||
destroyPlayers()
|
||||
end)
|
||||
|
||||
--Load settings and statistics
|
||||
-- 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.")
|
||||
end
|
||||
|
||||
--Initialize fields, sequence, missions, gameEnv for cutsom game
|
||||
-- Initialize fields, sequence, missions, gameEnv for cutsom game
|
||||
local fieldData=loadFile('conf/customBoards','-string -canSkip')
|
||||
if fieldData then
|
||||
fieldData=STRING.split(fieldData,"!")
|
||||
@@ -264,7 +278,7 @@ end
|
||||
TABLE.complete(require"parts.customEnv0",CUSTOMENV)
|
||||
|
||||
|
||||
--Initialize image libs
|
||||
-- Initialize image libs
|
||||
IMG.init{
|
||||
lock='media/image/mess/lock.png',
|
||||
dialCircle='media/image/mess/dialCircle.png',
|
||||
@@ -343,11 +357,11 @@ SKIN.load{
|
||||
{name="wtf",path='media/image/skin/wtf_mrz.png'},
|
||||
}
|
||||
|
||||
--Initialize sound libs
|
||||
-- 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 isSafeFile('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
|
||||
@@ -355,8 +369,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 isSafeFile('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
|
||||
@@ -372,7 +386,7 @@ VOC.init{
|
||||
'welcome',
|
||||
}
|
||||
|
||||
--Initialize language lib
|
||||
-- Initialize language lib
|
||||
LANG.init('zh',
|
||||
{
|
||||
zh=require'parts.language.lang_zh',
|
||||
@@ -385,17 +399,17 @@ LANG.init('zh',
|
||||
ja=require'parts.language.lang_ja',
|
||||
symbol=require'parts.language.lang_symbol',
|
||||
zh_code=require'parts.language.lang_zh_code',
|
||||
--1. Add language file to LANG folder;
|
||||
--2. Require it;
|
||||
--3. Add a button in parts/scenes/lang.lua;
|
||||
-- 1. Add language file to LANG folder;
|
||||
-- 2. Require it;
|
||||
-- 3. Add a button in parts/scenes/lang.lua;
|
||||
},
|
||||
{
|
||||
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)
|
||||
@@ -409,32 +423,32 @@ 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 isSafeFile('parts/backgrounds/'..v)and v:sub(-3)=='lua'then
|
||||
-- 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
|
||||
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 isSafeFile('parts/scenes/'..v)then
|
||||
-- Load scene files from SOURCE ONLY
|
||||
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)
|
||||
end
|
||||
end
|
||||
--Load mode files
|
||||
-- Load mode files
|
||||
for i=1,#MODES do
|
||||
local m=MODES[i]--Mode template
|
||||
if isSafeFile('parts/modes/'..m.name)then
|
||||
local m=MODES[i]-- Mode template
|
||||
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 isSafeFile('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
|
||||
@@ -446,14 +460,14 @@ end
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Load Files: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
--Update data
|
||||
-- Update data
|
||||
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
|
||||
@@ -466,10 +480,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
|
||||
@@ -529,16 +543,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
|
||||
@@ -546,15 +560,15 @@ do
|
||||
STAT.version=VERSION.code
|
||||
needSave=true
|
||||
end
|
||||
SETTING.appLock,SETTING.dataSaving,SETTING.swap=nil
|
||||
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
|
||||
@@ -566,26 +580,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
|
||||
@@ -598,7 +612,7 @@ do
|
||||
end
|
||||
end
|
||||
|
||||
--First start
|
||||
-- First start
|
||||
FIRSTLAUNCH=STAT.run==0
|
||||
if FIRSTLAUNCH and MOBILE then
|
||||
SETTING.VKSwitch=true
|
||||
@@ -606,18 +620,18 @@ if FIRSTLAUNCH and MOBILE then
|
||||
SETTING.cleanCanvas=true
|
||||
end
|
||||
|
||||
--Apply system setting
|
||||
-- Apply system setting
|
||||
applySettings()
|
||||
|
||||
--Load replays
|
||||
for _,fileName in next,fs.getDirectoryItems('replay')do
|
||||
if fileName:sub(12,12):match("[a-zA-Z]")then
|
||||
-- Load replays
|
||||
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
|
||||
@@ -653,16 +667,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
|
||||
-- Launch testing task if launch param received
|
||||
if TABLE.find(arg,'-- test') then
|
||||
TASK.new(function()
|
||||
while not LOADED do YIELD()end
|
||||
while not LOADED do coroutine.yield() end
|
||||
|
||||
LOG("\27[92m\27[1mAutomatic Test Started\27[0m")
|
||||
BGM.setVol(0)SFX.setVol(0)
|
||||
@@ -670,7 +684,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()
|
||||
@@ -684,12 +698,14 @@ if TABLE.find(arg,'--test')then
|
||||
end)
|
||||
TASK.new(function()
|
||||
while true do
|
||||
YIELD()
|
||||
if Z.getErr(1)then break end
|
||||
coroutine.yield()
|
||||
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)
|
||||
love.event.quit(1)
|
||||
end)
|
||||
end
|
||||
WS.switchHost('101.43.110.22','10026','/tech/socket/v1')
|
||||
WS.switchHost('cafuuchino1.3322.org','10026','/techmino/ws/v1')
|
||||
HTTP.setHost("cafuuchino1.3322.org:10026")
|
||||
HTTP.setThreadCount(1)
|
||||
|
||||
476
parts/RSlist.lua
476
parts/RSlist.lua
@@ -1,43 +1,43 @@
|
||||
local defaultCenterTex=GC.DO{1,1}--No texture
|
||||
local defaultCenterPos={--For SRS-like RSs
|
||||
--Tetromino
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},--Z
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},--S
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},--J
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},--L
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},--T
|
||||
{[0]={.5,.5},{.5,.5},{.5,.5},{.5,.5}},--O
|
||||
{[0]={-.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5}},--I
|
||||
local defaultCenterTex=GC.DO{1,1}-- No texture
|
||||
local defaultCenterPos={-- For SRS-like RSs
|
||||
-- Tetromino
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},-- Z
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},-- S
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},-- J
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},-- L
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},-- T
|
||||
{[0]={.5,.5},{.5,.5},{.5,.5},{.5,.5}},-- O
|
||||
{[0]={-.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5}},-- I
|
||||
|
||||
--Pentomino
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},--Z5
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},--S5
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},--P
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},--Q
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},--F
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},--E
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},--T5
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},--U
|
||||
{[0]={.5,1.5},{.5,.5},{1.5,.5},{1.5,1.5}},--V
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},--W
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},--X
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--J5
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--L5
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--R
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--Y
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--N
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},--H
|
||||
{[0]={0,2},{2,0},{0,2},{2,0}},--I5
|
||||
-- Pentomino
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},-- Z5
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},-- S5
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},-- P
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},-- Q
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},-- F
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},-- E
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},-- T5
|
||||
{[0]={0,1},{1,0},{1,1},{1,1}},-- U
|
||||
{[0]={.5,1.5},{.5,.5},{1.5,.5},{1.5,1.5}},-- V
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},-- W
|
||||
{[0]={1,1},{1,1},{1,1},{1,1}},-- X
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},-- J5
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},-- L5
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},-- R
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},-- Y
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},-- N
|
||||
{[0]={.5,1.5},{1.5,.5},{.5,1.5},{1.5,.5}},-- H
|
||||
{[0]={0,2},{2,0},{0,2},{2,0}},-- I5
|
||||
|
||||
--Trimino
|
||||
{[0]={0,1},{1,0},{0,1},{1,0}},--I3
|
||||
{[0]={.5,.5},{.5,.5},{.5,.5},{.5,.5}},--C
|
||||
-- Trimino
|
||||
{[0]={0,1},{1,0},{0,1},{1,0}},-- I3
|
||||
{[0]={.5,.5},{.5,.5},{.5,.5},{.5,.5}},-- C
|
||||
|
||||
--Domino
|
||||
{[0]={-.5,.5},{.5,-.5},{.5,.5},{.5,.5}},--I2
|
||||
-- Domino
|
||||
{[0]={-.5,.5},{.5,-.5},{.5,.5},{.5,.5}},-- I2
|
||||
|
||||
--Dot
|
||||
{[0]={0,0},{0,0},{0,0},{0,0}},--O1
|
||||
-- Dot
|
||||
{[0]={0,0},{0,0},{0,0},{0,0}},-- O1
|
||||
}
|
||||
|
||||
local noKickSet,noKickSet_180 do
|
||||
@@ -52,14 +52,14 @@ local function _strToVec(list)
|
||||
return list
|
||||
end
|
||||
|
||||
--Use this if the block is centrosymmetry, *PTR!!!
|
||||
-- Use this if the block is centrosymmetry, *PTR!!!
|
||||
local function _centroSymSet(L)
|
||||
L[23]=L[01]L[32]=L[10]
|
||||
L[21]=L[03]L[12]=L[30]
|
||||
L[20]=L[02]L[31]=L[13]
|
||||
end
|
||||
|
||||
--Use this to copy a symmetry set
|
||||
-- Use this to copy a symmetry set
|
||||
local function _flipList(O)
|
||||
if not O then
|
||||
return
|
||||
@@ -91,21 +91,21 @@ end
|
||||
local TRS
|
||||
do
|
||||
local OspinList={
|
||||
{111,5,2, 0,-1,0},{111,5,2,-1,-1,0},{111,5,0,-1, 0,0},--T
|
||||
{333,5,2,-1,-1,0},{333,5,2, 0,-1,0},{333,5,0, 0, 0,0},--T
|
||||
{313,1,2,-1, 0,0},{313,1,2, 0,-1,0},{313,1,2, 0, 0,0},--Z
|
||||
{131,2,2, 0, 0,0},{131,2,2,-1,-1,0},{131,2,2,-1, 0,0},--S
|
||||
{131,1,2,-1, 0,0},{131,1,2, 0,-1,0},{131,1,2, 0, 0,0},--Z(misOrder)
|
||||
{313,2,2, 0, 0,0},{313,2,2,-1,-1,0},{313,2,2,-1, 0,0},--S(misOrder)
|
||||
{331,3,2, 0,-1,0},--J(farDown)
|
||||
{113,4,2,-1,-1,0},--L(farDown)
|
||||
{113,3,2,-1,-1,0},{113,3,0, 0, 0,0},--J
|
||||
{331,4,2, 0,-1,0},{331,4,0,-1, 0,0},--L
|
||||
{222,7,0,-1, 1,1},{222,7,0,-2, 1,1},{222,7,0, 0, 1,1},--I(high)
|
||||
{222,7,2,-1, 0,2},{222,7,2,-2, 0,2},{222,7,2, 0, 0,2},--I(low)
|
||||
{121,6,0, 1,-1,2},{112,6,0, 2,-1,2},{122,6,0, 1,-2,2},--O
|
||||
{323,6,0,-1,-1,2},{332,6,0,-2,-1,2},{322,6,0,-1,-2,2},--O
|
||||
}--{keys, ID, dir, dx, dy, freeLevel (0=immovable, 1=U/D-immovable, 2=free)}
|
||||
{111,5,2, 0,-1,0},{111,5,2,-1,-1,0},{111,5,0,-1, 0,0},-- T
|
||||
{333,5,2,-1,-1,0},{333,5,2, 0,-1,0},{333,5,0, 0, 0,0},-- T
|
||||
{313,1,2,-1, 0,0},{313,1,2, 0,-1,0},{313,1,2, 0, 0,0},-- Z
|
||||
{131,2,2, 0, 0,0},{131,2,2,-1,-1,0},{131,2,2,-1, 0,0},-- S
|
||||
{131,1,2,-1, 0,0},{131,1,2, 0,-1,0},{131,1,2, 0, 0,0},-- Z(misOrder)
|
||||
{313,2,2, 0, 0,0},{313,2,2,-1,-1,0},{313,2,2,-1, 0,0},-- S(misOrder)
|
||||
{331,3,2, 0,-1,0},-- J(farDown)
|
||||
{113,4,2,-1,-1,0},-- L(farDown)
|
||||
{113,3,2,-1,-1,0},{113,3,0, 0, 0,0},-- J
|
||||
{331,4,2, 0,-1,0},{331,4,0,-1, 0,0},-- L
|
||||
{222,7,0,-1, 1,1},{222,7,0,-2, 1,1},{222,7,0, 0, 1,1},-- I(high)
|
||||
{222,7,2,-1, 0,2},{222,7,2,-2, 0,2},{222,7,2, 0, 0,2},-- I(low)
|
||||
{121,6,0, 1,-1,2},{112,6,0, 2,-1,2},{122,6,0, 1,-2,2},-- O
|
||||
{323,6,0,-1,-1,2},{332,6,0,-2,-1,2},{322,6,0,-1,-2,2},-- O
|
||||
}-- {keys, ID, dir, dx, dy, freeLevel (0=immovable, 1=U/D-immovable, 2=free)}
|
||||
local XspinList={
|
||||
{{ 1,-1},{ 1, 0},{ 1, 1},{ 1,-2},{ 1, 2}},
|
||||
{{ 0,-1},{ 0,-2},{ 0, 1},{ 0,-2},{ 0, 2}},
|
||||
@@ -137,8 +137,8 @@ do
|
||||
[20]={'+0+0','-1+0','+1+0','+0+1','+0-1'},
|
||||
[13]={'+0+0','+0-1','+0+1','+0-2'},
|
||||
[31]={'+0+0','+0+1','+0-1','+0+2'},
|
||||
},--Z
|
||||
false,--S
|
||||
},-- Z
|
||||
false,-- S
|
||||
{
|
||||
[01]={'+0+0','-1+0','-1+1','+0-2','+1+1','+0+1','+0-1'},
|
||||
[10]={'+0+0','+1+0','+1-1','+0+2','-1-1','+0-1','+0+1'},
|
||||
@@ -152,8 +152,8 @@ do
|
||||
[20]={'+0+0','+1+0','-1+0','+0+1','+0-1'},
|
||||
[13]={'+0+0','+0-1','+0+1','+1+0'},
|
||||
[31]={'+0+0','+0+1','+0-1','-1+0'},
|
||||
},--J
|
||||
false,--L
|
||||
},-- J
|
||||
false,-- L
|
||||
{
|
||||
[01]={'+0+0','-1+0','-1+1','+0-2','-1-2','+0+1'},
|
||||
[10]={'+0+0','+1+0','+1-1','+0+2','+1+2','+0+1','+0-1'},
|
||||
@@ -167,7 +167,7 @@ do
|
||||
[20]={'+0+0','+1+0','-1+0','+0-1'},
|
||||
[13]={'+0+0','+0-1','+0+1','+1+0','+0-2','+0+2'},
|
||||
[31]={'+0+0','+0-1','+0+1','-1+0','+0-2','+0+2'},
|
||||
},--T
|
||||
},-- T
|
||||
function(P,d)
|
||||
if P.gameEnv.easyFresh then
|
||||
P:freshBlock('fresh')
|
||||
@@ -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
|
||||
@@ -220,7 +220,7 @@ do
|
||||
SFX.play('rotate',nil,P:getCenterX()*.15)
|
||||
end
|
||||
end
|
||||
end,--O
|
||||
end,-- O
|
||||
{
|
||||
[01]={'+0+0','+0+1','+1+0','-2+0','-2-1','+1+2'},
|
||||
[10]={'+0+0','+2+0','-1+0','-1-2','+2+1','+0+1'},
|
||||
@@ -234,14 +234,14 @@ do
|
||||
[20]={'+0+0','+1+0','-1+0','+0+1','+0-1'},
|
||||
[13]={'+0+0','+0-1','-1+0','+1+0','+0+1'},
|
||||
[31]={'+0+0','+0-1','+1+0','-1+0','+0+1'},
|
||||
},--I
|
||||
},-- I
|
||||
{
|
||||
[01]={'+0+0','+0+1','+1+1','-1+0','+0-3','+0+2','+0-2','+0+3','-1+2'},
|
||||
[10]={'+0+0','+0-1','-1-1','+1+0','+0-3','+0+2','+0-2','+0+3','+1-2'},
|
||||
[03]={'+0+0','+1+0','+0-3','+0-1','+0+1','+0-2','+0+2','+0+3','+1+2'},
|
||||
[30]={'+0+0','-1+0','+0-1','+0+1','+0-2','+0-3','+0+2','+0+3','-1-2'},
|
||||
},--Z5
|
||||
false,--S5
|
||||
},-- Z5
|
||||
false,-- S5
|
||||
{
|
||||
[01]={'+0+0','-1+0','-1+1','+0-2','-1-2','-1-1','+0+1'},
|
||||
[10]={'+0+0','+1+0','+1-1','+0+2','+1+2','+0-1','+1+1'},
|
||||
@@ -255,8 +255,8 @@ do
|
||||
[20]={'+0+0','+1+0','+0+1','+0-1'},
|
||||
[13]={'+0+0','+1+0','+0+1','-1+0'},
|
||||
[31]={'+0+0','-1+0','+0-1','+1+0'},
|
||||
},--P
|
||||
false,--Q
|
||||
},-- P
|
||||
false,-- Q
|
||||
{
|
||||
[01]={'+0+0','-1+0','+1+0','-1+1','+0-2','+0-3'},
|
||||
[10]={'+0+0','+1+0','+1-1','-1+0','+0+2','+0+3'},
|
||||
@@ -270,8 +270,8 @@ do
|
||||
[20]={'+0+0','-1+0','+1+0','+1+1'},
|
||||
[13]={'+0+0','+0-1','-1+1','+0+1'},
|
||||
[31]={'+0+0','+0-1','+1-1','+0+1'},
|
||||
},--F
|
||||
false,--E
|
||||
},-- F
|
||||
false,-- E
|
||||
{
|
||||
[01]={'+0+0','+0-1','-1-1','+1+0','+1+1','+0-3','-1+0','+0+2','-1+2'},
|
||||
[10]={'+0+0','+1+0','+0-1','-1-1','+0-2','-1+1','+0-3','+1-2','+0+1'},
|
||||
@@ -285,7 +285,7 @@ do
|
||||
[20]={'+0+0','+0-1','+0+1','+0-2'},
|
||||
[13]={'+0+0','+1+0','-1+1','-2+0'},
|
||||
[31]={'+0+0','-1+0','+1+1','+2+0'},
|
||||
},--T5
|
||||
},-- T5
|
||||
{
|
||||
[01]={'+0+0','-1+0','-1+1','+0-2','-1-2'},
|
||||
[10]={'+0+0','+1+0','+1-1','+0+2','+1+2'},
|
||||
@@ -299,7 +299,7 @@ do
|
||||
[20]={'+0+0','+0-1'},
|
||||
[13]={'+0+0','+0-1','+0+1','+1+0'},
|
||||
[31]={'+0+0','+0-1','+0+1','-1+0'},
|
||||
},--U
|
||||
},-- U
|
||||
{
|
||||
[01]={'+0+0','+0+1','-1+0','+0-2','-1-2'},
|
||||
[10]={'+0+0','+0+1','+1+0','+0-2','+1-2'},
|
||||
@@ -313,7 +313,7 @@ do
|
||||
[20]={'+0+0','+1-1','-1+1'},
|
||||
[13]={'+0+0','+1+1','-1-1'},
|
||||
[31]={'+0+0','-1-1','+1+1'},
|
||||
},--V
|
||||
},-- V
|
||||
{
|
||||
[01]={'+0+0','+0-1','-1+0','+1+0','+1-1','+0+2'},
|
||||
[10]={'+0+0','+0-1','-1-1','+0+1','+0-2','+1-2','+0+2'},
|
||||
@@ -327,15 +327,15 @@ do
|
||||
[20]={'+0+0','+0+1','+1+0'},
|
||||
[13]={'+0+0','+0+1','-1+0'},
|
||||
[31]={'+0+0','+0-1','+1+0'},
|
||||
},--W
|
||||
},-- 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')
|
||||
@@ -344,7 +344,7 @@ do
|
||||
end
|
||||
end
|
||||
P:freshBlock('fresh')
|
||||
end,--X
|
||||
end,-- X
|
||||
{
|
||||
[01]={'+0+0','-1+0','-1+1','+0-3','-1+1','-1+2','+0+1'},
|
||||
[10]={'+0+0','-1+0','+1-1','+0+3','+1-1','+1-2','+0+1'},
|
||||
@@ -358,8 +358,8 @@ do
|
||||
[20]={'+0+0','+0+1','+1+1','-1+1','+1+0','-2+1'},
|
||||
[13]={'+0+0','-1+0','-1-1','+0+1','-1-2'},
|
||||
[31]={'+0+0','+1+0','+1+1','+0-1','+1+2'},
|
||||
},--J5
|
||||
false,--L5
|
||||
},-- J5
|
||||
false,-- L5
|
||||
{
|
||||
[01]={'+0+0','-1+0','-1+1','+1+0','-1+2','-1-1','+0-3','+0+1'},
|
||||
[10]={'+0+0','-1+0','+1+0','+1-1','+1-2','+1+1','+0+3','+0+1'},
|
||||
@@ -373,8 +373,8 @@ do
|
||||
[20]={'+0+0','+0+1','-1+1','+1+0','-2+1','+0-1'},
|
||||
[13]={'+0+0','-1+0','-1-1','+0+1','-1-2'},
|
||||
[31]={'+0+0','+1+0','+1+1','+0-1','+1+2'},
|
||||
},--R
|
||||
false,--Y
|
||||
},-- R
|
||||
false,-- Y
|
||||
{
|
||||
[01]={'+0+0','-1+0','-1+1','+0+1','+1+0','+1+1','-1+2','-2+0','+0-2'},
|
||||
[10]={'+0+0','+1+0','-1+0','+0-1','-1-1','+1-1','+1-2','+2+0','+0+2'},
|
||||
@@ -388,20 +388,20 @@ do
|
||||
[20]={'+0+0','+1+0','+0-2','+0+1'},
|
||||
[13]={'+0+0','-1+0','-1-1','+0+1','+1+2'},
|
||||
[31]={'+0+0','+1+0','+1+1','+0-1','-1-2'},
|
||||
},--N
|
||||
false,--H
|
||||
},-- N
|
||||
false,-- H
|
||||
{
|
||||
[01]={'+0+0','+1-1','+1+0','+1+1','+0+1','-1+1','-1+0','-1-1','+0-1','+0-2','-2-1','-2-2','+2+0','+2-1','+2-2','+1+2','+2+2','-1+2','-2+2'},
|
||||
[10]={'+0+0','-1+0','-1-1','+0-1','+1-1','-2-2','-2-1','-2+0','-1-2','+0-2','+1-2','+2-2','-1+1','-2+1','-2+2','+1+0','+2+0','+2-1','+0+1','+1-1','+2-2'},
|
||||
[03]={'+0+0','-1-1','-1+0','-1+1','+0+1','+1+1','+1+0','+1-1','+0-1','+0-2','+2-1','+2-2','-2+0','-2-1','-2-2','-1+2','-2+2','+1+2','+2+2'},
|
||||
[30]={'+0+0','+1+0','+1-1','+0-1','-1-1','+2-2','+2-1','+2+0','+1-2','+0-2','-1-2','-2-2','+1+1','+2+1','+2+2','-1+0','-2+0','-2-1','+0+1','-1-1','-2-2'},
|
||||
},--I5
|
||||
},-- I5
|
||||
{
|
||||
[01]={'+0+0','-1+0','-1-1','+1+1','-1+1'},
|
||||
[10]={'+0+0','-1+0','+1+0','-1-1','+1+1'},
|
||||
[03]={'+0+0','+1+0','+1-1','-1+1','+1+1'},
|
||||
[30]={'+0+0','+1+0','-1+0','+1-1','-1+1'},
|
||||
},--I3
|
||||
},-- I3
|
||||
{
|
||||
[01]={'+0+0','-1+0','+1+0'},
|
||||
[10]={'+0+0','+1+0','-1+0'},
|
||||
@@ -415,7 +415,7 @@ do
|
||||
[20]={'+0+0','+0+1','-1+1','+1+1'},
|
||||
[13]={'+0+0','+0-1','-1-1','+1-1'},
|
||||
[31]={'+0+0','+0+1','+1+1','-1+1'},
|
||||
},--C
|
||||
},-- C
|
||||
{
|
||||
[01]={'+0+0','-1+0','+0+1'},
|
||||
[10]={'+0+0','+1+0','+0+1'},
|
||||
@@ -429,22 +429,22 @@ do
|
||||
[20]={'+0+0','+0+1','+0-1'},
|
||||
[13]={'+0+0','-1+0','+1+0'},
|
||||
[31]={'+0+0','+1+0','-1+0'},
|
||||
},--I2
|
||||
nil,--O1
|
||||
},-- I2
|
||||
nil,-- O1
|
||||
}
|
||||
}
|
||||
TRS.centerDisp[6]=false
|
||||
TRS.centerDisp[18]=false
|
||||
TRS.kickTable[2]= _reflect(TRS.kickTable[1])--SZ
|
||||
TRS.kickTable[4]= _reflect(TRS.kickTable[3])--LJ
|
||||
TRS.kickTable[9]= _reflect(TRS.kickTable[8])--S5Z5
|
||||
TRS.kickTable[11]=_reflect(TRS.kickTable[10])--PQ
|
||||
TRS.kickTable[13]=_reflect(TRS.kickTable[12])--FE
|
||||
TRS.kickTable[20]=_reflect(TRS.kickTable[19])--L5J5
|
||||
TRS.kickTable[22]=_reflect(TRS.kickTable[21])--RY
|
||||
TRS.kickTable[24]=_reflect(TRS.kickTable[23])--NH
|
||||
_centroSymSet(TRS.kickTable[8])_centroSymSet(TRS.kickTable[9])--S5Z5
|
||||
_centroSymSet(TRS.kickTable[25])_centroSymSet(TRS.kickTable[26])--I5I3
|
||||
TRS.kickTable[2]= _reflect(TRS.kickTable[1])-- SZ
|
||||
TRS.kickTable[4]= _reflect(TRS.kickTable[3])-- LJ
|
||||
TRS.kickTable[9]= _reflect(TRS.kickTable[8])-- S5Z5
|
||||
TRS.kickTable[11]=_reflect(TRS.kickTable[10])-- PQ
|
||||
TRS.kickTable[13]=_reflect(TRS.kickTable[12])-- FE
|
||||
TRS.kickTable[20]=_reflect(TRS.kickTable[19])-- L5J5
|
||||
TRS.kickTable[22]=_reflect(TRS.kickTable[21])-- RY
|
||||
TRS.kickTable[24]=_reflect(TRS.kickTable[23])-- NH
|
||||
_centroSymSet(TRS.kickTable[8])_centroSymSet(TRS.kickTable[9])-- S5Z5
|
||||
_centroSymSet(TRS.kickTable[25])_centroSymSet(TRS.kickTable[26])-- I5I3
|
||||
end
|
||||
|
||||
local SRS
|
||||
@@ -469,12 +469,12 @@ do
|
||||
[32]={'+0+0','-1+0','-1-1','+0+2','-1+2'},
|
||||
[23]={'+0+0','+1+0','+1+1','+0-2','+1-2'},
|
||||
[02]={'+0+0'},[20]={'+0+0'},[13]={'+0+0'},[31]={'+0+0'},
|
||||
},--Z
|
||||
false,--S
|
||||
false,--J
|
||||
false,--L
|
||||
false,--T
|
||||
noKickSet,--O
|
||||
},-- Z
|
||||
false,-- S
|
||||
false,-- J
|
||||
false,-- L
|
||||
false,-- T
|
||||
noKickSet,-- O
|
||||
{
|
||||
[01]={'+0+0','-2+0','+1+0','-2-1','+1+2'},
|
||||
[10]={'+0+0','+2+0','-1+0','+2+1','-1-2'},
|
||||
@@ -485,11 +485,11 @@ do
|
||||
[30]={'+0+0','+1+0','-2+0','+1-2','-2+1'},
|
||||
[03]={'+0+0','-1+0','+2+0','-1+2','+2-1'},
|
||||
[02]={'+0+0'},[20]={'+0+0'},[13]={'+0+0'},[31]={'+0+0'},
|
||||
}--I
|
||||
}-- 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
|
||||
@@ -519,12 +519,12 @@ do
|
||||
[20]={'+0+0','+1+0','-1+0','+0-1','+0+1'},
|
||||
[13]={'+0+0','+0-1','-1+0','+1+0','+0+1'},
|
||||
[31]={'+0+0','+0-1','-1+0','+1+0','+0+1'},
|
||||
},--Z
|
||||
false,--S
|
||||
false,--J
|
||||
false,--L
|
||||
false,--T
|
||||
noKickSet,--O
|
||||
},-- Z
|
||||
false,-- S
|
||||
false,-- J
|
||||
false,-- L
|
||||
false,-- T
|
||||
noKickSet,-- O
|
||||
{
|
||||
[01]={'+0+0','-2+0','+1+0','-2-1','+1+2'},
|
||||
[10]={'+0+0','+2+0','-1+0','+2+1','-1-2'},
|
||||
@@ -538,11 +538,11 @@ do
|
||||
[20]={'+0+0','+1+0','-1+0','+0+1','+0-1'},
|
||||
[13]={'+0+0','+0-1','-1+0','+1+0','+0+1'},
|
||||
[31]={'+0+0','+0-1','+1+0','-1+0','+0+1'},
|
||||
}--I
|
||||
}-- 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
|
||||
@@ -570,19 +570,19 @@ do
|
||||
[20]={'+0+0','+1+0','-1+0','+0-1','+0+1'},
|
||||
[13]={'+0+0','+0-1','-1+0','+1+0','+0+1'},
|
||||
[31]={'+0+0','+0-1','-1+0','+1+0','+0+1'},
|
||||
},--Z
|
||||
false,--S
|
||||
false,--J
|
||||
false,--L
|
||||
false,--T
|
||||
noKickSet,--O
|
||||
false,--I
|
||||
},-- Z
|
||||
false,-- S
|
||||
false,-- J
|
||||
false,-- L
|
||||
false,-- T
|
||||
noKickSet,-- O
|
||||
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
|
||||
SRS_X.kickTable[10]=SRS_X.kickTable[1]--P
|
||||
SRS_X.kickTable[11]=SRS_X.kickTable[1]--Q
|
||||
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
|
||||
|
||||
local BiRS
|
||||
@@ -591,45 +591,45 @@ do
|
||||
local L=_strToVec{'+0+0','+1+0','+1-1','+0-1','+1+1','-1-1','-1+0','+0+1','-1+1','+0+2','+1+2','-1+2','+2+0','-2+0'}
|
||||
local F=_strToVec{'+0+0','+0-1','+0+1','+0+2'}
|
||||
local list={
|
||||
{[02]=L,[20]=R,[13]=R,[31]=L},--Z
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},--S
|
||||
{[02]=L,[20]=R,[13]=L,[31]=R},--J
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},--L
|
||||
{[02]=F,[20]=F,[13]=L,[31]=R},--T
|
||||
{[02]=F,[20]=F,[13]=F,[31]=F},--O
|
||||
{[02]=F,[20]=F,[13]=R,[31]=L},--I
|
||||
{[02]=L,[20]=R,[13]=R,[31]=L},-- Z
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},-- S
|
||||
{[02]=L,[20]=R,[13]=L,[31]=R},-- J
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},-- L
|
||||
{[02]=F,[20]=F,[13]=L,[31]=R},-- T
|
||||
{[02]=F,[20]=F,[13]=F,[31]=F},-- O
|
||||
{[02]=F,[20]=F,[13]=R,[31]=L},-- I
|
||||
|
||||
{[02]=L,[20]=L,[13]=R,[31]=R},--Z5
|
||||
{[02]=R,[20]=R,[13]=L,[31]=L},--S5
|
||||
{[02]=L,[20]=R,[13]=L,[31]=R},--P
|
||||
{[02]=R,[20]=L,[13]=R,[31]=L},--Q
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},--F
|
||||
{[02]=L,[20]=R,[13]=R,[31]=L},--E
|
||||
{[02]=F,[20]=F,[13]=L,[31]=R},--T5
|
||||
{[02]=F,[20]=F,[13]=L,[31]=R},--U
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},--V
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},--W
|
||||
{[02]=F,[20]=F,[13]=F,[31]=F},--X
|
||||
{[02]=L,[20]=R,[13]=R,[31]=L},--J5
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},--L5
|
||||
{[02]=L,[20]=R,[13]=R,[31]=L},--R
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},--Y
|
||||
{[02]=L,[20]=R,[13]=R,[31]=L},--N
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},--H
|
||||
{[02]=F,[20]=F,[13]=F,[31]=F},--I5
|
||||
{[02]=L,[20]=L,[13]=R,[31]=R},-- Z5
|
||||
{[02]=R,[20]=R,[13]=L,[31]=L},-- S5
|
||||
{[02]=L,[20]=R,[13]=L,[31]=R},-- P
|
||||
{[02]=R,[20]=L,[13]=R,[31]=L},-- Q
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},-- F
|
||||
{[02]=L,[20]=R,[13]=R,[31]=L},-- E
|
||||
{[02]=F,[20]=F,[13]=L,[31]=R},-- T5
|
||||
{[02]=F,[20]=F,[13]=L,[31]=R},-- U
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},-- V
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},-- W
|
||||
{[02]=F,[20]=F,[13]=F,[31]=F},-- X
|
||||
{[02]=L,[20]=R,[13]=R,[31]=L},-- J5
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},-- L5
|
||||
{[02]=L,[20]=R,[13]=R,[31]=L},-- R
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},-- Y
|
||||
{[02]=L,[20]=R,[13]=R,[31]=L},-- N
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},-- H
|
||||
{[02]=F,[20]=F,[13]=F,[31]=F},-- I5
|
||||
|
||||
{[02]=F,[20]=F,[13]=F,[31]=F},--I3
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},--C
|
||||
{[02]=F,[20]=F,[13]=R,[31]=L},--I2
|
||||
{[02]=F,[20]=F,[13]=F,[31]=F},--O1
|
||||
{[02]=F,[20]=F,[13]=F,[31]=F},-- I3
|
||||
{[02]=R,[20]=L,[13]=L,[31]=R},-- C
|
||||
{[02]=F,[20]=F,[13]=R,[31]=L},-- I2
|
||||
{[02]=F,[20]=F,[13]=F,[31]=F},-- O1
|
||||
}
|
||||
for i=1,29 do
|
||||
local a,b=R,L
|
||||
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
|
||||
@@ -700,7 +700,7 @@ do
|
||||
end
|
||||
end
|
||||
|
||||
--Try release left/right, then softdrop, failed to rotate otherwise
|
||||
-- Try release left/right, then softdrop, failed to rotate otherwise
|
||||
if dx~=0 then
|
||||
dx=0
|
||||
elseif dy~=0 then
|
||||
@@ -728,24 +728,24 @@ do
|
||||
[02]=upOnly,[20]=upOnly,[13]=upOnly,[31]=upOnly,
|
||||
}
|
||||
local centerPos=TABLE.copy(defaultCenterPos)
|
||||
centerPos[1]={[0]={1,1},{1,0},{1,1},{1,0}}--Z
|
||||
centerPos[2]={[0]={1,1},{1,1},{1,1},{1,1}}--S
|
||||
centerPos[3]={[0]={1,1},{1,0},{1,1},{1,1}}--L
|
||||
centerPos[4]={[0]={1,1},{1,0},{1,1},{1,1}}--J
|
||||
centerPos[5]={[0]={1,1},{1,0},{1,1},{1,1}}--T
|
||||
centerPos[7]={[0]={0,2},{2,0},{0,2},{2,0}}--I
|
||||
centerPos[10]={[0]={1,1},{1,0},{1,1},{1,0}}--P
|
||||
centerPos[11]={[0]={1,1},{1,1},{1,1},{1,1}}--Q
|
||||
centerPos[15]={[0]={1,1},{1,0},{1,1},{1,1}}--U
|
||||
centerPos[16]={[0]={1,1},{1,1},{1,1},{1,1}}--V
|
||||
centerPos[19]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--J5
|
||||
centerPos[20]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--L5
|
||||
centerPos[21]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--R
|
||||
centerPos[22]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--Y
|
||||
centerPos[23]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--N
|
||||
centerPos[24]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--H
|
||||
centerPos[26]={[0]={0,1},{0,0},{0,1},{0,0}}--I3
|
||||
centerPos[28]={[0]={0,1},{0,0},{0,1},{0,0}}--I2
|
||||
centerPos[1]={[0]={1,1},{1,0},{1,1},{1,0}}-- Z
|
||||
centerPos[2]={[0]={1,1},{1,1},{1,1},{1,1}}-- S
|
||||
centerPos[3]={[0]={1,1},{1,0},{1,1},{1,1}}-- L
|
||||
centerPos[4]={[0]={1,1},{1,0},{1,1},{1,1}}-- J
|
||||
centerPos[5]={[0]={1,1},{1,0},{1,1},{1,1}}-- T
|
||||
centerPos[7]={[0]={0,2},{2,0},{0,2},{2,0}}-- I
|
||||
centerPos[10]={[0]={1,1},{1,0},{1,1},{1,0}}-- P
|
||||
centerPos[11]={[0]={1,1},{1,1},{1,1},{1,1}}-- Q
|
||||
centerPos[15]={[0]={1,1},{1,0},{1,1},{1,1}}-- U
|
||||
centerPos[16]={[0]={1,1},{1,1},{1,1},{1,1}}-- V
|
||||
centerPos[19]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- J5
|
||||
centerPos[20]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- L5
|
||||
centerPos[21]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- R
|
||||
centerPos[22]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- Y
|
||||
centerPos[23]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- N
|
||||
centerPos[24]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- H
|
||||
centerPos[26]={[0]={0,1},{0,0},{0,1},{0,0}}-- I3
|
||||
centerPos[28]={[0]={0,1},{0,0},{0,1},{0,0}}-- I2
|
||||
|
||||
ARS_Z={
|
||||
centerTex=GC.DO{10,10,
|
||||
@@ -765,24 +765,24 @@ end
|
||||
local DRS_weak
|
||||
do
|
||||
local centerPos=TABLE.copy(defaultCenterPos)
|
||||
centerPos[1]={[0]={1,1},{1,0},{1,1},{1,1}}--Z
|
||||
centerPos[2]={[0]={1,1},{1,0},{1,1},{1,1}}--S
|
||||
centerPos[3]={[0]={1,1},{1,0},{1,1},{1,1}}--L
|
||||
centerPos[4]={[0]={1,1},{1,0},{1,1},{1,1}}--J
|
||||
centerPos[5]={[0]={1,1},{1,0},{1,1},{1,1}}--T
|
||||
centerPos[7]={[0]={.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5}}--I
|
||||
centerPos[10]={[0]={1,1},{1,0},{1,1},{1,0}}--P
|
||||
centerPos[11]={[0]={1,1},{1,1},{1,1},{1,1}}--Q
|
||||
centerPos[15]={[0]={1,1},{1,0},{1,1},{1,1}}--U
|
||||
centerPos[16]={[0]={1,1},{1,1},{1,1},{1,1}}--V
|
||||
centerPos[19]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--J5
|
||||
centerPos[20]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--L5
|
||||
centerPos[21]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--R
|
||||
centerPos[22]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--Y
|
||||
centerPos[23]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--N
|
||||
centerPos[24]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}--H
|
||||
centerPos[26]={[0]={0,1},{0,0},{0,1},{0,0}}--I3
|
||||
centerPos[28]={[0]={0,1},{0,0},{0,1},{0,0}}--I2
|
||||
centerPos[1]={[0]={1,1},{1,0},{1,1},{1,1}}-- Z
|
||||
centerPos[2]={[0]={1,1},{1,0},{1,1},{1,1}}-- S
|
||||
centerPos[3]={[0]={1,1},{1,0},{1,1},{1,1}}-- L
|
||||
centerPos[4]={[0]={1,1},{1,0},{1,1},{1,1}}-- J
|
||||
centerPos[5]={[0]={1,1},{1,0},{1,1},{1,1}}-- T
|
||||
centerPos[7]={[0]={.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5}}-- I
|
||||
centerPos[10]={[0]={1,1},{1,0},{1,1},{1,0}}-- P
|
||||
centerPos[11]={[0]={1,1},{1,1},{1,1},{1,1}}-- Q
|
||||
centerPos[15]={[0]={1,1},{1,0},{1,1},{1,1}}-- U
|
||||
centerPos[16]={[0]={1,1},{1,1},{1,1},{1,1}}-- V
|
||||
centerPos[19]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- J5
|
||||
centerPos[20]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- L5
|
||||
centerPos[21]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- R
|
||||
centerPos[22]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- Y
|
||||
centerPos[23]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- N
|
||||
centerPos[24]={[0]={1.5,1.5},{1.5,0.5},{1.5,1.5},{1.5,0.5}}-- H
|
||||
centerPos[26]={[0]={0,1},{0,0},{0,1},{0,0}}-- I3
|
||||
centerPos[28]={[0]={0,1},{0,0},{0,1},{0,0}}-- I2
|
||||
|
||||
local L={'+0+0','-1+0','+1+0','+0-1','-1-1','+1-1'}
|
||||
local R={'+0+0','+1+0','-1+0','+0-1','+1-1','-1-1'}
|
||||
@@ -802,24 +802,24 @@ do
|
||||
},
|
||||
centerPos=centerPos,
|
||||
kickTable={
|
||||
Z,S,--Z,S
|
||||
Z,S,--J,L
|
||||
Z,--T
|
||||
noKickSet,--O
|
||||
Z,--I
|
||||
Z,S,-- Z,S
|
||||
Z,S,-- J,L
|
||||
Z,-- T
|
||||
noKickSet,-- O
|
||||
Z,-- I
|
||||
|
||||
Z,S,--Z5,S5
|
||||
Z,S,--P,Q
|
||||
Z,S,--F,E
|
||||
Z,Z,Z,Z,--T5,U,V,W
|
||||
noKickSet,--X
|
||||
Z,S,--J5,L5
|
||||
Z,S,--R,Y
|
||||
Z,S,--N,H
|
||||
Z,--I5
|
||||
Z,S,-- Z5,S5
|
||||
Z,S,-- P,Q
|
||||
Z,S,-- F,E
|
||||
Z,Z,Z,Z,-- T5,U,V,W
|
||||
noKickSet,-- X
|
||||
Z,S,-- J5,L5
|
||||
Z,S,-- R,Y
|
||||
Z,S,-- N,H
|
||||
Z,-- I5
|
||||
|
||||
Z,Z,--I3,C
|
||||
Z,Z,--I2,O1
|
||||
Z,Z,-- I3,C
|
||||
Z,Z,-- I2,O1
|
||||
}
|
||||
}
|
||||
end
|
||||
@@ -916,24 +916,24 @@ do
|
||||
{'fRect',3,3,4,4},
|
||||
},
|
||||
kickTable={
|
||||
Z,S,--Z,S
|
||||
Z,S,--J,L
|
||||
Z,--T
|
||||
noKickSet,--O
|
||||
Z,--I
|
||||
Z,S,-- Z,S
|
||||
Z,S,-- J,L
|
||||
Z,-- T
|
||||
noKickSet,-- O
|
||||
Z,-- I
|
||||
|
||||
Z,S,--Z5,S5
|
||||
Z,S,--P,Q
|
||||
Z,S,--F,E
|
||||
Z,Z,Z,Z,--T5,U,V,W
|
||||
noKickSet,--X
|
||||
Z,S,--J5,L5
|
||||
Z,S,--R,Y
|
||||
Z,S,--N,H
|
||||
Z,--I5
|
||||
Z,S,-- Z5,S5
|
||||
Z,S,-- P,Q
|
||||
Z,S,-- F,E
|
||||
Z,Z,Z,Z,-- T5,U,V,W
|
||||
noKickSet,-- X
|
||||
Z,S,-- J5,L5
|
||||
Z,S,-- R,Y
|
||||
Z,S,-- N,H
|
||||
Z,-- I5
|
||||
|
||||
Z,Z,--I3,C
|
||||
Z,Z,--I2,O1
|
||||
Z,Z,-- I3,C
|
||||
Z,Z,-- I2,O1
|
||||
}
|
||||
}
|
||||
end
|
||||
@@ -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
|
||||
-- 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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Cool liquid background
|
||||
-- Cool liquid background
|
||||
local back={}
|
||||
local shader=SHADER.aura
|
||||
local t
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Horizonal red-blue gradient
|
||||
-- Horizonal red-blue gradient
|
||||
local back={}
|
||||
local shader=SHADER.grad1
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Vertical red-green gradient
|
||||
-- Vertical red-green gradient
|
||||
local back={}
|
||||
local shader=SHADER.grad2
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Large falling tetrominoes
|
||||
-- Large falling tetrominoes
|
||||
local gc=love.graphics
|
||||
local gc_clear=gc.clear
|
||||
local gc_setColor,gc_draw=gc.setColor,gc.draw
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--blockhole
|
||||
-- blockhole
|
||||
local gc=love.graphics
|
||||
local gc_clear,gc_replaceTransform=gc.clear,gc.replaceTransform
|
||||
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
|
||||
@@ -44,14 +44,14 @@ function back.draw()
|
||||
gc_clear(.1,.1,.1)
|
||||
gc_replaceTransform(SCR.xOy_m)
|
||||
|
||||
--Squares
|
||||
-- Squares
|
||||
gc_setColor(1,1,1,.2)
|
||||
for i=1,#squares do
|
||||
local S=squares[i]
|
||||
gc_draw(S.texture,S.d*cos(S.ang),S.d*sin(S.ang),S.rotate,S.size*.026,nil,15,15)
|
||||
end
|
||||
|
||||
--blockhole
|
||||
-- blockhole
|
||||
gc_setColor(.07,.07,.07)
|
||||
gc_circle('fill',0,0,157)
|
||||
gc_setLineWidth(6)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Block rain
|
||||
-- Block rain
|
||||
local gc=love.graphics
|
||||
local rnd=math.random
|
||||
local ins,rem=table.insert,table.remove
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Space but tetrominoes
|
||||
-- Space but tetrominoes
|
||||
local gc=love.graphics
|
||||
local gc_clear,gc_translate=gc.clear,gc.translate
|
||||
local gc_setColor,gc_draw=gc.setColor,gc.draw
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Flying cubes
|
||||
-- Flying cubes
|
||||
local gc=love.graphics
|
||||
local gc_clear=gc.clear
|
||||
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Custom background
|
||||
-- Custom background
|
||||
local gc_clear,gc_setColor=love.graphics.clear,love.graphics.setColor
|
||||
local back={}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Yuyuko's fan
|
||||
-- Yuyuko's fan
|
||||
local gc=love.graphics
|
||||
local gc_clear,gc_origin,gc_replaceTransform=gc.clear,gc.origin,gc.replaceTransform
|
||||
local gc_translate=gc.translate
|
||||
@@ -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)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Firework
|
||||
-- Firework
|
||||
local gc=love.graphics
|
||||
local gc_clear=gc.clear
|
||||
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
|
||||
@@ -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,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Customizable grey background
|
||||
-- Customizable grey background
|
||||
local back={}
|
||||
local r,g,b=.26,.26,.26
|
||||
function back.draw()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Flash after random time
|
||||
-- Flash after random time
|
||||
local back={}
|
||||
|
||||
local t
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Light-dark
|
||||
-- Light-dark
|
||||
local sin=math.sin
|
||||
local back={}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--A lantern background which is full of festive atmosphere. Lantern image by ScF
|
||||
-- A lantern background which is full of festive atmosphere. Lantern image by ScF
|
||||
local int,rnd=math.floor,math.random
|
||||
local ins,rem=table.insert,table.remove
|
||||
local mDraw=mDraw
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Space with stars
|
||||
-- Space with stars
|
||||
local back={}
|
||||
|
||||
local upCover do
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Lightning
|
||||
-- Lightning
|
||||
local back={}
|
||||
|
||||
local t
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Fast lightning + spining tetromino
|
||||
-- Fast lightning + spining tetromino
|
||||
local int,rnd=math.floor,math.random
|
||||
local back={}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Black-White grid
|
||||
-- Black-White grid
|
||||
local gc=love.graphics
|
||||
local gc_clear,gc_scale=gc.clear,gc.scale
|
||||
local gc_setColor=gc.setColor
|
||||
@@ -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)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Colorful RGB
|
||||
-- Colorful RGB
|
||||
local back={}
|
||||
local shader=SHADER.rgb1
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Blue RGB
|
||||
-- Blue RGB
|
||||
local back={}
|
||||
local shader=SHADER.rgb2
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Changing pure color
|
||||
-- Changing pure color
|
||||
local sin=math.sin
|
||||
local back={}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Snow
|
||||
-- Snow
|
||||
local gc=love.graphics
|
||||
local ellipse=gc.ellipse
|
||||
local rnd=math.random
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Space with stars
|
||||
-- Space with stars
|
||||
local gc=love.graphics
|
||||
local rectangle=gc.rectangle
|
||||
local rnd=math.random
|
||||
@@ -15,16 +15,16 @@ function back.resize(w,h)
|
||||
local S=stars
|
||||
for i=1,1260,5 do
|
||||
local s=rnd(26,40)*.1
|
||||
S[i]=s*SCR.k --Size
|
||||
S[i+1]=rnd(W)-10 --X
|
||||
S[i+2]=rnd(H)-10 --Y
|
||||
S[i+3]=(rnd()-.5)*.01*s--Vx
|
||||
S[i+4]=(rnd()-.5)*.01*s--Vy
|
||||
S[i]=s*SCR.k -- Size
|
||||
S[i+1]=rnd(W)-10 -- X
|
||||
S[i+2]=rnd(H)-10 -- Y
|
||||
S[i+3]=(rnd()-.5)*.01*s-- Vx
|
||||
S[i+4]=(rnd()-.5)*.01*s-- Vy
|
||||
end
|
||||
end
|
||||
function back.update(dt)
|
||||
local S=stars
|
||||
--Star moving
|
||||
-- Star moving
|
||||
for i=1,1260,5 do
|
||||
S[i+1]=(S[i+1]+S[i+3]*dt*60)%W
|
||||
S[i+2]=(S[i+2]+S[i+4]*dt*60)%H
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Cool Tunnel
|
||||
-- Cool Tunnel
|
||||
local rnd=math.random
|
||||
local ins,rem=table.insert,table.remove
|
||||
local back={}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Welcome to Techmino
|
||||
-- Welcome to Techmino
|
||||
local sin=math.sin
|
||||
local back={}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Flandre's wing
|
||||
-- Flandre's wing
|
||||
local back={}
|
||||
local crystal_img,crystals
|
||||
local wingColor={
|
||||
|
||||
@@ -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
|
||||
@@ -74,7 +74,7 @@ local function _getScore(field,cb,cy)
|
||||
clear=clear+1
|
||||
::CONTINUE_notFull::
|
||||
end
|
||||
if #field==0 then--PC
|
||||
if #field==0 then-- PC
|
||||
return 1e99
|
||||
end
|
||||
for x=1,10 do
|
||||
@@ -116,10 +116,10 @@ local function _getScore(field,cb,cy)
|
||||
-#field*30
|
||||
-#cb*15
|
||||
+(#field>10 and
|
||||
HclearScore[clear]--Clearing
|
||||
-hole*70--Hole
|
||||
-cy*50--Height
|
||||
-sdh--Sum of DeltaH
|
||||
HclearScore[clear]-- Clearing
|
||||
-hole*70-- Hole
|
||||
-cy*50-- Height
|
||||
-sdh-- Sum of DeltaH
|
||||
or
|
||||
LclearScore[clear]
|
||||
-hole*100
|
||||
@@ -139,10 +139,10 @@ local bot_9s={}
|
||||
function bot_9s.thread(bot)
|
||||
local P,data,keys=bot.P,bot.data,bot.keys
|
||||
while true do
|
||||
--Thinking
|
||||
-- Thinking
|
||||
yield()
|
||||
local Tfield={}--Test field
|
||||
local best={x=1,dir=0,hold=false,score=-1e99}--Best method
|
||||
local Tfield={}-- Test field
|
||||
local best={x=1,dir=0,hold=false,score=-1e99}-- Best method
|
||||
local field_org=P.field
|
||||
for i=1,#field_org do
|
||||
Tfield[i]=getRow(0)
|
||||
@@ -152,33 +152,33 @@ function bot_9s.thread(bot)
|
||||
end
|
||||
|
||||
for ifhold=0,data.hold and P.gameEnv.holdCount>0 and 1 or 0 do
|
||||
--Get block id
|
||||
-- Get block id
|
||||
local bn
|
||||
if ifhold==0 then
|
||||
bn=P.cur and P.cur.id
|
||||
else
|
||||
bn=P.holdQueue[1]and P.holdQueue[1].id or P.nextQueue[1]and P.nextQueue[1].id
|
||||
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
|
||||
-- Move to bottom
|
||||
while cy>1 and not _ifoverlapAI(Tfield,cb,cx,cy-1) do
|
||||
cy=cy-1
|
||||
end
|
||||
|
||||
--Simulate lock
|
||||
-- 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
|
||||
@@ -194,7 +194,7 @@ function bot_9s.thread(bot)
|
||||
end
|
||||
if not best.bn then return 1 end
|
||||
|
||||
--Release cache
|
||||
-- Release cache
|
||||
while #Tfield>0 do
|
||||
discardRow(rem(Tfield,1))
|
||||
end
|
||||
@@ -207,7 +207,7 @@ function bot_9s.thread(bot)
|
||||
end
|
||||
ins(keys,6)
|
||||
|
||||
--Check if time to change target
|
||||
-- Check if time to change target
|
||||
yield()
|
||||
if P.aiRND:random()<.00126 then
|
||||
P:changeAtkMode(P.aiRND:random()<.85 and 1 or #P.atker>3 and 4 or P.aiRND:random()<.3 and 2 or 3)
|
||||
|
||||
@@ -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
|
||||
@@ -50,11 +50,11 @@ function bot_cc:thread()
|
||||
local P,keys=self.P,self.keys
|
||||
local ccBot=self.ccBot
|
||||
while true do
|
||||
--Start thinking
|
||||
-- Start thinking
|
||||
yield()
|
||||
ccBot:think()
|
||||
|
||||
--Poll keys
|
||||
-- Poll keys
|
||||
local success,result,dest,hold,move,b2b,attack,extra,spawn
|
||||
repeat
|
||||
yield()
|
||||
@@ -73,10 +73,10 @@ function bot_cc:thread()
|
||||
dest.extra = extra
|
||||
dest.spawn = spawn
|
||||
P.destFX=dest
|
||||
if hold then--Hold
|
||||
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)
|
||||
@@ -89,7 +89,7 @@ function bot_cc:thread()
|
||||
ins(keys,6)
|
||||
end
|
||||
|
||||
--Check if time to change target
|
||||
-- Check if time to change target
|
||||
yield()
|
||||
if P.aiRND:random()<.00126 then
|
||||
P:changeAtkMode(P.aiRND:random()<.85 and 1 or #P.atker>3 and 4 or P.aiRND:random()<.3 and 2 or 3)
|
||||
@@ -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')
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local L={
|
||||
zChan={--F0000~F003F
|
||||
zChan={-- F0000~F003F
|
||||
none= 0xF0000,
|
||||
normal= 0xF0001,
|
||||
full= 0xF0002,
|
||||
@@ -24,7 +24,7 @@ local L={
|
||||
thinking= 0xF0015,
|
||||
spark= 0xF0016,
|
||||
},
|
||||
mino={--F0040~F007F
|
||||
mino={-- F0040~F007F
|
||||
Z=0xF0040,
|
||||
S=0xF0041,
|
||||
J=0xF0042,
|
||||
@@ -57,7 +57,7 @@ local L={
|
||||
I2=0xF005B,
|
||||
O1=0xF005C,
|
||||
},
|
||||
icon={--F0080~F00FF
|
||||
icon={-- F0080~F00FF
|
||||
menu= 0xF0080,
|
||||
music= 0xF0081,
|
||||
language= 0xF0082,
|
||||
@@ -131,7 +131,7 @@ local L={
|
||||
garbage= 0xF00C6,
|
||||
copy= 0xF00C7,
|
||||
},
|
||||
key={--F0100~F017F
|
||||
key={-- F0100~F017F
|
||||
macCmd= 0xF0100,
|
||||
macOpt= 0xF0101,
|
||||
macCtrl= 0xF0102,
|
||||
@@ -172,7 +172,7 @@ local L={
|
||||
macPgdnAlt= 0xF0125,
|
||||
iecPower= 0xF0126,
|
||||
},
|
||||
controller={--F0180~F01FF
|
||||
controller={-- F0180~F01FF
|
||||
xbox= 0xF0180,
|
||||
lt= 0xF0181,
|
||||
rt= 0xF0182,
|
||||
@@ -212,7 +212,7 @@ local L={
|
||||
psCreate= 0xF01A4,
|
||||
psOption= 0xF01A5,
|
||||
},
|
||||
mahjong={--F0200~F027F
|
||||
mahjong={-- F0200~F027F
|
||||
m1= 0xF0200,
|
||||
m2= 0xF0201,
|
||||
m3= 0xF0202,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
return{
|
||||
version=VERSION.code,
|
||||
|
||||
--Basic
|
||||
-- Basic
|
||||
drop=1e99,
|
||||
lock=1e99,
|
||||
wait=0,
|
||||
@@ -9,17 +9,17 @@ return{
|
||||
hang=5,
|
||||
hurry=1e99,
|
||||
|
||||
--Control
|
||||
-- Control
|
||||
nextCount=6,
|
||||
holdMode='hold',
|
||||
holdCount=1,
|
||||
infHold=true,
|
||||
phyHold=false,
|
||||
|
||||
--Visual
|
||||
-- Visual
|
||||
bone=false,
|
||||
|
||||
--Rule
|
||||
-- Rule
|
||||
sequence='bag',
|
||||
lockout=false,
|
||||
fieldH=20,
|
||||
@@ -40,7 +40,7 @@ return{
|
||||
garbageSpeed=1,
|
||||
missionKill=false,
|
||||
|
||||
--Else
|
||||
-- Else
|
||||
bg='blockrain',
|
||||
bgm='hang out',
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ local ins=table.insert
|
||||
local BAG,FIELD,MISSION,CUSTOMENV,GAME=BAG,FIELD,MISSION,CUSTOMENV,GAME
|
||||
|
||||
local DATA={}
|
||||
--Sep symbol: 33 (!)
|
||||
--Safe char: 34~126
|
||||
-- Sep symbol: 33 (!)
|
||||
-- Safe char: 34~126
|
||||
--[[
|
||||
Count: 34~96
|
||||
Block: 97~125
|
||||
@@ -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)
|
||||
@@ -66,14 +66,14 @@ local fieldMeta={__index=function(self,h)
|
||||
end
|
||||
return self[h]
|
||||
end}
|
||||
function DATA.newBoard(f)--Generate a new board
|
||||
return setmetatable(f and TABLE.shift(f)or{},fieldMeta)
|
||||
function DATA.newBoard(f)-- Generate a new board
|
||||
return setmetatable(f and TABLE.shift(f) or{},fieldMeta)
|
||||
end
|
||||
function DATA.copyBoard(page)--Copy the [page] board
|
||||
function DATA.copyBoard(page)-- Copy the [page] board
|
||||
local F=FIELD[page or 1]
|
||||
local str=""
|
||||
|
||||
--Encode field
|
||||
-- Encode field
|
||||
for y=1,#F do
|
||||
local S=""
|
||||
local L=F[y]
|
||||
@@ -91,25 +91,25 @@ function DATA.copyBoards()
|
||||
end
|
||||
return table.concat(out,"!")
|
||||
end
|
||||
function DATA.pasteBoard(str,page)--Paste [str] data to [page] board
|
||||
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]
|
||||
|
||||
--Decode
|
||||
-- Decode
|
||||
str=STRING.unpackBin(str)
|
||||
if not str then return end
|
||||
|
||||
local fX,fY=1,1--*ptr for Field(r*10+(c-1))
|
||||
local fX,fY=1,1-- *ptr for Field(r*10+(c-1))
|
||||
local p=1
|
||||
while true do
|
||||
local b=byte(str,p)--1byte
|
||||
local b=byte(str,p)-- 1byte
|
||||
|
||||
--Str end
|
||||
-- Str end
|
||||
if not b then
|
||||
if fX~=1 then
|
||||
return
|
||||
@@ -118,9 +118,9 @@ function DATA.pasteBoard(str,page)--Paste [str] data to [page] board
|
||||
end
|
||||
end
|
||||
|
||||
local id=b%32-1--Block id
|
||||
if id>26 then return end--Illegal blockid
|
||||
b=int(b/32)--Mode id
|
||||
local id=b%32-1-- Block id
|
||||
if id>26 then return end-- Illegal blockid
|
||||
b=int(b/32)-- Mode id
|
||||
|
||||
F[fY][fX]=id
|
||||
if fX<10 then
|
||||
@@ -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,15 +252,15 @@ function DATA.dumpRecording(list,ptr)
|
||||
local out=""
|
||||
local buffer,buffer2=""
|
||||
if not ptr then ptr=1 end
|
||||
local prevFrm=list[ptr-2]or 0
|
||||
while list[ptr]do
|
||||
--Flush buffer
|
||||
local prevFrm=list[ptr-2] or 0
|
||||
while list[ptr] do
|
||||
-- Flush buffer
|
||||
if #buffer>10 then
|
||||
out=out..buffer
|
||||
buffer=""
|
||||
end
|
||||
|
||||
--Encode time
|
||||
-- Encode time
|
||||
local t=list[ptr]-prevFrm
|
||||
prevFrm=list[ptr]
|
||||
if t>=128 then
|
||||
@@ -275,7 +275,7 @@ function DATA.dumpRecording(list,ptr)
|
||||
buffer=buffer..char(t)
|
||||
end
|
||||
|
||||
--Encode event
|
||||
-- Encode event
|
||||
t=list[ptr+1]
|
||||
if t>=128 then
|
||||
buffer2=char(t%128)
|
||||
@@ -289,7 +289,7 @@ function DATA.dumpRecording(list,ptr)
|
||||
buffer=buffer..char(t)
|
||||
end
|
||||
|
||||
--Step
|
||||
-- Step
|
||||
ptr=ptr+2
|
||||
end
|
||||
return out..buffer,ptr
|
||||
@@ -298,10 +298,10 @@ 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
|
||||
-- Read delta time
|
||||
code=0
|
||||
local b=byte(str,p)
|
||||
while b>=128 do
|
||||
@@ -324,7 +324,7 @@ function DATA.pumpRecording(str,L)
|
||||
p=p+1
|
||||
end
|
||||
end
|
||||
do--function DATA.saveReplay()
|
||||
do-- function DATA.saveReplay()
|
||||
local noRecList={"custom","solo","round","techmino"}
|
||||
local function _getModList()
|
||||
local res={}
|
||||
@@ -336,17 +336,17 @@ do--function DATA.saveReplay()
|
||||
return res
|
||||
end
|
||||
function DATA.saveReplay()
|
||||
--Filtering modes that cannot be saved
|
||||
-- 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
|
||||
end
|
||||
|
||||
--Write file
|
||||
-- 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{
|
||||
@@ -371,29 +371,29 @@ do--function DATA.saveReplay()
|
||||
end
|
||||
function DATA.parseReplay(fileName,ifFull)
|
||||
local fileData
|
||||
--Read file
|
||||
-- Read file
|
||||
fileData=love.filesystem.read(fileName)
|
||||
return DATA.parseReplayData(fileName,fileData,ifFull)
|
||||
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
|
||||
-- Decompress file
|
||||
success,fileData=pcall(love.data.decompress,'string','zlib',fileData)
|
||||
if not success then goto BREAK_cannotParse end
|
||||
|
||||
--Load metadata
|
||||
-- Load metadata
|
||||
metaData,fileData=STRING.readLine(fileData)
|
||||
metaData=JSON.decode(metaData)
|
||||
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
|
||||
-- Convert ancient replays
|
||||
metaData.mode=MODE_UPDATE_MAP[metaData.mode] or metaData.mode
|
||||
if not MODES[metaData.mode] then goto BREAK_cannotParse end
|
||||
|
||||
--Create replay object
|
||||
-- Create replay object
|
||||
rep={
|
||||
fileName=fileName,
|
||||
available=true,
|
||||
@@ -411,7 +411,7 @@ function DATA.parseReplayData(fileName,fileData,ifFull)
|
||||
if ifFull then rep.data=fileData end
|
||||
do return rep end
|
||||
|
||||
--Create unavailable replay object
|
||||
-- Create unavailable replay object
|
||||
::BREAK_cannotParse::
|
||||
return{
|
||||
fileName=fileName,
|
||||
|
||||
@@ -8,18 +8,18 @@ return{
|
||||
end,
|
||||
task=function(P)
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
if P.control and P.atkBufferSum==0 then
|
||||
local D=P.modeData
|
||||
if D.wave==50 then
|
||||
P:win('finish')
|
||||
else
|
||||
if D.wave<20 then
|
||||
local t=1500-30*D.wave--1500~900
|
||||
local t=1500-30*D.wave-- 1500~900
|
||||
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=12,countdown=t,cd0=t,time=0,sent=false,lv=3})
|
||||
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(3,8)),amount=10,countdown=t,cd0=t,time=0,sent=false,lv=4})
|
||||
else
|
||||
local t=900-10*(D.wave-20)--900~600
|
||||
local t=900-10*(D.wave-20)-- 900~600
|
||||
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=14,countdown=t,cd0=t,time=0,sent=false,lv=4})
|
||||
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=8,countdown=t,cd0=t,time=0,sent=false,lv=5})
|
||||
end
|
||||
|
||||
@@ -8,14 +8,14 @@ return{
|
||||
end,
|
||||
task=function(P)
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
if P.control and P.atkBufferSum<4 then
|
||||
local D=P.modeData
|
||||
if D.wave==50 then
|
||||
P:win('finish')
|
||||
else
|
||||
local s
|
||||
local t=800-10*D.wave--800~700~600~500
|
||||
local t=800-10*D.wave-- 800~700~600~500
|
||||
if D.wave<10 then
|
||||
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(5,6)),amount=9,countdown=t,cd0=t,time=0,sent=false,lv=3})
|
||||
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(4,7)),amount=11,countdown=t,cd0=t+62,time=0,sent=false,lv=4})
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -62,9 +62,9 @@ return{
|
||||
local D=P.modeData
|
||||
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
|
||||
if P.stat.row>=D.target then
|
||||
--if D.target>=200 then
|
||||
-- if D.target>=200 then
|
||||
D.lvl=D.lvl+1
|
||||
--end
|
||||
-- end
|
||||
local dropSpd=GetGravity(D.lvl)
|
||||
if dropSpd~=P.gameEnv.drop then
|
||||
P.gameEnv.drop,P.gameEnv.lock=dropSpd,dropSpd
|
||||
|
||||
@@ -10,14 +10,14 @@ return{
|
||||
end,
|
||||
task=function(P)
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
if P.control then
|
||||
local D=P.modeData
|
||||
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{
|
||||
end,
|
||||
task=function(P)
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
if P.control then
|
||||
local D=P.modeData
|
||||
D.counter=D.counter+1
|
||||
|
||||
@@ -6,11 +6,11 @@ return{
|
||||
end,
|
||||
task=function(P)
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
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
|
||||
|
||||
@@ -6,11 +6,11 @@ return{
|
||||
end,
|
||||
task=function(P)
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
if P.control then
|
||||
local D=P.modeData
|
||||
D.timer=D.timer+1
|
||||
if D.timer>=math.max(30,80-.3*D.wave)then
|
||||
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
|
||||
|
||||
@@ -2,7 +2,7 @@ local dropSpeed={
|
||||
50,42,35,30,25,20,16,13,11,10,
|
||||
9,8,7,6,5,5,4,4,3,3,
|
||||
3,2,2,2,2,1,1,1,1,1,
|
||||
.5,.5,.5,.5,.25,.25,.25,.125,.125,--Total 39 numbers, switch to 20G when reach 400 lines
|
||||
.5,.5,.5,.5,.25,.25,.25,.125,.125,-- Total 39 numbers, switch to 20G when reach 400 lines
|
||||
}
|
||||
local lockDelay={
|
||||
57,54,51,48,46,44,42,40,38,36,
|
||||
@@ -17,7 +17,7 @@ local lockDelay={
|
||||
4,4,4,4,4,4,4,4,4,4,
|
||||
3,3,3,3,3,3,3,3,3,3,
|
||||
2,2,2,2,2,2,2,2,2,2,
|
||||
1,1,1,1,1,1,1,1,1,--Finish at 1700
|
||||
1,1,1,1,1,1,1,1,1,-- Finish at 1700
|
||||
}
|
||||
|
||||
return
|
||||
|
||||
@@ -7,7 +7,7 @@ local function getRollGoal(P)
|
||||
if rem<=0 then return 0 end
|
||||
local goal=math.floor(rem)*4
|
||||
rem=rem%1
|
||||
return goal + (rem>0.3 and 4 or rem*10)
|
||||
return goal+(rem>0.3 and 4 or rem*10)
|
||||
end
|
||||
|
||||
return{
|
||||
@@ -40,10 +40,10 @@ return{
|
||||
PLY.draw.drawTargetLine(P,getRollGoal(P))
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.modeData.rankPoint<140-passPoint then--If Less then X
|
||||
if P.modeData.rankPoint<140-passPoint then-- If Less then X
|
||||
local R=#P.clearedRow
|
||||
if R>0 then
|
||||
if R==4 then R=10 end--Techrash +10
|
||||
if R==4 then R=10 end-- Techrash +10
|
||||
P.modeData.rankPoint=math.min(P.modeData.rankPoint+R,140-passPoint)
|
||||
P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1]
|
||||
end
|
||||
@@ -53,7 +53,7 @@ return{
|
||||
P.modeData.rankPoint=0
|
||||
P.modeData.rankName=sectionName[1]
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
if P.stat.frame>=3600 then
|
||||
P.modeData.rankPoint=math.min(P.modeData.rankPoint+passPoint,140)
|
||||
P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1]
|
||||
|
||||
@@ -21,18 +21,18 @@ return{
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
s=D.target/100--range from 1 to 9
|
||||
elseif D.pt>=D.target then-- Level up!
|
||||
s=D.target/100-- range from 1 to 9
|
||||
local E=P.gameEnv
|
||||
if s<4 then
|
||||
P:stageComplete(s)
|
||||
--First 300
|
||||
-- First 300
|
||||
if s~=1 then E.lock=E.lock-1 end
|
||||
if s~=2 then E.wait=E.wait-1 end
|
||||
if s~=3 then E.fall=E.fall-1 end
|
||||
D.target=D.target+100
|
||||
elseif s<10 then
|
||||
if s==5 then BGM.play('distortion')end
|
||||
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
|
||||
|
||||
@@ -18,8 +18,8 @@ local isInRoll=false
|
||||
local rollGrades=0
|
||||
local cool_time={3120,3120,2940,2700,2700,2520,2520,2280,2280,0}
|
||||
local reg_time= {5400,4500,4500,4080,3600,3600,3000,3000,3000,3000}
|
||||
local prevDrop70=false --determines if previous piece has level less than __70
|
||||
local nextSpeedUp=false --determines if the next section speed should be boosted by 100
|
||||
local prevDrop70=false -- determines if previous piece has level less than __70
|
||||
local nextSpeedUp=false -- determines if the next section speed should be boosted by 100
|
||||
local isInRollTrans=false
|
||||
local function getGrav(l)
|
||||
return
|
||||
@@ -111,11 +111,11 @@ local function getRollGoal()
|
||||
if cools>8 then
|
||||
goal=math.floor(rem)*4
|
||||
rem=rem%1
|
||||
return goal + (rem>0.3 and 4 or rem*10)
|
||||
return goal+(rem>0.3 and 4 or rem*10)
|
||||
else
|
||||
goal=math.floor(rem/0.26)*4
|
||||
rem=rem%0.26
|
||||
return goal + (rem>0.12 and 4 or rem*25)
|
||||
return goal+(rem>0.12 and 4 or rem*25)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -220,7 +220,7 @@ return{
|
||||
|
||||
if D.pt+1==D.target then
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
elseif D.pt>=D.target then-- Level up!
|
||||
spd_lvl=nextSpeedUp and spd_lvl+100 or spd_lvl
|
||||
nextSpeedUp=false
|
||||
prevDrop70=false
|
||||
@@ -289,7 +289,7 @@ return{
|
||||
local decayRate={125,80,80,50,45,45,45,40,40,40,40,40,30,30,30,20,20,20,20,20,15,15,15,15,15,15,15,15,15,15,10,10,10,9,9,9,8,8,8,7,7,7,6}
|
||||
local decayTimer=0
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
P.modeData.grade=getGrade()
|
||||
P.modeData.gradePts=math.max(math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList),1)
|
||||
if P.stat.frame-prevSectTime > reg_time[math.ceil(P.modeData.pt/100+0.01)] and not (isInRoll or isInRollTrans) then
|
||||
@@ -301,7 +301,7 @@ return{
|
||||
end
|
||||
if isInRollTrans then
|
||||
if P.waiting>=220 then
|
||||
--Make field invisible
|
||||
-- Make field invisible
|
||||
for y=1,#P.field do for x=1,10 do
|
||||
P.visTime[y][x]=P.waiting-220
|
||||
end end
|
||||
@@ -336,7 +336,7 @@ return{
|
||||
rollGrades=rollGrades+(cools>8 and 1.6 or 0.5)
|
||||
P.modeData.grade=getGrade()
|
||||
P.modeData.gradePts=math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList)
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
P:win('finish')
|
||||
end
|
||||
end
|
||||
|
||||
@@ -25,7 +25,7 @@ return{
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
elseif D.pt>=D.target then-- Level up!
|
||||
s=D.target/100
|
||||
local E=P.gameEnv
|
||||
E.lock=death_lock[s]
|
||||
|
||||
@@ -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,12 +35,12 @@ 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
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
elseif D.pt>=D.target then-- Level up!
|
||||
s=D.target/100
|
||||
local E=P.gameEnv
|
||||
E.lock=inv_lock[s]
|
||||
@@ -72,13 +72,13 @@ return{
|
||||
P.modeData.pt=0
|
||||
P.modeData.target=100
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
if P.holdTime==0 and P.waiting<=0 and not held then
|
||||
hidetimer=0
|
||||
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
|
||||
|
||||
@@ -25,7 +25,7 @@ return{
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
elseif D.pt>=D.target then-- Level up!
|
||||
s=D.target/100
|
||||
local E=P.gameEnv
|
||||
E.lock=rush_lock[s]
|
||||
|
||||
@@ -18,8 +18,8 @@ return
|
||||
if p>=P.modeData.target then
|
||||
local ENV=P.gameEnv
|
||||
local T=P.modeData.target
|
||||
--Stage 1: clear 3 techrash
|
||||
if T==12 then--Stage 2: swap color of S/Z & J/L
|
||||
-- Stage 1: clear 3 techrash
|
||||
if T==12 then-- Stage 2: swap color of S/Z & J/L
|
||||
P:stageComplete(2)
|
||||
P.waiting=30
|
||||
P.curMission=false
|
||||
@@ -34,9 +34,9 @@ return
|
||||
|
||||
P.modeData.target=26
|
||||
SFX.play('reach')
|
||||
elseif T==26 then--Stage 3: dig to bottom
|
||||
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
|
||||
@@ -79,7 +79,7 @@ return
|
||||
|
||||
P.modeData.target=42
|
||||
SFX.play('reach')
|
||||
elseif T==42 then--Stage 4: survive in high speed
|
||||
elseif T==42 then-- Stage 4: survive in high speed
|
||||
if P.garbageBeneath==0 then
|
||||
P:stageComplete(4)
|
||||
P.waiting=30
|
||||
@@ -93,7 +93,7 @@ return
|
||||
else
|
||||
p=41
|
||||
end
|
||||
elseif T==62 then--Stage 5: survive without easy-fresh rule
|
||||
elseif T==62 then-- Stage 5: survive without easy-fresh rule
|
||||
P:stageComplete(5)
|
||||
P.life=P.life+1
|
||||
ENV.lock=13
|
||||
@@ -104,7 +104,7 @@ return
|
||||
|
||||
P.modeData.target=126
|
||||
SFX.play('reach')
|
||||
elseif T==126 then--Stage 6: speed up
|
||||
elseif T==126 then-- Stage 6: speed up
|
||||
P:stageComplete(6)
|
||||
P.life=P.life+1
|
||||
|
||||
@@ -114,7 +114,7 @@ return
|
||||
|
||||
P.modeData.target=162
|
||||
SFX.play('reach')
|
||||
elseif T==162 then--Stage 7: speed up+++
|
||||
elseif T==162 then-- Stage 7: speed up+++
|
||||
P:stageComplete(7)
|
||||
P.life=P.life+1
|
||||
|
||||
@@ -125,7 +125,7 @@ return
|
||||
|
||||
P.modeData.target=226
|
||||
SFX.play('reach')
|
||||
elseif T==226 then--Stage 8: final invisible
|
||||
elseif T==226 then-- Stage 8: final invisible
|
||||
P:stageComplete(8)
|
||||
P.life=P.life+1
|
||||
|
||||
@@ -134,10 +134,10 @@ return
|
||||
|
||||
P.modeData.target=259
|
||||
SFX.play('reach')
|
||||
elseif T==259 then--Stage 9: ending
|
||||
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 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
|
||||
@@ -50,5 +50,5 @@ return{
|
||||
mText(TEXTOBJ.pc,63,330)
|
||||
end,
|
||||
hook_drop=_check,
|
||||
task=_check,--Just run one time at first to start first level
|
||||
task=_check,-- Just run one time at first to start first level
|
||||
}
|
||||
|
||||
@@ -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 YIELD()end end
|
||||
if P.frameRun>180 then for _=1,26 do coroutine.yield() end end
|
||||
P.control=true
|
||||
|
||||
local base=PCbase[difficulty]
|
||||
@@ -43,5 +43,5 @@ return{
|
||||
mText(TEXTOBJ.pc,63,330)
|
||||
end,
|
||||
hook_drop=_check,
|
||||
task=_check,--Just run one time at first to start first level
|
||||
task=_check,-- Just run one time at first to start first level
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ end
|
||||
local F={}
|
||||
|
||||
-- local ranks={"10","9","8","7","6","5","4","3","2","1","S1","S2","S3","S4","S5","S6","S7","S8","S9","GM","GM+","TM","TM+","TM+₂","TM+₃", "TM+₄","TM+₅"}
|
||||
-- lines: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
||||
-- lines: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
||||
|
||||
local function getSmallNum(num)
|
||||
local smalldigit={[0]="₀","₁","₂","₃","₄","₅","₆","₇","₈","₉"}
|
||||
@@ -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)
|
||||
|
||||
@@ -7,18 +7,18 @@ return{
|
||||
PLY.draw.drawTargetLine(P,r)
|
||||
end,
|
||||
task=function(P)
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
while true do
|
||||
for _=1,P.holeRND:random(40,200)do 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
|
||||
|
||||
@@ -6,11 +6,11 @@ return{
|
||||
end,
|
||||
task=function(P)
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
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
|
||||
|
||||
@@ -6,11 +6,11 @@ return{
|
||||
end,
|
||||
task=function(P)
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
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
|
||||
|
||||
@@ -6,11 +6,11 @@ return{
|
||||
end,
|
||||
task=function(P)
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
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
|
||||
@@ -18,7 +18,7 @@ return{
|
||||
table.insert(P.atkBuffer,{line=generateLine(P.holeRND:random(10)),amount=4,countdown=t,cd0=t,time=0,sent=false,lv=3})
|
||||
P.atkBufferSum=P.atkBufferSum+4
|
||||
P.stat.recv=P.stat.recv+4
|
||||
if D.wave==60 then
|
||||
if D.wave==90 then
|
||||
P:_showText(text.maxspeed,0,-140,100,'appear',.6)
|
||||
end
|
||||
P:shakeField(3)
|
||||
|
||||
@@ -6,19 +6,19 @@ return{
|
||||
end,
|
||||
task=function(P)
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
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
|
||||
|
||||
@@ -6,11 +6,11 @@ return{
|
||||
end,
|
||||
task=function(P)
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
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
|
||||
|
||||
@@ -21,8 +21,8 @@ return{
|
||||
BGM.seek(0)
|
||||
P.modeData.section=1
|
||||
while true do
|
||||
YIELD()
|
||||
while P.stat.frame>=warnTime[P.modeData.section]do
|
||||
coroutine.yield()
|
||||
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)
|
||||
|
||||
@@ -2,7 +2,7 @@ local gc_push,gc_pop=GC.push,GC.pop
|
||||
local gc_origin,gc_replaceTransform=GC.origin,GC.replaceTransform
|
||||
local gc_setLineWidth,gc_setColor=GC.setLineWidth,GC.setColor
|
||||
local gc_setShader=GC.setShader
|
||||
local gc_draw,gc_rectangle,gc_line,gc_printf=GC.draw,GC.rectangle,GC.line,GC.printf
|
||||
local gc_draw,gc_rectangle,gc_printf=GC.draw,GC.rectangle,GC.printf
|
||||
|
||||
local ins,rem=table.insert,table.remove
|
||||
local int,rnd=math.floor,math.random
|
||||
@@ -10,12 +10,11 @@ local approach=MATH.expApproach
|
||||
|
||||
local SETTING,GAME,SCR=SETTING,GAME,SCR
|
||||
local PLAYERS=PLAYERS
|
||||
local playSFX=SFX.play
|
||||
|
||||
|
||||
|
||||
--System
|
||||
do--function tryBack()
|
||||
-- System
|
||||
do-- function tryBack()
|
||||
local sureTime=-1e99
|
||||
function tryBack()
|
||||
if TIME()-sureTime<1 then
|
||||
@@ -27,7 +26,7 @@ do--function tryBack()
|
||||
end
|
||||
end
|
||||
end
|
||||
do--function tryReset()
|
||||
do-- function tryReset()
|
||||
local sureTime=-1e99
|
||||
function tryReset()
|
||||
if TIME()-sureTime<1 then
|
||||
@@ -39,7 +38,7 @@ do--function tryReset()
|
||||
end
|
||||
end
|
||||
end
|
||||
do--function tryDelete()
|
||||
do-- function tryDelete()
|
||||
local sureTime=-1e99
|
||||
function tryDelete()
|
||||
if TIME()-sureTime<1 then
|
||||
@@ -51,21 +50,21 @@ do--function tryDelete()
|
||||
end
|
||||
end
|
||||
end
|
||||
do--function loadFile(name,args), function saveFile(data,name,args)
|
||||
local t=setmetatable({},{__index=function()return"'$1' loading failed: $2"end})
|
||||
do-- function loadFile(name,args), function saveFile(data,name,args)
|
||||
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,24 +81,17 @@ 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
|
||||
end
|
||||
end
|
||||
function isSafeFile(file,mes)
|
||||
if love.filesystem.getRealDirectory(file)~=SAVEDIR then
|
||||
return true
|
||||
elseif mes then
|
||||
MES.new('warn',mes)
|
||||
end
|
||||
end
|
||||
function saveStats()
|
||||
return saveFile(STAT,'conf/data')
|
||||
end
|
||||
@@ -107,9 +99,15 @@ function saveProgress()
|
||||
return saveFile(RANKS,'conf/unlock')
|
||||
end
|
||||
function saveSettings()
|
||||
if WS.status('game')=='running' then
|
||||
NET.player_updateConf()
|
||||
end
|
||||
return saveFile(SETTING,'conf/settings')
|
||||
end
|
||||
do--function applySettings()
|
||||
function saveUser()
|
||||
return saveFile(USER.__data,'conf/user')
|
||||
end
|
||||
do-- function applySettings()
|
||||
local saturateValues={
|
||||
normal={0,1},
|
||||
soft={.2,.7},
|
||||
@@ -118,56 +116,56 @@ do--function applySettings()
|
||||
color={-.2,1.2},
|
||||
}
|
||||
function applySettings()
|
||||
--Apply language
|
||||
-- Apply language
|
||||
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
|
||||
|
||||
--Apply cursor
|
||||
-- Apply cursor
|
||||
love.mouse.setVisible(SETTING.sysCursor)
|
||||
|
||||
--Apply fullscreen
|
||||
-- Apply fullscreen
|
||||
love.window.setFullscreen(SETTING.fullscreen)
|
||||
love.resize(GC.getWidth(),GC.getHeight())
|
||||
|
||||
--Apply Zframework setting
|
||||
-- Apply Zframework setting
|
||||
Z.setClickFX(SETTING.clickFX)
|
||||
Z.setFrameMul(SETTING.frameMul)
|
||||
Z.setPowerInfo(SETTING.powerInfo)
|
||||
Z.setCleanCanvas(SETTING.cleanCanvas)
|
||||
|
||||
--Apply VK shape
|
||||
-- Apply VK shape
|
||||
VK.setShape(SETTING.VKSkin)
|
||||
|
||||
--Apply sound
|
||||
-- Apply sound
|
||||
love.audio.setVolume(SETTING.mainVol)
|
||||
BGM.setVol(SETTING.bgm)
|
||||
SFX.setVol(SETTING.sfx)
|
||||
VOC.setVol(SETTING.voc)
|
||||
|
||||
--Apply saturs
|
||||
-- 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
|
||||
-- Apply BG
|
||||
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()
|
||||
@@ -178,7 +176,7 @@ do--function applySettings()
|
||||
else
|
||||
MES.new('error',text.customBGloadFailed)
|
||||
end
|
||||
else--Switch off when custom BG not found
|
||||
else-- Switch off when custom BG not found
|
||||
SETTING.bg='off'
|
||||
BG.unlock()
|
||||
BG.set('fixColor',SETTING.bgAlpha,SETTING.bgAlpha,SETTING.bgAlpha)
|
||||
@@ -188,8 +186,8 @@ do--function applySettings()
|
||||
end
|
||||
end
|
||||
|
||||
--Royale mode
|
||||
function randomTarget(P)--Return a random opponent for P
|
||||
-- Royale mode
|
||||
function randomTarget(P)-- Return a random opponent for P
|
||||
if #PLY_ALIVE>1 then
|
||||
local R
|
||||
repeat
|
||||
@@ -272,7 +270,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)
|
||||
@@ -284,29 +282,29 @@ function royaleLevelup()
|
||||
end
|
||||
end
|
||||
|
||||
--Sound shortcuts
|
||||
-- Sound shortcuts
|
||||
function playClearSFX(cc)
|
||||
if cc<=0 or cc%1~=0 then return end
|
||||
if cc<=4 then
|
||||
playSFX('clear_'..cc)
|
||||
SFX.play('clear_'..cc)
|
||||
elseif cc<=6 then
|
||||
playSFX('clear_4')
|
||||
SFX.play('clear_4')
|
||||
elseif cc<=12 then
|
||||
playSFX('clear_4',.8)
|
||||
SFX.play('clear_4',.8)
|
||||
if cc<=9 then
|
||||
Snd('bass','A3','E4')
|
||||
else
|
||||
Snd('bass','A3','E4','A4')
|
||||
end
|
||||
elseif cc<=16 then
|
||||
playSFX('clear_5',.7)
|
||||
SFX.play('clear_5',.7)
|
||||
if cc<=14 then
|
||||
Snd('bass',.8,'A3','E4')Snd('lead','A4','E5')
|
||||
else
|
||||
Snd('bass',.8,'A3','G4')Snd('lead','B4','G5')
|
||||
end
|
||||
else
|
||||
playSFX('clear_6',.6)
|
||||
SFX.play('clear_6',.6)
|
||||
if cc==17 then Snd('bass',.8,'A3','A4')Snd('lead','E5','G5')
|
||||
elseif cc==18 then Snd('bass',.7,'A4')Snd('lead',.8,'C4','G5')Snd('bell','D5')
|
||||
elseif cc==19 then Snd('bass',.7,'A4')Snd('lead',.8,'A4','E5')Snd('bell','B5')
|
||||
@@ -336,7 +334,7 @@ function playReadySFX(i,vol)
|
||||
end
|
||||
|
||||
|
||||
--Game
|
||||
-- Game
|
||||
function getItem(itemName,amount)
|
||||
STAT.item[itemName]=STAT.item[itemName]+(amount or 1)
|
||||
end
|
||||
@@ -354,7 +352,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
|
||||
@@ -381,16 +379,16 @@ 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()
|
||||
return true
|
||||
end
|
||||
end
|
||||
function legalGameTime()--Check if today's playtime is legal
|
||||
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
|
||||
@@ -406,7 +404,7 @@ function legalGameTime()--Check if today's playtime is legal
|
||||
end
|
||||
return true
|
||||
end
|
||||
do--function trySettingWarn()
|
||||
do-- function trySettingWarn()
|
||||
local lastWarnTime=0
|
||||
function trySettingWarn()
|
||||
if TIME()-lastWarnTime>2.6 then
|
||||
@@ -416,20 +414,20 @@ do--function trySettingWarn()
|
||||
end
|
||||
end
|
||||
|
||||
function mergeStat(stat,delta)--Merge delta stat. to global stat.
|
||||
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
|
||||
end
|
||||
end
|
||||
function scoreValid()--Check if any unranked mods are activated
|
||||
function scoreValid()-- Check if any unranked mods are activated
|
||||
for _,M in next,GAME.mod do
|
||||
if M.unranked then
|
||||
return false
|
||||
@@ -440,13 +438,13 @@ function scoreValid()--Check if any unranked mods are activated
|
||||
end
|
||||
return true
|
||||
end
|
||||
function destroyPlayers()--Destroy all player objects, restore freerows and free CCs
|
||||
function destroyPlayers()-- Destroy all player objects, restore freerows and free CCs
|
||||
for i=#PLAYERS,1,-1 do
|
||||
local P=PLAYERS[i]
|
||||
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
|
||||
@@ -460,7 +458,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
|
||||
@@ -469,31 +467,31 @@ 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')
|
||||
end
|
||||
end
|
||||
function applyCustomGame()--Apply CUSTOMENV, BAG, MISSION
|
||||
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
|
||||
end
|
||||
end
|
||||
function loadGame(mode,ifQuickPlay,ifNet)--Load a mode and go to game scene
|
||||
function loadGame(mode,ifQuickPlay,ifNet)-- Load a mode and go to game scene
|
||||
freshDate()
|
||||
if legalGameTime()then
|
||||
if not MODES[mode]and love.filesystem.getRealDirectory('parts/modes/'..mode)~=SAVEDIR 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
|
||||
@@ -510,14 +508,14 @@ 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')
|
||||
playSFX('enter')
|
||||
SCN.go('game',ifQuickPlay and 'swipeD' or 'fade_togame')
|
||||
SFX.play('enter')
|
||||
end
|
||||
end
|
||||
end
|
||||
function gameOver()--Save record
|
||||
function gameOver()-- Save record
|
||||
if GAME.replaying then
|
||||
local R=GAME.curMode.getRank
|
||||
if R then
|
||||
@@ -533,15 +531,15 @@ function gameOver()--Save record
|
||||
local R=M.getRank
|
||||
if R then
|
||||
local P=PLAYERS[1]
|
||||
R=R(P)--New rank
|
||||
R=R(P)-- New rank
|
||||
if R then
|
||||
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
|
||||
@@ -550,7 +548,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
|
||||
@@ -565,9 +563,9 @@ function gameOver()--Save record
|
||||
end
|
||||
local D=M.score(P)
|
||||
local L=M.records
|
||||
local p=#L--Rank-1
|
||||
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
|
||||
@@ -575,15 +573,15 @@ 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')
|
||||
SFX.play('connected')
|
||||
MES.new('check',text.saveDone)
|
||||
end
|
||||
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
|
||||
@@ -591,7 +589,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)
|
||||
@@ -599,9 +597,9 @@ function trySave()
|
||||
saveStats()
|
||||
end
|
||||
end
|
||||
do--function freshPlayerPosition(sudden)
|
||||
do-- function freshPlayerPosition(sudden)
|
||||
local posLists={
|
||||
--1~5
|
||||
-- 1~5
|
||||
{
|
||||
{340,75,1},
|
||||
{965,390,.5},
|
||||
@@ -609,42 +607,42 @@ do--function freshPlayerPosition(sudden)
|
||||
{20,390,.5},
|
||||
{20,30,.5},
|
||||
},
|
||||
--6~17
|
||||
-- 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
|
||||
-- 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
|
||||
-- 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
|
||||
-- 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)(),
|
||||
}
|
||||
function freshPlayerPosition(sudden)--Set initial position for every player
|
||||
function freshPlayerPosition(sudden)-- Set initial position for every player
|
||||
local L=PLY_ALIVE
|
||||
if not sudden then
|
||||
for i=1,#L do
|
||||
@@ -660,25 +658,25 @@ 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()
|
||||
do-- function dumpBasicConfig()
|
||||
local gameSetting={
|
||||
--Tuning
|
||||
-- Tuning
|
||||
'das','arr','dascut','dropcut','sddas','sdarr',
|
||||
'ihs','irs','ims','RS',
|
||||
|
||||
--System
|
||||
-- System
|
||||
'skin','face',
|
||||
|
||||
--Graphic
|
||||
-- Graphic
|
||||
'ghostType','block','ghost','center','bagLine',
|
||||
'dropFX','moveFX','shakeFX',
|
||||
'text','highCam','nextPos',
|
||||
|
||||
--Unnecessary graphic
|
||||
-- Unnecessary graphic
|
||||
-- 'grid','smooth',
|
||||
-- 'lockFX','clearFX','splashFX','atkFX',
|
||||
-- 'score',
|
||||
@@ -691,11 +689,11 @@ do--function dumpBasicConfig()
|
||||
return JSON.encode(S)
|
||||
end
|
||||
end
|
||||
do--function resetGameData(args)
|
||||
do-- function resetGameData(args)
|
||||
local function task_showMods()
|
||||
local time=0
|
||||
while true do
|
||||
YIELD()
|
||||
coroutine.yield()
|
||||
time=time+1
|
||||
if time%20==0 then
|
||||
local M=GAME.mod[time/20]
|
||||
@@ -708,14 +706,14 @@ do--function resetGameData(args)
|
||||
end
|
||||
end
|
||||
local gameSetting={
|
||||
--Tuning
|
||||
-- Tuning
|
||||
'das','arr','dascut','dropcut','sddas','sdarr',
|
||||
'ihs','irs','ims','RS',
|
||||
|
||||
--System
|
||||
-- System
|
||||
'skin','face',
|
||||
|
||||
--Graphic
|
||||
-- Graphic
|
||||
'block','ghost','center','smooth','grid','bagLine',
|
||||
'lockFX','dropFX','moveFX','clearFX','splashFX','shakeFX','atkFX',
|
||||
'text','score','warn','highCam','nextPos',
|
||||
@@ -723,7 +721,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]
|
||||
@@ -732,19 +730,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
|
||||
@@ -768,12 +766,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
|
||||
@@ -792,14 +790,14 @@ do--function resetGameData(args)
|
||||
collectgarbage()
|
||||
end
|
||||
end
|
||||
do--function checkWarning()
|
||||
do-- function checkWarning()
|
||||
local max=math.max
|
||||
function checkWarning(dt)
|
||||
local P1=PLAYERS[1]
|
||||
if P1.alive then
|
||||
if P1.frameRun%26==0 then
|
||||
local F=P1.field
|
||||
local height=0--Max height of row 4~7
|
||||
local height=0-- Max height of row 4~7
|
||||
for x=4,7 do
|
||||
for y=#F,1,-1 do
|
||||
if F[y][x]>0 then
|
||||
@@ -830,41 +828,23 @@ 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})
|
||||
-- Game draw
|
||||
do-- function drawSelfProfile()
|
||||
local name
|
||||
local textObj,scaleK,width,offY
|
||||
function drawSelfProfile()
|
||||
local selfAvatar=USERS.getAvatar(USER.uid)
|
||||
gc_push('transform')
|
||||
gc_replaceTransform(SCR.xOy_ur)
|
||||
|
||||
--Draw avatar
|
||||
-- Draw avatar
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(COLOR.X)gc_rectangle('fill',0,0,-300,80)
|
||||
gc_setColor(1,1,1)gc_rectangle('line',-300,0,300,80,5)
|
||||
gc_rectangle('line',-73,7,66,66,2)
|
||||
gc_draw(selfAvatar,-72,8,nil,.5)
|
||||
gc_draw(USERS.getAvatar(USER.uid),-72,8,nil,.5)
|
||||
|
||||
--Draw username
|
||||
if name~=USERS.getUsername(USER.uid)then
|
||||
-- Draw username
|
||||
if name~=USERS.getUsername(USER.uid) then
|
||||
name=USERS.getUsername(USER.uid)
|
||||
textObj=GC.newText(getFont(30),name)
|
||||
width=textObj:getWidth()
|
||||
@@ -873,11 +853,6 @@ do--function drawSelfProfile()
|
||||
end
|
||||
gc_draw(textObj,-82,26,nil,scaleK,nil,width,offY)
|
||||
|
||||
--Draw lv. & xp.
|
||||
gc_draw(lvIcon[USER.lv],-295,50)
|
||||
gc_line(-270,55,-80,55,-80,70,-270,70)
|
||||
gc_rectangle('fill',-210,55,150*USER.xp/USER.lv/USER.lv,15)
|
||||
|
||||
gc_pop()
|
||||
end
|
||||
end
|
||||
@@ -886,7 +861,7 @@ function drawOnlinePlayerCount()
|
||||
gc_setColor(1,1,1)
|
||||
gc_push('transform')
|
||||
gc_replaceTransform(SCR.xOy_ur)
|
||||
gc_printf(("%s: %s/%s/%s"):format(text.onlinePlayerCount,NET.UserCount,NET.PlayCount,NET.StreamCount),-600,80,594,'right')
|
||||
gc_printf(text.onlinePlayerCount:repD(NET.onlineCount),-600,80,594,'right')
|
||||
gc_pop()
|
||||
end
|
||||
function drawWarning()
|
||||
@@ -903,38 +878,38 @@ end
|
||||
|
||||
|
||||
|
||||
--Widget function shortcuts
|
||||
function backScene()SCN.back()end
|
||||
do--function goScene(name,style)
|
||||
-- Widget function shortcuts
|
||||
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
|
||||
end
|
||||
do--function swapScene(name,style)
|
||||
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
|
||||
end
|
||||
do--function pressKey(k)
|
||||
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
|
||||
end
|
||||
do--CUS/SETXXX(k)
|
||||
do-- CUS/SETXXX(k)
|
||||
local CUSTOMENV=CUSTOMENV
|
||||
local warnList={
|
||||
'das','arr','dascut','dropcut','sddas','sdarr',
|
||||
@@ -943,13 +918,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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--Static data tables
|
||||
-- Static data tables
|
||||
BLOCK_NAMES={
|
||||
'Z','S','J','L','T','O','I',
|
||||
'Z5','S5','P','Q','F','E',
|
||||
@@ -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},
|
||||
@@ -20,7 +20,7 @@ RANK_COLORS={
|
||||
{1,.5,.4},
|
||||
{.95,.5,.95},
|
||||
}
|
||||
do--SVG_TITLE_FILL, SVG_TITLE_LINE
|
||||
do-- SVG_TITLE_FILL, SVG_TITLE_LINE
|
||||
SVG_TITLE_FILL={
|
||||
{
|
||||
0,0,
|
||||
@@ -131,24 +131,24 @@ 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
|
||||
do-- SVG_TITLE_FAN
|
||||
SVG_TITLE_FAN={}
|
||||
local sin,cos=math.sin,math.cos
|
||||
for i=1,9 do
|
||||
local L=TABLE.copy(SVG_TITLE_LINE[i])
|
||||
SVG_TITLE_FAN[i]=L
|
||||
for j=1,#L,2 do
|
||||
local x,y=L[j],L[j+1]--0<x<988, 290<y<1280
|
||||
x,y=-(x+280)*.002,(y-580)*.9--X=ang, Y=dist
|
||||
x,y=y*cos(x),-y*sin(x)--Rec-Pol-Rec
|
||||
local x,y=L[j],L[j+1]-- 0<x<988, 290<y<1280
|
||||
x,y=-(x+280)*.002,(y-580)*.9-- X=ang, Y=dist
|
||||
x,y=y*cos(x),-y*sin(x)-- Rec-Pol-Rec
|
||||
L[j],L[j+1]=x,y+300
|
||||
end
|
||||
end
|
||||
end
|
||||
do--MISSIONENUM
|
||||
do-- MISSIONENUM
|
||||
ENUM_MISSION={
|
||||
_1=01,_2=02,_3=03,_4=04,
|
||||
A1=05,A2=06,A3=07,A4=08,
|
||||
@@ -165,8 +165,8 @@ do--MISSIONENUM
|
||||
for k,v in next,ENUM_MISSION do L[v]=k end
|
||||
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
|
||||
do-- TEXTOBJ
|
||||
local function T(s,t) return love.graphics.newText(getFont(s),t) end
|
||||
TEXTOBJ={
|
||||
modeName=T(30),
|
||||
|
||||
@@ -189,51 +189,51 @@ do--TEXTOBJ
|
||||
noScore=T(45),highScore=T(30),modeLocked=T(45),
|
||||
}
|
||||
end
|
||||
do--BLOCKS
|
||||
do-- BLOCKS
|
||||
local O,_=true,false
|
||||
BLOCKS={
|
||||
--Tetromino
|
||||
{{_,O,O},{O,O,_}},--Z
|
||||
{{O,O,_},{_,O,O}},--S
|
||||
{{O,O,O},{O,_,_}},--J
|
||||
{{O,O,O},{_,_,O}},--L
|
||||
{{O,O,O},{_,O,_}},--T
|
||||
{{O,O},{O,O}}, --O
|
||||
{{O,O,O,O}}, --I
|
||||
-- Tetromino
|
||||
{{_,O,O},{O,O,_}},-- Z
|
||||
{{O,O,_},{_,O,O}},-- S
|
||||
{{O,O,O},{O,_,_}},-- J
|
||||
{{O,O,O},{_,_,O}},-- L
|
||||
{{O,O,O},{_,O,_}},-- T
|
||||
{{O,O},{O,O}}, -- O
|
||||
{{O,O,O,O}}, -- I
|
||||
|
||||
--Pentomino
|
||||
{{_,O,O},{_,O,_},{O,O,_}},--Z5
|
||||
{{O,O,_},{_,O,_},{_,O,O}},--S5
|
||||
{{O,O,O},{O,O,_}}, --P
|
||||
{{O,O,O},{_,O,O}}, --Q
|
||||
{{_,O,_},{O,O,O},{O,_,_}},--F
|
||||
{{_,O,_},{O,O,O},{_,_,O}},--E
|
||||
{{O,O,O},{_,O,_},{_,O,_}},--T5
|
||||
{{O,O,O},{O,_,O}}, --U
|
||||
{{O,O,O},{_,_,O},{_,_,O}},--V
|
||||
{{_,O,O},{O,O,_},{O,_,_}},--W
|
||||
{{_,O,_},{O,O,O},{_,O,_}},--X
|
||||
{{O,O,O,O},{O,_,_,_}}, --J5
|
||||
{{O,O,O,O},{_,_,_,O}}, --L5
|
||||
{{O,O,O,O},{_,O,_,_}}, --R
|
||||
{{O,O,O,O},{_,_,O,_}}, --Y
|
||||
{{_,O,O,O},{O,O,_,_}}, --N
|
||||
{{O,O,O,_},{_,_,O,O}}, --H
|
||||
{{O,O,O,O,O}}, --I5
|
||||
-- Pentomino
|
||||
{{_,O,O},{_,O,_},{O,O,_}},-- Z5
|
||||
{{O,O,_},{_,O,_},{_,O,O}},-- S5
|
||||
{{O,O,O},{O,O,_}}, -- P
|
||||
{{O,O,O},{_,O,O}}, -- Q
|
||||
{{_,O,_},{O,O,O},{O,_,_}},-- F
|
||||
{{_,O,_},{O,O,O},{_,_,O}},-- E
|
||||
{{O,O,O},{_,O,_},{_,O,_}},-- T5
|
||||
{{O,O,O},{O,_,O}}, -- U
|
||||
{{O,O,O},{_,_,O},{_,_,O}},-- V
|
||||
{{_,O,O},{O,O,_},{O,_,_}},-- W
|
||||
{{_,O,_},{O,O,O},{_,O,_}},-- X
|
||||
{{O,O,O,O},{O,_,_,_}}, -- J5
|
||||
{{O,O,O,O},{_,_,_,O}}, -- L5
|
||||
{{O,O,O,O},{_,O,_,_}}, -- R
|
||||
{{O,O,O,O},{_,_,O,_}}, -- Y
|
||||
{{_,O,O,O},{O,O,_,_}}, -- N
|
||||
{{O,O,O,_},{_,_,O,O}}, -- H
|
||||
{{O,O,O,O,O}}, -- I5
|
||||
|
||||
--Trimino
|
||||
{{O,O,O}}, --I3
|
||||
{{O,O},{_,O}},--C
|
||||
-- Trimino
|
||||
{{O,O,O}}, -- I3
|
||||
{{O,O},{_,O}},-- C
|
||||
|
||||
--Domino
|
||||
{{O,O}},--I2
|
||||
-- Domino
|
||||
{{O,O}},-- I2
|
||||
|
||||
--Dot
|
||||
{{O}},--O1
|
||||
-- Dot
|
||||
{{O}},-- O1
|
||||
}
|
||||
local function _RotCW(B)
|
||||
local N={}
|
||||
local r,c=#B,#B[1]--row,col
|
||||
local r,c=#B,#B[1]-- row,col
|
||||
for x=1,c do
|
||||
N[x]={}
|
||||
for y=1,r do
|
||||
@@ -339,101 +339,101 @@ EVENTSETS={
|
||||
'ultra',
|
||||
}
|
||||
|
||||
do--Mod data
|
||||
do-- Mod data
|
||||
local function _disableKey(P,key)
|
||||
table.insert(P.gameEnv.keyCancel,key)
|
||||
end
|
||||
MODOPT={--Mod options
|
||||
MODOPT={-- Mod options
|
||||
{no=0,id="NX",name="next",
|
||||
key="q",x=80,y=230,color='lO',
|
||||
list={0,1,2,3,4,5,6},
|
||||
func=function(P,O)P.gameEnv.nextCount=O end,
|
||||
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,
|
||||
},
|
||||
}
|
||||
@@ -489,44 +489,44 @@ do--Mod data
|
||||
M.color=COLOR[M.color]
|
||||
end
|
||||
end
|
||||
do--Game data tables
|
||||
PLAYERS={}--Players data
|
||||
do-- Game data tables
|
||||
PLAYERS={}-- Players data
|
||||
PLY_ALIVE={}
|
||||
FIELD={}--Field(s) for custom game
|
||||
BAG={}--Sequence for custom game
|
||||
MISSION={}--Clearing mission for custom game
|
||||
GAME={--Global game data
|
||||
playing=false, --If in-game
|
||||
init=false, --If need initializing game when enter scene-play
|
||||
net=false, --If play net game
|
||||
FIELD={}-- Field(s) for custom game
|
||||
BAG={}-- Sequence for custom game
|
||||
MISSION={}-- Clearing mission for custom game
|
||||
GAME={-- Global game data
|
||||
playing=false, -- If in-game
|
||||
init=false, -- If need initializing game when enter scene-play
|
||||
net=false, -- If play net game
|
||||
|
||||
result=false, --Game result (string)
|
||||
rank=0, --Rank reached
|
||||
pauseTime=0, --Time paused
|
||||
pauseCount=0, --Pausing count
|
||||
warnLVL0=0, --Warning level
|
||||
warnLVL=0, --Warning level (show)
|
||||
result=false, -- Game result (string)
|
||||
rank=0, -- Rank reached
|
||||
pauseTime=0, -- Time paused
|
||||
pauseCount=0, -- Pausing count
|
||||
warnLVL0=0, -- Warning level
|
||||
warnLVL=0, -- Warning level (show)
|
||||
|
||||
seed=1046101471, --Game seed
|
||||
curMode=false, --Current gamemode object
|
||||
mod={}, --List of loaded mods
|
||||
modeEnv=false, --Current gamemode environment
|
||||
setting={}, --Game settings
|
||||
rep={}, --Recording list, key,time,key,time...
|
||||
statSaved=true, --If recording saved
|
||||
recording=false, --If recording
|
||||
replaying=false, --If replaying
|
||||
saved=false, --If recording saved
|
||||
tasUsed=false, --If tasMode used
|
||||
seed=1046101471, -- Game seed
|
||||
curMode=false, -- Current gamemode object
|
||||
mod={}, -- List of loaded mods
|
||||
modeEnv=false, -- Current gamemode environment
|
||||
setting={}, -- Game settings
|
||||
rep={}, -- Recording list, key,time,key,time...
|
||||
statSaved=true, -- If recording saved
|
||||
recording=false, -- If recording
|
||||
replaying=false, -- If replaying
|
||||
saved=false, -- If recording saved
|
||||
tasUsed=false, -- If tasMode used
|
||||
|
||||
prevBG=false, --Previous background, for restore BG when quit setting page
|
||||
prevBG=false, -- Previous background, for restore BG when quit setting page
|
||||
|
||||
--Data for royale mode
|
||||
stage=false, --Game stage
|
||||
mostBadge=false, --Most badge owner
|
||||
secBadge=false, --Second badge owner
|
||||
mostDangerous=false,--Most dangerous player
|
||||
secDangerous=false, --Second dangerous player
|
||||
-- Data for royale mode
|
||||
stage=false, -- Game stage
|
||||
mostBadge=false, -- Most badge owner
|
||||
secBadge=false, -- Second badge owner
|
||||
mostDangerous=false,-- Most dangerous player
|
||||
secDangerous=false, -- Second dangerous player
|
||||
}
|
||||
ROYALEDATA={
|
||||
powerUp=false,
|
||||
@@ -534,25 +534,25 @@ do--Game data tables
|
||||
}
|
||||
CUSTOMENV={}
|
||||
ROOMENV={
|
||||
--Room config
|
||||
-- Room config
|
||||
capacity=10,
|
||||
|
||||
--Basic
|
||||
-- Basic
|
||||
drop=30,lock=60,
|
||||
wait=0,fall=0,
|
||||
hang=5,hurry=1e99,
|
||||
|
||||
--Control
|
||||
-- Control
|
||||
nextCount=6,
|
||||
holdMode='hold',
|
||||
holdCount=1,
|
||||
infHold=false,
|
||||
phyHold=false,
|
||||
|
||||
--Visual
|
||||
-- Visual
|
||||
bone=false,
|
||||
|
||||
--Rule
|
||||
-- Rule
|
||||
life=0,
|
||||
pushSpeed=5,
|
||||
garbageSpeed=2,
|
||||
@@ -571,19 +571,29 @@ do--Game data tables
|
||||
|
||||
eventSet="X",
|
||||
}
|
||||
REPLAY={}--Replay objects (not include stream data)
|
||||
REPLAY={}-- Replay objects (not include stream data)
|
||||
end
|
||||
do--Userdata tables
|
||||
USER={--User infomation
|
||||
--Network infos
|
||||
uid=false,
|
||||
authToken=false,
|
||||
|
||||
--Local data
|
||||
xp=0,lv=1,
|
||||
}
|
||||
SETTING={--Settings
|
||||
--Tuning
|
||||
do-- Userdata tables
|
||||
USER=setmetatable({-- User infomation
|
||||
__data={
|
||||
uid=false,
|
||||
email=false,
|
||||
password=false,
|
||||
rToken=false,
|
||||
aToken=false,
|
||||
},
|
||||
},{
|
||||
__index=function(self,k)
|
||||
return self.__data[k]
|
||||
end,
|
||||
__newindex=function(self,k,v)
|
||||
if self.__data[k]~=nil and v~=nil then
|
||||
self.__data[k]=v
|
||||
end
|
||||
end,
|
||||
})
|
||||
SETTING={-- Settings
|
||||
-- Tuning
|
||||
das=10,arr=2,
|
||||
dascut=0,dropcut=0,
|
||||
sddas=0,sdarr=2,
|
||||
@@ -591,14 +601,13 @@ do--Userdata tables
|
||||
holdMode='hold',
|
||||
RS='TRS',
|
||||
|
||||
--System
|
||||
-- System
|
||||
reTime=2,
|
||||
allowTAS=false,
|
||||
autoPause=true,
|
||||
menuPos='middle',
|
||||
fine=false,
|
||||
autoSave=false,
|
||||
autoLogin=true,
|
||||
simpMode=false,
|
||||
sysCursor=true,
|
||||
maxFPS=60,
|
||||
@@ -612,7 +621,7 @@ do--Userdata tables
|
||||
},
|
||||
face={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
|
||||
--Graphic
|
||||
-- Graphic
|
||||
ghostType='gray',
|
||||
block=true,ghost=.3,center=1,
|
||||
smooth=true,grid=.16,lineNum=.5,
|
||||
@@ -642,7 +651,7 @@ do--Userdata tables
|
||||
clickFX=true,
|
||||
warn=true,
|
||||
|
||||
--Sound
|
||||
-- Sound
|
||||
autoMute=true,
|
||||
sfxPack='chiptune',
|
||||
vocPack='miya',
|
||||
@@ -655,19 +664,19 @@ do--Userdata tables
|
||||
vib=0,
|
||||
voc=0,
|
||||
|
||||
--Virtualkey
|
||||
VKSFX=.2,--SFX volume
|
||||
VKVIB=0,--VIB
|
||||
VKSwitch=false,--If disp
|
||||
VKSkin=1,--If disp
|
||||
VKTrack=false,--If tracked
|
||||
VKDodge=false,--If dodge
|
||||
VKTchW=.3,--Touch-Pos Weight
|
||||
VKCurW=.4,--Cur-Pos Weight
|
||||
VKIcon=true,--If disp icon
|
||||
-- Virtualkey
|
||||
VKSFX=.2,-- SFX volume
|
||||
VKVIB=0,-- VIB
|
||||
VKSwitch=false,-- If disp
|
||||
VKSkin=1,-- If disp
|
||||
VKTrack=false,-- If tracked
|
||||
VKDodge=false,-- If dodge
|
||||
VKTchW=.3,-- Touch-Pos Weight
|
||||
VKCurW=.4,-- Cur-Pos Weight
|
||||
VKIcon=true,-- If disp icon
|
||||
VKAlpha=.3,
|
||||
}
|
||||
KEY_MAP={--Key setting
|
||||
KEY_MAP={-- Key setting
|
||||
keyboard={
|
||||
left=1,right=2,x=3,z=4,c=5,
|
||||
up=6,down=7,space=8,a=9,s=10,
|
||||
@@ -679,29 +688,29 @@ do--Userdata tables
|
||||
leftshoulder=0,
|
||||
},
|
||||
}
|
||||
VK_ORG={--Virtualkey layout, refresh all VKs' position with this before each game
|
||||
{ava=true, x=80, y=720-200,r=80},--moveLeft
|
||||
{ava=true, x=320, y=720-200,r=80},--moveRight
|
||||
{ava=true, x=1280-80, y=720-200,r=80},--rotRight
|
||||
{ava=true, x=1280-200,y=720-80, r=80},--rotLeft
|
||||
{ava=true, x=1280-200,y=720-320,r=80},--rot180
|
||||
{ava=true, x=200, y=720-320,r=80},--hardDrop
|
||||
{ava=true, x=200, y=720-80, r=80},--softDrop
|
||||
{ava=true, x=1280-320,y=720-200,r=80},--hold
|
||||
{ava=true, x=80, y=280, r=80},--func1
|
||||
{ava=true, x=1280-80, y=280, r=80},--func2
|
||||
{ava=false, x=670, y=50, r=30},--insLeft
|
||||
{ava=false, x=730, y=50, r=30},--insRight
|
||||
{ava=false, x=790, y=50, r=30},--insDown
|
||||
{ava=false, x=850, y=50, r=30},--down1
|
||||
{ava=false, x=910, y=50, r=30},--down4
|
||||
{ava=false, x=970, y=50, r=30},--down10
|
||||
{ava=false, x=1030, y=50, r=30},--dropLeft
|
||||
{ava=false, x=1090, y=50, r=30},--dropRight
|
||||
{ava=false, x=1150, y=50, r=30},--zangiLeft
|
||||
{ava=false, x=1210, y=50, r=30},--zangiRight
|
||||
VK_ORG={-- Virtualkey layout, refresh all VKs' position with this before each game
|
||||
{ava=true, x=80, y=720-200,r=80},-- moveLeft
|
||||
{ava=true, x=320, y=720-200,r=80},-- moveRight
|
||||
{ava=true, x=1280-80, y=720-200,r=80},-- rotRight
|
||||
{ava=true, x=1280-200,y=720-80, r=80},-- rotLeft
|
||||
{ava=true, x=1280-200,y=720-320,r=80},-- rot180
|
||||
{ava=true, x=200, y=720-320,r=80},-- hardDrop
|
||||
{ava=true, x=200, y=720-80, r=80},-- softDrop
|
||||
{ava=true, x=1280-320,y=720-200,r=80},-- hold
|
||||
{ava=true, x=80, y=280, r=80},-- func1
|
||||
{ava=true, x=1280-80, y=280, r=80},-- func2
|
||||
{ava=false, x=670, y=50, r=30},-- insLeft
|
||||
{ava=false, x=730, y=50, r=30},-- insRight
|
||||
{ava=false, x=790, y=50, r=30},-- insDown
|
||||
{ava=false, x=850, y=50, r=30},-- down1
|
||||
{ava=false, x=910, y=50, r=30},-- down4
|
||||
{ava=false, x=970, y=50, r=30},-- down10
|
||||
{ava=false, x=1030, y=50, r=30},-- dropLeft
|
||||
{ava=false, x=1090, y=50, r=30},-- dropRight
|
||||
{ava=false, x=1150, y=50, r=30},-- zangiLeft
|
||||
{ava=false, x=1210, y=50, r=30},-- zangiRight
|
||||
}
|
||||
RANKS={sprint_10l=0}--Ranks of modes
|
||||
RANKS={sprint_10l=0}-- Ranks of modes
|
||||
STAT={
|
||||
version=VERSION.code,
|
||||
run=0,game=0,time=0,frame=0,
|
||||
@@ -710,10 +719,10 @@ 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
|
||||
lastPlay='sprint_10l',-- Last played mode ID
|
||||
item=setmetatable({},{__index=function(self,k)
|
||||
self[k]=0
|
||||
return 0
|
||||
|
||||
@@ -91,7 +91,7 @@ return{
|
||||
},
|
||||
|
||||
|
||||
--Webpages / Organizations
|
||||
-- Webpages / Organizations
|
||||
{"Github Repository",
|
||||
"githubrepository sourcecode src",
|
||||
"org",
|
||||
@@ -125,16 +125,16 @@ 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
|
||||
-- Games
|
||||
{"TTT",
|
||||
"tetris trainer tres bien",
|
||||
"game",
|
||||
@@ -363,7 +363,7 @@ return{
|
||||
"Windows | Multiplayer\n(火拼俄罗斯)\n\nThe Tetris game on Tencent Game Center, 12-wide board, DAS/ARR the same as typing on the keyboard, one Next, no Hold. Can only send garbage through Tetris (sends three lines) and Triple (sends two lines). Garbage is checker-board-shaped and is nearly impossible to dig through.",
|
||||
},
|
||||
|
||||
--Terms
|
||||
-- Terms
|
||||
{"Translator Note 2",
|
||||
"",
|
||||
"help",
|
||||
@@ -448,7 +448,7 @@ return{
|
||||
{"Tetris",
|
||||
"tetris 4",
|
||||
"term",
|
||||
"The name of the game (and its trademark). Also the term for clearing four lines at one time in official games.\nCoined from Tetra (Greek for “four” <τέτταρες>) and Tennis (favorite sport of the creator of Tetris). Also, the Tetris games developed by Nintendo and SEGA were licensed by TTC. These two companies do not have the copyright of Tetris.",--Thanks to Alexey Pajitnov!
|
||||
"The name of the game (and its trademark). Also the term for clearing four lines at one time in official games.\nCoined from Tetra (Greek for “four” <τέτταρες>) and Tennis (favorite sport of the creator of Tetris). Also, the Tetris games developed by Nintendo and SEGA were licensed by TTC. These two companies do not have the copyright of Tetris.",-- Thanks to Alexey Pajitnov!
|
||||
},
|
||||
{"All Clear",
|
||||
"pc perfectclear ac allclear",
|
||||
@@ -675,7 +675,7 @@ return{
|
||||
{"Donation",
|
||||
"donate",
|
||||
"term",
|
||||
"A method of “plugging” up the Tetris hole to send a T-Spin. After the T-Spin, the Tetris hole is opened up once again to allow the continuation of Tetris or downstacking.\n--Harddrop wiki",
|
||||
"A method of “plugging” up the Tetris hole to send a T-Spin. After the T-Spin, the Tetris hole is opened up once again to allow the continuation of Tetris or downstacking.\n-- Harddrop wiki",
|
||||
},
|
||||
{"‘Debt’",
|
||||
"qianzhai debt owe",
|
||||
@@ -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",
|
||||
@@ -975,7 +975,7 @@ return{
|
||||
"A Tetris bot. Built by the Chinese Tetris player 奏之章 (Zòu Zhī Zhāng, see entry below) and has decent performance in many games",
|
||||
},
|
||||
|
||||
--Setups
|
||||
-- Setups
|
||||
{"Openers",
|
||||
"setup openers",
|
||||
"setup",
|
||||
@@ -1090,7 +1090,7 @@ return{
|
||||
HDsearch.."Gamushiro_Stacking",
|
||||
},
|
||||
|
||||
--Pattern
|
||||
-- Pattern
|
||||
{"Mid-game Setups",
|
||||
"midgamesetups",
|
||||
"pattern",
|
||||
@@ -1174,7 +1174,7 @@ return{
|
||||
"https://four.lol/perfect-clears/5th",
|
||||
},
|
||||
|
||||
--Savedata managing
|
||||
-- Savedata managing
|
||||
{"Console",
|
||||
"cmd commamd minglinghang kongzhitai terminal",
|
||||
"command",
|
||||
@@ -1216,7 +1216,7 @@ return{
|
||||
"Go to console, type “rm -s cache” and then press enter/return.\nTake effect immediately.",
|
||||
},
|
||||
|
||||
--English
|
||||
-- English
|
||||
{"SFX",
|
||||
"soundeffects",
|
||||
"english",
|
||||
|
||||
@@ -55,7 +55,7 @@ return{
|
||||
"https://tetris.huijiwiki.com",
|
||||
},
|
||||
|
||||
--Webpages / Organizations
|
||||
-- Webpages / Organizations
|
||||
{"Githubリポジトリー",
|
||||
"githubrepository sourcecode リポジトリー ソースコード",
|
||||
"org",
|
||||
@@ -89,16 +89,16 @@ 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
|
||||
-- Games
|
||||
{"テトリス トレーナー トレビアン (TTT)",
|
||||
"tetris trainer tres bien テトリス トレーナー トレビアン",
|
||||
"game",
|
||||
@@ -320,7 +320,7 @@ return{
|
||||
"Windows | Multiplayer\n(火拼俄罗斯)\n\nThe Tetris game on Tencent Game Center, 12-wide board, DAS/ARR the same as your typing, 1 next, no hold. Can only send garbage through Tetris (sends 3 lines) and Triple (sends 2 lines). Garbage is checker-board-shaped and is nearly impossible to dig through.",
|
||||
},
|
||||
|
||||
--Terms
|
||||
-- Terms
|
||||
{"Translator Note 2",
|
||||
"",
|
||||
"help",
|
||||
@@ -405,7 +405,7 @@ return{
|
||||
{"Tetris",
|
||||
"tetris",
|
||||
"term",
|
||||
"The name of the game (and its trademark). Also the name for clearing 4 lines at one time in official games.\nCoined from Tetra (greek for \"four\") and Tennis (favorite sport of the creator of Tetris). Also, the Tetris games developed by Nintendo and SEGA was licensed by TTC and these two companies do not have the copyright of Tetris.",--Thanks to Alexey Pajitnov!
|
||||
"The name of the game (and its trademark). Also the name for clearing 4 lines at one time in official games.\nCoined from Tetra (greek for \"four\") and Tennis (favorite sport of the creator of Tetris). Also, the Tetris games developed by Nintendo and SEGA was licensed by TTC and these two companies do not have the copyright of Tetris.",-- Thanks to Alexey Pajitnov!
|
||||
},
|
||||
{"All Clear",
|
||||
"pc perfectclear ac allclear",
|
||||
@@ -612,7 +612,7 @@ return{
|
||||
{"Donation",
|
||||
"donate",
|
||||
"term",
|
||||
"A method of \"plugging\" up the Tetris hole to send a T-Spin. After the T-Spin, the Tetris hole is opened up once again to allow the continuation of Tetris or downstacking.\n--Harddrop wiki",
|
||||
"A method of \"plugging\" up the Tetris hole to send a T-Spin. After the T-Spin, the Tetris hole is opened up once again to allow the continuation of Tetris or downstacking.\n-- Harddrop wiki",
|
||||
},
|
||||
{"\"Debt\"",
|
||||
"qianzhai debt owe",
|
||||
@@ -828,12 +828,12 @@ 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",
|
||||
"term",
|
||||
"",--TODO
|
||||
"",-- TODO
|
||||
},
|
||||
{"Tetris OL attack",
|
||||
"top tetrisonlineattack",
|
||||
@@ -917,7 +917,7 @@ return{
|
||||
"A Tetris bot. Built by the Chinese Tetris player 奏之章 (Zou Zhi Zhang) and has decent performance in many games",
|
||||
},
|
||||
|
||||
--Setups
|
||||
-- Setups
|
||||
{"Openers",
|
||||
"setup openers",
|
||||
"setup",
|
||||
@@ -1009,7 +1009,7 @@ return{
|
||||
"An All Clear opener with a high success rate. In Techmino's PC Practice modes, the setup that leaves an irregular opening is this setup.",
|
||||
},
|
||||
|
||||
--Pattern
|
||||
-- Pattern
|
||||
{"Mid-game Setups",
|
||||
"midgamesetups",
|
||||
"pattern",
|
||||
@@ -1072,7 +1072,7 @@ return{
|
||||
"Stacking TST(s) on top of a STSD.",
|
||||
},
|
||||
|
||||
--Savedata managing
|
||||
-- Savedata managing
|
||||
{"Console",
|
||||
"cmd commamd minglinghang kongzhitai terminal",
|
||||
"command",
|
||||
@@ -1114,7 +1114,7 @@ return{
|
||||
"Go to console and type \"rm -s cache\" then press enter.\nTake effect immediately.",
|
||||
},
|
||||
|
||||
--English
|
||||
-- English
|
||||
{"SFX",
|
||||
"soundeffects",
|
||||
"english",
|
||||
|
||||
@@ -84,7 +84,7 @@ return{
|
||||
"https://knewjade.github.io/fumen-for-mobile/"
|
||||
},
|
||||
|
||||
--相关网页/组织
|
||||
-- 相关网页/组织
|
||||
{"GitHub仓库",
|
||||
"源代码 源码 github git sourcecode yuandaima src",
|
||||
"org",
|
||||
@@ -117,16 +117,16 @@ 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",
|
||||
},
|
||||
|
||||
--游戏(题库)
|
||||
-- 游戏(题库)
|
||||
{"TTT",
|
||||
"教程 trainer tres bien",
|
||||
"game",
|
||||
@@ -152,7 +152,7 @@ return{
|
||||
"http://121.36.2.245:3000/tpo"
|
||||
},
|
||||
|
||||
--游戏(网页)
|
||||
-- 游戏(网页)
|
||||
{"注[1]",
|
||||
"备注 notice",
|
||||
"game",
|
||||
@@ -228,7 +228,7 @@ return{
|
||||
"网页游戏 | 单机\ntetris.com官网上的俄罗斯方块,在马拉松基础上添加了技能,场地上会随机冒出技能方块,消除后会得到各种各样或好或坏的技能。",
|
||||
},
|
||||
|
||||
--游戏(跨平台)
|
||||
-- 游戏(跨平台)
|
||||
{"Techmino",
|
||||
"铁壳米诺 方块研究所 tieke",
|
||||
"game",
|
||||
@@ -250,7 +250,7 @@ return{
|
||||
"Windows/Android | 单机\n块圈玩家自制方块,正在开发中,有一个原创旋转系统。",
|
||||
},
|
||||
|
||||
--游戏(街机/类街机)
|
||||
-- 游戏(街机/类街机)
|
||||
{"TGM",
|
||||
"俄罗斯方块大师 tetrisgrandmaster",
|
||||
"game",
|
||||
@@ -273,7 +273,7 @@ return{
|
||||
"Windows | 单机\n简称Tex,包含TGM的所有模式,可以用来练习TGM,但World规则不完全一样(如软降到底无锁延,踢墙表有细节不同等)。",
|
||||
},
|
||||
|
||||
--游戏(其他)
|
||||
-- 游戏(其他)
|
||||
{"Tetris Effect",
|
||||
"效应 tec tetriseffectconnected xiaoyinglianjie",
|
||||
"game",
|
||||
@@ -356,7 +356,7 @@ return{
|
||||
"Windows | 多人\n腾讯游戏大厅的方块,场地12列,打字的 DAS 和 ARR,1 Next无 Hold,攻击途径只有消4打3、 消3打2,垃圾行为国际象棋棋盘式,几乎不可能挖掘。",
|
||||
},
|
||||
|
||||
--术语(缩写)
|
||||
-- 术语(缩写)
|
||||
{"LPM",
|
||||
"速度 sudu",
|
||||
"term",
|
||||
@@ -413,7 +413,7 @@ return{
|
||||
"Attack Per Line\n攻击每行,也叫效率,体现玩家攻击的行利用率。例如消四和T旋的效率就比消二和消三高。",
|
||||
},
|
||||
|
||||
--术语(消除名)
|
||||
-- 术语(消除名)
|
||||
{"Single",
|
||||
"1 xiaoyi",
|
||||
"term",
|
||||
@@ -450,7 +450,7 @@ return{
|
||||
"Half-PC\nPC(全消)的外延,“下方有剩余方块” 的全消(特别地,如果只消1行则必须不剩余玩家放置的方块),能打出一些攻击和防御(Techmino限定)。",
|
||||
},
|
||||
|
||||
--术语(旋转相关)
|
||||
-- 术语(旋转相关)
|
||||
{"Spin",
|
||||
"转 xuanzhuan zuandong",
|
||||
"term",
|
||||
@@ -578,7 +578,7 @@ return{
|
||||
"X Rotation System\nT-ex原创旋转系统,引入了 “按住方向键换一套踢墙表” 的设定(在对应的方向需要顶住墙),让 “想去哪” 能被游戏捕获从而转到玩家希望到达的位置。\n\n其他旋转系统无论踢墙表怎么设计,块处在某个位置时旋转后最终只能按固定顺序测试,这导致不同的踢墙是竞争的,若存在两个可能想去的位置就只能二选一,XRS解决了这个问题。",
|
||||
},
|
||||
|
||||
--术语(其他)
|
||||
-- 术语(其他)
|
||||
{"B2B",
|
||||
"大满贯 btb backtoback",
|
||||
"term",
|
||||
@@ -903,7 +903,7 @@ return{
|
||||
{"C2序列",
|
||||
"seq",
|
||||
"term",
|
||||
"(七个块初始权重设为0)\n要取块的时候,\n先把七个数都除以2然后加上0~1的随机数,\n最大的数字是第几个的就出对应的块,然后将其权重除以3.5\n循环。",--Discovered by zxc
|
||||
"(七个块初始权重设为0)\n要取块的时候,\n先把七个数都除以2然后加上0~1的随机数,\n最大的数字是第几个的就出对应的块,然后将其权重除以3.5\n循环。",-- Discovered by zxc
|
||||
},
|
||||
{"堆叠(Stack)",
|
||||
"duidie stacking",
|
||||
@@ -972,7 +972,7 @@ return{
|
||||
"一个AI的名字(就跟AlphaGo一样)\n由研究群群友奏之章开发,重新调参后在各个游戏平台上的表现都很不错。",
|
||||
},
|
||||
|
||||
--定式
|
||||
-- 定式
|
||||
{"开局定式(Setup)",
|
||||
"opening kaijudingshi opener",
|
||||
"setup",
|
||||
@@ -1086,7 +1086,7 @@ return{
|
||||
HDsearch.."Gamushiro_Stacking",
|
||||
},
|
||||
|
||||
--形状
|
||||
-- 形状
|
||||
{"中局定式",
|
||||
"setup dingshi",
|
||||
"pattern",
|
||||
@@ -1171,7 +1171,7 @@ return{
|
||||
"https://four.lol/perfect-clears/5th"
|
||||
},
|
||||
|
||||
--存档管理
|
||||
-- 存档管理
|
||||
{"控制台",
|
||||
"console cmd commamd minglinghang kongzhitai",
|
||||
"command",
|
||||
@@ -1213,7 +1213,7 @@ return{
|
||||
"前往控制台输入 “rm -s cache” 并回车。\n立即生效。",
|
||||
},
|
||||
|
||||
--英文
|
||||
-- 英文
|
||||
{"SFX",
|
||||
"",
|
||||
"english",
|
||||
|
||||
@@ -104,6 +104,14 @@ return{
|
||||
|
||||
dictNote="==Copied from TetroDictionary==",
|
||||
|
||||
|
||||
|
||||
Techrater={-- Server's warn/error messages
|
||||
-- TODO
|
||||
},
|
||||
|
||||
tooFrequently="Request too frequently",
|
||||
roomPasswordChanged="Room password changed",
|
||||
getNoticeFail="Failed to fetch announcements",
|
||||
oldVersion="Version $1 is now available",
|
||||
needUpdate="Newer version required!",
|
||||
@@ -114,23 +122,23 @@ return{
|
||||
|
||||
noUsername="Please enter your username",
|
||||
wrongEmail="Invalid email address",
|
||||
wrongCode="Invalid verification code",
|
||||
noPassword="Please enter your password",
|
||||
diffPassword="Passwords don’t match",
|
||||
registerRequestSent="A sign up request has been sent.",
|
||||
registerOK="Sign up successful!",
|
||||
loginOK="You are now logged in!",
|
||||
accessOK="Access granted",
|
||||
checkEmail="A sign up request has been sent.",
|
||||
|
||||
wsConnecting="Websocket connecting…",
|
||||
wsFailed="WebSocket connection failed",
|
||||
wsClose="WebSocket closed:",
|
||||
wsFailed="WebSocket connection failed: $1",
|
||||
wsClose="WebSocket closed: $1",
|
||||
netTimeout="Connection timed out",
|
||||
serverDown="Oops! Server is down",
|
||||
requestFailed="Request failed",
|
||||
|
||||
onlinePlayerCount="Online",
|
||||
onlinePlayerCount="Online: $1",
|
||||
createRoomSuccessed="Room created",
|
||||
playerKicked="[$1] removed [$2] from room",
|
||||
started="Playing",
|
||||
joinRoom="has entered the room.",
|
||||
leaveRoom="has left the room.",
|
||||
joinRoom="$1 has entered the room.",
|
||||
leaveRoom="$1 has left the room.",
|
||||
ready="Ready",
|
||||
connStream="Connecting",
|
||||
waitStream="Waiting",
|
||||
@@ -139,6 +147,8 @@ return{
|
||||
chatStart="------Beginning of log------",
|
||||
chatHistory="------New messages below------",
|
||||
|
||||
|
||||
|
||||
keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete",
|
||||
customBGhelp="Drop image file here to apply custom background",
|
||||
customBGloadFailed="Unsupport image format for custom background",
|
||||
@@ -206,8 +216,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",
|
||||
@@ -322,6 +332,7 @@ return{
|
||||
Cold_Clear [MinusKelvin]
|
||||
json.lua [rxi]
|
||||
profile.lua [itraykov]
|
||||
sha2 [Egor Skriptunoff]
|
||||
]],
|
||||
support="Support the author",
|
||||
WidgetText={
|
||||
@@ -361,6 +372,7 @@ return{
|
||||
league="Tech League",
|
||||
ffa="FFA",
|
||||
rooms="Rooms",
|
||||
resetPW="Reset password",
|
||||
logout="Log out",
|
||||
},
|
||||
net_league={
|
||||
@@ -437,7 +449,6 @@ return{
|
||||
sysCursor="Use System Cursor",
|
||||
autoPause="Pause When Unfocused",
|
||||
autoSave="Auto-save New Records",
|
||||
autoLogin="Auto-login on Start",
|
||||
simpMode="Simplistic Mode",
|
||||
},
|
||||
setting_video={
|
||||
@@ -688,24 +699,29 @@ return{
|
||||
music="BGMs",
|
||||
label="label",
|
||||
},
|
||||
login={
|
||||
login_pw={
|
||||
title="Sign In",
|
||||
register="Sign Up",
|
||||
login_mail="Login with E-mail/Sign Up",
|
||||
email="Email Address",
|
||||
password="Password",
|
||||
showEmail="Show Email",
|
||||
keepPW="Remember me",
|
||||
login="Log In",
|
||||
},
|
||||
register={
|
||||
title="Sign Up",
|
||||
login="Sign In",
|
||||
username="Username",
|
||||
login_mail={
|
||||
title="Sign In/Sign Up",
|
||||
login_pw="Password Sign In",
|
||||
email="Email Address",
|
||||
send="Send code",
|
||||
code="Verification Code",
|
||||
verify="Verify",
|
||||
},
|
||||
reset_password={
|
||||
title="Reset Password",
|
||||
send="Send code",
|
||||
code="Verification Code",
|
||||
password="Password",
|
||||
password2="Re-enter Password",
|
||||
register="Sign Up",
|
||||
registering="Waiting for response…",
|
||||
setPW="Set Password",
|
||||
},
|
||||
account={
|
||||
title="Account",
|
||||
@@ -920,7 +936,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?",
|
||||
@@ -968,7 +984,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).",
|
||||
|
||||
@@ -103,6 +103,14 @@ return{
|
||||
|
||||
dictNote="==Copia de TetroDictionary==",
|
||||
|
||||
|
||||
|
||||
Techrater={-- Server's warn/error messages
|
||||
-- TODO
|
||||
},
|
||||
|
||||
-- tooFrequently="Request too frequently",
|
||||
-- roomPasswordChanged="Room password changed",
|
||||
getNoticeFail="Error al buscar novedades.",
|
||||
oldVersion="¡Está disponible la nueva versión $1!",
|
||||
needUpdate="¡Nueva versión requerida!",
|
||||
@@ -113,23 +121,23 @@ return{
|
||||
|
||||
noUsername="Por favor ingresa un nombre de usuario",
|
||||
wrongEmail="Correo electrónico inválido",
|
||||
-- wrongCode="Invalid verification code",
|
||||
noPassword="Por favor ingresa la contraseña",
|
||||
diffPassword="Las contraseñas no coinciden",
|
||||
registerRequestSent="Petición de registro enviada con éxito",
|
||||
registerOK="¡Registro exitoso!",
|
||||
loginOK="¡Ingreso con éxito!",
|
||||
accessOK="¡Autorizado exitoso!",
|
||||
checkEmail="Petición de registro enviada con éxito",
|
||||
|
||||
wsConnecting="Websocket Conectando",
|
||||
wsFailed="WebSocket conexión fallida",
|
||||
wsClose="WebSocket cerrado:",
|
||||
wsFailed="WebSocket conexión fallida: $1",
|
||||
wsClose="WebSocket cerrado: $1",
|
||||
netTimeout="Tiempo de conexión agotado",
|
||||
-- serverDown="Oops! Server is down",
|
||||
-- requestFailed="Request failed",
|
||||
|
||||
onlinePlayerCount="En línea",
|
||||
onlinePlayerCount="En línea: $1",
|
||||
createRoomSuccessed="¡Sala creada con éxito!",
|
||||
-- playerKicked="[$1] removed [$2] from room",
|
||||
started="En juego",
|
||||
joinRoom="entró a la sala.",
|
||||
leaveRoom="salió de la sala.",
|
||||
joinRoom="$1 entró a la sala.",
|
||||
leaveRoom="$1 salió de la sala.",
|
||||
ready="LISTO",
|
||||
connStream="CONECTANDO",
|
||||
waitStream="ESPERANDO",
|
||||
@@ -138,6 +146,8 @@ return{
|
||||
chatStart="------Comienzo del historial------",
|
||||
chatHistory="------Nuevos mensajes------",
|
||||
|
||||
|
||||
|
||||
keySettingInstruction="Pulsa la tecla a mapear\nEsc.: Cancelar\nBackspace: Borrar",
|
||||
customBGhelp="Suelta una imagen aquí para aplicarla de fondo",
|
||||
customBGloadFailed="Formato de imagen no soportado",
|
||||
@@ -206,8 +216,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",
|
||||
@@ -322,6 +332,7 @@ return{
|
||||
Cold_Clear [MinusKelvin]
|
||||
json.lua [rxi]
|
||||
profile.lua [itraykov]
|
||||
sha2 [Egor Skriptunoff]
|
||||
]],
|
||||
support="Apoyen al Autor",
|
||||
WidgetText={
|
||||
@@ -361,6 +372,7 @@ return{
|
||||
league="Liga Tech",
|
||||
ffa="FFA",
|
||||
rooms="Salas",
|
||||
-- resetPW="Reset password",
|
||||
logout="Desconec.",
|
||||
},
|
||||
net_league={
|
||||
@@ -437,7 +449,6 @@ return{
|
||||
sysCursor="Usar cursor del sistema",
|
||||
autoPause="Pausar cuando la ventana no está enfocada",
|
||||
autoSave="Autograbar Récords",
|
||||
autoLogin="Autologueo al Iniciar",
|
||||
simpMode="Modo Sencillo",
|
||||
},
|
||||
setting_video={
|
||||
@@ -680,24 +691,29 @@ return{
|
||||
music="BGMs",
|
||||
label="Etiq.",
|
||||
},
|
||||
login={
|
||||
login_pw={
|
||||
title="Entrar",
|
||||
register="Registrarse",
|
||||
-- login_mail="Login with E-mail/Sign Up",
|
||||
email="Correo Elec.",
|
||||
password="Contraseña",
|
||||
showEmail="Mostrar Correo",
|
||||
keepPW="Recordar credenciales",
|
||||
login="Entrar",
|
||||
},
|
||||
register={
|
||||
title="Registrarse",
|
||||
login="Entrar",
|
||||
username="Nombre de Usuario",
|
||||
login_mail={
|
||||
title="Entrar/Registrarse",
|
||||
-- login_pw="Password Sign In",
|
||||
email="Correo Elec.",
|
||||
-- send="Send code",
|
||||
-- code="Verification Code",
|
||||
-- verify="Verify",
|
||||
},
|
||||
reset_password={
|
||||
-- title="Reset Password",
|
||||
-- send="Send code",
|
||||
-- code="Verification Code",
|
||||
password="Contraseña",
|
||||
password2="Repetir Contr.",
|
||||
register="Registrarse",
|
||||
registering="Esperando respuesta...",
|
||||
-- setPW="Set Password",
|
||||
},
|
||||
account={
|
||||
title="Cuenta",
|
||||
|
||||
@@ -54,7 +54,7 @@ return{
|
||||
|
||||
-- cc_fixed="CC is incompatible with fixed sequences",
|
||||
-- cc_swap="CC is incompatible with swap holdmode",
|
||||
--ai_prebag="The AI is incompatible with custom sequences which have nontetromino.",'IA est incompatible avec les séquences personnalisées.",
|
||||
-- ai_prebag="The AI is incompatible with custom sequences which have nontetromino.",'IA est incompatible avec les séquences personnalisées.",
|
||||
ai_mission="L'IA est incompatible avec les missions personnalisées.",
|
||||
switchSpawnSFX="Activez les effets sonores d'apparition des pièces pour jouer",
|
||||
needRestart="Fonctionnera dès la prochaine partie",
|
||||
@@ -94,6 +94,14 @@ return{
|
||||
|
||||
-- dictNote="==Copied from TetroDictionary==",
|
||||
|
||||
|
||||
|
||||
Techrater={-- Server's warn/error messages
|
||||
-- TODO
|
||||
},
|
||||
|
||||
-- tooFrequently="Request too frequently",
|
||||
-- roomPasswordChanged="Room password changed",
|
||||
getNoticeFail="Echec de l'obtention de la notice",
|
||||
oldVersion="La version $1 est disponible !",
|
||||
-- versionNotMatch="Version do not match!",
|
||||
@@ -104,23 +112,23 @@ return{
|
||||
|
||||
noUsername="Entrez votre nom d'utilisateur",
|
||||
wrongEmail="Mauvaise adresse email",
|
||||
-- wrongCode="Invalid verification code",
|
||||
noPassword="Entrez votre mot de passe",
|
||||
diffPassword="Les mots de passe ne se correspondent pas",
|
||||
-- registerRequestSent="Registration request sent",
|
||||
registerOK="Enregistré avec succès !",
|
||||
loginOK="Connecté avec succès !",
|
||||
accessOK="Autorisé avec succès !",
|
||||
-- checkEmail="Registration request sent",
|
||||
|
||||
-- wsConnecting="Websocket Connecting",
|
||||
wsFailed="WebSocket connection échouée",
|
||||
-- wsClose="WebSocket Closed:",
|
||||
wsFailed="WebSocket connection échouée: $1",
|
||||
-- wsClose="WebSocket Closed: $1",
|
||||
-- netTimeout="Network connection timeout",
|
||||
-- serverDown="Oops! Server is down",
|
||||
-- requestFailed="Request failed",
|
||||
|
||||
-- onlinePlayerCount="Online",
|
||||
-- onlinePlayerCount="Online: $1",
|
||||
createRoomSuccessed="Salon créé avec succès !",
|
||||
-- playerKicked="[$1] removed [$2] from room",
|
||||
-- started="Playing",
|
||||
joinRoom="a rejoint le salon.",
|
||||
leaveRoom="a quitté le salon.",
|
||||
joinRoom="$1 a rejoint le salon.",
|
||||
leaveRoom="$1 a quitté le salon.",
|
||||
-- ready="READY",
|
||||
-- connStream="CONNECTING",
|
||||
-- waitStream="WAITING",
|
||||
@@ -129,6 +137,8 @@ return{
|
||||
chatStart="--------Début des logs--------",
|
||||
chatHistory="-Nouveaux messages en dessous-",
|
||||
|
||||
|
||||
|
||||
-- keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete",
|
||||
-- customBGhelp="Drop image file here to apply custom background",
|
||||
-- customBGloadFailed="Unsupport image format for custom background",
|
||||
@@ -173,8 +183,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",
|
||||
@@ -289,6 +299,7 @@ return{
|
||||
Cold_Clear [MinusKelvin]
|
||||
json.lua [rxi]
|
||||
profile.lua [itraykov]
|
||||
sha2 [Egor Skriptunoff]
|
||||
]],
|
||||
support="Aider le créateur",
|
||||
WidgetText={
|
||||
@@ -324,6 +335,7 @@ return{
|
||||
-- league="Tech League",
|
||||
ffa="FFA",
|
||||
rooms="Salons",
|
||||
-- resetPW="Reset password",
|
||||
-- logout="Log out",
|
||||
},
|
||||
net_league={
|
||||
@@ -400,7 +412,6 @@ return{
|
||||
-- sysCursor="Use system cursor",
|
||||
autoPause="Mettre en pause en cas de perte de focus",
|
||||
-- autoSave="Auto save new-best",
|
||||
-- autoLogin="Auto Login on Start",
|
||||
-- simpMode="Simple mode",
|
||||
},
|
||||
setting_video={
|
||||
@@ -642,24 +653,29 @@ return{
|
||||
music="Musique",
|
||||
-- label="label",
|
||||
},
|
||||
login={
|
||||
login_pw={
|
||||
title="Connexion",
|
||||
register="Enregistrement",
|
||||
-- login_mail="Login with E-mail/Sign Up",
|
||||
email="E-mail",
|
||||
password="Mot de passe",
|
||||
-- showEmail="Show Email",
|
||||
-- keepPW="Remember me",
|
||||
login="Connexion",
|
||||
},
|
||||
register={
|
||||
title="Enregistrement",
|
||||
login="Connexion",
|
||||
username="Nom d'utilisateur",
|
||||
login_mail={
|
||||
title="Connexion/Enregistrement",
|
||||
-- login_pw="Password Sign In",
|
||||
email="E-mail",
|
||||
-- send="Send code",
|
||||
-- code="Verification Code",
|
||||
-- verify="Verify",
|
||||
},
|
||||
reset_password={
|
||||
-- title="Reset Password",
|
||||
-- send="Send code",
|
||||
-- code="Verification Code",
|
||||
password="Mot de passe",
|
||||
password2="Confirmer le mot de passe",
|
||||
register="Enregistrement",
|
||||
-- registering="Waiting for response...",
|
||||
-- setPW="Set Password",
|
||||
},
|
||||
account={
|
||||
title="Compte",
|
||||
|
||||
@@ -105,6 +105,14 @@ return{
|
||||
|
||||
dictNote="==Tersalin dari TetroDictionary==",
|
||||
|
||||
|
||||
|
||||
Techrater={-- Server's warn/error messages
|
||||
-- TODO
|
||||
},
|
||||
|
||||
-- tooFrequently="Request too frequently",
|
||||
-- roomPasswordChanged="Room password changed",
|
||||
getNoticeFail="Gagal mengambil pengumuman-pengumuman",
|
||||
oldVersion="Versi $1 sekarang tersedia",
|
||||
needUpdate="Butuh versi lebih baru!",
|
||||
@@ -115,23 +123,23 @@ return{
|
||||
|
||||
noUsername="Silahkan memasukan username Anda",
|
||||
wrongEmail="Alamat email tidak sah",
|
||||
-- wrongCode="Invalid verification code",
|
||||
noPassword="Silahkan memasukan kata sandi Anda",
|
||||
diffPassword="Kata sandi tidak sama",
|
||||
registerRequestSent="Permintaan daftar telah terkirim.",
|
||||
registerOK="Pendaftaran sukses!",
|
||||
loginOK="Anda telah gabung!",
|
||||
accessOK="Akses diberikan",
|
||||
checkEmail="Permintaan daftar telah terkirim.",
|
||||
|
||||
wsConnecting="Menghubungkan websocket…",
|
||||
wsFailed="Koneksi websocket gagal",
|
||||
wsClose="Websocket tertutup:",
|
||||
wsFailed="Koneksi websocket gagal: $1",
|
||||
wsClose="Websocket tertutup: $1",
|
||||
netTimeout="Koneksi waktu habis",
|
||||
-- serverDown="Oops! Server is down",
|
||||
-- requestFailed="Request failed",
|
||||
|
||||
onlinePlayerCount="Online",
|
||||
onlinePlayerCount="Online: $1",
|
||||
createRoomSuccessed="Ruang terbuat",
|
||||
-- playerKicked="[$1] removed [$2] from room",
|
||||
started="Bermain",
|
||||
joinRoom="telah memasuki ruangan.",
|
||||
leaveRoom="telah keluar dari ruangan.",
|
||||
joinRoom="$1 telah memasuki ruangan.",
|
||||
leaveRoom="$1 telah keluar dari ruangan.",
|
||||
ready="Siap",
|
||||
connStream="Memuat",
|
||||
waitStream="Menunggu",
|
||||
@@ -140,6 +148,8 @@ return{
|
||||
chatStart="------Awal percakapan------",
|
||||
chatHistory="------Pesan-pesan baru di bawah ini------",
|
||||
|
||||
|
||||
|
||||
keySettingInstruction="Tekan untuk menghubung tombol ke aksi tertentu\nescape: batal\nbackspace: hapus",
|
||||
customBGhelp="Seret file gambar di sini untuk memasangkan background",
|
||||
customBGloadFailed="Format file gambar tidak didukung untuk background",
|
||||
@@ -207,8 +217,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",
|
||||
@@ -323,6 +333,7 @@ return{
|
||||
Cold_Clear [MinusKelvin]
|
||||
json.lua [rxi]
|
||||
profile.lua [itraykov]
|
||||
sha2 [Egor Skriptunoff]
|
||||
]],
|
||||
support="Dukung pencipta",
|
||||
WidgetText={
|
||||
@@ -362,6 +373,7 @@ return{
|
||||
league="Tech League",
|
||||
ffa="FFA",
|
||||
rooms="Ruang-ruang",
|
||||
-- resetPW="Reset password",
|
||||
logout="Log out",
|
||||
},
|
||||
net_league={
|
||||
@@ -438,7 +450,6 @@ return{
|
||||
sysCursor="Guna Mouse Bawaan",
|
||||
autoPause="Jeda Jika Tidak Difokus",
|
||||
autoSave="Simpan Rekor Otomatis",
|
||||
autoLogin="Auto-login Saat Membuka",
|
||||
simpMode="Mode Sederhana",
|
||||
},
|
||||
setting_video={
|
||||
@@ -689,24 +700,29 @@ return{
|
||||
music="Musik",
|
||||
label="label",
|
||||
},
|
||||
login={
|
||||
login_pw={
|
||||
title="Masuk",
|
||||
register="Daftar",
|
||||
-- login_mail="Login with E-mail/Sign Up",
|
||||
email="Alamat Email",
|
||||
password="Password",
|
||||
showEmail="Tunjukkan Email",
|
||||
keepPW="Ingat Saya",
|
||||
login="Masuk",
|
||||
},
|
||||
register={
|
||||
title="Daftar",
|
||||
login="Masuk",
|
||||
username="Username",
|
||||
login_mail={
|
||||
title="Masuk/Daftar",
|
||||
-- login_pw="Password Sign In",
|
||||
email="Alamat Email",
|
||||
-- send="Send code",
|
||||
-- code="Verification Code",
|
||||
-- verify="Verify",
|
||||
},
|
||||
reset_password={
|
||||
-- title="Reset Password",
|
||||
-- send="Send code",
|
||||
-- code="Verification Code",
|
||||
password="Password",
|
||||
password2="Ulangi Password",
|
||||
register="Daftar",
|
||||
registering="Menunggu respon…",
|
||||
-- setPW="Set Password",
|
||||
},
|
||||
account={
|
||||
title="Akun",
|
||||
@@ -912,7 +928,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?",
|
||||
@@ -956,7 +972,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).",
|
||||
|
||||
@@ -105,6 +105,14 @@ return{
|
||||
|
||||
dictNote="==TetroDictionaryからコピーしました==",
|
||||
|
||||
|
||||
|
||||
Techrater={-- Server's warn/error messages
|
||||
-- TODO
|
||||
},
|
||||
|
||||
-- tooFrequently="Request too frequently",
|
||||
-- roomPasswordChanged="Room password changed",
|
||||
getNoticeFail="お知らせ情報を取得できませんでした",
|
||||
oldVersion="バージョン$1のダウンロードが可能になりました",
|
||||
needUpdate="最新バージョンに更新してください",
|
||||
@@ -115,23 +123,23 @@ return{
|
||||
|
||||
noUsername="ユーザーネームを入力してください!",
|
||||
wrongEmail="メールアドレスが無効です!",
|
||||
-- wrongCode="Invalid verification code",
|
||||
noPassword="パスワードを入力してください!",
|
||||
diffPassword="パスワードが一致しません!",
|
||||
registerRequestSent="Sign Upリクエストを送信しました!",
|
||||
registerOK="サインアップ成功!",
|
||||
loginOK="ログインしています!",
|
||||
accessOK="アクセス権限を取得しました!",
|
||||
checkEmail="Sign Upリクエストを送信しました!",
|
||||
|
||||
wsConnecting="ウェブソケットに接続中…",
|
||||
wsFailed="ウェブソケットとの通信に失敗しました",
|
||||
wsClose="ウェブソケットとの通信を終了:",
|
||||
wsFailed="ウェブソケットとの通信に失敗しました: $1",
|
||||
wsClose="ウェブソケットとの通信を終了: $1",
|
||||
netTimeout="接続がタイムアウトしました",
|
||||
-- serverDown="Oops! Server is down",
|
||||
-- requestFailed="Request failed",
|
||||
|
||||
onlinePlayerCount="オンライン人数",
|
||||
onlinePlayerCount="オンライン人数: $1",
|
||||
createRoomSuccessed="部屋を建てました",
|
||||
-- playerKicked="[$1] removed [$2] from room",
|
||||
started="プレイ中",
|
||||
joinRoom="が入室しました",
|
||||
leaveRoom="が退出しました",
|
||||
joinRoom="$1 が入室しました",
|
||||
leaveRoom="$1 が退出しました",
|
||||
ready="準備OK",
|
||||
connStream="接続中……",
|
||||
waitStream="待機中……",
|
||||
@@ -140,6 +148,8 @@ return{
|
||||
chatStart="------チャットの先頭------",
|
||||
chatHistory="------新しいメッセージ------",
|
||||
|
||||
|
||||
|
||||
keySettingInstruction="選択してキーを入力\nEscape: キャンセル\nBackspace: キーを削除",
|
||||
customBGhelp="カスタム背景にする画像ファイルをドロップ",
|
||||
customBGloadFailed="サポートされていないフォーマットのファイルです",
|
||||
@@ -208,8 +218,8 @@ return{
|
||||
"ゲームは、必ず公式から入手してください",
|
||||
"他から入手した場合は、安全性を保証しません",
|
||||
"同時に作者は、責任を負いません",
|
||||
FNNS and"/"or"ゲーム自体は無料ですが、寄付できるならありがたいです。",
|
||||
FNNS and"/"or"詳しくはZictionaryをご覧ください",
|
||||
FNNS and "/" or "ゲーム自体は無料ですが、寄付できるならありがたいです。",
|
||||
FNNS and "/" or "詳しくはZictionaryをご覧ください",
|
||||
},
|
||||
staff={
|
||||
"作者「MrZ」",
|
||||
@@ -324,6 +334,7 @@ return{
|
||||
Cold_Clear [MinusKelvin]
|
||||
json.lua [rxi]
|
||||
profile.lua [itraykov]
|
||||
sha2 [Egor Skriptunoff]
|
||||
]],
|
||||
support="Support the Author",
|
||||
WidgetText={
|
||||
@@ -363,6 +374,7 @@ return{
|
||||
league="テクリーグ",
|
||||
ffa="自由乱闘戦",
|
||||
rooms="ルーム・プライベート戦",
|
||||
-- resetPW="Reset password",
|
||||
logout="ログアウト",
|
||||
},
|
||||
net_league={
|
||||
@@ -439,7 +451,6 @@ return{
|
||||
sysCursor="システムカーソル",
|
||||
autoPause="ゲーム中断時のオートポーズ",
|
||||
autoSave="最高得点を更新したときオートセーブ",
|
||||
autoLogin="オートログイン",
|
||||
simpMode="シンプルなホーム画面",
|
||||
},
|
||||
setting_video={
|
||||
@@ -690,24 +701,29 @@ return{
|
||||
music="曲",
|
||||
label="ラベル",
|
||||
},
|
||||
login={
|
||||
login_pw={
|
||||
title="サインイン",
|
||||
register="サインアップ",
|
||||
-- login_mail="Login with E-mail/Sign Up",
|
||||
email="Eメールアドレス",
|
||||
password="パスワード",
|
||||
-- showEmail="Show Email",
|
||||
keepPW="常にログイン",
|
||||
login="ログイン",
|
||||
},
|
||||
register={
|
||||
title="サインアップ",
|
||||
login="サインイン",
|
||||
username="ユーザーネーム",
|
||||
login_mail={
|
||||
title="サインイン/サインアップ",
|
||||
-- login_pw="Password Sign In",
|
||||
email="Eメールアドレス",
|
||||
-- send="Send code",
|
||||
-- code="Verification Code",
|
||||
-- verify="Verify",
|
||||
},
|
||||
reset_password={
|
||||
-- title="Reset Password",
|
||||
-- send="Send code",
|
||||
-- code="Verification Code",
|
||||
password="パスワード",
|
||||
password2="パスワード(確認)",
|
||||
register="これで登録する",
|
||||
registering="応答待機中...",
|
||||
-- setPW="Set Password",
|
||||
},
|
||||
account={
|
||||
title="アカウント",
|
||||
@@ -953,7 +969,7 @@ getTip={refuseCopy=true,
|
||||
"Techminoは\"Technique\"と\"Tetromino\"を掛け合わせ造語です!",
|
||||
"Techminoプレイヤーの未来はあなた達のものです!",
|
||||
"TetroDictionary is now available in English.",
|
||||
"while(false)",
|
||||
" while (false)",
|
||||
"ZS JL T O I",
|
||||
"ゲーム内にはモード選択マップからじゃ入れない隠しモードがいくつかあります!",
|
||||
"このゲームでは全てのSpinに火力補正があります!",
|
||||
|
||||
@@ -54,7 +54,7 @@ return{
|
||||
|
||||
-- cc_fixed="CC is incompatible with fixed sequences",
|
||||
-- cc_swap="CC is incompatible with swap holdmode",
|
||||
--ai_prebag="The AI is incompatible with custom sequences which have nontetromino.", inteligência é incompatível com sequências fixas.",
|
||||
-- ai_prebag="The AI is incompatible with custom sequences which have nontetromino.", inteligência é incompatível com sequências fixas.",
|
||||
ai_mission="A inteligência é incompatível com missões costumizadas.",
|
||||
switchSpawnSFX="Switch on spawn SFX to play",
|
||||
needRestart="Funciona após reiniciar",
|
||||
@@ -92,6 +92,14 @@ return{
|
||||
|
||||
-- dictNote="==Copied from TetroDictionary==",
|
||||
|
||||
|
||||
|
||||
Techrater={-- Server's warn/error messages
|
||||
-- TODO
|
||||
},
|
||||
|
||||
-- tooFrequently="Request too frequently",
|
||||
-- roomPasswordChanged="Room password changed",
|
||||
getNoticeFail="Não conseguiu ter anúncios",
|
||||
oldVersion="Versão $1 esta disponível agora!",
|
||||
-- versionNotMatch="Version do not match!",
|
||||
@@ -102,23 +110,23 @@ return{
|
||||
|
||||
noUsername="Insira seu nome de usuário",
|
||||
wrongEmail="Endereço de email errado",
|
||||
-- wrongCode="Invalid verification code",
|
||||
noPassword="Insira sua senha ",
|
||||
diffPassword="Senhas não combinam",
|
||||
-- registerRequestSent="Registration request sent",
|
||||
registerOK="Registrado com sucesso!",
|
||||
loginOK="Logado com sucesso!",
|
||||
accessOK="Autorizado com sucesso!",
|
||||
-- checkEmail="Registration request sent",
|
||||
|
||||
-- wsConnecting="Websocket Connecting",
|
||||
wsFailed="WebSocket falha na conexão",
|
||||
wsClose="WebSocket closed:",
|
||||
wsFailed="WebSocket falha na conexão: $1",
|
||||
wsClose="WebSocket closed: $1",
|
||||
-- netTimeout="Network connection timeout",
|
||||
-- serverDown="Oops! Server is down",
|
||||
-- requestFailed="Request failed",
|
||||
|
||||
-- onlinePlayerCount="Online",
|
||||
-- onlinePlayerCount="Online: $1",
|
||||
-- createRoomSuccessed="Room successfully created!",
|
||||
-- playerKicked="[$1] removed [$2] from room",
|
||||
-- started="Playing",
|
||||
joinRoom="Entrou a sala.",
|
||||
leaveRoom="Saiu da sala.",
|
||||
joinRoom="$1 Entrou a sala.",
|
||||
leaveRoom="$1 Saiu da sala.",
|
||||
-- ready="READY",
|
||||
-- connStream="CONNECTING",
|
||||
-- waitStream="WAITING",
|
||||
@@ -127,6 +135,8 @@ return{
|
||||
chatStart="------Começo do log------",
|
||||
chatHistory="------Novas mensagens abaixo------",
|
||||
|
||||
|
||||
|
||||
-- keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete",
|
||||
-- customBGhelp="Drop image file here to apply custom background",
|
||||
-- customBGloadFailed="Unsupport image format for custom background",
|
||||
@@ -195,8 +205,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",
|
||||
@@ -311,6 +321,7 @@ return{
|
||||
Cold_Clear [MinusKelvin]
|
||||
json.lua [rxi]
|
||||
profile.lua [itraykov]
|
||||
sha2 [Egor Skriptunoff]
|
||||
]],
|
||||
support="Support author",
|
||||
WidgetText={
|
||||
@@ -350,6 +361,7 @@ return{
|
||||
-- league="Tech League",
|
||||
ffa="FFA",
|
||||
rooms="Salas",
|
||||
-- resetPW="Reset password",
|
||||
-- logout="Log out",
|
||||
},
|
||||
net_league={
|
||||
@@ -426,7 +438,6 @@ return{
|
||||
-- sysCursor="Use system cursor",
|
||||
autoPause="Pausar quando foco for perco",
|
||||
-- autoSave="Auto save new-best",
|
||||
-- autoLogin="Auto Login on Start",
|
||||
-- simpMode="Simple mode",
|
||||
},
|
||||
setting_video={
|
||||
@@ -678,24 +689,29 @@ return{
|
||||
-- music="BGMs",
|
||||
-- label="label",
|
||||
},
|
||||
login={
|
||||
login_pw={
|
||||
title="Log in",
|
||||
register="Registrar",
|
||||
-- login_mail="Login with E-mail/Sign Up",
|
||||
email="Endereço De Email",
|
||||
password="Senha",
|
||||
-- showEmail="Show Email",
|
||||
-- keepPW="Remember me",
|
||||
login="Log in",
|
||||
},
|
||||
register={
|
||||
title="Registrar",
|
||||
login="Log in",
|
||||
username="Nome De Usuário",
|
||||
login_mail={
|
||||
title="Log in/Registrar",
|
||||
-- login_pw="Password Sign In",
|
||||
email="Endereço De Email",
|
||||
-- send="Send code",
|
||||
-- code="Verification Code",
|
||||
-- verify="Verify",
|
||||
},
|
||||
reset_password={
|
||||
-- title="Reset Password",
|
||||
-- send="Send code",
|
||||
-- code="Verification Code",
|
||||
password="Senha",
|
||||
password2="Entre Senha Novamente",
|
||||
register="Registrar",
|
||||
-- registering="Waiting for response...",
|
||||
-- setPW="Set Password",
|
||||
},
|
||||
account={
|
||||
title="Conta",
|
||||
@@ -891,7 +907,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?",
|
||||
@@ -926,7 +942,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!",
|
||||
|
||||
@@ -166,6 +166,7 @@ return{
|
||||
league="TL",
|
||||
ffa="FFA",
|
||||
rooms="< >",
|
||||
resetPW="R ***",
|
||||
logout="@_@x",
|
||||
},
|
||||
net_league={
|
||||
@@ -235,14 +236,13 @@ return{
|
||||
ctrl="=?=",
|
||||
key="=?",
|
||||
touch="_?",
|
||||
showVK="--?",
|
||||
showVK="-- ?",
|
||||
reTime="3-2-1",
|
||||
RS="''?",
|
||||
menuPos="←M→?",
|
||||
sysCursor="?→*",
|
||||
autoPause="A||",
|
||||
autoSave="!!!>%",
|
||||
autoLogin="#Log in#",
|
||||
simpMode=".",
|
||||
},
|
||||
setting_video={
|
||||
@@ -259,7 +259,7 @@ return{
|
||||
ghost="__↓__",
|
||||
center="+",
|
||||
grid="#",
|
||||
lineNum="--No.",
|
||||
lineNum="-- No.",
|
||||
|
||||
lockFX="↓_~",
|
||||
dropFX="↓~",
|
||||
@@ -484,24 +484,29 @@ return{
|
||||
music="~~~",
|
||||
label="...",
|
||||
},
|
||||
login={
|
||||
login_pw={
|
||||
title="Log in",
|
||||
register="Sign up",
|
||||
-- login_mail="Login with E-mail/Sign Up",
|
||||
email="@",
|
||||
password="*",
|
||||
showEmail="?",
|
||||
keepPW="!",
|
||||
login="Log in",
|
||||
login="→",
|
||||
},
|
||||
register={
|
||||
title="Sign up",
|
||||
login="Log in",
|
||||
username="#",
|
||||
login_mail={
|
||||
title="Log in/Sign up",
|
||||
login_pw="*** →",
|
||||
email="@",
|
||||
send="→",
|
||||
code="←",
|
||||
verify="!",
|
||||
},
|
||||
reset_password={
|
||||
title="R ***",
|
||||
send="→",
|
||||
code="←",
|
||||
password="*",
|
||||
password2="*",
|
||||
register="Sign up",
|
||||
registering="......",
|
||||
setPW="##",
|
||||
},
|
||||
account={
|
||||
title="@_@",
|
||||
@@ -510,7 +515,7 @@ return{
|
||||
color="~~~",
|
||||
invis="???",
|
||||
slide="~_~",
|
||||
pathVis="--==>",
|
||||
pathVis="-- ==>",
|
||||
revKB="Reverse",
|
||||
},
|
||||
app_schulteG={
|
||||
@@ -543,7 +548,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
|
||||
|
||||
@@ -104,6 +104,14 @@ return{
|
||||
|
||||
dictNote="==复制于小z词典==",
|
||||
|
||||
|
||||
|
||||
Techrater={-- Server's warn/error messages
|
||||
-- TODO
|
||||
},
|
||||
|
||||
tooFrequently="操作太频繁",
|
||||
roomPasswordChanged="房间密码已更改",
|
||||
getNoticeFail="拉取公告失败",
|
||||
oldVersion="最新版本$1可以下载了!",
|
||||
needUpdate="请更新游戏!",
|
||||
@@ -113,24 +121,24 @@ return{
|
||||
jsonError="json错误",
|
||||
|
||||
noUsername="请填写用户名",
|
||||
wrongEmail="邮箱格式错误",
|
||||
wrongEmail="无效邮箱地址",
|
||||
wrongCode="无效验证码",
|
||||
noPassword="请填写密码",
|
||||
diffPassword="两次密码不一致",
|
||||
registerRequestSent="注册请求已发送",
|
||||
registerOK="注册成功!",
|
||||
loginOK="登录成功",
|
||||
accessOK="身份验证成功",
|
||||
checkEmail="请查看邮箱验证码",
|
||||
|
||||
wsConnecting="正在连接",
|
||||
wsFailed="连接失败",
|
||||
wsClose="连接被断开:",
|
||||
wsFailed="连接失败: $1",
|
||||
wsClose="连接断开: $1",
|
||||
netTimeout="连接超时",
|
||||
serverDown="唉哟!服务器不在线",
|
||||
requestFailed="请求失败",
|
||||
|
||||
onlinePlayerCount="在线人数",
|
||||
onlinePlayerCount="在线人数: $1",
|
||||
createRoomSuccessed="创建房间成功!",
|
||||
playerKicked="<$1>把<$2>移出了房间",
|
||||
started="游戏中",
|
||||
joinRoom="进入房间",
|
||||
leaveRoom="离开房间",
|
||||
joinRoom="$1 进入房间",
|
||||
leaveRoom="$1 离开房间",
|
||||
ready="各就各位!",
|
||||
connStream="正在连接",
|
||||
waitStream="等待其他人连接",
|
||||
@@ -139,12 +147,14 @@ return{
|
||||
chatStart="------消息的开头------",
|
||||
chatHistory="------以上是历史消息------",
|
||||
|
||||
|
||||
|
||||
keySettingInstruction="点击添加键位绑定\nesc取消选中\n退格键清空选中",
|
||||
customBGhelp="把图片文件拖到这个窗口里使用自定义背景",
|
||||
customBGloadFailed="自定义背景的图片文件格式不支持",
|
||||
|
||||
errorMsg="Techmino遭受了雷击,需要重新启动。\n我们已收集了一些错误信息,你可以向作者进行反馈。",
|
||||
tryAnotherBuild="[解码UTF-8错误] 如果你现在用的是Windows系统,请重新下载 Techmino-32位 或者 Techmino-64位 (和现在运行的不一样的那个)。",
|
||||
tryAnotherBuild="[解码UTF-8错误] 如果你现在用的是Windows系统,请重新下载 Techmino-32/64位 (和现在运行的不一样的那个)。",
|
||||
|
||||
modInstruction="选择你要使用的Mod!\n不同Mod会用不同的方式改变初始游戏规则(可能导致不能正常游玩)\n来开发新玩法或者挑战自我吧!\n提醒:开启一些Mod会让成绩无效,你也可以用键盘开关Mod,按住shift反向",
|
||||
modInfo={
|
||||
@@ -207,8 +217,8 @@ return{
|
||||
"仅通过官网 *暂无域名,见词典* 免费下载/更新",
|
||||
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
|
||||
"若由于被修改的本游戏产生的各种损失作者不负责(怎么负责啊我又没法管)",
|
||||
FNNS and"/"or"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
FNNS and"/"or"更多信息见小z词典",
|
||||
FNNS and "/" or "请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
FNNS and "/" or "更多信息见小z词典",
|
||||
},
|
||||
staff={
|
||||
"原作者 MrZ",
|
||||
@@ -323,6 +333,7 @@ return{
|
||||
Cold_Clear [MinusKelvin]
|
||||
json.lua [rxi]
|
||||
profile.lua [itraykov]
|
||||
sha2 [Egor Skriptunoff]
|
||||
]],
|
||||
support="支持作者",
|
||||
WidgetText={
|
||||
@@ -362,6 +373,7 @@ return{
|
||||
league="Tech League",
|
||||
ffa="FFA",
|
||||
rooms="房间列表",
|
||||
resetPW="重置密码",
|
||||
logout="退出登录",
|
||||
},
|
||||
net_league={
|
||||
@@ -438,7 +450,6 @@ return{
|
||||
sysCursor="使用系统光标",
|
||||
autoPause="失去焦点自动暂停",
|
||||
autoSave="破纪录自动保存",
|
||||
autoLogin="启动时自动登录",
|
||||
simpMode="简洁模式",
|
||||
},
|
||||
setting_video={
|
||||
@@ -688,24 +699,29 @@ return{
|
||||
path="打开存储目录",
|
||||
save="用户档案管理",
|
||||
},
|
||||
login={
|
||||
login_pw={
|
||||
title="登录",
|
||||
register="注册",
|
||||
login_mail="邮箱登录/注册",
|
||||
email="邮箱",
|
||||
password="密码",
|
||||
showEmail="显示邮箱",
|
||||
keepPW="保存密码",
|
||||
login="登录",
|
||||
},
|
||||
register={
|
||||
title="注册",
|
||||
login="登录",
|
||||
username="用户名",
|
||||
email="邮箱:",
|
||||
password="密码:",
|
||||
password2="确认密码:",
|
||||
register="注册",
|
||||
registering="等待服务器响应……",
|
||||
login_mail={
|
||||
title="登录/注册",
|
||||
login_pw="密码登录",
|
||||
email="邮箱",
|
||||
send="发送验证码",
|
||||
code="验证码",
|
||||
verify="验证邮箱",
|
||||
},
|
||||
reset_password={
|
||||
title="重置密码",
|
||||
send="发送验证码",
|
||||
code="验证码",
|
||||
password="密码",
|
||||
password2="确认密码",
|
||||
setPW="设置密码",
|
||||
},
|
||||
account={
|
||||
title="帐户",
|
||||
@@ -1012,7 +1028,7 @@ return{
|
||||
"git commit",
|
||||
"git push -f",
|
||||
"hello world",
|
||||
"if a==true",
|
||||
" if a==true",
|
||||
"l-=-1",
|
||||
"shutdown -h now",
|
||||
"sudo rm -rf /*",
|
||||
@@ -1022,7 +1038,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",
|
||||
|
||||
@@ -104,9 +104,17 @@ return{
|
||||
|
||||
dictNote="#!CopySource=Zictionary",
|
||||
|
||||
|
||||
|
||||
Techrater={-- Server's warn/error messages
|
||||
-- TODO
|
||||
},
|
||||
|
||||
tooFrequently="Error.requestTooFrequently();",
|
||||
roomPasswordChanged="Info.roomPwChanged();",
|
||||
getNoticeFail="Error.FetchAnnouncement();",
|
||||
oldVersion="Version.New($1);",
|
||||
needUpdate="Version.NeedUpdate()",
|
||||
needUpdate="Version.NeedUpdate();",
|
||||
versionNotMatch="Version.NotMatch();",
|
||||
notFinished="ComingSoon();",
|
||||
|
||||
@@ -114,23 +122,23 @@ return{
|
||||
|
||||
noUsername="Error.NoUsername();",
|
||||
wrongEmail="Error.WrongEmail();",
|
||||
wrongCode="Error.WrongVerificationCode();",
|
||||
noPassword="Error.NoPassword();",
|
||||
diffPassword="Error.DiffPassword();",
|
||||
registerRequestSent="register.RequestSent=true",
|
||||
registerOK="register.Success=true",
|
||||
loginOK="login.Success=true",
|
||||
accessOK="Access.Granted=true",
|
||||
checkEmail="register.RequestSent=true",
|
||||
|
||||
wsConnecting="Websocket.Connect();",
|
||||
wsFailed="Error.Websocket.Failed();",
|
||||
wsClose="Error.Websocket.Close=",
|
||||
wsFailed="Error.Websocket.Failed=$1",
|
||||
wsClose="Error.Websocket.Close=$1",
|
||||
netTimeout="Error.ConnectTimeOut();",
|
||||
serverDown="Error.ServerDown();",
|
||||
requestFailed="Error.RequestFailed();",
|
||||
|
||||
onlinePlayerCount="OnlinePlayerCount",
|
||||
onlinePlayerCount="OnlinePlayerCount=$1",
|
||||
createRoomSuccessed="CreateRoom.Successs=true",
|
||||
playerKicked="[$1]: roomKick([$2])",
|
||||
started="Room.Playing();",
|
||||
joinRoom="Room.Join();",
|
||||
leaveRoom="Room.Leave();",
|
||||
joinRoom="Room.Join($1);",
|
||||
leaveRoom="Room.Leave($1);",
|
||||
ready="Ready();",
|
||||
connStream="Stream.Connecting();",
|
||||
waitStream="Stream.Waiting();",
|
||||
@@ -139,12 +147,14 @@ return{
|
||||
chatStart="#!Log.Beginning();",
|
||||
chatHistory="#!NewMassagesBelow();",
|
||||
|
||||
|
||||
|
||||
keySettingInstruction="Key.Bind(Press);\nKey.Bind.Cancel(Escspe);\nKey.Bind.Delete(Backspace);",
|
||||
customBGhelp="Ctm.BG(DropHere);",
|
||||
customBGloadFailed="Error.Ctm.BG(UnsupportFormat);",
|
||||
|
||||
errorMsg="Error.Fatal();\n//请检查语法错误或向作者进行反馈。",
|
||||
tryAnotherBuild="Error.DecodeUTF8(); //如果你现在用的是Windows系统,请重新下载 Techmino-32位 或者 Techmino-64位 (和现在运行的不一样的那个)。",
|
||||
tryAnotherBuild="Error.DecodeUTF8(); //如果你现在用的是Windows系统,请重新下载 Techmino-32/64位 (和现在运行的不一样的那个)。",
|
||||
|
||||
modInstruction="Mod.Instruction();\n/*选择你要使用的Mod\n不同Mod会用不同的方式改变初始游戏规则(可能导致不能正常游玩)\n提醒:开启一些Mod会让成绩无效,你也可以用键盘开关Mod,按住shift反向*/",
|
||||
modInfo={
|
||||
@@ -207,8 +217,8 @@ return{
|
||||
"仅通过官网 *暂无域名,见词典* 免费下载/更新",
|
||||
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
|
||||
"若由于被修改的本游戏产生的各种损失作者不负责(怎么负责啊我又没法管)",
|
||||
FNNS and"/"or"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
FNNS and"/"or"更多信息见小z词典*/",
|
||||
FNNS and "/" or "请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
FNNS and "/" or "更多信息见小z词典*/",
|
||||
},
|
||||
staff={
|
||||
"原作者 MrZ",
|
||||
@@ -284,7 +294,7 @@ return{
|
||||
"NOT_A_ROBOT",
|
||||
"sakurw",
|
||||
"Airun",
|
||||
--"XMiao",
|
||||
-- "XMiao",
|
||||
"幽灵3383",
|
||||
"",
|
||||
"Performances",
|
||||
@@ -324,6 +334,7 @@ return{
|
||||
Cold_Clear [MinusKelvin]
|
||||
json.lua [rxi]
|
||||
profile.lua [itraykov]
|
||||
sha2 [Egor Skriptunoff]
|
||||
]],
|
||||
support="支持作者",
|
||||
WidgetText={
|
||||
@@ -363,6 +374,7 @@ return{
|
||||
league="M.TechLeague();",
|
||||
ffa="M.FFA",
|
||||
rooms="M.Rooms();",
|
||||
resetPW="M.ResetPW",
|
||||
logout="M.Logout();",
|
||||
},
|
||||
net_league={
|
||||
@@ -439,7 +451,6 @@ return{
|
||||
sysCursor="Set.SysCursor",
|
||||
autoPause="Set.AutoPause",
|
||||
autoSave="Set.AutoSave",
|
||||
autoLogin="Set.AutoLogin",
|
||||
simpMode="Set.SimpMode",
|
||||
},
|
||||
setting_video={
|
||||
@@ -689,24 +700,29 @@ return{
|
||||
path="OpenPath();",
|
||||
save="DataManagement();",
|
||||
},
|
||||
login={
|
||||
login_pw={
|
||||
title="LogIn.UI",
|
||||
register="Register();",
|
||||
login_mail="Login_mail_sign_up()",
|
||||
email="Email=",
|
||||
password="Password=",
|
||||
showEmail="ShowEmail",
|
||||
keepPW="KeepPassword",
|
||||
login="Login();",
|
||||
},
|
||||
register={
|
||||
title="Register.UI",
|
||||
login="Login();",
|
||||
username="Username=",
|
||||
login_mail={
|
||||
title="LogIn_Register.UI",
|
||||
login_pw="Login_pw();",
|
||||
email="Email=",
|
||||
send="Send();",
|
||||
code="V-code=",
|
||||
verify="Verify();",
|
||||
},
|
||||
reset_password={
|
||||
title="Reset_Password.UI",
|
||||
send="Send();",
|
||||
code="V-code=",
|
||||
password="Password=",
|
||||
password2="RePassword=",
|
||||
register="Register();",
|
||||
registering="Waiting();",
|
||||
setPW="SetPassword();",
|
||||
},
|
||||
account={
|
||||
title="Account.UI",
|
||||
|
||||
@@ -104,6 +104,14 @@ return{
|
||||
|
||||
dictNote="==拷貝自小z辭典==",
|
||||
|
||||
|
||||
|
||||
Techrater={-- Server's warn/error messages
|
||||
-- TODO
|
||||
},
|
||||
|
||||
tooFrequently="操作太頻繁",
|
||||
roomPasswordChanged="房間密碼已更改",
|
||||
getNoticeFail="無法獲取公告",
|
||||
oldVersion="版本 $1 現已推出",
|
||||
needUpdate="請更新遊戲!",
|
||||
@@ -114,23 +122,23 @@ return{
|
||||
|
||||
noUsername="請輸入用戶名",
|
||||
wrongEmail="無效的電郵地址",
|
||||
wrongCode="無效的驗證碼",
|
||||
noPassword="請輸入密碼",
|
||||
diffPassword="密碼不匹配",
|
||||
registerRequestSent="已發送註冊請求",
|
||||
registerOK="註冊成功!",
|
||||
loginOK="登錄成功",
|
||||
accessOK="身份認證成功",
|
||||
checkEmail="已發送註冊請求",
|
||||
|
||||
wsConnecting="正在連接……",
|
||||
wsFailed="連接失敗",
|
||||
wsClose="連接斷開:",
|
||||
wsFailed="連接失敗: $1",
|
||||
wsClose="連接斷開: $1",
|
||||
netTimeout="連接超時",
|
||||
serverDown="哎唷!服務器不在线",
|
||||
requestFailed="請求失敗",
|
||||
|
||||
onlinePlayerCount="在線用戶數",
|
||||
onlinePlayerCount="在線用戶數: $1",
|
||||
createRoomSuccessed="房間已創建!",
|
||||
playerKicked="<$1>把<$2>移出了房間",
|
||||
started="遊戲中",
|
||||
joinRoom="進入房間",
|
||||
leaveRoom="離開房間",
|
||||
joinRoom="$1 進入房間",
|
||||
leaveRoom="$1 離開房間",
|
||||
ready="準備!",
|
||||
connStream="正在連接……",
|
||||
waitStream="等待其他用戶連接……",
|
||||
@@ -139,12 +147,14 @@ return{
|
||||
chatStart="------訊息開始------",
|
||||
chatHistory="------以上為歷史訊息------",
|
||||
|
||||
|
||||
|
||||
keySettingInstruction="點擊來設置鍵位\n按esc來取消選中\n按退格鍵來清除選中",
|
||||
customBGhelp="把圖片檔案拖到這個視窗裏使用自定義背景",
|
||||
customBGloadFailed="自定義背景的圖片檔案格式不支持",
|
||||
|
||||
errorMsg="Techmino遇到問題,需要重新啟動。\n我們已經收集了一些錯誤信息,你可以反饋給作者。",
|
||||
tryAnotherBuild="[無效的 UTF-8] 如果你使用的是Windows作業系統,請嘗試下載Techmino-win32或Techmino-win64(與你現在使用的不同的版本)。",
|
||||
tryAnotherBuild="[無效的UTF-8] 如果你使用的是Windows作業系統,請嘗試下載Techmino-win32或Techmino-win64(與你現在使用的不同的版本)。",
|
||||
|
||||
modInstruction="選擇你想使用的Mod!\n不同的Mod會以不同的方式改變遊戲規則(可能導致遊戲異常)\n快來開發新玩法或挑戰自我吧!\n提醒:開啟Mod會使成績無效,你可以使用鍵盤開關Mod,按下shift反向",
|
||||
modInfo={
|
||||
@@ -207,8 +217,8 @@ return{
|
||||
"僅透過內測QQ群/discord伺服器進行免費下載/更新",
|
||||
"從其他渠道獲得遊戲皆有被修改/加入廣告/植入病毒的風險,程序只申請了振動&網路權限!",
|
||||
"若由於被修改的本遊戲產生的各種損失作者概不負責(我怎麼負責啊跟我有什麼關係)",
|
||||
FNNS and"/"or"請從正規途徑獲得最新版,遊戲現為免費,不過有打賞當然感謝啦~",
|
||||
FNNS and"/"or"更多資訊見小z詞典"
|
||||
FNNS and "/" or "請從正規途徑獲得最新版,遊戲現為免費,不過有打賞當然感謝啦~",
|
||||
FNNS and "/" or "更多資訊見小z詞典"
|
||||
},
|
||||
staff={
|
||||
"原作者 MrZ",
|
||||
@@ -323,6 +333,7 @@ return{
|
||||
Cold_Clear [MinusKelvin]
|
||||
json.lua [rxi]
|
||||
profile.lua [itraykov]
|
||||
sha2 [Egor Skriptunoff]
|
||||
]],
|
||||
support="支持作者",
|
||||
WidgetText={
|
||||
@@ -362,6 +373,7 @@ return{
|
||||
league="Tech League",
|
||||
ffa="FFA",
|
||||
rooms="房間列表",
|
||||
resetPW="重設密碼",
|
||||
logout="登出",
|
||||
},
|
||||
net_league={
|
||||
@@ -438,7 +450,6 @@ return{
|
||||
sysCursor="使用系統光標",
|
||||
autoPause="失去焦點時暫停",
|
||||
autoSave="打破紀錄時自動保存",
|
||||
autoLogin="啟動時自動登錄",
|
||||
simpMode="簡潔模式",
|
||||
},
|
||||
setting_video={
|
||||
@@ -688,24 +699,29 @@ return{
|
||||
path="打開存儲目錄",
|
||||
save="用戶資料管理",
|
||||
},
|
||||
login={
|
||||
login_pw={
|
||||
title="登錄",
|
||||
register="註冊",
|
||||
login_mail="電郵登錄/注册",
|
||||
email="電郵",
|
||||
password="密碼",
|
||||
showEmail="顯示郵箱",
|
||||
keepPW="保存密碼",
|
||||
login="登錄",
|
||||
},
|
||||
register={
|
||||
title="註冊",
|
||||
login="登錄",
|
||||
username="用戶名",
|
||||
login_mail={
|
||||
title="登錄/註冊",
|
||||
login_pw="密碼登錄",
|
||||
email="電郵",
|
||||
send="發送驗證碼",
|
||||
code="驗證碼",
|
||||
verify="驗證郵箱",
|
||||
},
|
||||
reset_password={
|
||||
title="重設密碼",
|
||||
send="發送驗證碼",
|
||||
code="驗證碼",
|
||||
password="密碼",
|
||||
password2="確認密碼",
|
||||
register="註冊",
|
||||
registering="等待伺服器響應……",
|
||||
setPW="設置密碼",
|
||||
},
|
||||
account={
|
||||
title="賬戶",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
local LINE={}
|
||||
local L={}--Storage
|
||||
local len=0--Length
|
||||
local L={}-- Storage
|
||||
local len=0-- Length
|
||||
function LINE.new(val,isGarbage)
|
||||
if len==0 then
|
||||
for i=1,10 do
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
{3,2,6,6,1,4,0,0,0,7},
|
||||
{3,3,3,4,4,4,0,0,0,7},
|
||||
},
|
||||
},--3*4 shape
|
||||
},-- 3*4 shape
|
||||
{
|
||||
{
|
||||
{1,1,0,0,0,0,0,3,3,3},
|
||||
@@ -50,7 +50,7 @@ return{
|
||||
{3,6,6,5,5,2,2,0,0,0},
|
||||
{3,3,3,5,2,2,0,0,0,0},
|
||||
},
|
||||
},--7 piece opener(right>)(without i)
|
||||
},-- 7 piece opener(right>)(without i)
|
||||
{
|
||||
{
|
||||
{4,4,4,3,3,3,0,0,0,0},
|
||||
@@ -64,7 +64,7 @@ return{
|
||||
{3,2,6,6,1,4,0,0,0,0},
|
||||
{3,3,3,4,4,4,0,0,0,0},
|
||||
},
|
||||
},--6 piece opener
|
||||
},-- 6 piece opener
|
||||
{
|
||||
{
|
||||
{0,0,0,0,0,1,3,5,6,7},
|
||||
@@ -84,7 +84,7 @@ return{
|
||||
{1,3,0,0,0,0,0,5,6,7},
|
||||
{1,3,0,0,0,0,0,5,6,7},
|
||||
},
|
||||
},--4*5
|
||||
},-- 4*5
|
||||
{
|
||||
{
|
||||
{0,0,0,0,0,0,1,3,5,7},
|
||||
@@ -104,5 +104,5 @@ return{
|
||||
{5,7,0,0,0,0,0,0,3,1},
|
||||
{1,3,0,0,0,0,0,0,7,5},
|
||||
},
|
||||
},--4*6
|
||||
},-- 4*6
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -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
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user