[P1][T06] 加载 MagicPrefix.txt / MagicSuffix.txt(637 + 741 行) #94

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

问题

现在只有 DEMO_AFFIXES 里手写的 2 条词缀。真实魔法词缀有 1378 条(母 issue 估计 ~1000,实际更多)。

金标准数据

表 原始行 真实行 spawnable=1 列数
MagicPrefix.txt 670 637 587 41
MagicSuffix.txt 748 741 575 39
合计 1418 1378 1162

剔除内容:MagicPrefix 有 32 行 Name 为空 + 1 行 Expansion;MagicSuffix 有 6 行 Name 为空 + 1 行 Expansion。

MagicPrefix 列头(41 列)

Name | version | spawnable | rare | level | maxlevel | levelreq | classspecific | class |
classlevelreq | frequency | group | mod1code|mod1param|mod1min|mod1max | mod2… | mod3… |
transform | transformcolor | itype1..itype7 | etype1..etype5 | divide | multiply | add

MagicSuffix 列头(39 列)

同上,但只有 etype1..etype3(少 2 个 etype)。

真实样例:

Sturdy  spawnable=1 rare=1 level=4  levelreq=3  group=101 mod1code=ac%  20/30  itype1=armo
Strong  spawnable=1 rare=1 level=9  levelreq=6  group=101 mod1code=ac%  31/40  itype1=armo
Drake's spawnable=1 rare=1 level=20 levelreq=15 group=118 mod1code=mana 21/30
        transform=1 transformcolor=cblu itype1=rod itype2=ring itype3=amul itype4=belt
Steel   version=100 spawnable=1 level=52 levelreq=44 frequency=4 group=110
        mod1code=att 65/77 itype1=mcha

of Health     spawnable=1 rare=1 level=7  levelreq=5  group=1  mod1code=red-dmg 1/1
              itype1=tors itype2=helm itype3=shld itype4=ring itype5=amul
of Protection spawnable=1 rare=1 level=18 levelreq=13 group=1  mod1code=red-dmg 2/2
of the Ox     spawnable=1 rare=1 level=18 levelreq=13 group=34 mod1code=str 7/10
              itype1=mele itype2=belt itype3=ring itype4=amul  etype1=wand etype2=staf
of Sorcery    version=100 spawnable=1 level=26 levelreq=21 frequency=3 group=23
              mod1code=enr 11/15 transform=1 transformcolor=dgld itype1=helm itype2=scep

关键列语义:

列 用途
spawnable 能否自然生成
rare 能否进稀有词缀池(T-15)
level affix qlvl,要求 alvl >= level
maxlevel 上限(0 = 无上限)
frequency 同段内权重(0 不参与)
group 互斥组 —— 同 group 的前后缀不能共存
mod1-3code → Properties.code(T-02)
mod1-3min / max 数值范围
itype1..7 基底类型白名单(沿 Equiv 链)
etype1..5(后缀 1..3) 基底类型黑名单
classspecific / class / classlevelreq 职业专属
transform / transformcolor 染色
divide / multiply / add 售价计算

实现要求

  1. 加载两张表,剔除 Name 为空的行与 Expansion 行。
  2. 映射到 Affix 结构(结构以 T-17 为准),前后缀分别建池。
  3. mod1-3code 解析成 T-02 的 Property 引用。
  4. itype/etype 解析成 T-01 的 ItemType 引用,匹配时要沿 Equiv 链向上递归。
  5. 保留 group / frequency / level / maxlevel / rare 供 T-15 使用。

陷阱

[!CAUTION]
前缀有 etype1..5,后缀只有 etype1..3。 写通用解析器时不能假设两表列数相同(41 vs 39)。

[!WARNING]
Name 为空的行必须剔除(前��� 32 行、后缀 6 行)。这些是占位行,如果混进候选池会生成无名词缀。

[!NOTE]
MagicPrefix/MagicSuffix 的 Name 直接就是显示文本(Sturdy、of Health),不查 string.tbl。这点和暗金 / 套装 / 符文之语不同。

验收标准

  • 前缀 637 行 / 后缀 741 行全部解析,合计 1378
  • spawnable=1 的分别为 587 / 575,合计 1162
  • 所有 mod1-3code 都能在 Properties 里解析到(悬空数为 0,若非 0 需列出)
  • 所有 itype/etype 都能在 ItemTypes 里解析到
  • 抽样核对:Sturdy(group=101, ac% 20-30, itype=armo) / of the Ox(group=34, str 7-10, etype 含 wand/staf)
  • npm run typecheck 0 error
  • npx vitest run 全绿
  • npx tsx scripts/verify-items.ts 新增断言通过

溯源

金标准(数据) 1.13c MPQ data\global\excel\ 下的 MagicPrefix.txt / MagicSuffix.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 复核后再落地。

## 问题 现在只有 [`DEMO_AFFIXES`](https://git.projectdiablo2.cn/troytt/diablo2-web/src/branch/main/src/game/demo-data.ts) 里手写的 **2 条**词缀。真实魔法词缀有 **1378** 条(母 issue 估计 ~1000,实际更多)。 ## 金标准数据 | 表 | 原始行 | 真实行 | `spawnable=1` | 列数 | |---|---:|---:|---:|---:| | MagicPrefix.txt | 670 | **637** | **587** | 41 | | MagicSuffix.txt | 748 | **741** | **575** | 39 | | **合计** | 1418 | **1378** | **1162** | | 剔除内容:MagicPrefix 有 32 行 Name 为空 + 1 行 `Expansion`;MagicSuffix 有 6 行 Name 为空 + 1 行 `Expansion`。 ### MagicPrefix 列头(41 列) ``` Name | version | spawnable | rare | level | maxlevel | levelreq | classspecific | class | classlevelreq | frequency | group | mod1code|mod1param|mod1min|mod1max | mod2… | mod3… | transform | transformcolor | itype1..itype7 | etype1..etype5 | divide | multiply | add ``` ### MagicSuffix 列头(39 列) 同上,但**只有 `etype1..etype3`**(少 2 个 etype)。 真实样例: ``` Sturdy spawnable=1 rare=1 level=4 levelreq=3 group=101 mod1code=ac% 20/30 itype1=armo Strong spawnable=1 rare=1 level=9 levelreq=6 group=101 mod1code=ac% 31/40 itype1=armo Drake's spawnable=1 rare=1 level=20 levelreq=15 group=118 mod1code=mana 21/30 transform=1 transformcolor=cblu itype1=rod itype2=ring itype3=amul itype4=belt Steel version=100 spawnable=1 level=52 levelreq=44 frequency=4 group=110 mod1code=att 65/77 itype1=mcha of Health spawnable=1 rare=1 level=7 levelreq=5 group=1 mod1code=red-dmg 1/1 itype1=tors itype2=helm itype3=shld itype4=ring itype5=amul of Protection spawnable=1 rare=1 level=18 levelreq=13 group=1 mod1code=red-dmg 2/2 of the Ox spawnable=1 rare=1 level=18 levelreq=13 group=34 mod1code=str 7/10 itype1=mele itype2=belt itype3=ring itype4=amul etype1=wand etype2=staf of Sorcery version=100 spawnable=1 level=26 levelreq=21 frequency=3 group=23 mod1code=enr 11/15 transform=1 transformcolor=dgld itype1=helm itype2=scep ``` 关键列语义: | 列 | 用途 | |---|---| | `spawnable` | 能否自然生成 | | `rare` | 能否进**稀有词缀池**(T-15) | | `level` | affix qlvl,要求 `alvl >= level` | | `maxlevel` | 上限(0 = 无上限) | | `frequency` | **同段内权重**(0 不参与) | | `group` | **互斥组** —— 同 group 的前后缀不能共存 | | `mod1-3code` | → `Properties.code`(T-02) | | `mod1-3min` / `max` | 数值范围 | | `itype1..7` | 基底类型**白名单**(沿 Equiv 链) | | `etype1..5`(后缀 1..3) | 基底类型**黑名单** | | `classspecific` / `class` / `classlevelreq` | 职业专属 | | `transform` / `transformcolor` | 染色 | | `divide` / `multiply` / `add` | 售价计算 | ## 实现要求 1. 加载两张表,剔除 Name 为空的行与 `Expansion` 行。 2. 映射到 `Affix` 结构(结构以 T-17 为准),前后缀分别建池。 3. `mod1-3code` 解析成 T-02 的 Property 引用。 4. `itype`/`etype` 解析成 T-01 的 ItemType 引用,匹配时要**沿 Equiv 链向上递归**。 5. 保留 `group` / `frequency` / `level` / `maxlevel` / `rare` 供 T-15 使用。 ## 陷阱 > [!CAUTION] > **前缀有 `etype1..5`,后缀只有 `etype1..3`。** 写通用解析器时不能假设两表列数相同(41 vs 39)。 > [!WARNING] > **`Name` 为空的行必须剔除**(前��� 32 行、后缀 6 行)。这些是占位行,如果混进候选池会生成无名词缀。 > [!NOTE] > `MagicPrefix`/`MagicSuffix` 的 `Name` **直接就是显示文本**(`Sturdy`、`of Health`),**不查 string.tbl**。这点和暗金 / 套装 / 符文之语不同。 ## 验收标准 - [ ] 前缀 637 行 / 后缀 741 行全部解析,合计 **1378** - [ ] `spawnable=1` 的分别为 **587 / 575**,合计 **1162** - [ ] 所有 `mod1-3code` 都能在 Properties 里解析到(悬空数为 0,若非 0 需列出) - [ ] 所有 `itype`/`etype` 都能在 ItemTypes 里解析到 - [ ] 抽样核对:`Sturdy`(group=101, ac% 20-30, itype=armo) / `of the Ox`(group=34, str 7-10, etype 含 wand/staf) - [ ] `npm run typecheck` 0 error - [ ] `npx vitest run` 全绿 - [ ] `npx tsx scripts/verify-items.ts` 新增断言通过 --- ### 溯源 | | | |---|---| | 金标准(数据) | 1.13c MPQ `data\global\excel\` 下的 `MagicPrefix.txt` / `MagicSuffix.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:46 +00:00
Author
Owner

已完成并通过 1.13c MPQ 真实表验证(1378 条魔法词缀,587/575 spawnable,白名单/黑名单继承链过滤),合并入 main (commit 866cdd4)。

已完成并通过 1.13c MPQ 真实表验证(1378 条魔法词缀,587/575 spawnable,白名单/黑名单继承链过滤),合并入 main (commit 866cdd4)。
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#94
No description provided.