[P2][T18] 实现宝石镶嵌:Gems.txt 68 行 × 武器/盾/头盔三套属性 #106

Closed
opened 2026-09-18 10:50:52 +00:00 by troytt · 1 comment
Owner

问题

宝石和符文镶嵌进插槽后给属性,且同一颗宝石在不同基底上给的属性不同。符文之语(T-16)也依赖这张表提供「各符文在该类基底上的属性」。

金标准数据

68 真实行(69 原始行 − 1 行 Expansion)× 41 列。

name | letter | transform | code | nummods |
weaponMod1Code|Param|Min|Max | weaponMod2… | weaponMod3… |
helmMod1…|helmMod2…|helmMod3… |
shieldMod1…|shieldMod2…|shieldMod3…

真实样例:

Chipped Amethyst transform=18 code=gcv nummods=3
                 weaponMod1=att 40/40   helmMod1=str 3/3   shieldMod1=ac 8/8
Flawed Amethyst  transform=18 code=gfv nummods=3
                 weaponMod1=att 60/60   helmMod1=str 4/4   shieldMod1=ac 12/12
Chipped Diamond  transform=1  code=gcw nummods=3
                 weaponMod1=dmg-undead 28/28  helmMod1=att 20/20  shieldMod1=res-all 6/6

68 行 = 7 类宝石 × 5 档 + 33 枚符文 —— 符文的镶嵌属性也在这张表里。

code → Misc.txt 的 code(T-05)。

插槽上限

来自 ItemTypes.txt(T-01)的三段式:

列 适用 ilvl
MaxSock1 1 ~ 24
MaxSock25 25 ~ 39
MaxSock40 40+

实际插槽数 = min(基底.gemsockets, ItemTypes.MaxSockN)。

实现要求

  1. 加载 data\global\excel\Gems.txt,剔除 Expansion 行。
  2. 建 code → GemRow 索引。
  3. 镶嵌时按基底类型选择三套属性之一:
    • weapon 组 → 武器
    • helm 组 → 头盔与身甲
    • shield 组 → 盾牌
  4. 与 T-17 冻结的 socketCount / socketedItems[] 字段对接。
  5. 插槽上限按 ilvl 三段截断。

陷阱

[!CAUTION]
helm 那组属性同时适用于身甲(tors),不只是头盔。这个命名很容易误导 —— 按列名直觉实现会导致身甲镶嵌不生效。

[!WARNING]
符文的镶嵌属性也在 Gems.txt 里(33 枚),不是在 Runes.txt。T-16 要从这里取「各符文在该类基底上的属性」。

[!NOTE]
nummods 是该宝石提供的属性组数,但实际列是固定 3 组 × 3 类。以列内容为准,nummods 只作校验。

验收标准

  • 68 行全部解析(7 × 5 宝石 + 33 符文)
  • 每个 code 都能在 Misc.txt 里找到
  • 三套属性的分派正确:武器 / (头盔 和身甲)/ 盾牌
  • 插槽上限按 ilvl 三段正确截断(ilvl 24 / 25 / 39 / 40 四个边界各一条测试)
  • 所有 *ModNCode 都能在 Properties 里解析到
  • Chipped Amethyst 在剑 / 头盔 / 身甲 / 盾上分别给出 att 40 / str 3 / str 3 / ac 8
  • npm run typecheck 0 error
  • npx vitest run 全绿
  • npx tsx scripts/verify-items.ts 新增断言通过

溯源

金标准(数据) 1.13c MPQ data\global\excel\ 下的 Gems.txt / ItemTypes.txt / Misc.txt(本机 /usr/local/google/home/taodao/d2-data,挂载序 d2data → d2exp → Patch_D2,Patch_D2 优先)
本 issue 结论强度 本机 1.13c 实测确证

[!WARNING]
D2MOO 是 1.10f,不是本项目的金标准。 它只能作线索使用。任何涉及常量、列序、整数截断位置或 RNG 消耗次数的结论,都必须回到 1.13c 的表格或 DLL 复核后再落地。

## 问题 宝石和符文镶嵌进插槽后给属性,且**同一颗宝石在不同基底上给的属性不同**。符文之语(T-16)也依赖这张表提供「各符文在该类基底上的属性」。 ## 金标准数据 **68 真实行**(69 原始行 − 1 行 `Expansion`)× **41 列**。 ``` name | letter | transform | code | nummods | weaponMod1Code|Param|Min|Max | weaponMod2… | weaponMod3… | helmMod1…|helmMod2…|helmMod3… | shieldMod1…|shieldMod2…|shieldMod3… ``` 真实样例: ``` Chipped Amethyst transform=18 code=gcv nummods=3 weaponMod1=att 40/40 helmMod1=str 3/3 shieldMod1=ac 8/8 Flawed Amethyst transform=18 code=gfv nummods=3 weaponMod1=att 60/60 helmMod1=str 4/4 shieldMod1=ac 12/12 Chipped Diamond transform=1 code=gcw nummods=3 weaponMod1=dmg-undead 28/28 helmMod1=att 20/20 shieldMod1=res-all 6/6 ``` **68 行 = 7 类宝石 × 5 档 + 33 枚符文** —— 符文的镶嵌属性也在这张表里。 `code` → `Misc.txt` 的 `code`(T-05)。 ### 插槽上限 来自 `ItemTypes.txt`(T-01)的三段式: | 列 | 适用 ilvl | |---|---| | `MaxSock1` | 1 ~ 24 | | `MaxSock25` | 25 ~ 39 | | `MaxSock40` | 40+ | 实际插槽数 = `min(基底.gemsockets, ItemTypes.MaxSockN)`。 ## 实现要求 1. 加载 `data\global\excel\Gems.txt`,剔除 `Expansion` 行。 2. 建 `code → GemRow` 索引。 3. 镶嵌时按基底类型选择三套属性之一: - **weapon** 组 → 武器 - **helm** 组 → 头盔**与身甲** - **shield** 组 → 盾牌 4. 与 T-17 冻结的 `socketCount` / `socketedItems[]` 字段对接。 5. 插槽上限按 ilvl 三段截断。 ## 陷阱 > [!CAUTION] > **`helm` 那组属性同时适用于身甲(tors)**,不只是头盔。这个命名很容易误导 —— 按列名直觉实现会导致身甲镶嵌不生效。 > [!WARNING] > **符文的镶嵌属性也在 Gems.txt 里**(33 枚),不是在 Runes.txt。T-16 要从这里取「各符文在该类基底上的属性」。 > [!NOTE] > `nummods` 是该宝石提供的属性组数,但实际列是固定 3 组 × 3 类。以列内容为准,`nummods` 只作校验。 ## 验收标准 - [ ] 68 行全部解析(7 × 5 宝石 + 33 符文) - [ ] 每个 `code` 都能在 Misc.txt 里找到 - [ ] 三套属性的分派正确:武器 / (头盔 **和身甲**)/ 盾牌 - [ ] 插槽上限按 ilvl 三段正确截断(ilvl 24 / 25 / 39 / 40 四个边界各一条测试) - [ ] 所有 `*ModNCode` 都能在 Properties 里解析到 - [ ] `Chipped Amethyst` 在剑 / 头盔 / 身甲 / 盾上分别给出 att 40 / str 3 / **str 3** / ac 8 - [ ] `npm run typecheck` 0 error - [ ] `npx vitest run` 全绿 - [ ] `npx tsx scripts/verify-items.ts` 新增断言通过 --- ### 溯源 | | | |---|---| | 金标准(数据) | 1.13c MPQ `data\global\excel\` 下的 `Gems.txt` / `ItemTypes.txt` / `Misc.txt`(本机 `/usr/local/google/home/taodao/d2-data`,挂载序 d2data → d2exp → Patch_D2,**Patch_D2 优先**) | | 本 issue 结论强度 | **本机 1.13c 实测确证** | > [!WARNING] > **D2MOO 是 1.10f,不是本项目的金标准。** 它只能作线索使用。任何涉及常量、列序、整数截断位置或 RNG 消耗次数的结论,都必须回到 1.13c 的表格或 DLL 复核后再落地。
troytt added this to the [M10] 真实物品系统:500 基础物品、1000 词缀、TreasureClassEx 掉落树 milestone 2026-09-18 10:50:52 +00:00
Author
Owner

已完成 Gems.txt 68 行宝石与符文镶嵌解析、武器/防具/盾牌三槽分流,以及 ItemTypes.txt ilvl 1-24/25-39/40+ 最大插槽判定,合并入 main (commit aff1083)。

已完成 Gems.txt 68 行宝石与符文镶嵌解析、武器/防具/盾牌三槽分流,以及 ItemTypes.txt ilvl 1-24/25-39/40+ 最大插槽判定,合并入 main (commit aff1083)。
Sign in to join this conversation.
No Label
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#106
No description provided.