Superior / Low Quality / Ethereal / Socket 生成缺失及稀有槽位与毒伤换算对齐 #131

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

问题描述 (Issue A3, A4, A5, B3, C4, C5)

  1. Superior (超强) 品质零属性 (A3):

    • 当前 createDroppedItem 在 qualityTier === 'superior' 时仅将名称改为 Superior ${base.name},未生成任何属性词条。
    • 1.13c 原版规则:防具随机获得 ac% (+5%..+15% Enhanced Defense) 和/或 dur% (+10%..+15% Increase Maximum Durability);武器随机获得 dmg% (+5%..+15% Enhanced Damage)、att (+1..+3 Attack Rating) 和/或 dur% (+10%..+15%)。
  2. Low Quality (劣质) 硬编码 Cracked 且无属性惩罚 (A4):

    • 当前硬编码前缀为 Cracked ,且基础伤害/防御/耐久未受 1.13c 劣质惩罚(1.13c 从 Low Quality, Cracked, Crude, Damaged 4 种前缀随机抽取,且基础防御/伤害为 floor(base * 75 / 100)、最大耐久度降低至约 floor(baseDur / 3))。
  3. 缺失 Ethereal (无形) 与 Socket (凹槽) 生成 (A5):

    • 1.13c 中具有耐久度且非固定不可破坏的武器/防具拥有 5% (1/20) 概率生成为 Ethereal (ItemFlag.ETHEREAL):防具基础防御 floor(baseDef * 1.5),武器基础伤害 floor(baseDmg * 1.5),力量/敏捷需求 -10,最大耐久度 floor(baseDur / 2) + 1,并在 Tooltip 底部显示 Ethereal (Cannot be Repaired)。
    • 非魔法/魔法装备可按 ItemTypes.txt 的 maxSock1 (ilvl 1..24)、maxSock25 (ilvl 25..39)、maxSock40 (ilvl 40+) 与底模 gemsockets 的较小值生成凹槽 (ItemFlag.SOCKETED, sockets),并在 Tooltip 显示 Socketed (N)。
  4. Rare 稀有词缀槽位分配结构差异 (B3):

    • 1.13c rollRareAffixes 对 totalAffixes (3..6) 的每个槽位逐次执行 rng.rand(2) 决定选前缀还是后缀(若一侧已满 3 个则自动选另一侧),而非先预分 targetPrefixCount。
  5. 毒伤显示与 rolledProps 路径统一 (C4, C5):

    • 统一 formatItemTooltip 从 item.rolledProps 取数,并确保毒伤(dmg-pois / pois-min+pois-max+pois-len)当存储为每帧 bit 率(或直接伤害值)时秒数 Math.round(len / 25) 与总伤害显示准确一致。
## 问题描述 (Issue A3, A4, A5, B3, C4, C5) 1. **Superior (超强) 品质零属性 (A3)**: - 当前 `createDroppedItem` 在 `qualityTier === 'superior'` 时仅将名称改为 `Superior ${base.name}`,未生成任何属性词条。 - 1.13c 原版规则:防具随机获得 `ac%` (`+5%..+15% Enhanced Defense`) 和/或 `dur%` (`+10%..+15% Increase Maximum Durability`);武器随机获得 `dmg%` (`+5%..+15% Enhanced Damage`)、`att` (`+1..+3 Attack Rating`) 和/或 `dur%` (`+10%..+15%`)。 2. **Low Quality (劣质) 硬编码 `Cracked` 且无属性惩罚 (A4)**: - 当前硬编码前缀为 `Cracked `,且基础伤害/防御/耐久未受 1.13c 劣质惩罚(1.13c 从 `Low Quality`, `Cracked`, `Crude`, `Damaged` 4 种前缀随机抽取,且基础防御/伤害为 `floor(base * 75 / 100)`、最大耐久度降低至约 `floor(baseDur / 3)`)。 3. **缺失 Ethereal (无形) 与 Socket (凹槽) 生成 (A5)**: - 1.13c 中具有耐久度且非固定不可破坏的武器/防具拥有 `5%` (1/20) 概率生成为 Ethereal (`ItemFlag.ETHEREAL`):防具基础防御 `floor(baseDef * 1.5)`,武器基础伤害 `floor(baseDmg * 1.5)`,力量/敏捷需求 `-10`,最大耐久度 `floor(baseDur / 2) + 1`,并在 Tooltip 底部显示 `Ethereal (Cannot be Repaired)`。 - 非魔法/魔法装备可按 `ItemTypes.txt` 的 `maxSock1` (ilvl 1..24)、`maxSock25` (ilvl 25..39)、`maxSock40` (ilvl 40+) 与底模 `gemsockets` 的较小值生成凹槽 (`ItemFlag.SOCKETED`, `sockets`),并在 Tooltip 显示 `Socketed (N)`。 4. **Rare 稀有词缀槽位分配结构差异 (B3)**: - 1.13c `rollRareAffixes` 对 `totalAffixes` (`3..6`) 的每个槽位逐次执行 `rng.rand(2)` 决定选前缀还是后缀(若一侧已满 3 个则自动选另一侧),而非先预分 `targetPrefixCount`。 5. **毒伤显示与 `rolledProps` 路径统一 (C4, C5)**: - 统一 `formatItemTooltip` 从 `item.rolledProps` 取数,并确保毒伤(`dmg-pois` / `pois-min`+`pois-max`+`pois-len`)当存储为每帧 bit 率(或直接伤害值)时秒数 `Math.round(len / 25)` 与总伤害显示准确一致。
Author
Owner

Fixed in commit 75eb4f4 (merged into main). Verified with tests/parity-1.13c.test.ts (21 passed), tests/affix-generator.test.ts (14 passed), and tests/drop-pipeline.test.ts (19 passed).

Fixed in commit 75eb4f4 (merged into main). Verified with tests/parity-1.13c.test.ts (21 passed), tests/affix-generator.test.ts (14 passed), and tests/drop-pipeline.test.ts (19 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#131
No description provided.