[DRLG-M5] 还原相邻 Room 边界消隐去重 (bKillEdge) 与门洞平滑衔接 #77
Labels
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: troytt/diablo2-web#77
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?
目标与背景
以暴雪原版 1.13c
D2Common.dllDRLGROOMTILE_LoadInitRoomTiles与RoomTile.cpp为黄金标准,重构相邻房间缝合逻辑。缺陷与审计发现
bKillEdge): 原版 1.13c 在加载拼接相邻 Room 时,计算nTileCountX = pDrlgRoom->nTileWidth + (bKillEdgeX == 0),动态裁剪外边界重复墙体。当前引擎缺乏该消隐机制,相邻 Room 接缝处存在图元重复绘制与缝隙隐患。bHidden并自动补充 6 块门槛过道 Floor 地砖 (pTiles.nFloors += 6)。当前引擎缺乏该补充,偶现门洞边缘轻微地面镂空。验收条件
bKillEdgeX与bKillEdgeY边界去重消隐算法。bHidden墙体消隐与门槛过道地砖补充。npm run typecheck0 errors。npx vitest run全量通过。npx tsx scripts/verify-packs.ts1671/1671 项逐字节完全匹配。✅ 已修复并合并至 main (
a15da9e)以 Diablo II v1.13c
D2Common.dll(MD5ee1238806ef6d6d9801d12a09d128fe1) 为黄金标准,在maze.ts的stamp()中补齐两处原版装载期行为。1.
bKillEdge外边界接缝裁剪原版由两处共同决定,而非单一开关:
即:只有贴合地图外缘的那一间房才裁掉多出的一格;内部房间照旧多铺一格,与邻居共享边界。
实现:
MazePiece新增killEdge(来源LvlPrest.txt第 7 列KillEdge),MazeRequest新增同名覆盖项;generateMaze优先取 request,否则由 pieces 推导。stamp()在生效时将合成图收窄一列一行,贴边房间按variant.width - 1/height - 1落图,内部接缝的一格重叠完全不变。pack-act-assets.ts的getMazePieces读取真实KillEdge列。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)铺 2×2 地砖并标记hidden;供体取门洞邻近的非空地砖,等价于DRLGROOMTILE_GetTileCache(TILETYPE_FLOOR, ...)。补砖在所有房间落图完成后统一执行:门洞位于两房交界,供体可能属于当时尚未落图的邻居。
关于 verify-packs 的影响评估
verify-packs.ts第 125 行if (entry.kind !== undefined && entry.kind !== 'preset') continue—— 迷宫关卡被整体跳过,只校验 preset 关卡。因此本次迷宫尺寸变化不会影响 1671 项逐字节断言,已实测确认。验证
新增
tests/killedge-113c.test.ts(8 个用例):KillEdge 精确收窄一列一行、由 pieces 推导与 request 覆盖、内部接缝不受影响、bHidden门体消隐、style >= 8的 EXIT 丢弃、2×2 门槛补砖、bHidden门不补砖。npm run typechecknpx vitest runnpx tsx scripts/verify-packs.ts