diff --git a/Zframework/bgm.lua b/Zframework/bgm.lua index a3864894..d13b2f95 100644 --- a/Zframework/bgm.lua +++ b/Zframework/bgm.lua @@ -107,8 +107,9 @@ function BGM.init(list) LOG("No BGM: "..name,5) end end - function BGM.play(name) + function BGM.play(name,args) name=name or BGM.default + args=args or"" if not _tryLoad(name)then return end if volume==0 then BGM.nowPlay=name @@ -118,14 +119,24 @@ function BGM.init(list) if name and SourceObjList[name].source then if BGM.nowPlay~=name then if BGM.nowPlay then - TASK.new(task_fadeOut,BGM.playing) + if not STRING.sArg(args,'-so')then + TASK.new(task_fadeOut,BGM.playing) + else + BGM.playing:pause() + end end TASK.removeTask_iterate(check_curFadeOut,task_fadeOut,SourceObjList[name].source) TASK.removeTask_code(task_fadeIn) - TASK.new(task_fadeIn,SourceObjList[name].source) BGM.nowPlay=name BGM.playing=SourceObjList[name].source + if not STRING.sArg(args,'-si')then + BGM.playing:setVolume(0) + TASK.new(task_fadeIn,BGM.playing) + else + BGM.playing:setVolume(volume) + BGM.playing:play() + end BGM.lastPlayed=BGM.nowPlay BGM.playing:seek(0) BGM.playing:play() @@ -148,10 +159,15 @@ function BGM.init(list) BGM.playing:play() end end - function BGM.stop() + function BGM.stop(args) + args=args or"" TASK.removeTask_code(task_fadeIn) - if BGM.nowPlay then - TASK.new(task_fadeOut,BGM.playing) + if not STRING.sArg(args,'-s')then + if BGM.nowPlay then + TASK.new(task_fadeOut,BGM.playing) + end + else + BGM.playing:pause() end BGM.nowPlay,BGM.playing=nil end diff --git a/Zframework/file.lua b/Zframework/file.lua index 2a6f2334..83b847c5 100644 --- a/Zframework/file.lua +++ b/Zframework/file.lua @@ -7,10 +7,10 @@ function FILE.load(name,args) assert(F:open'r','open error') local s=F:read()F:close() local mode= - args:sArg'-luaon'and'luaon'or - args:sArg'-lua'and'lua'or - args:sArg'-json'and'json'or - args:sArg'-string'and'string'or + STRING.sArg(args,'-luaon')and'luaon'or + STRING.sArg(args,'-lua')and'lua'or + STRING.sArg(args,'-json')and'json'or + STRING.sArg(args,'-string')and'string'or s:sub(1,6)=='return{'and'luaon'or (s:sub(1,1)=='['and s:sub(-1)==']'or s:sub(1,1)=='{'and s:sub(-1)=='}')and'json'or 'string' @@ -48,12 +48,12 @@ function FILE.load(name,args) end function FILE.save(data,name,args) if not args then args=''end - if args:sArg'-d'and fs.getInfo(name)then + if STRING.sArg(args,'-d')and fs.getInfo(name)then error('duplicate') end if type(data)=='table'then - if args:sArg'-luaon'then + if STRING.sArg(args,'-luaon')then data=TABLE.dump(data) if not data then error('encode error') diff --git a/Zframework/font.lua b/Zframework/font.lua index a5e52edf..78238bd6 100644 --- a/Zframework/font.lua +++ b/Zframework/font.lua @@ -18,7 +18,7 @@ function FONT.rawset(s) end function FONT.load(fonts) for name,path in next,fonts do - assert(love.filesystem.getInfo(path),("Font file $1($2) not exist!"):repD(name,path)) + assert(love.filesystem.getInfo(path),STRING.repD("Font file $1($2) not exist!",name,path)) fontFiles[name]=love.filesystem.newFile(path) fontCache[name]={} end diff --git a/Zframework/init.lua b/Zframework/init.lua index a6a45a33..e66b56ff 100644 --- a/Zframework/init.lua +++ b/Zframework/init.lua @@ -70,15 +70,25 @@ local gc_draw,gc_line,gc_circle,gc_print=gc.draw,gc.line,gc.circle,gc.print local WIDGET,SCR,SCN=WIDGET,SCR,SCN local xOy=SCR.xOy - local ITP=xOy.inverseTransformPoint + local max,min=math.max,math.min +local devMode local mx,my,mouseShow,cursorSpd=640,360,false,0 local jsState={}--map, joystickID->axisStates: {axisName->axisVal} local errData={}--list, each error create {mes={errMes strings},scene=sceneNameStr} -local devMode +local function drawCursor(_,x,y) + gc_setColor(1,1,1) + gc_setLineWidth(2) + gc_circle(ms.isDown(1)and'fill'or'line',x,y,6) +end +local showPowerInfo=true +local showClickFX=true +local discardCanvas=false +local frameMul=100 +local onQuit=NULL local batteryImg=GC.DO{31,20, {'fRect',1,0,26,2}, @@ -152,7 +162,7 @@ local function _triggerMouseDown(x,y,k) if SCN.mouseDown then SCN.mouseDown(x,y,k)end WIDGET.press(x,y,k) lastX,lastY=x,y - if SETTING.clickFX then SYSFX.newTap(3,x,y)end + if showClickFX then SYSFX.newTap(3,x,y)end end local function mouse_update(dt) if not KBisDown('lctrl','rctrl')and KBisDown('up','down','left','right')then @@ -260,7 +270,7 @@ function love.touchreleased(id,x,y) if SCN.touchUp then SCN.touchUp(x,y)end if(x-lastX)^2+(y-lastY)^2<62 then if SCN.touchClick then SCN.touchClick(x,y)end - if SETTING.clickFX then SYSFX.newTap(3,x,y)end + if showClickFX then SYSFX.newTap(3,x,y)end end end @@ -324,7 +334,7 @@ function love.keypressed(key,_,isRep) elseif key=='space'or key=='return'then mouseShow=true if not isRep then - if SETTING.clickFX then SYSFX.newTap(3,mx,my)end + if showClickFX then SYSFX.newTap(3,mx,my)end _triggerMouseDown(mx,my,1) end else @@ -452,7 +462,7 @@ function love.gamepadpressed(_,key) if W and W.arrowKey then W:arrowKey(key)end elseif key=='return'then mouseShow=true - if SETTING.clickFX then SYSFX.newTap(3,mx,my)end + if showClickFX then SYSFX.newTap(3,mx,my)end _triggerMouseDown(mx,my,1) else if W and W.keypress then @@ -627,14 +637,6 @@ local wsImg={}do } end -local function drawCursor(_,x,y) - gc_setColor(1,1,1) - gc_setLineWidth(2) - gc_circle(ms.isDown(1)and'fill'or'line',x,y,6) -end -local function showPowerInfo()return true end -local onQuit=NULL - function love.run() local love=love @@ -649,7 +651,7 @@ function love.run() local FPS,MINI=love.timer.getFPS,love.window.isMinimized local PUMP,POLL=love.event.pump,love.event.poll - local timer,SETTING,VERSION=love.timer.getTime,SETTING,VERSION + local timer,VERSION=love.timer.getTime,VERSION local frameTimeList={} local lastFrame=timer() @@ -698,7 +700,7 @@ function love.run() --DRAW if not MINI()then - FCT=FCT+SETTING.frameMul + FCT=FCT+frameMul if FCT>=100 then FCT=FCT-100 @@ -720,7 +722,7 @@ function love.run() MES_draw() gc_replaceTransform(SCR.origin) --Draw power info. - if showPowerInfo()then + if showPowerInfo then gc_setColor(1,1,1) gc_draw(infoCanvas,safeX,0,0,SCR.k) end @@ -794,13 +796,13 @@ function love.run() gc_present() --SPEED UPUPUP! - if SETTING.cleanCanvas then gc_discard()end + if discardCanvas then gc_discard()end end end --Fresh power info. if time-lastFreshPow>2.6 then - if showPowerInfo()then + if showPowerInfo then updatePowerInfo() lastFreshPow=time end @@ -830,7 +832,12 @@ local Z={} Z.js=jsState Z.errData=errData -function Z.setIfPowerInfo(func)showPowerInfo=func end +function Z.setPowerInfo(bool)showPowerInfo=bool end + +function Z.setCleanCanvas(bool)discardCanvas=bool end + +function Z.setFrameMul(n)frameMul=n end +function Z.setClickFX(bool)showClickFX=bool end --[Warning] Color and line width is uncertain value, set it in the function. function Z.setCursor(func)drawCursor=func end diff --git a/Zframework/stringExtend.lua b/Zframework/stringExtend.lua index fbb62689..c01081f9 100644 --- a/Zframework/stringExtend.lua +++ b/Zframework/stringExtend.lua @@ -6,7 +6,7 @@ local find,sub,gsub,upper=string.find,string.sub,string.gsub,string.upper local char,byte=string.char,string.byte --"Replace dollars", replace all $n with ... -function string.repD(str,...) +function STRING.repD(str,...) local l={...} for i=#l,1,-1 do str=gsub(str,'$'..i,l[i]) @@ -15,7 +15,7 @@ function string.repD(str,...) end --"Scan arg", scan if str has the arg (format of str is like "-json -q", arg is like "-q") -function string.sArg(str,switch) +function STRING.sArg(str,switch) if find(str.." ",switch.." ")then return true end diff --git a/main.lua b/main.lua index 5b07722d..7f05d6a6 100644 --- a/main.lua +++ b/main.lua @@ -71,6 +71,8 @@ mStr=GC.mStr mText=GC.simpX mDraw=GC.draw Snd=SFX.playSample +string.repD=STRING.repD +string.sArg=STRING.sArg --Delete all naked files (from too old version) FILE.clear('') @@ -123,9 +125,10 @@ end}) table.insert(_LOADTIMELIST_,("Load Parts: %.3fs"):format(TIME()-_LOADTIME_)) --Init Zframework -Z.setIfPowerInfo(function() - return SETTING.powerInfo and LOADED -end) +Z.setCleanCanvas(SETTING.cleanCanvas) +Z.setFrameMul(SETTING.frameMul) +Z.setClickFX(SETTING.clickFX) + do--Z.setCursor local normImg=GC.DO{16,16, {'fCirc',8,8,4}, diff --git a/parts/eventsets/classic_h.lua b/parts/eventsets/classic_h.lua index 3d0219dd..00dd5350 100644 --- a/parts/eventsets/classic_h.lua +++ b/parts/eventsets/classic_h.lua @@ -36,6 +36,7 @@ return{ end, hook_drop=function(P) local D=P.modeData + D.drought=P.lastPiece.id==7 and 0 or D.drought+1 if P.stat.row>=D.target then if D.target==110 then P.gameEnv.drop,P.gameEnv.lock=2,2 diff --git a/parts/eventsets/classic_u.lua b/parts/eventsets/classic_u.lua index e042d944..d33fa2f9 100644 --- a/parts/eventsets/classic_u.lua +++ b/parts/eventsets/classic_u.lua @@ -36,6 +36,7 @@ return{ end, hook_drop=function(P) local D=P.modeData + D.drought=P.lastPiece.id==7 and 0 or D.drought+1 if P.stat.row>=D.target then if D.target==100 then P:win('finish') diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index 04be3d6b..5d77acf7 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -749,7 +749,7 @@ do--function resetGameData(args) BGM.play(type(bgm)=='string'and bgm or type(bgm)=='table'and bgm[math.random(#bgm)]) TEXT.clear() - if GAME.modeEnv.eventset=='royale'then + if GAME.modeEnv.eventSet=='royale'then for i=1,#PLAYERS do PLAYERS[i]:changeAtk(randomTarget(PLAYERS[i])) end diff --git a/parts/language/dict_en.lua b/parts/language/dict_en.lua index 61619015..b511f7b6 100644 --- a/parts/language/dict_en.lua +++ b/parts/language/dict_en.lua @@ -799,6 +799,11 @@ return{ "term", "Vibrate your finger on the controller to achieve faster sideways movement speed than holding it.\nIt is most commonly used on classic Tetris where DAS is rather slow. In most cases, you do not need to hypertap in modern Tetris games, because their DAS is often fast enough.", }, + {"Rolling", + "rolling", + "term", + "Another method of fast-tapping in high-gravity (around 1G) modes (with slow DAS/ARR setting).\nWhen you perform rolling, you fix the position of one hand and the controller, and then tap the back of the controller with fingers on your other hand repeatedly. This method allows even faster moving speeds than hypertapping (see \"Hypertapping\" for more)and requires much less effort.\nThis method was first discovered by Cheez-fish and he has once achieved a tapping speed of more than 20 Hz.", + }, {"Passthrough", "passthrough pingthrough", "term", diff --git a/parts/language/dict_zh.lua b/parts/language/dict_zh.lua index fe02f34d..1cb8bee5 100644 --- a/parts/language/dict_zh.lua +++ b/parts/language/dict_zh.lua @@ -121,190 +121,192 @@ return{ {"Tetr.js", "网页 手机 tetrjs", "game", - "简称屁块,全平台网页版单机方块点击即玩,有对新人比较友好的全自定义(大多数常用功能),手机只能选几个默认按键组,不能自由摆放;别的都很好。", + "网页游戏 | 单机 | 支持移动端\n简称屁块(因为作者网名叫Farter)。设置内容足够专业,模式很多,但画面很简单,几乎没有动画,而且移动端只有几套固定的按键组合(不能自由拖放)。", "http://farter.cn/t", }, {"Tetra Legends", "网页 tl tetralegends", "game", - "简称TL,全平台网页版单机方块点击即玩(推荐使用电脑,移动设备需要外接键盘;第一次加载可能很慢),除了手感不够舒适以外功能比较强大,动效很好看,还把很多别的游戏里不可见的机制可视化了,游戏体验很好。\n\n注:包含节奏模式!\n\n2020年12月,基本确定由于各种原因不再继续开发", + "网页游戏 | 单机 | [服务器在国外可能卡]\n简称TL。单机模式比较丰富,有两个隐藏的节奏模式,并且将一些其他游戏中不可见的机制进行了可视化,动效也很多。在2020年12月,基本确定由于各种原因不再继续开发。", "https://tetralegends.app", }, {"Ascension", "网页 asc ascension", "game", - "简称ASC,全平台网页版单机方块点击即玩(第一次加载可能很慢),使用自己的ASC旋转系统,有不少单机模式(本游戏的堆积模式就来自ASC),对战模式目前处在测试阶段(2021/08/20)", + "网页游戏 | 单机/多人 | [服务器在国外可能卡]\n简称ASC,使用自己的ASC旋转系统,有不少单机模式(本游戏的堆积模式就来自ASC),对战模式目前处在测试阶段(2021/12/15)", "https://asc.winternebs.com", }, {"Jstris", "网页 手机 js jstris", "game", - "简称JS,全平台网页对战方块点击即玩(服务器在国外,国内访问可能很卡)。有常用的科研向单机模式和自定义各种参数的功能,但没有很多强制速度向的挑战项目。都是纯色素材导致画面效果不怎么好。移动端的键位设置并不舒适。", + "网页游戏 | 单机/多人 | 支持移动端 | [服务器在国外可能卡]\n简称JS,有常用的科研向单机模式和自定义各种参数的功能,允许拖放固定尺寸的正方形虚拟按键。画面效果完全没有,一个动画都没有。", "https://jstris.jezevec10.com", }, {"TETR.IO", "网页 io tetrio", "game", - "简称IO,炫酷在线对战方块点击即玩。推荐使用电脑,移动设备需要外接键盘;服务器在国外,国内访问可能超级慢甚至打不开;此外Safari浏览器似乎也打不开。有很科学的排位系统,自定义功能非常全面,同时也提供电脑客户端下载(可以去除广告)。缺点是单机模式非常非常少。", + "网页游戏 | 单机/多人 | [服务器在国外可能卡]\n简称IO,有排位系统和功能全面的自定义模式,单机模式只有三个。有电脑客户端下载(优化性能,无广告)。\n[Safari浏览器似乎打不开]", "https://tetr.io", }, {"Nuketris", "网页 nuketris he", "game", - "在线对战网页方块点击即玩(推荐使用电脑,服务器在国外可能很卡)。\n有几个基础单机模式和1V1排位。", + "网页游戏 | 单机/多人 | [服务器在国外可能卡]\n有几个基础单机模式和1V1排位。", "https://nuketris.herokuapp.com/", }, {"Worldwide Combos", "网页 wwc worldwidecombo", "game", - "简称WWC,网页全世界匹配制1对1方块点击即玩\n(服务器在国外可能很卡)", + "网页游戏 | 单机/多人 | [服务器在国外可能卡]\n简称WWC,全世界匹配制1V1。特色:有录像战,匹配的对手可以不是真人;几种不同风格的大规则;炸弹垃圾行对战。", "https://worldwidecombos.com", }, {"Tetris Friends", "网页 tf tetrisfriends", "game", - "简称TF,已经关服了的网页版方块,曾经是一个不错的对战平台\n现在有人架了私服(怀旧服?)", + "网页游戏 | 单机/多人\n简称TF,已经关服了的网页版方块。以前人比较多,后来官服倒闭了热度下去了,不过现在有人架了私服还可以体验到。", "https://notrisfoes.com", }, {"Tetris.com", "tetris online official", "game", - "tetris.com官网上的俄罗斯方块,只有马拉松一种模式,特色是支持基于鼠标指针位置的智能控制。", + "网页游戏 | 单机 | 支持移动端\ntetris.com官网上的俄罗斯方块,只有马拉松一种模式,特色是支持基于鼠标指针位置的智能控制。", }, {"Tetris Gems", "宝石 tetris online official gems", "game", - "tetris.com官网上的俄罗斯方块,限时1分钟挖掘,有重力机制。\n有三种消除后可以获得不同功能的宝石方块。", + "网页游戏 | 单机\ntetris.com官网上的俄罗斯方块,限时1分钟挖掘,有重力机制。\n有三种消除后可以获得不同功能的宝石方块。", }, {"Tetris Mind Bender", "技能 tetris online official mindbender", "game", - "tetris.com官网上的俄罗斯方块,在马拉松基础上添加了技能,场地上会随机冒出技能方块,消除后会得到各种各样或好或坏的技能。", + "网页游戏 | 单机\ntetris.com官网上的俄罗斯方块,在马拉松基础上添加了技能,场地上会随机冒出技能方块,消除后会得到各种各样或好或坏的技能。", + }, + + --游戏(跨平台) + {"Techmino", + "铁壳米诺 techmino tieke", + "game", + "跨平台 | 单机/多人\n简称Tech,使用LÖVE引擎开发的方块,单机模式和各种设置都很齐全,联机正在逐渐开发中。", + }, + {"Falling Lightblock", + "手机 fl fallinglightblock", + "game", + "跨平台 | 单机/多人\n一个全平台块,横竖屏,有延迟并且不可调。手机支持自定义键位,主要玩法基于NES块设计,也有现代模式。对战为半即时半回合制,无攻击缓冲不可抵消。" + }, + {"Cambridge", + "剑桥 cambridge", + "game", + "跨平台 | 单机\n使用LÖVE引擎开发的一款方块游戏,致力于创建一个轻松高度自定义新模式的方块平台。最初由Joe Zeng开发,于2020.10.8日的0.1.5版开始Milla接管了开发。 — Tetris Wiki.", + }, + {"Nanamino", + "nanamino", + "game", + "Windows/Android | 单机\n块圈玩家自制方块,正在开发中,有一个原创旋转系统。", }, --游戏(街机/类街机) {"TGM", "俄罗斯方块大师 tgm3 tetrisgrandmaster", "game", - "全称Tetris The Grand Master,一个街机平台方块系列,S13/GM等称号出自该系列,可以在Windows平台运行。\n\n其中TGM3目前玩得最普遍,部分模式说明:\n\nMaster:大师模式,有段位评价,拿到更高段位点的要求:非消一的连击和消四,字幕战中消除和通关,每100的前70小于【标准时间,上一个0~70秒数+2】中小的一个,每100总用时不能超过限定值(不然取消上一个方法的加分并反扣点数);到500若没有进标准时间会强制结束游戏(称为铁门);字幕战有两个难度,半隐和全隐,后者必须拿到几乎全部的段位点才能进,消除奖励的段位点也更多。\n\nShirase:死亡模式,类似于techmino中的20G-极限,开局就是高速20G,500和1000有铁门,500开始底下开始涨垃圾行,1000开始出现骨块,1300通关进入大方块字幕战;段位结算:每通100加1段从S1到S13,如果通关了字幕战就会有金色的S13\n\n更多内容详见链接", + "Windows | 单机/本地双人\n全称Tetris The Grand Master,一个街机方块系列,S13/GM等称号出自该系列,可以在Windows平台运行。\n\n其中TGM3目前玩得最普遍,部分模式说明:\n\nMaster:大师模式,有段位评价,拿到更高段位点的要求:非消一的连击和消四,字幕战中消除和通关,每100的前70小于【标准时间,上一个0~70秒数+2】中小的一个,每100总用时不能超过限定值(不然取消上一个方法的加分并反扣点数);到500若没有进标准时间会强制结束游戏(称为铁门);字幕战有两个难度,半隐和全隐,后者必须拿到几乎全部的段位点才能进,消除奖励的段位点也更多。\n\nShirase:死亡模式,类似于techmino中的20G-极限,开局就是高速20G,500和1000有铁门,500开始底下开始涨垃圾行,1000开始出现骨块,1300通关进入大方块字幕战;段位结算:每通100加1段从S1到S13,如果通关了字幕战就会有金色的S13\n\n更多内容详见链接", "http://teatube.ltd/TGMGUIDE/", }, {"DTET", "dtet", "game", - "一个Windows平台方块,基于经典规则加入了20G和一个很强大的旋转系统,手感非常好,但是除了键位都不可自定义,能习惯经典出块方向的玩家可以玩(就是有点难找到,找到了可能还要自己装缺了的DLL文件。)", + "Windows | 单机\n单机方块游戏,基于经典规则加入了20G和一个强大的旋转系统,但是除了键位其他参数都不可自定义。有点难找到,而且找到后可能还要自己补齐缺的DLL文件。", }, {"Heboris", "hb heboris", "game", - "一个Windows平台方块,仿街机,可以模拟多个方块游戏的部分模式。", + "Windows | 单机\n一个仿街机方块游戏,可以模拟多个方块游戏的部分模式。", }, {"Texmaster", "txm texmaster", "game", - "简称Tex,一个Windows平台方块,包含TGM的所有模式,可以用来练习TGM,手感比真版较好,不足的是World规则不完全一样(如软降到底无锁延,踢墙表有细节不同等)。", - }, - {"Cambridge", - "剑桥 cambridge", - "game", - "一个Windows/macOS/Linux平台方块,是基于Lua的方块游戏引擎,致力于创建一个轻松高度自定义新模式的方块平台。最初由Joe Zeng开发,于2020.10.8日的0.1.5版开始Milla接管了开发。\n--Tetris Wiki", + "Windows | 单机\n简称Tex,包含TGM的所有模式,可以用来练习TGM,手感较好,但World规则不完全一样(如软降到底无锁延,踢墙表有细节不同等)。", }, - --游戏(PC/主机/手机) - {"Techmino", - "铁壳米诺 techmino tieke", + --游戏(其他) + {"Tetris Effect", + "效应 tec tetriseffectconnected xiaoyinglianjie", "game", - "简称Tech,Windows/Android/Linux/macOS/iOS方块,单机模式和各种设置都很齐全,联机正在逐渐开发中,输入延迟很小,手感很好。", + "PlayStation, Windows, Oculus Quest, Xbox, Nintendo Switch | 单机/多人\n简称TE,特效方块游戏。不带Connected的基础版本没有多人模式。\n拓展版本Tetris Effect: Connected增加了联网对战,包含Boss战、Zone对战、经典块对战和分数对战四个模式。", }, {"Tetris 99", - "吃鸡 t99 tetris99 ns", + "吃鸡 t99 tetris99", "game", - "简称T99,Nintendo Switch端方块,主玩99人混战的吃鸡模式, 战术比重比较大,胜率不只由玩家在平时1V1时的水平决定。\n也有一些常用单机模式如马拉松等。", + "Nintendo Switch | 单机/多人\n简称T99,主玩99人混战的吃鸡模式,战术比重比较大,胜率不只由玩家在平时1V1时的水平决定。\n也有一些常用单机模式如马拉松等。", }, {"Puyo Puyo Tetris", "噗哟方块 ppt puyopuyotetris", "game", - "简称PPT,多平台方块(Steam PC版相对NS版手感和网络等都不太好),将 Tetris 和 Puyo Puyo 两个下落消除游戏放到一个游戏里, 二者可以对战, 联机单机模式都很多,很有趣。", + "Nintendo Switch, PlayStation, Xbox, Windows | 单机/多人\n简称PPT,将 Tetris 和 Puyo Puyo 两个下落消除游戏放到一个游戏里,二者可以对战,联机单机模式都很多。另有一拓展版本Puyo Puyo Tetris 2。\n[Steam PC版相对NS版手感和网络等都不太好]", }, {"Tetris Online", "top tetris online study", "game", - "简称TO[服务器名首字母],一个Windows平台方块,主要用来6人内对战/单挑/刷每日40L榜/挖掘模式/打机器人。支持自定义DAS/ARR但都不能到0,有一点输入延迟但问题不大,是新人入块圈不错的选择。\n\n现在还开着的服务器有:\n\tTO-P(波兰服,服务器在波兰,可能会卡顿)\n\tTO-S(研究服,研究群群友自己开的服,很稳定,需要进群注册)\n\tTO-X(千雪服,VUP星月千雪于20年9月开的服,还处于实验阶段)", + "Windows | 单机/多人\n简称TO,主要用来6人内对战/单挑/刷每日40L榜/挖掘模式/打机器人。支持自定义DAS/ARR但都不能到0。\n现在还开着的服务器有:\nTO-P(波兰服,服务器在波兰,可能会卡顿)\nTO-S(研究服,研究群群友自己开的服,很稳定,需要进群注册)\nTO-X(千雪服,VUP星月千雪于20年9月开的服,还处于实验阶段)", }, {"Tetra Online", "to tetraonline", "game", - "简称TO,PC方块打开Steam免费下载即玩(现在已经没了),开发团队只有Dr.Ocelot和Mine两个人(都没有很多开发经验),UI部分模仿PPT,手感故意设计为较慢,平时玩无延迟方块的玩家会很不习惯,音乐不错,攻击特效好看。\n\n2020年12月9日收到来自TTC的DCMA警告信于是被迫停止开发,在一段时间后关服并下架。", - }, - {"Tetris Effect", - "效应 tec tetriseffectconnect", - "game", - "简称TE(C),一个Windows/PS/Xbox/Oculus Quest 平台方块, 特效方块游戏,只有单机模式,手感不算太好,想看特效的可以一试, 只是去玩方块的不是很建议。\n\n有一个拓展版本 Tetris Effect: Connected 增加了联网对战, 包含普通对战, Zone 对战,经典对战和Boss战四个模式。", + "Windows, macOS, Linux | 单机/多人\n简称TO,由Dr.Ocelot和Mine两人开发,UI部分模仿了PPT,音乐不错,攻击特效好看。\n故意设计为延迟较多,平时玩无延迟方块的玩家可能会不习惯。\n2020年12月9日收到来自TTC的DCMA警告信于是被迫停止开发,在一段时间后关服并下架Steam。", }, {"Cultris II", "文艺方块 c2 cultris2 cultrisii", "game", - "简称C2,一个Windows/Linux/macOS平台方块,设计基于经典规则出发,但支持自定义DAS/ARR,对战的主要玩法是基于时间的连击,考验玩家速度/Wide打法/挖掘。\n\n注:游戏作者因为太久没有更新Mac版,导致macOS Catalina 以后的系统完全无法运行。", + "Windows/macOS/Linux | 单机/多人\n简称C2,设计基于经典规则出发,支持自定义DAS/ARR,对战的主要玩法是基于时间的连击,考验玩家速度/Wide打法/挖掘。\n注:游戏作者因为太久没有更新Mac版,导致macOS Catalina 以后的系统完全无法运行。", }, {"Nullpomino", "np nullpomino", "game", - "简称NP,一个Windows平台方块,整个游戏自定义程度极高,几乎任何参数都可以自己设置,是一个专业级方块,不太适合新人上手,连菜单都不太好搞清楚。", - }, - {"俄罗斯方块环游记", - "环游记 huanyouji tetris journey", - "game", - "简称环游记,安卓/iOS平台方块,国内第一款正版授权手游方块。有闯关模式、对战模式和几个单机模式。规则同现代方块,可以自定义虚拟按键的大小和位置,但是不能自定义DAS/ARR。\n对战模式每次2分钟,如果时间耗尽双方都没有Top Out就判定打出攻击较高的玩家胜利。", - }, - {"Tetris Blitz", - "闪电战 tetris blitz ea", - "game", - "简称闪电战,EA代理的一款移动端方块,有重力连锁机制,限时2分钟,游戏开始会掉下一堆小方块;持续消行会进入Frenzy模式(场地下方会不断冒出垃圾行,帮助玩家制造大连锁,如果多次落块没有消行会强制结束Frenzy)。有非常多的道具。\n此外这款游戏似乎没有top-out机制。当新出现的方块与场地现有方块重叠时,场地最上方的几行会被自动清除。\n\n已于2020年4月下架。", - }, - {"Tetris (EA)", - "tetris ea", - "game", - "EA代理的一款宇宙主题的移动端方块。有滑动操控和单点触控两种操作模式;除经典的马拉松外还有一个星系模式(地图挖掘),有重力连锁机制,目标是在限定块数内消除所有地图块。\n\n已于2020年4月下架。" - }, - {"Tetris Beat", - "节奏 tetris beat n3twork", - "game", - "N3TWORK代理的一款移动端方块,有马拉松、3分钟限时打分和Royale(最多100人对战)模式。UI比较好看,但不支持自定义键位;而且默认的按钮很小,手感不好。", - }, - {"Tetris (N3TWORK)", - "Tetris n3twork", - "game", - "N3TWORK代理的一款移动端方块,有马拉松、限时打分和Royale(最多99人对战)模式。UI比较好看,但不支持自定义键位;而且默认的按钮很小,手感不好。" - }, - {"Touhoumino", - "东方 车万 偷猴 touhoumino chewan dongfang touhou th", - "game", - "玩家自制Windows平台方块,东方主题,其实就是一个Nullpomino的自带资源包的改版,将东方Project元素结合到俄罗斯方块的游戏,好玩但是难度较大,适合有方块基础并且各项能力都较强的玩家游玩(不然都不知道自己怎么死的)。", - }, - {"Nanamino", - "nanamino", - "game", - "块圈玩家自制Windows/Android平台方块,正在开发中,有一个非常有趣的原创旋转系统。", + "Windows/macOS/Linux | 单机/多人\n简称NP,整个游戏自定义程度极高,几乎任何参数都可以自己设置,是一个专业级方块,不过ui风格比较老,需要全键盘操作,刚开始可能不习惯。", }, {"Misamino", "回合制 misamino", "game", - "块圈玩家自制Windows平台方块,单机1v1,主玩回合制模式,可以自定义AI(自己写的话需要了解接口)。", + "Windows | 单机\n块圈玩家自制方块,单机1v1,主玩回合制模式,可以自定义AI(自己写的话需要了解接口)。", + }, + {"Touhoumino", + "东方 车万 touhoumino chewan dongfang th", + "game", + "Windows | 单机\n块圈玩家自制方块,一个Nullpomino的自带资源包的改版,将东方Project元素与俄罗斯方块结合。马拉松模式结合了东方Project里的”符卡”机制,需要在一定时间内达成目标分数才能击破。\n难度较大,适合有方块基础并且各项能力都较强的玩家游玩(不然都不知道自己怎么死的)。", + }, + {"Tetris Blitz", + "闪电战 tetris blitz ea", + "game", + "iOS/Android | 单机/多人\n简称闪电战,EA代理的一款移动端方块,有重力连锁机制,限时2分钟,游戏开始会掉下一堆小方块;持续消行会进入Frenzy模式(场地下方会不断冒出垃圾行,帮助玩家制造大连锁,如果多次落块没有消行会强制结束Frenzy)。有非常多的道具。\n当新出现的方块与场地现有方块重叠时,场地最上方的几行会被自动清除,游戏不结束。已于2020年4月下架。", + }, + {"Tetris (EA)", + "tetris ea", + "game", + "iOS/Android | 单机\nEA代理的一款宇宙主题的移动端方块。有滑动操控和单点触控两种操作模式;除经典的马拉松外还有一个星系模式(地图挖掘),有重力连锁机制,目标是在限定块数内消除所有地图块。\n已于2020年4月下架。", + }, + {"Tetris Beat", + "节奏 tetris beat n3twork", + "game", + "iOS | 单机\nN3TWORK代理的一款移动端方块。除了马拉松以外游戏还有一个“Beat”模式,但只需根据BGM的节奏落块就可以得到额外分数。\n[特效比较瞎眼,不支持自定义键位,而且默认的按钮也很小导致控制也不是很舒服]", + }, + {"Tetris (N3TWORK)", + "Tetris n3twork", + "game", + "iOS/Android | 单机/多人\nN3TWORK代理的一款移动端方块,有马拉松、3分钟限时打分和Royale(最多100人对战)模式。\n[UI设计比较不错,但不支持自定义键位,而且默认的按钮也很小导致控制也不是很舒服]", + }, + {"俄罗斯方块环游记", + "环游记 huanyouji tetris journey", + "game", + "iOS/Android | 单机/多人\n简称环游记,国内第一款正版授权手游方块。有闯关模式、对战模式和几个单机模式。闯关模式有各种各样有趣规则大多数有重力连锁,对战规则同现代方块,可以自定义虚拟按键的大小和位置,但是不能自定义DAS/ARR。", }, {"JJ块", "手机 jj gougou", "game", - "JJ棋牌平台下一个休闲游戏,安卓百度“JJ比赛”官网下载平台后可以找到(找不到的原因是iOS系统或者没在官网下载或者被限制不可直接访问游戏)。竖屏,输入延迟很小超流畅,可自定义DAS/ARR/20G软降,简单自定义键位,无Hold,没有B2B,无攻击缓冲不可抵消,每次攻击上限为4,连击较强,其他同现代方块。", - }, - {"Falling Lightblock", - "手机 fl fallinglightblock", - "game", - "一个全平台块,横竖屏,有延迟并且不可调。手机支持自定义键位,主要玩法基于NES块设计,也有现代模式。对战为半即时半回合制,无攻击缓冲不可抵消。", + "Android | 单机/多人\nJJ棋牌平台下一个休闲游戏,安卓百度“JJ比赛”官网下载平台后可以找到(找不到的原因是iOS系统或者没在官网下载或者被限制不可直接访问游戏)。竖屏,输入延迟很小,可自定义DAS/ARR/20G软降,简单自定义键位,无Hold,没有B2B,无攻击缓冲不可抵消,每次攻击上限为4,连击较强,其他同现代方块。", }, {"火拼俄罗斯", "火拼俄罗斯 腾讯 huopin qq tencent", "game", - "腾讯游戏大厅的方块, 场地12列, 打字的 DAS 和 ARR, 1 Next ,无 Hold, 攻击途径只有消4打3、 消3打2, 垃圾行为国际象棋棋盘式, 几乎不可能挖掘。", + "Windows | 多人\n腾讯游戏大厅的方块,场地12列,打字的 DAS 和 ARR,1 Next无 Hold,攻击途径只有消4打3、 消3打2,垃圾行为国际象棋棋盘式,几乎不可能挖掘。", }, --术语(缩写) @@ -820,6 +822,11 @@ return{ "term", "快速震动手指,实现比长按更快速+灵活的高速单点移动,主要在经典块的高难度下(因为das不可调而且特别慢,高速下很容易md导致失败,此时手动连点就比自动移动更快)或者受特殊情况限制不适合用自动移动时使用。会使用这个技术的人称为“Hypertapper”。", }, + {"轮指 Rolling", + "轮指 rolling lunzhi liandian", + "term", + "另一种快速连点方法,用于das/arr设置非常慢时的高重力(1G左右)模式。\n先把手柄(键盘……可能也行吧)悬空摆好,比如架在腿上,要连点某个键的时候一只手虚按按键,另外一只手的几根手指轮流敲打手柄背面,“反向按键”实现连点。这种控制方法可以让玩家更轻松地获得比直接抖动手指的hypertap(详见超连点词条)更快的控制速度。\n此方法最先由Cheez-fish发明,他本人则使用rolling达到过超过20Hz的点击频率。", + }, {"穿透 Passthrough", "穿透 passthrough pingthrough chuantou", "term", diff --git a/parts/language/lang_es.lua b/parts/language/lang_es.lua index 7141b600..2153d49e 100644 --- a/parts/language/lang_es.lua +++ b/parts/language/lang_es.lua @@ -1,25 +1,25 @@ return{ fallback='en', sureQuit="Pulsa de nuevo para salir", - -- sureReset="Press again to reset", - -- sureDelete="Press again to delete", + sureReset="Pulsa de nuevo para reiniciar", + sureDelete="Pulsa de nuevo para borrar", newDay="[Anti-adicción] ¡Nuevo día, nuevo comienzo!", playedLong="[Anti-adicción] Estuviste jugando un buen rato hoy. Recuerda descansar de vez en cuando.", playedTooMuch="[Anti-adicción] ¡Has jugado mucho por hoy! No puedes jugar más.", - -- settingWarn="Modifing uncommon setting, be careful!", + settingWarn="¡Ten cuidado con modificar esto!", atkModeName={"Al azar","Medallas","KOs","Atacantes"}, royale_remain="$1 Jugadores Restantes", cmb={nil,"Combo de 1","Combo de 2","Combo de 3","Combo de 4","Combo de 5","Combo de 6","Combo de 7","Combo de 8","Combo de 9","¡Combo de 10!","¡Combo de 11!","¡Combo de 12!","¡Combo de 13!","¡Combo de 14!","¡Combo de 15!","¡Combo de 16!","¡Combo de 17!","¡Combo de 18!","¡Combo de 19!","MEGACOMBO"}, spin="-spin", clear={"Single","Doble","Triple","Techrash","Pentacrash","Hexacrash","Heptacrash","Octacrash","Nonacrash","Decacrash","Undecacrash","Dodecacrash","Tridecacrash","Tetradecacrash","Pentadecacrash","Hexadecacrash","Heptadecacrash","Octadecacrash","Nonadecacrash","Ultracrash","Impossicrash"}, - -- cleared="$1 lines", + cleared="$1 líneas", mini="Mini",b2b="B2B ",b3b="B2B2B ", PC="Perfect Clear",HPC="Half Clear", replaying="[Repetición]", tasUsing="[TAS]", - -- stage="Stage $1 completed", + stage="Fase $1 Completada", great="¡Genial!", awesome="¡Fantástico!", almost="¡Casi!", @@ -28,7 +28,7 @@ return{ speedup="¡Más rápido!", missionFailed="Misión Fallida", - speedLV="Vel. de juego", + speedLV="Veloc. de juego", piece="Piezas",line="Líneas",atk="Ataque",eff="Eficiencia", rpm="RPM",tsd="TSD", grade="Grado",techrash="Techrash", @@ -50,25 +50,25 @@ return{ page="Página:", - -- cc_fixed="CC is incompatible with fixed sequences", - -- cc_swap="CC is incompatible with swap holdmode", + cc_fixed="CC no es compatible con piezas prefijadas", + cc_swap="CC no es compatible con Swap Hold", ai_prebag="La IA no es compatible con piezas que no sean Tetrominos.", ai_mission="La IA no es compatible con misiones personalizadas.", switchSpawnSFX="Habilita los sonidos de aparición de las piezas ;)", needRestart="Reinicia Techmino para que los cambios tengan efecto.", - -- loadError_errorMode="'$1' loading failed: no load mode '$2'", - -- loadError_read="'$1' loading failed: read failed", - -- loadError_noFile="'$1' loading failed no file:", - -- loadError_other="'$1' loading failed: $2", - -- loadError_unknown="'$1' loading failed: unknown reason", + loadError_errorMode="'$1' Error al cargar: no hay modo '$2'", + loadError_read="'$1' Error al cargar: error de lectura", + loadError_noFile="'$1' Error al cargar, no existe el archivo:", + loadError_other="'$1' Error al cargar: $2", + loadError_unknown="'$1' Error al cargar: desconocido", - -- saveError_duplicate="'$1' saving failed: duplicated filename", - -- saveError_encode="'$1' saving failed: encode failed", - -- saveError_other="'$1' saving failed: $2", - -- saveError_unknown="'$1' saving failed: unknown reason", + saveError_duplicate="'$1' Error al guardar: archivo duplicado", + saveError_encode="'$1' Error al guardar: error de encoding", + saveError_other="'$1' Error al guardar: $2", + saveError_unknown="'$1' Error al guardar: desconocido", - -- copyDone="Copied!", + copyDone="¡Copiado con éxito!", saveDone="Datos guardados", exportSuccess="Exportado con éxito", importSuccess="Importado con éxito", @@ -90,7 +90,7 @@ return{ replayBroken="No se puede cargar la repetición", - -- dictNote="==Copied from TetroDictionary==", + dictNote="==Copia de TetroDictionary==", getNoticeFail="Error al buscar novedades.", oldVersion="¡Está disponible la nueva versión $1!", @@ -128,12 +128,12 @@ return{ chatHistory="------Nuevos mensajes------", -- searchModeHelp="Type to search", - -- keySettingHelp="Press to bind key\nescape: cancel\nbackspace: delete", - -- customBGhelp="Drop image file here to apply custom background", - -- customBGloadFailed="Unsupport image format for custom background", + keySettingHelp="Pulsa la tecla a mapear\nEsc.: Cancelar\nBackspace: Borrar", + customBGhelp="Suelta una imagen aquí para aplicarla de fondo", + customBGloadFailed="Formato de imagen no soportado", errorMsg="Ha ocurrido un error y Techmino necesita reiniciarse.\nSe creó un registro de error, puedes enviarlo al autor.", - -- tryAnotherBuild="[Invalid UTF-8] If you are on Windows, try downloading Techmino-win32 or Techmino-win64 (different from what you are using now).", + tryAnotherBuild="[UTF-8 Inválido] Si estás usando Windows, intenta descargar Techmino-win32 o Techmino-win64 (el que no estés usando ahora).", -- modInstruction="", -- modInfo={},--See lang_en.lua @@ -174,7 +174,7 @@ return{ "Descargas desde otros sitios pueden contener malware/viruses, y en smartphones sólo requiere permisos de internet y vibración.", "El autor no se responabiliza por daños ocasionados debido a modificaciones del juego.", FNNS and"/"or"Por favor descarga las últimas versiones desde los sitios oficiales. El juego es gratuito", - -- FNNS and"/"or"Check Zictionary for more", + FNNS and"/"or"Ve el Zictionary (en inglés) para más info", }, staff={ "Autor:MrZ Email: 1046101471@qq.com", @@ -273,8 +273,8 @@ return{ lock="Retraso de Bloqueo", wait="Retraso de Spawneo", fall="Retraso de Línea", - -- hang="Death Delay", - -- hurry="ARE Interruption", + hang="Retraso de Muerte", + hurry="Interrupc. de ARE", capacity="Capacidad", create="Crear", @@ -282,14 +282,14 @@ return{ ospin="O-Spin", fineKill="100% Finesse", b2bKill="No Romper B2B ", - -- lockout="Fail when lock out", + lockout="Derrota al ocurrir Lock Out", easyFresh="Reinicio de Bloqueo Normal", deepDrop="Deep Drop", bone="Bone Block", - -- eventSet="Rule Set", + eventSet="Ruleset", - -- holdMode="Hold Mode", + holdMode="Modo de Reserva", nextCount="Siguiente", holdCount="Reserva", infHold="Reserva Inft.", @@ -298,13 +298,13 @@ return{ net_game={ ready="Estoy Listo", spectate="Espectear", - -- cancel="Cancel ready", + cancel="Esperar", }, setting_game={ title="Ajustes del Juego", graphic="←Video", sound="Sonido→", - -- style="Style", + style="Estilo", ctrl="Sensibilidad", key="Teclas", @@ -313,10 +313,10 @@ return{ reTime="Retraso de Inicio", RS="Sistema de Rotación", menuPos="Pos. del Botón de Menú", - -- sysCursor="Use system cursor", + sysCursor="Usar cursor del sistema", autoPause="Pausar cuando la ventana no está enfocada", autoSave="Autograbar Récords", - -- autoLogin="Auto Login on Start", + autoLogin="Autologueo al Iniciar", simpMode="Modo Sencillo", }, setting_video={ @@ -344,13 +344,13 @@ return{ atkFX="FX Vis. de Ataque", frame="Ratio de FPSs(%)", - -- FTlock="Frame-Time Lock", + FTlock="Bloqueo por frames", text="Texto de Acciones", score="Puntaje en Pantalla", bufferWarn="Alerta de Búfer", showSpike="Contador de Spike", - -- nextPos="Spawn Preview", + nextPos="Prever Spawn de Pzas.", highCam="Cám. Vista Aérea", warn="Alerta de Peligro", @@ -359,9 +359,9 @@ return{ clean="Fast Draw", fullscreen="Pant. Completa", - -- bg_on="Normal B.G.", - -- bg_on="No B.G.", - -- bg_custom="Use Custom B.G.", + bg_on="Fondo Normal", + bg_off="Sin Fondo", + bg_custom="Fondo Personalizado", blockSatur="Saturac. de los Bloques", fieldSatur="Saturac. del Tablero", @@ -371,7 +371,7 @@ return{ game="←Juego", graphic="Video→", - -- mainVol="Main Volume", + mainVol="Vol. Principal", bgm="BGM", sfx="SFX", stereo="Estéreo", @@ -380,9 +380,9 @@ return{ vib="Vibración", voc="Voces", - -- autoMute="Mute while unfocused", + autoMute="Silenciar cuando la ventana no está enfocada", fine="Sonido de Error de Finesse", - -- sfxPack="SFX Pack", + sfxPack="Pack de SFX", vocPack="Pack de Voces", apply="Aplicar", }, @@ -460,8 +460,8 @@ return{ lock="Retraso de Bloqueo", wait="Retraso de Spawneo", fall="Retraso de Línea", - -- hang="Death Delay", - -- hurry="ARE Interruption", + hang="Retraso de Muerte", + hurry="Interrupc. de ARE", bg="Fondo", bgm="Música", @@ -478,9 +478,9 @@ return{ sequence="Editar Secuencia (S)", mission="Editar Misiones (M)", - -- eventSet="Rule Set", + eventSet="Ruleset", - -- holdMode="Hold Mode", + holdMode="Modo de Reserva", nextCount="Siguiente", holdCount="Reserva", infHold="Reserva Inft.", @@ -499,7 +499,7 @@ return{ ospin="O-Spin", fineKill="100% Finesse", b2bKill="No Romper B2B ", - -- lockout="Fail when lock out", + lockout="Derrota al ocurrir Lock Out", easyFresh="Reinicio de Bloqueo Normal", deepDrop="Deep Drop", bone="Bone Block", @@ -534,7 +534,7 @@ return{ about={ staff="Staff", his="Hist. de Acts.", - -- legals="Legals", + legals="Legalidades", }, dict={ title="TetroDictionary", @@ -558,7 +558,7 @@ return{ sfx="SFX", voc="Voces", music="BGMs", - -- label="label", + label="Etiq.", }, login={ title="Entrar", @@ -645,7 +645,7 @@ return{ ['dig_100l']= {"Queso", "100L", "Limpia 100 líneas de queso."}, ['dig_400l']= {"Queso", "400L", "Limpia 400 líneas de queso."}, ['drought_n']= {"Sequía", "100L", "¡Sin piezas I!"}, - ['drought_l']= {"Sequía+", "100L", "Guat de foc..."}, + ['drought_l']= {"Sequía+", "100L", "Qué es esto..."}, ['marathon_n']= {"Maratón", "Normal", "Maratón de 200 líneas con velocidad en aumento."}, ['marathon_h']= {"Maratón", "Difícil", "Maratón de 200 líneas a velocidad máxima."}, ['solo_e']= {"VS.", "Fácil", "¡Derrota a la CPU!"}, @@ -653,12 +653,12 @@ return{ ['solo_h']= {"VS.", "Difícil", "¡Derrota a la CPU!"}, ['solo_l']= {"VS.", "Lunático", "¡Derrota a la CPU!"}, ['solo_u']= {"VS.", "Supremo", "¡Derrota a la CPU!"}, - ['techmino49_e']= {"Tech 49", "Fácil", "Batalla de 49 jugadores. ¡El último en pie gana!"}, - ['techmino49_h']= {"Tech 49", "Difícil", "Batalla de 49 jugadores. ¡El último en pie gana!"}, - ['techmino49_u']= {"Tech 49", "Supremo", "Batalla de 49 jugadores. ¡El último en pie gana!"}, - ['techmino99_e']= {"Tech 99", "Fácil", "Batalla de 99 jugadores. ¡El último en pie gana!"}, - ['techmino99_h']= {"Tech 99", "Difícil", "Batalla de 99 jugadores. ¡El último en pie gana!"}, - ['techmino99_u']= {"Tech 99", "Supremo", "Batalla de 99 jugadores. ¡El último en pie gana!"}, + ['techmino49_e']= {"Tech 49", "Fácil", "Batalla de 49 jugadores.\n¡El último en pie gana!"}, + ['techmino49_h']= {"Tech 49", "Difícil", "Batalla de 49 jugadores.\n¡El último en pie gana!"}, + ['techmino49_u']= {"Tech 49", "Supremo", "Batalla de 49 jugadores.\n¡El último en pie gana!"}, + ['techmino99_e']= {"Tech 99", "Fácil", "Batalla de 99 jugadores.\n¡El último en pie gana!"}, + ['techmino99_h']= {"Tech 99", "Difícil", "Batalla de 99 jugadores.\n¡El último en pie gana!"}, + ['techmino99_u']= {"Tech 99", "Supremo", "Batalla de 99 jugadores.\n¡El último en pie gana!"}, ['round_e']= {"Por Turnos", "Fácil", "Modo ajedrez."}, ['round_n']= {"Por Turnos", "Normal", "Modo ajedrez."}, ['round_h']= {"Por Turnos", "Difícil", "Modo ajedrez."}, @@ -666,15 +666,15 @@ return{ ['round_u']= {"Por Turnos", "Supremo", "Modo ajedrez."}, ['master_n']= {"Master", "Normal", "Para principiantes en 20G"}, ['master_h']= {"Master", "Difícil", "¡Desafío profesional de 20G!"}, - -- ['master_m']= {"Master", "M21", "For 20G Masters."}, - ['master_final']= {"Master", "FINAL", "El verdadero 20G Supremo: el final es inalcanzable."}, - ['master_ex']= {"GrandMaster", "EXTRA", "Para ser un gran maestro, acepta este desafío"}, - ['strategy_e']= {"Strategy", "EASY", "Fast 20G decision"}, - ['strategy_h']= {"Strategy", "HARD", "Fast 20G decision"}, - ['strategy_u']= {"Strategy", "ULTIMATE", "Fast 20G decision"}, - -- ['strategy_e_plus']={"Strategi", "MUDAH+", "Keputusan 20G cepat"}, - -- ['strategy_h_plus']={"Strategi", "SULIT+", "Keputusan 20G cepat"}, - -- ['strategy_u_plus']={"Strategi", "TERAKHIR+", "Keputusan 20G cepat"}, + ['master_m']= {"Master", "M21", "Para Maestros del 20G."}, + ['master_final']= {"Master", "FINAL", "El verdadero 20G Supremo:\nel final es inalcanzable."}, + ['master_ex']= {"GrandMaster", "EXTRA", "Para ser un gran maestro,\nacepta este desafío"}, + ['strategy_e']= {"Strategy", "EASY", "Decisiones rápidas en 20G."}, + ['strategy_h']= {"Strategy", "HARD", "Decisiones rápidas en 20G."}, + ['strategy_u']= {"Strategy", "ULTIMATE", "Decisiones rápidas en 20G."}, + ['strategy_e_plus']={"Strategi", "MUDAH+", "Decisiones rápidas en 20G."}, + ['strategy_h_plus']={"Strategi", "SULIT+", "Decisiones rápidas en 20G."}, + ['strategy_u_plus']={"Strategi", "TERAKHIR+", "Decisiones rápidas en 20G."}, ['blind_e']= {"A Ciegas", "Parcial", "Para novatos."}, ['blind_n']= {"A Ciegas", "Total", "Para jugadores intermedios."}, ['blind_h']= {"A Ciegas", "Inmediato", "Para jugadores experimentados"}, @@ -695,7 +695,7 @@ return{ ['defender_l']= {"Defensor", "Lunático", "¡Practica la defensa!"}, ['dig_h']= {"Downstack", "Difícil", "¡Practica el downstackeo!"}, ['dig_u']= {"Downstack", "Supremo", "¡Practica el downstackeo!"}, - -- ['clearRush']= {"Clear Rush", "NORMAL", "All-spin tutorial!\n[Under construction]"}, + ['clearRush']= {"Clear Rush", "NORMAL", "¡Tutorial de Allspins!\n[En construcción]"}, ['c4wtrain_n']= {"Entrenar C4W", "Normal", "Combos infinitos."}, ['c4wtrain_l']= {"Entrenar C4W", "Lunático", "Combos infinitos."}, ['pctrain_n']= {"Entrenar PC", "Normal", "Modo sencillo para practicar Perfect Clears."}, @@ -711,7 +711,7 @@ return{ ['tech_l']= {"Tech", "Lunático", "¡Mantén el B2B!"}, ['tech_l_plus']= {"Tech", "Lunático+", "¡Sólo se permiten Spins y PCs!"}, ['tech_finesse']= {"Tech", "Finesse", "¡No cometas errores de Finesse!"}, - ['tech_finesse_f']= {"Tech", "Finesse+", "Sin errores de finesse, ¡pero tampoco clears normales!"}, + ['tech_finesse_f']= {"Tech", "Finesse+", "Sin errores de finesse,\n¡pero tampoco clears normales!"}, ['tsd_e']= {"Desafío de TSD", "Fácil", "¡Sólo se permiten T-Spin Dobles!"}, ['tsd_h']= {"Desafío de TSD", "Difícil", "¡Sólo se permiten T-Spin Dobles!"}, ['tsd_u']= {"Desafío de TSD", "Supremo", "¡Sólo se permiten T-Spin Dobles!"}, @@ -720,7 +720,7 @@ return{ ['backfire_l']= {"Retorno", "Lunático", "Lidia con tus propias líneas basura."}, ['backfire_u']= {"Retorno", "Supremo", "Lidia con tus propias líneas basura."}, ['sprintAtk']= {"Sprint", "100L - Ataque", "¡Envía 100 líneas de ataque!"}, - -- ['sprintEff']= {"Sprint", "Efficiency", "Send more attack in 40lines!"}, + ['sprintEff']= {"Sprint", "Efficiency", "¡Envía ataque eficiente en 40 líneas!"}, ['zen']= {'Zen', "200L", "200 líneas sin límite de tiempo."}, ['ultra']= {'Ultra', "Extra", "¡Consigue el mayor puntaje posible en 2 minutos!"}, ['infinite']= {"Infinito", "", "Modo Sandbox."}, diff --git a/parts/language/lang_fr.lua b/parts/language/lang_fr.lua index 0f6d0a90..e69cc469 100644 --- a/parts/language/lang_fr.lua +++ b/parts/language/lang_fr.lua @@ -357,7 +357,7 @@ return{ fullscreen="Plein écran", -- bg_on="Normal B.G.", - -- bg_on="No B.G.", + -- bg_off="No B.G.", -- bg_custom="Use Custom B.G.", -- blockSatur="Block Saturation", @@ -714,7 +714,7 @@ return{ ['tech_l']= {"Tech", "LUNATIQUE", "Gardez le B2B !"}, ['tech_l_plus']= {"Tech", "LUNATIQUE+", "Spin & PC uniquement"}, ['tech_finesse']= {"Tech", "FINESSE", "Pas d'erreurs de finesse !"}, - ['tech_finesse_f']={"Tech", "FINESSE+", "Pas de nettoyages normaux, Pas d'erreurs de finesse !"}, + ['tech_finesse_f']={"Tech", "FINESSE+", "Pas de nettoyages normaux,\nPas d'erreurs de finesse !"}, ['tsd_e']= {"TSD Challenge", "FACILE", "T-spin doubles uniquement !"}, ['tsd_h']= {"TSD Challenge", "DIFFICILE", "T-spin doubles uniquement !"}, ['tsd_u']= {"TSD Challenge", "ULTIME", "T-spin doubles uniquement !"}, diff --git a/parts/language/lang_pt.lua b/parts/language/lang_pt.lua index e0bd48af..c558e46d 100644 --- a/parts/language/lang_pt.lua +++ b/parts/language/lang_pt.lua @@ -382,7 +382,7 @@ return{ fullscreen="Tela cheia", -- bg_on="Normal B.G.", - -- bg_on="No B.G.", + -- bg_off="No B.G.", -- bg_custom="Use Custom B.G.", -- blockSatur="Block Saturation", @@ -745,7 +745,7 @@ return{ ['tech_l']= {"Tech", "LUNÁTICO", "Não quebre o B2B!"}, ['tech_l_plus']= {"Tech", "LUNÁTICO+", "Apenas spins e PC"}, ['tech_finesse']= {"Tech", "FINESSE", "Não erre a destreza!"}, - ['tech_finesse_f']= {"Tech", "FINESSE+", "Sem limpas normais, não erre a destreza!"}, + ['tech_finesse_f']= {"Tech", "FINESSE+", "Sem limpas normais,\nnão erre a destreza!"}, ['tsd_e']= {"Desafio TSD", "FÁCIL", "Apenas T-spin-doubles!"}, ['tsd_h']= {"Desafio TSD", "DIFÍCIL", "Apenas T-spin-doubles!"}, ['tsd_u']= {"Desafio TSD", "ULTIMATE", "Apenas T-spin-doubles!"}, diff --git a/parts/language/lang_zh.lua b/parts/language/lang_zh.lua index fe1bee65..17607684 100644 --- a/parts/language/lang_zh.lua +++ b/parts/language/lang_zh.lua @@ -834,7 +834,6 @@ return{ "混合消除即将到来!", "架空消除即将到来!", "建议使用双手游玩", - "据某个群友描述玩了Techmino之后打字速度变快了", "绝大多数按钮上的图标是调用Unicode私用区里的自制字符实现的", "科技骨牌 你的创新式块堆栈业务技术管理器", "块东V共荣", @@ -943,6 +942,26 @@ return{ "Z酱是谁", "Z酱只是个写代码的,懂什么方块", "Z块等身抱枕来一个(x", + "时间碎片[000] 2021/11/21加入这个版块", + "时间碎片[001] V0.0.091726加入TRS旋转系统", + "时间碎片[002] V0.7.9加入O-spin", + "时间碎片[003] V0.7.19加入语音系统", + "时间碎片[004] V0.7.22加入平滑下落", + "时间碎片[005] V0.8.5加入模式地图", + "时间碎片[006] V0.8.19加入五连块", + "时间碎片[007] V0.9.0加入自定义序列和模式", + "时间碎片[008] V0.10.0加入录像回放", + "时间碎片[009] V0.11.1加入小z词典", + "时间碎片[010] V0.12.2加入mod系统", + "时间碎片[011] V0.13.0联网对战测试", + "时间碎片[012] V0.13.2加入任意场地高度", + "时间碎片[013] V0.13.3加入控制台", + "时间碎片[014] V0.14.4加入第一首非Beepbox制作的BGM", + "时间碎片[015] V0.14.5加入第一首社区玩家自制BGM", + "时间碎片[016] V0.15.5加入录像回放菜单", + "时间碎片[017] V0.16.0加入BIRS", + "时间碎片[018] V0.16.2加入打击垫样式的音效室", + "时间碎片[019] V0.17.0加入手柄的摇杆和扳机支持", "豆知识[001]总共有400多条tip哦", "豆知识[002]背景影响游玩?可以去设置关闭", "豆知识[003]方块默认出现的方向都是重心在下哦(如果你没乱动设置", @@ -1053,13 +1072,8 @@ return{ "健康小贴士[03]戴耳机(尤其是半入耳式)时音量千万别拉满,不然真的会影响听力(虽然很慢)", "健康小贴士[04]不要熬夜,真的会猝死", "健康小贴士[05]长期睡眠不足会引起不可逆的脑损伤(变傻)", - "Z思辨[01]《教育的力量》", - "Z思辨[02]《学习的意义》", - "Z思辨[03]《练习的力量》", - "Z思辨[04]《知识的力量》", - "Z思辨[05]《梦想的价值》", - "Z思辨[06]《天赋的力量》", - "Z思辨[07]《游戏的意义》", + "群友名言[001]“玩了Techmino之后发现打字速度变快了”", + "群友名言[002]“我要陪伴着tech一步步成长,然后就可以疯狂的享受他”", "Frt评[01]“成天被夸赞‘好玩’的”", "Frt评[02]“可以形成方块圈子小中心话题,同作者一起衍生一些概念与梗的”", "Frt评[03]“论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(”", @@ -1087,26 +1101,6 @@ return{ "今日数学[13]sin²α-cos²β=-C(α+β)C(α-β)", "今日数学[14]sin²α-sin²β=S(α+β)S(α-β)", "今日数学[15]sin2α=2SαCα", - "时间碎片[000] 2021/11/21加入这个版块", - "时间碎片[001] V0.0.091726加入TRS旋转系统", - "时间碎片[002] V0.7.9加入O-spin", - "时间碎片[003] V0.7.19加入语音系统", - "时间碎片[004] V0.7.22加入平滑下落", - "时间碎片[005] V0.8.5加入模式地图", - "时间碎片[006] V0.8.19加入五连块", - "时间碎片[007] V0.9.0加入自定义序列和模式", - "时间碎片[008] V0.10.0加入录像回放", - "时间碎片[009] V0.11.1加入小z词典", - "时间碎片[010] V0.12.2加入mod系统", - "时间碎片[011] V0.13.0联网对战测试", - "时间碎片[012] V0.13.2加入任意场地高度", - "时间碎片[013] V0.13.3加入控制台", - "时间碎片[014] V0.14.4加入第一首非Beepbox制作的BGM", - "时间碎片[015] V0.14.5加入第一首社区玩家自制BGM", - "时间碎片[016] V0.15.5加入录像回放菜单", - "时间碎片[017] V0.16.0加入BIRS", - "时间碎片[018] V0.16.2加入打击垫样式的音效室", - "时间碎片[019] V0.17.0加入手柄的摇杆和扳机支持", "Z哲[01]方块教会我们,合群了就会消失,……", "Z哲[02]假如生活欺骗了你,不要悲伤,不要心急,还有块陪着你", "Z哲[03]……,合群了就会消失,不合群世界毁灭(指game over", @@ -1123,6 +1117,14 @@ return{ "Z哲[14]不希望激烈的零和竞争充斥整个游戏", "Z哲[15]尝试手动控制圈子规模扩大速度,希望能对维持社区氛围有帮助", "Z哲[16]圈子大了真的会……吗?我们可以试着做些什么,起码让这个过程慢一点", + "Z思辨[01]《教育的力量》", + "Z思辨[02]《学习的意义》", + "Z思辨[03]《练习的力量》", + "Z思辨[04]《知识的力量》", + "Z思辨[05]《梦想的价值》", + "Z思辨[06]《天赋的力量》", + "Z思辨[07]《游戏的意义》", + "Z思辨[08]《自强与竞争》", "Z推[01]东方Project好玩!", "Z推[02]Minecraft好玩!", "Z推[03]Osu!好玩!", diff --git a/parts/player/player.lua b/parts/player/player.lua index 52eae105..77992257 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -318,8 +318,8 @@ function Player:act_softDrop() self:act_down1() end self:checkTouchSound() - elseif self.gameEnv.deepdrop then - self:_deepdrop() + elseif self.gameEnv.deepDrop then + self:_deepDrop() end end end @@ -408,8 +408,8 @@ function Player:act_down1() self.curY=self.curY-1 self:freshBlock('fresh') self.spinLast=false - elseif self.gameEnv.deepdrop then - self:_deepdrop() + elseif self.gameEnv.deepDrop then + self:_deepDrop() end end end @@ -422,8 +422,8 @@ function Player:act_down4() self.curY,self.ghoY=self.ghoY,ghoY0 self:freshBlock('fresh') self.spinLast=false - elseif self.gameEnv.deepdrop then - self:_deepdrop() + elseif self.gameEnv.deepDrop then + self:_deepDrop() end end end @@ -436,8 +436,8 @@ function Player:act_down10() self.curY,self.ghoY=self.ghoY,ghoY0 self:freshBlock('fresh') self.spinLast=false - elseif self.gameEnv.deepdrop then - self:_deepdrop() + elseif self.gameEnv.deepDrop then + self:_deepDrop() end end end diff --git a/parts/scenes/custom_field.lua b/parts/scenes/custom_field.lua index ba54e7ee..35d47e86 100644 --- a/parts/scenes/custom_field.lua +++ b/parts/scenes/custom_field.lua @@ -140,6 +140,7 @@ function scene.mouseMove(x,y) end end function scene.mouseDown(x,y,k) + if k>3 then return end if not curPen then curPen=k elseif curPen~=k then @@ -149,6 +150,7 @@ function scene.mouseDown(x,y,k) scene.mouseMove(x,y) end function scene.mouseUp(_,_,k) + if k>3 then return end if curPen==k then _pDraw() curPen=false diff --git a/parts/scenes/load.lua b/parts/scenes/load.lua index f78174e2..6bc5ad23 100644 --- a/parts/scenes/load.lua +++ b/parts/scenes/load.lua @@ -50,6 +50,7 @@ local loadingThread=coroutine.wrap(function() VOC.play('welcome') THEME.fresh() LOADED=true + Z.setPowerInfo(SETTING.powerInfo) return'finish' end) diff --git a/parts/scenes/setting_video.lua b/parts/scenes/setting_video.lua index 012595df..ea3d2414 100644 --- a/parts/scenes/setting_video.lua +++ b/parts/scenes/setting_video.lua @@ -68,7 +68,7 @@ scene.widgetList={ WIDGET.newSlider{name='shakeFX', x=330,y=760,lim=280,w=540,unit=5,disp=SETval('shakeFX'), code=SETsto('shakeFX')}, WIDGET.newSlider{name='atkFX', x=330,y=820,lim=280,w=540,unit=5,disp=SETval('atkFX'), code=SETsto('atkFX')}, - WIDGET.newSelector{name='frame', x=400,y=890,lim=280,w=460,list={8,10,13,17,22,29,37,47,62,80,100},disp=SETval('frameMul'),code=SETsto('frameMul')}, + WIDGET.newSelector{name='frame', x=400,y=890,lim=280,w=460,list={8,10,13,17,22,29,37,47,62,80,100},disp=SETval('frameMul'),code=function(v)SETTING.frameMul=v;Z.setFrameMul(SETTING.frameMul)end}, WIDGET.newSwitch{name='FTlock', x=950,y=890,lim=290,disp=SETval('FTLock'), code=SETrev('FTLock')}, WIDGET.newSwitch{name='text', x=450,y=980,lim=360,disp=SETval('text'), code=SETrev('text')}, @@ -80,8 +80,8 @@ scene.widgetList={ WIDGET.newSwitch{name='warn', x=450,y=1340,lim=360,disp=SETval('warn'), code=SETrev('warn')}, WIDGET.newSwitch{name='clickFX', x=950,y=980,lim=360,disp=SETval('clickFX'), code=SETrev('clickFX')}, - WIDGET.newSwitch{name='power', x=950,y=1070,lim=360,disp=SETval('powerInfo'), code=SETrev('powerInfo')}, - WIDGET.newSwitch{name='clean', x=950,y=1160,lim=360,disp=SETval('cleanCanvas'), code=SETrev('cleanCanvas')}, + WIDGET.newSwitch{name='power', x=950,y=1070,lim=360,disp=SETval('powerInfo'), code=function()SETTING.powerInfo=not SETTING.powerInfo Z.setPowerInfo(SETTING.powerInfo)end}, + WIDGET.newSwitch{name='clean', x=950,y=1160,lim=360,disp=SETval('cleanCanvas'), code=function()SETTING.cleanCanvas=not SETTING.cleanCanvas Z.setCleanCanvas(SETTING.cleanCanvas)end}, WIDGET.newSwitch{name='fullscreen', x=950,y=1250,lim=360,disp=SETval('fullscreen'), code=function()SETTING.fullscreen=not SETTING.fullscreen applyFullscreen()end}, WIDGET.newKey{name='bg_on', x=680,y=1340,w=200,h=80,code=function()SETTING.bg='on'applyBG()end}, diff --git a/parts/updateLog.lua b/parts/updateLog.lua index 680360af..54cddcd7 100644 --- a/parts/updateLog.lua +++ b/parts/updateLog.lua @@ -14,23 +14,29 @@ return[=[ 0.17.1: 苏醒 Wake Up 新增: + 全新模式选择界面(未完善,未来会增加更多便利功能) 新皮肤:pixel(by C₂₉H₂₅N₃O₅) 新语言:Bahasa Indonesia(by NOT_A_ROBOT) 改动: 修改选择模式音效 优化皮肤设置页面交互效果 - 重做关于页面 换新miya立绘,给不同立绘添加不同点击动画 略微降低master-h模式骨块出现后的难度 + TRS的N/H添加一个踢墙 X块的默认色改为黄色 + 重做关于页面 微调全局颜色表 修复: + 自定义场地界面按超过第三个的鼠标键会报错 + 经典模式h和u难度没有干旱计数器 #546 自定义场地16号色的方块名位置显示错误 自动保存会丢掉最后一个键(如果它触发了结束) 登录界面读取本地账号密码数据错误 策略堆叠模式评级标准不当 云存档/读档的一处小问题 部分场景文本重叠问题 + deepdrop坏了 + 混战模式坏了 0.17.0: 硬着陆 Hard Landing 新增: diff --git a/version.lua b/version.lua index 382fbed1..7497fd5d 100644 --- a/version.lua +++ b/version.lua @@ -1,5 +1,5 @@ return{ - ["apkCode"]=420, + ["apkCode"]=421, ["code"]=1701, ["string"]="V0.17.1", ["room"]="ver A-2",