From 478eb0774fd6e400225ae45b1bb28a20c083aaeb Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Mon, 1 Jan 2024 18:14:37 +0700 Subject: [PATCH 01/38] Test --- parts/player/init.lua | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/parts/player/init.lua b/parts/player/init.lua index b573f4aac..d7bf531d6 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -200,10 +200,23 @@ local function _loadGameEnv(P)-- Load gameEnv end end if ENV.allowMod then - for i=1,#GAME.mod do - if GAME.mod[i]>0 then - local M=MODOPT[i] - M.func(P,M.list and M.list[GAME.mod[i]]) + if SETTING.forceMod or ENV.forceMod then + -- Psudeo code + MOD_CODE_LIST={} + for i=1,#GAME.mod do + if GAME.mod[i]>0 then + local M=MODOPT[i] + table.insert(MOD_CODE_LIST,function() M.func(P,M.list and M.list[GAME.mod[i]]) end) + end + end + MOD_BATCH_TASK=function() for _,c in pairs(MOD_CODE_LIST) do c() end end + TASK.new(MOD_BATCH_TASK) + else + for i=1,#GAME.mod do + if GAME.mod[i]>0 then + local M=MODOPT[i] + M.func(P,M.list and M.list[GAME.mod[i]]) + end end end end From b3ca43fa696bcea94ae6b670adb26efb44fe7c21 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Tue, 2 Jan 2024 19:02:43 +0700 Subject: [PATCH 02/38] Final push --- parts/gameFuncs.lua | 11 ++++++++++- parts/gameTables.lua | 11 +++++++++-- parts/language/lang_en.lua | 1 + parts/language/lang_vi.lua | 3 ++- parts/player/init.lua | 25 ++++++++++++++++++------- parts/player/player.lua | 3 +++ parts/scenes/mod.lua | 9 +++++---- 7 files changed, 48 insertions(+), 15 deletions(-) diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index e701217df..8c7fdd88e 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -593,7 +593,8 @@ function loadGame(mode,ifQuickPlay,ifNet)-- Load a mode and go to game scene end end end -function gameOver()-- Save record +function gameOver() + -- Save record if GAME.replaying then local R=GAME.curMode.getRank if R then @@ -665,6 +666,14 @@ function gameOver()-- Save record end end end + + -- Kill mod patching function + if GAME.ApplyModsTask then + TASK.removeTask_code(GAME.ApplyModsTask) + TABLE.cut(GAME.modCodeList) + GAME.modCodeList=nil + GAME.ApplyModsTask=nil + end end function trySave() if not GAME.statSaved and PLAYERS[1] and PLAYERS[1].type=='human' and (PLAYERS[1].frameRun>300 or GAME.result) then diff --git a/parts/gameTables.lua b/parts/gameTables.lua index 7543b25e4..cdaf43f06 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -364,7 +364,9 @@ do-- Mod data {no=1,id="HL",name="hold", key="w",x=200,y=230,color='lO', list={0,1,2,3,4,5,6}, - func=function(P,O) P.gameEnv.holdCount=O end, + func=function(P,O,F) + if P.gameEnv.holdCount==O then return end + if F then P:setHold(O) else P.gameEnv.holdCount=O end end, unranked=true, }, {no=2,id="FL",name="hideNext", @@ -410,7 +412,11 @@ do-- Mod data {no=9,id="DT",name="dropDelay", key="a",x=140,y=350,color='lR', list={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99}, - func=function(P,O) P.gameEnv.drop=O end, + func=function(P,O,F) + if P.gameEnv.drop==O then return end + P.gameEnv.drop=O + if F then P:set20G(O==0) end + end, unranked=true, }, {no=10,id="LT",name="lockDelay", @@ -522,6 +528,7 @@ do-- Game data tables curMode=false, -- Current gamemode object initPlayerCount=0, -- Player count when init game mod=TABLE.new(0,#MODOPT),-- List of loaded mods + modPatch=false, -- Mods can lock value to prevent changes? False by default to compactible with old replays (from 0.17 to 0.17.15) modeEnv=false, -- Current gamemode environment setting={}, -- Game settings rep={}, -- Recording list, key,time,key,time... diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index 9a7ce5507..2f15366d4 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -449,6 +449,7 @@ C. Gamepad }, mod={ title="Mods", + modPatch="Enable mod patch", reset="Reset (tab)", unranked="Unranked", }, diff --git a/parts/language/lang_vi.lua b/parts/language/lang_vi.lua index 14ef6c2eb..fb03b4c4e 100644 --- a/parts/language/lang_vi.lua +++ b/parts/language/lang_vi.lua @@ -237,7 +237,7 @@ return { noRotation="No Rotation\nKhông thể xoay gạch", noMove="No Movement\nKhông thể di chuyển trái phải", customSeq="Randomizer\nGhi đè trình xáo gạch", - pushSpeed="Garbage Speed\nGhi đề tốc độ xuất hiện của hàng rác", + pushSpeed="Garbage Speed\nGhi đè tốc độ xuất hiện rác", boneBlock="[ ]\nChơi với skin [ ]", }, pauseStat={ @@ -457,6 +457,7 @@ C. Tay cầm chơi game (Gamepad): mod={ title="Mods", reset="Đặt lại (tab)", + modPatch="Bật bản vá mod", unranked="Không tính điểm", }, pause={ diff --git a/parts/player/init.lua b/parts/player/init.lua index d7bf531d6..26010a9f9 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -200,22 +200,33 @@ local function _loadGameEnv(P)-- Load gameEnv end end if ENV.allowMod then - if SETTING.forceMod or ENV.forceMod then - -- Psudeo code - MOD_CODE_LIST={} + if GAME.modPatch then + GAME.modCodeList={} for i=1,#GAME.mod do if GAME.mod[i]>0 then local M=MODOPT[i] - table.insert(MOD_CODE_LIST,function() M.func(P,M.list and M.list[GAME.mod[i]]) end) + if not GAME.modCodeList[P.id] then GAME.modCodeList[P.id]={} end + table.insert(GAME.modCodeList[P.id], function() M.func(P,M.list and M.list[GAME.mod[i]],true) end) end end - MOD_BATCH_TASK=function() for _,c in pairs(MOD_CODE_LIST) do c() end end - TASK.new(MOD_BATCH_TASK) + + if not GAME.ApplyModsTask then + GAME.ApplyModsTask=function() + while true do + for _,p in pairs(GAME.modCodeList) do + for _,c in pairs(p) do pcall(c) end + end + coroutine.yield() + end + end + TASK.new(GAME.ApplyModsTask) + end + else for i=1,#GAME.mod do if GAME.mod[i]>0 then local M=MODOPT[i] - M.func(P,M.list and M.list[GAME.mod[i]]) + M.func(P,M.list and M.list[GAME.mod[i]],false) end end end diff --git a/parts/player/player.lua b/parts/player/player.lua index 2ce44272b..9d0ab1670 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -2786,6 +2786,9 @@ function Player:_die() end end end + if GAME.ApplyModsTask then + TABLE.cut(GAME.modCodeList[self.id]) + end end function Player:update(dt) self.trigFrame=self.trigFrame+dt*60 diff --git a/parts/scenes/mod.lua b/parts/scenes/mod.lua index 3aae7fcae..1d6ee69c1 100644 --- a/parts/scenes/mod.lua +++ b/parts/scenes/mod.lua @@ -143,10 +143,11 @@ function scene.draw() end scene.widgetList={ - WIDGET.newText{name='title', x=80,y=50,font=70,align='L'}, - WIDGET.newText{name='unranked',x=1200,y=60,color='Y',font=50,align='R'}, - WIDGET.newButton{name='reset', x=1140,y=540,w=170,h=80,font=25,code=pressKey'tab'}, - WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene}, + WIDGET.newText{name='title', x=80,y=50,font=70,align='L'}, + WIDGET.newText{name='unranked', x=1200,y=60,color='Y',font=50,align='R'}, + WIDGET.newSwitch{name='modPatch',x=1175,y=550,font=20,disp=function() return GAME.modPatch end,code=function() GAME.modPatch=not GAME.modPatch end}, + WIDGET.newButton{name='reset', x=1095,y=640,w=80,h=80,font=60,fText=CHAR.icon.trash,code=pressKey'tab'}, + WIDGET.newButton{name='back', x=1185,y=640,w=80,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene}, } return scene From 77232885b64f7d987458cb2496de1708b295c98d Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Wed, 3 Jan 2024 16:11:39 +0700 Subject: [PATCH 03/38] small update --- parts/player/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parts/player/init.lua b/parts/player/init.lua index 26010a9f9..82c264d2b 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -201,11 +201,11 @@ local function _loadGameEnv(P)-- Load gameEnv end if ENV.allowMod then if GAME.modPatch then - GAME.modCodeList={} + if not GAME.modCodeList then GAME.modCodeList={} end + if not GAME.modCodeList[P.id] then GAME.modCodeList[P.id]={} end for i=1,#GAME.mod do if GAME.mod[i]>0 then local M=MODOPT[i] - if not GAME.modCodeList[P.id] then GAME.modCodeList[P.id]={} end table.insert(GAME.modCodeList[P.id], function() M.func(P,M.list and M.list[GAME.mod[i]],true) end) end end @@ -518,4 +518,4 @@ function PLY.newPlayer(id,mini,p) _applyGameEnv(P) end ---------------------------------------------------- -return PLY +return PLY \ No newline at end of file From 8252f85720cf2a9a824e247f0f33826f1fa4374f Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Thu, 4 Jan 2024 07:53:28 +0700 Subject: [PATCH 04/38] Fix some bugs --- parts/data.lua | 2 ++ parts/gameFuncs.lua | 8 -------- parts/player/init.lua | 7 ++++++- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/parts/data.lua b/parts/data.lua index 9f044b462..996bcab88 100644 --- a/parts/data.lua +++ b/parts/data.lua @@ -334,6 +334,7 @@ do-- function DATA.saveReplay() seed=GAME.seed, setting=GAME.setting, mod=_getModList(), + modPatch=GAME.modPatch, tasUsed=GAME.tasUsed, } if GAME.curMode.savePrivate then @@ -393,6 +394,7 @@ function DATA.parseReplayData(fileName,fileData,ifFull) seed=metaData.seed, setting=metaData.setting, mod=metaData.mod, + modPatch=metaData.modPatch, tasUsed=metaData.tasUsed, } if ifFull then rep.data=fileData end diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index 8c7fdd88e..8ab91a06e 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -666,14 +666,6 @@ function gameOver() end end end - - -- Kill mod patching function - if GAME.ApplyModsTask then - TASK.removeTask_code(GAME.ApplyModsTask) - TABLE.cut(GAME.modCodeList) - GAME.modCodeList=nil - GAME.ApplyModsTask=nil - end end function trySave() if not GAME.statSaved and PLAYERS[1] and PLAYERS[1].type=='human' and (PLAYERS[1].frameRun>300 or GAME.result) then diff --git a/parts/player/init.lua b/parts/player/init.lua index 82c264d2b..db3997733 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -212,12 +212,17 @@ local function _loadGameEnv(P)-- Load gameEnv if not GAME.ApplyModsTask then GAME.ApplyModsTask=function() - while true do + while GAME.playing do for _,p in pairs(GAME.modCodeList) do for _,c in pairs(p) do pcall(c) end end coroutine.yield() end + -- Kill mod patching function when game stopped + TASK.removeTask_code(GAME.ApplyModsTask) + TABLE.cut(GAME.modCodeList) + GAME.modCodeList=nil + GAME.ApplyModsTask=nil end TASK.new(GAME.ApplyModsTask) end From e6f416eee3cf83b5ffb3e0f96966659fcb009a0c Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Thu, 4 Jan 2024 10:19:38 +0700 Subject: [PATCH 05/38] Shorten code, remove ``unranked`` --- parts/gameFuncs.lua | 6 ++---- parts/gameTables.lua | 44 ++++++++++++++++++------------------------- parts/player/init.lua | 31 +++++++++++++++--------------- parts/scenes/mod.lua | 20 +++++++------------- 4 files changed, 43 insertions(+), 58 deletions(-) diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index 8ab91a06e..096c6ebee 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -506,10 +506,8 @@ function mergeStat(stat,delta)-- Merge delta stat. to global stat. end end function scoreValid()-- Check if any unranked mods are activated - for number,sel in next,GAME.mod do - if sel>0 and MODOPT[number].unranked then - return false - end + for _,sel in next,GAME.mod do + if sel>0 then return false end end if GAME.playing and GAME.tasUsed then return false diff --git a/parts/gameTables.lua b/parts/gameTables.lua index cdaf43f06..69757bb35 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -354,59 +354,51 @@ do-- Mod data local function _disableKey(P,key) table.insert(P.gameEnv.keyCancel,key) end - MODOPT={-- Mod options + MODOPT={-- Mod options | P for Player, O for Option, F for Force/Mod patch {no=0,id="NX",name="next", key="q",x=80,y=230,color='lO', list={0,1,2,3,4,5,6}, func=function(P,O) P.gameEnv.nextCount=O end, - unranked=true, }, {no=1,id="HL",name="hold", key="w",x=200,y=230,color='lO', list={0,1,2,3,4,5,6}, func=function(P,O,F) if P.gameEnv.holdCount==O then return end - if F then P:setHold(O) else P.gameEnv.holdCount=O end end, - unranked=true, + if F then P:setHold(O) else P.gameEnv.holdCount=O end + end, }, {no=2,id="FL",name="hideNext", key="e",x=320,y=230,color='lA', list={1,2,3,4,5}, func=function(P,O) P.gameEnv.nextStartPos=O+1 end, - unranked=true, }, {no=3,id="IH",name="infHold", key="r",x=440,y=230,color='lA', func=function(P) P.gameEnv.infHold=true end, - unranked=true, }, {no=4,id="HB",name="hideBlock", key="y",x=680,y=230,color='lV', func=function(P) P.gameEnv.block=false end, - unranked=true, }, {no=5,id="HG",name="hideGhost", key="u",x=800,y=230,color='lV', func=function(P) P.gameEnv.ghost=false end, - unranked=true, }, {no=6,id="HD",name="hidden", key="i",x=920,y=230,color='lP', list={'easy','slow','medium','fast','none'}, func=function(P,O) P.gameEnv.visible=O end, - unranked=true, }, {no=7,id="HB",name="hideBoard", key="o",x=1040,y=230,color='lP', list={'down','up','all'}, func=function(P,O) P.gameEnv.hideBoard=O end, - unranked=true, }, {no=8,id="FB",name="flipBoard", key="p",x=1160,y=230,color='lJ', list={'U-D','L-R','180'}, func=function(P,O) P.gameEnv.flipBoard=O end, - unranked=true, }, {no=9,id="DT",name="dropDelay", @@ -417,41 +409,34 @@ do-- Mod data P.gameEnv.drop=O if F then P:set20G(O==0) end end, - unranked=true, }, {no=10,id="LT",name="lockDelay", key="s",x=260,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99}, func=function(P,O) P.gameEnv.lock=O end, - unranked=true, }, {no=11,id="ST",name="waitDelay", key="d",x=380,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, func=function(P,O) P.gameEnv.wait=O end, - unranked=true, }, {no=12,id="CT",name="fallDelay", key="f",x=500,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, func=function(P,O) P.gameEnv.fall=O end, - unranked=true, }, {no=13,id="LF",name="life", key="j",x=860,y=350,color='lY', list={0,1,2,3,5,10,15,26,42,87,500}, func=function(P,O) P.gameEnv.life=O end, - unranked=true, }, {no=14,id="FB",name="forceB2B", key="k",x=980,y=350,color='lY', func=function(P) P.gameEnv.b2bKill=true end, - unranked=true, }, {no=15,id="PF",name="forceFinesse", key="l",x=1100,y=350,color='lY', func=function(P) P.gameEnv.fineKill=true end, - unranked=true, }, {no=16,id="TL",name="tele", @@ -460,7 +445,6 @@ do-- Mod data P.gameEnv.das,P.gameEnv.arr=0,0 P.gameEnv.sddas,P.gameEnv.sdarr=0,0 end, - unranked=true, }, {no=17,id="FX",name="noRotation", key="x",x=320,y=470,color='lH', @@ -469,7 +453,6 @@ do-- Mod data _disableKey(P,4) _disableKey(P,5) end, - unranked=true, }, {no=18,id="GL",name="noMove", key="c",x=440,y=470,color='lH', @@ -479,25 +462,34 @@ do-- Mod data _disableKey(P,17)_disableKey(P,18) _disableKey(P,19)_disableKey(P,20) end, - unranked=true, }, {no=19,id="CS",name="customSeq", key="b",x=680,y=470,color='lB', list={'bag','bagES','his','hisPool','c2','bagP1inf','rnd','mess','reverb'}, - func=function(P,O) P.gameEnv.sequence=O end, - unranked=true, + func=function(P,O) + if P.gameEnv.sequence==O then return end + P.gameEnv.sequence=O + if F then P:resetNext() end + end, + executeOnce=false, }, {no=20,id="PS",name="pushSpeed", key="n",x=800,y=470,color='lB', list={.5,1,2,3,5,15,1e99}, func=function(P,O) P.gameEnv.pushSpeed=O end, - unranked=true, }, {no=21,id="BN",name="boneBlock", key="m",x=920,y=470,color='lB', list={'on','off'}, - func=function(P,O) P.gameEnv.bone=O=='on' end, - unranked=true, + func=function(P,O,F) + if P.gameEnv.bone==O then return end + P.gameEnv.bone=O + if F and O=='on' then + for _,bk in pairs(P.nextQueue) do + bk.color=17 --Bone block + end + end + end, }, } for i=1,#MODOPT do diff --git a/parts/player/init.lua b/parts/player/init.lua index db3997733..5cacddaeb 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -203,13 +203,6 @@ local function _loadGameEnv(P)-- Load gameEnv if GAME.modPatch then if not GAME.modCodeList then GAME.modCodeList={} end if not GAME.modCodeList[P.id] then GAME.modCodeList[P.id]={} end - for i=1,#GAME.mod do - if GAME.mod[i]>0 then - local M=MODOPT[i] - table.insert(GAME.modCodeList[P.id], function() M.func(P,M.list and M.list[GAME.mod[i]],true) end) - end - end - if not GAME.ApplyModsTask then GAME.ApplyModsTask=function() while GAME.playing do @@ -226,12 +219,15 @@ local function _loadGameEnv(P)-- Load gameEnv end TASK.new(GAME.ApplyModsTask) end - - else - for i=1,#GAME.mod do - if GAME.mod[i]>0 then - local M=MODOPT[i] - M.func(P,M.list and M.list[GAME.mod[i]],false) + end + + for i=1,#GAME.mod do + if GAME.mod[i]>0 then + local M=MODOPT[i] + if not GAME.modPatch or M.executeOnce then + M.func(P,M.list and M.listpGAME.mod[i],false) + else + table.insert(GAME.modCodeList[P.id], function() M.func(P,M.list and M.list[GAME.mod[i]],true) end) end end end @@ -400,9 +396,14 @@ local function _applyGameEnv(P)-- Finish gameEnv processing P:newNext() end end - for _=1,ENV.trueNextCount do - P:newNext() + function P:resetNext() + seqGen=coroutine.create(getSeqGen(ENV.sequence)) + seqCalled=false + initSZOcount=0 + bagLineCounter=0 + for _=1,ENV.trueNextCount do self:newNext() end end + P:resetNext() if P.miniMode then ENV.lockFX=false diff --git a/parts/scenes/mod.lua b/parts/scenes/mod.lua index 1d6ee69c1..6a89420e3 100644 --- a/parts/scenes/mod.lua +++ b/parts/scenes/mod.lua @@ -14,13 +14,12 @@ local function _toggleMod(M,back) else GAME.mod[number]=1-GAME.mod[number] end - if M.unranked then - SFX.play('touch',.6) - SFX.play('lock') - else - SFX.play('touch') - SFX.play('lock',.6) - end + -- Unranked + SFX.play('touch',.6) + SFX.play('lock') + -- Still ranked + -- SFX.play('touch') + -- SFX.play('lock',.6) scene.widgetList.unranked.hide=scoreValid() end @@ -104,12 +103,7 @@ function scene.draw() local t=M.time*.01-- t range:0~0.1 GC.scale(1+3*t) GC.rotate(t) - local rad,side - if M.unranked then - rad,side=45,5 - else - rad=40 - end + local rad,side=45,5 -- rad=40 --> circle (but that will be a story in the future) local color=M.color GC.setColor(color[1],color[2],color[3],5*t) GC.circle('fill',0,0,rad,side) From 47fc75bae84c985ca859d844ef484ddbfd936e72 Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Thu, 4 Jan 2024 14:45:19 +0700 Subject: [PATCH 06/38] Modify some mods' behavior --- parts/gameTables.lua | 22 ++++++++++++---------- parts/player/init.lua | 17 ++++++----------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/parts/gameTables.lua b/parts/gameTables.lua index 69757bb35..906b77303 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -388,17 +388,19 @@ do-- Mod data {no=6,id="HD",name="hidden", key="i",x=920,y=230,color='lP', list={'easy','slow','medium','fast','none'}, - func=function(P,O) P.gameEnv.visible=O end, + func=function(P,O) P.gameEnv.visible=O end, -- TODO }, {no=7,id="HB",name="hideBoard", key="o",x=1040,y=230,color='lP', list={'down','up','all'}, func=function(P,O) P.gameEnv.hideBoard=O end, + onlyOnce=true, }, {no=8,id="FB",name="flipBoard", key="p",x=1160,y=230,color='lJ', list={'U-D','L-R','180'}, func=function(P,O) P.gameEnv.flipBoard=O end, + onlyOnce=true, }, {no=9,id="DT",name="dropDelay", @@ -429,14 +431,17 @@ do-- Mod data key="j",x=860,y=350,color='lY', list={0,1,2,3,5,10,15,26,42,87,500}, func=function(P,O) P.gameEnv.life=O end, + onlyOnce=true, }, {no=14,id="FB",name="forceB2B", key="k",x=980,y=350,color='lY', func=function(P) P.gameEnv.b2bKill=true end, + onlyOnce=true, }, {no=15,id="PF",name="forceFinesse", key="l",x=1100,y=350,color='lY', func=function(P) P.gameEnv.fineKill=true end, + onlyOnce=true, }, {no=16,id="TL",name="tele", @@ -453,6 +458,7 @@ do-- Mod data _disableKey(P,4) _disableKey(P,5) end, + onlyOnce=true, }, {no=18,id="GL",name="noMove", key="c",x=440,y=470,color='lH', @@ -462,16 +468,13 @@ do-- Mod data _disableKey(P,17)_disableKey(P,18) _disableKey(P,19)_disableKey(P,20) end, + onlyOnce=true, }, {no=19,id="CS",name="customSeq", key="b",x=680,y=470,color='lB', list={'bag','bagES','his','hisPool','c2','bagP1inf','rnd','mess','reverb'}, - func=function(P,O) - if P.gameEnv.sequence==O then return end - P.gameEnv.sequence=O - if F then P:resetNext() end - end, - executeOnce=false, + func=function(P,O) P.gameEnv.sequence=O end, + onlyOnce=true, }, {no=20,id="PS",name="pushSpeed", key="n",x=800,y=470,color='lB', @@ -485,11 +488,10 @@ do-- Mod data if P.gameEnv.bone==O then return end P.gameEnv.bone=O if F and O=='on' then - for _,bk in pairs(P.nextQueue) do - bk.color=17 --Bone block - end + for _,bk in pairs(P.nextQueue) do bk.color=17 end end end, + executeFirst=true }, } for i=1,#MODOPT do diff --git a/parts/player/init.lua b/parts/player/init.lua index 5cacddaeb..4c05ba91f 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -224,10 +224,10 @@ local function _loadGameEnv(P)-- Load gameEnv for i=1,#GAME.mod do if GAME.mod[i]>0 then local M=MODOPT[i] - if not GAME.modPatch or M.executeOnce then - M.func(P,M.list and M.listpGAME.mod[i],false) - else - table.insert(GAME.modCodeList[P.id], function() M.func(P,M.list and M.list[GAME.mod[i]],true) end) + if not GAME.modPatch or M.executeFirst or M.onlyOnce then + M.func(P,M.list and M.list[GAME.mod[i]]) + elseif GAME.modPatch and not M.onlyOnce then + table.insert(GAME.modCodeList[P.id],function() M.func(P,M.list and M.list[GAME.mod[i]],true) end) end end end @@ -396,14 +396,9 @@ local function _applyGameEnv(P)-- Finish gameEnv processing P:newNext() end end - function P:resetNext() - seqGen=coroutine.create(getSeqGen(ENV.sequence)) - seqCalled=false - initSZOcount=0 - bagLineCounter=0 - for _=1,ENV.trueNextCount do self:newNext() end + for _=1,ENV.trueNextCount do + P:newNext() end end - P:resetNext() if P.miniMode then ENV.lockFX=false From b8ec5df9dc956137ede0f6d93e6f628bc849bcf9 Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Thu, 4 Jan 2024 15:42:14 +0700 Subject: [PATCH 07/38] Fix redundant "end" --- parts/gameFuncs.lua | 5 ++--- parts/player/init.lua | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index 096c6ebee..526377871 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -505,7 +505,7 @@ function mergeStat(stat,delta)-- Merge delta stat. to global stat. end end end -function scoreValid()-- Check if any unranked mods are activated +function coreValid()-- Check if any unranked mods are activated for _,sel in next,GAME.mod do if sel>0 then return false end end @@ -591,8 +591,7 @@ function loadGame(mode,ifQuickPlay,ifNet)-- Load a mode and go to game scene end end end -function gameOver() - -- Save record +function gameOver()-- Save record if GAME.replaying then local R=GAME.curMode.getRank if R then diff --git a/parts/player/init.lua b/parts/player/init.lua index 4c05ba91f..1d8fefc66 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -396,9 +396,7 @@ local function _applyGameEnv(P)-- Finish gameEnv processing P:newNext() end end - for _=1,ENV.trueNextCount do - P:newNext() end - end + for _=1,ENV.trueNextCount do P:newNext() end if P.miniMode then ENV.lockFX=false From 1117b5390ce97b6c7370c1cec7f466a809173f11 Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Thu, 4 Jan 2024 15:45:09 +0700 Subject: [PATCH 08/38] Fix bug (again) --- parts/gameFuncs.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index 526377871..b1a899e7c 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -505,7 +505,7 @@ function mergeStat(stat,delta)-- Merge delta stat. to global stat. end end end -function coreValid()-- Check if any unranked mods are activated +function scoreValid()-- Check if any unranked mods are activated for _,sel in next,GAME.mod do if sel>0 then return false end end From 72d5e46056b0ea22101c1a3f867a10c8f1541c6a Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sat, 6 Jan 2024 07:18:52 +0700 Subject: [PATCH 09/38] Change "modSystem" to "modApplyAt" --- parts/data.lua | 4 +- parts/gameTables.lua | 12 +----- parts/player/init.lua | 93 ++++++++++++++++++++++++++----------------- 3 files changed, 60 insertions(+), 49 deletions(-) diff --git a/parts/data.lua b/parts/data.lua index 996bcab88..a035ea5fe 100644 --- a/parts/data.lua +++ b/parts/data.lua @@ -334,7 +334,7 @@ do-- function DATA.saveReplay() seed=GAME.seed, setting=GAME.setting, mod=_getModList(), - modPatch=GAME.modPatch, + modApplyAt=GAME.modApplyAt, tasUsed=GAME.tasUsed, } if GAME.curMode.savePrivate then @@ -394,7 +394,7 @@ function DATA.parseReplayData(fileName,fileData,ifFull) seed=metaData.seed, setting=metaData.setting, mod=metaData.mod, - modPatch=metaData.modPatch, + modApplyAt=metaData.modApplyAt, tasUsed=metaData.tasUsed, } if ifFull then rep.data=fileData end diff --git a/parts/gameTables.lua b/parts/gameTables.lua index 906b77303..9e7da3e7d 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -388,7 +388,7 @@ do-- Mod data {no=6,id="HD",name="hidden", key="i",x=920,y=230,color='lP', list={'easy','slow','medium','fast','none'}, - func=function(P,O) P.gameEnv.visible=O end, -- TODO + func=function(P,O) P.gameEnv.visible=O end, }, {no=7,id="HB",name="hideBoard", key="o",x=1040,y=230,color='lP', @@ -400,7 +400,6 @@ do-- Mod data key="p",x=1160,y=230,color='lJ', list={'U-D','L-R','180'}, func=function(P,O) P.gameEnv.flipBoard=O end, - onlyOnce=true, }, {no=9,id="DT",name="dropDelay", @@ -431,17 +430,14 @@ do-- Mod data key="j",x=860,y=350,color='lY', list={0,1,2,3,5,10,15,26,42,87,500}, func=function(P,O) P.gameEnv.life=O end, - onlyOnce=true, }, {no=14,id="FB",name="forceB2B", key="k",x=980,y=350,color='lY', func=function(P) P.gameEnv.b2bKill=true end, - onlyOnce=true, }, {no=15,id="PF",name="forceFinesse", key="l",x=1100,y=350,color='lY', func=function(P) P.gameEnv.fineKill=true end, - onlyOnce=true, }, {no=16,id="TL",name="tele", @@ -458,7 +454,6 @@ do-- Mod data _disableKey(P,4) _disableKey(P,5) end, - onlyOnce=true, }, {no=18,id="GL",name="noMove", key="c",x=440,y=470,color='lH', @@ -468,13 +463,11 @@ do-- Mod data _disableKey(P,17)_disableKey(P,18) _disableKey(P,19)_disableKey(P,20) end, - onlyOnce=true, }, {no=19,id="CS",name="customSeq", key="b",x=680,y=470,color='lB', list={'bag','bagES','his','hisPool','c2','bagP1inf','rnd','mess','reverb'}, func=function(P,O) P.gameEnv.sequence=O end, - onlyOnce=true, }, {no=20,id="PS",name="pushSpeed", key="n",x=800,y=470,color='lB', @@ -491,7 +484,6 @@ do-- Mod data for _,bk in pairs(P.nextQueue) do bk.color=17 end end end, - executeFirst=true }, } for i=1,#MODOPT do @@ -522,7 +514,7 @@ do-- Game data tables curMode=false, -- Current gamemode object initPlayerCount=0, -- Player count when init game mod=TABLE.new(0,#MODOPT),-- List of loaded mods - modPatch=false, -- Mods can lock value to prevent changes? False by default to compactible with old replays (from 0.17 to 0.17.15) + modApplyAt='preInit', -- Apply mod when? (preInit, postInit, always) modeEnv=false, -- Current gamemode environment setting={}, -- Game settings rep={}, -- Recording list, key,time,key,time... diff --git a/parts/player/init.lua b/parts/player/init.lua index 1d8fefc66..2f067a22a 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -175,6 +175,17 @@ local function _newEmptyPlayer(id,mini) } return P end +local function _executeMod(P) + local applyStatus=GAME.modApplyAt + for i=1,#GAME.mod do + if GAME.mod[i]>0 then + local M=MODOPT[i] + if applyStatus~='always' or M.noAlwaysNeeded then + M.func(P,M.list and M.list[GAME.mod[i]]) + end + end + end +end local function _loadGameEnv(P)-- Load gameEnv P.gameEnv={}-- Current game setting environment local ENV=P.gameEnv @@ -199,39 +210,21 @@ local function _loadGameEnv(P)-- Load gameEnv ENV[k]=TABLE.copy(v) end end - if ENV.allowMod then - if GAME.modPatch then - if not GAME.modCodeList then GAME.modCodeList={} end - if not GAME.modCodeList[P.id] then GAME.modCodeList[P.id]={} end - if not GAME.ApplyModsTask then - GAME.ApplyModsTask=function() - while GAME.playing do - for _,p in pairs(GAME.modCodeList) do - for _,c in pairs(p) do pcall(c) end - end - coroutine.yield() - end - -- Kill mod patching function when game stopped - TASK.removeTask_code(GAME.ApplyModsTask) - TABLE.cut(GAME.modCodeList) - GAME.modCodeList=nil - GAME.ApplyModsTask=nil - end - TASK.new(GAME.ApplyModsTask) - end - end - - for i=1,#GAME.mod do - if GAME.mod[i]>0 then - local M=MODOPT[i] - if not GAME.modPatch or M.executeFirst or M.onlyOnce then - M.func(P,M.list and M.list[GAME.mod[i]]) - elseif GAME.modPatch and not M.onlyOnce then - table.insert(GAME.modCodeList[P.id],function() M.func(P,M.list and M.list[GAME.mod[i]],true) end) - end - end - end - end + + -- if not GAME.modCodeList then GAME.modCodeList={} end + -- if not GAME.modCodeList[P.id] then GAME.modCodeList[P.id]={} end + -- if ENV.allowMod then + -- for i=1,#GAME.mod do + -- if GAME.mod[i]>0 then + -- local M=MODOPT[i] + -- if not GAME.modPatch or M.executeFirst or M.onlyOnce then + -- M.func(P,M.list and M.list[GAME.mod[i]]) + -- elseif GAME.modPatch and not M.onlyOnce then + -- table.insert(GAME.modCodeList[P.id],function() M.func(P,M.list and M.list[GAME.mod[i]],true) end) + -- end + -- end + -- end + -- end end local function _loadRemoteEnv(P,confStr)-- Load gameEnv confStr=JSON.decode(confStr) @@ -315,6 +308,28 @@ local function _applyGameEnv(P)-- Finish gameEnv processing MES.new('warn',"Wrong event set type: "..type(ENV.eventSet)) end end + + -- if GAME.modPatch then + -- if not GAME.ApplyModsTask then + -- GAME.ApplyModsTask=function() + -- while GAME.playing do + -- for _,p in pairs(GAME.modCodeList) do + -- for _,c in pairs(p) do pcall(c) end + -- end + -- coroutine.yield() + -- end + -- -- Kill mod patching function when game stopped + -- TASK.removeTask_code(GAME.ApplyModsTask) + -- TABLE.cut(GAME.modCodeList) + -- GAME.modCodeList=nil + -- GAME.ApplyModsTask=nil + -- end + -- TASK.new(GAME.ApplyModsTask) + -- end + -- end + if ENV.allowMod and GAME.modApplyAt=='postInit' then + _executeMod(P) + end P._20G=ENV.drop==0 P.dropDelay=ENV.drop @@ -364,10 +379,14 @@ local function _applyGameEnv(P)-- Finish gameEnv processing ENV.nextPos=false end - local seqGen=coroutine.create(getSeqGen(ENV.sequence)) - local seqCalled=false - local initSZOcount=0 - local bagLineCounter=0 + local seqGen,seqCalled,initSZOcount,bagLineCounter + function P:resetSeqGen() + seqGen=coroutine.create(getSeqGen(ENV.sequence)) + seqCalled=false + initSZOcount=0 + bagLineCounter=0 + end + P:resetSeqGen() function P:newNext() local status,piece if seqCalled then From 4c3abc454ac71cb9d85f6e503013078561169e49 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sat, 6 Jan 2024 11:15:03 +0700 Subject: [PATCH 10/38] Add TABLE.newWithLockMetamethod() --- Zframework/tableExtend.lua | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Zframework/tableExtend.lua b/Zframework/tableExtend.lua index 9417157c6..7c73e0da1 100644 --- a/Zframework/tableExtend.lua +++ b/Zframework/tableExtend.lua @@ -15,6 +15,29 @@ function TABLE.new(val,count) return L end +-- Get a new empty table with __lock() and __unlock() to protect changes +function TABLE.newWithLockMetamethod() + local t + do + local lockedKey={} + local realTable={} + t=setmetatable( -- This is the fake table, act like a wrapper of realTable + { + __lock =function(k) if k then lockedKey[k]=true end end, + __unlock=function(k) + if k then lockedKey[k]=false else TABLE.cut(lockedKey) end + end, + },{ + __index =realTable, + __newindex=function(_,k,v) if not lockedKey[k] then realTable[k]=v end end, + __len =function(_,_,_) return #realTable end, + __tostring=function(_,_,_) return tostring(realTable) end, + } + ) + end + return t +end + -- Get a copy of [1~#] elements function TABLE.shift(org,depth) if not depth then depth=1e99 end From f0a45b8b320adce715a9edc42f52da86d30908f9 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sat, 6 Jan 2024 11:15:28 +0700 Subject: [PATCH 11/38] Change most mods' configuration --- parts/gameTables.lua | 107 ++++++++++++++++++++++++++++++------------- 1 file changed, 74 insertions(+), 33 deletions(-) diff --git a/parts/gameTables.lua b/parts/gameTables.lua index 9e7da3e7d..b7d4ab934 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -354,102 +354,141 @@ do-- Mod data local function _disableKey(P,key) table.insert(P.gameEnv.keyCancel,key) end - MODOPT={-- Mod options | P for Player, O for Option, F for Force/Mod patch + local _invisibleTime={ + ['show'] =-1, + ['easy'] =300, + ['slow'] =100, + ['medium']=60, + ['fast'] =20, + ['none'] =0, + } + local function _lockVfunc(k) + return function(P,O) + if not P then return end + P.gameEnv[k]=O + P.gameEnv.__lock(k) + end + end + MODOPT={-- Mod options + -- funcA always triggered, funcA1 only triggered once, but both functions can lock values {no=0,id="NX",name="next", key="q",x=80,y=230,color='lO', list={0,1,2,3,4,5,6}, - func=function(P,O) P.gameEnv.nextCount=O end, + func =function(P,O) P.gameEnv.nextCount=O end, + funcA1=_lockVfunc('nextCount')(P,O), }, {no=1,id="HL",name="hold", key="w",x=200,y=230,color='lO', list={0,1,2,3,4,5,6}, - func=function(P,O,F) - if P.gameEnv.holdCount==O then return end - if F then P:setHold(O) else P.gameEnv.holdCount=O end - end, + func =function(P,O) P.gameEnv.holdCount=O end, + funcA1=_lockVfunc('holdCount')(P,O), }, {no=2,id="FL",name="hideNext", key="e",x=320,y=230,color='lA', list={1,2,3,4,5}, - func=function(P,O) P.gameEnv.nextStartPos=O+1 end, + func =function(P,O) P.gameEnv.nextStartPos=O+1 end, + funcA1=_lockVfunc('nextStartPos')(P,O), }, {no=3,id="IH",name="infHold", key="r",x=440,y=230,color='lA', - func=function(P) P.gameEnv.infHold=true end, + func =function(P) P.gameEnv.infHold=true end, + funcA1=_lockVfunc('infHold')(P,O), }, {no=4,id="HB",name="hideBlock", key="y",x=680,y=230,color='lV', - func=function(P) P.gameEnv.block=false end, + func =function(P) P.gameEnv.block=false end, + funcA1=_lockVfunc('block')(P,O), }, {no=5,id="HG",name="hideGhost", key="u",x=800,y=230,color='lV', - func=function(P) P.gameEnv.ghost=false end, + func =function(P) P.gameEnv.ghost=false end, + funcA1=_lockVfunc('ghost')(P,O), }, {no=6,id="HD",name="hidden", key="i",x=920,y=230,color='lP', list={'easy','slow','medium','fast','none'}, - func=function(P,O) P.gameEnv.visible=O end, + func =function(P,O) P.gameEnv.visible=O end, + funcA =function(P,O) + if P.showTime~=_invisibleTime[O] then + P:setInvisible(_invisibleTime[O]) + end + end, }, {no=7,id="HB",name="hideBoard", key="o",x=1040,y=230,color='lP', list={'down','up','all'}, - func=function(P,O) P.gameEnv.hideBoard=O end, - onlyOnce=true, + func =function(P,O) P.gameEnv.hideBoard=O end, + funcA1=_lockVfunc('hideBoard')(P,O), }, {no=8,id="FB",name="flipBoard", key="p",x=1160,y=230,color='lJ', list={'U-D','L-R','180'}, - func=function(P,O) P.gameEnv.flipBoard=O end, + func =function(P,O) P.gameEnv.flipBoard=O end, + funcA1=_lockVfunc('flipBoard')(P,O), }, {no=9,id="DT",name="dropDelay", key="a",x=140,y=350,color='lR', list={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99}, - func=function(P,O,F) - if P.gameEnv.drop==O then return end - P.gameEnv.drop=O - if F then P:set20G(O==0) end + func =function(P,O) P.gameEnv.drop=O end, + funcA =function(P,O) + if P.gameEnv.drop~=O then + P.gameEnv.drop=O + P:set20G(O==0) + end end, }, {no=10,id="LT",name="lockDelay", key="s",x=260,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99}, - func=function(P,O) P.gameEnv.lock=O end, + func =function(P,O) P.gameEnv.lock=O end, + funcA1=_lockVfunc('lockDelay')(P,O), }, {no=11,id="ST",name="waitDelay", key="d",x=380,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, - func=function(P,O) P.gameEnv.wait=O end, + func =function(P,O) P.gameEnv.wait=O end, + funcA1=_lockVfunc('waitDelay')(P,O), }, {no=12,id="CT",name="fallDelay", key="f",x=500,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, - func=function(P,O) P.gameEnv.fall=O end, + func =function(P,O) P.gameEnv.fall=O end, + funcA1=_lockVfunc('fallDelay')(P,O), }, {no=13,id="LF",name="life", key="j",x=860,y=350,color='lY', list={0,1,2,3,5,10,15,26,42,87,500}, - func=function(P,O) P.gameEnv.life=O end, + func =function(P,O) P.gameEnv.life=O end, + funcA1=_lockVfunc('life')(P,O), }, {no=14,id="FB",name="forceB2B", key="k",x=980,y=350,color='lY', - func=function(P) P.gameEnv.b2bKill=true end, + func =function(P) P.gameEnv.b2bKill=true end, + funcA1=_lockVfunc('b2bKill')(P,O), }, {no=15,id="PF",name="forceFinesse", key="l",x=1100,y=350,color='lY', - func=function(P) P.gameEnv.fineKill=true end, + func =function(P) P.gameEnv.fineKill=true end, + funcA1=_lockVfunc('fineKill')(P,O), }, {no=16,id="TL",name="tele", key="z",x=200,y=470,color='lH', - func=function(P) + func =function(P) P.gameEnv.das,P.gameEnv.arr=0,0 P.gameEnv.sddas,P.gameEnv.sdarr=0,0 end, + funcA1=function(P) + for _,k in pairs{'das','arr','sddas','sdarr'} do + P.gameEnv[k]=O + P.gameEnv.__lock(k) + end + end }, {no=17,id="FX",name="noRotation", key="x",x=320,y=470,color='lH', - func=function(P) + func =function(P) _disableKey(P,3) _disableKey(P,4) _disableKey(P,5) @@ -457,8 +496,8 @@ do-- Mod data }, {no=18,id="GL",name="noMove", key="c",x=440,y=470,color='lH', - func=function(P) - _disableKey(P,1)_disableKey(P,2) + func =function(P) + _disableKey(P,1) _disableKey(P,2) _disableKey(P,11)_disableKey(P,12) _disableKey(P,17)_disableKey(P,18) _disableKey(P,19)_disableKey(P,20) @@ -467,20 +506,22 @@ do-- Mod data {no=19,id="CS",name="customSeq", key="b",x=680,y=470,color='lB', list={'bag','bagES','his','hisPool','c2','bagP1inf','rnd','mess','reverb'}, - func=function(P,O) P.gameEnv.sequence=O end, + func =function(P,O) P.gameEnv.sequence=O end, + funcA1=_lockVfunc('sequence')(P,O), }, {no=20,id="PS",name="pushSpeed", key="n",x=800,y=470,color='lB', list={.5,1,2,3,5,15,1e99}, - func=function(P,O) P.gameEnv.pushSpeed=O end, + func =function(P,O) P.gameEnv.pushSpeed=O end, + funcA1=_lockVfunc('pushSpeed')(P,O), }, {no=21,id="BN",name="boneBlock", key="m",x=920,y=470,color='lB', list={'on','off'}, - func=function(P,O,F) - if P.gameEnv.bone==O then return end + func =function(P,O) P.gameEnv.bone=O end, + funcA =function(P,O) P.gameEnv.bone=O - if F and O=='on' then + if O=='on' then for _,bk in pairs(P.nextQueue) do bk.color=17 end end end, From 2cd330ffa69016842515352cfb97da774bf7b9c2 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sat, 6 Jan 2024 11:21:03 +0700 Subject: [PATCH 12/38] Modify how executing mods again --- parts/player/init.lua | 83 ++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 44 deletions(-) diff --git a/parts/player/init.lua b/parts/player/init.lua index 2f067a22a..9880c0e08 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -177,17 +177,45 @@ local function _newEmptyPlayer(id,mini) end local function _executeMod(P) local applyStatus=GAME.modApplyAt + if applyStatus=='always' then + if not GAME.modCodeList then GAME.modCodeList={} end + if not GAME.modCodeList[P.id] then GAME.modCodeList[P.id]={} end + + if not GAME.applyModTask then + function GAME.ApplyModsTask() + while GAME.playing do + for _,p in pairs(GAME.modCodeList) do + for _,c in pairs(p) do pcall(c) end + end + coroutine.yield() + end + -- Kill mod patching function when game stopped + TASK.removeTask_code(GAME.ApplyModsTask) + TABLE.cut(GAME.modCodeList) + GAME.modCodeList=nil + GAME.ApplyModsTask=nil + end + TASK.new(GAME.ApplyModsTask) + end + end + for i=1,#GAME.mod do if GAME.mod[i]>0 then local M=MODOPT[i] - if applyStatus~='always' or M.noAlwaysNeeded then + if applyStatus=='always' then + if M.funcA1 then + M.funcA1(P,M.list and M.list[GAME.mod[i]]) + elseif M.funcA then + table.insert(GAME.modCodeList[P.id],function() M.func(P,M.list and M.list[GAME.mod[i]]) end) + end + else -- Already checked pre or post before calling _executeMod() M.func(P,M.list and M.list[GAME.mod[i]]) end end end end local function _loadGameEnv(P)-- Load gameEnv - P.gameEnv={}-- Current game setting environment + P.gameEnv=TABLE.newWithLockMetamethod()-- Current game setting environment local ENV=P.gameEnv local GAME,SETTING=GAME,SETTING -- Load game settings @@ -210,21 +238,10 @@ local function _loadGameEnv(P)-- Load gameEnv ENV[k]=TABLE.copy(v) end end - - -- if not GAME.modCodeList then GAME.modCodeList={} end - -- if not GAME.modCodeList[P.id] then GAME.modCodeList[P.id]={} end - -- if ENV.allowMod then - -- for i=1,#GAME.mod do - -- if GAME.mod[i]>0 then - -- local M=MODOPT[i] - -- if not GAME.modPatch or M.executeFirst or M.onlyOnce then - -- M.func(P,M.list and M.list[GAME.mod[i]]) - -- elseif GAME.modPatch and not M.onlyOnce then - -- table.insert(GAME.modCodeList[P.id],function() M.func(P,M.list and M.list[GAME.mod[i]],true) end) - -- end - -- end - -- end - -- end + + if ENV.allowMod and GAME.modApplyAt=='preInit' then + _executeMod(P) + end end local function _loadRemoteEnv(P,confStr)-- Load gameEnv confStr=JSON.decode(confStr) @@ -308,25 +325,7 @@ local function _applyGameEnv(P)-- Finish gameEnv processing MES.new('warn',"Wrong event set type: "..type(ENV.eventSet)) end end - - -- if GAME.modPatch then - -- if not GAME.ApplyModsTask then - -- GAME.ApplyModsTask=function() - -- while GAME.playing do - -- for _,p in pairs(GAME.modCodeList) do - -- for _,c in pairs(p) do pcall(c) end - -- end - -- coroutine.yield() - -- end - -- -- Kill mod patching function when game stopped - -- TASK.removeTask_code(GAME.ApplyModsTask) - -- TABLE.cut(GAME.modCodeList) - -- GAME.modCodeList=nil - -- GAME.ApplyModsTask=nil - -- end - -- TASK.new(GAME.ApplyModsTask) - -- end - -- end + if ENV.allowMod and GAME.modApplyAt=='postInit' then _executeMod(P) end @@ -379,14 +378,10 @@ local function _applyGameEnv(P)-- Finish gameEnv processing ENV.nextPos=false end - local seqGen,seqCalled,initSZOcount,bagLineCounter - function P:resetSeqGen() - seqGen=coroutine.create(getSeqGen(ENV.sequence)) - seqCalled=false - initSZOcount=0 - bagLineCounter=0 - end - P:resetSeqGen() + local seqGen=coroutine.create(getSeqGen(ENV.sequence)) + local seqCalled=false + local initSZOcount=0 + local bagLineCounter=0 function P:newNext() local status,piece if seqCalled then From 68733170a38ecb6ed9b03d08dc98dbfee8fbdc80 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sat, 6 Jan 2024 12:57:39 +0700 Subject: [PATCH 13/38] Fix mods, update UI --- parts/gameTables.lua | 42 +++++++++++++++++++++--------------------- parts/player/init.lua | 4 +++- parts/scenes/mod.lua | 20 ++++++++++++++------ 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/parts/gameTables.lua b/parts/gameTables.lua index b7d4ab934..d013bb771 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -362,47 +362,47 @@ do-- Mod data ['fast'] =20, ['none'] =0, } - local function _lockVfunc(k) + local function _lockVfunc(k) do + local K=k return function(P,O) - if not P then return end - P.gameEnv[k]=O - P.gameEnv.__lock(k) + P.gameEnv[K]=O or true + P.gameEnv.__lock(K) end - end + end end MODOPT={-- Mod options -- funcA always triggered, funcA1 only triggered once, but both functions can lock values {no=0,id="NX",name="next", key="q",x=80,y=230,color='lO', list={0,1,2,3,4,5,6}, func =function(P,O) P.gameEnv.nextCount=O end, - funcA1=_lockVfunc('nextCount')(P,O), + funcA1=_lockVfunc('nextCount'), }, {no=1,id="HL",name="hold", key="w",x=200,y=230,color='lO', list={0,1,2,3,4,5,6}, func =function(P,O) P.gameEnv.holdCount=O end, - funcA1=_lockVfunc('holdCount')(P,O), + funcA1=_lockVfunc('holdCount'), }, {no=2,id="FL",name="hideNext", key="e",x=320,y=230,color='lA', list={1,2,3,4,5}, func =function(P,O) P.gameEnv.nextStartPos=O+1 end, - funcA1=_lockVfunc('nextStartPos')(P,O), + funcA1=_lockVfunc('nextStartPos'), }, {no=3,id="IH",name="infHold", key="r",x=440,y=230,color='lA', func =function(P) P.gameEnv.infHold=true end, - funcA1=_lockVfunc('infHold')(P,O), + funcA1=_lockVfunc('infHold'), }, {no=4,id="HB",name="hideBlock", key="y",x=680,y=230,color='lV', func =function(P) P.gameEnv.block=false end, - funcA1=_lockVfunc('block')(P,O), + funcA1=_lockVfunc('block'), }, {no=5,id="HG",name="hideGhost", key="u",x=800,y=230,color='lV', func =function(P) P.gameEnv.ghost=false end, - funcA1=_lockVfunc('ghost')(P,O), + funcA1=_lockVfunc('ghost'), }, {no=6,id="HD",name="hidden", key="i",x=920,y=230,color='lP', @@ -418,13 +418,13 @@ do-- Mod data key="o",x=1040,y=230,color='lP', list={'down','up','all'}, func =function(P,O) P.gameEnv.hideBoard=O end, - funcA1=_lockVfunc('hideBoard')(P,O), + funcA1=_lockVfunc('hideBoard'), }, {no=8,id="FB",name="flipBoard", key="p",x=1160,y=230,color='lJ', list={'U-D','L-R','180'}, func =function(P,O) P.gameEnv.flipBoard=O end, - funcA1=_lockVfunc('flipBoard')(P,O), + funcA1=_lockVfunc('flipBoard'), }, {no=9,id="DT",name="dropDelay", @@ -442,35 +442,35 @@ do-- Mod data key="s",x=260,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99}, func =function(P,O) P.gameEnv.lock=O end, - funcA1=_lockVfunc('lockDelay')(P,O), + funcA1=_lockVfunc('lockDelay'), }, {no=11,id="ST",name="waitDelay", key="d",x=380,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, func =function(P,O) P.gameEnv.wait=O end, - funcA1=_lockVfunc('waitDelay')(P,O), + funcA1=_lockVfunc('waitDelay'), }, {no=12,id="CT",name="fallDelay", key="f",x=500,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, func =function(P,O) P.gameEnv.fall=O end, - funcA1=_lockVfunc('fallDelay')(P,O), + funcA1=_lockVfunc('fallDelay'), }, {no=13,id="LF",name="life", key="j",x=860,y=350,color='lY', list={0,1,2,3,5,10,15,26,42,87,500}, func =function(P,O) P.gameEnv.life=O end, - funcA1=_lockVfunc('life')(P,O), + funcA1=_lockVfunc('life'), }, {no=14,id="FB",name="forceB2B", key="k",x=980,y=350,color='lY', func =function(P) P.gameEnv.b2bKill=true end, - funcA1=_lockVfunc('b2bKill')(P,O), + funcA1=_lockVfunc('b2bKill'), }, {no=15,id="PF",name="forceFinesse", key="l",x=1100,y=350,color='lY', func =function(P) P.gameEnv.fineKill=true end, - funcA1=_lockVfunc('fineKill')(P,O), + funcA1=_lockVfunc('fineKill'), }, {no=16,id="TL",name="tele", @@ -507,13 +507,13 @@ do-- Mod data key="b",x=680,y=470,color='lB', list={'bag','bagES','his','hisPool','c2','bagP1inf','rnd','mess','reverb'}, func =function(P,O) P.gameEnv.sequence=O end, - funcA1=_lockVfunc('sequence')(P,O), + funcA1=_lockVfunc('sequence'), }, {no=20,id="PS",name="pushSpeed", key="n",x=800,y=470,color='lB', list={.5,1,2,3,5,15,1e99}, func =function(P,O) P.gameEnv.pushSpeed=O end, - funcA1=_lockVfunc('pushSpeed')(P,O), + funcA1=_lockVfunc('pushSpeed'), }, {no=21,id="BN",name="boneBlock", key="m",x=920,y=470,color='lB', diff --git a/parts/player/init.lua b/parts/player/init.lua index 9880c0e08..e5115f2cb 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -207,6 +207,8 @@ local function _executeMod(P) M.funcA1(P,M.list and M.list[GAME.mod[i]]) elseif M.funcA then table.insert(GAME.modCodeList[P.id],function() M.func(P,M.list and M.list[GAME.mod[i]]) end) + else + M.func(P,M.list and M.list[GAME.mod[i]]) end else -- Already checked pre or post before calling _executeMod() M.func(P,M.list and M.list[GAME.mod[i]]) @@ -326,7 +328,7 @@ local function _applyGameEnv(P)-- Finish gameEnv processing end end - if ENV.allowMod and GAME.modApplyAt=='postInit' then + if ENV.allowMod and GAME.modApplyAt~='preInit' then _executeMod(P) end diff --git a/parts/scenes/mod.lua b/parts/scenes/mod.lua index 744109c2d..a9ab71454 100644 --- a/parts/scenes/mod.lua +++ b/parts/scenes/mod.lua @@ -98,7 +98,12 @@ function scene.draw() local t=M.time*.01-- t range:0~0.1 GC.scale(1+3*t) GC.rotate(t) - local rad,side=45,5 -- rad=40 --> circle (but that will be a story in the future) + local rad,side=45,5 + if GAME.modApplyAt=='always' then + if M.funcA then side=nil + elseif M.funcA1 then side=8 + else side=5 end + end local color=M.color GC.setColor(color[1],color[2],color[3],5*t) GC.circle('fill',0,0,rad,side) @@ -125,6 +130,9 @@ function scene.draw() if selected then setFont(30) GC.printf(text.modInfo[selected.name],70,540,950) + elseif WIDGET.isFocus(scene.widgetList.modApplyAt) then + setFont(20) + GC.printf(text.modApplyAtInstruction,70,540,950) else setFont(25) GC.printf(text.modInstruction,70,540,950) @@ -132,11 +140,11 @@ function scene.draw() end scene.widgetList={ - WIDGET.newText{name='title', x=80,y=50,font=70,align='L'}, - WIDGET.newText{name='unranked', x=1200,y=60,color='Y',font=50,align='R'}, - WIDGET.newSwitch{name='modPatch',x=1175,y=550,font=20,disp=function() return GAME.modPatch end,code=function() GAME.modPatch=not GAME.modPatch end}, - WIDGET.newButton{name='reset', x=1095,y=640,w=80,h=80,font=60,fText=CHAR.icon.trash,code=pressKey'tab'}, - WIDGET.newButton{name='back', x=1185,y=640,w=80,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene}, + WIDGET.newText{name='title', x= 80,y=50,font=70,align='L'}, + WIDGET.newText{name='unranked', x= 970,y=70,color='Y',font=50,align='R'}, + WIDGET.newSelector{name='modApplyAt',x=1100,y=100,w=230,color='Y',font=20,list={'preInit','postInit','always'},disp=function() return GAME.modApplyAt end,code=function(v) GAME.modApplyAt=v end}, + WIDGET.newButton{name='reset', x=1140,y=540,w=170,h=80,font=25,code=pressKey'tab'}, + WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene}, } return scene From 3825b7ccbfde9c7121cad1f3eafd9dc2cc118b22 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sat, 6 Jan 2024 12:57:49 +0700 Subject: [PATCH 14/38] Add VI translation --- parts/language/lang_vi.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/parts/language/lang_vi.lua b/parts/language/lang_vi.lua index fb03b4c4e..e2107b748 100644 --- a/parts/language/lang_vi.lua +++ b/parts/language/lang_vi.lua @@ -216,6 +216,7 @@ return { tryAnotherBuild="CO LOI KHI GIAI MA UTF-8! Neu dang choi Techmino tren Windows: hay doi tu x86 sang x64 va nguoc lai.", modInstruction="Hãy chọn modifier bạn muốn.\nMod cho phép bạn có thể tùy biến game, nhưng cũng có thể làm game sập.\nKể cả thế, hãy thoải mái và chơi theo cách của bạn!\nBạn có thể dùng bàn phím để chọn mod (giữ Shift để chọn lùi)\nĐiểm sẽ không được lưu lại khi dùng mod.", + modApplyAtInstruction="Chọn thời điểm bạn muốn mod được áp dụng.\npreInit: Áp dụng mod trước khi nạp chế độ chơi. Đây là tùy chọn mặc định từ phiên bản 0.17.15 trở về trước. Có thể gặp lỗi ở một số mod khi dùng tùy chọn này.\npostInit: Áp dụng mod sau khi nạp chế độ chơi, có thể sửa được một số lỗi ở preInit. Tuy nhiên, mod có thể bị mất tác dụng ở một số trường hợp, VD như sau khi hoàn thành một chặng trong game.\nalways: Áp dụng mod trong suốt cả màn chạy. Tùy chọn này sẽ giúp bạn giữ lại tác dụng của mod dù ở bất kì trường hợp nào.", modInfo={ next="NEXT\nGhi đè số gạch hiển thị ở hàng NEXT", hold="HOLD\nGhi đè số lượng gạch được giữ ở cột HOLD", @@ -457,8 +458,8 @@ C. Tay cầm chơi game (Gamepad): mod={ title="Mods", reset="Đặt lại (tab)", - modPatch="Bật bản vá mod", - unranked="Không tính điểm", + modApplyAt="Áp dụng mod khi", + unranked ="Không tính điểm", }, pause={ setting="Cài đặt (S)", From 869135a10c2ea812d37f3e151a82c32cc325a16d Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sat, 6 Jan 2024 14:43:50 +0700 Subject: [PATCH 15/38] Add English translation --- parts/language/lang_en.lua | 3 ++- parts/language/lang_vi.lua | 4 ++-- parts/scenes/mod.lua | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index 2f15366d4..c4795b055 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -209,6 +209,7 @@ return { tryAnotherBuild="UTF-8 decoding error. If you are using Microsoft Windows, please try to download the build with the different architecture. If you are using the x86 version of Techmino, try downloading the x64 version and vice versa.", modInstruction="Choose your modifiers here!\nMods allow you to change the rules in various ways, but they can also crash the game. Feel free to play the game your way!\nNote that scores are not saved when using mods. You can also toggle mods using your keyboard keys (hold Shift to reverse).", + modApplyAtInstruction="Choose when you want the mod to be applied.\npreInit: Apply the mod before loading the game mode. This is the default option from version 0.17.15 and earlier. Some mods may experience errors when using this option.\npostInit: Apply the mod after loading the game mode. This can fix some errors in preInit. However, the mod may be disabled in some cases, such as after completing a stage in the game.\nalways: Apply the mod throughout the entire game. This option will help you keep the mod's effects in any situation.", modInfo={ next="NEXT\nOverrides the number of Next pieces displayed.", hold="HOLD\nOverrides the number of Hold pieces displayed.", @@ -449,7 +450,7 @@ C. Gamepad }, mod={ title="Mods", - modPatch="Enable mod patch", + applyAt="Apply mods at", reset="Reset (tab)", unranked="Unranked", }, diff --git a/parts/language/lang_vi.lua b/parts/language/lang_vi.lua index e2107b748..ea148263f 100644 --- a/parts/language/lang_vi.lua +++ b/parts/language/lang_vi.lua @@ -216,7 +216,7 @@ return { tryAnotherBuild="CO LOI KHI GIAI MA UTF-8! Neu dang choi Techmino tren Windows: hay doi tu x86 sang x64 va nguoc lai.", modInstruction="Hãy chọn modifier bạn muốn.\nMod cho phép bạn có thể tùy biến game, nhưng cũng có thể làm game sập.\nKể cả thế, hãy thoải mái và chơi theo cách của bạn!\nBạn có thể dùng bàn phím để chọn mod (giữ Shift để chọn lùi)\nĐiểm sẽ không được lưu lại khi dùng mod.", - modApplyAtInstruction="Chọn thời điểm bạn muốn mod được áp dụng.\npreInit: Áp dụng mod trước khi nạp chế độ chơi. Đây là tùy chọn mặc định từ phiên bản 0.17.15 trở về trước. Có thể gặp lỗi ở một số mod khi dùng tùy chọn này.\npostInit: Áp dụng mod sau khi nạp chế độ chơi, có thể sửa được một số lỗi ở preInit. Tuy nhiên, mod có thể bị mất tác dụng ở một số trường hợp, VD như sau khi hoàn thành một chặng trong game.\nalways: Áp dụng mod trong suốt cả màn chạy. Tùy chọn này sẽ giúp bạn giữ lại tác dụng của mod dù ở bất kì trường hợp nào.", + modApplyAtInstruction="Chọn thời điểm bạn muốn mod được áp dụng.\npreInit: Áp dụng mod trước khi nạp chế độ chơi. Đây là tùy chọn mặc định từ phiên bản 0.17.15 trở về trước. Có thể gặp lỗi ở một số mod khi dùng tùy chọn này.\npostInit: Áp dụng mod sau khi nạp chế độ chơi, có thể sửa được một số lỗi ở preInit. Tuy nhiên, mod có thể bị mất tác dụng ở một số trường hợp, VD như sau khi hoàn thành một chặng trong game.\nalways: Áp dụng mod trong suốt cả game. Tùy chọn này sẽ giúp bạn giữ lại tác dụng của mod dù ở bất kì trường hợp nào.", modInfo={ next="NEXT\nGhi đè số gạch hiển thị ở hàng NEXT", hold="HOLD\nGhi đè số lượng gạch được giữ ở cột HOLD", @@ -458,7 +458,7 @@ C. Tay cầm chơi game (Gamepad): mod={ title="Mods", reset="Đặt lại (tab)", - modApplyAt="Áp dụng mod khi", + ApplyAt="Áp dụng mod khi", unranked ="Không tính điểm", }, pause={ diff --git a/parts/scenes/mod.lua b/parts/scenes/mod.lua index a9ab71454..c0602dd38 100644 --- a/parts/scenes/mod.lua +++ b/parts/scenes/mod.lua @@ -142,7 +142,7 @@ end scene.widgetList={ WIDGET.newText{name='title', x= 80,y=50,font=70,align='L'}, WIDGET.newText{name='unranked', x= 970,y=70,color='Y',font=50,align='R'}, - WIDGET.newSelector{name='modApplyAt',x=1100,y=100,w=230,color='Y',font=20,list={'preInit','postInit','always'},disp=function() return GAME.modApplyAt end,code=function(v) GAME.modApplyAt=v end}, + WIDGET.newSelector{name='applyAt',x=1100,y=100,w=230,color='Y',font=20,list={'preInit','postInit','always'},disp=function() return GAME.modApplyAt end,code=function(v) GAME.modApplyAt=v end}, WIDGET.newButton{name='reset', x=1140,y=540,w=170,h=80,font=25,code=pressKey'tab'}, WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene}, } From 766b32b1b46507d7debbf0b80bbf6d3762a43436 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:20:55 +0700 Subject: [PATCH 16/38] Final update --- parts/gameFuncs.lua | 7 +++++++ parts/gameTables.lua | 4 ++-- parts/language/lang_en.lua | 2 +- parts/language/lang_vi.lua | 4 ++-- parts/player/draw.lua | 8 +++++--- parts/player/init.lua | 10 +++++----- parts/player/player.lua | 2 +- parts/scenes/replays.lua | 1 + 8 files changed, 24 insertions(+), 14 deletions(-) diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index b1a899e7c..9f7090fca 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -997,6 +997,13 @@ do-- function resetGameData(args) local function task_showMods() -- TODO coroutine.yield() local counter=0 + + do + SFX.play('collect',.2) + TEXT.show(GAME.modApplyAt,640,26,45,'spin') + for _=1,90 do coroutine.yield() end + end + for number,sel in next,GAME.mod do if sel>0 then if counter==0 then diff --git a/parts/gameTables.lua b/parts/gameTables.lua index d013bb771..1251a49ac 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -481,7 +481,7 @@ do-- Mod data end, funcA1=function(P) for _,k in pairs{'das','arr','sddas','sdarr'} do - P.gameEnv[k]=O + P.gameEnv[k]=0 P.gameEnv.__lock(k) end end @@ -555,7 +555,7 @@ do-- Game data tables curMode=false, -- Current gamemode object initPlayerCount=0, -- Player count when init game mod=TABLE.new(0,#MODOPT),-- List of loaded mods - modApplyAt='preInit', -- Apply mod when? (preInit, postInit, always) + modApplyAt='postInit', -- Apply mod when? (preInit, postInit, always) modeEnv=false, -- Current gamemode environment setting={}, -- Game settings rep={}, -- Recording list, key,time,key,time... diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index c4795b055..ec6ef822a 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -209,7 +209,7 @@ return { tryAnotherBuild="UTF-8 decoding error. If you are using Microsoft Windows, please try to download the build with the different architecture. If you are using the x86 version of Techmino, try downloading the x64 version and vice versa.", modInstruction="Choose your modifiers here!\nMods allow you to change the rules in various ways, but they can also crash the game. Feel free to play the game your way!\nNote that scores are not saved when using mods. You can also toggle mods using your keyboard keys (hold Shift to reverse).", - modApplyAtInstruction="Choose when you want the mod to be applied.\npreInit: Apply the mod before loading the game mode. This is the default option from version 0.17.15 and earlier. Some mods may experience errors when using this option.\npostInit: Apply the mod after loading the game mode. This can fix some errors in preInit. However, the mod may be disabled in some cases, such as after completing a stage in the game.\nalways: Apply the mod throughout the entire game. This option will help you keep the mod's effects in any situation.", + modApplyAtInstruction="Choose when you want the modifier to be applied.\nprelnit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations. ", modInfo={ next="NEXT\nOverrides the number of Next pieces displayed.", hold="HOLD\nOverrides the number of Hold pieces displayed.", diff --git a/parts/language/lang_vi.lua b/parts/language/lang_vi.lua index ea148263f..d97e0e459 100644 --- a/parts/language/lang_vi.lua +++ b/parts/language/lang_vi.lua @@ -216,7 +216,7 @@ return { tryAnotherBuild="CO LOI KHI GIAI MA UTF-8! Neu dang choi Techmino tren Windows: hay doi tu x86 sang x64 va nguoc lai.", modInstruction="Hãy chọn modifier bạn muốn.\nMod cho phép bạn có thể tùy biến game, nhưng cũng có thể làm game sập.\nKể cả thế, hãy thoải mái và chơi theo cách của bạn!\nBạn có thể dùng bàn phím để chọn mod (giữ Shift để chọn lùi)\nĐiểm sẽ không được lưu lại khi dùng mod.", - modApplyAtInstruction="Chọn thời điểm bạn muốn mod được áp dụng.\npreInit: Áp dụng mod trước khi nạp chế độ chơi. Đây là tùy chọn mặc định từ phiên bản 0.17.15 trở về trước. Có thể gặp lỗi ở một số mod khi dùng tùy chọn này.\npostInit: Áp dụng mod sau khi nạp chế độ chơi, có thể sửa được một số lỗi ở preInit. Tuy nhiên, mod có thể bị mất tác dụng ở một số trường hợp, VD như sau khi hoàn thành một chặng trong game.\nalways: Áp dụng mod trong suốt cả game. Tùy chọn này sẽ giúp bạn giữ lại tác dụng của mod dù ở bất kì trường hợp nào.", + modApplyAtInstruction="Chọn thời điểm bạn muốn mod được áp dụng.\npreInit: Trước khi nạp game. Đây là tùy chọn mặc định từ phiên bản 0.17.15 trở về trước. Một số mod có thể gặp vấn đề nếu dùng tùy chọn này.\npostInit: Sau khi nạp chế độ chơi, có thể sửa được một số lỗi ở preInit. Tuy nhiên, mod có thể bị mất tác dụng ở một số trường hợp nhất định.\nalways: Luôn áp dụng trong cả game. Tùy chọn này sẽ giúp bạn giữ lại tác dụng của mod dù ở bất kì trường hợp nào.", modInfo={ next="NEXT\nGhi đè số gạch hiển thị ở hàng NEXT", hold="HOLD\nGhi đè số lượng gạch được giữ ở cột HOLD", @@ -458,7 +458,7 @@ C. Tay cầm chơi game (Gamepad): mod={ title="Mods", reset="Đặt lại (tab)", - ApplyAt="Áp dụng mod khi", + applyAt="Áp dụng mod khi", unranked ="Không tính điểm", }, pause={ diff --git a/parts/player/draw.lua b/parts/player/draw.lua index f83feb018..259b884d1 100644 --- a/parts/player/draw.lua +++ b/parts/player/draw.lua @@ -787,9 +787,11 @@ function draw.norm(P,repMode) gc_scale(P.size) -- Draw username - setFont(30) - gc_setColor(GROUP_COLORS[P.group]) - GC.mStr(P.username or USERS.getUsername(P.uid),300,-60) + if usingMod() and P.frameRun>480 then + setFont(30) + gc_setColor(GROUP_COLORS[P.group]) + GC.mStr(P.username or USERS.getUsername(P.uid),300,-60) + end -- Draw HUD if ENV.nextCount>0 then _drawNext(P,repMode) end diff --git a/parts/player/init.lua b/parts/player/init.lua index e5115f2cb..b5d74918e 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -182,7 +182,7 @@ local function _executeMod(P) if not GAME.modCodeList[P.id] then GAME.modCodeList[P.id]={} end if not GAME.applyModTask then - function GAME.ApplyModsTask() + function GAME.applyModsTask() while GAME.playing do for _,p in pairs(GAME.modCodeList) do for _,c in pairs(p) do pcall(c) end @@ -190,12 +190,12 @@ local function _executeMod(P) coroutine.yield() end -- Kill mod patching function when game stopped - TASK.removeTask_code(GAME.ApplyModsTask) - TABLE.cut(GAME.modCodeList) + TABLE.clear(GAME.modCodeList) + TASK.removeTask_code(GAME.applyModsTask) GAME.modCodeList=nil - GAME.ApplyModsTask=nil + GAME.applyModsTask=nil end - TASK.new(GAME.ApplyModsTask) + TASK.new(GAME.applyModsTask) end end diff --git a/parts/player/player.lua b/parts/player/player.lua index 9d0ab1670..e84a2bad8 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -2786,7 +2786,7 @@ function Player:_die() end end end - if GAME.ApplyModsTask then + if GAME.applyModsTask then TABLE.cut(GAME.modCodeList[self.id]) end end diff --git a/parts/scenes/replays.lua b/parts/scenes/replays.lua index 3d8473b3b..0c77b66e2 100644 --- a/parts/scenes/replays.lua +++ b/parts/scenes/replays.lua @@ -48,6 +48,7 @@ local function _playRep(fileName) for _,m in next,rep.mod do GAME.mod[m[1]+1]=m[2] end + GAME.modApplyAt=rep.modApplyAt or 'preInit' -- For V0.17.15 and older GAME.rep={} DATA.pumpRecording(rep.data,GAME.rep) From 70558e82db7893f6b856cac270605e859bf89afd Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sat, 6 Jan 2024 22:54:17 +0700 Subject: [PATCH 17/38] Add viewLog --- parts/char.lua | 4 +- parts/scenes/app_console.lua | 9 +++ parts/scenes/viewLog.lua | 125 +++++++++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 parts/scenes/viewLog.lua diff --git a/parts/char.lua b/parts/char.lua index 5f67aa7aa..bfcfef5b8 100644 --- a/parts/char.lua +++ b/parts/char.lua @@ -73,8 +73,8 @@ local L={ hollowLogo= 0xF008C, toUp= 0xF008D, toDown= 0xF008E, - toLeft= 0xF008F, - toRight= 0xF0090, + toLeft= 0xF0090, + toRight= 0xF008F, checkMark= 0xF0091, crossMark= 0xF0092, musicMark= 0xF0093, diff --git a/parts/scenes/app_console.lua b/parts/scenes/app_console.lua index bb6d5dbc5..1ab2340af 100644 --- a/parts/scenes/app_console.lua +++ b/parts/scenes/app_console.lua @@ -377,6 +377,15 @@ local commands={} do "Usage: openurl [url]", }, } + commands.viewlog={ + code=goScene('viewLog'), + description="View crashes' log", + details={ + "Open crashes' log to view right at the spot", + "", + "Usage: viewLog" + } + } commands.scrinfo={ code=function() for _,v in next,SCR.info() do diff --git a/parts/scenes/viewLog.lua b/parts/scenes/viewLog.lua new file mode 100644 index 000000000..62a750d8b --- /dev/null +++ b/parts/scenes/viewLog.lua @@ -0,0 +1,125 @@ +local fullLog,currentLog + +local gc=love.graphics +local scene={} +local textBox=WIDGET.newTextBox{name='texts',x=30,y=45,w=1000,h=540,font=20,fix=true} + +function scene.enter() + fullLog=(FILE.load('/conf/error.log','-string -canskip') or '/conf/error.log not found'):split('\n\n') + TABLE.reverse(fullLog) + + currentLog=1 + textBox:setTexts(fullLog[1]:split('\n')) + + if fullLog[1]=='/conf/error.log not found' then + local _w=scene.widgetList + _w.del .hide=true + _w.delA.hide=true + _w.next.hide=true + _w.prev.hide=true + _w.home.hide=true + _w.endd.hide=true + textBox.font=25 + textBox:reset() + else + textBox.font=15 + textBox:reset() + end +end + +local sureTime=-1e99 +local function deleteAllExcludeLast10() + local function task_redButton() + scene.widgetList.del.color=COLOR.R + for _=1,120 do coroutine.yield() end + scene.widgetList.del.color=COLOR.Z + end + + if TIME()-sureTime<1 then + sureTime=-1e99 + scene.widgetList.del.color=COLOR.Z + do + local temp=TABLE.sub(TABLE.copy(fullLog),1,10) + fullLog=TABLE.copy(temp) + temp=table.concat(temp,'\n\n')..'\n\n' + FILE.save(temp,'/conf/error.log','-string') + scene.keyDown('home') + TASK.removeTask_code(task_redButton) + end + else + sureTime=TIME() + MES.new('warn',text.sureDelete) + TASK.removeTask_code(task_redButton) + TASK.new(task_redButton) + end +end +local function deleteAll() + local function task_redButton() + scene.widgetList.delA.color=COLOR.R + for _=1,120 do coroutine.yield() end + scene.widgetList.delA.color=COLOR.Z + end + + if TIME()-sureTime<1 then + sureTime=-1e99 + scene.widgetList.delA.color=COLOR.Z + love.filesystem.remove('/conf/error.log') + TASK.removeTask_code(task_redButton) + SCN.swapTo('viewLog','none') + else + sureTime=TIME() + MES.new('warn',text.sureDelete) + TASK.removeTask_code(task_redButton) + TASK.new(task_redButton) + end +end + +function scene.wheelMoved(_,y) + WHEELMOV(y) +end + +function scene.keyDown(key) + if key=='left' then + currentLog=math.max(1,currentLog-1) + textBox:setTexts(fullLog[currentLog]:split('\n')) + elseif key=='right' then + currentLog=math.min(currentLog+1,#fullLog) + textBox:setTexts(fullLog[currentLog]:split('\n')) + elseif key=='home' then + currentLog=1 + textBox:setTexts(fullLog[1]:split('\n')) + elseif key=='end' then + currentLog=#fullLog + textBox:setTexts(fullLog[#fullLog]:split('\n')) + elseif key=='up' then + textBox:scroll(-5) + elseif key=='down' then + textBox:scroll(5) + elseif key=='pageup' then + textBox:scroll(-20) + elseif key=='pagedown' then + textBox:scroll(20) + elseif key=='escape' then + SCN.back() + end +end + +function scene.draw() + setFont(40) + gc.print(currentLog..' / '..#fullLog,1000,800) +end + +scene.widgetList={ + textBox, + WIDGET.newButton{name='prev',x=1140,y= 90,w=170,h=80,sound='click',font=60,fText=CHAR.key.left ,code=pressKey('left')}, + WIDGET.newButton{name='next',x=1140,y=190,w=170,h=80,sound='click',font=60,fText=CHAR.key.right ,code=pressKey('right')}, + WIDGET.newButton{name='home',x=1140,y=290,w=170,h=80,sound='click',font=60,fText=CHAR.key.macHome,code=pressKey('home')}, + WIDGET.newButton{name='endd',x=1140,y=390,w=170,h=80,sound='click',font=60,fText=CHAR.key.macEnd ,code=pressKey('end')}, + + WIDGET.newKey {name='del' ,x= 260,y=640,w=450,h=80,sound=false, font=30,fText='Delete all log exclude last 10',color='Z',code=deleteAllExcludeLast10}, + WIDGET.newKey {name='delA',x= 620,y=640,w=250,h=80,sound=false, font=30,fText='DELETE ALL!',color='Z',code=deleteAll}, + + WIDGET.newButton{name='back',x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene}, +} + +return scene From 6594b4a238b462f94514c1fdb1891cc1d0250f99 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:04:49 +0700 Subject: [PATCH 18/38] Fix viewLog --- parts/scenes/viewLog.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/parts/scenes/viewLog.lua b/parts/scenes/viewLog.lua index 62a750d8b..eb75aadfd 100644 --- a/parts/scenes/viewLog.lua +++ b/parts/scenes/viewLog.lua @@ -19,9 +19,18 @@ function scene.enter() _w.prev.hide=true _w.home.hide=true _w.endd.hide=true + _w.copy.hide=true textBox.font=25 textBox:reset() else + local _w=scene.widgetList + _w.del .hide=false + _w.delA.hide=false + _w.next.hide=false + _w.prev.hide=false + _w.home.hide=false + _w.endd.hide=false + _w.copy.hide=false textBox.font=15 textBox:reset() end @@ -115,6 +124,7 @@ scene.widgetList={ WIDGET.newButton{name='next',x=1140,y=190,w=170,h=80,sound='click',font=60,fText=CHAR.key.right ,code=pressKey('right')}, WIDGET.newButton{name='home',x=1140,y=290,w=170,h=80,sound='click',font=60,fText=CHAR.key.macHome,code=pressKey('home')}, WIDGET.newButton{name='endd',x=1140,y=390,w=170,h=80,sound='click',font=60,fText=CHAR.key.macEnd ,code=pressKey('end')}, + WIDGET.newButton{name='copy',x=1140,y=490,w=170,h=80,sound='click',font=60,fText=CHAR.icon.copy ,code=function() love.system.setClipboardText(table.concat(textBox.texts,'\n')) end}, WIDGET.newKey {name='del' ,x= 260,y=640,w=450,h=80,sound=false, font=30,fText='Delete all log exclude last 10',color='Z',code=deleteAllExcludeLast10}, WIDGET.newKey {name='delA',x= 620,y=640,w=250,h=80,sound=false, font=30,fText='DELETE ALL!',color='Z',code=deleteAll}, From d09f5b017649150cbee0b54ad787cb0b50ee5bf9 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sun, 7 Jan 2024 11:23:54 +0700 Subject: [PATCH 19/38] update viewlog --- parts/scenes/viewLog.lua | 183 +++++++++++++++++++++++---------------- 1 file changed, 110 insertions(+), 73 deletions(-) diff --git a/parts/scenes/viewLog.lua b/parts/scenes/viewLog.lua index eb75aadfd..e65e2fe9e 100644 --- a/parts/scenes/viewLog.lua +++ b/parts/scenes/viewLog.lua @@ -1,85 +1,122 @@ -local fullLog,currentLog +local fullLog,currentLogID +local logTimeList={} +local currentLogText={} local gc=love.graphics local scene={} -local textBox=WIDGET.newTextBox{name='texts',x=30,y=45,w=1000,h=540,font=20,fix=true} + +local textBox=WIDGET.newTextBox {x= 30,y= 45,w=1000,h=540,font=25,fix=true} +local logList=WIDGET.newSelector{x=305,y=640,w= 550,name='list',color='O',fText='Crash log',list={''},disp=function() return '' end,code=function() end} + +local function updateText() + currentLogText=fullLog[currentLogID]:split('\n') + do + local _,wt=getFont(25):getWrap(fullLog[currentLogID],975) + textBox:setTexts(wt) + end + logList:reset() +end function scene.enter() fullLog=(FILE.load('/conf/error.log','-string -canskip') or '/conf/error.log not found'):split('\n\n') TABLE.reverse(fullLog) - currentLog=1 - textBox:setTexts(fullLog[1]:split('\n')) + currentLogID=1 + updateText() if fullLog[1]=='/conf/error.log not found' then local _w=scene.widgetList - _w.del .hide=true - _w.delA.hide=true - _w.next.hide=true - _w.prev.hide=true - _w.home.hide=true - _w.endd.hide=true - _w.copy.hide=true + _w.home.hide=true;_w.list.hide=true + _w.endd.hide=true;_w.del .hide=true + _w.copy.hide=true;_w.delA.hide=true + textBox.font=25 textBox:reset() + + logList.list={''} + logList.select=false + logList.disp=function() return '' end + logList.code=function() end + logList:reset() else local _w=scene.widgetList - _w.del .hide=false - _w.delA.hide=false - _w.next.hide=false - _w.prev.hide=false - _w.home.hide=false - _w.endd.hide=false - _w.copy.hide=false + _w.home.hide=false;_w.list.hide=false + _w.endd.hide=false;_w.del .hide=false + _w.copy.hide=false;_w.delA.hide=false + textBox.font=15 textBox:reset() + + for i,d in pairs(fullLog) do logTimeList[i]=d:split('\n')[1] end + + logList.list=logTimeList + logList.select=false + logList.disp=function() return currentLogText[1] end + logList.code=function() currentLogID=logList.select updateText() end + logList:reset() end end +local deleteOld,deleteAll +do + local sureTime=-1e99 + function deleteOld() + local function task_redButton() + scene.widgetList.del.color=COLOR.R + for _=1,120 do coroutine.yield() end + scene.widgetList.del.color=COLOR.Z + end -local sureTime=-1e99 -local function deleteAllExcludeLast10() - local function task_redButton() - scene.widgetList.del.color=COLOR.R - for _=1,120 do coroutine.yield() end - scene.widgetList.del.color=COLOR.Z - end + if TIME()-sureTime<1 then + sureTime=-1e99 + scene.widgetList.del.color=COLOR.Z + do + local temp=TABLE.sub(TABLE.copy(fullLog),1,25) + fullLog=TABLE.copy(temp) + temp=table.concat(temp,'\n\n')..'\n\n' + TASK.removeTask_code(task_redButton) - if TIME()-sureTime<1 then - sureTime=-1e99 - scene.widgetList.del.color=COLOR.Z - do - local temp=TABLE.sub(TABLE.copy(fullLog),1,10) - fullLog=TABLE.copy(temp) - temp=table.concat(temp,'\n\n')..'\n\n' - FILE.save(temp,'/conf/error.log','-string') - scene.keyDown('home') + logTimeList=TABLE.sub(logTimeList,1,25) + logList.list=logTimeList + logList.select=25 + scene.keyDown('end') + + FILE.save(temp,'/conf/error.log','-string') + end + else + sureTime=TIME() + MES.new('warn',text.sureDelete) TASK.removeTask_code(task_redButton) + TASK.new(task_redButton) end - else - sureTime=TIME() - MES.new('warn',text.sureDelete) - TASK.removeTask_code(task_redButton) - TASK.new(task_redButton) end end -local function deleteAll() - local function task_redButton() - scene.widgetList.delA.color=COLOR.R - for _=1,120 do coroutine.yield() end - scene.widgetList.delA.color=COLOR.Z - end +do + local sureTime=-1e99 + function deleteAll() + local function task_redButton() + scene.widgetList.delA.color=COLOR.R + for _=1,120 do coroutine.yield() end + scene.widgetList.delA.color=COLOR.Z + end - if TIME()-sureTime<1 then - sureTime=-1e99 - scene.widgetList.delA.color=COLOR.Z - love.filesystem.remove('/conf/error.log') - TASK.removeTask_code(task_redButton) - SCN.swapTo('viewLog','none') - else - sureTime=TIME() - MES.new('warn',text.sureDelete) - TASK.removeTask_code(task_redButton) - TASK.new(task_redButton) + if TIME()-sureTime<1 then + sureTime=-1e99 + scene.widgetList.delA.color=COLOR.Z + love.filesystem.remove('/conf/error.log') + TASK.removeTask_code(task_redButton) + + logList.list={''} + logList.select=false + logList.disp=function() return '' end + logList.code=function() end + logList:reset() + SCN.swapTo('viewLog','none') + else + sureTime=TIME() + MES.new('warn',text.sureDelete) + TASK.removeTask_code(task_redButton) + TASK.new(task_redButton) + end end end @@ -89,17 +126,17 @@ end function scene.keyDown(key) if key=='left' then - currentLog=math.max(1,currentLog-1) - textBox:setTexts(fullLog[currentLog]:split('\n')) + currentLogID=math.max(1,currentLogID-1) + updateText() elseif key=='right' then - currentLog=math.min(currentLog+1,#fullLog) - textBox:setTexts(fullLog[currentLog]:split('\n')) + currentLogID=math.min(currentLogID+1,#fullLog) + updateText() elseif key=='home' then - currentLog=1 - textBox:setTexts(fullLog[1]:split('\n')) + currentLogID=1 + updateText() elseif key=='end' then - currentLog=#fullLog - textBox:setTexts(fullLog[#fullLog]:split('\n')) + currentLogID=#fullLog + updateText() elseif key=='up' then textBox:scroll(-5) elseif key=='down' then @@ -115,21 +152,21 @@ end function scene.draw() setFont(40) - gc.print(currentLog..' / '..#fullLog,1000,800) + gc.print(currentLogID..' / '..#fullLog,1000,800) end scene.widgetList={ textBox, - WIDGET.newButton{name='prev',x=1140,y= 90,w=170,h=80,sound='click',font=60,fText=CHAR.key.left ,code=pressKey('left')}, - WIDGET.newButton{name='next',x=1140,y=190,w=170,h=80,sound='click',font=60,fText=CHAR.key.right ,code=pressKey('right')}, - WIDGET.newButton{name='home',x=1140,y=290,w=170,h=80,sound='click',font=60,fText=CHAR.key.macHome,code=pressKey('home')}, - WIDGET.newButton{name='endd',x=1140,y=390,w=170,h=80,sound='click',font=60,fText=CHAR.key.macEnd ,code=pressKey('end')}, - WIDGET.newButton{name='copy',x=1140,y=490,w=170,h=80,sound='click',font=60,fText=CHAR.icon.copy ,code=function() love.system.setClipboardText(table.concat(textBox.texts,'\n')) end}, + WIDGET.newButton {name='home',x=1140,y= 90,w=170,h=80,sound='click',font=60,fText=CHAR.key.macHome,code=pressKey('home')}, + WIDGET.newButton {name='endd',x=1140,y=190,w=170,h=80,sound='click',font=60,fText=CHAR.key.macEnd ,code=pressKey('end')}, + WIDGET.newButton {name='copy',x=1140,y=290,w=170,h=80,sound='click',font=60,fText=CHAR.icon.copy ,code=function()love.system.setClipboardText(table.concat(textBox.texts,'\n'))end}, + + logList, - WIDGET.newKey {name='del' ,x= 260,y=640,w=450,h=80,sound=false, font=30,fText='Delete all log exclude last 10',color='Z',code=deleteAllExcludeLast10}, - WIDGET.newKey {name='delA',x= 620,y=640,w=250,h=80,sound=false, font=30,fText='DELETE ALL!',color='Z',code=deleteAll}, + WIDGET.newKey {name='del' ,x= 710,y=640,w=200,h=80,sound=false, font=30,fText='Clear old' ,color='Z',code=deleteOld}, + WIDGET.newKey {name='delA',x= 930,y=640,w=200,h=80,sound=false, font=30,fText='DELETE ALL!',color='Z',code=deleteAll}, - WIDGET.newButton{name='back',x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene}, + WIDGET.newButton {name='back',x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene}, } return scene From 898539cab901bda7a4275df2136189dc0a162a36 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sun, 7 Jan 2024 17:27:07 +0700 Subject: [PATCH 20/38] update viewLog --- parts/scenes/viewLog.lua | 93 ++++++++++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 31 deletions(-) diff --git a/parts/scenes/viewLog.lua b/parts/scenes/viewLog.lua index e65e2fe9e..077115f5f 100644 --- a/parts/scenes/viewLog.lua +++ b/parts/scenes/viewLog.lua @@ -3,6 +3,7 @@ local logTimeList={} local currentLogText={} local gc=love.graphics +local min,max=math.min,math.max local scene={} local textBox=WIDGET.newTextBox {x= 30,y= 45,w=1000,h=540,font=25,fix=true} @@ -14,6 +15,20 @@ local function updateText() local _,wt=getFont(25):getWrap(fullLog[currentLogID],975) textBox:setTexts(wt) end + logList.select=currentLogID + logList.selText=currentLogText[1] +end + +local function noLogFound() + local _w=scene.widgetList + _w.home.hide=true;_w.list.hide=true + _w.endd.hide=true;_w.del .hide=true + _w.copy.hide=true;_w.delA.hide=true + + logList.list={''} + logList.select=false + logList.disp=function() return '' end + logList.code=function() end logList:reset() end @@ -25,34 +40,53 @@ function scene.enter() updateText() if fullLog[1]=='/conf/error.log not found' then - local _w=scene.widgetList - _w.home.hide=true;_w.list.hide=true - _w.endd.hide=true;_w.del .hide=true - _w.copy.hide=true;_w.delA.hide=true - - textBox.font=25 - textBox:reset() - - logList.list={''} - logList.select=false - logList.disp=function() return '' end - logList.code=function() end - logList:reset() + noLogFound() else local _w=scene.widgetList _w.home.hide=false;_w.list.hide=false _w.endd.hide=false;_w.del .hide=false _w.copy.hide=false;_w.delA.hide=false - textBox.font=15 - textBox:reset() - for i,d in pairs(fullLog) do logTimeList[i]=d:split('\n')[1] end + function logList:press(x) + if x then + local s=self.select + if x1 then + s=s-1 + SYSFX.newShade(3,self.x,self.y-WIDGET.scrollPos,self.w*.5,60) + end + else + if s<#self.list then + s=s+1 + SYSFX.newShade(3,self.x+self.w*.5,self.y-WIDGET.scrollPos,self.w*.5,60) + end + end + if self.select~=s then + self.code(s) + self.select=s + self.selText=self.list[s] + if self.sound then + SFX.play('selector') + end + end + end + end + logList.list=logTimeList logList.select=false logList.disp=function() return currentLogText[1] end - logList.code=function() currentLogID=logList.select updateText() end + logList.code=function(s) + if s>currentLogID then + scene.keyDown('right') + MES.new('','right') + else + scene.keyDown('left') + MES.new('','left') + end + updateText() + end logList:reset() end end @@ -61,14 +95,14 @@ do local sureTime=-1e99 function deleteOld() local function task_redButton() - scene.widgetList.del.color=COLOR.R + scene.widgetList.del.color=COLOR.Y for _=1,120 do coroutine.yield() end - scene.widgetList.del.color=COLOR.Z + scene.widgetList.del.color=COLOR.dY end if TIME()-sureTime<1 then sureTime=-1e99 - scene.widgetList.del.color=COLOR.Z + scene.widgetList.del.color=COLOR.dY do local temp=TABLE.sub(TABLE.copy(fullLog),1,25) fullLog=TABLE.copy(temp) @@ -76,9 +110,10 @@ do TASK.removeTask_code(task_redButton) logTimeList=TABLE.sub(logTimeList,1,25) + currentLogID=min(logList.select,25) logList.list=logTimeList - logList.select=25 - scene.keyDown('end') + logList.select=currentLogID + updateText() FILE.save(temp,'/conf/error.log','-string') end @@ -96,20 +131,16 @@ do local function task_redButton() scene.widgetList.delA.color=COLOR.R for _=1,120 do coroutine.yield() end - scene.widgetList.delA.color=COLOR.Z + scene.widgetList.delA.color=COLOR.dR end if TIME()-sureTime<1 then sureTime=-1e99 - scene.widgetList.delA.color=COLOR.Z + scene.widgetList.delA.color=COLOR.dR love.filesystem.remove('/conf/error.log') TASK.removeTask_code(task_redButton) - logList.list={''} - logList.select=false - logList.disp=function() return '' end - logList.code=function() end - logList:reset() + noLogFound() SCN.swapTo('viewLog','none') else sureTime=TIME() @@ -163,8 +194,8 @@ scene.widgetList={ logList, - WIDGET.newKey {name='del' ,x= 710,y=640,w=200,h=80,sound=false, font=30,fText='Clear old' ,color='Z',code=deleteOld}, - WIDGET.newKey {name='delA',x= 930,y=640,w=200,h=80,sound=false, font=30,fText='DELETE ALL!',color='Z',code=deleteAll}, + WIDGET.newKey {name='del' ,x= 710,y=640,w=200,h=80,sound=false, font=30,fText='Clear old' ,color='dY',code=deleteOld}, + WIDGET.newKey {name='delA',x= 930,y=640,w=200,h=80,sound=false, font=30,fText='DELETE ALL!',color='dR',code=deleteAll}, WIDGET.newButton {name='back',x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene}, } From 65c050f6df9867f19b509d00a08efd7ffad63b17 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sun, 7 Jan 2024 18:43:46 +0700 Subject: [PATCH 21/38] Small update for viewLog --- parts/scenes/viewLog.lua | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/parts/scenes/viewLog.lua b/parts/scenes/viewLog.lua index 077115f5f..c8e10c316 100644 --- a/parts/scenes/viewLog.lua +++ b/parts/scenes/viewLog.lua @@ -53,13 +53,11 @@ function scene.enter() if x then local s=self.select if x1 then - s=s-1 + if s>1 then s=s-1 SYSFX.newShade(3,self.x,self.y-WIDGET.scrollPos,self.w*.5,60) end else - if s<#self.list then - s=s+1 + if s<#self.list then s=s+1 SYSFX.newShade(3,self.x+self.w*.5,self.y-WIDGET.scrollPos,self.w*.5,60) end end @@ -67,9 +65,7 @@ function scene.enter() self.code(s) self.select=s self.selText=self.list[s] - if self.sound then - SFX.play('selector') - end + if self.sound then SFX.play('selector') end end end end @@ -78,13 +74,8 @@ function scene.enter() logList.select=false logList.disp=function() return currentLogText[1] end logList.code=function(s) - if s>currentLogID then - scene.keyDown('right') - MES.new('','right') - else - scene.keyDown('left') - MES.new('','left') - end + if s>currentLogID then scene.keyDown('right') + else scene.keyDown('left') end updateText() end logList:reset() @@ -190,7 +181,7 @@ scene.widgetList={ textBox, WIDGET.newButton {name='home',x=1140,y= 90,w=170,h=80,sound='click',font=60,fText=CHAR.key.macHome,code=pressKey('home')}, WIDGET.newButton {name='endd',x=1140,y=190,w=170,h=80,sound='click',font=60,fText=CHAR.key.macEnd ,code=pressKey('end')}, - WIDGET.newButton {name='copy',x=1140,y=290,w=170,h=80,sound='click',font=60,fText=CHAR.icon.copy ,code=function()love.system.setClipboardText(table.concat(textBox.texts,'\n'))end}, + WIDGET.newButton {name='copy',x=1140,y=290,w=170,h=80,sound='click',font=60,fText=CHAR.icon.copy ,code=function()love.system.setClipboardText(table.concat(textBox.texts,'\n'))end,color='lC'}, logList, From 2816a76f5ab21dac4d388abe762bd4d5d2cbf0c1 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sun, 7 Jan 2024 18:45:21 +0700 Subject: [PATCH 22/38] Fix bugs and small changes to other thing --- parts/gameFuncs.lua | 2 +- parts/gameTables.lua | 2 +- parts/player/draw.lua | 2 +- parts/player/init.lua | 4 ++-- parts/scenes/dict.lua | 2 +- parts/scenes/mod.lua | 3 +++ 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index 9f7090fca..dbcfcf787 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -998,7 +998,7 @@ do-- function resetGameData(args) coroutine.yield() local counter=0 - do + if GAME.modUsed then SFX.play('collect',.2) TEXT.show(GAME.modApplyAt,640,26,45,'spin') for _=1,90 do coroutine.yield() end diff --git a/parts/gameTables.lua b/parts/gameTables.lua index 1251a49ac..5af867b2c 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -402,7 +402,7 @@ do-- Mod data {no=5,id="HG",name="hideGhost", key="u",x=800,y=230,color='lV', func =function(P) P.gameEnv.ghost=false end, - funcA1=_lockVfunc('ghost'), + funcA1=function(P) P.gameEnv.ghost=false; P.gameEnv.__lock('ghost') end, }, {no=6,id="HD",name="hidden", key="i",x=920,y=230,color='lP', diff --git a/parts/player/draw.lua b/parts/player/draw.lua index 259b884d1..60e3016cc 100644 --- a/parts/player/draw.lua +++ b/parts/player/draw.lua @@ -787,7 +787,7 @@ function draw.norm(P,repMode) gc_scale(P.size) -- Draw username - if usingMod() and P.frameRun>480 then + if GAME.modUsed and P.frameRun>480 or true then setFont(30) gc_setColor(GROUP_COLORS[P.group]) GC.mStr(P.username or USERS.getUsername(P.uid),300,-60) diff --git a/parts/player/init.lua b/parts/player/init.lua index b5d74918e..975f5a57b 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -181,7 +181,7 @@ local function _executeMod(P) if not GAME.modCodeList then GAME.modCodeList={} end if not GAME.modCodeList[P.id] then GAME.modCodeList[P.id]={} end - if not GAME.applyModTask then + if not GAME.applyModsTask then function GAME.applyModsTask() while GAME.playing do for _,p in pairs(GAME.modCodeList) do @@ -190,8 +190,8 @@ local function _executeMod(P) coroutine.yield() end -- Kill mod patching function when game stopped - TABLE.clear(GAME.modCodeList) TASK.removeTask_code(GAME.applyModsTask) + TABLE.clear(GAME.modCodeList) GAME.modCodeList=nil GAME.applyModsTask=nil end diff --git a/parts/scenes/dict.lua b/parts/scenes/dict.lua index bad3648ba..f899977b7 100644 --- a/parts/scenes/dict.lua +++ b/parts/scenes/dict.lua @@ -210,7 +210,7 @@ function scene.keyDown(key) CHAR.controller.xboxX,CHAR.controller.xboxY,CHAR.controller.xboxA,CHAR.controller.xboxB, CHAR.icon.help,CHAR.icon.copy,CHAR.icon.globe,CHAR.key.winMenu) ):split('\n'), - currentFontSize, + 20, 'rainbow' ) diff --git a/parts/scenes/mod.lua b/parts/scenes/mod.lua index c0602dd38..ed3d22d05 100644 --- a/parts/scenes/mod.lua +++ b/parts/scenes/mod.lua @@ -23,6 +23,9 @@ function scene.enter() scene.widgetList.unranked.hide=scoreValid() BG.set('tunnel') end +function scene.back() + GAME.modUsed=usingMod() +end function scene.mouseMove(x,y) selected=false From d61372c041b931a715cdf5b69fae765e273691b7 Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sun, 7 Jan 2024 19:29:45 +0700 Subject: [PATCH 23/38] Small tweak --- parts/player/draw.lua | 2 +- parts/scenes/mod.lua | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/parts/player/draw.lua b/parts/player/draw.lua index 60e3016cc..19c712a1b 100644 --- a/parts/player/draw.lua +++ b/parts/player/draw.lua @@ -787,7 +787,7 @@ function draw.norm(P,repMode) gc_scale(P.size) -- Draw username - if GAME.modUsed and P.frameRun>480 or true then + if GAME.modUsed and P.frameRun>GAME.modUsed*2.6 or not GAME.modUsed then setFont(30) gc_setColor(GROUP_COLORS[P.group]) GC.mStr(P.username or USERS.getUsername(P.uid),300,-60) diff --git a/parts/scenes/mod.lua b/parts/scenes/mod.lua index ed3d22d05..763815fbb 100644 --- a/parts/scenes/mod.lua +++ b/parts/scenes/mod.lua @@ -24,7 +24,12 @@ function scene.enter() BG.set('tunnel') end function scene.back() - GAME.modUsed=usingMod() + local totalModUsed=0 + for i=1,#GAME.mod do + if GAME.mod[i]>0 then totalModUsed=totalModUsed+1 + end + end + GAME.modUsed=totalModUsed>0 and totalModUsed or false end function scene.mouseMove(x,y) From 3cda61b48da7bffa1d1c834e011c24b02d82b7fd Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sun, 7 Jan 2024 19:41:18 +0700 Subject: [PATCH 24/38] Add a short delay before displaying username --- parts/player/draw.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parts/player/draw.lua b/parts/player/draw.lua index 19c712a1b..2a84c6426 100644 --- a/parts/player/draw.lua +++ b/parts/player/draw.lua @@ -787,7 +787,7 @@ function draw.norm(P,repMode) gc_scale(P.size) -- Draw username - if GAME.modUsed and P.frameRun>GAME.modUsed*2.6 or not GAME.modUsed then + if GAME.modUsed and P.frameRun>GAME.modUsed*26 or not GAME.modUsed then setFont(30) gc_setColor(GROUP_COLORS[P.group]) GC.mStr(P.username or USERS.getUsername(P.uid),300,-60) From dc8488ff6192cb053e614b5e9048c8bedcfeb11d Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sun, 7 Jan 2024 19:47:17 +0700 Subject: [PATCH 25/38] Clean-up --- parts/gameTables.lua | 1 - parts/language/lang_vi.lua | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/parts/gameTables.lua b/parts/gameTables.lua index 5af867b2c..ced0e5dda 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -355,7 +355,6 @@ do-- Mod data table.insert(P.gameEnv.keyCancel,key) end local _invisibleTime={ - ['show'] =-1, ['easy'] =300, ['slow'] =100, ['medium']=60, diff --git a/parts/language/lang_vi.lua b/parts/language/lang_vi.lua index d97e0e459..c888395e3 100644 --- a/parts/language/lang_vi.lua +++ b/parts/language/lang_vi.lua @@ -459,7 +459,7 @@ C. Tay cầm chơi game (Gamepad): title="Mods", reset="Đặt lại (tab)", applyAt="Áp dụng mod khi", - unranked ="Không tính điểm", + unranked="Không tính điểm", }, pause={ setting="Cài đặt (S)", From 536174220dcb32c262efc178f2ab9f0259efed99 Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Mon, 8 Jan 2024 11:33:01 +0700 Subject: [PATCH 26/38] Resolves change requests --- parts/gameTables.lua | 86 +++++++++++++++++++------------------- parts/language/lang_en.lua | 4 +- parts/player/draw.lua | 8 ++-- parts/player/init.lua | 12 +++--- parts/scenes/mod.lua | 6 +-- parts/scenes/viewLog.lua | 23 +--------- 6 files changed, 57 insertions(+), 82 deletions(-) diff --git a/parts/gameTables.lua b/parts/gameTables.lua index ced0e5dda..8083e8eea 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -369,45 +369,44 @@ do-- Mod data end end end MODOPT={-- Mod options - -- funcA always triggered, funcA1 only triggered once, but both functions can lock values {no=0,id="NX",name="next", key="q",x=80,y=230,color='lO', list={0,1,2,3,4,5,6}, - func =function(P,O) P.gameEnv.nextCount=O end, - funcA1=_lockVfunc('nextCount'), + funcInit=function(P,O) P.gameEnv.nextCount=O end, + funcOnce=_lockVfunc('nextCount'), }, {no=1,id="HL",name="hold", key="w",x=200,y=230,color='lO', list={0,1,2,3,4,5,6}, - func =function(P,O) P.gameEnv.holdCount=O end, - funcA1=_lockVfunc('holdCount'), + funcInit=function(P,O) P.gameEnv.holdCount=O end, + funcOnce=_lockVfunc('holdCount'), }, {no=2,id="FL",name="hideNext", key="e",x=320,y=230,color='lA', list={1,2,3,4,5}, - func =function(P,O) P.gameEnv.nextStartPos=O+1 end, - funcA1=_lockVfunc('nextStartPos'), + funcInit=function(P,O) P.gameEnv.nextStartPos=O+1 end, + funcOnce=_lockVfunc('nextStartPos'), }, {no=3,id="IH",name="infHold", key="r",x=440,y=230,color='lA', - func =function(P) P.gameEnv.infHold=true end, - funcA1=_lockVfunc('infHold'), + funcInit=function(P) P.gameEnv.infHold=true end, + funcOnce=_lockVfunc('infHold'), }, {no=4,id="HB",name="hideBlock", key="y",x=680,y=230,color='lV', - func =function(P) P.gameEnv.block=false end, - funcA1=_lockVfunc('block'), + funcInit=function(P) P.gameEnv.block=false end, + funcOnce=_lockVfunc('block'), }, {no=5,id="HG",name="hideGhost", key="u",x=800,y=230,color='lV', - func =function(P) P.gameEnv.ghost=false end, - funcA1=function(P) P.gameEnv.ghost=false; P.gameEnv.__lock('ghost') end, + funcInit=function(P) P.gameEnv.ghost=false end, + funcOnce=function(P) P.gameEnv.ghost=false; P.gameEnv.__lock('ghost') end, }, {no=6,id="HD",name="hidden", key="i",x=920,y=230,color='lP', list={'easy','slow','medium','fast','none'}, - func =function(P,O) P.gameEnv.visible=O end, - funcA =function(P,O) + funcInit=function(P,O) P.gameEnv.visible=O end, + funcRepe=function(P,O) if P.showTime~=_invisibleTime[O] then P:setInvisible(_invisibleTime[O]) end @@ -416,22 +415,21 @@ do-- Mod data {no=7,id="HB",name="hideBoard", key="o",x=1040,y=230,color='lP', list={'down','up','all'}, - func =function(P,O) P.gameEnv.hideBoard=O end, - funcA1=_lockVfunc('hideBoard'), + funcInit=function(P,O) P.gameEnv.hideBoard=O end, }, {no=8,id="FB",name="flipBoard", key="p",x=1160,y=230,color='lJ', list={'U-D','L-R','180'}, - func =function(P,O) P.gameEnv.flipBoard=O end, - funcA1=_lockVfunc('flipBoard'), + funcInit=function(P,O) P.gameEnv.flipBoard=O end, + funcOnce=_lockVfunc('flipBoard'), }, {no=9,id="DT",name="dropDelay", key="a",x=140,y=350,color='lR', list={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99}, - func =function(P,O) P.gameEnv.drop=O end, - funcA =function(P,O) - if P.gameEnv.drop~=O then + funcInit=function(P,O) P.gameEnv.drop=O end, + funcRepe=function(P,O) + if P.dropDelay~=O then P.gameEnv.drop=O P:set20G(O==0) end @@ -440,45 +438,45 @@ do-- Mod data {no=10,id="LT",name="lockDelay", key="s",x=260,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99}, - func =function(P,O) P.gameEnv.lock=O end, - funcA1=_lockVfunc('lockDelay'), + funcInit=function(P,O) P.gameEnv.lock=O end, + funcRepe=function(P,O) P.dropDelay=O end, }, {no=11,id="ST",name="waitDelay", key="d",x=380,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, - func =function(P,O) P.gameEnv.wait=O end, - funcA1=_lockVfunc('waitDelay'), + funcInit=function(P,O) P.gameEnv.wait=O end, + funcOnce=_lockVfunc('waitDelay'), }, {no=12,id="CT",name="fallDelay", key="f",x=500,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, - func =function(P,O) P.gameEnv.fall=O end, - funcA1=_lockVfunc('fallDelay'), + funcInit=function(P,O) P.gameEnv.fall=O end, + funcOnce=_lockVfunc('fallDelay'), }, {no=13,id="LF",name="life", key="j",x=860,y=350,color='lY', list={0,1,2,3,5,10,15,26,42,87,500}, - func =function(P,O) P.gameEnv.life=O end, - funcA1=_lockVfunc('life'), + funcInit=function(P,O) P.gameEnv.life=O end, + funcOnce=_lockVfunc('life'), }, {no=14,id="FB",name="forceB2B", key="k",x=980,y=350,color='lY', - func =function(P) P.gameEnv.b2bKill=true end, - funcA1=_lockVfunc('b2bKill'), + funcInit=function(P) P.gameEnv.b2bKill=true end, + funcOnce=_lockVfunc('b2bKill'), }, {no=15,id="PF",name="forceFinesse", key="l",x=1100,y=350,color='lY', - func =function(P) P.gameEnv.fineKill=true end, - funcA1=_lockVfunc('fineKill'), + funcInit=function(P) P.gameEnv.fineKill=true end, + funcOnce=_lockVfunc('fineKill'), }, {no=16,id="TL",name="tele", key="z",x=200,y=470,color='lH', - func =function(P) + funcInit=function(P) P.gameEnv.das,P.gameEnv.arr=0,0 P.gameEnv.sddas,P.gameEnv.sdarr=0,0 end, - funcA1=function(P) + funcOnce=function(P) for _,k in pairs{'das','arr','sddas','sdarr'} do P.gameEnv[k]=0 P.gameEnv.__lock(k) @@ -487,7 +485,7 @@ do-- Mod data }, {no=17,id="FX",name="noRotation", key="x",x=320,y=470,color='lH', - func =function(P) + funcInit=function(P) _disableKey(P,3) _disableKey(P,4) _disableKey(P,5) @@ -495,7 +493,7 @@ do-- Mod data }, {no=18,id="GL",name="noMove", key="c",x=440,y=470,color='lH', - func =function(P) + funcInit=function(P) _disableKey(P,1) _disableKey(P,2) _disableKey(P,11)_disableKey(P,12) _disableKey(P,17)_disableKey(P,18) @@ -505,20 +503,20 @@ do-- Mod data {no=19,id="CS",name="customSeq", key="b",x=680,y=470,color='lB', list={'bag','bagES','his','hisPool','c2','bagP1inf','rnd','mess','reverb'}, - func =function(P,O) P.gameEnv.sequence=O end, - funcA1=_lockVfunc('sequence'), + funcInit=function(P,O) P.gameEnv.sequence=O end, + funcOnce=_lockVfunc('sequence'), }, {no=20,id="PS",name="pushSpeed", key="n",x=800,y=470,color='lB', list={.5,1,2,3,5,15,1e99}, - func =function(P,O) P.gameEnv.pushSpeed=O end, - funcA1=_lockVfunc('pushSpeed'), + funcInit=function(P,O) P.gameEnv.pushSpeed=O end, + funcOnce=_lockVfunc('pushSpeed'), }, {no=21,id="BN",name="boneBlock", key="m",x=920,y=470,color='lB', list={'on','off'}, - func =function(P,O) P.gameEnv.bone=O end, - funcA =function(P,O) + funcInit=function(P,O) P.gameEnv.bone=O end, + funcRepe=function(P,O) P.gameEnv.bone=O if O=='on' then for _,bk in pairs(P.nextQueue) do bk.color=17 end diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index ec6ef822a..5ae9ed8a7 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -209,7 +209,7 @@ return { tryAnotherBuild="UTF-8 decoding error. If you are using Microsoft Windows, please try to download the build with the different architecture. If you are using the x86 version of Techmino, try downloading the x64 version and vice versa.", modInstruction="Choose your modifiers here!\nMods allow you to change the rules in various ways, but they can also crash the game. Feel free to play the game your way!\nNote that scores are not saved when using mods. You can also toggle mods using your keyboard keys (hold Shift to reverse).", - modApplyAtInstruction="Choose when you want the modifier to be applied.\nprelnit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations. ", + modApplyAtInstruction="Choose when you want the modifier to be applied.\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations. ", modInfo={ next="NEXT\nOverrides the number of Next pieces displayed.", hold="HOLD\nOverrides the number of Hold pieces displayed.", @@ -450,7 +450,7 @@ C. Gamepad }, mod={ title="Mods", - applyAt="Apply mods at", + applyAt="Apply during", reset="Reset (tab)", unranked="Unranked", }, diff --git a/parts/player/draw.lua b/parts/player/draw.lua index 2a84c6426..f83feb018 100644 --- a/parts/player/draw.lua +++ b/parts/player/draw.lua @@ -787,11 +787,9 @@ function draw.norm(P,repMode) gc_scale(P.size) -- Draw username - if GAME.modUsed and P.frameRun>GAME.modUsed*26 or not GAME.modUsed then - setFont(30) - gc_setColor(GROUP_COLORS[P.group]) - GC.mStr(P.username or USERS.getUsername(P.uid),300,-60) - end + setFont(30) + gc_setColor(GROUP_COLORS[P.group]) + GC.mStr(P.username or USERS.getUsername(P.uid),300,-60) -- Draw HUD if ENV.nextCount>0 then _drawNext(P,repMode) end diff --git a/parts/player/init.lua b/parts/player/init.lua index 975f5a57b..684f900a9 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -203,15 +203,15 @@ local function _executeMod(P) if GAME.mod[i]>0 then local M=MODOPT[i] if applyStatus=='always' then - if M.funcA1 then - M.funcA1(P,M.list and M.list[GAME.mod[i]]) - elseif M.funcA then - table.insert(GAME.modCodeList[P.id],function() M.func(P,M.list and M.list[GAME.mod[i]]) end) + if M.funcOnce then + M.funcOnce(P,M.list and M.list[GAME.mod[i]]) + elseif M.funcRepe then + table.insert(GAME.modCodeList[P.id],function() M.funcInit(P,M.list and M.list[GAME.mod[i]]) end) else - M.func(P,M.list and M.list[GAME.mod[i]]) + M.funcInit(P,M.list and M.list[GAME.mod[i]]) end else -- Already checked pre or post before calling _executeMod() - M.func(P,M.list and M.list[GAME.mod[i]]) + M.funcInit(P,M.list and M.list[GAME.mod[i]]) end end end diff --git a/parts/scenes/mod.lua b/parts/scenes/mod.lua index 763815fbb..536e4e8ca 100644 --- a/parts/scenes/mod.lua +++ b/parts/scenes/mod.lua @@ -108,9 +108,9 @@ function scene.draw() GC.rotate(t) local rad,side=45,5 if GAME.modApplyAt=='always' then - if M.funcA then side=nil - elseif M.funcA1 then side=8 - else side=5 end + if M.funcRepe then side=nil + elseif M.funcOnce then side=8 + else side=5 end end local color=M.color GC.setColor(color[1],color[2],color[3],5*t) diff --git a/parts/scenes/viewLog.lua b/parts/scenes/viewLog.lua index c8e10c316..bbe98b598 100644 --- a/parts/scenes/viewLog.lua +++ b/parts/scenes/viewLog.lua @@ -49,31 +49,10 @@ function scene.enter() for i,d in pairs(fullLog) do logTimeList[i]=d:split('\n')[1] end - function logList:press(x) - if x then - local s=self.select - if x1 then s=s-1 - SYSFX.newShade(3,self.x,self.y-WIDGET.scrollPos,self.w*.5,60) - end - else - if s<#self.list then s=s+1 - SYSFX.newShade(3,self.x+self.w*.5,self.y-WIDGET.scrollPos,self.w*.5,60) - end - end - if self.select~=s then - self.code(s) - self.select=s - self.selText=self.list[s] - if self.sound then SFX.play('selector') end - end - end - end - logList.list=logTimeList logList.select=false logList.disp=function() return currentLogText[1] end - logList.code=function(s) + logList.code=function(_,s) if s>currentLogID then scene.keyDown('right') else scene.keyDown('left') end updateText() From 888f2f607431442b83dc7446eebf9fee25e2ee1a Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Mon, 8 Jan 2024 13:37:00 +0700 Subject: [PATCH 27/38] Resolve change requests part 2 --- Zframework/widget.lua | 2 +- parts/gameFuncs.lua | 2 +- parts/gameTables.lua | 83 ++++++++++++++++++------------------ parts/language/manual_vi.txt | 25 +++++------ parts/player/init.lua | 2 +- parts/scenes/app_console.lua | 12 +++--- parts/scenes/mod.lua | 6 +-- 7 files changed, 68 insertions(+), 64 deletions(-) diff --git a/Zframework/widget.lua b/Zframework/widget.lua index 4fd108fce..876206ad1 100644 --- a/Zframework/widget.lua +++ b/Zframework/widget.lua @@ -803,7 +803,7 @@ function selector:press(x) end end if self.select~=s then - self.code(self.list[s]) + self.code(self.list[s],s) self.select=s self.selText=self.list[s] if self.sound then diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index dbcfcf787..2f19f4f7a 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -998,7 +998,7 @@ do-- function resetGameData(args) coroutine.yield() local counter=0 - if GAME.modUsed then + if usingMod() then SFX.play('collect',.2) TEXT.show(GAME.modApplyAt,640,26,45,'spin') for _=1,90 do coroutine.yield() end diff --git a/parts/gameTables.lua b/parts/gameTables.lua index 8083e8eea..08a5871b9 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -372,41 +372,41 @@ do-- Mod data {no=0,id="NX",name="next", key="q",x=80,y=230,color='lO', list={0,1,2,3,4,5,6}, - funcInit=function(P,O) P.gameEnv.nextCount=O end, - funcOnce=_lockVfunc('nextCount'), + funcInit =function(P,O) P.gameEnv.nextCount=O end, + funcOnce =_lockVfunc('nextCount'), }, {no=1,id="HL",name="hold", key="w",x=200,y=230,color='lO', list={0,1,2,3,4,5,6}, - funcInit=function(P,O) P.gameEnv.holdCount=O end, - funcOnce=_lockVfunc('holdCount'), + funcInit =function(P,O) P.gameEnv.holdCount=O end, + funcOnce =_lockVfunc('holdCount'), }, {no=2,id="FL",name="hideNext", key="e",x=320,y=230,color='lA', list={1,2,3,4,5}, - funcInit=function(P,O) P.gameEnv.nextStartPos=O+1 end, - funcOnce=_lockVfunc('nextStartPos'), + funcInit =function(P,O) P.gameEnv.nextStartPos=O+1 end, + funcOnce =_lockVfunc('nextStartPos'), }, {no=3,id="IH",name="infHold", key="r",x=440,y=230,color='lA', - funcInit=function(P) P.gameEnv.infHold=true end, - funcOnce=_lockVfunc('infHold'), + funcInit =function(P) P.gameEnv.infHold=true end, + funcOnce =_lockVfunc('infHold'), }, {no=4,id="HB",name="hideBlock", key="y",x=680,y=230,color='lV', - funcInit=function(P) P.gameEnv.block=false end, - funcOnce=_lockVfunc('block'), + funcInit =function(P) P.gameEnv.block=false end, + funcOnce =_lockVfunc('block'), }, {no=5,id="HG",name="hideGhost", key="u",x=800,y=230,color='lV', - funcInit=function(P) P.gameEnv.ghost=false end, - funcOnce=function(P) P.gameEnv.ghost=false; P.gameEnv.__lock('ghost') end, + funcInit =function(P) P.gameEnv.ghost=false end, + funcOnce =function(P) P.gameEnv.ghost=false; P.gameEnv.__lock('ghost') end, }, {no=6,id="HD",name="hidden", key="i",x=920,y=230,color='lP', list={'easy','slow','medium','fast','none'}, - funcInit=function(P,O) P.gameEnv.visible=O end, - funcRepe=function(P,O) + funcInit =function(P,O) P.gameEnv.visible=O end, + funcRepeat=function(P,O) if P.showTime~=_invisibleTime[O] then P:setInvisible(_invisibleTime[O]) end @@ -415,20 +415,20 @@ do-- Mod data {no=7,id="HB",name="hideBoard", key="o",x=1040,y=230,color='lP', list={'down','up','all'}, - funcInit=function(P,O) P.gameEnv.hideBoard=O end, + funcInit =function(P,O) P.gameEnv.hideBoard=O end, }, {no=8,id="FB",name="flipBoard", key="p",x=1160,y=230,color='lJ', list={'U-D','L-R','180'}, - funcInit=function(P,O) P.gameEnv.flipBoard=O end, - funcOnce=_lockVfunc('flipBoard'), + funcInit =function(P,O) P.gameEnv.flipBoard=O end, + funcOnce =_lockVfunc('flipBoard'), }, {no=9,id="DT",name="dropDelay", key="a",x=140,y=350,color='lR', list={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99}, - funcInit=function(P,O) P.gameEnv.drop=O end, - funcRepe=function(P,O) + funcInit =function(P,O) P.gameEnv.drop=O end, + funcRepeat=function(P,O) if P.dropDelay~=O then P.gameEnv.drop=O P:set20G(O==0) @@ -438,45 +438,45 @@ do-- Mod data {no=10,id="LT",name="lockDelay", key="s",x=260,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99}, - funcInit=function(P,O) P.gameEnv.lock=O end, - funcRepe=function(P,O) P.dropDelay=O end, + funcInit =function(P,O) P.gameEnv.lock=O end, + funcRepeat=function(P,O) P.dropDelay=O end, }, {no=11,id="ST",name="waitDelay", key="d",x=380,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, - funcInit=function(P,O) P.gameEnv.wait=O end, - funcOnce=_lockVfunc('waitDelay'), + funcInit =function(P,O) P.gameEnv.wait=O end, + funcOnce =_lockVfunc('waitDelay'), }, {no=12,id="CT",name="fallDelay", key="f",x=500,y=350,color='lR', list={0,1,2,3,4,5,6,7,8,10,15,20,30,60}, - funcInit=function(P,O) P.gameEnv.fall=O end, - funcOnce=_lockVfunc('fallDelay'), + funcInit =function(P,O) P.gameEnv.fall=O end, + funcOnce =_lockVfunc('fallDelay'), }, {no=13,id="LF",name="life", key="j",x=860,y=350,color='lY', list={0,1,2,3,5,10,15,26,42,87,500}, - funcInit=function(P,O) P.gameEnv.life=O end, - funcOnce=_lockVfunc('life'), + funcInit =function(P,O) P.gameEnv.life=O end, + funcOnce =_lockVfunc('life'), }, {no=14,id="FB",name="forceB2B", key="k",x=980,y=350,color='lY', - funcInit=function(P) P.gameEnv.b2bKill=true end, - funcOnce=_lockVfunc('b2bKill'), + funcInit =function(P) P.gameEnv.b2bKill=true end, + funcOnce =_lockVfunc('b2bKill'), }, {no=15,id="PF",name="forceFinesse", key="l",x=1100,y=350,color='lY', - funcInit=function(P) P.gameEnv.fineKill=true end, - funcOnce=_lockVfunc('fineKill'), + funcInit =function(P) P.gameEnv.fineKill=true end, + funcOnce =_lockVfunc('fineKill'), }, {no=16,id="TL",name="tele", key="z",x=200,y=470,color='lH', - funcInit=function(P) + funcInit =function(P) P.gameEnv.das,P.gameEnv.arr=0,0 P.gameEnv.sddas,P.gameEnv.sdarr=0,0 end, - funcOnce=function(P) + funcOnce =function(P) for _,k in pairs{'das','arr','sddas','sdarr'} do P.gameEnv[k]=0 P.gameEnv.__lock(k) @@ -485,7 +485,7 @@ do-- Mod data }, {no=17,id="FX",name="noRotation", key="x",x=320,y=470,color='lH', - funcInit=function(P) + funcInit =function(P) _disableKey(P,3) _disableKey(P,4) _disableKey(P,5) @@ -493,7 +493,7 @@ do-- Mod data }, {no=18,id="GL",name="noMove", key="c",x=440,y=470,color='lH', - funcInit=function(P) + funcInit =function(P) _disableKey(P,1) _disableKey(P,2) _disableKey(P,11)_disableKey(P,12) _disableKey(P,17)_disableKey(P,18) @@ -503,20 +503,20 @@ do-- Mod data {no=19,id="CS",name="customSeq", key="b",x=680,y=470,color='lB', list={'bag','bagES','his','hisPool','c2','bagP1inf','rnd','mess','reverb'}, - funcInit=function(P,O) P.gameEnv.sequence=O end, - funcOnce=_lockVfunc('sequence'), + funcInit =function(P,O) P.gameEnv.sequence=O end, + funcOnce =_lockVfunc('sequence'), }, {no=20,id="PS",name="pushSpeed", key="n",x=800,y=470,color='lB', list={.5,1,2,3,5,15,1e99}, - funcInit=function(P,O) P.gameEnv.pushSpeed=O end, - funcOnce=_lockVfunc('pushSpeed'), + funcInit =function(P,O) P.gameEnv.pushSpeed=O end, + funcOnce =_lockVfunc('pushSpeed'), }, {no=21,id="BN",name="boneBlock", key="m",x=920,y=470,color='lB', list={'on','off'}, - funcInit=function(P,O) P.gameEnv.bone=O end, - funcRepe=function(P,O) + funcInit =function(P,O) P.gameEnv.bone=O end, + funcRepeat=function(P,O) P.gameEnv.bone=O if O=='on' then for _,bk in pairs(P.nextQueue) do bk.color=17 end @@ -551,6 +551,7 @@ do-- Game data tables seed=1046101471, -- Game seed curMode=false, -- Current gamemode object initPlayerCount=0, -- Player count when init game + modUsed=false, mod=TABLE.new(0,#MODOPT),-- List of loaded mods modApplyAt='postInit', -- Apply mod when? (preInit, postInit, always) modeEnv=false, -- Current gamemode environment diff --git a/parts/language/manual_vi.txt b/parts/language/manual_vi.txt index 954ac59a8..6a75cf07a 100644 --- a/parts/language/manual_vi.txt +++ b/parts/language/manual_vi.txt @@ -1,6 +1,6 @@ Cách chơi: Hệ thống sẽ cấp cho người chơi 7 loại tetromino (gạch 4 ô) bao gồm: Z, S, J, L, I, O, T; - và người chơi cần điều khiển chúng (di chuyển sang trái và phải; xoay 90 / 180 / 270 độ). + và người chơi cần điều khiển chúng (di chuyển sang trái và phải; xoay 90 / 180 / 270 độ). Cứ mỗi hàng được lấp đầy trong bảng bởi các viên gạch, chúng sẽ bị xóa ra khỏi bảng. Nếu có đối thủ, đối thủ sẽ bị tấn công mạnh hoặc nhẹ tùy theo số hàng bạn gửi. Chơi hết hoặc đạt mục tiêu của cấp độ để thắng. @@ -25,19 +25,19 @@ Cách phát hiện spin: bằng cách sử dụng hệ thống điểm. Hệ thống tấn công: - Kiểu xóa nâng cao (Special clear): - Kiểu xóa nâng cao chỉ trường hợp bạn thực hiện Spin, Techrash, Techrash+ — xóa 5 hàng hoặc hơn, PC, HPC. - Kiểu xóa nâng cao có thể sạc đầy thanh B2B. + Kiểu xóa đặc biệt (Special clear): + Kiểu xóa đặc biệt chỉ trường hợp bạn thực hiện Spin, Techrash, Techrash+ — xóa 5 hàng hoặc hơn, PC, HPC. + Kiểu xóa đặc biệt có thể sạc đầy thanh B2B. Kiểu xóa Siêu cấp (Super clear): - Là Kiểu xóa nâng cao nhưng được thực hiện với B2B hoặc B3B + Là Kiểu xóa đặc biệt nhưng được thực hiện với B2B hoặc B3B - Kiểu xóa nâng cao (spin): Gửi gấp đôi số hàng vừa xóa. + Kiểu xóa đặc biệt (spin): Gửi gấp đôi số hàng vừa xóa. — B2B gửi thêm 1/1/2/4/8 cho Spin Đơn/Spin Đôi/Spin Tam/Techrash/Techrash+ — B2B2B gửi thêm (số hàng xóa × 0.5) trên B2B và +1 hàng để đánh chặn — Mini sẽ bị cắt chỉ còn ¼ so với giá trị ban đầu - Kiểu xóa nâng cao (Techrash/Techrash+ nhưng không spin): + Kiểu xóa đặc biệt (Techrash/Techrash+ nhưng không spin): — B2B gửi thêm 1 hàng — B3B boost 50% tấn công và +1 hàng để đánh chặn @@ -64,7 +64,7 @@ Thanh Back to Back (B2B): Một người chơi đang ở trang thái B3B khi thanh có hơn 800 điểm. Nếu có hàng được xóa: - Kiểu xóa nâng cao: + Kiểu xóa đặc biệt: — Spin Đơn/Đôi/Tam/Techrash/Techrash+ lần lượt cộng thêm 50/100/180/800/1000 (×50% nếu là Mini) — Techrash +150 điểm, nếu xóa hơn 4 hàng cùng lúc, mỗi hàng từ hàng thứ 5 trở đi cộng thêm 50 điểm. — PC từ thứ 4 trở đi có giá trị 800 điểm @@ -82,12 +82,13 @@ Hệ thống tính điểm: Việc tính điểm cũng độc lập tùy vào từng chế độ. -Khoảng thời gian chờ trước khi tấn công: - Một đòn sát thương sẽ không có hiệu lực ngay lập tức để người chơi có chút thời gian phản ứng trước khi tràn vào bảng. - Thời gian chờ của các đòn tấn công như sau, sắp xếp từ nhanh nhất tới lâu nhất: +Khoảng thời gian chờ trước khi gây sát thương: + Một đòn sát thương sẽ không có hiệu lực ngay lập tức + để người chơi có chút thời gian phản ứng trước khi chúng có hiệu lực (rác tràn vào bảng). + Thời gian chờ của các đòn tấn công như sau, xếp từ ngắn nhất tới dài nhất: — Double và Triple (Đôi và Tam) là nhanh nhất — Theo sau là Techrash, Techrash+, spin; Mini, B2B và B3B có thêm thêm chút thời gian chờ nữa. - — Sát thương từ combo có thời gian chờ lâu nhất.. + — Sát thương từ combo có thời gian chờ lâu nhất. Phản công: diff --git a/parts/player/init.lua b/parts/player/init.lua index 684f900a9..1a5cec89a 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -205,7 +205,7 @@ local function _executeMod(P) if applyStatus=='always' then if M.funcOnce then M.funcOnce(P,M.list and M.list[GAME.mod[i]]) - elseif M.funcRepe then + elseif M.funcRepeat then table.insert(GAME.modCodeList[P.id],function() M.funcInit(P,M.list and M.list[GAME.mod[i]]) end) else M.funcInit(P,M.list and M.list[GAME.mod[i]]) diff --git a/parts/scenes/app_console.lua b/parts/scenes/app_console.lua index 1ab2340af..b4ee724f6 100644 --- a/parts/scenes/app_console.lua +++ b/parts/scenes/app_console.lua @@ -379,11 +379,11 @@ local commands={} do } commands.viewlog={ code=goScene('viewLog'), - description="View crashes' log", + description="View crash logs", details={ - "Open crashes' log to view right at the spot", + "Open the crash logs menu", "", - "Usage: viewLog" + "Usage: viewlog" } } commands.scrinfo={ @@ -487,7 +487,9 @@ local commands={} do commands.setbg={ code=function(name) if name~="" then - if name~=BG.cur then + if SETTING.lockBG then + log{"Background ",C.R,"locked",C.Z,"! Please unlock background first."} + elseif name~=BG.cur then if BG.set(name) then log(("Background set to '%s'"):format(name)) else @@ -511,7 +513,7 @@ local commands={} do code=function(name) if name~="" then if SETTING.noTheme then - log{"Theme is ",C.R,"disabled",C.Z,"! Please re-enable it before trying this command again"} + log{"Theme is ",C.R,"disabled",C.Z,"! Please re-enable theme first."} else if THEME.set(name) then log("Theme set to: "..name) diff --git a/parts/scenes/mod.lua b/parts/scenes/mod.lua index 536e4e8ca..574d947da 100644 --- a/parts/scenes/mod.lua +++ b/parts/scenes/mod.lua @@ -108,9 +108,9 @@ function scene.draw() GC.rotate(t) local rad,side=45,5 if GAME.modApplyAt=='always' then - if M.funcRepe then side=nil - elseif M.funcOnce then side=8 - else side=5 end + if M.funcRepeat then side=nil + elseif M.funcOnce then side=8 + else side=5 end end local color=M.color GC.setColor(color[1],color[2],color[3],5*t) From f2686fb5bd740fdc96abcae4c9513c4a7a0b1853 Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Mon, 8 Jan 2024 16:34:58 +0700 Subject: [PATCH 28/38] Resolve change requests part 3 --- parts/language/lang_en.lua | 2 +- parts/language/lang_es.lua | 2 ++ parts/language/lang_fr.lua | 2 ++ parts/language/lang_id.lua | 2 ++ parts/language/lang_ja.lua | 2 ++ parts/language/lang_pt.lua | 2 ++ parts/language/lang_symbol.lua | 1 + parts/language/lang_zh.lua | 1 + parts/language/lang_zh_code.lua | 2 ++ parts/language/lang_zh_trad.lua | 2 ++ parts/scenes/app_console.lua | 4 ++-- 11 files changed, 19 insertions(+), 3 deletions(-) diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index 5ae9ed8a7..9183a4858 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -209,7 +209,7 @@ return { tryAnotherBuild="UTF-8 decoding error. If you are using Microsoft Windows, please try to download the build with the different architecture. If you are using the x86 version of Techmino, try downloading the x64 version and vice versa.", modInstruction="Choose your modifiers here!\nMods allow you to change the rules in various ways, but they can also crash the game. Feel free to play the game your way!\nNote that scores are not saved when using mods. You can also toggle mods using your keyboard keys (hold Shift to reverse).", - modApplyAtInstruction="Choose when you want the modifier to be applied.\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations. ", + modApplyAtInstruction="Choose when you want the modifier to be applied.\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations.", modInfo={ next="NEXT\nOverrides the number of Next pieces displayed.", hold="HOLD\nOverrides the number of Hold pieces displayed.", diff --git a/parts/language/lang_es.lua b/parts/language/lang_es.lua index cbe4ee6ba..4df2d8721 100644 --- a/parts/language/lang_es.lua +++ b/parts/language/lang_es.lua @@ -208,6 +208,7 @@ return { 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="¡Elige tus mods!\nLos mods permiten modificar el juego,\npero también es posible que lo crasheen.\nLos scores no se guardan durante el uso de mods.", + -- modApplyAtInstruction="Choose when you want the modifier to be applied.\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations. ", modInfo={ next="NEXT\nSobreescribe el nro. de piezas siguientes a mostrar.", hold="HOLD\nSobreescribe el nro. de piezas en reserva disponibles.", @@ -411,6 +412,7 @@ return { mod={ title="Mods", reset="Reinic. (tab)", + -- applyAt="Apply during", unranked="Sin rango", }, pause={ diff --git a/parts/language/lang_fr.lua b/parts/language/lang_fr.lua index d561b6f1b..c8338e8af 100644 --- a/parts/language/lang_fr.lua +++ b/parts/language/lang_fr.lua @@ -210,6 +210,7 @@ return { -- tryAnotherBuild="[Invalid UTF-8] If you are on Windows, try downloading Techmino-win32 or Techmino-win64 (different from what you are using now).", modInstruction="", + -- modApplyAtInstruction="Choose when you want the modifier to be applied.\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations. ", modInfo={},-- See lang_en.lua pauseStat={ "Temps :", @@ -386,6 +387,7 @@ return { mod={ title="Mods", reset="Réinitialiser (tab)", + -- applyAt="Apply during", unranked="Unranked", }, pause={ diff --git a/parts/language/lang_id.lua b/parts/language/lang_id.lua index a01a27e2c..6413adfef 100644 --- a/parts/language/lang_id.lua +++ b/parts/language/lang_id.lua @@ -209,6 +209,7 @@ return { errorMsg="Techmino mengalami eror dan harus memuat ulang.\nAnda bisa mengirim log eror ke developer.", modInstruction="Pilih mod Anda!\nMod memungkinkan Anda untuk mengubah permainan,\ntetapi juga bisa menghancur permainan.\nNilai-nilai tidak akan disimpan saat menggunakan mod.", + -- modApplyAtInstruction="Choose when you want the modifier to be applied.\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations. ", modInfo={ next="BLOK LANJUT\nMengubah jumlah pratinjau blok lanjut yang ditampilkan.", hold="SIMPAN\nMengubah jumlah blok yang bisa disimpan.", @@ -412,6 +413,7 @@ return { mod={ title="Mod", reset="Reset (tab)", + -- applyAt="Apply during", unranked="Tidak Berperingkat", }, pause={ diff --git a/parts/language/lang_ja.lua b/parts/language/lang_ja.lua index 868d8a707..7a1cc183c 100644 --- a/parts/language/lang_ja.lua +++ b/parts/language/lang_ja.lua @@ -210,6 +210,7 @@ return { tryAnotherBuild="[Invalid UTF-8]使用しているOSがMicrosoft WindowsであればTechmino-win32かTechmino-win64をダウンロードしてください! (現在使用しているソフトは違うバージョンです)", modInstruction="Modを選択してください!\nModはゲームルールを変えられますが正常にプレイできなくなる可能性があります\nModを使用した場合、スコアは保存されません", + -- modApplyAtInstruction="Choose when you want the modifier to be applied.\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations. ", modInfo={ next="NEXT\nNEXTの個数を変更します", hold="HOLD\nHOLDの個数を変更します", @@ -456,6 +457,7 @@ C. ゲームパッド mod={ title="Mods", reset="リセット (tab)", + -- applyAt="Apply during", unranked="記録不可", }, pause={ diff --git a/parts/language/lang_pt.lua b/parts/language/lang_pt.lua index dac314b01..49c931fdb 100644 --- a/parts/language/lang_pt.lua +++ b/parts/language/lang_pt.lua @@ -197,6 +197,7 @@ return { -- tryAnotherBuild="[Invalid UTF-8] If you are on Windows, try downloading Techmino-win32 or Techmino-win64 (different from what you are using now).", modInstruction="Selecione mods (modificadores) para usar!\nMods irão modificar o jogo em formas diferentes\n(e possivelmente quebrar o jogo de formas estranhas).\nAlguns mods irão fazer seu jogo unranked.", + -- modApplyAtInstruction="Choose when you want the modifier to be applied.\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations. ", modInfo={ next="Próximo\nSobrepõe a largura da fila de próximos", hold="Segure\nSobrepõe a largura da fila de segurar", @@ -400,6 +401,7 @@ return { mod={ title="Mods", reset="Reset (tab)", + -- applyAt="Apply during", unranked="Unranked", }, pause={ diff --git a/parts/language/lang_symbol.lua b/parts/language/lang_symbol.lua index 017c9219b..7a4c2b3fb 100644 --- a/parts/language/lang_symbol.lua +++ b/parts/language/lang_symbol.lua @@ -159,6 +159,7 @@ return { mod={ title="?!?!?!", reset="R (tab)", + applyAt="--:-- >[?!?!?!]", unranked="X!!!", }, pause={ diff --git a/parts/language/lang_zh.lua b/parts/language/lang_zh.lua index 95c48d1b1..c3b4cf72c 100644 --- a/parts/language/lang_zh.lua +++ b/parts/language/lang_zh.lua @@ -209,6 +209,7 @@ return { tryAnotherBuild="[解码UTF-8错误] 如果你现在用的是Windows系统,请重新下载 Techmino-32/64位 (和现在运行的不一样的那个)。", modInstruction="选择你要使用的Mod!\n不同Mod会用不同的方式改变初始游戏规则(可能导致不能正常游玩)\n来开发新玩法或者挑战自我吧!\n提醒:开启一些Mod会让成绩无效,你也可以用键盘开关Mod,按住shift反向", + -- modApplyAtInstruction="Choose when you want the modifier to be applied.\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations. ", modInfo={ next="Next数量:\n强制使用Next的个数", hold="Hold数量:\n强制使用Hold的个数", diff --git a/parts/language/lang_zh_code.lua b/parts/language/lang_zh_code.lua index 132448b0b..3d03a1f7f 100644 --- a/parts/language/lang_zh_code.lua +++ b/parts/language/lang_zh_code.lua @@ -157,6 +157,7 @@ return { tryAnotherBuild="Error.DecodeUTF8(); //如果你现在用的是Windows系统,请重新下载 Techmino-32/64位 (和现在运行的不一样的那个)。", modInstruction="Mod.Instruction();\n/*选择你要使用的Mod\n不同Mod会用不同的方式改变初始游戏规则(可能导致不能正常游玩)\n提醒:开启一些Mod会让成绩无效,你也可以用键盘开关Mod,按住shift反向*/", + -- modApplyAtInstruction="Mod.ApplyDuring='postInit' --[[\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations.]]", modInfo={ next="Mod.Next();\n//强制使用Next的个数", hold="Mod.Hold\n//强制使用Hold的个数", @@ -359,6 +360,7 @@ return { }, mod={ title="GameMod.UI", + applyAt="Mod.ApplyDuring=", reset="Mod.Reset();", unranked="unranked=true", }, diff --git a/parts/language/lang_zh_trad.lua b/parts/language/lang_zh_trad.lua index e09f5ff18..6e4e247ad 100644 --- a/parts/language/lang_zh_trad.lua +++ b/parts/language/lang_zh_trad.lua @@ -209,6 +209,7 @@ return { tryAnotherBuild="[無效的UTF-8] 如果你使用的是Windows作業系統,請嘗試下載Techmino-win32或Techmino-win64(與你現在使用的不同的版本)。", modInstruction="選擇你想使用的Mod!\n不同的Mod會以不同的方式改變遊戲規則(可能導致遊戲異常)\n快來開發新玩法或挑戰自我吧!\n提醒:開啟Mod會使成績無效,你可以使用鍵盤開關Mod,按下shift反向", + -- modApplyAtInstruction="Choose when you want the modifier to be applied.\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations. ", modInfo={ next="Next數量:\n強制使用Next的個數", hold="Hold數量:\n強制使用Hold的個數", @@ -412,6 +413,7 @@ return { mod={ title="Mods", reset="重設(tab)", + -- applyAt="Apply during", unranked="成績無效", }, pause={ diff --git a/parts/scenes/app_console.lua b/parts/scenes/app_console.lua index b4ee724f6..4292c4c39 100644 --- a/parts/scenes/app_console.lua +++ b/parts/scenes/app_console.lua @@ -488,7 +488,7 @@ local commands={} do code=function(name) if name~="" then if SETTING.lockBG then - log{"Background ",C.R,"locked",C.Z,"! Please unlock background first."} + log{"Background is currently ",C.R,"locked",C.Z,"! You can unlock them in Video settings."} elseif name~=BG.cur then if BG.set(name) then log(("Background set to '%s'"):format(name)) @@ -513,7 +513,7 @@ local commands={} do code=function(name) if name~="" then if SETTING.noTheme then - log{"Theme is ",C.R,"disabled",C.Z,"! Please re-enable theme first."} + log{"Themes are currently ",C.R,"disabled",C.Z,"! You can re-enable in Video settings."} else if THEME.set(name) then log("Theme set to: "..name) From c20e4ac8457829b536362df7599b0bb9312e4377 Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Mon, 8 Jan 2024 19:49:24 +0700 Subject: [PATCH 29/38] Add short delay before showing nickname (again) --- parts/gameFuncs.lua | 20 +++++++++----------- parts/language/lang_zh_code.lua | 3 ++- parts/player/draw.lua | 8 +++++--- parts/player/init.lua | 5 ++++- parts/scenes/mod.lua | 8 -------- 5 files changed, 20 insertions(+), 24 deletions(-) diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index 2f19f4f7a..5fde60380 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -994,7 +994,7 @@ do-- function dumpBasicConfig() end end do-- function resetGameData(args) - local function task_showMods() -- TODO + local function task_showMods(P) -- TODO coroutine.yield() local counter=0 @@ -1002,22 +1002,20 @@ do-- function resetGameData(args) SFX.play('collect',.2) TEXT.show(GAME.modApplyAt,640,26,45,'spin') for _=1,90 do coroutine.yield() end - end - for number,sel in next,GAME.mod do - if sel>0 then - if counter==0 then - coroutine.yield() - else + for number,sel in next,GAME.mod do + if sel>0 then for _=1,20 do coroutine.yield() end + local M=MODOPT[number] + SFX.play('collect',.2) + TEXT.show(M.id,640+(counter%5-2)*80,26,45,'spin') + counter=counter+1 end - local M=MODOPT[number] - SFX.play('collect',.2) - TEXT.show(M.id,640+(counter%5-2)*80,26,45,'spin') - counter=counter+1 end + for _=1,(counter%5)*20+90 do coroutine.yield() end + if GAME.playing then PLAYERS[1].showUsername=true end end end local gameSetting={ diff --git a/parts/language/lang_zh_code.lua b/parts/language/lang_zh_code.lua index 3d03a1f7f..902cfb692 100644 --- a/parts/language/lang_zh_code.lua +++ b/parts/language/lang_zh_code.lua @@ -157,7 +157,8 @@ return { tryAnotherBuild="Error.DecodeUTF8(); //如果你现在用的是Windows系统,请重新下载 Techmino-32/64位 (和现在运行的不一样的那个)。", modInstruction="Mod.Instruction();\n/*选择你要使用的Mod\n不同Mod会用不同的方式改变初始游戏规则(可能导致不能正常游玩)\n提醒:开启一些Mod会让成绩无效,你也可以用键盘开关Mod,按住shift反向*/", - -- modApplyAtInstruction="Mod.ApplyDuring='postInit' --[[\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations.]]", + -- [[[NEED TRANSLATING!]]] + modApplyAtInstruction="Mod.ApplyDuring=PLAYERS[1].username=='shoucandanghehe' ? 'preInit' : 'postInit' --[[\npreInit: Before loading the modes. The default option in V0.17.15 and earlier, but may cause problems with certain mods.\npostInit: After loading the game. This can fix some bugs in preInit, but some mods can still be disabled by modes in some situations.\nalways: Throughout the entire game. Keeps the effects of the mods in all situations.]]", modInfo={ next="Mod.Next();\n//强制使用Next的个数", hold="Mod.Hold\n//强制使用Hold的个数", diff --git a/parts/player/draw.lua b/parts/player/draw.lua index f83feb018..c6c167c14 100644 --- a/parts/player/draw.lua +++ b/parts/player/draw.lua @@ -787,9 +787,11 @@ function draw.norm(P,repMode) gc_scale(P.size) -- Draw username - setFont(30) - gc_setColor(GROUP_COLORS[P.group]) - GC.mStr(P.username or USERS.getUsername(P.uid),300,-60) + if P.showUsername then + setFont(30) + gc_setColor(GROUP_COLORS[P.group]) + GC.mStr(P.username or USERS.getUsername(P.uid),300,-60) + end -- Draw HUD if ENV.nextCount>0 then _drawNext(P,repMode) end diff --git a/parts/player/init.lua b/parts/player/init.lua index 1a5cec89a..7e606f50f 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -498,6 +498,7 @@ function PLY.newAIPlayer(id,AIdata,mini,p) group=0, } if p then TABLE.coverR(p,pData) end P.username="BOT"..pData.uid + P.showUsername=true P.sid=NET.uid_sid[pData.uid] or pData.uid P.group=pData.group if not (P.group%1==0 and P.group>=1 and P.group<=6) then P.group=0 end @@ -522,7 +523,7 @@ function PLY.newPlayer(id,mini,p) else -- Default pid=1, and empty username pData.uid=1 - P.username="" + P.username="SWEETSEA" end P.uid=pData.uid P.sid=NET.uid_sid[pData.uid] or pData.uid @@ -531,6 +532,8 @@ function PLY.newPlayer(id,mini,p) _loadGameEnv(P) _applyGameEnv(P) + + P.showUsername=not (P.gameEnv.allowMod and usingMod()) end ---------------------------------------------------- return PLY \ No newline at end of file diff --git a/parts/scenes/mod.lua b/parts/scenes/mod.lua index 574d947da..afb1fde60 100644 --- a/parts/scenes/mod.lua +++ b/parts/scenes/mod.lua @@ -23,14 +23,6 @@ function scene.enter() scene.widgetList.unranked.hide=scoreValid() BG.set('tunnel') end -function scene.back() - local totalModUsed=0 - for i=1,#GAME.mod do - if GAME.mod[i]>0 then totalModUsed=totalModUsed+1 - end - end - GAME.modUsed=totalModUsed>0 and totalModUsed or false -end function scene.mouseMove(x,y) selected=false From 9c47e95d1964f70d0a6c948949fd7353e49080c1 Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Mon, 8 Jan 2024 19:52:42 +0700 Subject: [PATCH 30/38] Revert the default username from SweetSea to --- parts/player/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parts/player/init.lua b/parts/player/init.lua index 7e606f50f..4f3d20826 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -523,7 +523,7 @@ function PLY.newPlayer(id,mini,p) else -- Default pid=1, and empty username pData.uid=1 - P.username="SWEETSEA" + P.username="" end P.uid=pData.uid P.sid=NET.uid_sid[pData.uid] or pData.uid From 4928f1964c6c64de0f85982e25ca139d5788b167 Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Mon, 8 Jan 2024 19:57:05 +0700 Subject: [PATCH 31/38] Remove an unused arg --- parts/gameFuncs.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index 5fde60380..98dd331e9 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -994,7 +994,7 @@ do-- function dumpBasicConfig() end end do-- function resetGameData(args) - local function task_showMods(P) -- TODO + local function task_showMods() -- TODO coroutine.yield() local counter=0 From 97b1abb5b5f0289e6ed0ddc9e21c750d34571067 Mon Sep 17 00:00:00 2001 From: SweetSea-ButImNotSweet <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Tue, 9 Jan 2024 13:52:55 +0700 Subject: [PATCH 32/38] Resolve change request part Tetra --- parts/gameFuncs.lua | 2 +- parts/gameTables.lua | 12 +++++------- parts/scenes/app_console.lua | 4 ++-- parts/scenes/app_piano.lua | 1 - 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/parts/gameFuncs.lua b/parts/gameFuncs.lua index 98dd331e9..a2b37fbeb 100644 --- a/parts/gameFuncs.lua +++ b/parts/gameFuncs.lua @@ -994,7 +994,7 @@ do-- function dumpBasicConfig() end end do-- function resetGameData(args) - local function task_showMods() -- TODO + local function task_showMods() coroutine.yield() local counter=0 diff --git a/parts/gameTables.lua b/parts/gameTables.lua index 08a5871b9..d37d64c6f 100644 --- a/parts/gameTables.lua +++ b/parts/gameTables.lua @@ -515,13 +515,11 @@ do-- Mod data {no=21,id="BN",name="boneBlock", key="m",x=920,y=470,color='lB', list={'on','off'}, - funcInit =function(P,O) P.gameEnv.bone=O end, - funcRepeat=function(P,O) - P.gameEnv.bone=O - if O=='on' then - for _,bk in pairs(P.nextQueue) do bk.color=17 end - end - end, + funcInit =function(P,O) P.gameEnv.bone=O=='on' end, + funcOnce =function(P,O) + P.gameEnv.bone=O=='on' + P.gameEnv.__lock('bone') + end }, } for i=1,#MODOPT do diff --git a/parts/scenes/app_console.lua b/parts/scenes/app_console.lua index 4292c4c39..4ebbe2056 100644 --- a/parts/scenes/app_console.lua +++ b/parts/scenes/app_console.lua @@ -488,7 +488,7 @@ local commands={} do code=function(name) if name~="" then if SETTING.lockBG then - log{"Background is currently ",C.R,"locked",C.Z,"! You can unlock them in Video settings."} + log{"Background is currently ",C.R,"locked",C.Z,"! You can unlock it in Video settings."} elseif name~=BG.cur then if BG.set(name) then log(("Background set to '%s'"):format(name)) @@ -513,7 +513,7 @@ local commands={} do code=function(name) if name~="" then if SETTING.noTheme then - log{"Themes are currently ",C.R,"disabled",C.Z,"! You can re-enable in Video settings."} + log{"Themes are currently ",C.R,"disabled",C.Z,"! You can re-enable it in Video settings."} else if THEME.set(name) then log("Theme set to: "..name) diff --git a/parts/scenes/app_piano.lua b/parts/scenes/app_piano.lua index 5c9258656..c650ac25b 100644 --- a/parts/scenes/app_piano.lua +++ b/parts/scenes/app_piano.lua @@ -99,7 +99,6 @@ end function scene.leave() TABLE.clear(textObj) - TABLE.clear(pianoVK) collectgarbage() BGM.play(lastPlayBGM) end From d399f3c9d35c90449ea56b08c708a3ce4929853f Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:30:08 +0700 Subject: [PATCH 33/38] Moving part 1 --- parts/scenes/app_console.lua | 17 +--- parts/scenes/viewLog.lua | 173 ----------------------------------- 2 files changed, 3 insertions(+), 187 deletions(-) delete mode 100644 parts/scenes/viewLog.lua diff --git a/parts/scenes/app_console.lua b/parts/scenes/app_console.lua index 4ebbe2056..bb6ed40fe 100644 --- a/parts/scenes/app_console.lua +++ b/parts/scenes/app_console.lua @@ -377,15 +377,6 @@ local commands={} do "Usage: openurl [url]", }, } - commands.viewlog={ - code=goScene('viewLog'), - description="View crash logs", - details={ - "Open the crash logs menu", - "", - "Usage: viewlog" - } - } commands.scrinfo={ code=function() for _,v in next,SCR.info() do @@ -487,9 +478,7 @@ local commands={} do commands.setbg={ code=function(name) if name~="" then - if SETTING.lockBG then - log{"Background is currently ",C.R,"locked",C.Z,"! You can unlock it in Video settings."} - elseif name~=BG.cur then + if name~=BG.cur then if BG.set(name) then log(("Background set to '%s'"):format(name)) else @@ -513,7 +502,7 @@ local commands={} do code=function(name) if name~="" then if SETTING.noTheme then - log{"Themes are currently ",C.R,"disabled",C.Z,"! You can re-enable it in Video settings."} + log{"Theme is ",C.R,"disabled",C.Z,"! Please re-enable it before trying this command again"} else if THEME.set(name) then log("Theme set to: "..name) @@ -1164,4 +1153,4 @@ scene.widgetList={ inputBox, } -return scene +return scene \ No newline at end of file diff --git a/parts/scenes/viewLog.lua b/parts/scenes/viewLog.lua deleted file mode 100644 index bbe98b598..000000000 --- a/parts/scenes/viewLog.lua +++ /dev/null @@ -1,173 +0,0 @@ -local fullLog,currentLogID -local logTimeList={} -local currentLogText={} - -local gc=love.graphics -local min,max=math.min,math.max -local scene={} - -local textBox=WIDGET.newTextBox {x= 30,y= 45,w=1000,h=540,font=25,fix=true} -local logList=WIDGET.newSelector{x=305,y=640,w= 550,name='list',color='O',fText='Crash log',list={''},disp=function() return '' end,code=function() end} - -local function updateText() - currentLogText=fullLog[currentLogID]:split('\n') - do - local _,wt=getFont(25):getWrap(fullLog[currentLogID],975) - textBox:setTexts(wt) - end - logList.select=currentLogID - logList.selText=currentLogText[1] -end - -local function noLogFound() - local _w=scene.widgetList - _w.home.hide=true;_w.list.hide=true - _w.endd.hide=true;_w.del .hide=true - _w.copy.hide=true;_w.delA.hide=true - - logList.list={''} - logList.select=false - logList.disp=function() return '' end - logList.code=function() end - logList:reset() -end - -function scene.enter() - fullLog=(FILE.load('/conf/error.log','-string -canskip') or '/conf/error.log not found'):split('\n\n') - TABLE.reverse(fullLog) - - currentLogID=1 - updateText() - - if fullLog[1]=='/conf/error.log not found' then - noLogFound() - else - local _w=scene.widgetList - _w.home.hide=false;_w.list.hide=false - _w.endd.hide=false;_w.del .hide=false - _w.copy.hide=false;_w.delA.hide=false - - for i,d in pairs(fullLog) do logTimeList[i]=d:split('\n')[1] end - - logList.list=logTimeList - logList.select=false - logList.disp=function() return currentLogText[1] end - logList.code=function(_,s) - if s>currentLogID then scene.keyDown('right') - else scene.keyDown('left') end - updateText() - end - logList:reset() - end -end -local deleteOld,deleteAll -do - local sureTime=-1e99 - function deleteOld() - local function task_redButton() - scene.widgetList.del.color=COLOR.Y - for _=1,120 do coroutine.yield() end - scene.widgetList.del.color=COLOR.dY - end - - if TIME()-sureTime<1 then - sureTime=-1e99 - scene.widgetList.del.color=COLOR.dY - do - local temp=TABLE.sub(TABLE.copy(fullLog),1,25) - fullLog=TABLE.copy(temp) - temp=table.concat(temp,'\n\n')..'\n\n' - TASK.removeTask_code(task_redButton) - - logTimeList=TABLE.sub(logTimeList,1,25) - currentLogID=min(logList.select,25) - logList.list=logTimeList - logList.select=currentLogID - updateText() - - FILE.save(temp,'/conf/error.log','-string') - end - else - sureTime=TIME() - MES.new('warn',text.sureDelete) - TASK.removeTask_code(task_redButton) - TASK.new(task_redButton) - end - end -end -do - local sureTime=-1e99 - function deleteAll() - local function task_redButton() - scene.widgetList.delA.color=COLOR.R - for _=1,120 do coroutine.yield() end - scene.widgetList.delA.color=COLOR.dR - end - - if TIME()-sureTime<1 then - sureTime=-1e99 - scene.widgetList.delA.color=COLOR.dR - love.filesystem.remove('/conf/error.log') - TASK.removeTask_code(task_redButton) - - noLogFound() - SCN.swapTo('viewLog','none') - else - sureTime=TIME() - MES.new('warn',text.sureDelete) - TASK.removeTask_code(task_redButton) - TASK.new(task_redButton) - end - end -end - -function scene.wheelMoved(_,y) - WHEELMOV(y) -end - -function scene.keyDown(key) - if key=='left' then - currentLogID=math.max(1,currentLogID-1) - updateText() - elseif key=='right' then - currentLogID=math.min(currentLogID+1,#fullLog) - updateText() - elseif key=='home' then - currentLogID=1 - updateText() - elseif key=='end' then - currentLogID=#fullLog - updateText() - elseif key=='up' then - textBox:scroll(-5) - elseif key=='down' then - textBox:scroll(5) - elseif key=='pageup' then - textBox:scroll(-20) - elseif key=='pagedown' then - textBox:scroll(20) - elseif key=='escape' then - SCN.back() - end -end - -function scene.draw() - setFont(40) - gc.print(currentLogID..' / '..#fullLog,1000,800) -end - -scene.widgetList={ - textBox, - WIDGET.newButton {name='home',x=1140,y= 90,w=170,h=80,sound='click',font=60,fText=CHAR.key.macHome,code=pressKey('home')}, - WIDGET.newButton {name='endd',x=1140,y=190,w=170,h=80,sound='click',font=60,fText=CHAR.key.macEnd ,code=pressKey('end')}, - WIDGET.newButton {name='copy',x=1140,y=290,w=170,h=80,sound='click',font=60,fText=CHAR.icon.copy ,code=function()love.system.setClipboardText(table.concat(textBox.texts,'\n'))end,color='lC'}, - - logList, - - WIDGET.newKey {name='del' ,x= 710,y=640,w=200,h=80,sound=false, font=30,fText='Clear old' ,color='dY',code=deleteOld}, - WIDGET.newKey {name='delA',x= 930,y=640,w=200,h=80,sound=false, font=30,fText='DELETE ALL!',color='dR',code=deleteAll}, - - WIDGET.newButton {name='back',x=1140,y=640,w=170,h=80,sound='back',font=60,fText=CHAR.icon.back,code=backScene}, -} - -return scene From 519687a7180961233a476be61627069fab106884 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:32:12 +0700 Subject: [PATCH 34/38] Moving part 2 --- parts/char.lua | 4 ++-- parts/scenes/app_console.lua | 2 +- parts/scenes/dict.lua | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/parts/char.lua b/parts/char.lua index bfcfef5b8..5f67aa7aa 100644 --- a/parts/char.lua +++ b/parts/char.lua @@ -73,8 +73,8 @@ local L={ hollowLogo= 0xF008C, toUp= 0xF008D, toDown= 0xF008E, - toLeft= 0xF0090, - toRight= 0xF008F, + toLeft= 0xF008F, + toRight= 0xF0090, checkMark= 0xF0091, crossMark= 0xF0092, musicMark= 0xF0093, diff --git a/parts/scenes/app_console.lua b/parts/scenes/app_console.lua index bb6ed40fe..bb6d5dbc5 100644 --- a/parts/scenes/app_console.lua +++ b/parts/scenes/app_console.lua @@ -1153,4 +1153,4 @@ scene.widgetList={ inputBox, } -return scene \ No newline at end of file +return scene diff --git a/parts/scenes/dict.lua b/parts/scenes/dict.lua index f899977b7..485ef1629 100644 --- a/parts/scenes/dict.lua +++ b/parts/scenes/dict.lua @@ -210,7 +210,7 @@ function scene.keyDown(key) CHAR.controller.xboxX,CHAR.controller.xboxY,CHAR.controller.xboxA,CHAR.controller.xboxB, CHAR.icon.help,CHAR.icon.copy,CHAR.icon.globe,CHAR.key.winMenu) ):split('\n'), - 20, + currentFontSize, 'rainbow' ) @@ -321,4 +321,4 @@ scene.widgetList={ WIDGET.newKey{name='help',x=1170,y=140,w=200,h=60,font=40,fText=CHAR.controller.xboxY.."/[F1]: "..CHAR.icon.help,code=pressKey'f1'}, } -- NOTE: The gap between Link-Copy, Zoom is 60*1.5-10=80 :) The gap between 2 buttons in one group is 60+10=70 -return scene +return scene \ No newline at end of file From c143e8eee57fcc9503187b90f2dadf6ae2da9462 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:32:57 +0700 Subject: [PATCH 35/38] Moving part 3 --- parts/scenes/app_piano.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/parts/scenes/app_piano.lua b/parts/scenes/app_piano.lua index c650ac25b..5c9258656 100644 --- a/parts/scenes/app_piano.lua +++ b/parts/scenes/app_piano.lua @@ -99,6 +99,7 @@ end function scene.leave() TABLE.clear(textObj) + TABLE.clear(pianoVK) collectgarbage() BGM.play(lastPlayBGM) end From 58648f7cdb98564b03bae4c0f9cfe71d4d93979f Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:56:36 +0700 Subject: [PATCH 36/38] Remove some texts (most deprecated) --- parts/language/lang_vi.lua | 43 +++++++------------------------------- 1 file changed, 7 insertions(+), 36 deletions(-) diff --git a/parts/language/lang_vi.lua b/parts/language/lang_vi.lua index c888395e3..78b5c6adb 100644 --- a/parts/language/lang_vi.lua +++ b/parts/language/lang_vi.lua @@ -153,11 +153,8 @@ return { noticeNotFound="Không có thông báo", }, PlayerManager={ - -- invalidEmail="Email không hợp lệ", - -- playerNotFound="Không tìm thấy người chơi", - -- invalidEmailPass="Email hoặc người chơi không hợp lệ", - -- emailExists="Email đã tồn tại", - -- emailSendError="Lỗi gửi email", + playerNotFound="Không tìm thấy người chơi", + invalidEmailPass="Email hoặc người chơi không hợp lệ", invalidCode="Mã không hợp lệ", invalidAccessToken="Mã xác thực không hợp lệ", }, @@ -181,13 +178,7 @@ return { versionNotMatch="Phiên bản không khớp", notFinished="Sắp ra mắt!", - -- Deprecated - -- noUsername="Vui lòng nhập email của bạn", - -- wrongEmail="Địa chỉ email không hợp lệ", - -- wrongCode="Mã xác minh không hợp lệ", - -- noPassword="Vui lòng nhập mật khẩu của bạn", - -- diffPassword="Mật khẩu không đúng", - -- checkEmail="Yêu cầu đăng ký đã được gửi.", + wrongCode="Mã xác minh không hợp lệ", wsFailed="Kết nối WebSocket đã thất bại: $1", wsClose="WebSocket đã đóng: $1", @@ -213,7 +204,7 @@ return { customBGloadFailed="Định dạng ảnh không được hỗ trợ", errorMsg="Techmino bị lỗi và cần phải được khởi động lại\nBạn có thể gửi error log để giúp dev sửa game nhanh hơn.", - tryAnotherBuild="CO LOI KHI GIAI MA UTF-8! Neu dang choi Techmino tren Windows: hay doi tu x86 sang x64 va nguoc lai.", + tryAnotherBuild="LOI UTF-8! Neu dang choi Techmino tren Windows: hay doi tu x86 sang x64 va nguoc lai.", modInstruction="Hãy chọn modifier bạn muốn.\nMod cho phép bạn có thể tùy biến game, nhưng cũng có thể làm game sập.\nKể cả thế, hãy thoải mái và chơi theo cách của bạn!\nBạn có thể dùng bàn phím để chọn mod (giữ Shift để chọn lùi)\nĐiểm sẽ không được lưu lại khi dùng mod.", modApplyAtInstruction="Chọn thời điểm bạn muốn mod được áp dụng.\npreInit: Trước khi nạp game. Đây là tùy chọn mặc định từ phiên bản 0.17.15 trở về trước. Một số mod có thể gặp vấn đề nếu dùng tùy chọn này.\npostInit: Sau khi nạp chế độ chơi, có thể sửa được một số lỗi ở preInit. Tuy nhiên, mod có thể bị mất tác dụng ở một số trường hợp nhất định.\nalways: Luôn áp dụng trong cả game. Tùy chọn này sẽ giúp bạn giữ lại tác dụng của mod dù ở bất kì trường hợp nào.", @@ -541,9 +532,6 @@ C. Tay cầm chơi game (Gamepad): sound="Âm thanh→", style="Trang trí", - -- ctrl="Cài đặt điều khiển", - -- key="Cài đặt bố cục phím", - -- touch="Cài đặt cảm ứng", ctrl="Điều chỉnh thg. số", -- ctrl="Điều chỉnh độ nhạy" key="Sửa bố cục bàn phím", touch="Sửa bố cục cảm ứng", @@ -631,7 +619,6 @@ C. Tay cầm chơi game (Gamepad): apply="Chọn", }, setting_control={ - -- title="Cài đặt Điều khiển", title="Điều chỉnh thông số", preview="Xem trước", @@ -834,14 +821,6 @@ C. Tay cầm chơi game (Gamepad): paste="Dán mã", submit="Gửi", }, - -- reset_password={ - -- title="Đặt lại Mật khẩu", - -- send="Gửi mã", - -- code="Mã xác nhận", - -- password="Mật khẩu", - -- password2="Nhập lại Mật khẩu", - -- setPW="Đặt mật khẩu", - -- }, account={ title="Tài khoản", }, @@ -1109,7 +1088,6 @@ C. Tay cầm chơi game (Gamepad): "Bạn có thể mở thư mục chứa dữ liệu từ trang Thống kê", "Bạn có thể thực hiện Spin với tất cả cả miếng gạch trong game này", "Bạn có thể đặt hướng xuất hiện cho từng miếng gạch", - "ZS JL T O I", {C.C,"Also try 15puzzle!"}, {C.C,"Also try Ballance!"}, {C.C,"Also try Minecraft!"}, @@ -1145,16 +1123,12 @@ C. Tay cầm chơi game (Gamepad): "Phát âm từ Techmino như thế nào mới đúng?", -- English UK: /'tɛkminəʊ/; English US: /tɛkminoʊ/ "Techmino phát âm trong tiếng Anh là /'tɛkminəʊ/; còn tiếng Mỹ là /tɛkminoʊ/.", - -- - "Ủa Techmino phải đọc là \"Tét-mai-nô\" hay là \"Tét-mi-nô\" vậy?", -- Where to download Techmino? "Tải Techmino ở đâu vậy? Trên GitHub đấy!", -- Techmino's birthday "Ngày sinh nhật của Techmino? Hiện tại (đang giả định) là 26/T6.", -- How to O-spin: Rotate 626 times in one second (mistaken) "Cách O-spin? Nhấn phím xoay 626 lần trong 1 giây (ĐÙA ĐẤY ĐỪNG TIN!)", - -- Hope you all like Z... Oh no, like Techmino - {"Mình mong các bạn sẽ thích ",C.W,"Z",C.Z,"… Ối! Không phải, thích ",C.G,"Techmino",C.Z," cơ! Nhầm nhầm nhầm!"}, -- 2021 was the year of Techmino's online debut. "2021 là năm ra mắt chế độ trực tuyến của Techmino.", -- The Chinese name of this game is 'Block Research Institute'. @@ -1176,7 +1150,7 @@ C. Tay cầm chơi game (Gamepad): -- "Meow!" "Meow!", -- Getting popup messages in the middle of a game? Go to settings and disable them. - "Thông báo tự dưng hiện lên giữa game? Vào cài đặt tắt nó đi!", + "Thông báo tự dưng hiện lên giữa game? Vào cài đặt và tắt nó đi!", "Hãy bật Do Not Distrub (Không làm phiền) nếu bạn có quá nhiều thông báo.", -- Don't play with your phone if your homework isn't finished. "Đừng chơi điện thoại khi bài tập về nhà còn chưa hoàn thành.", @@ -1189,7 +1163,7 @@ C. Tay cầm chơi game (Gamepad): -- It seems like no one has reached a high level by playing with their feet yet. "Hình như tới giờ chưa ai chơi xếp gạch giỏi bằng chân…", -- Moderate gaming is good for the brain. Addiction to games is harmful. Plan your time - "Chơi game vừa phải có thể tốt cho bộ não. Nhưng nếu nghiện thì toeng! Nhớ lập th!ời gian biểu nhé!", + "Chơi game vừa phải có thể tốt cho bộ não. Nhưng nếu nghiện thì toeng! Nhớ lập thời gian biểu nhé!", -- The ability to dig is extremely important in battles!!! "Khả năng đào xuống (downstacking) của bạn là RẤT QUAN TRỌNG trong chiến đấu!!!", -- Skilled players of the Classic Tetris game are also formidable; don't underestimate them @@ -1199,7 +1173,7 @@ C. Tay cầm chơi game (Gamepad): -- To protect the players' well-being, the game has a temporary and simplified anti-addiction system! (But you probably won't trigger it, haha) "Để tránh việc người chơi nào đó chơi quá lâu, game đã có hệ thống chống nghiện đơn giản tạm thời (Nhưng bạn có lẽ sẽ không bao giờ kích hoạt chúng đâu, haha)", -- Basic stacking and digging skills are crucial; those who neglect these two aspects often regret it (trust me) - {"Kỹ năng xếp lên vào đào xuống là 2 kỹ năng RẤT quan trọng; những ai (đã/từng) coi thường hay bỏ bê hai khía cạnh này thường hay bị bón hành súp mặt lờ (tin ",C.W,"MrZ",C.Z," đi!)"}, + {"Kỹ năng xếp lên vào đào xuống là 2 kỹ năng RẤT quan trọng; những ai coi thường hay bỏ bê hai khía cạnh này thường hay bị bón hành súp mặt lờ (tin ",C.W,"MrZ",C.Z," đi!)"}, -- Even if you're topped out, don't give up; every line of garbage can potentially become your weapon. "Đừng bỏ cuộc khi đống hàng rác đang làm bạn sắp bị top out, bởi bạn có thể biến chúng trở thành đòn phản công.", -- The video shown above is not a recording; it's the robot playing in real-time. @@ -1241,7 +1215,6 @@ C. Tay cầm chơi game (Gamepad): "git stash", "git stash apply", "git submodule update", - "git merge --rebase", "git merge --squash", "sudo rm -rf /*", "shutdown /s /t 0", -- Turn off computer completely (no Fast Boot) @@ -1300,7 +1273,6 @@ C. Tay cầm chơi game (Gamepad): -- -- SEA'S JOKE {C.W,"MrZ",C.Z," còn có một biệt danh dễ thương hơn, đó là ",C.W,"Z-Chan"}, - "Có hơn 400 mẹo bạn có thể nhìn thấy ở đây, là cái dòng chữ này, nếu bạn đang chơi Techmino tiếng Trung", {C.lSea,"Sea: ",C.Z,"Tui không có đủ mặn để viết joke. Nên một số câu đùa đang chạy ở đây được viết bởi ",C.yellow,"Shard Nguyễn",C.Z,". \"Em cảm ơn anh!\""}, {C.lSea,"Sea: ",C.Z,"Tui đang tự hỏi liệu còn bao nhiêu lỗi tui bỏ sót lúc dịch game không? Tính ra tui đã cập nhật đi cập nhật lại cũng 4-5 lần rồi."}, @@ -1308,7 +1280,6 @@ C. Tay cầm chơi game (Gamepad): {"Cộng đồng Tetris ",C.R,"Việt ",C.lY,"Nam ",C.Z,": https://discord.gg/hoiphuhovietnam"}, -- Tetris Vietnam (TVN) {"\"Tetris Việt Nam\"? Không, đó là \"Hội phụ hồ Việt Nam\""}, {C.W,"MrZ ",C.Z,"vẫn chưa biết chọn tên nào để đặt cho từ điển của Techmino. Hiện có 3 tên: \"Zictionary\", \"TetroDictionary\" và \"Little Z Dictionary\""}, - "Ủa tao nhớ game này tên là xếp hình mà? Ừ thì đúng nhưng để giữ độ đồng nhất và tránh bị cấn mồm thì nên gọi game này là game xếp gạch.", "Mình xin phép ủng hộ cho player này. Ủng hộ càng nhiều tỉ lệ thắng càng cao!", {"Aiiiii mua cần phô mai ủng hộ ",C.yellow,"Chủ tiệm phô mai",C.Z," không?"}, -- A joke in TVN -- Who will you choose? A girl that can break up to you and make you sad From 378d88cff01c12293089e0bea487fde060f309f6 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:58:24 +0700 Subject: [PATCH 37/38] Small edit to manual_vi --- parts/language/manual_vi.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/parts/language/manual_vi.txt b/parts/language/manual_vi.txt index 6a75cf07a..2c36f8a97 100644 --- a/parts/language/manual_vi.txt +++ b/parts/language/manual_vi.txt @@ -25,19 +25,19 @@ Cách phát hiện spin: bằng cách sử dụng hệ thống điểm. Hệ thống tấn công: - Kiểu xóa đặc biệt (Special clear): - Kiểu xóa đặc biệt chỉ trường hợp bạn thực hiện Spin, Techrash, Techrash+ — xóa 5 hàng hoặc hơn, PC, HPC. - Kiểu xóa đặc biệt có thể sạc đầy thanh B2B. + Kiểu xóa Đặc biệt (Special clear): + Kiểu xóa Đặc biệt chỉ trường hợp bạn thực hiện Spin, Techrash, Techrash+ — xóa 5 hàng hoặc hơn, PC, HPC. + Kiểu xóa Đặc biệt có thể sạc đầy thanh B2B. Kiểu xóa Siêu cấp (Super clear): - Là Kiểu xóa đặc biệt nhưng được thực hiện với B2B hoặc B3B + Là Kiểu xóa Đặc biệt nhưng được thực hiện với B2B hoặc B3B - Kiểu xóa đặc biệt (spin): Gửi gấp đôi số hàng vừa xóa. + Kiểu xóa Đặc biệt (spin): Gửi gấp đôi số hàng vừa xóa. — B2B gửi thêm 1/1/2/4/8 cho Spin Đơn/Spin Đôi/Spin Tam/Techrash/Techrash+ — B2B2B gửi thêm (số hàng xóa × 0.5) trên B2B và +1 hàng để đánh chặn — Mini sẽ bị cắt chỉ còn ¼ so với giá trị ban đầu - Kiểu xóa đặc biệt (Techrash/Techrash+ nhưng không spin): + Kiểu xóa Đặc biệt (Techrash/Techrash+ nhưng không spin): — B2B gửi thêm 1 hàng — B3B boost 50% tấn công và +1 hàng để đánh chặn @@ -55,7 +55,7 @@ Hệ thống tấn công: Perfect Clear (All Clear): Gửi 8 → 16 hàng rác PC thứ nhất chỉ gửi 8 hàng rác, các PC sau đó sẽ thêm 2 hàng rác để tấn công (tổng hàng rác có thể gửi tối đa là 16 hàng) - Sau khi tính toán xong, lượng sát thương sẽ bị làm tròn XUỐNG trước khi gửi. + Sau khi tính tổng xong, lượng sát thương sẽ bị làm tròn XUỐNG trước khi gửi. Thanh Back to Back (B2B): @@ -64,7 +64,7 @@ Thanh Back to Back (B2B): Một người chơi đang ở trang thái B3B khi thanh có hơn 800 điểm. Nếu có hàng được xóa: - Kiểu xóa đặc biệt: + Kiểu xóa Đặc biệt: — Spin Đơn/Đôi/Tam/Techrash/Techrash+ lần lượt cộng thêm 50/100/180/800/1000 (×50% nếu là Mini) — Techrash +150 điểm, nếu xóa hơn 4 hàng cùng lúc, mỗi hàng từ hàng thứ 5 trở đi cộng thêm 50 điểm. — PC từ thứ 4 trở đi có giá trị 800 điểm From 387bbfaf695cea8cb9e3cc6f5c95b4bfcd2e2d02 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sun, 21 Jan 2024 16:18:28 +0700 Subject: [PATCH 38/38] Moving changes to #1085 --- parts/language/lang_vi.lua | 43 +++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/parts/language/lang_vi.lua b/parts/language/lang_vi.lua index 78b5c6adb..c888395e3 100644 --- a/parts/language/lang_vi.lua +++ b/parts/language/lang_vi.lua @@ -153,8 +153,11 @@ return { noticeNotFound="Không có thông báo", }, PlayerManager={ - playerNotFound="Không tìm thấy người chơi", - invalidEmailPass="Email hoặc người chơi không hợp lệ", + -- invalidEmail="Email không hợp lệ", + -- playerNotFound="Không tìm thấy người chơi", + -- invalidEmailPass="Email hoặc người chơi không hợp lệ", + -- emailExists="Email đã tồn tại", + -- emailSendError="Lỗi gửi email", invalidCode="Mã không hợp lệ", invalidAccessToken="Mã xác thực không hợp lệ", }, @@ -178,7 +181,13 @@ return { versionNotMatch="Phiên bản không khớp", notFinished="Sắp ra mắt!", - wrongCode="Mã xác minh không hợp lệ", + -- Deprecated + -- noUsername="Vui lòng nhập email của bạn", + -- wrongEmail="Địa chỉ email không hợp lệ", + -- wrongCode="Mã xác minh không hợp lệ", + -- noPassword="Vui lòng nhập mật khẩu của bạn", + -- diffPassword="Mật khẩu không đúng", + -- checkEmail="Yêu cầu đăng ký đã được gửi.", wsFailed="Kết nối WebSocket đã thất bại: $1", wsClose="WebSocket đã đóng: $1", @@ -204,7 +213,7 @@ return { customBGloadFailed="Định dạng ảnh không được hỗ trợ", errorMsg="Techmino bị lỗi và cần phải được khởi động lại\nBạn có thể gửi error log để giúp dev sửa game nhanh hơn.", - tryAnotherBuild="LOI UTF-8! Neu dang choi Techmino tren Windows: hay doi tu x86 sang x64 va nguoc lai.", + tryAnotherBuild="CO LOI KHI GIAI MA UTF-8! Neu dang choi Techmino tren Windows: hay doi tu x86 sang x64 va nguoc lai.", modInstruction="Hãy chọn modifier bạn muốn.\nMod cho phép bạn có thể tùy biến game, nhưng cũng có thể làm game sập.\nKể cả thế, hãy thoải mái và chơi theo cách của bạn!\nBạn có thể dùng bàn phím để chọn mod (giữ Shift để chọn lùi)\nĐiểm sẽ không được lưu lại khi dùng mod.", modApplyAtInstruction="Chọn thời điểm bạn muốn mod được áp dụng.\npreInit: Trước khi nạp game. Đây là tùy chọn mặc định từ phiên bản 0.17.15 trở về trước. Một số mod có thể gặp vấn đề nếu dùng tùy chọn này.\npostInit: Sau khi nạp chế độ chơi, có thể sửa được một số lỗi ở preInit. Tuy nhiên, mod có thể bị mất tác dụng ở một số trường hợp nhất định.\nalways: Luôn áp dụng trong cả game. Tùy chọn này sẽ giúp bạn giữ lại tác dụng của mod dù ở bất kì trường hợp nào.", @@ -532,6 +541,9 @@ C. Tay cầm chơi game (Gamepad): sound="Âm thanh→", style="Trang trí", + -- ctrl="Cài đặt điều khiển", + -- key="Cài đặt bố cục phím", + -- touch="Cài đặt cảm ứng", ctrl="Điều chỉnh thg. số", -- ctrl="Điều chỉnh độ nhạy" key="Sửa bố cục bàn phím", touch="Sửa bố cục cảm ứng", @@ -619,6 +631,7 @@ C. Tay cầm chơi game (Gamepad): apply="Chọn", }, setting_control={ + -- title="Cài đặt Điều khiển", title="Điều chỉnh thông số", preview="Xem trước", @@ -821,6 +834,14 @@ C. Tay cầm chơi game (Gamepad): paste="Dán mã", submit="Gửi", }, + -- reset_password={ + -- title="Đặt lại Mật khẩu", + -- send="Gửi mã", + -- code="Mã xác nhận", + -- password="Mật khẩu", + -- password2="Nhập lại Mật khẩu", + -- setPW="Đặt mật khẩu", + -- }, account={ title="Tài khoản", }, @@ -1088,6 +1109,7 @@ C. Tay cầm chơi game (Gamepad): "Bạn có thể mở thư mục chứa dữ liệu từ trang Thống kê", "Bạn có thể thực hiện Spin với tất cả cả miếng gạch trong game này", "Bạn có thể đặt hướng xuất hiện cho từng miếng gạch", + "ZS JL T O I", {C.C,"Also try 15puzzle!"}, {C.C,"Also try Ballance!"}, {C.C,"Also try Minecraft!"}, @@ -1123,12 +1145,16 @@ C. Tay cầm chơi game (Gamepad): "Phát âm từ Techmino như thế nào mới đúng?", -- English UK: /'tɛkminəʊ/; English US: /tɛkminoʊ/ "Techmino phát âm trong tiếng Anh là /'tɛkminəʊ/; còn tiếng Mỹ là /tɛkminoʊ/.", + -- + "Ủa Techmino phải đọc là \"Tét-mai-nô\" hay là \"Tét-mi-nô\" vậy?", -- Where to download Techmino? "Tải Techmino ở đâu vậy? Trên GitHub đấy!", -- Techmino's birthday "Ngày sinh nhật của Techmino? Hiện tại (đang giả định) là 26/T6.", -- How to O-spin: Rotate 626 times in one second (mistaken) "Cách O-spin? Nhấn phím xoay 626 lần trong 1 giây (ĐÙA ĐẤY ĐỪNG TIN!)", + -- Hope you all like Z... Oh no, like Techmino + {"Mình mong các bạn sẽ thích ",C.W,"Z",C.Z,"… Ối! Không phải, thích ",C.G,"Techmino",C.Z," cơ! Nhầm nhầm nhầm!"}, -- 2021 was the year of Techmino's online debut. "2021 là năm ra mắt chế độ trực tuyến của Techmino.", -- The Chinese name of this game is 'Block Research Institute'. @@ -1150,7 +1176,7 @@ C. Tay cầm chơi game (Gamepad): -- "Meow!" "Meow!", -- Getting popup messages in the middle of a game? Go to settings and disable them. - "Thông báo tự dưng hiện lên giữa game? Vào cài đặt và tắt nó đi!", + "Thông báo tự dưng hiện lên giữa game? Vào cài đặt tắt nó đi!", "Hãy bật Do Not Distrub (Không làm phiền) nếu bạn có quá nhiều thông báo.", -- Don't play with your phone if your homework isn't finished. "Đừng chơi điện thoại khi bài tập về nhà còn chưa hoàn thành.", @@ -1163,7 +1189,7 @@ C. Tay cầm chơi game (Gamepad): -- It seems like no one has reached a high level by playing with their feet yet. "Hình như tới giờ chưa ai chơi xếp gạch giỏi bằng chân…", -- Moderate gaming is good for the brain. Addiction to games is harmful. Plan your time - "Chơi game vừa phải có thể tốt cho bộ não. Nhưng nếu nghiện thì toeng! Nhớ lập thời gian biểu nhé!", + "Chơi game vừa phải có thể tốt cho bộ não. Nhưng nếu nghiện thì toeng! Nhớ lập th!ời gian biểu nhé!", -- The ability to dig is extremely important in battles!!! "Khả năng đào xuống (downstacking) của bạn là RẤT QUAN TRỌNG trong chiến đấu!!!", -- Skilled players of the Classic Tetris game are also formidable; don't underestimate them @@ -1173,7 +1199,7 @@ C. Tay cầm chơi game (Gamepad): -- To protect the players' well-being, the game has a temporary and simplified anti-addiction system! (But you probably won't trigger it, haha) "Để tránh việc người chơi nào đó chơi quá lâu, game đã có hệ thống chống nghiện đơn giản tạm thời (Nhưng bạn có lẽ sẽ không bao giờ kích hoạt chúng đâu, haha)", -- Basic stacking and digging skills are crucial; those who neglect these two aspects often regret it (trust me) - {"Kỹ năng xếp lên vào đào xuống là 2 kỹ năng RẤT quan trọng; những ai coi thường hay bỏ bê hai khía cạnh này thường hay bị bón hành súp mặt lờ (tin ",C.W,"MrZ",C.Z," đi!)"}, + {"Kỹ năng xếp lên vào đào xuống là 2 kỹ năng RẤT quan trọng; những ai (đã/từng) coi thường hay bỏ bê hai khía cạnh này thường hay bị bón hành súp mặt lờ (tin ",C.W,"MrZ",C.Z," đi!)"}, -- Even if you're topped out, don't give up; every line of garbage can potentially become your weapon. "Đừng bỏ cuộc khi đống hàng rác đang làm bạn sắp bị top out, bởi bạn có thể biến chúng trở thành đòn phản công.", -- The video shown above is not a recording; it's the robot playing in real-time. @@ -1215,6 +1241,7 @@ C. Tay cầm chơi game (Gamepad): "git stash", "git stash apply", "git submodule update", + "git merge --rebase", "git merge --squash", "sudo rm -rf /*", "shutdown /s /t 0", -- Turn off computer completely (no Fast Boot) @@ -1273,6 +1300,7 @@ C. Tay cầm chơi game (Gamepad): -- -- SEA'S JOKE {C.W,"MrZ",C.Z," còn có một biệt danh dễ thương hơn, đó là ",C.W,"Z-Chan"}, + "Có hơn 400 mẹo bạn có thể nhìn thấy ở đây, là cái dòng chữ này, nếu bạn đang chơi Techmino tiếng Trung", {C.lSea,"Sea: ",C.Z,"Tui không có đủ mặn để viết joke. Nên một số câu đùa đang chạy ở đây được viết bởi ",C.yellow,"Shard Nguyễn",C.Z,". \"Em cảm ơn anh!\""}, {C.lSea,"Sea: ",C.Z,"Tui đang tự hỏi liệu còn bao nhiêu lỗi tui bỏ sót lúc dịch game không? Tính ra tui đã cập nhật đi cập nhật lại cũng 4-5 lần rồi."}, @@ -1280,6 +1308,7 @@ C. Tay cầm chơi game (Gamepad): {"Cộng đồng Tetris ",C.R,"Việt ",C.lY,"Nam ",C.Z,": https://discord.gg/hoiphuhovietnam"}, -- Tetris Vietnam (TVN) {"\"Tetris Việt Nam\"? Không, đó là \"Hội phụ hồ Việt Nam\""}, {C.W,"MrZ ",C.Z,"vẫn chưa biết chọn tên nào để đặt cho từ điển của Techmino. Hiện có 3 tên: \"Zictionary\", \"TetroDictionary\" và \"Little Z Dictionary\""}, + "Ủa tao nhớ game này tên là xếp hình mà? Ừ thì đúng nhưng để giữ độ đồng nhất và tránh bị cấn mồm thì nên gọi game này là game xếp gạch.", "Mình xin phép ủng hộ cho player này. Ủng hộ càng nhiều tỉ lệ thắng càng cao!", {"Aiiiii mua cần phô mai ủng hộ ",C.yellow,"Chủ tiệm phô mai",C.Z," không?"}, -- A joke in TVN -- Who will you choose? A girl that can break up to you and make you sad