//returns if an airline can create a hub at an airport public static Boolean CanCreateHub(Airline airline, Airport airport, HubType type) { Boolean airlineHub = airport.getHubs().Exists(h => h.Airline == airline); int airlineValue = (int)airline.getAirlineValue() + 1; int totalAirlineHubs = airline.getHubs().Count;// 'Airports.GetAllActiveAirports().Sum(a => a.Hubs.Count(h => h.Airline == airline)); double airlineGatesPercent = Convert.ToDouble(airport.Terminals.getNumberOfGates(airline)) / Convert.ToDouble(airport.Terminals.getNumberOfGates()) * 100; switch (type.Type) { case HubType.TypeOfHub.Focus_city: return !airlineHub && airline.Money > AirportHelpers.GetHubPrice(airport, type); case HubType.TypeOfHub.Regional_hub: return !airlineHub && airline.Money > AirportHelpers.GetHubPrice(airport, type) && (airport.Profile.Size == GeneralHelpers.Size.Large || airport.Profile.Size == GeneralHelpers.Size.Medium) && airport.getHubs().Count < 7; case HubType.TypeOfHub.Fortress_hub: return !airlineHub && airline.Money > AirportHelpers.GetHubPrice(airport, type) && (airport.Profile.Size > GeneralHelpers.Size.Medium) && airlineGatesPercent > 70 && (totalAirlineHubs < airlineValue); case HubType.TypeOfHub.Hub: return !airlineHub && airline.Money > AirportHelpers.GetHubPrice(airport, type) && (!airlineHub) && (airlineGatesPercent > 20) && (totalAirlineHubs < airlineValue) && (airport.getHubs(HubType.TypeOfHub.Hub).Count < (int)airport.Profile.Size); } return false; }
//returns the number of passengers between two destinations public static int GetFlightPassengers(Airport airportCurrent, Airport airportDestination, FleetAirliner airliner, AirlinerClass.ClassType type) { double distance = MathHelpers.GetDistance(airportCurrent, airportDestination); var currentRoute = airliner.Routes.Find(r => r.Stopovers.SelectMany(s => s.Legs).ToList().Exists(l => (l.Destination1 == airportCurrent || l.Destination1 == airportDestination) && (l.Destination2 == airportDestination || l.Destination2 == airportCurrent)) || (r.Destination1 == airportCurrent || r.Destination1 == airportDestination) && (r.Destination2 == airportDestination || r.Destination2 == airportCurrent)); if (currentRoute == null) return 0; double basicPrice = GetPassengerPrice(currentRoute.Destination1, currentRoute.Destination2, type); double routePrice = ((PassengerRoute)currentRoute).getFarePrice(type); double priceDiff = basicPrice / routePrice; double demand = (double)airportCurrent.getDestinationPassengersRate(airportDestination, type); double passengerDemand = (demand + GetFlightConnectionPassengers(airportCurrent, airportDestination, airliner, type) + GetNearbyPassengerDemand(airportCurrent, airportDestination, airliner, type)) * GetSeasonFactor(airportDestination) * GetHolidayFactor(airportDestination) * GetHolidayFactor(airportCurrent); passengerDemand *= GameObject.GetInstance().Difficulty.PassengersLevel; if (airliner.Airliner.Airline.MarketFocus == Airline.AirlineFocus.Global && distance > 3000 && airportCurrent.Profile.Country != airportDestination.Profile.Country) passengerDemand = passengerDemand * (115 / 100); if (airliner.Airliner.Airline.MarketFocus == Airline.AirlineFocus.Regional && distance < 1500) passengerDemand = passengerDemand * (115 / 100); if (airliner.Airliner.Airline.MarketFocus == Airline.AirlineFocus.Domestic && distance < 1500 && airportDestination.Profile.Country == airportCurrent.Profile.Country) passengerDemand = passengerDemand * (115 / 100); if (airliner.Airliner.Airline.MarketFocus == Airline.AirlineFocus.Local && distance < 1000) passengerDemand = passengerDemand * (115 / 100); var hub = airportDestination.getHubs().Find(h => h.Airline == airliner.Airliner.Airline); if (hub != null) { switch (hub.Type.Type) { case HubType.TypeOfHub.Focus_city: if (airportDestination.Profile.Country == airportCurrent.Profile.Country) passengerDemand = passengerDemand * 1.15; break; case HubType.TypeOfHub.Regional_hub: if (airportDestination.Profile.Country.Region == airportCurrent.Profile.Country.Region) passengerDemand = passengerDemand * 1.20; break; case HubType.TypeOfHub.Hub: passengerDemand = passengerDemand * 1.20; break; case HubType.TypeOfHub.Fortress_hub: passengerDemand = passengerDemand * 1.30; break; } } List<Route> 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.Passenger || 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.Passenger).Where(r => r.Stopovers.SelectMany(s => s.Legs.Where(l => r.HasAirliner && (l.Destination1 == airportCurrent || l.Destination1 == airportDestination) && (l.Destination2 == airportDestination || l.Destination2 == airportCurrent))).Count() > 0)); } double flightsPerDay = Convert.ToDouble(routes.Sum(r => r.TimeTable.Entries.Count)) / 7; passengerDemand = passengerDemand / flightsPerDay; double totalCapacity = 0; if (routes.Count > 0 && routes.Count(r => r.HasAirliner) > 0) totalCapacity = routes.Where(r => r.HasAirliner).Sum(r => r.getAirliners().Max(a => a.Airliner.getTotalSeatCapacity()));//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 = passengerDemand > totalCapacity ? 1 : passengerDemand / totalCapacity; Dictionary<Route, double> rations = new Dictionary<Route, double>(); foreach (Route route in routes) { double level = ((PassengerRoute)route).getServiceLevel(type) / ((PassengerRoute)route).getFarePrice(type); rations.Add(route, level); } double totalRatio = rations.Values.Sum(); double routeRatioPercent = 1; if (rations.ContainsKey(currentRoute)) routeRatioPercent = Math.Max(1, rations[currentRoute] / Math.Max(1, totalRatio)); IDictionary<Airline, double> airlineScores = new Dictionary<Airline, double>(); foreach (Airline airline in Airlines.GetAllAirlines()) airlineScores.Add(airline, airportCurrent.getAirlineReputation(airline)); double reputation = StatisticsHelpers.GetRatingScale(airlineScores)[airliner.Airliner.Airline]; if (reputation < 76) reputation = 75; double reputationPercent = reputation / 100; double routePriceDiff = priceDiff < 0.75 ? priceDiff : 1; routePriceDiff *= GameObject.GetInstance().Difficulty.PriceLevel; double randomPax = Convert.ToDouble(rnd.Next(97, 103)) / 100; int pax = (int)Math.Min(airliner.Airliner.getAirlinerClass(type).SeatingCapacity, (airliner.Airliner.getAirlinerClass(type).SeatingCapacity * routeRatioPercent * reputationPercent* capacityPercent * routePriceDiff * randomPax)); if (pax < 0) pax = 0; return pax; }