Compare commits
164 Commits
pre0.17.0-
...
test-new-m
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
707bcca368 | ||
|
|
f8f115de10 | ||
|
|
b07c4dc53a | ||
|
|
6eeddba773 | ||
|
|
0cfe4df468 | ||
|
|
eb5c3c3be5 | ||
|
|
a5b9206694 | ||
|
|
375e67bdc4 | ||
|
|
724a576aa3 | ||
|
|
ed47dcb90c | ||
|
|
64b08a5a4d | ||
|
|
baed0153a2 | ||
|
|
46d95b33e4 | ||
|
|
200d270fee | ||
|
|
a8628275a0 | ||
|
|
20a1d2bcc1 | ||
|
|
b887a1f096 | ||
|
|
9bf0e9f28d | ||
|
|
dfc724767b | ||
|
|
f0e66e9dc5 | ||
|
|
0932335f0b | ||
|
|
a9b39e396a | ||
|
|
2e0ceaae72 | ||
|
|
04f38d2eb6 | ||
|
|
fc1ed4dff6 | ||
|
|
f8935d3dd7 | ||
|
|
a86228677f | ||
|
|
79df9f7876 | ||
|
|
12ea2d76be | ||
|
|
485bd72241 | ||
|
|
7240275075 | ||
|
|
29ef9b8d15 | ||
|
|
97f4795d4e | ||
|
|
226e45b24d | ||
|
|
d6ab7e72b2 | ||
|
|
168f44b8b3 | ||
|
|
b73f646a4c | ||
|
|
36cefcc000 | ||
|
|
f901c25c87 | ||
|
|
6d8478b029 | ||
|
|
9bcb040019 | ||
|
|
d977087fc0 | ||
|
|
1a330771d7 | ||
|
|
9c8c9f2106 | ||
|
|
0498beecdf | ||
|
|
8e075adf8f | ||
|
|
60f2a0e647 | ||
|
|
b642f2b5c4 | ||
|
|
2b80f72c6b | ||
|
|
462720881a | ||
|
|
3dda0254a8 | ||
|
|
054a52a445 | ||
|
|
85242d808b | ||
|
|
57241677a9 | ||
|
|
6ccdee2a53 | ||
|
|
a3d2b7b7f3 | ||
|
|
b7b28b4ae3 | ||
|
|
30748200dd | ||
|
|
c9f8240234 | ||
|
|
5c7082e886 | ||
|
|
9a3c889a9d | ||
|
|
f41f58e13f | ||
|
|
e81f25c216 | ||
|
|
36fc681fbf | ||
|
|
87e5e29129 | ||
|
|
b432fdf90a | ||
|
|
6e78a3fedd | ||
|
|
24760801af | ||
|
|
f5e8e0f7a5 | ||
|
|
df089a2f04 | ||
|
|
6600713f4b | ||
|
|
96dad762b2 | ||
|
|
5470387685 | ||
|
|
fa64c868b9 | ||
|
|
2f4a416353 | ||
|
|
3dbafb042c | ||
|
|
97e7b019dd | ||
|
|
28103ad952 | ||
|
|
1826ca6f2f | ||
|
|
db490a6c6c | ||
|
|
421fdef4f9 | ||
|
|
d717ce842d | ||
|
|
f13c9792af | ||
|
|
41e7b8e0f4 | ||
|
|
4bd723a7ee | ||
|
|
66d5bd5490 | ||
|
|
351d0258b2 | ||
|
|
26fb9a7052 | ||
|
|
307fd637fa | ||
|
|
93fb716f89 | ||
|
|
7b41551e2d | ||
|
|
4806af5f7d | ||
|
|
85cb55cdd0 | ||
|
|
27a9697e47 | ||
|
|
7d230cc3b0 | ||
|
|
0db2fffad1 | ||
|
|
2a3296a0e8 | ||
|
|
941b875afa | ||
|
|
99155bb9cf | ||
|
|
0701dd2ad3 | ||
|
|
5570c19e1f | ||
|
|
a728c91476 | ||
|
|
6a43481067 | ||
|
|
29a049fe4e | ||
|
|
b5a9c8e1bb | ||
|
|
bb9a35c161 | ||
|
|
b25a345b42 | ||
|
|
b22b0e0194 | ||
|
|
55cf95f218 | ||
|
|
225ddbcfac | ||
|
|
9377090c7c | ||
|
|
ed002ec2e1 | ||
|
|
e33036d9ec | ||
|
|
ef03e7c009 | ||
|
|
aef4220ac0 | ||
|
|
46223e38cd | ||
|
|
4bafa4bffe | ||
|
|
2b3dd877dd | ||
|
|
0553e5c45e | ||
|
|
4d93374cf6 | ||
|
|
4e421bf9ba | ||
|
|
8b2a9d7c01 | ||
|
|
5a3244d345 | ||
|
|
f1b9d0c5e4 | ||
|
|
6493e0e623 | ||
|
|
e71ba17f9f | ||
|
|
e656363e20 | ||
|
|
0826a748ae | ||
|
|
a595fe99ef | ||
|
|
9dbc7942e3 | ||
|
|
845d8ae32e | ||
|
|
5c524e138c | ||
|
|
86d9265ff9 | ||
|
|
6994a5d6d3 | ||
|
|
e6213b00c1 | ||
|
|
43e2caa30e | ||
|
|
97ca245dfc | ||
|
|
36de1c0751 | ||
|
|
704341fd15 | ||
|
|
22b61bc9c3 | ||
|
|
f4cbbc0a2a | ||
|
|
dc99187b9d | ||
|
|
915598dec4 | ||
|
|
e7b4518d73 | ||
|
|
9603a78e87 | ||
|
|
bd90e051d4 | ||
|
|
26e66b313f | ||
|
|
c534bbd12a | ||
|
|
83b5e217e5 | ||
|
|
c0adf5bf0b | ||
|
|
4ff737a4ac | ||
|
|
5af0706c09 | ||
|
|
4ccee0f1de | ||
|
|
9b752d540e | ||
|
|
e860c7b7ec | ||
|
|
8a1fd9531f | ||
|
|
5fd6e0ee99 | ||
|
|
53b2b81fe0 | ||
|
|
6ccc811b46 | ||
|
|
962a61567a | ||
|
|
58f05e1cec | ||
|
|
6b426790c7 | ||
|
|
d4fc578673 | ||
|
|
51b567b8db |
BIN
.github/build/macOS/backgroundImage.tiff
vendored
@@ -1,44 +1,37 @@
|
||||
local lastLoaded={}
|
||||
local maxLoadedCount=3
|
||||
local nameList={}
|
||||
local SourceObjList={}
|
||||
local volume=1
|
||||
|
||||
local BGM={
|
||||
default=false,
|
||||
getList=function()error("Cannot getList before initialize!")end,
|
||||
getCount=function()return 0 end,
|
||||
play=NULL,
|
||||
stop=NULL,
|
||||
onChange=NULL,
|
||||
--nowPlay=[str:playing ID]
|
||||
--playing=[src:playing SRC]
|
||||
--lastPlayed=[str:lastPlayed ID]
|
||||
}
|
||||
local function task_fadeOut(src)
|
||||
while true do
|
||||
coroutine.yield()
|
||||
local v=src:getVolume()-.025*volume
|
||||
src:setVolume(v>0 and v or 0)
|
||||
if v<=0 then
|
||||
src:pause()
|
||||
return true
|
||||
end
|
||||
|
||||
function BGM.getList()return nameList end
|
||||
function BGM.getCount()return #nameList end
|
||||
local function _addFile(name,path)
|
||||
if not SourceObjList[name]then
|
||||
table.insert(nameList,name)
|
||||
SourceObjList[name]={path=path,source=false}
|
||||
end
|
||||
end
|
||||
local function task_fadeIn(src)
|
||||
while true do
|
||||
coroutine.yield()
|
||||
local v=volume
|
||||
v=math.min(v,src:getVolume()+.025*v)
|
||||
src:setVolume(v)
|
||||
if v>=volume then
|
||||
return true
|
||||
function BGM.load(name,path)
|
||||
if type(name)=='table'then
|
||||
for k,v in next,name do
|
||||
_addFile(k,v)
|
||||
end
|
||||
else
|
||||
_addFile(name,path)
|
||||
end
|
||||
table.sort(nameList)
|
||||
LOG(BGM.getCount().." BGM files added")
|
||||
end
|
||||
local function check_curFadeOut(task,code,src)
|
||||
return task.code==code and task.args[1]==src
|
||||
end
|
||||
|
||||
local function _tryReleaseSources()
|
||||
local n=#lastLoaded
|
||||
while #lastLoaded>maxLoadedCount do
|
||||
@@ -75,85 +68,115 @@ function BGM.setVol(v)
|
||||
end
|
||||
end
|
||||
end
|
||||
function BGM.init(list)
|
||||
BGM.init=nil
|
||||
|
||||
local simpList={}
|
||||
for _,v in next,list do
|
||||
table.insert(simpList,v.name)
|
||||
SourceObjList[v.name]={path=v.path,source=false}
|
||||
end
|
||||
table.sort(simpList)
|
||||
function BGM.getList()return simpList end
|
||||
local count=#simpList
|
||||
LOG(count.." BGM files added")
|
||||
function BGM.getCount()return count end
|
||||
|
||||
local function _tryLoad(name)
|
||||
if SourceObjList[name]then
|
||||
if SourceObjList[name].source then
|
||||
return true
|
||||
elseif love.filesystem.getInfo(SourceObjList[name].path)then
|
||||
SourceObjList[name].source=love.audio.newSource(SourceObjList[name].path,'stream')
|
||||
SourceObjList[name].source:setLooping(true)
|
||||
SourceObjList[name].source:setVolume(0)
|
||||
table.insert(lastLoaded,1,name)
|
||||
_tryReleaseSources()
|
||||
return true
|
||||
else
|
||||
LOG("No BGM: "..SourceObjList[name],5)
|
||||
end
|
||||
elseif name then
|
||||
LOG("No BGM: "..name,5)
|
||||
local function task_fadeOut(src)
|
||||
while true do
|
||||
coroutine.yield()
|
||||
local v=src:getVolume()-.025*volume
|
||||
src:setVolume(v>0 and v or 0)
|
||||
if v<=0 then
|
||||
src:pause()
|
||||
return true
|
||||
end
|
||||
end
|
||||
function BGM.play(name)
|
||||
name=name or BGM.default
|
||||
if not _tryLoad(name)then return end
|
||||
if volume==0 then
|
||||
end
|
||||
local function task_fadeIn(src)
|
||||
while true do
|
||||
coroutine.yield()
|
||||
local v=volume
|
||||
v=math.min(v,src:getVolume()+.025*v)
|
||||
src:setVolume(v)
|
||||
if v>=volume then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
local function check_curFadeOut(task,code,src)
|
||||
return task.code==code and task.args[1]==src
|
||||
end
|
||||
local function _tryLoad(name)
|
||||
if SourceObjList[name]then
|
||||
if SourceObjList[name].source then
|
||||
return true
|
||||
elseif love.filesystem.getInfo(SourceObjList[name].path)then
|
||||
SourceObjList[name].source=love.audio.newSource(SourceObjList[name].path,'stream')
|
||||
SourceObjList[name].source:setVolume(0)
|
||||
table.insert(lastLoaded,1,name)
|
||||
_tryReleaseSources()
|
||||
return true
|
||||
else
|
||||
LOG("No BGM: "..SourceObjList[name],5)
|
||||
end
|
||||
elseif name then
|
||||
LOG("No BGM: "..name,5)
|
||||
end
|
||||
end
|
||||
function BGM.play(name,args)
|
||||
name=name or BGM.default
|
||||
args=args or""
|
||||
if not _tryLoad(name)or args:sArg('-preLoad')then return end
|
||||
if volume==0 then
|
||||
BGM.nowPlay=name
|
||||
BGM.playing=SourceObjList[name].source
|
||||
return true
|
||||
end
|
||||
if name and SourceObjList[name].source then
|
||||
if BGM.nowPlay~=name then
|
||||
if BGM.nowPlay then
|
||||
if not args:sArg('-sdout')then
|
||||
TASK.new(task_fadeOut,BGM.playing)
|
||||
else
|
||||
BGM.playing:pause()
|
||||
end
|
||||
end
|
||||
TASK.removeTask_iterate(check_curFadeOut,task_fadeOut,SourceObjList[name].source)
|
||||
TASK.removeTask_code(task_fadeIn)
|
||||
|
||||
BGM.nowPlay=name
|
||||
BGM.playing=SourceObjList[name].source
|
||||
return true
|
||||
end
|
||||
if name and SourceObjList[name].source then
|
||||
if BGM.nowPlay~=name then
|
||||
if BGM.nowPlay then
|
||||
TASK.new(task_fadeOut,BGM.playing)
|
||||
end
|
||||
TASK.removeTask_iterate(check_curFadeOut,task_fadeOut,SourceObjList[name].source)
|
||||
TASK.removeTask_code(task_fadeIn)
|
||||
|
||||
TASK.new(task_fadeIn,SourceObjList[name].source)
|
||||
BGM.nowPlay=name
|
||||
BGM.playing=SourceObjList[name].source
|
||||
BGM.lastPlayed=BGM.nowPlay
|
||||
BGM.playing:seek(0)
|
||||
if not args:sArg('-sdin')then
|
||||
BGM.playing:setVolume(0)
|
||||
TASK.new(task_fadeIn,BGM.playing)
|
||||
else
|
||||
BGM.playing:setVolume(volume)
|
||||
BGM.playing:play()
|
||||
BGM.onChange(name)
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
function BGM.seek(t)
|
||||
if BGM.playing then
|
||||
BGM.playing:seek(t)
|
||||
end
|
||||
end
|
||||
function BGM.continue()
|
||||
if BGM.lastPlayed then
|
||||
BGM.nowPlay,BGM.playing=BGM.lastPlayed,SourceObjList[BGM.lastPlayed].source
|
||||
TASK.removeTask_iterate(check_curFadeOut,task_fadeOut,SourceObjList[BGM.nowPlay].source)
|
||||
TASK.removeTask_code(task_fadeIn)
|
||||
TASK.new(task_fadeIn,BGM.playing)
|
||||
SourceObjList[name].source:setLooping(not args:sArg('-noloop'))
|
||||
BGM.lastPlayed=BGM.nowPlay
|
||||
BGM.playing:seek(0)
|
||||
BGM.playing:play()
|
||||
BGM.onChange(name)
|
||||
end
|
||||
return true
|
||||
end
|
||||
function BGM.stop()
|
||||
end
|
||||
function BGM.seek(t)
|
||||
if BGM.playing then
|
||||
BGM.playing:seek(t)
|
||||
end
|
||||
end
|
||||
function BGM.isPlaying()
|
||||
return BGM.playing and BGM.playing:isPlaying()
|
||||
end
|
||||
function BGM.continue()
|
||||
if BGM.lastPlayed then
|
||||
BGM.nowPlay,BGM.playing=BGM.lastPlayed,SourceObjList[BGM.lastPlayed].source
|
||||
TASK.removeTask_iterate(check_curFadeOut,task_fadeOut,SourceObjList[BGM.nowPlay].source)
|
||||
TASK.removeTask_code(task_fadeIn)
|
||||
TASK.new(task_fadeIn,BGM.playing)
|
||||
BGM.playing:play()
|
||||
end
|
||||
end
|
||||
function BGM.stop(args)
|
||||
args=args or""
|
||||
TASK.removeTask_code(task_fadeIn)
|
||||
if not args:sArg('-s')then
|
||||
if BGM.nowPlay then
|
||||
TASK.new(task_fadeOut,BGM.playing)
|
||||
end
|
||||
BGM.nowPlay,BGM.playing=nil
|
||||
elseif BGM.playing then
|
||||
BGM.playing:pause()
|
||||
end
|
||||
BGM.nowPlay,BGM.playing=nil
|
||||
end
|
||||
return BGM
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local abs=math.abs
|
||||
local function hsv(h,s,v,a)
|
||||
local function hsv(h,s,v,a)--Color type, Color amount, Light
|
||||
if s<=0 then return v,v,v,a end
|
||||
h=h*6
|
||||
local c=v*s
|
||||
@@ -19,16 +19,16 @@ local COLOR={
|
||||
red= {hsv(0.00, 0.89, 0.91)},
|
||||
fire= {hsv(0.04, 0.93, 0.94)},
|
||||
orange= {hsv(0.09, 0.99, 0.96)},
|
||||
yellow= {hsv(0.16, 0.82, 0.90)},
|
||||
lime= {hsv(0.18, 0.89, 0.88)},
|
||||
jade= {hsv(0.23, 1.00, 0.82)},
|
||||
yellow= {hsv(0.15, 0.82, 0.90)},
|
||||
lime= {hsv(0.20, 0.89, 0.88)},
|
||||
jade= {hsv(0.25, 1.00, 0.82)},
|
||||
green= {hsv(0.33, 1.00, 0.81)},
|
||||
aqua= {hsv(0.48, 1.00, 0.74)},
|
||||
aqua= {hsv(0.47, 1.00, 0.76)},
|
||||
cyan= {hsv(0.53, 1.00, 0.88)},
|
||||
navy= {hsv(0.56, 1.00, 1.00)},
|
||||
sea= {hsv(0.61, 1.00, 1.00)},
|
||||
blue= {hsv(0.64, 1.00, 0.95)},
|
||||
violet= {hsv(0.73, 1.00, 0.91)},
|
||||
violet= {hsv(0.74, 1.00, 0.91)},
|
||||
purple= {hsv(0.80, 1.00, 0.81)},
|
||||
magenta= {hsv(0.86, 1.00, 0.78)},
|
||||
wine= {hsv(0.92, 0.98, 0.91)},
|
||||
@@ -36,16 +36,16 @@ local COLOR={
|
||||
lRed= {hsv(0.00, 0.38, 0.93)},
|
||||
lFire= {hsv(0.04, 0.45, 0.91)},
|
||||
lOrange= {hsv(0.10, 0.53, 0.92)},
|
||||
lYellow= {hsv(0.15, 0.61, 0.95)},
|
||||
lLime= {hsv(0.19, 0.66, 0.92)},
|
||||
lJade= {hsv(0.24, 0.56, 0.90)},
|
||||
lYellow= {hsv(0.14, 0.61, 0.95)},
|
||||
lLime= {hsv(0.20, 0.66, 0.92)},
|
||||
lJade= {hsv(0.26, 0.56, 0.90)},
|
||||
lGreen= {hsv(0.34, 0.49, 0.89)},
|
||||
lAqua= {hsv(0.49, 0.59, 0.85)},
|
||||
lAqua= {hsv(0.47, 0.59, 0.86)},
|
||||
lCyan= {hsv(0.51, 0.77, 0.88)},
|
||||
lNavy= {hsv(0.54, 0.80, 0.95)},
|
||||
lSea= {hsv(0.56, 0.72, 0.97)},
|
||||
lSea= {hsv(0.57, 0.72, 0.97)},
|
||||
lBlue= {hsv(0.64, 0.44, 0.96)},
|
||||
lViolet= {hsv(0.73, 0.47, 0.95)},
|
||||
lViolet= {hsv(0.72, 0.47, 0.95)},
|
||||
lPurple= {hsv(0.80, 0.62, 0.89)},
|
||||
lMagenta= {hsv(0.86, 0.61, 0.89)},
|
||||
lWine= {hsv(0.93, 0.57, 0.92)},
|
||||
@@ -53,13 +53,13 @@ local COLOR={
|
||||
dRed= {hsv(0.00, 0.80, 0.48)},
|
||||
dFire= {hsv(0.04, 0.80, 0.34)},
|
||||
dOrange= {hsv(0.07, 0.80, 0.39)},
|
||||
dYellow= {hsv(0.11, 0.80, 0.37)},
|
||||
dLime= {hsv(0.17, 0.80, 0.26)},
|
||||
dJade= {hsv(0.31, 0.80, 0.27)},
|
||||
dYellow= {hsv(0.12, 0.80, 0.37)},
|
||||
dLime= {hsv(0.20, 0.80, 0.26)},
|
||||
dJade= {hsv(0.29, 0.80, 0.27)},
|
||||
dGreen= {hsv(0.33, 0.80, 0.26)},
|
||||
dAqua= {hsv(0.47, 0.80, 0.23)},
|
||||
dAqua= {hsv(0.46, 0.80, 0.24)},
|
||||
dCyan= {hsv(0.50, 0.80, 0.30)},
|
||||
dNavy= {hsv(0.59, 0.80, 0.42)},
|
||||
dNavy= {hsv(0.58, 0.80, 0.42)},
|
||||
dSea= {hsv(0.64, 0.80, 0.40)},
|
||||
dBlue= {hsv(0.67, 0.80, 0.34)},
|
||||
dViolet= {hsv(0.71, 0.80, 0.35)},
|
||||
@@ -72,12 +72,17 @@ local COLOR={
|
||||
gray= {hsv(0.02, 0.05, 0.65)},
|
||||
lGray= {hsv(0.02, 0.06, 0.86)},
|
||||
white= {hsv(0.01, 0.02, 0.99)},
|
||||
|
||||
xGray= {hsv(0.00, 0.00, 0.35,.8)},
|
||||
lxGray= {hsv(0.00, 0.00, 0.62,.8)},
|
||||
dxGray= {hsv(0.00, 0.00, 0.16,.8)},
|
||||
}
|
||||
for k,v in next,{
|
||||
R='red', F='fire', O='orange', Y='yellow', L='lime', J='jade', G='green', A='aqua', C='cyan', N='navy', S='sea', B='blue', V='violet', P='purple', M='magenta', W='wine',
|
||||
lR='lRed',lF='lFire',lO='lOrange',lY='lYellow',lL='lLime',lJ='lJade',lG='lGreen',lA='lAqua',lC='lCyan',lN='lNavy',lS='lSea',lB='lBlue',lV='lViolet',lP='lPurple',lM='lMagenta',lW='lWine',
|
||||
dR='dRed',dF='dFire',dO='dOrange',dY='dYellow',dL='dLime',dJ='dJade',dG='dGreen',dA='dAqua',dC='dCyan',dN='dNavy',dS='dSea',dB='dBlue',dV='dViolet',dP='dPurple',dM='dMagenta',dW='dWine',
|
||||
D='black',dH='dGray',H='gray',lH='lGray',Z='white',
|
||||
X='xGray',lX='lxGray',dX='dxGray',
|
||||
--Remain letter: EIKQTUX
|
||||
}do
|
||||
COLOR[k]=COLOR[v]
|
||||
|
||||
@@ -6,22 +6,38 @@ function FILE.load(name,args)
|
||||
local F=fs.newFile(name)
|
||||
assert(F:open'r','open error')
|
||||
local s=F:read()F:close()
|
||||
if args:sArg'-luaon'or args==''and s:sub(1,6)=='return{'then
|
||||
local func=loadstring(s)
|
||||
local mode=
|
||||
STRING.sArg(args,'-luaon')and'luaon'or
|
||||
STRING.sArg(args,'-lua')and'lua'or
|
||||
STRING.sArg(args,'-json')and'json'or
|
||||
STRING.sArg(args,'-string')and'string'or
|
||||
s:sub(1,6)=='return{'and'luaon'or
|
||||
(s:sub(1,1)=='['and s:sub(-1)==']'or s:sub(1,1)=='{'and s:sub(-1)=='}')and'json'or
|
||||
'string'
|
||||
if mode=='luaon'then
|
||||
local func,err_mes=loadstring(s)
|
||||
if func then
|
||||
setfenv(func,{})
|
||||
local res=func()
|
||||
return assert(res,'decode error')
|
||||
else
|
||||
error('decode error')
|
||||
error('decode error: '..err_mes)
|
||||
end
|
||||
elseif args:sArg'-json'or args==''and s:sub(1,1)=='['and s:sub(-1)==']'or s:sub(1,1)=='{'and s:sub(-1)=='}'then
|
||||
elseif mode=='lua'then
|
||||
local func,err_mes=loadstring(s)
|
||||
if func then
|
||||
local res=func()
|
||||
return assert(res,'run error')
|
||||
else
|
||||
error('compile error: '..err_mes)
|
||||
end
|
||||
elseif mode=='json'then
|
||||
local res=JSON.decode(s)
|
||||
if res then
|
||||
return res
|
||||
end
|
||||
error('decode error')
|
||||
elseif args:sArg'-string'or args==''then
|
||||
elseif mode=='string'then
|
||||
return s
|
||||
else
|
||||
error('unknown mode')
|
||||
@@ -32,12 +48,12 @@ function FILE.load(name,args)
|
||||
end
|
||||
function FILE.save(data,name,args)
|
||||
if not args then args=''end
|
||||
if args:sArg'-d'and fs.getInfo(name)then
|
||||
if STRING.sArg(args,'-d')and fs.getInfo(name)then
|
||||
error('duplicate')
|
||||
end
|
||||
|
||||
if type(data)=='table'then
|
||||
if args:sArg'-luaon'then
|
||||
if STRING.sArg(args,'-luaon')then
|
||||
data=TABLE.dump(data)
|
||||
if not data then
|
||||
error('encode error')
|
||||
|
||||
@@ -18,7 +18,7 @@ function FONT.rawset(s)
|
||||
end
|
||||
function FONT.load(fonts)
|
||||
for name,path in next,fonts do
|
||||
assert(love.filesystem.getInfo(path),("Font file $1($2) not exist!"):repD(name,path))
|
||||
assert(love.filesystem.getInfo(path),STRING.repD("Font file $1($2) not exist!",name,path))
|
||||
fontFiles[name]=love.filesystem.newFile(path)
|
||||
fontCache[name]={}
|
||||
end
|
||||
|
||||
@@ -2,7 +2,6 @@ local IMG={}
|
||||
function IMG.init(list)
|
||||
IMG.init=nil
|
||||
|
||||
local null=love.graphics.newCanvas(1,1)
|
||||
setmetatable(IMG,{__index=function(self,name)
|
||||
if type(list[name])=='table'then
|
||||
self[name]={}
|
||||
@@ -13,7 +12,7 @@ function IMG.init(list)
|
||||
self[name]=love.graphics.newImage(list[name])
|
||||
else
|
||||
LOG("No IMG: "..name)
|
||||
self[name]=null
|
||||
self[name]=PAPER
|
||||
end
|
||||
return self[name]
|
||||
end})
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
NONE={}function NULL()end
|
||||
NONE={}function NULL()end PAPER=love.graphics.newCanvas(1,1)
|
||||
EDITING=""
|
||||
LOADED=false
|
||||
|
||||
@@ -70,15 +70,26 @@ local gc_draw,gc_line,gc_circle,gc_print=gc.draw,gc.line,gc.circle,gc.print
|
||||
|
||||
local WIDGET,SCR,SCN=WIDGET,SCR,SCN
|
||||
local xOy=SCR.xOy
|
||||
|
||||
local ITP=xOy.inverseTransformPoint
|
||||
|
||||
local max,min=math.max,math.min
|
||||
|
||||
local devMode
|
||||
local mx,my,mouseShow,cursorSpd=640,360,false,0
|
||||
local jsState={}--map, joystickID->axisStates: {axisName->axisVal}
|
||||
local errData={}--list, each error create {mes={errMes strings},scene=sceneNameStr}
|
||||
|
||||
local devMode
|
||||
local function drawCursor(_,x,y)
|
||||
gc_setColor(1,1,1)
|
||||
gc_setLineWidth(2)
|
||||
gc_circle(ms.isDown(1)and'fill'or'line',x,y,6)
|
||||
end
|
||||
local showPowerInfo=true
|
||||
local showClickFX=true
|
||||
local discardCanvas=false
|
||||
local frameMul=100
|
||||
local sleepInterval=1/60
|
||||
local onQuit=NULL
|
||||
|
||||
local batteryImg=GC.DO{31,20,
|
||||
{'fRect',1,0,26,2},
|
||||
@@ -96,17 +107,16 @@ local function updatePowerInfo()
|
||||
gc_clear(0,0,0,.25)
|
||||
if state~='unknown'then
|
||||
gc_setLineWidth(4)
|
||||
local charging=state=='charging'
|
||||
if state=='nobattery'then
|
||||
gc_setColor(1,1,1)
|
||||
gc_setLineWidth(2)
|
||||
gc_line(74,SCR.safeX+5,100,22)
|
||||
gc_line(74,5,100,22)
|
||||
elseif pow then
|
||||
if charging then gc_setColor(0,1,0)
|
||||
elseif pow>50 then gc_setColor(1,1,1)
|
||||
elseif pow>26 then gc_setColor(1,1,0)
|
||||
elseif pow==26 then gc_setColor(.5,0,1)
|
||||
else gc_setColor(1,0,0)
|
||||
if state=='charging'then gc_setColor(0,1,0)
|
||||
elseif pow>50 then gc_setColor(1,1,1)
|
||||
elseif pow>26 then gc_setColor(1,1,0)
|
||||
elseif pow==26 then gc_setColor(.5,0,1)
|
||||
else gc_setColor(1,0,0)
|
||||
end
|
||||
gc.rectangle('fill',76,6,pow*.22,14)
|
||||
if pow<100 then
|
||||
@@ -152,7 +162,7 @@ local function _triggerMouseDown(x,y,k)
|
||||
if SCN.mouseDown then SCN.mouseDown(x,y,k)end
|
||||
WIDGET.press(x,y,k)
|
||||
lastX,lastY=x,y
|
||||
if SETTING.clickFX then SYSFX.newTap(3,x,y)end
|
||||
if showClickFX then SYSFX.newTap(3,x,y)end
|
||||
end
|
||||
local function mouse_update(dt)
|
||||
if not KBisDown('lctrl','rctrl')and KBisDown('up','down','left','right')then
|
||||
@@ -238,13 +248,13 @@ function love.touchpressed(id,x,y)
|
||||
x,y=ITP(xOy,x,y)
|
||||
lastX,lastY=x,y
|
||||
WIDGET.cursorMove(x,y)
|
||||
if SCN.touchDown then SCN.touchDown(x,y)end
|
||||
if SCN.touchDown then SCN.touchDown(x,y,id)end
|
||||
if kb.hasTextInput()then kb.setTextInput(false)end
|
||||
end
|
||||
function love.touchmoved(_,x,y,dx,dy)
|
||||
function love.touchmoved(id,x,y,dx,dy)
|
||||
if SCN.swapping then return end
|
||||
x,y=ITP(xOy,x,y)
|
||||
if SCN.touchMove then SCN.touchMove(x,y,dx/SCR.k,dy/SCR.k)end
|
||||
if SCN.touchMove then SCN.touchMove(x,y,dx/SCR.k,dy/SCR.k,id)end
|
||||
WIDGET.drag(x,y,dx/SCR.k,dy/SCR.k)
|
||||
end
|
||||
function love.touchreleased(id,x,y)
|
||||
@@ -257,10 +267,10 @@ function love.touchreleased(id,x,y)
|
||||
WIDGET.unFocus()
|
||||
SCN.mainTouchID=false
|
||||
end
|
||||
if SCN.touchUp then SCN.touchUp(x,y)end
|
||||
if SCN.touchUp then SCN.touchUp(x,y,id)end
|
||||
if(x-lastX)^2+(y-lastY)^2<62 then
|
||||
if SCN.touchClick then SCN.touchClick(x,y)end
|
||||
if SETTING.clickFX then SYSFX.newTap(3,x,y)end
|
||||
if showClickFX then SYSFX.newTap(3,x,y)end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -309,7 +319,7 @@ function love.keypressed(key,_,isRep)
|
||||
MES.new('info',"DEBUG ON",.2)
|
||||
elseif key=='f11'then
|
||||
SETTING.fullscreen=not SETTING.fullscreen
|
||||
applyFullscreen()
|
||||
applySettings()
|
||||
saveSettings()
|
||||
elseif not SCN.swapping then
|
||||
if EDITING==""and(not SCN.keyDown or SCN.keyDown(key,isRep))then
|
||||
@@ -324,7 +334,7 @@ function love.keypressed(key,_,isRep)
|
||||
elseif key=='space'or key=='return'then
|
||||
mouseShow=true
|
||||
if not isRep then
|
||||
if SETTING.clickFX then SYSFX.newTap(3,mx,my)end
|
||||
if showClickFX then SYSFX.newTap(3,mx,my)end
|
||||
_triggerMouseDown(mx,my,1)
|
||||
end
|
||||
else
|
||||
@@ -397,7 +407,7 @@ function love.joystickremoved(JS)
|
||||
end
|
||||
end
|
||||
function love.gamepadaxis(JS,axis,val)
|
||||
if JS==jsState[1]._jsObj then
|
||||
if jsState[1]and JS==jsState[1]._jsObj then
|
||||
local js=jsState[1]
|
||||
if axis=='leftx'or axis=='lefty'or axis=='rightx'or axis=='righty'then
|
||||
local newVal=--range: [0,1]
|
||||
@@ -452,7 +462,7 @@ function love.gamepadpressed(_,key)
|
||||
if W and W.arrowKey then W:arrowKey(key)end
|
||||
elseif key=='return'then
|
||||
mouseShow=true
|
||||
if SETTING.clickFX then SYSFX.newTap(3,mx,my)end
|
||||
if showClickFX then SYSFX.newTap(3,mx,my)end
|
||||
_triggerMouseDown(mx,my,1)
|
||||
else
|
||||
if W and W.keypress then
|
||||
@@ -481,14 +491,16 @@ function love.lowmemory()
|
||||
MES.new('check',"[auto GC] low MEM 设备内存过低")
|
||||
end
|
||||
end
|
||||
|
||||
local onResize=NULL
|
||||
function love.resize(w,h)
|
||||
if SCR.w==w and SCR.h==h then return end
|
||||
SCR.resize(w,h)
|
||||
if BG.resize then BG.resize(w,h)end
|
||||
if SCN.resize then SCN.resize(w,h)end
|
||||
WIDGET.resize(w,h)
|
||||
FONT.reset()
|
||||
|
||||
SHADER.warning:send('w',w*SCR.dpi)
|
||||
onResize(w,h)
|
||||
end
|
||||
|
||||
local onFocus=NULL
|
||||
@@ -627,14 +639,6 @@ local wsImg={}do
|
||||
}
|
||||
end
|
||||
|
||||
local function drawCursor(_,x,y)
|
||||
gc_setColor(1,1,1)
|
||||
gc_setLineWidth(2)
|
||||
gc_circle(ms.isDown(1)and'fill'or'line',x,y,6)
|
||||
end
|
||||
local function showPowerInfo()return true end
|
||||
local onQuit=NULL
|
||||
|
||||
function love.run()
|
||||
local love=love
|
||||
|
||||
@@ -649,7 +653,7 @@ function love.run()
|
||||
local FPS,MINI=love.timer.getFPS,love.window.isMinimized
|
||||
local PUMP,POLL=love.event.pump,love.event.poll
|
||||
|
||||
local timer,SETTING,VERSION=love.timer.getTime,SETTING,VERSION
|
||||
local timer,VERSION=love.timer.getTime,VERSION
|
||||
|
||||
local frameTimeList={}
|
||||
local lastFrame=timer()
|
||||
@@ -698,11 +702,10 @@ function love.run()
|
||||
|
||||
--DRAW
|
||||
if not MINI()then
|
||||
FCT=FCT+SETTING.frameMul
|
||||
FCT=FCT+frameMul
|
||||
if FCT>=100 then
|
||||
FCT=FCT-100
|
||||
|
||||
local safeX=SCR.safeX
|
||||
gc_replaceTransform(SCR.origin)
|
||||
gc_setColor(1,1,1)
|
||||
BG.draw()
|
||||
@@ -713,16 +716,14 @@ function love.run()
|
||||
TEXT_draw()
|
||||
|
||||
--Draw cursor
|
||||
if mouseShow then
|
||||
drawCursor(time,mx,my)
|
||||
end
|
||||
gc_replaceTransform(SCR.xOy_ul)
|
||||
MES_draw()
|
||||
if mouseShow then drawCursor(time,mx,my)end
|
||||
gc_replaceTransform(SCR.origin)
|
||||
MES_draw()
|
||||
|
||||
--Draw power info.
|
||||
if showPowerInfo()then
|
||||
if showPowerInfo then
|
||||
gc_setColor(1,1,1)
|
||||
gc_draw(infoCanvas,safeX,0,0,SCR.k)
|
||||
gc_draw(infoCanvas,SCR.safeX,0,0,SCR.k)
|
||||
end
|
||||
|
||||
--Draw scene swapping animation
|
||||
@@ -733,10 +734,12 @@ function love.run()
|
||||
end
|
||||
gc_replaceTransform(SCR.xOy_d)
|
||||
--Draw Version string
|
||||
gc_setColor(.8,.8,.8,.4)
|
||||
gc_setColor(.9,.9,.9,.42)
|
||||
FONT.set(20)
|
||||
mStr(VERSION.string,0,-30)
|
||||
gc_replaceTransform(SCR.xOy_dl)
|
||||
local safeX=SCR.safeX/SCR.k
|
||||
|
||||
--Draw FPS
|
||||
FONT.set(15)
|
||||
gc_setColor(1,1,1)
|
||||
@@ -794,13 +797,13 @@ function love.run()
|
||||
gc_present()
|
||||
|
||||
--SPEED UPUPUP!
|
||||
if SETTING.cleanCanvas then gc_discard()end
|
||||
if discardCanvas then gc_discard()end
|
||||
end
|
||||
end
|
||||
|
||||
--Fresh power info.
|
||||
if time-lastFreshPow>2.6 then
|
||||
if showPowerInfo()then
|
||||
if showPowerInfo then
|
||||
updatePowerInfo()
|
||||
lastFreshPow=time
|
||||
end
|
||||
@@ -818,31 +821,44 @@ function love.run()
|
||||
end
|
||||
end
|
||||
|
||||
--Keep 60fps
|
||||
_=timer()-lastFrame
|
||||
if _<.0162 then WAIT(.0162-_)end
|
||||
while timer()-lastFrame<1/60 do end
|
||||
if _<sleepInterval*.9626 then WAIT(sleepInterval*.9626-_)end
|
||||
while timer()-lastFrame<sleepInterval do end
|
||||
end
|
||||
end
|
||||
|
||||
local Z={}
|
||||
|
||||
Z.js=jsState
|
||||
Z.errData=errData
|
||||
function Z.getJsState()return jsState end
|
||||
function Z.getErr(i)
|
||||
if i=='#'then
|
||||
return errData[#errData]
|
||||
elseif i then
|
||||
return errData[i]
|
||||
else
|
||||
return errData
|
||||
end
|
||||
end
|
||||
|
||||
function Z.setIfPowerInfo(func)showPowerInfo=func end
|
||||
function Z.setPowerInfo(bool)showPowerInfo=bool end
|
||||
function Z.setCleanCanvas(bool)discardCanvas=bool end
|
||||
function Z.setFrameMul(n)frameMul=n end
|
||||
function Z.setMaxFPS(fps)sleepInterval=1/fps end
|
||||
function Z.setClickFX(bool)showClickFX=bool end
|
||||
|
||||
--[Warning] Color and line width is uncertain value, set it in the function.
|
||||
function Z.setCursor(func)drawCursor=func end
|
||||
|
||||
--Change F1~F7 events of devmode (F8 mode)
|
||||
function Z.setOnFnKeys(list)
|
||||
assert(type(list)=='table')
|
||||
assert(type(list)=='table',"Z.setOnFnKeys(list): list must be a table.")
|
||||
for i=1,7 do fnKey[i]=type(list[i])=='function'and list[i]or NULL end
|
||||
end
|
||||
|
||||
function Z.setOnFocus(func)onFocus=type(func)=='function'and func or NULL end
|
||||
function Z.setOnFocus(func)onFocus=assert(type(func)=='function'and func,"Z.setOnFocus(func): func must be a function")end
|
||||
|
||||
function Z.setOnQuit(func)onQuit=type(func)=='function'and func or NULL end
|
||||
function Z.setOnResize(func)onResize=assert(type(func)=='function'and func,"Z.setOnResize(func): func must be a function")end
|
||||
|
||||
function Z.setOnQuit(func)onQuit=assert(type(func)=='function'and func,"Z.setOnQuit(func): func must be a function")end
|
||||
|
||||
return Z
|
||||
|
||||
@@ -20,4 +20,18 @@ function MATH.coin(a,b)
|
||||
end
|
||||
end
|
||||
|
||||
function MATH.interval(v,low,high)
|
||||
if v<=low then
|
||||
return low
|
||||
elseif v>=high then
|
||||
return high
|
||||
else
|
||||
return v
|
||||
end
|
||||
end
|
||||
|
||||
function MATH.expApproach(a,b,k)
|
||||
return b+(a-b)*2.718281828459045^-k
|
||||
end
|
||||
|
||||
return MATH
|
||||
@@ -140,11 +140,11 @@ function profile.switch()
|
||||
switch=not switch
|
||||
if not switch then
|
||||
profile.stop()
|
||||
love.system.setClipboardText(PROFILE.report())
|
||||
PROFILE.reset()
|
||||
love.system.setClipboardText(profile.report())
|
||||
profile.reset()
|
||||
return false
|
||||
else
|
||||
PROFILE.start()
|
||||
profile.start()
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
@@ -15,6 +15,8 @@ local SCN={
|
||||
draw=false, --Swap draw func
|
||||
},
|
||||
stack={},--Scene stack
|
||||
prev=false,
|
||||
args={},--Arguments from previous scene
|
||||
|
||||
scenes=scenes,
|
||||
|
||||
@@ -52,14 +54,15 @@ function SCN.swapUpdate(dt)
|
||||
S.time=S.time-dt
|
||||
if S.time<S.changeTime and S.time+dt>=S.changeTime then
|
||||
--Scene swapped this frame
|
||||
SCN.init(S.tar,SCN.cur)
|
||||
SCN.prev=SCN.cur
|
||||
SCN.init(S.tar)
|
||||
SCN.mainTouchID=nil
|
||||
end
|
||||
if S.time<0 then
|
||||
SCN.swapping=false
|
||||
end
|
||||
end
|
||||
function SCN.init(s,org)
|
||||
function SCN.init(s)
|
||||
love.keyboard.setTextInput(false)
|
||||
|
||||
local S=scenes[s]
|
||||
@@ -89,7 +92,7 @@ function SCN.init(s,org)
|
||||
SCN.update=S.update
|
||||
SCN.draw=S.draw
|
||||
if S.sceneInit then
|
||||
S.sceneInit(org)
|
||||
S.sceneInit()
|
||||
end
|
||||
end
|
||||
function SCN.push(tar,style)
|
||||
@@ -165,11 +168,12 @@ local swap={
|
||||
end
|
||||
},
|
||||
}--Scene swapping animations
|
||||
function SCN.swapTo(tar,style)--Parallel scene swapping, cannot back
|
||||
function SCN.swapTo(tar,style,...)--Parallel scene swapping, cannot back
|
||||
if scenes[tar]then
|
||||
if not SCN.swapping and tar~=SCN.cur then
|
||||
style=style or'fade'
|
||||
SCN.swapping=true
|
||||
SCN.args={...}
|
||||
local S=SCN.stat
|
||||
S.tar,S.style=tar,style
|
||||
S.time=swap[style].duration
|
||||
@@ -180,15 +184,15 @@ function SCN.swapTo(tar,style)--Parallel scene swapping, cannot back
|
||||
MES.new('warn',"No Scene: "..tar)
|
||||
end
|
||||
end
|
||||
function SCN.go(tar,style)--Normal scene swapping, can back
|
||||
function SCN.go(tar,style,...)--Normal scene swapping, can back
|
||||
if scenes[tar]then
|
||||
SCN.push()
|
||||
SCN.swapTo(tar,style)
|
||||
SCN.swapTo(tar,style,...)
|
||||
else
|
||||
MES.new('warn',"No Scene: "..tar)
|
||||
end
|
||||
end
|
||||
function SCN.back()
|
||||
function SCN.back(...)
|
||||
if SCN.swapping then return end
|
||||
|
||||
--Leave scene
|
||||
@@ -199,7 +203,7 @@ function SCN.back()
|
||||
--Poll&Back to previous Scene
|
||||
local m=#SCN.stack
|
||||
if m>0 then
|
||||
SCN.swapTo(SCN.stack[m-1],SCN.stack[m])
|
||||
SCN.swapTo(SCN.stack[m-1],SCN.stack[m],...)
|
||||
SCN.stack[m],SCN.stack[m-1]=nil
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
local type,rem=type,table.remove
|
||||
local int,rnd=math.floor,math.random
|
||||
local interval=MATH.interval
|
||||
|
||||
local sfxList={}
|
||||
local packSetting={}
|
||||
@@ -42,16 +43,28 @@ function SFX.init(list)
|
||||
end
|
||||
function SFX.load(path)
|
||||
local c=0
|
||||
local missing=0
|
||||
for i=1,#sfxList do
|
||||
local fullPath=path..sfxList[i]..'.ogg'
|
||||
if love.filesystem.getInfo(fullPath)then
|
||||
if Sources[sfxList[i]]then
|
||||
for j=1,#Sources[sfxList[i]]do
|
||||
Sources[sfxList[i]][j]:release()
|
||||
end
|
||||
end
|
||||
Sources[sfxList[i]]={love.audio.newSource(fullPath,'static')}
|
||||
c=c+1
|
||||
else
|
||||
LOG("No SFX: "..sfxList[i]..'.ogg',.1)
|
||||
missing=missing+1
|
||||
end
|
||||
end
|
||||
LOG(c.."/"..#sfxList.." SFX files loaded")
|
||||
LOG(missing.." SFX files missing")
|
||||
if missing>0 then
|
||||
MES.new('info',missing.." SFX files missing")
|
||||
end
|
||||
collectgarbage()
|
||||
end
|
||||
function SFX.loadSample(pack)
|
||||
assert(type(pack)=='table',"Usage: SFX.loadsample([table])")
|
||||
@@ -128,7 +141,7 @@ local function _play(name,vol,pos,pitch)
|
||||
S=S[n]--AU_SRC
|
||||
if S:getChannelCount()==1 then
|
||||
if pos then
|
||||
pos=pos*stereo
|
||||
pos=interval(pos,-1,1)*stereo
|
||||
S:setPosition(pos,1-pos^2,0)
|
||||
else
|
||||
S:setPosition(0,0,0)
|
||||
|
||||
@@ -6,7 +6,7 @@ local find,sub,gsub,upper=string.find,string.sub,string.gsub,string.upper
|
||||
local char,byte=string.char,string.byte
|
||||
|
||||
--"Replace dollars", replace all $n with ...
|
||||
function string.repD(str,...)
|
||||
function STRING.repD(str,...)
|
||||
local l={...}
|
||||
for i=#l,1,-1 do
|
||||
str=gsub(str,'$'..i,l[i])
|
||||
@@ -15,7 +15,7 @@ function string.repD(str,...)
|
||||
end
|
||||
|
||||
--"Scan arg", scan if str has the arg (format of str is like "-json -q", arg is like "-q")
|
||||
function string.sArg(str,switch)
|
||||
function STRING.sArg(str,switch)
|
||||
if find(str.." ",switch.." ")then
|
||||
return true
|
||||
end
|
||||
@@ -169,6 +169,25 @@ function STRING.vcsDecrypt(text,key)
|
||||
end
|
||||
return result..buffer
|
||||
end
|
||||
function STRING.digezt(text)--Not powerful hash, just protect the original text
|
||||
local out={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
|
||||
local seed=26
|
||||
for i=1,#text do
|
||||
local c=byte(text,i)
|
||||
seed=(seed+c)%26
|
||||
c=c+seed
|
||||
local pos=c*i%16
|
||||
local step=(c+i)%4+1
|
||||
local times=2+(c%6)
|
||||
for _=1,times do
|
||||
out[pos+1]=(out[pos+1]+c)%256
|
||||
pos=(pos+step)%16
|
||||
end
|
||||
end
|
||||
local result=""
|
||||
for i=1,16 do result=result..char(out[i])end
|
||||
return result
|
||||
end
|
||||
|
||||
function STRING.readLine(str)
|
||||
local p=str:find("\n")
|
||||
@@ -178,6 +197,9 @@ function STRING.readLine(str)
|
||||
return str,""
|
||||
end
|
||||
end
|
||||
function STRING.readChars(str,n)
|
||||
return sub(str,1,n),sub(str,n+1)
|
||||
end
|
||||
|
||||
function STRING.packBin(s)
|
||||
return data.encode('string','base64',data.compress('string','zlib',s))
|
||||
|
||||
@@ -19,6 +19,7 @@ local sub,ins,rem=string.sub,table.insert,table.remove
|
||||
local xOy=SCR.xOy
|
||||
local FONT=FONT
|
||||
local mStr=GC.mStr
|
||||
local approach=MATH.expApproach
|
||||
|
||||
local downArrowIcon=GC.DO{40,25,{'fPoly',0,0,20,25,40,0}}
|
||||
local upArrowIcon=GC.DO{40,25,{'fPoly',0,25,20,0,40,25}}
|
||||
@@ -45,7 +46,12 @@ local function _rectangleStencil()
|
||||
gc.rectangle('fill',1,1,STW-2,STH-2)
|
||||
end
|
||||
|
||||
local onChange=NULL
|
||||
|
||||
local WIDGET={}
|
||||
|
||||
function WIDGET.setOnChange(func)onChange=assert(type(func)=='function'and func,"WIDGET.setOnChange(func): func must be a function")end
|
||||
|
||||
local widgetMetatable={
|
||||
__tostring=function(self)
|
||||
return self:getInfo()
|
||||
@@ -72,20 +78,23 @@ function text:draw()
|
||||
if self.alpha>0 then
|
||||
local c=self.color
|
||||
gc_setColor(c[1],c[2],c[3],self.alpha)
|
||||
local w=self.obj:getWidth()
|
||||
local k=min(self.lim/self.obj:getWidth(),1)
|
||||
if self.align=='M'then
|
||||
gc_draw(self.obj,self.x-self.obj:getWidth()*.5,self.y)
|
||||
gc_draw(self.obj,self.x,self.y,nil,k,1,w*.5,0)
|
||||
elseif self.align=='L'then
|
||||
gc_draw(self.obj,self.x,self.y)
|
||||
gc_draw(self.obj,self.x,self.y,nil,k,1)
|
||||
elseif self.align=='R'then
|
||||
gc_draw(self.obj,self.x-self.obj:getWidth(),self.y)
|
||||
gc_draw(self.obj,self.x,self.y,nil,k,1,w,0)
|
||||
end
|
||||
end
|
||||
end
|
||||
function WIDGET.newText(D)--name,x,y[,fText][,color][,font=30][,fType][,align='M'][,hideF][,hide]
|
||||
function WIDGET.newText(D)--name,x,y[,lim][,fText][,color][,font=30][,fType][,align='M'][,hideF][,hide]
|
||||
local _={
|
||||
name= D.name or"_",
|
||||
x= D.x,
|
||||
y= D.y,
|
||||
lim= D.lim or 1e99,
|
||||
|
||||
fText=D.fText,
|
||||
color=D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||
@@ -148,9 +157,9 @@ function button:isAbove(x,y)
|
||||
local ATV=self.ATV
|
||||
return
|
||||
x>self.x-ATV and
|
||||
y>self.y-ATV and
|
||||
y>self.y and
|
||||
x<self.x+self.w+2*ATV and
|
||||
y<self.y+self.h+2*ATV
|
||||
y<self.y+self.h
|
||||
end
|
||||
function button:getCenter()
|
||||
return self.x+self.w*.5,self.y+self.h*.5
|
||||
@@ -171,17 +180,19 @@ function button:draw()
|
||||
|
||||
--Button
|
||||
gc_setColor(.15+r*.7,.15+g*.7,.15+b*.7,.9)
|
||||
gc_rectangle('fill',x-ATV,y-ATV,w+2*ATV,h+2*ATV,3)
|
||||
gc_rectangle('fill',x-ATV,y,w+2*ATV,h,4)
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(.3+r*.7,.3+g*.7,.3+b*.7)
|
||||
gc_rectangle('line',x-ATV,y,w+2*ATV,h,5)
|
||||
if ATV>0 then
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(.97,.97,.97,ATV*.125)
|
||||
gc_rectangle('line',x-ATV+2,y-ATV+2,w+2*ATV-4,h+2*ATV-4,3)
|
||||
gc_rectangle('line',x-ATV,y,w+2*ATV,h,3)
|
||||
end
|
||||
|
||||
--Drawable
|
||||
local obj=self.obj
|
||||
local ox,oy=obj:getWidth()*.5,obj:getHeight()*.5
|
||||
local y0=y+h*.5-ATV*.5
|
||||
local y0=y+h*.5
|
||||
gc_setColor(1,1,1,.2+ATV*.05)
|
||||
if self.align=='M'then
|
||||
local x0=x+w*.5
|
||||
@@ -219,15 +230,15 @@ function button:press(_,_,k)
|
||||
SYSFX.newRectRipple(
|
||||
6,
|
||||
self.x-ATV,
|
||||
self.y-ATV-WIDGET.scrollPos,
|
||||
self.y-WIDGET.scrollPos,
|
||||
self.w+2*ATV,
|
||||
self.h+2*ATV
|
||||
self.h
|
||||
)
|
||||
if self.sound then
|
||||
SFX.play('button')
|
||||
SFX.play(self.sound)
|
||||
end
|
||||
end
|
||||
function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,fType][,sound=true][,align='M'][,edge=0][,code][,hideF][,hide]
|
||||
function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,fType][,sound][,align='M'][,edge=0][,code][,hideF][,hide]
|
||||
if not D.h then D.h=D.w end
|
||||
local _={
|
||||
name= D.name or"_",
|
||||
@@ -251,11 +262,18 @@ function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,fType][,
|
||||
fType=D.fType,
|
||||
align=D.align or'M',
|
||||
edge= D.edge or 0,
|
||||
sound=D.sound~=false,
|
||||
code= D.code or NULL,
|
||||
hideF=D.hideF,
|
||||
hide= D.hide,
|
||||
}
|
||||
if D.sound==false then
|
||||
_.sound=false
|
||||
elseif type(D.sound)=='string'then
|
||||
_.sound=D.sound
|
||||
else
|
||||
_.sound='button'
|
||||
end
|
||||
|
||||
for k,v in next,button do _[k]=v end
|
||||
setmetatable(_,widgetMetatable)
|
||||
return _
|
||||
@@ -301,13 +319,6 @@ function key:draw()
|
||||
local align=self.align
|
||||
local r,g,b=c[1],c[2],c[3]
|
||||
|
||||
--Frame
|
||||
if not self.noFrame then
|
||||
gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
|
||||
gc_setLineWidth(2)
|
||||
gc_rectangle('line',x,y,w,h,3)
|
||||
end
|
||||
|
||||
--Fill
|
||||
if self.fShade then
|
||||
gc_setColor(r,g,b,ATV*.25)
|
||||
@@ -319,6 +330,16 @@ function key:draw()
|
||||
gc_draw(self.fShade,x+w-self.edge-self.fShade:getWidth(),y+h*.5-self.fShade:getHeight()*.5)
|
||||
end
|
||||
else
|
||||
--Background
|
||||
gc_setColor(0,0,0,.3)
|
||||
gc_rectangle('fill',x,y,w,h,4)
|
||||
|
||||
--Frame
|
||||
gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
|
||||
gc_setLineWidth(2)
|
||||
gc_rectangle('line',x,y,w,h,3)
|
||||
|
||||
--Shade
|
||||
gc_setColor(1,1,1,ATV*.05)
|
||||
gc_rectangle('fill',x,y,w,h,3)
|
||||
end
|
||||
@@ -342,10 +363,10 @@ end
|
||||
function key:press(_,_,k)
|
||||
self.code(k)
|
||||
if self.sound then
|
||||
SFX.play('key')
|
||||
SFX.play(self.sound)
|
||||
end
|
||||
end
|
||||
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,font=30][,fType][,sound=true][,align='M'][,edge=0][,code][,hideF][,hide]
|
||||
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,color][,font=30][,fType][,sound][,align='M'][,edge=0][,code][,hideF][,hide]
|
||||
if not D.h then D.h=D.w end
|
||||
local _={
|
||||
name= D.name or"_",
|
||||
@@ -365,17 +386,22 @@ function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,fo
|
||||
|
||||
fText= D.fText,
|
||||
fShade= D.fShade,
|
||||
noFrame=D.noFrame,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||
font= D.font or 30,
|
||||
fType=D.fType,
|
||||
sound= D.sound~=false,
|
||||
fType= D.fType,
|
||||
align= D.align or'M',
|
||||
edge= D.edge or 0,
|
||||
code= D.code or NULL,
|
||||
hideF= D.hideF,
|
||||
hide= D.hide,
|
||||
}
|
||||
if D.sound==false then
|
||||
_.sound=false
|
||||
elseif type(D.sound)=='string'then
|
||||
_.sound=D.sound
|
||||
else
|
||||
_.sound='key'
|
||||
end
|
||||
for k,v in next,key do _[k]=v end
|
||||
setmetatable(_,widgetMetatable)
|
||||
return _
|
||||
@@ -415,6 +441,10 @@ function switch:draw()
|
||||
local x,y=self.x,self.y
|
||||
local ATV=self.ATV
|
||||
|
||||
--Background
|
||||
gc_setColor(0,0,0,.3)
|
||||
gc_rectangle('fill',x,y-25,50,50,4)
|
||||
|
||||
--Frame
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(1,1,1,.6+ATV*.1)
|
||||
@@ -499,7 +529,7 @@ function slider:isAbove(x,y)
|
||||
return x>self.x-10 and x<self.x+self.w+10 and y>self.y-25 and y<self.y+25
|
||||
end
|
||||
function slider:getCenter()
|
||||
return self.x+self.w*(self.pos/self.unit),self.y
|
||||
return self.x+self.w*((self.pos-self.rangeL)/(self.rangeR-self.rangeL)),self.y
|
||||
end
|
||||
function slider:update(dt)
|
||||
local ATV=self.ATV
|
||||
@@ -513,7 +543,7 @@ function slider:update(dt)
|
||||
if ATV>0 then self.ATV=max(ATV-dt*30,0)end
|
||||
end
|
||||
if not self.hide then
|
||||
self.pos=self.pos*.7+self.disp()*.3
|
||||
self.pos=approach(self.pos,self.disp(),dt*26)
|
||||
end
|
||||
end
|
||||
function slider:draw()
|
||||
@@ -526,8 +556,8 @@ function slider:draw()
|
||||
--Units
|
||||
if not self.smooth then
|
||||
gc_setLineWidth(2)
|
||||
for p=0,self.unit do
|
||||
local X=x+(x2-x)*p/self.unit
|
||||
for p=self.rangeL,self.rangeR,self.unit do
|
||||
local X=x+(x2-x)*(p-self.rangeL)/(self.rangeR-self.rangeL)
|
||||
gc_line(X,y+7,X,y-7)
|
||||
end
|
||||
end
|
||||
@@ -537,7 +567,7 @@ function slider:draw()
|
||||
gc_line(x,y,x2,y)
|
||||
|
||||
--Block
|
||||
local cx=x+(x2-x)*self.pos/self.unit
|
||||
local cx=x+(x2-x)*(self.pos-self.rangeL)/(self.rangeR-self.rangeL)
|
||||
local bx,by,bw,bh=cx-10-ATV*.5,y-16-ATV,20+ATV,32+2*ATV
|
||||
gc_setColor(.8,.8,.8)
|
||||
gc_rectangle('fill',bx,by,bw,bh,3)
|
||||
@@ -572,13 +602,16 @@ end
|
||||
function slider:drag(x)
|
||||
if not x then return end
|
||||
x=x-self.x
|
||||
local p=self.disp()
|
||||
local P=x<0 and 0 or x>self.w and self.unit or x/self.w*self.unit
|
||||
if not self.smooth then
|
||||
P=int(P+.5)
|
||||
local newPos=MATH.interval(x/self.w,0,1)
|
||||
local newVal
|
||||
if not self.unit then
|
||||
newVal=(1-newPos)*self.rangeL+newPos*self.rangeR
|
||||
else
|
||||
newVal=newPos*(self.rangeR-self.rangeL)
|
||||
newVal=self.rangeL+newVal-newVal%self.unit
|
||||
end
|
||||
if p~=P then
|
||||
self.code(P)
|
||||
if newVal~=self.disp()then
|
||||
self.code(newVal)
|
||||
end
|
||||
if self.change and timer()-self.lastTime>.5 then
|
||||
self.lastTime=timer()
|
||||
@@ -591,8 +624,8 @@ function slider:release(x)
|
||||
end
|
||||
function slider:scroll(n)
|
||||
local p=self.disp()
|
||||
local u=self.smooth and .01 or 1
|
||||
local P=n==-1 and max(p-u,0)or min(p+u,self.unit)
|
||||
local u=self.unit or .01
|
||||
local P=MATH.interval(p+u*n,self.rangeL,self.rangeR)
|
||||
if p==P or not P then return end
|
||||
self.code(P)
|
||||
if self.change and timer()-self.lastTime>.18 then
|
||||
@@ -603,7 +636,13 @@ end
|
||||
function slider:arrowKey(k)
|
||||
self:scroll((k=='left'or k=='up')and -1 or 1)
|
||||
end
|
||||
function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,unit][,smooth][,font=30][,fType][,change],disp[,show][,code],hide
|
||||
function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,axis][,smooth][,font=30][,fType][,change],disp[,show][,code],hide
|
||||
if not D.axis then
|
||||
D.axis={0,1,false}
|
||||
D.smooth=true
|
||||
elseif not D.axis[3]then
|
||||
D.smooth=true
|
||||
end
|
||||
local _={
|
||||
name= D.name or"_",
|
||||
|
||||
@@ -622,10 +661,12 @@ function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,unit][,smooth][,
|
||||
|
||||
fText= D.fText,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||
unit= D.unit or 1,
|
||||
smooth=false,
|
||||
rangeL=D.axis[1],
|
||||
rangeR=D.axis[2],
|
||||
unit= D.axis[3],
|
||||
smooth=D.smooth,
|
||||
font= D.font or 30,
|
||||
fType=D.fType,
|
||||
fType= D.fType,
|
||||
change=D.change,
|
||||
disp= D.disp,
|
||||
code= D.code or NULL,
|
||||
@@ -633,22 +674,17 @@ function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,unit][,smooth][,
|
||||
hide= D.hide,
|
||||
show= false,
|
||||
}
|
||||
if D.smooth~=nil then
|
||||
_.smooth=D.smooth
|
||||
else
|
||||
_.smooth=_.unit<=1
|
||||
end
|
||||
if D.show then
|
||||
if type(D.show)=='function'then
|
||||
_.show=D.show
|
||||
else
|
||||
_.show=sliderShowFunc[D.show]
|
||||
end
|
||||
elseif D.show~=false then
|
||||
if _.unit<=1 then
|
||||
_.show=sliderShowFunc.percent
|
||||
else
|
||||
elseif D.show~=false then--Use default if nil
|
||||
if _.unit and _.unit%1==0 then
|
||||
_.show=sliderShowFunc.int
|
||||
else
|
||||
_.show=sliderShowFunc.percent
|
||||
end
|
||||
end
|
||||
for k,v in next,slider do _[k]=v end
|
||||
@@ -700,6 +736,10 @@ function selector:draw()
|
||||
local w=self.w
|
||||
local ATV=self.ATV
|
||||
|
||||
--Background
|
||||
gc_setColor(0,0,0,.3)
|
||||
gc_rectangle('fill',x,y,w,60,4)
|
||||
|
||||
--Frame
|
||||
gc_setColor(1,1,1,.6+ATV*.1)
|
||||
gc_setLineWidth(2)
|
||||
@@ -863,9 +903,15 @@ function inputBox:draw()
|
||||
local x,y,w,h=self.x,self.y,self.w,self.h
|
||||
local ATV=self.ATV
|
||||
|
||||
gc_setColor(1,1,1,ATV*.08)
|
||||
gc_rectangle('fill',x,y,w,h,3)
|
||||
--Background
|
||||
gc_setColor(0,0,0,.4)
|
||||
gc_rectangle('fill',x,y,w,h,4)
|
||||
|
||||
--Highlight
|
||||
gc_setColor(1,1,1,ATV*.08*(math.sin(TIME()*4.2)*.2+.8))
|
||||
gc_rectangle('fill',x,y,w,h,4)
|
||||
|
||||
--Frame
|
||||
gc_setColor(1,1,1)
|
||||
gc_setLineWidth(3)
|
||||
gc_rectangle('line',x,y,w,h,3)
|
||||
@@ -931,7 +977,7 @@ function WIDGET.newInputBox(D)--name,x,y,w[,h][,font=30][,fType][,secret][,regex
|
||||
},
|
||||
|
||||
font= D.font or int(D.h/7-1)*5,
|
||||
fType=D.fType,
|
||||
fType= D.fType,
|
||||
secret=D.secret==true,
|
||||
regex= D.regex,
|
||||
limit= D.limit,
|
||||
@@ -1023,8 +1069,8 @@ function textBox:draw()
|
||||
local lineH=self.lineH
|
||||
|
||||
--Background
|
||||
gc_setColor(0,0,0,.4)
|
||||
gc_rectangle('fill',x,y,w,h,3)
|
||||
gc_setColor(0,0,0,.3)
|
||||
gc_rectangle('fill',x,y,w,h,4)
|
||||
|
||||
--Frame
|
||||
gc_setLineWidth(2)
|
||||
@@ -1187,6 +1233,14 @@ function listBox:arrowKey(dir)
|
||||
end
|
||||
end
|
||||
end
|
||||
function listBox:select(i)
|
||||
self.selected=i
|
||||
if self.selected<int(self.scrollPos/self.lineH)+2 then
|
||||
self:drag(nil,nil,nil,1e99)
|
||||
elseif self.selected>int(self.scrollPos/self.lineH)+self.capacity-1 then
|
||||
self:drag(nil,nil,nil,-1e99)
|
||||
end
|
||||
end
|
||||
function listBox:draw()
|
||||
local x,y,w,h=self.x,self.y,self.w,self.h
|
||||
local list=self.list
|
||||
@@ -1197,6 +1251,10 @@ function listBox:draw()
|
||||
gc_push('transform')
|
||||
gc_translate(x,y)
|
||||
|
||||
--Background
|
||||
gc_setColor(0,0,0,.4)
|
||||
gc_rectangle('fill',0,0,w,h,4)
|
||||
|
||||
--Frame
|
||||
gc_setColor(WIDGET.sel==self and COLOR.lN or COLOR.Z)
|
||||
gc_setLineWidth(2)
|
||||
@@ -1225,7 +1283,7 @@ end
|
||||
function listBox:getInfo()
|
||||
return("x=%d,y=%d,w=%d,h=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h)
|
||||
end
|
||||
function WIDGET.newListBox(D)--name,x,y,w,h,lineH[,hideF][,hide][,drawF]
|
||||
function WIDGET.newListBox(D)--name,x,y,w,h,lineH,drawF[,hideF][,hide]
|
||||
local _={
|
||||
name= D.name or"_",
|
||||
|
||||
@@ -1282,16 +1340,7 @@ function WIDGET.setWidgetList(list)
|
||||
for i=1,#list do
|
||||
list[i]:reset()
|
||||
end
|
||||
if SCN.cur~='custom_field'then
|
||||
local colorList=THEME.getThemeColor()
|
||||
if not colorList then return end
|
||||
local rnd=math.random
|
||||
for _,W in next,list do
|
||||
if W.color and not W.fText then
|
||||
W.color=colorList[rnd(#colorList)]
|
||||
end
|
||||
end
|
||||
end
|
||||
onChange()
|
||||
end
|
||||
end
|
||||
function WIDGET.setScrollHeight(height)
|
||||
|
||||
104
main.lua
@@ -23,14 +23,14 @@ local fs=love.filesystem
|
||||
VERSION=require"version"
|
||||
TIME=love.timer.getTime
|
||||
YIELD=coroutine.yield
|
||||
SYSTEM=love.system.getOS()
|
||||
FNSF=SYSTEM:find'\79\83'--What does FNSF stand for? IDK so don't ask me lol
|
||||
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()
|
||||
|
||||
--Global Vars & Settings
|
||||
SFXPACKS={'chiptune'}
|
||||
VOCPACKS={'miya','mono','xiaoya','miku'}
|
||||
VOCPACKS={'miya',--[['mono',]]'xiaoya','miku'}
|
||||
FIRSTLAUNCH=false
|
||||
DAILYLAUNCH=false
|
||||
|
||||
@@ -60,7 +60,20 @@ FONT.setFallback('norm')
|
||||
SCR.setSize(1280,720)--Initialize Screen size
|
||||
BGM.setMaxSources(5)
|
||||
BGM.setChange(function(name)MES.new('music',text.nowPlaying..name,5)end)
|
||||
VOC.setDiversion(1)
|
||||
VOC.setDiversion(.62)
|
||||
|
||||
WIDGET.setOnChange(function()
|
||||
if SCN.cur~='custom_field'then
|
||||
local colorList=THEME.getThemeColor()
|
||||
if not colorList then return end
|
||||
local rnd=math.random
|
||||
for _,W in next,SCN.scenes[SCN.cur].widgetList do
|
||||
if W.color then
|
||||
W.color=colorList[rnd(#colorList)]
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Load Zframework: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
@@ -71,6 +84,9 @@ mStr=GC.mStr
|
||||
mText=GC.simpX
|
||||
mDraw=GC.draw
|
||||
Snd=SFX.playSample
|
||||
string.repD=STRING.repD
|
||||
string.sArg=STRING.sArg
|
||||
string.split=STRING.split
|
||||
|
||||
--Delete all naked files (from too old version)
|
||||
FILE.clear('')
|
||||
@@ -112,20 +128,17 @@ BOT= require'parts.bot'
|
||||
RSlist= require'parts.RSlist'DSCP=RSlist.TRS.centerPos
|
||||
PLY= require'parts.player'
|
||||
NETPLY= require'parts.netPlayer'
|
||||
MODES= require'parts.modes'
|
||||
MODETREE= require'parts.modeTree'
|
||||
|
||||
setmetatable(TEXTURE,{__index=function(self,k)
|
||||
MES.new('warn',"No texture called: "..k)
|
||||
self[k]=love.graphics.newCanvas(1,1)
|
||||
self[k]=PAPER
|
||||
return self[k]
|
||||
end})
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Load Parts: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
--Init Zframework
|
||||
Z.setIfPowerInfo(function()
|
||||
return SETTING.powerInfo and LOADED
|
||||
end)
|
||||
do--Z.setCursor
|
||||
local normImg=GC.DO{16,16,
|
||||
{'fCirc',8,8,4},
|
||||
@@ -171,6 +184,9 @@ Z.setOnFnKeys({
|
||||
function()for k,v in next,_G do print(k,v)end end,
|
||||
function()if love['_openConsole']then love['_openConsole']()end end,
|
||||
})
|
||||
Z.setOnResize(function(w,_)
|
||||
SHADER.warning:send('w',w*SCR.dpi)
|
||||
end)
|
||||
do--Z.setOnFocus
|
||||
local function task_autoSoundOff()
|
||||
while true do
|
||||
@@ -255,14 +271,17 @@ IMG.init{
|
||||
speedLimit='media/image/mess/speedLimit.png',--Not used, for future C2-mode
|
||||
pay1='media/image/mess/pay1.png',
|
||||
pay2='media/image/mess/pay2.png',
|
||||
drought='media/image/mess/drought.png',
|
||||
|
||||
miyaCH='media/image/characters/miya.png',
|
||||
miyaF1='media/image/characters/miya_f1.png',
|
||||
miyaF2='media/image/characters/miya_f2.png',
|
||||
miyaF3='media/image/characters/miya_f3.png',
|
||||
miyaF4='media/image/characters/miya_f4.png',
|
||||
miyaCH1='media/image/characters/miya1.png',
|
||||
miyaCH2='media/image/characters/miya2.png',
|
||||
miyaCH3='media/image/characters/miya3.png',
|
||||
miyaCH4='media/image/characters/miya4.png',
|
||||
miyaHeart='media/image/characters/miya_heart.png',
|
||||
miyaGlow='media/image/characters/miya_glow.png',
|
||||
monoCH='media/image/characters/mono.png',
|
||||
xiaoyaCH='media/image/characters/xiaoya.png',
|
||||
xiaoyaOmino='media/image/characters/xiaoya_Omino.png',
|
||||
mikuCH='media/image/characters/miku.png',
|
||||
electric='media/image/characters/electric.png',
|
||||
hbm='media/image/characters/hbm.png',
|
||||
@@ -279,7 +298,7 @@ IMG.init{
|
||||
SKIN.load{
|
||||
{name="crystal_scf",path='media/image/skin/crystal_scf.png'},
|
||||
{name="matte_mrz",path='media/image/skin/matte_mrz.png'},
|
||||
{name="shiny_cho",path='media/image/skin/shiny_cho.png'},
|
||||
{name="shiny_chno",path='media/image/skin/shiny_chno.png'},
|
||||
{name="contrast_mrz",path='media/image/skin/contrast_mrz.png'},
|
||||
{name="polkadots_scf",path='media/image/skin/polkadots_scf.png'},
|
||||
{name="toy_scf",path='media/image/skin/toy_scf.png'},
|
||||
@@ -302,6 +321,7 @@ SKIN.load{
|
||||
{name="classic",path='media/image/skin/classic_unknown.png'},
|
||||
{name="ball_shaw",path='media/image/skin/ball_shaw.png'},
|
||||
{name="retro_notypey",path='media/image/skin/retro_notypey.png'},
|
||||
{name="pixel_chno",path='media/image/skin/pixel_chno.png'},
|
||||
{name="textbone_mrz",path='media/image/skin/textbone_mrz.png'},
|
||||
{name="coloredbone_mrz",path='media/image/skin/coloredbone_mrz.png'},
|
||||
{name="wtf",path='media/image/skin/wtf_mrz.png'},
|
||||
@@ -317,11 +337,11 @@ SFX.init((function()--[Warning] Not loading files here, just get the list of sou
|
||||
end
|
||||
return L
|
||||
end)())
|
||||
BGM.init((function()
|
||||
BGM.load((function()
|
||||
local L={}
|
||||
for _,v in next,fs.getDirectoryItems('media/music')do
|
||||
if isSafeFile('media/music/'..v,"Dangerous file : %SAVE%/media/music/"..v)then
|
||||
table.insert(L,{name=v:sub(1,-5),path='media/music/'..v})
|
||||
L[v:sub(1,-5)]='media/music/'..v
|
||||
end
|
||||
end
|
||||
return L
|
||||
@@ -340,12 +360,13 @@ VOC.init{
|
||||
LANG.init('zh',
|
||||
{
|
||||
zh=require'parts.language.lang_zh',
|
||||
zh_full=require'parts.language.lang_zh_full',
|
||||
zh_trad=require'parts.language.lang_zh_trad',
|
||||
zh_full=require'parts.language.lang_zh_full',
|
||||
en=require'parts.language.lang_en',
|
||||
fr=require'parts.language.lang_fr',
|
||||
es=require'parts.language.lang_es',
|
||||
pt=require'parts.language.lang_pt',
|
||||
id=require'parts.language.lang_id',
|
||||
zh_grass=require'parts.language.lang_zh_grass',
|
||||
zh_yygq=require'parts.language.lang_yygq',
|
||||
symbol=require'parts.language.lang_symbol',
|
||||
@@ -389,24 +410,6 @@ for _,v in next,fs.getDirectoryItems('parts/scenes')do
|
||||
LANG.addScene(sceneName)
|
||||
end
|
||||
end
|
||||
--Load mode files
|
||||
for i=1,#MODES do
|
||||
local m=MODES[i]--Mode template
|
||||
if isSafeFile('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
|
||||
local M={name=v:sub(1,-5)}
|
||||
local modeData=require('parts.modes.'..M.name)
|
||||
if modeData.env then
|
||||
TABLE.complete(modeData,M)
|
||||
MODES[M.name]=M
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Load Files: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
@@ -463,6 +466,9 @@ do
|
||||
SETTING.dascut=SETTING.dascut+1
|
||||
needSave=true
|
||||
end
|
||||
if SETTING.vocPack=='mono'then
|
||||
SETTING.vocPack='miya'
|
||||
end
|
||||
if RANKS.stack_e then
|
||||
RANKS.stack_e=nil
|
||||
RANKS.stack_h=nil
|
||||
@@ -519,6 +525,8 @@ do
|
||||
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 SETTING.skin[18]==10 then SETTING.skin[18]=4 end
|
||||
if SETTING.reTime>3 or SETTING.reTime<.5 then SETTING.reTime=2 end
|
||||
if RANKS.infinite then RANKS.infinite=0 end
|
||||
if RANKS.infinite_dig then RANKS.infinite_dig=0 end
|
||||
if not RANKS.sprint_10l then RANKS.sprint_10l=0 end
|
||||
@@ -529,26 +537,8 @@ do
|
||||
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
|
||||
RANKS[unlockName]=0
|
||||
needSave=true
|
||||
end
|
||||
end
|
||||
end
|
||||
if not(M and M.x)then
|
||||
RANKS[name]=nil
|
||||
needSave=true
|
||||
end
|
||||
end
|
||||
end
|
||||
if not MODES[STAT.lastPlay]then
|
||||
STAT.lastPlay='sprint_10l'
|
||||
needSave=true
|
||||
end
|
||||
|
||||
if needSave then
|
||||
saveStats()
|
||||
@@ -567,7 +557,7 @@ if FIRSTLAUNCH and MOBILE then
|
||||
end
|
||||
|
||||
--Apply system setting
|
||||
applyAllSettings()
|
||||
applySettings()
|
||||
|
||||
--Load replays
|
||||
for _,fileName in next,fs.getDirectoryItems('replay')do
|
||||
@@ -645,9 +635,9 @@ if TABLE.find(arg,'--test')then
|
||||
TASK.new(function()
|
||||
while true do
|
||||
YIELD()
|
||||
if Z.errData[1]then break end
|
||||
if Z.getErr(1)then break end
|
||||
end
|
||||
LOG("\27[91m\27[1mAutomatic Test Failed :(\27[0m\nThe error message is:\n"..table.concat(Z.errData[1].mes,"\n").."\27[91m\nAborting\27[0m")
|
||||
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)
|
||||
|
||||
BIN
media/effect/chiptune/back.ogg
Normal file
|
Before Width: | Height: | Size: 74 KiB |
BIN
media/image/characters/miya1.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
media/image/characters/miya2.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
media/image/characters/miya3.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
media/image/characters/miya4.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
BIN
media/image/characters/miya_glow.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
media/image/characters/miya_heart.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
BIN
media/image/characters/xiaoya_Omino.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 552 B |
|
Before Width: | Height: | Size: 534 B |
|
Before Width: | Height: | Size: 603 B |
|
Before Width: | Height: | Size: 483 B |
|
Before Width: | Height: | Size: 207 B |
|
Before Width: | Height: | Size: 324 B |
|
Before Width: | Height: | Size: 275 B |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 283 B |
|
Before Width: | Height: | Size: 489 B |
|
Before Width: | Height: | Size: 272 B |
|
Before Width: | Height: | Size: 338 B |
|
Before Width: | Height: | Size: 403 B |
|
Before Width: | Height: | Size: 434 B |
|
Before Width: | Height: | Size: 464 B |
|
Before Width: | Height: | Size: 347 B |
|
Before Width: | Height: | Size: 395 B |
|
Before Width: | Height: | Size: 457 B |
|
Before Width: | Height: | Size: 1.2 KiB |
BIN
media/image/skin/pixel_chno.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 41 KiB |
BIN
media/music/lounge.ogg
Normal file
@@ -376,8 +376,8 @@ do
|
||||
},--R
|
||||
false,--Y
|
||||
{
|
||||
[01]={'+0+0','-1+0','-1+1','+0+1','+1+0','-1+2','-2+0','+0-2'},
|
||||
[10]={'+0+0','+1+0','-1+0','+0-1','+1-1','+1-2','+2+0','+0+2'},
|
||||
[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'},
|
||||
[03]={'+0+0','-1+0','+1-1','+0-2','+0-3','+1+0','+1-2','+1-3','+0+1','-1+1'},
|
||||
[30]={'+0+0','-1+0','+1-1','+1-2','+1+0','+0-2','+1-3','-1+2','+0+3','-1+3'},
|
||||
[12]={'+0+0','-1+0','+1-1','-1-1','+1-2','+1+0','+0-2','+1-3','-1+2','+0+3','-1+3'},
|
||||
|
||||
@@ -22,12 +22,12 @@ function back.resize(w,h)
|
||||
S[i+4]=(rnd()-.5)*.01*s--Vy
|
||||
end
|
||||
end
|
||||
function back.update()
|
||||
function back.update(dt)
|
||||
local S=stars
|
||||
--Star moving
|
||||
for i=1,1260,5 do
|
||||
S[i+1]=(S[i+1]+S[i+3])%W
|
||||
S[i+2]=(S[i+2]+S[i+4])%H
|
||||
S[i+1]=(S[i+1]+S[i+3]*dt*60)%W
|
||||
S[i+2]=(S[i+2]+S[i+4]*dt*60)%H
|
||||
end
|
||||
end
|
||||
function back.draw()
|
||||
|
||||
@@ -25,8 +25,8 @@ function bot_cc:revive()
|
||||
self.P:loadAI(self.data)
|
||||
end
|
||||
function bot_cc:pushNewNext(id)
|
||||
self.ccBot:addNext(rem(self.nexts,1))
|
||||
ins(self.nexts,id)
|
||||
self.ccBot:addNext(rem(self.bufferedNexts,1))
|
||||
ins(self.bufferedNexts,id)
|
||||
end
|
||||
function bot_cc:thread()
|
||||
local P,keys=self.P,self.keys
|
||||
|
||||
@@ -12,7 +12,7 @@ local baseBot={
|
||||
function baseBot.update(bot)
|
||||
local P=bot.P
|
||||
local keys=bot.keys
|
||||
if P.control and P.waiting==0 then
|
||||
if P.control and P.cur then
|
||||
bot.delay=bot.delay-1
|
||||
if not keys[1]then
|
||||
if bot.runningThread then
|
||||
@@ -85,7 +85,7 @@ function BOT.new(P,data)
|
||||
if data.type=="CC"then
|
||||
P:setRS('SRS')
|
||||
bot.keys={}
|
||||
bot.nexts={}
|
||||
bot.bufferedNexts={}
|
||||
bot.delay=data.delay
|
||||
bot.delay0=data.delay
|
||||
if P.gameEnv.holdCount>1 then
|
||||
@@ -109,20 +109,25 @@ function BOT.new(P,data)
|
||||
return
|
||||
self.ccBot[k]and function(_,...)self.ccBot[k](self.ccBot,...)end or
|
||||
cc_lua[k]and function(_,...)cc_lua[k](self,...)end or
|
||||
baseBot[k]and baseBot[k]or
|
||||
error("No actions called "..k)
|
||||
assert(baseBot[k],"No CC action called "..k)
|
||||
end})
|
||||
|
||||
for i,B in next,P.nextQueue do
|
||||
if i<=data.next then
|
||||
local pushed=0
|
||||
if P.cur then
|
||||
bot:addNext(P.cur.id)
|
||||
pushed=pushed+1
|
||||
end
|
||||
for _,B in next,P.nextQueue do
|
||||
if pushed<=data.next then
|
||||
bot:addNext(B.id)
|
||||
pushed=pushed+1
|
||||
else
|
||||
ins(bot.nexts,B.id)
|
||||
ins(bot.bufferedNexts,B.id)
|
||||
end
|
||||
end
|
||||
bot.runningThread=coroutine.wrap(cc_lua.thread)
|
||||
bot.runningThread(bot)
|
||||
elseif data.type=="9S"or true then--9s or else
|
||||
else--if data.type=="9S"then--9s or else
|
||||
TABLE.cover(baseBot,bot)
|
||||
TABLE.cover(require"parts.bot.bot_9s",bot)
|
||||
P:setRS('TRS')
|
||||
|
||||
18
parts/eventsets/bigWallGen.lua
Normal file
@@ -0,0 +1,18 @@
|
||||
return{
|
||||
hook_drop=function(P)
|
||||
if P.lastPiece.row>0 then
|
||||
for _=1,#P.clearedRow do
|
||||
local h=#P.field
|
||||
P.field[h+1]=LINE.new(20)
|
||||
P.visTime[h+1]=LINE.new(20)
|
||||
for i=3,7 do P.field[h+1][i]=0 end
|
||||
end
|
||||
if P.combo>P.modeData.maxCombo then
|
||||
P.modeData.maxCombo=P.combo
|
||||
end
|
||||
if P.stat.row>=200 then
|
||||
P:win('finish')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
39
parts/eventsets/big_h.lua
Normal file
@@ -0,0 +1,39 @@
|
||||
return
|
||||
{
|
||||
drop=1,
|
||||
wait=8,
|
||||
fall=20,
|
||||
fieldH=10,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
end,
|
||||
task=function(P)
|
||||
local F=P.field
|
||||
for i=1,24 do
|
||||
F[i]=LINE.new(20)
|
||||
P.visTime[i]=LINE.new(20)
|
||||
for x=3,7 do F[i][x]=0 end
|
||||
end
|
||||
P.modeData.target=50
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.stat.row>=P.modeData.target then
|
||||
if P.modeData.target==50 then
|
||||
P.gameEnv.drop=.5
|
||||
P.modeData.target=100
|
||||
SFX.play('reach')
|
||||
elseif P.modeData.target==100 then
|
||||
P.gameEnv.drop=.25
|
||||
P.modeData.target=150
|
||||
SFX.play('reach')
|
||||
elseif P.modeData.target==150 then
|
||||
P:set20G(true)
|
||||
P.modeData.target=200
|
||||
SFX.play('reach')
|
||||
else
|
||||
P:win('finish')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
33
parts/eventsets/big_n.lua
Normal file
@@ -0,0 +1,33 @@
|
||||
local dropSpeed={100,80,60,48,36,28,20,16,12,10,8,6,4,2,2,1,1,.5,.5}
|
||||
|
||||
return
|
||||
{
|
||||
drop=120,
|
||||
wait=8,
|
||||
fall=20,
|
||||
fieldH=10,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
end,
|
||||
task=function(P)
|
||||
local F=P.field
|
||||
for i=1,24 do
|
||||
F[i]=LINE.new(20)
|
||||
P.visTime[i]=LINE.new(20)
|
||||
for x=3,7 do F[i][x]=0 end
|
||||
end
|
||||
P.modeData.target=10
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.stat.row>=P.modeData.target then
|
||||
if P.modeData.target==200 then
|
||||
P:win('finish')
|
||||
else
|
||||
P.gameEnv.drop=dropSpeed[P.modeData.target/10]
|
||||
P.modeData.target=P.modeData.target+10
|
||||
SFX.play('reach')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
@@ -10,7 +10,7 @@ return{
|
||||
end
|
||||
setField(P,D.finished+1)
|
||||
SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.6,.8,.6)
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
else
|
||||
P:win('finish')
|
||||
end
|
||||
|
||||
@@ -28,7 +28,7 @@ return{
|
||||
end
|
||||
setFont(50)
|
||||
mStr(P.modeData.drought,63,130)
|
||||
mDraw(MODES.drought_l.icon,63,200,nil,.5)
|
||||
mDraw(IMG.drought,63,200,nil,.5)
|
||||
end
|
||||
end,
|
||||
task=function(P)
|
||||
@@ -41,15 +41,15 @@ return{
|
||||
if D.target==110 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=5,5
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=5,5
|
||||
SFX.play('blip_2',.7)
|
||||
SFX.play('warn_2',.7)
|
||||
elseif D.target==140 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=4,4
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=4,4
|
||||
SFX.play('blip_2',.7)
|
||||
SFX.play('warn_2',.7)
|
||||
elseif D.target==170 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=3,3
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=3,3
|
||||
SFX.play('blip_2',.7)
|
||||
SFX.play('warn_2',.7)
|
||||
elseif D.target==200 then
|
||||
P:win('finish')
|
||||
return
|
||||
|
||||
@@ -28,7 +28,7 @@ return{
|
||||
end
|
||||
setFont(50)
|
||||
mStr(P.modeData.drought,63,130)
|
||||
mDraw(MODES.drought_l.icon,63,200,nil,.5)
|
||||
mDraw(IMG.drought,63,200,nil,.5)
|
||||
end
|
||||
end,
|
||||
task=function(P)
|
||||
@@ -36,11 +36,12 @@ return{
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
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==110 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=2,2
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=2,2
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.target==200 then
|
||||
P:win('finish')
|
||||
return
|
||||
|
||||
@@ -28,7 +28,7 @@ return{
|
||||
end
|
||||
setFont(50)
|
||||
mStr(P.modeData.drought,63,130)
|
||||
mDraw(MODES.drought_l.icon,63,200,nil,.5)
|
||||
mDraw(IMG.drought,63,200,nil,.5)
|
||||
end
|
||||
end,
|
||||
task=function(P)
|
||||
@@ -36,6 +36,7 @@ return{
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
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==100 then
|
||||
P:win('finish')
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
local dropSpeed={50,40,30,24,18,14,10,8,6,5,4,3,2,1,1,.5,.5,.25,.25}
|
||||
local dropSpeed={50,40,30,24,18,13,9,6,4,3,2,2,1,1,.5,.5,.5,.25,.25}
|
||||
|
||||
return
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ return{
|
||||
D.pt=D.pt+s
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
s=D.target/100--range from 1 to 9
|
||||
local E=P.gameEnv
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
local death_lock={12,11,10,9,8, 7,7,7,7,6}
|
||||
local death_wait={10,9, 8, 7,6, 6,6,5,5,4}
|
||||
local death_fall={10,9, 8, 7,6, 6,5,5,4,4}
|
||||
local death_lock={12,11,10,9,8, 8,8,7,7,6}
|
||||
local death_wait={10,9, 8, 7,6, 7,6,6,5,5}
|
||||
local death_fall={10,9, 8, 7,6, 7,6,5,5,5}
|
||||
|
||||
return{
|
||||
drop=0,
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
D.pt=D.pt+s
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
s=D.target/100
|
||||
local E=P.gameEnv
|
||||
|
||||
80
parts/eventsets/master_instinct.lua
Normal file
@@ -0,0 +1,80 @@
|
||||
local inv_lock={60,50,45,40,37, 34,32,30,28,26}
|
||||
local inv_wait={12,11,11,10,10, 10,10, 9, 9, 9}
|
||||
local inv_fall={18,16,14,13,12, 12,11,11,10,10}
|
||||
local inv_hide={20,17,14,11, 8, 5, 3, 2, 1, 0}
|
||||
local hidetimer=0
|
||||
local held=false
|
||||
|
||||
return{
|
||||
drop=0,
|
||||
lock=inv_lock[1],
|
||||
wait=inv_wait[1],
|
||||
fall=inv_fall[1],
|
||||
ghost=false,
|
||||
noTele=true,
|
||||
das=10,arr=1,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
local D=P.modeData
|
||||
|
||||
local c=#P.clearedRow
|
||||
if c==0 and D.pt%100==99 then return end
|
||||
local s=c<3 and c+1 or c==3 and 5 or 7
|
||||
if P.combo>7 then s=s+2
|
||||
elseif P.combo>3 then s=s+1
|
||||
end
|
||||
D.pt=D.pt+s
|
||||
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
|
||||
end
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
s=D.target/100
|
||||
local E=P.gameEnv
|
||||
E.lock=inv_lock[s]
|
||||
E.wait=inv_wait[s]
|
||||
E.fall=inv_fall[s]
|
||||
|
||||
if s==2 then
|
||||
E.das=8
|
||||
elseif s==4 then
|
||||
BG.set('rgb')
|
||||
elseif s==5 then
|
||||
E.das=7
|
||||
elseif s==7 then
|
||||
E.das=6
|
||||
BGM.play('far')
|
||||
elseif s==10 then
|
||||
D.pt=1000
|
||||
P:win('finish')
|
||||
return
|
||||
end
|
||||
D.target=D.target+100
|
||||
P:stageComplete(s)
|
||||
SFX.play('reach')
|
||||
end
|
||||
end,
|
||||
task=function(P)
|
||||
P.modeData.pt=0
|
||||
P.modeData.target=100
|
||||
while true do
|
||||
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
|
||||
P.gameEnv.block=false
|
||||
else
|
||||
P.gameEnv.block=true
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
D.pt=D.pt+s
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
s=D.target/100
|
||||
local E=P.gameEnv
|
||||
|
||||
@@ -147,7 +147,7 @@ return
|
||||
|
||||
P.modeData.target=260
|
||||
p=260
|
||||
SFX.play('blip_2')
|
||||
SFX.play('warn_2')
|
||||
SFX.play('reach')
|
||||
else
|
||||
p=260
|
||||
|
||||
@@ -5,15 +5,22 @@ local setFont=setFont
|
||||
local PLAYERS,PLY_ALIVE=PLAYERS,PLY_ALIVE
|
||||
|
||||
return{
|
||||
layout='royale',
|
||||
fkey1=function(P)
|
||||
P:changeAtkMode(P.atkMode<3 and P.atkMode+2 or 5-P.atkMode)
|
||||
P.swappingAtkMode=45
|
||||
end,
|
||||
mesDisp=function(P)
|
||||
setFont(35)
|
||||
mStr(#PLY_ALIVE.."/"..#PLAYERS,63,175)
|
||||
mStr(P.modeData.ko,80,215)
|
||||
gc_draw(TEXTOBJ.ko,60-TEXTOBJ.ko:getWidth(),222)
|
||||
|
||||
setFont(20)
|
||||
gc_setColor(1,.5,0,.6)
|
||||
gc_print(P.badge,103,227)
|
||||
gc_setColor(.97,.97,.97)
|
||||
|
||||
setFont(25)
|
||||
mStr(text.powerUp[P.strength],63,290)
|
||||
gc_setColor(1,1,1)
|
||||
|
||||
38
parts/eventsets/strategy_e_plus.lua
Normal file
@@ -0,0 +1,38 @@
|
||||
local waitSpeed={60,59,58,57,56,55,54,52,50,48,46,44,42,40,38,36,34,32,30}
|
||||
|
||||
return
|
||||
{
|
||||
holdCount=0,
|
||||
das=5,arr=1,
|
||||
drop=0,lock=7,
|
||||
wait=60,fall=0,
|
||||
freshLimit=12,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
end,
|
||||
task=function(P)
|
||||
P.modeData.target=10
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.stat.row>=P.modeData.target then
|
||||
if P.modeData.target==200 then
|
||||
P:win('finish')
|
||||
else
|
||||
if P.modeData.target==40 then
|
||||
BG.set('rainbow')
|
||||
elseif P.modeData.target==80 then
|
||||
BG.set('rainbow2')
|
||||
elseif P.modeData.target==100 then
|
||||
BG.set('glow')
|
||||
P.modeData.lock=6
|
||||
elseif P.modeData.target==120 then
|
||||
BG.set('lightning')
|
||||
end
|
||||
P.gameEnv.wait=waitSpeed[P.modeData.target/10]
|
||||
P.modeData.target=P.modeData.target+10
|
||||
SFX.play('reach')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
39
parts/eventsets/strategy_h_plus.lua
Normal file
@@ -0,0 +1,39 @@
|
||||
local waitSpeed={30,29,28,27,26,25,24,23,22,21,20,19,18,18,17,17,16,16,15}
|
||||
|
||||
return
|
||||
{
|
||||
holdCount=0,
|
||||
das=4,arr=1,
|
||||
drop=0,lock=6,
|
||||
wait=30,fall=0,
|
||||
freshLimit=12,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
end,
|
||||
task=function(P)
|
||||
P.modeData.target=10
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.stat.row>=P.modeData.target then
|
||||
if P.modeData.target==200 then
|
||||
P:win('finish')
|
||||
else
|
||||
if P.modeData.target==40 then
|
||||
BG.set('rainbow')
|
||||
elseif P.modeData.target==80 then
|
||||
BG.set('rainbow2')
|
||||
elseif P.modeData.target==100 then
|
||||
BG.set('glow')
|
||||
P.modeData.lock=5
|
||||
BGM.play('secret8th remix')
|
||||
elseif P.modeData.target==120 then
|
||||
BG.set('lightning')
|
||||
end
|
||||
P.gameEnv.wait=waitSpeed[P.modeData.target/10]
|
||||
P.modeData.target=P.modeData.target+10
|
||||
SFX.play('reach')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
39
parts/eventsets/strategy_u_plus.lua
Normal file
@@ -0,0 +1,39 @@
|
||||
local waitSpeed={15,15,14,14,13,13,12,12,11,11,10,10,9,9,8,8,7,7,7}
|
||||
|
||||
return
|
||||
{
|
||||
holdCount=0,
|
||||
das=3,arr=1,
|
||||
drop=0,lock=5,
|
||||
wait=15,fall=0,
|
||||
freshLimit=12,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
end,
|
||||
task=function(P)
|
||||
P.modeData.target=10
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.stat.row>=P.modeData.target then
|
||||
if P.modeData.target==200 then
|
||||
P:win('finish')
|
||||
else
|
||||
if P.modeData.target==40 then
|
||||
BG.set('rainbow')
|
||||
elseif P.modeData.target==80 then
|
||||
BG.set('rainbow2')
|
||||
elseif P.modeData.target==100 then
|
||||
BG.set('glow')
|
||||
P.modeData.lock=4
|
||||
BGM.play('secret7th remix')
|
||||
elseif P.modeData.target==120 then
|
||||
BG.set('lightning')
|
||||
end
|
||||
P.gameEnv.wait=waitSpeed[P.modeData.target/10]
|
||||
P.modeData.target=P.modeData.target+10
|
||||
SFX.play('reach')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
@@ -7,6 +7,7 @@ local gc_draw,gc_rectangle,gc_line,gc_printf=gc.draw,gc.rectangle,gc.line,gc.pri
|
||||
|
||||
local ins,rem=table.insert,table.remove
|
||||
local int,rnd=math.floor,math.random
|
||||
local approach=MATH.expApproach
|
||||
|
||||
local SETTING,GAME,SCR=SETTING,GAME,SCR
|
||||
local PLAYERS=PLAYERS
|
||||
@@ -79,7 +80,7 @@ do--function loadFile(name,args), function saveFile(data,name,args)
|
||||
local text=text or t
|
||||
local res,mes=pcall(FILE.save,data,name,args)
|
||||
if res then
|
||||
return mes
|
||||
return true
|
||||
else
|
||||
MES.new('error',
|
||||
mes:find'duplicate'and
|
||||
@@ -94,7 +95,8 @@ do--function loadFile(name,args), function saveFile(data,name,args)
|
||||
end
|
||||
end
|
||||
function isSafeFile(file,mes)
|
||||
if love.filesystem.getRealDirectory(file)~=SAVEDIR then
|
||||
local path=love.filesystem.getRealDirectory(file)
|
||||
if path and path~=SAVEDIR then
|
||||
return true
|
||||
elseif mes then
|
||||
MES.new('warn',mes)
|
||||
@@ -109,23 +111,7 @@ end
|
||||
function saveSettings()
|
||||
return saveFile(SETTING,'conf/settings')
|
||||
end
|
||||
function applyLanguage()
|
||||
text=LANG.get(SETTING.locale)
|
||||
WIDGET.setLang(text.WidgetText)
|
||||
for k,v in next,TEXTOBJ do
|
||||
if rawget(text,k)then
|
||||
v:set(text[k])
|
||||
end
|
||||
end
|
||||
end
|
||||
function applyCursor()
|
||||
love.mouse.setVisible(SETTING.sysCursor)
|
||||
end
|
||||
function applyFullscreen()
|
||||
love.window.setFullscreen(SETTING.fullscreen)
|
||||
love.resize(gc.getWidth(),gc.getHeight())
|
||||
end
|
||||
do--function applyBlockSatur,applyFieldSatur(mode)
|
||||
do--function applySettings()
|
||||
local saturateValues={
|
||||
normal={0,1},
|
||||
soft={.2,.7},
|
||||
@@ -133,58 +119,79 @@ do--function applyBlockSatur,applyFieldSatur(mode)
|
||||
light={.2,.8},
|
||||
color={-.2,1.2},
|
||||
}
|
||||
function applyBlockSatur(mode)
|
||||
local m=saturateValues[mode]or saturateValues.normal
|
||||
function applySettings()
|
||||
--Apply fullscreen
|
||||
love.window.setFullscreen(SETTING.fullscreen)
|
||||
love.resize(gc.getWidth(),gc.getHeight())
|
||||
|
||||
--Apply Zframework setting
|
||||
Z.setClickFX(SETTING.clickFX)
|
||||
Z.setFrameMul(SETTING.frameMul)
|
||||
Z.setPowerInfo(SETTING.powerInfo)
|
||||
Z.setCleanCanvas(SETTING.cleanCanvas)
|
||||
|
||||
--Apply VK shape
|
||||
VK.setShape(SETTING.VKSkin)
|
||||
|
||||
--Apply sound
|
||||
love.audio.setVolume(SETTING.mainVol)
|
||||
BGM.setVol(SETTING.bgm)
|
||||
SFX.setVol(SETTING.sfx)
|
||||
VOC.setVol(SETTING.voc)
|
||||
|
||||
--Apply saturs
|
||||
local m
|
||||
m=saturateValues[SETTING.blockSatur]or saturateValues.normal
|
||||
SHADER.blockSatur:send('b',m[1])
|
||||
SHADER.blockSatur:send('k',m[2])
|
||||
end
|
||||
function applyFieldSatur(mode)
|
||||
local m=saturateValues[mode]or saturateValues.normal
|
||||
m=saturateValues[SETTING.fieldSatur]or saturateValues.normal
|
||||
SHADER.fieldSatur:send('b',m[1])
|
||||
SHADER.fieldSatur:send('k',m[2])
|
||||
end
|
||||
end
|
||||
function applyBG()
|
||||
if SETTING.bg=='on'then
|
||||
BG.unlock()
|
||||
BG.set()
|
||||
elseif SETTING.bg=='off'then
|
||||
BG.unlock()
|
||||
BG.set('gray')
|
||||
BG.send(SETTING.bgAlpha)
|
||||
BG.lock()
|
||||
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()
|
||||
BG.set('custom')
|
||||
gc.setDefaultFilter('linear','linear')
|
||||
BG.send(SETTING.bgAlpha,image)
|
||||
gc.setDefaultFilter('nearest','nearest')
|
||||
BG.lock()
|
||||
else
|
||||
MES.new('error',text.customBGloadFailed)
|
||||
|
||||
--Apply language
|
||||
text=LANG.get(SETTING.locale)
|
||||
WIDGET.setLang(text.WidgetText)
|
||||
for k,v in next,TEXTOBJ do
|
||||
if rawget(text,k)then
|
||||
v:set(text[k])
|
||||
end
|
||||
end
|
||||
|
||||
--Apply cursor
|
||||
love.mouse.setVisible(SETTING.sysCursor)
|
||||
|
||||
--Apply BG
|
||||
if SETTING.bg=='on'then
|
||||
BG.unlock()
|
||||
BG.set()
|
||||
elseif SETTING.bg=='off'then
|
||||
BG.unlock()
|
||||
BG.set('gray')
|
||||
BG.send(SETTING.bgAlpha)
|
||||
BG.lock()
|
||||
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()
|
||||
BG.set('custom')
|
||||
gc.setDefaultFilter('linear','linear')
|
||||
BG.send(SETTING.bgAlpha,image)
|
||||
gc.setDefaultFilter('nearest','nearest')
|
||||
BG.lock()
|
||||
else
|
||||
MES.new('error',text.customBGloadFailed)
|
||||
end
|
||||
else--Switch off when custom BG not found
|
||||
SETTING.bg='off'
|
||||
BG.unlock()
|
||||
BG.set('gray')
|
||||
BG.send(SETTING.bgAlpha)
|
||||
BG.lock()
|
||||
end
|
||||
else
|
||||
SETTING.bg='off'
|
||||
applyBG()
|
||||
end
|
||||
end
|
||||
end
|
||||
function applyAllSettings()
|
||||
applyFullscreen()
|
||||
love.audio.setVolume(SETTING.mainVol)
|
||||
VK.setShape(SETTING.VKSkin)
|
||||
BGM.setVol(SETTING.bgm)
|
||||
SFX.setVol(SETTING.sfx)
|
||||
VOC.setVol(SETTING.voc)
|
||||
applyBlockSatur(SETTING.blockSatur)
|
||||
applyFieldSatur(SETTING.fieldSatur)
|
||||
applyLanguage()
|
||||
applyCursor()
|
||||
applyBG()
|
||||
end
|
||||
|
||||
--Royale mode
|
||||
function randomTarget(P)--Return a random opponent for P
|
||||
@@ -252,17 +259,17 @@ function royaleLevelup()
|
||||
BGM.play('cruelty')
|
||||
end
|
||||
elseif GAME.stage==4 then
|
||||
spd=10
|
||||
spd=8
|
||||
for _,P in next,PLY_ALIVE do
|
||||
P.gameEnv.pushSpeed=3
|
||||
end
|
||||
elseif GAME.stage==5 then
|
||||
spd=5
|
||||
spd=4
|
||||
for _,P in next,PLY_ALIVE do
|
||||
P.gameEnv.garbageSpeed=1
|
||||
end
|
||||
elseif GAME.stage==6 then
|
||||
spd=3
|
||||
spd=2
|
||||
if PLAYERS[1].alive then
|
||||
BGM.play('final')
|
||||
end
|
||||
@@ -273,7 +280,7 @@ function royaleLevelup()
|
||||
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*.3)
|
||||
P.gameEnv.drop=int(P.gameEnv.drop*.4)
|
||||
if P.gameEnv.drop==0 then
|
||||
P.curY=P.ghoY
|
||||
P:set20G(true)
|
||||
@@ -491,12 +498,9 @@ end
|
||||
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
|
||||
MODES[mode]=require('parts.modes.'..mode)
|
||||
MODES[mode].name=mode
|
||||
end
|
||||
if MODES[mode].score then
|
||||
STAT.lastPlay=mode
|
||||
if not MODES[mode].available then
|
||||
MES.new('error',"Unavailable mode: "..mode)
|
||||
return
|
||||
end
|
||||
GAME.playing=true
|
||||
GAME.init=true
|
||||
@@ -537,29 +541,9 @@ function gameOver()--Save record
|
||||
GAME.rank=R
|
||||
end
|
||||
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
|
||||
RANKS[M.name]=R
|
||||
needSave=true
|
||||
end
|
||||
if R>0 then
|
||||
if M.unlock then
|
||||
for i=1,#M.unlock do
|
||||
local m=M.unlock[i]
|
||||
local n=MODES[m].name
|
||||
if not RANKS[n]then
|
||||
if MODES[m].x then
|
||||
RANKS[n]=0
|
||||
end
|
||||
needSave=true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if needSave then
|
||||
saveProgress()
|
||||
end
|
||||
if not RANKS[M.name]or R>RANKS[M.name]then--Old rank exist
|
||||
RANKS[M.name]=R
|
||||
saveProgress()
|
||||
end
|
||||
local D=M.score(P)
|
||||
local L=M.records
|
||||
@@ -771,7 +755,7 @@ do--function resetGameData(args)
|
||||
BGM.play(type(bgm)=='string'and bgm or type(bgm)=='table'and bgm[math.random(#bgm)])
|
||||
|
||||
TEXT.clear()
|
||||
if GAME.modeEnv.royaleMode then
|
||||
if GAME.modeEnv.eventSet=='royale'then
|
||||
for i=1,#PLAYERS do
|
||||
PLAYERS[i]:changeAtk(randomTarget(PLAYERS[i]))
|
||||
end
|
||||
@@ -792,7 +776,7 @@ do--function resetGameData(args)
|
||||
end
|
||||
do--function checkWarning()
|
||||
local max=math.max
|
||||
function checkWarning()
|
||||
function checkWarning(dt)
|
||||
local P1=PLAYERS[1]
|
||||
if P1.alive then
|
||||
if P1.frameRun%26==0 then
|
||||
@@ -812,13 +796,13 @@ do--function checkWarning()
|
||||
end
|
||||
local _=GAME.warnLVL
|
||||
if _<GAME.warnLVL0 then
|
||||
_=_*.95+GAME.warnLVL0*.05
|
||||
_=approach(_,GAME.warnLVL0,dt*6)
|
||||
elseif _>0 then
|
||||
_=max(_-.026,0)
|
||||
end
|
||||
GAME.warnLVL=_
|
||||
if GAME.warnLVL>1.126 and P1.frameRun%30==0 then
|
||||
SFX.fplay('warning',SETTING.sfx_warn)
|
||||
SFX.fplay('warn_beep',SETTING.sfx_warn)
|
||||
end
|
||||
elseif GAME.warnLVL>0 then
|
||||
GAME.warnLVL=max(GAME.warnLVL-.026,0)
|
||||
@@ -856,7 +840,7 @@ do--function drawSelfProfile()
|
||||
|
||||
--Draw avatar
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(.3,.3,.3,.8)gc_rectangle('fill',0,0,-300,80)
|
||||
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)
|
||||
|
||||
@@ -13,6 +13,13 @@ BLOCK_COLORS={
|
||||
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_BASE_COLORS={
|
||||
{.1,.2,.3},
|
||||
{.3,.42,.32},
|
||||
{.45,.44,.15},
|
||||
{.42,.25,.2},
|
||||
{.42,.15,.4},
|
||||
}
|
||||
RANK_COLORS={
|
||||
{.8,.86,.9},
|
||||
{.6,.9,.7},
|
||||
@@ -594,7 +601,7 @@ do--Userdata tables
|
||||
FTLock=true,
|
||||
|
||||
--System
|
||||
reTime=4,
|
||||
reTime=2,
|
||||
allowTAS=false,
|
||||
autoPause=true,
|
||||
menuPos='middle',
|
||||
@@ -603,11 +610,13 @@ do--Userdata tables
|
||||
autoLogin=true,
|
||||
simpMode=false,
|
||||
sysCursor=true,
|
||||
maxFPS=60,
|
||||
frameMul=100,
|
||||
locale='zh',
|
||||
skinSet='crystal_scf',
|
||||
skin={
|
||||
1,7,11,3,14,4,9,
|
||||
1,7,2,6,10,2,13,5,9,15,10,11,3,12,2,16,8,4,
|
||||
1,7,2,6,10,2,13,5,9,15,4,11,3,12,2,16,8,4,
|
||||
10,13,2,8
|
||||
},
|
||||
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},
|
||||
@@ -625,7 +634,6 @@ do--Userdata tables
|
||||
splashFX=2,
|
||||
shakeFX=2,
|
||||
atkFX=2,
|
||||
frameMul=100,
|
||||
cleanCanvas=false,
|
||||
blockSatur='normal',
|
||||
fieldSatur='normal',
|
||||
@@ -723,3 +731,44 @@ do--Userdata tables
|
||||
todayTime=0,
|
||||
}
|
||||
end
|
||||
do--Mode data tables
|
||||
MODES=setmetatable({},{__index=function(self,name)
|
||||
local M
|
||||
if love.filesystem.getInfo('parts/modes/'..name..'.lua')and love.filesystem.getRealDirectory('parts/modes/'..name..'.lua')~=SAVEDIR then
|
||||
M=require('parts.modes.'..name)
|
||||
M.available=true
|
||||
M.name=name
|
||||
do--Check if need slowmark
|
||||
for k in next,M.env do
|
||||
if
|
||||
k=='mindas'or k=='minarr'or
|
||||
k=='das'or k=='arr'or
|
||||
k=='minsdarr'
|
||||
then
|
||||
M.slowMark=true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
if M.score then
|
||||
M.records=loadFile("record/"..name..".rec",'-luaon -canSkip')or{}
|
||||
end
|
||||
else
|
||||
M={
|
||||
available=false,
|
||||
}
|
||||
MES.new('error',"Failed to load mode file: "..name)
|
||||
end
|
||||
self[name]=M
|
||||
return M
|
||||
end})
|
||||
MODEICON=setmetatable({},{__index=function(self,k)
|
||||
if isSafeFile('media/image/modeicon/'..k..'.png')then
|
||||
local img=love.graphics.newImage('media/image/modeicon/'..k..'.png')
|
||||
self[k]=img
|
||||
return img
|
||||
else
|
||||
return PAPER
|
||||
end
|
||||
end})
|
||||
end
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
local HDsearch="https://harddrop.com/wiki?search="
|
||||
local HDwiki="\nVisit HD Wiki for more information"
|
||||
local HDwiki="\nVisit Hard Drop Wiki for more information."
|
||||
return{
|
||||
{"Translator Note 1",
|
||||
"",
|
||||
"help",
|
||||
"This translation of the TetroDictionary is provided by me, User670 (Discord: User670#9501).\n\nThe translation may not completely reflect the contents of the original Chinese text.\n\nCorrected by C₂₉H₂₅N₃O₅ (Discord: C29H25N3O5#1606).\n\nTo view the list of contributors or make contributions, feel free to visit the GitHub page.",
|
||||
"This translation of the TetroDictionary is maly provided by User670 (Discord: User670#9501).\n\nThe translation may not completely reflect the contents of the original Chinese text.\n\nTo view the list of contributors or make contributions, feel free to visit the GitHub page.",
|
||||
"https://github.com/26F-Studio/Techmino/blob/main/parts/language/dict_en.lua",
|
||||
},
|
||||
{"Official Website",
|
||||
"official website homepage",
|
||||
"official website homepage mainpage",
|
||||
"help",
|
||||
"The official website of Techmino!\nYou can modify your profile on it",
|
||||
"http://home.techmino.org",
|
||||
},
|
||||
{"To New Players",
|
||||
"guide newbie noob",
|
||||
"guide newbie noob readme",
|
||||
"help",
|
||||
"To new players that want to get better at the game:\n\tTwo principles:\n\t1. find a version with good controls (e.g. Techmino, Tetr.io, Tetris Online, Jstris, Tetr.js). Do not use those version used for programming practice.\n\t2. Build foundations in your skills (stable Techrashes using next queue to aid decisions), don't go for fancy T-Spins from the start.\n\n\tTwo main techniques:\n\t1. familiarize yourself with spawn locations of pieces, and the controls to move the piece into each location\n\t2. Plan ahead of where to put the pieces\nHere is a article written by a well-known player in Chinese Tetris community talking about advices to new players. Click the globe to read the translated article by User670.",
|
||||
"https://github.com/user670/temp/blob/master/tips_to_those_new_to_top.md",
|
||||
@@ -39,7 +39,7 @@ return{
|
||||
{"Four.lol",
|
||||
"four wiki",
|
||||
"help",
|
||||
"An website containing collections of various openings with simple UI and very detailed consecutive PC analyses (Not recommended for new players as you may have to memorize many techniques).",
|
||||
"An website containing collections of various openings with simple UI and very detailed consecutive PC analyses (Not recommended for new players, as you may have to memorize many techniques).",
|
||||
"https://four.lol",
|
||||
},
|
||||
{"Tetris Wiki Fandom",
|
||||
@@ -59,7 +59,7 @@ return{
|
||||
{"Github Repository",
|
||||
"githubrepository sourcecode",
|
||||
"org",
|
||||
"Techmino's Github repository. Stars are appreciated.",
|
||||
"Techmino's official Github repository. Stars are appreciated.",
|
||||
"https://github.com/26F-Studio/Techmino",
|
||||
},
|
||||
{"Communities",
|
||||
@@ -69,7 +69,7 @@ return{
|
||||
"https://discord.gg/harddrop"
|
||||
},
|
||||
{"Mew",
|
||||
"mew tieba forum",
|
||||
"mew tieba forum reddit",
|
||||
"org",
|
||||
"The Mew forum owned by Chinese Tetris Research Community, and was founded in the second half of 2021. Mew is a Chinese social media that can be thought of a combination of Discord and Reddit, with many channels in a big community. Users can chat in the channels or submit posts to the channel. Mew also has a function called \"Library\" which allows storing documentations systematically. The Tetris Mew forum is currently under construction and not too much contents are available (2/Nov/2021).",
|
||||
"https://mew.fun/n/tetris",
|
||||
@@ -80,217 +80,244 @@ return{
|
||||
"Google \"Tetris Online Poland\" for the Poland server.\nClick on the globe icon for information about the Tetris Online Study server.",
|
||||
"http://teatube.ltd/tos",
|
||||
},
|
||||
{"P\97\116\114\101\111\110",
|
||||
"p\97\116\114\101\111\110 support",
|
||||
{"Support 1",
|
||||
"support wechat vx alipay zfb",
|
||||
"org",
|
||||
"Techmino's P\97\116\114\101\111\110 Page",
|
||||
FNSF and"https://www.youtube.com/watch?v=DVl0IiUKX_g"or"https://www.p\97\116\114\101\111\110.com/techmino",
|
||||
FNNS and "This feature is restricted due to platform policy restrictions. You may discuss about this feature in our Discord server." or "To donate to Techmino via WeChat Pay or Alipay, type \"support\" in console.",
|
||||
},
|
||||
{"Support 2",
|
||||
"support afdian",
|
||||
"org",
|
||||
FNNS and "This feature is restricted due to platform policy restrictions. You may discuss about this feature in our Discord server. The URL in this entry is a rickroll, by the way." or "To donate to Techmino via Aifadian, use the globe icon on the bottom right to open URL. Aifadian charges 6% transaction fee off your purchase.",
|
||||
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 "This feature is restricted due to platform policy restrictions. You may discuss about this feature in our Discord server. The URL in this entry is a rickroll, by the way." or "To donate to Techmino via P\97\116\114\101\111\110, use the globe icon on the bottom right to open URL. P\97\116\114\101\111\110 charges 7.9% + 0.30 USD transaction fee off your purchase that is greater than 3 USD.",
|
||||
FNNS and"https://youtu.be/dQw4w9WgXcQ"or"https://www.p\97\116\114\101\111\110.com/techmino",
|
||||
},
|
||||
|
||||
--Games
|
||||
{"TTT",
|
||||
"ttt tetris trainer tres bien",
|
||||
"game",
|
||||
"*Web-based, no mobile support | Single-player*\nTetris Trainer Tres-Bien. A hands-on tutorial of advanced techniques in modern Tetris.\nRecommended for players that can complete a 40-line Sprint with all Tetris line clears and no hold.\nCovered topics include T-Spin, finesse, SRS, and some battle setups.\nLink translated to Simplified Chinese; originally in Japanese.",
|
||||
"http://teatube.ltd/ttt",
|
||||
"Tetris Trainer Très-Bien. A hands-on tutorial of advanced techniques in modern Tetris.\nRecommended for players that can complete a 40-line Sprint with all Tetris line clears and no hold.\nCovered topics include T-Spin, finesse, SRS, and some battle setups.\nLink in Japanese.",
|
||||
"http://taninkona.web.fc2.com/ttt/",
|
||||
},
|
||||
{"TTPC",
|
||||
"ttpc tetris perfect clear challenge",
|
||||
"game",
|
||||
"*Web-based, no mobile support | Single-player*\nTetris Perfect Clear Challenge. The PC opener tutorial for SRS+7 Bag.\nRecommended for players that have completed TTT. You need to know SRS to play this.\nIncludes only the basic PC opener.\nLink translated to Simplified Chinese; originally in Japanese.",
|
||||
"Tetris Perfect Clear Challenge. The PC opener tutorial for SRS and 7-Bag.\nRecommended for players that have completed TTT. You need to know SRS to play this.\nIncludes only the basic PC opener.\nLink translated to Simplified Chinese; originally in Japanese.",
|
||||
"http://teatube.ltd/ttpc",
|
||||
},
|
||||
{"NAZO",
|
||||
"nazo",
|
||||
"game",
|
||||
"*Web-based, no mobile support | Single-player*\nAll sorts of SRS puzzles. Recommended for players that have completed TTT.\nHas T-Spin and all spin puzzles of all difficulties.\nLink translated to Simplified Chinese; originally in Japanese.",
|
||||
"All sorts of SRS puzzles. Recommended for players that have completed TTT.\nHas T-Spin and all spin puzzles of all difficulties.\nLink translated to Simplified Chinese; originally in Japanese.",
|
||||
"http://teatube.ltd/nazo",
|
||||
},
|
||||
|
||||
{"Side Note 1",
|
||||
"note nb NB DM notice",
|
||||
"game",
|
||||
"The following contents are some brief introductions about some official and fan-made Tetris games with high popularity. We make absolutely no guarantees that they would cover every Tetris game. Also, the author of this game has made some comments on some of these games. Notice that they are just personal opinions and cannot be used to judge the qualities of these games. To better differentiate between the facts and opinions, all the commentary contents are enclosed with square brackets and are separated from the main contents.",
|
||||
},
|
||||
{"King of Stackers",
|
||||
"kos kingofstackers",
|
||||
"game",
|
||||
"*Web-based | Multiplayer*\nTurn-based battle Tetris game.",
|
||||
"Browser Game | Multiplayer | Mobile Support\nKoS for short. A turn-based battle Tetris game. In this game, the players can place seven tetrominoes in his or her turn, and garbage lines can enter the field only if the player places a block that does not clear a line. This game requires careful thinking and there are multiple modes with different attack mechanics.",
|
||||
"https://kingofstackers.com/games.php",
|
||||
},
|
||||
{"Tetr.js",
|
||||
"tetrjs tetr.js",
|
||||
"game",
|
||||
"*Web-based | Single-player*\nHas newbie-friendly custom modes (most common features). Only a few on-screen control schemes are available to mobile.\nLink to Farter's Dig Mod, which itself is a mod of another version. Also has another mod called Tetr.js Enhanced.",
|
||||
"Browser Game | Singleplayer | Mobile Support\nA browser-based Tetris game. It has many professional tunings and many modes, but the visuals are simple and there are barely any animations; besides that, only a few on-screen control schemes are available to mobile.\nLink to Farter's Dig Mod, which itself is a mod of another version. Also has another mod called Tetr.js Enhanced (You can find the link on Tetris Wiki).",
|
||||
"http://farter.cn/t",
|
||||
},
|
||||
{"Tetra Legends",
|
||||
"tl tetralegends",
|
||||
"game",
|
||||
"*Web-based, no mobile support | Single-player*\nFeature-rich game with fancy visuals, also visualized some data that are otherwise hidden in other games, although controls aren't exactly the most comfortable. Has a rhythm mode.\nIt can be slow to load the game for the first time.",
|
||||
"Browser Game | Singleplayer | No Mobile Support\nOr TL for short. It has many single-player modes, two hidden rhythm modes, and visualizes many hidden mechanics with rich animations. The development of this game was halted for multiple reasons in December 2020.",
|
||||
"https://tetralegends.app",
|
||||
},
|
||||
{"Ascension",
|
||||
"asc ascension",
|
||||
"asc ascension ASC",
|
||||
"game",
|
||||
"Or ASC for short. A cross-platform web-based Tetris game using its own rotation system called ASC. It may take a very long time when first loading this game. It also has many single-player modes (The \"Stack\" mode in Techmino was inspired by Ascension). Battle mode is currently in the testing phase (08/20/2021).",
|
||||
"Browser Game | Singleplayer/Multiplayer\nOr ASC for short. It uses its own rotation system (also called ASC) and has many single-player modes. Battle modes are currently under beta testing (15/Dec/2021). The Stack mode in this game was also inspired by Ascension. ",
|
||||
"https://asc.winternebs.com",
|
||||
},
|
||||
{"Jstris",
|
||||
"js jstris",
|
||||
"game",
|
||||
"*Web-based | Single-player and multiplayer*\nBasic web-based battle Tetris game.",
|
||||
"Browser Game | Singleplayer/Multiplayer | Mobile Support\nOr JS for short. It has some single-player modes with multiple customizable parameters, Adjustable virtual keys layouts for mobile, but it doesn't have any animation. ",
|
||||
"https://jstris.jezevec10.com",
|
||||
},
|
||||
{"TETR.IO",
|
||||
"io tetrio tetr.io",
|
||||
"game",
|
||||
"*Web-based, no mobile support | Single-player and multiplayer*\nFancy online battling Tetris game.",
|
||||
"Browser Game | Singleplayer/Multiplayer\nOr IO for short. It has a ranking system and custom game with many adjustable parameters. Also, it provides desktop clients for improved performances and no ads.\n[It seems that Safari cannot open this game.]",
|
||||
"https://tetr.io",
|
||||
},
|
||||
{"Nuketris",
|
||||
"nuketris",
|
||||
"game",
|
||||
"*Web-based | Single-player and multiplayer*\nA block stacker game with 1-vs-1 ranked mode and a few single-player modes. A PC is recommended for playing this game.",
|
||||
"*Browser Game | Singleplayer/Multiplayer\nA block stacker game with 1V1 ranked matches and basic single-player modes.",
|
||||
"https://nuketris.herokuapp.com",
|
||||
},
|
||||
{"WWC",
|
||||
{"Worldwide Combos",
|
||||
"wwc worldwidecombos",
|
||||
"game",
|
||||
"*Web-based | Multiplayer*\nWorldwide Combos, a web-based worldwide 1-vs-1 battle Tetris game.",
|
||||
"Browser Game | Singleplayer/Multiplayer\nOr WWC for short. It has worldwide 1V1 ranked matches, recorded battles (which means that your opponent doesn't have to be a real person), many different rulesets, and bomb-handicapped garbage lines.",
|
||||
"https://worldwidecombos.com",
|
||||
},
|
||||
{"Tetris Friends",
|
||||
"tf tetrisfriends notrisfoes",
|
||||
"game",
|
||||
"*Web-based, no mobile support | Single-player and multiplayer*\nA now-defunct web-based Tetris game; used to be a decent battle game. An unofficial private server known as Notris Foes exists.\nBuilt using Flash, which might require workarounds to play or cannot run at all on your devices.",
|
||||
"Browser Game | Singleplayer/Multiplayer\n or TF for short, a now-defunct official Tetris game. Used to be a popular game but now nobody plays it because the website was shut down. However an unofficial private server known as \"Notris Foes\" still exists and you will need to download desktop client for full experiences.",
|
||||
},
|
||||
{"tetris.com",
|
||||
"tetris online official",
|
||||
"game",
|
||||
"The Tetris game on tetris.com. It only has one mode – marathon, and you can control the game with your mouse.",
|
||||
"Browser Game | Singleplayer\nThe Tetris game on tetris.com. It only has one mode — marathon, and you can control the game with your mouse.",
|
||||
},
|
||||
{"Tetris Gems",
|
||||
"tetris online official gem",
|
||||
"game",
|
||||
"Another Tetris game from tetris.com. It has the gravity mechanism, and each game lasts for 1 minute. There are three kinds of gem blocks with different abilities.",
|
||||
"Browser Game | Singleplayer\nAnother Tetris game from tetris.com. It has the gravity mechanism, and each game lasts for 1 minute. There are three kinds of gem blocks with different abilities.",
|
||||
},
|
||||
{"Tetris Mind Bender",
|
||||
"tetris online official gem",
|
||||
"game",
|
||||
"Another Tetris game from tetris.com. It introduced \"Mind Bender\" minoes on the basis of marathon mode. Clearing a line with a Mind Bender mino will give you either a good or bad effect.",
|
||||
"Browser Game | Singleplayer\nAnother Tetris game from tetris.com. It introduced \"Mind Bender\" minoes on the basis of marathon mode. Clearing a line with a Mind Bender mino will give you either a good or bad effect.",
|
||||
},
|
||||
|
||||
{"Techmino",
|
||||
"techmino",
|
||||
"game",
|
||||
"Cross-Platform | Singleplayer/Multiplayer\nOr Tech for short. A block stacker game developed using LÖVE. It has many single-player modes and many customizable parameters, and online multiplayer modes are gradually being developed.",
|
||||
},
|
||||
{"Falling Lightblocks",
|
||||
"fl fallinglightblocks",
|
||||
"game",
|
||||
"Browser Game/iOS/Android | Singleplayer/Multiplayer\n A cross-platform Tetris game that can be played in portrait and landscape modes. It has fixed DAS and line clear ARE. Has some customizable controls on mobile. Most of the game modes are designed based on NES classic Tetris, but there are some modern-ish modes. Battles are half turn-based, half real-time, and garbage cannot be buffered or canceled.",
|
||||
"https://golfgl.de/lightblocks/",
|
||||
},
|
||||
{"Cambridge",
|
||||
"cambridge",
|
||||
"game",
|
||||
"Cross-Platform | Singleplayer\n A Tetris game developed using LÖVE and is dedicated to creating a robust, easily customizable platform for creating new, custom game modes. Originally made by Joe Zeng, but Milla took over the development on 08/Oct/2020 starting from V0.1.5.\n — Tetris Wiki",
|
||||
},
|
||||
{"Nanamino",
|
||||
"nanamino",
|
||||
"game",
|
||||
"Windows/Android | Singleplayer\nA developing fan game which has a interesting original rotation system.",
|
||||
},
|
||||
|
||||
{"TGM",
|
||||
"tgm tetrisgrandmaster tetristhegrandmaster",
|
||||
"game",
|
||||
"*Arcade | Single-player*\nTetris The Grand Master, an arcade Tetris series that can run on Microsoft Windows. Titles like S13 or GM come from this series.\n\nTGM3 is the most well-known game in this series.",
|
||||
"Arcade | Singleplayer/Local Multiplayer\nTetris The Grand Master, an arcade Tetris series. Titles like S13 and GM come from this series.\n\nTGM3 is the most well-known game in this series.",
|
||||
},
|
||||
{"DTET",
|
||||
"dtet",
|
||||
"game",
|
||||
"*Windows | Single-player*\nA game based on TGM's Classic rule with 20G and a powerful rotation system. Decent controls, but has no customization other than control mappings. The game is a bit hard to find now and you might need to manually install required DLLs.",
|
||||
"Windows | Singleplayer\nA game based on TGM's Classic rule with 20G and a powerful rotation system. Decent controls, but has no customization other than control mappings. The game is a bit hard to find now and you may need to manually install required DLLs.",
|
||||
},
|
||||
{"Heboris",
|
||||
"hb heboris",
|
||||
"game",
|
||||
"*Windows*\nA game with Arcade-ish play style, simulates some modes of many Tetris games.",
|
||||
"Windows | Singleplayer\nA game with Arcade-ish play style, capable of simulating many modes of other Tetris games.",
|
||||
},
|
||||
{"Texmaster",
|
||||
"txm texmaster",
|
||||
"game",
|
||||
"*Windows | Single-player*\nA game with all modes from TGM which you can use to practice. Has better controls than actual TGM. The world rule is slightly different, however (eg, instant-lock soft drops, and slightly different kick tables)",
|
||||
},
|
||||
{"Cambridge",
|
||||
"cambridge",
|
||||
"game",
|
||||
"*Windows, macOS, Linux | Single-player*\nA Lua-based game engine dedicated to creating a robust, easily customizable platform for creating new, custom game modes. It was originally made by Joe Zeng, and starting with version 0.1.5 on October 8, 2020, Milla took over development of the game.\n--Tetris Wiki",
|
||||
"Windows | Singleplayer\nA game with all modes from TGM which you can use to practice. The world rule is slightly different, however (e.g. instant-lock soft drops and slightly different kick tables).",
|
||||
},
|
||||
|
||||
{"Tetris99",
|
||||
{"Tetris Effect",
|
||||
"tec tetriseffectconnected",
|
||||
"game",
|
||||
"PS/Oculus Quest/Xbox/NS/Windows | Singleplayer/Multiplayer\nOr TE(C) for short. An official Tetris game with fancy graphics and soundtracks that react to your input. The basic version (without the word \"Connected\") only has singleplayer modes. The extended version, Tetris Effect Connected, features four online battle modes, Connected (VS), Zone Battle, Score Attack, and Classic Score Attack.",
|
||||
},
|
||||
{"Tetris 99",
|
||||
"t99 tetris99",
|
||||
"game",
|
||||
"*Nintendo Switch | Multiplayer*\nA game famous for its 99-player battle royale mode and has many interesting strategies not present on traditional battle Tetris games. Also has limited single-player modes like Marathon and bot matches available as DLC.",
|
||||
"Nintendo Switch | Singleplayer/Multiplayer\nA game famous for its 99-player battle royale mode and has many interesting strategies not present on traditional battle Tetris games. Also has limited single-player modes like Marathon and bot matches available as DLC.",
|
||||
},
|
||||
{"Puyo Puyo Tetris",
|
||||
"ppt puyopuyotetris",
|
||||
"game",
|
||||
"*Multiple platforms | Single-player and multiplayer*\nA game that combines two games, Tetris and Puyo Puyo, and can battle between those two games. Has many modes for both single-player and online. The PC/Steam version has worse controls and horrible online experience, so it is not recommended.",
|
||||
"PS/NS/Xbox/Windows | Singleplayer/multiplayer\nA game that combines two games, Tetris and Puyo Puyo, and can battle between those two games. Has many modes for both single-player and online\n\n[The Steam PC version has worse controls and horrible online experience.]",
|
||||
},
|
||||
{"Tetris Online",
|
||||
"top tetrisonline",
|
||||
"game",
|
||||
"*Windows | Single-player and multiplayer*\nA now-defunct Japanese Tetris game with both online and single-player modes. Allows custom DAS/ARR but neither can be set to 0. Minor input delay. Private servers exist and is decent for new players to get started.",
|
||||
"Windows | Singleplayer/Multiplayer*\nA now-defunct Japanese Tetris game with both online and single-player modes. Allows custom DAS/ARR but neither can be set to 0. Minor input delay. Private servers do exist and is decent for new players to get started.",
|
||||
},
|
||||
{"Tetris Effect",
|
||||
"te tetriseffect",
|
||||
{"Tetra Online",
|
||||
"TO tetraonline",
|
||||
"game",
|
||||
"*PS4, Windows, Xbox | Single-player*\nFancy graphics and soundtrack that react to your actions. Not-so-good controls. You can have a go if you are into the visuals, but not exactly worth it if you are just trying to play some Tetris.",
|
||||
},
|
||||
{"Techmino",
|
||||
"techmino",
|
||||
"game",
|
||||
"*Windows, macOS, Android, Linux, iOS/iPadOS | Single-player and multiplayer*\nA game with many modes and loads of customization. Low input delay, decent controls.",
|
||||
"Windows/macOS/Linux | Singleplayer/Multiplayer\nTO for short. A Tetris game developed by Dr Ocelot and Mine. The delays are AREs are intentionally set to high values, and players who get used to Tetris games with no delays may not get used to this game.\nThe game was removed from Steam on 09/Dec/2020 due to a DMCA notice filed by TTC.\nHowever, an offline build can still be downloaded on GitHub.",
|
||||
"https://github.com/Juan-Cartes/Tetra-Offline/releases/tag/1.0",
|
||||
},
|
||||
|
||||
{"Cultris II",
|
||||
"c2 cultris2 cultrisii",
|
||||
"game",
|
||||
"*Windows, macOS, Linux | Single-player and multiplayer*\nA game focusing on speed. Has no hold and limited lockdown timer (like old school Tetris), but has customizable DAS/ARR. The main gimmick is its timer-based combos and emphasizes on speed, combo setups and digging.",
|
||||
"Windows/OS X | Singleplayer/Multiplayer\nC2 for short. Designed based on classic Tetris, Cultris II supports customizable DAS and ARR. The battle mode is focused on time-based combos, which challenges players’ speed, n-wide setups, and downstacking skills.\n[The Mac version was not being maintained for a long time. Any macOS build newer than macOS Catalina cannot run this game at all.]",
|
||||
},
|
||||
{"Nullpomino",
|
||||
"np nullpomino",
|
||||
"game",
|
||||
"*Windows | Single-player and multiplayer*\nProfessional Tetris game with extreme room for customization. You can customize almost every aspect of the game. However, this is not a beginner-friendly game (you can get lost in the menus quite easily).",
|
||||
},
|
||||
{"Touhoumino",
|
||||
"touhoumino",
|
||||
"game",
|
||||
"*Windows | Single-player*\nA Nullpomino mod with elements from Touhou Project. It is fun to play but difficult. Recommended for players with at least half-decent skills otherwise you don't even know how you die",
|
||||
},
|
||||
{"Nanamino",
|
||||
"nanamino",
|
||||
"game",
|
||||
"*Windows, Android | Single-player*\nDeveloping game, has a interesting rotation system",
|
||||
"Windows/macOS/Linux | Singleplayer/Multiplayer\nOr NP for short. A high-customizable professional Tetris game. Nearly every parameter in the game can be adjusted.\n[But the UI was outdated, and this game requires full-keyboard controls. New players may have some problems getting used to it. Also, it seems that macOS Monterey cannot run this game.]",
|
||||
},
|
||||
{"Misamino",
|
||||
"misamino",
|
||||
"game",
|
||||
"*Windows | Single-player?*\nLocal 1-vs-1 game, mainly plays turn-based mode. You can write your own bot for it (though you need to learn its API if you do).\nMisamino is also the name of its built-in bot. Said bot is also the core for the Puyo Puyo Tetris bot, Zetris.",
|
||||
"Windows | Single-player\nLocal 1V1 game, mainly plays turn-based mode. You can write your own bot for it (though you need to learn its API if you do).\nMisamino is also the name of its built-in bot.",
|
||||
},
|
||||
{"Tetris Journey",
|
||||
"huanyouji tetrisjourney mobile phone",
|
||||
{"Touhoumino",
|
||||
"touhoumino",
|
||||
"game",
|
||||
"An official mobile Tetris game developed by Tencent (available only in China). It has level modes, battle modes, and some single-player modes. You can customize the sizes and positions of the virtual keys but you cannot adjust DAS or ARR.\n The battle mode lasts for 2 minutes and if both player did not top out, the one who sent more attacks wins."
|
||||
"Windows | Singleplayer\nA fan-made Tetris game, basically Nullpomino with elements from Touhou Project. The \"Spellcards\" from Touhou was introduced in the game, and you can only get bonus scores if you can reach the target score within the given period of time.\n[Recommended for players with at least half-decent skills otherwise you don't even know how you die.]",
|
||||
},
|
||||
|
||||
{"Tetris Blitz",
|
||||
"blitz ea mobile phone",
|
||||
"game",
|
||||
"A mobile Tetris game by Electronic Arts (EA). It has the gravity mechanism, and each game lasts for 2 minutes. A bunch of minoes fall down to the field at the beginning of the game, and you can enter the \"Frenzy\" mode by performing line clears continuously. There are many different power-ups available. Also, this game has no top-out mechanism. When an incoming block overlaps with existing blocks in the field, the top lines will be cleared automatically. \n\nThis game is no longer available since April 2020.",
|
||||
"iOS/Android | Singleplayer\nA mobile Tetris game by Electronic Arts (EA). It has the gravity mechanism, and each game lasts for 2 minutes. A bunch of minoes fall down to the field at the beginning of the game, and you can enter the \"Frenzy\" mode by performing line clears continuously. There are many different power-ups available. Also, this game has no top-out mechanism. When an incoming block overlaps with existing blocks in the field, the top lines will be cleared automatically. \n\nThis game is no longer available since April 2020.",
|
||||
},
|
||||
{"Tetris (EA)",
|
||||
"tetris ea galaxy universe cosmos mobile phone",
|
||||
"game",
|
||||
"Another mobile Tetris game by EA. It has two control modes – Swipe and One-Touch. It also has a Galaxy Mode besides the Marathon Mode (with gravity mechanism), and the goal of this mode is to clear all Galaxy minoes before the sequence runs out.\n\nThis game is no longer available since April 2020."
|
||||
"iOS/Android | Singleplayer/Multiplayer?\nAnother mobile Tetris game by EA. It has two control modes – Swipe and One-Touch. It also has a Galaxy Mode besides the Marathon Mode (with gravity mechanism), and the goal of this mode is to clear all Galaxy minoes before the sequence runs out.\n\nThis game is no longer available since April 2020."
|
||||
},
|
||||
{"Tetris (N3TWORK)",
|
||||
"tetris n3twork mobile phone",
|
||||
"game",
|
||||
"The latest mobile Tetris from N3TWORK Inc. It has a 3-minute ultra mode, a marathon mode and a 100-player Royale mode. The UI is great but its controls are not so good.",
|
||||
"iOS/Android | Singleplayer\nThe mobile Tetris game from N3TWORK Inc. It has a 3-minute ultra mode, a marathon mode and a 100-player Royale mode.\n[The UI is great but its controls are not so good.]",
|
||||
},
|
||||
{"Tetris Beat",
|
||||
"tetris beat n3twork rhythm",
|
||||
"game",
|
||||
"A mobile Tetris game from N3TWORK. It has a \"Beat\" mode besides the Marathon mode, but in this game you only have drop the blocks in rhythm with the BGM. The effects are very heavy and the controls are not so good."
|
||||
"iOS | Singleplayer\nA mobile Tetris game from N3TWORK. It has a \"Beat\" mode besides the Marathon mode, but in this game you only have drop the blocks in rhythm with the BGM.\n[The effects are very heavy and the controls are not so good.]"
|
||||
},
|
||||
{"Tetris Journey",
|
||||
"tetrisjourney mobile phone huanyouji",
|
||||
"game",
|
||||
"iOS/Android | Singleplayer\nAn official mobile Tetris game developed by Tencent (available exclusively in China). It has level modes, battle modes, and some single-player modes. You can customize the sizes and positions of the virtual keys but you cannot adjust DAS or ARR.\n The battle mode lasts for 2 minutes and if both player did not top out, the one who sent more attacks wins."
|
||||
},
|
||||
{"JJ Tetris",
|
||||
"jjtetris",
|
||||
"game",
|
||||
"*Android | Multiplayer*\n(JJ块)\nA casual game on JJ Card Games (JJ棋牌). Portrait screen, low input delay, smooth controls. Customizable DAS/ARR and toggle-able 20G soft drop, limited control scheme customization. No hold nor B2B, no garbage buffer nor cancelling. Every attack sends at most 4 lines, combos are more powerful, otherwise similar to modern Tetris.",
|
||||
},
|
||||
{"Falling lightblock",
|
||||
"fl fallinglightblock",
|
||||
"game",
|
||||
"*Android, iOS, Web | Single-player and multiplayer*\nA game that supports many platforms. Has delays that cannot be adjusted. Can, to some extent, customize controls on mobile. Most of the modes are similar to classic Tetris, but modern-ish modes also exist. Battles are half-turn-based-half-real-time, and garbage cannot be buffered or cancelled.",
|
||||
"https://golfgl.de/lightblocks/",
|
||||
"Android | Multiplayer\n(JJ块)\nA casual game on JJ Card Games (JJ棋牌). Portrait screen, low input delay, smooth controls. Customizable DAS/ARR and toggle-able 20G soft drop, limited control scheme customization. No hold nor B2B, no garbage buffer nor cancelling. Every attack sends at most 4 lines, combos are more powerful, otherwise similar to modern Tetris.",
|
||||
},
|
||||
|
||||
{"Huopin Tetris",
|
||||
"huopin qq",
|
||||
"game",
|
||||
"*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 very difficult to dig through.",
|
||||
"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
|
||||
@@ -788,6 +815,16 @@ return{
|
||||
"term",
|
||||
"Vibrate your finger on the controller to achieve faster sideways movement speed than holding it.\nIt is most commonly used on classic Tetris where DAS is rather slow. In most cases, you do not need to hypertap in modern Tetris games, because their DAS is often fast enough.",
|
||||
},
|
||||
{"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.",
|
||||
},
|
||||
{"Passthrough",
|
||||
"passthrough pingthrough",
|
||||
"term",
|
||||
"",--TODO
|
||||
},
|
||||
{"Tetris OL attack",
|
||||
"top tetrisonlineattack",
|
||||
"term",
|
||||
@@ -854,12 +891,12 @@ return{
|
||||
"Any input device takes some time for the input to reach the game. This delay can range from a few milliseconds to a few dozen milliseconds.\nIf input delay is too long, the controls can feel uncomfortable.\nThis delay is often due to the performance of the hardware and software used, and often out of your control. Turn on performance mode (or turn off power saving mode) on your device, and turn on gaming mode on your monitor/TV (if you have one), may help reducing input delay.",
|
||||
},
|
||||
{"Cold Clear",
|
||||
"cc coldclear",
|
||||
"cc coldclear ai bot",
|
||||
"term",
|
||||
"A Tetris bot. Originally built for Puyo Puyo Tetris, thus can be less powerful on Techmino.",
|
||||
},
|
||||
{"ZZZbot",
|
||||
"zzzbot",
|
||||
"zzzbot ai bot",
|
||||
"term",
|
||||
"A Tetris bot. Built by the Chinese Tetris player 奏之章 (Zou Zhi Zhang) and has decent performance in many games",
|
||||
},
|
||||
@@ -1021,9 +1058,9 @@ return{
|
||||
|
||||
--Savedata managing
|
||||
{"Console",
|
||||
"console cmd commamd minglinghang kongzhitai",
|
||||
"console cmd commamd minglinghang kongzhitai terminal",
|
||||
"command",
|
||||
"Techmino has a console that enables debugging/advanced features.\nTo access the console, repeatedly tap the Techmino logo or press the C key on the keyboard on the main menu.\n\nCareless actions in the console may result in corrupting or losing saved data. Proceed at your own risk.",
|
||||
"Techmino has a console that enables debugging/advanced features.\nTo access the console, repeatedly tap (or click) the Techmino logo or press the C key on the keyboard on the main menu.\n\nCareless actions in the console may result in corrupting or losing saved data. Proceed at your own risk.",
|
||||
},
|
||||
{"Reset setting",
|
||||
"reset setting",
|
||||
@@ -1127,7 +1164,7 @@ return{
|
||||
{"Jonas",
|
||||
"jonas",
|
||||
"name",
|
||||
"One of the top players in Classic Tetris.\nFour-times-in-a-row champion of CTWC.\n\n(1981-2021)",
|
||||
"(1981-2021) One of the top players in Classic Tetris.\nFour-times-in-a-row champion of CTWC.",
|
||||
},
|
||||
{"Joseph",
|
||||
"joseph",
|
||||
@@ -1167,10 +1204,10 @@ return{
|
||||
{"TetroDictionary",
|
||||
"zictionary tetrodictionary littlez",
|
||||
"name",
|
||||
"(or Zictionary for short) The name of this dictionary!\nIt includes brief introductions on many common terms in Tetris.\nIt used to be a chatbot in our QQ group, which was used to answer new player's FAQs. The entries in the Tetrodictionary were also inherited from the database in the chatbot.",
|
||||
"(or Zictionary for short) The name of this dictionary!\nIt includes brief introductions on many common terms in Tetris.\nIt used to be a chatbot in our QQ group, which was used to answer new player's FAQs. The entries in the Tetrodictionary were also inherited from the database in the chatbot.\nThe contents in the TetroDictionary was adapted from a variety of sources such as Tetris Wiki and Hard Drop Wiki.",
|
||||
},
|
||||
{"MrZ",
|
||||
"mrz_26",
|
||||
"mrz_26 t026 t626",
|
||||
"name",
|
||||
"Tetris Research community member, the author of Techmino.\nPersonal bests: Sprint 25.95 seconds, MPH Sprint 57 seconds, #8 on Jstris leaderboards, X rank on TETR.IO, cleared TGM3 (World rule, Shirase gold 1300).",
|
||||
"https://space.bilibili.com/225238922",
|
||||
@@ -1179,7 +1216,7 @@ return{
|
||||
{"Circu1ation",
|
||||
"circu1ation",
|
||||
"name",
|
||||
"One of the top players. First one to achieve sub-20 Sprint in China, X rank on TETR.IO.",
|
||||
"One of the top players. First one to achieve sub-20 40L Sprint in China, X rank on TETR.IO.",
|
||||
"https://space.bilibili.com/557547205",
|
||||
},
|
||||
{"Farter",
|
||||
@@ -1260,7 +1297,7 @@ return{
|
||||
"https://space.bilibili.com/109356367",
|
||||
},
|
||||
{"ZXC",
|
||||
"zxc thtsod",
|
||||
"zxc thtsod flag ctf",
|
||||
"name",
|
||||
"Also known as ThTsOd.\nTetris Research community member.\nA technical player.",
|
||||
"https://space.bilibili.com/4610502",
|
||||
@@ -1284,7 +1321,7 @@ return{
|
||||
"https://space.bilibili.com/471341780",
|
||||
},
|
||||
{"思竣",
|
||||
"sijun",
|
||||
"sijun acm oi",
|
||||
"name",
|
||||
"(Sī Jùn)\n\nTetris Research community member.\nLots of mental computation power.",
|
||||
"https://space.bilibili.com/403250559",
|
||||
|
||||
@@ -5,7 +5,6 @@ return{
|
||||
loadSample="Loading instrument samples",
|
||||
loadVoice="Loading voice packs",
|
||||
loadFont="Loading fonts",
|
||||
loadModeIcon="Loading mode icons",
|
||||
loadMode="Loading modes",
|
||||
loadOther="Loading other assets",
|
||||
finish="Press any key to start!",
|
||||
@@ -138,7 +137,8 @@ return{
|
||||
chatStart="------Beginning of log------",
|
||||
chatHistory="------New messages below------",
|
||||
|
||||
keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete",
|
||||
searchModeHelp="Type to search",
|
||||
keySettingHelp="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,9 +206,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.",
|
||||
FNSF and"/"or"While the game is free, donations are appreciated.",
|
||||
FNSF and"/"or"If you are unable to use both WeChat Pay and AliPay,",
|
||||
FNSF and"/"or"you can go to our P\97\116\114\101\111\110 page (Link in Zictionary) to support us!",
|
||||
FNNS and"/"or"While the game is free, donations are appreciated.",
|
||||
FNNS and"/"or"Check Zictionary for more",
|
||||
},
|
||||
staff={
|
||||
"Author: MrZ Email: 1046101471@qq.com",
|
||||
@@ -219,7 +218,7 @@ return{
|
||||
"Music: MrZ, 柒栎流星, ERM, Trebor, C₂₉H₂₅N₃O₅, [T0722, Aether]",
|
||||
"Voice & Sound: Miya, Xiaoya, Mono, MrZ, Trebor",
|
||||
"Performance: 模电, HBM",
|
||||
"Translations: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅",
|
||||
"Translations: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅, NOT_A_ROBOT",
|
||||
"",
|
||||
"Special Thanks:",
|
||||
"Flyz, Big_True, NOT_A_ROBOT, 思竣, yuhao7370",
|
||||
@@ -253,9 +252,8 @@ return{
|
||||
sprint="Sprint",
|
||||
marathon="Marathon",
|
||||
},
|
||||
mode={
|
||||
modeExplorer={
|
||||
mod="Mods (F1)",
|
||||
start="Start",
|
||||
},
|
||||
mod={
|
||||
title="Mods",
|
||||
@@ -339,7 +337,7 @@ return{
|
||||
title="Game Settings",
|
||||
graphic="←Video",
|
||||
sound="Audio→",
|
||||
layout="Layout",
|
||||
style="Style",
|
||||
|
||||
ctrl="Control Settings",
|
||||
key="Key Mappings",
|
||||
@@ -460,7 +458,7 @@ return{
|
||||
},
|
||||
setting_skin={
|
||||
skinSet="Block Skin",
|
||||
title="Layout Settings",
|
||||
title="Style Settings",
|
||||
skinR="Reset Colors",
|
||||
faceR="Reset Dir.",
|
||||
},
|
||||
@@ -676,101 +674,105 @@ return{
|
||||
},
|
||||
},
|
||||
modes={
|
||||
['sprint_10l']= {"Sprint", "10L", "Clear 10 lines!"},
|
||||
['sprint_20l']= {"Sprint", "20L", "Clear 20 lines!"},
|
||||
['sprint_40l']= {"Sprint", "40L", "Clear 40 lines!"},
|
||||
['sprint_100l']= {"Sprint", "100L", "Clear 100 lines!"},
|
||||
['sprint_400l']= {"Sprint", "400L", "Clear 400 lines!"},
|
||||
['sprint_1000l']= {"Sprint", "1,000L", "Clear 1,000 lines!"},
|
||||
['sprintPenta']= {"Sprint", "PENTOMINO", "40L with 18 pentominoes"},
|
||||
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
|
||||
['dig_10l']= {"Dig", "10L", "Dig 10 garbage lines"},
|
||||
['dig_40l']= {"Dig", "40L", "Dig 40 garbage lines"},
|
||||
['dig_100l']= {"Dig", "100L", "Dig 100 garbage lines"},
|
||||
['dig_400l']= {"Dig", "400L", "Dig 400 garbage lines"},
|
||||
['drought_n']= {"Drought", "100L", "No I-pieces available"},
|
||||
['drought_l']= {"Drought+", "100L", "W T F"},
|
||||
['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with increasing speed"},
|
||||
['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon"},
|
||||
['solo_e']= {"Battle", "EASY", "Defeat the AI!"},
|
||||
['solo_n']= {"Battle", "NORMAL", "Defeat the AI!"},
|
||||
['solo_h']= {"Battle", "HARD", "Defeat the AI!"},
|
||||
['solo_l']= {"Battle", "LUNATIC", "Defeat the AI!"},
|
||||
['solo_u']= {"Battle", "ULTIMATE", "Defeat the AI!"},
|
||||
['techmino49_e']= {"Tech 49", "EASY", "49-player battle.\nThe last one standing wins"},
|
||||
['techmino49_h']= {"Tech 49", "HARD", "49-player battle.\nThe last one standing wins"},
|
||||
['techmino49_u']= {"Tech 49", "ULTIMATE", "49-player battle.\nThe last one standing wins"},
|
||||
['techmino99_e']= {"Tech 99", "EASY", "99-player battle.\nThe last one standing wins"},
|
||||
['techmino99_h']= {"Tech 99", "HARD", "99-player battle.\nThe last one standing wins"},
|
||||
['techmino99_u']= {"Tech 99", "ULTIMATE", "99-player battle.\nThe last one standing wins"},
|
||||
['round_e']= {"Turn-Based", "EASY", "Take turns to play against the AI!"},
|
||||
['round_n']= {"Turn-Based", "NORMAL", "Take turns to play against the AI!"},
|
||||
['round_h']= {"Turn-Based", "HARD", "Take turns to play against the AI!"},
|
||||
['round_l']= {"Turn-Based", "LUNATIC", "Take turns to play against the AI!"},
|
||||
['round_u']= {"Turn-Based", "ULTIMATE", "Take turns to play against the AI!"},
|
||||
['master_n']= {"Master", "NORMAL", "For 20G beginners"},
|
||||
['master_h']= {"Master", "HARD", "For 20G pros"},
|
||||
['master_m']= {"Master", "M21", "For 20G Masters"},
|
||||
['master_final']= {"Master", "FINAL", "20G and beyond"},
|
||||
['master_ph']= {"Master", "PHANTASM", "???"},
|
||||
['master_ex']= {"GrandMaster", "EXTRA", "An eternity shorter than an instant"},
|
||||
['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||
['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||
['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||
['blind_e']= {"Invisible", "HALF", "For novices"},
|
||||
['blind_n']= {"Invisible", "ALL", "For intermediates"},
|
||||
['blind_h']= {"Invisible", "SUDDEN", "For the experienced"},
|
||||
['blind_l']= {"Invisible", "SUDDEN+", "For professionals"},
|
||||
['blind_u']= {"Invisible", "?", "Are you ready?"},
|
||||
['blind_wtf']= {"Invisible", "WTF", "You're not ready"},
|
||||
['classic_e']= {"Classic", "EASY", "A very low-speed recreation from the 80s"},
|
||||
['classic_h']= {"Classic", "HARD", "A medium speed recreation from the 80s"},
|
||||
['classic_u']= {"Classic", "ULTIMATE", "A very high-speed recreation from the 80s"},
|
||||
['survivor_e']= {"Survival", "EASY", "How long can you survive?"},
|
||||
['survivor_n']= {"Survival", "NORMAL", "How long can you survive?"},
|
||||
['survivor_h']= {"Survival", "HARD", "How long can you survive?"},
|
||||
['survivor_l']= {"Survival", "LUNATIC", "How long can you survive?"},
|
||||
['survivor_u']= {"Survival", "ULTIMATE", "How long can you survive?"},
|
||||
['attacker_h']= {"Attacker", "HARD", "Practice your attacking skills!"},
|
||||
['attacker_u']= {"Attacker", "ULTIMATE", "Practice your attacking skills!"},
|
||||
['defender_n']= {"Defender", "NORMAL", "Practice your defencing skills!"},
|
||||
['defender_l']= {"Defender", "LUNATIC", "Practice your defencing skills!"},
|
||||
['dig_h']= {"Driller", "HARD", "Digging practice!"},
|
||||
['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"},
|
||||
['clearRush']= {"Clear Rush", "NORMAL", "All-spin tutorial!\n[Under construction]"},
|
||||
['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos"},
|
||||
['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos"},
|
||||
['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear practice"},
|
||||
['pctrain_l']= {"PC Training", "LUNATIC", "A harder Perfect Clear practice"},
|
||||
['pc_n']= {"PC Challenge", "NORMAL", "Get PCs within 100 lines!"},
|
||||
['pc_h']= {"PC Challenge", "HARD", "Get PCs within 100 lines!"},
|
||||
['pc_l']= {"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"},
|
||||
['pc_inf']= {"Inf. PC Challenge", "", "Get PCs as much as you can"},
|
||||
['tech_n']= {"Tech", "NORMAL", "Try to keep the\nBack-to-Back chain!"},
|
||||
['tech_n_plus']= {"Tech", "NORMAL+", "Spins & PCs only"},
|
||||
['tech_h']= {"Tech", "HARD", "Try to keep the\nBack-to-Back chain!"},
|
||||
['tech_h_plus']= {"Tech", "HARD+", "Spins & PCs only"},
|
||||
['tech_l']= {"Tech", "LUNATIC", "Try to keep the\nBack-to-Back chain!"},
|
||||
['tech_l_plus']= {"Tech", "LUNATIC+", "Spins & PCs only"},
|
||||
['tech_finesse']= {"Tech", "FINESSE", "No finesse faults!"},
|
||||
['tech_finesse_f']={"Tech", "FINESSE+", "No normal clears and finesse faults!"},
|
||||
['tsd_e']= {"TSD Challenge", "EASY", "T-Spin Doubles only!"},
|
||||
['tsd_h']= {"TSD Challenge", "HARD", "T-Spin Doubles only!"},
|
||||
['tsd_u']= {"TSD Challenge", "ULTIMATE", "T-Spin Doubles only!"},
|
||||
['backfire_n']= {"Backfire", "NORMAL", "Hold back the backfiring garbage lines"},
|
||||
['backfire_h']= {"Backfire", "HARD", "Hold back the backfiring garbage lines"},
|
||||
['backfire_l']= {"Backfire", "LUNATIC", "Hold back the backfiring garbage lines"},
|
||||
['backfire_u']= {"Backfire", "ULTIMATE", "Hold back the backfiring garbage lines"},
|
||||
['sprintAtk']= {"Sprint", "100 Attack", "Send 100 lines!"},
|
||||
['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40lines!"},
|
||||
['zen']= {'Zen', "200", "A 200-line run without a time limit"},
|
||||
['ultra']= {'Ultra', "EXTRA", "A 2-minute score attack"},
|
||||
['infinite']= {"Infinite", "", "Just a sandbox"},
|
||||
['infinite_dig']= {"Infinite: Dig", "", "Dig-diggin'-dug"},
|
||||
['marathon_inf']= {"Marathon", "INFINITE", "Infinite marathon."},
|
||||
['sprint_10l']= {"Sprint", "10L", "Clear 10 lines!"},
|
||||
['sprint_20l']= {"Sprint", "20L", "Clear 20 lines!"},
|
||||
['sprint_40l']= {"Sprint", "40L", "Clear 40 lines!"},
|
||||
['sprint_100l']= {"Sprint", "100L", "Clear 100 lines!"},
|
||||
['sprint_400l']= {"Sprint", "400L", "Clear 400 lines!"},
|
||||
['sprint_1000l']= {"Sprint", "1,000L", "Clear 1,000 lines!"},
|
||||
['sprintPenta']= {"Sprint", "PENTOMINO", "40L with 18 pentominoes"},
|
||||
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
|
||||
['dig_10l']= {"Dig", "10L", "Dig 10 garbage lines"},
|
||||
['dig_40l']= {"Dig", "40L", "Dig 40 garbage lines"},
|
||||
['dig_100l']= {"Dig", "100L", "Dig 100 garbage lines"},
|
||||
['dig_400l']= {"Dig", "400L", "Dig 400 garbage lines"},
|
||||
['drought_n']= {"Drought", "100L", "No I-pieces available"},
|
||||
['drought_l']= {"Drought+", "100L", "W T F"},
|
||||
['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with increasing speed"},
|
||||
['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon"},
|
||||
['solo_e']= {"Battle", "EASY", "Defeat the AI!"},
|
||||
['solo_n']= {"Battle", "NORMAL", "Defeat the AI!"},
|
||||
['solo_h']= {"Battle", "HARD", "Defeat the AI!"},
|
||||
['solo_l']= {"Battle", "LUNATIC", "Defeat the AI!"},
|
||||
['solo_u']= {"Battle", "ULTIMATE", "Defeat the AI!"},
|
||||
['techmino49_e']= {"Tech 49", "EASY", "49-player battle.\nThe last one standing wins"},
|
||||
['techmino49_h']= {"Tech 49", "HARD", "49-player battle.\nThe last one standing wins"},
|
||||
['techmino49_u']= {"Tech 49", "ULTIMATE", "49-player battle.\nThe last one standing wins"},
|
||||
['techmino99_e']= {"Tech 99", "EASY", "99-player battle.\nThe last one standing wins"},
|
||||
['techmino99_h']= {"Tech 99", "HARD", "99-player battle.\nThe last one standing wins"},
|
||||
['techmino99_u']= {"Tech 99", "ULTIMATE", "99-player battle.\nThe last one standing wins"},
|
||||
['round_e']= {"Turn-Based", "EASY", "Take turns to play against the AI!"},
|
||||
['round_n']= {"Turn-Based", "NORMAL", "Take turns to play against the AI!"},
|
||||
['round_h']= {"Turn-Based", "HARD", "Take turns to play against the AI!"},
|
||||
['round_l']= {"Turn-Based", "LUNATIC", "Take turns to play against the AI!"},
|
||||
['round_u']= {"Turn-Based", "ULTIMATE", "Take turns to play against the AI!"},
|
||||
['master_n']= {"Master", "NORMAL", "For 20G beginners"},
|
||||
['master_h']= {"Master", "HARD", "For 20G pros"},
|
||||
['master_m']= {"Master", "M21", "For 20G Masters"},
|
||||
['master_final']= {"Master", "FINAL", "20G and beyond"},
|
||||
['master_ph']= {"Master", "PHANTASM", "???"},
|
||||
['master_ex']= {"GrandMaster", "EXTRA", "An eternity shorter than an instant"},
|
||||
['master_instinct']={"Master", "INSTINCT", "What if the active piece turned invisible?"},
|
||||
['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||
['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||
['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||
['strategy_e_plus']={"Strategy", "EASY+", "Fast 20G decision"},
|
||||
['strategy_h_plus']={"Strategy", "HARD+", "Fast 20G decision"},
|
||||
['strategy_u_plus']={"Strategy", "ULTIMATE+", "Fast 20G decision"},
|
||||
['blind_e']= {"Invisible", "HALF", "For novices"},
|
||||
['blind_n']= {"Invisible", "ALL", "For intermediates"},
|
||||
['blind_h']= {"Invisible", "SUDDEN", "For the experienced"},
|
||||
['blind_l']= {"Invisible", "SUDDEN+", "For professionals"},
|
||||
['blind_u']= {"Invisible", "?", "Are you ready?"},
|
||||
['blind_wtf']= {"Invisible", "WTF", "You're not ready"},
|
||||
['classic_e']= {"Classic", "EASY", "A very low-speed recreation from the 80s"},
|
||||
['classic_h']= {"Classic", "HARD", "A medium speed recreation from the 80s"},
|
||||
['classic_u']= {"Classic", "ULTIMATE", "A very high-speed recreation from the 80s"},
|
||||
['survivor_e']= {"Survival", "EASY", "How long can you survive?"},
|
||||
['survivor_n']= {"Survival", "NORMAL", "How long can you survive?"},
|
||||
['survivor_h']= {"Survival", "HARD", "How long can you survive?"},
|
||||
['survivor_l']= {"Survival", "LUNATIC", "How long can you survive?"},
|
||||
['survivor_u']= {"Survival", "ULTIMATE", "How long can you survive?"},
|
||||
['attacker_h']= {"Attacker", "HARD", "Practice your attacking skills!"},
|
||||
['attacker_u']= {"Attacker", "ULTIMATE", "Practice your attacking skills!"},
|
||||
['defender_n']= {"Defender", "NORMAL", "Practice your defencing skills!"},
|
||||
['defender_l']= {"Defender", "LUNATIC", "Practice your defencing skills!"},
|
||||
['dig_h']= {"Driller", "HARD", "Digging practice!"},
|
||||
['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"},
|
||||
['clearRush']= {"Clear Rush", "NORMAL", "All-spin tutorial!\n[Under construction]"},
|
||||
['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos"},
|
||||
['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos"},
|
||||
['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear practice"},
|
||||
['pctrain_l']= {"PC Training", "LUNATIC", "A harder Perfect Clear practice"},
|
||||
['pc_n']= {"PC Challenge", "NORMAL", "Get PCs within 100 lines!"},
|
||||
['pc_h']= {"PC Challenge", "HARD", "Get PCs within 100 lines!"},
|
||||
['pc_l']= {"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"},
|
||||
['pc_inf']= {"Inf. PC Challenge", "", "Get PCs as much as you can"},
|
||||
['tech_n']= {"Tech", "NORMAL", "Try to keep the\nBack-to-Back chain!"},
|
||||
['tech_n_plus']= {"Tech", "NORMAL+", "Spins & PCs only"},
|
||||
['tech_h']= {"Tech", "HARD", "Try to keep the\nBack-to-Back chain!"},
|
||||
['tech_h_plus']= {"Tech", "HARD+", "Spins & PCs only"},
|
||||
['tech_l']= {"Tech", "LUNATIC", "Try to keep the\nBack-to-Back chain!"},
|
||||
['tech_l_plus']= {"Tech", "LUNATIC+", "Spins & PCs only"},
|
||||
['tech_finesse']= {"Tech", "FINESSE", "No finesse faults!"},
|
||||
['tech_finesse_f']= {"Tech", "FINESSE+", "No normal clears and finesse faults!"},
|
||||
['tsd_e']= {"TSD Challenge", "EASY", "T-Spin Doubles only!"},
|
||||
['tsd_h']= {"TSD Challenge", "HARD", "T-Spin Doubles only!"},
|
||||
['tsd_u']= {"TSD Challenge", "ULTIMATE", "T-Spin Doubles only!"},
|
||||
['backfire_n']= {"Backfire", "NORMAL", "Hold back the backfiring garbage lines"},
|
||||
['backfire_h']= {"Backfire", "HARD", "Hold back the backfiring garbage lines"},
|
||||
['backfire_l']= {"Backfire", "LUNATIC", "Hold back the backfiring garbage lines"},
|
||||
['backfire_u']= {"Backfire", "ULTIMATE", "Hold back the backfiring garbage lines"},
|
||||
['sprintAtk']= {"Sprint", "100 Attack", "Send 100 lines!"},
|
||||
['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40lines!"},
|
||||
['zen']= {'Zen', "200", "A 200-line run without a time limit"},
|
||||
['ultra']= {'Ultra', "EXTRA", "A 2-minute score attack"},
|
||||
['infinite']= {"Infinite", "", "Just a sandbox"},
|
||||
['infinite_dig']= {"Infinite: Dig", "", "Dig-diggin'-dug"},
|
||||
['marathon_inf']= {"Marathon", "INFINITE", "Infinite marathon."},
|
||||
|
||||
['custom_clear']= {"Custom", "NORMAL"},
|
||||
['custom_puzzle']= {"Custom", "PUZZLE"},
|
||||
['custom_clear']= {"Custom", "NORMAL"},
|
||||
['custom_puzzle']= {"Custom", "PUZZLE"},
|
||||
},
|
||||
getTip={refuseCopy=true,
|
||||
":pog:",
|
||||
@@ -800,11 +802,11 @@ return{
|
||||
"Bridge clear coming soon!",
|
||||
"Can you master this modern yet familiar stacker?",
|
||||
"Certainly within this heart lies my M@STERPIECE.",
|
||||
"Changelogs in English can be found on Discord.",
|
||||
"Change logs in English can be found on Discord.",
|
||||
"Color clear coming soon!",
|
||||
"Decreasing DAS and ARR makes your game faster but harder to control.",
|
||||
"Did I just see a Back-to-Back-to-Back?",
|
||||
"Does B2B2B2B exists?",
|
||||
"Does B2B2B2B exist?",
|
||||
"Don't let a small glitch ruin your entire day!",
|
||||
"Don't look directly at the bugs!",
|
||||
"Enjoy the Techmino rotation system!",
|
||||
@@ -818,7 +820,6 @@ return{
|
||||
"Have you noticed what \"rotating\" does do to a block?",
|
||||
"Headphones recommended for a better experience.",
|
||||
"Hello world!",
|
||||
"hello world",
|
||||
"I3 and L3 are the only two unique triminoes.",
|
||||
"if a==true",
|
||||
"Increase your frame rate for a better experience.",
|
||||
@@ -839,7 +840,6 @@ return{
|
||||
"No easter eggs in this menu if you have the simplistic style turned on!",
|
||||
"O-Spin Triple!",
|
||||
"OHHHHHHHHHHHHHH",
|
||||
"Online mode is planned — please be patient.",
|
||||
"Play single-handedly!",
|
||||
"Playing good takes some time!",
|
||||
"Powered by LÖVE",
|
||||
@@ -850,9 +850,9 @@ return{
|
||||
"Soon you'll be able to play against friends and foes all over the world.",
|
||||
"Split clear coming soon!",
|
||||
"sudo rm -rf /*",
|
||||
"Techmino is a combination of Technique and Tetromino.",
|
||||
"Techmino has a Nspire-CX edition!",
|
||||
"Techmino is a portmanteau of \"technique\" and \"tetromino\".",
|
||||
"Techmino is so fun!",
|
||||
"Techmino on Nspire-CX: yes it exists, no it's not the same game.",
|
||||
"TetroDictionary is now available in English.",
|
||||
"Most of the music tracks in this game are made using Beepbox.",
|
||||
"The names that appeared in the background of the Staff page is a list of our sponsors.",
|
||||
@@ -860,6 +860,7 @@ return{
|
||||
"There are several hidden modes in the game that cannot be entered using the map.",
|
||||
"There is a total of 18 different pentominoes.",
|
||||
"There is a total of 7 different tetrominoes.",
|
||||
"Try online multiplayer! Expect things to break though.",
|
||||
"Try using multiple Hold Queues!",
|
||||
"Try using two rotation buttons. Using all three of them is better.",
|
||||
"Warning: Programmer Art",
|
||||
@@ -872,9 +873,8 @@ return{
|
||||
"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).",
|
||||
"You can customize the key mappings in settings!",
|
||||
"You can navigate the menu with a keyboard, but only in this screen.",
|
||||
"You can open the save directory from the Stats page.",
|
||||
"You can perform a spin with 28 of the 29 minoes in this game; the exception being O1.",
|
||||
"You can perform a spin with all of the minoes in this game.",
|
||||
"You can set the spawning orientation for each piece.",
|
||||
"ZS JL T O I",
|
||||
{C.C,"Also try 15puzzle!"},
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
return{
|
||||
fallback='en',
|
||||
sureQuit="Pulsa de nuevo para salir",
|
||||
-- sureReset="Press again to reset",
|
||||
-- sureDelete="Press again to delete",
|
||||
sureReset="Pulsa de nuevo para reiniciar",
|
||||
sureDelete="Pulsa de nuevo para borrar",
|
||||
newDay="[Anti-adicción] ¡Nuevo día, nuevo comienzo!",
|
||||
playedLong="[Anti-adicción] Estuviste jugando un buen rato hoy. Recuerda descansar de vez en cuando.",
|
||||
playedTooMuch="[Anti-adicción] ¡Has jugado mucho por hoy! No puedes jugar más.",
|
||||
-- settingWarn="Modifing uncommon setting, be careful!",
|
||||
settingWarn="¡Ten cuidado con modificar esto!",
|
||||
|
||||
atkModeName={"Al azar","Medallas","KOs","Atacantes"},
|
||||
royale_remain="$1 Jugadores Restantes",
|
||||
cmb={nil,"Combo de 1","Combo de 2","Combo de 3","Combo de 4","Combo de 5","Combo de 6","Combo de 7","Combo de 8","Combo de 9","¡Combo de 10!","¡Combo de 11!","¡Combo de 12!","¡Combo de 13!","¡Combo de 14!","¡Combo de 15!","¡Combo de 16!","¡Combo de 17!","¡Combo de 18!","¡Combo de 19!","MEGACOMBO"},
|
||||
spin="-spin",
|
||||
clear={"Single","Doble","Triple","Techrash","Pentacrash","Hexacrash","Heptacrash","Octacrash","Nonacrash","Decacrash","Undecacrash","Dodecacrash","Tridecacrash","Tetradecacrash","Pentadecacrash","Hexadecacrash","Heptadecacrash","Octadecacrash","Nonadecacrash","Ultracrash","Impossicrash"},
|
||||
-- cleared="$1 lines",
|
||||
cleared="$1 líneas",
|
||||
mini="Mini",b2b="B2B ",b3b="B2B2B ",
|
||||
PC="Perfect Clear",HPC="Half Clear",
|
||||
replaying="[Repetición]",
|
||||
tasUsing="[TAS]",
|
||||
|
||||
-- stage="Stage $1 completed",
|
||||
stage="Fase $1 Completada",
|
||||
great="¡Genial!",
|
||||
awesome="¡Fantástico!",
|
||||
almost="¡Casi!",
|
||||
@@ -28,7 +28,7 @@ return{
|
||||
speedup="¡Más rápido!",
|
||||
missionFailed="Misión Fallida",
|
||||
|
||||
speedLV="Vel. de juego",
|
||||
speedLV="Veloc. de juego",
|
||||
piece="Piezas",line="Líneas",atk="Ataque",eff="Eficiencia",
|
||||
rpm="RPM",tsd="TSD",
|
||||
grade="Grado",techrash="Techrash",
|
||||
@@ -50,25 +50,25 @@ return{
|
||||
|
||||
page="Página:",
|
||||
|
||||
-- cc_fixed="CC is incompatible with fixed sequences",
|
||||
-- cc_swap="CC is incompatible with swap holdmode",
|
||||
cc_fixed="CC no es compatible con piezas prefijadas",
|
||||
cc_swap="CC no es compatible con Swap Hold",
|
||||
ai_prebag="La IA no es compatible con piezas que no sean Tetrominos.",
|
||||
ai_mission="La IA no es compatible con misiones personalizadas.",
|
||||
switchSpawnSFX="Habilita los sonidos de aparición de las piezas ;)",
|
||||
needRestart="Reinicia Techmino para que los cambios tengan efecto.",
|
||||
|
||||
-- loadError_errorMode="'$1' loading failed: no load mode '$2'",
|
||||
-- loadError_read="'$1' loading failed: read failed",
|
||||
-- loadError_noFile="'$1' loading failed no file:",
|
||||
-- loadError_other="'$1' loading failed: $2",
|
||||
-- loadError_unknown="'$1' loading failed: unknown reason",
|
||||
loadError_errorMode="'$1' Error al cargar: no hay modo '$2'",
|
||||
loadError_read="'$1' Error al cargar: error de lectura",
|
||||
loadError_noFile="'$1' Error al cargar, no existe el archivo:",
|
||||
loadError_other="'$1' Error al cargar: $2",
|
||||
loadError_unknown="'$1' Error al cargar: desconocido",
|
||||
|
||||
-- saveError_duplicate="'$1' saving failed: duplicated filename",
|
||||
-- saveError_encode="'$1' saving failed: encode failed",
|
||||
-- saveError_other="'$1' saving failed: $2",
|
||||
-- saveError_unknown="'$1' saving failed: unknown reason",
|
||||
saveError_duplicate="'$1' Error al guardar: archivo duplicado",
|
||||
saveError_encode="'$1' Error al guardar: error de encoding",
|
||||
saveError_other="'$1' Error al guardar: $2",
|
||||
saveError_unknown="'$1' Error al guardar: desconocido",
|
||||
|
||||
-- copyDone="Copied!",
|
||||
copyDone="¡Copiado con éxito!",
|
||||
saveDone="Datos guardados",
|
||||
exportSuccess="Exportado con éxito",
|
||||
importSuccess="Importado con éxito",
|
||||
@@ -90,7 +90,7 @@ return{
|
||||
|
||||
replayBroken="No se puede cargar la repetición",
|
||||
|
||||
-- dictNote="==Copied from TetroDictionary==",
|
||||
dictNote="==Copia de TetroDictionary==",
|
||||
|
||||
getNoticeFail="Error al buscar novedades.",
|
||||
oldVersion="¡Está disponible la nueva versión $1!",
|
||||
@@ -127,12 +127,13 @@ return{
|
||||
chatStart="------Comienzo del historial------",
|
||||
chatHistory="------Nuevos mensajes------",
|
||||
|
||||
-- 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",
|
||||
-- searchModeHelp="Type to search",
|
||||
keySettingHelp="Pulsa la tecla a mapear\nEsc.: Cancelar\nBackspace: Borrar",
|
||||
customBGhelp="Suelta una imagen aquí para aplicarla de fondo",
|
||||
customBGloadFailed="Formato de imagen no soportado",
|
||||
|
||||
errorMsg="Ha ocurrido un error y Techmino necesita reiniciarse.\nSe creó un registro de error, puedes enviarlo al autor.",
|
||||
-- tryAnotherBuild="[Invalid UTF-8] If you are on Windows, try downloading Techmino-win32 or Techmino-win64 (different from what you are using now).",
|
||||
tryAnotherBuild="[UTF-8 Inválido] Si estás usando Windows, intenta descargar Techmino-win32 o Techmino-win64 (el que no estés usando ahora).",
|
||||
|
||||
-- modInstruction="",
|
||||
-- modInfo={},--See lang_en.lua
|
||||
@@ -172,9 +173,8 @@ return{
|
||||
"Descarga disponible únicamente vía el grupo de testeo y discord.gg/f9pUvkh",
|
||||
"Descargas desde otros sitios pueden contener malware/viruses, y en smartphones sólo requiere permisos de internet y vibración.",
|
||||
"El autor no se responabiliza por daños ocasionados debido a modificaciones del juego.",
|
||||
FNSF and"/"or"Por favor descarga las últimas versiones desde los sitios oficiales. El juego es gratuito",
|
||||
FNSF and"/"or"Si no puede usar WeChat Pay y AliPay,",
|
||||
FNSF and"/"or"puede ir a nuestra página de P\97\116\114\101\111\110 para apoyarnos.",
|
||||
FNNS and"/"or"Por favor descarga las últimas versiones desde los sitios oficiales. El juego es gratuito",
|
||||
FNNS and"/"or"Ve el Zictionary (en inglés) para más info",
|
||||
},
|
||||
staff={
|
||||
"Autor:MrZ Email: 1046101471@qq.com",
|
||||
@@ -185,7 +185,7 @@ return{
|
||||
"Música: MrZ, 柒栎流星, ERM, Trebor, C₂₉H₂₅N₃O₅, [T0722, Aether]",
|
||||
"Voces/Sonidos: Miya, Xiaoya, Mono, MrZ, Trebor",
|
||||
"Performance: 模电, HBM",
|
||||
"Traducción: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅",
|
||||
"Traducción: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅, NOT_A_ROBOT",
|
||||
"",
|
||||
"Agradecimientos:",
|
||||
"Flyz, Big_True, NOT_A_ROBOT, 思竣, yuhao7370",
|
||||
@@ -219,9 +219,8 @@ return{
|
||||
sprint="Sprint",
|
||||
marathon="Maratón",
|
||||
},
|
||||
mode={
|
||||
modeExplorer={
|
||||
mod="Mods (F1)",
|
||||
start="Empezar",
|
||||
},
|
||||
mod={
|
||||
title="Mods",
|
||||
@@ -274,8 +273,8 @@ return{
|
||||
lock="Retraso de Bloqueo",
|
||||
wait="Retraso de Spawneo",
|
||||
fall="Retraso de Línea",
|
||||
-- hang="Death Delay",
|
||||
-- hurry="ARE Interruption",
|
||||
hang="Retraso de Muerte",
|
||||
hurry="Interrupc. de ARE",
|
||||
|
||||
capacity="Capacidad",
|
||||
create="Crear",
|
||||
@@ -283,14 +282,14 @@ return{
|
||||
ospin="O-Spin",
|
||||
fineKill="100% Finesse",
|
||||
b2bKill="No Romper B2B ",
|
||||
-- lockout="Fail when lock out",
|
||||
lockout="Derrota al ocurrir Lock Out",
|
||||
easyFresh="Reinicio de Bloqueo Normal",
|
||||
deepDrop="Deep Drop",
|
||||
bone="Bone Block",
|
||||
|
||||
-- eventSet="Rule Set",
|
||||
eventSet="Ruleset",
|
||||
|
||||
-- holdMode="Hold Mode",
|
||||
holdMode="Modo de Reserva",
|
||||
nextCount="Siguiente",
|
||||
holdCount="Reserva",
|
||||
infHold="Reserva Inft.",
|
||||
@@ -299,13 +298,13 @@ return{
|
||||
net_game={
|
||||
ready="Estoy Listo",
|
||||
spectate="Espectear",
|
||||
-- cancel="Cancel ready",
|
||||
cancel="Esperar",
|
||||
},
|
||||
setting_game={
|
||||
title="Ajustes del Juego",
|
||||
graphic="←Video",
|
||||
sound="Sonido→",
|
||||
layout="Diseño",
|
||||
style="Estilo",
|
||||
|
||||
ctrl="Sensibilidad",
|
||||
key="Teclas",
|
||||
@@ -314,10 +313,10 @@ return{
|
||||
reTime="Retraso de Inicio",
|
||||
RS="Sistema de Rotación",
|
||||
menuPos="Pos. del Botón de Menú",
|
||||
-- sysCursor="Use system cursor",
|
||||
sysCursor="Usar cursor del sistema",
|
||||
autoPause="Pausar cuando la ventana no está enfocada",
|
||||
autoSave="Autograbar Récords",
|
||||
-- autoLogin="Auto Login on Start",
|
||||
autoLogin="Autologueo al Iniciar",
|
||||
simpMode="Modo Sencillo",
|
||||
},
|
||||
setting_video={
|
||||
@@ -345,13 +344,13 @@ return{
|
||||
atkFX="FX Vis. de Ataque",
|
||||
|
||||
frame="Ratio de FPSs(%)",
|
||||
-- FTlock="Frame-Time Lock",
|
||||
FTlock="Bloqueo por frames",
|
||||
|
||||
text="Texto de Acciones",
|
||||
score="Puntaje en Pantalla",
|
||||
bufferWarn="Alerta de Búfer",
|
||||
showSpike="Contador de Spike",
|
||||
-- nextPos="Spawn Preview",
|
||||
nextPos="Prever Spawn de Pzas.",
|
||||
highCam="Cám. Vista Aérea",
|
||||
warn="Alerta de Peligro",
|
||||
|
||||
@@ -360,9 +359,9 @@ return{
|
||||
clean="Fast Draw",
|
||||
fullscreen="Pant. Completa",
|
||||
|
||||
-- bg_on="Normal B.G.",
|
||||
-- bg_on="No B.G.",
|
||||
-- bg_custom="Use Custom B.G.",
|
||||
bg_on="Fondo Normal",
|
||||
bg_off="Sin Fondo",
|
||||
bg_custom="Fondo Personalizado",
|
||||
|
||||
blockSatur="Saturac. de los Bloques",
|
||||
fieldSatur="Saturac. del Tablero",
|
||||
@@ -372,7 +371,7 @@ return{
|
||||
game="←Juego",
|
||||
graphic="Video→",
|
||||
|
||||
-- mainVol="Main Volume",
|
||||
mainVol="Vol. Principal",
|
||||
bgm="BGM",
|
||||
sfx="SFX",
|
||||
stereo="Estéreo",
|
||||
@@ -381,9 +380,9 @@ return{
|
||||
vib="Vibración",
|
||||
voc="Voces",
|
||||
|
||||
-- autoMute="Mute while unfocused",
|
||||
autoMute="Silenciar cuando la ventana no está enfocada",
|
||||
fine="Sonido de Error de Finesse",
|
||||
-- sfxPack="SFX Pack",
|
||||
sfxPack="Pack de SFX",
|
||||
vocPack="Pack de Voces",
|
||||
apply="Aplicar",
|
||||
},
|
||||
@@ -461,8 +460,8 @@ return{
|
||||
lock="Retraso de Bloqueo",
|
||||
wait="Retraso de Spawneo",
|
||||
fall="Retraso de Línea",
|
||||
-- hang="Death Delay",
|
||||
-- hurry="ARE Interruption",
|
||||
hang="Retraso de Muerte",
|
||||
hurry="Interrupc. de ARE",
|
||||
|
||||
bg="Fondo",
|
||||
bgm="Música",
|
||||
@@ -479,9 +478,9 @@ return{
|
||||
sequence="Editar Secuencia (S)",
|
||||
mission="Editar Misiones (M)",
|
||||
|
||||
-- eventSet="Rule Set",
|
||||
eventSet="Ruleset",
|
||||
|
||||
-- holdMode="Hold Mode",
|
||||
holdMode="Modo de Reserva",
|
||||
nextCount="Siguiente",
|
||||
holdCount="Reserva",
|
||||
infHold="Reserva Inft.",
|
||||
@@ -500,7 +499,7 @@ return{
|
||||
ospin="O-Spin",
|
||||
fineKill="100% Finesse",
|
||||
b2bKill="No Romper B2B ",
|
||||
-- lockout="Fail when lock out",
|
||||
lockout="Derrota al ocurrir Lock Out",
|
||||
easyFresh="Reinicio de Bloqueo Normal",
|
||||
deepDrop="Deep Drop",
|
||||
bone="Bone Block",
|
||||
@@ -535,7 +534,7 @@ return{
|
||||
about={
|
||||
staff="Staff",
|
||||
his="Hist. de Acts.",
|
||||
-- legals="Legals",
|
||||
legals="Legalidades",
|
||||
},
|
||||
dict={
|
||||
title="TetroDictionary",
|
||||
@@ -559,7 +558,7 @@ return{
|
||||
sfx="SFX",
|
||||
voc="Voces",
|
||||
music="BGMs",
|
||||
-- label="label",
|
||||
label="Etiq.",
|
||||
},
|
||||
login={
|
||||
title="Entrar",
|
||||
@@ -646,7 +645,7 @@ return{
|
||||
['dig_100l']= {"Queso", "100L", "Limpia 100 líneas de queso."},
|
||||
['dig_400l']= {"Queso", "400L", "Limpia 400 líneas de queso."},
|
||||
['drought_n']= {"Sequía", "100L", "¡Sin piezas I!"},
|
||||
['drought_l']= {"Sequía+", "100L", "Guat de foc..."},
|
||||
['drought_l']= {"Sequía+", "100L", "Qué es esto..."},
|
||||
['marathon_n']= {"Maratón", "Normal", "Maratón de 200 líneas con velocidad en aumento."},
|
||||
['marathon_h']= {"Maratón", "Difícil", "Maratón de 200 líneas a velocidad máxima."},
|
||||
['solo_e']= {"VS.", "Fácil", "¡Derrota a la CPU!"},
|
||||
@@ -654,12 +653,12 @@ return{
|
||||
['solo_h']= {"VS.", "Difícil", "¡Derrota a la CPU!"},
|
||||
['solo_l']= {"VS.", "Lunático", "¡Derrota a la CPU!"},
|
||||
['solo_u']= {"VS.", "Supremo", "¡Derrota a la CPU!"},
|
||||
['techmino49_e']= {"Tech 49", "Fácil", "Batalla de 49 jugadores. ¡El último en pie gana!"},
|
||||
['techmino49_h']= {"Tech 49", "Difícil", "Batalla de 49 jugadores. ¡El último en pie gana!"},
|
||||
['techmino49_u']= {"Tech 49", "Supremo", "Batalla de 49 jugadores. ¡El último en pie gana!"},
|
||||
['techmino99_e']= {"Tech 99", "Fácil", "Batalla de 99 jugadores. ¡El último en pie gana!"},
|
||||
['techmino99_h']= {"Tech 99", "Difícil", "Batalla de 99 jugadores. ¡El último en pie gana!"},
|
||||
['techmino99_u']= {"Tech 99", "Supremo", "Batalla de 99 jugadores. ¡El último en pie gana!"},
|
||||
['techmino49_e']= {"Tech 49", "Fácil", "Batalla de 49 jugadores.\n¡El último en pie gana!"},
|
||||
['techmino49_h']= {"Tech 49", "Difícil", "Batalla de 49 jugadores.\n¡El último en pie gana!"},
|
||||
['techmino49_u']= {"Tech 49", "Supremo", "Batalla de 49 jugadores.\n¡El último en pie gana!"},
|
||||
['techmino99_e']= {"Tech 99", "Fácil", "Batalla de 99 jugadores.\n¡El último en pie gana!"},
|
||||
['techmino99_h']= {"Tech 99", "Difícil", "Batalla de 99 jugadores.\n¡El último en pie gana!"},
|
||||
['techmino99_u']= {"Tech 99", "Supremo", "Batalla de 99 jugadores.\n¡El último en pie gana!"},
|
||||
['round_e']= {"Por Turnos", "Fácil", "Modo ajedrez."},
|
||||
['round_n']= {"Por Turnos", "Normal", "Modo ajedrez."},
|
||||
['round_h']= {"Por Turnos", "Difícil", "Modo ajedrez."},
|
||||
@@ -667,12 +666,15 @@ return{
|
||||
['round_u']= {"Por Turnos", "Supremo", "Modo ajedrez."},
|
||||
['master_n']= {"Master", "Normal", "Para principiantes en 20G"},
|
||||
['master_h']= {"Master", "Difícil", "¡Desafío profesional de 20G!"},
|
||||
-- ['master_m']= {"Master", "M21", "For 20G Masters."},
|
||||
['master_final']= {"Master", "FINAL", "El verdadero 20G Supremo: el final es inalcanzable."},
|
||||
['master_ex']= {"GrandMaster", "EXTRA", "Para ser un gran maestro, acepta este desafío"},
|
||||
-- ['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||
-- ['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||
-- ['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||
['master_m']= {"Master", "M21", "Para Maestros del 20G."},
|
||||
['master_final']= {"Master", "FINAL", "El verdadero 20G Supremo:\nel final es inalcanzable."},
|
||||
['master_ex']= {"GrandMaster", "EXTRA", "Para ser un gran maestro,\nacepta este desafío"},
|
||||
['strategy_e']= {"Strategy", "EASY", "Decisiones rápidas en 20G."},
|
||||
['strategy_h']= {"Strategy", "HARD", "Decisiones rápidas en 20G."},
|
||||
['strategy_u']= {"Strategy", "ULTIMATE", "Decisiones rápidas en 20G."},
|
||||
['strategy_e_plus']={"Strategi", "MUDAH+", "Decisiones rápidas en 20G."},
|
||||
['strategy_h_plus']={"Strategi", "SULIT+", "Decisiones rápidas en 20G."},
|
||||
['strategy_u_plus']={"Strategi", "TERAKHIR+", "Decisiones rápidas en 20G."},
|
||||
['blind_e']= {"A Ciegas", "Parcial", "Para novatos."},
|
||||
['blind_n']= {"A Ciegas", "Total", "Para jugadores intermedios."},
|
||||
['blind_h']= {"A Ciegas", "Inmediato", "Para jugadores experimentados"},
|
||||
@@ -693,7 +695,7 @@ return{
|
||||
['defender_l']= {"Defensor", "Lunático", "¡Practica la defensa!"},
|
||||
['dig_h']= {"Downstack", "Difícil", "¡Practica el downstackeo!"},
|
||||
['dig_u']= {"Downstack", "Supremo", "¡Practica el downstackeo!"},
|
||||
-- ['clearRush']= {"Clear Rush", "NORMAL", "All-spin tutorial!\n[Under construction]"},
|
||||
['clearRush']= {"Clear Rush", "NORMAL", "¡Tutorial de Allspins!\n[En construcción]"},
|
||||
['c4wtrain_n']= {"Entrenar C4W", "Normal", "Combos infinitos."},
|
||||
['c4wtrain_l']= {"Entrenar C4W", "Lunático", "Combos infinitos."},
|
||||
['pctrain_n']= {"Entrenar PC", "Normal", "Modo sencillo para practicar Perfect Clears."},
|
||||
@@ -709,7 +711,7 @@ return{
|
||||
['tech_l']= {"Tech", "Lunático", "¡Mantén el B2B!"},
|
||||
['tech_l_plus']= {"Tech", "Lunático+", "¡Sólo se permiten Spins y PCs!"},
|
||||
['tech_finesse']= {"Tech", "Finesse", "¡No cometas errores de Finesse!"},
|
||||
['tech_finesse_f']= {"Tech", "Finesse+", "Sin errores de finesse, ¡pero tampoco clears normales!"},
|
||||
['tech_finesse_f']= {"Tech", "Finesse+", "Sin errores de finesse,\n¡pero tampoco clears normales!"},
|
||||
['tsd_e']= {"Desafío de TSD", "Fácil", "¡Sólo se permiten T-Spin Dobles!"},
|
||||
['tsd_h']= {"Desafío de TSD", "Difícil", "¡Sólo se permiten T-Spin Dobles!"},
|
||||
['tsd_u']= {"Desafío de TSD", "Supremo", "¡Sólo se permiten T-Spin Dobles!"},
|
||||
@@ -718,7 +720,7 @@ return{
|
||||
['backfire_l']= {"Retorno", "Lunático", "Lidia con tus propias líneas basura."},
|
||||
['backfire_u']= {"Retorno", "Supremo", "Lidia con tus propias líneas basura."},
|
||||
['sprintAtk']= {"Sprint", "100L - Ataque", "¡Envía 100 líneas de ataque!"},
|
||||
-- ['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40lines!"},
|
||||
['sprintEff']= {"Sprint", "Efficiency", "¡Envía ataque eficiente en 40 líneas!"},
|
||||
['zen']= {'Zen', "200L", "200 líneas sin límite de tiempo."},
|
||||
['ultra']= {'Ultra', "Extra", "¡Consigue el mayor puntaje posible en 2 minutos!"},
|
||||
['infinite']= {"Infinito", "", "Modo Sandbox."},
|
||||
|
||||
@@ -128,7 +128,8 @@ return{
|
||||
chatStart="--------Début des logs--------",
|
||||
chatHistory="-Nouveaux messages en dessous-",
|
||||
|
||||
-- keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete",
|
||||
-- searchModeHelp="Type to search",
|
||||
-- keySettingHelp="Press to bind key\nescape: cancel\nbackspace: delete",
|
||||
-- customBGhelp="Drop image file here to apply custom background",
|
||||
-- customBGloadFailed="Unsupport image format for custom background",
|
||||
|
||||
@@ -172,9 +173,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 !",
|
||||
FNSF and"/"or"Le créateur n'est pas responsable pour n'importe quel type de perte de données suite à une modification du jeu.",
|
||||
FNSF and"/"or"Si vous ne parvenez pas à utiliser à la fois WeChat Pay et AliPay,",
|
||||
FNSF and"/"or"vous pouvez vous rendre sur notre page P\97\116\114\101\111\110 pour nous soutenir !",
|
||||
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={
|
||||
"Author: MrZ E-mail: 1046101471@qq.com",
|
||||
@@ -185,7 +185,7 @@ return{
|
||||
"Musique : MrZ, 柒栎流星, ERM, Trebor, C₂₉H₂₅N₃O₅, [T0722, Aether]",
|
||||
"Voix & Sons: Miya, Xiaoya, Mono, MrZ, Trebor",
|
||||
"Performance: 模电, HBM",
|
||||
"Traduction: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅",
|
||||
"Traduction: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅, NOT_A_ROBOT",
|
||||
"",
|
||||
"Merci à:",
|
||||
"Flyz, Big_True, NOT_A_ROBOT, 思竣, yuhao7370",
|
||||
@@ -215,9 +215,8 @@ return{
|
||||
dict="Zictionary",
|
||||
-- replays="Replays",
|
||||
},
|
||||
mode={
|
||||
modeExplorer={
|
||||
mod="Mods (F1)",
|
||||
start="Démarrer",
|
||||
},
|
||||
mod={
|
||||
title="Mods",
|
||||
@@ -299,10 +298,9 @@ return{
|
||||
},
|
||||
setting_game={
|
||||
title="Paramètres du jeu",
|
||||
|
||||
graphic="←Vidéo",
|
||||
sound="Son→",
|
||||
layout="Disposition",
|
||||
-- style="Style",
|
||||
|
||||
ctrl="Paramètres de contrôle",
|
||||
key="Touches",
|
||||
@@ -359,7 +357,7 @@ return{
|
||||
fullscreen="Plein écran",
|
||||
|
||||
-- bg_on="Normal B.G.",
|
||||
-- bg_on="No B.G.",
|
||||
-- bg_off="No B.G.",
|
||||
-- bg_custom="Use Custom B.G.",
|
||||
|
||||
-- blockSatur="Block Saturation",
|
||||
@@ -674,9 +672,12 @@ return{
|
||||
['master_final']= {"Master", "FINAL", "20G : Un point final impossible à atteindre !"},
|
||||
-- ['master_ph']= {"Mester", "FANTASMA", "20G: ???"},
|
||||
['master_ex']= {"GrandMaster", "EXTRA", "Tentez de devenir un Grandmaster."},
|
||||
-- ['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||
-- ['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||
-- ['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||
['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||
['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||
['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||
-- ['strategy_e_plus']={"Strategi", "MUDAH+", "Keputusan 20G cepat"},
|
||||
-- ['strategy_h_plus']={"Strategi", "SULIT+", "Keputusan 20G cepat"},
|
||||
-- ['strategy_u_plus']={"Strategi", "TERAKHIR+", "Keputusan 20G cepat"},
|
||||
['blind_e']= {"Aveugle", "MOITIE", "Pour les novices."},
|
||||
['blind_n']= {"Aveugle", "TOUT", "Pour les joueurs intermédiaires."},
|
||||
['blind_h']= {"Aveugle", "SOUDAIN", "Pour les bons jooeurs."},
|
||||
@@ -713,7 +714,7 @@ return{
|
||||
['tech_l']= {"Tech", "LUNATIQUE", "Gardez le B2B !"},
|
||||
['tech_l_plus']= {"Tech", "LUNATIQUE+", "Spin & PC uniquement"},
|
||||
['tech_finesse']= {"Tech", "FINESSE", "Pas d'erreurs de finesse !"},
|
||||
['tech_finesse_f']={"Tech", "FINESSE+", "Pas de nettoyages normaux, Pas d'erreurs de finesse !"},
|
||||
['tech_finesse_f']={"Tech", "FINESSE+", "Pas de nettoyages normaux,\nPas d'erreurs de finesse !"},
|
||||
['tsd_e']= {"TSD Challenge", "FACILE", "T-spin doubles uniquement !"},
|
||||
['tsd_h']= {"TSD Challenge", "DIFFICILE", "T-spin doubles uniquement !"},
|
||||
['tsd_u']= {"TSD Challenge", "ULTIME", "T-spin doubles uniquement !"},
|
||||
|
||||
899
parts/language/lang_id.lua
Normal file
@@ -0,0 +1,899 @@
|
||||
local C=COLOR
|
||||
return{
|
||||
fallback='en',
|
||||
loadText={
|
||||
loadSFX="Memuat efek suara",
|
||||
loadSample="Memuat sampel-sampel instrumen",
|
||||
loadVoice="Memuat kumpulan suara",
|
||||
loadFont="Memuat fon",
|
||||
loadMode="Memuat mode-mode",
|
||||
loadOther="Memuat aset-aset yang lain",
|
||||
finish="Tekan tombol apapun untuk memulai!",
|
||||
},
|
||||
sureQuit="Tekan lagi untuk keluar",
|
||||
sureReset="Tekan lagi untuk mereset",
|
||||
sureDelete="Tekan lagi untuk menghapus",
|
||||
newDay="Hari baru, awal baru!",
|
||||
playedLong="Anda telah bermain lama. Waktunya istirahat!",
|
||||
playedTooMuch="Anda telah bermain terlalu lama! Techmino sangat menyenangkan, tetapi jangan lupa istirahat!",
|
||||
settingWarn="Awas, Anda akan mengubah beberapa pengaturan yang tidak biasanya diubah!",
|
||||
|
||||
atkModeName={"Acak","Badge","K.O.","Penyerang"},
|
||||
royale_remain="$1 Pemain Tersisa",
|
||||
powerUp={[0]="+000%","+025%","+050%","+075%","+100%"},
|
||||
cmb={nil,"1 Kombo","2 Kombo","3 Kombo","4 Kombo","5 Kombo","6 Kombo","7 Kombo","8 Kombo","9 Kombo","10 Kombo!","11 Kombo!","12 Kombo!","13 Kombo!","14 Kombo!!","15 Kombo!!","16 Kombo!!","17 Kombo!!!","18 Kombo!!!","19 Kombo!!!","MEGA KOMBO"},
|
||||
spin=" spin",
|
||||
clear={"Single","Double","Triple","Techrash","Pentacrash","Hexacrash","Heptacrash","Octacrash","Nonacrash","Decacrash","Undecacrash","Dodecacrash","Tridecacrash","Tetradecacrash","Pentadecacrash","Hexadecacrash","Heptadecacrash","Octadecacrash","Nonadecacrash","Ultracrash","Impossicrash"},
|
||||
cleared="$1 baris",
|
||||
mini="Mini",b2b="B2B ",b3b="B2B2B ",
|
||||
PC="PC",HPC="Hampir PC",
|
||||
replaying="[Diulang]",
|
||||
tasUsing="[TAS]",
|
||||
|
||||
stage="Tahap $1 selesai!",
|
||||
great="Bagus!",
|
||||
awesome="Luar biasa!",
|
||||
almost="Hampir!",
|
||||
continue="Lanjut!",
|
||||
maxspeed="KECEPATAN MAXIMUM!",
|
||||
speedup="Percepatkan!",
|
||||
missionFailed="Salah",
|
||||
|
||||
speedLV="Kecepatan lvl",
|
||||
piece="Blok",line="Baris",atk="Baris Terkirim",eff="Efisiensi",
|
||||
rpm="RPM",tsd="TSD",
|
||||
grade="Nilai",techrash="Techrash",
|
||||
wave="Gelombang",nextWave="Lanjutan",
|
||||
combo="Kombo",maxcmb="Max Kombo",
|
||||
pc="PC",ko="KOs",
|
||||
|
||||
win="Menang!",
|
||||
lose="Kalah",
|
||||
|
||||
finish="Selesai",
|
||||
gamewin="Anda menang!",
|
||||
gameover="Tamat",
|
||||
|
||||
pause="Terjeda",
|
||||
pauseCount="Jeda-jeda",
|
||||
finesse_ap="Semua sempurna",
|
||||
finesse_fc="Kombo penuh",
|
||||
|
||||
page="Halaman:",
|
||||
|
||||
cc_fixed="CC tidak cocok dengan urutan tetap.",
|
||||
cc_swap="CC tidak cocok dengan mode simpan tukar.",
|
||||
ai_prebag="AI tidak cocok dengan urutan terubah yang memiliki non-tetromino.",
|
||||
ai_mission="AI tidak cocok dengan misi terubah.",
|
||||
switchSpawnSFX="Nyalakan efek suara munculan blok!",
|
||||
needRestart="Ulangi untuk menerapkan perubahan.",
|
||||
|
||||
loadError_errorMode="'$1' eror memuat: tidak ada mode memuat '$2'",
|
||||
loadError_read="'$1' eror memuat: gagal membaca",
|
||||
loadError_noFile="'$1' eror memuat: tidak ada file:",
|
||||
loadError_other="'$1' eror memuat: $2",
|
||||
loadError_unknown="'$1' eror memuat: alasan tidak diketahui",
|
||||
|
||||
saveError_duplicate="'$1' eror menyimpan: nama file tergAnda",
|
||||
saveError_encode="'$1' eror menyimpan: gagal menyandi",
|
||||
saveError_other="'$1' eror menyimpan: $2",
|
||||
saveError_unknown="'$1' eror menyimpan: alasan tidak diketahui",
|
||||
|
||||
copyDone="Tersalin!",
|
||||
saveDone="Data disimpan",
|
||||
exportSuccess="Ekspor berhasil",
|
||||
importSuccess="Impor berhasil",
|
||||
dataCorrupted="Data rusak",
|
||||
pasteWrongPlace="Menempel di tempat yang salah?",
|
||||
noFile="File tidak ada",
|
||||
|
||||
nowPlaying="Sekarang mendengarkan:",
|
||||
|
||||
VKTchW="Berat sentuhan",
|
||||
VKOrgW="Berat asal",
|
||||
VKCurW="Berat posisi saat ini",
|
||||
|
||||
noScore="Tidak ada nilai",
|
||||
modeLocked="Terkunci",
|
||||
unlockHint="Raih nilai B keatas dalam mode sebelumnya untuk membuka kunci.",
|
||||
highScore="Nilai-nilai tertinggi",
|
||||
newRecord="Rekor baru!",
|
||||
|
||||
replayBroken="Tidak bisa memuat ulangan permainan",
|
||||
|
||||
dictNote="==Tersalin dari TetroDictionary==",
|
||||
|
||||
getNoticeFail="Gagal mengambil pengumuman-pengumuman",
|
||||
oldVersion="Versi $1 sekarang tersedia",
|
||||
needUpdate="Butuh versi lebih baru!",
|
||||
versionNotMatch="Versi tidak sama!",
|
||||
notFinished="Segera akan datang!",
|
||||
|
||||
jsonError="Eror JSON",
|
||||
|
||||
noUsername="Silahkan masukki username Anda",
|
||||
wrongEmail="Alamat email tidak sah",
|
||||
noPassword="Silahkan masukki kata sandi Anda",
|
||||
diffPassword="Kata sandi tidak sama",
|
||||
registerRequestSent="Permintaan daftar telah terkirim.",
|
||||
registerSuccessed="Pendaftaran sukses!",
|
||||
loginSuccessed="Anda sekarang tergabung!",
|
||||
accessSuccessed="Akses diberikan",
|
||||
|
||||
wsConnecting="Menghubungkan websocket…",
|
||||
wsFailed="Koneksi websocket gagal",
|
||||
wsClose="Websocket tertutup:",
|
||||
netTimeout="Koneksi waktu habis",
|
||||
|
||||
onlinePlayerCount="Online",
|
||||
createRoomSuccessed="Ruang dibuat",
|
||||
started="Bermain",
|
||||
joinRoom="telah memasuki ruangan.",
|
||||
leaveRoom="telah keluar dari ruangan.",
|
||||
ready="Siap",
|
||||
connStream="Menghubungi",
|
||||
waitStream="Menunggu",
|
||||
spectating="Menonton",
|
||||
chatRemain="Online",
|
||||
chatStart="------Awal percakapan------",
|
||||
chatHistory="------Pesan-pesan baru di bawah ini------",
|
||||
|
||||
-- searchModeHelp="Type to search",
|
||||
keySettingHelp="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",
|
||||
|
||||
errorMsg="Techmino mengalami eror dan harus memuat ulang.\nAnda bisa mengirim log eror ke developer.",
|
||||
tryAnotherBuild="[Invalid UTF-8] Jika Anda di Windows, coba download Techmino-win32 atau Techmino-win64 (berbeda dari yang Anda menggunakan sekarang).",
|
||||
|
||||
modInstruction="Pilih mod Anda!\nMod memungkinkan Anda untuk mengubah permainan,\ntetapi juga bisa menghancur permainan.\nNilai-nilai tidak akan disimpan saat menggunakan mod.",
|
||||
modInfo={
|
||||
next="BLOK LANJUT\nMengubah jumlah blok lanjut yang ditampilkan.",
|
||||
hold="SIMPAN\nMengubah jumlah blok yang bisa disimpan.",
|
||||
hideNext="BLOK LANJUT Tersembunyi\nMenyembunyikan beberapa blok lanjut.",
|
||||
infHold="SIMPAN SELAMANYA\nMemungkinkan Anda untuk menyimpan blok-blok selamanya.",
|
||||
hideBlock="Sembunyikan Blok Aktif\nMenyembunyikan blok yang Anda mengontrol.",
|
||||
hideGhost="Sembunyikan Blok Hantu\nMenyembunyikan blok yang menunjukkan tempat blok yang sedang dikontrol akan jatuh.",
|
||||
hidden="Sembunyikan Blok Terdarat\nMenyembunyikan blok yang sudah mendarat setelah waktu yang tertentu.",
|
||||
hideBoard="Sembunyikan Tempat Main\nMenyembunyikan bagian atau seluruh tempat main.",
|
||||
flipBoard="Putar Tempat Main\nMembalik atau memutar tempat main.",
|
||||
dropDelay="Gravitasi\nMengubah gravitasi dalam frame per blok.",
|
||||
lockDelay="Tunda Mengunci\nMengubah tunda mengunci dalam frame.",
|
||||
waitDelay="Tunda Muncul\nMengubah tunda muncul blok dalam frame.",
|
||||
fallDelay="Tunda Baris\nMengubah tunda saat membuat baris dalam frame.",
|
||||
life="Nyawa\nMengubah nomor awal nyawa.",
|
||||
forceB2B="Hanya B2B\nMengakhirkan permainan jika meter B2B jatuh ke 0.",
|
||||
forceFinesse="Efisiensi Tombol Maximum\nMengakhirkan permainan jika efisiensi tombol tidak maksimum.",
|
||||
tele="Teleport\nMengubah DAS dan ARR ke 0.",
|
||||
noRotation="Tidak berputar\nMematikan pemutaran blok.",
|
||||
noMove="Tidak bergerak\nMematikan pergerakan kiri dan kanan blok.",
|
||||
customSeq="Pengacak\nMengganti pengacak blok.",
|
||||
pushSpeed="Kecepatan blok serangan\nMengubah kecepatan muncul blok serangan (blok/frame).",
|
||||
boneBlock="[ ]\nMain dengan blok [ ].",
|
||||
},
|
||||
pauseStat={
|
||||
"Waktu:",
|
||||
"Tombol/Putar/Simpan:",
|
||||
"Blok:",
|
||||
"Baris/Baris Gali:",
|
||||
"Serangan/Serangan Gali:",
|
||||
"Diterima:",
|
||||
"Jumlah Tindakan Membuat Baris:",
|
||||
"Spins:",
|
||||
"B2B/B3B/PC/Hampir PC:",
|
||||
"Efisiensi Tombol:",
|
||||
},
|
||||
radar={"BLOK","SERANGAN","SRGN + BLOK","SRGN TERKIRIM","KECEPATAN","GALI"},
|
||||
radarData={"D'PM","ADPM","APM","SPM","L'PM","DPM"},
|
||||
stat={
|
||||
"Jumlah Pembukaan:",
|
||||
"Jumlah Permainan:",
|
||||
"Jumlah Waktu Bermain:",
|
||||
"Tombol/Putar/Simpan:",
|
||||
"Blok/Baris/Serangan:",
|
||||
"Serangan Diterima/Ditolak/Muncul:", -- what is this
|
||||
"Gali/Serangan Gali:",
|
||||
"Efisiensi/Efisiensi Gali:",
|
||||
"B2B/B2B2B:",
|
||||
"PC/Hampir PC:",
|
||||
"Efisiensi Tombol Tidak Maksimal/Nilai:",
|
||||
},
|
||||
aboutTexts={
|
||||
"Ini hanya penyusun blok *normal*. Sungguh, hanya itu saja.",
|
||||
"Terinspirasi oleh C2, IO, JS, WWC, KOS, dll.",
|
||||
"",
|
||||
"Dipersembahkan oleh kerangka permainan LÖVE",
|
||||
"Saran dan laporan bug dihargai!",
|
||||
"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",
|
||||
},
|
||||
staff={
|
||||
"Pencipta: MrZ Email: 1046101471@qq.com",
|
||||
"Dipersembahkan oleh kerangka permainan LÖVE",
|
||||
"",
|
||||
"Program: MrZ, Particle_G, [scdhh, FinnTenzor]",
|
||||
"Penggambar: MrZ, Gnyar, C₂₉H₂₅N₃O₅, ScF, [旋律星萤, T0722]",
|
||||
"Musik: MrZ, 柒栎流星, ERM, Trebor, C₂₉H₂₅N₃O₅, [T0722, Aether]",
|
||||
"Suara: Miya, Xiaoya, Mono, MrZ, Trebor",
|
||||
"Pertunjukan: 模电, HBM",
|
||||
"Translasi: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅, NOT_A_ROBOT",
|
||||
"",
|
||||
"Terima Kasih Khusus:",
|
||||
"Flyz, Big_True, NOT_A_ROBOT, 思竣, yuhao7370",
|
||||
"Farter, Teatube, 蕴空之灵, T9972, [All test staff]",
|
||||
},
|
||||
used=[[
|
||||
Alat-alat yang digunakan:
|
||||
BeepBox
|
||||
GoldWave
|
||||
GFIE
|
||||
FL Mobile
|
||||
Library yang digunakan:
|
||||
Cold_Clear [MinusKelvin]
|
||||
json.lua [rxi]
|
||||
profile.lua [itraykov]
|
||||
simple-love-lights [dylhunn]
|
||||
]],
|
||||
support="Dukung pencipta",
|
||||
WidgetText={
|
||||
main={
|
||||
offline="Main Sendiri",
|
||||
qplay="Terakhir Dimain",
|
||||
online="Multipemain",
|
||||
custom="Permainan Tersesuai",
|
||||
setting="Pengaturan",
|
||||
stat="Statistik",
|
||||
dict="Zictionary",
|
||||
replays="Permainan Terulang",
|
||||
},
|
||||
main_simple={
|
||||
sprint="Balapan",
|
||||
marathon="Maraton",
|
||||
},
|
||||
modeExplorer={
|
||||
mod="Mod (F1)",
|
||||
},
|
||||
mod={
|
||||
title="Mod",
|
||||
reset="Reset (tab)",
|
||||
unranked="Tidak Berperingkat",
|
||||
},
|
||||
pause={
|
||||
setting="Pengaturan (S)",
|
||||
replay="Ulang (P)",
|
||||
save="Simpan Pengulangan (O)",
|
||||
resume="Lanjut (esc)",
|
||||
restart="Coba lagi (R)",
|
||||
quit="Berhenti (Q)",
|
||||
tas="TAS (T)",
|
||||
},
|
||||
net_menu={
|
||||
league="Tech League",
|
||||
ffa="FFA",
|
||||
rooms="Ruang-ruang",
|
||||
logout="Log out",
|
||||
},
|
||||
net_league={
|
||||
match="Cari Tandingan",
|
||||
},
|
||||
net_rooms={
|
||||
password="Password",
|
||||
refreshing="Merefresh daftar",
|
||||
noRoom="Tidak ada ruangan",
|
||||
refresh="Refresh",
|
||||
new="Ruangan Baru",
|
||||
join="Masuk",
|
||||
},
|
||||
net_newRoom={
|
||||
title="Pengaturan Ruangan",
|
||||
roomName="Nama ruangan (Jika kosong: \"[username]'s room\")",
|
||||
password="Password (opsional)",
|
||||
description="Deskripsi Ruangan",
|
||||
|
||||
life="Nyawa",
|
||||
pushSpeed="Kcptn. Dorongan",
|
||||
garbageSpeed="Kcptn. Serangan",
|
||||
visible="Visibilitas",
|
||||
freshLimit="Batas Reset Tunda Kunci",
|
||||
|
||||
fieldH="Ketinggian",
|
||||
bufferLimit="Batas Serangan",
|
||||
heightLimit="Batas Tinggi",
|
||||
|
||||
drop="Tunda Jatuh",
|
||||
lock="Tunda Kunci",
|
||||
wait="Tunda Muncul",
|
||||
fall="Tunda Baris",
|
||||
hang="Tunda Kalah",
|
||||
hurry="Menggangu Tunda",
|
||||
|
||||
capacity="Kapasitas",
|
||||
create="Buat",
|
||||
|
||||
ospin="O-spin",
|
||||
fineKill="100% Efisiensi Tombol",
|
||||
b2bKill="Akhirkan Permainan Jika Tidak B2B",
|
||||
lockout="Akhirkan Permainan Jika Lock Out",
|
||||
easyFresh="Reset Tunda Kunci Normal",
|
||||
deepDrop="Jatuh Dalam",
|
||||
bone="Blok [ ]",
|
||||
|
||||
eventSet="Aturan",
|
||||
|
||||
holdMode="Mode Simpan",
|
||||
nextCount="Pratinjau Blok Lanjut",
|
||||
holdCount="Blok Simpan",
|
||||
infHold="Simpan Selamanya",
|
||||
phyHold="Simpan Di Tempat",
|
||||
},
|
||||
net_game={
|
||||
ready="Siap",
|
||||
spectate="Nonton",
|
||||
cancel="Batal Siap",
|
||||
},
|
||||
setting_game={
|
||||
title="Pengaturan Permainan",
|
||||
graphic="←Video",
|
||||
sound="Audio→",
|
||||
layout="Ubah Blok-blok",
|
||||
|
||||
ctrl="Ubah Kontrol",
|
||||
key="Ubah Tindakan Tombol",
|
||||
touch="Pengaturan Sentuhan",
|
||||
showVK="Tunjuk Tombol Sentuh",
|
||||
reTime="Tunda Mulai",
|
||||
RS="Sistem Putar",
|
||||
menuPos="Pos. Tombol Menu",
|
||||
sysCursor="Guna Mouse Bawaan",
|
||||
autoPause="Jeda Jika Tidak Difokus",
|
||||
autoSave="Simpan Rekor Otomatis",
|
||||
autoLogin="Auto-login Saat Membuka",
|
||||
simpMode="Mode Sederhana",
|
||||
},
|
||||
setting_video={
|
||||
title="Pengaturan Video",
|
||||
sound="←Audio",
|
||||
game="Permainan→",
|
||||
|
||||
block="Gambarkan Blok",
|
||||
smooth="Jatuh Halus",
|
||||
upEdge="Blok 3D",
|
||||
bagLine="Pemisah Kantong",
|
||||
|
||||
ghostType="Tipe Hantu",
|
||||
ghost="Kegelapan Hantu",
|
||||
center="Kegelapan Tengah Pemutaran",
|
||||
grid="Kegelapan Kisi",
|
||||
lineNum="Kegelapan Nomor Baris",
|
||||
|
||||
lockFX="Efek Kunci",
|
||||
dropFX="Efek Jatuh",
|
||||
moveFX="Efek Pindah",
|
||||
clearFX="Efek Baris",
|
||||
splashFX="Efek Guyuran Baris",
|
||||
shakeFX="Goyang Tempat Main",
|
||||
atkFX="Efek Serang",
|
||||
|
||||
frame="Kecepatan Bingkai (%)",
|
||||
FTlock="Lewat Bingkai",
|
||||
|
||||
text="Teks Baris",
|
||||
score="Teks Nilai",
|
||||
bufferWarn="Peringatan Serangan",
|
||||
showSpike="Teks Serang",
|
||||
nextPos="Pratinjau Muncul Blok",
|
||||
highCam="Scroll Tempat Main",
|
||||
warn="Peringatan Bahaya",
|
||||
|
||||
clickFX="Efek Klik",
|
||||
power="Info Baterai",
|
||||
clean="Gambar Cepat",
|
||||
fullscreen="Layar Penuh",
|
||||
|
||||
bg_on="B.G. Normal",
|
||||
bg_off="Tidak Ada B.G.",
|
||||
bg_custom="Ubah B.G.",
|
||||
|
||||
blockSatur="Kejenuhan Blok Aktif",
|
||||
fieldSatur="Kejenuhan Blok Terkunci",
|
||||
},
|
||||
setting_sound={
|
||||
title="Pengaturan Audio",
|
||||
|
||||
game="←Permainan",
|
||||
graphic="Video→",
|
||||
|
||||
mainVol="Volume Utama",
|
||||
bgm="Musik",
|
||||
sfx="Efek Suara",
|
||||
stereo="Stereo",
|
||||
spawn="Efek Muncul Blok",
|
||||
warn="Efek Bahaya",
|
||||
vib="Getaran",
|
||||
voc="Suara",
|
||||
|
||||
autoMute="Bisukan Bila Tidak Fokus",
|
||||
fine="Efek Efisiensi Tombol Tidak Maksimum",
|
||||
sfxPack="Kumpulan Efek Suara",
|
||||
vocPack="Kumpulan Suara",
|
||||
apply="Terapkan",
|
||||
},
|
||||
setting_control={
|
||||
title="Pengaturan Kontrol",
|
||||
preview="Pratinjau",
|
||||
|
||||
das="DAS",arr="ARR",
|
||||
dascut="Gangguan DAS",
|
||||
dropcut="Gangguan Auto-kunci",
|
||||
sddas="DAS Jatuh",sdarr="ARR Jatuh",
|
||||
ihs="Simpan Saat Tunda",
|
||||
irs="Putar Saat Tunda",
|
||||
ims="Pindah Saat Tunda",
|
||||
reset="Reset",
|
||||
},
|
||||
setting_key={
|
||||
a1="Pindah Kiri",
|
||||
a2="Pindah Kanan",
|
||||
a3="Putar Kanan",
|
||||
a4="Putar Kiri",
|
||||
a5="Putar 180°",
|
||||
a6="Jatuh Cepat",
|
||||
a7="Jatuh Pelan",
|
||||
a8="Simpan",
|
||||
a9="Fungsi 1",
|
||||
a10="Fungsi 2",
|
||||
a11="Kiri Instan",
|
||||
a12="Kanan Instan",
|
||||
a13="Jatuh Instan",
|
||||
a14="Jatuh 1",
|
||||
a15="Jatuh 4",
|
||||
a16="Jatuh 10",
|
||||
a17="Jatuh Kiri",
|
||||
a18="Jatuh Kanan",
|
||||
a19="Zangi Kiri",
|
||||
a20="Zangi Kanan",
|
||||
restart="Coba Lagi",
|
||||
},
|
||||
setting_skin={
|
||||
skinSet="Tekstur Blok",
|
||||
title="Pengaturan Ragam",
|
||||
skinR="Reset Warna",
|
||||
faceR="Reset Arah",
|
||||
},
|
||||
setting_touch={
|
||||
default="Bawaan",
|
||||
snap="Kisi",
|
||||
size="Ukuran",
|
||||
shape="Bentuk",
|
||||
},
|
||||
setting_touchSwitch={
|
||||
b1= "Pindah Kiri:", b2="Pindah Kanan:",b3="Putar Kanan:", b4="Putar Kiri:",
|
||||
b5= "Putar 180°:", b6="Jatuh Cepat:", b7="Jatuh Pelan:", b8="Simpan:",
|
||||
b9= "Fungsi 1:", b10="Fungsi 2:", b11="Kiri Instan:",b12="Kanan Instan:",
|
||||
b13="Jatuh Instan:",b14="Jatuh 1:", b15="Jatuh 4:", b16="Jatuh 10:",
|
||||
b17="Jatuh Kiri:", b18="Jatuh Kanan:",b19="Zangi Kiri:", b20="Zangi Kanan:",
|
||||
|
||||
norm="Normal",
|
||||
pro="Canggih",
|
||||
icon="Ikon",
|
||||
sfx="Efek Suara",
|
||||
vib="Getaran",
|
||||
alpha="Kegelapan",
|
||||
|
||||
track="Auto Lacak",
|
||||
dodge="Auto Hindar",
|
||||
},
|
||||
customGame={
|
||||
title="Permainan Tersesuai",
|
||||
defSeq="Urutan Bawaan",
|
||||
noMsn="Tidak Ada Misi",
|
||||
|
||||
drop="Tunda Jatuh",
|
||||
lock="Tunda Kunci",
|
||||
wait="Tunda Muncul",
|
||||
fall="Tunda Garis",
|
||||
hang="Tunda Kalah",
|
||||
hurry="Gangguan Tunda",
|
||||
|
||||
bg="Latar Belakang",
|
||||
bgm="Musik",
|
||||
|
||||
copy="Salin Permainan",
|
||||
paste="Tempel Permainan",
|
||||
play_clear="Mulai Normal",
|
||||
play_puzzle="Mulai Membangun",
|
||||
|
||||
reset="Reset (del)",
|
||||
advance="More (A)",
|
||||
mod="Mod (F1)",
|
||||
field="Ubah Blok (F)",
|
||||
sequence="Ubah Urutan (S)",
|
||||
mission="Ubah Misi (M)",
|
||||
|
||||
eventSet="Aturan",
|
||||
|
||||
holdMode="Mode Simpan",
|
||||
nextCount="Pratinjau Blok Lanjut",
|
||||
holdCount="Simpan Blok",
|
||||
infHold="Simpan Selamanya",
|
||||
phyHold="Simpan Di Tempat",
|
||||
|
||||
fieldH="Ketinggian",
|
||||
visible="Visibilitas",
|
||||
freshLimit="Batas Reset Tunda Kunci",
|
||||
opponent="Lawan",
|
||||
life="Nyawa",
|
||||
pushSpeed="Kcptn. Dorongan",
|
||||
garbageSpeed="Kcptn. Serangan",
|
||||
|
||||
bufferLimit="Batas Serangan",
|
||||
heightLimit="Batas Tinggi",
|
||||
ospin="O-Spin",
|
||||
fineKill="Maksimum Efisiensi Tombol",
|
||||
b2bKill="Akhirkan Permainan Jika Tidak B2B",
|
||||
lockout="Akhirkan Permainan Jika Lock Out",
|
||||
easyFresh="Reset Tunda Kunci Normal",
|
||||
deepDrop="Jatuh Dalam",
|
||||
bone="Blok []",
|
||||
},
|
||||
custom_field={
|
||||
title="Permainan Tersesuai",
|
||||
subTitle="Blok Awalan",
|
||||
|
||||
any="Hapus",
|
||||
smart="Auto",
|
||||
|
||||
push="Tambah Baris (K)",
|
||||
del="Hapus Garis (L)",
|
||||
|
||||
demo="Jangan Menunjukkan ×",
|
||||
|
||||
newPg="Hal. Baru (N)",
|
||||
delPg="Hapus Hal. (M)",
|
||||
prevPg="Hal. Sebelumnya",
|
||||
nextPg="Hal. Selanjuynya",
|
||||
},
|
||||
custom_sequence={
|
||||
title="Permainan Tersesuai",
|
||||
subTitle="Urutan Blok",
|
||||
sequence="Urutan Blok",
|
||||
},
|
||||
custom_mission={
|
||||
title="Permainan Tersesuai",
|
||||
subTitle="Misi",
|
||||
|
||||
_1="1",_2="2",_3="3",_4="4",
|
||||
any1="apapun-1",any2="apapun-2",any3="apapun-3",any4="apapun-4",
|
||||
PC="PC",
|
||||
Z1="Z1",S1="S1",J1="J1",L1="L1",T1="T1",O1="O1",I1="I1",
|
||||
Z2="Z2",S2="S2",J2="J2",L2="L2",T2="T2",O2="O2",I2="I2",
|
||||
Z3="Z3",S3="S3",J3="J3",L3="L3",T3="T3",O3="O3",I3="I3",
|
||||
O4="O4",I4="I4",
|
||||
mission="Paksa Misi",
|
||||
},
|
||||
about={
|
||||
staff="Staf",
|
||||
his="Riwayat",
|
||||
legals="Info Legal",
|
||||
},
|
||||
dict={
|
||||
title="TetroKamus",
|
||||
},
|
||||
stat={
|
||||
path="Buka Folder Data",
|
||||
save="Kelola Data",
|
||||
},
|
||||
music={
|
||||
title="Ruang Musik",
|
||||
arrow="→",
|
||||
now="Sekarang bermain:",
|
||||
|
||||
bgm="Volume",
|
||||
sound="Efek Suara",
|
||||
},
|
||||
launchpad={
|
||||
title="Ruang Efek Suara",
|
||||
bgm="Volume Musik",
|
||||
sfx="Volume Efek",
|
||||
voc="Volume Suara",
|
||||
music="Musik",
|
||||
label="label",
|
||||
},
|
||||
login={
|
||||
title="Masuk",
|
||||
register="Daftar",
|
||||
email="Alamat Email",
|
||||
password="Password",
|
||||
keepPW="Ingat Saya",
|
||||
login="Masuk",
|
||||
},
|
||||
register={
|
||||
title="Daftar",
|
||||
login="Masuk",
|
||||
username="Username",
|
||||
email="Alamat Email",
|
||||
password="Password",
|
||||
password2="Ulangi Password",
|
||||
register="Daftar",
|
||||
registering="Menunggu respon…",
|
||||
},
|
||||
account={
|
||||
title="Akun",
|
||||
},
|
||||
app_15p={
|
||||
color="Warna",
|
||||
invis="Sembunyi",
|
||||
slide="Geser",
|
||||
pathVis="Tunjuk Jalur",
|
||||
revKB="Dibalik",
|
||||
},
|
||||
app_schulteG={
|
||||
rank="Ukuran",
|
||||
invis="Sembunyi",
|
||||
disappear="Hilangkan",
|
||||
tapFX="Efek Sentuh",
|
||||
},
|
||||
app_AtoZ={
|
||||
level="Level",
|
||||
keyboard="Keyboard",
|
||||
},
|
||||
app_2048={
|
||||
invis="Sembunyi",
|
||||
tapControl="Kontrol Sentuh",
|
||||
|
||||
skip="Lewati Ronde",
|
||||
},
|
||||
app_ten={
|
||||
next="Pratinjau",
|
||||
invis="Sembunyi",
|
||||
fast="Cepat",
|
||||
},
|
||||
app_dtw={
|
||||
color="Warna",
|
||||
mode="Mode",
|
||||
bgm="Musik",
|
||||
arcade="Arcade",
|
||||
},
|
||||
app_link={
|
||||
invis="Sembunyi",
|
||||
},
|
||||
savedata={
|
||||
export="Expor ke papan klip",
|
||||
import="Impor dari papan klip",
|
||||
unlock="Kemajuan",
|
||||
data="Statistik",
|
||||
setting="Pengaturan",
|
||||
vk="Aturan Tombol Sentuh",
|
||||
|
||||
couldSave="Penyimpanan Cloud (PERINGATAN: HANYA PERCOBAAN)",
|
||||
notLogin="[Masuk ke akun untuk mengakses penyimpanan cloud",
|
||||
upload="Unggah ke Cloud",
|
||||
download="Unduh dari Cloud",
|
||||
},
|
||||
},
|
||||
modes={
|
||||
['sprint_10l']= {"Balapan", "10L", "Buat 10 baris!"},
|
||||
['sprint_20l']= {"Balapan", "20L", "Buat 20 baris!"},
|
||||
['sprint_40l']= {"Balapan", "40L", "Buat 40 baris!"},
|
||||
['sprint_100l']= {"Balapan", "100L", "Buat 100 baris!"},
|
||||
['sprint_400l']= {"Balapan", "400L", "Buat 400 baris!"},
|
||||
['sprint_1000l']= {"Balapan", "1.000L", "Buat 1.000 baris!"},
|
||||
['sprintPenta']= {"Balapan", "PENTOMINO", "40L dengan pentomino!"},
|
||||
['sprintMPH']= {"Balapan", "MPH", "Tanpa ingatan\nTanpa pratinjau\nTanpa simpan"},
|
||||
['dig_10l']= {"Gali", "10L", "Gali 10 baris!"},
|
||||
['dig_40l']= {"Gali", "40L", "Gali 40 baris!"},
|
||||
['dig_100l']= {"Gali", "100L", "Gali 100 baris!"},
|
||||
['dig_400l']= {"Gali", "400L", "Gali 400 baris!"},
|
||||
['drought_n']= {"Nasib Buruk", "100L", "Tidak ada blok I..."},
|
||||
['drought_l']= {"Nasib Buruk+", "100L", "Nasib sangat buruk..."},
|
||||
['marathon_n']= {"Maraton", "NORMAL", "200-baris maraton dengan kecepatan meningkat"},
|
||||
['marathon_h']= {"Maraton", "SULIT", "200-baris maraton dengan kecepatan tinggi"},
|
||||
['solo_e']= {"Tarung", "MUDAH", "Kalahkan AInya!"},
|
||||
['solo_n']= {"Tarung", "NORMAL", "Kalahkan AInya!"},
|
||||
['solo_h']= {"Tarung", "SULIT", "Kalahkan AInya!"},
|
||||
['solo_l']= {"Tarung", "GILA", "Kalahkan AInya!"},
|
||||
['solo_u']= {"Tarung", "TERAKHIR", "Kalahkan AInya!"},
|
||||
['techmino49_e']= {"Tech 49", "MUDAH", "Pertarungan dengan 49 pemain."},
|
||||
['techmino49_h']= {"Tech 49", "SULIT", "Pertarungan dengan 49 pemain."},
|
||||
['techmino49_u']= {"Tech 49", "TERAKHIR", "Pertarungan dengan 49 pemain."},
|
||||
['techmino99_e']= {"Tech 99", "MUDAH", "Pertarungan dengan 99 pemain."},
|
||||
['techmino99_h']= {"Tech 99", "SULIT", "Pertarungan dengan 99 pemain."},
|
||||
['techmino99_u']= {"Tech 99", "TERAKHIR", "Pertarungan dengan 99 pemain."},
|
||||
['round_e']= {"Giliran", "MUDAH", "Giliran main melawan AI!"},
|
||||
['round_n']= {"Giliran", "NORMAL", "Giliran main melawan AI!"},
|
||||
['round_h']= {"Giliran", "SULIT", "Giliran main melawan AI!"},
|
||||
['round_l']= {"Giliran", "GILA", "Giliran main melawan AI!"},
|
||||
['round_u']= {"Giliran", "TERAKHIR", "Giliran main melawan AI!"},
|
||||
['master_n']= {"Jago", "NORMAL", "Untuk pemula 20G"},
|
||||
['master_h']= {"Jago", "SULIT", "Untuk pro 20G"},
|
||||
['master_m']= {"Jago", "M21", "Untuk jago 20G"},
|
||||
['master_final']= {"Jago", "TERAKHIR", "Lebih dari 20G"},
|
||||
['master_ph']= {"Jago", "KHAYALAN", "???"},
|
||||
['master_ex']= {"Sangat Jago", "EKSTRA", "Blok tidak kelihatan"},
|
||||
['master_instinct']={"Jago", "INSTINK", "Bagaimana jika blok terkontrol tersembunyi?"},
|
||||
['strategy_e']= {"Strategi", "MUDAH", "Keputusan 20G cepat"},
|
||||
['strategy_h']= {"Strategi", "SULIT", "Keputusan 20G cepat"},
|
||||
['strategy_u']= {"Strategi", "TERAKHIR", "Keputusan 20G cepat"},
|
||||
['strategy_e_plus']={"Strategi", "MUDAH+", "Keputusan 20G cepat"},
|
||||
['strategy_h_plus']={"Strategi", "SULIT+", "Keputusan 20G cepat"},
|
||||
['strategy_u_plus']={"Strategi", "TERAKHIR+", "Keputusan 20G cepat"},
|
||||
['blind_e']= {"Tak Terlihat", "MUDAH", "Untuk pemula"},
|
||||
['blind_n']= {"Tak Terlihat", "NORMAL", "Untuk amatir"},
|
||||
['blind_h']= {"Tak Terlihat", "SULIT", "Untuk orang berpengalaman"},
|
||||
['blind_l']= {"Tak Terlihat", "GILA", "Untuk profesional"},
|
||||
['blind_u']= {"Tak Terlihat", "???", "Apakah Anda siap?"},
|
||||
['blind_wtf']= {"Tak Terlihat", "TERAKHIR", "Anda belum siap"},
|
||||
['classic_e']= {"Klasik", "MUDAH", "Rekreasi berkecepatan rendah dari tahun 80-an"},
|
||||
['classic_h']= {"Klasik", "SULIT", "Rekreasi berkecepatan medium dari tahun 80-an"},
|
||||
['classic_u']= {"Klasik", "TERAKHIR", "Rekreasi berkecepatan tinggi dari tahun 80-an"},
|
||||
['survivor_e']= {"Bertahan", "MUDAH", "Berapa lama Anda bisa bertahan?"},
|
||||
['survivor_n']= {"Bertahan", "NORMAL", "Berapa lama Anda bisa bertahan?"},
|
||||
['survivor_h']= {"Bertahan", "SULIT", "Berapa lama Anda bisa bertahan?"},
|
||||
['survivor_l']= {"Bertahan", "GILA", "Berapa lama Anda bisa bertahan?"},
|
||||
['survivor_u']= {"Bertahan", "TERAKHIR", "Berapa lama Anda bisa bertahan?"},
|
||||
['attacker_h']= {"Penyerang", "SULIT", "Praktekkan keahlian menyerang Anda!"},
|
||||
['attacker_u']= {"Penyerang", "TERAKHIR", "Praktekkan keahlian menyerang Anda!"},
|
||||
['defender_n']= {"Pembela", "NORMAL", "Praktekkan keahlian membela Anda!"},
|
||||
['defender_l']= {"Pembela", "GILA", "Praktekkan keahlian membela Anda!"},
|
||||
['dig_h']= {"Pembor", "SULIT", "Praktekkan keahlian menggali Anda!"},
|
||||
['dig_u']= {"Pembor", "TERAKHIR", "Praktekkan keahlian menggali Anda!"},
|
||||
['clearRush']= {"Gegas Baris", "NORMAL", "Tutorial all-spin!\n[Dalam pengembangan]"},
|
||||
['c4wtrain_n']= {"Latihan C4W", "NORMAL", "Kombo tidak terbatas."},
|
||||
['c4wtrain_l']= {"Latihan C4W", "GILA", "Kombo tidak terbatas."},
|
||||
['pctrain_n']= {"Latihan PC", "NORMAL", "Latihan PC"},
|
||||
['pctrain_l']= {"Latihan PC", "GILA", "Latihan PC yang lebih sulit"},
|
||||
['pc_n']= {"Tantangan PC", "NORMAL", "Dapatkan PC sampai 100 baris!"},
|
||||
['pc_h']= {"Tantangan PC", "SULIT", "Dapatkan PC sampai 100 baris!"},
|
||||
['pc_l']= {"Tantangan PC", "GILA", "Dapatkan PC sampai 100 baris!"},
|
||||
['pc_inf']= {"Tantangan PC", "TAK TERBATAS", "Dapatkan PC sebanyaknya!"},
|
||||
['tech_n']= {"Tech", "NORMAL", "Coba jaga deret Back-To-Back!"},
|
||||
['tech_n_plus']= {"Tech", "NORMAL+", "Hanya Spins & PCs dibolehkan"},
|
||||
['tech_h']= {"Tech", "SULIT", "Coba jaga deret Back-To-Back!"},
|
||||
['tech_h_plus']= {"Tech", "SULIT+", "Hanya Spins & PCs dibolehkan"},
|
||||
['tech_l']= {"Tech", "GILA", "Coba jaga deret Back-To-Back!"},
|
||||
['tech_l_plus']= {"Tech", "GILA+", "Hanya Spins & PCs dibolehkan"},
|
||||
['tech_finesse']= {"Tech", "EF. TOMBOL", "Efisiensi tombol harus maksimal!"},
|
||||
['tech_finesse_f']= {"Tech", "EF. TOMBOL+", "Efisiensi tombol maksimal dan tidak ada garis normal!"},
|
||||
['tsd_e']= {"Tantangan TSD", "MUDAH", "Hanya T-Spin Double dibolehkan!"},
|
||||
['tsd_h']= {"Tantangan TSD", "SULIT", "Hanya T-Spin Double dibolehkan!"},
|
||||
['tsd_u']= {"Tantangan TSD", "TERAKHIR", "Hanya T-Spin Double dibolehkan!"},
|
||||
['backfire_n']= {"Serangan Balik", "NORMAL", "Tahankan serang baliknya!"},
|
||||
['backfire_h']= {"Serangan Balik", "SULIT", "Tahankan serang baliknya!"},
|
||||
['backfire_l']= {"Serangan Balik", "GILA", "Tahankan serang baliknya!"},
|
||||
['backfire_u']= {"Serangan Balik", "TERAKHIR", "Tahankan serang baliknya!"},
|
||||
['sprintAtk']= {"Balapan", "100 Serangan", "Kirim 100 baris serangan!"},
|
||||
['sprintEff']= {"Balapan", "Efisiensi", "Kirim lebih banyak serangan sampai 40 baris!"},
|
||||
['zen']= {"Zen", "200L", "Permainan 200-garis tanpa batas waktu"},
|
||||
['ultra']= {"Ultra", "EKSTRA", "Permainan 2 menit. Dapatkan nilai sebanyaknya!"},
|
||||
['infinite']= {"Tak Terbatas", "", "Bak pasir"},
|
||||
['infinite_dig']= {"Tak Terbatas: Gali","", "Gali, gali, gali"},
|
||||
['marathon_inf']= {"Maraton", "TAK TERBATAS", "Maraton tanpa akhir."},
|
||||
|
||||
['custom_clear']= {"Tersesuai", "NORMAL"},
|
||||
['custom_puzzle']= {"Tersesuai", "TEKA-TEKI"},
|
||||
},
|
||||
getTip={refuseCopy=true,
|
||||
"(RUR'U')R'FR2U'R'U'(RUR'F')",
|
||||
"\"Techmino.app\" tidak bisa dibuka karena penciptanya tidak bisa diverifikasi.",
|
||||
"\"Techmino.app\" akan merusak komputer Anda. Anda sebaiknya memindah itu ke tempat sampah.",
|
||||
"\"TechminOS\"",
|
||||
"\\jezevec/\\jezevec/\\jezevec/",
|
||||
"\\osk/\\osk/\\osk/",
|
||||
"↑↑↓↓←→←→BA",
|
||||
"$include<studio.h>",
|
||||
"20G sebenarnya peraturan permainan baru!",
|
||||
"Rekor dunia 40L: 14.915s dari Reset_",
|
||||
"Sistem pencapaian segera akan datang!",
|
||||
"ALL SPIN!",
|
||||
"Am G F G",
|
||||
"B2B2B???",
|
||||
"B2B2B2B tidak ada.",
|
||||
"Back-to-Back Techrash, 10 Kombo, PC!",
|
||||
"Pastikan untuk memberikan yang terbaik lagi hari ini!",
|
||||
"Bridge clear segera akan datang!",
|
||||
"Bisakah Anda menguasai penyusun modern namun akrab ini?",
|
||||
"Changelog dalam Bahasa Inggris bisa ditemukan di Discord.",
|
||||
"Color clear segera akan datang!",
|
||||
"Menurunkan DAS dan ARR membuat permainannya lebih cepat tetapi lebih sulit untuk mengontrol.",
|
||||
"Apakah saya baru saja melihat Back-to-Back-to-Back?",
|
||||
"Apakah B2B2B2B ada?",
|
||||
"Jangan biarkan bug kecil menghancur harimu!",
|
||||
"Jangan melihat langsung ke bug!",
|
||||
"Nikmati sistem rotasi Techmino!",
|
||||
"Luar biasa, tapi mari kita pergi lebih baik lain kali…",
|
||||
"Cari tahu apa yang ada di pengaturan!",
|
||||
"Apakah Anda menemukan bug? Buka issue di halaman GitHub kami!",
|
||||
"Permainan penyusun blok gratis dengan mode Battle Royale!",
|
||||
"git commit",
|
||||
"git push -f",
|
||||
"Punya saran? Post sarannya di Discord kami!",
|
||||
"Pernahkah Anda memperhatikan apa \"memutar\" melakukan ke blok?",
|
||||
"Headphone direkomendasikan untuk pengalaman yang lebih baik.",
|
||||
"Hello world!",
|
||||
"Hanya ada 2 jenis trimino, yaitu I3 dan L3.",
|
||||
"if a==true",
|
||||
"Tingkatkan frekuensi gambar Anda untuk pengalaman yang lebih baik.",
|
||||
"Sistem [tindakan] awal dapat menyelamatkan Anda.",
|
||||
"Apakah B2B2B2B mungkin?",
|
||||
"Ini sedang memuat! Bukan sekedar cutscene!",
|
||||
"Anda dapat menyelesaikan 40L tanpa tombol kiri/kanan.",
|
||||
"Anda dapat menyelesaikan 40L tanpa tombol putar.",
|
||||
"Bergabunglah server Discord kami!",
|
||||
"l-=-1",
|
||||
"Biarkan bass menendang!",
|
||||
"Kecepatan bingkai rendah mengurangi pengalaman bermain game Anda.",
|
||||
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
|
||||
"Lua No.1",
|
||||
"Mix clear segera akan datang!",
|
||||
"Sebagian besar ikon tombol dibuat oleh mesin terbang yang digambar sendiri di Unicode Private Use Area.",
|
||||
"Apakah musiknya terlalu mengganggu? Anda dapat mematikannya.",
|
||||
"Tidak ada easter egg di menu ini jika Anda menyalakan gaya sederhana!",
|
||||
"O-Spin Triple!",
|
||||
"OHHHHHHHHHHHHHH",
|
||||
"Main dengan satu tangan!",
|
||||
"Bermain bagus membutuhkan waktu!",
|
||||
"dipersembahkan oleh LÖVE",
|
||||
"dipersembahkan oleh Un..LÖVE",
|
||||
"Server kadang tidak berfungsi",
|
||||
"Beberapa persyaratan untuk mencapai peringkat X sengaja dibuat sulit bahkan untuk pemain terbaik.",
|
||||
"Segera Anda akan dapat bermain melawan teman dan musuh di seluruh dunia.",
|
||||
"Split Clear segera akan datang!",
|
||||
"sudo rm -rf /*",
|
||||
"Techmino merupakan kombinasi dari Technique dan Tetromino.",
|
||||
"Techmino memiliki edisi Nspire-CX!",
|
||||
"Techmino sangat menyenangkan!",
|
||||
"TetroDictionary sekarang tersedia dalam bahasa Inggris.",
|
||||
"Sebagian besar musik dalam permainan ini dibuat menggunakan Beepbox.",
|
||||
"Nama-nama yang muncul di latar belakang halaman Staf adalah daftar pendukung kami.",
|
||||
"Masa depan penyusun blok milik Anda di Techmino!",
|
||||
"Ada beberapa mode tersembunyi dalam permainan ini yang tidak dapat dimasuki menggunakan peta.",
|
||||
"Ada total 18 pentomino yang berbeda.",
|
||||
"Ada total 7 tetromino yang berbeda.",
|
||||
"Coba gunakan beberapa slot simpan!",
|
||||
"Try using two rotation buttons. Using all three of them is better.",
|
||||
"Peringatan: Seni Programmer",
|
||||
"Bagaimana dengan 20 PCs?",
|
||||
"Bagaimana dengan 23 PCs dalam 100 baris?",
|
||||
"Bagaimana dengan 26 TSDs?",
|
||||
"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).",
|
||||
"Anda bisa mengubah tindakan tombol di pengaturan!",
|
||||
"Anda bisa menavigasi menu dengan keyboard.",
|
||||
"Anda bisa membuka folder penyimpanan data dari halaman Statistik.",
|
||||
"Anda bisa melakukan spin dengan semua blok di permainan ini kecuali blok O1.",
|
||||
"Anda bisa mengubah arah muncul blok.",
|
||||
"ZS JL T O I",
|
||||
{C.C,"Coba juga 15puzzle!"},
|
||||
{C.C,"Coba juga Ballance!"},
|
||||
{C.C,"Coba juga Minecraft!"},
|
||||
{C.C,"Coba juga Minesweeper!"},
|
||||
{C.C,"Coba juga Orzmic!"},
|
||||
{C.C,"Coba juga osu!"},
|
||||
{C.C,"Coba juga Phigros!"},
|
||||
{C.C,"Coba juga Puyo Puyo!"},
|
||||
{C.C,"Coba juga Rubik's cube!"},
|
||||
{C.C,"Coba juga Terraria!"},
|
||||
{C.C,"Coba juga Touhou Project!"},
|
||||
{C.C,"Coba juga VVVVVV!"},
|
||||
{C.C,"Coba juga World of goo!"},
|
||||
{C.C,"Coba juga Zuma!"},
|
||||
{C.H,"REGRET!!"},
|
||||
{C.lP,"Nomor rahasia: 626"},
|
||||
{C.lR,"Z ",C.lG,"S ",C.lS,"J ",C.lO,"L ",C.lP,"T ",C.lY,"O ",C.lC,"I"},
|
||||
{C.lY,"COOL!!"},
|
||||
{C.N,"Lua",C.Z," No.1"},
|
||||
{C.P,"T-spin!"},
|
||||
{C.R,"\"Penyalahgunaan DMCA\""},
|
||||
{C.R,"\"Hukum kekayaan intelektual\""},
|
||||
{C.R,"DD",C.Z," Cannon=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"D",C.Z," Cannon"},
|
||||
{C.R,"DT",C.Z," Cannon=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"T",C.Z," Cannon"},
|
||||
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR ",C.P,"LLL ",C.C,"FFF ",C.Y,"RfR ",C.Y,"RRf ",C.Y,"rFF"},
|
||||
{C.Y,"O-Spin Triple!"},
|
||||
{C.Z,"Apa? ",C.lC,"X-spin?"},
|
||||
}
|
||||
}
|
||||
@@ -126,7 +126,8 @@ return{
|
||||
chatStart="------Começo do log------",
|
||||
chatHistory="------Novas mensagens abaixo------",
|
||||
|
||||
-- keySettingInstruction="Press to bind key\nescape: cancel\nbackspace: delete",
|
||||
-- searchModeHelp="Type to search",
|
||||
-- keySettingHelp="Press to bind key\nescape: cancel\nbackspace: delete",
|
||||
-- customBGhelp="Drop image file here to apply custom background",
|
||||
-- customBGloadFailed="Unsupport image format for custom background",
|
||||
|
||||
@@ -194,9 +195,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",
|
||||
FNSF and"/"or"O jogo é gratis, mas doações são apreciadas.",
|
||||
FNSF and"/"or"Se você não conseguir usar o WeChat Pay e o AliPay,",
|
||||
FNSF and"/"or"pode acessar a página do P\97\116\114\101\111\110 para nos ajudar!",
|
||||
FNNS and"/"or"O jogo é gratis, mas doações são apreciadas.",
|
||||
-- FNNS and"/"or"Check Zictionary for more",
|
||||
},
|
||||
staff={
|
||||
"Author: MrZ E-mail: 1046101471@qq.com",
|
||||
@@ -207,7 +207,7 @@ return{
|
||||
"Music: MrZ, 柒栎流星, ERM, Trebor, C₂₉H₂₅N₃O₅, [T0722, Aether]",
|
||||
"Voice & Sound: Miya, Xiaoya, Mono, MrZ, Trebor",
|
||||
"Performance: 模电, HBM",
|
||||
"Traduzir: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅",
|
||||
"Traduzir: User670, MattMayuga, Mizu, Mr.Faq, ScF, C₂₉H₂₅N₃O₅, NOT_A_ROBOT",
|
||||
"",
|
||||
"Special Thanks:",
|
||||
"Flyz, Big_True, NOT_A_ROBOT, 思竣, yuhao7370",
|
||||
@@ -241,9 +241,8 @@ return{
|
||||
sprint="Sprint",
|
||||
marathon="Maratona",
|
||||
},
|
||||
mode={
|
||||
modeExplorer={
|
||||
mod="Mods (F1)",
|
||||
start="Começar",
|
||||
},
|
||||
mod={
|
||||
title="Mods",
|
||||
@@ -327,7 +326,7 @@ return{
|
||||
title="Config. de jogo",
|
||||
graphic="←Video",
|
||||
sound="Som→",
|
||||
layout="Layout",
|
||||
-- style="Style",
|
||||
|
||||
ctrl="Config. controle",
|
||||
key="Map. teclas",
|
||||
@@ -383,7 +382,7 @@ return{
|
||||
fullscreen="Tela cheia",
|
||||
|
||||
-- bg_on="Normal B.G.",
|
||||
-- bg_on="No B.G.",
|
||||
-- bg_off="No B.G.",
|
||||
-- bg_custom="Use Custom B.G.",
|
||||
|
||||
-- blockSatur="Block Saturation",
|
||||
@@ -707,6 +706,9 @@ return{
|
||||
-- ['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||
-- ['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||
-- ['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||
-- ['strategy_e_plus']={"Strategi", "MUDAH+", "Keputusan 20G cepat"},
|
||||
-- ['strategy_h_plus']={"Strategi", "SULIT+", "Keputusan 20G cepat"},
|
||||
-- ['strategy_u_plus']={"Strategi", "TERAKHIR+", "Keputusan 20G cepat"},
|
||||
['blind_e']= {"Cego", "METADE", "Para novatos."},
|
||||
['blind_n']= {"Cego", "TUDO", "Para intermediários."},
|
||||
['blind_h']= {"Cego", "DE REPENTE", "Para experientes."},
|
||||
@@ -743,7 +745,7 @@ return{
|
||||
['tech_l']= {"Tech", "LUNÁTICO", "Não quebre o B2B!"},
|
||||
['tech_l_plus']= {"Tech", "LUNÁTICO+", "Apenas spins e PC"},
|
||||
['tech_finesse']= {"Tech", "FINESSE", "Não erre a destreza!"},
|
||||
['tech_finesse_f']= {"Tech", "FINESSE+", "Sem limpas normais, não erre a destreza!"},
|
||||
['tech_finesse_f']= {"Tech", "FINESSE+", "Sem limpas normais,\nnão erre a destreza!"},
|
||||
['tsd_e']= {"Desafio TSD", "FÁCIL", "Apenas T-spin-doubles!"},
|
||||
['tsd_h']= {"Desafio TSD", "DIFÍCIL", "Apenas T-spin-doubles!"},
|
||||
['tsd_u']= {"Desafio TSD", "ULTIMATE", "Apenas T-spin-doubles!"},
|
||||
|
||||
@@ -6,7 +6,6 @@ return{
|
||||
loadSample="#~#",
|
||||
loadVoice="#<()==)#",
|
||||
loadFont="#Aa#",
|
||||
loadModeIcon="#[ ]#",
|
||||
loadMode="#[…]#",
|
||||
loadOther="#…#",
|
||||
finish="&",
|
||||
@@ -130,8 +129,7 @@ return{
|
||||
"MrZ XXX A→B",
|
||||
"",
|
||||
"□$X, ↑$↑ XD!",
|
||||
"C0, 支 XXX,",
|
||||
"|^O : )",
|
||||
"[z]~~~",
|
||||
},
|
||||
WidgetText={
|
||||
main={
|
||||
@@ -144,9 +142,8 @@ return{
|
||||
dict="z",
|
||||
replays="=~~~",
|
||||
},
|
||||
mode={
|
||||
modeExplorer={
|
||||
mod="?!?!?!(F1)",
|
||||
start="!!!",
|
||||
},
|
||||
mod={
|
||||
title="?!?!?!",
|
||||
@@ -228,10 +225,9 @@ return{
|
||||
},
|
||||
setting_game={
|
||||
title="%~~%",
|
||||
|
||||
graphic="←Video",
|
||||
sound="Sound→",
|
||||
layout="=-=-=",
|
||||
style="=-=-=",
|
||||
|
||||
ctrl="=?=",
|
||||
key="=?",
|
||||
|
||||
@@ -4,7 +4,6 @@ return{fallback='zh',
|
||||
loadSample="乐器",
|
||||
loadVoice="语音",
|
||||
loadFont="字体",
|
||||
loadModeIcon="模式图标",
|
||||
loadMode="模式",
|
||||
loadOther="其他",
|
||||
finish="走你",
|
||||
@@ -87,7 +86,6 @@ return{fallback='zh',
|
||||
WidgetText={
|
||||
setting_game={
|
||||
title="改游戏",
|
||||
|
||||
graphic="←改画面",
|
||||
sound="改声音→",
|
||||
|
||||
@@ -233,6 +231,9 @@ return{fallback='zh',
|
||||
['strategy_e']= {"策略堆叠", "简单", "有区别吗"},
|
||||
['strategy_h']= {"策略堆叠", "困难", "没区别吧"},
|
||||
['strategy_u']= {"策略堆叠", "极限", "没区别"},
|
||||
['strategy_e_plus']={"策略堆叠", "简单+", "有区别吗"},
|
||||
['strategy_h_plus']={"策略堆叠", "困难+", "没区别吧"},
|
||||
['strategy_u_plus']={"策略堆叠", "极限+", "没区别"},
|
||||
['blind_e']= {"隐形", "半隐", "谁都能玩"},
|
||||
['blind_n']= {"隐形", "全隐", "稍加练习即可"},
|
||||
['blind_h']= {"隐形", "瞬隐", "和上一个一样"},
|
||||
|
||||
@@ -5,7 +5,6 @@ return{
|
||||
loadSample="加载乐器采样",
|
||||
loadVoice="加载语音资源",
|
||||
loadFont="缓存字体资源",
|
||||
loadModeIcon="加载模式图标",
|
||||
loadMode="加载模式",
|
||||
loadOther="加载杂项",
|
||||
finish="按任意键继续",
|
||||
@@ -138,7 +137,8 @@ return{
|
||||
chatStart="------消息的开头------",
|
||||
chatHistory="------以上是历史消息------",
|
||||
|
||||
keySettingInstruction="点击添加键位绑定\nesc取消选中\n退格键清空选中",
|
||||
searchModeHelp="直接输入关键词搜索",
|
||||
keySettingHelp="点击添加键位绑定\nesc取消选中\n退格键清空选中",
|
||||
customBGhelp="把图片文件拖到这个窗口里使用自定义背景",
|
||||
customBGloadFailed="自定义背景的图片文件格式不支持",
|
||||
|
||||
@@ -206,9 +206,8 @@ return{
|
||||
"仅通过官网 home.techmino.org 免费下载/更新",
|
||||
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
|
||||
"若由于被修改的本游戏产生的各种损失作者不负责(怎么负责啊我又没法管)",
|
||||
FNSF and"/"or"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
FNSF and"/"or"记得备注id备注id备注id,不然可能会没法记录到赞助列表!",
|
||||
FNSF and"/"or"你也可以去我们的P\97\116\114\101\111\110页面(链接见小Z词典)来支持我们!",
|
||||
FNNS and"/"or"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
|
||||
FNNS and"/"or"更多信息见小z词典",
|
||||
},
|
||||
staff={
|
||||
"作者:MrZ 邮箱:1046101471@qq.com",
|
||||
@@ -219,7 +218,7 @@ return{
|
||||
"音乐: MrZ,柒栎流星,ERM,Trebor,C₂₉H₂₅N₃O₅,[T0722,Aether]",
|
||||
"音效/语音: Miya,Xiaoya,Mono,MrZ,Trebor",
|
||||
"演出: 模电,HBM",
|
||||
"翻译: User670,MattMayuga,Mizu,Mr.Faq,ScF,C₂₉H₂₅N₃O₅",
|
||||
"翻译: User670,MattMayuga,Mizu,Mr.Faq,ScF,C₂₉H₂₅N₃O₅,NOT_A_ROBOT",
|
||||
"",
|
||||
"特别感谢:",
|
||||
"Flyz,Big_True,NOT_A_ROBOT,思竣,yuhao7370",
|
||||
@@ -253,9 +252,8 @@ return{
|
||||
sprint="40行",
|
||||
marathon="马拉松",
|
||||
},
|
||||
mode={
|
||||
modeExplorer={
|
||||
mod="Mods (F1)",
|
||||
start="开始",
|
||||
},
|
||||
mod={
|
||||
title="Mods",
|
||||
@@ -337,9 +335,9 @@ return{
|
||||
},
|
||||
setting_game={
|
||||
title="游戏设置",
|
||||
graphic="←画面设置",
|
||||
sound="声音设置→",
|
||||
layout="外观",
|
||||
graphic="←画面",
|
||||
sound="声音→",
|
||||
style="风格",
|
||||
|
||||
ctrl="控制设置",
|
||||
key="键位设置",
|
||||
@@ -356,8 +354,8 @@ return{
|
||||
},
|
||||
setting_video={
|
||||
title="画面设置",
|
||||
sound="←声音设置",
|
||||
game="游戏设置→",
|
||||
sound="←声音",
|
||||
game="游戏→",
|
||||
|
||||
block="方块可见",
|
||||
smooth="平滑下落",
|
||||
@@ -403,8 +401,8 @@ return{
|
||||
},
|
||||
setting_sound={
|
||||
title="声音设置",
|
||||
game="←游戏设置",
|
||||
graphic="画面设置→",
|
||||
game="←游戏",
|
||||
graphic="画面→",
|
||||
|
||||
mainVol="总音量",
|
||||
bgm="音乐",
|
||||
@@ -713,9 +711,13 @@ return{
|
||||
['master_final']= {"大师", "终点", "究极20G:无法触及的终点"},
|
||||
['master_ph']= {"大师", "虚幻", "虚幻20G:???"},
|
||||
['master_ex']= {"宗师", "EX", "成为方块大师"},
|
||||
['master_instinct']={"大师", "本能", "隐藏当前块"},
|
||||
['strategy_e']= {"策略堆叠", "简单", "20G堆叠中速决策练习"},
|
||||
['strategy_h']= {"策略堆叠", "困难", "20G堆叠快速决策练习"},
|
||||
['strategy_u']= {"策略堆叠", "极限", "20G堆叠极速决策练习"},
|
||||
['strategy_e_plus']={"策略堆叠", "简单+", "20G堆叠中速决策练习"},
|
||||
['strategy_h_plus']={"策略堆叠", "困难+", "20G堆叠快速决策练习"},
|
||||
['strategy_u_plus']={"策略堆叠", "极限+", "20G堆叠极速决策练习"},
|
||||
['blind_e']= {"隐形", "半隐", "不强大脑"},
|
||||
['blind_n']= {"隐形", "全隐", "挺强大脑"},
|
||||
['blind_h']= {"隐形", "瞬隐", "很强大脑"},
|
||||
@@ -772,58 +774,29 @@ return{
|
||||
['custom_puzzle']= {"自定义", "拼图"},
|
||||
},
|
||||
getTip={refuseCopy=true,
|
||||
"……,合群了就会消失,不合群世界毁灭(指game over",
|
||||
"……,合群了就会消失,但消失不代表没有意义",
|
||||
"……,没有对比就没有伤害",
|
||||
"“Techmino.app”将对您的电脑造成伤害。您应该将它移到废纸篓。",
|
||||
"“TechminOS”",
|
||||
"(a+b)³=a³+3a²b+3ab²+b³",
|
||||
"(RUR'U')R'FR2U'R'U'(RUR'F')",
|
||||
"《按钮风格进化史》",
|
||||
"《加载动画进化史》",
|
||||
"《教育的力量》",
|
||||
"《练习的力量》",
|
||||
"《梦想的意义》",
|
||||
"《天赋的力量》",
|
||||
"《游戏的意义》",
|
||||
"《知识的力量》",
|
||||
"《主题曲进化史》",
|
||||
"↑↑↓↓←→←→BA",
|
||||
"∫u dv=uv-∫v du",
|
||||
"$include<studio.h>",
|
||||
"0next 0hold.",
|
||||
"11renPC!",
|
||||
"1next 0hold",
|
||||
"1next 1hold!",
|
||||
"1next 6hold!",
|
||||
"2021年是Techmino联机元年",
|
||||
"20G本质是一个全新的游戏规则!",
|
||||
"29种块里28个都能spin你敢信?",
|
||||
"3.1415926535897932384???",
|
||||
"3.1415926535897932384(\\d{3})",
|
||||
"3next 1hold?",
|
||||
"40行世界纪录:14.915s by Reset_",
|
||||
"6236326236327175",
|
||||
"626in1",
|
||||
"6next 1hold!",
|
||||
"6next 6hold?!",
|
||||
"7宽三SZ架空捐了解一下",
|
||||
"把手机调到特殊的日期也许会发生什么",
|
||||
"报时机器人:新的一天开始了",
|
||||
"背景影响游玩?可以去设置关闭",
|
||||
"本游戏不叫Teachmino",
|
||||
"本游戏的一部分内容是国际合作的!",
|
||||
"本游戏的B2B是气槽机制,和传统的开关机制不一样哦",
|
||||
"本游戏还在测试中,出各种问题都是有可能的哦",
|
||||
"本游戏内置了几个休(yìng)闲(hé)小游戏哦~",
|
||||
"本游戏使用精简版字体,可能有些特殊字符不能正确显示",
|
||||
"本游戏在设计的时候受到了大量其他块游甚至一些音游的启发",
|
||||
"必须要软降才能到达的位置都会判定为极简操作",
|
||||
"别看攻击效率不高,其实消四还是很强的",
|
||||
"别问游戏名怎么取的,问就是随便想的",
|
||||
"不同人打40行最合适的方式不一样,s1w/63/散消/s2w……",
|
||||
"不同游戏(甚至不同模式)中不同战术的强度都不一样,并不能简单的按顺序排名",
|
||||
"不希望激烈的零和竞争充斥整个游戏",
|
||||
"不要悲伤,不要心急",
|
||||
"别催了,在做了!",
|
||||
"不要大力拍打或滑动哦",
|
||||
"不要卖弱不要卖弱不要卖弱",
|
||||
"不知道有多少人玩游戏的时候会关心游戏是谁做的",
|
||||
@@ -831,168 +804,72 @@ return{
|
||||
"彩色消除即将到来!",
|
||||
"草(日本语)",
|
||||
"车万方块是一家(暴论",
|
||||
"成就系统在做了!",
|
||||
"吃键?真的吗?建议回放看看到底按没按到,按了多久",
|
||||
"除了雨宫太阳还有很多高手玩家,甚至强出很多很多",
|
||||
"触发游戏报错后日志文件会越来越大(不过顶多几百K)",
|
||||
"触摸板打osu也很好!",
|
||||
"凑数tip什么时候能站起来!",
|
||||
"打好块跟学习一样没有捷径,多练。",
|
||||
"打铁.png",
|
||||
"打网络对战前请确认自己有一定的水平,不然会毫无游戏体验的",
|
||||
"打铁",
|
||||
"大概还是有人会看tip的",
|
||||
"大量使用开局定式的数据是不准的",
|
||||
"大陆的方块社区起步晚,所以世界级高手很少……下一个会是你吗?",
|
||||
"大家认为的俄罗斯方块很可能不是你以为的俄罗斯方块,场合合适的时候可以适当提醒一下哦",
|
||||
"大满贯10连击消四全清!",
|
||||
"戴上耳机以获得最佳体验",
|
||||
"单手也能玩!",
|
||||
"低帧率会降低游戏体验",
|
||||
"点击添加标题",
|
||||
"电脑游玩自带按键显示~",
|
||||
"对编程有真·兴趣推荐Lua,安装无脑 语法简单 执行速度快 远离枯燥学校编程(雾",
|
||||
"对战模式跟单机模式有本质区别,timing等能力需要专门练习",
|
||||
"多年小游戏玩家表示痛恨故意拖时间的假加载",
|
||||
"多hold现代块又回来了!",
|
||||
"俄罗斯方块完全可以作为电竞游戏",
|
||||
"发现有个“隐形”皮肤了吗",
|
||||
"发现Bug可以去GitHub上开个issue反馈",
|
||||
"方块不能吃",
|
||||
"方块不是你生活的全部,适当走出去看看",
|
||||
"方块教会我们,合群了就会消失,……",
|
||||
"方块默认出现的方向都是重心在下哦(如果你没乱动设置",
|
||||
"方块能吃吗",
|
||||
"分数一般只是好看的没有实际用途,建议只关心关卡要求",
|
||||
"服务器随时爆炸",
|
||||
"感觉明明按键了但是没反应?你真的按到了吗?",
|
||||
"感觉自己速度到上限了?试着把das调低一点",
|
||||
"感谢群友帮忙想tip",
|
||||
"感谢Orzmic为这个tip框提供修改意见",
|
||||
"感谢Phigros提供部分tip模板",
|
||||
"刚接触方块的话多玩玩就行,40行两分钟以外没啥好针对性练习的",
|
||||
"刚开始练全隐形可以尽量堆平,留一列消四",
|
||||
"感谢Phigros提供(确信)部分tip模板",
|
||||
"隔壁不在乎玩家意见但是我们在乎,没人提过的合理建议一定会回应",
|
||||
"隔断消除即将到来!",
|
||||
"各种画面细节选项都可以在设置里找到哦",
|
||||
"更换方块皮肤也许能帮助提升成绩?不懂,玄学",
|
||||
"更小的DAS和ARR拥有更高的操作上限(能控制得了的话)",
|
||||
"更新内容在游戏里和群公告都有写!",
|
||||
"攻击生效速度(从快到慢):消二/三,消四,spin,高连击",
|
||||
"还能写些什么tip呢",
|
||||
"好像还没人能用脚打块打到一定水平",
|
||||
"好像可以把手机倒过来打场地旋转180……那还是不建议违反规则",
|
||||
"很有精神!",
|
||||
"欢迎来帮忙制作音乐或音效!",
|
||||
"欢迎提供更多游戏创意!",
|
||||
"混合消除即将到来!",
|
||||
"基础堆叠和挖掘能力非常重要,忽视这两项的人都后悔了(确信)",
|
||||
"即使被顶到天上了也不要放弃,每一行垃圾都有可能成为你的武器",
|
||||
"极简率决定了你大概的速度上限和相等手速下的放块速度",
|
||||
"假如生活欺骗了你,不要悲伤,不要心急,还有块陪着你",
|
||||
"架空消除即将到来!",
|
||||
"建议使用双手游玩",
|
||||
"健康小贴士:不要熬夜,真的会猝死",
|
||||
"健康小贴士:戴耳机(尤其是半入耳式)时音量千万别拉满,不然真的会影响听力(虽然很慢)",
|
||||
"健康小贴士:玩游戏多眨眼,不然会干眼病",
|
||||
"键位是可以自定义的",
|
||||
"键位有可能决定了上限,可能的话还是尽量考虑一下自己的键位是否利于超高速操作",
|
||||
"尽早学双旋吧,单旋没前途的",
|
||||
"经典块的水也很深,不要小看经典块玩家",
|
||||
"经典块跟现代块是两个游戏,一个厉害不代表另一个也厉害,得从头练起",
|
||||
"经典块和渣方块不是一回事",
|
||||
"据某个群友描述玩了Techmino之后打字速度变快了",
|
||||
"绝大多数按钮上的图标是调用Unicode私用区里的自制字符实现的",
|
||||
"觉得移动速度太慢或太快,手感不好?快去设置调整DAS/ARR",
|
||||
"开启省流模式后将不会加载用户头像(应该能省不少流吧)",
|
||||
"科技骨牌 你的创新式块堆栈业务技术管理器",
|
||||
"块东V共荣",
|
||||
"快去打一把100%极简看看会怎样",
|
||||
"锟斤拷锟斤拷锟斤拷",
|
||||
"来学编程,好玩的",
|
||||
"老牌益智游戏了",
|
||||
"连续pc有大量知识要背,不过背出来后随手10连pc不是问题",
|
||||
"六连块总共有……?那不重要,不会做的(大概",
|
||||
"论如何正确使用Unicode私用区定制字体",
|
||||
"卖弱和谦虚不是一回事,发言前三思呀",
|
||||
"卖弱禁言警告",
|
||||
"没学过编曲,音乐都是自己瞎写的,如果真的觉得好听就太好了!",
|
||||
"没有量化就没有对比,……",
|
||||
"每个块的出现方向可以自定义",
|
||||
"每个块的颜色可以自定义",
|
||||
"每个虚拟按键都可以隐藏/显示,尺寸也可调",
|
||||
"免费吃鸡方块",
|
||||
"喵!",
|
||||
"魔方也是方块(确信",
|
||||
"能导致吃键的问题有很多,建议说清楚具体发生了什么并且录视频说明",
|
||||
"能玩到Techmino不是你有优越感的理由",
|
||||
"你的双手是为了你的一生服务的,而不是Techmino",
|
||||
"你今天的人品值是(满分100):"..math.random(100),
|
||||
"你可以从统计页面打开游戏存档目录",
|
||||
"你们考虑过Z酱的感受吗?没有!你们只考虑你自己。",
|
||||
"你说彩蛋?嗯…算是有,可以找找",
|
||||
"你有一个好",
|
||||
"你这场地是金子堆的还是块是金子做的",
|
||||
"你知道吗[001]看主页机器人玩可能比较费电",
|
||||
"你知道吗[002]全程不使用任何旋转键完成40行模式是有可能的",
|
||||
"你知道吗[003]全程不使用左右移动键完成40行模式是有可能的",
|
||||
"你知道吗[004]停留在模式地图界面很费电",
|
||||
"你知道吗[005]在其他(方块)游戏相关场合提及本游戏是很不礼貌的",
|
||||
"你知道吗[006]O-Spin是在0.8.20 (Fantastic Global Update II)中诞生的",
|
||||
"你知道吗[007]TRS旋转系统的最初形态在0.0.091726版本就存在了",
|
||||
"你这块是金子做的还是垃圾行是金子做的",
|
||||
"你准备好了吗?",
|
||||
"其实很多时候“吃键”是玩家对游戏机制不了解或者自己的操作问题导致的",
|
||||
"其实S和Z有四个方向(状态),虽然看起来只有两个",
|
||||
"配乐是有考虑到模式氛围的哦",
|
||||
"请谨慎向没有方块经验的玩家推荐,会对本游戏的生存环境造成影响,感谢配合。",
|
||||
"请勿大力敲打设备!敲坏了就没有Techmino玩了",
|
||||
"请勿使用三只手游玩",
|
||||
"去玩别的方块的时候记得没有Ospin!",
|
||||
"全球目前应该没人能全X评价(大爆炸不算)",
|
||||
"群友翻译的中文方块百科全书! tetris.huijiwiki.com",
|
||||
"让他三尺又何妨",
|
||||
"如何O-spin: 一秒转626圈(误",
|
||||
"三连块只有2种",
|
||||
"三岁通关困难马拉松",
|
||||
"上面这个不是录像,是机器人实时在玩",
|
||||
"少女祈祷中",
|
||||
"少玩点游戏,多注意眨眼和休息",
|
||||
"深降了解一下",
|
||||
"时间碎片[000] 2021/11/21开始tip加入这个版块",
|
||||
"时间碎片[001] V0.7.9加入O-spin",
|
||||
"时间碎片[002] V0.7.19加入语音系统",
|
||||
"时间碎片[003] V0.7.22加入平滑下落",
|
||||
"时间碎片[004] V0.8.5加入模式地图",
|
||||
"时间碎片[005] V0.8.19加入五连块",
|
||||
"时间碎片[006] V0.9.0加入自定义序列和模式",
|
||||
"时间碎片[007] V0.10.0加入录像回放",
|
||||
"时间碎片[008] V0.11.1加入小z词典",
|
||||
"时间碎片[009] V0.12.2加入mod系统",
|
||||
"时间碎片[010] V0.13.0联网对战测试",
|
||||
"时间碎片[011] V0.13.2加入任意场地高度",
|
||||
"时间碎片[012] V0.13.3加入控制台",
|
||||
"时间碎片[013] V0.14.4加入第一首不是用Beepbox制作的BGM",
|
||||
"时间碎片[014] V0.14.5加入第一首社区玩家自制BGM",
|
||||
"时间碎片[015] V0.15.5加入录像回放菜单",
|
||||
"时间碎片[016] V0.16.0应该是单次更新内容最多的(起码更新历史最长)",
|
||||
"时间碎片[017] V0.16.2加入打击垫样式的音效室",
|
||||
"时间碎片[018] V0.17.0加入手柄的摇杆和扳机支持",
|
||||
"使用固定堆叠方法达成20TSD难度很低",
|
||||
"试试用跳舞毯打块",
|
||||
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
|
||||
"手机玩也可以外接键盘哦(iOS除外)",
|
||||
"首页的机器人可能会不小心把自己给玩死",
|
||||
"术语不认识?去右边那个词典里查查吧",
|
||||
"水平是随着时间一点点提升的,不是几天几星期就能玩好的哦",
|
||||
"四连块总共7种",
|
||||
"虽然极简连击和极简率计算看着很怪,但以后你会发现还挺科学!",
|
||||
"所有大道理tip都是亲眼目睹后加的,如果觉得多余说明就不是给你看的呀!消消气",
|
||||
"烫烫烫烫烫烫",
|
||||
"提前旋转等功能可以用来救命",
|
||||
"天哪,我竟然是一条凑数tip",
|
||||
"退一步海阔天空",
|
||||
"挖掘能力在对战里非常非常非常重要!!!!",
|
||||
"玩到一半弹出消息框?快去设置禁止弹窗",
|
||||
"玩得开心的话游戏作者也会很开心哦",
|
||||
"为了保护玩家们的健康,本游戏有一个临时的简易防沉迷系统!(不过估计你也触发不了/笑)",
|
||||
"为什么关卡那么少!因为前一模式成绩连B都没达到,再加把劲吧~",
|
||||
"为数不多走向世界的国产方块游戏",
|
||||
"我曾经在极度愤怒的时候15秒消了40行",
|
||||
"我们联合!",
|
||||
"我们是不是第一个在方块游戏做tip的?",
|
||||
@@ -1001,47 +878,25 @@ return{
|
||||
"我一个滑铲就挖了个11renPC",
|
||||
"我永远喜……",
|
||||
"无法打开“Techmino.app”,因为无法验证开发者。",
|
||||
"无聊翻翻设置是好习惯",
|
||||
"五连块总共18种",
|
||||
"物理hold了解一下",
|
||||
"希望极简率没事",
|
||||
"希望你们都能喜欢Z……哦不是,喜欢Techmino",
|
||||
"喜欢本游戏的话可以到应用商……好像没上架呢还,不过快了就是(",
|
||||
"享受Tech的特色旋转系统!",
|
||||
"向其他人询问练习方法最好提供自己的详细水平,最好录些视频,不然很难给出合适的建议",
|
||||
"小心腱鞘炎",
|
||||
"写不出那种很酷的音乐(哭",
|
||||
"旋转不是变形!请尽量灵活利用顺逆时针两个旋转键",
|
||||
"学会使用两个旋转键,三个更好",
|
||||
"学习能力很重要,无论是玩游戏还是学知识",
|
||||
"要盯着bug不放",
|
||||
"音乐风格是什么,能吃吗",
|
||||
"音乐使用beepbox制作",
|
||||
"音游方块是一家(暴论",
|
||||
"隐形真的不难,只要花几个小时耐心练下去",
|
||||
"游戏确实可以是艺术,而不一定是纯“玩具”",
|
||||
"游戏使用LÖVE引擎制作",
|
||||
"游戏使用un……LÖVE引擎制作",
|
||||
"游戏也是一种艺术形式",
|
||||
"游戏中左下角三个信息分别是分数/时间/极简连击数",
|
||||
"游戏字体里藏了一套Z块表情包",
|
||||
"有建议的话可以把信息反馈给作者~",
|
||||
"有建议的话可以反馈给作者~",
|
||||
"有两个模式是以东方Project里的角色为主题的",
|
||||
"有一些隐藏模式不能从地图进入,到处找找看吧",
|
||||
"有疑问? 先看设置有没有你想要的",
|
||||
"右下角那个问号按钮是游戏说明书 (开了简洁模式当我没说)",
|
||||
"长期睡眠不足会引起不可逆的脑损伤(变傻)",
|
||||
"这不是休闲游戏……别怪关卡要求太高,多练吧",
|
||||
"这个菜单可以用纯键盘控制",
|
||||
"这里的极简判定不松不严,放心软降",
|
||||
"震惊,我只是一条凑数tip吗",
|
||||
"中文方块百科全书:tetris.huijiwiki.com",
|
||||
"众所周知俄罗斯方块是经典编程练手游戏(?",
|
||||
"众所周知mac不能拿来玩游戏",
|
||||
"注意到方块“旋转”的时候到底发生了些什么吗?",
|
||||
"自定义场地可以画图实现逐页演示",
|
||||
"自己不确定的问题尽量不要教别人哦",
|
||||
"总共有400多条tip哦",
|
||||
"作业都没做完别玩手机",
|
||||
"作业没做完别玩手机",
|
||||
"作者40行sub26了",
|
||||
"作者电脑上装了11个方块",
|
||||
"作者浏览器收藏夹里有6个方块",
|
||||
@@ -1051,29 +906,8 @@ return{
|
||||
"B2B2B???",
|
||||
"B2B2B2B并不存在……",
|
||||
"B2B2B2B存在吗?",
|
||||
"BT炮=beta炮=TCM-β炮",
|
||||
"c4w可不是在所有游戏里都很强哦",
|
||||
"c4w人竟是我自己",
|
||||
"c4w人竟在我身边",
|
||||
"cos(α+β)=CαCβ-SβSα",
|
||||
"cos²α-cos²β=-S(α+β)S(α-β)",
|
||||
"cos²α-sin²β=C(α+β)C(α-β)",
|
||||
"cos2α=C²α-S²α",
|
||||
"e^(πi)=-1",
|
||||
"e^(πi/2)=i",
|
||||
"e^(πi/4)=(1+i)/√2",
|
||||
"Farter评[01]:“成天被夸赞‘好玩’的”",
|
||||
"Farter评[02]:“可以形成方块圈子小中心话题,同作者一起衍生一些概念与梗的”",
|
||||
"Farter评[03]:“论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(”",
|
||||
"Farter评[04]:“民间微创新”",
|
||||
"Farter评[05]:“民间音lè与图案”",
|
||||
"Farter评[06]:“民间游戏设计”",
|
||||
"Farter评[07]:“是方块爱好者研究平台”",
|
||||
"Farter评[08]:“是方块萌新入坑接收器”",
|
||||
"Farter评[09]:“是居家旅行装逼必备”",
|
||||
"Farter评[10]:“是民间UI动效艺术作品”",
|
||||
"Farter评[11]:“是一滩散乱的代码组成的蜜汁结构”",
|
||||
"Farter评[12]:“它是现在的techmino已发布版本”",
|
||||
"fin neo iso 是满足tspin条件的特殊t2的名字",
|
||||
"git commit",
|
||||
"git push -f",
|
||||
@@ -1082,35 +916,26 @@ return{
|
||||
"iOS设备使用键盘控制可能会有问题,还是先只用触屏吧",
|
||||
"l-=-1",
|
||||
"Let-The-Bass-Kick!",
|
||||
"lim x→c f(x)/g(x)=lim x→c f'(x)/g'(x)",
|
||||
"MrZ是谁啊",
|
||||
"pps-0.01",
|
||||
"S△ABC=√(h(h-a)(h-b)(h-c)),h=(a+b+c)/2",
|
||||
"shutdown -h now",
|
||||
"sin(α+β)=SαCβ+SβCα",
|
||||
"sin²α-cos²β=-C(α+β)C(α-β)",
|
||||
"sin²α-sin²β=S(α+β)S(α-β)",
|
||||
"sin2α=2SαCα",
|
||||
"sofunhowtoget",
|
||||
"Staff名单里飘过的是赞助榜单,喜欢本游戏的话可以给我们打赞助支持开发哦~",
|
||||
"STSD必死",
|
||||
"sudo rm -rf /*",
|
||||
"Techmino /'tɛkmɪnoʊ/ n.铁壳米诺(游戏名)",
|
||||
"Techmino = Technique + Tetromino",
|
||||
"Techmino 好玩!",
|
||||
"Techmino 濂界帺锛",
|
||||
"Techmino 英['tɛkmɪnəʊ] 美/'tekmɪnoʊ/ n.铁壳米诺(游戏名)",
|
||||
"Techmino console了解一下",
|
||||
"Techmino: App意外退出。",
|
||||
"Techmino.exe 已停止工作",
|
||||
"Techmino安卓下载",
|
||||
"Techmino不是工业产品也不是练手程序,是游戏作品(至少目前是,嗯……)",
|
||||
"Techmino好玩!",
|
||||
"Techmino没有氪金没有逼肝,良不良心~",
|
||||
"Techmino生日不太清楚,那就定在2019.6.26吧",
|
||||
"Techmino也有节日主题了哦",
|
||||
"Techmino有一个Nspire-CX版本!",
|
||||
"Techmino在哪里下载",
|
||||
"Techmino怎么念啊",
|
||||
"techminohaowan",
|
||||
"techminoisfun",
|
||||
"TechminOS coming s∞n",
|
||||
"viod main[]",
|
||||
"while(false)",
|
||||
"Z酱竟是我自己",
|
||||
@@ -1118,22 +943,205 @@ return{
|
||||
"Z酱是谁",
|
||||
"Z酱只是个写代码的,懂什么方块",
|
||||
"Z块等身抱枕来一个(x",
|
||||
"时间碎片[000] 2021/11/21加入这个版块",
|
||||
"时间碎片[001] V0.0.091726加入TRS旋转系统",
|
||||
"时间碎片[002] V0.7.9加入O-spin",
|
||||
"时间碎片[003] V0.7.19加入语音系统",
|
||||
"时间碎片[004] V0.7.22加入平滑下落",
|
||||
"时间碎片[005] V0.8.5加入模式地图",
|
||||
"时间碎片[006] V0.8.19加入五连块",
|
||||
"时间碎片[007] V0.9.0加入自定义序列和模式",
|
||||
"时间碎片[008] V0.10.0加入录像回放",
|
||||
"时间碎片[009] V0.11.1加入小z词典",
|
||||
"时间碎片[010] V0.12.2加入mod系统",
|
||||
"时间碎片[011] V0.13.0联网对战测试",
|
||||
"时间碎片[012] V0.13.2加入任意场地高度",
|
||||
"时间碎片[013] V0.13.3加入控制台",
|
||||
"时间碎片[014] V0.14.4加入第一首非Beepbox制作的BGM",
|
||||
"时间碎片[015] V0.14.5加入第一首社区玩家自制BGM",
|
||||
"时间碎片[016] V0.15.5加入录像回放菜单",
|
||||
"时间碎片[017] V0.16.0加入BIRS",
|
||||
"时间碎片[018] V0.16.2加入打击垫样式的音效室",
|
||||
"时间碎片[019] V0.17.0加入手柄的摇杆和扳机支持",
|
||||
"豆知识[001]总共有400多条tip哦",
|
||||
"豆知识[002]背景影响游玩?可以去设置关闭",
|
||||
"豆知识[003]方块默认出现的方向都是重心在下哦(如果你没乱动设置",
|
||||
"豆知识[004]各种画面细节选项都可以在设置里找到哦",
|
||||
"豆知识[005]觉得移动速度太慢或太快,手感不好?快去设置调整DAS/ARR",
|
||||
"豆知识[006]无聊翻翻设置是好习惯",
|
||||
"豆知识[007]有疑问?先看设置有没有你想要的",
|
||||
"豆知识[008]2021年是Techmino联机元年",
|
||||
"豆知识[009]20G本质是一个全新的游戏规则!",
|
||||
"豆知识[010]29种块里28个都能spin你敢信?",
|
||||
"豆知识[011]7宽三SZ架空捐了解一下",
|
||||
"豆知识[012]把手机调到特殊的日期也许会发生什么",
|
||||
"豆知识[013]本游戏不叫Teachmino",
|
||||
"豆知识[014]本游戏的一部分内容是国际合作的!",
|
||||
"豆知识[015]本游戏的中文名叫《方块研究所》",
|
||||
"豆知识[016]本游戏的B2B是气槽机制,和传统的开关机制不一样哦",
|
||||
"豆知识[017]本游戏内置了几个休(yìng)闲(hé)小游戏哦~",
|
||||
"豆知识[018]本游戏在设计的时候受到了大量其他块游甚至一些音游的启发",
|
||||
"豆知识[019]必须要软降才能到达的位置都会判定为极简操作",
|
||||
"豆知识[020]别看攻击效率不高,其实消四还是很强的",
|
||||
"豆知识[021]别问游戏名字怎么取的,问就是随便想的",
|
||||
"豆知识[022]不同人打40行最合适的方式不一样,s1w/63/散消/s2w……",
|
||||
"豆知识[023]不同游戏(甚至不同模式)中不同战术的强度都不一样,并不能简单的按顺序排名",
|
||||
"豆知识[024]除了雨宫太阳还有很多高手玩家,尤其是不在PPT里,甚至强出不少",
|
||||
"豆知识[025]触发游戏报错后日志文件会越来越大(不过顶多几百K)",
|
||||
"豆知识[026]打好块跟学习一样没有捷径,多练!",
|
||||
"豆知识[027]打网络对战前请确认自己有一定的水平,不然会毫无游戏体验的",
|
||||
"豆知识[028]大量使用开局定式的数据是不准的",
|
||||
"豆知识[029]大陆的方块社区起步晚,所以世界级高手很少……下一个会是你吗?",
|
||||
"豆知识[030]低帧率会降低游戏体验",
|
||||
"豆知识[031]电脑游玩自带按键显示~",
|
||||
"豆知识[032]对战模式跟单机模式有本质区别,timing等能力需要专门练习",
|
||||
"豆知识[033]发现Bug可以去GitHub上开个issue反馈",
|
||||
"豆知识[034]分数一般只是好看的没有实际用途,建议只关心关卡要求",
|
||||
"豆知识[035]服务器随时爆炸",
|
||||
"豆知识[036]感觉自己速度到上限了?试着把das调低一点",
|
||||
"豆知识[037]刚接触方块的话多玩玩就行,40行两分钟以外没啥好针对性练习的",
|
||||
"豆知识[038]刚开始练全隐形可以尽量堆平,留一列消四",
|
||||
"豆知识[039]更小的DAS和ARR拥有更高的操作上限(能控制得了的话)",
|
||||
"豆知识[040]更新内容在游戏里和群公告都有写!",
|
||||
"豆知识[041]攻击生效速度(从快到慢):消二/三,消四,spin,高连击",
|
||||
"豆知识[042]好像可以把手机倒过来打场地旋转180……那还是不建议违反规则",
|
||||
"豆知识[043]基础堆叠和挖掘能力非常重要,忽视这两项的人都后悔了(确信)",
|
||||
"豆知识[044]即使被顶到天上了也不要放弃,每一行垃圾都有可能成为你的武器",
|
||||
"豆知识[045]极简率决定了你大概的速度上限和相等手速下的放块速度",
|
||||
"豆知识[046]键位是可以自定义的",
|
||||
"豆知识[047]键位有可能决定了上限,可能的话还是尽量考虑一下自己的键位是否利于超高速操作",
|
||||
"豆知识[048]尽早学双旋吧,单旋没前途的",
|
||||
"豆知识[049]经典块的水也很深,不要小看经典块玩家",
|
||||
"豆知识[050]经典块跟现代块是两个游戏,一个厉害不代表另一个也厉害,得从头练起",
|
||||
"豆知识[051]经典块和渣方块不是一回事",
|
||||
"豆知识[052]开启省流模式后将不会加载用户头像(应该能省不少流吧)",
|
||||
"豆知识[053]看主页机器人玩可能比较费电",
|
||||
"豆知识[054]连续pc有大量知识要背,不过背出来后随手10连pc不是问题",
|
||||
"豆知识[055]每个块的出现方向可以自定义",
|
||||
"豆知识[056]每个块的颜色可以自定义",
|
||||
"豆知识[057]每个虚拟按键都可以隐藏/显示,尺寸也可调",
|
||||
"豆知识[058]能导致吃键的问题有很多,建议说清楚具体发生了什么并且录视频说明",
|
||||
"豆知识[059]你可以从统计页面打开游戏存档目录",
|
||||
"豆知识[060]你说彩蛋?嗯…算是有,可以找找",
|
||||
"豆知识[061]其实很多时候“吃键”是玩家对游戏机制不了解或者自己的操作问题导致的",
|
||||
"豆知识[062]其实S和Z有四个方向(状态),虽然看起来只有两个",
|
||||
"豆知识[063]去玩别的方块的时候记得没有Ospin!",
|
||||
"豆知识[064]全程不使用任何旋转键完成40行模式是有可能的",
|
||||
"豆知识[065]三连块只有2种",
|
||||
"豆知识[066]四连块总共7种",
|
||||
"豆知识[067]五连块总共18种",
|
||||
"豆知识[068]六连块总共有……?那不重要,不会做的(大概",
|
||||
"豆知识[069]上面这个不是录像,是机器人实时在玩",
|
||||
"豆知识[070]使用固定堆叠方法达成20TSD难度很低",
|
||||
"豆知识[071]手机玩也可以外接键盘哦(iOS除外)",
|
||||
"豆知识[072]首页的机器人可能会不小心把自己给玩死",
|
||||
"豆知识[073]术语不认识?去右边那个词典里查查吧",
|
||||
"豆知识[074]水平是随着时间一点点提升的,不是几天几星期就能玩好的哦",
|
||||
"豆知识[075]虽然极简连击和极简率计算看着很怪,但以后你会发现还挺科学!",
|
||||
"豆知识[076]提前旋转等功能可以用来救命",
|
||||
"豆知识[077]停留在模式地图界面很费电",
|
||||
"豆知识[078]为了保护玩家们的健康,本游戏有一个临时的简易防沉迷系统!(不过估计你也触发不了/笑)",
|
||||
"豆知识[079]为什么关卡那么少!因为前一模式成绩连B都没达到,再加把劲吧~",
|
||||
"豆知识[080]为数不多走向世界的国产方块游戏",
|
||||
"豆知识[081]向其他人询问练习方法最好提供自己的详细水平,最好录些视频,不然很难给出合适的建议",
|
||||
"豆知识[082]小心腱鞘炎",
|
||||
"豆知识[083]玄学研究显示,更换方块皮肤也许能帮助提升成绩",
|
||||
"豆知识[084]旋转不是变形!请尽量灵活利用顺逆时针两个旋转键",
|
||||
"豆知识[085]学会使用两个旋转键,三个更好",
|
||||
"豆知识[086]隐形真的不难,只要耐心花几个小时练下去",
|
||||
"豆知识[087]游戏中左下角三个信息分别是分数/时间/极简连击数",
|
||||
"豆知识[088]游戏字体里藏了一套Z块表情包",
|
||||
"豆知识[089]有几个隐藏模式不能从地图进入,到处找找看吧",
|
||||
"豆知识[090]右下角那个问号按钮是游戏说明书 (开了简洁模式当我没说)",
|
||||
"豆知识[091]在其他(方块)游戏相关场合提及本游戏是很不礼貌的",
|
||||
"豆知识[092]这里的极简判定不松不严,放心软降",
|
||||
"豆知识[093]注意到方块“旋转”的时候到底发生了些什么吗?",
|
||||
"豆知识[094]自定义场地可以画图实现逐页演示",
|
||||
"豆知识[095]自己不确定的问题尽量不要教别人哦",
|
||||
"豆知识[096]BT炮=beta炮=TCM-β炮",
|
||||
"豆知识[097]c4w可不是在所有游戏里都很强哦",
|
||||
"豆知识[098]Staff名单里飘过的是赞助榜单,喜欢本游戏的话可以给我们打赞助支持开发哦~",
|
||||
"豆知识[099]Techmino不是工业产品也不是练手程序,是游戏作品(至少目前是,嗯……)",
|
||||
"豆知识[100]Techmino生日不太清楚,那就定在2019.6.26吧",
|
||||
"豆知识[101]Techmino有一个简单的节日主题系统",
|
||||
"豆知识[102]Techmino有一个Nspire-CX原型版本",
|
||||
"豆知识[103]请在有一定基础之后再学Tspin!不然副作用非常大!",
|
||||
"豆知识[104]新人请千万记住,打好基础,不要太早学那些花里胡哨的。",
|
||||
"豆知识[105]长时间游戏状态会越来越差!玩久了记得放松一下~",
|
||||
"健康小贴士[01]玩游戏多眨眼,不然会干眼病",
|
||||
"健康小贴士[02]少玩点游戏,多注意眨眼和休息",
|
||||
"健康小贴士[03]戴耳机(尤其是半入耳式)时音量千万别拉满,不然真的会影响听力(虽然很慢)",
|
||||
"健康小贴士[04]不要熬夜,真的会猝死",
|
||||
"健康小贴士[05]长期睡眠不足会引起不可逆的脑损伤(变傻)",
|
||||
"群友名言[001]“玩了Techmino之后发现打字速度变快了”",
|
||||
"群友名言[002]“我要陪伴着tech一步步成长,然后就可以疯狂的享受他”",
|
||||
"Frt评[01]“成天被夸赞‘好玩’的”",
|
||||
"Frt评[02]“可以形成方块圈子小中心话题,同作者一起衍生一些概念与梗的”",
|
||||
"Frt评[03]“论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(”",
|
||||
"Frt评[04]“民间微创新”",
|
||||
"Frt评[05]“民间音lè与图案”",
|
||||
"Frt评[06]“民间游戏设计”",
|
||||
"Frt评[07]“是方块爱好者研究平台”",
|
||||
"Frt评[08]“是方块萌新入坑接收器”",
|
||||
"Frt评[09]“是居家旅行装逼必备”",
|
||||
"Frt评[10]“是民间UI动效艺术作品”",
|
||||
"Frt评[11]“是一滩散乱的代码组成的蜜汁结构”",
|
||||
"Frt评[12]“它是现在的techmino已发布版本”",
|
||||
"今日数学[01](a+b)³=a³+3a²b+3ab²+b³",
|
||||
"今日数学[02]∫u dv=uv-∫v du",
|
||||
"今日数学[03]cos(α+β)=CαCβ-SβSα",
|
||||
"今日数学[04]cos²α-cos²β=-S(α+β)S(α-β)",
|
||||
"今日数学[05]cos²α-sin²β=C(α+β)C(α-β)",
|
||||
"今日数学[06]cos2α=C²α-S²α",
|
||||
"今日数学[07]e^(πi)=-1",
|
||||
"今日数学[08]e^(πi/2)=i",
|
||||
"今日数学[09]e^(πi/4)=(1+i)/√2",
|
||||
"今日数学[10]lim x→c f(x)/g(x)=lim x→c f'(x)/g'(x)",
|
||||
"今日数学[11]S△ABC=√(h(h-a)(h-b)(h-c)),h=(a+b+c)/2",
|
||||
"今日数学[12]sin(α+β)=SαCβ+SβCα",
|
||||
"今日数学[13]sin²α-cos²β=-C(α+β)C(α-β)",
|
||||
"今日数学[14]sin²α-sin²β=S(α+β)S(α-β)",
|
||||
"今日数学[15]sin2α=2SαCα",
|
||||
"Z哲[01]方块教会我们,合群了就会消失,……",
|
||||
"Z哲[02]假如生活欺骗了你,不要悲伤,不要心急,还有块陪着你",
|
||||
"Z哲[03]……,合群了就会消失,不合群世界毁灭(指game over",
|
||||
"Z哲[04]……,合群了就会消失,但消失不代表没有意义",
|
||||
"Z哲[05]没有量化就没有对比,……",
|
||||
"Z哲[06]……,没有对比就没有伤害",
|
||||
"Z哲[07]方块不是你生活的全部,适当走出去看看",
|
||||
"Z哲[08]能玩到Techmino不是你有优越感的理由",
|
||||
"Z哲[09]卖弱和谦虚不是一回事,发言前三思呀",
|
||||
"Z哲[10]让他三尺又何妨",
|
||||
"Z哲[11]退一步海阔天空",
|
||||
"Z哲[12]学习能力很重要,只要你以变强为目的,无论玩游戏学知识都可以很难",
|
||||
"Z哲[13]游戏确实可以是一种艺术形式,而不一定是纯“玩具”",
|
||||
"Z哲[14]不希望激烈的零和竞争充斥整个游戏",
|
||||
"Z哲[15]尝试手动控制圈子规模扩大速度,希望能对维持社区氛围有帮助",
|
||||
"Z哲[16]圈子大了真的会……吗?我们可以试着做些什么,起码让这个过程慢一点",
|
||||
"Z思辨[01]《教育的力量》",
|
||||
"Z思辨[02]《学习的意义》",
|
||||
"Z思辨[03]《练习的力量》",
|
||||
"Z思辨[04]《知识的力量》",
|
||||
"Z思辨[05]《梦想的价值》",
|
||||
"Z思辨[06]《天赋的力量》",
|
||||
"Z思辨[07]《游戏的意义》",
|
||||
"Z思辨[08]《自强与竞争》",
|
||||
"Z推[01]东方Project好玩!",
|
||||
"Z推[02]Minecraft好玩!",
|
||||
"Z推[03]Osu!好玩!",
|
||||
"Z推[04]Terraria好玩!",
|
||||
"Z推[05]Celeste好玩!",
|
||||
"Z推[06]World of goo好玩!",
|
||||
"Z推[07]Orzmic好玩!",
|
||||
"Z推[08]噗哟噗哟好玩!",
|
||||
"Z推[09]Phigros好玩!",
|
||||
"Z推[10]VVVVVV好玩!",
|
||||
"Z推[11]Ballance好玩!",
|
||||
"Z推[12]Zuma好玩!",
|
||||
"Z推[13]魔方好玩!",
|
||||
"Z推[14]15puzzle好玩!",
|
||||
"Z推[15]扫雷好玩!",
|
||||
{C.C,"<PURE ",C.P,"MEMORY>"},
|
||||
{C.C,"15puzzle好玩!"},
|
||||
{C.C,"东方Project好玩!"},
|
||||
{C.C,"魔方好玩!"},
|
||||
{C.C,"噗哟噗哟好玩!"},
|
||||
{C.C,"扫雷好玩!"},
|
||||
{C.C,"Ballance好玩!"},
|
||||
{C.C,"Celeste好玩!"},
|
||||
{C.C,"Minecraft好玩!"},
|
||||
{C.C,"Orzmic好玩!"},
|
||||
{C.C,"Osu! 好玩!"},
|
||||
{C.C,"Phigros好玩!"},
|
||||
{C.C,"Terraria好玩!"},
|
||||
{C.C,"VVVVVV好玩!"},
|
||||
{C.C,"World of goo好玩!"},
|
||||
{C.C,"Zuma好玩!"},
|
||||
{C.H,"暂定段位:9"},
|
||||
{C.H,"REGRET!!"},
|
||||
{C.lC,"Xspin",C.Z,"是啥"},
|
||||
@@ -1147,12 +1155,8 @@ return{
|
||||
{C.R,"《滥用DMCA》"},
|
||||
{C.R,"《知识产权法》"},
|
||||
{C.R,"本游戏难度上限很高,做好心理准备。"},
|
||||
{C.R,"不要向不感兴趣的路人推荐!!!!!!!!"},
|
||||
{C.R,"不要在上课时玩游戏!"},
|
||||
{C.R,"光敏性癫痫警告"},
|
||||
{C.R,"请在有一定游戏基础之后再学Tspin! 不然副作用非常大!"},
|
||||
{C.R,"新人请千万记住,打好基础,不要太早学那些花里胡哨的。"},
|
||||
{C.R,"长时间游戏状态会越来越差!玩久了记得放松一下~"},
|
||||
{C.R,"上班时间不许摸鱼打块!"},
|
||||
{C.R,"上课时间不许摸鱼打块!"},
|
||||
{C.R,"DD",C.Z,"炮=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"D",C.Z,"炮"},
|
||||
{C.R,"DT",C.Z,"炮=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"T",C.Z,"炮"},
|
||||
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR LLL ",C.C,"FFF ",C.Y,"RfR RRf rFF"},
|
||||
@@ -1166,9 +1170,11 @@ return{
|
||||
{C.Y,"暂定段位:MO"},
|
||||
{C.Y,"暂定段位:MV"},
|
||||
{C.Y,"Miya",C.Z," 可爱!"},
|
||||
{C.Y,"O-spin Triple!"},
|
||||
{C.Y,"O-spin!"},
|
||||
{C.Z,"1,2,",C.C,"⑨",C.Z,"!!!!!"},
|
||||
{C.Z,"效率药水",C.H," 效率提升 (8:00)"},
|
||||
{C.Z,"堆叠药水",C.H," 堆叠提升 (3:00)"},
|
||||
{C.Z,"挖掘药水",C.H," 挖掘提升 (8:00)"},
|
||||
{C.Z,"效率药水",C.H," 效率提升 (3:00)"},
|
||||
{C.Z,"协调药水",C.H," MD减少 II(1:30)"},
|
||||
-- "Z酱 可爱!",
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ return{
|
||||
radar={"防","守","攻","送","速","挖"},
|
||||
radarData={"防/分","守/分","攻/分","送/分","行/分","挖/分"},
|
||||
WidgetText={
|
||||
mode={
|
||||
modeExplorer={
|
||||
mod="模组(F1)",
|
||||
},
|
||||
mod={
|
||||
@@ -119,9 +119,13 @@ return{
|
||||
['master_final']= {"大师", "终点", "究极20G:无法触及的终点"},
|
||||
['master_ph']= {"大师", "虚幻", "虚幻20G:???"},
|
||||
['master_ex']= {"宗师", "EX", "成为方块大师"},
|
||||
['master_instinct']={"大师", "本能", "隐藏当前块"},
|
||||
['strategy_e']= {"策略堆叠", "简单", "20G堆叠中速决策练习"},
|
||||
['strategy_h']= {"策略堆叠", "困难", "20G堆叠快速决策练习"},
|
||||
['strategy_u']= {"策略堆叠", "极限", "20G堆叠极速决策练习"},
|
||||
['strategy_e_plus']={"策略堆叠", "简单+", "20G堆叠中速决策练习"},
|
||||
['strategy_h_plus']={"策略堆叠", "困难+", "20G堆叠快速决策练习"},
|
||||
['strategy_u_plus']={"策略堆叠", "极限+", "20G堆叠极速决策练习"},
|
||||
['blind_e']= {"隐形", "半隐", "不强大脑"},
|
||||
['blind_n']= {"隐形", "全隐", "挺强大脑"},
|
||||
['blind_h']= {"隐形", "瞬隐", "很强大脑"},
|
||||
|
||||
@@ -5,7 +5,6 @@ return{
|
||||
loadSample="装载仪器样品",
|
||||
loadVoice="加载语音包",
|
||||
loadFont="加载字体",
|
||||
loadModeIcon="加载模式图标",
|
||||
loadMode="加载方式",
|
||||
loadOther="加载其他资产",
|
||||
finish="按任意按钮开始!",
|
||||
@@ -136,7 +135,8 @@ return{
|
||||
chatStart="------日志开始------",
|
||||
chatHistory="------下面是新消息------",
|
||||
|
||||
keySettingInstruction="按绑定键\n退出:取消\n退格:删除",
|
||||
searchModeHelp="键入要搜索的内容",
|
||||
keySettingHelp="按绑定键\n退出:取消\n退格:删除",
|
||||
customBGhelp="将图像文件拖放到此处以应用自定义背景",
|
||||
customBGloadFailed="不支持自定义背景的图像格式",
|
||||
|
||||
@@ -204,9 +204,8 @@ return{
|
||||
"确保只从官方渠道获得游戏,",
|
||||
"因为如果你在别处找到它,我们无法确保你的安全",
|
||||
"作者不对任何修改负责",
|
||||
FNSF and"/"or"虽然游戏是免费的,但我们会感谢捐赠.",
|
||||
FNSF and"/"or"如果您无法同时使用我们的聊天支付和阿里支付,",
|
||||
FNSF and"/"or"你可以去我们的P\97\116\114\111\110页面(连接到四联词典)支持我们!",
|
||||
FNNS and"/"or"虽然游戏是免费的,但我们感谢捐款。",
|
||||
FNNS and"/"or"查看Zictionary以了解更多信息",
|
||||
},
|
||||
staff={
|
||||
"作者:Z先生 邮箱:1046101471@qq.com",
|
||||
@@ -217,7 +216,7 @@ return{
|
||||
"音乐: Z先生,柒栎流星,ERM,特雷伯尔,蛋白激酶G抑制剂,[T0722,以太]",
|
||||
"音效/语音: 米娅,小亚,东西,Z先生,特雷伯尔",
|
||||
"演出: 模电,HBM",
|
||||
"翻译: 用户670,马特·马尤加,水,法克先生,氟化钪,蛋白激酶G抑制剂",
|
||||
"翻译: 用户670,马特·马尤加,水,法克先生,氟化钪,蛋白激酶G抑制剂,不是机器人",
|
||||
"",
|
||||
"特别感谢:",
|
||||
"飞天,大真,不是机器人,思竣,yuhao7370",
|
||||
@@ -251,9 +250,9 @@ return{
|
||||
sprint="冲刺",
|
||||
marathon="马拉松赛跑",
|
||||
},
|
||||
mode={
|
||||
modeExplorer={
|
||||
mod="多重器官衰竭(F1)",
|
||||
start="开始",
|
||||
sel="选择",
|
||||
},
|
||||
mod={
|
||||
title="多重器官衰竭",
|
||||
@@ -337,7 +336,7 @@ return{
|
||||
title="游戏设置",
|
||||
graphic="←视频",
|
||||
sound="声音→",
|
||||
layout="布局",
|
||||
style="风格",
|
||||
|
||||
ctrl="控制设置",
|
||||
key="键映射",
|
||||
@@ -673,100 +672,104 @@ return{
|
||||
},
|
||||
},
|
||||
modes={
|
||||
['sprint_10l']= {"冲刺", "10升", "清除10行!"},
|
||||
['sprint_20l']= {"冲刺", "20升", "清除20行!"},
|
||||
['sprint_40l']= {"冲刺", "40升", "清除40行!"},
|
||||
['sprint_100l']= {"冲刺", "100升", "清除100行!"},
|
||||
['sprint_400l']= {"冲刺", "400升", "清除400行!"},
|
||||
['sprint_1000l']= {"冲刺", "1000升", "清除1000行!"},
|
||||
['sprintPenta']= {"冲刺", "五联骨牌", "40升,配18个五分钟"},
|
||||
['sprintMPH']= {"冲刺", "每小时英里数", "无记忆\n无先前\n无记忆"},
|
||||
['dig_10l']= {"挖掘", "10升", "挖10条垃圾线"},
|
||||
['dig_40l']= {"挖掘", "40升", "挖40条垃圾线"},
|
||||
['dig_100l']= {"挖掘", "100升", "挖100条垃圾线"},
|
||||
['dig_400l']= {"挖掘", "400升", "挖400条垃圾线"},
|
||||
['drought_n']= {"干旱", "100升", "没有工装"},
|
||||
['drought_l']= {"干旱+", "100升", "搞什么呀"},
|
||||
['marathon_n']= {"马拉松赛跑", "正常", "200线加速马拉松"},
|
||||
['marathon_h']= {"马拉松赛跑", "硬的", "200线高速马拉松"},
|
||||
['solo_e']= {"战争", "容易", "打败AI!"},
|
||||
['solo_n']= {"战争", "正常", "打败AI!"},
|
||||
['solo_h']= {"战争", "硬的", "打败AI!"},
|
||||
['solo_l']= {"战争", "疯子", "打败AI!"},
|
||||
['solo_u']= {"战争", "终极", "打败AI!"},
|
||||
['techmino49_e']= {"技术49", "容易", "49人战斗\n最后一个站着的人获胜"},
|
||||
['techmino49_h']= {"技术49", "硬的", "49人战斗\n最后一个站着的人获胜"},
|
||||
['techmino49_u']= {"技术49", "终极", "49人战斗\n最后一个站着的人获胜"},
|
||||
['techmino99_e']= {"科技99", "容易", "99人战斗\n最后一个站着的人获胜"},
|
||||
['techmino99_h']= {"科技99", "硬的", "99人战斗\n最后一个站着的人获胜"},
|
||||
['techmino99_u']= {"科技99", "终极", "99人战斗\n最后一个站着的人获胜"},
|
||||
['round_e']= {"回合制", "容易", "轮流玩AI!"},
|
||||
['round_n']= {"回合制", "正常", "轮流玩AI!"},
|
||||
['round_h']= {"回合制", "硬的", "轮流玩AI!"},
|
||||
['round_l']= {"回合制", "疯子", "轮流玩AI!"},
|
||||
['round_u']= {"回合制", "终极", "轮流玩AI!"},
|
||||
['master_n']= {"主人", "正常", "适合20G初学者"},
|
||||
['master_h']= {"主人", "硬的", "20克的职业选手"},
|
||||
['master_m']= {"主人", "M21", "20克大师赛"},
|
||||
['master_final']= {"主人", "最终", "20G及以上"},
|
||||
['master_ph']= {"主人", "幻觉", "???"},
|
||||
['master_ex']= {"大师", "额外的", "比瞬间还短的永恒"},
|
||||
['strategy_e']= {"策略堆叠", "简单", "20G堆叠中速决策练习"},
|
||||
['strategy_h']= {"策略堆叠", "困难", "20G堆叠快速决策练习"},
|
||||
['strategy_u']= {"策略堆叠", "极限", "20G堆叠极速决策练习"},
|
||||
['blind_e']= {"看不见的", "一半", "对于新手来说"},
|
||||
['blind_n']= {"看不见的", "全部", "对于中间产品"},
|
||||
['blind_h']= {"看不见的", "突然", "对于有经验的人"},
|
||||
['blind_l']= {"看不见的", "突然+", "对于专业人士"},
|
||||
['blind_u']= {"看不见的", "?", "你准备好了吗?"},
|
||||
['blind_wtf']= {"看不见的", "世界跆拳道联盟", "你还没准备好"},
|
||||
['classic_e']= {"经典", "容易", "80年代的低速娱乐"},
|
||||
['classic_h']= {"经典", "困难", "80年代的中速娱乐"},
|
||||
['classic_u']= {"经典", "终极", "80年代的高速娱乐"},
|
||||
['survivor_e']= {"幸存者", "容易", "你能活多久?"},
|
||||
['survivor_n']= {"幸存者", "正常", "你能活多久?"},
|
||||
['survivor_h']= {"幸存者", "硬的", "你能活多久?"},
|
||||
['survivor_l']= {"幸存者", "疯子", "你能活多久?"},
|
||||
['survivor_u']= {"幸存者", "终极", "你能活多久?"},
|
||||
['attacker_h']= {"攻击者", "硬的", "练习你的进攻技巧!"},
|
||||
['attacker_u']= {"攻击者", "终极", "练习你的进攻技巧!"},
|
||||
['defender_n']= {"防守者", "正常", "练习你的防守技巧!"},
|
||||
['defender_l']= {"防守者", "疯子", "练习你的防守技巧!"},
|
||||
['dig_h']= {"钻机", "硬的", "挖掘练习!"},
|
||||
['dig_u']= {"钻机", "终极", "挖掘练习!"},
|
||||
['clearRush']= {"清晰的冲", "普通", "所有旋转教程\n[在建]"},
|
||||
['c4wtrain_n']= {"C4W训练", "正常", "无限组合"},
|
||||
['c4wtrain_l']= {"C4W训练", "疯子", "无限组合"},
|
||||
['pctrain_n']= {"电脑培训", "正常", "完美清晰的实践"},
|
||||
['pctrain_l']= {"电脑培训", "疯子", "更难的完美清晰的练习"},
|
||||
['pc_n']= {"电脑挑战", "正常", "让电脑在100线以内!"},
|
||||
['pc_h']= {"电脑挑战", "硬的", "让电脑在100线以内!"},
|
||||
['pc_l']= {"电脑挑战", "疯子", "让电脑在100线以内!"},
|
||||
['pc_inf']= {"无尽个人电脑挑战", "", "尽可能多地获取个人电脑"},
|
||||
['tech_n']= {"技术人员", "正常", "试着保持背靠背的链条!"},
|
||||
['tech_n_plus']= {"技术人员", "正常+", "仅限旋转和个人电脑"},
|
||||
['tech_h']= {"技术人员", "硬的", "试着保持背靠背的链条!"},
|
||||
['tech_h_plus']= {"技术人员", "硬的+", "仅限旋转和个人电脑"},
|
||||
['tech_l']= {"技术人员", "疯子", "试着保持背靠背的链条!"},
|
||||
['tech_l_plus']= {"技术人员", "疯子+", "仅限旋转和个人电脑"},
|
||||
['tech_finesse']= {"技术人员", "手腕", "没有技巧错误!"},
|
||||
['tech_finesse_f']={"技术人员", "技巧+", "没有正常的清除和技巧错误!"},
|
||||
['tsd_e']= {"热关断挑战赛", "容易", "只有T-Spin双打!"},
|
||||
['tsd_h']= {"热关断挑战赛", "硬的", "只有T-Spin双打!"},
|
||||
['tsd_u']= {"热关断挑战赛", "终极", "只有T-Spin双打!"},
|
||||
['backfire_n']= {"适得其反", "正常", "挡住回火的垃圾管道"},
|
||||
['backfire_h']= {"适得其反", "硬的", "挡住回火的垃圾管道"},
|
||||
['backfire_l']= {"适得其反", "疯子", "挡住回火的垃圾管道"},
|
||||
['backfire_u']= {"适得其反", "终极", "挡住回火的垃圾管道"},
|
||||
['sprintAtk']= {"冲刺", "100次攻击", "发送100行!"},
|
||||
['sprintEff']= {"竞速", "效率", "在40行内发动更多攻击!"},
|
||||
['zen']= {"禅宗", "200", "没有时间限制的200线跑步"},
|
||||
['ultra']= {"Ultra", "额外", "2分钟的得分进攻"},
|
||||
['infinite']= {"无限", "", "这只是一个沙箱"},
|
||||
['infinite_dig']= {"无限:挖掘", "", "挖,挖,挖"},
|
||||
['marathon_inf']= {"马拉松", "无尽", "无尽马拉松"},
|
||||
['sprint_10l']= {"冲刺", "10升", "清除10行!"},
|
||||
['sprint_20l']= {"冲刺", "20升", "清除20行!"},
|
||||
['sprint_40l']= {"冲刺", "40升", "清除40行!"},
|
||||
['sprint_100l']= {"冲刺", "100升", "清除100行!"},
|
||||
['sprint_400l']= {"冲刺", "400升", "清除400行!"},
|
||||
['sprint_1000l']= {"冲刺", "1000升", "清除1000行!"},
|
||||
['sprintPenta']= {"冲刺", "五联骨牌", "40升,配18个五分钟"},
|
||||
['sprintMPH']= {"冲刺", "每小时英里数", "无记忆\n无先前\n无记忆"},
|
||||
['dig_10l']= {"挖掘", "10升", "挖10条垃圾线"},
|
||||
['dig_40l']= {"挖掘", "40升", "挖40条垃圾线"},
|
||||
['dig_100l']= {"挖掘", "100升", "挖100条垃圾线"},
|
||||
['dig_400l']= {"挖掘", "400升", "挖400条垃圾线"},
|
||||
['drought_n']= {"干旱", "100升", "没有工装"},
|
||||
['drought_l']= {"干旱+", "100升", "搞什么呀"},
|
||||
['marathon_n']= {"马拉松赛跑", "正常", "200线加速马拉松"},
|
||||
['marathon_h']= {"马拉松赛跑", "硬的", "200线高速马拉松"},
|
||||
['solo_e']= {"战争", "容易", "打败AI!"},
|
||||
['solo_n']= {"战争", "正常", "打败AI!"},
|
||||
['solo_h']= {"战争", "硬的", "打败AI!"},
|
||||
['solo_l']= {"战争", "疯子", "打败AI!"},
|
||||
['solo_u']= {"战争", "终极", "打败AI!"},
|
||||
['techmino49_e']= {"技术49", "容易", "49人战斗\n最后一个站着的人获胜"},
|
||||
['techmino49_h']= {"技术49", "硬的", "49人战斗\n最后一个站着的人获胜"},
|
||||
['techmino49_u']= {"技术49", "终极", "49人战斗\n最后一个站着的人获胜"},
|
||||
['techmino99_e']= {"科技99", "容易", "99人战斗\n最后一个站着的人获胜"},
|
||||
['techmino99_h']= {"科技99", "硬的", "99人战斗\n最后一个站着的人获胜"},
|
||||
['techmino99_u']= {"科技99", "终极", "99人战斗\n最后一个站着的人获胜"},
|
||||
['round_e']= {"回合制", "容易", "轮流玩AI!"},
|
||||
['round_n']= {"回合制", "正常", "轮流玩AI!"},
|
||||
['round_h']= {"回合制", "硬的", "轮流玩AI!"},
|
||||
['round_l']= {"回合制", "疯子", "轮流玩AI!"},
|
||||
['round_u']= {"回合制", "终极", "轮流玩AI!"},
|
||||
['master_n']= {"主人", "正常", "适合20G初学者"},
|
||||
['master_h']= {"主人", "硬的", "20克的职业选手"},
|
||||
['master_m']= {"主人", "M21", "20克大师赛"},
|
||||
['master_final']= {"主人", "最终", "20G及以上"},
|
||||
['master_ph']= {"主人", "幻觉", "???"},
|
||||
['master_ex']= {"主人", "额外的", "比瞬间还短的永恒"},
|
||||
['master_instinct']={"主人", "情绪", "步行的秘密部分"},
|
||||
['strategy_e']= {"策略堆叠", "简单", "20G堆叠中速决策练习"},
|
||||
['strategy_h']= {"策略堆叠", "困难", "20G堆叠快速决策练习"},
|
||||
['strategy_u']= {"策略堆叠", "极限", "20G堆叠极速决策练习"},
|
||||
['strategy_e_plus']={"策略堆叠", "简单", "20G堆叠中速决策练习"},
|
||||
['strategy_h_plus']={"策略堆叠", "困难", "20G堆叠快速决策练习"},
|
||||
['strategy_u_plus']={"策略堆叠", "极限", "20G堆叠极速决策练习"},
|
||||
['blind_e']= {"看不见的", "一半", "对于新手来说"},
|
||||
['blind_n']= {"看不见的", "全部", "对于中间产品"},
|
||||
['blind_h']= {"看不见的", "突然", "对于有经验的人"},
|
||||
['blind_l']= {"看不见的", "突然+", "对于专业人士"},
|
||||
['blind_u']= {"看不见的", "?", "你准备好了吗?"},
|
||||
['blind_wtf']= {"看不见的", "世界跆拳道联盟", "你还没准备好"},
|
||||
['classic_e']= {"经典", "容易", "80年代的低速娱乐"},
|
||||
['classic_h']= {"经典", "困难", "80年代的中速娱乐"},
|
||||
['classic_u']= {"经典", "终极", "80年代的高速娱乐"},
|
||||
['survivor_e']= {"幸存者", "容易", "你能活多久?"},
|
||||
['survivor_n']= {"幸存者", "正常", "你能活多久?"},
|
||||
['survivor_h']= {"幸存者", "硬的", "你能活多久?"},
|
||||
['survivor_l']= {"幸存者", "疯子", "你能活多久?"},
|
||||
['survivor_u']= {"幸存者", "终极", "你能活多久?"},
|
||||
['attacker_h']= {"攻击者", "硬的", "练习你的进攻技巧!"},
|
||||
['attacker_u']= {"攻击者", "终极", "练习你的进攻技巧!"},
|
||||
['defender_n']= {"防守者", "正常", "练习你的防守技巧!"},
|
||||
['defender_l']= {"防守者", "疯子", "练习你的防守技巧!"},
|
||||
['dig_h']= {"钻机", "硬的", "挖掘练习!"},
|
||||
['dig_u']= {"钻机", "终极", "挖掘练习!"},
|
||||
['clearRush']= {"清晰的冲", "普通", "所有旋转教程\n[在建]"},
|
||||
['c4wtrain_n']= {"C4W训练", "正常", "无限组合"},
|
||||
['c4wtrain_l']= {"C4W训练", "疯子", "无限组合"},
|
||||
['pctrain_n']= {"电脑培训", "正常", "完美清晰的实践"},
|
||||
['pctrain_l']= {"电脑培训", "疯子", "更难的完美清晰的练习"},
|
||||
['pc_n']= {"电脑挑战", "正常", "让电脑在100线以内!"},
|
||||
['pc_h']= {"电脑挑战", "硬的", "让电脑在100线以内!"},
|
||||
['pc_l']= {"电脑挑战", "疯子", "让电脑在100线以内!"},
|
||||
['pc_inf']= {"无尽个人电脑挑战", "", "尽可能多地获取个人电脑"},
|
||||
['tech_n']= {"技术人员", "正常", "试着保持背靠背的链条!"},
|
||||
['tech_n_plus']= {"技术人员", "正常+", "仅限旋转和个人电脑"},
|
||||
['tech_h']= {"技术人员", "硬的", "试着保持背靠背的链条!"},
|
||||
['tech_h_plus']= {"技术人员", "硬的+", "仅限旋转和个人电脑"},
|
||||
['tech_l']= {"技术人员", "疯子", "试着保持背靠背的链条!"},
|
||||
['tech_l_plus']= {"技术人员", "疯子+", "仅限旋转和个人电脑"},
|
||||
['tech_finesse']= {"技术人员", "手腕", "没有技巧错误!"},
|
||||
['tech_finesse_f']= {"技术人员", "技巧+", "没有正常的清除和技巧错误!"},
|
||||
['tsd_e']= {"热关断挑战赛", "容易", "只有T-Spin双打!"},
|
||||
['tsd_h']= {"热关断挑战赛", "硬的", "只有T-Spin双打!"},
|
||||
['tsd_u']= {"热关断挑战赛", "终极", "只有T-Spin双打!"},
|
||||
['backfire_n']= {"适得其反", "正常", "挡住回火的垃圾管道"},
|
||||
['backfire_h']= {"适得其反", "硬的", "挡住回火的垃圾管道"},
|
||||
['backfire_l']= {"适得其反", "疯子", "挡住回火的垃圾管道"},
|
||||
['backfire_u']= {"适得其反", "终极", "挡住回火的垃圾管道"},
|
||||
['sprintAtk']= {"冲刺", "100次攻击", "发送100行!"},
|
||||
['sprintEff']= {"竞速", "效率", "在40行内发动更多攻击!"},
|
||||
['zen']= {"禅宗", "200", "没有时间限制的200线跑步"},
|
||||
['ultra']= {"Ultra", "额外", "2分钟的得分进攻"},
|
||||
['infinite']= {"无限", "", "这只是一个沙箱"},
|
||||
['infinite_dig']= {"无限:挖掘", "", "挖,挖,挖"},
|
||||
['marathon_inf']= {"马拉松", "无尽", "无尽马拉松"},
|
||||
|
||||
['custom_clear']= {"习俗", "正常"},
|
||||
['custom_puzzle']= {"习俗", "令人费解的"},
|
||||
['custom_clear']= {"习俗", "正常"},
|
||||
['custom_puzzle']= {"习俗", "令人费解的"},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ return{
|
||||
loadSample="加載樂器取樣",
|
||||
loadVoice="加載語音資源",
|
||||
loadFont="加載字體資源",
|
||||
loadModeIcon="加載模式圖標",
|
||||
loadMode="加載模式",
|
||||
loadOther="加載雜項",
|
||||
finish="按任意鍵繼續!",
|
||||
@@ -138,7 +137,8 @@ return{
|
||||
chatStart="------訊息開始------",
|
||||
chatHistory="------以上為歷史訊息------",
|
||||
|
||||
keySettingInstruction="點擊來設置鍵位\n按esc來取消選中\n按退格鍵來清除選中",
|
||||
searchModeHelp="直接輸入關鍵字搜索",
|
||||
keySettingHelp="點擊來設置鍵位\n按esc來取消選中\n按退格鍵來清除選中",
|
||||
customBGhelp="把圖片檔案拖到這個視窗裏使用自定義背景",
|
||||
customBGloadFailed="自定義背景的圖片檔案格式不支持",
|
||||
|
||||
@@ -206,8 +206,8 @@ return{
|
||||
"僅透過內測QQ群/discord伺服器進行免費下載/更新",
|
||||
"從其他渠道獲得遊戲皆有被修改/加入廣告/植入病毒的風險,程序只申請了振動&網路權限!",
|
||||
"若由於被修改的本遊戲產生的各種損失作者概不負責(我怎麼負責啊跟我有什麼關係)",
|
||||
FNSF and"/"or"請從正規途徑獲得最新版,遊戲現為免費,不過有讚賞當然感謝啦~ 記得備註用戶名,方便記錄!",
|
||||
FNSF and"/"or"如果你不使用微信或支付寶,你可以前往我們的P\97\116\114\101\111\110頁面來贊助我們!"
|
||||
FNNS and"/"or"請從正規途徑獲得最新版,遊戲現為免費,不過有打賞當然感謝啦~",
|
||||
FNNS and"/"or"更多資訊見小z詞典"
|
||||
},
|
||||
staff={
|
||||
"作者:MrZ 電郵:1046101471@qq.com",
|
||||
@@ -218,7 +218,7 @@ return{
|
||||
"音樂: MrZ,柒栎流星,ERM,Trebor,C₂₉H₂₅N₃O₅,[T0722,Aether]",
|
||||
"音效/語音: Miya,Xiaoya,Mono,MrZ,Trebor",
|
||||
"演出: 模电,HBM",
|
||||
"翻譯: User670,MattMayuga,Mizu,Mr.Faq,ScF,C₂₉H₂₅N₃O₅",
|
||||
"翻譯: User670,MattMayuga,Mizu,Mr.Faq,ScF,C₂₉H₂₅N₃O₅, NOT_A_ROBOT",
|
||||
"",
|
||||
"特別感謝:",
|
||||
"Flyz,Big_True,NOT_A_ROBOT,思竣,yuhao7370",
|
||||
@@ -252,9 +252,8 @@ return{
|
||||
sprint="40行",
|
||||
marathon="馬拉松",
|
||||
},
|
||||
mode={
|
||||
modeExplorer={
|
||||
mod="Mods (F1)",
|
||||
start="開始",
|
||||
},
|
||||
mod={
|
||||
title="Mods",
|
||||
@@ -336,9 +335,9 @@ return{
|
||||
},
|
||||
setting_game={
|
||||
title="遊戲設置",
|
||||
graphic="←畫面設置",
|
||||
sound="音頻設置→",
|
||||
layout="外觀",
|
||||
graphic="←畫面",
|
||||
sound="音頻→",
|
||||
style="風格",
|
||||
|
||||
ctrl="控制設置",
|
||||
key="鍵位設置",
|
||||
@@ -355,8 +354,8 @@ return{
|
||||
},
|
||||
setting_video={
|
||||
title="畫面設置",
|
||||
sound="←音頻設置",
|
||||
game="遊戲設置→",
|
||||
sound="←音頻",
|
||||
game="遊戲→",
|
||||
|
||||
block="方塊可見",
|
||||
smooth="平滑下落",
|
||||
@@ -402,8 +401,8 @@ return{
|
||||
},
|
||||
setting_sound={
|
||||
title="音頻設置",
|
||||
game="←遊戲設置",
|
||||
graphic="畫面設置→",
|
||||
game="←遊戲",
|
||||
graphic="畫面→",
|
||||
|
||||
mainVol="主音量",
|
||||
bgm="音樂",
|
||||
@@ -712,15 +711,20 @@ return{
|
||||
['master_final']= {"大師", "究極", "究極20G:無法觸及的終點"},
|
||||
['master_ph']= {"大師", "虛幻", "虛幻20G:???"},
|
||||
['master_ex']= {"宗師", "EX", "成為方塊大師"},
|
||||
['master_instinct']={"大師", "本能", "隱藏當前塊"},
|
||||
['strategy_e']= {"策略堆疊", "簡單", "20G堆疊中速決策練習"},
|
||||
['strategy_h']= {"策略堆疊", "困難", "20G堆疊快速決策練習"},
|
||||
['strategy_u']= {"策略堆疊", "極限", "20G堆疊極速決策練習"},
|
||||
['strategy_e_plus']={"策略堆疊", "簡單+", "20G堆疊中速決策練習"},
|
||||
['strategy_h_plus']={"策略堆疊", "困難+", "20G堆疊快速決策練習"},
|
||||
['strategy_u_plus']={"策略堆疊", "極限+", "20G堆疊極速決策練習"},
|
||||
['blind_e']= {"隱形", "半隱", "不強大腦"},
|
||||
['blind_n']= {"隱形", "全隱", "挺強大腦"},
|
||||
['blind_h']= {"隱形", "瞬隱", "很強大腦"},
|
||||
['blind_l']= {"隱形", "瞬隱+", "最強大腦"},
|
||||
['blind_u']= {"隱形", "啊這", "你準備好了嗎"},
|
||||
['blind_wtf']= {"隱形", "不會吧", "還沒準備好"},
|
||||
['blind_inv']= {"隱形", "倒置的", "隱形活動件"},
|
||||
['classic_e']= {"高速經典", "簡單", "高速經典"},
|
||||
['classic_h']= {"高速經典", "困難", "飛速經典"},
|
||||
['classic_u']= {"高速經典", "極限", "極速經典"},
|
||||
|
||||
163
parts/modeTree.lua
Normal file
@@ -0,0 +1,163 @@
|
||||
return{
|
||||
{folder=true,name='sprint',
|
||||
{name='sprint_10l'},
|
||||
{name='sprint_20l'},
|
||||
{name='sprint_40l'},
|
||||
{name='sprint_100l'},
|
||||
{name='sprint_400l'},
|
||||
{name='sprint_1000l'},
|
||||
},
|
||||
{folder=true,name='marathon',
|
||||
{name='marathon_n'},
|
||||
{name='marathon_h'},
|
||||
{name='master_n'},
|
||||
{name='master_h'},
|
||||
{name='master_m'},
|
||||
{name='master_final'},
|
||||
{name='master_ph'},
|
||||
{name='master_ex'},
|
||||
},
|
||||
{folder=true,name='dig_sprint',
|
||||
{name='dig_10l'},
|
||||
{name='dig_40l'},
|
||||
{name='dig_100l'},
|
||||
{name='dig_400l'},
|
||||
},
|
||||
{folder=true,name='survival',author='MrZ',
|
||||
{folder=true,name='survivor',
|
||||
{name='survivor_e'},
|
||||
{name='survivor_n'},
|
||||
{name='survivor_h'},
|
||||
{name='survivor_l'},
|
||||
{name='survivor_u'},
|
||||
},
|
||||
{folder=true,name='attacker',
|
||||
{name='attacker_h'},
|
||||
{name='attacker_u'},
|
||||
},
|
||||
{folder=true,name='defender',
|
||||
{name='defender_n'},
|
||||
{name='defender_l'},
|
||||
},
|
||||
{folder=true,name='dig',
|
||||
{name='dig_h'},
|
||||
{name='dig_u'},
|
||||
},
|
||||
},
|
||||
{folder=true,name='battle',
|
||||
{folder=true,name='solo',
|
||||
{name='solo_e'},
|
||||
{name='solo_n'},
|
||||
{name='solo_h'},
|
||||
{name='solo_l'},
|
||||
{name='solo_u'},
|
||||
},
|
||||
{folder=true,name='round',
|
||||
{name='round_e'},
|
||||
{name='round_n'},
|
||||
{name='round_h'},
|
||||
{name='round_l'},
|
||||
{name='round_u'},
|
||||
},
|
||||
{folder=true,name='techmino',author='MrZ',
|
||||
{name='techmino49_e'},
|
||||
{name='techmino49_h'},
|
||||
{name='techmino49_u'},
|
||||
{name='techmino99_e'},
|
||||
{name='techmino99_h'},
|
||||
{name='techmino99_u'},
|
||||
},
|
||||
},
|
||||
{folder=true,name='drought',author='MrZ',
|
||||
{name='drought_n'},
|
||||
{name='drought_l'},
|
||||
},
|
||||
{folder=true,name='blind',author='MrZ',
|
||||
{name='blind_e'},
|
||||
{name='blind_n'},
|
||||
{name='blind_h'},
|
||||
{name='blind_l'},
|
||||
{name='blind_u'},
|
||||
{name='blind_wtf'},
|
||||
},
|
||||
{folder=true,name='classic',
|
||||
{name='classic_e'},
|
||||
{name='classic_h'},
|
||||
{name='classic_u'},
|
||||
},
|
||||
{folder=true,name='train',author='MrZ',
|
||||
{name='clearRush'},
|
||||
{name='c4wtrain_n'},
|
||||
{name='c4wtrain_l'},
|
||||
{name='pctrain_n'},
|
||||
{name='pctrain_l'},
|
||||
},
|
||||
{folder=true,name='pc',author='MrZ',
|
||||
{name='pc_n'},
|
||||
{name='pc_h'},
|
||||
{name='pc_l'},
|
||||
{name='pc_inf'},
|
||||
},
|
||||
{folder=true,name='tech',author='MrZ',
|
||||
{name='sprintAtk'},
|
||||
{name='sprintEff'},
|
||||
{name='tech_n'},
|
||||
{name='tech_n_plus'},
|
||||
{name='tech_h'},
|
||||
{name='tech_h_plus'},
|
||||
{name='tech_l'},
|
||||
{name='tech_l_plus'},
|
||||
{name='tech_finesse'},
|
||||
{name='tech_finesse_f'},
|
||||
},
|
||||
{folder=true,name='tsd',author='MrZ',
|
||||
{name='tsd_e'},
|
||||
{name='tsd_h'},
|
||||
{name='tsd_u'},
|
||||
},
|
||||
{folder=true,name='backfire',author='MrZ',
|
||||
{name='backfire_n'},
|
||||
{name='backfire_h'},
|
||||
{name='backfire_l'},
|
||||
{name='backfire_u'},
|
||||
},
|
||||
{folder=true,name='infinite',
|
||||
{name='zen'},
|
||||
{name='ultra'},
|
||||
{name='infinite'},
|
||||
{name='infinite_dig'},
|
||||
{name='marathon_inf'},
|
||||
},
|
||||
{folder=true,name='special',author='MrZ',
|
||||
{folder=true,name='sprint',
|
||||
{name='sprintPenta'},
|
||||
{name='sprintMPH'},
|
||||
{name='sprintSmooth'},
|
||||
{name='sprintMD'},
|
||||
{name='sprintSym'},
|
||||
{name='sprintLock'},
|
||||
{name='sprintFix'},
|
||||
},
|
||||
{folder=true,name='sprint',
|
||||
{name='stack_e'},
|
||||
{name='stack_u'},
|
||||
},
|
||||
{folder=true,name='sprint',
|
||||
{name='techrash_n'},
|
||||
{name='techrash_u'},
|
||||
},
|
||||
{name='marathon_bfmax'},
|
||||
},
|
||||
{folder=true,name='big_pack',author='NOT_A_ROBOT',
|
||||
{name='big_n'},
|
||||
{name='big_h'},
|
||||
},
|
||||
{folder=true,name='strategy_pack',author='Milla',
|
||||
{name='strategy_e'},
|
||||
{name='strategy_h'},
|
||||
{name='strategy_u'},
|
||||
{name='strategy_e_plus'},
|
||||
{name='strategy_h_plus'},
|
||||
{name='strategy_u_plus'},
|
||||
},
|
||||
}
|
||||
119
parts/modes.lua
@@ -1,119 +0,0 @@
|
||||
return{
|
||||
{name='sprint_10l', x=0, y=0, size=40,shape=1,icon="sprint1", unlock={'sprint_20l','sprint_40l'}},
|
||||
{name='sprint_20l', x=-200, y=200, size=50,shape=1,icon="sprint1"},
|
||||
{name='sprint_40l', x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={'dig_10l','sprint_100l','marathon_n','sprintPenta','sprintMPH'}},
|
||||
{name='sprint_100l', x=-200, y=0, size=50,shape=1,icon="sprint2", unlock={'sprint_400l','drought_n'}},
|
||||
{name='sprint_400l', x=-400, y=0, size=40,shape=1,icon="sprint3", unlock={'sprint_1000l'}},
|
||||
{name='sprint_1000l', x=-600, y=0, size=40,shape=1,icon="sprint3"},
|
||||
|
||||
{name='sprintPenta', x=180, y=-160, size=40,shape=3,icon="sprint2"},
|
||||
{name='sprintMPH', x=220, y=-340, size=40,shape=3,icon="sprint2"},
|
||||
|
||||
{name='drought_n', x=-400, y=200, size=40,shape=1,icon="drought", unlock={'drought_l'}},
|
||||
{name='drought_l', x=-600, y=200, size=40,shape=1,icon="drought"},
|
||||
|
||||
{name='dig_10l', x=-200, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_40l'}},
|
||||
{name='dig_40l', x=-400, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_100l'}},
|
||||
{name='dig_100l', x=-600, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_400l'}},
|
||||
{name='dig_400l', x=-800, y=-200, size=40,shape=1,icon="dig_sprint"},
|
||||
|
||||
{name='marathon_n', x=0, y=-600, size=60,shape=1,icon="marathon", unlock={'marathon_h','solo_e','round_e','blind_e','classic_e','survivor_e','clearRush','zen'}},
|
||||
{name='marathon_h', x=0, y=-800, size=50,shape=1,icon="marathon", unlock={'master_n','strategy_e'}},
|
||||
|
||||
{name='solo_e', x=-600, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_n'}},
|
||||
{name='solo_n', x=-800, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_h'}},
|
||||
{name='solo_h', x=-1000, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_l','techmino49_e'}},
|
||||
{name='solo_l', x=-1200, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_u'}},
|
||||
{name='solo_u', x=-1400, y=-1000, size=40,shape=1,icon="solo"},
|
||||
|
||||
{name='techmino49_e', x=-1100, y=-1200, size=40,shape=1,icon="t49", unlock={'techmino49_h','techmino99_e'}},
|
||||
{name='techmino49_h', x=-1100, y=-1400, size=40,shape=1,icon="t49", unlock={'techmino49_u'}},
|
||||
{name='techmino49_u', x=-1100, y=-1600, size=40,shape=1,icon="t49"},
|
||||
{name='techmino99_e', x=-1300, y=-1400, size=40,shape=1,icon="t99", unlock={'techmino99_h'}},
|
||||
{name='techmino99_h', x=-1300, y=-1600, size=40,shape=1,icon="t99", unlock={'techmino99_u'}},
|
||||
{name='techmino99_u', x=-1300, y=-1800, size=40,shape=1,icon="t99"},
|
||||
|
||||
{name='round_e', x=-600, y=-800, size=40,shape=1,icon="round", unlock={'round_n'}},
|
||||
{name='round_n', x=-800, y=-800, size=40,shape=1,icon="round", unlock={'round_h'}},
|
||||
{name='round_h', x=-1000, y=-800, size=40,shape=1,icon="round", unlock={'round_l'}},
|
||||
{name='round_l', x=-1200, y=-800, size=40,shape=1,icon="round", unlock={'round_u'}},
|
||||
{name='round_u', x=-1400, y=-800, size=40,shape=1,icon="round"},
|
||||
|
||||
{name='master_n', x=0, y=-1000, size=40,shape=1,icon="master", unlock={'master_h','strategy_h'}},
|
||||
{name='master_h', x=0, y=-1200, size=40,shape=3,icon="master", unlock={'master_final','master_ex','master_ph','master_m','strategy_u'}},
|
||||
{name='master_m', x=150, y=-1320, size=30,shape=3,icon="master"},
|
||||
{name='master_final', x=0, y=-1600, size=40,shape=2,icon="master"},
|
||||
{name='master_ph', x=-150, y=-1500, size=40,shape=2,icon="master"},
|
||||
{name='master_ex', x=150, y=-1500, size=40,shape=2,icon="master_ex"},
|
||||
|
||||
{name='strategy_e', x=-150, y=-1030, size=40,shape=3,icon="master"},
|
||||
{name='strategy_h', x=-200, y=-1160, size=35,shape=3,icon="master"},
|
||||
{name='strategy_u', x=-250, y=-1290, size=30,shape=2,icon="master"},
|
||||
|
||||
{name='blind_e', x=150, y=-700, size=40,shape=1,icon="hidden", unlock={'blind_n'}},
|
||||
{name='blind_n', x=150, y=-800, size=40,shape=1,icon="hidden", unlock={'blind_h'}},
|
||||
{name='blind_h', x=150, y=-900, size=35,shape=1,icon="hidden", unlock={'blind_l'}},
|
||||
{name='blind_l', x=150, y=-1000, size=35,shape=3,icon="hidden2", unlock={'blind_u'}},
|
||||
{name='blind_u', x=150, y=-1100, size=30,shape=3,icon="hidden2", unlock={'blind_wtf'}},
|
||||
{name='blind_wtf', x=150, y=-1200, size=25,shape=2,icon="hidden2"},
|
||||
|
||||
{name='classic_e', x=-200, y=-850, size=40,shape=1,icon="classic", unlock={'classic_h'}},
|
||||
{name='classic_h', x=-300, y=-950, size=35,shape=2,icon="classic", unlock={'classic_u'}},
|
||||
{name='classic_u', x=-400, y=-1050, size=30,shape=2,icon="classic"},
|
||||
|
||||
{name='survivor_e', x=300, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_n'}},
|
||||
{name='survivor_n', x=500, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_h','attacker_h','defender_n','dig_h'}},
|
||||
{name='survivor_h', x=700, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_l'}},
|
||||
{name='survivor_l', x=900, y=-600, size=40,shape=3,icon="survivor", unlock={'survivor_u'}},
|
||||
{name='survivor_u', x=1100, y=-600, size=40,shape=2,icon="survivor"},
|
||||
|
||||
{name='attacker_h', x=300, y=-800, size=40,shape=1,icon="attack", unlock={'attacker_u'}},
|
||||
{name='attacker_u', x=300, y=-1000, size=40,shape=1,icon="attack"},
|
||||
|
||||
{name='defender_n', x=500, y=-800, size=40,shape=1,icon="defend", unlock={'defender_l'}},
|
||||
{name='defender_l', x=500, y=-1000, size=40,shape=1,icon="defend"},
|
||||
|
||||
{name='dig_h', x=700, y=-800, size=40,shape=1,icon="dig", unlock={'dig_u'}},
|
||||
{name='dig_u', x=700, y=-1000, size=40,shape=1,icon="dig"},
|
||||
|
||||
{name='clearRush', x=400, y=-400, size=50,shape=1,icon="bigbang", unlock={'c4wtrain_n','pctrain_n','sprintAtk'}},
|
||||
{name='c4wtrain_n', x=700, y=-400, size=40,shape=1,icon="pc", unlock={'c4wtrain_l'}},
|
||||
{name='c4wtrain_l', x=900, y=-400, size=40,shape=1,icon="pc"},
|
||||
|
||||
{name='pctrain_n', x=700, y=-250, size=40,shape=1,icon="pc", unlock={'pctrain_l','pc_n'}},
|
||||
{name='pctrain_l', x=900, y=-250, size=40,shape=1,icon="pc"},
|
||||
|
||||
{name='pc_n', x=800, y=-110, size=40,shape=1,icon="pc", unlock={'pc_h'}},
|
||||
{name='pc_h', x=950, y=-110, size=40,shape=3,icon="pc", unlock={'pc_l','pc_inf'}},
|
||||
{name='pc_l', x=1100, y=-110, size=40,shape=3,icon="pc"},
|
||||
{name='pc_inf', x=1100, y=-250, size=40,shape=2,icon="pc"},
|
||||
|
||||
{name='sprintAtk', x=530, y=-150, size=40,shape=1,icon="sprint2", unlock={'sprintEff','tech_n','tech_finesse','tsd_e','backfire_n'}},
|
||||
|
||||
{name='sprintEff', x=360, y=-150, size=40,shape=1,icon="sprint2"},
|
||||
|
||||
{name='tech_n', x=400, y=50, size=40,shape=1,icon="tech", unlock={'tech_n_plus','tech_h'}},
|
||||
{name='tech_n_plus', x=200, y=20, size=40,shape=3,icon="tech"},
|
||||
{name='tech_h', x=400, y=200, size=40,shape=1,icon="tech", unlock={'tech_h_plus','tech_l'}},
|
||||
{name='tech_h_plus', x=200, y=170, size=35,shape=3,icon="tech"},
|
||||
{name='tech_l', x=400, y=350, size=40,shape=1,icon="tech", unlock={'tech_l_plus'}},
|
||||
{name='tech_l_plus', x=200, y=320, size=35,shape=3,icon="tech"},
|
||||
|
||||
{name='tech_finesse', x=800, y=50, size=40,shape=1,icon="tech", unlock={'tech_finesse_f'}},
|
||||
{name='tech_finesse_f',x=1000, y=50, size=40,shape=1,icon="tech"},
|
||||
|
||||
{name='tsd_e', x=720, y=200, size=40,shape=1,icon="tsd", unlock={'tsd_h'}},
|
||||
{name='tsd_h', x=960, y=200, size=40,shape=1,icon="tsd", unlock={'tsd_u'}},
|
||||
{name='tsd_u', x=1200, y=200, size=40,shape=1,icon="tsd"},
|
||||
|
||||
{name='backfire_n', x=650, y=350, size=40,shape=1,icon="backfire", unlock={'backfire_h'}},
|
||||
{name='backfire_h', x=850, y=350, size=40,shape=1,icon="backfire", unlock={'backfire_l'}},
|
||||
{name='backfire_l', x=1050, y=350, size=40,shape=3,icon="backfire", unlock={'backfire_u'}},
|
||||
{name='backfire_u', x=1250, y=350, size=35,shape=2,icon="backfire"},
|
||||
|
||||
{name='zen', x=-1000, y=-600, size=40,shape=1,icon="zen", unlock={'ultra','infinite','infinite_dig','marathon_inf'}},
|
||||
{name='ultra', x=-1200, y=-600, size=40,shape=1,icon="ultra"},
|
||||
{name='infinite', x=-1200, y=-400, size=40,shape=1,icon='infinite'},
|
||||
{name='infinite_dig', x=-1000, y=-400, size=40,shape=1,icon="dig"},
|
||||
{name='marathon_inf', x=-800, y=-400, size=40,shape=1,icon="marathon"}
|
||||
}
|
||||
28
parts/modes/big_h.lua
Normal file
@@ -0,0 +1,28 @@
|
||||
return{
|
||||
env={
|
||||
noTele=true,
|
||||
mindas=7,minarr=1,minsdarr=1,
|
||||
sequence="bagES",
|
||||
hook_drop=require'parts.eventsets.bigWallGen'.hook_drop,
|
||||
eventSet='big_h',
|
||||
bg='cubes',bgm='push',
|
||||
},
|
||||
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=160 and 5 or
|
||||
T<=280 and 4 or
|
||||
3
|
||||
else
|
||||
return
|
||||
L>=100 and 2 or
|
||||
L>=50 and 1 or
|
||||
L>=10 and 0
|
||||
end
|
||||
end,
|
||||
}
|
||||
28
parts/modes/big_n.lua
Normal file
@@ -0,0 +1,28 @@
|
||||
return{
|
||||
env={
|
||||
noTele=true,
|
||||
mindas=7,minarr=1,minsdarr=1,
|
||||
sequence="bagES",
|
||||
hook_drop=require'parts.eventsets.bigWallGen'.hook_drop,
|
||||
eventSet='big_n',
|
||||
bg='bg2',bgm='push',
|
||||
},
|
||||
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=180 and 5 or
|
||||
T<=300 and 4 or
|
||||
3
|
||||
else
|
||||
return
|
||||
L>=150 and 2 or
|
||||
L>=100 and 1 or
|
||||
L>=20 and 0
|
||||
end
|
||||
end,
|
||||
}
|
||||