Original WoW spell visuals
The runtime packages every WoW 3.3.5 visual model referenced by the current
ability manifest, across all ten WoW classes. There is no class filter in
package-wow-original.mjs. Ascension and RuneWaker entries retain their existing
source mappings and sound behavior.
Current coverage: 483 packaged models; 5,066 of 5,066 source phase assets; 311 mesh models, 1,711 particle emitters, 249 ribbon emitters, and 479 unique source textures. The generated manifest includes per-class coverage. A spell rank without a source visual phase (for example, a passive or totem-management action) is not counted as a missing model. This does not invent original visuals for spells with no source mapping; the runtime still supplies its generated school fallback.
Generate and verify
npm run effects:wow
npm run effects:audit
npm run effects:test
effects:generate rebuilds the DBC/audio mappings before packaging all WoW
visuals. effects:priest remains a compatibility alias for effects:wow so it
cannot accidentally revert the main manifest to Priest-only coverage. The old
Priest decoder and fixtures remain for compatibility tests.
The manifest collector also reads effectful boss spell IDs from
dungeonCampaignCatalog.json. Regenerate the dungeon catalog first whenever
boss spell semantics change. Missing or undecodable source audio falls back to
the runtime's short spatial school cue; enabled combat audio is never silently
dropped merely because a source file is absent.
Source assets resolve from the extracted sibling LadiksMPQEditor base-client
directories, with the sibling wow335a/Data archive stack recovering missing
files. Locale archives supply shared interface textures used by spell models.
Recovered files go into .tools/wow-effects-source; source installations are
read-only. BLPConverter8 converts the original BLPs to PNG. Model and texture
paths are checked before resolution. An incomplete run reports failures and
does not replace the active manifest.
Graph filenames hash the complete runtime payload, including source model,
skin, textures and nested model dependencies. Changes therefore get new URLs
instead of reusing an incompatible cached graph. The normal content publisher
assigns the entire assets/game/combat-effects tree to core:combat-media.
Publishing a new app/content release remains the normal deployment step.
Development gameplay uses Vite's local source media directly; release builds
retain the verified media-pack download requirement.
Rendering
The wow-m2-model format composes source particles, animated/skinned geometry,
material alpha and colors, UV transforms, and bone-driven ribbon trails. The
renderer resolves full and upright billboards, texture layers, source-space
pivots, global animation sequences, and Stand/Hold/Decay timelines. Original
geometry particles use instance pools; secondary particle emitters are bounded
to prevent recursive effects multiplying the scene budget.
The live combat path uses the same cast, projectile, impact and aura events as
before. In original mode, an instant release also renders any source-side
cast-start layers without publishing another gameplay or audio event. Instant
terminal events prefer their exact phase, then use the source impact or
aura-start counterpart when that is the only mapping. The source phase stays
on the render event so attachment and aura lifetime rules remain correct. This
covers all 1,106 castable instant rank records that have a packaged source
visual, including all 287 latest-rank instant abilities with source visuals.
The source catalog also contains three passive instant records with visuals;
passives do not publish combat events. Abilities without a source mapping, or
with no usable asset load, retain generated fallback. Particle budgets,
placement anchors, and travel timing remain the game's presentation rules;
this is not a claim of pixel-identical client simulation or exhaustive
spell-by-spell gameplay QA.
Decoder reference for compressed bone quaternions, float UV quaternions, and source record layouts: wowlib M2 records.
Local visual inspection
Run npm run dev and open /scripts/combat-effects/preview.html. The
development-only preview lists every directly referenced model and uses the
same mesh, ribbon and particle renderer as live combat. Drag to orbit, scroll
to zoom, replay an effect, or freeze its opening frame. The preview is not
included in the production app entry point.
Runtime tests parse all shipped graphs, sample bone transforms, and verify
geometry bounds, dependency textures and billboard behavior. Browser evidence
and observed limitations are recorded in PLAYTEST_NOTES.md.