diff --git a/src/move.rs b/src/move.rs index 7888554..40c46e6 100644 --- a/src/move.rs +++ b/src/move.rs @@ -125,8 +125,9 @@ impl Board { Some(mv.src - 8), ), }; + let pawn_move = Self::is_pawn_move(mv.src, &own_pieces[Kind::Pawn]); - Self::update_game_state(&mut self.state, mv.src, mv.dst, color); + Self::update_game_state(&mut self.state, mv, color, pawn_move); match &mv.move_type { MoveType::Quiet => { @@ -161,10 +162,12 @@ impl Board { } } - fn update_game_state(state: &mut State, src: usize, dst: usize, color: Color) { + fn update_game_state(state: &mut State, mv: &Move, color: Color, pawn_move: bool) { state.set_en_passant_target_square(None); - state.update_castling_state_quiet(src, color); - state.update_castling_state_capture(dst, Color::opponent_color(color)); + state.update_castling_state_quiet(mv.src, color); + state.update_castling_state_capture(mv.dst, Color::opponent_color(color)); + state.update_half_move(mv.move_type, pawn_move); + state.update_full_move(color); state.change_side(); } @@ -214,6 +217,10 @@ impl Board { Self::remove_piece(piece_to_remove, pieces); } + + const fn is_pawn_move(square: usize, pawns: &Piece) -> bool { + have_common_bit(square_to_bitboard(square), pawns.bitboard) + } } #[cfg(test)] @@ -257,7 +264,7 @@ mod tests { const FEN_EN_PASSANT: [&str; 2] = [ "r3k2r/2p1p1qp/2npb3/1p3p2/p3P1pP/P1PB1Q2/1P1PNPP1/R3K2R b KQkq h3 0 1", - "r3k2r/2p1p1qp/2npb3/1p3p2/p3P3/P1PB1Q1p/1P1PNPP1/R3K2R w KQkq - 0 1", + "r3k2r/2p1p1qp/2npb3/1p3p2/p3P3/P1PB1Q1p/1P1PNPP1/R3K2R w KQkq - 0 2", ]; #[test] @@ -316,7 +323,7 @@ mod tests { const FEN_CASTLE: [&str; 2] = [ "r3k2r/2p1p1qp/2npb3/1p3p2/p3P1pP/P1PB1Q2/1P1PNPP1/R3K2R w KQkq - 0 1", - "r3k2r/2p1p1qp/2npb3/1p3p2/p3P1pP/P1PB1Q2/1P1PNPP1/R4RK1 b kq - 0 1", + "r3k2r/2p1p1qp/2npb3/1p3p2/p3P1pP/P1PB1Q2/1P1PNPP1/R4RK1 b kq - 1 1", ]; #[test] diff --git a/src/state.rs b/src/state.rs index 6db59b0..35e5f7f 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,4 +1,4 @@ -use crate::board::Color; +use crate::{board::Color, r#move::MoveType}; #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub struct State { @@ -80,6 +80,21 @@ impl State { } } + pub fn update_half_move(&mut self, move_type: MoveType, pawn_move: bool) { + if move_type == MoveType::Capture || pawn_move { + self.halfmove_clock = 0; + } else { + self.halfmove_clock += 1; + } + } + + pub fn update_full_move(&mut self, color: Color) { + match color { + Color::White => (), + Color::Black => self.fullmove_counter += 1, + } + } + pub fn change_side(&mut self) { self.side_to_move = match self.side_to_move { Color::White => Color::Black,