makeLegalMoves function

IMap<Square, ISet<Square>> makeLegalMoves(
  1. Position pos, {
  2. bool includeAlternateCastlingMoves = true,
})

Returns all the legal moves of the Position in a convenient format.

Includes both possible representations of castling moves unless includeAlternateCastlingMoves is false.

Implementation

IMap<Square, ISet<Square>> makeLegalMoves(
  Position pos, {
  bool includeAlternateCastlingMoves = true,
}) {
  final Map<Square, ISet<Square>> result = {};
  for (final entry in pos.legalMoves.entries) {
    final dests = entry.value.squares;
    if (dests.isNotEmpty) {
      final from = entry.key;
      final destSet = dests.toSet();
      if (includeAlternateCastlingMoves &&
          from == pos.board.kingOf(pos.turn) &&
          entry.key.file == 4) {
        if (dests.contains(Square.a1)) {
          destSet.add(Square.c1);
        } else if (dests.contains(Square.a8)) {
          destSet.add(Square.c8);
        }
        if (dests.contains(Square.h1)) {
          destSet.add(Square.g1);
        } else if (dests.contains(Square.h8)) {
          destSet.add(Square.g8);
        }
      }
      result[from] = ISet(destSet);
    }
  }
  return IMap(result);
}