unmakeMove method
void
unmakeMove()
Implementation
void unmakeMove() {
final u = _undo.removeLast();
final m = u.move;
final from = moveFrom(m), to = moveTo(m), flag = moveFlag(m);
final us = turn ^ 1; // side that had moved
final them = turn;
turn = us;
castling = u.castling;
epSquare = u.epSquare;
halfmove = u.halfmove;
if (us == black) fullmove--;
// Undo rook move for castling.
if (flag == flagKingCastle) {
if (us == white) {
_removePiece(us, rook, _f1);
_addPiece(us, rook, _h1);
} else {
_removePiece(us, rook, _f8);
_addPiece(us, rook, _h8);
}
} else if (flag == flagQueenCastle) {
if (us == white) {
_removePiece(us, rook, _d1);
_addPiece(us, rook, _a1);
} else {
_removePiece(us, rook, _d8);
_addPiece(us, rook, _a8);
}
}
// Move piece back (undo promotion). Capture the moving piece's type from
// `to` before removing it — _removePiece clears mailbox[to].
if (moveIsPromotion(m)) {
_removePiece(us, movePromoType(m), to);
_addPiece(us, pawn, from);
} else {
final movedType = mailbox[to];
_removePiece(us, movedType, to);
_addPiece(us, movedType, from);
}
// Restore captured piece.
if (flag == flagEpCapture) {
final capSq = us == white ? to - 8 : to + 8;
_addPiece(them, pawn, capSq);
} else if (u.capturedType != -1) {
_addPiece(them, u.capturedType, to);
}
}