makeMove method

void makeMove(
  1. int m
)

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