diff --git a/crates/benilla-app/src/capture/fixtures.rs b/crates/benilla-app/src/capture/fixtures.rs index 67efc141..8da8c7a4 100644 --- a/crates/benilla-app/src/capture/fixtures.rs +++ b/crates/benilla-app/src/capture/fixtures.rs @@ -51,10 +51,11 @@ pub(super) fn seed_ui_fixture( mut selection: ResMut, mut player: ResMut, // Bundled: Bevy systems cap at 16 top-level params — a nested tuple is one param. - (mut actions, mut bank, mut exit): ( + (mut actions, mut bank, mut exit, mut loading): ( ResMut, ResMut, MessageWriter, + ResMut, ), ) { // A glue-screen capture has no world scenario, and no glue screen opens a UI fixture. @@ -156,6 +157,11 @@ pub(super) fn seed_ui_fixture( // IS the fixture. The `script.is_none()` refusal above still guards it: these scenarios // photograph the player UI, so a run without a VM is as wrong for them as for any other. UiFixture::Bare => {} + // The one fixture that opens no window: it raises the world-entry loading screen over the + // settled scene and pins it there, tip and all. `hold_for_capture` sets the `Pick` edge; + // `crate::game_tip::drive_game_tip` paints it on the next frame, and the stability watch + // settles on the held image. + UiFixture::LoadingTip => loading.hold_for_capture(scenario.map), UiFixture::Merchant => { names.insert_creature( NPC_ENTRY, diff --git a/crates/benilla-app/src/capture/scenarios.rs b/crates/benilla-app/src/capture/scenarios.rs index 619510ea..3060863e 100644 --- a/crates/benilla-app/src/capture/scenarios.rs +++ b/crates/benilla-app/src/capture/scenarios.rs @@ -79,6 +79,15 @@ pub(super) enum UiFixture { /// render): slot icons, the attribute/resistance panes with buff coloring, melee + ranged /// blocks, the ammo count, the level line. Character, + /// **The loading screen, held up, with the tip of the day on it** (decision 2083). + /// + /// Not a window: it raises the world-entry loading screen — per-map backdrop, progress bar, + /// and the `TipEdge::Pick` that chooses a `GameTips.dbc` row — and pins it so the harness has + /// a still frame to settle on. Every other screen in the client can be photographed by + /// standing in front of it; this one is up for a second on a path nobody can pause, which is + /// exactly why its tip could ship dead, log `tip 0 of 74` twice in a live smoke run, and be + /// caught by nothing at all. + LoadingTip, /// The shared **StaticPopup** plate, shown as the group-invite dialog (`PARTY_INVITE`). /// /// Every other StaticPopup customer in the tree raises its dialog over another window's opaque @@ -1042,6 +1051,17 @@ pub(super) const ON_DEMAND: &[Scenario] = &[ minute: 720, ui: Some(UiFixture::Social), }, + // The world-entry loading screen, held up with its tip of the day. Run with + // `WOW_CAPTURE=loading-tip`. The backdrop is whatever `Map.dbc` → `LoadingScreens.dbc` gives + // this scenario's map, so it photographs the art chain and the bar as well as the tip. + Scenario { + name: "loading-tip", + map: Some(MAP_AZEROTH), + eye: GROUND_EYE, + look: GROUND_LOOK, + minute: 720, + ui: Some(UiFixture::LoadingTip), + }, // The era Options window over the ground scene. Run with // `WOW_CAPTURE=ui-options`. Scenario { diff --git a/crates/benilla-app/src/char_select/input.rs b/crates/benilla-app/src/char_select/input.rs index 76d8241a..dbc2c763 100644 --- a/crates/benilla-app/src/char_select/input.rs +++ b/crates/benilla-app/src/char_select/input.rs @@ -38,7 +38,7 @@ pub(super) fn select_input( mut next: ResMut>, mut sounds: MessageWriter, mut intent: ResMut, - glue_dialog: Res, + glue_dialog: Res, time: Res