refactor(map-gen/maze): 还原迷宫特殊房间/楼梯扫描放置规则,消除强加的全局 BFS 最大距离启发式 #46

Closed
opened 2026-09-17 05:20:37 +00:00 by troytt · 1 comment
Owner

背景与现状

在 commit 78b5351 中,src/game/maze.ts:1634-1658(placeSpecialGroup)为了解决迷宫楼梯兜底问题,引入了基于拓扑的 bfsDistances 启发式:

  • 出口(next / down / quest)优先挑选全局 BFS 拓扑距离最远的房间;
  • 入口(prev)优先挑选离起点最近的房间。

暗黑2原版逻辑(Oracle / Ground Truth)

  • 官方 D2MOO 源码中(D2Common/DRLG/DrlgMaze.cpp 的 DRLGMAZE_ScanReplaceSpecialPreset):
    • 扫描遍历未定房间列表时,是依据房间生成队列顺序进行遍历;
    • 只要房间开门掩码匹配,即按候选轮换游标(startCursor = nRand & 3)顺位替换或外延生长;
    • 原版并不强制要求出口与入口必须距离最远,完全允许入口与出口楼梯随机出现在相邻甚至相近的房间中(这也是暗黑2著名的速通捷径地图特征)。

差异点与缺陷表现

  • 当前 TS 实现通过人工强加的 BFS 距离排序,人为干预了随机地下城的纯随机拓扑,消除了暗黑2原本可能出现的相邻楼梯随机乐趣。

解决建议与改造方案

  1. 还原原版基于生成队列游标与种子旋转的替换扫描逻辑,移除对房间距离的人工排序干预。
  2. 确保在满足开门掩码与连接性的前提下,保留原汁原味的随机地下城房间分布。
## 背景与现状 在 commit `78b5351` 中,`src/game/maze.ts:1634-1658`(`placeSpecialGroup`)为了解决迷宫楼梯兜底问题,引入了基于拓扑的 `bfsDistances` 启发式: - 出口(`next` / `down` / `quest`)优先挑选全局 BFS 拓扑距离最远的房间; - 入口(`prev`)优先挑选离起点最近的房间。 ## 暗黑2原版逻辑(Oracle / Ground Truth) - 官方 D2MOO 源码中(`D2Common/DRLG/DrlgMaze.cpp` 的 `DRLGMAZE_ScanReplaceSpecialPreset`): - 扫描遍历未定房间列表时,是依据房间生成队列顺序进行遍历; - 只要房间开门掩码匹配,即按候选轮换游标(`startCursor = nRand & 3`)顺位替换或外延生长; - 原版并不强制要求出口与入口必须距离最远,完全允许入口与出口楼梯随机出现在相邻甚至相近的房间中(这也是暗黑2著名的速通捷径地图特征)。 ## 差异点与缺陷表现 - 当前 TS 实现通过人工强加的 BFS 距离排序,人为干预了随机地下城的纯随机拓扑,消除了暗黑2原本可能出现的相邻楼梯随机乐趣。 ## 解决建议与改造方案 1. 还原原版基于生成队列游标与种子旋转的替换扫描逻辑,移除对房间距离的人工排序干预。 2. 确保在满足开门掩码与连接性的前提下,保留原汁原味的随机地下城房间分布。
Author
Owner

已在分支 fix/issue-46 中真实修复并验证通过。

Commit: 8bb99de
验证项:

  • 121/121 目标测试通过 (tests/m4.test.ts, tests/m5.test.ts, tests/world-graph.test.ts)
  • 1000 次 20 个迷宫配置随机模拟 100% 成功
  • TypeScript 类型检查通过 (npx tsc --noEmit)
  • 生产包构建成功 (npm run build)
  • 全量 35 个测试套件 635 测试全绿
已在分支 `fix/issue-46` 中真实修复并验证通过。 Commit: `8bb99de` 验证项: - 121/121 目标测试通过 (`tests/m4.test.ts`, `tests/m5.test.ts`, `tests/world-graph.test.ts`) - 1000 次 20 个迷宫配置随机模拟 100% 成功 - TypeScript 类型检查通过 (`npx tsc --noEmit`) - 生产包构建成功 (`npm run build`) - 全量 35 个测试套件 635 测试全绿
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#46
No description provided.