From 8e0254c7e8f48ca0327bae3c6a26de5d40a25099 Mon Sep 17 00:00:00 2001 From: "Elijah C. Voigt" Date: Wed, 8 Nov 2023 09:45:23 -0800 Subject: [PATCH] refactor states; separate display and play states --- src/display2d.rs | 37 ++++++++++--------------------------- src/display3d.rs | 23 +++++++++++------------ src/game.rs | 1 + src/main.rs | 23 +++++++++++++++-------- src/menu.rs | 30 ++++++++++++------------------ 5 files changed, 49 insertions(+), 65 deletions(-) diff --git a/src/display2d.rs b/src/display2d.rs index 935701c..7055571 100644 --- a/src/display2d.rs +++ b/src/display2d.rs @@ -21,18 +21,16 @@ impl Plugin for Display2dPlugin { .add_systems( Update, ( - menu::exit_to_menu.run_if(in_state(GameState::Display2d)), move_piece - .run_if(in_state(GameState::Display2d)) + .run_if(in_state(GameState::Play)) + .run_if(in_state(DisplayState::Display2d)) .run_if(any_with_component::()), - select.run_if(in_state(GameState::Display2d)).run_if( - |buttons: Res>| -> bool { + select + .run_if(in_state(GameState::Play)) + .run_if(in_state(DisplayState::Display2d)) + .run_if(|buttons: Res>| -> bool { buttons.just_pressed(MouseButton::Left) - }, - ), - snap_back_cancel - .run_if(in_state(GameState::Display2d)) - .run_if(any_component_removed::()), + }), update_background.run_if(on_event::()), set_transform .after(game::update_board::) @@ -41,8 +39,8 @@ impl Plugin for Display2dPlugin { set_tile_sprite.run_if(any_component_added::), ), ) - .add_systems(OnEnter(GameState::Display2d), activate::) - .add_systems(OnExit(GameState::Display2d), deactivate::); + .add_systems(OnEnter(DisplayState::Display2d), activate::) + .add_systems(OnExit(DisplayState::Display2d), deactivate::); } } @@ -114,6 +112,7 @@ fn set_background( translation: Vec3::NEG_Z, ..default() }, + visibility: Visibility::Hidden, ..default() }, )); @@ -329,19 +328,3 @@ fn move_piece( } }) } - -fn snap_back_cancel( - mut events: RemovedComponents, - query: Query<&game::BoardIndex, (With, With)>, - mut move_events: EventWriter, -) { - events.iter().for_each(|entity| { - if let Ok(idx) = query.get(entity) { - move_events.send(game::Move { - from: idx.clone(), - to: Some(idx.clone()), - ..default() - }); - } - }) -} diff --git a/src/display3d.rs b/src/display3d.rs index 4addff8..a138a75 100644 --- a/src/display3d.rs +++ b/src/display3d.rs @@ -31,14 +31,14 @@ impl Plugin for Display3dPlugin { Update, ( hydrate_camera, // TODO: add run_if... - menu::exit_to_menu.run_if(in_state(GameState::Display3d)), set_piece_model.run_if(any_component_added::), set_board_model.run_if(any_component_added::), set_tile_hitbox.run_if(any_component_added::), set_piece_position.run_if(any_component_changed::), set_piece_texture.run_if(any_component_changed::), select - .run_if(in_state(GameState::Display3d)) + .run_if(in_state(GameState::Play)) + .run_if(in_state(DisplayState::Display3d)) .run_if(on_event::()), pick_up.run_if(any_component_added::), put_down.run_if(any_component_removed::()), @@ -49,23 +49,26 @@ impl Plugin for Display3dPlugin { ( move_camera .run_if(resource_exists::()) - .run_if(in_state(GameState::Display3d)) + .run_if(in_state(GameState::Play)) + .run_if(in_state(DisplayState::Display3d)) .run_if(on_event::()), gizmo_system .run_if(resource_exists::()) - .run_if(in_state(GameState::Display3d)), + .run_if(in_state(GameState::Play)) + .run_if(in_state(DisplayState::Display3d)), mouse_zoom .run_if(resource_exists::()) - .run_if(in_state(GameState::Display3d)) + .run_if(in_state(GameState::Play)) + .run_if(in_state(DisplayState::Display3d)) .run_if(on_event::()), selected_gizmo.run_if(resource_exists::()), ), ) .add_systems( - OnEnter(GameState::Display3d), + OnEnter(DisplayState::Display3d), (activate::, set_piece_texture), ) - .add_systems(OnExit(GameState::Display3d), deactivate::); + .add_systems(OnExit(DisplayState::Display3d), deactivate::); } } @@ -199,11 +202,7 @@ fn hydrate_camera( UiCameraConfig { show_ui: true }, FogSettings { color: Color::WHITE, - falloff: FogFalloff::from_visibility_colors( - 100.0, - Color::ORANGE_RED, - Color::NONE, - ), + falloff: FogFalloff::from_visibility_colors(100.0, Color::NONE, Color::NONE), ..default() }, )); diff --git a/src/game.rs b/src/game.rs index 9038d6b..dcedf1d 100644 --- a/src/game.rs +++ b/src/game.rs @@ -10,6 +10,7 @@ impl Plugin for GamePlugin { .add_systems( Update, ( + menu::exit_to_menu.run_if(in_state(GameState::Play)), update_board::.run_if(on_event::()), update_board::.run_if(on_event::()), set_side.run_if(on_event::()), // TODO: correct run_if? diff --git a/src/main.rs b/src/main.rs index 984fe61..c150148 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,6 +29,7 @@ fn main() { let mut app = App::new(); app.add_state::(); + app.add_state::(); app.add_systems(Update, state.run_if(resource_changed::>())); app.add_systems(Update, loading.run_if(in_state(GameState::Loading))); app.add_systems( @@ -69,6 +70,12 @@ pub enum GameState { Loading, Menu, Credits, + Play, +} + +#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, States, Component)] +pub enum DisplayState { + #[default] Display2d, Display3d, } @@ -111,14 +118,15 @@ fn loading( /// System for printing the current state /// /// Only runs when state is modified. -fn state(state: Res>) { - info!("State is {:?}", *state); +fn state(game_state: Res>, display_state: Res>) { + info!("Game State is {:?}", *game_state); + info!("Display State is {:?}", *display_state); } fn toggle_display_mode( mut events: EventReader, - state: Res>, - mut next_state: ResMut>, + display_state: Res>, + mut next_state: ResMut>, ) { events .iter() @@ -127,10 +135,9 @@ fn toggle_display_mode( key_code, state, .. }| (*key_code, *state) == (Some(KeyCode::Space), ButtonState::Pressed), ) - .for_each(|_| match state.get() { - GameState::Display2d => next_state.set(GameState::Display3d), - GameState::Display3d => next_state.set(GameState::Display2d), - _ => (), + .for_each(|_| match display_state.get() { + DisplayState::Display2d => next_state.set(DisplayState::Display3d), + DisplayState::Display3d => next_state.set(DisplayState::Display2d), }) } diff --git a/src/menu.rs b/src/menu.rs index 87a60f3..3c15f2b 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -33,18 +33,6 @@ struct Menu; struct Quit; fn init_menu_ui(mut commands: Commands) { - commands.spawn(( - Menu, - Camera2dBundle { - camera: Camera { - is_active: false, - ..default() - }, - ..default() - }, - UiCameraConfig { show_ui: true }, - )); - commands .spawn(( Menu, @@ -66,7 +54,8 @@ fn init_menu_ui(mut commands: Commands) { .with_children(|parent| { parent .spawn(( - GameState::Display3d, + GameState::Play, + DisplayState::Display3d, ButtonBundle { style: Style { padding: UiRect::all(Val::Px(5.0)), @@ -79,7 +68,8 @@ fn init_menu_ui(mut commands: Commands) { )) .with_children(|parent| { parent.spawn(( - GameState::Display3d, + GameState::Play, + DisplayState::Display3d, TextBundle::from_section( "Start", TextStyle { @@ -148,13 +138,17 @@ fn init_menu_ui(mut commands: Commands) { } fn handle_menu_button( - events: Query<(&Interaction, &GameState), (With