副本重铸(对装备强化结果不满意想撤销)需要一颗后悔药:操作前把关键状态存一份快照,不满意时恢复到快照。备忘录模式把快照的创建、保存、恢复封装成三件套——原对象不暴露内部字段,恢复只认快照。与排行榜快照的分工:排行榜快照面向查询,备忘录面向单次操作的撤销。
快照三件套。示例代码如下:
local function snapshot(actor)
return {
lv = tonumber(getplayvar(actor, 1, "Enh")) or 0,
gold = tonumber(getplayvar(actor, 1, "Gold")) or 0
}
end
local function restore(actor, memo)
setplayvar(actor, 1, "Enh", memo.lv, 1)
setplayvar(actor, 1, "Gold", memo.gold, 1)
sendmsg(actor, 1, "已回滚到操作前状态。")
end
重铸撤销接线。示例代码如下:
local memo = snapshot(actor)
setplayvar(actor, 1, "Enh", memo.lv + 1, 1)
setplayvar(actor, 1, "Gold", memo.gold - 50000, 1)
restore(actor, memo)
print(tonumber(getplayvar(actor, 1, "Enh")))
重铸后强化加一、扣款五万——restore 一口气回到操作前,两个字段精确还原。
两个字段的快照:snapshot 与 restore 各两次读写,微秒级;对比操作日志重放式撤销(记每步操作反向执行),备忘录实现简单且不会因漏记一步而错乱——小规模撤销场景,备忘录的代码量是日志式的三分之一。
三个不适用场景:一是状态字段几十上百个——全量快照内存与恢复成本高,改记差量日志;二是撤销链多层(连续撤销多次操作),单快照只支持退一步,要栈式备忘录;三是操作含不可逆外部副作用(道具已发出无法收回),快照恢复不了外部世界——副作用类操作应设计成确认后执行而非可撤销。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、隐蔽陷阱 打印 5 层星号金字塔,每层比上层多 2 颗星、左侧空格少 1 个——空格与星数的数量关系不清晰时,…
【游戏】 一、业务场景 帮会下午没活动,成员上线点个卯就走。狩猎场上线:每晚 8 点开门 30 分钟,场内刷固定猎物,猎杀计…
【游戏】 一、业务场景 帮战开打才发现帮会没有物资储备,临时收捐谁也不交。粮仓上线:平日捐粮入库记账,帮战期间按配给开仓领补…
【语法】 一、隐蔽陷阱 验证"任一整数的立方都能写成连续奇数之和"时,起点从 1 开始逐个试,n 稍大就长跑几百步还没对上—…
【游戏】 一、业务场景 帮会大厅一面空墙,有人提议留言,结果聊天区刷屏根本留不住。题字墙上线:花 100 帮贡刻一句题字永久…
【游戏】 一、业务场景 灯谜活动上线半小时谜底被解题工具全数搜出——谜面与谜底同放在一份客户端配置里,读表即得。服务端重构:…