From e9997e72d2af4f45273168c3827dea85a47f0b75 Mon Sep 17 00:00:00 2001 From: Trebor Huang <2300936257@qq.com> Date: Fri, 30 Jul 2021 17:47:13 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9E=81=E7=AE=80?= =?UTF-8?q?=E5=9B=9E=E6=BA=AF=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 基本思路就是在出块的时候存一份玩家状态,判断极简失败时回复即可。回复的时候出块器还没有被调用,所以不需要考虑协程的复制问题。 有攻击的模式本来就不太适合时间回溯,所以不需要做特别的处理。我没有禁止,但是如果AI或者玩家代码中访问了lastRecv的lastRecv的lastRecv...二十层以上的时候就会爆炸。(看起来不太可能) --- parts/globalTables.lua | 6 +++++ parts/language/lang_en.lua | 1 + parts/language/lang_zh.lua | 1 + parts/player/player.lua | 49 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+) diff --git a/parts/globalTables.lua b/parts/globalTables.lua index 9ce054dfb..48af7fe2d 100644 --- a/parts/globalTables.lua +++ b/parts/globalTables.lua @@ -141,6 +141,12 @@ MODOPT={--Mod options func=function(P,O)P.gameEnv.bone=O=='on'end, unranked=true, }, + {no=22,id="FR",name="finesseRewind", + key=",",x=1040,y=470,color='Y', + list={'on','off'}, + func=function(P,O)P.gameEnv.fineRewind=O=='on'end, + unranked=true, + }, } for i=1,#MODOPT do local M=MODOPT[i] diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index 81eff3e28..bd05c8f59 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -133,6 +133,7 @@ return{ customSeq="Randomizer\nOverrides the randomizer for the block sequence.", pushSpeed="Garbage Speed\nOverride the rising speed of garbage lines (blocks/frame).", boneBlock="[ ]\nPlay with [ ] blocks.", + finesseRewind="Finesse Rewind\nFinesse fault resets time.\n(This mod is unstable in multiplayer/AI combat/backfire mode.)" }, pauseStat={ "Time:", diff --git a/parts/language/lang_zh.lua b/parts/language/lang_zh.lua index b53528273..4061b9b47 100644 --- a/parts/language/lang_zh.lua +++ b/parts/language/lang_zh.lua @@ -133,6 +133,7 @@ return{ customSeq="指定序列:\n强制使用某种序列", pushSpeed="涨行速度:\n改变垃圾行升起的速度(单位:格/帧)", boneBlock="骨块:\n使用骨块进行游戏", + finesseRewind="极简回溯:\n非极简操作将会回溯到出块时刻\n(多人/AI/自攻自受模式中不稳定)" }, pauseStat={ "时间:", diff --git a/parts/player/player.lua b/parts/player/player.lua index f5f2ce546..6dced2f5e 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -15,6 +15,47 @@ local PLAYERS,PLY_ALIVE,GAME=PLAYERS,PLY_ALIVE,GAME local kickList=require"parts.kickList" local ply_draw=require"parts.player.draw" local ply_update=require"parts.player.update" +--------------------State Storing----------------------- +-- from my crude observations, these stuff shouldn't be touched upon. +local blacklist = { + freeze = true, + keyPressing = true, + lastRecv = true, + atker = true, + atking = true +} + +function DeepCopy (orig, i) + i = i or 0 + if i > 20 then + print("Warning: Deeply nested structure or cyclic reference detected.") + return + end -- safety belt + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + if not blacklist[orig_key] then + if orig_key == "moving" or orig_key == "downing" then + copy[orig_key] = 0 + end + copy[DeepCopy(orig_key, i+1)] = DeepCopy(orig_value, i+1) + end + end + setmetatable(copy, DeepCopy(getmetatable(orig))) + else + copy = orig + end + return copy +end + +function Assign (orig, dest) + for orig_key, orig_value in next, orig, nil do + dest[orig_key] = orig_value + end + setmetatable(dest, DeepCopy(getmetatable(orig))) +end ---------------------------------------------------- function Player:showText(text,dx,dy,font,style,spd,stop) @@ -809,6 +850,9 @@ function Player:popNext(ifhold)--Pop nextQueue to hand else self:hold() end + if self.gameEnv.fineRewind then + self.freeze = DeepCopy(self) + end end function Player:cancel(N)--Cancel Garbage @@ -1144,6 +1188,11 @@ do--Player.drop(self)--Place piece SFX.play('lock',nil,self:getCenterX()*.15) end end + -- Zawarudo + if ENV.fineRewind and self.freeze then + Assign(DeepCopy(self.freeze), self) + return + end elseif self.sound then SFX.play('lock',nil,self:getCenterX()*.15) end From da3542270dd2685fd2788649f7b5b82ea306c811 Mon Sep 17 00:00:00 2001 From: Trebor Huang <2300936257@qq.com> Date: Fri, 30 Jul 2021 20:21:29 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=A8=A1=E4=BB=BF=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=A3=8E=E6=A0=BC=EF=BC=8C=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf.lua | 2 +- parts/globalTables.lua | 4 ++-- parts/player/player.lua | 20 +++++++++++--------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/conf.lua b/conf.lua index 589f39801..823209a9c 100644 --- a/conf.lua +++ b/conf.lua @@ -2,7 +2,7 @@ VERSION={ build=344, code=1506, short="V0.15.6", - string="Alpha V0.15.6", + string="Alpha Fork V0.15.6", room="V1.0", name="强化装甲 Reinforced Armor", } diff --git a/parts/globalTables.lua b/parts/globalTables.lua index 48af7fe2d..f66fe449f 100644 --- a/parts/globalTables.lua +++ b/parts/globalTables.lua @@ -143,8 +143,8 @@ MODOPT={--Mod options }, {no=22,id="FR",name="finesseRewind", key=",",x=1040,y=470,color='Y', - list={'on','off'}, - func=function(P,O)P.gameEnv.fineRewind=O=='on'end, + list={'easy','strict'}, + func=function(P,O)P.gameEnv.fineRewind=O end, unranked=true, }, } diff --git a/parts/player/player.lua b/parts/player/player.lua index 6dced2f5e..8e4fd8973 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -15,8 +15,8 @@ local PLAYERS,PLY_ALIVE,GAME=PLAYERS,PLY_ALIVE,GAME local kickList=require"parts.kickList" local ply_draw=require"parts.player.draw" local ply_update=require"parts.player.update" ---------------------State Storing----------------------- --- from my crude observations, these stuff shouldn't be touched upon. +------------------------------------------- +-- from my crude observations, these stuff in the blacklist shouldn't be touched upon. local blacklist = { freeze = true, keyPressing = true, @@ -27,17 +27,14 @@ local blacklist = { function DeepCopy (orig, i) i = i or 0 - if i > 20 then - print("Warning: Deeply nested structure or cyclic reference detected.") - return - end -- safety belt + if i > 20 then return end -- safety belt local orig_type = type(orig) local copy if orig_type == 'table' then copy = {} for orig_key, orig_value in next, orig, nil do if not blacklist[orig_key] then - if orig_key == "moving" or orig_key == "downing" then + if orig_key == 'moving' or orig_key == 'downing' then copy[orig_key] = 0 end copy[DeepCopy(orig_key, i+1)] = DeepCopy(orig_value, i+1) @@ -54,8 +51,9 @@ function Assign (orig, dest) for orig_key, orig_value in next, orig, nil do dest[orig_key] = orig_value end - setmetatable(dest, DeepCopy(getmetatable(orig))) + setmetatable(dest, getmetatable(orig)) end +---------------------------------------------- ---------------------------------------------------- function Player:showText(text,dx,dy,font,style,spd,stop) @@ -1189,7 +1187,7 @@ do--Player.drop(self)--Place piece end end -- Zawarudo - if ENV.fineRewind and self.freeze then + if ENV.fineRewind=='strict' and self.freeze then Assign(DeepCopy(self.freeze), self) return end @@ -1199,6 +1197,10 @@ do--Player.drop(self)--Place piece if finePts<=1 then self.finesseCombo=0 + if ENV.fineRewind=='easy' and self.freeze then + Assign(DeepCopy(self.freeze), self) + return + end else self.finesseCombo=self.finesseCombo+1 if self.finesseCombo>2 then From cada249d4d25cf8588b1a1427e385d3f8757a582 Mon Sep 17 00:00:00 2001 From: Trebor-Huang <2300936257@qq.com> Date: Thu, 5 Aug 2021 22:44:30 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=87=E5=AD=97?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- parts/language/lang_en.lua | 1 + parts/language/lang_zh.lua | 1 + parts/player/player.lua | 2 ++ 3 files changed, 4 insertions(+) diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index bd05c8f59..6aaa83460 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -42,6 +42,7 @@ return{ pauseCount="Pauses", finesse_ap="All Perfect", finesse_fc="Full Combo", + rewind="Finesse Rewind", page="Page:", diff --git a/parts/language/lang_zh.lua b/parts/language/lang_zh.lua index 4061b9b47..9fa6ad256 100644 --- a/parts/language/lang_zh.lua +++ b/parts/language/lang_zh.lua @@ -42,6 +42,7 @@ return{ pauseCount="暂停统计", finesse_ap="All Perfect", finesse_fc="Full Combo", + rewind="极简回溯", page="页面:", diff --git a/parts/player/player.lua b/parts/player/player.lua index 8e4fd8973..31a0bd9a9 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -1189,6 +1189,7 @@ do--Player.drop(self)--Place piece -- Zawarudo if ENV.fineRewind=='strict' and self.freeze then Assign(DeepCopy(self.freeze), self) + self:showText(text.rewind, 0, 0, 35, "appear", 0.6) return end elseif self.sound then @@ -1199,6 +1200,7 @@ do--Player.drop(self)--Place piece self.finesseCombo=0 if ENV.fineRewind=='easy' and self.freeze then Assign(DeepCopy(self.freeze), self) + self:showText(text.rewind, 0, 0, 35, "appear", 0.6) return end else