diff --git a/crates/benilla-app/src/char_select/mod.rs b/crates/benilla-app/src/char_select/mod.rs index b877ee10..c31d6082 100644 --- a/crates/benilla-app/src/char_select/mod.rs +++ b/crates/benilla-app/src/char_select/mod.rs @@ -127,6 +127,7 @@ impl Plugin for CharSelectPlugin { // Before the list refresh, and before `select_input` reads a click that // landed on the panel rather than the screen (decision 1196). debug_select_addons, + debug_select_walk, addons::drive_addons_panel, refresh::refresh_list, refresh::refresh_banner_and_buttons, @@ -142,6 +143,14 @@ impl Plugin for CharSelectPlugin { ) .chain() .after(benilla_world::schedule::WorldStage::Net), + ) + // AFTER the cover's own stage, so the raise it reads is this frame's — see the + // system's doc for why the glue must yield the glass the moment the cover goes up. + .add_systems( + Update, + screen::hide_under_world_cover + .after(benilla_world::schedule::WorldStage::Present) + .run_if(in_state(ClientState::CharSelect)), ); } } @@ -746,6 +755,83 @@ fn debug_logout_smoke( } } +/// The select-screen **walk** instrument (`WOW_CHARSELECT_WALK=[:]`) — +/// the thing a headless run had no way to do at all: *click a row*. It steps the selection one row +/// per `period_s` through the whole roster (the ref's arrow-key cycle, in code), starting from the +/// row the screen opened on, and logs each step with its elapsed stamp — so a booth/scene timeline +/// (`WOW_BOOTH_LOG=1`, `WOW_STREAM_TRACE`) is attributable to the selection that caused it. With +/// `enter_after_s`, it then presses **Enter World** that long after the last step, which is the +/// only headless way to land on the world-entry edge from a screen that was actually *used* +/// (`WOW_CHAR`'s fast path answers the first roster and never renders a second selection). +/// +/// Built for the two reports this file's booth feed owns — the cold-selection model swap and the +/// entry-edge stall — and kept, because every future "what does the screen do when you click" +/// question needs exactly this and nothing more. Inert without the env. +fn debug_select_walk( + mut roster: ResMut, + pick: Res, + time: Res