[M8] 世界连通:关卡切换、传送点、城镇传送门、小地图 #23

Closed
opened 2026-09-15 06:35:58 +00:00 by troytt · 0 comments
Owner

里程碑 M8 · 重要程度 ★★★★★ · 风险 中高 · 依赖:M6
完整路线图见 ROADMAP.md


背景

目前每张地图都是孤岛。在 src/scene/act-scene.ts 里 grep 以下关键词全部 0 命中:
minimap / waypoint / portal / levelChange / transition。

生成器侧的情况更明确——src/game/wilderness.ts 的 UNIMPLEMENTED_PASSES 列出了 13 个未移植的 D2MOO pass,其中直接相关的是:

  • DRLGOUTPLACE_CreateLevelConnections
  • DRLGOUTDOORS_SpawnAct12Waypoint
  • DRLGOUTDOORS_SpawnAct12Shrines

也就是说生成的关卡根本没有连接图。

方案

不逐个移植 D2MOO 的 pass,改为从 Levels.txt 的 Vis0..7 / Warp0..7 列构建全局连通图——这是更稳妥的路线,因为它是数据驱动的,可以对全部 5 幕一次性生效。

改动清单

  • [NEW] src/game/world-graph.ts —— 从 Levels.txt 的 Vis0..7 / Warp0..7 构建全局关卡连通图
  • [MODIFY] src/game/wilderness.ts / src/game/maze.ts —— 在生成阶段落地入口/出口/传送点的实际位置
  • [NEW] src/scene/transition.ts —— 关卡切换:淡出 → 卸载旧 scene → 加载新 pack → 在对应入口落地 → 淡入。需保持玩家状态跨关卡存活
  • [NEW] src/ui/minimap.ts —— 自动地图,数据源是 CollisionGrid,等距投影复用 ((cx-cy)*80, (cx+cy)*40)
  • [NEW] src/game/portal.ts —— 城镇传送门 + 传送点网络 + 楼梯

与已有工作的衔接

野外侧已经实现了 getPerimeterOpenings(39 号奶牛关 0 出口、2 号血色荒野 1 进 1 出,见 #15)。
本里程碑要把这些几何上的洞口与连通图的边对应起来——现在它们只是墙上的缺口,不通向任何地方。

验收

  • 从罗格营地走到血色荒野 → 进洞穴 → 用传送点回城,全程无缝
  • 小地图正确显示已探索区域
  • 新增 scripts/verify-world-graph.ts:五幕全关卡连通性(每个关卡至少可达、无孤岛)
  • 生成关卡的洞口与连通图的边一一对应(不存在「通向虚空的门」)
> **里程碑 M8** · 重要程度 ★★★★★ · 风险 中高 · 依赖:M6 > 完整路线图见 [`ROADMAP.md`](https://git.projectdiablo2.cn/troytt/diablo2-web/src/branch/main/ROADMAP.md) --- ## 背景 目前**每张地图都是孤岛**。在 `src/scene/act-scene.ts` 里 grep 以下关键词全部 **0 命中**: `minimap` / `waypoint` / `portal` / `levelChange` / `transition`。 生成器侧的情况更明确——`src/game/wilderness.ts` 的 `UNIMPLEMENTED_PASSES` 列出了 13 个未移植的 D2MOO pass,其中直接相关的是: - `DRLGOUTPLACE_CreateLevelConnections` - `DRLGOUTDOORS_SpawnAct12Waypoint` - `DRLGOUTDOORS_SpawnAct12Shrines` **也就是说生成的关卡根本没有连接图。** ## 方案 不逐个移植 D2MOO 的 pass,改为从 `Levels.txt` 的 `Vis0..7` / `Warp0..7` 列构建全局连通图——这是更稳妥的路线,因为它是数据驱动的,可以对全部 5 幕一次性生效。 ## 改动清单 - **[NEW] `src/game/world-graph.ts`** —— 从 `Levels.txt` 的 `Vis0..7` / `Warp0..7` 构建全局关卡连通图 - **[MODIFY] `src/game/wilderness.ts` / `src/game/maze.ts`** —— 在生成阶段落地入口/出口/传送点的**实际位置** - **[NEW] `src/scene/transition.ts`** —— 关卡切换:淡出 → 卸载旧 scene → 加载新 pack → 在对应入口落地 → 淡入。需保持玩家状态跨关卡存活 - **[NEW] `src/ui/minimap.ts`** —— 自动地图,数据源是 `CollisionGrid`,等距投影复用 `((cx-cy)*80, (cx+cy)*40)` - **[NEW] `src/game/portal.ts`** —— 城镇传送门 + 传送点网络 + 楼梯 ## 与已有工作的衔接 野外侧已经实现了 `getPerimeterOpenings`(39 号奶牛关 0 出口、2 号血色荒野 1 进 1 出,见 #15)。 本里程碑要把这些**几何上的洞口**与连通图的**边**对应起来——现在它们只是墙上的缺口,不通向任何地方。 ## 验收 - [ ] 从罗格营地走到血色荒野 → 进洞穴 → 用传送点回城,全程无缝 - [ ] 小地图正确显示已探索区域 - [ ] 新增 `scripts/verify-world-graph.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#23
No description provided.