Compare commits
98 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d987008cf6 | ||
|
|
73fc7c037d | ||
|
|
718540db5a | ||
|
|
9c2b09e589 | ||
|
|
0c2f0904ef | ||
|
|
2ae34bded1 | ||
|
|
30b1d2ddfd | ||
|
|
d769604724 | ||
|
|
573366fed9 | ||
|
|
6f3667e65a | ||
|
|
9426dcdc69 | ||
|
|
bdb117c0df | ||
|
|
8fd4391549 | ||
|
|
373c8a8a5f | ||
|
|
2207f7e414 | ||
|
|
984bb7d6a6 | ||
|
|
664afb0bb3 | ||
|
|
716a08b31d | ||
|
|
a6c63c41b6 | ||
|
|
286e330077 | ||
|
|
5e8af423f2 | ||
|
|
5f539a2d4f | ||
|
|
73f63cfd0a | ||
|
|
11422bee5a | ||
|
|
baf36ac86b | ||
|
|
d8c058b0e1 | ||
|
|
6c69c38b32 | ||
|
|
d17e62e36b | ||
|
|
3a2ec3a5dd | ||
|
|
ce25f17676 | ||
|
|
61fe4a5897 | ||
|
|
f50e90b29b | ||
|
|
c151c1176f | ||
|
|
69491e2f8b | ||
|
|
4f4988d7ef | ||
|
|
9ee4af48da | ||
|
|
566ebbf213 | ||
|
|
b1ea222b90 | ||
|
|
d85f77b480 | ||
|
|
20f5d07d05 | ||
|
|
9864a75e0f | ||
|
|
af4cf9fc0d | ||
|
|
d0597e6836 | ||
|
|
61fb504b21 | ||
|
|
bd055a7c60 | ||
|
|
f22c188753 | ||
|
|
7df55b1584 | ||
|
|
f9d5e054d4 | ||
|
|
a17a3f9ba4 | ||
|
|
f3945b9afe | ||
|
|
e3fffc5d7c | ||
|
|
54175a6ee8 | ||
|
|
9ddee1059c | ||
|
|
0e965eaaae | ||
|
|
e66c5c41ee | ||
|
|
da1ec35a55 | ||
|
|
d919812f44 | ||
|
|
eddcd726ca | ||
|
|
190e64de92 | ||
|
|
6ee2833cf7 | ||
|
|
beaaac6892 | ||
|
|
f4e0cabcf3 | ||
|
|
3b60590f8a | ||
|
|
96a695819e | ||
|
|
0a11d2cf47 | ||
|
|
f932005ea0 | ||
|
|
fedce2ae2b | ||
|
|
85cf77f15d | ||
|
|
fa3d7ff199 | ||
|
|
1da6c0c8a9 | ||
|
|
83349707d5 | ||
|
|
d4090dea6f | ||
|
|
ea83add8fa | ||
|
|
7687fb2c12 | ||
|
|
1fb741d7c2 | ||
|
|
157f8cc7d5 | ||
|
|
846d477e9d | ||
|
|
452cdf6ab0 | ||
|
|
e9396c43c9 | ||
|
|
dd726e75e8 | ||
|
|
a66bb9013a | ||
|
|
ea0448af5a | ||
|
|
44735cd6cd | ||
|
|
3956d1d7bc | ||
|
|
a7a2124bb6 | ||
|
|
9399938be0 | ||
|
|
195f9b2c46 | ||
|
|
d7546e5f41 | ||
|
|
888909b48c | ||
|
|
d68f732884 | ||
|
|
5243ed0c6b | ||
|
|
856c490a2b | ||
|
|
5e9dcc27aa | ||
|
|
3f129a9585 | ||
|
|
e682ff1de5 | ||
|
|
2c064d5809 | ||
|
|
e0573382e8 | ||
|
|
5a514ce495 |
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
* text=auto
|
||||||
2
.github/.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
actions/**/*.yml text eol=lf
|
||||||
|
workflows/*.yml text eol=lf
|
||||||
2
.github/actions/get-cc/action.yml
vendored
@@ -3,7 +3,7 @@ description: 'download cc into specific dir'
|
|||||||
inputs:
|
inputs:
|
||||||
tag:
|
tag:
|
||||||
required: false
|
required: false
|
||||||
default:
|
default: techmino-alize-2
|
||||||
arch:
|
arch:
|
||||||
required: true
|
required: true
|
||||||
dir:
|
dir:
|
||||||
|
|||||||
1
.github/build/Linux/.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.template text eol=lf
|
||||||
1
.github/build/Windows/.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.template text eol=crlf
|
||||||
1
.github/build/macOS/.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.template text eol=lf
|
||||||
56
.github/workflows/getVersion.lua
vendored
@@ -1,28 +1,28 @@
|
|||||||
local arg=arg[1]
|
local arg=arg[1]
|
||||||
if arg=="-apkCode"then
|
if arg=="-apkCode"then
|
||||||
local code=require"version".apkCode
|
local code=require"version".apkCode
|
||||||
print(code)
|
print(code)
|
||||||
elseif arg=="-code"then
|
elseif arg=="-code"then
|
||||||
local str=require"version".code
|
local str=require"version".code
|
||||||
print(str)
|
print(str)
|
||||||
elseif arg=="-name"then
|
elseif arg=="-name"then
|
||||||
local str=require"version".string
|
local str=require"version".string
|
||||||
print(str)
|
print(str)
|
||||||
elseif arg=="-release"then
|
elseif arg=="-release"then
|
||||||
local str=require"version".string:gsub("V","",1)
|
local str=require"version".string:gsub("V","",1)
|
||||||
print(str)
|
print(str)
|
||||||
elseif arg=="-updateTitle"then
|
elseif arg=="-updateTitle"then
|
||||||
local note=require"parts.updateLog"
|
local note=require"parts.updateLog"
|
||||||
local p1=note:find("\n%d")+1
|
local p1=note:find("\n%d")+1
|
||||||
local p2=note:find("\n",p1)-1
|
local p2=note:find("\n",p1)-1
|
||||||
note=note:sub(p1,p2)
|
note=note:sub(p1,p2)
|
||||||
print(note)
|
print(note)
|
||||||
elseif arg=="-updateNote"then
|
elseif arg=="-updateNote"then
|
||||||
local note=require"parts.updateLog"
|
local note=require"parts.updateLog"
|
||||||
local p1=note:find("\n",note:find("\n%d")+1)+1
|
local p1=note:find("\n",note:find("\n%d")+1)+1
|
||||||
local p2=note:find("\n%d",p1+1)
|
local p2=note:find("\n%d",p1+1)
|
||||||
note=note:sub(p1,p2-2)
|
note=note:sub(p1,p2-2)
|
||||||
:gsub(" ","- ")
|
:gsub(" ","- ")
|
||||||
:gsub(" ","# ")
|
:gsub(" ","# ")
|
||||||
print(note)
|
print(note)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ Powered by LÖVE, © 2006–2022 LÖVE Development Team.
|
|||||||
|
|
||||||
Lua is free software distributed under the terms of the MIT license. Copyright © 1994–2022 by Lua.org, PUC-Rio.
|
Lua is free software distributed under the terms of the MIT license. Copyright © 1994–2022 by Lua.org, PUC-Rio.
|
||||||
|
|
||||||
SIMPLE LOVE LIGHTS is under a MIT License. Created by Dylan Hunn.
|
|
||||||
|
|
||||||
json.lua is copyrighted by rxi. © 2022 rxi.
|
json.lua is copyrighted by rxi. © 2022 rxi.
|
||||||
|
|
||||||
IBM Plex is copyrighted by the International Business Machines Corporation. IBM and IBM Plex are trademarks of IBM Corp, registered in many jurisdictions worldwide. IBM Plex is licensed under the SIL Open Font License, Version 1.1.
|
IBM Plex is copyrighted by the International Business Machines Corporation. IBM and IBM Plex are trademarks of IBM Corp, registered in many jurisdictions worldwide. IBM Plex is licensed under the SIL Open Font License, Version 1.1.
|
||||||
@@ -29,7 +27,7 @@ JetBrains Mono is copyrighted by the JetBrains Mono Project authors. JetBrains M
|
|||||||
"Windows", the Windows logo, "Xbox", Xbox logo, and "Microsoft" are registered trademarks of Microsoft Corporation in the United States of America and other countries or regions.
|
"Windows", the Windows logo, "Xbox", Xbox logo, and "Microsoft" are registered trademarks of Microsoft Corporation in the United States of America and other countries or regions.
|
||||||
|
|
||||||
|
|
||||||
The Apple logo, "Apple Inc.," iOS, iPadOS, macOS, iPhone, and Mac are registered trademarks of Apple Inc. in the United States of America and other countries or regions.
|
The Apple logo, "Apple Inc.," iOS, iPadOS, macOS, iPhone, Mac, and Apple Arcade are registered trademarks of Apple Inc. in the United States of America and other countries or regions.
|
||||||
|
|
||||||
|
|
||||||
"EA" and "Electronic Arts" are registered trademarks of Electronic Arts Inc. © 2022 Electronic Arts Inc.
|
"EA" and "Electronic Arts" are registered trademarks of Electronic Arts Inc. © 2022 Electronic Arts Inc.
|
||||||
@@ -38,7 +36,7 @@ SEGA and the SEGA logo are registered trademarks of Sega Corporation. © 2022 Se
|
|||||||
|
|
||||||
Oculus Quest is a registered trademark of Facebook Technologies, LLC. © Meta Platforms, Inc.
|
Oculus Quest is a registered trademark of Facebook Technologies, LLC. © Meta Platforms, Inc.
|
||||||
|
|
||||||
"Nintendo" is a registered trademarks of Nintendo Co., Ltd. © 2022 Nintendo Co., Ltd.
|
"Nintendo" is a registered trademark of Nintendo Co., Ltd. © 2022 Nintendo Co., Ltd.
|
||||||
|
|
||||||
N3TWORK is a registered trademark of N3TWORK Inc. © 2022 N3TWORK Inc.
|
N3TWORK is a registered trademark of N3TWORK Inc. © 2022 N3TWORK Inc.
|
||||||
|
|
||||||
@@ -46,6 +44,8 @@ GoldWave is a registered trademark of GoldWave, Inc.
|
|||||||
|
|
||||||
Linux is a registered trademark of Linus Torvalds.
|
Linux is a registered trademark of Linus Torvalds.
|
||||||
|
|
||||||
|
Google is a registered trademark of Google LLC.
|
||||||
|
|
||||||
Touhou Project © Team Shanghai Alice 2002–2022.
|
Touhou Project © Team Shanghai Alice 2002–2022.
|
||||||
|
|
||||||
All other trademarks, logos, and copyrights are the properties of their respective owners.
|
All other trademarks, logos, and copyrights are the properties of their respective owners.
|
||||||
|
|||||||
41
main.lua
@@ -30,7 +30,7 @@ SAVEDIR=fs.getSaveDirectory()
|
|||||||
|
|
||||||
--Global Vars & Settings
|
--Global Vars & Settings
|
||||||
SFXPACKS={'chiptune'}
|
SFXPACKS={'chiptune'}
|
||||||
VOCPACKS={'miya',--[['mono',]]'xiaoya','miku'}
|
VOCPACKS={'miya','mono','xiaoya','miku'}
|
||||||
FIRSTLAUNCH=false
|
FIRSTLAUNCH=false
|
||||||
DAILYLAUNCH=false
|
DAILYLAUNCH=false
|
||||||
|
|
||||||
@@ -51,8 +51,8 @@ local _LOADTIME_=TIME()
|
|||||||
--Load modules
|
--Load modules
|
||||||
Z=require'Zframework'
|
Z=require'Zframework'
|
||||||
FONT.load{
|
FONT.load{
|
||||||
norm='parts/fonts/proportional.ttf',
|
norm='parts/fonts/proportional.otf',
|
||||||
mono='parts/fonts/monospaced.ttf',
|
mono='parts/fonts/monospaced.otf',
|
||||||
}
|
}
|
||||||
FONT.setDefault('norm')
|
FONT.setDefault('norm')
|
||||||
FONT.setFallback('norm')
|
FONT.setFallback('norm')
|
||||||
@@ -180,7 +180,7 @@ Z.setOnFnKeys({
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
function()print(WIDGET.getSelected()or"no widget selected")end,
|
function()print(BG.locked)end,
|
||||||
function()for k,v in next,_G do print(k,v)end end,
|
function()for k,v in next,_G do print(k,v)end end,
|
||||||
function()if love['_openConsole']then love['_openConsole']()end end,
|
function()if love['_openConsole']then love['_openConsole']()end end,
|
||||||
})
|
})
|
||||||
@@ -190,9 +190,6 @@ Z.setDebugInfo{
|
|||||||
{"Voices",VOC.getQueueCount},
|
{"Voices",VOC.getQueueCount},
|
||||||
{"Audios",love.audio.getSourceCount},
|
{"Audios",love.audio.getSourceCount},
|
||||||
}
|
}
|
||||||
Z.setOnResize(function(w,_)
|
|
||||||
SHADER.warning:send('w',w*SCR.dpi)
|
|
||||||
end)
|
|
||||||
do--Z.setOnFocus
|
do--Z.setOnFocus
|
||||||
local function task_autoSoundOff()
|
local function task_autoSoundOff()
|
||||||
while true do
|
while true do
|
||||||
@@ -234,12 +231,18 @@ end
|
|||||||
Z.setOnQuit(destroyPlayers)
|
Z.setOnQuit(destroyPlayers)
|
||||||
|
|
||||||
--Load settings and statistics
|
--Load settings and statistics
|
||||||
TABLE.cover (loadFile('conf/user','-canSkip')or{},USER)
|
if
|
||||||
TABLE.cover (loadFile('conf/unlock','-canSkip')or{},RANKS)
|
not(
|
||||||
TABLE.update(loadFile('conf/settings','-canSkip')or{},SETTING)
|
pcall(TABLE.cover, loadFile('conf/user', '-json -canSkip')or loadFile('conf/user', '-luaon -canSkip')or{},USER) and
|
||||||
TABLE.coverR(loadFile('conf/data','-canSkip')or{},STAT)
|
pcall(TABLE.cover, loadFile('conf/unlock', '-json -canSkip')or loadFile('conf/unlock', '-luaon -canSkip')or{},RANKS) and
|
||||||
TABLE.cover (loadFile('conf/key','-canSkip')or{},KEY_MAP)
|
pcall(TABLE.update,loadFile('conf/settings', '-json -canSkip')or loadFile('conf/settings', '-luaon -canSkip')or{},SETTING) and
|
||||||
TABLE.cover (loadFile('conf/virtualkey','-json -canSkip')or{},VK_ORG)
|
pcall(TABLE.coverR,loadFile('conf/data', '-json -canSkip')or loadFile('conf/data', '-luaon -canSkip')or{},STAT) and
|
||||||
|
pcall(TABLE.cover, loadFile('conf/key', '-json -canSkip')or loadFile('conf/key', '-luaon -canSkip')or{},KEY_MAP) and
|
||||||
|
pcall(TABLE.cover, loadFile('conf/virtualkey','-json -canSkip')or loadFile('conf/virtualkey','-luaon -canSkip')or{},VK_ORG)
|
||||||
|
)
|
||||||
|
then
|
||||||
|
MES.new('error',"Be careful, an error accured when loading saving, some data was lost")
|
||||||
|
end
|
||||||
|
|
||||||
--Initialize fields, sequence, missions, gameEnv for cutsom game
|
--Initialize fields, sequence, missions, gameEnv for cutsom game
|
||||||
local fieldData=loadFile('conf/customBoards','-string -canSkip')
|
local fieldData=loadFile('conf/customBoards','-string -canSkip')
|
||||||
@@ -288,6 +291,15 @@ IMG.init{
|
|||||||
xiaoyaCH='media/image/characters/xiaoya.png',
|
xiaoyaCH='media/image/characters/xiaoya.png',
|
||||||
xiaoyaOmino='media/image/characters/xiaoya_Omino.png',
|
xiaoyaOmino='media/image/characters/xiaoya_Omino.png',
|
||||||
mikuCH='media/image/characters/miku.png',
|
mikuCH='media/image/characters/miku.png',
|
||||||
|
z={
|
||||||
|
character='media/image/characters/z_character.png',
|
||||||
|
screen1='media/image/characters/z_screen1.png',
|
||||||
|
screen2='media/image/characters/z_screen2.png',
|
||||||
|
particle1='media/image/characters/z_particle1.png',
|
||||||
|
particle2='media/image/characters/z_particle2.png',
|
||||||
|
particle3='media/image/characters/z_particle3.png',
|
||||||
|
particle4='media/image/characters/z_particle4.png',
|
||||||
|
},
|
||||||
electric='media/image/characters/electric.png',
|
electric='media/image/characters/electric.png',
|
||||||
hbm='media/image/characters/hbm.png',
|
hbm='media/image/characters/hbm.png',
|
||||||
|
|
||||||
@@ -321,6 +333,7 @@ SKIN.load{
|
|||||||
{name="yinyang_scf",path='media/image/skin/yinyang_scf.png'},
|
{name="yinyang_scf",path='media/image/skin/yinyang_scf.png'},
|
||||||
{name="cartooncup_earety",path='media/image/skin/cartooncup_earety.png'},
|
{name="cartooncup_earety",path='media/image/skin/cartooncup_earety.png'},
|
||||||
{name="jelly_miya",path='media/image/skin/jelly_miya.png'},
|
{name="jelly_miya",path='media/image/skin/jelly_miya.png'},
|
||||||
|
{name="guidetris_xmiao_lusisi",path='media/image/skin/guidetris_xmiao_lusisi.png'},
|
||||||
{name="brick_notypey",path='media/image/skin/brick_notypey.png'},
|
{name="brick_notypey",path='media/image/skin/brick_notypey.png'},
|
||||||
{name="gem_notypey",path='media/image/skin/gem_notypey.png'},
|
{name="gem_notypey",path='media/image/skin/gem_notypey.png'},
|
||||||
{name="classic",path='media/image/skin/classic_unknown.png'},
|
{name="classic",path='media/image/skin/classic_unknown.png'},
|
||||||
@@ -366,7 +379,6 @@ LANG.init('zh',
|
|||||||
{
|
{
|
||||||
zh=require'parts.language.lang_zh',
|
zh=require'parts.language.lang_zh',
|
||||||
zh_trad=require'parts.language.lang_zh_trad',
|
zh_trad=require'parts.language.lang_zh_trad',
|
||||||
zh_full=require'parts.language.lang_zh_full',
|
|
||||||
en=require'parts.language.lang_en',
|
en=require'parts.language.lang_en',
|
||||||
fr=require'parts.language.lang_fr',
|
fr=require'parts.language.lang_fr',
|
||||||
es=require'parts.language.lang_es',
|
es=require'parts.language.lang_es',
|
||||||
@@ -550,6 +562,7 @@ do
|
|||||||
if type(SETTING.bg)~='string'then SETTING.bg='on'end
|
if type(SETTING.bg)~='string'then SETTING.bg='on'end
|
||||||
if SETTING.skin[18]==10 then SETTING.skin[18]=4 end
|
if SETTING.skin[18]==10 then SETTING.skin[18]=4 end
|
||||||
if SETTING.reTime>3 or SETTING.reTime<.5 then SETTING.reTime=2 end
|
if SETTING.reTime>3 or SETTING.reTime<.5 then SETTING.reTime=2 end
|
||||||
|
if SETTING.locale=='zh_full' then SETTING.locale='zh' end
|
||||||
if RANKS.infinite then RANKS.infinite=0 end
|
if RANKS.infinite then RANKS.infinite=0 end
|
||||||
if RANKS.infinite_dig then RANKS.infinite_dig=0 end
|
if RANKS.infinite_dig then RANKS.infinite_dig=0 end
|
||||||
if not RANKS.sprint_10l then RANKS.sprint_10l=0 end
|
if not RANKS.sprint_10l then RANKS.sprint_10l=0 end
|
||||||
|
|||||||
BIN
media/effect/chiptune/achievement.ogg
Normal file
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 140 KiB |
BIN
media/image/characters/z_character.png
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
media/image/characters/z_particle1.png
Normal file
|
After Width: | Height: | Size: 418 B |
BIN
media/image/characters/z_particle2.png
Normal file
|
After Width: | Height: | Size: 693 B |
BIN
media/image/characters/z_particle3.png
Normal file
|
After Width: | Height: | Size: 458 B |
BIN
media/image/characters/z_particle4.png
Normal file
|
After Width: | Height: | Size: 491 B |
BIN
media/image/characters/z_screen1.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
media/image/characters/z_screen2.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
media/image/modeicon/big.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
media/image/modeicon/dig_eff.png
Normal file
|
After Width: | Height: | Size: 969 B |
BIN
media/image/modeicon/secret_grade.png
Normal file
|
After Width: | Height: | Size: 488 B |
BIN
media/image/modeicon/sprint_pento.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
media/image/modeicon/sprint_tri.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
media/image/skin/guidetris_xmiao_lusisi.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
@@ -5,19 +5,15 @@ local shader=SHADER.aura
|
|||||||
local t
|
local t
|
||||||
|
|
||||||
function back.init()
|
function back.init()
|
||||||
t=math.random()*2600
|
t=math.random()*260
|
||||||
BG.resize(SCR.w,SCR.h)
|
BG.resize(SCR.w,SCR.h)
|
||||||
end
|
end
|
||||||
function back.resize(_,h)
|
|
||||||
shader:send('w',SCR.W)
|
|
||||||
shader:send('h',h*SCR.dpi)
|
|
||||||
end
|
|
||||||
function back.update(dt)
|
function back.update(dt)
|
||||||
t=t+dt
|
t=(t+dt)%2600
|
||||||
end
|
end
|
||||||
function back.draw()
|
function back.draw()
|
||||||
gc.clear(.08,.08,.084)
|
gc.clear(.08,.08,.084)
|
||||||
shader:send('t',t)
|
shader:send('phase',t)
|
||||||
gc.setShader(shader)
|
gc.setShader(shader)
|
||||||
gc.rectangle('fill',0,0,SCR.w,SCR.h)
|
gc.rectangle('fill',0,0,SCR.w,SCR.h)
|
||||||
gc.setShader()
|
gc.setShader()
|
||||||
|
|||||||
@@ -5,18 +5,14 @@ local shader=SHADER.grad1
|
|||||||
|
|
||||||
local t
|
local t
|
||||||
function back.init()
|
function back.init()
|
||||||
t=math.random()*2600
|
t=math.random()*260
|
||||||
back.resize()
|
|
||||||
end
|
|
||||||
function back.resize()
|
|
||||||
shader:send('w',SCR.W)
|
|
||||||
end
|
end
|
||||||
function back.update(dt)
|
function back.update(dt)
|
||||||
t=t+dt
|
t=(t+dt)%2600
|
||||||
end
|
end
|
||||||
function back.draw()
|
function back.draw()
|
||||||
gc.clear(.08,.08,.084)
|
gc.clear(.08,.08,.084)
|
||||||
shader:send('t',t)
|
shader:send('phase',t)
|
||||||
gc.setShader(shader)
|
gc.setShader(shader)
|
||||||
gc.rectangle('fill',0,0,SCR.w,SCR.h)
|
gc.rectangle('fill',0,0,SCR.w,SCR.h)
|
||||||
gc.setShader()
|
gc.setShader()
|
||||||
|
|||||||
@@ -5,18 +5,15 @@ local shader=SHADER.grad2
|
|||||||
|
|
||||||
local t
|
local t
|
||||||
function back.init()
|
function back.init()
|
||||||
t=math.random()*2600
|
t=math.random()*260
|
||||||
BG.resize(nil,SCR.h)
|
BG.resize(nil,SCR.h)
|
||||||
end
|
end
|
||||||
function back.resize(_,h)
|
|
||||||
shader:send('h',h*SCR.dpi)
|
|
||||||
end
|
|
||||||
function back.update(dt)
|
function back.update(dt)
|
||||||
t=t+dt
|
t=(t+dt)%2600
|
||||||
end
|
end
|
||||||
function back.draw()
|
function back.draw()
|
||||||
gc.clear(.08,.08,.084)
|
gc.clear(.08,.08,.084)
|
||||||
shader:send('t',t)
|
shader:send('phase',t)
|
||||||
gc.setShader(shader)
|
gc.setShader(shader)
|
||||||
gc.rectangle('fill',0,0,SCR.w,SCR.h)
|
gc.rectangle('fill',0,0,SCR.w,SCR.h)
|
||||||
gc.setShader()
|
gc.setShader()
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
--Customizable grey background
|
--Customizable grey background
|
||||||
local gc=love.graphics
|
local gc=love.graphics
|
||||||
local back={}
|
local back={}
|
||||||
local brightness=.26
|
local r,g,b=.26,.26,.26
|
||||||
function back.draw()
|
function back.draw()
|
||||||
gc.clear(brightness,brightness,brightness)
|
gc.clear(r,g,b)
|
||||||
end
|
end
|
||||||
function back.event(b)
|
function back.event(_r,_g,_b)
|
||||||
brightness=b
|
r,g,b=_r,_g,_b
|
||||||
end
|
end
|
||||||
return back
|
return back
|
||||||
@@ -5,19 +5,15 @@ local shader=SHADER.rgb1
|
|||||||
|
|
||||||
local t
|
local t
|
||||||
function back.init()
|
function back.init()
|
||||||
t=math.random()*2600
|
t=math.random()*260
|
||||||
BG.resize(SCR.w,SCR.h)
|
BG.resize(SCR.w,SCR.h)
|
||||||
end
|
end
|
||||||
function back.resize(_,h)
|
|
||||||
shader:send('w',SCR.W)
|
|
||||||
shader:send('h',h*SCR.dpi)
|
|
||||||
end
|
|
||||||
function back.update(dt)
|
function back.update(dt)
|
||||||
t=t+dt
|
t=(t+dt)%2600
|
||||||
end
|
end
|
||||||
function back.draw()
|
function back.draw()
|
||||||
gc.clear(.08,.08,.084)
|
gc.clear(.08,.08,.084)
|
||||||
shader:send('t',t)
|
shader:send('phase',t)
|
||||||
gc.setShader(shader)
|
gc.setShader(shader)
|
||||||
gc.rectangle('fill',0,0,SCR.w,SCR.h)
|
gc.rectangle('fill',0,0,SCR.w,SCR.h)
|
||||||
gc.setShader()
|
gc.setShader()
|
||||||
|
|||||||
@@ -5,19 +5,15 @@ local shader=SHADER.rgb2
|
|||||||
|
|
||||||
local t
|
local t
|
||||||
function back.init()
|
function back.init()
|
||||||
t=math.random()*2600
|
t=math.random()*260
|
||||||
BG.resize(SCR.w,SCR.h)
|
BG.resize(SCR.w,SCR.h)
|
||||||
end
|
end
|
||||||
function back.resize(_,h)
|
|
||||||
shader:send('w',SCR.W)
|
|
||||||
shader:send('h',h*SCR.dpi)
|
|
||||||
end
|
|
||||||
function back.update(dt)
|
function back.update(dt)
|
||||||
t=t+dt
|
t=(t+dt)%2600
|
||||||
end
|
end
|
||||||
function back.draw()
|
function back.draw()
|
||||||
gc.clear(.08,.08,.084)
|
gc.clear(.08,.08,.084)
|
||||||
shader:send('t',t)
|
shader:send('phase',t)
|
||||||
gc.setShader(shader)
|
gc.setShader(shader)
|
||||||
gc.rectangle('fill',0,0,SCR.w,SCR.h)
|
gc.rectangle('fill',0,0,SCR.w,SCR.h)
|
||||||
gc.setShader()
|
gc.setShader()
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ function back.draw()
|
|||||||
gc.clear(.08,.08,.084)
|
gc.clear(.08,.08,.084)
|
||||||
end
|
end
|
||||||
gc.push('transform')
|
gc.push('transform')
|
||||||
gc.translate(SCR.cx,SCR.cy+20*sin(t*.02))
|
gc.replaceTransform(SCR.xOy_m)
|
||||||
gc.scale(SCR.k)
|
gc.translate(0,20*sin(t*.02))
|
||||||
gc.scale(1.26,1.36)
|
gc.scale(1.26,1.36)
|
||||||
if -t%6.26<.1355 then
|
if -t%6.26<.1355 then
|
||||||
gc.translate(60*sin(t*.26),100*sin(t*.626))
|
gc.translate(60*sin(t*.26),100*sin(t*.626))
|
||||||
|
|||||||
@@ -7,18 +7,36 @@ local pcall=pcall
|
|||||||
local ins,rem=table.insert,table.remove
|
local ins,rem=table.insert,table.remove
|
||||||
local yield=coroutine.yield
|
local yield=coroutine.yield
|
||||||
local bot_cc={}
|
local bot_cc={}
|
||||||
function bot_cc:checkDest()
|
function bot_cc:checkDest(b2b,atk,exblock,yomi)
|
||||||
local dest=self.P.destFX
|
local dest=self.P.destFX
|
||||||
if not dest then return end
|
if not dest then return end
|
||||||
|
if not (dest.b2b==b2b and dest.attack==atk and dest.extra==exblock) then
|
||||||
|
print('hope: '..dest.b2b..' '..dest.attack..' '..dest.extra)
|
||||||
|
print('real: '..b2b..' '..atk..' '..exblock)
|
||||||
|
print(yomi)
|
||||||
|
self:lockWrongPlace()
|
||||||
|
self.P.destFX=nil
|
||||||
|
return
|
||||||
|
end
|
||||||
local CB=self.P.cur.bk
|
local CB=self.P.cur.bk
|
||||||
for k=1,#dest,2 do
|
for k=1,#dest,2 do
|
||||||
local r=CB[dest[k+1]-self.P.curY+2]
|
local r=CB[dest[k+1]-self.P.curY+2]
|
||||||
if not r or not r[dest[k]-self.P.curX+2]then
|
if not r or not r[dest[k]-self.P.curX+2]then
|
||||||
|
print('wrong place')
|
||||||
self:lockWrongPlace()
|
self:lockWrongPlace()
|
||||||
self.P.destFX=nil
|
self.P.destFX=nil
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
local should_spawn = self.P:getNextSpawn() - 1
|
||||||
|
if dest.spawn ~= should_spawn then
|
||||||
|
assert(dest.spawn > should_spawn)
|
||||||
|
print('wrong spawn: should be '..dest.spawn..' but '..should_spawn)
|
||||||
|
print('-- should only happen when camera is going down')
|
||||||
|
self:lockWrongPlace()
|
||||||
|
self.P.destFX=nil
|
||||||
|
return
|
||||||
|
end
|
||||||
end
|
end
|
||||||
function bot_cc:revive()
|
function bot_cc:revive()
|
||||||
TABLE.cut(self.P.holdQueue)
|
TABLE.cut(self.P.holdQueue)
|
||||||
@@ -37,10 +55,10 @@ function bot_cc:thread()
|
|||||||
ccBot:think()
|
ccBot:think()
|
||||||
|
|
||||||
--Poll keys
|
--Poll keys
|
||||||
local success,result,dest,hold,move
|
local success,result,dest,hold,move,b2b,attack,extra,spawn
|
||||||
repeat
|
repeat
|
||||||
yield()
|
yield()
|
||||||
success,result,dest,hold,move=pcall(ccBot.getMove,ccBot)
|
success,result,dest,hold,move,b2b,attack,extra,spawn=pcall(ccBot.getMove,ccBot)
|
||||||
until not success or result==0 or result==2
|
until not success or result==0 or result==2
|
||||||
if not success then break end
|
if not success then break end
|
||||||
if result==2 then
|
if result==2 then
|
||||||
@@ -50,6 +68,10 @@ function bot_cc:thread()
|
|||||||
dest[7],dest[8]=dest[2][1],dest[2][2]
|
dest[7],dest[8]=dest[2][1],dest[2][2]
|
||||||
dest[1],dest[2]=dest[3][1],dest[3][2]
|
dest[1],dest[2]=dest[3][1],dest[3][2]
|
||||||
dest[3],dest[4]=dest[4][1],dest[4][2]
|
dest[3],dest[4]=dest[4][1],dest[4][2]
|
||||||
|
dest.b2b = b2b
|
||||||
|
dest.attack = attack
|
||||||
|
dest.extra = extra
|
||||||
|
dest.spawn = spawn
|
||||||
P.destFX=dest
|
P.destFX=dest
|
||||||
if hold then--Hold
|
if hold then--Hold
|
||||||
keys[1]=8
|
keys[1]=8
|
||||||
@@ -82,8 +104,16 @@ function bot_cc:updateField()
|
|||||||
F[i],i=F0[y][x]>0,i+1
|
F[i],i=F0[y][x]>0,i+1
|
||||||
end end
|
end end
|
||||||
while i<=400 do F[i],i=false,i+1 end
|
while i<=400 do F[i],i=false,i+1 end
|
||||||
if not pcall(self.ccBot.reset,self.ccBot,F,P.b2b>=100,P.combo)then
|
local y = P:getNextSpawn()-1
|
||||||
|
if not pcall(self.ccBot.reset,self.ccBot,F,P.b2b,P.combo,P.stat.pc,P.stat.row,y)then
|
||||||
print("CC is dead ("..P.id..")","error")
|
print("CC is dead ("..P.id..")","error")
|
||||||
|
for y=#F0,1,-1 do
|
||||||
|
local s=""
|
||||||
|
for x=1,10 do
|
||||||
|
s=s..(F[(y-1)*10+x] and "[]" or "..")
|
||||||
|
end
|
||||||
|
print(s)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function bot_cc:switch20G()
|
function bot_cc:switch20G()
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ local botMeta={__index=_undefMethod}
|
|||||||
|
|
||||||
local BOT={}
|
local BOT={}
|
||||||
|
|
||||||
local AISpeed={60,50,40,30,20,14,10,6,4,3}
|
local AISpeed={60,50,42,34,27,21,16,12,9,6}
|
||||||
--[[
|
--[[
|
||||||
arg={
|
arg={
|
||||||
next: number of nexts
|
next: number of nexts
|
||||||
|
|||||||
@@ -296,8 +296,10 @@ local L={
|
|||||||
p9Comb1= 0xF0250,
|
p9Comb1= 0xF0250,
|
||||||
p9Comb2= 0xF0251,
|
p9Comb2= 0xF0251,
|
||||||
frameComb= 0xF0252,
|
frameComb= 0xF0252,
|
||||||
|
s1j= 0xF0253,
|
||||||
|
s1jBase= 0xF0254,
|
||||||
|
s1jComb= 0xF0255,
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _,pack in next,L do
|
for _,pack in next,L do
|
||||||
|
|||||||
@@ -1,3 +1,28 @@
|
|||||||
|
local function GetLevelStr(lvl)
|
||||||
|
local list={"01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","00","0A","14","1E","28","32","3C","46","50","5A","64","6E","78","82","8C","96","A0","AA","B4","BE","C6","20","E6","20","06","21","26","21","46","21","66","21","86","21","A6","21","C6","21","E6","21","06","22","26","22","46","22","66","22","86","22","A6","22","C6","22","E6","22","06","23","26","23","85","A8","29","F0","4A","4A","4A","4A","8D","07","20","A5","A8","29","0F","8D","07","20","60","A6","49","E0","15","10","53","BD","D6","96","A8","8A","0A","AA","E8","BD","EA","96","8D","06","20","CA","A5","BE","C9","01","F0","1E","A5","B9","C9","05","F0","0C","BD","EA","96","38","E9","02","8D","06","20","4C","67","97","BD","EA","96","18","69","0C","8D","06","20","4C","67","97","BD","EA","96","18","69","06","8D","06","20","A2","0A","B1","B8","8D","07","20","C8","CA","D0","F7","E6","49","A5","49","C9","14","30","04","A9","20","85","49","60","A5","B1","29","03","D0","78","A9","00","85","AA","A6","AA","B5","4A","F0","5C","0A","A8","B9","EA","96","85","A8","A5","BE","C9","01","D0","0A","A5","A8","18","69","06","85","A8","4C","BD","97","A5","B9","C9","04","D0","0A","A5","A8","38","E9","02","85","A8","4C","BD","97","A5","A8"}
|
||||||
|
list[0]="00"
|
||||||
|
lvl=lvl%256
|
||||||
|
return list[lvl]
|
||||||
|
end
|
||||||
|
local function GetGravity(lvl)
|
||||||
|
lvl=lvl%256
|
||||||
|
return
|
||||||
|
lvl==0 and 48 or
|
||||||
|
lvl==1 and 43 or
|
||||||
|
lvl==2 and 38 or
|
||||||
|
lvl==3 and 33 or
|
||||||
|
lvl==4 and 28 or
|
||||||
|
lvl==5 and 23 or
|
||||||
|
lvl==6 and 18 or
|
||||||
|
lvl==7 and 13 or
|
||||||
|
lvl==8 and 8 or
|
||||||
|
lvl==9 and 6 or
|
||||||
|
lvl<13 and 5 or
|
||||||
|
lvl<16 and 4 or
|
||||||
|
lvl<19 and 3 or
|
||||||
|
lvl<29 and 2 or
|
||||||
|
1
|
||||||
|
end
|
||||||
local gc_setColor=love.graphics.setColor
|
local gc_setColor=love.graphics.setColor
|
||||||
return{
|
return{
|
||||||
das=16,arr=6,
|
das=16,arr=6,
|
||||||
@@ -15,8 +40,7 @@ return{
|
|||||||
keyCancel={5,6},
|
keyCancel={5,6},
|
||||||
mesDisp=function(P)
|
mesDisp=function(P)
|
||||||
setFont(75)
|
setFont(75)
|
||||||
local r=P.modeData.target/10
|
mStr(GetLevelStr(P.modeData.lvl),63,210)
|
||||||
mStr(r<10 and 9 or r<30 and r or("%02x"):format(r*10-300),63,210)
|
|
||||||
mText(TEXTOBJ.speedLV,63,290)
|
mText(TEXTOBJ.speedLV,63,290)
|
||||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||||
if P.modeData.drought>7 then
|
if P.modeData.drought>7 then
|
||||||
@@ -32,27 +56,22 @@ return{
|
|||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
task=function(P)
|
task=function(P)
|
||||||
|
P.modeData.lvl=9
|
||||||
P.modeData.target=10
|
P.modeData.target=10
|
||||||
end,
|
end,
|
||||||
hook_drop=function(P)
|
hook_drop=function(P)
|
||||||
local D=P.modeData
|
local D=P.modeData
|
||||||
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
|
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
|
||||||
if P.stat.row>=D.target then
|
if P.stat.row>=D.target then
|
||||||
if D.target==110 then
|
if D.target>=100 then
|
||||||
P.gameEnv.drop,P.gameEnv.lock=5,5
|
D.lvl=D.lvl+1
|
||||||
P.gameEnv.sddas,P.gameEnv.sdarr=5,5
|
end
|
||||||
|
local dropSpd=GetGravity(D.lvl)
|
||||||
|
if D.target==200 then P:win('finish') return
|
||||||
|
elseif dropSpd~=P.gameEnv.drop then
|
||||||
|
P.gameEnv.drop,P.gameEnv.lock=dropSpd,dropSpd
|
||||||
|
P.gameEnv.sddas,P.gameEnv.sdarr=dropSpd,dropSpd
|
||||||
SFX.play('warn_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('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('warn_2',.7)
|
|
||||||
elseif D.target==200 then
|
|
||||||
P:win('finish')
|
|
||||||
return
|
|
||||||
else
|
else
|
||||||
SFX.play('reach')
|
SFX.play('reach')
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,3 +1,28 @@
|
|||||||
|
local function GetLevelStr(lvl)
|
||||||
|
local list={"01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","00","0A","14","1E","28","32","3C","46","50","5A","64","6E","78","82","8C","96","A0","AA","B4","BE","C6","20","E6","20","06","21","26","21","46","21","66","21","86","21","A6","21","C6","21","E6","21","06","22","26","22","46","22","66","22","86","22","A6","22","C6","22","E6","22","06","23","26","23","85","A8","29","F0","4A","4A","4A","4A","8D","07","20","A5","A8","29","0F","8D","07","20","60","A6","49","E0","15","10","53","BD","D6","96","A8","8A","0A","AA","E8","BD","EA","96","8D","06","20","CA","A5","BE","C9","01","F0","1E","A5","B9","C9","05","F0","0C","BD","EA","96","38","E9","02","8D","06","20","4C","67","97","BD","EA","96","18","69","0C","8D","06","20","4C","67","97","BD","EA","96","18","69","06","8D","06","20","A2","0A","B1","B8","8D","07","20","C8","CA","D0","F7","E6","49","A5","49","C9","14","30","04","A9","20","85","49","60","A5","B1","29","03","D0","78","A9","00","85","AA","A6","AA","B5","4A","F0","5C","0A","A8","B9","EA","96","85","A8","A5","BE","C9","01","D0","0A","A5","A8","18","69","06","85","A8","4C","BD","97","A5","B9","C9","04","D0","0A","A5","A8","38","E9","02","85","A8","4C","BD","97","A5","A8"}
|
||||||
|
list[0]="00"
|
||||||
|
lvl=lvl%256
|
||||||
|
return list[lvl]
|
||||||
|
end
|
||||||
|
local function GetGravity(lvl)
|
||||||
|
lvl=lvl%256
|
||||||
|
return
|
||||||
|
lvl==0 and 48 or
|
||||||
|
lvl==1 and 43 or
|
||||||
|
lvl==2 and 38 or
|
||||||
|
lvl==3 and 33 or
|
||||||
|
lvl==4 and 28 or
|
||||||
|
lvl==5 and 23 or
|
||||||
|
lvl==6 and 18 or
|
||||||
|
lvl==7 and 13 or
|
||||||
|
lvl==8 and 8 or
|
||||||
|
lvl==9 and 6 or
|
||||||
|
lvl<13 and 5 or
|
||||||
|
lvl<16 and 4 or
|
||||||
|
lvl<19 and 3 or
|
||||||
|
lvl<29 and 2 or
|
||||||
|
1
|
||||||
|
end
|
||||||
local gc_setColor=love.graphics.setColor
|
local gc_setColor=love.graphics.setColor
|
||||||
return{
|
return{
|
||||||
das=16,arr=6,
|
das=16,arr=6,
|
||||||
@@ -15,8 +40,7 @@ return{
|
|||||||
keyCancel={5,6},
|
keyCancel={5,6},
|
||||||
mesDisp=function(P)
|
mesDisp=function(P)
|
||||||
setFont(75)
|
setFont(75)
|
||||||
local r=P.modeData.target/10
|
mStr(GetLevelStr(P.modeData.lvl),63,210)
|
||||||
mStr(r<11 and 18 or r<22 and r+8 or("%02x"):format(r*10-220),63,210)
|
|
||||||
mText(TEXTOBJ.speedLV,63,290)
|
mText(TEXTOBJ.speedLV,63,290)
|
||||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||||
if P.modeData.drought>7 then
|
if P.modeData.drought>7 then
|
||||||
@@ -32,19 +56,22 @@ return{
|
|||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
task=function(P)
|
task=function(P)
|
||||||
|
P.modeData.lvl=18
|
||||||
P.modeData.target=10
|
P.modeData.target=10
|
||||||
end,
|
end,
|
||||||
hook_drop=function(P)
|
hook_drop=function(P)
|
||||||
local D=P.modeData
|
local D=P.modeData
|
||||||
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
|
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
|
||||||
if P.stat.row>=D.target then
|
if P.stat.row>=D.target then
|
||||||
if D.target==100 then
|
if D.target>=100 then
|
||||||
P.gameEnv.drop,P.gameEnv.lock=2,2
|
D.lvl=D.lvl+1
|
||||||
P.gameEnv.sddas,P.gameEnv.sdarr=2,2
|
end
|
||||||
|
local dropSpd=GetGravity(D.lvl)
|
||||||
|
if D.target==200 then P:win('finish') return
|
||||||
|
elseif dropSpd~=P.gameEnv.drop then
|
||||||
|
P.gameEnv.drop,P.gameEnv.lock=dropSpd,dropSpd
|
||||||
|
P.gameEnv.sddas,P.gameEnv.sdarr=dropSpd,dropSpd
|
||||||
SFX.play('warn_1')
|
SFX.play('warn_1')
|
||||||
elseif D.target==200 then
|
|
||||||
P:win('finish')
|
|
||||||
return
|
|
||||||
else
|
else
|
||||||
SFX.play('reach')
|
SFX.play('reach')
|
||||||
end
|
end
|
||||||
|
|||||||
80
parts/eventsets/classic_l.lua
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
local function GetLevelStr(lvl)
|
||||||
|
local list={"01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","00","0A","14","1E","28","32","3C","46","50","5A","64","6E","78","82","8C","96","A0","AA","B4","BE","C6","20","E6","20","06","21","26","21","46","21","66","21","86","21","A6","21","C6","21","E6","21","06","22","26","22","46","22","66","22","86","22","A6","22","C6","22","E6","22","06","23","26","23","85","A8","29","F0","4A","4A","4A","4A","8D","07","20","A5","A8","29","0F","8D","07","20","60","A6","49","E0","15","10","53","BD","D6","96","A8","8A","0A","AA","E8","BD","EA","96","8D","06","20","CA","A5","BE","C9","01","F0","1E","A5","B9","C9","05","F0","0C","BD","EA","96","38","E9","02","8D","06","20","4C","67","97","BD","EA","96","18","69","0C","8D","06","20","4C","67","97","BD","EA","96","18","69","06","8D","06","20","A2","0A","B1","B8","8D","07","20","C8","CA","D0","F7","E6","49","A5","49","C9","14","30","04","A9","20","85","49","60","A5","B1","29","03","D0","78","A9","00","85","AA","A6","AA","B5","4A","F0","5C","0A","A8","B9","EA","96","85","A8","A5","BE","C9","01","D0","0A","A5","A8","18","69","06","85","A8","4C","BD","97","A5","B9","C9","04","D0","0A","A5","A8","38","E9","02","85","A8","4C","BD","97","A5","A8"}
|
||||||
|
list[0]="00"
|
||||||
|
lvl=lvl%256
|
||||||
|
return list[lvl]
|
||||||
|
end
|
||||||
|
local function GetGravity(lvl)
|
||||||
|
lvl=lvl%256
|
||||||
|
return
|
||||||
|
lvl==0 and 48 or
|
||||||
|
lvl==1 and 43 or
|
||||||
|
lvl==2 and 38 or
|
||||||
|
lvl==3 and 33 or
|
||||||
|
lvl==4 and 28 or
|
||||||
|
lvl==5 and 23 or
|
||||||
|
lvl==6 and 18 or
|
||||||
|
lvl==7 and 13 or
|
||||||
|
lvl==8 and 8 or
|
||||||
|
lvl==9 and 6 or
|
||||||
|
lvl<13 and 5 or
|
||||||
|
lvl<16 and 4 or
|
||||||
|
lvl<19 and 3 or
|
||||||
|
lvl<29 and 2 or
|
||||||
|
1
|
||||||
|
end
|
||||||
|
local gc_setColor=love.graphics.setColor
|
||||||
|
return{
|
||||||
|
das=16,arr=6,
|
||||||
|
sddas=2,sdarr=2,
|
||||||
|
irs=false,ims=false,
|
||||||
|
drop=2,lock=2,
|
||||||
|
wait=10,fall=25,
|
||||||
|
freshLimit=0,
|
||||||
|
fieldH=19,
|
||||||
|
nextCount=1,
|
||||||
|
holdCount=0,
|
||||||
|
RS='Classic',
|
||||||
|
sequence='rnd',
|
||||||
|
noTele=true,
|
||||||
|
keyCancel={5,6},
|
||||||
|
mesDisp=function(P)
|
||||||
|
setFont(75)
|
||||||
|
mStr(GetLevelStr(P.modeData.lvl),63,210)
|
||||||
|
mText(TEXTOBJ.speedLV,63,290)
|
||||||
|
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||||
|
if P.modeData.drought>7 then
|
||||||
|
if P.modeData.drought<=14 then
|
||||||
|
gc_setColor(1,1,1,P.modeData.drought/7-1)
|
||||||
|
else
|
||||||
|
local gb=P.modeData.drought<=21 and 2-P.modeData.drought/14 or .5
|
||||||
|
gc_setColor(1,gb,gb)
|
||||||
|
end
|
||||||
|
setFont(50)
|
||||||
|
mStr(P.modeData.drought,63,130)
|
||||||
|
mDraw(MODES.drought_l.icon,63,200,nil,.5)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
task=function(P)
|
||||||
|
P.modeData.lvl=19
|
||||||
|
P.modeData.target=10
|
||||||
|
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>=200 then
|
||||||
|
D.lvl=D.lvl+1
|
||||||
|
--end
|
||||||
|
local dropSpd=GetGravity(D.lvl)
|
||||||
|
if dropSpd~=P.gameEnv.drop then
|
||||||
|
P.gameEnv.drop,P.gameEnv.lock=dropSpd,dropSpd
|
||||||
|
P.gameEnv.sddas,P.gameEnv.sdarr=dropSpd,dropSpd
|
||||||
|
SFX.play('warn_1')
|
||||||
|
else
|
||||||
|
SFX.play('reach')
|
||||||
|
end
|
||||||
|
D.target=D.target+10
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
@@ -1,3 +1,28 @@
|
|||||||
|
local function GetLevelStr(lvl)
|
||||||
|
local list={"01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","00","0A","14","1E","28","32","3C","46","50","5A","64","6E","78","82","8C","96","A0","AA","B4","BE","C6","20","E6","20","06","21","26","21","46","21","66","21","86","21","A6","21","C6","21","E6","21","06","22","26","22","46","22","66","22","86","22","A6","22","C6","22","E6","22","06","23","26","23","85","A8","29","F0","4A","4A","4A","4A","8D","07","20","A5","A8","29","0F","8D","07","20","60","A6","49","E0","15","10","53","BD","D6","96","A8","8A","0A","AA","E8","BD","EA","96","8D","06","20","CA","A5","BE","C9","01","F0","1E","A5","B9","C9","05","F0","0C","BD","EA","96","38","E9","02","8D","06","20","4C","67","97","BD","EA","96","18","69","0C","8D","06","20","4C","67","97","BD","EA","96","18","69","06","8D","06","20","A2","0A","B1","B8","8D","07","20","C8","CA","D0","F7","E6","49","A5","49","C9","14","30","04","A9","20","85","49","60","A5","B1","29","03","D0","78","A9","00","85","AA","A6","AA","B5","4A","F0","5C","0A","A8","B9","EA","96","85","A8","A5","BE","C9","01","D0","0A","A5","A8","18","69","06","85","A8","4C","BD","97","A5","B9","C9","04","D0","0A","A5","A8","38","E9","02","85","A8","4C","BD","97","A5","A8"}
|
||||||
|
list[0]="00"
|
||||||
|
lvl=lvl%256
|
||||||
|
return list[lvl]
|
||||||
|
end
|
||||||
|
local function GetGravity(lvl)
|
||||||
|
lvl=lvl%256
|
||||||
|
return
|
||||||
|
lvl==0 and 48 or
|
||||||
|
lvl==1 and 43 or
|
||||||
|
lvl==2 and 38 or
|
||||||
|
lvl==3 and 33 or
|
||||||
|
lvl==4 and 28 or
|
||||||
|
lvl==5 and 23 or
|
||||||
|
lvl==6 and 18 or
|
||||||
|
lvl==7 and 13 or
|
||||||
|
lvl==8 and 8 or
|
||||||
|
lvl==9 and 6 or
|
||||||
|
lvl<13 and 5 or
|
||||||
|
lvl<16 and 4 or
|
||||||
|
lvl<19 and 3 or
|
||||||
|
lvl<29 and 2 or
|
||||||
|
1
|
||||||
|
end
|
||||||
local gc_setColor=love.graphics.setColor
|
local gc_setColor=love.graphics.setColor
|
||||||
return{
|
return{
|
||||||
das=16,arr=6,
|
das=16,arr=6,
|
||||||
@@ -15,8 +40,7 @@ return{
|
|||||||
keyCancel={5,6},
|
keyCancel={5,6},
|
||||||
mesDisp=function(P)
|
mesDisp=function(P)
|
||||||
setFont(75)
|
setFont(75)
|
||||||
local r=P.modeData.target/10
|
mStr(GetLevelStr(P.modeData.lvl),63,210)
|
||||||
mStr(r==1 and 29 or("%02x"):format(r*10-20),63,210)
|
|
||||||
mText(TEXTOBJ.speedLV,63,290)
|
mText(TEXTOBJ.speedLV,63,290)
|
||||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||||
if P.modeData.drought>7 then
|
if P.modeData.drought>7 then
|
||||||
@@ -32,18 +56,17 @@ return{
|
|||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
task=function(P)
|
task=function(P)
|
||||||
|
P.modeData.lvl=29
|
||||||
P.modeData.target=10
|
P.modeData.target=10
|
||||||
end,
|
end,
|
||||||
hook_drop=function(P)
|
hook_drop=function(P)
|
||||||
local D=P.modeData
|
local D=P.modeData
|
||||||
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
|
D.drought=P.lastPiece.id==7 and 0 or D.drought+1
|
||||||
if P.stat.row>=D.target then
|
if P.stat.row>=D.target then
|
||||||
if D.target==100 then
|
if D.target>=200 then P:win('finish') return end
|
||||||
P:win('finish')
|
|
||||||
return
|
|
||||||
end
|
|
||||||
D.target=D.target+10
|
|
||||||
SFX.play('reach')
|
SFX.play('reach')
|
||||||
|
D.lvl=D.lvl+1
|
||||||
|
D.target=D.target+10
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,15 @@ local gc=love.graphics
|
|||||||
local regretDelay=-1
|
local regretDelay=-1
|
||||||
local int_grade=0
|
local int_grade=0
|
||||||
local grade_points=0
|
local grade_points=0
|
||||||
local int_grade_boosts={0,1,2,3,4,5,5,6,6,7,7,7,8,8,8,9,9,9,10,11,12,12,12,13,13,14,14,15,15,16,16,17}
|
local int_grade_boosts={0,1,2,3,4,5,5,6,6,7,7,7,8,8,8,9,9,9,10,11,12,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26}
|
||||||
|
local coolList={false,false,false,false,false,false,false,false,false}
|
||||||
|
local regretList={false,false,false,false,false,false,false,false,false,false}
|
||||||
|
local gradeList={
|
||||||
|
"9","8","7","6","5","4","3","2","1",
|
||||||
|
"S1","S2","S3","S4","S5","S6","S7","S8","S9",
|
||||||
|
"m1","m2","m3","m4","m5","m6","m7","m8","m9",
|
||||||
|
"M","MK","MV","MO","MM-","MM","MM+","GM-","GM","GM+","TM-","TM","TM+"
|
||||||
|
}
|
||||||
local spd_lvl=0
|
local spd_lvl=0
|
||||||
local cools=0
|
local cools=0
|
||||||
local regrets=0
|
local regrets=0
|
||||||
@@ -66,15 +74,9 @@ local function getDas(l)
|
|||||||
6
|
6
|
||||||
end
|
end
|
||||||
local function getGrade()
|
local function getGrade()
|
||||||
local gradeList={
|
|
||||||
"9","8","7","6","5","4","3","2","1",
|
|
||||||
"S1","S2","S3","S4","S5","S6","S7","S8","S9",
|
|
||||||
"m1","m2","m3","m4","m5","m6","m7","m8","m9",
|
|
||||||
"M","MK","MV","MO","MM-","MM","MM+","GM-","GM","GM+","TM-","TM","TM+"
|
|
||||||
}
|
|
||||||
if int_grade==nil then int_grade=0 end
|
if int_grade==nil then int_grade=0 end
|
||||||
if rollGrades==nil then rollGrades=0 end
|
if rollGrades==nil then rollGrades=0 end
|
||||||
return gradeList[math.min(math.floor(int_grade_boosts[int_grade+1]+rollGrades+cools+1-regrets),#gradeList)]
|
return gradeList[math.max(math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList),1)]
|
||||||
end
|
end
|
||||||
local function addGrade(row, cmb, lvl) -- IGS = internal grade system
|
local function addGrade(row, cmb, lvl) -- IGS = internal grade system
|
||||||
if row<1 then return end
|
if row<1 then return end
|
||||||
@@ -108,35 +110,56 @@ return{
|
|||||||
lock=30,
|
lock=30,
|
||||||
wait=23,
|
wait=23,
|
||||||
fall=25,
|
fall=25,
|
||||||
noTele=true,
|
keyCancel={10,11,12,14,15,16,17,18,19,20},
|
||||||
das=16,arr=1,
|
das=16,arr=1,
|
||||||
minsdarr=1,
|
minsdarr=1,
|
||||||
|
ihs=true,irs=true,ims=false,
|
||||||
mesDisp=function(P)
|
mesDisp=function(P)
|
||||||
gc.setColor(1,1,1,1)
|
gc.setColor(1,1,1,1)
|
||||||
setFont(45)
|
setFont(45)
|
||||||
mText(TEXTOBJ.grade,63,180)
|
mText(TEXTOBJ.grade,63,180)
|
||||||
setFont(62)
|
setFont(60)
|
||||||
mStr(getGrade(),63,110)
|
mStr(getGrade(),63,110) -- draw grade
|
||||||
|
for i=1,10 do -- draw cool/regret history
|
||||||
|
if not (coolList[i] or regretList[i]) then -- neither cool nor regret
|
||||||
|
gc.setColor(0.6,0.6,0.6,P.modeData.pt<(i-1)*100 and 0.25 or 0.6)
|
||||||
|
else
|
||||||
|
gc.setColor(regretList[i] and 1 or 0, coolList[i] and 1 or 0, 0, 1)
|
||||||
|
end
|
||||||
|
gc.circle('fill',-10,150+i*25,10)
|
||||||
|
gc.setColor(1,1,1,1)
|
||||||
|
end
|
||||||
if isInRoll then
|
if isInRoll then
|
||||||
setFont(20)
|
setFont(20)
|
||||||
mStr(("%.1f"):format(rollGrades),63,208)
|
mStr(("%.1f"):format(rollGrades),63,208) -- draw roll grades
|
||||||
gc.setLineWidth(2)
|
gc.setLineWidth(2)
|
||||||
gc.setColor(.98,.98,.98,.8)
|
gc.setColor(.98,.98,.98,.8)
|
||||||
gc.rectangle('line',0,240,126,80,4)
|
gc.rectangle('line',0,240,126,80,4)
|
||||||
gc.setColor(.98,.98,.98,.4)
|
gc.setColor(.98,.98,.98,.4)
|
||||||
gc.rectangle('fill',0+2,240+2,126-4,80-4,2)
|
gc.rectangle('fill',0+2,240+2,126-4,80-4,2) -- draw time box
|
||||||
setFont(45)
|
setFont(45)
|
||||||
local t=(P.stat.frame-prevSectTime)/60
|
local t=(P.stat.frame-prevSectTime)/60
|
||||||
local T=("%.1f"):format(60-t)
|
local T=("%.1f"):format(60-t)
|
||||||
gc.setColor(COLOR.dH)
|
gc.setColor(COLOR.dH)
|
||||||
mStr(T,65,250)
|
mStr(T,65,250) -- draw time
|
||||||
t=t/60
|
t=t/60
|
||||||
gc.setColor(1.7*t,2.3-2*t,.3)
|
gc.setColor(1.7*t,2.3-2*t,.3)
|
||||||
mStr(T,63,248)
|
mStr(T,63,248)
|
||||||
else
|
else
|
||||||
|
-- draw level counter
|
||||||
setFont(20)
|
setFont(20)
|
||||||
mStr(grade_points,63,208)
|
mStr(grade_points,63,208)
|
||||||
setFont(45)
|
setFont(45)
|
||||||
|
if coolList[math.ceil(P.modeData.pt/100+0.01)] then
|
||||||
|
gc.setColor(0,1,0,1)
|
||||||
|
elseif P.stat.frame-prevSectTime > cool_time[math.ceil(P.modeData.pt/100+0.01)] then
|
||||||
|
gc.setColor(0.7,0.7,0.7,1)
|
||||||
|
end
|
||||||
|
if coolList[math.ceil(P.modeData.pt/100+0.01)] and regretList[math.ceil(P.modeData.pt/100+0.01)] then
|
||||||
|
gc.setColor(1,1,0,1)
|
||||||
|
elseif regretList[math.ceil(P.modeData.pt/100+0.01)] then
|
||||||
|
gc.setColor(1,0,0,1)
|
||||||
|
end
|
||||||
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
|
PLY.draw.drawProgress(P.modeData.pt,P.modeData.target)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
@@ -173,6 +196,7 @@ return{
|
|||||||
if D.pt%100>70 and not prevDrop70 then
|
if D.pt%100>70 and not prevDrop70 then
|
||||||
if P.stat.frame-prevSectTime < cool_time[math.ceil(D.pt/100)] then
|
if P.stat.frame-prevSectTime < cool_time[math.ceil(D.pt/100)] then
|
||||||
cools=cools+1
|
cools=cools+1
|
||||||
|
coolList[math.ceil(D.pt/100)]=true
|
||||||
P:_showText("COOL!",0,-120,80,'fly',.8)
|
P:_showText("COOL!",0,-120,80,'fly',.8)
|
||||||
nextSpeedUp=true
|
nextSpeedUp=true
|
||||||
end
|
end
|
||||||
@@ -214,7 +238,7 @@ return{
|
|||||||
BG.set('lightning')
|
BG.set('lightning')
|
||||||
elseif s>9 then
|
elseif s>9 then
|
||||||
if cools>8 then
|
if cools>8 then
|
||||||
E.lockFX=E.lockFX>1 and 1 or E.lockFX
|
if E.lockFX and E.lockFX>1 then E.lockFX=1 end
|
||||||
P:setInvisible(5)
|
P:setInvisible(5)
|
||||||
else
|
else
|
||||||
P:setInvisible(300)
|
P:setInvisible(300)
|
||||||
@@ -245,34 +269,38 @@ return{
|
|||||||
isInRollTrans=false
|
isInRollTrans=false
|
||||||
prevDrop70=false
|
prevDrop70=false
|
||||||
nextSpeedUp=false
|
nextSpeedUp=false
|
||||||
local decayRate={125,80,80,50,45,45,45,40,40,40,40,40,30,30,30,20,20,20,20,20,15,15,15,15,15,15,15,15,15,15,10,10,10}
|
coolList={false,false,false,false,false,false,false,false,false}
|
||||||
|
regretList={false,false,false,false,false,false,false,false,false,false}
|
||||||
|
local decayRate={125,80,80,50,45,45,45,40,40,40,40,40,30,30,30,20,20,20,20,20,15,15,15,15,15,15,15,15,15,15,10,10,10,9,9,9,8,8,8,7,7,7,6}
|
||||||
local decayTimer=0
|
local decayTimer=0
|
||||||
while true do
|
while true do
|
||||||
YIELD()
|
YIELD()
|
||||||
P.modeData.grade=getGrade()
|
P.modeData.grade=getGrade()
|
||||||
P.modeData.gradePts=math.min(math.floor(int_grade_boosts[int_grade+1]+rollGrades+cools-regrets),36)
|
P.modeData.gradePts=math.max(math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList),1)
|
||||||
|
if P.stat.frame-prevSectTime > reg_time[math.ceil(P.modeData.pt/100+0.01)] and not (isInRoll or isInRollTrans) then
|
||||||
|
regretList[math.ceil(P.modeData.pt/100)]=true
|
||||||
|
end
|
||||||
if regretDelay>-1 then
|
if regretDelay>-1 then
|
||||||
regretDelay=regretDelay-1
|
regretDelay=regretDelay-1
|
||||||
if regretDelay==-1 then P:_showText("REGRET!!",0,-120,80,'beat',.8) end
|
if regretDelay==-1 then P:_showText("REGRET!!",0,-120,80,'beat',.8) end
|
||||||
end
|
end
|
||||||
if isInRollTrans then
|
if isInRollTrans then
|
||||||
if P.waiting==220 then
|
if P.waiting>=220 then
|
||||||
--Make field invisible
|
--Make field invisible
|
||||||
for j=1,#P.field do for i=1,10 do
|
for y=1,#P.field do for x=1,10 do
|
||||||
P.visTime[j][i]=P.visTime[j][i]-0.001
|
P.visTime[y][x]=P.waiting-220
|
||||||
end end
|
end end
|
||||||
elseif P.waiting==190 then
|
elseif P.waiting==190 then
|
||||||
for _=#P.field,1,-1 do
|
TABLE.cut(P.field)
|
||||||
P.field[_],P.visTime[_]=nil
|
TABLE.cut(P.visTime)
|
||||||
end
|
|
||||||
elseif P.waiting==180 then
|
elseif P.waiting==180 then
|
||||||
playReadySFX(3,3)
|
playReadySFX(3,3)
|
||||||
elseif P.waiting==120 then
|
elseif P.waiting==120 then
|
||||||
playReadySFX(2,2)
|
playReadySFX(2,1)
|
||||||
elseif P.waiting==60 then
|
elseif P.waiting==60 then
|
||||||
playReadySFX(1,1)
|
playReadySFX(1,1)
|
||||||
elseif P.waiting==1 then
|
elseif P.waiting==1 then
|
||||||
playReadySFX(0,0)
|
playReadySFX(0,1)
|
||||||
isInRollTrans=false
|
isInRollTrans=false
|
||||||
isInRoll=true
|
isInRoll=true
|
||||||
BGM.play('hope')
|
BGM.play('hope')
|
||||||
@@ -282,12 +310,15 @@ return{
|
|||||||
end
|
end
|
||||||
if P.waiting<=0 and grade_points>0 and not isInRoll then
|
if P.waiting<=0 and grade_points>0 and not isInRoll then
|
||||||
decayTimer=decayTimer+1
|
decayTimer=decayTimer+1
|
||||||
if decayTimer>=decayRate[int_grade+1] then
|
if decayTimer>=decayRate[math.min(int_grade+1,#decayRate)] then
|
||||||
decayTimer=0
|
decayTimer=0
|
||||||
grade_points=grade_points-1
|
grade_points=grade_points-1
|
||||||
end
|
end
|
||||||
elseif isInRoll and P.stat.frame>=prevSectTime+3600 then
|
elseif isInRoll and P.stat.frame>=prevSectTime+3599 then
|
||||||
rollGrades=rollGrades+(cools>8 and 1.6 or 0.5)
|
rollGrades=rollGrades+(cools>8 and 1.6 or 0.5)
|
||||||
|
P.modeData.grade=getGrade()
|
||||||
|
P.modeData.gradePts=math.min(math.floor(int_grade_boosts[math.min(int_grade+1,#int_grade_boosts)]+rollGrades+cools+1-regrets),#gradeList)
|
||||||
|
YIELD()
|
||||||
P:win('finish')
|
P:win('finish')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -20,7 +20,13 @@ return{
|
|||||||
local D=P.modeData
|
local D=P.modeData
|
||||||
|
|
||||||
local c=#P.clearedRow
|
local c=#P.clearedRow
|
||||||
if c==0 and D.pt%100==99 then return end
|
if c==0 and D.pt%100==99 then
|
||||||
|
if D.pt<1000 then
|
||||||
|
hidetimer=0-inv_wait[(P.modeData.pt/100-(P.modeData.pt%100)/100)+1]
|
||||||
|
if c>0 then hidetimer=hidetimer-inv_fall[(P.modeData.pt/100-(P.modeData.pt%100)/100)+1]end
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
local s=c<3 and c+1 or c==3 and 5 or 7
|
local s=c<3 and c+1 or c==3 and 5 or 7
|
||||||
if P.combo>7 then s=s+2
|
if P.combo>7 then s=s+2
|
||||||
elseif P.combo>3 then s=s+1
|
elseif P.combo>3 then s=s+1
|
||||||
@@ -50,6 +56,8 @@ return{
|
|||||||
elseif s==7 then
|
elseif s==7 then
|
||||||
E.das=6
|
E.das=6
|
||||||
BGM.play('far')
|
BGM.play('far')
|
||||||
|
elseif s==8 then
|
||||||
|
BG.set('none')
|
||||||
elseif s==10 then
|
elseif s==10 then
|
||||||
D.pt=1000
|
D.pt=1000
|
||||||
P:win('finish')
|
P:win('finish')
|
||||||
|
|||||||
54
parts/eventsets/secret_grade.lua
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
local gc_setColor,gc_draw=love.graphics.setColor,love.graphics.draw
|
||||||
|
local ply_applyField=PLY.draw.applyField
|
||||||
|
local function GetOpenHole(num)
|
||||||
|
return -math.abs(((num-1) % 18)-9)+10
|
||||||
|
end
|
||||||
|
local F={}
|
||||||
|
local ranks={"10","9","8","7","6","5","4","3","2","1","S1","S2","S3","S4","S5","S6","S7","S8","S9","GM","GM+","TM","TM+","TM+₂","TM+₃", "TM+₄","TM+₅"}
|
||||||
|
-- lines: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
||||||
|
return{
|
||||||
|
fkey1=function(P)P.modeData.showGuide=not P.modeData.showGuide end,
|
||||||
|
mesDisp=function(P)
|
||||||
|
mText(TEXTOBJ.grade,63,190)
|
||||||
|
setFont(55)
|
||||||
|
mStr(ranks[P.modeData.rankPts],63,125)
|
||||||
|
|
||||||
|
ply_applyField(P)
|
||||||
|
local mark=TEXTURE.puzzleMark
|
||||||
|
gc_setColor(1,1,1)
|
||||||
|
if P.modeData.showGuide then
|
||||||
|
for y=1,P.modeData.rankPts+1 do for x=1,10 do
|
||||||
|
local T=F[y][x]
|
||||||
|
if T~=0 then
|
||||||
|
gc_draw(mark[T],30*x-30,600-30*y)
|
||||||
|
end
|
||||||
|
end end
|
||||||
|
end
|
||||||
|
PLY.draw.cancelField(P)
|
||||||
|
end,
|
||||||
|
task=function(P)
|
||||||
|
P.modeData.rankPts=1
|
||||||
|
P.modeData.showGuide=true
|
||||||
|
for i=1,50 do
|
||||||
|
F[i] = {}
|
||||||
|
local h=GetOpenHole(i)
|
||||||
|
for j=1,10 do
|
||||||
|
F[i][j]=h==j and -1 or 21
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
hook_drop=function(P)
|
||||||
|
local D=P.modeData
|
||||||
|
D.rankPts=1
|
||||||
|
for i=1,#P.field do
|
||||||
|
local h=GetOpenHole(i)
|
||||||
|
for j=1,10 do
|
||||||
|
if P.field[i][j]>0 and h==j then return end
|
||||||
|
if P.field[i][j]==0 and h~=j then return end
|
||||||
|
end
|
||||||
|
if i==#P.field then return end
|
||||||
|
if P.field[i+1][h]==0 then return end
|
||||||
|
D.rankPts=D.rankPts+1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
BIN
parts/fonts/japan.otf
Normal file
BIN
parts/fonts/monospaced.otf
Normal file
BIN
parts/fonts/proportional.otf
Normal file
@@ -165,17 +165,15 @@ do--function applySettings()
|
|||||||
BG.set()
|
BG.set()
|
||||||
elseif SETTING.bg=='off'then
|
elseif SETTING.bg=='off'then
|
||||||
BG.unlock()
|
BG.unlock()
|
||||||
BG.set('gray')
|
BG.set('fixColor',SETTING.bgAlpha,SETTING.bgAlpha,SETTING.bgAlpha)
|
||||||
BG.send(SETTING.bgAlpha)
|
|
||||||
BG.lock()
|
BG.lock()
|
||||||
elseif SETTING.bg=='custom'then
|
elseif SETTING.bg=='custom'then
|
||||||
if love.filesystem.getInfo('conf/customBG')then
|
if love.filesystem.getInfo('conf/customBG')then
|
||||||
local res,image=pcall(gc.newImage,love.filesystem.newFile('conf/customBG'))
|
local res,image=pcall(gc.newImage,love.filesystem.newFile('conf/customBG'))
|
||||||
if res then
|
if res then
|
||||||
BG.unlock()
|
BG.unlock()
|
||||||
BG.set('custom')
|
|
||||||
gc.setDefaultFilter('linear','linear')
|
gc.setDefaultFilter('linear','linear')
|
||||||
BG.send(SETTING.bgAlpha,image)
|
BG.set('custom',SETTING.bgAlpha,image)
|
||||||
gc.setDefaultFilter('nearest','nearest')
|
gc.setDefaultFilter('nearest','nearest')
|
||||||
BG.lock()
|
BG.lock()
|
||||||
else
|
else
|
||||||
@@ -184,8 +182,7 @@ do--function applySettings()
|
|||||||
else--Switch off when custom BG not found
|
else--Switch off when custom BG not found
|
||||||
SETTING.bg='off'
|
SETTING.bg='off'
|
||||||
BG.unlock()
|
BG.unlock()
|
||||||
BG.set('gray')
|
BG.set('fixColor',SETTING.bgAlpha,SETTING.bgAlpha,SETTING.bgAlpha)
|
||||||
BG.send(SETTING.bgAlpha)
|
|
||||||
BG.lock()
|
BG.lock()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -714,7 +711,7 @@ do--function resetGameData(args)
|
|||||||
local gameSetting={
|
local gameSetting={
|
||||||
--Tuning
|
--Tuning
|
||||||
'das','arr','dascut','dropcut','sddas','sdarr',
|
'das','arr','dascut','dropcut','sddas','sdarr',
|
||||||
'ihs','irs','ims','RS','FTLock',
|
'ihs','irs','ims','RS',
|
||||||
|
|
||||||
--System
|
--System
|
||||||
'skin','face',
|
'skin','face',
|
||||||
@@ -943,7 +940,7 @@ do--CUS/SETXXX(k)
|
|||||||
local warnList={
|
local warnList={
|
||||||
'das','arr','dascut','dropcut','sddas','sdarr',
|
'das','arr','dascut','dropcut','sddas','sdarr',
|
||||||
'ihs','irs','ims','RS',
|
'ihs','irs','ims','RS',
|
||||||
'FTLock','frameMul','highCam',
|
'frameMul','highCam',
|
||||||
'VKSwitch','VKIcon','VKTrack','VKDodge',
|
'VKSwitch','VKIcon','VKTrack','VKDodge',
|
||||||
'simpMode',
|
'simpMode',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -327,7 +327,7 @@ EVENTSETS={
|
|||||||
'backfire_120','backfire_60','backfire_30','backfire_0',
|
'backfire_120','backfire_60','backfire_30','backfire_0',
|
||||||
'checkAttack_100',
|
'checkAttack_100',
|
||||||
'checkLine_10','checkLine_20','checkLine_40','checkLine_100','checkLine_200','checkLine_400','checkLine_1000',
|
'checkLine_10','checkLine_20','checkLine_40','checkLine_100','checkLine_200','checkLine_400','checkLine_1000',
|
||||||
'classic_e','classic_h','classic_u',
|
'classic_e','classic_h','classic_l','classic_u',
|
||||||
'defender_n','defender_l',
|
'defender_n','defender_l',
|
||||||
'dig_10l','dig_40l','dig_100l','dig_400l',
|
'dig_10l','dig_40l','dig_100l','dig_400l',
|
||||||
'dig_h','dig_u',
|
'dig_h','dig_u',
|
||||||
@@ -536,7 +536,6 @@ do--Game data tables
|
|||||||
ROOMENV={
|
ROOMENV={
|
||||||
--Room config
|
--Room config
|
||||||
capacity=10,
|
capacity=10,
|
||||||
FTLock=true,
|
|
||||||
|
|
||||||
--Basic
|
--Basic
|
||||||
drop=30,lock=60,
|
drop=30,lock=60,
|
||||||
@@ -591,7 +590,6 @@ do--Userdata tables
|
|||||||
ihs=true,irs=true,ims=true,
|
ihs=true,irs=true,ims=true,
|
||||||
holdMode='hold',
|
holdMode='hold',
|
||||||
RS='TRS',
|
RS='TRS',
|
||||||
FTLock=true,
|
|
||||||
|
|
||||||
--System
|
--System
|
||||||
reTime=2,
|
reTime=2,
|
||||||
|
|||||||
@@ -77,130 +77,130 @@ return{
|
|||||||
{"テトリスオンラインサーバー",
|
{"テトリスオンラインサーバー",
|
||||||
"tetrisonline servers サーバー テトリスオンライン",
|
"tetrisonline servers サーバー テトリスオンライン",
|
||||||
"org",
|
"org",
|
||||||
"ポーランドのサーバーにアクセスするには \"Tetris Online Poland\" とGoogleで検索してください.\n地球儀のアイコンからテトリスオンライン研究サーバーの情報にアクセスできます。",
|
"ポーランドのサーバーにアクセスするには \"Tetris Online Poland\" とGoogleで検索してください。\n地球儀のアイコンからテトリスオンライン研究サーバーの情報にアクセスできます。",
|
||||||
"http://teatube.ltd/tos",
|
"http://teatube.ltd/tos",
|
||||||
},
|
},
|
||||||
{"サポート1",
|
{"サポート1",
|
||||||
"support wechat vx alipay zfb サポート",
|
"support wechat vx alipay zfb サポート 寄付 支援",
|
||||||
"org",
|
"org",
|
||||||
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.",
|
FNNS and "この機能はプラットフォームのポリシー制限が原因で使えません。うちらのDiscordサーバーでこの機能に関して話してください。" or "WechatやAlipayでTechminoに寄付する場合、コンソール内で「support」と打ってください。",
|
||||||
},
|
},
|
||||||
{"Support 2",
|
{"サポート2",
|
||||||
"support afdian",
|
"support afdian サポート 寄付 支援",
|
||||||
"org",
|
"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 "この機能はプラットフォームのポリシー制限が原因で使えません。うちらのDiscordサーバーでこの機能に関して話してください。ちなみに、ここにあるURLはリックくんです。" or "AifadianでTechminoに寄付する場合、 右下の地球儀のアイコンからURLを開いてください。注意としてAifadianは支払いの際に6%の手数料が取られます。",
|
||||||
FNNS and"https://youtu.be/dQw4w9WgXcQ"or"https://afdian.net/@MrZ_26",
|
FNNS and"https://youtu.be/dQw4w9WgXcQ"or"https://afdian.net/@MrZ_26",
|
||||||
},
|
},
|
||||||
{"Support 3",
|
{"サポート3",
|
||||||
"support p\97\116\114\101\111\110",
|
"support サポート 寄付 支援 p\97\116\114\101\111\110",
|
||||||
"org",
|
"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 "この機能はプラットフォームのポリシー制限が原因で使えません。うちらのDiscordサーバーでこの機能に関して話してください。ちなみに、ここにあるURLはリックくんです。" or "P\97\116\114\101\111\110でTechminoに寄付する場合、 右下の地球儀のアイコンからURLを開いてください。注意としてP\97\116\114\101\111\110は支払いの際に7.9%の手数料、さらに3ドル以上の支払いの際に0.30米ドル分の手数料が取られます。",
|
||||||
FNNS and"https://youtu.be/dQw4w9WgXcQ"or"https://www.p\97\116\114\101\111\110.com/techmino",
|
FNNS and"https://youtu.be/dQw4w9WgXcQ"or"https://www.p\97\116\114\101\111\110.com/techmino",
|
||||||
},
|
},
|
||||||
|
|
||||||
--Games
|
--Games
|
||||||
{"TTT",
|
{"テトリス トレーナー トレビアン (TTT)",
|
||||||
"tetris trainer tres bien",
|
"tetris trainer tres bien テトリス トレーナー トレビアン",
|
||||||
"game",
|
"game",
|
||||||
"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.",
|
"テトリス トレーナー トレビアン。現代テトリスの複雑な技を実践的に学ぶことができるサイトです。\n40ラインスプリントをホールド無しで全部テトリスでクリアできる人にオススメです。\nT-Spin、効率、SRS、対戦での地形戦略等の項目があります。\n日本語のサイトです。",
|
||||||
"http://taninkona.web.fc2.com/ttt/",
|
"http://taninkona.web.fc2.com/ttt/",
|
||||||
},
|
},
|
||||||
{"TTPC",
|
{"TTPC",
|
||||||
"tetris perfect clear challenge",
|
"tetris perfect clear challenge テトリス パーフェクトクリア パフェ チャレンジ",
|
||||||
"game",
|
"game",
|
||||||
"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.",
|
"テトリスパーフェクトクリアチャレンジ。SRSと7-Bagを採用した開幕パーフェクトクリアの学習用サイトです。\nテトリストレーナートレビアンをクリアした人達にオススメです。SRSと言う回転システムを知る必要があります。\n基本的な開幕パーフェクトクリアのテンプレしかありません。\n簡体字に翻訳されており、元の文章は日本語です。",
|
||||||
"http://teatube.ltd/ttpc",
|
"http://teatube.ltd/ttpc",
|
||||||
},
|
},
|
||||||
{"NAZO",
|
{"NAZO",
|
||||||
"nazo",
|
"nazo",
|
||||||
"game",
|
"game",
|
||||||
"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.",
|
"SRSに関して色々なパズルを備えています。テトリストレーナートレビアンをクリアした人達にオススメです。\nT-SpinやAll Spin等の問題を多様の難しさを備えています。\n簡体字に翻訳されており、元の文章は日本語です。",
|
||||||
"http://teatube.ltd/nazo",
|
"http://teatube.ltd/nazo",
|
||||||
},
|
},
|
||||||
|
|
||||||
{"Side Note 1",
|
{"補足1",
|
||||||
"note nb NB DM notice",
|
"note nb NB DM notice 補足 注意",
|
||||||
"game",
|
"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",
|
{"King of Stackers",
|
||||||
"kos kingofstackers",
|
"kos kingofstackers キングオブスタッカーズ",
|
||||||
"game",
|
"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.",
|
"ブラウザーゲーム | マルチプレイ | 携帯サポートあり\n通称: KoS。ターン制の対戦型テトリスゲームです。このゲームでは、プレイヤーは自身のターンの時に7つのミノを置くことができます、更にもしプレーヤがミノを一つ置いてラインをクリアできなかった場合、フィールドの中にお邪魔が入ってきます。 このゲームではかなりの思考力が求められます、更にそれぞれ別々の火力システムを採用したゲームモードが沢山あります。",
|
||||||
"https://kingofstackers.com/games.php",
|
"https://kingofstackers.com/games.php",
|
||||||
},
|
},
|
||||||
{"Tetr.js",
|
{"Tetr.js",
|
||||||
"tetrjs tetr.js",
|
"tetrjs tetr.js",
|
||||||
"game",
|
"game",
|
||||||
"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).",
|
"ブラウザーゲーム | シングルプレイ | 携帯サポートあり\nブラウザーベースのテトリスゲームです。様々な高度な設定やゲームモードを要しております、しかしビジュアル面では簡素でアニメーションも殆どありません。それとは別に、モバイルで利用できる画面の操作方法はそれ程多くありません。\nリンク先は他のバージョンを改造・Mod化した「Farter's Dig Mod」です。更に別のMod版「Tetr.js Enhanced」もあります。 (Tetris Wikiにてリンクがあります)。",
|
||||||
"http://farter.cn/t",
|
"http://farter.cn/t",
|
||||||
},
|
},
|
||||||
{"Tetra Legends",
|
{"Tetra Legends",
|
||||||
"tl tetralegends",
|
"tl tetralegends テトラレジェンズ",
|
||||||
"game",
|
"game",
|
||||||
"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.",
|
"ブラウザーゲーム | シングルプレイ | 携帯サポートなし\n省略として「TL」。沢山のシングルプレイ用のモード、2つの隠し要素のリズムゲーム、更に豪華なアニメーションと一緒に沢山の隠れ絡繰りなどが盛り込まれています。12月の2020年、沢山の不都合によりこのゲームの開発が頓挫しました。",
|
||||||
"https://tetralegends.app",
|
"https://tetralegends.app",
|
||||||
},
|
},
|
||||||
{"Ascension",
|
{"Ascension",
|
||||||
"asc ASC",
|
"asc ASC アスセンクション",
|
||||||
"game",
|
"game",
|
||||||
"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. ",
|
"ブラウザーゲーム | シングルプレイ/マルチプレイ\n省略として「ASC」。独自の回転システム (これの名前も「ASC」) を採用しており更には沢山のシングルプレイ用のモードを兼ね揃えています。12月15日2021年現在、バトルモードは現在の所、Beta開発中であります。Techminoにある「スタックモード」はこのゲームからアイデアを取っています。",
|
||||||
"https://asc.winternebs.com",
|
"https://asc.winternebs.com",
|
||||||
},
|
},
|
||||||
{"Jstris",
|
{"Jstris",
|
||||||
"js jstris",
|
"js jstris ジェストリス",
|
||||||
"game",
|
"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. ",
|
"ブラウザーゲーム | シングルプレイ/マルチプレイ | 携帯サポートあり\n省略として「Js」。いくつかの変数をいじれるシングルプレイ用のゲームモードがいくつかあり、モバイル用のバーチャルキーも設定できますが、アニメーションはありません。",
|
||||||
"https://jstris.jezevec10.com",
|
"https://jstris.jezevec10.com",
|
||||||
},
|
},
|
||||||
{"TETR.IO",
|
{"TETR.IO",
|
||||||
"io tetrio tetr.io",
|
"io tetrio tetr.io テトリオ",
|
||||||
"game",
|
"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.]",
|
"ブラウザーゲーム | シングルプレイ/マルチプレイ\n省略として「IO (イオ)」。 ランキングシステムを備えており、沢山の変数をいじれるカスタムゲームもあります。更にパフォーマンス上昇と広告を消すことができるデスクトップ用のクライアント (ソフトウェア) もあります。\n[どうやらSafariではこのゲームを開けないらしい。]",
|
||||||
"https://tetr.io",
|
"https://tetr.io",
|
||||||
},
|
},
|
||||||
{"Nuketris",
|
{"Nuketris",
|
||||||
"nuketris",
|
"nuketris ヌケトリス ヌークトリス",
|
||||||
"game",
|
"game",
|
||||||
"*Browser Game | Singleplayer/Multiplayer\nA block stacker game with 1V1 ranked matches and basic single-player modes.",
|
"ブラウザーゲーム | シングルプレイ/マルチプレイ\n1対1のランクマッチと基本的なシングルプレイモードがあるブロック積み上げゲームです。",
|
||||||
"https://nuketris.herokuapp.com",
|
"https://nuketris.herokuapp.com",
|
||||||
},
|
},
|
||||||
{"Worldwide Combos",
|
{"Worldwide Combos",
|
||||||
"wwc worldwidecombos",
|
"wwc worldwidecombos ワールドワイドコンボ 連",
|
||||||
"game",
|
"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.",
|
"ブラウザーゲーム | シングルプレイ/マルチプレイ\n省略として「WWC」。このゲームは1対1のランクマッチ、過去とのバトル(つまり相手が本当の人でなくてもできる)、沢山のルールセット、そしてハンディキャップされた爆弾お邪魔ラインなどがあります。",
|
||||||
"https://worldwidecombos.com",
|
"https://worldwidecombos.com",
|
||||||
},
|
},
|
||||||
{"Tetris Friends",
|
{"Tetris Friends",
|
||||||
"tf tetrisfriends notrisfoes",
|
"tf tetrisfriends notrisfoes テトリスフレンズ ノートリスフォーズ",
|
||||||
"game",
|
"game",
|
||||||
"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.",
|
"ブラウザーゲーム | シングルプレイ/マルチプレイ\n省略として「TF」、営業停止した公式テトリスゲームです。元々このゲーム自体は有名でしたが、ウェブサイトの閉鎖と共に遊べなくなりました。しかし、非公式のプライベートサーバー、通称: \"Notris Foes\"、が未だに存在しており、これを遊ぶにはデスクトップのクライアントをダウンロードする必要があります。",
|
||||||
},
|
},
|
||||||
{"tetris.com",
|
{"tetris.com",
|
||||||
"tetris online official",
|
"tetris online official テトリス オンライン 公式 こうしき コウシキ",
|
||||||
"game",
|
"game",
|
||||||
"Browser Game | Singleplayer\nThe Tetris game on tetris.com. It only has one mode — marathon, and you can control the game with your mouse.",
|
"ブラウザーゲーム | シングルプレイ\ntetris.comにあるテトリスゲーム。「マラソン」しかモードがなく、マウスでコントロールできるのが特徴。",
|
||||||
},
|
},
|
||||||
{"Tetris Gems",
|
{"Tetris Gems",
|
||||||
"tetris online official gem",
|
"tetris online official gem テトリス オンライン 公式 こうしき コウシキ ジェム",
|
||||||
"game",
|
"game",
|
||||||
"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.",
|
"ブラウザーゲーム | シングルプレイ\ntetris.comにあるテトリスゲーム。重力システムがあり、それぞれのゲームは1分あります。3種類のジェムブロックがあり、それぞれ別の機能があります。",
|
||||||
},
|
},
|
||||||
{"Tetris Mind Bender",
|
{"Tetris Mind Bender",
|
||||||
"tetris online official gem",
|
"tetris online official gem テトリス オンライン 公式 こうしき コウシキ ジェム",
|
||||||
"game",
|
"game",
|
||||||
"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.",
|
"ブラウザーゲーム | シングルプレイ\ntetris.comにあるテトリスゲーム. \"Mind Bender\"(マインドベンダー)ミノという機能がマラソンモードを中心にあり。マインドベンダーミノでラインクリアすると良い・悪いのどちらかの効果が発揮します。",
|
||||||
},
|
},
|
||||||
|
|
||||||
{"Techmino",
|
{"Techmino",
|
||||||
"techmino",
|
"techmino テックミノ",
|
||||||
"game",
|
"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.",
|
"クロスプラットフォーム | シングルプレイ/マルチプレイ\n通称「テック」。LÖVEという開発ソフトでできたブロック積み上げゲーム。沢山の変数変更可能なシングルプレイモードがたくさんあり、オンライン機能も徐々に開発されています。",
|
||||||
},
|
},
|
||||||
{"Falling Lightblocks",
|
{"Falling Lightblocks",
|
||||||
"fl fallinglightblocks",
|
"fl fallinglightblocks フォーリング ライトブロックス",
|
||||||
"game",
|
"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.",
|
"ブラウザーゲーム/iOS/アンドロイド | シングルプレイ/マルチプレイ\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/",
|
"https://golfgl.de/lightblocks/",
|
||||||
},
|
},
|
||||||
{"Cambridge",
|
{"Cambridge",
|
||||||
@@ -785,6 +785,11 @@ return{
|
|||||||
"term",
|
"term",
|
||||||
"Soft Drop Factor\n\nA way to define soft drop speed as a multiple of natural falling speed. In guideline games, the soft drop is usually 20x the speed of natural falling, i.e. it has an SDF of 20. Techmino does not use SDF to define soft drop speed.",
|
"Soft Drop Factor\n\nA way to define soft drop speed as a multiple of natural falling speed. In guideline games, the soft drop is usually 20x the speed of natural falling, i.e. it has an SDF of 20. Techmino does not use SDF to define soft drop speed.",
|
||||||
},
|
},
|
||||||
|
{"Shape & Names",
|
||||||
|
"mino",
|
||||||
|
"term",
|
||||||
|
"Z"..CHAR.mino.Z.." S"..CHAR.mino.S.." J"..CHAR.mino.J.." L"..CHAR.mino.L.." T"..CHAR.mino.T.." O"..CHAR.mino.O.." I"..CHAR.mino.I.." Z5"..CHAR.mino.Z5.." S5"..CHAR.mino.S5.." P"..CHAR.mino.P.." Q"..CHAR.mino.Q.." F"..CHAR.mino.F.." E"..CHAR.mino.E.." T5"..CHAR.mino.T5.." U"..CHAR.mino.U.." V"..CHAR.mino.V.." W"..CHAR.mino.W.." X"..CHAR.mino.X.." J5"..CHAR.mino.J5.." L5"..CHAR.mino.L5.." R"..CHAR.mino.R.." Y"..CHAR.mino.Y.." N"..CHAR.mino.N.." H"..CHAR.mino.H.." I5"..CHAR.mino.I5.." I3"..CHAR.mino.I3.." C"..CHAR.mino.C.." I2"..CHAR.mino.I2.." O1"..CHAR.mino.O1,
|
||||||
|
},
|
||||||
{"Bag7 generator",
|
{"Bag7 generator",
|
||||||
"bag7bag randomgenerator",
|
"bag7bag randomgenerator",
|
||||||
"term",
|
"term",
|
||||||
@@ -890,6 +895,12 @@ return{
|
|||||||
"term",
|
"term",
|
||||||
"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.",
|
"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.",
|
||||||
},
|
},
|
||||||
|
{"Secret Grade",
|
||||||
|
"larger than",
|
||||||
|
"term",
|
||||||
|
"",
|
||||||
|
HDsearch.."Secret_Grade_Techniques",
|
||||||
|
},
|
||||||
{"Cold Clear",
|
{"Cold Clear",
|
||||||
"cc coldclear ai bot",
|
"cc coldclear ai bot",
|
||||||
"term",
|
"term",
|
||||||
@@ -1129,7 +1140,7 @@ return{
|
|||||||
{"Amemiya Taiyou",
|
{"Amemiya Taiyou",
|
||||||
"amemiya taiyou",
|
"amemiya taiyou",
|
||||||
"name",
|
"name",
|
||||||
"(あめみや たいよう)\n\nOne of the top players.\nWon champion on a game in Puyo Puyo Tetris's Swap mode.",
|
"(あめみや たいよう)\n\nOne of the top players.\nWon champion on a game in Puyo Puyo Tetris's Swap mode.",
|
||||||
},
|
},
|
||||||
{"Ajanba",
|
{"Ajanba",
|
||||||
"ajb",
|
"ajb",
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ return{
|
|||||||
sureReset="Press again to reset",
|
sureReset="Press again to reset",
|
||||||
sureDelete="Press again to delete",
|
sureDelete="Press again to delete",
|
||||||
newDay="A new day, a new beginning!",
|
newDay="A new day, a new beginning!",
|
||||||
playedLong="You have been playing for a long time. Time to a break!",
|
playedLong="You have been playing for a long time. Time to take a break!",
|
||||||
playedTooMuch="You have been playing for far too long! Techmino is fun, but remember to take some rests!",
|
playedTooMuch="You have been playing for far too long! Techmino is fun, but remember to take some rests!",
|
||||||
settingWarn="Careful - you're about to change some uncommon settings!",
|
settingWarn="Careful — you’re about to change some uncommon settings!",
|
||||||
|
|
||||||
atkModeName={"Random","Badges","K.O.s","Attackers"},
|
atkModeName={"Random","Badges","K.O.s","Attackers"},
|
||||||
royale_remain="$1 Players Left",
|
royale_remain="$1 Players Left",
|
||||||
@@ -59,7 +59,7 @@ return{
|
|||||||
finesse_ap="All Perfect",
|
finesse_ap="All Perfect",
|
||||||
finesse_fc="Full Combo",
|
finesse_fc="Full Combo",
|
||||||
|
|
||||||
page="Page:",
|
page="Page ",
|
||||||
|
|
||||||
cc_fixed="CC is incompatible with fixed sequences.",
|
cc_fixed="CC is incompatible with fixed sequences.",
|
||||||
cc_swap="CC is incompatible when the hold mode is set to Swap.",
|
cc_swap="CC is incompatible when the hold mode is set to Swap.",
|
||||||
@@ -114,7 +114,7 @@ return{
|
|||||||
noUsername="Please enter your username",
|
noUsername="Please enter your username",
|
||||||
wrongEmail="Invalid email address",
|
wrongEmail="Invalid email address",
|
||||||
noPassword="Please enter your password",
|
noPassword="Please enter your password",
|
||||||
diffPassword="Passwords don't match",
|
diffPassword="Passwords don’t match",
|
||||||
registerRequestSent="A sign up request has been sent.",
|
registerRequestSent="A sign up request has been sent.",
|
||||||
registerOK="Sign up successful!",
|
registerOK="Sign up successful!",
|
||||||
loginOK="You are now logged in!",
|
loginOK="You are now logged in!",
|
||||||
@@ -182,7 +182,7 @@ return{
|
|||||||
"Finesse:",
|
"Finesse:",
|
||||||
},
|
},
|
||||||
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
|
radar={"DEF","OFF","ATK","SEND","SPD","DIG"},
|
||||||
radarData={"D'PM","ADPM","APM","SPM","L'PM","DPM"},
|
radarData={"D’PM","ADPM","APM","SPM","L’PM","DPM"},
|
||||||
stat={
|
stat={
|
||||||
"Times Launched:",
|
"Times Launched:",
|
||||||
"Play Count:",
|
"Play Count:",
|
||||||
@@ -197,13 +197,13 @@ return{
|
|||||||
"Fns. Errs/Rate:",
|
"Fns. Errs/Rate:",
|
||||||
},
|
},
|
||||||
aboutTexts={
|
aboutTexts={
|
||||||
"This is just an *ordinary* block stacker. Really, that's it.",
|
"This is just an *ordinary* block stacker. Really, that’s it.",
|
||||||
"Inspired by C2/IO/JS/WWC/KOS etc.",
|
"Inspired by C2/IO/JS/WWC/KOS etc.",
|
||||||
"",
|
"",
|
||||||
"Powered by LÖVE",
|
"Powered by LÖVE",
|
||||||
"Any suggestions or bug reports are appreciated!",
|
"Any suggestions or bug reports are appreciated!",
|
||||||
"Make sure to get the game only from official sources,",
|
"Make sure to get the game only from official sources,",
|
||||||
"as we can't make sure you're safe if you got it elsewhere.",
|
"as we can’t make sure you’re safe if you got it elsewhere.",
|
||||||
"The author is not responsible for any modifications.",
|
"The author is not responsible for any modifications.",
|
||||||
FNNS and"/"or"While the game is free, donations are appreciated.",
|
FNNS and"/"or"While the game is free, donations are appreciated.",
|
||||||
FNNS and"/"or"Check Zictionary for more",
|
FNNS and"/"or"Check Zictionary for more",
|
||||||
@@ -249,6 +249,12 @@ return{
|
|||||||
"(旋律星萤)",
|
"(旋律星萤)",
|
||||||
"(T0722)",
|
"(T0722)",
|
||||||
"",
|
"",
|
||||||
|
"Illustrations",
|
||||||
|
"Miya",
|
||||||
|
"Mono",
|
||||||
|
"Xiaoya",
|
||||||
|
"葉枭",
|
||||||
|
"",
|
||||||
"Musical Designs",
|
"Musical Designs",
|
||||||
"MrZ",
|
"MrZ",
|
||||||
"柒栎流星",
|
"柒栎流星",
|
||||||
@@ -315,7 +321,6 @@ return{
|
|||||||
Cold_Clear [MinusKelvin]
|
Cold_Clear [MinusKelvin]
|
||||||
json.lua [rxi]
|
json.lua [rxi]
|
||||||
profile.lua [itraykov]
|
profile.lua [itraykov]
|
||||||
simple-love-lights [dylhunn]
|
|
||||||
]],
|
]],
|
||||||
support="Support the author",
|
support="Support the author",
|
||||||
WidgetText={
|
WidgetText={
|
||||||
@@ -370,7 +375,7 @@ return{
|
|||||||
},
|
},
|
||||||
net_newRoom={
|
net_newRoom={
|
||||||
title="Room Config",
|
title="Room Config",
|
||||||
roomName="Room name (Default: \"[username]'s room\")",
|
roomName="Room name (Default: “[username]'s room”)",
|
||||||
password="Password",
|
password="Password",
|
||||||
description="Room Description",
|
description="Room Description",
|
||||||
|
|
||||||
@@ -459,7 +464,6 @@ return{
|
|||||||
atkFX="Atk FX",
|
atkFX="Atk FX",
|
||||||
|
|
||||||
frame="Render Frame Rate (%)",
|
frame="Render Frame Rate (%)",
|
||||||
FTlock="Frame skip",
|
|
||||||
|
|
||||||
text="Line Clear Pop-Ups",
|
text="Line Clear Pop-Ups",
|
||||||
score="Score Pop-Ups",
|
score="Score Pop-Ups",
|
||||||
@@ -630,7 +634,7 @@ return{
|
|||||||
push="Add Line (K)",
|
push="Add Line (K)",
|
||||||
del="Del Line (L)",
|
del="Del Line (L)",
|
||||||
|
|
||||||
demo="Don't Show ×",
|
demo="Don’t Show “×”",
|
||||||
|
|
||||||
newPg="New Page (N)",
|
newPg="New Page (N)",
|
||||||
delPg="Del Page (M)",
|
delPg="Del Page (M)",
|
||||||
@@ -688,6 +692,7 @@ return{
|
|||||||
register="Sign Up",
|
register="Sign Up",
|
||||||
email="Email Address",
|
email="Email Address",
|
||||||
password="Password",
|
password="Password",
|
||||||
|
showEmail="Show Email",
|
||||||
keepPW="Remember me",
|
keepPW="Remember me",
|
||||||
login="Log In",
|
login="Log In",
|
||||||
},
|
},
|
||||||
@@ -756,112 +761,122 @@ return{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
modes={
|
modes={
|
||||||
['sprint_10l']= {"Sprint", "10L", "Clear 10 lines!"},
|
['sprint_10l']= {"Sprint", "10L", "Clear 10 lines!"},
|
||||||
['sprint_20l']= {"Sprint", "20L", "Clear 20 lines!"},
|
['sprint_20l']= {"Sprint", "20L", "Clear 20 lines!"},
|
||||||
['sprint_40l']= {"Sprint", "40L", "Clear 40 lines!"},
|
['sprint_40l']= {"Sprint", "40L", "Clear 40 lines!"},
|
||||||
['sprint_100l']= {"Sprint", "100L", "Clear 100 lines!"},
|
['sprint_100l']= {"Sprint", "100L", "Clear 100 lines!"},
|
||||||
['sprint_400l']= {"Sprint", "400L", "Clear 400 lines!"},
|
['sprint_400l']= {"Sprint", "400L", "Clear 400 lines!"},
|
||||||
['sprint_1000l']= {"Sprint", "1,000L", "Clear 1,000 lines!"},
|
['sprint_1000l']= {"Sprint", "1,000L", "Clear 1,000 lines!"},
|
||||||
['sprintPenta']= {"Sprint", "PENTOMINO", "40L with 18 pentominoes"},
|
['sprintPenta']= {"Sprint", "PENTOMINO", "40L with 18 pentominoes"},
|
||||||
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
|
['sprintMPH']= {"Sprint", "MPH", "Memoryless\nPreviewless\nHoldless"},
|
||||||
['dig_10l']= {"Dig", "10L", "Dig 10 garbage lines"},
|
['sprint123']= {"Sprint", "M123", "40L with only monominoes, dominoes, and triminoes"},
|
||||||
['dig_40l']= {"Dig", "40L", "Dig 40 garbage lines"},
|
['secret_grade']= {"Secret Grade", "", "Build a zig-zag hole formation, following to the guide!"},
|
||||||
['dig_100l']= {"Dig", "100L", "Dig 100 garbage lines"},
|
['dig_10l']= {"Dig", "10L", "Dig 10 garbage lines as fast as you can!"},
|
||||||
['dig_400l']= {"Dig", "400L", "Dig 400 garbage lines"},
|
['dig_40l']= {"Dig", "40L", "Dig 40 garbage lines as fast as you can!"},
|
||||||
['drought_n']= {"Drought", "100L", "No I-pieces available"},
|
['dig_100l']= {"Dig", "100L", "Dig 100 garbage lines as fast as you can!"},
|
||||||
['drought_l']= {"Drought+", "100L", "W T F"},
|
['dig_400l']= {"Dig", "400L", "Dig 400 garbage lines as fast as you can!"},
|
||||||
['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with increasing speed"},
|
['dig_eff_10l']= {"Dig", "EFFICIENCY 10L", "Dig 10 garbage lines with the least pieces!"},
|
||||||
['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon"},
|
['dig_eff_40l']= {"Dig", "EFFICIENCY 40L", "Dig 40 garbage lines with the least pieces!"},
|
||||||
['solo_e']= {"Battle", "EASY", "Defeat the AI!"},
|
['dig_eff_100l']= {"Dig", "EFFICIENCY 100L","Dig 100 garbage lines with the least pieces!"},
|
||||||
['solo_n']= {"Battle", "NORMAL", "Defeat the AI!"},
|
['dig_eff_400l']= {"Dig", "EFFICIENCY 400L","Dig 400 garbage lines with the least pieces!"},
|
||||||
['solo_h']= {"Battle", "HARD", "Defeat the AI!"},
|
['drought_n']= {"Drought", "100L", "No I-pieces available"},
|
||||||
['solo_l']= {"Battle", "LUNATIC", "Defeat the AI!"},
|
['drought_l']= {"Drought+", "100L", "W T F"},
|
||||||
['solo_u']= {"Battle", "ULTIMATE", "Defeat the AI!"},
|
['marathon_n']= {"Marathon", "NORMAL", "200-line marathon with increasing speed"},
|
||||||
['techmino49_e']= {"Tech 49", "EASY", "49-player battle.\nThe last one standing wins"},
|
['marathon_h']= {"Marathon", "HARD", "200-line high-speed marathon"},
|
||||||
['techmino49_h']= {"Tech 49", "HARD", "49-player battle.\nThe last one standing wins"},
|
['solo_e']= {"Battle", "EASY", "Defeat the AI!"},
|
||||||
['techmino49_u']= {"Tech 49", "ULTIMATE", "49-player battle.\nThe last one standing wins"},
|
['solo_n']= {"Battle", "NORMAL", "Defeat the AI!"},
|
||||||
['techmino99_e']= {"Tech 99", "EASY", "99-player battle.\nThe last one standing wins"},
|
['solo_h']= {"Battle", "HARD", "Defeat the AI!"},
|
||||||
['techmino99_h']= {"Tech 99", "HARD", "99-player battle.\nThe last one standing wins"},
|
['solo_l']= {"Battle", "LUNATIC", "Defeat the AI!"},
|
||||||
['techmino99_u']= {"Tech 99", "ULTIMATE", "99-player battle.\nThe last one standing wins"},
|
['solo_u']= {"Battle", "ULTIMATE", "Defeat the AI!"},
|
||||||
['round_e']= {"Turn-Based", "EASY", "Take turns to play against the AI!"},
|
['techmino49_e']= {"Tech 49", "EASY", "49-player battle.\nThe last one standing wins"},
|
||||||
['round_n']= {"Turn-Based", "NORMAL", "Take turns to play against the AI!"},
|
['techmino49_h']= {"Tech 49", "HARD", "49-player battle.\nThe last one standing wins"},
|
||||||
['round_h']= {"Turn-Based", "HARD", "Take turns to play against the AI!"},
|
['techmino49_u']= {"Tech 49", "ULTIMATE", "49-player battle.\nThe last one standing wins"},
|
||||||
['round_l']= {"Turn-Based", "LUNATIC", "Take turns to play against the AI!"},
|
['techmino99_e']= {"Tech 99", "EASY", "99-player battle.\nThe last one standing wins"},
|
||||||
['round_u']= {"Turn-Based", "ULTIMATE", "Take turns to play against the AI!"},
|
['techmino99_h']= {"Tech 99", "HARD", "99-player battle.\nThe last one standing wins"},
|
||||||
['master_n']= {"Master", "NORMAL", "For 20G beginners"},
|
['techmino99_u']= {"Tech 99", "ULTIMATE", "99-player battle.\nThe last one standing wins"},
|
||||||
['master_h']= {"Master", "HARD", "For 20G pros"},
|
['round_e']= {"Turn-Based", "EASY", "Take turns to play against the AI!"},
|
||||||
['master_m']= {"Master", "M21", "For 20G Masters"},
|
['round_n']= {"Turn-Based", "NORMAL", "Take turns to play against the AI!"},
|
||||||
['master_final']= {"Master", "FINAL", "20G and beyond"},
|
['round_h']= {"Turn-Based", "HARD", "Take turns to play against the AI!"},
|
||||||
['master_ph']= {"Master", "PHANTASM", "???"},
|
['round_l']= {"Turn-Based", "LUNATIC", "Take turns to play against the AI!"},
|
||||||
['master_ex']= {"GrandMaster", "EXTRA", "An eternity shorter than an instant"},
|
['round_u']= {"Turn-Based", "ULTIMATE", "Take turns to play against the AI!"},
|
||||||
['master_instinct']={"Master", "INSTINCT", "What if the active piece turned invisible?"},
|
['big_n']= {"Big", "NORMAL", "Play in a smaller field!"},
|
||||||
['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
['big_h']= {"Big", "HARD", "Play in a smaller field!"},
|
||||||
['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
['master_n']= {"Master", "NORMAL", "For 20G beginners"},
|
||||||
['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
['master_h']= {"Master", "HARD", "For 20G pros"},
|
||||||
['strategy_e_plus']={"Strategy", "EASY+", "Fast 20G decision"},
|
['master_m']= {"Master", "M21", "For 20G Masters"},
|
||||||
['strategy_h_plus']={"Strategy", "HARD+", "Fast 20G decision"},
|
['master_final']= {"Master", "FINAL", "20G and beyond"},
|
||||||
['strategy_u_plus']={"Strategy", "ULTIMATE+", "Fast 20G decision"},
|
['master_ph']= {"Master", "PHANTASM", "???"},
|
||||||
['blind_e']= {"Invisible", "HALF", "For novices"},
|
['master_g']= {"Master", "GRADED", "Get the highest grade you can!"},
|
||||||
['blind_n']= {"Invisible", "ALL", "For intermediates"},
|
['master_ex']= {"GrandMaster", "EXTRA", "An eternity shorter than an instant"},
|
||||||
['blind_h']= {"Invisible", "SUDDEN", "For the experienced"},
|
['master_instinct']={"Master", "INSTINCT", "What if the active piece turned invisible?"},
|
||||||
['blind_l']= {"Invisible", "SUDDEN+", "For professionals"},
|
['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"},
|
||||||
['blind_u']= {"Invisible", "?", "Are you ready?"},
|
['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"},
|
||||||
['blind_wtf']= {"Invisible", "WTF", "You're not ready"},
|
['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"},
|
||||||
['classic_e']= {"Classic", "EASY", "A very low-speed recreation from the 80s"},
|
['strategy_e_plus']={"Strategy", "EASY+", "Holdless strategy!"},
|
||||||
['classic_h']= {"Classic", "HARD", "A medium speed recreation from the 80s"},
|
['strategy_h_plus']={"Strategy", "HARD+", "Holdless strategy!"},
|
||||||
['classic_u']= {"Classic", "ULTIMATE", "A very high-speed recreation from the 80s"},
|
['strategy_u_plus']={"Strategy", "ULTIMATE+", "Holdless strategy!"},
|
||||||
['survivor_e']= {"Survival", "EASY", "How long can you survive?"},
|
['blind_e']= {"Invisible", "HALF", "For novices"},
|
||||||
['survivor_n']= {"Survival", "NORMAL", "How long can you survive?"},
|
['blind_n']= {"Invisible", "ALL", "For intermediates"},
|
||||||
['survivor_h']= {"Survival", "HARD", "How long can you survive?"},
|
['blind_h']= {"Invisible", "SUDDEN", "For the experienced"},
|
||||||
['survivor_l']= {"Survival", "LUNATIC", "How long can you survive?"},
|
['blind_l']= {"Invisible", "SUDDEN+", "For professionals"},
|
||||||
['survivor_u']= {"Survival", "ULTIMATE", "How long can you survive?"},
|
['blind_u']= {"Invisible", "?", "Are you ready?"},
|
||||||
['attacker_h']= {"Attacker", "HARD", "Practice your attacking skills!"},
|
['blind_wtf']= {"Invisible", "WTF", "You’re not ready"},
|
||||||
['attacker_u']= {"Attacker", "ULTIMATE", "Practice your attacking skills!"},
|
['classic_e']= {"Classic", "EASY", "A low-speed recreation from the 80s"},
|
||||||
['defender_n']= {"Defender", "NORMAL", "Practice your defencing skills!"},
|
['classic_h']= {"Classic", "HARD", "A medium-speed recreation from the 80s"},
|
||||||
['defender_l']= {"Defender", "LUNATIC", "Practice your defencing skills!"},
|
['classic_l']= {"Classic", "LUNATIC", "A high-speed recreation from the 80s"},
|
||||||
['dig_h']= {"Driller", "HARD", "Digging practice!"},
|
['classic_u']= {"Classic", "ULTIMATE", "A very high-speed recreation from the 80s"},
|
||||||
['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"},
|
['survivor_e']= {"Survival", "EASY", "How long can you survive?"},
|
||||||
['clearRush']= {"Clear Rush", "NORMAL", "All-spin tutorial!\n[Under construction]"},
|
['survivor_n']= {"Survival", "NORMAL", "How long can you survive?"},
|
||||||
['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos"},
|
['survivor_h']= {"Survival", "HARD", "How long can you survive?"},
|
||||||
['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos"},
|
['survivor_l']= {"Survival", "LUNATIC", "How long can you survive?"},
|
||||||
['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear practice"},
|
['survivor_u']= {"Survival", "ULTIMATE", "How long can you survive?"},
|
||||||
['pctrain_l']= {"PC Training", "LUNATIC", "A harder Perfect Clear practice"},
|
['attacker_h']= {"Attacker", "HARD", "Practice your attacking skills!"},
|
||||||
['pc_n']= {"PC Challenge", "NORMAL", "Get PCs within 100 lines!"},
|
['attacker_u']= {"Attacker", "ULTIMATE", "Practice your attacking skills!"},
|
||||||
['pc_h']= {"PC Challenge", "HARD", "Get PCs within 100 lines!"},
|
['defender_n']= {"Defender", "NORMAL", "Practice your defensing skills!"},
|
||||||
['pc_l']= {"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"},
|
['defender_l']= {"Defender", "LUNATIC", "Practice your defensing skills!"},
|
||||||
['pc_inf']= {"Inf. PC Challenge", "", "Get PCs as much as you can"},
|
['dig_h']= {"Driller", "HARD", "Digging practice!"},
|
||||||
['tech_n']= {"Tech", "NORMAL", "Try to keep the\nBack-to-Back chain!"},
|
['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"},
|
||||||
['tech_n_plus']= {"Tech", "NORMAL+", "Spins & PCs only"},
|
['clearRush']= {"Clear Rush", "NORMAL", "All-spin tutorial!\n[Under construction]"},
|
||||||
['tech_h']= {"Tech", "HARD", "Try to keep the\nBack-to-Back chain!"},
|
['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos"},
|
||||||
['tech_h_plus']= {"Tech", "HARD+", "Spins & PCs only"},
|
['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos"},
|
||||||
['tech_l']= {"Tech", "LUNATIC", "Try to keep the\nBack-to-Back chain!"},
|
['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear practice"},
|
||||||
['tech_l_plus']= {"Tech", "LUNATIC+", "Spins & PCs only"},
|
['pctrain_l']= {"PC Training", "LUNATIC", "A harder Perfect Clear practice"},
|
||||||
['tech_finesse']= {"Tech", "FINESSE", "No finesse faults!"},
|
['pc_n']= {"PC Challenge", "NORMAL", "Get PCs within 100 lines!"},
|
||||||
['tech_finesse_f']= {"Tech", "FINESSE+", "No normal clears and finesse faults!"},
|
['pc_h']= {"PC Challenge", "HARD", "Get PCs within 100 lines!"},
|
||||||
['tsd_e']= {"TSD Challenge", "EASY", "T-Spin Doubles only!"},
|
['pc_l']= {"PC Challenge", "LUNATIC", "Get PCs within 100 lines!"},
|
||||||
['tsd_h']= {"TSD Challenge", "HARD", "T-Spin Doubles only!"},
|
['pc_inf']= {"Inf. PC Challenge", "", "Get PCs as much as you can"},
|
||||||
['tsd_u']= {"TSD Challenge", "ULTIMATE", "T-Spin Doubles only!"},
|
['tech_n']= {"Tech", "NORMAL", "Try to keep the\nBack-to-Back chain!"},
|
||||||
['backfire_n']= {"Backfire", "NORMAL", "Hold back the backfiring garbage lines"},
|
['tech_n_plus']= {"Tech", "NORMAL+", "Spins & PCs only"},
|
||||||
['backfire_h']= {"Backfire", "HARD", "Hold back the backfiring garbage lines"},
|
['tech_h']= {"Tech", "HARD", "Try to keep the\nBack-to-Back chain!"},
|
||||||
['backfire_l']= {"Backfire", "LUNATIC", "Hold back the backfiring garbage lines"},
|
['tech_h_plus']= {"Tech", "HARD+", "Spins & PCs only"},
|
||||||
['backfire_u']= {"Backfire", "ULTIMATE", "Hold back the backfiring garbage lines"},
|
['tech_l']= {"Tech", "LUNATIC", "Try to keep the\nBack-to-Back chain!"},
|
||||||
['sprintAtk']= {"Sprint", "100 Attack", "Send 100 lines!"},
|
['tech_l_plus']= {"Tech", "LUNATIC+", "Spins & PCs only"},
|
||||||
['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40lines!"},
|
['tech_finesse']= {"Tech", "FINESSE", "No finesse faults!"},
|
||||||
['zen']= {'Zen', "200", "A 200-line run without a time limit"},
|
['tech_finesse_f']= {"Tech", "FINESSE+", "No normal clears and finesse faults!"},
|
||||||
['ultra']= {'Ultra', "EXTRA", "A 2-minute score attack"},
|
['tsd_e']= {"TSD Challenge", "EASY", "T-Spin Doubles only!"},
|
||||||
['infinite']= {"Infinite", "", "Just a sandbox"},
|
['tsd_h']= {"TSD Challenge", "HARD", "T-Spin Doubles only!"},
|
||||||
['infinite_dig']= {"Infinite: Dig", "", "Dig-diggin'-dug"},
|
['tsd_u']= {"TSD Challenge", "ULTIMATE", "T-Spin Doubles only!"},
|
||||||
['marathon_inf']= {"Marathon", "INFINITE", "Infinite marathon."},
|
['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_clear']= {"Custom", "NORMAL"},
|
||||||
['custom_puzzle']= {"Custom", "PUZZLE"},
|
['custom_puzzle']= {"Custom", "PUZZLE"},
|
||||||
},
|
},
|
||||||
getTip={refuseCopy=true,
|
getTip={refuseCopy=true,
|
||||||
":pog:",
|
":pog:",
|
||||||
"(RUR'U')R'FR2U'R'U'(RUR'F')",
|
"(RUR’U’)R’FR2U’R’U’(RUR’F’)",
|
||||||
"\"Techmino.app\" cannot be opened because the developer cannot be verified.",
|
"“Techmino.app” cannot be opened because the developer cannot be verified.",
|
||||||
"\"Techmino.app\" will damage your computer. You should move it to the Bin.",
|
"“Techmino.app” will damage your computer. You should move it to the Bin.",
|
||||||
"\"TechminOS\"",
|
"“TechminOS”",
|
||||||
"\\jezevec/\\jezevec/\\jezevec/",
|
"\\jezevec/\\jezevec/\\jezevec/",
|
||||||
"\\osk/\\osk/\\osk/",
|
"\\osk/\\osk/\\osk/",
|
||||||
"↑↑↓↓←→←→BA",
|
"↑↑↓↓←→←→BA",
|
||||||
@@ -884,22 +899,22 @@ return{
|
|||||||
"Bridge clear coming soon!",
|
"Bridge clear coming soon!",
|
||||||
"Can you master this modern yet familiar stacker?",
|
"Can you master this modern yet familiar stacker?",
|
||||||
"Certainly within this heart lies my M@STERPIECE.",
|
"Certainly within this heart lies my M@STERPIECE.",
|
||||||
"Change logs in English can be found on Discord.",
|
"Changelogs in English can be found on Discord.",
|
||||||
"Color clear coming soon!",
|
"Color clear coming soon!",
|
||||||
"Decreasing DAS and ARR makes your game faster but harder to control.",
|
"Decreasing DAS and ARR makes your game faster but harder to control.",
|
||||||
"Did I just see a Back-to-Back-to-Back?",
|
"Did I just see a Back-to-Back-to-Back?",
|
||||||
"Does B2B2B2B exist?",
|
"Does B2B2B2B exist?",
|
||||||
"Don't let a small glitch ruin your entire day!",
|
"Don’t let a small glitch ruin your entire day!",
|
||||||
"Don't look directly at the bugs!",
|
"Don’t look directly at the bugs!",
|
||||||
"Enjoy the Techmino rotation system!",
|
"Enjoy the Techmino rotation system!",
|
||||||
"Excellent, but let's go better next time…",
|
"Excellent, but let’s go better next time…",
|
||||||
"Find out what's in the settings!",
|
"Find out what’s in the settings!",
|
||||||
"Found any bugs? Open up an issue in our GitHub page!",
|
"Found any bugs? Open up an issue in our GitHub page!",
|
||||||
"Free-to-play block stacking game with a Battle Royale mode!",
|
"Free-to-play block stacking game with a Battle Royale mode!",
|
||||||
"git commit",
|
"git commit",
|
||||||
"git push -f",
|
"git push -f",
|
||||||
"Got any suggestions? Post them in our Discord!",
|
"Got any suggestions? Post them in our Discord!",
|
||||||
"Have you noticed what \"rotating\" does do to a block?",
|
"Have you noticed what “rotating” does do to a block?",
|
||||||
"Headphones recommended for a better experience.",
|
"Headphones recommended for a better experience.",
|
||||||
"Hello world!",
|
"Hello world!",
|
||||||
"I3 and L3 are the only two unique triminoes.",
|
"I3 and L3 are the only two unique triminoes.",
|
||||||
@@ -908,8 +923,8 @@ return{
|
|||||||
"Initial [insert action] system can save you.",
|
"Initial [insert action] system can save you.",
|
||||||
"Is B2B2B2B possible?",
|
"Is B2B2B2B possible?",
|
||||||
"It is loading! Not just a cutscene!",
|
"It is loading! Not just a cutscene!",
|
||||||
"It's possible to finish 40L without left/right buttons.",
|
"It’s possible to finish 40L without left/right buttons.",
|
||||||
"It's possible to finish 40L without rotation buttons.",
|
"It’s possible to finish 40L without rotation buttons.",
|
||||||
"Join our Discord!",
|
"Join our Discord!",
|
||||||
"l-=-1",
|
"l-=-1",
|
||||||
"Let the bass kick!",
|
"Let the bass kick!",
|
||||||
@@ -929,12 +944,12 @@ return{
|
|||||||
"pps-0.01",
|
"pps-0.01",
|
||||||
"Server down randomly",
|
"Server down randomly",
|
||||||
"Some requirements to achieve rank X are intentionally set to be difficult for even the best players.",
|
"Some requirements to achieve rank X are intentionally set to be difficult for even the best players.",
|
||||||
"Soon you'll be able to play against friends and foes all over the world.",
|
"Soon, you’ll be able to play against friends and foes all over the world.",
|
||||||
"Split clear coming soon!",
|
"Split clear coming soon!",
|
||||||
"sudo rm -rf /*",
|
"sudo rm -rf /*",
|
||||||
"Techmino is a portmanteau of \"technique\" and \"tetromino\".",
|
"Techmino is a portmanteau of “technique” and “tetromino”.",
|
||||||
"Techmino is so fun!",
|
"Techmino is so fun!",
|
||||||
"Techmino on Nspire-CX: yes it exists, no it's not the same game.",
|
"Techmino on Nspire-CX: yes it exists, no it’s not the same game.",
|
||||||
"TetroDictionary is now available in English.",
|
"TetroDictionary is now available in English.",
|
||||||
"Most of the music tracks in this game are made using Beepbox.",
|
"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.",
|
"The names that appeared in the background of the Staff page is a list of our sponsors.",
|
||||||
@@ -967,7 +982,7 @@ return{
|
|||||||
{C.C,"Also try osu!"},
|
{C.C,"Also try osu!"},
|
||||||
{C.C,"Also try Phigros!"},
|
{C.C,"Also try Phigros!"},
|
||||||
{C.C,"Also try Puyo Puyo!"},
|
{C.C,"Also try Puyo Puyo!"},
|
||||||
{C.C,"Also try Rubik's cube!"},
|
{C.C,"Also try Rubik’s cube!"},
|
||||||
{C.C,"Also try Terraria!"},
|
{C.C,"Also try Terraria!"},
|
||||||
{C.C,"Also try Touhou Project!"},
|
{C.C,"Also try Touhou Project!"},
|
||||||
{C.C,"Also try VVVVVV!"},
|
{C.C,"Also try VVVVVV!"},
|
||||||
@@ -979,8 +994,8 @@ return{
|
|||||||
{C.lY,"COOL!!"},
|
{C.lY,"COOL!!"},
|
||||||
{C.N,"Lua",C.Z," No.1"},
|
{C.N,"Lua",C.Z," No.1"},
|
||||||
{C.P,"T-spin!"},
|
{C.P,"T-spin!"},
|
||||||
{C.R,"\"DMCA abusing\""},
|
{C.R,"“DMCA abusing”"},
|
||||||
{C.R,"\"Intellectual property law\""},
|
{C.R,"“Intellectual property law”"},
|
||||||
{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,"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,"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.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"},
|
||||||
|
|||||||
@@ -186,7 +186,6 @@ return{
|
|||||||
Cold_Clear [MinusKelvin]
|
Cold_Clear [MinusKelvin]
|
||||||
json.lua [rxi]
|
json.lua [rxi]
|
||||||
profile.lua [itraykov]
|
profile.lua [itraykov]
|
||||||
simple-love-lights [dylhunn]
|
|
||||||
]],
|
]],
|
||||||
support="Apoyen al Autor",
|
support="Apoyen al Autor",
|
||||||
WidgetText={
|
WidgetText={
|
||||||
@@ -330,7 +329,6 @@ return{
|
|||||||
atkFX="FX Vis. de Ataque",
|
atkFX="FX Vis. de Ataque",
|
||||||
|
|
||||||
frame="Ratio de FPSs(%)",
|
frame="Ratio de FPSs(%)",
|
||||||
FTlock="Bloqueo por frames",
|
|
||||||
|
|
||||||
text="Texto de Acciones",
|
text="Texto de Acciones",
|
||||||
score="Puntaje en Pantalla",
|
score="Puntaje en Pantalla",
|
||||||
@@ -551,6 +549,7 @@ return{
|
|||||||
register="Registrarse",
|
register="Registrarse",
|
||||||
email="Correo Elec.",
|
email="Correo Elec.",
|
||||||
password="Contraseña",
|
password="Contraseña",
|
||||||
|
-- showEmail="Show Email",
|
||||||
keepPW="Recordar credenciales",
|
keepPW="Recordar credenciales",
|
||||||
login="Entrar",
|
login="Entrar",
|
||||||
},
|
},
|
||||||
@@ -655,20 +654,21 @@ return{
|
|||||||
['master_m']= {"Master", "M21", "Para Maestros del 20G."},
|
['master_m']= {"Master", "M21", "Para Maestros del 20G."},
|
||||||
['master_final']= {"Master", "FINAL", "El verdadero 20G Supremo:\nel final es inalcanzable."},
|
['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"},
|
['master_ex']= {"GrandMaster", "EXTRA", "Para ser un gran maestro,\nacepta este desafío"},
|
||||||
['strategy_e']= {"Strategy", "EASY", "Decisiones rápidas en 20G."},
|
['strategy_e']= {"Strategy", "Fácil", "Decisiones rápidas en 20G."},
|
||||||
['strategy_h']= {"Strategy", "HARD", "Decisiones rápidas en 20G."},
|
['strategy_h']= {"Strategy", "Difícil", "Decisiones rápidas en 20G."},
|
||||||
['strategy_u']= {"Strategy", "ULTIMATE", "Decisiones rápidas en 20G."},
|
['strategy_u']= {"Strategy", "Supremo", "Decisiones rápidas en 20G."},
|
||||||
['strategy_e_plus']={"Strategi", "MUDAH+", "Decisiones rápidas en 20G."},
|
['strategy_e_plus']={"Strategy", "Fácil+", "Estrategia sin bodega."},
|
||||||
['strategy_h_plus']={"Strategi", "SULIT+", "Decisiones rápidas en 20G."},
|
['strategy_h_plus']={"Strategy", "Difícil+", "Estrategia sin bodega."},
|
||||||
['strategy_u_plus']={"Strategi", "TERAKHIR+", "Decisiones rápidas en 20G."},
|
['strategy_u_plus']={"Strategy", "Supremo+", "Estrategia sin bodega."},
|
||||||
['blind_e']= {"A Ciegas", "Parcial", "Para novatos."},
|
['blind_e']= {"A Ciegas", "Parcial", "Para novatos."},
|
||||||
['blind_n']= {"A Ciegas", "Total", "Para jugadores intermedios."},
|
['blind_n']= {"A Ciegas", "Total", "Para jugadores intermedios."},
|
||||||
['blind_h']= {"A Ciegas", "Inmediato", "Para jugadores experimentados"},
|
['blind_h']= {"A Ciegas", "Inmediato", "Para jugadores experimentados"},
|
||||||
['blind_l']= {"A Ciegas", "Inmediato+", "Para profesionales."},
|
['blind_l']= {"A Ciegas", "Inmediato+", "Para profesionales."},
|
||||||
['blind_u']= {"A Ciegas", "?", "¿Estás preparado?"},
|
['blind_u']= {"A Ciegas", "?", "¿Estás preparado?"},
|
||||||
['blind_wtf']= {"A Ciegas", "ELFUF", "No, no lo estás."},
|
['blind_wtf']= {"A Ciegas", "ELFUF", "No, no lo estás."},
|
||||||
['classic_e']= {"Classic", "EASY", "Modo clásico con alta velocidad."},
|
['classic_e']= {"Clásico", "EASY", "Modo clásico con alta velocidad."},
|
||||||
['classic_h']= {"Clásico", "Difícil", "Modo clásico con alta velocidad."},
|
['classic_h']= {"Clásico", "Difícil", "Modo clásico con alta velocidad."},
|
||||||
|
['classic_l']= {"Clásico", "Lunático", "Modo clásico con alta velocidad."},
|
||||||
['classic_u']= {"Clásico", "Supremo", "Modo clásico con alta velocidad."},
|
['classic_u']= {"Clásico", "Supremo", "Modo clásico con alta velocidad."},
|
||||||
['survivor_e']= {"Supervivencia", "Fácil", "¿Cuánto tiempo podrás sobrevivir?"},
|
['survivor_e']= {"Supervivencia", "Fácil", "¿Cuánto tiempo podrás sobrevivir?"},
|
||||||
['survivor_n']= {"Supervivencia", "Normal", "¿Cuánto tiempo podrás sobrevivir?"},
|
['survivor_n']= {"Supervivencia", "Normal", "¿Cuánto tiempo podrás sobrevivir?"},
|
||||||
|
|||||||