getPossibleMovesFromSquareOnBoard method

  1. @override
List<Move> getPossibleMovesFromSquareOnBoard(
  1. Square square,
  2. Board board
)
override

Returns the list of possible moves with this piece from square, including moves that are illegal in current position.

Implementation

@override
List<Move> getPossibleMovesFromSquareOnBoard(
  Square square,
  Board board,
) {
  final int rowDiff = isWhite ? 1 : -1;

  final List<Move> possibleMoves;
  if ((isWhite && square.row == Board.size - 2) ||
      (isBlack && square.row == 1)) {
    possibleMoves = <Move>[
      if (board.at(square.row + rowDiff, square.col) == null) ...[
        Move(
          square,
          Square(square.row + rowDiff, square.col),
          isWhite ? const WhiteBishop() : const BlackBishop(),
        ),
        Move(
          square,
          Square(square.row + rowDiff, square.col),
          isWhite ? const WhiteKnight() : const BlackKnight(),
        ),
        Move(
          square,
          Square(square.row + rowDiff, square.col),
          isWhite ? const WhiteQueen() : const BlackQueen(),
        ),
        Move(
          square,
          Square(square.row + rowDiff, square.col),
          isWhite ? const WhiteRook() : const BlackRook(),
        ),
      ],
      if (square.col + 1 < Board.size &&
          ((isWhite &&
                  !(board.at(square.row + rowDiff, square.col + 1)?.isWhite ??
                      false)) ||
              (isBlack &&
                  !(board.at(square.row + rowDiff, square.col + 1)?.isBlack ??
                      false)))) ...[
        Move(
          square,
          Square(square.row + rowDiff, square.col + 1),
          isWhite ? const WhiteBishop() : const BlackBishop(),
        ),
        Move(
          square,
          Square(square.row + rowDiff, square.col + 1),
          isWhite ? const WhiteKnight() : const BlackKnight(),
        ),
        Move(
          square,
          Square(square.row + rowDiff, square.col + 1),
          isWhite ? const WhiteQueen() : const BlackQueen(),
        ),
        Move(
          square,
          Square(square.row + rowDiff, square.col + 1),
          isWhite ? const WhiteRook() : const BlackRook(),
        ),
      ],
      if (square.col - 1 < Board.size &&
          ((isWhite &&
                  !(board.at(square.row + rowDiff, square.col - 1)?.isWhite ??
                      false)) ||
              (isBlack &&
                  !(board.at(square.row + rowDiff, square.col - 1)?.isBlack ??
                      false)))) ...[
        Move(
          square,
          Square(square.row + rowDiff, square.col - 1),
          isWhite ? const WhiteBishop() : const BlackBishop(),
        ),
        Move(
          square,
          Square(square.row + rowDiff, square.col - 1),
          isWhite ? const WhiteKnight() : const BlackKnight(),
        ),
        Move(
          square,
          Square(square.row + rowDiff, square.col - 1),
          isWhite ? const WhiteQueen() : const BlackQueen(),
        ),
        Move(
          square,
          Square(square.row + rowDiff, square.col - 1),
          isWhite ? const WhiteRook() : const BlackRook(),
        ),
      ],
    ];
  } else {
    possibleMoves = <Move>[
      if (board.at(square.row + rowDiff, square.col) == null)
        Move(square, Square(square.row + rowDiff, square.col)),
      if (square.col + 1 < Board.size &&
          ((isWhite &&
                  !(board.at(square.row + rowDiff, square.col + 1)?.isWhite ??
                      false)) ||
              (isBlack &&
                  !(board.at(square.row + rowDiff, square.col + 1)?.isBlack ??
                      false))))
        Move(square, Square(square.row + rowDiff, square.col + 1)),
      if (square.col - 1 >= 0 &&
          ((isWhite &&
                  !(board.at(square.row + rowDiff, square.col - 1)?.isWhite ??
                      false)) ||
              (isBlack &&
                  !(board.at(square.row + rowDiff, square.col - 1)?.isBlack ??
                      false))))
        Move(square, Square(square.row + rowDiff, square.col - 1)),
    ];
  }

  return possibleMoves;
}