[moves] Make sure en passant state is cleared after making moves
En passant state should be cleared after any move that isn't a double push. To support this fix, rename advance_clocks to advance_board_state and let it take an Option<Square>. Every supporting make_move method calls this method to update board state when the make is done. So this is the ideal place to also update e.p. state.
This commit is contained in:
parent
e2ce778247
commit
638ef5e66a
1 changed files with 19 additions and 9 deletions
|
@ -81,7 +81,11 @@ trait MakeMoveInternal {
|
||||||
fn validate_move(&self, ply: Move, validate: ValidateMove) -> Result<(), MakeMoveError>;
|
fn validate_move(&self, ply: Move, validate: ValidateMove) -> Result<(), MakeMoveError>;
|
||||||
fn validate_active_piece(&self, ply: Move) -> Result<Piece, MakeMoveError>;
|
fn validate_active_piece(&self, ply: Move) -> Result<Piece, MakeMoveError>;
|
||||||
|
|
||||||
fn advance_clocks(&mut self, half_move_clock: HalfMoveClock);
|
fn advance_board_state(
|
||||||
|
&mut self,
|
||||||
|
en_passant_target: Option<Square>,
|
||||||
|
half_move_clock: HalfMoveClock,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: BoardProvider> MakeMove for T {
|
impl<T: BoardProvider> MakeMove for T {
|
||||||
|
@ -147,7 +151,7 @@ impl<T: BoardProvider> MakeMoveInternal for T {
|
||||||
|
|
||||||
let record = MoveRecord::new(board, ply, None);
|
let record = MoveRecord::new(board, ply, None);
|
||||||
|
|
||||||
self.advance_clocks(HalfMoveClock::Advance);
|
self.advance_board_state(None, HalfMoveClock::Advance);
|
||||||
|
|
||||||
Ok(record)
|
Ok(record)
|
||||||
}
|
}
|
||||||
|
@ -169,13 +173,13 @@ impl<T: BoardProvider> MakeMoveInternal for T {
|
||||||
// board state before the change is preserved.
|
// board state before the change is preserved.
|
||||||
let record = MoveRecord::new(board, ply, None);
|
let record = MoveRecord::new(board, ply, None);
|
||||||
|
|
||||||
board.set_en_passant_target(match target.rank() {
|
let en_passant_target = match target.rank() {
|
||||||
Rank::FOUR => Square::from_file_rank(target.file(), Rank::THREE),
|
Rank::FOUR => Square::from_file_rank(target.file(), Rank::THREE),
|
||||||
Rank::FIVE => Square::from_file_rank(target.file(), Rank::SIX),
|
Rank::FIVE => Square::from_file_rank(target.file(), Rank::SIX),
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
});
|
};
|
||||||
|
|
||||||
self.advance_clocks(HalfMoveClock::Advance);
|
self.advance_board_state(Some(en_passant_target), HalfMoveClock::Advance);
|
||||||
|
|
||||||
Ok(record)
|
Ok(record)
|
||||||
}
|
}
|
||||||
|
@ -217,7 +221,7 @@ impl<T: BoardProvider> MakeMoveInternal for T {
|
||||||
|
|
||||||
let record = MoveRecord::new(board, ply, Some(captured_piece));
|
let record = MoveRecord::new(board, ply, Some(captured_piece));
|
||||||
|
|
||||||
self.advance_clocks(HalfMoveClock::Reset);
|
self.advance_board_state(None, HalfMoveClock::Reset);
|
||||||
|
|
||||||
Ok(record)
|
Ok(record)
|
||||||
}
|
}
|
||||||
|
@ -242,7 +246,7 @@ impl<T: BoardProvider> MakeMoveInternal for T {
|
||||||
|
|
||||||
board.revoke_castling_right(active_color, wing);
|
board.revoke_castling_right(active_color, wing);
|
||||||
|
|
||||||
self.advance_clocks(HalfMoveClock::Advance);
|
self.advance_board_state(None, HalfMoveClock::Advance);
|
||||||
|
|
||||||
Ok(record)
|
Ok(record)
|
||||||
}
|
}
|
||||||
|
@ -276,12 +280,16 @@ impl<T: BoardProvider> MakeMoveInternal for T {
|
||||||
|
|
||||||
let record = MoveRecord::new(board, ply, None);
|
let record = MoveRecord::new(board, ply, None);
|
||||||
|
|
||||||
self.advance_clocks(HalfMoveClock::Reset);
|
self.advance_board_state(None, HalfMoveClock::Reset);
|
||||||
|
|
||||||
Ok(record)
|
Ok(record)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn advance_clocks(&mut self, half_move_clock: HalfMoveClock) {
|
fn advance_board_state(
|
||||||
|
&mut self,
|
||||||
|
en_passant_target: Option<Square>,
|
||||||
|
half_move_clock: HalfMoveClock,
|
||||||
|
) {
|
||||||
let board = self.board_mut();
|
let board = self.board_mut();
|
||||||
|
|
||||||
match half_move_clock {
|
match half_move_clock {
|
||||||
|
@ -293,6 +301,8 @@ impl<T: BoardProvider> MakeMoveInternal for T {
|
||||||
let active_color = previous_active_color.next();
|
let active_color = previous_active_color.next();
|
||||||
board.set_active_color(active_color);
|
board.set_active_color(active_color);
|
||||||
|
|
||||||
|
board.set_en_passant_target_option(en_passant_target);
|
||||||
|
|
||||||
if active_color == Color::White {
|
if active_color == Color::White {
|
||||||
board.full_move_number += 1;
|
board.full_move_number += 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue