[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>
use chessfriend_board::{board::HalfMoveClock, CastleRights};
use chessfriend_core::Square;
use chessfriend_board::{board::HalfMoveClock, Board, CastleRights};
use chessfriend_core::{Color, Piece, Square};
use chessfriend_moves::Move;
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct MoveRecord {
pub color: Color,
pub ply: Move,
pub en_passant_target: Option<Square>,
pub castling_rights: CastleRights,
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);
let record = self.register_move_record(ply);
let record = self.register_move_record(ply, None);
self.advance_clocks(HalfMoveClock::Advance);
@ -141,7 +141,7 @@ impl Position {
_ => unreachable!(),
};
let record = self.register_move_record(ply);
let record = self.register_move_record(ply, None);
self.advance_clocks(HalfMoveClock::Advance);
@ -181,7 +181,7 @@ impl Position {
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);
@ -202,7 +202,7 @@ impl Position {
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);
@ -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);
Ok(record)
}
fn register_move_record(&mut self, ply: Move) -> MoveRecord {
let record = MoveRecord {
ply,
en_passant_target: self.board.en_passant_target,
castling_rights: self.board.castling_rights,
half_move_clock: self.board.half_move_clock,
};
fn register_move_record(&mut self, ply: Move, capture: Option<Piece>) -> MoveRecord {
let record = MoveRecord::new(&self.board, ply, capture);
self.moves.push(record.clone());
record