feat(pipeline): add WMAC (Wowee Macro / Slash Command) catalog

58th open format — novel format with no direct DBC equivalent.
WoW historically stored player macros client-side in the user
profile and system slash commands as hardcoded engine handlers;
WMAC unifies both into a single structured catalog so default
macros, system slash commands, and shipped player presets can
be authored, validated, and shipped as content alongside the
rest of the open-format graph.

5 macro kinds (SystemSlash for engine /sit /dance handlers,
DefaultMacro for shipped presets, PlayerTemplate for user
templates, GuildMacro for guild-shared, SharedMacro for
account-wide). Multi-line macro bodies are stored verbatim
with literal '\n' separators — the client parses /cast /
/target / /run lines at runtime.

Cross-references with prior formats — requiredClassMask uses
WCHC.classId bit positions (Warrior=0x02, etc, same as WGLY/
WSET/WGTP).

CLI: --gen-mac (3 system slash — /sit, /dance, /target with
[@mouseover] modifier), --gen-mac-combat (4 warrior combat
templates — heroic strike spam, charge/intercept stance dance,
intercept stance switch, victory rush+bloodthirst fallback —
each with default key bindings), --gen-mac-utility (3 universal
utility — /follow target, mass /inv with %targetN tokens,
/releasecorpse via RepopMe()), --info-wmac, --validate-wmac
with --json variants. Validator catches id+name+body required,
kind 0..4, body within maxLength cap, body starting with '/'
or '#' (slash command or showtooltip annotation), and
SystemSlash + classMask warning (slash commands are class-
agnostic — restricting them to a class makes no sense).

Format graph: 57 → 58 binary formats. CLI flag count: 814
→ 819.
This commit is contained in:
Kelsi 2026-05-09 20:30:17 -07:00
parent 34c7021e5c
commit a81e69c78d
10 changed files with 621 additions and 0 deletions

View file

@ -1545,6 +1545,16 @@ void printUsage(const char* argv0) {
std::printf(" Export binary .wlfg to a human-editable JSON sidecar (defaults to <base>.wlfg.json)\n");
std::printf(" --import-wlfg-json <json-path> [out-base]\n");
std::printf(" Import a .wlfg.json sidecar back into binary .wlfg (accepts difficulty/expansion int OR name string; groupSize defaults to 5, role mask to kRoleAll)\n");
std::printf(" --gen-mac <wmac-base> [name]\n");
std::printf(" Emit .wmac starter: 3 system slash commands (/sit, /dance, /target with [@mouseover])\n");
std::printf(" --gen-mac-combat <wmac-base> [name]\n");
std::printf(" Emit .wmac 4 warrior combat macros (Heroic Strike spam, Charge/Intercept stance dance, Victory Rush) with bind keys + classMask\n");
std::printf(" --gen-mac-utility <wmac-base> [name]\n");
std::printf(" Emit .wmac 3 utility macros (/follow target, mass /inv with %%targetN, /releasecorpse via RepopMe)\n");
std::printf(" --info-wmac <wmac-base> [--json]\n");
std::printf(" Print WMAC entries (id / kind / classMask / bindKey / maxLen / body length / name)\n");
std::printf(" --validate-wmac <wmac-base> [--json]\n");
std::printf(" Static checks: id+name+body required, kind 0..4, body within maxLength, body starts with '/' or '#', SystemSlash + classMask warning\n");
std::printf(" --gen-weather-temperate <wow-base> [zoneName]\n");
std::printf(" Emit .wow weather schedule: clear-dominant + occasional rain + fog (forest / grassland)\n");
std::printf(" --gen-weather-arctic <wow-base> [zoneName]\n");