元素词缀进入统一效果帧:v45
2026-09-20。本批将元素创建阶段接入 AdvanceCombatEffects 的整帧工作副本,并统一现有回复 / DoT / 控制与 affix 子效果的顺序。生产处理器尚未绑定到正常游戏;验证使用明确的数值 / Combo 夹具,不是元素武器实战开放。
接线结果
配置 INativeElementalRuntime 后,同一个 AdvanceCombatEffects 会:
- 遍历 PASSIVE,再遍历统一 DYNAMIC 表;各阶段仍在入口捕获长度。
- 更新已存在效果的 elapsed。
- 处理 HIT 留下的元素触发器,创建或刷新真实 AffixBook。
- 把新 child 的引用加入同一动态序列,但不在已进行的阶段立即遍历它。
- 在任何末项补位之前保存缓存重算输入。
- 清理到期效果条目,保持 affix 所有的 child 分配仍存在。
- 进行健康 / DoT 结算。
- 推进父词缀倒计时,解绑和销毁父持有的 child。
- 重算父清理后的属性,并推进 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。