[P1][T04] 加载 Weapons.txt → ItemBase(306 行 × 166 列) #92

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

问题

同 T-03,武器侧。真实武器 306 件。

金标准数据

306 真实行(307 原始行 − 1 行 Expansion)× 166 列。

完整列头:

name | type | type2 | code | alternateGfx | namestr | version | compactsave | rarity | spawnable |
mindam | maxdam | 1or2handed | 2handed | 2handmindam | 2handmaxdam | minmisdam | maxmisdam |
<空列名!> | rangeadder | speed | StrBonus | DexBonus | reqstr | reqdex | durability | nodurability |
level | levelreq | cost | gamble cost | magic lvl | auto prefix | OpenBetaGfx | normcode | ubercode |
ultracode | wclass | 2handedwclass | component | hit class | invwidth | invheight | stackable |
minstack | maxstack | spawnstack | flippyfile | invfile | uniqueinvfile | setinvfile | hasinv |
gemsockets | gemapplytype | special | useable | dropsound | dropsfxframe | usesound | unique |
transparent | transtbl | quivered | lightradius | belt | quest | questdiffcheck | missiletype |
durwarning | qntwarning | gemoffset | bitfield1 | <商人 17 组 × 5 列> | Source Art | Game Art |
Transform | InvTrans | SkipName | NightmareUpgrade | HellUpgrade | Nameable | PermStoreItem

统计:spawnable=1 297/306;rarity 范围 0..5;level 范围 0..86。

相对护甲独有的关键列:

列 用途
mindam / maxdam 单手伤害
2handmindam / 2handmaxdam 双手伤害
1or2handed / 2handed 持握方式
minmisdam / maxmisdam 投掷伤害
speed 攻速
reqdex 敏捷需求
StrBonus / DexBonus 属性加成系数
wclass / 2handedwclass 动画类
stackable / minstack / maxstack / spawnstack 可堆叠(投掷武器)
rangeadder 攻击距离

其余列(code namestr rarity level type normcode ubercode ultracode …)语义同 T-03。

实现要求

  1. 加载 data\global\excel\Weapons.txt,剔除 Expansion 行。
  2. 逐列映射,注意武器独有字段。
  3. 并入 T-03 建立的全局 code → ItemBase 索引。

陷阱

[!CAUTION]
索引 18 的列头是空字符串(夹在 maxmisdam 和 rangeadder 之间)。cell(table, row, '') 会误命中这一列。解析器必须对空列名做特判 —— 要么跳过,要么给它一个合成名。

[!WARNING]
rarity 在本表可以是 0(护甲表里最小是 1)。rarity=0 的物品不进 auto-TC 桶(T-12 只收 rarity > 0),306 个里有 15 个是这种。

[!NOTE]
level 最小可以是 0(护甲最小是 1)。auto-TC 分桶时 qlvl=0 的处理要和 T-12 对齐。

验收标准

  • 306 行全部解析成 ItemBase,0 个失败
  • 与 Armor 合并后 code 仍无重复
  • 空列名不会污染任何字段(写一条专门的回归断言)
  • rarity=0 的 15 件被正确标记为不进 auto-TC
  • 抽样逐列核对:hax(Hand Axe) / crs(Crystal Sword) 的伤害、速度、需求全对
  • npm run typecheck 0 error
  • npx vitest run 全绿
  • npx tsx scripts/verify-items.ts 新增断言通过

溯源

金标准(数据) 1.13c MPQ data\global\excel\ 下的 Weapons.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-03,武器侧。真实武器 **306** 件。 ## 金标准数据 **306 真实行**(307 原始行 − 1 行 `Expansion`)× **166 列**。 完整列头: ``` name | type | type2 | code | alternateGfx | namestr | version | compactsave | rarity | spawnable | mindam | maxdam | 1or2handed | 2handed | 2handmindam | 2handmaxdam | minmisdam | maxmisdam | <空列名!> | rangeadder | speed | StrBonus | DexBonus | reqstr | reqdex | durability | nodurability | level | levelreq | cost | gamble cost | magic lvl | auto prefix | OpenBetaGfx | normcode | ubercode | ultracode | wclass | 2handedwclass | component | hit class | invwidth | invheight | stackable | minstack | maxstack | spawnstack | flippyfile | invfile | uniqueinvfile | setinvfile | hasinv | gemsockets | gemapplytype | special | useable | dropsound | dropsfxframe | usesound | unique | transparent | transtbl | quivered | lightradius | belt | quest | questdiffcheck | missiletype | durwarning | qntwarning | gemoffset | bitfield1 | <商人 17 组 × 5 列> | Source Art | Game Art | Transform | InvTrans | SkipName | NightmareUpgrade | HellUpgrade | Nameable | PermStoreItem ``` 统计:`spawnable=1` **297/306**;`rarity` 范围 **0..5**;`level` 范围 **0..86**。 相对护甲**独有**的关键列: | 列 | 用途 | |---|---| | `mindam` / `maxdam` | 单手伤害 | | `2handmindam` / `2handmaxdam` | 双手伤害 | | `1or2handed` / `2handed` | 持握方式 | | `minmisdam` / `maxmisdam` | 投掷伤害 | | `speed` | 攻速 | | `reqdex` | 敏捷需求 | | `StrBonus` / `DexBonus` | 属性加成系数 | | `wclass` / `2handedwclass` | 动画类 | | `stackable` / `minstack` / `maxstack` / `spawnstack` | 可堆叠(投掷武器) | | `rangeadder` | 攻击距离 | 其余列(`code` `namestr` `rarity` `level` `type` `normcode` `ubercode` `ultracode` …)语义同 T-03。 ## 实现要求 1. 加载 `data\global\excel\Weapons.txt`,剔除 `Expansion` 行。 2. 逐列映射,注意武器独有字段。 3. 并入 T-03 建立的全局 `code → ItemBase` 索引。 ## 陷阱 > [!CAUTION] > **索引 18 的列头是空字符串**(夹在 `maxmisdam` 和 `rangeadder` 之间)。`cell(table, row, '')` 会误命中这一列。解析器必须对空列名做特判 —— 要么跳过,要么给它一个合成名。 > [!WARNING] > `rarity` 在本表可以是 **0**(护甲表里最小是 1)。`rarity=0` 的物品**不进 auto-TC 桶**(T-12 只收 `rarity > 0`),306 个里有 15 个是这种。 > [!NOTE] > `level` 最小可以是 **0**(护甲最小是 1)。auto-TC 分桶时 `qlvl=0` 的处理要和 T-12 对齐。 ## 验收标准 - [ ] 306 行全部解析成 `ItemBase`,0 个失败 - [ ] 与 Armor 合并后 `code` 仍无重复 - [ ] 空列名不会污染任何字段(写一条专门的回归断言) - [ ] `rarity=0` 的 15 件被正确标记为不进 auto-TC - [ ] 抽样逐列核对:`hax`(Hand Axe) / `crs`(Crystal Sword) 的伤害、速度、需求全对 - [ ] `npm run typecheck` 0 error - [ ] `npx vitest run` 全绿 - [ ] `npx tsx scripts/verify-items.ts` 新增断言通过 --- ### 溯源 | | | |---|---| | 金标准(数据) | 1.13c MPQ `data\global\excel\` 下的 `Weapons.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:45 +00:00
Author
Owner

已完成并通过 1.13c MPQ 真实表验证(306 件真实武器,索引 18 空列防护,15 件 rarity=0 标记),合并入 main (commit 98daef5)。

已完成并通过 1.13c MPQ 真实表验证(306 件真实武器,索引 18 空列防护,15 件 rarity=0 标记),合并入 main (commit 98daef5)。
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#92
No description provided.