DoT 与回复统一周期更新及 v31 顺序

后续:持续伤害致死来源与奖励分派已完成分派核/清来源重取值验证;正式致死接线仍未开放。下方为周期更新批次记录。

接续净速率公式目标挂载。本批已执行非致死 DoT 扣血,并将它与回复效果放到同一周期事务中。完整致死/其他动态效果混排及正式武器准入尚未完成。

自然回复与最终变化

原版 GLOBALS.DAT 给出 HP_RECHARGE_RATE=0PET_HP_RECHARGE_RATE=1.564184A64188A 分别把它们存进 CGlobals +0x70+0x74

53C2F0 按单位 INVINCIBLE 位(+0x6AA)选择后者,不是按 PET 类型

text
effectDelta = f32(522AE0(false) * dt)
rate = INVINCIBLE ? CGlobals[0x74] : CGlobals[0x70]
natural = maxHP(int) * rate(f32) * dt(f32) * 0.01f
combined = effectDelta + natural
if combined < 0:
    damageTotal = f32(oldDamageTotal - combined)   # unit+0x20C
naturalTotal = f32(natural + oldNaturalTotal)      # unit+0x210
modifyHealth(f32(combined), 1, 0, 0, 0)

natural 在与 effectDelta 相加前不额外落成 float,保留 x87 精度。普通分支 rate=0 跳过 maxHP 查询;INVINCIBLE 分支不跳过。状态 5/6 在入口返回,连记账都不执行。记账先于 modifyHealth,所以 HP 被 suppressed 阻止时记账仍已发生。

当前 F2 读取这两个字段,Godot 恢复服务时重新绑定;不把数据名称误译成宠物类别条件,也不改变护盾 query-only 的原行为。

生命周期的共同顺序

同一 native dynamic 表中的回复、DoT 不能拆开稳定过滤。例如:

text
[到期回复 A, DoT B, DoT C]
             ↓ 原版 swap-last
[DoT C, DoT B]

新增顺序引用 NativePeriodicEffectRef(Kind, Id)(当前回复=0、DoT=1)。每个效果保留各自实例数据,顺序表保存真正的交错顺序;到期使用 7AF2A0 的末项填补并重新检查当前位置,同时记录移除次序。

回复 EXCLUSIVE 也改为原 expire 语义:给旧项写 elapsed=duration 并置 flags 0x20,再追加新项,统一 tick 才摘除;不是立即稳定删掉旧项。有限回复的 0.016f 换算仍保留,7/124 各自累加缓存,再进入净速率公式。

命中事务和快照

同一实际 CoreSim HIT 可先附加 DoT,再触发受击回复。准备阶段现在共享未来效果列表和顺序,提交两种效果后缓存不会互相覆盖。下一 tick 只计算一次净 HP 变化。

v31 保存共同顺序、两个原版记账值和回复墓碑;捕获/恢复深复制,不重掷。旧存档只有一类池时可恢复其既有顺序;两类非空却没有交错信息时保留未知并明确报错,不按类别猜顺序。

周期更新使用临时投影,先准备所有相关单位的寿命/缓存/HP/记账,再统一提交;缺少来源或遇到尚未实现的致死处理时,不部分推进这些字段、冷却或递归计时器。

验证和边界

固定 EXE SHA256:186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e

  • 原机器码 53C2F0:960 次调用(三精度;576 实际计算、384 状态跳过),变化量和两个记账值一致。
  • 原机器码 7AF2A0:160 组混排清理,存活和移除顺序一致。
  • rate/globals/maxHP/modifyHealth、清理通知/析构/分配器是明确边界;这不是整个 modifyHealth/死亡流程验证。
  • 1503 条核心断言通过:混合扣血、自然回复、跨类型清理、同 HIT 安装两类效果、护盾保留容量、suppressed 记账及 v31 逐字节重放;保留旧纯回复/眩晕组合,明确拦截未接入的 DoT/控制混排。
  • 298 项相关 Python 回归、Godot C# 构建和架构 lint 通过。
  • Godot 主场景无界面回归:原版 GREATHAMMER_U03 命中触发回复,100ms 后 HP=137.760009765625/236,过期清理/重放通过;未作像素验收,默认存档未修改。

当前仍保留以下明确缺口:致死来源/奖励/死亡回调;控制效果和外部 dynamic 效果的共同列表;master/ATTACHESTOMASTER tick;正式接收方门控/来源与 UNITTHEME 表现。法力周期更新不属于本批 HP 实现。

致死 ASM 已确认一个后续关键点:每张 passive/dynamic 表只处理首条有 character/item source 的候选,然后转下一张表;TYPE80 可覆盖最终来源,活的 target+0x204 可改变经验/声望领取者而不改变死亡回调 source。不能用“最后一次 DoT 攻击者”代替该算法。

因此 TYPE52 准入仍关闭,逐武器构造保持 1053/1419,不是全部武器已完成。