[Parity][map][S2][H] 自动地图视口几何与原版不一致:mini 地图位置、左置坐标、全屏高度/中心、开面板时的偏移量 #625

Closed
opened 2026-10-02 11:42:48 +00:00 by troytt · 0 comments
Owner

1.13c 客户端保真度审计立项(基准快照:7bd1090 / main @ 77a20c7)

证据标记说明:V-data = 1.13c MPQ 数据表 (.txt / animdata.d2 / .tbl / pal.pl2);V-src = D2MOO 逆向源码;V-bin = 1.13c DLL 反汇编;K = 1.13c 公认行为。

来源审计项:map#5 — [S2][H] 自动地图视口几何与原版不一致:mini 地图位置、左置坐标、全屏高度/中心、开面板时的偏移量

位置: src/client/ui/minimap.ts:188-223(computeAutomapViewport)

代码:

const vpX = rightPanelOpen ? 16 : Math.max(0, safeW - 295); const vpY = 16          // 191-192
const vpH = Math.max(1, safeH - 48)                                                // 219
leftPanelOpen && !rightPanelOpen ? 160 : rightPanelOpen && !leftPanelOpen ? -160 : 0 // 220-221

原版(V-bin): 下面的 W、H 是屏幕宽高:

  • 0x6fac0e09 向 [0x6fb8bc48]/[0x6fb8bc4c] 写 0x320/0x258(或 0x280/0x1e0)。
  • [0x6fba9e18] = H−40。

各项对比:

  • mini 地图,右侧(默认)
    • 原版(0x6fb10489-0x6fb104d1,[0x6fbcc1b0]==1 且 [0x6fbcc240]==0):add eax,0xfffffee7 → left = W−281,mov ecx,0x39 → top = 57,宽 0x117 = 279,高 0xE1 = 225。
    • 代码:(W−295, 16)。800×600 时差 (−14, −41) 像素。
  • mini 地图,左置([0x6fbcc240]≠0)
    • 原版:left = 0,top = ((edx==2)−1 & 0x60) − 0x15,即 75([0x6fbcc284]==2 时为 −21)。
    • 代码:(16, 16)。
  • 全屏模式
    • 原版:裁剪矩形为 {0, 0, W−1, H−1}(0x6fb10468-0x6fb10483);中心 Y 用 (H−40)/2(0x6fb10d14-0x6fb10d2f,读 [0x6fba9e18])。
    • 代码:vpH = H−48,centerY = (H−48)/2。600 高时为 276,原版为 280(另有 +0x0F 常量,见待确认第 3 条)。
  • 开面板时的水平偏移
    • 原版:0x6fb10c91-0x6fb10cd1 在非 mini 时为 ±W/4(cdq; and edx,3; add eax,edx; sar 2,右面板时 neg),800 宽时为 ±200。
    • 代码:固定 ±160。
    • 方向一致:右面板([0x6fbcc414]==1)时左移,并强制 mini 地图左置(0x6fb10cd3-0x6fb10ce8 mov [0x6fbcc240],1)。

影响:

  • mini 地图位置偏离原版 14×41 像素,并与右上角其他 HUD 元素的相对位置不同。
  • 全屏地图中心偏 4 像素,开面板时偏 40 像素;宽屏下偏差按 W/4 继续放大。

建议: 按上面的常量重写 computeAutomapViewport:全屏偏移用 W>>2,中心 Y 用 (H−40)/2;mini 地图右置为 (W−281, 57),左置为 (0, 75)。

已有 issue: —(#542/#557 讲的是 >800×600 时面板/提示的坐标偏移,不包含自动地图视口常量)

> **1.13c 客户端保真度审计立项**(基准快照:`7bd1090` / `main @ 77a20c7`) > 证据标记说明:`V-data` = 1.13c MPQ 数据表 (`.txt` / `animdata.d2` / `.tbl` / `pal.pl2`);`V-src` = D2MOO 逆向源码;`V-bin` = 1.13c DLL 反汇编;`K` = 1.13c 公认行为。 ### 来源审计项:`map#5` — [S2][H] 自动地图视口几何与原版不一致:mini 地图位置、左置坐标、全屏高度/中心、开面板时的偏移量 **位置:** `src/client/ui/minimap.ts:188-223`(`computeAutomapViewport`) **代码:** ```ts const vpX = rightPanelOpen ? 16 : Math.max(0, safeW - 295); const vpY = 16 // 191-192 const vpH = Math.max(1, safeH - 48) // 219 leftPanelOpen && !rightPanelOpen ? 160 : rightPanelOpen && !leftPanelOpen ? -160 : 0 // 220-221 ``` **原版(V-bin):** 下面的 W、H 是屏幕宽高: - 0x6fac0e09 向 [0x6fb8bc48]/[0x6fb8bc4c] 写 0x320/0x258(或 0x280/0x1e0)。 - [0x6fba9e18] = H−40。 各项对比: - **mini 地图,右侧(默认)** - 原版(0x6fb10489-0x6fb104d1,[0x6fbcc1b0]==1 且 [0x6fbcc240]==0):`add eax,0xfffffee7` → left = W−281,`mov ecx,0x39` → top = 57,宽 0x117 = 279,高 0xE1 = 225。 - 代码:(W−295, 16)。800×600 时差 (−14, −41) 像素。 - **mini 地图,左置([0x6fbcc240]≠0)** - 原版:left = 0,top = `((edx==2)−1 & 0x60) − 0x15`,即 75([0x6fbcc284]==2 时为 −21)。 - 代码:(16, 16)。 - **全屏模式** - 原版:裁剪矩形为 {0, 0, W−1, H−1}(0x6fb10468-0x6fb10483);中心 Y 用 (H−40)/2(0x6fb10d14-0x6fb10d2f,读 [0x6fba9e18])。 - 代码:`vpH = H−48`,`centerY = (H−48)/2`。600 高时为 276,原版为 280(另有 +0x0F 常量,见待确认第 3 条)。 - **开面板时的水平偏移** - 原版:0x6fb10c91-0x6fb10cd1 在非 mini 时为 ±W/4(`cdq; and edx,3; add eax,edx; sar 2`,右面板时 `neg`),800 宽时为 ±200。 - 代码:固定 ±160。 - 方向一致:右面板([0x6fbcc414]==1)时左移,并强制 mini 地图左置(0x6fb10cd3-0x6fb10ce8 `mov [0x6fbcc240],1`)。 **影响:** - mini 地图位置偏离原版 14×41 像素,并与右上角其他 HUD 元素的相对位置不同。 - 全屏地图中心偏 4 像素,开面板时偏 40 像素;宽屏下偏差按 W/4 继续放大。 **建议:** 按上面的常量重写 `computeAutomapViewport`:全屏偏移用 `W>>2`,中心 Y 用 `(H−40)/2`;mini 地图右置为 (W−281, 57),左置为 (0, 75)。 **已有 issue:** —(#542/#557 讲的是 >800×600 时面板/提示的坐标偏移,不包含自动地图视口常量)
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#625
No description provided.