diff --git a/src/display3d.rs b/src/display3d.rs index efb5188..7a71296 100644 --- a/src/display3d.rs +++ b/src/display3d.rs @@ -1471,4 +1471,4 @@ fn fade_title( let new_a = (bgc.0.a() + step).min(1.0).max(0.0); bgc.0.set_a(new_a); }) -} \ No newline at end of file +} diff --git a/src/tutorial.rs b/src/tutorial.rs index 624653b..cb0c82f 100644 --- a/src/tutorial.rs +++ b/src/tutorial.rs @@ -40,6 +40,14 @@ impl Plugin for TutorialPlugin { ) .run_if(not(in_state(GameState::Loading))) .run_if(state_changed::), + ) + .add_systems( + Update, + start_tutorial_on_play + .run_if(in_state(GameState::Play)) + .run_if(not(resource_exists::)) + .run_if(any_component_removed::()) + .run_if(state_changed::), ); } } @@ -174,6 +182,50 @@ fn initialize_tutorial( }, )) .with_children(|parent| { + // Skip button + parent + .spawn(( + menu::ButtonAction(tutorial::TutorialState::None), + menu::ButtonAction(GameState::Play), + menu::ButtonAction(menu::MenuState::Off), + ButtonBundle { + style: Style { + margin: UiRect::all(Val::Px(5.0)), + position_type: PositionType::Absolute, + bottom: Val::Px(0.0), + right: Val::Px(0.0), + ..default() + }, + background_color: Color::WHITE.with_a(0.3).into(), + image: UiImage { + texture: button_handle.clone(), + ..default() + }, + ..default() + }, + )) + .with_children(|parent| { + parent.spawn(TextBundle { + text: Text { + sections: vec![TextSection { + value: "Skip Tutorial".into(), + style: TextStyle { + color: Color::WHITE.with_a(0.3), + font_size: 8.0, + font: font_handle.clone(), + }, + }], + ..default() + }, + style: Style { + margin: UiRect::all(Val::Px(20.0)), + ..default() + }, + ..default() + }); + }); + + // Content parent .spawn(( step.clone(), @@ -199,7 +251,7 @@ fn initialize_tutorial( .map(|line| TextSection { value: line.clone(), style: TextStyle { - font_size: 12.0, + font_size: 14.0, color: Color::hex(&text_visible_hex).unwrap(), font: ui_font.handle.clone(), }, @@ -211,11 +263,16 @@ fn initialize_tutorial( ..default() }, )); + if *step == TutorialState::Outro { parent .spawn(NodeBundle { style: Style { flex_direction: FlexDirection::Row, + align_items: AlignItems::Center, + justify_items: JustifyItems::Center, + align_content: AlignContent::Center, + justify_content: JustifyContent::Center, ..default() }, ..default() @@ -228,8 +285,9 @@ fn initialize_tutorial( menu::ButtonAction(menu::MenuState::Off), ButtonBundle { style: Style { - padding: UiRect::all(Val::Px(5.0)), margin: UiRect::all(Val::Px(5.0)), + align_content: AlignContent::Center, + justify_content: JustifyContent::Center, ..default() }, image: UiImage { @@ -243,7 +301,7 @@ fn initialize_tutorial( parent.spawn(TextBundle { text: Text { sections: vec![TextSection { - value: "R e s t a r t".into(), + value: "New Game".into(), style: TextStyle { color: Color::WHITE, font_size: 10.0, @@ -264,11 +322,12 @@ fn initialize_tutorial( .spawn(( menu::ButtonAction(tutorial::TutorialState::None), menu::ButtonAction(GameState::Play), - menu::ButtonAction(menu::MenuState::Off), + menu::ButtonAction(menu::MenuState::On), ButtonBundle { style: Style { - padding: UiRect::all(Val::Px(5.0)), margin: UiRect::all(Val::Px(5.0)), + align_content: AlignContent::Center, + justify_content: JustifyContent::Center, ..default() }, image: UiImage { @@ -282,10 +341,10 @@ fn initialize_tutorial( parent.spawn(TextBundle { text: Text { sections: vec![TextSection { - value: "C o n t i n u e".into(), + value: "Main Menu".into(), style: TextStyle { color: Color::WHITE, - font_size: 8.0, + font_size: 10.0, font: font_handle.clone(), }, }], @@ -423,4 +482,20 @@ fn activate_tutorial_step( *v = Visibility::Hidden; } }); +} + +#[derive(Debug, Resource)] +struct TutorialStarted; + +fn start_tutorial_on_play( + query: Query, With)>, + state: Res>, + mut next_state: ResMut>, + mut commands: Commands, +) { + if query.iter().len() == 0 || *state.get() != TutorialState::None { + info!("Intro dissolve is done!"); + next_state.set(TutorialState::Intro); + commands.insert_resource(TutorialStarted); + } } \ No newline at end of file