TYPE52 持续伤害净速率与护盾查询
后续挂载/命中事务/v30 保存进展见持续伤害挂载、来源与重放。本页以下为数值核批次记录,完整周期 HP 与致死仍未完成。
入口和适用范围
562590 → 563D52 是 TYPE52 的目标挂载分派;周期生命值更新则走 53C2F0 → 522AE0。挂载时不直接执行这里的扣血。
522AE0 的参数是传递给属性查询/护盾处理的布尔标志,不是 float dt。真实生命值更新在 53C30F 传入 0;返回净速率后,53C316 才乘调用者的 dt,53C321 落到 float。
本页数值核已移植到 CoreSim 并经过原版机器码对照。目标挂载、来源增伤、独占刷新、自然回复及持续伤害致死归属仍未全量接入生产,不代表相关武器已经全部完成。
完整七通道净速率公式
以下 stat(type, channel) 均表示原版 getStat(..., false),不是 UI 的取整显示值;f32 为明确的单精度存储。
common26 = f32(stat(26, 6))
sum52 = 0f
for channel in 0..6:
r = stat(26, channel)
storedR = f32(r)
if channel != 6:
r = r + common26
storedR = f32(r)
if r < -75:
if hasUnitType(PLAYER = 0x1C):
storedR = -75
skip -100 comparison
else:
r = storedR
if not skipped and r < -100:
storedR = -100
beforeShield = f32(stat(52, channel) * (storedR * 0.01f + 1))
afterShield = consumeAbsorbBuffers(beforeShield, channel, false)
sum52 = f32(afterShield + sum52)
recharge124 = f32(stat(124, 7))
netRate = stat(7, 7) + recharge124 - sum52
effectDelta = f32(netRate * dt)以上是有限数值下的可读展开。位级一致实现还必须保留 24/53/64 位 x87 运算精度、寄存器保留值与单精度存储点;不能提前把 netRate 存成 float 再乘 dt。通道 6 不重复加入公共减伤。
该路径没有护甲扣减、暴击判定和吸血。TYPE52 的伤害速率不做额外 0.016f 换算;7AFE00 仅对有限时长的 6/7/123/124 做那次换算,然后这里仍乘实际 dt。
原版护盾的特殊行为
51FEB0 的最后参数为 false 时仍然抵消,但不提交护盾容量变化、不删除耗尽效果。
- 按 passive、dynamic 顺序查询匹配通道或 ALL 的有效 TYPE122。
- 当前容量不足:剩余速率减容量;容量足够:剩余速率置零。
- 计算后容量保持原值,所以 ALL 护盾会独立抵消每个通道,再在下一 tick 继续抵消。
- 每个效果后、每个列表后都有非正剩余量退出检查;负速率情形保留这两个检查位置。
- 抵消的是速率,而不是
速率 × dt。
这与旧 MOD 文档 docs/devlog/runtime-hook-readme.md 的 dotShield 修复是两个层次:旧文档指出原版问题并提出改法,本次原版迁移保留游戏原行为,不移植该修复或额外的物理护盾回落。
原生验证
固定 EXE SHA256:186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。
tools/build_native_periodic_health_oracle.py 执行原版 522AE0 和 query-only 51FEB0 机器码;属性值、PLAYER 查询和效果列表 getter 是明确输入边界。未执行原游戏进程,也没有以重写的 C 公式充当原版答案。
520 组输入 × 三精度,1,560 组净速率、帧变化、七通道抵消前/后位值和调用顺序均一致,全部护盾容量未变。覆盖 -75/-100 边界、通道 6、分通道/ALL 护盾、到期/禁用效果、零时间步长、负速率及浮点取值。
CoreSim 的 NativePeriodicHealth.EvaluateRepresented 已接现有单位和装备属性来源,要求调用者明确装备上下文并先更新效果寿命/缓存。缺失类型来源或护盾实例不会伪造为零。该入口只返回本次计算结果,不修改 HP。
仍需接入的完整运行时
- 挂载时来源角色/root-owner 增伤、难度换算及复制/重新取值的 RNG 次数。
- 同名独占/叠加、到期顺序、与现有回复效果统一 tick。
53C2F0另外计算的自然回复及完整modifyHealth状态门。- 致死时扫描效果来源的归属规则、死亡事件和存档重放、实际 HIT 验收。
本批验证:1,461 条核心断言、57 项相关 Python 回归及 Godot C# 构建通过。逐武器构造统计保持 1,053/1,419;TYPE52 仍是 53 条定义的首个阻塞,没有因数值核通过就放宽武器准入。