[position] Register a captured piece in the MoveRecord

For unmake_move, so the captured piece can be restored.
This commit is contained in:
Eryn Wells 2025-05-28 16:23:46 -07:00
parent 2106e05d57
commit 43abbe3fe2
2 changed files with 23 additions and 16 deletions

View file

@ -1,15 +1,28 @@
// Eryn Wells <eryn@erynwells.me> // Eryn Wells <eryn@erynwells.me>
use chessfriend_board::{board::HalfMoveClock, CastleRights}; use chessfriend_board::{board::HalfMoveClock, Board, CastleRights};
use chessfriend_core::Square; use chessfriend_core::{Color, Piece, Square};
use chessfriend_moves::Move; use chessfriend_moves::Move;
#[derive(Clone, Debug, Eq, PartialEq)] #[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct MoveRecord { pub(crate) struct MoveRecord {
pub color: Color,
pub ply: Move, pub ply: Move,
pub en_passant_target: Option<Square>, pub en_passant_target: Option<Square>,
pub castling_rights: CastleRights, pub castling_rights: CastleRights,
pub half_move_clock: HalfMoveClock, pub half_move_clock: HalfMoveClock,
pub captured_piece: Option<Piece>,
} }
impl MoveRecord {} impl MoveRecord {
pub fn new(board: &Board, ply: Move, capture: Option<Piece>) -> Self {
Self {
color: board.active_color,
ply,
en_passant_target: board.en_passant_target,
castling_rights: board.castling_rights,
half_move_clock: board.half_move_clock,
captured_piece: capture,
}
}
}

View file

@ -118,7 +118,7 @@ impl Position {
self.remove_piece(origin); self.remove_piece(origin);
let record = self.register_move_record(ply); let record = self.register_move_record(ply, None);
self.advance_clocks(HalfMoveClock::Advance); self.advance_clocks(HalfMoveClock::Advance);
@ -141,7 +141,7 @@ impl Position {
_ => unreachable!(), _ => unreachable!(),
}; };
let record = self.register_move_record(ply); let record = self.register_move_record(ply, None);
self.advance_clocks(HalfMoveClock::Advance); self.advance_clocks(HalfMoveClock::Advance);
@ -181,7 +181,7 @@ impl Position {
self.place_piece(piece, target_square, PlacePieceStrategy::Replace)?; self.place_piece(piece, target_square, PlacePieceStrategy::Replace)?;
} }
let record = self.register_move_record(ply); let record = self.register_move_record(ply, Some(captured_piece));
self.advance_clocks(HalfMoveClock::Reset); self.advance_clocks(HalfMoveClock::Reset);
@ -202,7 +202,7 @@ impl Position {
self.board.castling_rights.revoke(active_color, wing); self.board.castling_rights.revoke(active_color, wing);
let record = self.register_move_record(ply); let record = self.register_move_record(ply, None);
self.advance_clocks(HalfMoveClock::Advance); self.advance_clocks(HalfMoveClock::Advance);
@ -232,21 +232,15 @@ impl Position {
); );
} }
let record = self.register_move_record(ply); let record = self.register_move_record(ply, None);
self.advance_clocks(HalfMoveClock::Reset); self.advance_clocks(HalfMoveClock::Reset);
Ok(record) Ok(record)
} }
fn register_move_record(&mut self, ply: Move) -> MoveRecord { fn register_move_record(&mut self, ply: Move, capture: Option<Piece>) -> MoveRecord {
let record = MoveRecord { let record = MoveRecord::new(&self.board, ply, capture);
ply,
en_passant_target: self.board.en_passant_target,
castling_rights: self.board.castling_rights,
half_move_clock: self.board.half_move_clock,
};
self.moves.push(record.clone()); self.moves.push(record.clone());
record record