Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3f8a69b51 | ||
|
|
197a64117c | ||
|
|
ed0d2fea3d | ||
|
|
b417b7c3c3 | ||
|
|
361734bc41 | ||
|
|
03a4e3f51c | ||
|
|
40d9f346d8 | ||
|
|
46c272f889 | ||
|
|
05b25c4341 |
No files matched your search
@@ -2212,3 +2212,907 @@ Vite's existing large-chunk advisory remains informational.
|
||||
Effects without source mappings retain fallback. This is representative
|
||||
desktop browser QA, not exhaustive spell-by-spell fidelity or a physical
|
||||
Android/GPU performance test. No hosted release was published.
|
||||
|
||||
## 2026-09-12 - Stockades party routing and indoor lighting
|
||||
|
||||
- Fixed quantized navigation preparation: normalized integer positions now
|
||||
expand to floats before the GLB node transform is baked. Previously the
|
||||
Stockades world coordinates clamped into roughly [-1, 1], leaving the live
|
||||
party unable to attach to its graph even when an offline route test passed.
|
||||
- Added three reviewed bidirectional links across the 1.537m Recast seams at
|
||||
the entrance/central stairs and the central/north and central/south stairs.
|
||||
The shipping 3,538-triangle graph connects the entrance and all five boss
|
||||
approaches while discarding the remaining small decorative islands.
|
||||
- Added navigation-only review state and compiler-preserved runtime overrides.
|
||||
Stockades navigation is green; its wider encounter, wipe/reset, checkpoint,
|
||||
and completion validation remains unvalidated.
|
||||
- Leader and follower formation paths now use the graph when a breadcrumb
|
||||
rejoin is blocked. Fallback comfort goals and recalls attach to the reviewed
|
||||
surface, preventing an off-boundary stair target from causing a false stuck
|
||||
loop. Combat approach connectors respect each member's personalized range.
|
||||
- Replaced the generic dark expansion palette only for Stockades with warmer,
|
||||
stronger ambient/hemisphere fill and a warm directional light. No dungeon
|
||||
textures or source meshes were changed, and other dungeon palettes remain
|
||||
unchanged pending individual visual review.
|
||||
- Live desktop browser check at 1280 x 720 used offline level-15 Priest
|
||||
Rolecheck as healer with Blood DK tank Morvane, Combat Rogue Vale, Unholy DK
|
||||
Thorne, and Frost Mage Ilyra. Fresh Defend mode showed PARTY 5/5, Recall on the
|
||||
entrance stairs recovered without a route warning, and Attack resumed with
|
||||
visible party movement down the stairs. The tank advanced into combat and
|
||||
took Defias Basic Attack/Kick/Backhand aggro; Backstab and Icy Touch events
|
||||
appeared while the player remained at the entrance.
|
||||
- Inline task screenshots captured the warm, readable stonework/stairs and
|
||||
equipped party silhouettes in Defend and Recall-to-Attack states. The final
|
||||
runtime produced no new navigation errors; the existing deprecated physics
|
||||
initialization warning remains. Temporary diagnostic logging was removed.
|
||||
- Automated validation: all 223 Vitest files passed, 1,373 tests passed, and
|
||||
six existing tests remained skipped. Regressions cover the actual quantized
|
||||
Stockades GLB through the shipping asset-preparation path, normalized integer
|
||||
transforms, formation projection, entrance-to-boss routing, and tank melee
|
||||
approach. This is an entrance/combat smoke pass, not a complete dungeon clear
|
||||
or physical Android test.
|
||||
- Production TypeScript/Vite build, texture/performance audits, bundle
|
||||
verification, and the final release candidate check passed. Existing
|
||||
bundle-size/import advisories remain. No hosted release was published.
|
||||
- The optional all-dungeon functionality audit was stopped after an extended
|
||||
run without output; its existing report files were not changed. Stockades
|
||||
navigation evidence comes from the actual shipping-asset regressions and
|
||||
the live smoke pass above, not a new fleet-wide functionality certification.
|
||||
|
||||
## 2026-09-12 - Stockades stair-ramp follow-up
|
||||
|
||||
- Follow-up player feedback reported companions still sticking near stairs.
|
||||
Actual collision profiles contain approximately 0.44-0.59m risers, above
|
||||
the party sweep's 0.32m lower-leg clearance. Collision-backed regressions
|
||||
reproduce uphill rejection on the original shipping collision GLB.
|
||||
- Added three reviewed package-space traversal proxies for the entrance and
|
||||
both prison-wing stair flights. Collision tread/riser vertices within the
|
||||
reviewed stair relief are reshaped onto smooth ramp planes; upper walls,
|
||||
ceilings, other floors, and geometry outside those footprints remain intact.
|
||||
Source visual/collision GLBs are unchanged. Only prepared walking collision
|
||||
and party navigation use the overrides; the rendered stairs remain steps.
|
||||
- Navigation receives the same ramp planes with 0.05m surface clearance and
|
||||
six new triangles stitching the exact source boundary portals. This replaces
|
||||
the three vertex-only connections with filled triangle corridors, allowing
|
||||
mid-stair replans and recalls to project onto the interior walking surface.
|
||||
The reviewed graph now has 3,544 source triangles and 31 components, retaining
|
||||
entrance-to-all-five-boss routes and discarding minor decorative islands.
|
||||
- Live QA caught a second issue: terrain queries included the player's
|
||||
kinematic capsule. A failing collision-backed regression confirmed false
|
||||
route blockage through a nearby player. Party direct, route, and grounding
|
||||
queries now exclude dynamic/kinematic actor bodies and sensors; crowd spacing
|
||||
remains a separate party-separation concern. Static walls still block paths.
|
||||
- Automated tests exercise shipping normalized/quantized GLBs through runtime
|
||||
preparation, downhill/uphill party capsule checks on all three flights at
|
||||
center and lateral offsets, repeated mid-stair replans, all boss routes with
|
||||
live wall checks, tank melee approach with real collision validation, and
|
||||
player capsule traversal down/back up all three ramps without jumping.
|
||||
- Final desktop browser smoke pass at 1280 x 720 used offline level-15 Priest
|
||||
Rolecheck and the same Blood DK/Combat Rogue/Unholy DK/Frost Mage party.
|
||||
Attack began without ROUTE BLOCKED, companions changed position down the
|
||||
entrance staircase, the tank moved out of the entrance view and took aggro,
|
||||
and Backstab/Icy Touch/Plague Strike combat events appeared. Experience rose
|
||||
from 6,576 to 11,098 as the party defeated trash with the player stationary.
|
||||
Recall brought companions back to the entrance stairs. The unattended tank
|
||||
eventually died during continued combat; this was not a healed full clear.
|
||||
- Inline task screenshots captured the unchanged visible steps, equipped
|
||||
character bodies, warm lighting, and party movement. Both wing flights have
|
||||
collision-backed automated coverage; live end-to-end wing traversal, a full
|
||||
dungeon clear, wipe/checkpoint behavior, and physical Android QA remain open.
|
||||
- Validation: all 224 Vitest files passed, 1,380 tests passed, and six existing
|
||||
tests remained skipped. Production TypeScript/Vite compilation passed using
|
||||
the project's 8GB heap setting; texture/performance audits, static bundle
|
||||
compression, and release-bundle verification passed. Existing build-size
|
||||
advisories and deprecated physics initialization warnings remain. No hosted
|
||||
release was published.
|
||||
|
||||
## 2026-09-12 - Non-blocking players and combat actors
|
||||
|
||||
- Removed party soft separation and crowd-triggered combat repositioning.
|
||||
Companions may overlap or cross one another without push-apart corrections
|
||||
changing their routes. Normal follow formations and role-specific attack
|
||||
ranges remain; a tank already in melee range does not move just because an
|
||||
ally occupies the same position.
|
||||
- Added a shared actor collision layer that interacts only with physical
|
||||
terrain. The player capsule uses this layer. Player controller movement,
|
||||
ground probes, camera sweeps, party direct/route validation, party grounding,
|
||||
and combat ground-position queries use terrain-only filters. Actor body type
|
||||
cannot turn an actor into a floor or movement obstruction. Party members,
|
||||
remote players, mobs, and bosses currently render without physical colliders;
|
||||
any future actor capsule must use the shared actor layer.
|
||||
- Walls, floors, ceilings, dungeon objects, and the Stockades walking ramps
|
||||
retain their terrain collision. Target-selection meshes, combat visibility,
|
||||
damage, and attack-range checks were not removed.
|
||||
- Ten new Rapier regressions cover overlapping actors with no contacts or
|
||||
displacement, movement through fixed/kinematic/dynamic actors (including an
|
||||
overlapped starting position), continued wall/floor collision, and ignoring
|
||||
actors in ground, party-route, and camera queries. A terrain-layer control
|
||||
confirms real actor/terrain contacts are still detected. Stockades shipping-
|
||||
asset regressions now use the live player collision policy and still pass
|
||||
down/up all three ramps without jumping.
|
||||
- Browser smoke pass at 1280 x 720 used offline level-15 Priest Rolecheck with
|
||||
Blood DK, Combat Rogue, Unholy DK, and Frost Mage companions. Inline roster
|
||||
and dungeon screenshots show character bodies, weapons, unchanged visible
|
||||
stairs, and the existing warm lighting. Attack moved companions down from
|
||||
the entrance and out of its view without ROUTE BLOCKED; the tank took aggro
|
||||
and melee/caster combat events continued. Experience rose from 11,098 to
|
||||
13,359. Stop followed by Recall returned the party to the nearby player.
|
||||
Selecting Morvane and casting Power Word: Shield applied the buff successfully.
|
||||
- Live QA was an entrance/trash/recall smoke pass, not a full dungeon clear or
|
||||
a manual traversal of both wings. Actor overlap and passage guarantees are
|
||||
backed by the physics regressions; physical Android and multiplayer QA remain
|
||||
open.
|
||||
- Validation: all 225 Vitest files passed, 1,390 tests passed, and six existing
|
||||
tests remained skipped. The final focused checks passed again after cleanup.
|
||||
Production TypeScript/Vite build, texture/performance audits, static bundle
|
||||
compression, and release-bundle verification passed. Existing chunk-size
|
||||
advisories and deprecated physics initialization warnings remain. No hosted
|
||||
release was published.
|
||||
|
||||
## 2026-09-12 - Individual companion navigation recovery
|
||||
|
||||
- Replaced the old distant, whole-party stuck Recall with an individual
|
||||
navigation watchdog in a separately tested game module. Two seconds without
|
||||
meaningful waypoint progress invalidates that companion's route; five seconds
|
||||
requests a safe recovery landing. Failed replans do not restart the timer,
|
||||
back-and-forth movement cancels forward progress, and dense waypoint chains
|
||||
still count genuine movement around corners.
|
||||
- Recovery prefers a recently visited party/player trail point near the group
|
||||
on the same floor, then falls back to a validated player position. Actual
|
||||
terrain checks require walkable ground, clear companion body space, and a
|
||||
route back to the group. Blocked or invalid landings are not applied. Each
|
||||
companion has an independent ten-second teleport cooldown.
|
||||
- Intentional attack-range holds, casting/channeling, crowd control, Stop,
|
||||
death, inactive simulation, and UI pauses do not accumulate stuck time.
|
||||
Automatic recovery changes only the affected companion's position and routing
|
||||
state; it does not heal, resurrect, reset threat, or teleport other companions.
|
||||
Manual Recall keeps its existing whole-party behavior and party order.
|
||||
- Added regressions for recovery timing, oscillation, replanning, independent
|
||||
cooldowns and member isolation, exclusions, safe-trail/player selection, wall
|
||||
and ceiling rejection, missing floors, and actor-independent landing checks.
|
||||
Shipping Stockades navigation/collision assets validate recovery landings on
|
||||
all three ramps and along approaches to all five boss objectives.
|
||||
- Browser smoke pass at 1280 x 720 used offline Priest Rolecheck and Blood DK,
|
||||
Combat Rogue, Unholy DK, and Frost Mage companions. Inline roster and dungeon
|
||||
screenshots show unchanged character bodies, equipment, stairs, and warm
|
||||
lighting. The first catalog load needed a retry. Attack moved companions down
|
||||
from the entrance without ROUTE BLOCKED, and combat continued with the player
|
||||
stationary. The unattended party eventually died; Stop remained selected
|
||||
after Recall returned the fallen companions without resurrecting them.
|
||||
- The intermittent side-room trap and its automatic recovery were not reproduced
|
||||
live. Recovery triggers and terrain safety are backed by automated tests;
|
||||
extended side-room playtesting, a healed full clear, and physical Android QA
|
||||
remain open. This pass did not modify existing ramp or actor-collision policy.
|
||||
- Validation: all 227 Vitest files passed, 1,416 tests passed, and six existing
|
||||
tests remained skipped. The final 37 focused checks passed after correcting a
|
||||
test-helper type annotation. Production TypeScript/Vite compilation, texture
|
||||
and performance audits, static compression, and bundle verification passed.
|
||||
Existing chunk-size advisories and deprecated physics initialization warnings
|
||||
remain. No hosted release was published.
|
||||
|
||||
## 2026-09-12 - Wall-aware combat pursuit and individual mob recovery
|
||||
|
||||
- Hostile mob actions now require both attack range and terrain line of sight.
|
||||
Losing either cancels a pending hostile cast so pursuit can resume; companion
|
||||
hostile casts also cancel when sight is lost. Self buffs and friendly heals
|
||||
cannot make an otherwise obstructed mob hold an attack position. Proximity
|
||||
aggro also checks sight instead of pulling enemies through nearby walls.
|
||||
- Static enemies, roaming packs, and summoned enemies share separately tested
|
||||
imperative pursuit rules over the already-loaded dungeon navigation surface.
|
||||
Blocked direct approaches use approved routes through doorways. Routes may
|
||||
finish at a reachable attack position only when that position is both in
|
||||
range and visible; off-surface connectors still require body clearance.
|
||||
- Two seconds without meaningful waypoint progress requests a replan. After
|
||||
five seconds, a stuck mob within ten meters of its target may recover to a
|
||||
validated nearby landing on the same floor and within its home leash. Ground,
|
||||
body clearance, route connectivity, attack range, and sight must all pass.
|
||||
This teleport preserves health and threat and has a ten-second cooldown.
|
||||
- Distant, wrong-floor, out-of-leash, or unsafe near-target recovery requests
|
||||
instead reset only that mob's combat state and restore its health. A validated
|
||||
home landing is preferred; otherwise it evades and navigates home without a
|
||||
blind teleport. Ten seconds of evade prevents immediate proximity, damage,
|
||||
or taunt re-engagement. Dead enemies are never resurrected. Casting, control,
|
||||
pauses, inactive simulation, and non-authoritative online clients do not
|
||||
accumulate navigation failures or trigger automatic recovery.
|
||||
- Regression coverage includes range-plus-sight attack/cast gating, immediate
|
||||
cast cancellation, doorway detours, recovery timing and safety, reset/member
|
||||
isolation, cooldown bypass protection, and near-teleport health/threat
|
||||
preservation. Shipping Stockades meshes independently verify real wall
|
||||
occlusion in both directions and clear sight across all three stair ramps.
|
||||
Pursuing mobs traverse each actual ramp uphill and downhill without false
|
||||
teleport/reset recovery. Existing party and player ramp checks still pass.
|
||||
- Browser smoke pass at 1280 x 720 used offline level-16 Priest Rolecheck and
|
||||
Blood DK, Combat Rogue, Unholy DK, and Frost Mage companions. Power Word:
|
||||
Shield applied to Morvane; Attack moved companions down from the entrance
|
||||
and out of its view without ROUTE BLOCKED, and Defias melee/cast events and
|
||||
tank damage followed. Stop plus Recall returned all four living companions
|
||||
to the nearby player while retaining Stop. Inline screenshots show character
|
||||
bodies, equipment, unchanged visible steps, and the existing warm lighting.
|
||||
The browser console had no errors and the existing physics initialization
|
||||
deprecation warning only.
|
||||
- Live QA was a short entrance/combat/recall smoke test, not a healed full clear
|
||||
or a manually reproduced side-room wall trap. Wall-blocked pursuit and mob
|
||||
recovery triggers are backed by automated tests; extended side-room combat,
|
||||
physical Android, and live multiplayer QA remain open. Existing lighting,
|
||||
ramp assets, and non-blocking actor collision policy were not changed.
|
||||
- Validation: all 229 Vitest files passed, 1,444 tests passed, and six existing
|
||||
tests remained skipped. Final production TypeScript/Vite compilation, texture
|
||||
and performance audits, static compression, and bundle verification passed.
|
||||
Existing chunk-size advisories remain. No hosted release was published.
|
||||
|
||||
## 2026-09-12 - HoTs and regeneration cannot heal corpses
|
||||
|
||||
- Reproduced the reported death-with-HoT state through lethal damage followed
|
||||
by overdue Rejuvenation ticks; the original implementation restored health
|
||||
while retaining the death animation. Separate failures confirmed passive
|
||||
spirit/equipment regeneration, ground healing, triggered healing procs, and
|
||||
a lingering damage tick's level-up refill could also restore corpse health.
|
||||
- Kept the fix in combat simulation rather than scene movement. Ordinary
|
||||
player healing in mutable combat work now uses a shared living-target guard;
|
||||
passive regeneration preserves zero health. Timed effects validate their
|
||||
target before ticks and procs, discard HoTs on dead targets even before the
|
||||
next tick, and retain HoTs on living allies when their caster dies. Newly
|
||||
applied actor HoTs also reject dead targets. Ground healing skips corpses
|
||||
while continuing to heal living teammates. Experience may still be awarded
|
||||
after death, but its level-up refill no longer implicitly resurrects.
|
||||
- Explicit player and actor-based party resurrection remain available and
|
||||
synchronize restored actor health/alive state. Party resurrection also
|
||||
clears the death animation using the existing ability-cancel event. Normal
|
||||
checkpoint respawn still restores health and clears lingering effects.
|
||||
The existing player movement gate remains unchanged and blocks zero health.
|
||||
- Fifteen new regressions cover the original self-HoT failure, actual Priest
|
||||
Renew, overdue/future ticks, explicit companion-to-player HoTs and their
|
||||
healing logs, dead allies, regeneration, ground healing, proc healing,
|
||||
post-death level rewards, living-target healing, resurrection, and respawn.
|
||||
The final focused combat/death/support checks passed 101 tests; the full
|
||||
suite passed all 230 files and 1,459 tests with six existing skips.
|
||||
- No live corpse-movement replay or physical Android check was performed in
|
||||
this pass. Evidence is combat-state regression coverage, not a new visual
|
||||
claim. Character rendering, camera/input, dungeon assets, lighting, and
|
||||
navigation policy were not modified. No hosted release was published.
|
||||
|
||||
## 2026-09-12 - Selectable resurrection checkpoints and fallen NPC recovery
|
||||
|
||||
- Normal dungeons now offer the entrance plus every defeated boss as named
|
||||
resurrection destinations. Choices use authored boss locations, not corpse
|
||||
coordinates, and unlock from actual defeated actors or durable encounter
|
||||
objective completion. Alive/script-despawned bosses and invalid destination
|
||||
IDs cannot grant a checkpoint. Boss-wipe resets retain completed checkpoints;
|
||||
a fresh dungeon run clears its progress.
|
||||
- The player defeat prompt includes a destination chooser. Respawning at the
|
||||
entrance or a cleared boss retains defeated enemies and run progress while
|
||||
resetting the current pull and restoring the party through the existing
|
||||
respawn lifecycle. Legacy callers without a choice retain saved-spawn behavior.
|
||||
- A contextual `Rez dead members` button and matching destination chooser appear
|
||||
below the party frames whenever an NPC teammate is dead. Only fallen NPCs are
|
||||
revived, at full health, into their formation slots at the selected checkpoint.
|
||||
Living NPCs, the player's health/location, current enemies, and party orders
|
||||
are not reset. Lingering timed effects on revived NPCs are removed without
|
||||
removing living allies' HoTs. Manastorm charges and remote human resurrection
|
||||
behavior are unchanged; non-authority online clients cannot mutate NPC revival.
|
||||
- Living, engaged bosses disable the NPC chooser/button with an explanation;
|
||||
the same restriction is checked again when the action executes. Trash combat
|
||||
does not block it. Individual return tasks use approved navigation toward the
|
||||
player's current location, including while the party is on Stop, then resume
|
||||
the current order. Returning members do not cast/taunt from the checkpoint or
|
||||
skew the engaged squad's target-selection center. Existing validated stuck
|
||||
recovery remains available. Recall, death, actor unmount, and run reset cancel
|
||||
pending return tasks. Scene relocation clears the corpse animation explicitly.
|
||||
- Live localhost Stockades screenshots at 1280x720 showed the panel with a dead
|
||||
Morvane tank, an enabled entrance chooser/button during trash combat, and the
|
||||
tank restored to 1707 health at the entrance after clicking while Stop remained
|
||||
selected. The button disappeared when no NPC was dead; living Thorne continued
|
||||
taking damage rather than receiving a party-wide refill. At 384x844 both native
|
||||
chooser and button remained within the viewport, about 176px wide and 44px high.
|
||||
The narrow screenshot capture was backend-scaled, so DOM bounds supplemented
|
||||
the visual check. Normal viewport sizing was restored and the temporary tab
|
||||
and development server were closed.
|
||||
- Twenty-nine new regressions cover checkpoint unlocking/retention, invalid and
|
||||
locked choices, player checkpoint respawn, boss/trash restrictions, selective
|
||||
NPC revival/effect cleanup, authority/Manastorm isolation, Stop/rejoin behavior,
|
||||
wall-aware return navigation, registry lifecycle, and UI visibility/placement.
|
||||
The shipping Stockades navigation/collision test also simulates all four NPC
|
||||
formation slots walking from the entrance and every boss checkpoint back to
|
||||
the entrance through approved corridors, without requiring stuck recovery.
|
||||
Final Vitest validation passed all 234 files and 1,488 tests, with six existing
|
||||
skips. No live boss-kill destination-selection, distant-player return replay,
|
||||
multiplayer session, or physical Android check is claimed in this pass.
|
||||
- Browser logs contained no errors; Rapier initialization and KTX2-loader warnings
|
||||
occurred during development hot reloads. Character assets, camera/input,
|
||||
dungeon geometry, and lighting were not edited. Final production TypeScript/Vite
|
||||
compilation, static compression, and release-bundle verification passed; texture
|
||||
and environment-performance audits also passed during prebuild. Existing build
|
||||
chunk advisories remain. No hosted release was published.
|
||||
|
||||
## Optional DPS meter — September 12, 2026
|
||||
|
||||
- Added a compact party DPS meter with current/last-fight damage, class-colored
|
||||
rankings, and a shared fight timer. It consumes the lossless combat event
|
||||
stream and counts effective damage, including pets/summons under their owner.
|
||||
Completed fights remain visible until the next pull; encounter resets clear
|
||||
the meter. Hiding it does not stop recording. Local menu/background pauses
|
||||
do not dilute DPS.
|
||||
- Automatic placement uses the PC lower-left corner and the Thor companion
|
||||
display. The UI editor supports visibility, dragging/keyboard nudges, width,
|
||||
and screen selection. These settings participate in saved layouts, all six
|
||||
template slots, and export/import, including migration of older UI files.
|
||||
Dedicated companion snapshots carry meter data and draft placement; lower
|
||||
display movement commands update the authoritative editor draft.
|
||||
- Live localhost Stockades checks at 1280x720 showed increasing party damage
|
||||
and readable bars in the PC lower-left corner. Resizing from 230 to 240 pixels
|
||||
worked; dragging moved the handle from approximately (9, 509) to (269, 400).
|
||||
Saving visibility off hid the meter, and reopening the editor retained that
|
||||
setting while damage continued accumulating. Default position/width and
|
||||
visibility were restored after this check.
|
||||
- In Thor preview, the meter appeared only inside the 620x540 companion surface.
|
||||
Populated bars remained clear of the party strip, vital controls, and action
|
||||
bar. With the main editor open, dragging on the bottom screen moved its handle
|
||||
from approximately (526, 322) to (661, 369) within companion bounds. Those
|
||||
preview movement edits were canceled. Screenshots are saved in
|
||||
`artifacts/dps-meter/pc-default.png`, `thor-default.png`, and
|
||||
`thor-editor-moved.png`. Full-page capture scaled incorrectly in the browser
|
||||
backend, so the Thor screenshots use the scrolled normal viewport.
|
||||
- All 47 targeted tests passed across seven files, including damage accounting,
|
||||
ownership, reset/pause behavior, UI migration/persistence, and dedicated
|
||||
companion publication/unsubscription. The production build and release
|
||||
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.
|
||||
@@ -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.41",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "healer-man",
|
||||
"version": "0.1.32",
|
||||
"version": "0.1.41",
|
||||
"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.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",
|
||||
|
||||
|
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 |
|
After Width: | Height: | Size: 820 KiB |