[Parity][map][S1][R] 迷雾 / 探索规则是自创的:8×8 伪房间 3×3 加半径 9 圆,每帧 force,地图关闭时不探索,探索记录按显示模式分开 #624

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#3 — [S1][R] 迷雾 / 探索规则是自创的:8×8 伪房间 3×3 加半径 9 圆,每帧 force,地图关闭时不探索,探索记录按显示模式分开

位置:

  • src/client/ui/minimap.ts:56:REVEAL_RADIUS = 9。
  • minimap.ts:59:ROOM_SIZE_CELLS = 8。
  • minimap.ts:769-845(reveal):
    • 以关卡原点对齐的 8×8 格伪房间网格,揭示玩家周围 3×3 块(813-828)。
    • 再加一个半径 9 格的圆(830-840)。
  • src/client/scene/world-renderer.ts:1140-1169:只在 mode !== 'off'(地图可见)时调用。每帧都 reveal(…, undefined, undefined, true):force=true 跳过阈值,也不传精确坐标。
  • src/client/automap/automap-view.ts:601:key 含 ${this.mode}。
  • minimap.ts:1468-1475(seenFor):按 level.key 存探索数组。

代码:

ctx.minimap.reveal(effectiveMinimapLevel, playerCellX, playerCellY, undefined, undefined, true) // world-renderer.ts:1162-1169
key: `automap_${this.mapSeed}_${this.difficulty}_${this.currentAreaId}_${this.mode}`             // automap-view.ts:601

原版(V-bin):

  • 节流:0x6fb12af0 以 [0x6fbcc204] 倒计时,取玩家坐标后算 (2*max+min)/2,cmp eax,0x50,≥80 才执行。
  • 揭示范围:执行时取玩家所在房间及邻近房间(0x6fb12bc2 附近),对同一关卡的房间调用 0x6fb12580(room, 0, layer)。
  • 逐 tile 判定:0x6fb12580 在 0x6fb125b0-0x6fb125e8 循环房间 tile(add ebx,0x30 步长)。
    • test al,0x8 → 跳过。
    • test eax,0x20000,或全局 [0x6fbcc200],或参数非 0 → call 0x6fb11880 加入自动地图。
    • 由于参数传 0,只加入带 0x20000 标志的 tile。
  • 0x20000 标志的来源:在 tile 实际被绘制到屏幕时置位。0x6fb4ebbf call 0x6fabd0d2(tile 绘制),test eax,eax,然后 0x6fb4ebcc or DWORD PTR [esi+0x14],0x20000。0x6fb4edac、0x6fb4f0ec、0x6fac3560 处也有同样的置位。
  • 调用位置:0x6fb12af0 唯一的调用点是游戏循环中的 0x6faf4b1d call 0x6fb12af0,前面没有"自动地图是否打开"的判断。
  • 结论:原版揭示的是"玩家附近房间里、曾在屏幕上画出来的 tile",并且地图关着也在探索。
  • 城镇全图预揭示与原版一致:V-src DrlgPreset.cpp:1794-1823;V-data lvlprest.txt AutoMap=1 的行为 #1/#301/#529/#797/#864(Def 1/301/529/797/863,LevelId 1/40/75/103/109)。

影响:

  • 关着地图走过的区域,打开后是空白,只有当前位置周围被揭开。原版此时会显示一路走过、画面里出现过的区域。
  • 揭示形状是方块加圆,而不是"看见过的 tile",墙后、屏幕外的区域也会被揭开。
  • 原版的 ≥80(等价于代码的 ≥160)节流被 force 绕过,变成每帧揭示。
  • 'level' 和 'act' 两种模式各有一份探索记录:切到 'act' 后之前的探索不显示,切回来又是另一份。

建议:

  • 揭示改为以 DRLG 房间为单位,tile 级标志按"已在屏幕绘制"置位(floorQuads / 墙绘制时记录)。
  • 在游戏循环中无条件调用,按原版的倒计时和 ≥80 阈值节流。
  • 探索数组的 key 去掉 mode。

已有 issue: —

> **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#3` — [S1][R] 迷雾 / 探索规则是自创的:8×8 伪房间 3×3 加半径 9 圆,每帧 force,地图关闭时不探索,探索记录按显示模式分开 **位置:** - `src/client/ui/minimap.ts:56`:`REVEAL_RADIUS = 9`。 - `minimap.ts:59`:`ROOM_SIZE_CELLS = 8`。 - `minimap.ts:769-845`(`reveal`): - 以关卡原点对齐的 8×8 格伪房间网格,揭示玩家周围 3×3 块(813-828)。 - 再加一个半径 9 格的圆(830-840)。 - `src/client/scene/world-renderer.ts:1140-1169`:只在 `mode !== 'off'`(地图可见)时调用。每帧都 `reveal(…, undefined, undefined, true)`:`force=true` 跳过阈值,也不传精确坐标。 - `src/client/automap/automap-view.ts:601`:`key` 含 `${this.mode}`。 - `minimap.ts:1468-1475`(`seenFor`):按 `level.key` 存探索数组。 **代码:** ```ts ctx.minimap.reveal(effectiveMinimapLevel, playerCellX, playerCellY, undefined, undefined, true) // world-renderer.ts:1162-1169 key: `automap_${this.mapSeed}_${this.difficulty}_${this.currentAreaId}_${this.mode}` // automap-view.ts:601 ``` **原版(V-bin):** - 节流:`0x6fb12af0` 以 [0x6fbcc204] 倒计时,取玩家坐标后算 `(2*max+min)/2`,`cmp eax,0x50`,≥80 才执行。 - 揭示范围:执行时取玩家所在房间及邻近房间(0x6fb12bc2 附近),对同一关卡的房间调用 `0x6fb12580(room, 0, layer)`。 - 逐 tile 判定:`0x6fb12580` 在 0x6fb125b0-0x6fb125e8 循环房间 tile(`add ebx,0x30` 步长)。 - `test al,0x8` → 跳过。 - `test eax,0x20000`,或全局 [0x6fbcc200],或参数非 0 → `call 0x6fb11880` 加入自动地图。 - 由于参数传 0,只加入带 0x20000 标志的 tile。 - 0x20000 标志的来源:在 tile 实际被绘制到屏幕时置位。0x6fb4ebbf `call 0x6fabd0d2`(tile 绘制),`test eax,eax`,然后 0x6fb4ebcc `or DWORD PTR [esi+0x14],0x20000`。0x6fb4edac、0x6fb4f0ec、0x6fac3560 处也有同样的置位。 - 调用位置:`0x6fb12af0` 唯一的调用点是游戏循环中的 0x6faf4b1d `call 0x6fb12af0`,前面没有"自动地图是否打开"的判断。 - 结论:原版揭示的是"玩家附近房间里、曾在屏幕上画出来的 tile",并且**地图关着也在探索**。 - 城镇全图预揭示与原版一致:V-src `DrlgPreset.cpp:1794-1823`;V-data `lvlprest.txt` AutoMap=1 的行为 #1/#301/#529/#797/#864(Def 1/301/529/797/863,LevelId 1/40/75/103/109)。 **影响:** - 关着地图走过的区域,打开后是空白,只有当前位置周围被揭开。原版此时会显示一路走过、画面里出现过的区域。 - 揭示形状是方块加圆,而不是"看见过的 tile",墙后、屏幕外的区域也会被揭开。 - 原版的 ≥80(等价于代码的 ≥160)节流被 force 绕过,变成每帧揭示。 - 'level' 和 'act' 两种模式各有一份探索记录:切到 'act' 后之前的探索不显示,切回来又是另一份。 **建议:** - 揭示改为以 DRLG 房间为单位,tile 级标志按"已在屏幕绘制"置位(`floorQuads` / 墙绘制时记录)。 - 在游戏循环中无条件调用,按原版的倒计时和 ≥80 阈值节流。 - 探索数组的 key 去掉 `mode`。 **已有 issue:** —
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#624
No description provided.