feat(pipeline): add WSUF (Wowee Item Random Suffix) catalog

64th open format — replaces ItemRandomProperties.dbc +
ItemRandomSuffix.dbc plus the AzerothCore-style suffix-roll
tables. Defines random "of the X" suffixes that roll on
green and blue items at world drop ("Sturdy Cloth Cap of
the Bear" = base item + STR + STA suffix).

5 suffix categories (Generic / Elemental / Defensive /
PvPSuffix / Crafted), per-suffix item-quality bracket gating
(only blue+ items can roll PvPSuffix), restricted-slot mask
that limits which equipment slots a suffix can apply to (15
slot bits matching WCEQ slot enum), and up to 5 stat bonus
slots per suffix matching WoW canonical max.

statValuePoints isn't an absolute number — it's a scaling
base that the runtime multiplies by an item-level
coefficient to compute the final per-item bonus, so "of the
Bear" gives proportionally more strength on a level-60 item
than on a level-20 item.

Cross-references with prior formats — statKind values match
WIT.statType enum (STR=4, AGI=3, INT=5, SPI=6, STA=7) so
item generators roll consistent stats with base items.

CLI: --gen-suf (3 generic stat triads — Bear STR+STA, Eagle
INT+SPI, Tiger STR+AGI), --gen-suf-magical (4 elemental
spell-power suffixes restricted to caster-eligible slots),
--gen-suf-pvp (3 PvPSuffix entries with resilience + offensive
stats, blue+ quality only), --info-wsuf, --validate-wsuf with
--json variants. Validator catches id+name required, category
0..4, quality range valid (0..7 covers heirloom), itemQuality
floor<=ceiling, stat-kind/value pairing (kind=0 with value!=0
is a typo, vice versa), and no-stats warning (suffix renames
item without changing it).

Format graph: 63 → 64 binary formats. CLI flag count: 854
→ 861.
This commit is contained in:
Kelsi 2026-05-09 21:05:49 -07:00
parent b1967c4453
commit d547de61f5
10 changed files with 677 additions and 0 deletions

View file

@ -1629,6 +1629,16 @@ void printUsage(const char* argv0) {
std::printf(" Export binary .wlds to a human-editable JSON sidecar (defaults to <base>.wlds.json)\n");
std::printf(" --import-wlds-json <json-path> [out-base]\n");
std::printf(" Import a .wlds.json sidecar back into binary .wlds (accepts expansionRequired int OR name string)\n");
std::printf(" --gen-suf <wsuf-base> [name]\n");
std::printf(" Emit .wsuf starter: 3 stat-suffix entries (of the Bear STR+STA / of the Eagle INT+SPI / of the Tiger STR+AGI)\n");
std::printf(" --gen-suf-magical <wsuf-base> [name]\n");
std::printf(" Emit .wsuf 4 elemental suffixes (of Fire / of Frost / of Shadow / of Arcane) — flat per-school spell power\n");
std::printf(" --gen-suf-pvp <wsuf-base> [name]\n");
std::printf(" Emit .wsuf 3 PvPSuffix-category entries (of the Champion / of the Gladiator / of Resilience) blue+ only\n");
std::printf(" --info-wsuf <wsuf-base> [--json]\n");
std::printf(" Print WSUF entries (id / category / quality range / restricted slot mask / # populated stat slots / name)\n");
std::printf(" --validate-wsuf <wsuf-base> [--json]\n");
std::printf(" Static checks: id+name required, category 0..4, quality range valid (0..7), stat-kind/value pairing, no-stats 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");