makeMove method
Implementation
void makeMove(int m) {
final from = moveFrom(m), to = moveTo(m), flag = moveFlag(m);
final us = turn, them = turn ^ 1;
final movingType = mailbox[from];
var capturedType = -1;
if (flag == flagEpCapture) {
capturedType = pawn;
} else if (mailbox[to] != -1) {
capturedType = mailbox[to];
}
_undo.add(_Undo(m, capturedType, castling, epSquare, halfmove));
// Remove captured piece (normal capture handled by moving onto it).
if (flag == flagEpCapture) {
final capSq = us == white ? to - 8 : to + 8;
_removePiece(them, pawn, capSq);
} else if (capturedType != -1) {
_removePiece(them, capturedType, to);
}
// Move the piece.
_removePiece(us, movingType, from);
if (moveIsPromotion(m)) {
_addPiece(us, movePromoType(m), to);
} else {
_addPiece(us, movingType, to);
}
// Castling: move the rook.
if (flag == flagKingCastle) {
if (us == white) {
_removePiece(us, rook, _h1);
_addPiece(us, rook, _f1);
} else {
_removePiece(us, rook, _h8);
_addPiece(us, rook, _f8);
}
} else if (flag == flagQueenCastle) {
if (us == white) {
_removePiece(us, rook, _a1);
_addPiece(us, rook, _d1);
} else {
_removePiece(us, rook, _a8);
_addPiece(us, rook, _d8);
}
}
// En-passant target: only after a double push.
epSquare = flag == flagDoublePush ? (from + to) ~/ 2 : -1;
// Castling rights.
castling &= _castleClear[from] & _castleClear[to];
// Clocks.
if (movingType == pawn || capturedType != -1) {
halfmove = 0;
} else {
halfmove++;
}
if (us == black) fullmove++;
turn = them;
}