fix(d2map): 修正空单元格阻挡掩码与玩家出生点虚空悬空问题 #114
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景与问题描述
在 #111 全地图走查中,发现部分关卡玩家出生点直接悬挂在无边纯黑虚空中,无法正常移动或探索:
根因剖析 (1.13c 对比)
src/game/d2map.ts的buildIsoMapScene中:const blocked = new Uint8Array(gridWidth * gridHeight)初始化全为 0。只有放置了瓦片且具有阻挡属性的格子才被赋值为 1。未放置任何瓦片的纯黑虚空格从未被标记,被系统误判为“可通行的平地”。src/game/level-links.ts中的findIsoSpawn算法直接从画布的几何中心(cellsX / 2, cellsY / 2)开始向外扩散搜寻第一个blocked === 0的单元格。在异形地图中,画布中心常常落在黑色虚空里,由于虚空格被误判为可通行,算法在半径 0 处直接返回虚空坐标!在
D2Common.dll中:COLLIDE_BLANK(0x0001)与COLLIDE_WALL掩码,属于不可通行的无效区域(COLLIDE_MASK_INVALID);LvlWarp.txt、传送阵预设件(Waypoint Token)或房间内部起点 Token,绝不允许落在未放置房间的空区域。修复要求
src/game/d2map.ts中:COLLIDE_BLANK | COLLIDE_WALL;findIsoSpawn(及关卡出生点选择逻辑)中:tests/iso-spawn-void-guard.test.ts,验证异形关卡(Tower 2 等)出生点绝对不落在虚空中。npm run typecheck、npx vitest run。关联主 Issue: #111
修复完成并已合并至 main
fd67de7b1bafb3c019b92351890ec8cbe7dec5a8(Merge:ad822bf)src/game/d2map.tsbuildIsoMapScene中对没有非隐藏有效地面瓦片的纯黑虚空单元格,严格将 25 个子格子打上blocked[idx] = 1并设置COLLIDE_MASK_INVALID(包含COLLIDE_BLANK与COLLIDE_WALL)。src/game/level-links.tsfindIsoSpawn中寻找玩家出生点时强制要求所在单元格拥有有效地面且处于连通可行走区域,杜绝玩家在遗忘之塔外景、皇宫、秘密避难所等不规则地图中心出生在纯黑虚空的问题。tests/iso-spawn-void-guard.test.ts进行隔离保障验证。npm run typecheck0 errors,全量vitest run测试通过。