make_move method
Make move.
Implementation
void make_move(Move move) {
final us = turn;
final them = swap_color(us);
push(move);
board[move.to] = board[move.from];
board[move.from] = null;
/* if ep capture, remove the captured pawn */
if ((move.flags & BITS_EP_CAPTURE) != 0) {
if (turn == BLACK) {
board[move.to - 16] = null;
} else {
board[move.to + 16] = null;
}
}
/* if pawn promotion, replace with new piece */
if ((move.flags & BITS_PROMOTION) != 0) {
board[move.to] = Piece(move.promotion!, us);
}
/* if we moved the king */
if (board[move.to]!.type == KING) {
kings[board[move.to]!.color] = move.to;
/* if we castled, move the rook next to the king */
if ((move.flags & BITS_KSIDE_CASTLE) != 0) {
final castling_to = move.to - 1;
final castling_from = move.to + 1;
board[castling_to] = board[castling_from];
board[castling_from] = null;
} else if ((move.flags & BITS_QSIDE_CASTLE) != 0) {
final castling_to = move.to + 1;
final castling_from = move.to - 2;
board[castling_to] = board[castling_from];
board[castling_from] = null;
}
/* turn off castling */
castling[us] = 0;
}
/* turn off castling if we move a rook */
if (castling[us] != 0) {
for (var i = 0, len = Rooks[us]!.length; i < len; i++) {
if (move.from == Rooks[us]![i]['square'] &&
((castling[us] & Rooks[us]![i]['flag']) != 0)) {
castling[us] ^= Rooks[us]![i]['flag'];
break;
}
}
}
/* turn off castling if we capture a rook */
if (castling[them] != 0) {
for (var i = 0, len = Rooks[them]!.length; i < len; i++) {
if (move.to == Rooks[them]![i]['square'] &&
((castling[them] & Rooks[them]![i]['flag']) != 0)) {
castling[them] ^= Rooks[them]![i]['flag'];
break;
}
}
}
/* if big pawn move, update the en passant square */
if ((move.flags & BITS_BIG_PAWN) != 0) {
if (turn == BLACK) {
ep_square = move.to - 16;
} else {
ep_square = move.to + 16;
}
} else {
ep_square = EMPTY;
}
/* reset the 50 move counter if a pawn is moved or a piece is captured */
if (move.piece == PAWN) {
half_moves = 0;
} else if ((move.flags & (BITS_CAPTURE | BITS_EP_CAPTURE)) != 0) {
half_moves = 0;
} else {
half_moves++;
}
if (turn == BLACK) {
move_number++;
}
turn = swap_color(turn);
}