Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
756ee4f64a | ||
|
|
ccc01396cd | ||
|
|
c7e8163790 | ||
|
|
c3f8a69b51 | ||
|
|
197a64117c | ||
|
|
ed0d2fea3d | ||
|
|
b417b7c3c3 | ||
|
|
361734bc41 | ||
|
|
03a4e3f51c | ||
|
|
40d9f346d8 | ||
|
|
46c272f889 | ||
|
|
05b25c4341 |
No files matched your search
@@ -139,6 +139,8 @@ public class ThorDualScreenPlugin extends Plugin implements DisplayManager.Displ
|
||||
if (forceEnabled) scheduleEnsurePresentation(300L);
|
||||
});
|
||||
presentation.show();
|
||||
bridge.getWebView().getSettings().setUseWideViewPort(true);
|
||||
bridge.getWebView().getSettings().setLoadWithOverviewMode(true);
|
||||
bridge.getWebView().loadUrl(currentUrl);
|
||||
}
|
||||
|
||||
@@ -279,6 +281,8 @@ public class ThorDualScreenPlugin extends Plugin implements DisplayManager.Displ
|
||||
WebSettings settings = webView.getSettings();
|
||||
settings.setJavaScriptEnabled(true);
|
||||
settings.setDomStorageEnabled(true);
|
||||
settings.setUseWideViewPort(true);
|
||||
settings.setLoadWithOverviewMode(true);
|
||||
settings.setDatabaseEnabled(true);
|
||||
settings.setMediaPlaybackRequiresUserGesture(false);
|
||||
settings.setAllowFileAccess(true);
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
# WoW dungeon atlas
|
||||
|
||||
Press **M** in a loaded WoW dungeon to open its original game map. The atlas
|
||||
shows a white player marker with camera direction, a green entrance, and gold
|
||||
numbered encounter markers. Patrol routes are optional. The minimap and companion
|
||||
map use the same artwork and coordinate projection.
|
||||
|
||||
Multi-floor dungeons have a floor selector. Auto chooses the smallest containing
|
||||
map rectangle; it is a horizontal best fit, not the WoW client's WMO-group floor
|
||||
detection. Select a floor manually when stacked rooms overlap. Coordinates outside
|
||||
the selected floor are not clamped to a misleading marker at the map edge.
|
||||
|
||||
The current import includes 51 standard WoW dungeons and 107 unique map images. The
|
||||
custom Tinkertech Showdown, Frozen Reach, and Forgotten Mine have no matching map
|
||||
records in the supplied archives and retain their survey maps. RuneWaker maps are
|
||||
unchanged. Missing images also fall back to the survey projection.
|
||||
|
||||
## Reimporting
|
||||
|
||||
Run `npm run dungeon:maps:import` from the HealerMan project root. An optional
|
||||
archive argument replaces the default `../downloads/patch-enUS-M.MPQ`.
|
||||
`WOW_CLIENT_ROOT` supplies the client archives for original Wrath map tiles;
|
||||
`WOW_DUNGEON_WORK_ROOT` supplies runtime drafts for alignment checks. Defaults
|
||||
are `../wow335a` and `../HealerMan-Storage/pipeline-work/dungeons`.
|
||||
|
||||
The importer reads the patch and client archives without modifying them. It
|
||||
decodes BLP2 tiles into cropped 1002x668 PNGs, reads WorldMapArea/DungeonMap bounds,
|
||||
and inverts the reviewed scene coordinate mapper, including shifted ADT packages
|
||||
and rotated global WMOs. It verifies alignment against imported creature spawns
|
||||
or the source entrance for an event-driven arena without static actors.
|
||||
Wailing Caverns retains its authored coordinate convention.
|
||||
|
||||
Images live in `public/assets/game/dungeons/<id>/maps/`, so existing dungeon
|
||||
content-pack rules include them. Runtime metadata is generated in
|
||||
`src/game/generated/wowDungeonMaps.generated.json`; provenance and coverage are in
|
||||
`dungeon-pipeline/WOW_DUNGEON_MAP_REPORT.json`. Changes to environment checksums or
|
||||
coordinate conventions require reimporting. Mapster is a Lua WoW-client addon;
|
||||
HealerMan does not execute or install it.
|
||||
|
||||
After reimporting, run `npm run content:publish` to update the local downloadable
|
||||
content catalog and `npm run build` to refresh the bundled Wailing Caverns atlas.
|
||||
Those commands prepare local artifacts; they do not deploy the online game.
|
||||
|
||||
## Verification
|
||||
|
||||
Run `npm test -- --run src/game/wowDungeonMap.test.ts src/ui/DungeonMapGraphic.test.ts src/ui/MapPanel.test.ts`
|
||||
and `node --test scripts/lib/wow-map-image.test.mjs`. Visual evidence and observed
|
||||
limitations are recorded in `PLAYTEST_NOTES.md`.
|
||||
@@ -0,0 +1,388 @@
|
||||
{
|
||||
"source": "patch-enUS-M.MPQ",
|
||||
"sourceSha256": "b69713077e19498d20efa5eeaefdba98850764db6bdc99e292bfbdf7b1c858d6",
|
||||
"imported": [
|
||||
{
|
||||
"id": "shadowfang-keep",
|
||||
"floors": 7,
|
||||
"checkedSpawns": 109,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "stormwind-stockade",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 93,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004000000000026205
|
||||
},
|
||||
{
|
||||
"id": "deadmines",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 179,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00005830951894693099
|
||||
},
|
||||
{
|
||||
"id": "wailing-caverns",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 251,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.188595526192965
|
||||
},
|
||||
{
|
||||
"id": "razorfen-kraul",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 179,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00006573939954203296
|
||||
},
|
||||
{
|
||||
"id": "blackfathom-deeps",
|
||||
"floors": 3,
|
||||
"checkedSpawns": 201,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "uldaman",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 302,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "gnomeregan",
|
||||
"floors": 4,
|
||||
"checkedSpawns": 371,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "sunken-temple",
|
||||
"floors": 3,
|
||||
"checkedSpawns": 244,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "razorfen-downs",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 192,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 5.084354071042896e-13
|
||||
},
|
||||
{
|
||||
"id": "scarlet-monastery",
|
||||
"floors": 4,
|
||||
"checkedSpawns": 310,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "zulfarrak",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 251,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "blackrock-spire",
|
||||
"floors": 7,
|
||||
"checkedSpawns": 565,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "blackrock-depths",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 1040,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "scholomance",
|
||||
"floors": 4,
|
||||
"checkedSpawns": 327,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00009095950916596921
|
||||
},
|
||||
{
|
||||
"id": "stratholme",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 430,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 9.096057172999542e-13
|
||||
},
|
||||
{
|
||||
"id": "maraudon",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 525,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "ragefire-chasm",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 127,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "dire-maul",
|
||||
"floors": 6,
|
||||
"checkedSpawns": 755,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00006403124240144967
|
||||
},
|
||||
{
|
||||
"id": "shattered-halls",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 198,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00006403124237426248
|
||||
},
|
||||
{
|
||||
"id": "blood-furnace",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 139,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00006403124237384636
|
||||
},
|
||||
{
|
||||
"id": "hellfire-ramparts",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 85,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00006753673068807912
|
||||
},
|
||||
{
|
||||
"id": "steamvault",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 127,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "underbog",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 161,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.0000617170964964256
|
||||
},
|
||||
{
|
||||
"id": "slave-pens",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 122,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.0000640312423744012
|
||||
},
|
||||
{
|
||||
"id": "arcatraz",
|
||||
"floors": 3,
|
||||
"checkedSpawns": 84,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "botanica",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 171,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00006403124237384636
|
||||
},
|
||||
{
|
||||
"id": "mechanar",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 84,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.000046699999999996744
|
||||
},
|
||||
{
|
||||
"id": "shadow-labyrinth",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 189,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00006403124237426248
|
||||
},
|
||||
{
|
||||
"id": "sethekk-halls",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 104,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00005324368507145524
|
||||
},
|
||||
{
|
||||
"id": "mana-tombs",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 119,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.000056568542495137386
|
||||
},
|
||||
{
|
||||
"id": "auchenai-crypts",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 93,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00005415025392387915
|
||||
},
|
||||
{
|
||||
"id": "magisters-terrace",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 147,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00007071067811848996
|
||||
},
|
||||
{
|
||||
"id": "black-morass",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 134,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "escape-from-durnholde",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 380,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "utgarde-keep",
|
||||
"floors": 3,
|
||||
"checkedSpawns": 112,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004700000000001925
|
||||
},
|
||||
{
|
||||
"id": "utgarde-pinnacle",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 83,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "the-nexus",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 234,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "the-oculus",
|
||||
"floors": 5,
|
||||
"checkedSpawns": 112,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "culling-of-stratholme",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 209,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "halls-of-stone",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 76,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "draktharon-keep",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 99,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "azjol-nerub",
|
||||
"floors": 3,
|
||||
"checkedSpawns": 70,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "halls-of-lightning",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 112,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "gundrak",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 85,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "violet-hold",
|
||||
"floors": 2,
|
||||
"checkedSpawns": 8,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "ahnkahet-old-kingdom",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 133,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004999999999988347
|
||||
},
|
||||
{
|
||||
"id": "forge-of-souls",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 41,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "trial-of-the-champion",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 0,
|
||||
"checkedEntrances": 1,
|
||||
"maxAlignmentError": 0
|
||||
},
|
||||
{
|
||||
"id": "pit-of-saron",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 167,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0.00004000000000026205
|
||||
},
|
||||
{
|
||||
"id": "halls-of-reflection",
|
||||
"floors": 1,
|
||||
"checkedSpawns": 13,
|
||||
"checkedEntrances": 0,
|
||||
"maxAlignmentError": 0
|
||||
}
|
||||
],
|
||||
"skipped": [
|
||||
{
|
||||
"id": "tinkertech-showdown",
|
||||
"reason": "No matching WorldMapArea record"
|
||||
},
|
||||
{
|
||||
"id": "frozen-reach",
|
||||
"reason": "No matching WorldMapArea record"
|
||||
},
|
||||
{
|
||||
"id": "forgotten-mine",
|
||||
"reason": "No matching WorldMapArea record"
|
||||
}
|
||||
],
|
||||
"coordinateSources": [
|
||||
"WorldMapArea.dbc",
|
||||
"DungeonMap.dbc"
|
||||
],
|
||||
"layoutSource": "https://github.com/wowgaming/3.3.5-interface-files/blob/main/WorldMapFrame.xml",
|
||||
"archives": [
|
||||
"patch-enUS-M.MPQ",
|
||||
"patch-enUS-3.MPQ",
|
||||
"patch-enUS.MPQ",
|
||||
"patch-enUS-2.MPQ"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
# WoW dungeon lighting and stair review - 2026-09-13
|
||||
|
||||
## Implemented coverage
|
||||
|
||||
All 54 campaign WoW dungeons now receive environment-specific lighting using
|
||||
Stockades' reviewed ambient/hemisphere fill as the baseline. Stone, cavern,
|
||||
fire, arcane, crypt, and outdoor profiles preserve atmosphere without applying
|
||||
the old dark expansion palettes. Stockades' existing presentation and three
|
||||
reviewed stair proxies remain unchanged. RuneWaker environments are excluded.
|
||||
|
||||
The fleet scan produced 347 additional collision-verified walking proxies in
|
||||
22 dungeons, and eight filled Recast boundary bridges in Uldaman. This makes
|
||||
350 walking proxies including the three existing Stockades flights. Visual
|
||||
stairs remain steps: source visual/collision/navigation GLBs were not modified.
|
||||
The shared prepared collision is used by players, companions, and enemies.
|
||||
|
||||
| Dungeon | Additional walking proxies | Additional navigation bridges |
|
||||
| --- | ---: | ---: |
|
||||
| Shadowfang Keep | 41 | 0 |
|
||||
| Blackfathom Deeps | 5 | 0 |
|
||||
| Uldaman | 5 | 8 |
|
||||
| Gnomeregan | 4 | 0 |
|
||||
| Sunken Temple | 2 | 0 |
|
||||
| Scarlet Monastery | 37 | 0 |
|
||||
| Zul'Farrak | 1 | 0 |
|
||||
| Scholomance | 36 | 0 |
|
||||
| Stratholme | 12 | 0 |
|
||||
| Blood Furnace | 1 | 0 |
|
||||
| Shadow Labyrinth | 1 | 0 |
|
||||
| Mana-Tombs | 3 | 0 |
|
||||
| Auchenai Crypts | 5 | 0 |
|
||||
| Magister's Terrace | 10 | 0 |
|
||||
| Escape From Durnholde | 120 | 0 |
|
||||
| Utgarde Keep | 8 | 0 |
|
||||
| Utgarde Pinnacle | 32 | 0 |
|
||||
| Culling of Stratholme | 11 | 0 |
|
||||
| Halls of Stone | 2 | 0 |
|
||||
| Halls of Lightning | 1 | 0 |
|
||||
| Pit of Saron | 1 | 0 |
|
||||
| Halls of Reflection | 9 | 0 |
|
||||
|
||||
The machine-readable `src/game/generated/wowDungeonStairs.generated.json`
|
||||
records a scan for every WoW dungeon, including entries with no accepted new
|
||||
proxy, collision package identities, candidate/rejection counts, and exact
|
||||
navigation portals. Authored Wailing Caverns is scanned against its actual
|
||||
source assets, rather than the campaign's separate canonical package.
|
||||
|
||||
## Safety and verification
|
||||
|
||||
- Require repeated short risers with consistent rise/run and overlapping width.
|
||||
- Merge compatible continuous flights; independently verify short fallbacks
|
||||
when a merged flight is unsafe.
|
||||
- Rebuild after rejected proxies are removed, so accepted paths do not depend
|
||||
on rejected geometry edits.
|
||||
- Check real terrain support and capsule sweeps uphill/downhill along the center
|
||||
and two interior lateral lanes at approximately 0.35m intervals.
|
||||
- Fill only separate existing boundary portals wholly within a verified flight.
|
||||
Do not invent off-mesh links across unrelated floors or walls.
|
||||
- Gate generated coordinates by collision package URL/checksum identity, and
|
||||
navigation identity where exact portal bridges are present.
|
||||
- Keep existing validation/availability gates unchanged. Stair checks do not
|
||||
certify boss routes, encounters, resets, checkpoints, or complete runs.
|
||||
- Spatially index ramp footprints during preparation to avoid checking every
|
||||
ramp against every vertex in large, multi-chunk environments.
|
||||
|
||||
The shipping-asset regression tests independently exercise all 347 new proxies
|
||||
through `prepareCollision` and the live NPC direct-segment validator in both
|
||||
directions and all three tested lanes. All generated portals match the actual
|
||||
shipping navigation vertices. Existing Stockades player/NPC/wall regressions pass.
|
||||
|
||||
Full validation: 247 Vitest files passed, 1,599 tests passed, six existing tests
|
||||
skipped. Production TypeScript/Vite build, texture/performance audits, bundle
|
||||
compression/verification, and release candidate checking passed. Existing
|
||||
physics initialization and bundle-size/import advisories remain.
|
||||
|
||||
## Visual evidence and remaining QA
|
||||
|
||||
The local visual viewer uses the runtime definitions/material policy, shipped
|
||||
GLBs, Meshopt/KTX2 decoding, ACES tone mapping, and 1280x720 screenshots. It does
|
||||
not modify saved characters or party state. Evidence is under
|
||||
`artifacts/wow-dungeon-environment/` (ignored QA artifacts).
|
||||
|
||||
Uldaman's new/old-fill comparison shows clearer stone walls, columns, and floor
|
||||
tiles. Wailing Caverns retains green coloration with readable rock formations.
|
||||
Mechanar retains cool purple/blue interiors and unchanged visible steps.
|
||||
Scholomance's entrance stairs and masonry remain visible with the crypt profile.
|
||||
Blood Furnace's dark source textures remain atmospheric; the entrance viewpoint
|
||||
faces a nearby wall, so this is not a full-room traversal review.
|
||||
|
||||
Zul'Farrak showed a geometry/viewpoint gap in the standalone entrance and boss
|
||||
views. Do not treat its lighting profile or passing isolated proxy sweep as an
|
||||
end-to-end visual/playability pass. Durnholde's large package completed loading
|
||||
without console errors; its cavern entrance and outdoor fort masonry/trees were
|
||||
readable, but the boss viewpoint also showed missing terrain/viewpoint coverage.
|
||||
That environment needs a separate terrain/spawn review and live traversal check.
|
||||
|
||||
This is not an exhaustive certification that every staircase is repaired.
|
||||
Conservative repeated-riser detection can miss curved flights, one/two-step
|
||||
transitions, and heavily decimated source geometry. A rejected candidate may be
|
||||
decorative, lack headroom/ground, or require an individually reviewed footprint.
|
||||
An entry with no new proxy is not proof that it contains no stairs. Full-dungeon
|
||||
actor traversal, entrance/exit lips, outer stair edges, manual review of rejected
|
||||
or undetected flights, full clears, and physical Android QA remain open.
|
||||
|
||||
## Repeating the checks
|
||||
|
||||
Requires the project's Node 24 runtime for native TypeScript pipeline execution.
|
||||
|
||||
```text
|
||||
npm run dungeon:wow:stairs:audit
|
||||
npm run dungeon:wow:stairs:refresh
|
||||
npm run dungeon:wow:stairs:audit -- scholomance --diagnostics
|
||||
node scripts/dungeon-pipeline/audit-wow-stairs.ts wailing-caverns --update
|
||||
npm test -- --run src/game/wowDungeonStairAssets.test.ts
|
||||
```
|
||||
|
||||
The audit is read-only by default. Refresh writes the full generated catalog;
|
||||
`--update` replaces only the named entry while retaining the other entries.
|
||||
Campaign regeneration does not erase the runtime lighting/stair adapter.
|
||||
@@ -39,11 +39,11 @@
|
||||
"agentMaxSlope": 50
|
||||
},
|
||||
"review": {
|
||||
"entrance": "required",
|
||||
"entrance": "approved",
|
||||
"bossOrder": "required",
|
||||
"optionalEncounters": "required",
|
||||
"presentation": "required",
|
||||
"offMeshLinks": "required"
|
||||
"presentation": "approved",
|
||||
"offMeshLinks": "approved"
|
||||
},
|
||||
"exceptions": []
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"dungeonId": "stormwind-stockade",
|
||||
"navigationLinks": [
|
||||
{
|
||||
"id": "entrance-to-central-stairs",
|
||||
"start": [-66.674328, -23.150503, 5.501851],
|
||||
"end": [-67.664446, -23.755576, 4.493397],
|
||||
"bidirectional": true,
|
||||
"authoredReason": "Bridges the reviewed 1.537m Recast seam between the source entrance stairs and the central cell block."
|
||||
},
|
||||
{
|
||||
"id": "central-to-north-wing-stairs",
|
||||
"start": [-124.46789, -27.349338, 16.099782],
|
||||
"end": [-125.476344, -27.95441, 17.0899],
|
||||
"bidirectional": true,
|
||||
"authoredReason": "Bridges the reviewed 1.537m Recast seam from the central cell block to the north wing stairs."
|
||||
},
|
||||
{
|
||||
"id": "central-to-south-wing-stairs",
|
||||
"start": [-124.46789, -27.349338, -14.703893],
|
||||
"end": [-125.476344, -27.95441, -15.694011],
|
||||
"bidirectional": true,
|
||||
"authoredReason": "Bridges the reviewed 1.537m Recast seam from the central cell block to the south wing stairs."
|
||||
}
|
||||
],
|
||||
"traversalRamps": [
|
||||
{
|
||||
"id": "entrance-stair-ramp",
|
||||
"start": [-52.8, -18.16, 0.8],
|
||||
"end": [-72.4, -25.609, 0.8],
|
||||
"width": 10.8,
|
||||
"navigationBridge": {
|
||||
"linkId": "entrance-to-central-stairs",
|
||||
"startPortal": [[-66.674328, -23.150503, -3.904271], [-66.674328, -23.150503, 5.501851]],
|
||||
"endPortal": [[-67.664446, -23.755576, -2.895818], [-67.664446, -23.755576, 4.493397]]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "north-wing-stair-ramp",
|
||||
"start": [-129.17, -25.609, 11.7],
|
||||
"end": [-129.17, -33.944, 32.85],
|
||||
"width": 10.8,
|
||||
"navigationBridge": {
|
||||
"linkId": "central-to-north-wing-stairs",
|
||||
"startPortal": [[-133.878601, -27.349338, 16.099782], [-124.46789, -27.349338, 16.099782]],
|
||||
"endPortal": [[-132.668457, -27.95441, 17.0899], [-125.476344, -27.95441, 17.0899]]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "south-wing-stair-ramp",
|
||||
"start": [-129.17, -25.609, -10.3],
|
||||
"end": [-129.17, -33.944, -31.45],
|
||||
"width": 10.8,
|
||||
"navigationBridge": {
|
||||
"linkId": "central-to-south-wing-stairs",
|
||||
"startPortal": [[-133.878601, -27.349338, -14.703893], [-124.46789, -27.349338, -14.703893]],
|
||||
"endPortal": [[-132.668457, -27.95441, -15.694011], [-125.476344, -27.95441, -15.694011]]
|
||||
}
|
||||
}
|
||||
],
|
||||
"presentation": {
|
||||
"background": "#171815",
|
||||
"fog": {
|
||||
"color": "#1b1c18",
|
||||
"near": 44
|
||||
},
|
||||
"ambientLight": {
|
||||
"color": "#d8c9aa",
|
||||
"intensity": 0.58
|
||||
},
|
||||
"hemisphereLight": {
|
||||
"skyColor": "#cfc3a5",
|
||||
"groundColor": "#292820",
|
||||
"intensity": 0.86
|
||||
},
|
||||
"directionalLight": {
|
||||
"color": "#ffe0a8",
|
||||
"intensity": 1.1,
|
||||
"offset": [10, 18, -5]
|
||||
}
|
||||
},
|
||||
"validation": {
|
||||
"navigation": "green",
|
||||
"report": "PLAYTEST_NOTES.md",
|
||||
"warnings": [
|
||||
"Three reviewed smooth stair collision proxies and filled navigation bridges connect the entrance, central block, and both prison wings; minor decorative navmesh islands remain intentionally discarded.",
|
||||
"Stockades uses a dungeon-specific warm indoor lighting profile because the imported WMO has no baked lightmap or vertex-lighting channel."
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "healer-man",
|
||||
"version": "0.1.32",
|
||||
"version": "0.1.44",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "healer-man",
|
||||
"version": "0.1.32",
|
||||
"version": "0.1.44",
|
||||
"dependencies": {
|
||||
"@capacitor/android": "8.4.1",
|
||||
"@capacitor/core": "8.4.1",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "healer-man",
|
||||
"private": true,
|
||||
"version": "0.1.32",
|
||||
"version": "0.1.44",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite --host 0.0.0.0",
|
||||
@@ -45,6 +45,7 @@
|
||||
"dungeon:epoch:sync": "node scripts/dungeon-pipeline/sync-epoch-dungeons.mjs",
|
||||
"dungeon:source:azerothcore": "node scripts/dungeon-pipeline/import-azerothcore-world.mjs",
|
||||
"dungeon:catalog": "node scripts/dungeon-pipeline/compile-campaign-catalog.mjs",
|
||||
"dungeon:maps:import": "node scripts/dungeon-pipeline/import-wow-maps.mjs",
|
||||
"dungeon:canonicalize-environments": "node scripts/dungeon-pipeline/relink-canonical-environments.mjs",
|
||||
"dungeon:dedupe-creatures": "node scripts/dungeon-pipeline/dedupe-shared-creatures.mjs",
|
||||
"dungeon:test-creature-animation-policy": "node --test scripts/dungeon-pipeline/runtime-creature-animations.test.mjs",
|
||||
@@ -56,6 +57,8 @@
|
||||
"dungeon:five-player:verify": "node scripts/dungeon-pipeline/verify-five-player-dungeon-imports.mjs",
|
||||
"dungeon:wow:audit": "vite-node scripts/dungeon-pipeline/audit-wow-dungeon-content.mjs",
|
||||
"dungeon:wow:functionality:audit": "vite-node scripts/dungeon-pipeline/audit-wow-dungeon-functionality.ts",
|
||||
"dungeon:wow:stairs:audit": "node --max-old-space-size=8192 scripts/dungeon-pipeline/audit-wow-stairs.ts",
|
||||
"dungeon:wow:stairs:refresh": "node --max-old-space-size=8192 scripts/dungeon-pipeline/audit-wow-stairs.ts --write",
|
||||
"dungeon:wow:test": "vitest run src/game/wowDungeonContent.test.ts",
|
||||
"dungeon:wow:export-tool:test": "node --test scripts/dungeon-pipeline/wow-export-tool.test.mjs",
|
||||
"dungeon:ascension:recovery:validate": "node scripts/dungeon-pipeline/validate-ascension-custom-dungeon-recovery.mjs --skip-dbc",
|
||||
|
||||
|
After Width: | Height: | Size: 772 KiB |
|
After Width: | Height: | Size: 768 KiB |
|
After Width: | Height: | Size: 762 KiB |
|
After Width: | Height: | Size: 769 KiB |
|
After Width: | Height: | Size: 766 KiB |
|
After Width: | Height: | Size: 769 KiB |
|
After Width: | Height: | Size: 747 KiB |
|
After Width: | Height: | Size: 764 KiB |
|
After Width: | Height: | Size: 759 KiB |
|
After Width: | Height: | Size: 788 KiB |
|
After Width: | Height: | Size: 764 KiB |
|
After Width: | Height: | Size: 753 KiB |
|
After Width: | Height: | Size: 746 KiB |
|
After Width: | Height: | Size: 750 KiB |
|
After Width: | Height: | Size: 756 KiB |
|
After Width: | Height: | Size: 735 KiB |
|
After Width: | Height: | Size: 729 KiB |
|
After Width: | Height: | Size: 730 KiB |
|
After Width: | Height: | Size: 735 KiB |
|
After Width: | Height: | Size: 735 KiB |
|
After Width: | Height: | Size: 734 KiB |
|
After Width: | Height: | Size: 739 KiB |
|
After Width: | Height: | Size: 766 KiB |
|
After Width: | Height: | Size: 769 KiB |
|
After Width: | Height: | Size: 773 KiB |
|
After Width: | Height: | Size: 782 KiB |
|
After Width: | Height: | Size: 751 KiB |
|
After Width: | Height: | Size: 772 KiB |
|
After Width: | Height: | Size: 751 KiB |
|
After Width: | Height: | Size: 737 KiB |
|
After Width: | Height: | Size: 741 KiB |
|
After Width: | Height: | Size: 743 KiB |
|
After Width: | Height: | Size: 736 KiB |
|
After Width: | Height: | Size: 745 KiB |
|
After Width: | Height: | Size: 776 KiB |
|
After Width: | Height: | Size: 754 KiB |
|
After Width: | Height: | Size: 798 KiB |
|
After Width: | Height: | Size: 794 KiB |
|
After Width: | Height: | Size: 747 KiB |
|
After Width: | Height: | Size: 751 KiB |
|
After Width: | Height: | Size: 747 KiB |
|
After Width: | Height: | Size: 757 KiB |
|
After Width: | Height: | Size: 778 KiB |
|
After Width: | Height: | Size: 781 KiB |
|
After Width: | Height: | Size: 749 KiB |
|
After Width: | Height: | Size: 759 KiB |
|
After Width: | Height: | Size: 780 KiB |
|
After Width: | Height: | Size: 764 KiB |
|
After Width: | Height: | Size: 765 KiB |
|
After Width: | Height: | Size: 773 KiB |
|
After Width: | Height: | Size: 783 KiB |
|
After Width: | Height: | Size: 773 KiB |
|
After Width: | Height: | Size: 756 KiB |
|
After Width: | Height: | Size: 756 KiB |
|
After Width: | Height: | Size: 761 KiB |
|
After Width: | Height: | Size: 747 KiB |
|
After Width: | Height: | Size: 781 KiB |
|
After Width: | Height: | Size: 756 KiB |
|
After Width: | Height: | Size: 751 KiB |
|
After Width: | Height: | Size: 746 KiB |
|
After Width: | Height: | Size: 748 KiB |
|
After Width: | Height: | Size: 750 KiB |
|
After Width: | Height: | Size: 751 KiB |
|
After Width: | Height: | Size: 752 KiB |
|
After Width: | Height: | Size: 724 KiB |
|
After Width: | Height: | Size: 740 KiB |
|
After Width: | Height: | Size: 746 KiB |
|
After Width: | Height: | Size: 745 KiB |
|
After Width: | Height: | Size: 774 KiB |
|
After Width: | Height: | Size: 767 KiB |
|
After Width: | Height: | Size: 765 KiB |
|
After Width: | Height: | Size: 761 KiB |
|
After Width: | Height: | Size: 755 KiB |
|
After Width: | Height: | Size: 750 KiB |
|
After Width: | Height: | Size: 749 KiB |
|
After Width: | Height: | Size: 746 KiB |
|
After Width: | Height: | Size: 757 KiB |
|
After Width: | Height: | Size: 749 KiB |
|
After Width: | Height: | Size: 766 KiB |
|
After Width: | Height: | Size: 777 KiB |
|
After Width: | Height: | Size: 771 KiB |
|
After Width: | Height: | Size: 754 KiB |
|
After Width: | Height: | Size: 751 KiB |
|
After Width: | Height: | Size: 764 KiB |
|
After Width: | Height: | Size: 769 KiB |
|
After Width: | Height: | Size: 758 KiB |
|
After Width: | Height: | Size: 797 KiB |
|
After Width: | Height: | Size: 804 KiB |
|
After Width: | Height: | Size: 820 KiB |
|
After Width: | Height: | Size: 835 KiB |
|
After Width: | Height: | Size: 815 KiB |