GetAirportFacility() public method

public GetAirportFacility ( Airline airline, AirportFacility type, System.Boolean useAirport = false ) : AirportFacility
airline TheAirline.Models.Airlines.Airline
type AirportFacility
useAirport System.Boolean
return AirportFacility
        public static double GetFlightCargo(Airport airportCurrent, Airport airportDestination, FleetAirliner airliner)
        {
            double destinationFacilityFactor =
                airportDestination.GetAirportFacility(
                    GameObject.GetInstance().HumanAirline,
                    AirportFacility.FacilityType.Cargo,
                    true).ServiceLevel;

            double distance = MathHelpers.GetDistance(airportCurrent, airportDestination);

            double capacity = 0;

            var type = airliner.Airliner.Type as AirlinerCargoType;
            if (type != null)
                capacity = type.CargoSize;
            var combiType = airliner.Airliner.Type as AirlinerCombiType;
            if (combiType != null)
                capacity = combiType.CargoSize;

            double demand = airportCurrent.GetDestinationCargoRate(airportDestination)
                            *(destinationFacilityFactor/100);

            double cargoDemand = demand*1000;

            var routes = new List<Route>();

            foreach (Airline airline in Airlines.GetAllAirlines())
            {
                var aRoutes = new List<Route>(airline.Routes);

                routes.AddRange(
                    aRoutes.Where(r => r.Type == Route.RouteType.Cargo || r.Type == Route.RouteType.Mixed)
                           .Where(
                               r =>
                               (r.HasAirliner)
                               && (r.Destination1 == airportCurrent || r.Destination1 == airportDestination)
                               && (r.Destination2 == airportDestination || r.Destination2 == airportCurrent)));
                routes.AddRange(
                    aRoutes.Where(r => r.Type == Route.RouteType.Mixed || r.Type == Route.RouteType.Cargo)
                           .Where(
                               r =>
                               r.Stopovers.SelectMany(
                                   s =>
                                   s.Legs.Where(
                                       l =>
                                       r.HasAirliner
                                       && (l.Destination1 == airportCurrent
                                           || l.Destination1 == airportDestination)
                                       && (l.Destination2 == airportDestination
                                           || l.Destination2 == airportCurrent))).Any()));
            }

            double flightsPerDay = Convert.ToDouble(routes.Sum(r => r.TimeTable.Entries.Count))/7;

            cargoDemand = cargoDemand/flightsPerDay;

            double totalCapacity;
            if (routes.Count > 0 && routes.Count(r => r.HasAirliner) > 0)
            {
                totalCapacity =
                    routes.Where(r => r.HasAirliner)
                          .Sum(r => r.GetAirliners().Max(a => (a.Airliner.Type as AirlinerCombiType)?.CargoSize ?? ((AirlinerCargoType) a.Airliner.Type).CargoSize));
                //SelectMany(r => r.Stopovers.Where(s=>s.Legs.Count >0))).Sum(s=>s.;//a => a.Routes.SelectMany(r=>r.Stopovers.SelectMany(s=>s.Legs.Where(l=>r.HasAirliner && (l.Destination1 == airportCurrent || l.Destination1 == airportDestination) && (l.Destination2 == airportDestination || l.Destination2 == airportCurrent))).Sum(r=>r.getAirliners().Max(a=>a.Airliner.getTotalSeatCapacity()));
            }
            else
            {
                totalCapacity = 0;
                // routes.Where(r => r.HasAirliner).Sum(r => r.getAirliners().Max(a => a.Airliner.getTotalSeatCapacity()));
            }

            double capacityPercent = cargoDemand > totalCapacity ? 1 : cargoDemand/totalCapacity;

            double basicCargoPrice = GetCargoPrice(airportCurrent, airportDestination);
            double cargoPrice = airliner.CurrentFlight.GetCargoPrice();

            double priceDiff = basicCargoPrice/cargoPrice;

            double cargoPriceDiff = priceDiff < 0.75 ? priceDiff : 1;

            cargoPriceDiff *= GameObject.GetInstance().Difficulty.PriceLevel;

            double randomCargo = Convert.ToDouble(Rnd.Next(97, 103))/100;

            var cargo = (int) Math.Min(capacity, (capacity*capacityPercent*randomCargo*cargoPriceDiff));

            return cargo;
        }