元素触发器到词缀:创建阶段与逐项派发

2026-09-20。本批实现 NativeElementalResolution.ResolveAfterElapsed,把已推进 elapsed 的元素触发器与真实 DAT 构造器、唯一子效果登记表和生命周期规则组合。这是可调用的解析阶段,不是已经绑定进正式统一帧循环。

创建时机修正

7AFFD0 / 7A49C0 的顺序要求父词缀完整存在后,才逐项进行 setOwnerAffix、canApply、apply、register。

此前 F2 构造回调只能逐个返回 child,无法在第一次回调前展示完整向量。本批增加 prepareAttachment 阶段:

  1. 完成原型 / 克隆 / 等级 / 来源求值。
  2. 向宿主交付父词缀及完整 child 向量。
  3. 每个 child 依次进行 owner 数值求值和派发。
  4. 最后重算属性,再由元素调用方设置显示标记。

NativeAffixInstances.AddConstructed 可先让所有 child 的 OwnerAffix 为零;BindOwnerNumeric 在轮到该 child 时才设置真实回指和数值。这样既不会漏掉后面的对象,也不会提前把所有 child 都当作已绑定。

在第一个 canApply 内重入续期时,后续 child 也会得到新时长;它们之后的数值绑定不会把 duration / elapsed / flags 覆盖回旧值。

解析阶段

ResolveAfterElapsed:

  • 检查触发器过期和激活条件;
  • 查找第一个精确同名 affix;
  • 已存在则续期 / 重置 child elapsed,不重复应用 Combo;
  • 不存在则通过冻结目录构造并逐项派发;
  • 成功创建后执行属性重算边界,再设置 GUID2 / 图标;
  • 按原规则将触发器标记过期。

不推进时间、不立即从列表删掉触发器,也不执行整帧健康结算。调用者还需继续共享缓存重算、效果清理、健康、父词缀与 CStat 阶段。

canApply=false 会同时跳过 apply 和 register;apply 自己的概率失败不能导致 register 被跳过。所有子效果仍保持分配所有权。

随机数和事务

父发布、子效果求值和处理器借用同一条构造随机流。新增 WithEffectRng 让重入操作使用当前子构造流,而不是推进被暂停的外层 RNG。

对照用的双 graph 构造案例观察到:parent 发布时 24 次推进;发布回调再推进一次后,child0 在 27、child1 在 30,总计 31。失败路径不提交调用者 RNG、实例簿或模板缓存。

处理器回调仍必须操作自己的工作状态。此接口不能自动撤销回调随意写入的外部对象。全局观察者、嵌套创建其他词缀及其共享模板缓存,需要后续统一帧宿主协调,不能把该阶段当作这些系统已经全部接通。

标记查找失败

原版只有 GUID 查询有效时才调用 GUID2 setter。查询失败时,已有显示分组身份应保持;图标 setter 则独立执行。

Mark 因此支持“未提供新 GUID”和“明确写入 -1”两个不同操作。测试覆盖已有分组身份保留、图标标志独立清除,以及名称不被标记覆盖。

验证

  • 八个原版词缀变体都通过完整子向量 / owner 逐项绑定 / gate-apply-register 顺序检查。
  • FROZEN 创建时实际执行一次 ComboIce ADD STAT,倒计时为原持续时间;刷新不重建,不再次加点,不重置 CStat 的倒计时。
  • 第一个 gate 中的重入续期能影响所有后续 child。
  • 到期、激活阻止、INSTANT / ALWAYS 哨兵和最后注册失败均有测试。
  • 1932 条核心断言通过。
  • 424 项相关 Python 回归通过。
  • Godot C# 构建零警告 / 零错误,coresimlint 无硬错。
  • 独立 headless Godot 检查扩展至 26 项:实际 HIT 留下触发器,公共遍历器先推进 elapsed,再调用此阶段得到五个 Frozen child;读取速度修正 -33 和 ComboIce=1,刷新 / RNG 重放一致。
  • ECHO PASS 原有武器成长回归继续验证普通 HIT、十次冠军计数、升级奖励和恢复重放。

Godot 与核心检查中的 child 处理器是明确的阶段夹具:数值投影和 ADD STAT 使用真实实现,但其他 apply / register 只验证成员链接和调用边界,没有实现燃烧完整伤害、Charged Bolt 或粒子显示。不能称为四元素端到端实战通过。

主要产物:

  • core_sim/NativeElementalResolution.cs
  • core_sim/AffixInstantiation.cs
  • core_sim.io/F2ElementalAffixes.cs
  • core_sim.tests/ElementalResolutionChecks.cs
  • build/native_elemental_resolution_*.log
  • build/native_named_stat_engine/result.json

尚需接入

正式 AdvanceCombatEffects 仍保留 elemental_trigger_dispatch_pending / native_affix_frame_binding_pending。下一段必须把该阶段接入完整的两张效果表与共享动态顺序,并提供真实子效果处理器、观察者、受击反应和表现回收;不能通过撤掉保护门来冒充完成。

快照保持 v44。武器构造仍是 1099 / 1419,273 阻塞、47 基础缺口、0 构造异常。目标未完成。

遵循 godot-master 的数据 / 逻辑 / 表现分层;main 原地,未提交,未 attach 原游戏。默认存档未改: 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f