Commit graph

192 commits

Author SHA1 Message Date
Kelsi
77384f600e feat(editor): add WTSK JSON round-trip (export/import sidecar)
Closes the JSON round-trip gap on the trade skill recipe
catalog format shipped last batch. --export-wtsk-json emits
all 14 scalar fields plus a dual int + name form for
profession, plus a nested reagents[] array — only non-empty
slots are emitted to keep hand-edits compact.
--import-wtsk-json zeroes the reagent slots before parsing
(so a 2-element reagents array correctly clears slots 2 and
3) and accepts profession by either int or name. Verified
byte-identical round-trip on all three preset emitters
(starter / blacksmithing / alchemy — including recipes with
3 reagent slots populated). 754 documented CLI flags.
2026-05-09 19:43:16 -07:00
Kelsi
33a7b4b3cf feat(pipeline): add WTSK (Wowee Trade Skill / Recipe) catalog
New open format — replaces SkillLineAbility.dbc plus the
recipe portions of SkillLine.dbc plus the AzerothCore
trade_skill SQL tables. Closes the crafting gap left by WSKL
(which carries skill lines but not the recipes that bind to
them).

14 professions (Blacksmithing, Tailoring, Engineering,
Alchemy, Enchanting, Leatherworking, Jewelcrafting,
Inscription, Mining, Skinning, Herbalism, Cooking, FirstAid,
Fishing). Each recipe has 4 skill-up bracket thresholds
(orange / yellow / green / gray) for skill-up probability,
a craft spell cross-ref (WSPL), produced item cross-ref
(WIT) with min/max quantity range, an optional tool item,
and up to 4 reagent slots (itemId + count).

Cross-references with prior formats — craftSpellId points at
WSPL.spellId, producedItemId / toolItemId / reagent[].itemId
all point at WIT.itemId, and skillId points at WSKL.skillId.

CLI: --gen-tsk (3-recipe entry-tier starter), --gen-tsk-
blacksmithing (5-recipe progression rough sharpening through
truesilver champion), --gen-tsk-alchemy (5-recipe progression
minor healing through flask of titans), --info-wtsk,
--validate-wtsk with --json variants. Validator catches
id=0/duplicates, profession out of range, missing craft spell
or produced item, monotonic-bracket check (must be orange <=
yellow <= green <= gray), reagent itemId-without-count
mismatch, and free-recipe warning (no reagents and no tool).

Format graph now exposes 49 distinct binary formats. CLI
flag count: 747 → 752.
2026-05-09 19:41:49 -07:00
Kelsi
6b05136ef1 feat(editor): add WPCN JSON round-trip (export/import sidecar)
Closes the JSON round-trip gap on the player condition catalog
format shipped this batch. --export-wpcn-json emits all 11
scalar fields plus dual int + name forms for conditionKind /
comparisonOp / chainOp so hand-edits can use either
representation. --import-wpcn-json accepts either form,
falling back to the int when both are present. Verified
byte-identical round-trip on all three preset emitters
(starter / quest-gates / composite — including chained
conditions referencing other entries by chainNextId). 747
documented CLI flags.
2026-05-09 19:38:06 -07:00
Kelsi
b983ef6d48 feat(pipeline): add WPCN (Wowee Player Condition) catalog
49th open format — replaces PlayerCondition.dbc plus the
AzerothCore-style condition resolver. Defines reusable
boolean checks that other catalogs reference by conditionId
to gate gossip options, vendor items, quest availability,
achievement criteria, spell trainer offerings.

16 condition kinds (Always, Race, Class, Level, Zone, Map,
Reputation, AchievementWon, QuestComplete, QuestActive,
SpellKnown, ItemEquipped, Faction, InCombat, Mounted,
Resting), 8 comparison ops (==, !=, >, >=, <, <=, in-set,
not-in-set), and 4 chain ops (none, and, or, not) — chain
multiple conditions via chainNextId to express arbitrary
boolean trees.

Cross-references with prior formats — targetIdA is
polymorphic by conditionKind: resolves to WCHC raceId/classId,
WMS areaId/mapId, WFAC factionId, WACH achievementId, WQT
questId, WSPL spellId, or WIT itemId. chainNextId resolves
within the same WPCN catalog.

CLI: --gen-pcn (3 single-check starters), --gen-pcn-quest-gates
(4 cross-format quest gates with real WQT/WFAC/WACH/WMS IDs),
--gen-pcn-composite (3 leaves + 3 chained roots showing AND/
OR/NOT). Validator catches id=0/duplicates, kind/op out of
range, chain self-loop (infinite recursion), chainOp set
without chainNextId (dangling chain), chainNextId set without
chainOp (dead pointer warning), and unresolved chainNextId
references.
2026-05-09 19:36:56 -07:00
Kelsi
30de6f56cd feat(editor): add WWUI JSON round-trip (export/import sidecar)
Closes the JSON round-trip gap on the world-state UI catalog
format shipped last batch. --export-wwui-json emits all 11
scalar fields plus dual int + name forms for displayKind and
panelPosition so hand-edits can use either representation.
--import-wwui-json accepts either form, falling back to the
int when both are present, and defaults iconColorRGBA to
0xFFFFFFFF (opaque white) when omitted. Verified
byte-identical round-trip on all three preset emitters
(starter / wintergrasp / dungeon). 740 documented CLI flags.
2026-05-09 19:33:37 -07:00
Kelsi
d332229a79 feat(pipeline): add WWUI (Wowee World-State UI) catalog
48th open format — replaces WorldStateUI.dbc plus the
AzerothCore-style world_state SQL data. Defines on-screen UI
elements that surface server-side world-state variables: BG
scoreboards (flag captures, base controls), Wintergrasp tank
counters, Eye of the Storm flag-carrier indicator, dungeon
boss progress, world-event collection trackers.

Each entry binds a server-side variableIndex to a UI panel
kind (counter / timer / flag-icon / progress-bar / two-sided
score / custom) gated by mapId+areaId, with optional
alwaysVisible and hideWhenZero flags and a chosen panel
position (top / bottom / top-left / top-right / center).

Cross-references with prior formats — mapId points at
WMS.mapId and areaId points at WMS.areaId.

CLI: --gen-wsui (3-entry BG scoreboard starter for WSG/AB/
EotS), --gen-wsui-wintergrasp (4-entry full Wintergrasp UI),
--gen-wsui-dungeon (3-entry boss/keys/treasure hunt UI),
--info-wwui, --validate-wwui with --json variants. Validator
catches id=0/duplicates, kind/position out of range,
variableIndex=0 warning, alwaysVisible+hideWhenZero conflict
warning, and (mapId, variableIndex) collision warning when
two entries would read the same server slot on the same map.

Also extends --list-formats and --info-magic with WWUI.
2026-05-09 19:32:15 -07:00
Kelsi
4b928274b8 feat(editor): add --rename-by-magic extension recovery flag
Reads the 4-byte magic of a file, looks it up in the shared
format table, and renames the file to use the correct .w*
extension. Useful when files have lost their extensions
(downloaded as 'data.bin', extracted from a tarball with
mangled metadata, or copied via a tool that strips suffixes).

Safe by default — refuses to overwrite an existing target;
pass --force to allow overwrite. --dry-run prints the planned
move without touching the filesystem. Files that already have
the correct extension are a no-op. Unrecognized magic exits
1 with the bytes printed for diagnostic context.

Reuses cli_format_table.cpp so any future format addition is
picked up automatically.
2026-05-09 19:29:18 -07:00
Kelsi
824a6c8cab feat(editor): add --summary-dir bulk content inventory
Recursively walks a directory, identifies every file by 4-byte
magic, and reports per-format file count, total entries, and
bytes. Useful for content audits ("how many cinematics did
this asset bundle ship?") and for tracking migration progress
("what fraction of zones still lack a holiday catalog?").

Also extracts the format-magic table out of cli_info_magic.cpp
into a shared cli_format_table.{hpp,cpp} so --info-magic and
--summary-dir reuse the same source of truth — adding a new
format now updates one row in one file instead of two. Both
flags use the standard catalog header (magic + version + name
+ entryCount) for catalog formats; asset/world formats are
counted but report 0 entries since their headers differ.

Supports --json variant for tooling integration.
2026-05-09 19:27:48 -07:00
Kelsi
c3121be011 feat(editor): add WSVK JSON round-trip (export/import sidecar)
Closes the JSON round-trip gap on the spell visual kit catalog
format shipped this batch. --export-wsvk-json emits all 12
scalar fields and 4 model-path strings. WSVK has no enum
fields, so the JSON mapping is a straight-through dump with
no name-form widening. --import-wsvk-json parses it back,
defaulting unset fields to 0/empty. Verified byte-identical
round-trip on all three preset emitters (starter / combat /
utility). 731 documented CLI flags.
2026-05-09 19:24:37 -07:00
Kelsi
beca69352a feat(pipeline): add WSVK (Wowee Spell Visual Kit) catalog
47th open format — replaces SpellVisualKit.dbc +
SpellVisualEffectName.dbc plus the AzerothCore-style spell
visual SQL data. Defines per-spell visual presentations:
cast-bar effect model, projectile model + travel speed +
arc gravity, impact effect model, hand effect on the caster,
and the animations + sounds that fire at cast / channel /
impact time.

Cross-references with prior formats — castAnimId / impactAnimId
/ precastAnimId point at WANI.animationId, castSoundId /
impactSoundId point at WSND.soundId. Spell catalogs (WSPL)
will reference visualKitId here to bind "what mechanically
happens" to "what plays visually."

CLI: --gen-svk (3-kit Frostbolt/Fireball/HealingTouch starter
showing projectile + AoE + heal patterns), --gen-svk-combat
(5 melee/ranged with WANI animation refs), --gen-svk-utility
(4 portal/hearth/mount/resurrect with no projectile),
--info-wsvk, --validate-wsvk with --json variants. Validator
catches id=0/duplicates, missing name, negative speeds/radii,
projectile-model + speed coherence (model without speed =
never travels; speed without model = invisible), and a
no-effect catch-all (no models + no anims + no sounds).
2026-05-09 19:23:36 -07:00
Kelsi
441b962c3f feat(editor): add WANI JSON round-trip (export/import sidecar)
Closes the JSON round-trip gap on the animation catalog format
shipped last batch. --export-wani-json emits all 8 scalar
fields plus a dual int + name form for behaviorTier so
hand-edits can use either representation. --import-wani-json
accepts either form, falling back to the int when both are
present, and defaults weaponFlags to kWeaponAny when omitted
to preserve compatibility with hand-authored sidecars that
forget to specify it. Verified byte-identical round-trip on
all three preset emitters (starter / combat / movement).
724 documented CLI flags.
2026-05-09 19:20:22 -07:00
Kelsi
dadf72307c feat(pipeline): add WANI (Wowee Animation) catalog
46th open format — replaces AnimationData.dbc plus the
hard-coded animation-id tables in M2 model loaders. Defines
named animations (Stand, Walk, Run, Cast, Death, MountIdle,
Fly, ...) with fallback chains, behavior tier (default /
mounted / sitting / aerial / swimming), and weapon-flag
bitmasks that select the correct animation variant when the
model wields 1H / 2H / dual / bow / rifle / wand / etc.

Cross-references with prior formats — fallbackId resolves
within the same WANI catalog (graceful degradation when the
requested animation is absent: Run falls back to Walk,
Attack2H falls back to Attack1H).

10 weapon-flag constants + 6 behavior flags (Looped,
BlendableCycle, Interruptable, MovementSync, OneShot,
PreserveAtEnd). 5 behavior tiers. CLI: --gen-animations
(5 essentials), --gen-animations-combat (8 weapon-typed
attacks + parry + channel), --gen-animations-movement (6
locomotion anims with tier transitions). Validator catches
id-uniqueness, fallback-self-loop, looped-without-duration,
mutually-exclusive Looped+OneShot flags, weaponFlags=0
warning, and unresolved fallback warnings.

Also extends --list-formats and --info-magic with WANI.
2026-05-09 19:19:13 -07:00
Kelsi
cdfb55c477 feat(editor): add --info-magic auto-detect inspector
Reads the first 4 bytes of any file, looks the magic up in
the format table, and reports: format name, file extension,
category, plus the standard catalog header fields (version,
catalog name, entry count) for any of the 33 catalog formats
that share the magic+version+name+entryCount layout.

Also suggests the matching --info-* flag so users who receive
.w* files without context can route to the right inspector
in one step. World/asset formats (WOM/WOB/WHM/WOT/WOW) are
recognized by magic but the catalog-style header probe is
skipped (their layouts differ).

Returns exit 1 + 'unrecognized' message on non-Wowee files.
Supports --json variant for tooling integration.
2026-05-09 19:16:26 -07:00
Kelsi
3fd978ef89 feat(editor): add WLIQ JSON round-trip (export/import sidecar)
Closes the JSON round-trip gap on the liquid catalog format
shipped this batch. --export-wliq-json emits all 14 scalar
fields (incl. 3-byte fog RGB) plus a dual int + name form for
liquidKind so hand-edits can use either representation.
--import-wliq-json accepts either form, falling back to the
int when both are present. Verified byte-identical round-trip
on all three preset emitters (starter / magical / hazardous).
716 documented CLI flags.
2026-05-09 19:11:14 -07:00
Kelsi
fb07b276f2 feat(pipeline): add WLIQ (Wowee Liquid Type) catalog
45th open format — replaces LiquidType.dbc plus the
AzerothCore-style terrain liquid descriptor data. Defines
liquid materials used by terrain MCNK liquid layers, WMO
interior pools, and procedurally generated fluid bodies in
custom zones. Each liquid pairs a render material (shader +
texture array + flow vectors + fog color) with gameplay data
(damage spell, raw DPS, ambient + splash audio cross-refs).

Cross-references with prior formats — ambientSoundId and
splashSoundId point at WSND.soundId, damageSpellId points at
WSPL.spellId.

10 liquid kinds (Water / Magma / Slime / OceanSalt / FelFire /
HolyLight / TarOil / AcidBog / FrozenWater / UnderworldGoo)
covering both natural and magical fluids. Per-liquid: viscosity
(0=water, 1=slime), flow direction+speed (radians+units/sec),
fog density+RGB, packed minimap RGBA color.

CLI: --gen-liquids (3-entry classic Water/Lava/Slime starter),
--gen-liquids-magical (4 magical pools incl. fel/holy/cosmic),
--gen-liquids-hazardous (3 high-damage liquids with WSPL DoT
cross-refs), --info-wliq, --validate-wliq with --json variants.
Validator catches id=0/duplicates, missing shader/material,
kind out of range, fog/viscosity outside 0..1, hazardous-kind-
without-damage warning, and Water/OceanSalt-with-damage warning
to flag accidental misconfiguration.
2026-05-09 19:10:03 -07:00
Kelsi
0c732a9133 feat(editor): add WHOL JSON round-trip (export/import sidecar)
Closes the JSON round-trip gap on the holiday catalog format
shipped last batch. --export-whol-json emits all 13 scalar
fields plus dual int + name forms for holidayKind and
recurrence so hand-edits can use either representation.
--import-whol-json accepts either form, falling back to the
int when both are present. Verified byte-identical round-trip
on all three preset emitters (starter / weekly / special).
709 documented CLI flags.
2026-05-09 19:07:08 -07:00
Kelsi
2666b976c9 feat(pipeline): add WHOL (Wowee Holiday) catalog
44th open format — replaces Holidays.dbc + HolidayDescriptions.dbc
+ HolidayNames.dbc plus the AzerothCore-style game_event SQL
tables. Defines time-gated world events: seasonal holidays
(Hallow's End / Brewfest / Winter Veil), weekly call-to-arms BG
bonuses, world-PvP windows (Wintergrasp), one-shot specials, and
recurring daily / weekly resets. Each holiday has a recurrence
rule (Annual / Monthly / WeeklyRecur / OneTime), a calendar
window (startMonth + startDay + durationHours), and optional
cross-refs to a feature creature, an intro quest, and a token /
item reward issued during the window.

Cross-references with prior formats — holidayQuestId points at
WQT.questId, bossCreatureId points at WCRT.creatureId,
itemRewardId points at WIT.itemId, and areaIdGate / mapIdGate
point at WMS.areaId / WMS.mapId.

CLI: --gen-holidays (3 seasonal starter), --gen-holidays-weekly
(3 weekly BG call-to-arms windows), --gen-holidays-special (3
world-PvP / lunar / children events), --info-whol, --validate-whol
with --json variants. Validator catches id=0/duplicates, kind /
recurrence out of range, durationHours=0, invalid month/day for
non-weekly recurrence, and calendar-only events (no quest +
boss + reward) as a warning.
2026-05-09 19:05:33 -07:00
Kelsi
be96775dc6 feat(editor): add WVHC JSON round-trip (export/import sidecar)
Closes the JSON round-trip gap on the vehicle catalog format
shipped last batch. --export-wvhc-json emits all 10 scalar
fields plus a nested array of seats per entry, and dual int +
name forms for vehicleKind / movementKind / powerType so
hand-edits can use either representation. --import-wvhc-json
accepts either form, falling back to the int when both are
present, and reconstructs the seat array preserving seat
flags / attachments / control-spell cross-refs. Verified
byte-identical round-trip on all three preset emitters
(starter / siege / flying), including nested seat data. 702
documented CLI flags.
2026-05-09 19:02:17 -07:00
Kelsi
7c00a491a5 feat(editor): add WGLY JSON round-trip (export/import sidecar)
Closes the JSON round-trip gap on the glyph catalog format
shipped last batch. --export-wgly-json emits all 8 scalar
fields plus a dual int + name form for glyphType so hand-edits
can use either representation. --import-wgly-json accepts
either form, falling back to the int when both are present.
Verified byte-identical round-trip on all three preset emitters
(starter / warrior / universal). 700 documented CLI flags.
2026-05-09 19:01:03 -07:00
Kelsi
dcbc9706f2 feat(pipeline): add WVHC (Wowee Vehicle) catalog
43rd open format — replaces Vehicle.dbc + VehicleSeat.dbc plus
the AzerothCore-style vehicle_template SQL tables. Defines
drivable vehicles: tanks, demolishers, motorcycles, gryphons,
choppers, siege weapons, multi-passenger transports. Each entry
pairs a creature template (the rendered model) with a fixed
seat layout — driver / passenger / gunner seats with their own
attachment points, control flags (kSeatDriver / kSeatGunner /
kSeatPassenger / kSeatHidesPlayer / kSeatNoEjectByCC), and
per-seat abilities mounted to the action bar.

Cross-references with prior formats — creatureId points at
WCRT.creatureId (the rendered model), flightCapabilityId points
at WMNT.mountId for shared fly-speed tables, and per-seat
controlSpellId / exitSpellId point at WSPL.spellId.

CLI: --gen-vehicles (3-vehicle starter chopper/wind-rider/tank),
--gen-vehicles-siege (3 siege weapons with control spellIds),
--gen-vehicles-flying (3 flying mounts cross-ref WMNT
flightCapabilityIds), --info-wvhc, --validate-wvhc with --json
variants. Validator catches id=0/duplicates, missing creature,
enum out-of-range, empty seat list, flying-vehicle on wrong
movement (would fall through world), driver-flag exclusivity
(0 or >1 drivers), and duplicate seatIndex within a vehicle.
2026-05-09 18:59:49 -07:00
Kelsi
0d9c449fdc feat(editor): add WCMS JSON round-trip (export/import sidecar)
Closes the JSON round-trip gap on the cinematic catalog format
shipped two batches ago. --export-wcms-json emits all 9 scalar
fields plus dual int + name forms for kind and triggerKind so
hand-edits can use either representation. --import-wcms-json
accepts either form, falling back to the int when both are
present. Verified byte-identical round-trip on all three preset
emitters (starter / intros / quests).
2026-05-09 18:56:29 -07:00
Kelsi
92327fc0c0 feat(pipeline): add WGLY (Wowee Glyph) catalog
42nd open format — replaces GlyphProperties.dbc + GlyphSlot.dbc
plus the AzerothCore-style glyph_properties SQL table. Defines
the WotLK glyph system: per-class inscribable glyphs that
modify spell behavior. Each entry pairs a glyph item (the
inscriber's craft output) with the spell aura that applies the
modification, tagged with a Major / Minor / Prime slot type and
a classMask of allowed classes.

Cross-references with prior formats — spellId points at
WSPL.spellId (the aura), itemId points at WIT.itemId (the
inscribed item), and classMask bit positions match the WCHC
classId enum (1=Warrior, 2=Paladin, 3=Hunter, etc).

CLI: --gen-glyphs (3-entry per-role starter), --gen-glyphs-warrior
(6-entry full warrior allotment), --gen-glyphs-universal (4
classMask=All utility glyphs), --info-wgly, --validate-wgly with
--json variants. Validator catches id=0/duplicates, empty name,
spellId=0 (glyph applies no aura), classMask=0 (no class can
inscribe), itemId=0 warning, requiredLevel<25 warning (below
WotLK glyph threshold), and glyphType out-of-range.
2026-05-09 18:55:22 -07:00
Kelsi
d2dbf1959d feat(editor): add WCHN JSON round-trip (export/import sidecar)
Closes the JSON round-trip gap on the channels catalog format
shipped last batch. --export-wchn-json emits all 10 scalar fields
plus dual int + name forms for channelType and factionAccess so
hand-edits can use either representation. --import-wchn-json
accepts either form, falling back to the int when both are
present. Verified byte-identical round-trip on all three preset
emitters (starter / city / moderated).
2026-05-09 18:52:32 -07:00
Kelsi
0be9bf86db feat(pipeline): add WCMS (Wowee Cinematic) catalog
41st open format — replaces Movie.dbc / CinematicCamera.dbc /
CinematicSequences.dbc plus the AzerothCore cinematic_camera SQL
table. Defines pre-rendered videos, in-engine camera flythroughs,
text crawls, and still images, each with a media path, duration,
skippable flag, and a polymorphic trigger that fires on quest
events / class first-login / zone entry / dungeon clear /
achievements / level milestones.

Cross-references with prior formats — triggerTargetId resolves
by triggerKind to WQT.questId / WMS.areaId / WMS.mapId /
WCHC.classId / WACH.achievementId, and soundtrackId points at
WSND.soundId.

CLI: --gen-cinematics (3-entry starter), --gen-cinematics-intros
(4 class intros), --gen-cinematics-quests (3 quest-bound
cinematics referencing demo questIds 1/100/102), --info-wcms,
--validate-wcms with --json variants. Validator catches
id=0/duplicates, empty name/mediaPath, kind/trigger out of
range, missing target id for non-Manual/Login/LevelUp triggers,
zero-duration entries, and non-skippable pre-rendered videos.
2026-05-09 18:50:43 -07:00
Kelsi
89fcd4d4cb feat(editor): add WAUC JSON round-trip authoring workflow
Closes the WAUC open-format loop with --export-wauc-json /
--import-wauc-json, mirroring the JSON pairs added for
every other novel binary format. All 33 binary formats
added since WOL now have full JSON round-trip authoring.

Each house round-trips all 14 scalar fields plus the
factionAccess enum dual int + name forms (alliance / horde
/ neutral / both).

Verified byte-identical round-trip on the faction-pair
preset (3 houses including Stormwind/Orgrimmar/Booty Bay
with different cut rates and auctioneer NPC IDs preserved
through the JSON layer).

Adds 2 flags (679 documented total now).
2026-05-09 18:45:01 -07:00
Kelsi
af214d8b34 feat(pipeline): add WCHN (Wowee Chat Channel) catalog
Novel open replacement for Blizzard's ChatChannels.dbc +
the AzerothCore-style chat_channel SQL tables. The 40th
open format added to the editor.

Defines the world chat channel system: General, Trade,
LookingForGroup, GuildRecruitment, LocalDefense, plus
per-zone area channels and custom user-created channels.
Each channel has access rules (faction / level), join
behavior (auto vs opt-in), broadcast policy (announce /
moderated), and optional area / map gating that auto-joins
or auto-leaves the channel as the player moves.

Cross-references with previously-added formats:
  WCHN.entry.areaIdGate -> WMS.area.areaId
                           (channel auto-attaches in this area)
  WCHN.entry.mapIdGate  -> WMS.map.mapId
                           (channel auto-attaches on this map)

Format:
  • magic "WCHN", version 1, little-endian
  • per channel: channelId / name / description /
    channelType / factionAccess / autoJoin / announce /
    moderated / minLevel / areaIdGate / mapIdGate

Enums:
  • ChannelType (10): AreaLocal / Zone / Continent / World /
                      Trade / LookingForGroup / GuildRecruit /
                      LocalDefense / Custom / Pvp
  • FactionAccess (3): Alliance / Horde / Both

API: WoweeChannelLoader::save / load / exists / findById.

Three preset emitters:
  • makeStarter   — 4 stock channels (General Zone +
                     Trade + LFG + GuildRecruit) with
                     default autoJoin policies
  • makeCity      — 5 city-specific channels (3 Stormwind +
                     2 Orgrimmar) with mapId / areaId gates
                     so they auto-attach on entry
  • makeModerated — 3 moderated / restricted channels
                     (LocalDefense level 10+, WorldDefense
                     moderated, RaidCoordination level 60+)

CLI added (5 flags, 677 documented total now):
  --gen-channels / --gen-channels-city / --gen-channels-moderated
  --info-wchn / --validate-wchn

Validator catches: channelId=0 + duplicates, empty name,
unknown channelType / factionAccess, world / continent
channel with area or map gate (gate is silently ignored at
runtime — usually a typo), minLevel=0 (no level gate at all).
2026-05-09 18:43:26 -07:00
Kelsi
13f09b8cb7 feat(editor): add WPET JSON round-trip authoring workflow
Closes the WPET open-format loop with --export-wpet-json /
--import-wpet-json, mirroring the JSON pairs added for
every other novel binary format. All 32 binary formats
added since WOL now have full JSON round-trip authoring.

Two top-level arrays mirror the binary layout:
  • families[] — familyId / name / description / icon /
                  petType (dual int + name) /
                  baseAttackSpeed / damageMultiplier /
                  armorMultiplier / dietMask + name /
                  abilities[]
  • minions[]  — minionId / name / summonSpellId /
                  creatureId / abilities[]

Verified byte-identical round-trip on the starter preset
(2 hunter families with 3 abilities each + 1 warlock Imp
with 2 abilities including autocast preferences preserved
through the JSON layer).

Adds 2 flags (672 documented total now).
2026-05-09 18:37:12 -07:00
Kelsi
ab72380ee0 feat(pipeline): add WAUC (Wowee Auction House) catalog
Novel open replacement for Blizzard's AuctionHouse.dbc +
the AzerothCore-style auctionhouse / auctionhousebot SQL
tables. The 39th open format added to the editor.

Defines per-house rules for the auction system: faction
access, deposit rate (basis points of buyout price), house
cut on successful sale, three listing duration tiers with
per-tier deposit multipliers, disallowed item-class bitmask,
and the auctioneer NPC.

Cross-references with previously-added formats:
  WAUC.entry.auctioneerNpcId   -> WCRT.entry.creatureId
                                   (Auctioneer-flagged NPC)
  WAUC.entry.disallowedClassMask
                                  bitmask of WIT.Class values
                                  that may not be auctioned at
                                  this house

The faction-pair preset captures the canonical asymmetry:
faction houses charge 5% on a successful sale while neutral
houses charge 15% — the cross-faction tax that makes
neutral AHs profitable for goblins.

Format:
  • magic "WAUC", version 1, little-endian
  • per house: houseId / auctioneerNpcId / name /
    factionAccess / baseDepositRateBp / houseCutRateBp /
    maxBidCopper / 3 duration hours + 3 deposit multipliers /
    disallowedClassMask

Enums:
  • FactionAccess (4): Alliance / Horde / Neutral / Both
  • Rates use basis points: 10000 = 100%

API: WoweeAuctionLoader::save / load / exists / findById.

Three preset emitters showcase typical auction setups:
  • makeStarter        — 1 neutral house with default 12h /
                          24h / 48h tiers
  • makeFactionPair    — 3 houses (Stormwind / Orgrimmar /
                          Booty Bay) with auctioneer NPC IDs
                          + canonical faction-vs-neutral cut
                          rates
  • makeRestricted     — 1 house disallowing Containers (1) +
                          Quest items (12) + Keys (13) with
                          tighter durations + 1000g bid cap

CLI added (5 flags, 670 documented total now):
  --gen-auction / --gen-auction-pair / --gen-auction-restricted
  --info-wauc / --validate-wauc

Validator catches: houseId=0 + duplicates, empty name,
factionAccess out of range, duration tier=0, durations not
in short<=medium<=long order, houseCutRateBp >= 100% (seller
loses money on a sale), warns on >50% cut.
2026-05-09 18:34:54 -07:00
Kelsi
a3af35ec49 feat(editor): add WPCD JSON round-trip authoring workflow
Closes the WPCD open-format loop with --export-wpcd-json /
--import-wpcd-json, mirroring the JSON pairs added for
every other novel binary format. All 31 binary formats
added since WOL now have full JSON round-trip authoring.

Each condition round-trips all 9 scalar fields. Two
enum-typed fields emit dual int + name forms:
  • kind       (true / false / quest-done / has-item /
                 min-level / class / event / area / title / ...)
  • aggregator (and / or)

Verified byte-identical round-trip on the gated preset
(5 conditions in 2 groups demonstrating both AND and OR
aggregation, with full polymorphic targetId / minValue /
maxValue payload preserved through the JSON layer).

Adds 2 flags (665 documented total now).
2026-05-09 18:28:47 -07:00
Kelsi
62e793800c feat(pipeline): add WPET (Wowee Pet System) catalog
Novel open replacement for AzerothCore-style pet_template +
pet_levelstats SQL + the pet-related subsets of
CreatureFamily.dbc + SpellFamilyName.dbc. The 38th open
format added to the editor.

Defines two related kinds of player-controlled NPCs in
one catalog:
  • Pet families  — hunter pet families (Wolf / Cat / Bear /
                     Boar / Raptor / Spider / etc.) with
                     per-family ability sets, base stat
                     multipliers, and diet preferences
  • Warlock minions — Imp / Voidwalker / Succubus /
                       Felhunter / Felguard, each with
                       their own summon spell, creature
                       template, and ability list

Cross-references with previously-added formats:
  WPET.family.familyId          -> WCRT.entry.familyId
                                    (matches creature family)
  WPET.family.abilities.spellId -> WSPL.entry.spellId
  WPET.minion.summonSpellId     -> WSPL.entry.spellId
  WPET.minion.creatureId        -> WCRT.entry.creatureId
                                    (used for stat scaling)
  WPET.minion.abilities.spellId -> WSPL.entry.spellId

The starter preset's familyIds (1=Wolf, 2=Cat) match
WCRT::FamilyId enum values, so a hunter taming a wolf via
WCRT links straight through to WPET ability sets.

Format:
  • magic "WPET", version 1, little-endian
  • families[]: familyId / name / description / icon /
    petType / baseAttackSpeed / damageMultiplier /
    armorMultiplier / dietMask / abilities[]
  • minions[]: minionId / name / summonSpellId / creatureId /
    abilities[] (each: spellId / rank / autocastDefault)

Enums:
  • PetType (3): Cunning / Ferocity / Tenacity
                  (WotLK+ talent tree categorization)
  • DietFlags:   Meat / Fish / Bread / Cheese / Fruit / Fungus

API: WoweePetLoader::save / load / exists +
WoweePet::findFamily / findMinion + dietMaskName helper
that decodes a dietMask into a "meat+fish" string.

Three preset emitters showcase typical pet catalogs:
  • makeStarter — 2 hunter families (Wolf + Cat) with full
                   3-ability sets + 1 warlock Imp
  • makeHunter  — 8 classic hunter families covering all
                   3 petType categories with appropriate
                   diet masks
  • makeWarlock — 5 warlock minions each with summon spell
                   ID and creatureId pointing into WCRT

CLI added (5 flags, 663 documented total now):
  --gen-pets / --gen-pets-hunter / --gen-pets-warlock
  --info-wpet / --validate-wpet

Validator catches: ids=0 + duplicates, empty name, petType
out of range, baseAttackSpeed<=0 (would divide by zero in
DPS calc), dietMask=0 (pet cannot be fed for happiness),
minion missing summonSpellId / creatureId.
2026-05-09 18:27:02 -07:00
Kelsi
650651ee2b feat(editor): add WGLD JSON round-trip authoring workflow
Closes the WGLD open-format loop with --export-wgld-json /
--import-wgld-json, mirroring the JSON pairs added for
every other novel binary format. All 30 binary formats
added since WOL now have full JSON round-trip authoring.

Each guild round-trips header scalars (12 fields) plus the
4 sub-arrays:
  • ranks[]    — rank ladder with permissions + money cap
  • members[]  — character roster with rank + notes
  • bankTabs[] — per-tab name + 3 permission masks
  • perks[]    — purchased buffs with WSPL spell refs

factionId emits dual int + name forms (alliance / horde).

Verified byte-identical round-trip on the full preset
(1 guild with 6 ranks + 8 members + 4 bank tabs + 3
perks; all permission masks and per-rank money caps
preserved through the JSON layer).

Adds 2 flags (658 documented total now).
2026-05-09 18:20:43 -07:00
Kelsi
f290a0d4a9 feat(pipeline): add WPCD (Wowee Player Condition) format
Novel open replacement for Blizzard's PlayerCondition.dbc +
the AzerothCore-style condition_template SQL tables. The
37th open format added to the editor.

Defines reusable boolean conditions that other formats can
reference for gating: "player has quest X completed",
"player level >= N", "player class is mage", "player has
item Y in inventory", "WSEA event Z is active".

Conditions can be grouped and combined with AND/OR
aggregators on a per-group basis: a quest-giver gossip
option that says "show only to level 60 alliance mages
who completed quest 1234" composes 4 conditions sharing
the same groupId with AND aggregation. The runtime walks
each group, applies the group's aggregator, and returns
the boolean result to the caller.

Cross-references with previously-added formats — the
targetId field has a polymorphic interpretation by kind:
  WPCD.targetId (kind=QuestCompleted/Active) -> WQT.questId
  WPCD.targetId (kind=HasItem)               -> WIT.itemId
  WPCD.targetId (kind=HasSpell)              -> WSPL.spellId
  WPCD.targetId (kind=HasAchievement)        -> WACH.achievementId
  WPCD.targetId (kind=AreaId)                -> WMS.areaId
  WPCD.targetId (kind=EventActive)           -> WSEA.eventId
  WPCD.targetId (kind=HasTitle)              -> WTIT.titleId
  WPCD.targetId (kind=FactionRep)            -> WFAC.factionId
  WPCD.targetId (kind=Class/Race)            -> WCHC class/race id

Future format extensions can reference WPCD.conditionId in
their own gating fields — WTRG triggers gated by player
state, WGSP options visible only when conditions are met,
WMOU summon spells condition-gated by quest progress, etc.

Format:
  • magic "WPCD", version 1, little-endian
  • per condition: conditionId / groupId (0 = standalone) /
    name / description / kind / aggregator / negated /
    targetId / minValue / maxValue

Enums:
  • Kind (17): AlwaysTrue / AlwaysFalse / QuestCompleted /
                QuestActive / HasItem / HasSpell / MinLevel /
                MaxLevel / ClassMatch / RaceMatch /
                FactionRep / HasAchievement / TeamSize /
                GuildLevel / EventActive / AreaId / HasTitle
  • Aggregator (2): And / Or

API: WoweeConditionLoader::save / load / exists / findById.

Three preset emitters showcase typical usage:
  • makeStarter — 4 standalone conditions covering the most
                   common kinds (quest-done / has-item /
                   min-level / class)
  • makeGated   — 5 conditions in 2 groups demonstrating
                   AND-aggregation (alliance + mage + lvl 60)
                   and OR-aggregation (did quest 1 OR quest 100)
  • makeEvent   — 3 event-gated conditions cross-referencing
                   WSEA event IDs (Hallow's End / Brewfest /
                   Winter's Veil)

CLI added (5 flags, 656 documented total now):
  --gen-conditions / --gen-conditions-gated / --gen-conditions-event
  --info-wpcd / --validate-wpcd

Validator catches: conditionId=0 + duplicates, kind /
aggregator out of range, kinds requiring targetId having
target=0 (skips AlwaysTrue/False, MinLevel/MaxLevel,
TeamSize, GuildLevel which use min/max instead), TeamSize
with min > max.
2026-05-09 18:18:27 -07:00
Kelsi
d14f820a14 feat(editor): add WGEM JSON round-trip authoring workflow
Closes the WGEM open-format loop with --export-wgem-json /
--import-wgem-json, mirroring the JSON pairs added for
every other novel binary format. All 29 binary formats
added since WOL now have full JSON round-trip authoring.

Two top-level arrays mirror the binary layout:
  • gems[]         — gemId / itemIdToInsert / name / color
                      (dual int + name) / statType+Value /
                      requiredItemQuality / spellId
  • enchantments[] — enchantId / name / description / icon /
                      enchantSlot (dual int + name) /
                      statType+Value / spellId / duration /
                      chargeCount

Verified byte-identical round-trip on the enchants preset
(5 enchantments including 3 proc-based with WSPL spellId
cross-refs in the 28000-29000 placeholder range, plus
ring/cloak slot variants with chargeCount preserved).

Adds 2 flags (651 documented total now).
2026-05-09 18:12:33 -07:00
Kelsi
80ebf1dba5 feat(pipeline): add WGLD (Wowee Guild) catalog format
Novel open replacement for AzerothCore-style guild +
guild_member + guild_rank + guild_bank_tab + guild_perk
SQL tables. The 36th open format added to the editor.

Each guild entry holds the complete social-organization
state: header (name, leader, faction, MOTD, info,
creation date, level + experience, bank money, packed
emblem), rank ladder with permissions bitmask + daily
withdraw caps, member roster with rank + join date +
public/officer notes, bank tabs with per-tab and per-rank
deposit / withdraw / view permission masks, and purchased
guild perks referencing WSPL spell IDs.

Cross-references with previously-added formats:
  WGLD.entry.factionId       ~  WCHC.race.factionId
                                 (guilds are faction-locked)
  WGLD.entry.perks.spellId  -> WSPL.entry.spellId

Format:
  • magic "WGLD", version 1, little-endian
  • per guild: header (12 scalar fields + 4 strings) +
    ranks[] + members[] + bankTabs[] + perks[]
  • per rank: rankIndex / name / permissionsMask /
    moneyPerDayCopper
  • per member: characterName / rankIndex / joinedDate /
    publicNote / officerNote
  • per bankTab: tabIndex / name / iconPath /
    deposit+withdraw+view permission masks
  • per perk: perkId / name / spellId / requiredGuildLevel

Enums:
  • Faction (2): Alliance / Horde
  • RankPermissionFlags (14): GuildChat / OfficerChat /
                               Invite / Remove / Promote /
                               Demote / SetMotd /
                               EditPublicNote /
                               EditOfficerNote / ViewBank /
                               Deposit / Withdraw / Disband /
                               RepairFromBank

API: WoweeGuildLoader::save / load / exists / findById +
shared addDefaultRanks helper used by both starter and
faction-pair presets.

Three preset emitters:
  • makeStarter     — 1 small guild, default 5-rank ladder
                       (GM/Officer/Veteran/Member/Initiate),
                       3 members borrowing names from WCRT
                       merchants for cross-format consistency
  • makeFull        — 1 fleshed-out guild: 6 ranks (with
                       Recruit added) + 8 members + 4 bank
                       tabs (officer-only withdraw on tabs
                       3+4) + 3 perks referencing WSPL
                       spell IDs (Heroic Strike / Battle
                       Shout / Thunder Clap as placeholder
                       perk procs)
  • makeFactionPair — 2 parallel guilds, one Alliance + one
                       Horde, with identical rank structures

CLI added (5 flags, 649 documented total now):
  --gen-guilds / --gen-guilds-full / --gen-guilds-pair
  --info-wgld / --validate-wgld

Validator catches: guildId=0 + duplicates, empty name /
leaderName, factionId out of range, no ranks (members can't
exist without a rank ladder), member.rankIndex exceeding
the highest defined rank (intra-format cross-reference
resolution), duplicate bank tabIndices, perks with
spellId=0 (perk does nothing).
2026-05-09 18:10:45 -07:00
Kelsi
37a30ec256 feat(editor): add WMAL JSON round-trip authoring workflow
Closes the WMAL open-format loop with --export-wmal-json /
--import-wmal-json, mirroring the JSON pairs added for
every other novel binary format. All 28 binary formats
added since WOL now have full JSON round-trip authoring.

Each template round-trips all 11 scalar fields plus the
variable-length attachments array. categoryId emits dual
int + name forms (quest / auction / gm / achievement /
event / raffle / script / returned).

Verified byte-identical round-trip on the holiday preset
(4 templates with full WIT itemId attachments matching
WTKN seasonal token IDs preserved through the JSON layer).

Adds 2 flags (644 documented total now).
2026-05-09 18:04:03 -07:00
Kelsi
a50d83f6c9 feat(pipeline): add WGEM (Wowee Gem / Enchantment) format
Novel open replacement for Blizzard's ItemEnchantment.dbc +
GemProperties.dbc + SpellItemEnchantment.dbc. The 35th
open format added to the editor.

Defines two related kinds of item enhancement in one
catalog:
  • Gems         — socketable jewelry pieces with color
                    (red / blue / yellow / meta) that fit
                    into gear sockets, granting stats or
                    triggering passive spells when socketed
  • Enchantments — persistent buffs applied to weapon /
                    armor pieces, either by an enchanter
                    spell or by an item proc (Mongoose,
                    Crusader, Berserking)

Cross-references with previously-added formats:
  WGEM.gem.itemIdToInsert  -> WIT.entry.itemId
  WGEM.gem.spellId         -> WSPL.entry.spellId
  WGEM.enchantment.spellId -> WSPL.entry.spellId

Format:
  • magic "WGEM", version 1, little-endian
  • gems[]: gemId / itemIdToInsert / name / color /
    statType + statValue / requiredItemQuality / spellId
  • enchantments[]: enchantId / name / description /
    iconPath / enchantSlot / statType + statValue /
    spellId / durationSeconds / chargeCount

Enums:
  • Color (8):       Meta / Red / Yellow / Blue / Purple /
                      Green / Orange / Prismatic
  • EnchantSlot (5): Permanent / Temporary / SocketColor /
                      Ring / Cloak

API: WoweeGemLoader::save / load / exists +
WoweeGem::findGem / findEnchant.

Three preset emitters showcase common shapes:
  • makeStarter  — 3 gems (one per primary color) +
                    2 enchantments (proc + stat)
  • makeGemSet   — 6-gem full color palette covering
                    primary + secondary combinations
  • makeEnchants — 5 enchant variants spanning slots
                    (Mongoose / Deadly Poison / stats ring /
                    cloak / Berserking)

CLI added (5 flags, 642 documented total now):
  --gen-gems / --gen-gems-set / --gen-gems-enchants
  --info-wgem / --validate-wgem

Validator catches: ids=0 + duplicates, empty name, color /
slot out of range, stat-only entries with statValue=0 (gem
provides nothing), chargeCount > 0 on non-Temporary
enchant slots (charges silently ignored at runtime).

The validator caught a real preset issue on first run —
the proc enchants (Mongoose / Deadly Poison / Berserking)
had spellId=0 and statValue=0, providing nothing. Fixed by
adding placeholder spellIds in the 28000-29000 range, with
a comment noting they resolve to real WSPL proc spells
when the spell catalog is extended.
2026-05-09 18:01:48 -07:00
Kelsi
71207b30e9 feat(editor): add WBGD JSON round-trip authoring workflow
Closes the WBGD open-format loop with --export-wbgd-json /
--import-wbgd-json, mirroring the JSON pairs added for
every other novel binary format. All 27 binary formats
added since WOL now have full JSON round-trip authoring.

Each battleground round-trips all scalar fields plus the
allianceStart and hordeStart vec3 + facing pairs (positions
become 3-element JSON arrays for natural hand-edit). The
objectiveKind enum emits dual int + name forms.

Verified byte-identical round-trip on the classic preset
(3 BGs spanning CTF / control nodes / resource race
objectives with full WMS map + WTKN markTokenId
cross-refs preserved through the JSON layer).

Adds 2 flags (637 documented total now).
2026-05-09 17:53:41 -07:00
Kelsi
492d626c3b feat(pipeline): add WMAL (Wowee Mail Template) format
Novel open replacement for AzerothCore-style
mail_loot_template SQL + the in-game mail subset of the
inventory + currency systems. The 34th open format added
to the editor.

Defines templated mail messages with currency + item
attachments. Triggered by quest reward delivery (overflow
when bag is full), auction house bid wins / sales,
achievement reward attachments, GM correspondence, holiday
event mailings (Brewfest samples, Hallow's End candy), and
returned-mail-on-rejection.

Cross-references with previously-added formats:
  WMAL.entry.senderNpcId        -> WCRT.entry.creatureId
  WMAL.entry.attachments.itemId -> WIT.entry.itemId

Format:
  • magic "WMAL", version 1, little-endian
  • per template: templateId / senderNpcId / subject / body /
    senderName / moneyCopperAttached / categoryId / cod /
    returnable / expiryDays / attachments[] (each: itemId +
    quantity)

Enums:
  • Category (8): QuestReward / Auction / GmCorrespondence /
                   AchievementReward / EventMailing / Raffle /
                   ScriptDelivery / ReturnedMail

API: WoweeMailLoader::save / load / exists / findById.

Three preset emitters showcase typical mail templates:
  • makeStarter — 3 templates (quest overflow / auction won /
                   GM gift) covering the 3 most common
                   categories
  • makeHoliday — 4 holiday samples that cross-reference the
                   WTKN seasonal token IDs (200=Tricky Treats,
                   201=Brewfest, 202=Coin of Ancestry,
                   203=Stranger's Gift) so the demo content
                   stack ships a full holiday onboarding
                   experience
  • makeAuction — 5-template auction-house family (outbid /
                   won / sold / expired / cancelled) — runtime
                   fills in actual bid amounts / sold items
                   at send time

CLI added (5 flags, 635 documented total now):
  --gen-mail / --gen-mail-holiday / --gen-mail-auction
  --info-wmal / --validate-wmal

Validator catches: templateId=0 + duplicates, empty subject,
neither senderNpcId nor senderName set (no displayable
sender), unknown category, expiryDays=0 (mail expires
immediately), cod=1 with no money attached (free COD),
empty mail in categories where the runtime doesn't fill in
content (skips Auction / GmCorrespondence / ReturnedMail
where empty templates are intentional).

Two bugs caught + fixed during smoke-test on the auction
preset:
  • print formatting glued the `0` from senderNpcId after
    the senderName when no NPC was set (rendered as
    "Postmaster0" instead of "Postmaster") — fixed with an
    explicit if/else split
  • validator's "no money + no items" warning was too
    aggressive for the Auction category, where templates
    are intentionally informational and the runtime fills
    in the real values — added Auction + ReturnedMail to
    the skip list
2026-05-09 17:41:03 -07:00
Kelsi
b5995073b9 feat(editor): add WMOU JSON round-trip authoring workflow
Closes the WMOU open-format loop with --export-wmou-json /
--import-wmou-json, mirroring the JSON pairs added for
every other novel binary format. All 26 binary formats
added since WOL now have full JSON round-trip authoring.

Each mount round-trips all 14 scalar fields. Three
enum-typed fields emit dual int + name forms:
  • mountKind  (ground / flying / swimming / hybrid / aquatic)
  • factionId  (both / alliance / horde)
  • categoryId (common / epic / racial / event / achievement /
                 pvp / quest / class)

Verified byte-identical round-trip on the flying preset
(4 mounts spanning common/epic/achievement/pvp tiers with
full WSPL spell + WIT item + WSKL riding skill cross-refs
preserved through the JSON layer).

Adds 2 flags (630 documented total now).
2026-05-09 17:33:54 -07:00
Kelsi
1b385fb39c feat(pipeline): add WBGD (Wowee Battleground Definition) format
Novel open replacement for Blizzard's BattlemasterList.dbc +
PvpDifficulty.dbc + the AzerothCore-style
battleground_template SQL tables. The 33rd open format
added to the editor.

Defines per-BG gameplay rules: player count brackets,
score-to-win, time limit, objective type (annihilation /
capture flag / control nodes / king of hill / resource race
/ carry object), per-team start positions, respawn timer,
and the WTKN currency token awarded on win.

Cross-references with previously-added formats:
  WBGD.entry.mapId       -> WMS.map.mapId
                            (where mapType=Battleground)
  WBGD.entry.markTokenId -> WTKN.entry.tokenId
                            (Mark of Honor for that BG)

The classic preset's markTokenId fields (102/103/104)
deliberately match WTKN.makePvp's "Mark of Honor: Warsong
Gulch / Arathi Basin / Alterac Valley" token ids — so the
demo content stack already wires together: WBGD.scoreToWin
reached → grant WTKN mark → which a vendor in WTRN can
charge in via item.extendedCost.

Format:
  • magic "WBGD", version 1, little-endian
  • per BG: battlegroundId / mapId / name / description /
    objectiveKind / min+maxPlayersPerSide /
    minLevel..maxLevel / scoreToWin / timeLimitSeconds /
    bracketSize / allianceStart vec3 + facing /
    hordeStart vec3 + facing / respawnTimeSeconds /
    markTokenId

Enums:
  • ObjectiveKind (6): Annihilation / CaptureFlag /
                       ControlNodes / KingOfHill /
                       ResourceRace / CarryObject

API: WoweeBattlegroundLoader::save / load / exists /
findById.

Three preset emitters showcase typical BG shapes:
  • makeStarter — 1 king-of-hill BG (10v10, 3-cap to win)
  • makeClassic — 3 classic BGs with authentic player
                   counts, level brackets, scoring, and
                   WTKN cross-refs (Warsong Gulch CTF /
                   Arathi Basin nodes / Alterac Valley
                   resource race)
  • makeArena   — 3 arena formats (Nagrand 2v2 / Blade's
                   Edge 3v3 / Lordaeron 5v5) — annihilation
                   objective + no respawn + 25 min cap

CLI added (5 flags, 628 documented total now):
  --gen-bg / --gen-bg-classic / --gen-bg-arena
  --info-wbgd / --validate-wbgd

Validator catches: bgId=0 + duplicates, empty name, unknown
objectiveKind, player count=0, min>max counts/levels,
scoreToWin=0 (no win condition), non-annihilation BG with
respawnTimeSeconds=0 (losing side cannot recover).
2026-05-09 17:30:59 -07:00
Kelsi
fea437dd6f feat(editor): add WSEA JSON round-trip authoring workflow
Closes the WSEA open-format loop with --export-wsea-json /
--import-wsea-json, mirroring the JSON pairs added for
every other novel binary format. All 25 binary formats
added since WOL now have full JSON round-trip authoring.

Each event round-trips all 11 scalar fields. Two enum-typed
fields emit dual int + name forms:
  • holidayKind  (combat / collection / racial / anniversary /
                   fishing / cosmetic / world-event)
  • factionGroup (both / alliance / horde)

Verified byte-identical round-trip on the yearly preset
(4 holidays — Hallow's End / Brewfest / Lunar Festival /
Winter's Veil — with full WTKN tokenIdReward cross-refs
preserved through the JSON layer).

Adds 2 flags (623 documented total now).
2026-05-09 17:24:50 -07:00
Kelsi
8ab049ff9d feat(pipeline): add WMOU (Wowee Mount catalog) format
Novel open replacement for Blizzard's Mount.dbc +
MountCapability.dbc + MountType.dbc + the mount-related
subsets of Spell.dbc / Item.dbc. The 32nd open format added
to the editor.

Defines all summonable steeds: ground mounts, flying mounts,
swimming mounts, racial mounts (Tauren Plainsrunner for
druids), and class mounts (Warlock dreadsteed, Paladin
charger). Each mount has a summon spell, optional teach
item, riding skill prerequisite, speed bonus, and faction
/ race availability mask.

Cross-references with previously-added formats:
  WMOU.entry.summonSpellId   -> WSPL.entry.spellId
  WMOU.entry.itemIdToLearn   -> WIT.entry.itemId
  WMOU.entry.requiredSkillId -> WSKL.entry.skillId
                                 (Riding skill ID 762)
  WCHC.race.mountSpellId     ~= WMOU.entry.summonSpellId
                                 (loose match by spellId)

Format:
  • magic "WMOU", version 1, little-endian
  • per mount: mountId / name / description / icon /
    displayId / summonSpellId / itemIdToLearn /
    requiredSkillId+Rank / speedPercent / mountKind /
    factionId / categoryId / raceMask

Enums:
  • Kind (5):     Ground / Flying / Swimming / Hybrid /
                   Aquatic
  • Faction (3):  Both / Alliance / Horde
  • Category (8): Common / Epic / Racial / Event /
                   Achievement / Pvp / Quest / ClassMount

API: WoweeMountLoader::save / load / exists / findById.

Three preset emitters showcase typical mount catalogs:
  • makeStarter — 3 mounts (ground horse + epic flying
                   gryphon + aquatic riding turtle)
  • makeRacial  — 6 racial mounts (4 Alliance: Pinto / Ram /
                   Frostsaber / Mechanostrider; 2 Horde:
                   Dire Wolf / Skeletal Horse) with raceMask
                   gating per WCHC race bit positions
  • makeFlying  — 4 flying mounts spanning Common (60%) ->
                   Epic (100%) -> Achievement (280%) -> Pvp
                   (310%) speed tiers

CLI added (5 flags, 621 documented total now):
  --gen-mounts / --gen-mounts-racial / --gen-mounts-flying
  --info-wmou / --validate-wmou

Validator catches: mountId=0 + duplicates, empty name,
summonSpellId=0 (mount cannot be cast), unknown enum values,
speedPercent=0 (no speed bonus), flying mount with
requiredSkillRank<150 (player can't fly), Racial category
without raceMask (any race could use — usually a typo).
2026-05-09 17:23:00 -07:00
Kelsi
262f9291b4 feat(editor): add WTIT JSON round-trip authoring workflow
Closes the WTIT open-format loop with --export-wtit-json /
--import-wtit-json, mirroring the JSON pairs added for
every other novel binary format. All 24 binary formats
added since WOL now have full JSON round-trip authoring.

Each title round-trips all 8 scalar fields (titleId, name,
nameMale, nameFemale, iconPath, prefix, category, sortOrder).
Two enum-typed fields emit dual int + name forms:
  • category (achievement/pvp/raid/class/event/profession/...)
  • prefix   (1=prefix vs 0=suffix display position)

Verified byte-identical round-trip on the PvP preset
(28-title Honor System ladder with full Alliance + Horde
rank coverage preserved through the JSON layer).

Adds 2 flags (616 documented total now).
2026-05-09 17:16:41 -07:00
Kelsi
ff4159c369 feat(pipeline): add WSEA (Wowee Seasonal Event) format
Novel open replacement for Blizzard's GameEvents.dbc + the
AzerothCore-style game_event / game_event_creature /
game_event_gameobject SQL tables. The 31st open format
added to the editor.

Calendar-based content: holidays (Hallow's End, Winter's
Veil), recurring promotional events (Children's Week,
Lunar Festival, Brewfest), one-time anniversaries, and
XP-bonus weekends. Each event has a start date, duration,
optional recurrence (yearly / monthly / weekly), faction
restriction, optional XP bonus, and a reward currency
cross-reference into WTKN.

Cross-references with previously-added formats:
  WSEA.entry.tokenIdReward -> WTKN.entry.tokenId
                              (the seasonal currency the
                               event hands out — Tricky
                               Treats during Hallow's End,
                               Brewfest Tokens during
                               Brewfest, etc.)

The yearly preset's tokenIdReward values (200/201/202/203)
deliberately match WTKN.makeSeasonal's seasonal token ids
so the demo content stack already wires together: WSEA
yearly events grant WTKN tokens that vendors can charge in
via WTRN.item.extendedCost.

Format:
  • magic "WSEA", version 1, little-endian
  • per event: eventId / name / description / iconPath /
    announceMessage / startDate (Unix epoch seconds) /
    duration_seconds / recurrenceDays (0=one-shot, 365=yearly) /
    holidayKind / factionGroup / bonusXpPercent / tokenIdReward

Enums:
  • HolidayKind (7): Combat / Collection / Racial /
                     Anniversary / Fishing / Cosmetic /
                     WorldEvent
  • FactionGroup (3): Both / Alliance / Horde

API: WoweeEventLoader::save / load / exists / findById.

Three preset emitters showcase typical event shapes:
  • makeStarter       — 3 events covering Combat /
                         Fishing / Anniversary kinds
  • makeYearly        — 4 yearly holidays with full WTKN
                         cross-refs (Hallow's End / Brewfest /
                         Lunar Festival / Winter's Veil)
  • makeBonusWeekends — 3 monthly Fri-Sun bonus tiers
                         (50% / 100% / 200% RAF-style)

CLI added (5 flags, 614 documented total now):
  --gen-events / --gen-events-yearly / --gen-events-weekends
  --info-wsea / --validate-wsea

Validator catches: eventId=0 + duplicates, empty name,
unknown holidayKind / factionGroup, duration_seconds=0
(event never runs), duration > recurrence period (events
would overlap themselves on next iteration), bonusXpPercent
> 200 (very high — verify intentional).
2026-05-09 17:14:46 -07:00
Kelsi
dc3e566e45 feat(editor): add --gen-texture-gear-cog mechanical wheel
85th procedural texture: gear-cog wheel pattern tiled per
cell. Three concentric radii define the gear:
  • hub   (rNorm < 0.20) — center axle hole, kept as bg
  • inner (rNorm < 0.65) — gap floor between teeth
  • outer (rNorm < 0.92) — tooth tip

Teeth alternate around the gear via a per-tooth phase
calculation: theta is mapped into a tooth period of
2*pi/teeth, with the first half of each period rendering
as a tooth (effective radius = outer) and the second half
rendering as a gap (effective radius = inner).

Useful for: engineering crafting backdrops, mechanical
door textures, gnomish / goblin themed gear icons,
factory / forge tile sets, clockwork-themed dungeons,
steampunk faction insignia, machinery damage states.

Distinct from --gen-texture-rings (concentric circles only,
no teeth). The first procedural texture in the catalogue
that exercises a per-tooth periodic offset rather than a
fixed angular fold.
2026-05-09 17:09:32 -07:00
Kelsi
eefaa5653b feat(pipeline): add WTIT (Wowee Title catalog) format
Novel open replacement for Blizzard's CharTitles.dbc + the
AzerothCore-style character_title SQL table. The 30th open
format added to the editor.

Defines the player-display titles awarded for completing
achievements ("the Versatile"), reaching PvP ranks
("Sergeant Major" / "Stone Guard"), participating in raids
("Champion of the Naaru"), levelling a profession ("Master
Locksmith"), or seasonal events ("Brewmaster", "the
Hallowed").

Closes a long-standing gap: WACH.entry.titleReward has been
a free-form string since batch 116 with no formal catalog
to resolve against. WTIT systematizes those strings into a
real catalog — the runtime resolves WACH.titleReward to a
WTIT entry by name, then displays the titleId in the player
title selector.

Cross-references:
  WACH.entry.titleReward (string) ~= WTIT.entry.name
                                     (string match — runtime
                                      resolves achievement-
                                      granted titles by
                                      looking up matching WTIT
                                      entry by name)

Format:
  • magic "WTIT", version 1, little-endian
  • per title: titleId / name / nameMale / nameFemale /
    iconPath / prefix (suffix vs prefix display) /
    category / sortOrder

Enums:
  • Category (8): Achievement / Pvp / Raid / ClassTitle /
                   Event / Profession / Lore / Custom

API: WoweeTitleLoader::save / load / exists +
WoweeTitle::findById / findByName.

Three preset emitters showcase typical title catalogs:
  • makeStarter     — 4 titles (Versatile / Sergeant /
                       Champion / Hallowed) covering 4
                       categories
  • makePvp         — 28-title classic Honor System ladder
                       (14 Alliance ranks Private->Grand
                       Marshal + 14 Horde ranks Scout->High
                       Warlord)
  • makeAchievement — 8 achievement titles including "the
                       Versatile" matching WACH.makeMeta's
                       achievement 250 titleReward + capstone
                       profession titles

CLI added (5 flags, 608 documented total now):
  --gen-titles / --gen-titles-pvp / --gen-titles-achievement
  --info-wtit / --validate-wtit

Validator catches: titleId=0 + duplicates, empty name,
unknown category, gender variants set on only one side
(causes mixed-gender display when the runtime falls back to
canonical for the unset side).
2026-05-09 17:07:56 -07:00
Kelsi
1f808ca78b feat(editor): add WTRG JSON round-trip authoring workflow
Closes the WTRG open-format loop with --export-wtrg-json /
--import-wtrg-json, mirroring the JSON pairs added for
every other novel binary format. All 23 binary formats
added since WOL now have full JSON round-trip authoring.

Each trigger round-trips:
  • triggerId / mapId / areaId / name / minLevel
  • center / boxDims / dest as 3-element JSON arrays
  • shape (dual int + name) / kind (dual int + name)
  • radius / actionTarget / destOrientation
  • requiredQuestId / requiredItemId

Verified byte-identical round-trip on the dungeon preset
(3 triggers including the box-shaped Deadmines portal with
WIT key gate (itemId=5200) and full destination + facing
preserved through the JSON layer).

Adds 2 flags (603 documented total now).
2026-05-09 17:03:27 -07:00
Kelsi
8c78f8aeb2 feat(pipeline): add WTRG (Wowee Area Trigger) format
Novel open replacement for Blizzard's AreaTrigger.dbc +
AreaTriggerTeleport.dbc + the AzerothCore-style
areatrigger_template / areatrigger_teleport SQL tables.
The 29th open format added to the editor.

Defines proximity-based event zones — when a player enters
a defined region (box or sphere), the runtime fires the
trigger's action: teleport to another map, award
exploration XP for a quest, run a server script, gate an
instance entrance behind a key item, mark a PvP boundary,
or simply display a "Discovered: {area name}" banner.

Cross-references with previously-added formats — every
trigger field has a real format target:
  WTRG.entry.mapId / areaId  -> WMS.map.mapId / WMS.area.areaId
  WTRG.actionTarget (Teleport)        -> WMS.mapId
  WTRG.actionTarget (QuestExploration) -> WQT.questId
  WTRG.requiredQuestId       -> WQT.entry.questId
  WTRG.requiredItemId        -> WIT.entry.itemId (key)

Format:
  • magic "WTRG", version 1, little-endian
  • per trigger: triggerId / mapId / areaId / name /
    center vec3 / shape / kind / boxDims vec3 / radius /
    actionTarget / dest vec3 / destOrientation /
    requiredQuestId / requiredItemId / minLevel

Enums:
  • Shape (2): Box / Sphere
  • Kind (7): Teleport / QuestExploration / Script /
              InstanceEntrance / AreaName / CombatStartZone /
              Waypoint

API: WoweeTriggerLoader::save / load / exists / findById.

Three preset emitters showcase common trigger shapes:
  • makeStarter    — area-name + quest-exploration with
                      cross-ref to WQT 100 ("Investigate the
                      Camp")
  • makeDungeon    — outdoor area-name + portal-style
                      InstanceEntrance with Deadmines key
                      gate (WIT itemId 5200, matches
                      WLCK.makeDungeon's Boss Vault Seal) +
                      interior exit teleport back outdoors
  • makeFlightPath — 2 sphere waypoints near flight masters
                      so the runtime can auto-open the
                      flight UI on proximity (matches WTAX
                      starter node positions)

CLI added (5 flags, 601 documented total now):
  --gen-triggers / --gen-triggers-dungeon / --gen-triggers-flightpath
  --info-wtrg / --validate-wtrg

Validator catches: triggerId=0 + duplicates, unknown shape /
kind, non-finite center, sphere with radius<=0, box with
all-zero half-extents, teleport / instance with dest=(0,0,0)
(silently does nothing — usually a typo), QuestExploration
without an actionTarget questId.
2026-05-09 17:01:43 -07:00
Kelsi
dea95a2ad9 feat(editor): add WTKN JSON round-trip authoring workflow
Closes the WTKN open-format loop with --export-wtkn-json /
--import-wtkn-json, mirroring the JSON pairs added for
every other novel binary format. All 22 binary formats
added since WOL now have full JSON round-trip authoring.

Each token round-trips all 8 scalar fields (tokenId, name,
description, iconPath, category, maxBalance, weeklyCap,
flags). Two enum-typed fields (category and flags) emit
dual int + name forms.

The flag bitset emits string-array form so a hand-author
can write ["hidden", "resets"] instead of having to
remember that HiddenUntilEarned|ResetsOnLogout = 0xC.

Verified byte-identical round-trip on the PvP preset
(8 tokens: Honor + Arena + 6 BG marks of honor with
maxBalance + weeklyCap + flags all preserved).

Adds 2 flags (596 documented total now).
2026-05-09 16:56:55 -07:00
Kelsi
41156f4a95 feat(editor): add WCHC JSON round-trip authoring workflow
Closes the WCHC open-format loop with --export-wchc-json /
--import-wchc-json, mirroring the JSON pairs added for
every other novel binary format. All 21 binary formats
added since WOL now have full JSON round-trip authoring.

Three top-level arrays mirror the binary layout:
  • classes[] — id / name / icon / powerType (dual int +
                name) / displayPower / baseHP+power scaling /
                factionAvailability bitmask
  • races[]   — id / name / icon / factionId (dual int +
                name) / male+female displayId / 5 base
                stats / starting map+zone / language+mount
                spell IDs
  • outfits[] — classId+raceId+gender (dual int + name) +
                items array (each: itemId + displaySlot)

Verified byte-identical round-trip on the starter preset
(2 classes / 2 races / 4 outfits with full WIT itemId
cross-references preserved through the JSON layer).

Adds 2 flags (594 documented total now).
2026-05-09 16:55:31 -07:00