UI/UX:技能快捷选择弹窗(Speedbar)重构 — 严格按暗黑 2 原版 1.13c 技能树分类(ListRow / Tab)分行组织与向外展开 #402
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
1. 问题现状与交互缺陷分析
在当前 Web 端暗黑破坏神 2 客户端中,底部控制条左右技能槽点击弹出的快捷技能选择菜单(Skill Selection Speedbar,位于
src/ui/hotkeys.ts)存在严重的非原版与排版混乱问题:1.1 机械式取模折行,缺乏语义分组
当前
src/ui/hotkeys.ts中的getPopupCells方法使用硬编码的一维网格取模计算:2. 暗黑破坏神 2 v1.13c 原版 Speedbar 规范(Ground Truth)
根据暗黑破坏神 2 v1.13c 客户端二进制(
D2Client.dll0x6fad7440..0x6fad7536、spellsel.cpp)及官方 MPQ 核心数据表SkillDesc.txt/Skills.txt:2.1 行分类标准(ListRow & SkillPage 规范)
SkillDesc.txt中的ListRow字段决定了技能在选择弹窗中的行分类归属:2.2 左右技能槽可用性过滤(Left vs Right Slot Filter)
Skills.txt中leftskill = 1且passive = 0。aura = 1)以及大部分无目标范围/自增益技能(如传送、静电力场、冰封装甲、能量护盾等)在原版中leftskill = 0,严禁出现在左键弹窗。2.3 弹窗空间排版与展开流向(Spatial Flow & Alignment)
LEFT_SKILL_BOUNDS: (x: 117, y: 551)。x = base.x + col * cellW)。RIGHT_SKILL_BOUNDS: (x: 635, y: 551)。x = base.x - col * cellW),保证技能菜单始终向屏幕中央展开,符合 D2 原版人体工学与视觉视口防溢出要求。reqlevel)及技能 ID 升序排列(从低级技能到高级技能有序展开),保持与技能树相同的学习阶段认知一致性。3. 改造方案与实现要求
3.1 数据层(Data Association)
src/data/skills-catalog.ts中的SKILLS_BY_ID元数据:tabIndex(0, 1, 2 分别映射至 Tab 1, Tab 2, Tab 3)。category: 'general'(ListRow 0)。category: 'item'(ListRow 4)。tabIndex归组至category: 'tab0' | 'tab1' | 'tab2'。3.2 布局计算重构 (
getPopupCells)SkillHotkeysHud.prototype.getPopupCells(side: 'left' | 'right'):list。visualRowIndex。(x, y):y = base.y - (visualRowIndex + 1) * cellH - 6x:左键向右base.x + col * cellW;右键向左base.x - col * cellW。{ skill, x, y, w: 48, h: 48, category, col, row }的元组结构。3.3 交互与命中检测(Hit Testing & Tooltip)
handleMouseMove)、点击分配(handleMouseDown)、快捷键绑定(F1~F8triggerFunctionKey)与新的多行网格完全无缝联动。drawSkillTooltip)在新的多行不规则网格上依然自适应贴边,不遮挡技能图标且不溢出 800×600 画布。4. 验收标准(Acceptance Criteria)
reqlevel与技能 ID 升序排列(低级技能在靠槽位端,高级技能向外延伸)。npm run typecheck,npm test)100% 通过,无回归破坏。✅ 修复完成与原版验证报告 (Parity Verification Report)
本 Issue 所述的“快捷技能栏按技能树分行组织”已完成全职业(7 个职业)重构与全量测试验证:
1. 核心改动说明 (
src/ui/hotkeys.ts)cols = 5取模折行;SkillDesc.txt规范划分:Row 0:基础通用动作(普通攻击 Attack 0、投掷 Throw 2、取消召唤 Unsummon 3、左手投掷 4 等);Row 1~3:角色技能树的三系 Tab(Tab 1、Tab 2、Tab 3);Row 4:物品与卷轴技能(回城之书/卷轴、辨识之书/卷轴,以及由装备聚气赋予的充能技能);leftskill = 1且非被动技能进入左键弹窗(共 83 个合法技能),全量排除 26 个被动技能与全部圣骑士光环;(117, 551)向上并向右展开;右键槽自(635, 551)向上并向左展开,并受 800×600 画布安全边界防溢出保护。reqlevel)及技能 ID 升序排列。2. 测试与验证结果
npm run typecheck0 错误;tests/speedbar-authentic-parity.test.ts新建 31 项深度用例,覆盖全 7 职业分行、空系折叠、左键过滤与几何坐标验证,相关专项测试 77/77 绿灯;npm test423 个测试套件、4,508 个用例 100% 通过,0 失败。