[DRLG-M3] 还原原版 16 位多层碰撞掩码系统与投射物/视线穿透 (COLLIDE_MISSILE_BARRIER / RayTrace) #75

Closed
opened 2026-09-18 06:36:32 +00:00 by troytt · 1 comment
Owner

目标与背景

以暴雪原版 1.13c D2Common.dll (Ordinal 10118 COLLISION_CheckMask, Ordinal 10127 COLLISION_SetMask, Ordinal 11263 COLLISION_RayTrace) 为黄金标准,全面升级现行 src/game/d2map.ts 与战斗碰撞判定层。

缺陷与审计发现

  1. 单一扁平碰撞丢失全部物理语义: 当前碰撞为单一扁平 Uint8Array,仅区分为 1 = 阻挡, 0 = 可通行。
  2. 法术与箭矢无法越过河流/低矮栅栏/熔岩: 在原版 1.13c 中,低矮围栏、水体、深渊(神秘避难所黑边、火焰之河熔岩)具有 COLLIDE_WALL (0x0001) 但没有 COLLIDE_MISSILE_BARRIER (0x0004),地面单位无法通行,但箭矢与魔法投射物可直接射过。当前全被设为不可通行,导致远程攻击被完全阻挡。
  3. 缺少视线 (LOS) 与飞行单位判定: 缺少 COLLIDE_VISIBLE (0x0002) 与 COLLIDE_MASK_FLYING_UNIT。
  4. 缺少亚图块级射线追踪: 缺少 COLLISION_RayTrace,导致技能轨迹与视线判断只能通过粗糙的包围盒近似。

验收条件

  • 将 scene.collision 升级为 16 位位掩码网格 (Uint16Array)。
  • 严格写入并组合 COLLIDE_WALL (0x0001)、COLLIDE_VISIBLE (0x0002)、COLLIDE_MISSILE_BARRIER (0x0004)、COLLIDE_DOOR (0x0800)。
  • 解耦行走判定 (COLLIDE_MASK_PLAYER_PATH) 与投射物飞跃判定 (COLLIDE_MISSILE_BARRIER),允许火球、箭矢穿透河流与低矮障碍。
  • 实现 COLLISION_RayTrace 亚图块射线追踪算法。
  • npm run typecheck 0 errors。
  • npx vitest run 全量通过并新增射线与穿透测试。
  • npx tsx scripts/verify-packs.ts 1671/1671 项逐字节完全匹配(保持兼容)。
### 目标与背景 以暴雪原版 1.13c `D2Common.dll` (Ordinal 10118 `COLLISION_CheckMask`, Ordinal 10127 `COLLISION_SetMask`, Ordinal 11263 `COLLISION_RayTrace`) 为黄金标准,全面升级现行 `src/game/d2map.ts` 与战斗碰撞判定层。 ### 缺陷与审计发现 1. **单一扁平碰撞丢失全部物理语义**: 当前碰撞为单一扁平 `Uint8Array`,仅区分为 `1 = 阻挡, 0 = 可通行`。 2. **法术与箭矢无法越过河流/低矮栅栏/熔岩**: 在原版 1.13c 中,低矮围栏、水体、深渊(神秘避难所黑边、火焰之河熔岩)具有 `COLLIDE_WALL (0x0001)` 但**没有** `COLLIDE_MISSILE_BARRIER (0x0004)`,地面单位无法通行,但箭矢与魔法投射物可直接射过。当前全被设为不可通行,导致远程攻击被完全阻挡。 3. **缺少视线 (LOS) 与飞行单位判定**: 缺少 `COLLIDE_VISIBLE (0x0002)` 与 `COLLIDE_MASK_FLYING_UNIT`。 4. **缺少亚图块级射线追踪**: 缺少 `COLLISION_RayTrace`,导致技能轨迹与视线判断只能通过粗糙的包围盒近似。 ### 验收条件 - [ ] 将 `scene.collision` 升级为 16 位位掩码网格 (`Uint16Array`)。 - [ ] 严格写入并组合 `COLLIDE_WALL (0x0001)`、`COLLIDE_VISIBLE (0x0002)`、`COLLIDE_MISSILE_BARRIER (0x0004)`、`COLLIDE_DOOR (0x0800)`。 - [ ] 解耦行走判定 (`COLLIDE_MASK_PLAYER_PATH`) 与投射物飞跃判定 (`COLLIDE_MISSILE_BARRIER`),允许火球、箭矢穿透河流与低矮障碍。 - [ ] 实现 `COLLISION_RayTrace` 亚图块射线追踪算法。 - [ ] `npm run typecheck` 0 errors。 - [ ] `npx vitest run` 全量通过并新增射线与穿透测试。 - [ ] `npx tsx scripts/verify-packs.ts` 1671/1671 项逐字节完全匹配(保持兼容)。
troytt added this to the [M17] 核心地下城与碰撞层原版一致性 (1.13c) milestone 2026-09-18 06:36:32 +00:00
Author
Owner

已完成原版 1.13c 16位多层碰撞掩码系统与投射物/视线穿透对齐并合入 main (ef59646):

  • 新增 D2C_CollisionMaskFlags 全部 16 位掩码定义 (COLLIDE_WALL=0x0001, COLLIDE_VISIBLE=0x0002, COLLIDE_MISSILE_BARRIER=0x0004, COLLIDE_DOOR=0x0800 等) 及复合掩码。
  • 升级 buildIsoMapScene 构建 Uint16Array collisionMasks 多层碰撞网格,同时 100% 保持 blocked: Uint8Array 兼容(1671/1671 Pack 验证逐字节通过)。
  • 实现 COLLISION_CheckMask (#10118)、COLLISION_SetMask (#10127)、COLLISION_ResetMask (#10123) 与亚图块级 Bresenham 射线追踪 COLLISION_RayTrace (#11263)。
  • 接入 iso-terrain.ts 与 skills.ts 弹道穿透判定,允许弓箭/法术越过河流与低矮障碍并阻挡于实体高墙与闭合门洞。
已完成原版 1.13c 16位多层碰撞掩码系统与投射物/视线穿透对齐并合入 `main` (`ef59646`): - 新增 `D2C_CollisionMaskFlags` 全部 16 位掩码定义 (`COLLIDE_WALL=0x0001`, `COLLIDE_VISIBLE=0x0002`, `COLLIDE_MISSILE_BARRIER=0x0004`, `COLLIDE_DOOR=0x0800` 等) 及复合掩码。 - 升级 `buildIsoMapScene` 构建 `Uint16Array collisionMasks` 多层碰撞网格,同时 100% 保持 `blocked: Uint8Array` 兼容(1671/1671 Pack 验证逐字节通过)。 - 实现 `COLLISION_CheckMask` (#10118)、`COLLISION_SetMask` (#10127)、`COLLISION_ResetMask` (#10123) 与亚图块级 Bresenham 射线追踪 `COLLISION_RayTrace` (#11263)。 - 接入 `iso-terrain.ts` 与 `skills.ts` 弹道穿透判定,允许弓箭/法术越过河流与低矮障碍并阻挡于实体高墙与闭合门洞。
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#75
No description provided.