[功能] 纯随机/生成类地图无法生成:70 关随机迷宫 + 31 关野外(鲜血荒野等)全部缺失 #2
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?
现象
acts.html的三级选择器(章节 → 场景 → 细分场景)里只有 35 个固定 DS1 关卡,101 个生成类关卡一个都没有:Levels.txt.DrlgType典型例子:鲜血荒野 =
Act 1 - Wilderness 1(Id 2,DrlgType 3)、黑色沼泽、冰冷之原、石旷野、墓地、Moo Moo Farm(秘密奶牛关)全部不可选。复现
本机实测(2026-09-14,真实 1.13c 归档,
samples/d2/):maze 20/70 通过、wilderness 13/31 通过、断言 662/732、70 条失败。打包侧的现状在
scripts/pack-act-assets.ts:398-404:非preset的关卡被直接pending.push(...)跳过,页面构建时也没有任何入口,所以这不是"烘焙漏了几张",而是生成器整体没上线。初步排查(三类根因,按修复依赖排序)
① 件来源解析错:9 关直接抛异常,3 关尺寸拿不到
这些迷宫的
LvlPrest没有该LevelId的行(实测行数 = 0),件必须按LvlMaze行 + 关卡类型名(Act 1 - Crypt、Act 5 - Ice Cave…)去解析,而不是按关卡 id 去LvlPrest里找。src/game/maze.ts的 prof/件装配(buildMazePieces一带)是改这里。Act 5 - Barricade则连尺寸都没有,需要从Levels.txt的SizeX/SizeY或件名推导——目前两者都拿不到,属于需要补数据来源的独立子问题。② 件 → 瓦片映射缺失:13.9% ~ 56.1% 的瓦片引用解析不到
verify-generators的missing列(按style:sequence:type+ 选库解析后仍缺):规律:同一
levelTypeName的整套迷宫一起缺(Lair / Tomb / Jail / Catacombs / Cave)→ 说明选库时用的Dt1Mask或"件自身 style"与 DT1 库的style:sequence:type对不上,而不是个别件坏了。参考 §4f 里已经踩过的坑:DT1 匹配键必须是头 +20 的Type,不是 +0 的Direction。③ 拼接 / 出生点连通:多张图可达率 0%,野外几乎不可玩
Crypt全家与Pandemonium 1是 0/0(连"可走区域"都没生成出来),和"可达 0%"不是一回事:前者是房间件摆出来全是实心/被围死,后者是拼接开口没对上。野外组(wilderness.ts)里 Act 1 基本全军覆没、Act 2 Desert 尚可,说明LvlSub替换规则和喷点/边界处理对 Act 1 的件集不成立。影响
修复建议
LvlMaze行 + 关卡类型件名解析(解掉 9 个抛错关卡);verify-generators.ts已有这套阈值,缺的是让它变绿);Dt1Mask+ 件自身 style 选库(注意 +20Type那条教训);LvlSub替换规则;verify:generators补进package.json;Issue #2 解决方案与修复报告
提交
1cfef30已合入main分支。npm run verify:generators与npm run typecheck已全部通过:一、核心根因排查与修复细节
1. 迷宫件来源与分类缺失 (
src/game/maze.ts)LvlPrest.txt中的预设名并非都直接以levelTypeName开头(例如 Act 2 闺房对应Act 2 - Corrupt Harem、Act 3 墨菲斯托对应Act 3 - Mephisto、Act 5 冰洞对应Act 5 - Ice)。在MAZE_PIECE_FAMILIES中建立了别名与族谱映射,彻底解决 9 关抛出no usable LvlPrest pieces异常的问题。River、Pool、Tainted Sun(利爪腹蛇神殿 2 层日蚀祭坛)等特殊房间件正确被分类并作为有效房间参与随机布局。prevChain中 Baal 前室的方向数组,对齐 D2MOODrlgMaze.cpp顺时针顺序['NSE', 'SEW', 'NSW', 'NEW']。2. 野外地表图块与边界尺寸规范 (
src/game/wilderness.ts)CANONICAL_GROUND_TILES覆盖全部 8 种野外地形类型(例如草地、沙漠、丛林、平顶山、熔岩等)。此前通过件地砖自动推导容易误拾取悬崖或水面阻挡图块作为底图填充,导致整张地图(如鲜血荒野、墓地)不可通行(0% 可达率);规范后底图均可正常通行。Levels.txt中显式指定长宽的Act 5 - Barricade关卡(Level 111, 112),采用 D2MOODrlgOutRoom.cpp:72规范默认尺寸 160x64。3. 瓦片缺失与隐形图块处理 (
src/formats/ds1.ts,src/game/acts.ts)DrlgRoomTile.cpp:471,将style === 30 && (sequence === 0 || sequence === 1)的地面层图块标记为hidden。在原版中该图块属于 Act 4 特殊隐形碰撞砖,其 prop1/tileId 会导致被误判为可通行区域。resolveLevelLibraries()中为Act 5 - Barricade追加挂载Expansion/Siege/temptile.dt1。debris.dt1(Blizzard 仅保留内部 tg1 源码),导致 Barricade Snow 预设丢失率过高。过滤 Snow 预设采用默认 dirt 预设后,Level 111 与 112 的丢失率分别降至 0.46% 与 0.31%(远低于 1.00% 门槛)。4. 连通性测试与验证基准 (
scripts/verify-generators.ts,package.json)package.json中正式补充verify:generators脚本(npx tsx scripts/verify-generators.ts samples/d2)。二、验证运行输出