四元素进入普通命中事务:接收侧与 v44

2026-09-20。本批将 TYPE106–109 转移接收器接进 CombatState.Attack 的真实工作副本,不再只有孤立概率函数。当前完成 HIT 接收 / 记录阶段;下一帧触发器转词缀及完整受击反应仍未绑定,原版元素武器准入未开放。

普通命中接线

PrepareAttackControls 沿原类型排序遍历转移效果,现在处理 FREEZE / BURN / POISON / SHOCK:

  1. 接收门通过后才进行 CopyForTarget。
  2. 使用现有原版元素挂载内核,保留整数概率、浮点护甲门、整数受击抗性三个随机调用的先后顺序。
  3. 真正附着执行 CopyForAttachment,保存接收者自己的触发器实例。
  4. 角色来源读取通用 / 元素专属时长加成;装备来源保留负物品实例 ID,不替换成持有者
  5. 所有副本、HP、护盾、随机数和反应发布计划在整次 HIT 成功后才提交。

装备含这四类 TRANSFER 效果时,现在与 DoT 一样分配稳定物品身份。否则接收者无法保存真实来源,也无法在后续销毁或换装时追踪它。

命中生成的是 NativeElementalTriggerSnapshot,而非立即生成 DAMAGEEFFECT* 词缀。实例保留源身份、源等级、源物品键、五槽 / 曲线模板、效果等级、值、时长、elapsed 和标志。

共享动态序列增加 Kind=3;回复 / DoT / 控制仍为 0 / 1 / 2,各自 ID 空间独立。后续控制和回复追加不得覆盖已存在的元素顺序,周期池投影只提取 Kind 0 / 1。

护盾门的进一步纠正

原调用链是 525488 → 512C90 → 7AE100。最后一层只查 PASSIVE / DYNAMIC 表中的 TYPE:

  • 不读取容量;
  • 不读取过期标志;
  • 不比较 elapsed;
  • 不扫描 TRANSFER 表。

因此:

护盾状态是否阻挡元素接收
容量恰好降至零,但条目仍登记
已标记过期,但尚未摘除
本次伤害已真正移除该条目
仅位于 TRANSFER 表

在 548850 中,54A64E 的护甲 / 吸收处理先于 54DF49 的转移分派,后者又先于 54E091 的健康写入。因此不能拿命中前的护盾列表决定元素接收。

ShieldConsumption 现在提供本次攻击的暂存登记视图:已确定存在的条目直接证明阻挡;证明“不存在”时仍检查缺失的旧缓存 / 列表信息。旧文档中笼统的“活跃护盾”已同步纠正。

基础伤害字段不是武器面板

元素护甲门读取 target+0x7A4 的无符号基准,以及 +0x708 / +0x70C / +0x710 / +0x714 的原始元素护甲字段,不使用最终装备护甲总值或武器面板伤害。

  • CCharacter 构造器 555BA7 初始化该基准为零。
  • 普通属性缩放路径 55DB3D 写入伤害曲线 floor。
  • 新怪物出生通过 MonsterScaler.ElementalBaselineForNew 保存普通初始化路径的曲线 floor 和对应等级,不借用冠军面板缩放结果。
  • 56D380 在 56D6B5 调用普通等级初始化,再于 56E662 / 56E717 进行冠军强化;522BE0 没有写 +0x7A4。因此冠军同样保留普通初始化基准,而不是 DAMAGE_CHAMPIONMONSTER 的 floor。
  • MAXDAMAGE 不触发缩放时保留已确认的构造零。
  • 缺失或等级不匹配的旧数据不从当前 MinDamage / MaxDamage 猜算。
  • 玩家接收侧完整基准初始化尚未补齐,未知值仍为 null。

字段是惰性读取:护盾拒绝或概率失败时,不会为了验证一个用不到的基准而提前报错。

受击反应的事务边界

52CE50 不只是播放一个动画名字:它有 AI / 状态 / 模型条件,可能取消技能、改变状态并选择动作。这里没有用“发一个 HIT 字符串”冒充完整恢复。

AttackControlContext 可提供 PrepareElementalReaction:

  • 使用本次暂存随机流准备;
  • 返回只负责发布已验证状态的 Commit;
  • Commit 不得再查动画、掷随机数或执行可失败工作;
  • 若反应改变了角色来源的时长加成,必须提供 SourceStatAfterReaction;
  • 只有明确保证未改变来源统计时,才能使用 PreservesSourceStats;
  • 缺失这些事实时,整次命中拒绝,不能偷偷沿用反应前缓存。

测试验证了后续另一个转移失败时,之前准备的元素实例、受击反应和 RNG 均不发布。正式动画 / 技能中断适配器仍待实现;测试计划为明确夹具,不是原版反应函数的完整替代。

v44 与当前边界

快照增加元素触发器列表、next ID、共享顺序,以及基础伤害基准的等级来源。复制 / 恢复会断开模板数组,旧快照不补造触发器。

当前仍明确拒绝:

  • elemental_reaction_runtime_unbound:需要反应但没有真实准备器。
  • elemental_reaction_source_stats_unbound:反应后来源统计未知。
  • elemental_trigger_dispatch_pending:触发器到状态词缀的更新未绑定。
  • elemental_base_damage_unknown:本次实际需要的基准未知。
  • 涉及其他尚未归入统一实例管理的同名 EXCLUSIVE 冲突。

新触发器进入共享序列后,不允许旧控制 / 回复更新接口把它丢掉。下一段工作是把它们交给 NativeElementalLifecycle,并在正确阶段构造 / 刷新真实 AffixBook,接通子效果派发、观察者和表现回收。

验证

  • 1919 条核心断言通过。
  • 424 项相关 Python 回归通过。
  • Godot C# 构建零警告 / 零错误;coresimlint 无硬错。
  • 独立 headless Godot 宿主检查扩展到 21 项,包含实际 CoreSim.Attack、原版怪物缩放基准、触发器身份和 HIT 保存恢复重放。
  • 核心场景包含:四元素类型顺序、角色 / 装备来源差别、四种护盾边界、EXCLUSIVE 墓碑保留、共同序列、惰性读取、反应准备与失败回滚。
  • Godot 命中夹具使用注入的确定概率模板和受击抗性,不是绕过准入完成一件原版元素武器。
  • 已有 ECHO PASS 混合回复 / DoT / 控制回归继续通过,作为普通战斗兼容性检查。
  • 本批没有新增“完整原函数机器码对照”声明;元素挂载算术沿用此前 1920 组原对照,当前新增的是 HIT 接线和顺序验证。

产物:core_sim/NativeElementalTransfers.cs、core_sim.tests/ElementalHitChecks.cs、 build/native_elemental_hit_*.log、build/native_named_stat_engine/result.json。

武器审计保持 1099 / 1419 可构造,273 阻塞、47 基础缺口、0 构造异常。后续阶段未接完前,不把接收器成功算作武器完成。

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