DoT 与回复统一周期更新及 v31 顺序
后续:持续伤害致死来源与奖励分派已完成分派核/清来源重取值验证;正式致死接线仍未开放。下方为周期更新批次记录。
接续净速率公式与目标挂载。本批已执行非致死 DoT 扣血,并将它与回复效果放到同一周期事务中。完整致死/其他动态效果混排及正式武器准入尚未完成。
自然回复与最终变化
原版 GLOBALS.DAT 给出 HP_RECHARGE_RATE=0、PET_HP_RECHARGE_RATE=1.5。64184A、64188A 分别把它们存进 CGlobals +0x70、+0x74。
53C2F0 按单位 INVINCIBLE 位(+0x6AA)选择后者,不是按 PET 类型:
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 不能拆开稳定过滤。例如:
[到期回复 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,不是全部武器已完成。