From b6fc2512d4b5585f36e72ef896033e3281e52a93 Mon Sep 17 00:00:00 2001 From: troytt <47798984@qq.com> Date: Sun, 27 Sep 2026 15:20:41 +0000 Subject: [PATCH] feat(drlg): generate Act I outdoor levels with the 1:1 D2MOO port (#455) The eight Act I outdoor levels (Blood Moor 2, Cold Plains 3, Stony Field 4, Dark Wood 5, Black Marsh 6, Tamoe Highland 7, Burial Grounds 17, Moo Moo Farm 39) are now generated by the function-by-function port of D2MOO's D2Common DRLG in src/game/drlg, bit-exact against a native D2MOO oracle. The legacy Act I generator (src/game/wilderness/*, the Blood Moor branch and the Act I paths of wilderness.ts) is deleted; there is no fallback. Acts 2-5 are unchanged. Port (completes the kernel committed earlier): - Tile-map stage: DRLGROOMTILE_AddRoomMapTiles with its tile-data, linked-tile and warp helpers, DRLGPRESET_AddPresetRoomMapTiles, DRLGOUTROOM_InitializeDrlgOutdoorRoom (drlg-outroom.ts), the DrlgDrlgLogic.cpp parts they reach (drlg-logic.ts), D2CMP shim updates. - drlg-dump.ts: runAct1() driver API; schema 3 dumps with per-room tile lists. The port is now type-checked (tsconfig no longer excludes it). Integration: - drlg-map.ts (replaces drlg/adapter.ts): turns a generated level into the bake's DS1-shaped canvas with exact (style, sequence, type) per tile and per-cell DT1 masks, objects, seams from the DRLG level links, warps from their UNIT_TILE preset units; blank cells stay blocked. - pack-act-assets: one D2 game seed per (act, variant), a DRLG bake job and index.json actLayouts; scripts/lib/drlg-mpq-source.ts feeds the port from the MPQs with the oracle's file list. - act-variants.ts: WorldVariants picks one generated copy per act (and the Rogue Encampment DS1 that copy fixed); act-scene.ts and verify-world-walk both use it. act-scene no longer paints grass into the blank cells of DRLG scenes. - world-graph: remove the invented Stony Field <-> Dark Wood seam (gAct1WildernessDrlgLink / gAct1MonasteryDrlgLink keep them apart; they meet only through the Underground Passage); world-placement anchors the second group at the Monastery Gate (3000, 1000). - level-links: findBorderOpening takes an optional edge range. - d2map: dt1MaskAllows extracted, behaviour unchanged. Tools and tests: - tools/d2moo-oracle: tile-map stage and schema 3; the 4 fixtures are regenerated (scripts/drlg-fixtures.ts). - scripts/render-drlg-compare.ts (both dumps through the same adapter and renderer, fails unless the XOR is empty) and scripts/audit-levels-browser.ts (headless audit of every baked map). - tests/drlg-act1-oracle.test.ts (all stages, all 4 fixtures) and tests/drlg-act1-invariants.test.ts; tests and stress scripts of the deleted generator are retired or now run on Acts 2-5 only. - verify-world-walk: start in the town the runtime opens and floor the spawn sub-tile like the movement collision does. Verification: - drlg-diff --levels 2-7,17,39 --seeds 32: 32/32 identical at every stage; --trace-check 64/64, --isolated 32/32, difficulty 1 and 2 16/16. - render-drlg-compare, 3 bake copies x 8 levels: 24/24 XOR empty. - Full re-bake: 365 maps, 0 missing tiles. Browser audit: 355/365 maps, 133/136 level ids clean (112/124/129: Act 5 minions without art, as before). - verify:world-graph 37583 assertions; verify:world-walk 29/29; verify:entity-packs, typecheck clean. vitest 6369 passed; the 6 failures (5 ground-item name formatting, 123-var3 waypoint) and the verify:packs / verify:generators failures also occur at bad6806. Test pins updated, measured on the new bake: SceneEntrance 172 -> 166 and world-graph edges 286 -> 284 (the removed seam), seamless pairs 27 -> 26 and placement pairs 19 -> 18; full-spectrum floors / walls / PNGs 1008898 / 237542 / 1390 (the old pins matched no bake of the current code). TAG=agy CONV=a4f9163c-a011-4161-b169-7f361b1ed57e --- scripts/audit-levels-browser.ts | 805 +++ scripts/drlg-fixtures.ts | 37 + scripts/lib/drlg-mpq-source.ts | 165 + scripts/pack-act-assets.ts | 388 +- scripts/render-drlg-compare.ts | 390 ++ scripts/render-new-ts-blood-moor.ts | 276 - scripts/stress-test-m1-seeds.ts | 102 +- scripts/stress-test-m2-connectivity.ts | 184 +- scripts/stress-test-m2-geometry.ts | 232 +- scripts/verify-generators.ts | 67 +- scripts/verify-stress-m1.ts | 54 +- scripts/verify-world-walk.ts | 68 +- src/game/act-variants.ts | 190 + src/game/d2map.ts | 15 +- src/game/drlg/adapter.ts | 1103 --- src/game/drlg/drlg-d2cmp.ts | 6 + src/game/drlg/drlg-dump.ts | 624 +- src/game/drlg/drlg-logic.ts | 542 ++ src/game/drlg/drlg-map.ts | 826 +++ src/game/drlg/drlg-outdoors.ts | 1 - src/game/drlg/drlg-outroom.ts | 38 + src/game/drlg/drlg-preset.ts | 194 +- src/game/drlg/drlg-room.ts | 21 +- src/game/drlg/drlg-roomtile.ts | 1528 ++++- src/game/drlg/drlg-tables.ts | 25 + src/game/drlg/drlg-types.ts | 174 +- src/game/drlg/drlg-warp.ts | 19 +- src/game/level-links.ts | 13 +- src/game/wilderness.ts | 1875 +----- src/game/wilderness/wilderness-border-data.ts | 5949 ----------------- src/game/wilderness/wilderness-borders.ts | 400 -- src/game/wilderness/wilderness-clusters.ts | 165 - src/game/wilderness/wilderness-presets.ts | 469 -- src/game/wilderness/wilderness-river.ts | 188 - src/game/wilderness/wilderness-roads.ts | 144 - src/game/wilderness/wilderness-tables.ts | 283 - src/game/wilderness/wilderness-topology.ts | 106 - src/game/world-graph.ts | 8 +- src/game/world-placement.ts | 9 +- src/scene/act-scene.ts | 148 +- ...dversarial-world-placement-m3-gen2.test.ts | 2 +- .../challenger-m4-determinism-parity.test.ts | 14 +- tests/challenger-m4-stress.test.ts | 100 +- tests/drlg-act1-invariants.test.ts | 332 + tests/drlg-act1-oracle.test.ts | 120 +- tests/drlg-alias-guard.test.ts | 14 +- .../d2moo-oracle/act1-seed-12345678.json.gz | Bin 99687 -> 663749 bytes .../d2moo-oracle/act1-seed-5eed0100.json.gz | Bin 99349 -> 659421 bytes .../d2moo-oracle/act1-seed-5eed0101.json.gz | Bin 99975 -> 660623 bytes .../d2moo-oracle/act1-seed-5eed0102.json.gz | Bin 95529 -> 646747 bytes tests/input-controls.test.ts | 9 +- tests/shadow-rendering.test.ts | 19 +- tests/stress-world-placement.test.ts | 3 +- tests/wilderness-d2moo-parity.test.ts | 728 -- tests/wilderness-features.test.ts | 194 +- tests/wilderness-ground-blend.test.ts | 430 +- tests/wilderness-population.test.ts | 207 +- tests/wilderness-reachability-stress.test.ts | 675 -- tests/wilderness-roads-multi-act.test.ts | 56 +- tests/wilderness-roads.test.ts | 239 - tests/wilderness-seams.test.ts | 181 +- tests/wilderness-seed-sensitivity.test.ts | 63 +- tests/wilderness-spline-roads.test.ts | 252 +- tests/wilderness-stress-fuzz.test.ts | 480 -- tests/wilderness-superuniques.test.ts | 109 +- tests/wilderness-telemetry.test.ts | 41 +- tests/wilderness-waypoints-shrines.test.ts | 30 +- tools/d2moo-oracle/README.md | 62 +- tools/d2moo-oracle/build.sh | 22 +- tools/d2moo-oracle/src/main.cpp | 330 +- tools/d2moo-oracle/src/oracle.h | 6 + tools/d2moo-oracle/src/stubs.cpp | 42 +- tsconfig.json | 6 +- 73 files changed, 7109 insertions(+), 15488 deletions(-) create mode 100644 scripts/audit-levels-browser.ts create mode 100644 scripts/drlg-fixtures.ts create mode 100644 scripts/lib/drlg-mpq-source.ts create mode 100644 scripts/render-drlg-compare.ts delete mode 100644 scripts/render-new-ts-blood-moor.ts create mode 100644 src/game/act-variants.ts delete mode 100644 src/game/drlg/adapter.ts create mode 100644 src/game/drlg/drlg-logic.ts create mode 100644 src/game/drlg/drlg-map.ts create mode 100644 src/game/drlg/drlg-outroom.ts delete mode 100644 src/game/wilderness/wilderness-border-data.ts delete mode 100644 src/game/wilderness/wilderness-borders.ts delete mode 100644 src/game/wilderness/wilderness-clusters.ts delete mode 100644 src/game/wilderness/wilderness-presets.ts delete mode 100644 src/game/wilderness/wilderness-river.ts delete mode 100644 src/game/wilderness/wilderness-roads.ts delete mode 100644 src/game/wilderness/wilderness-tables.ts delete mode 100644 src/game/wilderness/wilderness-topology.ts create mode 100644 tests/drlg-act1-invariants.test.ts delete mode 100644 tests/wilderness-d2moo-parity.test.ts delete mode 100644 tests/wilderness-reachability-stress.test.ts delete mode 100644 tests/wilderness-roads.test.ts delete mode 100644 tests/wilderness-stress-fuzz.test.ts diff --git a/scripts/audit-levels-browser.ts b/scripts/audit-levels-browser.ts new file mode 100644 index 0000000..6e09904 --- /dev/null +++ b/scripts/audit-levels-browser.ts @@ -0,0 +1,805 @@ +/** + * Headless browser audit of every baked level: all 136 Levels.txt ids, every copy the pack holds. + * + * Each index entry is opened as `acts.html?act=&level=