战斗撤销

战斗撤销

添加一个战斗中的撤回系统。按Z键撤销上一张卡牌或药水,按Shift+Z键倒回整个回合。基于快照机制,恢复生命值、格挡、能量、牌堆、能力、意图和随机数。

游戏玩法

StS2 Undo

把操作退回去 —— 在战斗中撤销出牌和回合


如果你的 STS2 是 beta 分支?

[这个文件(Sts2UndoMod-v0.0.12.zip)是 stable(稳定)分支的构建。 如果你在 Steam 中选择了 STS2 的 beta 测试(右键点击《杀戮尖塔 2》→ 属性 → 测试版),请改用 beta 分支的构建文件——打开本模组页面的“文件”标签,从那里下载 Sts2UndoMod-v0.0.12-beta.zip。如果在 beta 分支上运行这个 stable dll(反之亦然),第一次出牌时就会抛出 MissingMethodException,因为两个分支的 STS2 API 有所不同。

这两个文件之所以存在,只是因为 STS2 目前有两个并行的公开分支,且 API 有少量差异。一旦 STS2 将 v0.104.0+ 推送到公开的 stable 分支,这个 stable 文件将针对新 API 重新发布,两个文件会合并回一个下载。 如果你没有选择 beta 测试,这个文件就是你唯一需要的。


按 Z 键的效果

  • 单步撤销 — 弹出最近的快照,并恢复到上一次出牌 / 使用药水 / 结束回合之前那一刻的精确战斗状态
  • 整回合撤销Shift+Z 一键回退到当前玩家回合开始时的状态
  • 战斗内撤销按钮 — 能量显示旁边会出现一个 ↶ Z 按钮;点击效果与按 Z 键相同
  • 仅限战斗 — 撤销系统只在战斗进行中生效。地图上没有撤销,死亡动画结束后没有撤销,跨界面也没有撤销
  • 30 个快照历史 — 每场战斗最多在内存中保留 30 个之前的状态;更旧的快照会被静默丢弃

工作原理

本模组会在以下任一动作开始时对战斗状态进行深度快照

  • 出牌(PlayCardAction
  • 结束回合(EndPlayerTurnAction
  • 使用或丢弃药水(UsePotionActionDiscardPotionGameAction

按下 Z 键会弹出最近的快照并恢复以下内容:

  • HP、格挡和能量
  • 手牌、抽牌堆、弃牌堆、消耗堆(包括顺序)
  • 所有生物身上的能力和层数
  • 遗物、药水和球
  • 怪物下一回合的意图
  • RNG 状态 — 因此接下来的抽牌会与原本的走向完全一致
  • 视觉状态 — 骨骼动画、色调、碰撞体和悬停提示焦点都会重置,与恢复的帧保持一致

这是一种快照方案,而不是命令/逆操作方案。要逐一还原 StS2 中每种状态交互的逆操作(例如“易伤”是由 X 遗物施加的,还是 Y 能力施加的,或是 Z 卡牌命中时施加的,等等)并不现实,因此本模组采用“捕获并恢复”的方式。


快捷键

  • Z — 撤销一步(上一次出牌 / 药水 / 结束回合)
  • Shift+Z — 撤销到当前回合开始

你也可以点击能量显示旁边出现的 ↶ Z 按钮。


主要特性

  • 单键撤销 — 一个快捷键覆盖最常见的情况(上一个动作)
  • 整回合回退 — 当你想要重新规划整个回合时,用 Shift+Z 一键回滚
  • 本地化撤销按钮 — 战斗内按钮,支持英语 / 韩语提示
  • 死亡安全 — 死亡动画会正常播放完毕;你不能跨越死亡帧进行撤销
  • 轻量捕获 — 遗物捕获使用游戏自带的 MutableClone 而非完整的反射深克隆,因此每次出牌的额外开销几乎为零
  • 视觉保真 — 复活的敌人、蜈蚣风格的尸体和悬停提示都能正确恢复;撤销后不会残留“DEAD”覆盖层或卡住的姓名牌
  • 能力状态保真 — 子类型专属的能力字段(如 Kaiser 蟹 Boss 的背击朝向等)能够干净地往返保存,撤销后视觉效果和伤害倍率不会不同步
  • 费用修正保真 — 从猛扑(猛扑)、무자비(무자비)或 Havoc 获得 CardEnergyCost._localModifiers 的卡牌,现在可以在撤销时干净地往返保存,因此“下一次攻击/技能费用为 0”的效果会在回退消耗它的那张牌后重新生效
  • 阶段转换保真 — TestSubject(실험체)从阶段 1 转换到阶段 2 时,会播放正确的原版转换动画,而非普通死亡动画;单目标悬停瞄准在复用的 NCreature 节点上继续正常工作;阶段 2 中 HP 条按预期重新出现(设计上仍不支持跨越阶段边界的撤销)
  • 死亡复活随从支持 — 拥有 IllusionPower(환상)的随从(如 이빨 달린 눈(이빨 달린 눈))死亡时不再卡死游戏。原版的复活流程原样运行,复活后单目标悬停瞄准在复用的 NCreature 上正常工作,并且复活后的 HP 条协调器会修正原版中 AnimateOut/AnimateIn 生命周期不一致的问题,确保 HP 条在死亡时可靠隐藏、复活时重新出现(设计上仍不支持跨越死亡本身的撤销)
  • Necrobinder Osty 支持 — 拥有 DieForYouPower 的 Osty(골골이)不再在 1 HP 下回合复活时再次死亡并消失。完整的死亡/复活循环按原版运行——死亡动画在濒死-复活前的窗口期内正确播放,并且跨越 Osty 死亡/复活的撤销会正确恢复身体的存活/死亡视觉状态以匹配快照
  • TheObscura(HIVE)卡死修复 — Boss 的 IllusionMove 召唤随从被撤销后不再使战斗卡死;阶段/死亡时生成逻辑保持原版路径
  • 检视界面卡死修复 — 战斗内撤销不再污染共享的 NInspectCardScreen 实例。此前,每次撤销时运行的孤儿卡清理会将屏幕内部的 NCard 加入队列释放,之后当你到达商人或任何卡牌奖励界面并右键点击卡牌时,检视覆盖层会在每次渲染时抛出 ObjectDisposedException 并且无法关闭,只能强制退出。现在清理会跳过由 Screen 类祖先持有的 NCard,因此检视界面可以承受任意多次战斗内撤销
  • NPower 信号重复连接错误修复 — “Signal 'mouse_entered' is already connected”的 Godot 错误不再在每次撤销时出现。此前,能力刷新会在容器重建后手动重新调用每个 NPower 的 _Ready;但 Godot 在新 NPower 进入场景树时已经触发过一次,所以第二次调用会重复连接悬停信号
  • 右键升级预览 — 战斗内右键点击手牌预览升级版本不再锁定输入或冻结预览状态。快照捕获被限制在 RMB(右键)窗口检查之后,因此合成性的预览驱动动作不会意外触发快照。v0.0.8 增加了 Godot.Input.IsMouseButtonPressed 轮询回退方案,因此在 STS2 v0.103.2 上,当卡牌 UI 在我们的 _Input 前缀看到 RMB 事件之前就消耗了它时,该限制仍然有效
  • 小型敌人死亡节奏 — Toadpole(올챙이)及类似小型敌人的“倒地死亡”尾部动画被修剪,使尸体消失的节奏与灰烬溶解特效一致,而不是晚 1–2 秒

安装

  1. 从此页面下载 Sts2UndoMod-v0.0.12.zip
  2. 将其中两个文件(Sts2UndoMod.dllSts2UndoMod.json)解压到《杀戮尖塔 2》安装目录下的 mods/Sts2UndoMod/ 文件夹中
  3. 启动游戏
  4. 开始一场战斗——在任意出牌、使用药水或结束回合后按 Z 即可撤销

模组会在 Windows 上向 %APPDATA%\Sts2UndoMod\probe.log(或在 Linux/macOS 上为 ~/.config/Sts2UndoMod/probe.log)写入一个小型日志。报告问题时请附上该日志。


要求

  • 启用了模组支持的《杀戮尖塔 2》
  • 此文件针对 STS2 的 stable 分支(v0.103.x)构建。如果你在 Steam 中选择了 STS2 测试版(STS2 → 属性 → 测试版),请下载 -beta 文件——由于 STS2 API 变更,stable dll 在 beta 分支上会抛出 MissingMethodException
  • 多人模式下自动休眠 — 当你加入合作(主机 / 客户端)游戏时,模组会检测到并停止捕获快照;↶ Z 按钮不会出现,Z 快捷键变为无效操作。与朋友一起玩时无需卸载模组——加入房间前不必禁用它。单人游戏不受影响

源码与许可证