|
|
|
@ -21,7 +21,7 @@ impl Plugin for GamePlugin {
|
|
|
|
update_board
|
|
|
|
update_board
|
|
|
|
.run_if(on_event::<Move>())
|
|
|
|
.run_if(on_event::<Move>())
|
|
|
|
.after(handle_selection),
|
|
|
|
.after(handle_selection),
|
|
|
|
set_side.run_if(on_event::<Move>()).after(update_board),
|
|
|
|
set_side.run_if(any_component_changed::<BoardIndex>),
|
|
|
|
cancel_place.run_if(|buttons: Res<Input<MouseButton>>| -> bool {
|
|
|
|
cancel_place.run_if(|buttons: Res<Input<MouseButton>>| -> bool {
|
|
|
|
buttons.just_pressed(MouseButton::Right)
|
|
|
|
buttons.just_pressed(MouseButton::Right)
|
|
|
|
}),
|
|
|
|
}),
|
|
|
|
@ -30,6 +30,8 @@ impl Plugin for GamePlugin {
|
|
|
|
hide_valid_moves.run_if(any_component_removed::<Selected>()),
|
|
|
|
hide_valid_moves.run_if(any_component_removed::<Selected>()),
|
|
|
|
manage_score.run_if(any_component_added::<Captured>),
|
|
|
|
manage_score.run_if(any_component_added::<Captured>),
|
|
|
|
check_endgame.run_if(resource_changed::<Board>()),
|
|
|
|
check_endgame.run_if(resource_changed::<Board>()),
|
|
|
|
|
|
|
|
reset_game
|
|
|
|
|
|
|
|
.run_if(|keys: Res<Input<KeyCode>>| -> bool { keys.just_pressed(KeyCode::R) }),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.add_systems(OnEnter(GameState::Endgame), set_endgame)
|
|
|
|
.add_systems(OnEnter(GameState::Endgame), set_endgame)
|
|
|
|
@ -235,6 +237,55 @@ impl Board {
|
|
|
|
self.inner[y][x].as_ref()
|
|
|
|
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
|
|
|
|
/// 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.
|
|
|
|
/// 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)> {
|
|
|
|
pub(crate) fn on(&self, side: Side) -> Vec<(&Piece, BoardIndex)> {
|
|
|
|
@ -479,52 +530,7 @@ pub(crate) struct Selectable;
|
|
|
|
pub(crate) struct Selection(pub BoardIndex);
|
|
|
|
pub(crate) struct Selection(pub BoardIndex);
|
|
|
|
|
|
|
|
|
|
|
|
fn setup_board(mut commands: Commands) {
|
|
|
|
fn setup_board(mut commands: Commands) {
|
|
|
|
use Piece::*;
|
|
|
|
commands.insert_resource(Board::new());
|
|
|
|
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),
|
|
|
|
|
|
|
|
],
|
|
|
|
|
|
|
|
],
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn debug_board(board: Res<Board>, mut debug_info: ResMut<debug::DebugInfo>) {
|
|
|
|
fn debug_board(board: Res<Board>, mut debug_info: ResMut<debug::DebugInfo>) {
|
|
|
|
@ -657,7 +663,7 @@ fn manage_score(
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub(crate) fn set_side(mut events: Query<(&mut Side, &BoardIndex), Changed<BoardIndex>>) {
|
|
|
|
pub(crate) fn set_side(mut events: Query<(&mut Side, &BoardIndex), Or<(Changed<BoardIndex>, Added<BoardIndex>)>>) {
|
|
|
|
events
|
|
|
|
events
|
|
|
|
.iter_mut()
|
|
|
|
.iter_mut()
|
|
|
|
.for_each(|(mut side, idx)| match Board::side(*idx) {
|
|
|
|
.for_each(|(mut side, idx)| match Board::side(*idx) {
|
|
|
|
@ -809,3 +815,23 @@ fn hide_valid_moves(mut indicators: Query<&mut Visibility, With<ValidMove>>) {
|
|
|
|
*visibility = Visibility::Hidden;
|
|
|
|
*visibility = Visibility::Hidden;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Resets the board to the "stock" setup
|
|
|
|
|
|
|
|
// Somewhat conflicts with board initialization!
|
|
|
|
|
|
|
|
fn reset_game(
|
|
|
|
|
|
|
|
pieces: Query<Entity, With<Piece>>,
|
|
|
|
|
|
|
|
mut board: ResMut<Board>,
|
|
|
|
|
|
|
|
mut score: ResMut<Score>,
|
|
|
|
|
|
|
|
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::<Captured>();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|