元素词缀进入统一效果帧:v45

2026-09-20。本批将元素创建阶段接入 AdvanceCombatEffects 的整帧工作副本,并统一现有回复 / DoT / 控制与 affix 子效果的顺序。生产处理器尚未绑定到正常游戏;验证使用明确的数值 / Combo 夹具,不是元素武器实战开放。

接线结果

配置 INativeElementalRuntime 后,同一个 AdvanceCombatEffects 会:

  1. 遍历 PASSIVE,再遍历统一 DYNAMIC 表;各阶段仍在入口捕获长度。
  2. 更新已存在效果的 elapsed。
  3. 处理 HIT 留下的元素触发器,创建或刷新真实 AffixBook。
  4. 把新 child 的引用加入同一动态序列,但不在已进行的阶段立即遍历它。
  5. 在任何末项补位之前保存缓存重算输入。
  6. 清理到期效果条目,保持 affix 所有的 child 分配仍存在。
  7. 进行健康 / DoT 结算。
  8. 推进父词缀倒计时,解绑和销毁父持有的 child。
  9. 重算父清理后的属性,并推进 CStat 时钟。

触发器已过期、激活被禁止或仅需刷新时,不再提前读取用不到的来源等级。

一个控制累加器

新增 NativeEffectFrameStepper。旧动态路径和新混合路径共同使用它处理 STUN / KNOCKBACK:

  • 不给每条击退单独钳制速度;
  • 所有贡献累计完后,才按玩家 / 非玩家上限处理;
  • 最后帧及已标记退场的击退仍执行原本的更新分支;
  • 原有混合帧原代码对照继续通过。

这避免了为了加入元素效果,把控制更新拆成多个互相独立的 tick。

Kind 4 与跨池补位

共享引用新增 Kind=4,指向 AffixBook 登记表中的 child。回复 / DoT / 控制 / 元素触发器仍分别为 0 / 1 / 2 / 3。

父 children 向量、book 子列表和共享动态顺序都引用同一个 ID,不复制第二份时钟。全局补位后重新整理各池投影,尤其不能只对 book 的局部子列表做补位,否则与控制 / DoT 混排时顺序会错。

普通效果到期摘除与显式 Unlink 是不同路径:

  • 到期从管理器摘除引用,不立即销毁 affix 持有的对象;
  • 不额外调用普通 Unlink 的描述失效 / onRemoved 路径;
  • 父级到期时才执行已有的完整 detach 顺序与所有权释放。

测试覆盖到期回复把新主题行补到前面,以及父时钟先到期、child 尚未到期时,正确移除 owned 行并保留无关沉默效果。

整帧事务

只要本帧涉及元素触发器或词缀,就使用完整模拟工作副本,不再让每个小阶段各自发布状态:

  • 服务工厂绑定到工作模拟,不指向原局;
  • 词缀构造、Combo、随机数、缓存、HP 与清理要全部成功才发布;
  • 中途 child tick 失败,整帧时钟和状态都回滚;
  • 读档后必须重新绑定 INativeElementalRuntime;
  • 快照升级为 v45,保留 Kind 4 与 canonical child 的对应关系。

原有不含这些实例的通路保留原更新路径。

Frozen 核心链路已验证

测试沿实际 HIT 接收器进入统一更新,而非直接手动调用构造器:

  • HIT 留下触发器;
  • 第一个 0.25 秒帧创建 Frozen,速度 / 攻速 / 施法速度修正均为原 DAT 的 -33;
  • 新 child elapsed 仍为 0,父时钟和 Combo 的后续阶段已推进至 1.75 秒;
  • 再次附加后刷新 child 时钟,不再次执行 ComboIce;
  • 到期移除父与 child,撤销数值修正,同时保留 CStat 实例历史;
  • 保存 / 恢复后 HIT、刷新、清理与 RNG 逐值一致。

刷新测试显式把冰护甲设为零,并在第二击前恢复目标 HP,以单独验证刷新:攻击命中成功不保证元素概率通过;第二击杀死目标时,原版死亡状态会延后元素触发器处理。没有据此改动真实怪物定义或死亡门。

验证数据

  • 1945 条核心断言通过。
  • 424 项相关 Python 回归通过。
  • Godot C# 构建零警告 / 零错误,coresimlint 无硬错。
  • 独立 headless Godot 检查扩展为 30 项,新增实际统一命令的创建、数值读取、清理及整帧重放。
  • ECHO PASS 已有混合回复 / DoT / 控制回归通过,死亡通知一次,列表顺序和奖励不变。
  • 未新增“整帧原二进制完全等价”的声明;新验证为组合运行时检查,已有原帧算术对照继续使用。

代码与日志:

  • core_sim/NativeElementalEffectFrame.cs
  • core_sim/SimElementalRuntime.cs
  • core_sim/NativeEffectFrame.cs
  • core_sim.tests/ElementalFrameChecks.cs
  • build/native_elemental_frame_*.log
  • build/native_named_stat_engine/result.json

仍未完成

正常游戏尚未在 CoreSimBridge 绑定生产 INativeElementalRuntime。夹具中的主题、注册和移除回调只用于验证边界,不能当作实际粒子或技能处理器:

  • 原 canApply / apply / register 的生产消费者、全局观察者和来源技能仍需完成;
  • 受击动画 / 技能中断适配器仍需绑定;
  • UnitTheme 的实际显示 / 回收与 Charged Bolt 未完成;
  • affix 的致死 DoT 来源归属已由后续批次接通,见 词缀持续伤害的死亡来源与奖励;来源技能 / 非单位 modifier 分支仍拒绝;
  • 未表示的外部定时 PASSIVE 行和遍历中物理摘链仍显式拒绝。

因此武器准入保持 1099 / 1419,273 阻塞、47 基础缺口、0 构造异常。目标未完成,下一段是生产处理器与场景验证,而不是撤掉保护门。

遵循 godot-master 的权威状态 / 表现分离。main 原地,未提交、未 attach 原游戏,默认存档 SHA256 未变: 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f