[M20-P3] 客户端世界(Act I)、运行时按种子生成 DRLG、WorldView 解耦与移动预测(档 A 里程碑) #511

Closed
opened 2026-09-28 13:10:06 +00:00 by troytt · 0 comments
Owner

背景与目标

解耦渲染/UI 与单机 GameEngine,实现客户端权威镜像 ClientWorld;在收到 0x03 D2GS_LOADACT 时按服务端下发的地图种子实时生成与服务端逐位一致的 Act I 地图,完成单位表、本地移动预测、他人/NPC 同步与聊天,达成档 A(技术验证)。

核心内容与 1.13c Ground Truth 对标

  1. WorldView 只读接口与 act-scene.ts 解耦:
    • 从 src/scene/act-scene.ts 抽出渲染与 HUD 所需的只读视图接口 WorldView(地图瓦片与碰撞、玩家与远端单位姿态、地面物品、自动地图揭示状态)。
    • 单机 GameEngine 与联机 ClientWorld 各自实现 WorldView,确保单机 136 关卡回归测试零破坏。
  2. DRLG 运行时按种子生成与运行时 DT1 瓦片图集:
    • 收到 0x03 D2GS_LOADACT (act, mapId, areaId) 与 0x01 难度后,在 Web Worker 中调用 DRLG_AllocDrlg 按服务端 mapId 实时生成 Act I 关卡与房间。
    • 遵循 #502 定案:单机与联机统一使用 D2 原版瓦片变体选法(DRLGROOMTILE_GetTileCache:按房间种子 pDrlgRoom.pSeed + D2CMP_10081_GetTileRarity 抽取),不再二次调用 SplitMix64 pickVariant。
    • 处理 0x07 D2GS_MAPREVEAL / 0x08 D2GS_MAPHIDE 激活与卸载房间,使用运行时按需打包的 DT1 贴图页渲染。
  3. 客户端单位表(Unit Table)与外观合成:
    • 管理五类单位 (type, guid):0x59 / 0x5B / 0x5C(玩家分配与入局离局)、0xAC(怪物与城镇 NPC 分配)、0x51(场景物件)、0x09(关卡 Warp)、0x0A(移除单位)。
    • 复用 src/game/char-appearance.ts 合成自己与其他玩家的 16 部位 COF 装备外观。
  4. 移动预测、远端插值与聊天:
    • 本地玩家点击地面发送 0x01 Walk / 0x03 Run(或朝单位 0x02 / 0x04),客户端使用 D2Common 寻路同步预测位置;收到 0x15 D2GS_REASSIGNPLAYER 时按服务端坐标纠偏。
    • 处理远端单位移动 0x0F / 0x10(玩家)与 0x67 / 0x68 / 0x69 / 0x6D(怪物/NPC),结合 animdata.json 驱动 8/16 方向行走/跑动/待机动画。
    • 实装游戏内聊天(上行 0x15、下行 0x26)。

验收标准(档 A 里程碑)

  • 在线 DRLG Oracle:在 Act I 各关卡跑图时,服务端下发的每一个 0x07 D2GS_MAPREVEAL 房间坐标 100% 命中本地 DRLG 生成的对应房间,无一例错位。
  • 两名客户端(或本客户端 + 原版 Game.exe)进入同一局罗格营地与鲜血荒地,互相看到对方实时走动、朝向、装备外观与聊天消息。
  • 单机模式 npm run typecheck、vitest 与 136 关卡审计全部零回归通过。
## 背景与目标 解耦渲染/UI 与单机 `GameEngine`,实现客户端权威镜像 `ClientWorld`;在收到 `0x03 D2GS_LOADACT` 时按服务端下发的地图种子实时生成与服务端逐位一致的 Act I 地图,完成单位表、本地移动预测、他人/NPC 同步与聊天,达成**档 A(技术验证)**。 ## 核心内容与 1.13c Ground Truth 对标 1. **`WorldView` 只读接口与 `act-scene.ts` 解耦**: - 从 `src/scene/act-scene.ts` 抽出渲染与 HUD 所需的只读视图接口 `WorldView`(地图瓦片与碰撞、玩家与远端单位姿态、地面物品、自动地图揭示状态)。 - 单机 `GameEngine` 与联机 `ClientWorld` 各自实现 `WorldView`,确保单机 136 关卡回归测试零破坏。 2. **DRLG 运行时按种子生成与运行时 DT1 瓦片图集**: - 收到 `0x03 D2GS_LOADACT (act, mapId, areaId)` 与 `0x01` 难度后,在 Web Worker 中调用 `DRLG_AllocDrlg` 按服务端 `mapId` 实时生成 Act I 关卡与房间。 - 遵循 #502 定案:**单机与联机统一使用 D2 原版瓦片变体选法**(`DRLGROOMTILE_GetTileCache`:按房间种子 `pDrlgRoom.pSeed` + `D2CMP_10081_GetTileRarity` 抽取),不再二次调用 SplitMix64 `pickVariant`。 - 处理 `0x07 D2GS_MAPREVEAL` / `0x08 D2GS_MAPHIDE` 激活与卸载房间,使用运行时按需打包的 DT1 贴图页渲染。 3. **客户端单位表(Unit Table)与外观合成**: - 管理五类单位 `(type, guid)`:`0x59 / 0x5B / 0x5C`(玩家分配与入局离局)、`0xAC`(怪物与城镇 NPC 分配)、`0x51`(场景物件)、`0x09`(关卡 Warp)、`0x0A`(移除单位)。 - 复用 `src/game/char-appearance.ts` 合成自己与其他玩家的 16 部位 COF 装备外观。 4. **移动预测、远端插值与聊天**: - 本地玩家点击地面发送 `0x01 Walk` / `0x03 Run`(或朝单位 `0x02` / `0x04`),客户端使用 D2Common 寻路同步预测位置;收到 `0x15 D2GS_REASSIGNPLAYER` 时按服务端坐标纠偏。 - 处理远端单位移动 `0x0F / 0x10`(玩家)与 `0x67 / 0x68 / 0x69 / 0x6D`(怪物/NPC),结合 `animdata.json` 驱动 8/16 方向行走/跑动/待机动画。 - 实装游戏内聊天(上行 `0x15`、下行 `0x26`)。 ## 验收标准(档 A 里程碑) - [ ] **在线 DRLG Oracle**:在 Act I 各关卡跑图时,服务端下发的每一个 `0x07 D2GS_MAPREVEAL` 房间坐标 100% 命中本地 DRLG 生成的对应房间,无一例错位。 - [ ] 两名客户端(或本客户端 + 原版 `Game.exe`)进入同一局罗格营地与鲜血荒地,互相看到对方实时走动、朝向、装备外观与聊天消息。 - [ ] 单机模式 `npm run typecheck`、`vitest` 与 136 关卡审计全部零回归通过。
troytt added this to the [M20] D2GS 纯客户端:接入 PvPGN + D2GS 1.13c 服务端联机 (1.13c Ground Truth) milestone 2026-09-28 13:10:06 +00:00
Sign in to join this conversation.
No Label
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#511
No description provided.