Commit graph

2 commits

Author SHA1 Message Date
Kelsi
637a63e395 feat(editor): add WLMA JSON round-trip (--export/--import-wlma-json)
Dual encoding for both modeKind fields (the primary
modeKind AND the timeoutFallbackKind disconnect-fallback)
via the readEnumField template — both accept int 0..5
OR token "freeforall"/"roundrobin"/"masterloot"/
"needbeforegreed"/"personal"/"disenchant".
masterLooterRequired accepts bool or int.

thresholdQuality serializes as both int (authoritative,
0..7) AND derived qualityName string ("Poor"/"Common"/
"Uncommon"/"Rare"/"Epic"/"Legendary"/"Artifact"/
"Heirloom") for human-readable JSON. The qualityName is
informational only — int form is authoritative on
import.

All 3 presets (standard/raid/afk) byte-identical
roundtrip OK. CLI flag count 1253 -> 1255.
2026-05-10 02:47:52 -07:00
Kelsi
6fa81cf185 feat(editor): add WLMA (Loot Mode Policy) — 118th open format
Novel replacement for the implicit loot-distribution
rules vanilla WoW encoded across the GroupLoot system
(CMSG_LOOT_METHOD), the per-quality thresholds for
Need-roll triggering, and the master-looter permission
gates. Each entry binds one group-loot policy mode to
its kind (FFA / RoundRobin / MasterLoot / Need-Before-
Greed / Personal / Disenchant) plus quality threshold,
master-looter requirement, idle-skip seconds, and
disconnect-fallback policy.

Six modeKind values cover the full loot-distribution
surface. The thresholdQuality field uses the WIQR
quality tier convention (0=Poor through 7=Heirloom)
to gate Need-roll triggering — anything below threshold
auto-distributes via FFA-equivalent semantics.

The disconnect-fallback (timeoutFallbackKind) field is
unique to MasterLoot policies — if the master looter
disconnects mid-distribution, the policy auto-promotes
to the fallback mode for democratic recovery. Common
fallbacks: Need-Before-Greed (full roll system),
FreeForAll (fastest unblock).

Three preset emitters: makeStandard (4 5-man / casual
modes covering FFA farming, RoundRobin trash, NBG
Uncommon, MasterLoot Rare), makeRaidPolicies (3 raid
loot policies including MasterLoot Epic with NBG
fallback, Personal Loot, NBG Rare), makeAFKPrevention
(3 AFK-mitigating modes with idleSkipSec gates).

Validator's most novel check is per-kind consistency:
MasterLoot kind REQUIRES masterLooterRequired=1 (else
the policy contradicts itself — "Master Loot mode
without requiring a master looter"). Personal kind
warns if masterLooterRequired=1 (no-op flag). Tightened
fallback-to-self warning to fire ONLY for MasterLoot
where the field is meaningful — original version fired
falsely for FFA/Personal/RoundRobin where the leader-
disconnect scenario doesn't apply (caught + tightened
during smoke-test).

Format count 117 -> 118. CLI flag count 1248 -> 1253.
2026-05-10 02:46:26 -07:00