feat(pipeline): WBND soulbind rules catalog (135th open format)

Novel replacement for the implicit item-binding policy vanilla
WoW carried in ItemTemplate.bondingType + per-item special-case
rules in the server's LootMgr (the 2-hour raid-loot trade
window was hard-coded; the account-bound-shared-across-faction
rule for heirlooms was a TBC+ addition with no formal data-
driven format). Each WBND entry binds one soulbind rule to its
bind kind (BoP / BoE / BoU / BoA / Soulbound / NoBind),
itemQualityFloor predicate (rule applies to items of this
quality and above unless overridden by a stricter rule),
tradable-window duration, raid-trade allowance, BoE-becomes-
BoP trigger, and cross-faction sharing flag.

Three presets capturing actual expansion-era policy evolution:
  --gen-bnd-vanilla  4 rules — Poor=NoBind, Common=BoE,
                     Uncommon+=BoP no-window, Epic+=Soulbound.
                     NO raid-trade window — the 1.12 master-
                     loot drama era
  --gen-bnd-tbc      5 rules adding the iconic 2-hour raid-
                     trade window for BoP items (Uncommon and
                     Rare quality)
  --gen-bnd-wotlk    6 rules adding Heirloom = BindOnAccount
                     + cross-faction (Alliance<->Horde via
                     account-mail) for the WotLK level-1-to-80
                     twink path

Validator catches: id+name required, bindKind 0..5,
itemQualityFloor 0..7, no duplicate ruleIds, no duplicate
(bindKind,qualityFloor) pairs (resolveForQuality lookup tie).
Hard error: tradableForRaidGroup=true with window=0 (window
expires instantly = no window at all). Warns on contradictions:
tradableForRaidGroup with non-BoP kind, window > 0 without
raid-trade flag, boeBecomesBoP without BoE kind,
accountBoundCrossFaction without BoA kind (all flag-ignored at
runtime).

Format count 134 -> 135. CLI flag count 1409 -> 1416.
This commit is contained in:
Kelsi 2026-05-10 04:44:42 -07:00
parent c21f36bd29
commit 19af564a27
10 changed files with 816 additions and 0 deletions

View file

@ -413,6 +413,8 @@ const char* const kArgRequired[] = {
"--gen-loc-poi", "--gen-loc-herb", "--gen-loc-rare",
"--info-wloc", "--validate-wloc",
"--export-wloc-json", "--import-wloc-json",
"--gen-bnd-vanilla", "--gen-bnd-tbc", "--gen-bnd-wotlk",
"--info-wbnd", "--validate-wbnd",
"--gen-weather-temperate", "--gen-weather-arctic",
"--gen-weather-desert", "--gen-weather-stormy",
"--gen-zone-atmosphere",