public void UndoMove(Position origin, Position destination, Piece captured) { Piece piece = Board.RemovePiece(destination); piece.DecrementMovimentsQuantity(); if (captured != null) { Board.InsertPiece(captured, destination); _capturedPieces.Remove(captured); } Board.InsertPiece(piece, origin); // #SpecialMove Castling Short if (piece is King && destination.Column == origin.Column + 2) { Position RookOrigin = new Position(origin.Line, origin.Column + 3); Position RookDestination = new Position(origin.Line, origin.Column + 1); Piece Rook = Board.RemovePiece(RookDestination); Rook.DecrementMovimentsQuantity(); Board.InsertPiece(Rook, RookOrigin); } // #SpecialMove Castling Long if (piece is King && destination.Column == origin.Column - 2) { Position RookOrigin = new Position(origin.Line, origin.Column - 4); Position RookDestination = new Position(origin.Line, origin.Column - 1); Piece Rook = Board.RemovePiece(RookDestination); Rook.DecrementMovimentsQuantity(); Board.InsertPiece(Rook, RookOrigin); } // #SpecialMove En Passant if (piece is Pawn) { if (origin.Column != destination.Column && captured == EnPassantVulnerable) { Piece pawn = Board.RemovePiece(destination); Position pawnPosition; if (piece.Color == Color.White) { pawnPosition = new Position(3, destination.Column); } else { pawnPosition = new Position(4, destination.Column); } Board.InsertPiece(pawn, pawnPosition); } } }