本组文档:计算公式 · 110 项字段表 · IDA 交叉核查 · 移植状态与缺口 · 玩家属性与加点

已接到主场景

VANILLA_ARBITER 的 J 页面改由 CoreSim 的 JournalReadout 提供原版显示投影。 GDScript 只绑定数值、成品文本和缺口说明,不计算伤害/抗性。 正常启动仍是原有等级的新角色;没有为了展示数值修改主场景等级或赠送装备

已接入:

  • 四属性基础/有效/效果/百分比项,暴击、闪避、暴伤、失误及格挡/处决门控;
  • 物理与元素护甲、各类型减伤百分比、伤害加成、控制抗性;
  • 左右手物理/元素/总伤害、攻击间隔、DPS、暴击伤害、武器弧度与溅射;
  • 反射概率与反射量、平均装备等级、恢复读数和移动速度;
  • 原版整数、1 位与 2 位小数格式。攻击间隔 0.7 显示为 0.70 seconds,不是通用去尾零。

普通步枪夹具对 JOURNAL 的 110 个字段可产生 86 项读数(其中 8 项是原版隐藏默认零值), 仍缺 24 项:22 个历史状态读取项,以及难度与周目状态。普通非 Rifle/Cannon 的攻击距离 还需要原生单位缩放/REACH_BONUS 的运行时归属,可能另增加缺口。 “86”是这个夹具下的覆盖,不是任何旧存档都保证相同。

数据与存档

新增或扩展:

  • tools/f2_items.py 导出 DAMAGE_*、DEVIATION_FROM_30FPS、RANGE、WEAPONARC、SECONDARY_DMG_PCT; 默认值对应原版 0x58F0C0。
  • WeaponDamageSnapshot 保存实例的基础 max、ratio、A/B/C 伤害桶、攻击定义输入; WeaponDamageData 保留 min 的截断、逐宝石效果累加和独立的 Tooltip DPS 入口。
  • Loadout.StatEffect 保存可缺失的伤害类型、效果列表身份,以及反射的 DMGPCTMIN/MAX。
  • Item 保存实例等级,平均装备等级不按空格补零。
  • tools/build_journal_data.py 导出已经取证的 110 项显示格式、原版隐藏项、Globals 恢复值、 玩家 RUNNINGSPEED;不在 UI 层硬写这些游戏输入。

存档升级为 v9,继续接受 v3..v8。旧数据缺失的 weapon/bucket/list 元信息保留为未知, 不会在读档时重新生成装备或重新掷词缀。新数组在 Capture/Restore 时脱离复制。 MAXDAMAGE≤0 的不受支持配方不制造 ratio=0;完整武器派生字段保留为未知。

新物品创建时也补正了原生 DAMAGE_PHYSICAL 分配:物理字段不再错误沿用“元素拆分前的整份 base”。 这只影响通过真实物品数据创建的新实例,不去改写用户的旧装备存档。

实施时追加确认的库存缓存边界

本轮补查 IDA 的链路为:

text
7CACF0 查询库存缓存
  -> 7CA370 重建八组映射
     -> 7C77A0 -> 7CB370 -> 7D05A0
        -> item 虚函数 +0x158 -> 7AE240

关键规则:

  1. 人物自身效果管理器与库存管理器分别计算,不能先全局求和再查分桶。 人物 Fire +5、装备 Ice -5,虽然全类型总和为 0,Fire 查询仍然有 +5。
  2. 人物 manager 的缓存为 0 时,筛选查询不扫表;这个早退只属于该 manager,不能扩大到整个人物。
  3. 库存遍历有效的可装备非隐藏槽;物品来源使用 Passive 表,并以已 ceil 的效果值作为输入, 之后再执行时间型换算和 stat modifier。
  4. 库存缓存 d=0..6 分别保存 ceil(rawBucket[d]);d=7 保存 ceil(sum(rawBucket))。 后者不是“把七个已经 ceil 的数再相加”。
  5. 因此同为 2.5:人物自身 flat 效果查询仍可返回 2.5,装备库存路径可返回 3。 两种来源随后走详细页各自的 truncate/ceil,不能共用一个无来源总值。

JournalEffectQuery 对比已有模拟缓存和保留来源,不能证明的桶返回 unknown。 库存/人物相消、分桶小数与 wildcard 的差异有专门反向测试。 补抓的函数体位于 build/research_journal_runtime/

武器显示的几个重要边界

  • 装备 Tooltip DPS、人物详细页 DPS、实战命中仍是不同消费口径。
  • 按手伤害读取实例 A/B/C,人物加成使用类型/All 分桶;各阶段保留对应 float 与 ceil 落点。
  • 保留原生 left/max 的 hand 参数门控不对称,并区分人物基础页 hand=0 的 best 选择。
  • 人物基础页在装备了可完整读取的武器后,伤害/元素伤害也由同一组输入投影。
  • 无武器时按手伤害/DPS 为 0;攻击间隔字段按原版 LABEL_584 返回攻速 multiplier,通常为 1。
  • Rifle/Cannon 的距离、弧度与溅射使用原版特例,不擅自用通用范围公式覆盖。
  • 此次物品工厂仍是 base-only 实例:没有突然宣称完整传奇词缀、附魔或宝石 UI 都已完成。

宝石伤害辅助器已经保存并验证逐效果截断;但是完整宝石 effect manager 还未导入。 如果状态里出现这种仅有伤害快照的宝石,相关人物派生查询会明确保留未知, 不会断言宝石不带其他属性/效果。普通新生成物品的 Gems 为空,因此不影响本批步枪夹具。

只做显示投影,不偷换实战口径

JournalReadout 不推进 RNG,不写 HP、属性点、背包或效果缓存。 读取页面前后快照逐字节相同。UI 的 ceil 不反过来改变战斗内部浮点值。

完整实战结算、双持/装备失效规则、所有效果生命周期和 owner/set-bonus 来源仍不是本批完成项。 例如旧战斗切片的某些属性/防御读口还没有替换为这套完整分桶查询。 不能因为 UI 显示了原版公式,就宣称整个攻击/承伤结果已与原版逐击对拍一致。

历史计数没有从当前金币或近期事件日志拼造;8 个原版隐藏的占位行保持隐藏。 缺失字段显示 ,Tooltip 给出缺口原因。

如何测试

  • 主场景:重启运行后按 J,点击武器图标旁的 + 展开该手数据。
  • TL2_JOURNAL_PREVIEW.tscn:独立 100 级测试角色 + 原版步枪 base-only 实例,可 F6, 不读取或写入用户存档。角色/背包仍可通过 C/I 检查。
  • TL2_LEFT_PANELS_PREVIEW.tscn 默认仍是临时 12 级;它与主场景不是同一个入口。
powershell
python -X utf8 tools/f2_items.py --all
python -X utf8 tools/build_journal_data.py
dotnet build torchlight-2-poc/TL2Poc.csproj --no-restore
dotnet run --project core_sim.tests/CoreSimTests.csproj
python -X utf8 -m unittest tests.test_journal_ui_runtime -v

GPU 测试实际点击加点/折叠,验证换装、卸装、读档、默认 F5/F6 入口和 ACT1 TOWN 交接; 覆盖 1080P、2K、4K。图片位于 build/journal_ui/<分辨率>/。 已查看展开后的 DPS、0.70 秒、元素伤害与其他分组;按 Godot-master 做数据/显示分离与像素复核。 专项 TYPE-STAT-ALIGN、TYPE-NUM-DISTINCT、AFF-FEEDBACK 各 2/2(6/6,无零项);不是完整美术认证。

回归中遇到过一次 Godot.NET 在退出阶段的 0xC0000005 / GodotObject.Finalize,以及测试首次点击 尚未稳定的问题。失败记录保留在 build/journal_source_regression.log; 首次点击现在先等待渲染并核验命中控件,不通过重复加点来掩盖失败。 退出异常没有被忽略或改成通过;最新一轮未复现,但没有宣称已经修复其引擎级根因。

最终状态:347 条 CoreSim 断言通过,最新 10 项 UI/属性/左面板回归通过(含分辨率矩阵); 较早的完整相关回归 35 项通过。日志分别为 build/journal_core.logbuild/journal_source_final.logbuild/journal_regression.log。.NET 构建 0 警告/0 错误, 独立预览 headless 加载通过。2K/4K 为精确 GPU viewport 检查,不包括物理显示器跨屏 DPI 认证。

本批只使用 user://tests/ 切图存档,并核对默认 POC 自动存档没有变化。 原版游戏未 attach,原版 DLL/PAK 和旧 Wiki 未修改;未提交 Git。

来源与使用范围

本页同步自 Torchlight2-Remaster-Project 的 docs/devlog/2026-09-11-journal-runtime-formulas.md。文中的 tools/core_sim/torchlight-2-poc/build/ 路径及复现命令,均属于重制项目,不是 Wiki 仓库目录。原版静态证据、移植进度与尚待验证项分别标明,不把参考算例当成原版运行对拍。