四元素进入普通命中事务:接收侧与 v44
2026-09-20。本批将 TYPE106–109 转移接收器接进 CombatState.Attack 的真实工作副本,不再只有孤立概率函数。当前完成 HIT 接收 / 记录阶段;下一帧触发器转词缀及完整受击反应仍未绑定,原版元素武器准入未开放。
普通命中接线
PrepareAttackControls 沿原类型排序遍历转移效果,现在处理 FREEZE / BURN / POISON / SHOCK:
- 接收门通过后才进行 CopyForTarget。
- 使用现有原版元素挂载内核,保留整数概率、浮点护甲门、整数受击抗性三个随机调用的先后顺序。
- 真正附着执行 CopyForAttachment,保存接收者自己的触发器实例。
- 角色来源读取通用 / 元素专属时长加成;装备来源保留负物品实例 ID,不替换成持有者。
- 所有副本、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。