diff --git a/src/debug.rs b/src/debug.rs index 3b64896..73f6d74 100644 --- a/src/debug.rs +++ b/src/debug.rs @@ -58,6 +58,10 @@ impl DebugInfo { self.0.get(key) } + pub fn _clear(&mut self, key: String) { + self.0.remove(&key); + } + pub fn iter(&self) -> Iter<'_, String, String> { self.0.iter() } diff --git a/src/display3d.rs b/src/display3d.rs index da924e5..5156f04 100644 --- a/src/display3d.rs +++ b/src/display3d.rs @@ -50,6 +50,7 @@ impl Plugin for Display3dPlugin { .run_if(on_event::>()), hydrate_camera.run_if(any_component_added::), set_piece_model.run_if(any_component_added::), + set_piece_model.run_if(any_component_changed::), set_board_model.run_if(any_component_added::), set_board_model.run_if(any_component_added::), set_valid_move_model.run_if(any_component_added::), @@ -91,6 +92,7 @@ impl Plugin for Display3dPlugin { gizmo_system, selected_gizmo, moves_gizmo, + debug_selected.run_if(any_with_component::()) ) .run_if(resource_exists::()) .run_if(in_state(GameState::Play)) @@ -390,7 +392,7 @@ fn fix_skybox( /// Set the model for each piece based on the game::Piece::* marker fn set_piece_model( - mut events: Query<(&mut Handle, &Piece), (Added, With)>, + mut events: Query<(&mut Handle, &Piece), (Or<(Added, Changed)>, With)>, gltfs: Res>, tweaks: Res>, tweaks_file: Res, @@ -1480,9 +1482,6 @@ fn capture_piece( // If we have completed the animation if *prog >= 1.0 { - // Remove the captured component for bookkeeping - commands.entity(entity).remove::(); - // Move to next state now that animation is done *state = s.next(); } @@ -1521,3 +1520,12 @@ fn capture_piece( } } } + +fn debug_selected( + query: Query<(Entity, &BoardIndex, &Piece, &Side), With>, + mut debug_info: ResMut, +) { + query.iter().for_each(|(e, bi, p, s)| { + debug_info.set("Active".into(), format!("\n>>ID: {:?}\n>>Piece: {:?}\n>>Side: {:?}\n>>Index: {:?}", e, p, s, bi)); + }); +} \ No newline at end of file diff --git a/src/game.rs b/src/game.rs index 4d2fb73..7d720a2 100644 --- a/src/game.rs +++ b/src/game.rs @@ -21,7 +21,7 @@ impl Plugin for GamePlugin { update_board .run_if(on_event::()) .after(handle_selection), - set_side.run_if(on_event::()).after(update_board), + set_side.run_if(any_component_changed::), cancel_place.run_if(|buttons: Res>| -> bool { buttons.just_pressed(MouseButton::Right) }), @@ -30,6 +30,8 @@ impl Plugin for GamePlugin { hide_valid_moves.run_if(any_component_removed::()), manage_score.run_if(any_component_added::), check_endgame.run_if(resource_changed::()), + reset_game + .run_if(|keys: Res>| -> bool { keys.just_pressed(KeyCode::R) }), ), ) .add_systems(OnEnter(GameState::Endgame), set_endgame) @@ -235,6 +237,55 @@ impl Board { self.inner[y][x].as_ref() } + fn new() -> Board { + use Piece::*; + Board { + moves: vec![], + inner: vec![ + vec![ + Some(Queen), + Some(Queen), + Some(Drone), + None, + None, + None, + None, + None, + ], + vec![ + Some(Queen), + Some(Drone), + Some(Pawn), + None, + None, + Some(Pawn), + Some(Pawn), + Some(Drone), + ], + vec![ + Some(Drone), + Some(Pawn), + Some(Pawn), + None, + None, + Some(Pawn), + Some(Drone), + Some(Queen), + ], + vec![ + None, + None, + None, + None, + None, + Some(Drone), + Some(Queen), + Some(Queen), + ], + ], + } + } + /// Show all pieces on one side of the board /// OPTIMIZE: This is only used to tell if a side is empty, so it is more work than we need to do. pub(crate) fn on(&self, side: Side) -> Vec<(&Piece, BoardIndex)> { @@ -479,52 +530,7 @@ pub(crate) struct Selectable; pub(crate) struct Selection(pub BoardIndex); fn setup_board(mut commands: Commands) { - use Piece::*; - commands.insert_resource(Board { - moves: vec![], - inner: vec![ - vec![ - Some(Queen), - Some(Queen), - Some(Drone), - None, - None, - None, - None, - None, - ], - vec![ - Some(Queen), - Some(Drone), - Some(Pawn), - None, - None, - Some(Pawn), - Some(Pawn), - Some(Drone), - ], - vec![ - Some(Drone), - Some(Pawn), - Some(Pawn), - None, - None, - Some(Pawn), - Some(Drone), - Some(Queen), - ], - vec![ - None, - None, - None, - None, - None, - Some(Drone), - Some(Queen), - Some(Queen), - ], - ], - }); + commands.insert_resource(Board::new()); } fn debug_board(board: Res, mut debug_info: ResMut) { @@ -657,7 +663,7 @@ fn manage_score( }); } -pub(crate) fn set_side(mut events: Query<(&mut Side, &BoardIndex), Changed>) { +pub(crate) fn set_side(mut events: Query<(&mut Side, &BoardIndex), Or<(Changed, Added)>>) { events .iter_mut() .for_each(|(mut side, idx)| match Board::side(*idx) { @@ -809,3 +815,23 @@ fn hide_valid_moves(mut indicators: Query<&mut Visibility, With>) { *visibility = Visibility::Hidden; }); } + +// Resets the board to the "stock" setup +// Somewhat conflicts with board initialization! +fn reset_game( + pieces: Query>, + mut board: ResMut, + mut score: ResMut, + mut commands: Commands, +) { + // Setup the board + *board = Board::new(); + + // Reset the score + *score = Score { ..default() }; + + // Move all pieces to their correct spots + pieces.iter().zip(board.pieces().iter()).for_each(|(e, (i, p))| { + commands.entity(e).insert((i.clone(), p.clone())).remove::(); + }); +} \ No newline at end of file