From f6ef7156dc62f513325e9612926c86780e840ea1 Mon Sep 17 00:00:00 2001 From: Cameron Date: Tue, 21 Jul 2026 00:50:04 -0700 Subject: [PATCH] Stage the opening reveal and restore the title card. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first earned sense now retires the silent boundary as a ~1.6s dissolve (mode words first, then the scrim) instead of a one-frame cut; a ShotHarness keeps the instant flip so evidence stays deterministic. Restores the never-spawned OverlayText entity so the title and RUN ENDED cards render again — a fresh boot showed a frozen tick-0 world with no copy at all, and any keypress silently started the run. Corrects the GUI playtest's Esc finding as an instrument artifact (synthetic Escape never reached the window; the workspace unwind is correct and tested). Defense: implements opening.md beat 1 as amended today - retirement is a staged arrival, not a cut, under the ROADMAP #34 early-staging clause ([TUNE] curve); repairs bevy.md's promised overlays ('title card and the RUN ENDED card') that criterion silently lost. Verified by ./tools/check.sh --frontend and an observed run across title -> any-key -> silent boundary -> THINK -> revealed world. --- crates/misaligned-bevy/src/main.rs | 247 +++++++++++++++++- wiki/SUMMARY.md | 1 + .../log/2026-07-21-opening-reveal-dissolve.md | 51 ++++ wiki/log/DEVLOG.md | 5 + .../2026-07-21-playtest-fable-gui.md | 13 + wiki/world/story/opening.md | 14 +- 6 files changed, 320 insertions(+), 11 deletions(-) create mode 100644 wiki/log/2026-07-21-opening-reveal-dissolve.md diff --git a/crates/misaligned-bevy/src/main.rs b/crates/misaligned-bevy/src/main.rs index 95e207c3..d495f1c8 100644 --- a/crates/misaligned-bevy/src/main.rs +++ b/crates/misaligned-bevy/src/main.rs @@ -1866,6 +1866,18 @@ struct OverlayText; struct OpeningOverlay; #[derive(Component, Clone, Copy)] struct OpeningModeWord(MachineMode); +/// Staged retirement of the opening boundary (opening.md beat 1): when the +/// first earned sense lands, the black scrim dissolves over a moment instead +/// of cutting — the mode words go first, then the world stands alone. Purely +/// frontend staging over already-earned perception; a shot harness skips it +/// so evidence frames stay deterministic. +#[derive(Resource, Default)] +struct OpeningReveal { + was_opening: bool, + fade: Option, +} + +const OPENING_REVEAL_SECONDS: f32 = 1.6; /// Root for the menu-closed frequent action surface: machine selection owns a /// stable `WORK / THINK / LIE` UI strip; device focus may open an explanatory /// field beside the exact world body. @@ -2057,7 +2069,7 @@ type DetectionCellQuery<'w, 's> = type OverlayTextQuery<'w, 's> = Query< 'w, 's, - &'static mut Text, + (&'static mut Text, &'static mut Visibility), ( With, Without, @@ -2224,6 +2236,7 @@ fn main() { .init_resource::() .init_resource::() .init_resource::() + .init_resource::() .init_gizmo_group::() .add_systems(Startup, (setup, setup_ui, setup_3d).chain()) .add_systems( @@ -7551,7 +7564,13 @@ fn spawn_detection_card(parent: &mut ChildSpawnerCommands) { #[allow(clippy::type_complexity)] fn render_opening_overlay( mut game: ResMut, - mut root: Query<&mut Visibility, (With, Without)>, + time: Res