魔法/稀有词缀数值 roll 缺少区间保护,元素伤害区间与触发技能参数被破坏 #128

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

问题描述 (Issue B2)

  • src/game/drop-pipeline.ts 中 createDroppedItem 为 Unique/Set 定义了 NON_RANDOM_RANGE_CODES(dmg-fire, dmg-cold, dmg-ltng, dmg-mag, dmg-pois, dmg-norm, dmg-elem, hit-skill, att-skill, gethit-skill, kill-skill, death-skill, levelup-skill, charged, skill-rand)。
  • 但 src/game/affix-generator.ts 的 rollAffixMods 对所有 mod 一律执行 rng.randRange(mod.min, mod.max),缺少区间保护。
  • 后果:
    1. 魔法/稀有词缀中的元素伤害区间(如 dmg-fire min=1, max=6)被随机成一个标量 value=4,且在进入显示层或 rolledProps 时若 min/max 未被保留或被覆盖,会导致 Adds 1-6 Fire Damage 被错误压缩为 Adds 4 Fire Damage。
    2. 魔法/稀有词缀中的触发技能(hit-skill, att-skill, gethit-skill,其中 par=技能、min=触发几率%、max=技能等级)与聚气技能(charged,par=技能、min=聚气次数、max=技能等级)被当成 [min, max] 区间随机,破坏了触发率与技能等级!

解决方案

  1. 在 src/game/affix-generator.ts(或共享常量)中导出统一的 NON_RANDOM_RANGE_CODES 与 resolveItemPropValue。
  2. 在 rollAffixMods 中对 NON_RANDOM_RANGE_CODES 内的属性停止 rng.randRange(mod.min, mod.max),保持 value = mod.min 且完整保留 min: mod.min, max: mod.max, param: mod.param。
  3. 在 createDroppedItem 中为 magic 和 rare 品质同步构建 rolledProps(使 Unique/Set/Rare/Magic 四种品质都拥有结构一致的 rolledProps),并确保 item-tooltip.ts 读取 Magic/Rare 时完整保留 dmg-fire / hit-skill / charged 的 [min, max] 区间与参数。
## 问题描述 (Issue B2) - `src/game/drop-pipeline.ts` 中 `createDroppedItem` 为 Unique/Set 定义了 `NON_RANDOM_RANGE_CODES`(`dmg-fire`, `dmg-cold`, `dmg-ltng`, `dmg-mag`, `dmg-pois`, `dmg-norm`, `dmg-elem`, `hit-skill`, `att-skill`, `gethit-skill`, `kill-skill`, `death-skill`, `levelup-skill`, `charged`, `skill-rand`)。 - 但 `src/game/affix-generator.ts` 的 `rollAffixMods` 对所有 mod 一律执行 `rng.randRange(mod.min, mod.max)`,缺少区间保护。 - 后果: 1. 魔法/稀有词缀中的元素伤害区间(如 `dmg-fire` min=1, max=6)被随机成一个标量 `value=4`,且在进入显示层或 `rolledProps` 时若 `min`/`max` 未被保留或被覆盖,会导致 `Adds 1-6 Fire Damage` 被错误压缩为 `Adds 4 Fire Damage`。 2. 魔法/稀有词缀中的触发技能(`hit-skill`, `att-skill`, `gethit-skill`,其中 `par`=技能、`min`=触发几率%、`max`=技能等级)与聚气技能(`charged`,`par`=技能、`min`=聚气次数、`max`=技能等级)被当成 `[min, max]` 区间随机,破坏了触发率与技能等级! ## 解决方案 1. 在 `src/game/affix-generator.ts`(或共享常量)中导出统一的 `NON_RANDOM_RANGE_CODES` 与 `resolveItemPropValue`。 2. 在 `rollAffixMods` 中对 `NON_RANDOM_RANGE_CODES` 内的属性停止 `rng.randRange(mod.min, mod.max)`,保持 `value = mod.min` 且完整保留 `min: mod.min, max: mod.max, param: mod.param`。 3. 在 `createDroppedItem` 中为 `magic` 和 `rare` 品质同步构建 `rolledProps`(使 Unique/Set/Rare/Magic 四种品质都拥有结构一致的 `rolledProps`),并确保 `item-tooltip.ts` 读取 Magic/Rare 时完整保留 `dmg-fire` / `hit-skill` / `charged` 的 `[min, max]` 区间与参数。
Author
Owner

Fixed in commit 72eb7de (merged into main). Verified with tests/parity-1.13c.test.ts (11 passed) and tests/affix-generator.test.ts (14 passed).

Fixed in commit 72eb7de (merged into main). Verified with tests/parity-1.13c.test.ts (11 passed) and tests/affix-generator.test.ts (14 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#128
No description provided.