fix(waypoint): 修复冰冷之原等 14 处场景小站未渲染缺陷并消除全量跨幕 ID 冲突 (#409) #429

Merged
troytt merged 1 commits from fix/issue-409-waypoint-rendering into main 2026-09-24 06:49:37 +00:00
Owner

概述

修复 Issue #409:冰冷之原等 14 处场景小站未渲染以及亚瑞特高原贴图与交互坐标脱节缺陷。严格遵循 Diablo II v1.13c 原版标准,根除全量跨幕局部 DS1 物体 ID 混淆。

核心修复点

  1. 导出权威小站判定辅助函数 (src/game/object-lookup.ts)

    • 导出 WAYPOINT_OBJECTS_TXT_IDS(17 种小站 Objects.txt 行号)与 WAYPOINT_TOKENS。
    • 导出 isWaypointDs1Object(act, type, id),按幕精确解析 DS1 对象,隔离跨幕局部 ID 混淆。
  2. 根除野外跨幕 ID 冲突 (src/game/wilderness.ts)

    • 彻底移除扁平混合的 ALL_WAYPOINT_IDS 集合。
    • 改用 isWaypointDs1Object(effectiveAct, o.type, o.id) 检索预设小站,避免普通火把(id=1)、活板门(id=0)、丛林树木(id=0)或武器架(id=12)被误判为小站而提前中断生成。
    • 冰冷之原等 Act 1/2/3 全部 12 个野外小站场景 100% 恢复正常生成。
  3. 修复神秘避难所中心房变体覆盖与小站统计 (src/game/maze.ts)

    • 在 assignVariants 中跳过神秘避难所(Level 74),严格保留 arcaneSanctuary 显式分配的 level.first.variant = 4(SanctNSEW4.ds1,内嵌小站与传送门)。
    • 在 stamp 中改用 isWaypointDs1Object 探测迷宫房间内嵌的小站实体,使 Level 74 中心房以及各幕迷宫内嵌小站均能精确记录坐标到 stats.waypoints。
  4. 消除打包管线漏识别与名称规范化 (scripts/pack-act-assets.ts)

    • 使用 isWaypointObjectsTxtId 识别 Objects.txt 行号 38(Token: WT,Name: Dummy,亚瑞特高原野外小站)。
    • 将其规范化命名为 Waypoint,并将其加入 waypointCells,彻底解决亚瑞特高原(Level 112)贴图实体与交互热区 source: 'placed' 坐标脱节缺陷。
  5. 加固静态包校验门禁与专项回归测试

    • 在 scripts/verify-packs.ts 中新增 Waypoint Ground-Truth Invariant:严格断言所有小站场景变体必须具备 source: 'object',且 scene.objects 中必须存在渲染实体。
    • 新增专项全谱系单元测试 tests/waypoint-fidelity-regression.test.ts,全量校验 39 个小站场景共 109 个变体。

验证结果

  • 全量地图静态资源重打包:365 张地图全部烘焙完成,PNG 耗时 195.8s,0 缺失瓦片。
  • 全谱系小站审计:109/109 变体 100% 通过,全部 39 个小站场景均具备 source: 'object' 与完全重合的渲染实体对象。
  • 打包校验门禁:npm run verify:packs 2122/2122 项断言 100% 通过。
  • 单元测试套件:相关测试 74/74 项测试全部通过。

Closes #409

## 概述 修复 Issue #409:冰冷之原等 14 处场景小站未渲染以及亚瑞特高原贴图与交互坐标脱节缺陷。严格遵循 Diablo II v1.13c 原版标准,根除全量跨幕局部 DS1 物体 ID 混淆。 ## 核心修复点 1. **导出权威小站判定辅助函数** (`src/game/object-lookup.ts`) - 导出 `WAYPOINT_OBJECTS_TXT_IDS`(17 种小站 `Objects.txt` 行号)与 `WAYPOINT_TOKENS`。 - 导出 `isWaypointDs1Object(act, type, id)`,按幕精确解析 DS1 对象,隔离跨幕局部 ID 混淆。 2. **根除野外跨幕 ID 冲突** (`src/game/wilderness.ts`) - 彻底移除扁平混合的 `ALL_WAYPOINT_IDS` 集合。 - 改用 `isWaypointDs1Object(effectiveAct, o.type, o.id)` 检索预设小站,避免普通火把(`id=1`)、活板门(`id=0`)、丛林树木(`id=0`)或武器架(`id=12`)被误判为小站而提前中断生成。 - 冰冷之原等 Act 1/2/3 全部 12 个野外小站场景 100% 恢复正常生成。 3. **修复神秘避难所中心房变体覆盖与小站统计** (`src/game/maze.ts`) - 在 `assignVariants` 中跳过神秘避难所(Level 74),严格保留 `arcaneSanctuary` 显式分配的 `level.first.variant = 4`(`SanctNSEW4.ds1`,内嵌小站与传送门)。 - 在 `stamp` 中改用 `isWaypointDs1Object` 探测迷宫房间内嵌的小站实体,使 Level 74 中心房以及各幕迷宫内嵌小站均能精确记录坐标到 `stats.waypoints`。 4. **消除打包管线漏识别与名称规范化** (`scripts/pack-act-assets.ts`) - 使用 `isWaypointObjectsTxtId` 识别 `Objects.txt` 行号 38(`Token: WT`,`Name: Dummy`,亚瑞特高原野外小站)。 - 将其规范化命名为 `Waypoint`,并将其加入 `waypointCells`,彻底解决亚瑞特高原(Level 112)贴图实体与交互热区 `source: 'placed'` 坐标脱节缺陷。 5. **加固静态包校验门禁与专项回归测试** - 在 `scripts/verify-packs.ts` 中新增 **Waypoint Ground-Truth Invariant**:严格断言所有小站场景变体必须具备 `source: 'object'`,且 `scene.objects` 中必须存在渲染实体。 - 新增专项全谱系单元测试 `tests/waypoint-fidelity-regression.test.ts`,全量校验 39 个小站场景共 109 个变体。 ## 验证结果 - **全量地图静态资源重打包**:365 张地图全部烘焙完成,PNG 耗时 195.8s,0 缺失瓦片。 - **全谱系小站审计**:109/109 变体 100% 通过,全部 39 个小站场景均具备 `source: 'object'` 与完全重合的渲染实体对象。 - **打包校验门禁**:`npm run verify:packs` 2122/2122 项断言 100% 通过。 - **单元测试套件**:相关测试 74/74 项测试全部通过。 Closes #409
troytt added 1 commit 2026-09-24 06:44:13 +00:00
acdeef7daa fix(waypoint): 修复冰冷之原等14处场景小站未渲染缺陷并消除全量跨幕ID冲突 (#409)
- 在 object-lookup.ts 中导出权威小站判定辅助函数 isWaypointDs1Object 与 isWaypointObjectsTxtId
- 根除 wilderness.ts 中跨幕混淆的 ALL_WAYPOINT_IDS 扁平集合,使用 isWaypointDs1Object 精确识别预设小站
- 修复 maze.ts 中神秘避难所(Level 74)中心房变体被 assignVariants 覆盖重置的问题,确保 SanctNSEW4.ds1 与小站实体完好保留
- 修复 maze.ts 中迷宫房间内部嵌入小站实体的按幕精确识别与坐标统计
- 完善 pack-act-assets.ts,通过 isWaypointObjectsTxtId 识别 Objects.txt 行号 38(WT,ExpansionWildernessWaypoint),消除亚瑞特高原(Level 112)贴图与交互坐标脱节问题
- 在 verify-packs.ts 中新增全量 39 个小站场景 109 个变体的严格 Ground-Truth Invariant 断言(source 必须为 'object' 且 scene.objects 必含渲染实体)
- 新增 tests/waypoint-fidelity-regression.test.ts 专项全量回归测试套件并更新基线哈希

Closes #409
troytt merged commit 94bc8d78b0 into main 2026-09-24 06:49:37 +00:00
troytt deleted branch fix/issue-409-waypoint-rendering 2026-09-24 06:49:37 +00:00
Sign in to join this conversation.
No reviewers
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#429
No description provided.