internal override MoveCheckResult CanMoveLeft(ChessBoard board, BoardTile currentTile, BoardTile destinationTile, int count = 8) { MoveCheckResult result = base.CanMoveLeft(board, currentTile, destinationTile, count); // Check for legal castling move if (isInInitialPosition) { var rooks = board.TilesByPieceType(typeof(Rook), this.IsWhite); foreach (var rook in rooks) { if (rook != destinationTile) { continue; } if (rook.OccupyingPiece is Rook piece) { if (piece.IsInInitialPosition) { if (rook.X == 0) { // check right path if (board.Tiles[currentTile.Y, currentTile.X - 1].OccupyingPiece == null && rook.CanMoveTo(board, board.Tiles[currentTile.Y, currentTile.X - 1])) { result = MoveCheckResult.CanMove; } } else if (rook.X == 7) { // check left path if (board.Tiles[currentTile.Y, currentTile.X + 1].OccupyingPiece == null && rook.CanMoveTo(board, board.Tiles[currentTile.Y, currentTile.X + 1])) { result = MoveCheckResult.CanMove; } } } } } } return(result); }
/// <summary> /// Returns if the given <see cref="MoveCheckResult"/> represents a legal move, even if that move is incomplete. /// </summary> public static bool IsLegalMove(this MoveCheckResult moveCheckResult) => (moveCheckResult & MoveCheckResult.IllegalMove) == MoveCheckResult.OK;
private void CompareMoveTypes(MoveType expectedMoveType, MoveType actualMoveType, ref MoveCheckResult moveCheckResult) { if (actualMoveType != expectedMoveType) { if (expectedMoveType == MoveType.Default || actualMoveType != MoveType.Default) { // Given actualMoveType should not have been specified. switch (actualMoveType) { case MoveType.Promotion: moveCheckResult |= MoveCheckResult.IllegalMoveTypePromotion; break; case MoveType.EnPassant: moveCheckResult |= MoveCheckResult.IllegalMoveTypeEnPassant; break; case MoveType.CastleQueenside: moveCheckResult |= MoveCheckResult.IllegalMoveTypeCastleQueenside; break; case MoveType.CastleKingside: moveCheckResult |= MoveCheckResult.IllegalMoveTypeCastleKingside; break; } } else { // Only warn that a different MoveType was expected. Not an illegal move though. switch (expectedMoveType) { case MoveType.Promotion: moveCheckResult |= MoveCheckResult.MissingPromotionInformation; break; case MoveType.EnPassant: moveCheckResult |= MoveCheckResult.MissingEnPassant; break; case MoveType.CastleQueenside: moveCheckResult |= MoveCheckResult.MissingCastleQueenside; break; case MoveType.CastleKingside: moveCheckResult |= MoveCheckResult.MissingCastleKingside; break; } } } }