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);
  }
}