diablo2-web/tests
taodao a15da9e000 feat(maze): 还原相邻 Room 边界消隐去重 (bKillEdge) 与门洞平滑衔接 (Issue #77)
以 Diablo II v1.13c D2Common.dll 为黄金标准,在 maze.ts 的 stamp() 中补齐两处
原版装载期行为。

1) bKillEdge 外边界接缝裁剪

原版 DRLGPRESET_InitPresetRoomGrids (DrlgPreset.cpp:1105) 由 LvlPrest.KillEdge
与房间是否贴合地图外缘共同推导:

  bKillEdgeX = pDrlgRoom->nTileXPos + nTileWidth == pDrlgCoord.nPosX + nWidth

再由 DRLGROOMTILE_LoadInitRoomTiles (DrlgRoomTile.cpp:449) 转成
nTileCountX = nTileWidth + (bKillEdgeX == 0)。

- MazePiece 新增 killEdge 字段(来源 LvlPrest.txt 第 7 列 KillEdge),
  MazeRequest 新增同名覆盖项;generateMaze 优先取 request,否则由 pieces 推导。
- stamp() 在 KillEdge 生效时将合成图收窄一列一行,并对贴合外缘的房间按
  variant.width - 1 / height - 1 落图,内部接缝的一格重叠保持不变。
- pack-act-assets.ts 的 getMazePieces 读取真实 KillEdge 列。

经实测 MPQ 内 LvlPrest.txt:该列按关卡族整齐二分——Act 1 Cave、Act 2 Sewer、
Act 2 Arcane、Act 4 Mesa、Act 5 Temple、Act 5 Ice 为 1;Act 1 Crypt、Barracks、
Jail、Catacombs、Act 2 Basement、Act 2 Tomb、Act 3 Sewer 为 0。此前引擎完全忽略
该列,上述 6 个关卡族生成的地图恒比原版多一列一行。

2) 门洞 bHidden 消隐与门槛过道地砖补充

- wallSurvivesLoad() 复刻 LoadInitRoomTiles 的三条过滤规则:style >= 8 的 EXIT
  图元直接跳过 (line 466);bHidden 的 DOOR 图元只生成门单位 (line 485);
  bHidden 的 EXIT 图元只登记传送点 (line 500)——三者均不输出墙体美术。
- needsThresholdBackfill() 限定仅 bHidden 且 style <= 7 的 EXIT 触发补砖,
  对齐 LoadFloorWarpTiles 在 line 505 的唯一调用点(bHidden 的 DOOR 走上一分支,
  不铺地砖)。
- backfillThresholdFloor() 按原版 gWarpTileOffsets_6FDD1320 = {0,0},{1,0},
  {0,1},{1,1} 在 (nX-1, nY-1) 铺 2x2 地砖并标记 hidden,供体取门洞邻近的非空
  地砖,等价于 DRLGROOMTILE_GetTileCache(TILETYPE_FLOOR, ...)。
- 补砖在所有房间落图完成后统一执行:门洞位于两房交界,供体可能属于当时尚未
  落图的邻居。

verify-packs 只校验 preset 关卡(entry.kind !== 'preset' 时跳过),故迷宫尺寸
变化不会影响 1671 项逐字节断言。

新增 tests/killedge-113c.test.ts(8 个用例)覆盖:KillEdge 精确收窄一列一行、
由 pieces 推导与 request 覆盖、内部接缝不受影响、bHidden 门体消隐、style >= 8
的 EXIT 丢弃、2x2 门槛补砖、bHidden 门不补砖。已做变异测试:关闭裁剪或关闭墙体
过滤各会导致 3 个用例失败,确认断言有效。

Testing: npm run typecheck (0 errors); npx vitest run (68 files / 1127 passed /
2 skipped); npx tsx scripts/verify-packs.ts (1671/1671).

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 09:05:17 +00:00
..
fixtures feat(mpq): 实现 ADPCM 与 Huffman 音频解码并接入 Web Audio (fixes #13) 2026-09-14 12:30:21 +00:00
act-scene-monster-plan.test.ts fix(monsters): include superunique and minion monster IDs in PlannedLevel types 2026-09-17 12:36:42 +00:00
animated-tiles.test.ts feat(renderer/map): support animated tiles loop playback (fixes #43) 2026-09-17 06:34:02 +00:00
collision-113c.test.ts feat(collision): 还原原版 1.13c 16位多层碰撞掩码系统与投射物/视线穿透 (Issue #75) 2026-09-18 07:58:49 +00:00
collision-orientation.test.ts test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14) 2026-09-14 12:25:28 +00:00
combat.test.ts test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14) 2026-09-14 12:25:28 +00:00
cull.test.ts test(cull): add unit test for bounds rebuild on level switch 2026-09-17 05:48:51 +00:00
dc6.test.ts test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14) 2026-09-14 12:25:28 +00:00
dcc.test.ts test: 修复三处跳过守卫,它们只在真实资源到位时才暴露 2026-09-14 14:51:50 +00:00
engine-save-load.test.ts M6:舍弃 map-scene.ts,收敛到 act-scene.ts 单轨 2026-09-15 07:40:56 +00:00
engine.test.ts fix(monster): fix loading performance, monster facing, and spawn logic (#30, #31, #32) 2026-09-15 15:03:28 +00:00
formats-malformed.test.ts test: 修复三处跳过守卫,它们只在真实资源到位时才暴露 2026-09-14 14:51:50 +00:00
formulas.test.ts feat(combat): implement Diablo II 1.10+ combat math & PvE depth mechanics (fixes #24, fixes #39) 2026-09-17 02:52:00 +00:00
implode.test.ts test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14) 2026-09-14 12:25:28 +00:00
iso-terrain.test.ts M6:舍弃 map-scene.ts,收敛到 act-scene.ts 单轨 2026-09-15 07:40:56 +00:00
items.test.ts test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14) 2026-09-14 12:25:28 +00:00
killedge-113c.test.ts feat(maze): 还原相邻 Room 边界消隐去重 (bKillEdge) 与门洞平滑衔接 (Issue #77) 2026-09-18 09:05:17 +00:00
lockstep-hash.test.ts refactor(lockstep): 按项目规范彻底移除 any 约束逃逸并优化哈希分配性能 (refs #7) 2026-09-14 13:05:18 +00:00
loop.test.ts test(loop): expand timeout tolerance to 120ms to prevent jitter in concurrent runs 2026-09-17 09:16:48 +00:00
m4.test.ts test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14) 2026-09-14 12:25:28 +00:00
m5.test.ts test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14) 2026-09-14 12:25:28 +00:00
maze-113c.test.ts feat(maze): 还原核心迷宫专用布局例程与基于 LvlPrest Def ID 的精准预设替换 (Issue #73) 2026-09-18 08:45:15 +00:00
maze-bounds.test.ts fix(map-gen/maze): enforce Levels.txt global bounds SizeX/SizeY on room growth (fixes #48) 2026-09-17 06:59:31 +00:00
maze-objects.test.ts fix(engine): fix logical tautologies, edge conditions, and argument defaults 2026-09-17 15:46:49 +00:00
maze-special-passes.test.ts fix(maze): use PRNG stream in special passes and fix Act 5 temple NE waypoint generation 2026-09-17 13:36:02 +00:00
maze-waypoint.test.ts feat(map-gen/maze): integrate waypoint room into maze preset replacement pass (fixes #47) 2026-09-17 06:33:16 +00:00
monster-art-diagnostics.test.ts fix(scene): 让怪物美术加载失败可观测,不再静默变红方块 2026-09-17 11:40:05 +00:00
monster-art.test.ts fix(monster): fix loading performance, monster facing, and spawn logic (#30, #31, #32) 2026-09-15 15:03:28 +00:00
monster-mapping.test.ts fix(monster-mapping): update hellbovine token to EC, remove XX tokens, and eliminate startsWith fallback 2026-09-17 12:42:44 +00:00
monster-packs.test.ts M7 第一步:真实怪物数据层 2026-09-15 08:06:52 +00:00
monster-rooms.test.ts fix(engine): fix logical tautologies, edge conditions, and argument defaults 2026-09-17 15:46:49 +00:00
monster-streaming.test.ts feat(sim/monsters): lazy room population with bPopulated and active/sleeping streaming 2026-09-17 08:33:19 +00:00
monsters.test.ts fix(monsters): eliminate unwired columns, dead logic, and wire elite modifier scaling 2026-09-17 15:56:33 +00:00
mpq-audio.test.ts feat(mpq): 实现 ADPCM 与 Huffman 音频解码并接入 Web Audio (fixes #13) 2026-09-14 12:30:21 +00:00
mpq-roundtrip.test.ts test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14) 2026-09-14 12:25:28 +00:00
net-scene-integration.test.ts refactor(lockstep): 按项目规范彻底移除 any 约束逃逸并优化哈希分配性能 (refs #7) 2026-09-14 13:05:18 +00:00
net.test.ts test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14) 2026-09-14 12:25:28 +00:00
npc-paths.test.ts fix(art): 将 NPC 渲染文件的基础寻址从 objects 修正为 monsters 2026-09-14 13:08:46 +00:00
npc-placeholder.test.ts fix(render): NPC 有立绘时不再叠加绿色占位方块 (refs #6) 2026-09-14 23:56:49 +00:00
object-lookup.test.ts test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14) 2026-09-14 12:25:28 +00:00
packed-entity-art.test.ts fix(monster-mapping): update hellbovine token to EC, remove XX tokens, and eliminate startsWith fallback 2026-09-17 12:42:44 +00:00
packed-npc-art.test.ts fix(npc): 补齐城镇 NPC 解析的收尾问题并加上回归护栏 (refs #6) 2026-09-14 15:58:51 +00:00
preset.test.ts feat(preset): 统一 35 个预设关卡流水线与 8×8 Room 几何装配切片 (Issue #74) 2026-09-18 07:00:53 +00:00
reader.test.ts fix(engine): fix logical tautologies, edge conditions, and argument defaults 2026-09-17 15:46:49 +00:00
render-performance.test.ts test(render/perf): comprehensive lifecycle verification and performance regression suite (fixes #16) 2026-09-17 08:15:13 +00:00
renderer-tuning.test.ts perf(render): optimize GL state with immutable texStorage2D, uniform caching, and configurable discard (fixes #20) 2026-09-17 08:16:05 +00:00
resolve-type1.test.ts fix(npc): 补齐城镇 NPC 解析的收尾问题并加上回归护栏 (refs #6) 2026-09-14 15:58:51 +00:00
roofs.test.ts fix(render): 还原原版暗黑2建筑与城门屋顶过道遮挡消失机制 (#72) 2026-09-18 02:12:37 +00:00
save-schema.test.ts fix(game): 移除不安全的类型转换并增加存档校验 (refs #7) 2026-09-14 12:44:19 +00:00
tbl.test.ts feat(game): decode level names from string.tbl with graceful fallback 2026-09-17 14:14:15 +00:00
tiles.test.ts test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14) 2026-09-14 12:25:28 +00:00
tilesub-113c.test.ts feat(tilesub): 严格对齐 1.13c LvlSub.txt 试验次数与全排列候选位地块替换算法 (Issue #76) 2026-09-18 08:06:50 +00:00
variants.test.ts refactor(map-gen/preset): fix variant selection and seam orientation alignment (fixes #42) 2026-09-17 06:18:42 +00:00
warp-tiles.test.ts feat(world): 全局世界连通、关卡无缝切换、传送点、传送门与小地图 (fixes #23) 2026-09-16 23:39:33 +00:00
widths.test.ts test: 修复三处跳过守卫,它们只在真实资源到位时才暴露 2026-09-14 14:51:50 +00:00
wilderness-acts.test.ts fix(wilderness): prevent destructive wiping of walls and presets in roads and bridges 2026-09-17 15:10:59 +00:00
wilderness-borders.test.ts feat(wilderness): 还原 DRLGOUTPLACE_PlaceAct1245OutdoorBorders 边界峭壁与门洞状态机 2026-09-18 02:51:30 +00:00
wilderness-features.test.ts refactor(wilderness): 移除凭空发明的程序化十字矮石墙网络,回归原版自然地貌阻隔 (#65) 2026-09-18 01:38:00 +00:00
wilderness-ground-blend.test.ts feat(wilderness): 完善地表边缘过渡瓦片(Auto-Tiling)与 DRLGROOMTILE_GetTileCache 权重混合 (Issue #70) 2026-09-18 04:05:01 +00:00
wilderness-jungles.test.ts feat(map-gen/wilderness): implement Act 3 jungle river network and branch topology (fixes #53) 2026-09-17 07:25:07 +00:00
wilderness-population.test.ts feat(map-gen/population): implement wilderness population phase, waypoints, shrines, superuniques & safe zones (fixes #36) 2026-09-17 03:44:12 +00:00
wilderness-roads-multi-act.test.ts refactor(wilderness): 移除凭空发明的程序化十字矮石墙网络,回归原版自然地貌阻隔 (#65) 2026-09-18 01:38:00 +00:00
wilderness-roads.test.ts fix(engine): fix logical tautologies, edge conditions, and argument defaults 2026-09-17 15:46:49 +00:00
wilderness-seams.test.ts feat(wilderness): 实现相邻野外关卡接缝空间对齐与出入口坐标咬合 (Issue #69) 2026-09-18 03:29:18 +00:00
wilderness-siege-strips.test.ts fix(wilderness): add seed diversity to Bloody Foothills obstacle placement 2026-09-17 15:25:45 +00:00
wilderness-spline-roads.test.ts feat(wilderness): 用基于控制顶点图 (DRLGVER) 的 Catmull-Rom 样条道路取代栅格化 A* 道路 (#66) 2026-09-18 02:32:14 +00:00
wilderness-superuniques.test.ts fix(monsters): derive superunique specs from SuperUniques table and eliminate fallen1 fallback 2026-09-17 12:54:09 +00:00
wilderness-telemetry.test.ts refactor(wilderness): 移除凭空发明的程序化十字矮石墙网络,回归原版自然地貌阻隔 (#65) 2026-09-18 01:38:00 +00:00
wilderness-waypoints-shrines.test.ts feat(wilderness): 还原 DRLGOUTDOORS_SpawnAct12Waypoint 小站与神殿拓扑放置算法 (#68) 2026-09-18 03:09:19 +00:00
world-graph.test.ts refactor(acts): unify ACT_TOWNS and townLevelForAct single source of truth 2026-09-17 13:31:07 +00:00