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

范围

主场景新建 ARBITER 不再使用展示夹具的 STR 35 / DEX 40,改用原版玩家 DAT 的 力量 5、敏捷 10、专注 15、体力 10。人物页的四属性和待分配属性点有真实状态, 加减按钮走 CoreSim,关闭/重新打开人物页不会提供免费洗点。

tools/build_player_attributes.py 沿 BASEFILE 继承导出四职业的定义至 vanilla/player_attributes.json;包括四属性、HEALTH_GRAPH、MANA_GRAPH、 STAT_POINTS_PER_LEVEL 和 CURRENT_PLAYER_STAT_PTS。其他职业导出了定义, 不表示主场景已支持更换职业。

1 级初始待分配点为 0。高等级的新建测试角色累加 level 2..当前等级的属性点曲线。 独立 TL2_LEFT_PANELS_PREVIEW.tscn 使用可丢弃的 12 级角色演示按钮;主场景没有额外赠点。

原版证据(只读 IDA)

本批确认 13337 为 E:\Torchlight 2\Torchlight2.exe.i64,没有操作原版进程或修改二进制。

  • 0x799B00:按 ADDSTR/ADDDEX/ADDMAGIC/ADDDEF/SUBSTR/SUBDEX/SUBMAGIC/SUBDEF 绑定八按钮, 订阅 EventMouseButtonUp。
  • 0x799A40 → 0x798070:加点成功后记入人物菜单的本次投入计数;减号只能消耗这个计数。
  • 0x5307C0 / 0x530810 / 0x530860 / 0x5308B0:待分配点 > 0 才加属性,基础属性 +1,点数 -1。
  • 0x530900 / 0x530950 / 0x5309A0 / 0x5309F0:减点还受基础值 > 2 的底线约束。
  • 0x799AE0 → 0x7982C0:菜单打开通知清除四个可撤回计数,重新计算按钮可用性。
  • 0x51B040 / 0x51B0C0 / 0x51B1B0 / 0x51B210:有效属性使用百分比项、平加项分别 ceil。
  • 0x521750 / 0x521950:最大 HP / MANA 先处理基础值及相应百分比和平加,再加截整的 HP_PLAYER_BONUS_VITALITY / MANA_PLAYER_BONUS_FOCUS 曲线值。
  • 0x520C50 / 0x520CE0 → 0x52BD90 / 0x52C170:力量影响武器伤害,元素通道另含专注贡献; 百分比中间量落 float,最后对基础伤害的加成取 ceil。
  • 0x521660 → 0x5246F0:基础物理护甲再乘体力曲线百分比,并不是“每点体力给 1 点基础护甲”。 修正了 Attributes.cs 中此前误导性的说明。

状态边界

  • CombatUnit 保留 STR/DEX 基础字段,新增可缺失的不可变 PlayerAttributesSnapshot, 保存职业、MAGIC/DEFENSE、未用点、基础 HP/MANA。冻结曲线引用不是存档状态。
  • PlayerAttributes 提供初始化、单点变更、权限侧赠点和原版派生计算。
  • CoreSimBridge.Attributes.cs 持有本次开窗的撤回权限与单调递增 token。 旧点击请求、关闭后的请求和读档前的请求均不能重新生效。
  • CharacterReadout 输出基础/有效属性、上限与已支持的派生项;UI 不计算游戏数值。
  • 现有战斗 leaves 使用有效 STR/DEX;原生玩家暴击率来自敏捷曲线,旧合成战斗夹具保留原输入口径。
  • 属性贡献接到现有武器伤害 leaves、最大 HP/MANA、物理护甲和装备准入检查。 变更属性或重新应用装备不会回满血;降低上限时当前 HP 至多钳到新上限。

存档升级为 v8,读取 v3..v7 时不猜旧角色的专注、体力和未用点,不重发点数。 新属性存档还原必须绑定同一套冻结曲线,并验证派生 HP 与保存值一致。 UI 开窗撤回权限不保存;读档时即使面板仍开着,也开始新的编辑会话。

仍未覆盖的内容

  • 击杀经验→升级→自动发属性点的完整流程尚未接通;已有权限侧 GrantPlayerAttributePoints 接口, 不把它暴露为普通玩家按钮。没有为了能点按钮而篡改默认角色点数。
  • 当前实现最大法力,不宣称已完成法力消耗、回复或生命球旁的完整法力战斗循环。
  • 武器伤害当前接属性贡献,完整武器/伤害类型/拥有者过滤的词缀桶仍不是完整实现。 物理护甲支持已表示的平加/百分比及体力;元素护甲的全部体力/百分比链未在本批补完。
  • 装备准入会看新的有效属性;因撤回属性而导致“已穿装备失效”的完整原版重验证链仍待补。
  • 玩家姓名、经验/声望、全量历史统计及完整元素伤害面板仍可能显示

验证

新增 CoreSim 测试覆盖单点扣除、退款限制、原子拒绝、有效属性两次 ceil、派生变化、 非回血、RNG 不推进、装备需求、快照脱离及 v7 未知状态。

tests/test_player_attributes.py 验证源定义,1080P/2K/4K 的实际按钮点击、零点禁用、 重新开窗取消撤回、读档保留结果且失效旧 token,以及默认 F5/F6 对应主场景的加点和切图。 主场景测试只在隔离夹具里显式赠 1 点;所有切图存档均在 user://tests/

GPU 图像在 build/player_attributes_ui/<分辨率>/;默认主场景在 1920x1080/world/default_startup/。已查看投入后、零点/读档后和主场景的实际图像。 按 Godot-master 的专项复核:AFF-FEEDBACK、AFF-TOGGLE、SPACE-ALIGN-GRID、TYPE-STAT-ALIGN 各 2/2(8/8,专项 A,无零项);原版字体/边框保持不变,不作为完整字体或所有 UI 的认证。

运行:

powershell
python -X utf8 tools/build_player_attributes.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_player_attributes -v

结果:CoreSim 309 条断言通过;新属性测试 3 项通过(包含 3 个分辨率子测试), 既有 UI/装备/技能/战斗回归 25 项通过。.NET 构建 0 警告、0 错误。 记录为 build/player_attributes_core.logbuild/player_attributes_ui_tests.logbuild/player_attributes_regression.log。默认 POC 自动存档 SHA256 保持 A91941E4421D9649008A95A592DB32D384378DF4002048D059C901C742747C04。 本批未提交 Git。

来源与使用范围

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