[P2][T5] 修复 Kurast / Mesa / Desert / Barricade 的瓦片引用缺失 #83
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#83
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?
问题
npx tsx scripts/verify-generators.ts实测,10 个关卡存在瓦片引用缺失(地图引用了 DT1 库里不存在的 tile,渲染时会出现空洞):
与子系统覆盖率的吻合
这份名单与审计报告 T6 的「低命名可追溯子系统」排名高度一致:
DRLGOUTJUNG_DRLGOUTSIEGE_DRLGOUTDESR_排查路径
(style, sequence, type)三元组及出现次数,按频次排序。6.65% 通常是少数几种 tile 大量缺失,而不是均匀分散。
scripts/pack-act-assets.ts的
Dt1Mask/File1..File6处理问题;(style, sequence)组合。Dt1Mask。LvlPrest.txt有Dt1Mask列,LvlTypes.txt有File1..File32。Kurast 这类关卡会混用多个 DT1 库,掩码算错就会整批引用到未加载的库。
说明是共享的结构性问题,一处修复大概率三关同时好转。建议从 79 入手。
修改方案
根因确定前不预设。但请注意:
pack-act-assets.ts并重新产出资源包,同时确认
verify-packs的 1671 项基线如何受影响;验收标准
(style, sequence, type)清单与根因结论verify-generators不引入新的失败项verify-packs基线变化(若有)已逐项说明溯源
113c-divergence-audit.md(条目编号与本 issue 标题中的 T 编号对应)D2Common.dll,PE 时间戳0x4B95C439= 2010-03-09,ImageBase0x6FD50000与 #86 的关系
本 issue 的 4 个关卡族与 #86(子系统精读审计)的前两个目标完全重叠:
DRLGOUTJUNG_(0% 可追溯)DRLGOUTDESR_(9.1%)DRLGOUTSIEGE_(28.6%)建议:若 #86 已经在做
DRLGOUTDESR_/DRLGOUTJUNG_的精读,本 issue 的根因定位可以直接复用其结论,不要重复调查。
反过来,若本 issue 先动手,请把「缺失 tile 的
(style, sequence, type)清单」同步到 #86,那是判断子系统是否忠实还原的一手证据。
相关:#86
修复总结 (Issue #83: 修复库拉斯特/梅萨/沙漠/关卡路障的缺失图块引用)
已完成跨幕荒野关卡真实 DT1 瓦片引用的对齐与缺失瓦片修复,全量 31/31 荒野关卡缺失瓦片比例已 100% 降至 0.00%。
1. 根因分析与代码实现
src/game/wilderness.ts中的applyGroundTransitions包含 Act 1 专用的泥路 (DIRT_PATH_TILE_LUT) 与水岸 (WATER_EDGE_TILE_LUT) 查表逻辑。当在非 Act 1 荒野关卡执行时,误将沙漠与雪地地砖覆盖为 Act 1 的水边瓦片 (style: 2) 与土路过渡瓦片 (style: 0)。applyGroundTransitions中添加 levelTypeName 守卫,限制仅在Act 1 - Wilderness执行,其他关卡直接返回 0,消除跨幕误放瓦片。src/game/wilderness-acts.ts中的initAct3OutdoorLevel与stampAct3KurastCauseway原先硬编码了style: 5(地砖)与style: 1(矮墙)。而 Kurast 的 DT1 库(Floors.dt1与Walls.dt1)中并不存在 style 5 / 1。Floors.dt1中的style: 20 seq: 0 prop1: 194;石运河左/右堤岸矮墙为Walls.dt1中的style: 20 seq: 0 type: 1 / 2 prop1: 129。initAct4OutdoorLevel原先将峡谷地表无条件设为makeFloor(20, 3, 2)(熔岩 boiling lava,仅存在于Act 4 - Lava的Floor.dt1)。Mesa 关卡最高 style 仅到 18,导致每关产生 180~270 个缺失瓦片。request.levelTypeName === 'Act 4 - Lava'动态区分:Lava 保持 style 20 seq 3,Mesa 则使用 MesaFloor.dt1实际存在的 style 10 seq 0 坚石地表。src/game/wilderness-siege.ts使用了fence.dt1不存在的 sequence 与 style。style: 2 seq: 10 type: 1,破损木桩规范为style: 2 seq: 2 type: 7,投石台矮墙设为style: 2 seq: 10 prop1: 2 type: 1,废墟地砖与残垣更新为camp.dt1的style: 18。2. 验证门禁结果
scripts/verify-generators.ts(全量 101 关卡):npm run typecheck: 0 错误。npx vitest run: 84 passed, 1 skipped (85 文件), 1345 passed, 2 skipped。npx tsx scripts/verify-packs.ts: 1671/1671 项断言通过。3. 关联提交
ef93808fix(tiles): 修复 Kurast / Mesa / Desert / Barricade 的瓦片引用缺失 (Issue #83)e3a8eb6test(tiles): 同步 Kurast/Mesa/Desert/Barricade 真实 DT1 瓦片断言 (Issue #83)