[Parity][units][S2] getMonsterKindByHcIdx 在 hcIdx >= 410 时因 Expansion 分隔行导致整体错位一行(共 314 处不一致) #713

Closed
opened 2026-10-03 00:46:29 +00:00 by troytt · 0 comments
Owner

问题描述

src/common/units/monsters-data.ts 中的 getMonsterKindByHcIdx(hcIdx, difficulty)(L2152)在构建 cachedMonsterKindsByHcIdx 数组时,直接按 readMonsterKinds(parseTable(RAW_MONSTATS)) 的顺序遍历推入数组并按 arr[hcIdx] 索引。

然而 RAW_MONSTATS(来自 1.13c MonStats.txt)在 hcIdx = 410 之前包含一行 Expansion 分隔行(以及中间存在重复/非标准行,未按 MONSTER_HCIDX_TO_ID[hcIdx] 对齐),导致从 hcIdx >= 410 起 getMonsterKindByHcIdx(hcIdx) 返回的 MonsterKind 整体错位(与原版 MPQ MonStats.txt 的 hcIdx 列及 MONSTER_HCIDX_TO_ID 相比共有 314 处不一致)。

典型错位示例

  • hcIdx = 544(原版为 baalcrab 巴尔):getMonsterKindByHcIdx(544) 错误返回 baalthrone
  • hcIdx = 704(原版为 ubermephisto 超级墨菲斯托):getMonsterKindByHcIdx(704) 错误返回 mummy6

受影响调用处

  • src/client/ui-model/hud-model.ts L1295、L2017(导致第五幕及资料片怪物的 HUD 悬停血条名称、不死/恶魔属性标记显示错误)
  • src/client/input/command-mapper.ts L788(悬停目标判定 monKind 错位)

修复建议

  1. getMonsterKindByHcIdx(hcIdx, difficulty) 应通过 MONSTER_HCIDX_TO_ID[hcIdx] 查找对应的 id,再从对应难度的 Map<string, MonsterKind> 中按 id 精确读取(与 getMonsterKindByClassId 对齐),或在解析 RAW_MONSTATS 时剔除 Expansion 分隔行并严格按 MONSTER_HCIDX_TO_ID 映射表构建索引数组。
  2. 新增单测:遍历全部 0..733 的 hcIdx,断言 getMonsterKindByHcIdx(hcIdx, diff)?.id === MONSTER_HCIDX_TO_ID[hcIdx],并与 MPQ MonStats.txt 逐行比对确保 0 差异。
## 问题描述 `src/common/units/monsters-data.ts` 中的 `getMonsterKindByHcIdx(hcIdx, difficulty)`(L2152)在构建 `cachedMonsterKindsByHcIdx` 数组时,直接按 `readMonsterKinds(parseTable(RAW_MONSTATS))` 的顺序遍历推入数组并按 `arr[hcIdx]` 索引。 然而 `RAW_MONSTATS`(来自 1.13c `MonStats.txt`)在 `hcIdx = 410` 之前包含一行 `Expansion` 分隔行(以及中间存在重复/非标准行,未按 `MONSTER_HCIDX_TO_ID[hcIdx]` 对齐),导致从 `hcIdx >= 410` 起 `getMonsterKindByHcIdx(hcIdx)` 返回的 `MonsterKind` 整体错位(与原版 MPQ `MonStats.txt` 的 `hcIdx` 列及 `MONSTER_HCIDX_TO_ID` 相比共有 **314 处**不一致)。 ### 典型错位示例 - `hcIdx = 544`(原版为 `baalcrab` 巴尔):`getMonsterKindByHcIdx(544)` 错误返回 `baalthrone` - `hcIdx = 704`(原版为 `ubermephisto` 超级墨菲斯托):`getMonsterKindByHcIdx(704)` 错误返回 `mummy6` ### 受影响调用处 - `src/client/ui-model/hud-model.ts` L1295、L2017(导致第五幕及资料片怪物的 HUD 悬停血条名称、不死/恶魔属性标记显示错误) - `src/client/input/command-mapper.ts` L788(悬停目标判定 `monKind` 错位) ## 修复建议 1. `getMonsterKindByHcIdx(hcIdx, difficulty)` 应通过 `MONSTER_HCIDX_TO_ID[hcIdx]` 查找对应的 `id`,再从对应难度的 `Map<string, MonsterKind>` 中按 `id` 精确读取(与 `getMonsterKindByClassId` 对齐),或在解析 `RAW_MONSTATS` 时剔除 `Expansion` 分隔行并严格按 `MONSTER_HCIDX_TO_ID` 映射表构建索引数组。 2. 新增单测:遍历全部 `0..733` 的 `hcIdx`,断言 `getMonsterKindByHcIdx(hcIdx, diff)?.id === MONSTER_HCIDX_TO_ID[hcIdx]`,并与 MPQ `MonStats.txt` 逐行比对确保 0 差异。
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#713
No description provided.