feat(editor): add WSCH JSON round-trip (export/import sidecar)

Closes the JSON round-trip gap on the spell school catalog
format shipped last batch. WSCH has no enum fields with
name forms — just raw numeric school bits and flag bytes —
so the JSON mapping is a direct dump. --import-wsch-json
defaults canBeImmune/Absorbed/Crit to 1 and canBeReflected
to 0 when omitted, matching the WoW canonical behavior for
most schools (only Holy is non-immune, only Physical isn't
reflectable). Verified byte-identical round-trip on all
three preset emitters (starter / magical / combined). 806
documented CLI flags.
This commit is contained in:
Kelsi 2026-05-09 20:20:55 -07:00
parent a664027f5f
commit 8a4276338c
3 changed files with 132 additions and 0 deletions

View file

@ -1525,6 +1525,10 @@ void printUsage(const char* argv0) {
std::printf(" Print WSCH entries (schoolId / immune+absorb+reflect+crit flags / resistance cap / combined-mask / name)\n");
std::printf(" --validate-wsch <wsch-base> [--json]\n");
std::printf(" Static checks: id+name required, reflected-without-absorbed warning, combined-mask references defined schools, no self-reference\n");
std::printf(" --export-wsch-json <wsch-base> [out.json]\n");
std::printf(" Export binary .wsch to a human-editable JSON sidecar (defaults to <base>.wsch.json)\n");
std::printf(" --import-wsch-json <json-path> [out-base]\n");
std::printf(" Import a .wsch.json sidecar back into binary .wsch (canBeImmune/Absorbed/Crit default to 1, canBeReflected to 0)\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");