From 6e3483c1e70004e447ec91105564b480d25ba8f3 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 8 Sep 2026 16:22:57 +0700 Subject: [PATCH] the loading tip draws, its backdrop holds, and indoor trails go warm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - the loading screen's tip of the day is on screen: it was picked and saved but never painted, and once painted it was wiped by the login round trip (2083, 2081) - the backdrop no longer switches mid-load — logging back in to an expired dungeon held its art for a second and then flipped to the continent's; the art latches at the raise, keyed on the texture, not the map id (2081, 2087) - a weapon trail indoors takes the room's warm light instead of the sky's ambient, the wearer's own light being the reference's term (2086) - the glue dialog moves out of the login screen into the shared glue layer, so the select screen's refusals and the login's errors are one widget (2084) Co-Authored-By: Claude Fable 5.1 --- crates/benilla-app/src/capture/fixtures.rs | 8 +- crates/benilla-app/src/capture/scenarios.rs | 20 + crates/benilla-app/src/char_select/input.rs | 2 +- crates/benilla-app/src/char_select/mod.rs | 20 +- crates/benilla-app/src/char_select/screen.rs | 7 +- crates/benilla-app/src/game_tip.rs | 346 ++++++++--- crates/benilla-app/src/glue/dialog.rs | 579 +++++++++++++++++++ crates/benilla-app/src/glue/mod.rs | 9 +- crates/benilla-app/src/loading_screen.rs | 341 +++++++++-- crates/benilla-app/src/login/mod.rs | 532 ++++++----------- crates/benilla-app/src/login/screen.rs | 183 +----- crates/benilla-app/src/weapon_trail.rs | 51 +- crates/benilla-app/src/weapon_trail/tests.rs | 84 +++ crates/benilla-app/tests/world_api_wall.rs | 12 +- crates/benilla-world/src/interior.rs | 30 +- 15 files changed, 1504 insertions(+), 720 deletions(-) create mode 100644 crates/benilla-app/src/glue/dialog.rs 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