词缀职业限制(classspecific / class / classlevelreq)未校验 #132

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

问题描述 (Issue B5)

  • src/game/affixes.ts 在解析 MagicPrefix.txt 与 MagicSuffix.txt 时,已经提取了 classspecific、class、classlevelreq 三个字段。
  • 但在 isAffixEligible 与 src/game/affix-generator.ts (rollMagicAffixes / rollRareAffixes) 中,从未校验 affix.classspecific(在 1.13c 中,带有 classspecific 职业代码如 'ama', 'sor', 'nec', 'pal', 'bar', 'dru', 'ass' 的词缀,只有在目标物品属于该职业专属类型或 itypes 显式匹配时才允许生成;此外,当 affix.class 与 affix.classlevelreq 存在时,对该职业装备者的需求等级为 classlevelreq 而非通用 levelreq)。

解决方案

  1. 在 src/game/affixes.ts 的 AffixEligibilityOptions 中新增 readonly itemClass?: string | undefined(表示目标物品所属的职业代码,如 'ama' | 'sor' | 'nec' | 'pal' | 'bar' | 'dru' | 'ass',通用物品为 undefined 或 '')。
  2. 在 isAffixEligible 中增加 classspecific 校验:若 affix.classspecific 非空(例如 'ama'),且调用方显式传入了 options.itemClass !== undefined(包括 '' 表示非职业专属通用物品),则必须满足 options.itemClass.toLowerCase() === affix.classspecific.toLowerCase(),否则返回 false(防止职业专属词缀污染通用装备或其他职业装备)。
  3. 在 src/game/affix-generator.ts 与 src/game/drop-pipeline.ts 中,解析目标底模在 ItemTypes.txt 中的所属职业 itemClass 并传入 rollMagicAffixes / rollRareAffixes -> getEligibleCandidates -> isAffixEligible,同时在 RolledAffix 中保留 class 与 classlevelreq 元数据。
## 问题描述 (Issue B5) - `src/game/affixes.ts` 在解析 `MagicPrefix.txt` 与 `MagicSuffix.txt` 时,已经提取了 `classspecific`、`class`、`classlevelreq` 三个字段。 - 但在 `isAffixEligible` 与 `src/game/affix-generator.ts` (`rollMagicAffixes` / `rollRareAffixes`) 中,从未校验 `affix.classspecific`(在 1.13c 中,带有 `classspecific` 职业代码如 `'ama'`, `'sor'`, `'nec'`, `'pal'`, `'bar'`, `'dru'`, `'ass'` 的词缀,只有在目标物品属于该职业专属类型或 `itypes` 显式匹配时才允许生成;此外,当 `affix.class` 与 `affix.classlevelreq` 存在时,对该职业装备者的需求等级为 `classlevelreq` 而非通用 `levelreq`)。 ## 解决方案 1. 在 `src/game/affixes.ts` 的 `AffixEligibilityOptions` 中新增 `readonly itemClass?: string | undefined`(表示目标物品所属的职业代码,如 `'ama' | 'sor' | 'nec' | 'pal' | 'bar' | 'dru' | 'ass'`,通用物品为 `undefined` 或 `''`)。 2. 在 `isAffixEligible` 中增加 `classspecific` 校验:若 `affix.classspecific` 非空(例如 `'ama'`),且调用方显式传入了 `options.itemClass !== undefined`(包括 `''` 表示非职业专属通用物品),则必须满足 `options.itemClass.toLowerCase() === affix.classspecific.toLowerCase()`,否则返回 `false`(防止职业专属词缀污染通用装备或其他职业装备)。 3. 在 `src/game/affix-generator.ts` 与 `src/game/drop-pipeline.ts` 中,解析目标底模在 `ItemTypes.txt` 中的所属职业 `itemClass` 并传入 `rollMagicAffixes` / `rollRareAffixes` -> `getEligibleCandidates` -> `isAffixEligible`,同时在 `RolledAffix` 中保留 `class` 与 `classlevelreq` 元数据。
Author
Owner

Fixed in commit 308e16f (merged into main). Verified with tests/affixes.test.ts (14 passed), tests/affix-generator.test.ts (14 passed), and tests/parity-1.13c.test.ts (23 passed).

Fixed in commit 308e16f (merged into main). Verified with tests/affixes.test.ts (14 passed), tests/affix-generator.test.ts (14 passed), and tests/parity-1.13c.test.ts (23 passed).
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#132
No description provided.