movement: fix castling issue
A rook taken without moving would not have it's castling option removed.
This commit is contained in:
parent
938fcde9fa
commit
56e7450c7e
|
@ -36,8 +36,21 @@ pub fn apply_move_to(
|
||||||
game_state: &mut rules::GameState,
|
game_state: &mut rules::GameState,
|
||||||
m: &Move
|
m: &Move
|
||||||
) {
|
) {
|
||||||
|
// If a rook is taken, remove its castling option. Needs to be checked before we update board.
|
||||||
|
if m.1 == pos("a1") && get_square(board, &pos("a1")) == SQ_WH_R {
|
||||||
|
game_state.castling &= !CASTLING_WH_Q;
|
||||||
|
} else if m.1 == pos("h1") && get_square(board, &pos("h1")) == SQ_WH_R {
|
||||||
|
game_state.castling &= !CASTLING_WH_K;
|
||||||
|
} else if m.1 == pos("a8") && get_square(board, &pos("a8")) == SQ_BL_R {
|
||||||
|
game_state.castling &= !CASTLING_BL_Q;
|
||||||
|
} else if m.1 == pos("h8") && get_square(board, &pos("h8")) == SQ_BL_R {
|
||||||
|
game_state.castling &= !CASTLING_BL_K;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update board and game state.
|
||||||
apply_move_to_board(board, m);
|
apply_move_to_board(board, m);
|
||||||
apply_move_to_state(game_state, m);
|
apply_move_to_state(game_state, m);
|
||||||
|
|
||||||
// If the move is a castle, remove it from castling options.
|
// If the move is a castle, remove it from castling options.
|
||||||
if let Some(castle) = get_castle(m) {
|
if let Some(castle) = get_castle(m) {
|
||||||
match castle {
|
match castle {
|
||||||
|
@ -46,7 +59,7 @@ pub fn apply_move_to(
|
||||||
_ => {}
|
_ => {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
// Else, check if it's either a rook or the king that moved.
|
// Else, check if the king or a rook moved to update castling options.
|
||||||
else {
|
else {
|
||||||
let piece = get_square(board, &m.1);
|
let piece = get_square(board, &m.1);
|
||||||
if is_white(piece) && game_state.castling & CASTLING_WH_MASK != 0 {
|
if is_white(piece) && game_state.castling & CASTLING_WH_MASK != 0 {
|
||||||
|
|
Reference in a new issue