feat(tooltip/affix): 词条合并、抗性与伤害区间聚合及按 ItemStatCost 优先级排序 #125

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

背景与现状

当前装备词条渲染流水线存在以下两项与原版 Diablo II 显著不符的缺陷:

  1. 同类词条未聚合:
    • 当一件物品分别带有最小伤害与最大伤害词缀时(如前缀提供 fire-min: +2,后缀提供 fire-max: +8),当前系统将其渲染为两行分离的文本。而原版会将二者合并为统一的伤害区间行:Adds 2-8 Fire Damage。
    • 同理,物理伤害的 dmg-min 与 dmg-max 应该合并为 Adds X-Y Damage;
    • 当四系抗性(res-fire, res-cold, res-ltng, res-pois)数值相等时,原版会合并为单行 All Resistances +X%,而非冗余输出 4 行;
    • 当四维属性(str, dex, vit, enr)数值相等时,原版会合并为 +X to All Attributes。
  2. 词条展示顺序随意:
    • 目前词条展示仅仅按照数据表或生成的先后次序逐行输出,缺乏官方层级感。
    • 暗黑2原版中,装备面板具有非常严密的视觉排序结构(例如技能等级在最前,其次是攻速/施法,再是增强伤害/增强防御,接着是属性四维、生命法力,最后是抗性与特殊属性)。

暗黑2 1.13c 原版规范 (Ground Truth)

  1. 词条聚合逻辑 (Aggregation):
    • 元素伤害聚合:物品上的全部元素伤害来源(前缀、后缀、天然底模)累加其最小与最大值:totalMin = sum(min), totalMax = sum(max),统一渲染为 Adds {totalMin}-{totalMax} {Element} Damage。
    • 抗性聚合:四系元素抗性取公共最小值合并为 All Resistances +N%,超出公共值的单独保留单抗行。
    • 四维属性聚合:四维取公共值合并为 +N to All Attributes。
  2. 词条排序优先级 (descpriority):
    • ItemStatCost.txt 为每个 stat 定义了 descpriority(0..255)。渲染时必须按 descpriority 从大到小降序排列:
      • 技能等级(allskills, classskills, skilltab): priority ~ 160
      • 战斗速度(fcr, fhr, ias, frw): priority ~ 140
      • 增强伤害(dmg%): priority ~ 130
      • 击中偷取(lifesteal, manasteal): priority ~ 125
      • 增强防御(ac%, ac): priority ~ 115
      • 基础四维(str, dex, vit, enr): priority ~ 100
      • 生命与法力(hp, mana): priority ~ 90
      • 元素伤害(dmg-fire, dmg-cold, dmg-ltng, dmg-pois): priority ~ 80
      • 元素抗性(res-all, res-fire, res-cold 等): priority ~ 70
      • 寻宝率与额外金币(mag%, gold%): priority ~ 60
      • 凹槽与特殊词条: priority ~ 50 及以下

待实现功能清单 (TODOs)

  • 在 src/game/item-tooltip.ts 中建立词条预处理聚合管道 aggregateAndSortProperties:
    • 自动成对合并 fire-min + fire-max -> Adds X-Y Fire Damage
    • 自动成对合并 ltng-min + ltng-max -> Adds X-Y Lightning Damage
    • 自动成对合并 cold-min + cold-max -> Adds X-Y Cold Damage
    • 自动成对合并 dmg-min + dmg-max -> Adds X-Y Damage
    • 自动合并四系相等抗性为 All Resistances +X%
    • 自动合并四维相等属性为 +X to All Attributes
  • 引入基于 ItemStatCost.txt 的 descpriority 权重映射,并在格式化输出前统一执行排序。
  • 编写专项单元测试,验证伤害区间合并、全抗聚合与标准优先级排序。
## 背景与现状 当前装备词条渲染流水线存在以下两项与原版 Diablo II 显著不符的缺陷: 1. **同类词条未聚合**: - 当一件物品分别带有最小伤害与最大伤害词缀时(如前缀提供 `fire-min: +2`,后缀提供 `fire-max: +8`),当前系统将其渲染为两行分离的文本。而原版会将二者合并为统一的伤害区间行:`Adds 2-8 Fire Damage`。 - 同理,物理伤害的 `dmg-min` 与 `dmg-max` 应该合并为 `Adds X-Y Damage`; - 当四系抗性(`res-fire`, `res-cold`, `res-ltng`, `res-pois`)数值相等时,原版会合并为单行 `All Resistances +X%`,而非冗余输出 4 行; - 当四维属性(`str`, `dex`, `vit`, `enr`)数值相等时,原版会合并为 `+X to All Attributes`。 2. **词条展示顺序随意**: - 目前词条展示仅仅按照数据表或生成的先后次序逐行输出,缺乏官方层级感。 - 暗黑2原版中,装备面板具有非常严密的视觉排序结构(例如技能等级在最前,其次是攻速/施法,再是增强伤害/增强防御,接着是属性四维、生命法力,最后是抗性与特殊属性)。 ## 暗黑2 1.13c 原版规范 (Ground Truth) 1. **词条聚合逻辑 (Aggregation)**: - 元素伤害聚合:物品上的全部元素伤害来源(前缀、后缀、天然底模)累加其最小与最大值:`totalMin = sum(min)`, `totalMax = sum(max)`,统一渲染为 `Adds {totalMin}-{totalMax} {Element} Damage`。 - 抗性聚合:四系元素抗性取公共最小值合并为 `All Resistances +N%`,超出公共值的单独保留单抗行。 - 四维属性聚合:四维取公共值合并为 `+N to All Attributes`。 2. **词条排序优先级 (descpriority)**: - `ItemStatCost.txt` 为每个 stat 定义了 `descpriority`(0..255)。渲染时必须按 `descpriority` 从大到小降序排列: - 技能等级(`allskills`, `classskills`, `skilltab`): priority ~ 160 - 战斗速度(`fcr`, `fhr`, `ias`, `frw`): priority ~ 140 - 增强伤害(`dmg%`): priority ~ 130 - 击中偷取(`lifesteal`, `manasteal`): priority ~ 125 - 增强防御(`ac%`, `ac`): priority ~ 115 - 基础四维(`str`, `dex`, `vit`, `enr`): priority ~ 100 - 生命与法力(`hp`, `mana`): priority ~ 90 - 元素伤害(`dmg-fire`, `dmg-cold`, `dmg-ltng`, `dmg-pois`): priority ~ 80 - 元素抗性(`res-all`, `res-fire`, `res-cold` 等): priority ~ 70 - 寻宝率与额外金币(`mag%`, `gold%`): priority ~ 60 - 凹槽与特殊词条: priority ~ 50 及以下 ## 待实现功能清单 (TODOs) - [ ] 在 `src/game/item-tooltip.ts` 中建立词条预处理聚合管道 `aggregateAndSortProperties`: - 自动成对合并 `fire-min` + `fire-max` -> `Adds X-Y Fire Damage` - 自动成对合并 `ltng-min` + `ltng-max` -> `Adds X-Y Lightning Damage` - 自动成对合并 `cold-min` + `cold-max` -> `Adds X-Y Cold Damage` - 自动成对合并 `dmg-min` + `dmg-max` -> `Adds X-Y Damage` - 自动合并四系相等抗性为 `All Resistances +X%` - 自动合并四维相等属性为 `+X to All Attributes` - [ ] 引入基于 `ItemStatCost.txt` 的 `descpriority` 权重映射,并在格式化输出前统一执行排序。 - [ ] 编写专项单元测试,验证伤害区间合并、全抗聚合与标准优先级排序。
Author
Owner

修复完成并验证通过 (Commit f68b1de)

  1. 实现 aggregateAndSortProperties 词条聚合与优先级排序流水线:
    • 自动合并 fire-min + fire-max -> Adds X-Y Fire Damage(冰 cold-min/max、电 ltng-min/max、毒 pois-min/max、物理 dmg-min/max 同理)。
    • 自动聚合 dgrp=2 四系相等抗性为 All Resistances +X(超出部分单独保留单抗),dgrp=1 四维属性为 +X to All Attributes。
    • 自动累加前后缀同类型标量属性,并严格按照 1.13c ItemStatCost.txt descpriority (180..0) 降序排列。
  2. 专项单测 tests/item-tooltip-123-125.test.ts 与生产构建验证通过。
### 修复完成并验证通过 (Commit `f68b1de`) 1. **实现 `aggregateAndSortProperties` 词条聚合与优先级排序流水线**: - 自动合并 `fire-min` + `fire-max` -> `Adds X-Y Fire Damage`(冰 `cold-min`/`max`、电 `ltng-min`/`max`、毒 `pois-min`/`max`、物理 `dmg-min`/`max` 同理)。 - 自动聚合 `dgrp=2` 四系相等抗性为 `All Resistances +X`(超出部分单独保留单抗),`dgrp=1` 四维属性为 `+X to All Attributes`。 - 自动累加前后缀同类型标量属性,并严格按照 1.13c `ItemStatCost.txt` `descpriority` (`180..0`) 降序排列。 2. **专项单测 `tests/item-tooltip-123-125.test.ts` 与生产构建验证通过**。
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#125
No description provided.