本页补充详细数值页的吸取属性:面板显示的百分比/固定值不是实际一次命中的资源变更。 证据库为 E:/Torchlight 2/Torchlight2.exe.i64;EXE SHA256 为 186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。 以下地址均为该原版 EXE 的绝对虚拟地址;静态证据不是原版动态逐击对拍。
1. 实际命中金额
548850 在护甲与缓冲之后计算整数总伤害,存为 float,记作 D。 这时尚未格挡,不能用最终扣血量或目标剩余 HP 替代 D。 S(t) 是本次手位的自身+库存属性查询,排除另一把武器贡献;并非直接相加 UI 百分比。
P = double(float(0.01))
life = float(S(49) + D × clamp(float(S(30)), -100,100) × P)
masterLife = float(S(125) + D × clamp(float(S(126)), -100,100) × P)
mana = float(S(50) + D × clamp(float(S(31)), -100,100) × P)固定值不受 [-100,100] 限制;百分比与总伤害具有原生 float 存储边界。 masterLife 只有攻击者存在主人指针 +1820 时执行,受益者是主人,不是任意附近友军。 物品被动属性查询含自身的 ceil/类型桶语义,不能把另一把武器移除后随意重新取整。
以下情况跳过全部吸取:
flags & 0x1000。- 总伤害等于 1 且护甲前主分量不等于 1,即原版的保底失误修正。
- 目标
CANMOUSEOVER(+1710)为 false。
自然 1 点伤害不触发第二条;缓冲全部吸收为 0 时,固定吸取仍可非零。 原版执行顺序为:命中反应 → 自身吸血 → 主人吸血 → 吸蓝 → 格挡 → 后续控制/伤害。 因此格挡成功、最终伤害为 0,也可能已经产生吸取。
2. HP 变更
自身吸血只变更攻击者 HP;主人吸血只变更主人 HP,不另扣目标一份“被偷生命”。 正金额与负金额走不同门:
| 条件 | 行为 |
|---|---|
| 正金额、已满血 | 不变 |
| 正金额、已死亡、金额小于最大 HP | 不复活 |
| 正金额、已死亡、金额至少等于最大 HP | 可以进入复活分支 |
| 负金额 | 要求 DAMAGEABLE=true 且当前 HP>0,可以致死 |
| GodMode(虚表 +424) | 允许本次变更时直接写最大 HP |
| INVINCIBLE | 将结果保持至少 1 HP,不等同于禁止扣血 |
普通数值写回为 float(float(currentHP) + delta),上限为最大 HP;正常死亡结果归 0,INVINCIBLE 下限为 1。 两条健康变更还检查本地权威、AI 状态 12/50/51 与 +644 < 10.5、以及 MIMIC 类型的 MIMICIDLE 状态。 完整原版分支还包含复活/死亡回调、动画、统计与网络广播;数值公式不包含这些副作用的完整复现声明。
56D380 核定字段:+1706 = INVINCIBLE(默认 false),+1707 = DAMAGEABLE(默认 true)。 旧结构草稿中的 deathHandledFlag 是 +1706 的临时错误命名,不能据此把 INVINCIBLE 当成已死亡标志。
3. MP 变更:不守恒的独立限幅
54CE64 先调用攻击者 modifyMana(+mana),54D03B 再调用目标 modifyMana(-mana)。 未以目标剩余 MP 限制第一步。例如金额 20,攻击者缺蓝 20,目标只剩 2:攻击者仍可得到 20,目标归 0。 攻击者已满蓝也仍会扣目标蓝量。负吸蓝反过来扣攻击者、给目标补蓝,双方仍独立限幅。
5245D0:
maximum = float(getMaxMana(unit))
if GodMode:
currentMana = maximum
return
value = float(currentMana) + float(delta) // x87 临时量
currentMana = float(value)
if maximum < value: currentMana = maximum
if currentMana < 0: currentMana = 0GodMode 的早返回先于负值下限;不能把它混同为一般 clamp。 这里没有 DAMAGEABLE/存活/目标剩余 MP 的门,也没有额外随机调用。
4. 最大法力与怪物基础法力
字段:+1412/+0x584 = currentMana(float),+1416/+0x588 = baseMana(int),+1420/+0x58C = bonus(float)。
521950:
B = max(1, trunc(baseMana + bonus))
maximum = B
+ trunc(float(ceil(S(19) × B × double(float(.01)))))
+ trunc(ceil(S(4)))
if PLAYER:
maximum += trunc(MANA_PLAYER_BONUS_FOCUS(effectiveFocus))这里的 S 是该单位完整的属性查询,不沿用吸取金额中排除另一手的查询。 普通怪物也有法力池。521A80 为 baseMana = 5 × (level + 4);55CEE0 初始化结束写满当前法力。 CCharacter 虚表 217275C 和 CMonster 虚表 21765A4 的 +652 都指向 521A80。 玩家职业图表覆盖及 Focus 增量与怪物分开处理,不能套一个猜测的 MONSTER_MANA 图表。
5. Godot 接入与未完项
2026-09-13:CoreSim 已接入格挡前吸取事务、法力池、显式资源门、主人 ID 以及 v20 存档;HUD 从 CoreSim 读取 MANA/MAX MANA/MANA %。 旧存档未记录的当前 MP 保持未知;切换到未知来源时清空旧进度,不擅自补满。 748 条核心断言通过;真实主场景起始剑的隔离被动测试观察到 HP 94→124/236、MP 0→20/54、目标 MP 2→0。
该测试被动是显式夹具,不是起始剑原生词缀。538 条直接继承武器 EFFECT 中没有六种吸取类型;完整 [AFFIXES]/宝石源实例化仍在继续。
后续同日补入已验证的被动literal来源和v21状态:PISTOLS/PISTOL_U02C 的 UNIQUE_LIFE_STEAL2 在物品25级时,经原版曲线和库存ceil后每次回17HP;2HSWORD/GREATSWORD_U03C 的 UNIQUE_MANA_STEALXXX 在物品41级时吸取28MP。两件均已走真实生成/拾取/装备/HIT/读档/HUD测试,不再向角色注入49/50夹具。模板冷热缓存、已取值效果和来源身份进入同一存档事务。
这里必须保留原生 ValueCeil(+D8),它是取值中间量的ceil,不一定等于重新ceil已舍入的 Value(+D4)。目前206个含literal词缀的武器定义可经已实现的被动挂载路径生成,其中29个含吸取;完整触发器、TRANSFER、伤害烘焙、随机词缀/宝石仍未齐全。未实现的原生生成明确失败并回滚,不能把它当作可用但少词条的同名装备。 世界侧完整主人关系、特殊 AI 门、复活表现、技能耗蓝/回蓝经济、元素 proc/DOT、反射与原版动态对拍也未因此宣称完成。 病态的负最大蓝量+GodMode 可在原版产生负 currentMana;当前模拟存档禁止负法力池,因此该组合明确拒绝提交。