[P1][T10] 加载 SetItems.txt + Sets.txt(127 + 32 行) #98

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

问题

套装是品质判定(T-14)判到 set(5) 的落点。套装还有「穿几件给几件的加成」这一层,比暗金复杂。

金标准数据

SetItems.txt —— 127 真实行(128 − 1 行 Expansion)× 94 列

index | set | item | *item | rarity | lvl | lvl req | chrtransform | invtransform | invfile |
flippyfile | dropsound | dropsfxframe | usesound | cost mult | cost add | add func |
prop1..prop9 各带 par/min/max(36 列)|
aprop1a/1b … aprop5a/5b 各带 apar/amin/amax(40 列)| *eol
Civerb's Ward  set=Civerb's Vestments item=lrg *item=Large Shield rarity=7 lvl=13 lvl req=9
               add func=1 prop1=ac 15/15 prop2=block 15/15
               aprop1a=mana 21/22 aprop2a=res-pois 25/26
Civerb's Icon  set=Civerb's Vestments item=amu *item=Amulet rarity=7 lvl=13 lvl req=9
               add func=2 prop1=regen-mana 40/40 prop2=regen 4/4
               aprop1a=res-cold 25/25 aprop2a=ac 25/25
Angelic Sickle set=Angelical Raiment item=sbr *item=Sabre rarity=7 lvl=17 lvl req=12
               add func=2 prop1=att 75/75 prop2=dmg-undead 250/250
               aprop1a=dmg% 75/75 aprop2a=swing3 30/30
列 用途
index 主键,string.tbl key(T-20)
set → Sets.index
item 基础物品码
propN 单件固定属性
apropNa / apropNb 穿戴第 N+1 件时追加的绿字属性
add func 1 / 2,决定 aprop 的生效分支

Sets.txt —— 32 真实行(33 − 1 行 Expansion)× 69 列

index | name | version | level |
PCode2a/2b/3a/3b/4a/4b/5a/5b 各带 PParam/PMin/PMax(部分套装奖励)|
FCode1..FCode8 各带 FParam/FMin/FMax(全套奖励)| *eol
Civerb's Vestments level=13 PCode2a=res-fire 15/15
                   FCode1=str 15/15 FCode2=dmg-undead 200/200 FCode3=res-ltng 25/25
Hsarus' Defense    level=4  PCode2a=thorns 5/5
                   FCode1=dmg-max 5/5 FCode2=nofreeze 1/1 FCode3=res-ltng 25/25
Griswold's Legacy  version=100 level=44 PCode2a=str 20/20 PCode3a=dex 30/30
                   FCode1=res-all 50/50 FCode2=pal 3/3 FCode3=att 200/200 FCode4=hp 150/150
                   FCode5=state param=fullsetgeneric 1/1 FCode6=balance2 30/30

Sets 的 tbl key 是 name 列(不是 index)。

实现要求

  1. 加载两张表,各剔除 1 行 Expansion。
  2. SetItems.set → Sets.index 建立关联,SetItems.item → 全局物品码表。
  3. 实现三层属性叠加:
    • 单件:propN
    • 部分套装(穿 N 件):SetItems.apropNa/b + Sets.PCodeNa/b
    • 全套:Sets.FCode1-8
  4. add func 的两个分支要分别实现。
  5. 保留 SetItems.index 与 Sets.name 供 T-20 查 tbl。

陷阱

[!CAUTION]
SetItems 的 tbl key 是 index,Sets 的 tbl key 是 name —— 两张表不一致,别写反。

[!WARNING]
apropNa 与 apropNb 是两组并列的属性(a/b 后缀),不是主备关系。add func 决定用哪一套。这块语义建议配合实际游戏行为验证。

[!NOTE]
.d2s 给 set item id 留 12 bit,127 行安全。

验收标准

  • SetItems 127 行 / Sets 32 行全部解析
  • 每个 SetItems.set 都能在 Sets.index 里找到(悬空为 0)
  • 每个 SetItems.item 都能在全局物品码表里找到
  • 所有 propN / apropN* / PCode* / FCode* 都能在 Properties 里解析到
  • 三层叠加逻辑有单测:穿 1 件 / 穿部分 / 穿全套的属性分别正确
  • npm run typecheck 0 error
  • npx vitest run 全绿
  • npx tsx scripts/verify-items.ts 新增断言通过

溯源

金标准(数据) 1.13c MPQ data\global\excel\ 下的 SetItems.txt / Sets.txt(本机 /usr/local/google/home/taodao/d2-data,挂载序 d2data → d2exp → Patch_D2,Patch_D2 优先)
本 issue 结论强度 本机 1.13c 实测确证(add func 的 a/b 分支语义建议额外实测)

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

## 问题 套装是品质判定(T-14)判到 `set(5)` 的落点。套装还有「穿几件给几件的加成」这一层,比暗金复杂。 ## 金标准数据 ### SetItems.txt —— 127 真实行(128 − 1 行 `Expansion`)× 94 列 ``` index | set | item | *item | rarity | lvl | lvl req | chrtransform | invtransform | invfile | flippyfile | dropsound | dropsfxframe | usesound | cost mult | cost add | add func | prop1..prop9 各带 par/min/max(36 列)| aprop1a/1b … aprop5a/5b 各带 apar/amin/amax(40 列)| *eol ``` ``` Civerb's Ward set=Civerb's Vestments item=lrg *item=Large Shield rarity=7 lvl=13 lvl req=9 add func=1 prop1=ac 15/15 prop2=block 15/15 aprop1a=mana 21/22 aprop2a=res-pois 25/26 Civerb's Icon set=Civerb's Vestments item=amu *item=Amulet rarity=7 lvl=13 lvl req=9 add func=2 prop1=regen-mana 40/40 prop2=regen 4/4 aprop1a=res-cold 25/25 aprop2a=ac 25/25 Angelic Sickle set=Angelical Raiment item=sbr *item=Sabre rarity=7 lvl=17 lvl req=12 add func=2 prop1=att 75/75 prop2=dmg-undead 250/250 aprop1a=dmg% 75/75 aprop2a=swing3 30/30 ``` | 列 | 用途 | |---|---| | `index` | 主键,**string.tbl key**(T-20) | | `set` | → `Sets.index` | | `item` | 基础物品码 | | `propN` | **单件固定属性** | | `apropNa` / `apropNb` | **穿戴第 N+1 件时追加的绿字属性** | | `add func` | 1 / 2,决定 aprop 的生效分支 | ### Sets.txt —— 32 真实行(33 − 1 行 `Expansion`)× 69 列 ``` index | name | version | level | PCode2a/2b/3a/3b/4a/4b/5a/5b 各带 PParam/PMin/PMax(部分套装奖励)| FCode1..FCode8 各带 FParam/FMin/FMax(全套奖励)| *eol ``` ``` Civerb's Vestments level=13 PCode2a=res-fire 15/15 FCode1=str 15/15 FCode2=dmg-undead 200/200 FCode3=res-ltng 25/25 Hsarus' Defense level=4 PCode2a=thorns 5/5 FCode1=dmg-max 5/5 FCode2=nofreeze 1/1 FCode3=res-ltng 25/25 Griswold's Legacy version=100 level=44 PCode2a=str 20/20 PCode3a=dex 30/30 FCode1=res-all 50/50 FCode2=pal 3/3 FCode3=att 200/200 FCode4=hp 150/150 FCode5=state param=fullsetgeneric 1/1 FCode6=balance2 30/30 ``` `Sets` 的 tbl key 是 **`name` 列**(不是 `index`)。 ## 实现要求 1. 加载两张表,各剔除 1 行 `Expansion`。 2. `SetItems.set` → `Sets.index` 建立关联,`SetItems.item` → 全局物品码表。 3. 实现三层属性叠加: - **单件**:`propN` - **部分套装**(穿 N 件):`SetItems.apropNa/b` + `Sets.PCodeNa/b` - **全套**:`Sets.FCode1-8` 4. `add func` 的两个分支要分别实现。 5. 保留 `SetItems.index` 与 `Sets.name` 供 T-20 查 tbl。 ## 陷阱 > [!CAUTION] > **`SetItems` 的 tbl key 是 `index`,`Sets` 的 tbl key 是 `name`** —— 两张表不一致,别写反。 > [!WARNING] > `apropNa` 与 `apropNb` 是**两组并列**的属性(a/b 后缀),不是主备关系。`add func` 决定用哪一套。这块语义建议配合实际游戏行为验证。 > [!NOTE] > `.d2s` 给 set item id 留 **12 bit**,127 行安全。 ## 验收标准 - [ ] SetItems 127 行 / Sets 32 行全部解析 - [ ] 每个 `SetItems.set` 都能在 `Sets.index` 里找到(悬空为 0) - [ ] 每个 `SetItems.item` 都能在全局物品码表里找到 - [ ] 所有 `propN` / `apropN*` / `PCode*` / `FCode*` 都能在 Properties 里解析到 - [ ] 三层叠加逻辑有单测:穿 1 件 / 穿部分 / 穿全套的属性分别正确 - [ ] `npm run typecheck` 0 error - [ ] `npx vitest run` 全绿 - [ ] `npx tsx scripts/verify-items.ts` 新增断言通过 --- ### 溯源 | | | |---|---| | 金标准(数据) | 1.13c MPQ `data\global\excel\` 下的 `SetItems.txt` / `Sets.txt`(本机 `/usr/local/google/home/taodao/d2-data`,挂载序 d2data → d2exp → Patch_D2,**Patch_D2 优先**) | | 本 issue 结论强度 | **本机 1.13c 实测确证**(`add func` 的 a/b 分支语义建议额外实测) | > [!WARNING] > **D2MOO 是 1.10f,不是本项目的金标准。** 它只能作线索使用。任何涉及常量、列序、整数截断位置或 RNG 消耗次数的结论,都必须回到 1.13c 的表格或 DLL 复核后再落地。
troytt added this to the [M10] 真实物品系统:500 基础物品、1000 词缀、TreasureClassEx 掉落树 milestone 2026-09-18 10:50:48 +00:00
Author
Owner

已完成并通过 1.13c MPQ 真实表验证(127 件套装单件 / 32 套装总表,0 悬空,三层加成运算与 addFunc 分支),合并入 main (commit 73ed329)。

已完成并通过 1.13c MPQ 真实表验证(127 件套装单件 / 32 套装总表,0 悬空,三层加成运算与 addFunc 分支),合并入 main (commit 73ed329)。
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#98
No description provided.