diff --git a/crates/benilla-app/src/capture/fixtures.rs b/crates/benilla-app/src/capture/fixtures.rs index f474d786..f479cf7e 100644 --- a/crates/benilla-app/src/capture/fixtures.rs +++ b/crates/benilla-app/src/capture/fixtures.rs @@ -124,6 +124,32 @@ pub(super) fn seed_ui_fixture( } ctx.ui_seeded = true; + // `$WOW_CAPTURE_SPELLS=[,…]`: spells added to whatever book the fixture seats. + // + // A capture never logs in, so its spellbook is whatever a fixture hardcodes — and a whole + // class of addon is driven by what is IN that book. Advanced Trade Skill Window finds the + // player's professions by walking tab 1 and matching each spell's icon against its own list + // (`Professions`, thirteen `Interface\Icons\…` leaves), so with no profession spell seated + // it finds nothing, draws no tab and switches nothing — which is indistinguishable from the + // defect being chased. The realm's own ids: Survival 46050, Jewelcrafting 30220, and 1.12's + // own Alchemy 2259, Blacksmithing 2018, Cooking 2550, Enchanting 7411, Engineering 4036, + // First Aid 3273, Leatherworking 2108, Tailoring 3908, Smelting 2656. + // + // Added rather than replacing, so a scenario's own book still reads as it did. + if let Ok(list) = std::env::var("WOW_CAPTURE_SPELLS") { + let extra: Vec = list + .split(',') + .filter_map(|s| s.trim().parse().ok()) + .collect(); + if !extra.is_empty() { + info!( + "capture: $WOW_CAPTURE_SPELLS seats {} extra spell(s)", + extra.len() + ); + actions.spells.extend(extra); + } + } + // A UI capture with no script VM would be a UI-less world under the scenario's name, so it // exits non-zero, as the window-size refusal does. if script.is_none() {