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 9ce054dfb..f66fe449f 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={'easy','strict'},
+ func=function(P,O)P.gameEnv.fineRewind=O 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..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:",
@@ -133,6 +134,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..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="页面:",
@@ -133,6 +134,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..31a0bd9a9 100644
--- a/parts/player/player.lua
+++ b/parts/player/player.lua
@@ -15,6 +15,45 @@ 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"
+-------------------------------------------
+-- from my crude observations, these stuff in the blacklist 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 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, getmetatable(orig))
+end
+----------------------------------------------
----------------------------------------------------
function Player:showText(text,dx,dy,font,style,spd,stop)
@@ -809,6 +848,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,12 +1186,23 @@ do--Player.drop(self)--Place piece
SFX.play('lock',nil,self:getCenterX()*.15)
end
end
+ -- 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
SFX.play('lock',nil,self:getCenterX()*.15)
end
if finePts<=1 then
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
self.finesseCombo=self.finesseCombo+1
if self.finesseCombo>2 then