     /// Attempt wrong kind of move for piece.
     case WrongMovementKind(Piece)
 
-    /// A king has moved from its starting location, preventing a castle.
-    case KingMoved(Color)
-
-    /// A rook has moved from its starting location, preventing a castle.
-    case RookMoved(Color, File.Direction)
+    /// Attempted to castle without availability.
+    case NoAvailability(CastlingAvailability)
 
 }

            }
        case .King:
            if /* Castle */ abs(move.fileChange) == 2 {
                // The king being moved hasn't previously moved
                guard pieceColor.isWhite ? !whiteKingHasMoved : !blackKingHasMoved else {
                    return .Error(.KingMoved(pieceColor))
                }
                // Check if the rook for the appropriate color has moved
                switch move.end {
                case (.C, .One):
                    guard !whiteLeftRookHasMoved else {
                        return .Error(.RookMoved(.White, .Left))
                    }
                case (.G, .One):
                    guard !whiteRightRookHasMoved else {
                        return .Error(.RookMoved(.White, .Right))
                    }
                case (.C, .Eight):
                    guard !blackLeftRookHasMoved else {
                        return .Error(.RookMoved(.Black, .Left))
                    }
                case (.G, .Eight):
                    guard !blackRightRookHasMoved else {
                        return .Error(.RookMoved(.Black, .Right))
                    }
                default:
                    return .Error(.WrongMovementKind(piece))

    /// The current player's turn.
    public private(set) var playerTurn: PlayerTurn

    /// The castling availability.
    public private(set) var castlingAvailability: CastlingAvailability

    /// The game's mode.
    public var mode: Mode
