Compare commits

...
4 Commits
Author SHA1 Message Date
phenom c3f8a69b51 Release Healer Man 0.1.41 2026-09-13 15:09:35 -04:00
phenom 197a64117c Release Healer Man 0.1.40 2026-09-13 13:21:27 -04:00
phenom ed0d2fea3d Release Healer Man 0.1.39 2026-09-13 11:07:56 -04:00
phenom b417b7c3c3 Release Healer Man 0.1.38 2026-09-12 23:55:24 -04:00
279 changed files with 25715 additions and 352 deletions

No files matched your search

+558
View File
@@ -2558,3 +2558,561 @@ Vite's existing large-chunk advisory remains informational.
checks passed. Browser error logs were empty. Physical Thor hardware and a
multiplayer session were not exercised; the new per-party totals consume
this client's combat stream. No hosted release was published.
## Player-only revival during ongoing party combat — September 12, 2026
- In normal offline dungeons, a defeated player with living companions and an
engaged, living enemy can revive at the entrance or an unlocked boss checkpoint
without resetting the pull or relocating/restoring companions. The player-only
path advances the relocation revision, not the party or encounter reset signals.
Recall remains an explicit, optional command. Full-wipe recovery is unchanged;
Manastorm's shared-charge resurrection remains separate.
- Player recovery restores health/resources, clears corpse animation, casts,
control, shields, harmful player auras, and player-targeted periodic effects.
It preserves NPC/enemy actor snapshots, positions, health, targets, casts,
periodic effects on other actors, and ongoing cooldowns. The existing checkpoint
chooser is retained; its defeat-prompt copy explains that companions keep fighting.
- Nine dedicated regressions cover trash/boss combat, selected checkpoints,
unchanged companion/enemy snapshots and Recall revisions, continued simulation,
periodic-effect isolation, full-wipe fallback, canonical actor health, and invalid
requests. A prompt-rendering regression checks the optional-Recall explanation.
Final Vitest validation passed 239 files and 1,511 tests, with six existing skips.
Test fixtures use a fixed combat clock and respect surviving crowd-control timers.
- Localhost Stockades smoke testing at 1280x720 showed the rendered dungeon,
party frames, unchanged Recall control, and an active party fight with increasing
damage and declining tank health. Session screenshots captured the entrance and
combat HUD. Startup navigation initially timed out and recovered after reload;
browser error logs were empty after recovery. A live player-death/mid-fight
checkpoint-revival replay was not achieved, so spatial proof of that exact
sequence is not claimed. Multiplayer and physical Thor hardware were not tested.
- Production TypeScript/Vite compilation, static compression, release-bundle
verification, and prebuild texture/performance audits passed. Existing chunk
advisories remain. No hosted release was published. Character rendering,
camera/input, dungeon geometry, lighting, and unrelated in-progress party damage
changes were not edited for this request.
## RoM dungeon entry and level-up crash — September 12, 2026
- Reproduced in the local PC browser with an offline RoM Human Priest. Stockades
loaded at level 1, then the first level-up unmounted the entire app. The console
recorded `Unsupported party specialization: rom-champion:Primary` from
`partyStore.syncLevel` through `PartyBridge`. Initial party creation already
skipped WoW talents for RoM classes; level synchronization did not. The same
call also runs during entry when the saved character level replaces the
previous combat level.
- Level synchronization now retains empty, frozen talent ranks for RoM
companions, matching party creation. Other classes still receive their
existing talent plans. Two regressions failed with the original exception
before the fix, then passed. They cover all ten RoM companion classes, all
three player roles, levels 1/2/10/70 and downward synchronization, stable
identities, fallen companions, and living health/resource ratios.
- After reload, the same saved level 2 Priest entered Stockades successfully,
fought with the RoM party, and reached level 3 without losing the scene. The
same character then entered Forsaken Abbey and progressed from level 3 to 6.
At the 74-second check after Attack, the scene and HUD remained present,
combat continued, and the renderer reported about 60 FPS. No new browser
errors or context-loss messages appeared. Rapier initialization and multiple
active KTX2-loader warnings occurred during these development sessions.
- Screenshots and timestamped browser evidence are in
`artifacts/rom-dungeon-level-sync/`. Screenshot capture retained the browser
backend's existing scaling issue; DOM progression and renderer counters
supplemented the rendered dungeon/body/equipment checks. This was an offline
PC smoke test, not full dungeon completion, multiplayer, or physical Android
validation. The temporary desktop viewport was restored and test tab closed.
- All 54 focused party, talent-plan, and RoM combat tests passed. The production
TypeScript/Vite build, prebuild texture/performance audits, compression, and
release-bundle verification passed with existing chunk advisories. The final
release-candidate check includes untracked changes. No hosted release was
published. Existing combat, death/respawn, AI, and HUD work was preserved.
## NPC party damage — September 12, 2026
- Reproduced Garrick, Arms, and Fury dealing zero damage in level 5/20
sustained fights: Rage starts at zero, companion Rage regeneration is
disabled, and the ability loop had no regular weapon swings. Priests,
hunters, and warlocks also dealt zero because they repeatedly refreshed
their DoTs before the first tick could fire.
- Added independent weapon swings for melee companions and hunters, with
Rage earned from successful hits. Swings respect range, visibility, line
of sight, facing, control, casting, rejoining, and party orders. Maintained
DoTs and debuffs now allow other abilities to run between applications;
utility taunts/interrupts/control require a useful combat context.
- Self-centered area attacks now validate their radius and hit around the
caster. Companion direct and periodic amounts use the existing spell
scaling calculation, including spell base damage and equipment bonuses.
- The new audit runs 30-second fights for all 26 WoW party templates at
levels 1, 3, 5, 20, and 80. Every template produces positive damage from
actual abilities, beyond weapon swings, with resources within bounds.
Separate regressions cover zero-Rage short pulls, swings during the GCD,
Stop, Thunder Clap targeting, and zero-coefficient spell base damage.
- In an offline PC Stockades run, the saved level 3 Priest commanded Attack
without player attacks. Garrick dealt 6 damage in the first three seconds
and 80 damage by approximately 20 seconds; Kael dealt 147, Korra 220, and
Ash 146 at that check. The party defeated enemies and the player reached
level 4. The saved party's Garrick is a Tauren; the class/role fix also
applies to Dwarf Garrick. This was a PC combat smoke test, not physical
Thor, multiplayer, or a full dungeon completion test.
- `artifacts/npc-damage/stockades-warrior-damage.png` shows the rendered
dungeon, player body/equipment, and active DPS rows for both warriors.
A paused accessibility snapshot records totals. No browser errors were
reported. The temporary browser tab was closed after verification.
- All 310 focused combat, party, death/respawn, and DPS tests passed. The
production build, texture/performance audits, compression, bundle
verification, and release candidate check passed. Existing concurrent
party-level synchronization, death/respawn, catalog, and server changes
were preserved.
## Dungeon release stages and issue reports — September 12, 2026
- The complete 84-dungeon browser now sorts Full Release, Beta, then Alpha,
alphabetically within each stage. Stormwind Stockade is the only Beta;
the other 83 entries are Alpha. WoW/RoM category tabs remain available.
- Dungeon pause menus can submit a nonempty issue comment of up to 500
characters to the shared SQLite report database. Connected guest players
can submit reports too. New reports are stamped Submitted by the server;
comments remain in the form after a failed network request.
- View Reports on the main menu shows all reports, including Closed, by
default. Status and Dungeon filters combine, and Clear filters restores
the complete list. GM accounts can select Submitted, In-Progress,
Testing Fixes, or Closed, use Close report, and reopen closed reports.
The server rejects non-GM updates and stale revisions.
- Dungeon rows with Submitted, In-Progress, or Testing Fixes reports have
an orange border and a top-right open-report count. Closing the final
open report removes both treatments. Counts refresh when opening the
browser, returning to the app, and every 30 seconds while visible.
- A headless Edge browser exercised an actual Stockades entry, its pause
report form, a 500-character submission, whitespace rejection, failed
submission/retry, the shared player report list, all GM status changes,
combined filters, and badge removal. Keyboard Back and controller filter
navigation/GM status changes passed. No browser page errors occurred.
- Visually inspected the form, orange dungeon badge, player report list,
and GM report screens at 1280×800 and 390×844. Long comments wrap and the
mobile report screen has no horizontal overflow. Evidence and the test
result are in `playtest-artifacts/dungeon-reports/`. This validates the
reporting flow; it is not an exhaustive dungeon completion or physical
Android/Thor playtest.
- All 43 focused report, catalog, store, shell, and display tests passed
(five existing shelved-mode tests skipped), along with all 61 server tests.
The 32 party AI/store/sustained-damage checks also passed after preserving
immutable cast metadata across companion channel updates to resolve three
concurrent combat type-check errors. A separate, in-progress expanded
class-damage audit failed its level-1 CoA player case for Witch Doctor
and Sun Cleric; those combat behaviors are outside the reporting change.
- The final production TypeScript/Vite build, prebuild texture/performance
audits, compression, and release-bundle verification passed with existing
chunk advisories. `npm run release:check` passed after a transient Windows
Git crash, including untracked files. No hosted release was published.
## CoA and RoM class damage audit — September 12, 2026
- Ran 342 sustained, 30-second combat scenarios: all 21 CoA classes as player
characters and synthetic NPC slots at levels 1, 2, 4, 9, 20, and 80; all 10
RoM classes in both runtimes at levels 1, 20, and 70; and the actual shipped
RoM companion templates with their assigned roles and starting resources at
those three levels. All scenarios passed. CoA expeditions currently use WoW
companion templates, so the synthetic CoA slots exercise class execution
without implying that a CoA companion roster has been added.
- Found and fixed companion spacing based only on WoW class names. RoM and
CoA casters now use their class metadata and learned offensive spell ranges;
short-range attacks remain reachable. A thrown summon such as Caltrops does
not force an early Witch Hunter away from its melee attacks. Hunter aliases
also use ranged weapon stats and projectile presentations for ranged swings.
- Fixed Dawn Blade's melee classification: a five-yard hunter-archetype attack
previously counted as ranged and could not initiate the player's weapon
swings needed to generate Rage. The companion AI now rejects unlearned CoA
tree entries and resolves the rank actually learned.
- Fixed channel execution in both runtimes. Normal amounts are distributed
across five pulses, while guaranteed periodic trigger payloads fire per
pulse. Radiant Flame's imported periodic damage now happens during the
channel. Focused tests verify five damaging pulses and no duplicate amount
on completion. Conditional proc payloads are not treated as guaranteed hits.
- Corrected the RoM vocation import to use the player's `FixArgTableID = 1`
record, as selected in the source client's level-up calculation. The previous
adjacent table made Champion and Warlock stats grow exponentially; a level-20
Champion weapon hit reached a raw 704 billion damage in the initial audit.
The corrected Champion instead sustained attacks and damaging abilities for
the full test. Source record sentinels and all ten classes' growth bounds are
covered by regression checks; this is a source-table correction, not a balance
multiplier adjustment.
- Corrected tooltip fallback damage on retaliation auras. Drakkari Barrier
stays friendly and deals its authored damage through its damage-taken proc.
The imported first offensive unlocks are Witch Doctor 9, Sun Cleric 4, and
Primalist 2. The player audit requires offensive ability damage once unlocked;
these classes have no learned offensive cast at level 1. Their NPC weapon
attacks deal damage at level 1. This supersedes the preliminary player
failures mentioned in the reporting notes above.
- Live PC check: created the isolated offline test character Romaudit, entered
Forsaken Abbey as a healer, and issued Attack. At 26 seconds the meter showed
Ilyen (Mage) 492 damage, Morgha (Warlock) 370, Veya (Rogue) 217, and Bronn
(Champion tank) 148. All four NPCs dealt damage; visible enemy effects also
confirmed Heavy Bash, Electrocution, Weakening Weave Curse, and Shadowstab.
No player healing was applied during this bounded damage check, and the tank
eventually died. This was not a dungeon-completion test.
- Visually verified the loaded roster body/staff and in-dungeon player
body/staff. The DPS meter remained readable at the PC bottom-left default.
The first attempt used the downloadable shelved preview without its content
server; the final captures use the full bundled development asset set and
recorded no browser errors. No physical Ayn Thor device was tested here.
- Evidence: `artifacts/class-damage-audit/report.json`,
`level-20-damage.csv`, `rom-roster.png`, `rom-dungeon-start.png`,
`rom-party-damage.png`, and `rom-browser-errors.json`. Training-target totals
demonstrate execution and sustained damage; they are not class-balance
rankings or exhaustive coverage of every talent build and dual-class pair.
- All 434 focused combat, party, CoA, RoM, DPS-meter, stat, and avatar tests
passed, along with the native vocation-import regression. The production
TypeScript/Vite build and release-bundle verification passed. The final
release candidate check includes the new tests and generated catalogs.
## RoM dungeon enemy durability — September 13, 2026
- Reproduced Barren Caves' low health with a RoM Priest and the four shipped
companions. Tested 108 combinations: 12 party seeds at levels 1, 2, 4, 8, 9,
20, 40, 70, and 80. The old fallback had 94 health at level 1 and 1,832 at
level 80; kills took 0–1.9 seconds from the first damaging NPC hit.
- Normal RoM dungeons now use a party-health baseline of
`1000 + 100 * enemyLevel + 8 * enemyLevel * enemyLevel`, with authored
creature/boss multipliers applied separately. This is explicit Healer Man
balancing because native RoM creature health tables are not packaged.
Barren Caves' Anglo retains his 7.5 multiplier and one-level advantage.
- Loaded RoM creatures receive the new health when the character levels up.
Re-registration preserves wounds as a health percentage and keeps corpses
dead. Enemy attack damage also rebases on a level change instead of retaining
its original low-level value. Regression checks cover these transitions.
- With the new health, the 108 isolated party-damage pulls lasted 3–17.5
seconds. A separate pull exercised actual enemy attacks and Priest healing
before the enemy died, with all companions surviving. These are opening
pulls with baseline equipment, rather than an audit of every geared build.
- Live PC check at 1280×720: created the offline Human Priest Barrenaudit and
entered Barren Caves as Healer. A level-1 Cave Sand Bug had 1,108 health.
At 10 seconds it still had 374 health, with 734 party damage on the meter.
The completed first fight showed 14 seconds and 1,108 total damage:
Morgha 370, Ilyen 369, Maerwen 289, and Cael 80. Urgent Heal then restored
Maerwen to 407/407 while the next pull was active. No browser errors were
captured during that bounded combat check.
- Concurrent navigation edits triggered development hot reloads around the
playtest; the captures above were taken during uninterrupted combat. This
check did not complete the dungeon or use physical Ayn Thor hardware.
Restored the original Hudtest roster selection, closed the test tab, and
stopped the temporary development servers.
- Evidence: `artifacts/rom-dungeon-health/report.json`,
`barren-caves-health.png`, `barren-caves-combat.png`, `barren-caves-healed.png`,
`live-combat-dom.txt`, and `browser-errors.json`.
- Validation: all 407 focused combat, party, CoA, RoM, DPS-meter, stat, and
dungeon-scaling tests passed across 52 files. The final production
TypeScript/Vite build and release-bundle verification passed.
## 2026-09-13 - WoW dungeon lighting and stair fleet pass
- Applied environment-specific readable lighting to all 54 WoW dungeon entries,
using the reviewed Stockades ambient/hemisphere fill as the baseline. Stone,
cavern, fire, arcane, crypt, and outdoor profiles preserve distinct coloration.
Stockades' existing presentation/three ramps and RuneWaker lighting are unchanged.
- Scanned every shipped WoW collision package, including authored Wailing
Caverns' actual source assets. Added 347 verified walking proxies across 22
other dungeons and eight filled navigation portal bridges in Uldaman. Rendered
steps and source visual/collision/navigation GLBs remain unchanged.
- Added package-identity gates and a compiler-independent shared runtime adapter.
Collision preparation spatially indexes flights; rejected candidates cannot
supply geometry needed by accepted proxies. Existing navigation validation,
content, encounter, and availability gates were not promoted to green.
- Shipping-asset regressions independently pass all 347 new proxies through
prepared collision and the live NPC segment validator uphill/downhill at the
center and two interior lateral lanes. Exact portal matching and all existing
Stockades player/NPC/wall tests pass.
- The game-playtest visual viewer uses shipped meshes and runtime lighting and
material policies without touching saved character/party state. At 1280x720,
Uldaman's old/new-fill comparison showed clearer stonework; Wailing Caverns
retained green, readable rock; Mechanar retained cool arcane interiors;
Scholomance's visible entrance steps/masonry remained intact and readable.
Blood Furnace's dark source textures remained visible at its wall-facing
entrance viewpoint. Durnholde's visual load completed without console errors.
- Zul'Farrak entrance/boss views and Durnholde's exterior boss view showed
geometry/terrain/viewpoint gaps, recorded for separate investigation. This is
not exhaustive staircase certification: curved/short/heavily-decimated flights,
rejected candidates, outer stair edges/landing lips, complete dungeon routes,
full clears, and physical Android QA still require individual review.
- Evidence/coverage: `dungeon-pipeline/WOW_ENVIRONMENT_REVIEW.md`,
`src/game/generated/wowDungeonStairs.generated.json`, and screenshots in
`artifacts/wow-dungeon-environment/`. No hosted release was published.
- 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 check passed. Existing physics
initialization and bundle-size/import advisories remain.
## 2026-09-13 - Dungeon completion results and run leaderboards
- Fixed missing RuneWaker completion bookkeeping for the 21 dungeons with
configured bosses. Barren Caves now awards Anglo's objective on his actual
death and announces the completed run. Bossless placeholder entries do not
fabricate a completion.
- Run timing starts when the dungeon is playable, survives wipes, pauses, and
saved resumes, and freezes at the final-boss objective. Older checkpoints
without a recorded start time still announce completion but remain unranked.
- The results dialog shows the final-boss time, final-clear and full-clear
placement, party classes/levels, and defeated bosses. Stay and loot, reopening
results, and Return to main menu were verified through the live UI. Returning
clears the completed checkpoint.
- Replaced the dungeon picker's minimap with persistent completion-time
leaderboards. Final Boss clears includes all qualifying runs; Full dungeon
clears requires every available boss for the selected difficulty. Expanded
entries show each party member and boss status. Normal/heroic rankings are
separate; disconnected results use an explicitly labeled device leaderboard.
- An actual combat integration check fought Barren Caves' level-2 Anglo with
9,240 health using NPC ability selection, enemy attacks, and Priest healing.
NPCs dealt 9,239 damage after a one-damage player tag; healing totaled 441.
The final death awarded completion at 84.1 seconds with all companions alive.
- Manual browser combat confirmed NPC damage and healing on Barren Caves
trash. The live results check restored the integration fight's completed
checkpoint through an isolated local QA account: 01:24.1 ranked #1 of three
seeded local-server entries in both filters. This was not a manual browser
full clear and no production leaderboard entries were published.
- PC results and expanded final/full leaderboard layouts were visually
reviewed at 1280x720. The built-in Thor preview displayed the leaderboard,
filters, and role-selection control within its 960x540 main surface. Compact
480x360 DOM bounds kept the dialog footer inside the viewport; the in-app
browser's viewport-override screenshot scaled incorrectly, so that capture
does not establish compact visual quality. Physical Thor hardware was not used.
- Evidence: `artifacts/dungeon-runs/combat-completion.json`, `results-world.png`,
`leaderboard-final-expanded.png`, `leaderboard-full-expanded.png`, and
`leaderboard-thor.png`. The bounded final browser check captured no errors.
- Validation: 70 completion, checkpoint, encounter, catalog, client, and UI
tests plus the real-combat integration test passed. The 432-test focused
combat/party/class/health/input regression suite and 18 server tests passed.
Production build, final TypeScript check, and release candidate check passed.
## 2026-09-13 - RoM character nameplate class labels
- RoM overhead nameplates and AI party frames now show the active class alone,
or primary/secondary class names joined with `/`, without race or `Primary`.
- An isolated local fixture using the real scene, party frames, and shared
character preview verified `Warrior`, `Priest`, and `Priest/Warrior` labels.
The two-class dungeon screenshot showed the label above the rendered body
and equipped staff silhouettes. The roster preview also retained its body
and equipment. The fixture used in-memory identities without saving a roster.
- Evidence: `artifacts/rom-nameplates/dungeon-dual-class.png` and
`artifacts/rom-nameplates/roster-preview.png`.
- Validation: 70 avatar, party-store, and mob-nameplate tests passed. Production
build, asset audits, compression/bundle verification, and release check passed.
## 2026-09-13 - Dungeon boss durability and difficulty leaderboards
- Campaign bosses now use a level-scaled health floor above their original
health when needed. Final bosses receive an additional 1.8 multiplier on
that floor. Larger authored health values remain effective.
- The dungeon browser offers a 1-10 boss difficulty slider, native keyboard
adjustment, and controller decrement/increment buttons. Difficulty 1 is
Easy; each step adds 25% health and 15% damage to bosses. The selected source
Normal/Heroic variant also applies to entry. Trash retains its existing stats.
- Boss difficulty is fixed at entry, preserved through saves and renderer
restarts, and passed from the online group leader to followers. Changing
difficulty starts a new run; completed checkpoints also start fresh.
- Device and world leaderboards isolate each difficulty's final/full-clear
records, ranks, and pages. Existing records migrate to a separate legacy
bracket. Migration and repeat submissions were verified against SQLite;
HTTP tests verify difficulty selection and reject invalid values.
- Deterministic Ragefire simulations tested 12 RoM party compositions at levels
1, 8, 20, 40, and 80 against the shared runtime scaling function. All ordinary
boss samples exceeded 25 seconds and final-boss samples exceeded 45 seconds.
Additional damage-role Mage samples passed those bounds; at level 8 the
ordinary boss took 29.8 seconds and the final boss took 55 seconds. Timings
remain dependent on party composition, player actions, and equipment.
- A final-boss fight with enemy attacks and Priest healing verified repeated
attacks, incoming damage, healing, and party survival before the boss died.
Balance evidence: `artifacts/boss-difficulty/ragefire-balance.json`.
- Desktop screenshots at 1280x720 verified the Easy and difficulty-10 layouts,
stat preview, and matching leaderboard labels. Pointer and keyboard changes
were exercised. At 390x844 the slider remained operable and its DOM width
stayed within the viewport, but the in-app browser's viewport-override
screenshots scaled incorrectly, as in the earlier compact playtest. Those
captures do not establish mobile visual quality. The viewport was restored.
- Validation: 169 focused game/client/UI tests and 20 server tests passed.
The production build, asset audits, bundle verification, and release check
passed. Existing RoM nameplate changes were retained.
## 2026-09-13 - Original WoW dungeon atlas
- Added 107 unique original map images across 51 standard WoW dungeons using
the supplied patch-enUS-M archive and existing client archives. A duplicated
Trial of the Champion floor record is deduplicated before packaging. The
source MPQs and Mapster addon were read without modification; no Lua addon
code is installed into HealerMan.
- Coordinate inverses were checked against 10,342 matching source spawns and
the event-driven Trial of the Champion source entrance. Maximum discrepancy
is 0.189 yards in authored Wailing Caverns rounding; other imported maps
have substantially smaller discrepancies. All 107 image checksums match
their local immutable content objects.
- The production preview at localhost:5174 loaded Wailing Caverns and showed
original artwork with the player/camera direction, entrance, numbered
encounters, and a 45.7%, 60.5% entrance-position readout. The map was visually
reviewed at 1280x720, with the rendered dungeon visible behind it. Pressing
M opened it; toggling patrol routes then pressing M closed it despite the
checkbox retaining focus. Reopening restores the clean default overlay.
- Evidence: `artifacts/wow-maps/wailing-caverns-atlas.png`. No production-preview
errors were captured in the bounded console check. Earlier development HMR
errors from concurrent equipment edits were not treated as production errors.
Testing used the existing offline Hudtest QA character, not a live account.
- Multi-floor rendering, floor controls, rebound shortcuts, repeat/capture
guards, PNG dimensions/checksums, axis projection, shifted/rotated scene
transforms, and RuneWaker survey fallback are covered by automated tests.
Every dungeon was not individually traversed in the browser. Auto floor
selection is horizontal best fit, not WMO-group/height detection; overlapping
stacked rooms require manual floor selection. Mobile hardware was not tested.
- Tinkertech Showdown, Frozen Reach, and Forgotten Mine have no matching
artwork records and retain their survey maps. RuneWaker maps are unchanged.
Failed artwork loads also retain a correctly reprojected survey fallback.
- Validation: 50 focused map/UI/input tests and three BLP/tile-layout tests
passed. The production build, texture/performance audits, and compressed
release-bundle verification passed. Local downloadable packs were published;
no online deployment was performed.
## 2026-09-13 - Boss card collection and leveling loot
- Boss deaths roll a guaranteed Normal card plus independent Rare (1/10),
Epic (1/50), and Legendary (1/100) bonuses. The collection catalogue covers
330 distinct WoW/RoM bosses and 1,320 rarity variants using existing models.
Repeated appearances share counts and list every source dungeon.
- Copies and the latest claim per boss spawn persist per character through the
roster/cloud-save path. Shared-world hydration grants the authority's rolls
to followers and ignores duplicate/reconnected and older reward snapshots.
- Equipment drops and bonus equipment are suppressed below player level 80;
existing inventory and authored non-equipment drops are preserved. Level-80
equipment loot remains enabled. Bosses without equipment tables award cards.
- The production browser at 1280x720 verified the main-menu entry, all four
Lady Anacondra model portraits, dungeon location, odds, search, All/Earned,
dungeon/rarity grouping, and in-dungeon pause-menu access. Roster and dungeon
screenshots show player/party bodies and starter weapon/shield silhouettes.
- At 390x844 the collection switched to two columns, with no horizontal page
overflow and dialog bounds within the viewport. The in-app browser again
scaled the viewport-override screenshot incorrectly; that capture does not
establish mobile visual quality. The viewport was restored.
- Deterministic tests cover exact odds boundaries, counts, persistence,
no-loot-table bosses, loot restrictions, and online replay. Live browser QA
did not perform a boss clear; earned-copy display was checked with seeded
render tests. Evidence: `artifacts/boss-cards/collection-desktop.png`,
`collection-mobile.png`, `roster.png`, and `dungeon.png`.
## WoW and CoA default boss difficulty review — September 13, 2026
- Reviewed all 10 WoW and 21 CoA classes: 61 canonical class-role builds at
levels 8, 20, 40, and 80 with three deterministic companion compositions.
The 1,464 durability simulations used live boss scaling, starter heirlooms,
legal level-appropriate talents, live companion AI, and the existing baseline
player rotation. CoA characters currently use WoW companions.
- Fixed Death Pact and other instant-kill effects bypassing boss health in the
player, triggered-spell, and companion paths. Fixed repeated proc activations
across branches, duplicate execution of expanded CoA payloads, invented
damage on proc auras and Waterfall, and critical-damage talent bonuses
affecting ordinary hits. Regenerated the CoA runtime catalog and shards.
- Raised the shared health floor by 40% to cover the remaining CoA burst.
Every class uses the same boss stats at the same level and difficulty.
Fastest sampled kills were 26.2 seconds for an ordinary boss and 48.6 for
the final boss. All duration assertions passed. The refreshed RoM regression
also passed; its level-eight damage-role Mage sample took 41.8/74.9 seconds.
- Durability samples disabled enemy attacks and stopped at 60 seconds to
isolate damage. Most WoW and CoA samples still had a living boss at the cap;
these are lower bounds, not proof of typical 25-30/45-second kill times.
Default class throughput is still uneven, especially for WoW parties.
- An additional 26 final-boss attack samples exercised healer builds at levels
8 and 80. Paladin, Priest, Shaman, and Tinker kept their parties alive in both.
Druid and several CoA samples lost companions; Bloodmage also lost the player
at 80. This basic policy can refresh HoTs too early or choose self-healing
hybrids, so these outcomes need a dedicated healer rotation/playtest pass
before treating them as class throughput limits. No live boss clear was
performed in this numerical review.
- Validation: 122 combat/catalog checks, 91 class-damage/avatar checks, eight
RoM boss regressions, TypeScript, and the production build passed. All six
large-matrix assertions passed, but its progress reporter timed out during
CPU-heavy loops. Added worker yields and reran the affected level-40 test;
it exited cleanly without the reporter error.
- Evidence: `artifacts/boss-difficulty/wow-coa-balance.json` and
`artifacts/boss-difficulty/wow-coa-review.md`. Coverage is a canonical build
per role with starter gear, rather than every specialization or later gear
combination. `npm run release:check` is required for handoff.
## CoA healer rotation pass — September 13, 2026
- Corrected base-mana percentage costs, Tinker's secondary mana maximum,
imported heal power/AP/spirit scaling, self-healing riders, and party heal
recipients. Removed invented instant heals from conditional procs and
invented hostile damage from healing/mitigation tooltip text. Regenerated
the CoA runtime catalog and all class shards.
- Companion support AI maintains existing HoTs, covers other injured allies,
and avoids redundant shields. The benchmark player policy now prefers
effective emergency/area healing, avoids wasteful self-healing, positions
ground heals on the injured ally, and funds rage heals through weapon attacks
and actual resource generators. Normal gameplay still uses player input.
- Tested nine canonical CoA healer builds at levels 8, 20, 40, and 80 against
final-boss attacks for 60 seconds with three deterministic WoW companion
compositions each: 108 samples. Every player survived and every sample
delivered effective ally healing. Entire-party survival was 24/27 at eight,
25/27 at twenty, and 27/27 at both forty and eighty.
- The remaining low-level losses are Primalist companions. Its imported Geode
Barrage lacks the server-scripted stone/rage payload; that mechanic still
needs implementation. Survival at the time cap does not establish a boss
clear, indefinite mana sustainability, or complete CoA mechanic parity.
- Reran the full WoW/CoA durability and healer-attack suite: all six assertions
passed without reporter errors. Fastest sampled ordinary/final kills remain
26.2/48.6 seconds. WoW Druid's comparable eight/eighty attack samples now keep
the party alive with the revised HoT policy.
- Validation: 167 combat/catalog/runtime regressions, four healer matrix
assertions, 47 avatar checks, TypeScript, the production build, and release
bundle validation passed. The final release hygiene check covers untracked
regression tests as well as tracked edits.
- Live production-preview smoke check at 1280x720 used an offline Human Witch
Doctor (Brewing). Roster and Wailing Caverns entrance captures show the
player and companion bodies and starter weapon/shield silhouettes. This
visual check did not perform a live boss clear or validate manual rotations.
Evidence: `artifacts/boss-difficulty/coa-healer-smoke/roster.png` and
`artifacts/boss-difficulty/coa-healer-smoke/dungeon.png`.
- Numerical evidence and remaining limitations:
`artifacts/boss-difficulty/coa-healer-balance.json`,
`artifacts/boss-difficulty/wow-coa-balance.json`, and
`artifacts/boss-difficulty/coa-healer-review.md`.
## Primalist rage generation follow-up — September 13, 2026
- Restored Geode Barrage's three physical stone pulses at cast completion,
+500ms, and +1000ms, using the ranked parent amount, 23% nature/spell power,
and 9% attack power. Each pulse dealing effective damage grants its caster
5 rage, for 15 from a full Barrage. Removed the unscheduled hidden placeholder
proc so another periodic event cannot substitute for or duplicate the stones.
- The 5-rage stone amount is HealerMan's normalization using the related
imported Geode spell 804002 payload. Barrage's imported DBC does not expose
an exact rage amount; this does not establish exact server-script parity.
Dead targets and fully absorbed stones grant no rage. Player and companion
grants cap at the source pool maximum and synchronize the actor's pools.
- Seismic Crash grants 20 rage once per cast and executes its initial damage
pulse. Seismic Spike grants 4 per target actually damaged. Primalist energize
effects retain their power type and convert internal rage units to displayed
points: Primal Rush and passive Protective Roar grant 20 rather than 200.
Protective Roar retains beneficial party recipients when its payload fires.
- Scoped imported power-unit conversion to Primalist. A global conversion
caused a Bloodmage survival regression; other classes retain their existing
script-payload interpretation pending their own power-record review.
- The benchmark policy considers all usable rage generators, including Crash
and Barrage, before rage heals. Normal gameplay still uses player input.
All 108 attacking-final-boss CoA healer samples now keep the entire party
alive, including the five previously failing low-level Primalist samples.
The regression requires zero companion deaths at every tested level.
- Validation: 207 combat/catalog/runtime/avatar checks passed, including eight
focused Primalist checks for timing, coefficients, capped gains, absorbed and
dead targets, companion attribution, passive payloads, and Seismic gains.
All four strict healer matrix assertions passed. All six WoW/CoA boss suite
assertions passed across 1,464 durability runs and 26 attacking-boss samples;
fastest sampled ordinary/final kills remain 26.2/48.6 seconds. TypeScript,
the production build, release bundle validation, and release hygiene passed.
- Live production-preview smoke check at 1280x720 used an offline female
Tauren Primalist (Life). Roster and Wailing Caverns entrance captures show
a character body with a staff and companion bodies with weapon silhouettes.
The Tauren identity rendered a human-looking fallback; the optional content
service was unavailable in this static preview. These captures establish
body/equipment visibility, not correct Tauren appearance. Entrance trash
reached level two with the full party alive. Barrage remained locked until
level six, so pulse/rage behavior was checked by deterministic runtime tests,
rather than a live manual Barrage cast. No live boss clear was performed.
- Evidence: `artifacts/boss-difficulty/primalist-smoke/roster.png`,
`artifacts/boss-difficulty/primalist-smoke/dungeon.png`,
`artifacts/boss-difficulty/coa-healer-balance.json`,
`artifacts/boss-difficulty/wow-coa-balance.json`, and
`artifacts/boss-difficulty/coa-healer-review.md`. Survival at the 60-second
cap does not establish a boss clear or indefinite resource sustainability.
+48
View File
@@ -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"
]
}
+119
View File
@@ -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.
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "healer-man",
"version": "0.1.37",
"version": "0.1.41",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "healer-man",
"version": "0.1.37",
"version": "0.1.41",
"dependencies": {
"@capacitor/android": "8.4.1",
"@capacitor/core": "8.4.1",
+4 -1
View File
@@ -1,7 +1,7 @@
{
"name": "healer-man",
"private": true,
"version": "0.1.37",
"version": "0.1.41",
"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",
Binary file not shown.

After

Width:  |  Height:  |  Size: 772 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 788 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 753 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 756 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 735 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 729 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 735 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 735 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 734 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 739 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 773 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 741 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 745 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 776 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 757 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 780 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 773 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 773 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 756 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 756 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 761 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 756 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 748 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 724 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 745 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 767 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 761 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 755 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 757 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 777 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 KiB

Loaded 100 of 279 files, more files were not shown because too many files have changed in this diff. Show more