dgrp 抗性/属性聚合应为「全等才合并」,当前为部分合并 #130

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

问题描述 (Issue C2)

  • 当前 src/game/item-tooltip.ts 的 aggregateAndSortProperties 对 dgrp=1(四维属性 str, dex, vit, enr)与 dgrp=2(四项元素抗性 res-fire, res-cold, res-ltng, res-pois)采用了 Math.min(...) 抽取公共部分 + 保留溢出单抗的「部分合并」策略。
  • 例如:res-fire: 30, res-cold: 30, res-ltng: 30, res-pois: 20 在当前算法中会生成 All Resistances +20 加三条 +10% 单抗。
  • 在 Diablo II 1.13c 原版(D2Client.dll 的 dgrp / dgrpfunc 格式化逻辑 + ItemStatCost.txt)中,只有当同一个 dgrp 组内的全部 4 项属性同时存在且最终汇总数值完全相等(v1 === v2 && v2 === v3 && v3 === v4 && v1 > 0)时,才会折叠输出 dgrpstrpos(All Resistances +X 或 +X to All Attributes);一旦任意一项缺失或与其他三项数值不等(例如同时带了全抗词缀和单抗词缀导致某一项更高,或四项抗性数值不同),原版会将 4 项抗性/属性退回为 4 条独立行(如 Cold Resist +30%, Lightning Resist +30%, Fire Resist +30%, Poison Resist +20%)。

解决方案

  1. 修改 src/game/item-tooltip.ts 的 aggregateAndSortProperties:
    • 将显式传入的 res-all 累加到 fireRes, coldRes, ltngRes, poisRes 四项总抗性中;将显式传入的 all-stats 累加到 strVal, dexVal, vitVal, enrVal 四项总属性中。
    • 仅当 fireRes > 0 && fireRes === coldRes && coldRes === ltngRes && ltngRes === poisRes 时,输出单条 res-all (All Resistances +X);否则按各单项实际累加后的总值(coldRes, ltngRes, fireRes, poisRes)独立输出单抗行。
    • 同理,仅当 strVal > 0 && strVal === dexVal && dexVal === vitVal && vitVal === enrVal 时输出单条 all-stats (+X to All Attributes);否则按各单项实际总值独立输出。
  2. 更新 tests/item-tooltip-123-125.test.ts 与 tests/parity-1.13c.test.ts 中的断言,验证四项相等时合并、四项不等时退回独立行且数值为 res-all + 单抗 累加值。
## 问题描述 (Issue C2) - 当前 `src/game/item-tooltip.ts` 的 `aggregateAndSortProperties` 对 `dgrp=1`(四维属性 `str`, `dex`, `vit`, `enr`)与 `dgrp=2`(四项元素抗性 `res-fire`, `res-cold`, `res-ltng`, `res-pois`)采用了 `Math.min(...)` 抽取公共部分 + 保留溢出单抗的「部分合并」策略。 - 例如:`res-fire: 30, res-cold: 30, res-ltng: 30, res-pois: 20` 在当前算法中会生成 `All Resistances +20` 加三条 `+10%` 单抗。 - 在 Diablo II 1.13c 原版(`D2Client.dll` 的 `dgrp` / `dgrpfunc` 格式化逻辑 + `ItemStatCost.txt`)中,只有当同一个 `dgrp` 组内的全部 4 项属性**同时存在且最终汇总数值完全相等**(`v1 === v2 && v2 === v3 && v3 === v4 && v1 > 0`)时,才会折叠输出 `dgrpstrpos`(`All Resistances +X` 或 `+X to All Attributes`);一旦任意一项缺失或与其他三项数值不等(例如同时带了全抗词缀和单抗词缀导致某一项更高,或四项抗性数值不同),原版会将 4 项抗性/属性退回为 4 条独立行(如 `Cold Resist +30%`, `Lightning Resist +30%`, `Fire Resist +30%`, `Poison Resist +20%`)。 ## 解决方案 1. 修改 `src/game/item-tooltip.ts` 的 `aggregateAndSortProperties`: - 将显式传入的 `res-all` 累加到 `fireRes, coldRes, ltngRes, poisRes` 四项总抗性中;将显式传入的 `all-stats` 累加到 `strVal, dexVal, vitVal, enrVal` 四项总属性中。 - 仅当 `fireRes > 0 && fireRes === coldRes && coldRes === ltngRes && ltngRes === poisRes` 时,输出单条 `res-all` (`All Resistances +X`);否则按各单项实际累加后的总值(`coldRes`, `ltngRes`, `fireRes`, `poisRes`)独立输出单抗行。 - 同理,仅当 `strVal > 0 && strVal === dexVal && dexVal === vitVal && vitVal === enrVal` 时输出单条 `all-stats` (`+X to All Attributes`);否则按各单项实际总值独立输出。 2. 更新 `tests/item-tooltip-123-125.test.ts` 与 `tests/parity-1.13c.test.ts` 中的断言,验证四项相等时合并、四项不等时退回独立行且数值为 `res-all + 单抗` 累加值。
Author
Owner

Fixed in commit 041cd65 (merged into main). Verified with tests/item-tooltip-123-125.test.ts (4 passed) and tests/parity-1.13c.test.ts (17 passed).

Fixed in commit 041cd65 (merged into main). Verified with tests/item-tooltip-123-125.test.ts (4 passed) and tests/parity-1.13c.test.ts (17 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#130
No description provided.