fix(tooltip/affix): 补全未映射的原始词条代码并对齐官方游戏描述(消除 rep-dur 等未翻译代码) #124

Closed
opened 2026-09-19 07:08:02 +00:00 by troytt · 1 comment
Owner

背景与现状

目前在 src/game/item-tooltip.ts 的 formatPropertyCode 函数中,仅对部分最基础的属性(如 str, dex, hp, mana, res-fire 等)进行了硬编码格式化。对于大量其它合法的暗黑2属性代码,全部回退到 default: 分支:

return `${code}: ${plusVal}${par ? ` (${par})` : ''}`

导致在掉落的暗金、套装及魔法/稀有装备卡片上,暴露出大量游戏引擎底层的属性代号,严重影响游戏原版沉浸感。例如:

  • rep-dur: 0 (5) -> 应该格式化为 Repairs 1 Durability in 5 Seconds(或每5秒回复1点耐久度)
  • rep-quant: 0 (33) -> 应该格式化为 Replenishes Quantity
  • ease: -20 -> 应该格式化为 Requirements -20%
  • ethereal: 1 -> 应该格式化为 Ethereal (Cannot be Repaired)
  • thorns: 14 -> 应该格式化为 Attacker Takes Damage of 14
  • res-pois-len: -75 -> 应该格式化为 Poison Length Reduced by 75%
  • mana-kill: 2 -> 应该格式化为 +2 to Mana After Each Kill
  • no-heal: 1 -> 应该格式化为 Prevent Monster Heal
  • 触发类技能 (cast-skill, hit-skill)、充能量技能 (charged) 等。

暗黑2 1.13c 原版规范 (Ground Truth)

在 Diablo II 1.13c 数据架构中:

  1. Properties.txt(268 行)定义了所有物品词条代码(code)及其映射的目标状态(stat1..stat7)。
  2. ItemStatCost.txt(359 行)通过 descfunc、descval、descstrpos、descstrneg 和 descstr2 明确指定了每个属性在 UI 面板上的标准排版格式。
  3. 例如 rep-dur 映射到 stat item_replenish_durability,其对应的官方字符串定义为 Repairs 1 Durability In %d Seconds(其中参数 %d 为回复间隔秒数)。

待实现功能清单 (TODOs)

  • 依据 Properties.txt 与 ItemStatCost.txt 全面补充 formatPropertyCode 中的属性映射表:
    • 耐久与数量回复:rep-dur (Repairs 1 Durability in X Seconds), rep-quant (Replenishes Quantity)
    • 需求与无形:ease (Requirements X%), ethereal (Ethereal)
    • 伤害反弹与特技:thorns (Attacker Takes Damage of X), no-heal (Prevent Monster Heal), rip (Slain Monsters Rest in Peace)
    • 击杀获得:mana-kill (+X to Mana After Each Kill), hp-kill (+X to Life After Each Kill)
    • 毒素与吸收:res-pois-len (Poison Length Reduced by X%), abs-fire, abs-cold, abs-ltng, abs-mag
    • 触发技能与充能技能:hit-skill, cast-skill, charged
    • 状态效果:howl (Hit Causes Monster to Flee X%), blind (Hit Blinds Target), knock (Knockback)
  • 消除所有暗金、套装及词缀装备在生成属性时的 raw code 打印漏洞。
  • 增加单元测试对各类别生僻属性的格式化输出断言,确保 0 泄露。
## 背景与现状 目前在 `src/game/item-tooltip.ts` 的 `formatPropertyCode` 函数中,仅对部分最基础的属性(如 `str`, `dex`, `hp`, `mana`, `res-fire` 等)进行了硬编码格式化。对于大量其它合法的暗黑2属性代码,全部回退到 `default:` 分支: ```ts return `${code}: ${plusVal}${par ? ` (${par})` : ''}` ``` 导致在掉落的暗金、套装及魔法/稀有装备卡片上,暴露出大量游戏引擎底层的属性代号,严重影响游戏原版沉浸感。例如: - `rep-dur: 0 (5)` -> 应该格式化为 `Repairs 1 Durability in 5 Seconds`(或每5秒回复1点耐久度) - `rep-quant: 0 (33)` -> 应该格式化为 `Replenishes Quantity` - `ease: -20` -> 应该格式化为 `Requirements -20%` - `ethereal: 1` -> 应该格式化为 `Ethereal (Cannot be Repaired)` - `thorns: 14` -> 应该格式化为 `Attacker Takes Damage of 14` - `res-pois-len: -75` -> 应该格式化为 `Poison Length Reduced by 75%` - `mana-kill: 2` -> 应该格式化为 `+2 to Mana After Each Kill` - `no-heal: 1` -> 应该格式化为 `Prevent Monster Heal` - 触发类技能 (`cast-skill`, `hit-skill`)、充能量技能 (`charged`) 等。 ## 暗黑2 1.13c 原版规范 (Ground Truth) 在 Diablo II 1.13c 数据架构中: 1. `Properties.txt`(268 行)定义了所有物品词条代码(`code`)及其映射的目标状态(`stat1..stat7`)。 2. `ItemStatCost.txt`(359 行)通过 `descfunc`、`descval`、`descstrpos`、`descstrneg` 和 `descstr2` 明确指定了每个属性在 UI 面板上的标准排版格式。 3. 例如 `rep-dur` 映射到 stat `item_replenish_durability`,其对应的官方字符串定义为 `Repairs 1 Durability In %d Seconds`(其中参数 %d 为回复间隔秒数)。 ## 待实现功能清单 (TODOs) - [ ] 依据 `Properties.txt` 与 `ItemStatCost.txt` 全面补充 `formatPropertyCode` 中的属性映射表: - 耐久与数量回复:`rep-dur` (Repairs 1 Durability in X Seconds), `rep-quant` (Replenishes Quantity) - 需求与无形:`ease` (Requirements X%), `ethereal` (Ethereal) - 伤害反弹与特技:`thorns` (Attacker Takes Damage of X), `no-heal` (Prevent Monster Heal), `rip` (Slain Monsters Rest in Peace) - 击杀获得:`mana-kill` (+X to Mana After Each Kill), `hp-kill` (+X to Life After Each Kill) - 毒素与吸收:`res-pois-len` (Poison Length Reduced by X%), `abs-fire`, `abs-cold`, `abs-ltng`, `abs-mag` - 触发技能与充能技能:`hit-skill`, `cast-skill`, `charged` - 状态效果:`howl` (Hit Causes Monster to Flee X%), `blind` (Hit Blinds Target), `knock` (Knockback) - [ ] 消除所有暗金、套装及词缀装备在生成属性时的 raw code 打印漏洞。 - [ ] 增加单元测试对各类别生僻属性的格式化输出断言,确保 0 泄露。
Author
Owner

修复完成并验证通过 (Commit 2cf5acb)

  1. 官方 4 层数据源完整溯源与实现 (Properties.txt -> ItemStatCost.txt -> .tbl -> D2Client.dll descFunc 1..28):
    • rep-dur (item_replenish_durability, ID 252, descFunc = 11, ModStre9t / ModStre9u):par 代表每 100 秒回复耐久度点数,按公式 seconds = Math.floor(100 / par) 计算间隔秒数(如 Sandstorm Trek par=5 -> Repairs 1 durability in 20 seconds,Skullder's Ire par=20 -> Repairs 1 durability in 5 seconds,of Self-Repair par=3 -> Repairs 1 durability in 33 seconds)。
  2. 内嵌 1.13c 全量 222 项技能名称与职业限制表 (Skills.txt + SkillDesc.txt + ENG .tbl):
    • 支持数字 ID 与内部技能代号(如 Wearwolf -> Werewolf (Druid Only)、Summon Fenris -> Summon Dire Wolf、Plague Poppy -> Poison Creeper、Eruption -> Fissure、197 -> Firestorm)。
  3. 内嵌 CharStats.txt 21 个技能系 (StrSkillTab1..3 + StrClassOnly) 与 MonStats.txt 复生怪物表 (reanimate)。
  4. 全表 182 个唯一属性代码 100% 覆盖:
    • 新增 tests/item-tooltip-124.test.ts 扫描 UniqueItems.txt、SetItems.txt、Sets.txt、MagicPrefix.txt、MagicSuffix.txt、AutoMagic.txt 共 182 个属性代码,验证 Unmapped = 0,全量 1619 项单测 100% 通过。
### 修复完成并验证通过 (Commit `2cf5acb`) 1. **官方 4 层数据源完整溯源与实现 (`Properties.txt` -> `ItemStatCost.txt` -> `.tbl` -> `D2Client.dll` `descFunc 1..28`)**: - `rep-dur` (`item_replenish_durability`, ID 252, `descFunc = 11`, `ModStre9t` / `ModStre9u`):`par` 代表每 100 秒回复耐久度点数,按公式 `seconds = Math.floor(100 / par)` 计算间隔秒数(如 `Sandstorm Trek` `par=5` -> `Repairs 1 durability in 20 seconds`,`Skullder's Ire` `par=20` -> `Repairs 1 durability in 5 seconds`,`of Self-Repair` `par=3` -> `Repairs 1 durability in 33 seconds`)。 2. **内嵌 1.13c 全量 222 项技能名称与职业限制表 (`Skills.txt` + `SkillDesc.txt` + `ENG .tbl`)**: - 支持数字 ID 与内部技能代号(如 `Wearwolf` -> `Werewolf (Druid Only)`、`Summon Fenris` -> `Summon Dire Wolf`、`Plague Poppy` -> `Poison Creeper`、`Eruption` -> `Fissure`、`197` -> `Firestorm`)。 3. **内嵌 `CharStats.txt` 21 个技能系 (`StrSkillTab1..3` + `StrClassOnly`) 与 `MonStats.txt` 复生怪物表 (`reanimate`)**。 4. **全表 182 个唯一属性代码 100% 覆盖**: - 新增 `tests/item-tooltip-124.test.ts` 扫描 `UniqueItems.txt`、`SetItems.txt`、`Sets.txt`、`MagicPrefix.txt`、`MagicSuffix.txt`、`AutoMagic.txt` 共 182 个属性代码,验证 **Unmapped = 0**,全量 1619 项单测 100% 通过。
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#124
No description provided.