击杀回复 proc:原版公式与运行时边界

证据来源:E:/Torchlight 2/Torchlight2.exe.i64,EXE SHA256 为 186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。本批只读 IDA 证据位于迁移项目 build/research_weapon_families/,没有 attach 原版游戏或改 IDB。

回复不是立即设满血

原版 MEDIA/SKILLS/ARBITER/WANDCHAOS/WC_PROCFULLHEAL.DAT: LEVEL1/EVENT_START/EFFECTS TARGET SELF,HP RECHARGE PLAYER(124),DYNAMIC,DURATION=1,MIN=MAX=100,NOGRAPH=true,STATMODIFYNAME=Max HP,STATMODIFYPERCENT=100,EXCLUSIVE=true,UNITTHEME=health_potion。技能 COOLDOWNMS=1000,CAN_BE_SILENCED=false。

设施放时最大 HP 为 H,单个效果未封顶时的计算为:

text
modifier = H × f32(100 × f32(0.01))
rawValue = f32(100 × modifier)             // 100H,不是 H
cacheContribution = f32(rawValue × f32(0.016))
elapsed = f32(elapsed + dt)
若 elapsed >= 1:先移除效果,本次不再贡献回复
否则 deltaHP = f32(cacheContribution × dt)
HP = modifyHealth 门禁处理后的 clamp(HP + deltaHP)

7A6530/7A7030 处理属性修正;7AFE00 对有限时长的 6/7/123/124 乘 0.016f,并在缓存累加前落到 float;53C2F0 后面还乘实际 dt。 因此在仍存活、未触及 HP 上限的区间,回复速率约为每秒 1.6H;不是瞬间满血,也不是每秒 100H。过期不按剩余小数时间补最后一跳,不能擅自改成连续积分。

需结合 ASM 栈平衡确定时间实参:56B143 fld [esp+0xA4]56A420 的第三个栈参数 dt,不能直接采用 Hex-Rays 推出来的多余第四参数签名。

53C2F0 跳过 native state 5/6。53BC80 还包含:suppressed、负变化需要 damageable、非正 HP 的小额正回复不能复活、GodMode 满血、Invincible 最低 1、HP 上限,以及原版特殊状态/年龄/mimic 门。本批生产接线仅为存活玩家的正回复;完整状态映射、自然回血/回蓝、所有 DoT 与宠物恢复并未一并完成。

CHARGES、等级与冷却

  • 6C2690 读取 CHARGES 写入技能 +288/+0x120,默认 −1。514AB0 将截断的 slot1(0 改为 −1)覆盖到此字段。旧笔记的 slot1 override 现已确认是 CHARGES
  • 等级 +204 由 6C0C80 按实际 LEVEL 数量钳制;effective level +208 与 charges 不同。Fullheal 只有 LEVEL1。
  • 6D3B80 成功施法后读同名实例列表的第一项 charges;若大于 0,就将减一后的数写给全部同名实例。
  • 直接 proc 的 6D6FA0/6D6CD0 不走手动 canUse 的 6BFA80 零 charges 门,不能自行加入零次数拒绝 proc 的规则。
  • 6DC320 正常创建的 CSkillProperty 默认 RANGE=100、TARGETRANGE=100、RANGEMIN=0、CHANCE=100、CANPROC=true、EXCLUSIVE=false。6BE3C0 返回 1 的分支是 levelData 缺失,不是正常加载默认值。
  • COOLDOWNMS × 0.001 → float 秒,低于 0.01 秒置 0;MONSTERCOOLDOWNMS 先继承,否则默认普通冷却。6DBD70 按实际 caster 选用。
  • 6C1C30 减 dt 时保留负的冷却越界值;6D7370 按活动状态/冷却决定退出管理器活动列表。
  • 装备管理器在概率判定前复制 volatile seed;概率或冷却失败也保留这次复制,复制本身不推进 RNG。

本批运行时与可用范围

只开放 TYPE203 → WC_PROC_FULLHEAL 的固定值、SELF/EVENT_START 回复程序。混有其他未完成 proc 的武器仍整件拒绝;TYPE81、FROM TARGET、攻击/召唤 proc 不会自动获得实现。

全量实际构造:1419 个源定义,1050 可构造,其中 14 个成长;322 个 host/NG+ 待补,47 个缺基础创建等级。“可构造”不等于全部战斗行为完整,也不代表全部定义能自然掉落。

新增 8 个定义:

定义入口
2HMACE/GREATHAMMER_U03字面击杀回血
2HMACE/LEGENDARY_GREATHAMMER02字面击杀回血
BOWS/BOW_U07C字面击杀回血
FISTS/LEGENDARY_FIST03字面击杀回血
CROSSBOWS/CROSSBOW_U03成长奖励
PISTOLS/PISTOL_U04成长奖励
RIFLES/RIFLE_U03成长奖励
SWORDS/ZZZ_TESTSWORD_AUGMENT_MANY原版测试定义的成长奖励,不当作普通掉落

死亡事务先写成长奖励,再扫描击杀 proc。实际测试确认 ITEM_SLAYER_TUTARAN_100 的 watcher 是 GREATER THAN 49,50 杀,不是文件名暗示的 100 杀;第 50 次击杀能施放刚解锁的回复 proc。

v26 保存装备技能实例、charges、cooldown、manager seed、角色回复实例与已过时间/ID。恢复不会重新抽词缀或立即再回血。 修复了回复重算删掉“已知零值属性”导致下一次攻击报缺少 stat226 的回归,并修复无关 EffectSource 刷新漏算持续回复。proc-only 装备使用持久身份印记,防止等值装备继承别人的攻击周期。

原版主题与验证

HEALTH_POTION.DAT 为 COUNT=1、UNITTYPE=ANY、FOLLOWS=true、ATTACHES=false;现有转换器导出 HealthPotion.layout 的 5 个 Additive technique,保留 source SHA256。 Godot 资源预载、按回复 ID 去重,仅跟随位置、不继承骨骼旋转;结束停止发射,按粒子实际生命周期清理。特效不改变 HP、冷却或游戏随机流。

  • build/proc_recovery_core.log:1018 条核心断言通过,含失败概率的种子复制、冷却内再次击杀、成长同杀解锁与 v26 重放。
  • 33 项既有相关 Python 回归 + 4 项新来源检查通过;Godot C# 零警告/零错误;coresimlint 通过。
  • build/recovery_proc_world/result.json:真实 ECHO PASS 怪物、原版双手锤、authored HIT、原版 proc 概率,隔离 fixture seed=43。
  • 主场景 HP=100、MaxHP=236;触发时仍为 100,推进 0.1 秒变为 137.760009765625,随后封顶、过期和冷却重放通过。
  • 原有冠军斧的主场景10杀成长/奖励/读档重放也再次通过,见 build/growth_world/result.json
  • 首次试跑因两个新增 PNG 未导入报错;执行 Godot import 后重复世界验收无错误。构建入口:python -m tools.build_recovery_visuals
  • 已检查 512 短边 WebP:proc_start、proc_recovering、proc_expired。局部橙红光效无屏幕级黑色矩形、不遮 HUD;雨幕/帐篷使人物局部仍难辨,不声明原版像素与运动完全等价。
  • 新效果视觉评分:LIGHT-PART-OVER=2/2、LIGHT-PART-OCCLUDE=2/2、LIGHT-PART-READ=1/2(场景遮挡);不是整幅地图视觉验收。
  • 未改默认存档,SHA256 仍为 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f;未声称历史地图测试全绿。

明确的剩余边界

当前 NativeProcSkills.Running 仅代表 effect-only 程序的管理器活动成员,完整动画/事件施法生命周期、克隆复用仍待扩展。 运行实例 GUID + 零 seed 的原版 fallback 尚未模拟;本次固定值/事件 CHANCE100 程序不使用技能内部随机,因此 EffectRng 留空,不伪造已验证种子。 空间门仅对 RANGEMIN=0 且中心距≤100 的已证明区间放行;区间外需要真实源物品与目标半径,仍返回 pending。 其他随机效果、受击 proc、FROM TARGET、召唤、完整自然 HP/MP 回复、native state/年龄/mimic 与怪物/宠物恢复继续待补。全武器目标未完成。