词缀持续伤害的死亡来源与奖励接线

2026-09-20。补齐父词缀持有 TYPE52(尤其 BURN)进入统一帧后的致死归属。仍使用 v45 快照,没有新增字段;正常游戏的生产元素处理器尚未开放。

原版规则与实现

后续接线状态:正式数值处理器现已绑定正常加载 / 读档,见 元素正式分派。下文保留本批死亡结算的验证范围;完整元素武器仍未开放。

依据既有原二进制对照和 IDA 导出:53C2F0 的致死段(53C3D8–53C7D6)、7A8CA0 清来源及 7A85C0 重掷。

  • 先扫描 PASSIVE,再扫描 DYNAMIC;每个列表只处理第一条带有效来源的候选,并不是按最高伤害、最后一击或来源 ID 排序。
  • TYPE52 / TYPE156 是候选;TYPE7 / TYPE124 需 slot0 为负。扫描的是效果清理之后仍登记的列表。
  • PASSIVE 先选出死亡来源,后续 DYNAMIC 候选可触发 0 点经验 / 名望回调,但不取代已有来源。
  • 死亡来源与奖励接收者可以不同:例如野怪来源保留,但已有玩家来源回退得到奖励。
  • 装备来源通过当前装备持有关系解析,不能用历史来源名称或“在背包里”推断持有人。

PeriodicDeathHost 现在将 owned PASSIVE 和共享 DYNAMIC 引用映射到独立句柄。旧 DoT、回复、控制、元素触发器与 Kind 4 子效果保留现有顺序,避免相同池内 ID 被误认成同一个效果。

清来源不是移除整个词缀

NativeAffixInstances.ClearSourceAndReroll 对选中 child 执行:

  1. 清除 child 的实时 Source;
  2. 使用原模板、等级及已有重掷核更新 Value / ValueCeil;
  3. 保留父词缀、OwnerAffix、其他 child、标记、名称及列表位置;
  4. 不调用 detach / unlink / 析构回调,也不在该操作内重算管理器缓存。

父词缀的 Source 仍保留。父级后续正常到期时按既有清理路径处理,不会提前销毁整个燃烧状态。

清来源后的缓存间隔仍保留;统一元素帧随后的父级阶段会按既有次序重算属性。旧 DoT-only 路径原有的延迟刷新行为不变。

来源技能可能恢复弱引用并使用技能私有 RNG,此分支仍明确拒绝:

  • affix_skill_rng_source_clear_pending
  • affix_source_modifier_clear_pending(尚未表示的非单位 stat modifier)

0 点回调的统计差别

跨列表的 Experience(0) 不是第二次经验支付,但原经验接收函数仍可能增加击杀统计 / 记录受害者。

测试覆盖:被动来源为野怪、动态来源为玩家、最终奖励回退给同一玩家。在该夹具中玩家有两次击杀统计回调,但经验池仅支付一次。不能为了让统计看起来“只加一”而删除原版的 0 点回调。之后尸体帧不再产生死亡结算,也不再支付奖励。

事务和接收条件

致死处理在现有整帧工作副本中进行。HP、词缀 child、旧 DoT、来源重掷 RNG、奖励、父级清理、Combo 时钟全部成功才发布。

测试故意让奖励回退缺少来源:即使此前已经清除了被动 / 动态来源并重掷,也会完整回滚。

新建 BURN 不存在于旧 DotEffects 池,所以另补了接收条件:已登记的 owned TYPE52 必须有原始健康全局参数和角色 native state,不能偷偷使用兼容默认值。缺少参数同样整帧拒绝。

验证

  • 1962 条核心断言通过,较上一批新增 17 条。
  • 424 项相关 Python 回归通过。
  • Godot C# 构建零警告 / 零错误,coresimlint 无硬错。
  • 独立 headless Godot 检查 34 项通过:实际 BURN HIT → 触发器 → 原 DAT 词缀创建 → HP 致死 → 来源清除 / 奖励 → 保存重放。
  • BURN 实例中的 TYPE52 来源被清除;主题和 Combo child、父级来源保留。
  • 被动 / 动态混排、池 ID 碰撞、装备来源、来源回退、异常回滚、尸体不重复奖励均有覆盖。
  • ECHO PASS 既有混合回复 / DoT / 控制实际场景回归通过,死亡通知一次。这是旧场景链路回归,不是生产 BURN 武器场景验收。
  • 原 388 组致死调度对照继续通过;本批没有新增“完整原版帧机器码等价”的声明。

日志:build/owned_periodic_death_{core,regression,build,lint,audit,world}.log;引擎结果 build/native_named_stat_engine/result.json。

剩余边界

移除了已补齐的 affix_periodic_death_source_pending 保护门,但没有解除整个元素武器的准入:

  • CoreSimBridge 尚未绑定生产 INativeElementalRuntime。
  • canApply / apply / register、全局观察者、来源技能分支仍需生产适配。
  • 主题粒子显示与回收、受击动作 / 技能中断、感电 Charged Bolt 未完成。
  • 未表示的外部定时 PASSIVE、遍历中物理摘链、TURN ALIGNMENT 等仍拒绝。
  • 验证用主题 / 注册回调是明确的测试边界,不是已完成的表现实现。

武器构造检查仍为 1099 / 1419;273 阻塞、47 基础缺口、0 构造异常。目标未完成。

按 godot-master 保持权威状态与表现分离。本批 main 原地、未提交、未 attach 原游戏;默认存档 SHA256 未变: 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f