[Audit & Parity] 物品名称与词条显示未严格遵循 1.13c .tbl 字符串表(覆盖背包、储物箱、地面) #480

Closed
opened 2026-09-26 04:21:24 +00:00 by troytt · 1 comment
Owner

概述 (Overview)

依据项目第一铁律(1.13c 逆向反汇编真值原则 / Ground Truth Invariant),对当前 diablo2-web 中物品名称与属性词条(Affix / Property Descriptions)在**背包(含人物装备栏)、储物箱(Stash)、地面(Ground)**三大场景下的获取与格式化链路进行了全量源码与二进制数据对标检查。

核心审计结论

当前无论在背包、储物箱还是地上,物品名称与属性词条均未严格通过 .tbl(string.tbl / expansionstring.tbl / patchstring.tbl)获取。
虽然仓库中早已实现了完整的 .tbl 二进制哈希表解码器(src/formats/tbl.ts)、多表级联查询链(src/game/item-names.ts)以及 ItemStatCost.txt 的 descfunc / descval / descstrpos / dgrp* 字段解析(src/game/properties.ts:509-558),但 src/game/item-names.ts 在整个 src/ 运行时代码中被引用次数为 0,且 ItemStatCost.txt 的描述控制字段未被 src/game/item-tooltip.ts 使用。


一、 1.13c 原版真值(D2MOO ItemsTbls.cpp)vs 当前实现全量对比

数据维度 1.13c 原版真值机制 (D2Common.dll / D2Client.dll) MPQ .tbl 实测覆盖率 diablo2-web 现状与违规点
1. 底材名称
(Weapons.txt / Armor.txt / Misc.txt)
DATATBLS_LoadItemsTxt (0x6FD55280) 将 namestr 列通过 DATATBLS_GetStringIdFromReferenceString 转为 .tbl 索引 wNameStr。 ENG: Armor 202/202、Weapons 306/306、Misc 143/151
CHI: Classic 底材全覆盖
src/game/drop-pipeline.ts:581 直接使用 .txt 的 base.name;UI 端通过 src/game/tooltip-i18n.ts:19-650 硬编码字典 ITEM_NAMES_ZH 翻译,并在 src/ui/item-bridge.ts:316 拼接成非原版的 "中文 (English)" 双语格式。
2. 暗金 / 套装 / 符文之语名称
(UniqueItems.txt / SetItems.txt / Sets.txt / Runes.txt)
DATATBLS_LoadUniqueItemsTxt (0x6FD584E0)、DATATBLS_LoadSets_SetItemsTxt (0x6FD59140)、DATATBLS_LoadRunesTxt (0x6FD5E020) 均调用 D2LANG_GetTblIndex 查询 index / Name(如 Runeword1..Runeword170)。 ENG: 100% 命中 .tbl 暗金/套装直接取 .txt 的 index 字段并查 tooltip-i18n.ts 静态字典;符文之语直接读 Runes.txt 的 Rune Name 列而不查 Name (Runeword*) 对应的 .tbl 词条。
3. 魔法词缀与亮金名称
(MagicPrefix.txt / MagicSuffix.txt / AutoMagic.txt / RarePrefix.txt / RareSuffix.txt)
DATATBLS_LoadMagicSuffix_Prefix_AutomagicTxt (0x6FD57C20, ItemsTbls.cpp:566) 与 DATATBLS_LoadRareSuffix_PrefixTxt (0x6FD58110, ItemsTbls.cpp:646) 全部调用 D2LANG_GetTblIndex(szName) 查 .tbl。 ENG: MagicPrefix 637/637、MagicSuffix 741/741、RarePrefix 46/46、RareSuffix 155/155 (100%)
CHI: RarePrefix 46/46、RareSuffix 155/155
src/game/item-names.ts:13 与 src/game/affixes.ts:10 存在错误的注释断言(声称词缀不查 .tbl)。导致 RarePrefix.txt / RareSuffix.txt 中的内部键名(如 GhoulRI、PlagueRI、Wraithra、Fiendra、barRI)未查 .tbl(原版 .tbl 中 GhoulRI -> "Ghoul" / "食屍鬼之",barRI -> "Bar" / "酒吧"),掉落亮金装备时直接把内部 Key 当作名字拼出 "GhoulRI barRI"!
4. 劣质 / 超强前缀
(LowQualityItems.txt / QualityItems.txt)
DATATBLS_LoadLowQualityItemsTxt (0x6FD5BDA0, ItemsTbls.cpp:1286) 调用 D2LANG_GetTblIndex;超强物品使用 .tbl 的 Hiquality 词条。 ENG / CHI: 100% src/game/drop-pipeline.ts:484,704,749 硬编码拼接英文字符串 Superior ${base.name} 和 ${lowPrefix} ${base.name}。
5. 宝石与符文名称及镶嵌说明
(Gems.txt)
DATATBLS_LoadGemsTxt (0x6FD5B2F0, ItemsTbls.cpp:1183) 用 3 字符 code 查 .tbl,镶嵌效果通过 weaponMod1..3 / helmMod1..3 / shieldMod1..3 走 ItemStatCost.txt + .tbl 动态生成。 ENG: 68/68 (100%) src/game/gems-data.ts:53-250(由 scripts/generate_gems_data.ts 生成)将 35 种宝石与 33 种符文的名称及武器/防具/头盔/盾牌词条全部写死为静态中英文字符串。
6. 属性词条格式化
(ItemStatCost.txt descfunc / descstrpos / dgrp*)
DATATBLS_LoadItemStatCostTxt (0x6FD5C320, ItemsTbls.cpp:1454-1465) 将 descstrpos / descstrneg / descstr2 及 dgrpstrpos / dgrpstrneg / dgrpstr2 转为 .tbl 字符串 ID,客户端按 descpriority 排序后根据 descfunc (1..28) 和 descval (0..2) 组合 .tbl 文本。 ENG: 205/205 (100%)
CHI: 197/205
src/game/properties.ts:509-558 虽然解析了 descFunc、descVal、descStrPos、dgrp*,但从未传给 .tbl 格式化器!src/game/item-tooltip.ts:430-1150 与 src/game/tooltip-i18n.ts:3138-3680 使用上千行的 switch (code) 硬编码中英文模板字符串,并手工维护 PROP_DESC_PRIORITY / PROP_STAT_ID。
7. 基础面板属性标签
(防御、伤害、耐久、需求、凹槽)
客户端从 .tbl 读取 ItemStats1a..ItemStats1h、Socketable、Stre8a 等标准键名。 ENG / CHI: 100% src/ui/world-panels.ts:1039-1064 与 src/game/item-tooltip.ts:2010-2190 硬编码 "防御: "、"单手伤害: "、"耐久度: X 之 Y"、"需要力量: "、"需要等级: "、"凹槽 (X)"。

二、 三大场景(背包、储物箱、地上)逐项检查结果

1. 背包与人物穿戴栏(Inventory & Equipped Paperdoll)

  • 初始装备与背包物品(src/ui/inventory.ts:524-915、src/game/class-starter-profiles.ts:110-1028,1285-1725):
    • STARTER_EQUIPPED_GEAR、STARTER_BAG_ITEMS、CLASS_EXCLUSIVE_SETS、createStarterBagForClass 中的所有装备完全绕过了 Item 属性管线与 .tbl,直接在对象字面量中手写 nameZh、baseNameZh 和 stats: [{ text, color }]。
    • 词条格式严重偏离原版 .tbl:
      • 手写词条中人为添加了英文缩写后缀,如 "+2 所有技能 (+2 To All Skills)"、"+20% 快速施法速度 (FCR)"、"+30% 快速再度攻击 (FHR)"、"+200% 增强伤害 (ED)"、"+40% 提升攻击速度 (IAS)"、"50% 更佳机会取得魔法装备 (MF)"(原版 .tbl 绝无 (FCR) / (ED) / (MF) 等括号缩写)。
      • 将多条独立属性人为用 / 合并到同一行,如 "+10 力量 / +15 敏捷"、"抗寒 +40% / 抗电 +40% / 抗火 +40%"、"+25 生命 / +20 法力"、"10% 每次命中偷取生命 / 5% 偷取法力"(原版每条属性独立一行,仅当四抗全等时才触发 ItemStatCost.txt 的 dgrp=2 显示 All Resistances +%d / 所有抗性 +%d)。
    • 面板渲染(src/ui/world-panels.ts:1021-1140):WorldPanelsHud.drawItemTooltip 直接读取 item.nameZh、item.baseNameZh、硬编码基础标签("防御: " 等)以及 item.stats 数组绘制,完全不经过 .tbl。
  • 地面拾取进入背包的物品(src/scene/act-scene.ts:3490 -> src/ui/item-bridge.ts:295-470):
    • 拾取时调用 itemToUiInventoryItem(item.item, this.engine.dropTables),内部调用 formatItemTooltip(item, "zh") 与 translateItemName(baseEn),依赖 src/game/tooltip-i18n.ts 的静态字典与 switch(code) 硬编码模板,未查询 .tbl。

2. 储物箱(Stash 6×8 Grid)

  • 储物箱初始物品(src/game/class-starter-profiles.ts:1034-1280):
    • STARTER_STASH_ITEMS 中的符文(Row 0–1)、完美/无瑕宝石(Row 2–3)与暗金/魔法珠宝(Row 4)全部手写 nameZh(如 "乔 (Jah 符文)")、baseNameZh: "符文 (#31)"(原版无此副标题)以及简写 stats(如仅写 武器: 和 防具: 两行,漏掉了 Gems.txt 中独立的头盔/盾牌区分,且无瑕宝石只写了 防具: 一行,完全漏掉武器与盾牌效果!)。
  • 储物箱悬停提示(src/ui/world-panels.ts:624-662,1021-1140):
    • 与背包共用 WorldPanelsHud.drawItemTooltip,同样直接渲染手写 stats 和硬编码基础标签。

3. 地面物品(Ground Items & Alt Labels)

  • 怪物/箱子掉落到地面的物品(src/game/engine.ts:1436-1478 -> src/game/ground-items.ts:181-280 -> src/ui/ground-labels.ts:110-126):
    1. executeDropPipeline 生成的 Item(src/game/drop-pipeline.ts:558-865)只设置了英文 name(直接取自 .txt 的 base.name、uniqueItem.index、magicAffixes.name 或未查 .tbl 的 rareAffixes.name 如 "GhoulRI barRI"),完全没有设置 nameZh。
    2. this.groundItems.add(drop, ...) 调用 resolveGroundItemMetadata(src/game/ground-items.ts:200):const nameZh = typeof s.nameZh === "string" && s.nameZh ? s.nameZh : name。由于 drop.nameZh 为 undefined,所有怪物掉落物品在地面上的 nameZh 实际退化成了未经过 .tbl 解析的 .txt 原始英文名!
    3. 金币掉落(src/game/ground-items.ts:189、src/ui/ground-labels.ts:113)硬编码为 ${amount} 金币,未从 .tbl 查询 Gold 词条。
    4. 地面标签显示逻辑(src/ui/ground-labels.ts:110-126):当前代码直接显示 item.nameZh || item.name(怪物掉落显示原始英文全名,从背包丢到地上的初始装备则显示带英文括号的 "谐角之冠 (Harlequin Crest)")。

三、 整改计划与验收标准 (Remediation Checklist)

  • 1. 构建期 / 运行时 .tbl 字符串表管线打通:
    • 修正 src/game/item-names.ts 与 src/game/affixes.ts 中关于魔法/亮金词缀不查 .tbl 的错误假设,确保底材 namestr、暗金/套装 index、符文之语 Name、魔法词缀 MagicPrefix/Suffix、亮金词缀 RarePrefix/Suffix(含 GhoulRI、barRI 等)、劣质/超强前缀、Gems.txt 键值全部通过 .tbl 解析。
  • 2. 实装 ItemStatCost.txt descfunc (1..28) + dgrp 的 .tbl 词条格式化器:
    • 基于 ItemStatCost.txt 的 descpriority、descfunc、descval、descstrpos、descstrneg、descstr2 及 dgrp* 字段配合 .tbl 词条模板动态格式化属性描述,移除手写 (FCR)/(ED)/(MF) 缩写与非法的 / 多属性合并行。
  • 3. 统一背包、储物箱与地面三处显示管线:
    • 背包初始装备、职业专属套装、储物箱符文/宝石/珠宝及地面掉落物品全部接入统一的 .tbl 名称与词条生成管线,消除三端显示割裂。
## 概述 (Overview) 依据项目第一铁律(**1.13c 逆向反汇编真值原则 / Ground Truth Invariant**),对当前 `diablo2-web` 中物品名称与属性词条(Affix / Property Descriptions)在**背包(含人物装备栏)、储物箱(Stash)、地面(Ground)**三大场景下的获取与格式化链路进行了全量源码与二进制数据对标检查。 ### 核心审计结论 **当前无论在背包、储物箱还是地上,物品名称与属性词条均未严格通过 `.tbl`(`string.tbl` / `expansionstring.tbl` / `patchstring.tbl`)获取。** 虽然仓库中早已实现了完整的 `.tbl` 二进制哈希表解码器(`src/formats/tbl.ts`)、多表级联查询链(`src/game/item-names.ts`)以及 `ItemStatCost.txt` 的 `descfunc` / `descval` / `descstrpos` / `dgrp*` 字段解析(`src/game/properties.ts:509-558`),但 **`src/game/item-names.ts` 在整个 `src/` 运行时代码中被引用次数为 `0`**,且 `ItemStatCost.txt` 的描述控制字段未被 `src/game/item-tooltip.ts` 使用。 --- ## 一、 1.13c 原版真值(D2MOO `ItemsTbls.cpp`)vs 当前实现全量对比 | 数据维度 | 1.13c 原版真值机制 (`D2Common.dll` / `D2Client.dll`) | MPQ `.tbl` 实测覆盖率 | `diablo2-web` 现状与违规点 | | :--- | :--- | :--- | :--- | | **1. 底材名称**<br>(`Weapons.txt` / `Armor.txt` / `Misc.txt`) | `DATATBLS_LoadItemsTxt` (`0x6FD55280`) 将 `namestr` 列通过 `DATATBLS_GetStringIdFromReferenceString` 转为 `.tbl` 索引 `wNameStr`。 | ENG: Armor `202/202`、Weapons `306/306`、Misc `143/151`<br>CHI: Classic 底材全覆盖 | `src/game/drop-pipeline.ts:581` 直接使用 `.txt` 的 `base.name`;UI 端通过 `src/game/tooltip-i18n.ts:19-650` 硬编码字典 `ITEM_NAMES_ZH` 翻译,并在 `src/ui/item-bridge.ts:316` 拼接成非原版的 `"中文 (English)"` 双语格式。 | | **2. 暗金 / 套装 / 符文之语名称**<br>(`UniqueItems.txt` / `SetItems.txt` / `Sets.txt` / `Runes.txt`) | `DATATBLS_LoadUniqueItemsTxt` (`0x6FD584E0`)、`DATATBLS_LoadSets_SetItemsTxt` (`0x6FD59140`)、`DATATBLS_LoadRunesTxt` (`0x6FD5E020`) 均调用 `D2LANG_GetTblIndex` 查询 `index` / `Name`(如 `Runeword1`..`Runeword170`)。 | ENG: `100%` 命中 `.tbl` | 暗金/套装直接取 `.txt` 的 `index` 字段并查 `tooltip-i18n.ts` 静态字典;符文之语直接读 `Runes.txt` 的 `Rune Name` 列而不查 `Name` (`Runeword*`) 对应的 `.tbl` 词条。 | | **3. 魔法词缀与亮金名称**<br>(`MagicPrefix.txt` / `MagicSuffix.txt` / `AutoMagic.txt` / `RarePrefix.txt` / `RareSuffix.txt`) | `DATATBLS_LoadMagicSuffix_Prefix_AutomagicTxt` (`0x6FD57C20`, `ItemsTbls.cpp:566`) 与 `DATATBLS_LoadRareSuffix_PrefixTxt` (`0x6FD58110`, `ItemsTbls.cpp:646`) **全部调用 `D2LANG_GetTblIndex(szName)` 查 `.tbl`**。 | ENG: MagicPrefix `637/637`、MagicSuffix `741/741`、RarePrefix `46/46`、RareSuffix `155/155` (**100%**)<br>CHI: RarePrefix `46/46`、RareSuffix `155/155` | `src/game/item-names.ts:13` 与 `src/game/affixes.ts:10` 存在**错误的注释断言**(声称词缀不查 `.tbl`)。导致 `RarePrefix.txt` / `RareSuffix.txt` 中的内部键名(如 `GhoulRI`、`PlagueRI`、`Wraithra`、`Fiendra`、`barRI`)未查 `.tbl`(原版 `.tbl` 中 `GhoulRI` -> `"Ghoul"` / `"食屍鬼之"`,`barRI` -> `"Bar"` / `"酒吧"`),掉落亮金装备时直接把内部 Key 当作名字拼出 `"GhoulRI barRI"`! | | **4. 劣质 / 超强前缀**<br>(`LowQualityItems.txt` / `QualityItems.txt`) | `DATATBLS_LoadLowQualityItemsTxt` (`0x6FD5BDA0`, `ItemsTbls.cpp:1286`) 调用 `D2LANG_GetTblIndex`;超强物品使用 `.tbl` 的 `Hiquality` 词条。 | ENG / CHI: `100%` | `src/game/drop-pipeline.ts:484,704,749` 硬编码拼接英文字符串 `Superior ${base.name}` 和 `${lowPrefix} ${base.name}`。 | | **5. 宝石与符文名称及镶嵌说明**<br>(`Gems.txt`) | `DATATBLS_LoadGemsTxt` (`0x6FD5B2F0`, `ItemsTbls.cpp:1183`) 用 3 字符 `code` 查 `.tbl`,镶嵌效果通过 `weaponMod1..3` / `helmMod1..3` / `shieldMod1..3` 走 `ItemStatCost.txt` + `.tbl` 动态生成。 | ENG: `68/68` (**100%**) | `src/game/gems-data.ts:53-250`(由 `scripts/generate_gems_data.ts` 生成)将 35 种宝石与 33 种符文的名称及武器/防具/头盔/盾牌词条全部写死为静态中英文字符串。 | | **6. 属性词条格式化**<br>(`ItemStatCost.txt` `descfunc` / `descstrpos` / `dgrp*`) | `DATATBLS_LoadItemStatCostTxt` (`0x6FD5C320`, `ItemsTbls.cpp:1454-1465`) 将 `descstrpos` / `descstrneg` / `descstr2` 及 `dgrpstrpos` / `dgrpstrneg` / `dgrpstr2` 转为 `.tbl` 字符串 ID,客户端按 `descpriority` 排序后根据 `descfunc` (1..28) 和 `descval` (0..2) 组合 `.tbl` 文本。 | ENG: `205/205` (**100%**)<br>CHI: `197/205` | `src/game/properties.ts:509-558` 虽然解析了 `descFunc`、`descVal`、`descStrPos`、`dgrp*`,但从未传给 `.tbl` 格式化器!`src/game/item-tooltip.ts:430-1150` 与 `src/game/tooltip-i18n.ts:3138-3680` 使用上千行的 `switch (code)` 硬编码中英文模板字符串,并手工维护 `PROP_DESC_PRIORITY` / `PROP_STAT_ID`。 | | **7. 基础面板属性标签**<br>(防御、伤害、耐久、需求、凹槽) | 客户端从 `.tbl` 读取 `ItemStats1a`..`ItemStats1h`、`Socketable`、`Stre8a` 等标准键名。 | ENG / CHI: `100%` | `src/ui/world-panels.ts:1039-1064` 与 `src/game/item-tooltip.ts:2010-2190` 硬编码 `"防御: "`、`"单手伤害: "`、`"耐久度: X 之 Y"`、`"需要力量: "`、`"需要等级: "`、`"凹槽 (X)"`。 | --- ## 二、 三大场景(背包、储物箱、地上)逐项检查结果 ### 1. 背包与人物穿戴栏(Inventory & Equipped Paperdoll) - **初始装备与背包物品**(`src/ui/inventory.ts:524-915`、`src/game/class-starter-profiles.ts:110-1028,1285-1725`): - `STARTER_EQUIPPED_GEAR`、`STARTER_BAG_ITEMS`、`CLASS_EXCLUSIVE_SETS`、`createStarterBagForClass` 中的所有装备完全绕过了 `Item` 属性管线与 `.tbl`,直接在对象字面量中手写 `nameZh`、`baseNameZh` 和 `stats: [{ text, color }]`。 - **词条格式严重偏离原版 `.tbl`**: - 手写词条中人为添加了英文缩写后缀,如 `"+2 所有技能 (+2 To All Skills)"`、`"+20% 快速施法速度 (FCR)"`、`"+30% 快速再度攻击 (FHR)"`、`"+200% 增强伤害 (ED)"`、`"+40% 提升攻击速度 (IAS)"`、`"50% 更佳机会取得魔法装备 (MF)"`(原版 `.tbl` 绝无 `(FCR)` / `(ED)` / `(MF)` 等括号缩写)。 - 将多条独立属性人为用 `/` 合并到同一行,如 `"+10 力量 / +15 敏捷"`、`"抗寒 +40% / 抗电 +40% / 抗火 +40%"`、`"+25 生命 / +20 法力"`、`"10% 每次命中偷取生命 / 5% 偷取法力"`(原版每条属性独立一行,仅当四抗全等时才触发 `ItemStatCost.txt` 的 `dgrp=2` 显示 `All Resistances +%d` / `所有抗性 +%d`)。 - **面板渲染**(`src/ui/world-panels.ts:1021-1140`):`WorldPanelsHud.drawItemTooltip` 直接读取 `item.nameZh`、`item.baseNameZh`、硬编码基础标签(`"防御: "` 等)以及 `item.stats` 数组绘制,完全不经过 `.tbl`。 - **地面拾取进入背包的物品**(`src/scene/act-scene.ts:3490` -> `src/ui/item-bridge.ts:295-470`): - 拾取时调用 `itemToUiInventoryItem(item.item, this.engine.dropTables)`,内部调用 `formatItemTooltip(item, "zh")` 与 `translateItemName(baseEn)`,依赖 `src/game/tooltip-i18n.ts` 的静态字典与 `switch(code)` 硬编码模板,未查询 `.tbl`。 ### 2. 储物箱(Stash 6×8 Grid) - **储物箱初始物品**(`src/game/class-starter-profiles.ts:1034-1280`): - `STARTER_STASH_ITEMS` 中的符文(Row 0–1)、完美/无瑕宝石(Row 2–3)与暗金/魔法珠宝(Row 4)全部手写 `nameZh`(如 `"乔 (Jah 符文)"`)、`baseNameZh: "符文 (#31)"`(原版无此副标题)以及简写 `stats`(如仅写 `武器:` 和 `防具:` 两行,漏掉了 `Gems.txt` 中独立的头盔/盾牌区分,且无瑕宝石只写了 `防具:` 一行,完全漏掉武器与盾牌效果!)。 - **储物箱悬停提示**(`src/ui/world-panels.ts:624-662,1021-1140`): - 与背包共用 `WorldPanelsHud.drawItemTooltip`,同样直接渲染手写 `stats` 和硬编码基础标签。 ### 3. 地面物品(Ground Items & `Alt` Labels) - **怪物/箱子掉落到地面的物品**(`src/game/engine.ts:1436-1478` -> `src/game/ground-items.ts:181-280` -> `src/ui/ground-labels.ts:110-126`): 1. `executeDropPipeline` 生成的 `Item`(`src/game/drop-pipeline.ts:558-865`)只设置了英文 `name`(直接取自 `.txt` 的 `base.name`、`uniqueItem.index`、`magicAffixes.name` 或未查 `.tbl` 的 `rareAffixes.name` 如 `"GhoulRI barRI"`),**完全没有设置 `nameZh`**。 2. `this.groundItems.add(drop, ...)` 调用 `resolveGroundItemMetadata`(`src/game/ground-items.ts:200`):`const nameZh = typeof s.nameZh === "string" && s.nameZh ? s.nameZh : name`。由于 `drop.nameZh` 为 `undefined`,**所有怪物掉落物品在地面上的 `nameZh` 实际退化成了未经过 `.tbl` 解析的 `.txt` 原始英文名**! 3. 金币掉落(`src/game/ground-items.ts:189`、`src/ui/ground-labels.ts:113`)硬编码为 `${amount} 金币`,未从 `.tbl` 查询 `Gold` 词条。 4. 地面标签显示逻辑(`src/ui/ground-labels.ts:110-126`):当前代码直接显示 `item.nameZh || item.name`(怪物掉落显示原始英文全名,从背包丢到地上的初始装备则显示带英文括号的 `"谐角之冠 (Harlequin Crest)"`)。 --- ## 三、 整改计划与验收标准 (Remediation Checklist) - [ ] **1. 构建期 / 运行时 `.tbl` 字符串表管线打通**: - 修正 `src/game/item-names.ts` 与 `src/game/affixes.ts` 中关于魔法/亮金词缀不查 `.tbl` 的错误假设,确保底材 `namestr`、暗金/套装 `index`、符文之语 `Name`、魔法词缀 `MagicPrefix/Suffix`、亮金词缀 `RarePrefix/Suffix`(含 `GhoulRI`、`barRI` 等)、劣质/超强前缀、`Gems.txt` 键值全部通过 `.tbl` 解析。 - [ ] **2. 实装 `ItemStatCost.txt` `descfunc` (1..28) + `dgrp` 的 `.tbl` 词条格式化器**: - 基于 `ItemStatCost.txt` 的 `descpriority`、`descfunc`、`descval`、`descstrpos`、`descstrneg`、`descstr2` 及 `dgrp*` 字段配合 `.tbl` 词条模板动态格式化属性描述,移除手写 `(FCR)`/`(ED)`/`(MF)` 缩写与非法的 `/` 多属性合并行。 - [ ] **3. 统一背包、储物箱与地面三处显示管线**: - 背包初始装备、职业专属套装、储物箱符文/宝石/珠宝及地面掉落物品全部接入统一的 `.tbl` 名称与词条生成管线,消除三端显示割裂。
Author
Owner

已在 commit b7ccc44 修复并推送到 main:

  1. 新增 scripts/pack-canonical-tbl.ts 从 1.13c MPQ (d2data.mpq, d2exp.mpq, Patch_D2.mpq) 提取生成 src/data/canonical-tbl-strings.ts(2,661 条 ENG .tbl、1,386 条 CHI .tbl 及 207 条 ItemStatCost.txt descfunc/descval/dgrp 规则表)。
  2. 补齐 src/game/item-names.ts、src/game/tooltip-i18n.ts 与 src/game/item-tooltip.ts 的 .tbl 权威解析与 formatStatByIscDescFunc(1..28) 词条格式化引擎。
  3. 地面掉落 (src/game/drop-pipeline.ts, src/game/ground-items.ts, src/ui/ground-labels.ts)、背包与装备栏 (src/ui/inventory.ts, src/game/class-starter-profiles.ts)、储物箱 (STARTER_STASH_ITEMS 24 颗符文/宝石四部位标准 .tbl 描述及亮金珠宝双词根名称) 全部严格对齐 1.13c .tbl。
  4. 新增单元测试 tests/issue-480-tbl-item-parity.test.ts (10/10 通过),以及经验验证脚本 120/120 检查项全部通过。
已在 commit `b7ccc44` 修复并推送到 `main`: 1. 新增 `scripts/pack-canonical-tbl.ts` 从 1.13c MPQ (`d2data.mpq`, `d2exp.mpq`, `Patch_D2.mpq`) 提取生成 `src/data/canonical-tbl-strings.ts`(2,661 条 ENG `.tbl`、1,386 条 CHI `.tbl` 及 207 条 `ItemStatCost.txt` `descfunc`/`descval`/`dgrp` 规则表)。 2. 补齐 `src/game/item-names.ts`、`src/game/tooltip-i18n.ts` 与 `src/game/item-tooltip.ts` 的 `.tbl` 权威解析与 `formatStatByIscDescFunc(1..28)` 词条格式化引擎。 3. 地面掉落 (`src/game/drop-pipeline.ts`, `src/game/ground-items.ts`, `src/ui/ground-labels.ts`)、背包与装备栏 (`src/ui/inventory.ts`, `src/game/class-starter-profiles.ts`)、储物箱 (`STARTER_STASH_ITEMS` 24 颗符文/宝石四部位标准 `.tbl` 描述及亮金珠宝双词根名称) 全部严格对齐 1.13c `.tbl`。 4. 新增单元测试 `tests/issue-480-tbl-item-parity.test.ts` (10/10 通过),以及经验验证脚本 120/120 检查项全部通过。
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#480
No description provided.