技能事件武器打击规划与来源(6C9CC0)

2026-09-20。为 TYPE201/204 攻击型 proc 补齐共用的武器打击规划层,并让现有步枪/加农炮 Damage Shape 和技能投射物消费者共用原版事件字段解析、标志与缩放。

本批不是完整 CSkill 生命周期或自动 proc 接入。生产 TYPE201/204 的准入保护保留,构造仍为 1099/1419,273 阻塞、47 缺定义/创建等级、0 构造异常。全武器目标未完成。

原版事实

原始 EXE SHA256:186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。对照读取原文件机器码与现有 IDA 捕获;未 attach 或修改原版进程。

  • 6CC710:事件 +44 是放置角色;+52 来自 6BFD40 的技能角色解析。装备的技能管理器仍优先解析其当前持有者。
  • 6C9CC0:先取 +44,再由非空 +52 覆盖。+310 开启且解析后的角色有主人时,再以这个主人作为打击角色。不能把放置怪物当伤害来源,也不能永远保存最初的持有者。
  • 入口要求属性存在、放置角色存在、武器伤害倍率非零;对主要角色目标还检查 MIMICIDLE。特殊调用标志以外,单目标限制按当前事件选择的主/次目标比较。
  • 非投射物回调先经过范围检查;投射物回调绕过这个检查。线段 LOS/距离分支是另一个世界输入,本批参考明确关闭并保留边界,没有用恒真结果宣称还原了 LOS。
  • 优先右手;右手不存在才使用非盾牌左手;两手都没有则走空手分支。右手不会被额外套一个左手盾牌过滤。
  • 可选左手追加击依赖 CSkillProperty+208。该字段由 ANIMATIONDW 或 ANIMATIONDWLOOP 非空产生,不是“当前装备了两把武器”。还需非投射物、左手是武器、符合技能类型要求。
  • 即使只有左手,只要上述技能条件成立,原函数仍可能对左手调用两次。不能根据 hand/id 去重,也不能让投射物套用这一追加击。
  • 原函数临时替换角色目标并在返回前恢复;本规划器以显式 Target 参数传递,不修改角色长期目标。

事件数值与标志

6CEE60 将 WEAPONDAMAGEPCT、SOAKSCALEPCT 读取为 float,乘原 float 常数 .01f 后回写 float,并把 <=0 钳为 0。CHARGESCALEPCT 同样归一化但不钳负数。运行时再将前两者分别乘本次回调的 damage/soak 参数,回写 float。规划器保留这些回写点。

DAMAGE_TYPE 初始为 7;只有名称命中物理/魔法/火/冰/电/毒/ALL 表才覆盖。空或未匹配名称保持 7。

普通标志初始 0x800F,另一路调用初始 0x40。随后按事件加入:

条件标志/副作用
BUILD_CHARGE=false0x10000
BUILD_CHARGE=true对共享属性对象的 charge gate 置位(规划结果显式返回)
投射物回调0x300
USEDPS0x400
NOSTRIKEPARTICLES0x800
NODAMAGEREFLECTION 或强制无效果调用0x100
NOSTEALEFFECTS(原默认 true)0x1000
NOSTRIKEEFFECTS 或强制无效果调用0x2000
CANTBEBLOCKED 或强制无效果调用0x40000
IGNOREALIGNMENTTYPE0x40
共用/右手/左手/空手分别 OR 0x10、0xC000、0x4000、0x4040

RIFLE/CANNON 原 EVENT 明确 NOSTEALEFFECTS=false、BUILD_CHARGE=true;不把 proc 默认值覆盖到这些已有技能。

Stormclaw 的使用

WeaponProcCatalog.StartEventStrikes 从保留的原 LEVEL1/EVENT_START 顺序解析武器打击部分,未丢弃或声称执行其他事件内容。

WC_STORMCLAW PROC 的第一个 EVENT_START 是 40% 武器伤害/40% soak、电通道、NOSTRIKEEFFECTS=true。第二个 lightninghit 事件的武器伤害倍率为 0,不应再次造成普通武器伤害。前者的规划结果已交给真实 CoreSim Attack 管线验证,并检查恢复后 HP/RNG 一致;放置角色与玩家伤害来源明确不同。

这不是从原版随机 proc 自动触发出的世界闪电:技能管理器启动、内部 RNG、事件时序、线发射器/附着、查询生产方和递归命中事务仍待接入。尤其不能只播放闪电图像后宣称这批武器完成。

原机器码参考与测试

tools/build_native_skill_strike_oracle.py + native_skill_strike_oracle.c:7176 组参考,包含 2392 组输入 × x87 PC24/53/64。覆盖全部 256 组事件标志与 8 组调用标志、左右手/盾牌/非武器、额外左手调用、来源覆盖后再取主人、入口拒绝和浮点缩放。

原 6C9CC0 两页代码整体映射到 +0x30000000,避免低地址被 Windows CRT heap 占用;内部相对分支不改。世界范围、类型、目标 setter、效果管理器和最终 strike 函数是明确 stub 边界。保留原分支与调用记录,不把边界 stub 当原版伤害/LOS证明。参考校验 EXE、builder、harness 与公共映射器哈希。

测试还保留了原单目标空指针比较:次目标为 null 且被选目标也为 null 时比较会相等,不能把它改成“必须有非空的主要选中目标”。

  • 1681 条核心断言通过,包括 7176 组原结果的调用顺序、来源、hand、flags、scale 逐位比较。
  • 343 项相关 Python 回归通过;另外 12 项技能编译/投射物回归通过。
  • C# 构建 0 warning / 0 error,coresimlint 通过。
  • 实际 ECHO PASS headless 主场景:RIFLE_N01、CANNON_N01、LEGENDARY_PISTOL05 的原 Damage Shape、混合攻击和重放通过。
  • 实际主场景投射物:13 种定义以及 AXETHROW 的 1 发、WAND PRISMATIC BOLT 的 3 发通过;覆盖换装后命中、存档续跑、混合左右手和碰墙。

这些已有武器场景测试沿用原隔离 HP/等级/装备夹具;不能拿它们证明尚未准入的全部字面 proc 已运行。本批没有新增特效或修改视觉资源;headless 回归不作为图像一致性证据。

代码:core_sim/NativeSkillStrike.cs、core_sim.io/F2SkillStrike.cs;生产接入 WeaponSkill.cs、WeaponMissile.cs;参考与日志在 build/native_skill_strike_*。

godot-master 用于维持定义、核心打击与显示层的分离。本批未使用通用示例伤害公式或添加原版不存在的 i-frame。

状态与继续

main 上工作,未提交。默认 warp_autosave.json SHA256 仍为 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。没有新增跨帧状态,快照版本保持 39;更新的 F2 技能目录仍按实际字节哈希绑定。

继续顺序:CSkillList 执行/事件生命周期与技能内部 RNG → 将已验证目标查询接到实际场景输入 → Stormclaw 原 EVENT/线段命中事务与表现 → 再逐技能补 TYPE201/204 的 affix、Damage Shape 和召唤消费者。准入只在对应真实执行链完备后开放。