Compare commits
10 Commits
pre0.17.0-
...
pre0.17.0-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7f9c9248ce | ||
|
|
9c1db48804 | ||
|
|
0628830f0c | ||
|
|
9436f2f5fb | ||
|
|
c5e1b5617f | ||
|
|
298c417aa3 | ||
|
|
fc74831700 | ||
|
|
d9db55de44 | ||
|
|
3fd205e8c2 | ||
|
|
5cb828fb92 |
@@ -1,4 +1,6 @@
|
||||
local Sources={}
|
||||
local lastLoaded={}
|
||||
local maxLoadedCount=3
|
||||
local SourceObjList={}
|
||||
local volume=1
|
||||
|
||||
local BGM={
|
||||
@@ -37,9 +39,20 @@ end
|
||||
local function check_curFadeOut(task,code,src)
|
||||
return task.code==code and task.args[1]==src
|
||||
end
|
||||
local function _tryReleaseSources()
|
||||
while #lastLoaded>maxLoadedCount do
|
||||
local n=lastLoaded[#lastLoaded]
|
||||
SourceObjList[n].source=SourceObjList[n].source:release()and nil
|
||||
table.remove(lastLoaded)
|
||||
end
|
||||
end
|
||||
function BGM.setDefault(bgm)
|
||||
BGM.default=bgm
|
||||
end
|
||||
function BGM.setMaxSources(count)
|
||||
maxLoadedCount=count
|
||||
_tryReleaseSources()
|
||||
end
|
||||
function BGM.setChange(func)
|
||||
BGM.onChange=func
|
||||
end
|
||||
@@ -53,7 +66,7 @@ function BGM.init(list)
|
||||
local simpList={}
|
||||
for _,v in next,list do
|
||||
table.insert(simpList,v.name)
|
||||
Sources[v.name]=v.path
|
||||
SourceObjList[v.name]={path=v.path,source=false}
|
||||
end
|
||||
table.sort(simpList)
|
||||
function BGM.getList()return simpList end
|
||||
@@ -61,18 +74,20 @@ function BGM.init(list)
|
||||
LOG(count.." BGM files added")
|
||||
function BGM.getCount()return count end
|
||||
|
||||
local function _load(name)
|
||||
if type(Sources[name])=='string'then
|
||||
if love.filesystem.getInfo(Sources[name])then
|
||||
Sources[name]=love.audio.newSource(Sources[name],'stream')
|
||||
Sources[name]:setLooping(true)
|
||||
Sources[name]:setVolume(0)
|
||||
local function _tryLoad(name)
|
||||
if SourceObjList[name]then
|
||||
if SourceObjList[name].source then
|
||||
return true
|
||||
elseif love.filesystem.getInfo(SourceObjList[name].path)then
|
||||
SourceObjList[name].source=love.audio.newSource(SourceObjList[name].path,'stream')
|
||||
SourceObjList[name].source:setLooping(true)
|
||||
SourceObjList[name].source:setVolume(0)
|
||||
table.insert(lastLoaded,1,name)
|
||||
_tryReleaseSources()
|
||||
return true
|
||||
else
|
||||
LOG("No BGM: "..Sources[name],5)
|
||||
LOG("No BGM: "..SourceObjList[name],5)
|
||||
end
|
||||
elseif Sources[name]then
|
||||
return true
|
||||
elseif name then
|
||||
LOG("No BGM: "..name,5)
|
||||
end
|
||||
@@ -89,30 +104,25 @@ function BGM.init(list)
|
||||
end
|
||||
end
|
||||
end
|
||||
function BGM.loadAll()--Not neccessary, unless you want avoid the lag when playing something for the first time
|
||||
for name in next,Sources do
|
||||
_load(name)
|
||||
end
|
||||
end
|
||||
function BGM.play(name)
|
||||
name=name or BGM.default
|
||||
if not _load(name)then return end
|
||||
if not _tryLoad(name)then return end
|
||||
if volume==0 then
|
||||
BGM.nowPlay=name
|
||||
BGM.playing=Sources[name]
|
||||
BGM.playing=SourceObjList[name].source
|
||||
return true
|
||||
end
|
||||
if name and Sources[name]then
|
||||
if name and SourceObjList[name].source then
|
||||
if BGM.nowPlay~=name then
|
||||
if BGM.nowPlay then
|
||||
TASK.new(task_fadeOut,BGM.playing)
|
||||
end
|
||||
TASK.removeTask_iterate(check_curFadeOut,task_fadeOut,Sources[name])
|
||||
TASK.removeTask_iterate(check_curFadeOut,task_fadeOut,SourceObjList[name].source)
|
||||
TASK.removeTask_code(task_fadeIn)
|
||||
|
||||
TASK.new(task_fadeIn,Sources[name])
|
||||
TASK.new(task_fadeIn,SourceObjList[name].source)
|
||||
BGM.nowPlay=name
|
||||
BGM.playing=Sources[name]
|
||||
BGM.playing=SourceObjList[name].source
|
||||
BGM.lastPlayed=BGM.nowPlay
|
||||
BGM.playing:seek(0)
|
||||
BGM.playing:play()
|
||||
@@ -128,8 +138,8 @@ function BGM.init(list)
|
||||
end
|
||||
function BGM.continue()
|
||||
if BGM.lastPlayed then
|
||||
BGM.nowPlay,BGM.playing=BGM.lastPlayed,Sources[BGM.lastPlayed]
|
||||
TASK.removeTask_iterate(check_curFadeOut,task_fadeOut,Sources[BGM.nowPlay])
|
||||
BGM.nowPlay,BGM.playing=BGM.lastPlayed,SourceObjList[BGM.lastPlayed].source
|
||||
TASK.removeTask_iterate(check_curFadeOut,task_fadeOut,SourceObjList[BGM.nowPlay].source)
|
||||
TASK.removeTask_code(task_fadeIn)
|
||||
TASK.new(task_fadeIn,BGM.playing)
|
||||
BGM.playing:play()
|
||||
|
||||
@@ -112,7 +112,7 @@ function SFX.playSample(pack,...)--vol-1, sampSet1, vol-2, sampSet2
|
||||
end
|
||||
end
|
||||
end
|
||||
function SFX.play(name,vol,pos,pitch)
|
||||
local function _play(name,vol,pos,pitch)
|
||||
if volume==0 or vol==0 then return end
|
||||
local S=Sources[name]--Source list
|
||||
if not S then return end
|
||||
@@ -134,33 +134,13 @@ function SFX.play(name,vol,pos,pitch)
|
||||
S:setPosition(0,0,0)
|
||||
end
|
||||
end
|
||||
S:setVolume(((vol or 1)*volume)^1.626)
|
||||
S:setVolume(vol^1.626)
|
||||
S:setPitch(pitch and 1.0594630943592953^pitch or 1)
|
||||
S:play()
|
||||
end
|
||||
function SFX.fplay(name,vol,pos)
|
||||
local S=Sources[name]--Source list
|
||||
if not S then return end
|
||||
local n=1
|
||||
while S[n]:isPlaying()do
|
||||
n=n+1
|
||||
if not S[n]then
|
||||
S[n]=S[1]:clone()
|
||||
S[n]:seek(0)
|
||||
break
|
||||
end
|
||||
end
|
||||
S=S[n]--AU_SRC
|
||||
if S:getChannelCount()==1 then
|
||||
if pos then
|
||||
pos=pos*stereo
|
||||
S:setPosition(pos,1-pos^2,0)
|
||||
else
|
||||
S:setPosition(0,0,0)
|
||||
end
|
||||
end
|
||||
S:setVolume(vol^1.626)
|
||||
S:play()
|
||||
SFX.fplay=_play--Play sounds without apply module's volume setting
|
||||
function SFX.play(name,vol,pos,pitch)
|
||||
_play(name,(vol or 1)*volume,pos,pitch)
|
||||
end
|
||||
function SFX.reset()
|
||||
for _,L in next,Sources do
|
||||
|
||||
41
legals.md
41
legals.md
@@ -1,26 +1,23 @@
|
||||
**TECHMINO © 2019-2021 26F Studio. Some rights reserved.**
|
||||
TECHMINO and "26F Studio" are trademarks of 26F Studio.
|
||||
The TECHMINO game and source code are under a GNU Lesser General Public License Version 3.
|
||||
TECHMINO © 2019-2021 26F Studio. Some rights reserved.
|
||||
|
||||
TECHMINO and "26F Studio" are trademarks of 26F Studio. The TECHMINO game and source code are under a GNU Lesser General Public License Version 3.
|
||||
|
||||
|
||||
"Tetris" is the registered trademark of The Tetris Holding, LLC, licensed to The Tetris Company, Inc. TECHMINO is not a fan game of Tetris. TECHMINO and 26F Studio are not affiliated with Tetris Holding, LLC or The Tetris Company, Inc. in any way.
|
||||
|
||||
|
||||
Powered by LÖVE, © 2006-2021 LÖVE Development Team.
|
||||
|
||||
Lua is free software distributed under the terms of the MIT license. Copyright © 1994-2021 by Lua.org, PUC-Rio.
|
||||
|
||||
Lua is free software distributed under the terms of the MIT license. Copyright © 1994~2021 by Lua.org, PUC-Rio.
|
||||
SIMPLE LOVE LIGHTS is under a MIT License. Created by Dylan Hunn.
|
||||
|
||||
json.lua is copyrighted by rxi. © 2021 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.
|
||||
|
||||
|
||||
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.
|
||||
|
||||
|
||||
"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.
|
||||
|
||||
|
||||
Source Han Sans is copyrighted by Adobe Inc. Source Han Sans and Adobe are registered trademarks of Adobe Inc. in United States and other countries or regions. Source Han Sans is licensed under the SIL Open Font License.
|
||||
|
||||
|
||||
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.
|
||||
Source Han Sans is copyrighted by Adobe Inc. Source Han Sans and Adobe are registered trademarks of Adobe Inc. in United States and other countries or regions. Source Han Sans is licensed under the SIL Open Font License, Version 1.1.
|
||||
|
||||
|
||||
JetBrains Mono is copyrighted by the JetBrains Mono Project authors. JetBrains Mono is a trademark of JetBrains s.r.o. JetBrains Mono is licensed under the SIL Open Font License, Version 1.1.
|
||||
@@ -29,22 +26,26 @@ JetBrains Mono is copyrighted by the JetBrains Mono Project authors. JetBrains M
|
||||
"PlayStation", "PS", "PlayStation Family Mark", "PS logo", "DualSense" and "Play Has No Limits" are registered trademarks or trademarks of Sony Interactive Entertainment Inc. "SONY" is a registered trademark of Sony Corporation. © 2021 Sony Interactive Entertainment LLC.
|
||||
|
||||
|
||||
N3TWORK is a registered trademark of N3TWORK Inc. © 2021 N3TWORK Inc.
|
||||
"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.
|
||||
|
||||
|
||||
"EA" and "Electronic Arts" are registered trademarks of Electronic Arts Inc. © 2021 Electronic Arts Inc.
|
||||
|
||||
SEGA and the SEGA logo are registered trademarks of Sega Corporation. © 2021 Sega Corporation.
|
||||
|
||||
Oculus Quest is a registered trademark of Facebook Technologies, LLC. © Facebook, Inc.
|
||||
Oculus Quest is a registered trademark of Facebook Technologies, LLC. © Meta Platforms, Inc.
|
||||
|
||||
"Nintendo" is a registered trademarks of Nintendo Co., Ltd. © 2021 Nintendo Co., Ltd.
|
||||
|
||||
N3TWORK is a registered trademark of N3TWORK Inc. © 2021 N3TWORK Inc.
|
||||
|
||||
GoldWave is a registered trademark of GoldWave, Inc.
|
||||
|
||||
|
||||
Linux is a registered trademark of Linus Torvalds.
|
||||
|
||||
|
||||
Touhou Project © Team Shanghai Alice 2002-2021.
|
||||
|
||||
All other trademarks are the properties of their respective owners.
|
||||
|
||||
All other trademarks, logos, and copyrights are the properties of their respective owners.
|
||||
|
||||
1
main.lua
1
main.lua
@@ -52,6 +52,7 @@ local _LOADTIME_=TIME()
|
||||
Z=require'Zframework'
|
||||
FONT.load('parts/fonts/proportional.ttf')
|
||||
SCR.setSize(1280,720)--Initialize Screen size
|
||||
BGM.setMaxSources(5)
|
||||
BGM.setChange(function(name)MES.new('music',text.nowPlaying..name,5)end)
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Load Zframework: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
@@ -20,6 +20,7 @@ return{
|
||||
|
||||
--Rule
|
||||
sequence='bag',
|
||||
lockout=false,
|
||||
fieldH=20,
|
||||
heightLimit=1e99,
|
||||
bufferLimit=1e99,
|
||||
|
||||
@@ -167,7 +167,7 @@ return{
|
||||
{"Tetris Gems",
|
||||
"tetris online official gem",
|
||||
"game",
|
||||
"Another Tetris game from tetris.com. It has the gravity mechanism, and each game lasts for 2 minutes. There are three kinds of gem blocks with different abilities.",
|
||||
"Another Tetris game from tetris.com. It has the gravity mechanism, and each game lasts for 1 minute. There are three kinds of gem blocks with different abilities.",
|
||||
},
|
||||
{"Tetris Mind Bender",
|
||||
"tetris online official gem",
|
||||
@@ -259,7 +259,7 @@ return{
|
||||
{"Tetris Blitz",
|
||||
"blitz ea mobile phone",
|
||||
"game",
|
||||
"A mobile Tetris game by Electronic Arts (EA). It has the gravity mechanism, and each game lasts for 2 minutes. A bunch of minoes fall down to the field at the beginning of the game, and you can enter the \"Frenzy\" mode by performing Tetris line clears continuously. There are many different power-ups available.\n\nThis game is no longer available since January 2020.",
|
||||
"A mobile Tetris game by Electronic Arts (EA). It has the gravity mechanism, and each game lasts for 2 minutes. A bunch of minoes fall down to the field at the beginning of the game, and you can enter the \"Frenzy\" mode by performing line clears continuously. There are many different power-ups available. Also, this game has no top-out mechanism. When an incoming block overlaps with existing blocks in the field, the top lines will be cleared automatically. \n\nThis game is no longer available since April 2020.",
|
||||
},
|
||||
{"Tetris (EA)",
|
||||
"tetris ea galaxy universe cosmos mobile phone",
|
||||
@@ -269,7 +269,7 @@ return{
|
||||
{"Tetris (N3TWORK)",
|
||||
"tetris n3twork mobile phone",
|
||||
"game",
|
||||
"The latest mobile Tetris from N3TWORK Inc. It has a 3-minute ultra mode, a marathon mode and a Royale mode. The UI is great but its controls are not so good.",
|
||||
"The latest mobile Tetris from N3TWORK Inc. It has a 3-minute ultra mode, a marathon mode and a 100-player Royale mode. The UI is great but its controls are not so good.",
|
||||
},
|
||||
{"Tetris Beat",
|
||||
"tetris beat n3twork rhythm",
|
||||
@@ -378,7 +378,7 @@ return{
|
||||
{"Tetris",
|
||||
"tetris",
|
||||
"term",
|
||||
"The name of the game (and its trademark). Also the name for clearing 4 lines at one time in official games.\nCoined from Tetra (greek for \"four\") and Tennis (favorite sport of the creator of Tetris).",--Thanks to Alexey Pajitnov!
|
||||
"The name of the game (and its trademark). Also the name for clearing 4 lines at one time in official games.\nCoined from Tetra (greek for \"four\") and Tennis (favorite sport of the creator of Tetris). Also, the Tetris games developed by Nintendo and SEGA was licensed by TTC and these two companies do not have the copyright of Tetris.",--Thanks to Alexey Pajitnov!
|
||||
},
|
||||
{"All Clear",
|
||||
"pc perfectclear ac allclear",
|
||||
@@ -662,10 +662,10 @@ return{
|
||||
"term",
|
||||
"A way of stacking where you have a 6-block-wide stack on the left, and a 3-block-wide stack on the right.\nFor a skilled player, this method of stacking might reduce the keypresses needed for stacking, and is a popular Sprint stacking method. The reason why it works has to do with the fact that pieces spawn with a bias to the left.",
|
||||
},
|
||||
{"20G",
|
||||
"20g",
|
||||
{"Freestyle",
|
||||
"freestyle ziyou",
|
||||
"term",
|
||||
"The fastest falling speed of modern Tetris. In 20G, pieces do not have a falling process and instantly appear on the bottom. This sometimes also limits a piece's sideways movements, as it is not always possible to make a piece climb over a bump or out of a well in 20G.",
|
||||
"This term is usually used in 20TSDs. Freestyle means finishing 20 TSDs without using static stacking modes. Freestyle 20TSDs is more difficult than static tsacking modes such as LST, and the performance can represent the T-spin skills a player has in battles.",
|
||||
},
|
||||
{"Topping out",
|
||||
"die death topout toppingout",
|
||||
@@ -684,9 +684,14 @@ return{
|
||||
"https://youtu.be/z4WtWISkrdU",
|
||||
},
|
||||
{"Falling speed",
|
||||
"fallingspeed",
|
||||
"fallingspeed gravity",
|
||||
"term",
|
||||
"Falling speed is often described in terms of G, i.e. how many lines it falls in one frame (often assuming 60 frames per second).\nG is a large unit. The speed of Lv 1 in a regular Marathon (one second per line) is 1/60 G, and 1G is about Lv 13 speed. G usually caps at 20G, for there are only 20 (visible) blocks in the matrix's height.",
|
||||
"Falling speed is often described in terms of \"G\", i.e. how many lines the blocks fall in one frame (usually assuming 60 fps).\nG is a relatively large unit. The speed of Lv 1 in a regular Marathon (one second per line) is 1/60 G, and 1G is about Lv 13 speed. The highest speed of modern Tetris is 20G because the field height is 20 lines. In fact, the real meaning of 20G is \"Infinite falling speed\", and even when the field height is more than 20 lines, 20G modes force all the blocks to fall down to the bottom instantly. You can learn more about 20G at the \"20G\" entry.",
|
||||
},
|
||||
{"20G",
|
||||
"20g gravity instant",
|
||||
"term",
|
||||
"The fastest falling speed of modern Tetris. In 20G modes, pieces appear instantly on the bottom of the field without the actual process of \"falling down\". This sometimes also limits a piece's sideways movements, as it is not always possible to make a piece climb over a bump or out of a well in 20G. You can learn more at the unit \"G\" at the \"falling speed\" entry. ",
|
||||
},
|
||||
{"Lockdown Delay",
|
||||
"lockdelay lockdowndelay lockdowntimer",
|
||||
@@ -829,7 +834,7 @@ return{
|
||||
"The block skin used by the earliest version of Tetris.\nIn the early times, computers were all using Command Line Interface instead of Graphical User Interface, so at that time a single mino in the game of Tetris is represented using two enclosing square brackets [ ]. It looks kinds of like bones so it is sometimes called the bone blocks.\nIn Techmino, bone blocks are defined as \"A single, fancy block skin that all of the blocks use.\". Different block skins may have different types of bone block styles.",
|
||||
},
|
||||
{"Semi-invisible",
|
||||
"half invisible",
|
||||
"half invisible semi",
|
||||
"term",
|
||||
"Refers to a rule where the tetrominoes will become invisible after a period of time.\nThis time interval is not definite and it is acceptable to describe it as \"disappear after a few seconds\".",
|
||||
},
|
||||
|
||||
@@ -163,7 +163,7 @@ return{
|
||||
{"Tetris Gems",
|
||||
"宝石 tetris online official gems",
|
||||
"game",
|
||||
"tetris.com官网上的俄罗斯方块,限时2分钟挖掘,有重力机制。\n有三种消除后可以获得不同功能的宝石方块。",
|
||||
"tetris.com官网上的俄罗斯方块,限时1分钟挖掘,有重力机制。\n有三种消除后可以获得不同功能的宝石方块。",
|
||||
},
|
||||
{"Tetris Mind Bender",
|
||||
"技能 tetris online official mindbender",
|
||||
@@ -248,7 +248,7 @@ return{
|
||||
{"Tetris Blitz",
|
||||
"闪电战 tetris blitz ea",
|
||||
"game",
|
||||
"简称闪电战,EA代理的一款移动端方块,有重力连锁机制,限时2分钟,游戏开始会掉下一堆小方块;持续消四会进入Frenzy模式(场地下方会不断冒出垃圾行,帮助玩家制造大连锁)。有非常多的道具\n\n已于2020年1月下架。",
|
||||
"简称闪电战,EA代理的一款移动端方块,有重力连锁机制,限时2分钟,游戏开始会掉下一堆小方块;持续消行会进入Frenzy模式(场地下方会不断冒出垃圾行,帮助玩家制造大连锁,如果多次落块没有消行会强制结束Frenzy)。有非常多的道具。\n此外这款游戏似乎没有top-out机制。当新出现的方块与场地现有方块重叠时,场地最上方的几行会被自动清除。\n\n已于2020年4月下架。",
|
||||
},
|
||||
{"Tetris (EA)",
|
||||
"tetris ea",
|
||||
@@ -258,7 +258,7 @@ return{
|
||||
{"Tetris Beat",
|
||||
"节奏 tetris beat n3twork",
|
||||
"game",
|
||||
"N3TWORK代理的一款移动端方块,有按钮、滑动和点击三种操控模式。除了马拉松模式外还有一个“节奏”模式,玩家根据音乐节奏落块可以得到额外分数奖励。特效比较花眼,操控手感不是很好。",
|
||||
"N3TWORK代理的一款移动端方块,有马拉松、3分钟限时打分和Royale(最多100人对战)模式。UI比较好看,但不支持自定义键位;而且默认的按钮很小,手感不好。",
|
||||
},
|
||||
{"Tetris (N3TWORK)",
|
||||
"Tetris n3twork",
|
||||
@@ -266,7 +266,7 @@ return{
|
||||
"N3TWORK代理的一款移动端方块,有马拉松、限时打分和Royale(最多99人对战)模式。UI比较好看,但不支持自定义键位;而且默认的按钮很小,手感不好。"
|
||||
},
|
||||
{"Touhoumino",
|
||||
"东方 车万 touhoumino chewan dongfang touhou th",
|
||||
"东方 车万 偷猴 touhoumino chewan dongfang touhou th",
|
||||
"game",
|
||||
"玩家自制Windows平台方块,东方主题,其实就是一个Nullpomino的自带资源包的改版,将东方Project元素结合到俄罗斯方块的游戏,好玩但是难度较大,适合有方块基础并且各项能力都较强的玩家游玩(不然都不知道自己怎么死的)。",
|
||||
},
|
||||
@@ -578,7 +578,7 @@ return{
|
||||
"term",
|
||||
"交换功能,Hold的另一种表现形式,将手里的方块和Next槽中的第一个交换,一般同样不能连续使用。",
|
||||
},
|
||||
{"Deepdrop",
|
||||
{"深降",
|
||||
"深降 deepdrop shenjiang",
|
||||
"term",
|
||||
"开启后当方块触底时,再次按下软降会让方块尝试向下穿墙寻找放得下的地方,如果有就会直接瞬移到那\n该功能更偏向用于技术研究,对于ai来说有了它可以完全不用再考虑旋转系统,形状能容得下的地方一定都能到达",
|
||||
@@ -686,17 +686,12 @@ return{
|
||||
{"Freestyle",
|
||||
"freestyle ziyou",
|
||||
"term",
|
||||
"自由发挥的意思,常用于freestyle TSD(T2),指不用固定的堆叠方式而是随机应变完成20TSD。比用LST或者垃圾分类完成的20 TSD的含金量高不少",
|
||||
},
|
||||
{"20G",
|
||||
"高重力 20g",
|
||||
"term",
|
||||
"现代方块的最高下落速度,表观就是方块瞬间到底,不存在中间的下落过程,可能会让方块无法跨越壕沟/从山谷爬出。",
|
||||
"自由发挥的意思,常用于freestyle TSD(T2),指不用固定的堆叠方式而是随机应变完成20TSD。比用LST或者垃圾分类完成的20 TSD的难度要大,成绩也更能代表实战水平",
|
||||
},
|
||||
{"死亡判定",
|
||||
"死亡判定 die death siwang",
|
||||
"term",
|
||||
"现代方块普遍使用的死亡判定:\n1. 新出现的方块和场地方块有重叠(窒息,Block Out)(c4w比s4w强的原因,因为被打进18行都不会窒息);\n2. 方块锁定时完全在场地的外面(Lock Out);\n3. 场地内现存方块总高度大于40。(超高,Top Out)\n\n注:本游戏使用的死亡判定不包含上述的第二条和第三条。",
|
||||
"现代方块普遍使用的死亡判定:\n1. 新出现的方块和场地方块有重叠(窒息,Block Out)(c4w比s4w强的原因,因为被打进18行都不会窒息);\n2. 方块锁定时完全在场地的外面(Lock Out);\n3. 场地内现存方块总高度大于40。(超高,Top Out)\n\n注:本游戏使用的死亡判定默认不开启第二、三条。",
|
||||
},
|
||||
{"缓冲区",
|
||||
"缓冲区 buffer zone huanchongqu",
|
||||
@@ -712,7 +707,12 @@ return{
|
||||
{"下落速度",
|
||||
"下落速度 重力 drop speed zhongli gravity",
|
||||
"term",
|
||||
"一般用*G表示方块的下落速度,意思是每一帧方块往下移动多少格子,一秒下落一格就是1/60G(默认60fps),故G是一个很大的单位,20G即为上限(因为场地就20格)。",
|
||||
"一般用*G表示方块的下落速度,意思是每一帧方块往下移动多少格,一秒下落一格就是1/60G(默认60fps),可以看出G是一个很大的单位。因为场地就20格,所以一般认为20G即为上限,详见20G词条。",
|
||||
},
|
||||
{"20G",
|
||||
"高重力 20g",
|
||||
"term",
|
||||
"现代方块的最高下落速度,表观就是方块瞬间到底,不存在中间的下落过程,可能会让方块无法跨越壕沟/从山谷爬出。\n20G一般指的其实是“无限下落速度”,就算场地不止20格,“20G”也会让方块瞬间到底。\n本游戏(和部分其他游戏,推荐这么设计)中20G的优先级比其他玩家操作都高,即使是0arr的水平方向“瞬间移动”中途也会受到20G的影响。",
|
||||
},
|
||||
{"锁定延迟",
|
||||
"锁定延迟 重力 lock delay suoyan zhongli gravity",
|
||||
|
||||
@@ -303,6 +303,7 @@ return{
|
||||
ospin="O-spin",
|
||||
fineKill="100% Finesse",
|
||||
b2bKill="No B2B break",
|
||||
lockout="Fail when lock out",
|
||||
easyFresh="Normal Lock Reset",
|
||||
deepDrop="Deep Drop",
|
||||
bone="Bone Blocks",
|
||||
@@ -515,6 +516,7 @@ return{
|
||||
ospin="O-Spin",
|
||||
fineKill="100% Finesse",
|
||||
b2bKill="No B2B break",
|
||||
lockout="Fail when lock out",
|
||||
easyFresh="Normal Lock Reset",
|
||||
deepDrop="Deep Drop",
|
||||
bone="Bone Blocks",
|
||||
|
||||
@@ -269,6 +269,7 @@ return{
|
||||
ospin="O-Spin",
|
||||
fineKill="100% Finesse",
|
||||
b2bKill="No Romper B2B ",
|
||||
-- lockout="Fail when lock out",
|
||||
easyFresh="Reinicio de Bloqueo Normal",
|
||||
deepDrop="Deep Drop",
|
||||
bone="Bone Block",
|
||||
@@ -481,6 +482,7 @@ return{
|
||||
ospin="O-Spin",
|
||||
fineKill="100% Finesse",
|
||||
b2bKill="No Romper B2B ",
|
||||
-- lockout="Fail when lock out",
|
||||
easyFresh="Reinicio de Bloqueo Normal",
|
||||
deepDrop="Deep Drop",
|
||||
bone="Bone Block",
|
||||
|
||||
@@ -265,6 +265,7 @@ return{
|
||||
ospin="O-spin",
|
||||
fineKill="100% Finesse",
|
||||
b2bKill="Sans perte de B2B",
|
||||
-- lockout="Fail when lock out",
|
||||
easyFresh="Réinit. de verrouillage normale",
|
||||
-- deepDrop="Deep Drop",
|
||||
bone="Crochets",
|
||||
@@ -482,6 +483,7 @@ return{
|
||||
ospin="O-spin",
|
||||
fineKill="100% Finesse",
|
||||
b2bKill="Sans perte de B2B",
|
||||
-- lockout="Fail when lock out",
|
||||
easyFresh="Réinit. de verrouillage normale",
|
||||
-- deepDrop="Deep Drop",
|
||||
bone="Crochets",
|
||||
|
||||
@@ -291,6 +291,7 @@ return{
|
||||
ospin="O-Spin",
|
||||
fineKill="100% Finesse",
|
||||
b2bKill="Sem Quebrar B2B",
|
||||
-- lockout="Fail when lock out",
|
||||
easyFresh="Reset De Trava Normal",
|
||||
-- deepDrop="Deep Drop",
|
||||
bone="Bone Blocks",
|
||||
@@ -504,6 +505,7 @@ return{
|
||||
ospin="O-Spin",
|
||||
fineKill="100% Finesse",
|
||||
b2bKill="Sem Quebrar B2B",
|
||||
-- lockout="Fail when lock out",
|
||||
easyFresh="Reset De Trava Normal",
|
||||
-- deepDrop="Deep Drop",
|
||||
bone="Bone Blocks",
|
||||
|
||||
@@ -197,6 +197,7 @@ return{
|
||||
ospin="O→Any",
|
||||
fineKill="12 XX 21",
|
||||
b2bKill="_1 XX",
|
||||
lockout="X ↑_↓_↑",
|
||||
easyFresh="↓_↓_↓_",
|
||||
deepDrop="\\↓↓/",
|
||||
bone="[]",
|
||||
@@ -409,6 +410,7 @@ return{
|
||||
ospin="O→Any",
|
||||
fineKill="12 XX 21",
|
||||
b2bKill="_1 XX",
|
||||
lockout="X ↑_↓_↑",
|
||||
easyFresh="↓_↓_↓_",
|
||||
deepDrop="\\↓↓/",
|
||||
bone="[]",
|
||||
|
||||
@@ -303,6 +303,7 @@ return{
|
||||
ospin="O-spin",
|
||||
fineKill="强制极简",
|
||||
b2bKill="强制B2B",
|
||||
lockout="锁定在外时失败",
|
||||
easyFresh="普通刷新锁延",
|
||||
deepDrop="深降",
|
||||
bone="骨块",
|
||||
@@ -515,6 +516,7 @@ return{
|
||||
ospin="O-spin",
|
||||
fineKill="强制极简",
|
||||
b2bKill="强制B2B",
|
||||
lockout="锁定在外时失败",
|
||||
easyFresh="普通刷新锁延",
|
||||
deepDrop="深降",
|
||||
bone="骨块",
|
||||
|
||||
@@ -301,6 +301,7 @@ return{
|
||||
ospin="O型自旋",
|
||||
fineKill="100%精巧",
|
||||
b2bKill="没有背靠背中断",
|
||||
lockout="锁定时失败",
|
||||
easyFresh="正常锁复位",
|
||||
deepDrop="深滴",
|
||||
bone="骨块",
|
||||
@@ -514,6 +515,7 @@ return{
|
||||
ospin="O型自旋",
|
||||
fineKill="100%精巧",
|
||||
b2bKill="没有背靠背中断",
|
||||
lockout="锁定时失败",
|
||||
easyFresh="正常锁复位",
|
||||
deepDrop="深滴",
|
||||
bone="骨块",
|
||||
|
||||
@@ -302,6 +302,7 @@ return{
|
||||
ospin="O-spin",
|
||||
fineKill="100% finesse",
|
||||
b2bKill="強制B2B",
|
||||
lockout="鎖定在外時失敗",
|
||||
easyFresh="普通刷新鎖延",
|
||||
deepDrop="深降",
|
||||
bone="骨塊",
|
||||
@@ -514,6 +515,7 @@ return{
|
||||
ospin="O-spin",
|
||||
fineKill="強制finesse",
|
||||
b2bKill="強制B2B",
|
||||
lockout="鎖定在外時失敗",
|
||||
easyFresh="普通刷新鎖延",
|
||||
deepDrop="深降",
|
||||
bone="骨塊",
|
||||
|
||||
@@ -18,7 +18,7 @@ return{
|
||||
{name='dig_400l', x=-800, y=-200, size=40,shape=1,icon="dig_sprint"},
|
||||
|
||||
{name='marathon_n', x=0, y=-600, size=60,shape=1,icon="marathon", unlock={'marathon_h','solo_e','round_e','blind_e','classic_e','survivor_e','bigbang','zen'}},
|
||||
{name='marathon_h', x=0, y=-800, size=50,shape=1,icon="marathon", unlock={'master_n'}},
|
||||
{name='marathon_h', x=0, y=-800, size=50,shape=1,icon="marathon", unlock={'master_n','strategy_e'}},
|
||||
|
||||
{name='solo_e', x=-600, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_n'}},
|
||||
{name='solo_n', x=-800, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_h'}},
|
||||
@@ -39,16 +39,16 @@ return{
|
||||
{name='round_l', x=-1200, y=-800, size=40,shape=1,icon="round", unlock={'round_u'}},
|
||||
{name='round_u', x=-1400, y=-800, size=40,shape=1,icon="round"},
|
||||
|
||||
{name='master_n', x=0, y=-1000, size=40,shape=1,icon="master", unlock={'master_h','strategy_e'}},
|
||||
{name='master_h', x=0, y=-1200, size=40,shape=3,icon="master", unlock={'master_final','master_ex','master_ph','master_m'}},
|
||||
{name='master_n', x=0, y=-1000, size=40,shape=1,icon="master", unlock={'master_h','strategy_h'}},
|
||||
{name='master_h', x=0, y=-1200, size=40,shape=3,icon="master", unlock={'master_final','master_ex','master_ph','master_m','strategy_u'}},
|
||||
{name='master_m', x=150, y=-1320, size=30,shape=3,icon="master"},
|
||||
{name='master_final', x=0, y=-1600, size=40,shape=2,icon="master"},
|
||||
{name='master_ph', x=-150, y=-1500, size=40,shape=2,icon="master"},
|
||||
{name='master_ex', x=150, y=-1500, size=40,shape=2,icon="master_ex"},
|
||||
|
||||
{name='strategy_e', x=-150, y=-1100, size=40,shape=3,icon="master", unlock={'strategy_h'}},
|
||||
{name='strategy_h', x=-250, y=-1200, size=35,shape=3,icon="master", unlock={'strategy_u'}},
|
||||
{name='strategy_u', x=-350, y=-1300, size=30,shape=3,icon="master"},
|
||||
{name='strategy_e', x=-150, y=-1030, size=40,shape=3,icon="master"},
|
||||
{name='strategy_h', x=-200, y=-1160, size=35,shape=3,icon="master"},
|
||||
{name='strategy_u', x=-250, y=-1290, size=30,shape=3,icon="master"},
|
||||
|
||||
{name='blind_e', x=150, y=-700, size=40,shape=1,icon="hidden", unlock={'blind_n'}},
|
||||
{name='blind_n', x=150, y=-800, size=40,shape=1,icon="hidden", unlock={'blind_h'}},
|
||||
@@ -57,9 +57,9 @@ return{
|
||||
{name='blind_u', x=150, y=-1100, size=30,shape=3,icon="hidden", unlock={'blind_wtf'}},
|
||||
{name='blind_wtf', x=150, y=-1200, size=25,shape=2,icon="hidden"},
|
||||
|
||||
{name='classic_e', x=-150, y=-850, size=40,shape=1,icon="classic", unlock={'classic_h'}},
|
||||
{name='classic_h', x=-300, y=-950, size=35,shape=2,icon="classic", unlock={'classic_u'}},
|
||||
{name='classic_u', x=-450, y=-1050, size=30,shape=2,icon="classic"},
|
||||
{name='classic_e', x=-200, y=-850, size=40,shape=1,icon="classic", unlock={'classic_h'}},
|
||||
{name='classic_h', x=-300, y=-950, size=35,shape=2,icon="classic", unlock={'classic_u'}},
|
||||
{name='classic_u', x=-400, y=-1050, size=30,shape=2,icon="classic"},
|
||||
|
||||
{name='survivor_e', x=300, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_n'}},
|
||||
{name='survivor_n', x=500, y=-600, size=40,shape=1,icon="survivor", unlock={'survivor_h','attacker_h','defender_n','dig_h'}},
|
||||
|
||||
@@ -31,6 +31,7 @@ return{
|
||||
drop=60,lock=60,
|
||||
wait=0,fall=0,
|
||||
bone=false,
|
||||
lockout=false,
|
||||
fieldH=20,heightLimit=1e99,
|
||||
nextCount=6,nextStartPos=1,
|
||||
holdMode='hold',holdCount=1,
|
||||
|
||||
@@ -387,16 +387,8 @@ function Player:garbageRise(color,amount,line)--Release n-lines garbage to field
|
||||
#self.field>self.gameEnv.heightLimit
|
||||
)
|
||||
then
|
||||
self:lock()
|
||||
self:lose()
|
||||
end
|
||||
|
||||
if #self.field>self.gameEnv.heightLimit then
|
||||
self:_triggerEvent('hook_die')
|
||||
if #self.field>self.gameEnv.heightLimit then
|
||||
self:lose()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local invList={2,1,4,3,5,6,7}
|
||||
@@ -1645,7 +1637,7 @@ do
|
||||
end
|
||||
end
|
||||
|
||||
--Prevent sudden death if hang>0
|
||||
--Prevent sudden death if hang>0
|
||||
if ENV.hang>ENV.wait and self.nextQueue[1]then
|
||||
local B=self.nextQueue[1]
|
||||
if self:ifoverlap(B.bk,int(6-#B.bk[1]*.5),int(ENV.fieldH+1-modf(B.RS.centerPos[B.id][B.dir][1]))+ceil(self.fieldBeneath/30))then
|
||||
@@ -1661,7 +1653,7 @@ do
|
||||
end
|
||||
|
||||
--Check height limit
|
||||
if cc==0 and #self.field>ENV.heightLimit then
|
||||
if cc==0 and(#self.field>ENV.heightLimit or ENV.lockout and CY>ENV.fieldH)then
|
||||
finish='lose'
|
||||
end
|
||||
|
||||
|
||||
@@ -181,7 +181,7 @@ function scene.draw()
|
||||
gc.translate(0,WIDGET.scrollPos)
|
||||
end
|
||||
|
||||
scene.widgetScrollHeight=400
|
||||
scene.widgetScrollHeight=450
|
||||
scene.widgetList={
|
||||
WIDGET.newText{name='title', x=520,y=15,font=70,align='R'},
|
||||
|
||||
@@ -225,12 +225,13 @@ scene.widgetList={
|
||||
WIDGET.newSelector{name='eventSet', x=1050,y=740,w=340,color='H',list=sList.eventSet,disp=CUSval('eventSet'),code=CUSsto('eventSet')},
|
||||
|
||||
--Special rules
|
||||
WIDGET.newSwitch{name='ospin', x=850, y=810,lim=210,disp=CUSval('ospin'), code=CUSrev('ospin')},
|
||||
WIDGET.newSwitch{name='fineKill', x=850, y=870,lim=210,disp=CUSval('fineKill'), code=CUSrev('fineKill')},
|
||||
WIDGET.newSwitch{name='b2bKill', x=850, y=930,lim=210,disp=CUSval('b2bKill'), code=CUSrev('b2bKill')},
|
||||
WIDGET.newSwitch{name='easyFresh', x=1170,y=810,lim=250,disp=CUSval('easyFresh'),code=CUSrev('easyFresh')},
|
||||
WIDGET.newSwitch{name='deepDrop', x=1170,y=870,lim=250,disp=CUSval('deepDrop'), code=CUSrev('deepDrop')},
|
||||
WIDGET.newSwitch{name='bone', x=1170,y=930,lim=250,disp=CUSval('bone'), code=CUSrev('bone')},
|
||||
WIDGET.newSwitch{name='ospin', x=850, y=820 ,lim=210,disp=CUSval('ospin'), code=CUSrev('ospin')},
|
||||
WIDGET.newSwitch{name='fineKill', x=850, y=880 ,lim=210,disp=CUSval('fineKill'), code=CUSrev('fineKill')},
|
||||
WIDGET.newSwitch{name='b2bKill', x=850, y=940 ,lim=210,disp=CUSval('b2bKill'), code=CUSrev('b2bKill')},
|
||||
WIDGET.newSwitch{name='lockout', x=850, y=1000,lim=210,disp=CUSval('lockout'), code=CUSrev('lockout')},
|
||||
WIDGET.newSwitch{name='easyFresh', x=1170,y=820 ,lim=250,disp=CUSval('easyFresh'),code=CUSrev('easyFresh')},
|
||||
WIDGET.newSwitch{name='deepDrop', x=1170,y=880 ,lim=250,disp=CUSval('deepDrop'), code=CUSrev('deepDrop')},
|
||||
WIDGET.newSwitch{name='bone', x=1170,y=940 ,lim=250,disp=CUSval('bone'), code=CUSrev('bone')},
|
||||
|
||||
--Next & Hold
|
||||
WIDGET.newSelector{name='holdMode', x=310, y=890, w=300,color='lY',list=sList.holdMode,disp=CUSval('holdMode'),code=CUSsto('holdMode')},
|
||||
@@ -240,8 +241,8 @@ scene.widgetList={
|
||||
WIDGET.newSwitch{name='phyHold', x=560, y=1030,lim=200, disp=CUSval('phyHold'),code=CUSrev('phyHold'),hideF=function()return CUSTOMENV.holdCount==0 end},
|
||||
|
||||
--BG & BGM
|
||||
WIDGET.newSelector{name='bg', x=840, y=1030,w=250,color='Y',list=BG.getList(),disp=CUSval('bg'),code=function(i)CUSTOMENV.bg=i BG.set(i)end},
|
||||
WIDGET.newSelector{name='bgm', x=1120,y=1030,w=250,color='Y',list=BGM.getList(),disp=CUSval('bgm'),code=function(i)CUSTOMENV.bgm=i BGM.play(i)end},
|
||||
WIDGET.newSelector{name='bg', x=840, y=1090,w=250,color='Y',list=BG.getList(),disp=CUSval('bg'),code=function(i)CUSTOMENV.bg=i BG.set(i)end},
|
||||
WIDGET.newSelector{name='bgm', x=1120,y=1090,w=250,color='Y',list=BGM.getList(),disp=CUSval('bgm'),code=function(i)CUSTOMENV.bgm=i BGM.play(i)end},
|
||||
}
|
||||
|
||||
return scene
|
||||
|
||||
@@ -94,12 +94,13 @@ scene.widgetList={
|
||||
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
|
||||
|
||||
--Special rules
|
||||
WIDGET.newSwitch{name='ospin', x=850, y=750,lim=210,disp=ROOMval('ospin'), code=ROOMrev('ospin')},
|
||||
WIDGET.newSwitch{name='fineKill', x=850, y=840,lim=210,disp=ROOMval('fineKill'), code=ROOMrev('fineKill')},
|
||||
WIDGET.newSwitch{name='b2bKill', x=850, y=930,lim=210,disp=ROOMval('b2bKill'), code=ROOMrev('b2bKill')},
|
||||
WIDGET.newSwitch{name='easyFresh', x=1170,y=750,lim=250,disp=ROOMval('easyFresh'),code=ROOMrev('easyFresh')},
|
||||
WIDGET.newSwitch{name='deepDrop', x=1170,y=840,lim=250,disp=ROOMval('deepDrop'), code=ROOMrev('deepDrop')},
|
||||
WIDGET.newSwitch{name='bone', x=1170,y=930,lim=250,disp=ROOMval('bone'), code=ROOMrev('bone')},
|
||||
WIDGET.newSwitch{name='ospin', x=850, y=760 ,lim=210,disp=ROOMval('ospin'), code=ROOMrev('ospin')},
|
||||
WIDGET.newSwitch{name='fineKill', x=850, y=850 ,lim=210,disp=ROOMval('fineKill'), code=ROOMrev('fineKill')},
|
||||
WIDGET.newSwitch{name='b2bKill', x=850, y=940 ,lim=210,disp=ROOMval('b2bKill'), code=ROOMrev('b2bKill')},
|
||||
WIDGET.newSwitch{name='lockout', x=850, y=1030,lim=210,disp=ROOMval('lockout'), code=ROOMval('lockout')},
|
||||
WIDGET.newSwitch{name='easyFresh', x=1170,y=760 ,lim=250,disp=ROOMval('easyFresh'),code=ROOMrev('easyFresh')},
|
||||
WIDGET.newSwitch{name='deepDrop', x=1170,y=850 ,lim=250,disp=ROOMval('deepDrop'), code=ROOMrev('deepDrop')},
|
||||
WIDGET.newSwitch{name='bone', x=1170,y=940 ,lim=250,disp=ROOMval('bone'), code=ROOMrev('bone')},
|
||||
|
||||
--Rule set
|
||||
WIDGET.newSelector{name='eventSet', x=310,y=880,w=360,color='H',list=sList.eventSet,disp=ROOMval('eventSet'),code=ROOMsto('eventSet')},
|
||||
|
||||
@@ -15,11 +15,14 @@ return[=[
|
||||
新增:
|
||||
新模式:大爆炸
|
||||
新模式:策略堆叠(原版设计来自Cambridge游戏, by NOT_A_ROBOT)
|
||||
添加lockout判负规则(默认关闭)
|
||||
改动:
|
||||
TRS的S/Z添加四个踢墙防止在一些地方卡死
|
||||
生成位置预览开启后hold的生成位置也可见 #453
|
||||
优化pc训练模式体验,添加胜利条件,不再无尽
|
||||
堆积模式添加15帧的窒息延迟 #465
|
||||
代码:
|
||||
bgm模块可限制最大加载数,不容易达到上限导致没声 #447
|
||||
修复:
|
||||
机翻语言超级消除无行数显示 #462
|
||||
竞速-效率左侧信息颜色问题
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
return{
|
||||
["apkCode"]=404,
|
||||
["apkCode"]=405,
|
||||
["code"]=1700,
|
||||
["string"]="V0.17.0",
|
||||
["room"]="ver A-0",
|
||||
["room"]="ver A-1",
|
||||
["name"]="硬着陆 Hard Landing",
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user