private async Task DeleteAirport(Airport airport)
        {
            if (Airports.Any() && Airports.Contains(airport))
            {
                await AirportService.DeleteAirport(airport.Id, new System.Threading.CancellationToken()).ConfigureAwait(false);

                Airports.Remove(airport);
            }
            HasSavedItems = Airports != null && Airports.Any();
        }
Beispiel #2
0
        public FlightRoute FindShortestRoute(string startingAirport, string destinationAirport)
        {
            if (Airports.Contains(startingAirport) && Airports.Contains(destinationAirport))
            {
                var result = new List <FlightRoute>();

                var destinationList = Routes.Where(w => w.Item2 == destinationAirport);
                destinationList.ToList().ForEach(i => result.Add(new FlightRoute(i)));

                while (result.Where(w => !w.Complete).Count() > 0)
                {
                    FlightRoute[] tResult = new FlightRoute[result.Count - 1];
                    result.CopyTo(tResult, 0);

                    foreach (var cRoute in tResult.Where(w => !w.Complete))
                    {
                        var connectingFlights = Routes.Where(w => cRoute.Flights.Last().Item1 == w.Item2).ToList();

                        for (var j = 0; j < connectingFlights.Count(); j++)
                        {
                            if (j == 1)
                            {
                                cRoute.Flights.Add(connectingFlights[j]);

                                if (cRoute.Flights.Count(w => w.Item1 == startingAirport || w.Item2 == startingAirport) > 0)
                                {
                                    cRoute.Complete = true;
                                }
                            }
                            else
                            {
                                FlightRoute clone = (FlightRoute)cRoute.Clone();
                                clone.Flights.Add(connectingFlights[j]);

                                if (clone.Flights.Count(w => w.Item1 == startingAirport || w.Item2 == startingAirport) > 0)
                                {
                                    clone.Complete = true;
                                }

                                result.Add(clone);
                            }
                        }
                    }
                }

                var finalResult = result.OrderBy(o => o.Flights.Count()).Where(w => w.Complete).First();

                return(finalResult);
            }
            else
            {
                throw new Exception($"Airport {startingAirport} does not exist in listed airports!");
            }
        }
        private int MatchAirports(IEnumerable <airport> rgap)
        {
            int cUniqueAirports           = 0;
            HashSet <string> hsThisFlight = new HashSet <string>();

            foreach (airport ap in rgap)
            {
                // Dedupe as we go based on latitude/longitude, ignoring non-ports.
                // We don't actually need the facility name here - so we can just round off the latitude/longitude and distinguish by type code.
                // Note: this can differ slightly from Visited Airports counts because for achievements, we're ignoring flights in training devices; visited airports doesn't ignore them.
                if (ap.IsPort)
                {
                    string szHash = ap.GeoHashKey;
                    if (!Airports.Contains(szHash))
                    {
                        Airports.Add(ap.GeoHashKey);
                        cUniqueAirports++;
                    }
                    hsThisFlight.Add(szHash);

                    string szCountry = ap.CountryDisplay;
                    string szAdmin1  = ap.Admin1Display;

                    // Keep track of visited countries/regions
                    if (!String.IsNullOrWhiteSpace(szCountry))
                    {
                        if (!GeoRegions.ContainsKey(szCountry))
                        {
                            GeoRegions[szCountry] = new HashSet <string>();
                        }

                        if (!String.IsNullOrWhiteSpace(szAdmin1) && !GeoRegions[szCountry].Contains(szAdmin1))
                        {
                            GeoRegions[szCountry].Add(szAdmin1);
                        }
                    }
                }
            }

            return(hsThisFlight.Count);
        }
Beispiel #4
0
 //returns if an airport is active (built)
 public static Boolean IsAirportActive(Airport airport)
 {
     return(airport.Profile.Period.From <= GameObject.GetInstance().GameTime&& airport.Profile.Period.To > GameObject.GetInstance().GameTime&& Airports.Contains(airport));
 }
Beispiel #5
0
        public override void ExamineFlight(ExaminerFlightRow cfr)
        {
            if (cfr == null)
            {
                throw new ArgumentNullException("cfr");
            }
            DateTime dtFlight = cfr.dtFlight.Date;

            if (AutoDateRange)
            {
                StartDate = StartDate.EarlierDate(dtFlight);
                EndDate   = EndDate.LaterDate(dtFlight);
            }

            // ignore anything not in a real aircraft or outside of our date range
            if (!cfr.fIsRealAircraft || dtFlight.CompareTo(StartDate) < 0 || dtFlight.CompareTo(EndDate) > 0)
            {
                return;
            }

            miFlightCount.AddEvent(1);

            string szDateKey = dtFlight.YMDString();

            // Initialize the current streak, if needed
            if (FirstDayOfCurrentStreak == null || LastDayOfCurrentStreak == null)
            {
                FirstDayOfCurrentStreak = LastDayOfCurrentStreak = dtFlight;
            }

            // Extend the current streak if this flight is either on the first date or on a day before the first date; if it isn't one of those, then end the current streak
            if (dtFlight.CompareTo(FirstDayOfCurrentStreak.Value.Date) == 0 || dtFlight.CompareTo(FirstDayOfCurrentStreak.Value.AddDays(-1).Date) == 0)
            {
                FirstDayOfCurrentStreak = dtFlight;
            }
            else
            {
                FirstDayOfCurrentStreak = LastDayOfCurrentStreak = dtFlight;
            }

            int cDaysCurrentStreak = CurrentFlyingDayStreak;

            if (cDaysCurrentStreak > 1 && cDaysCurrentStreak > FlyingDayStreak)
            {
                FirstFlyingDayOfStreak = FirstDayOfCurrentStreak;
                LastFlyingDayOfStreak  = LastDayOfCurrentStreak;
            }

            // Distinct flights on dates
            if (FlightDates.ContainsKey(szDateKey))
            {
                FlightDates[szDateKey] = FlightDates[szDateKey] + 1;
            }
            else
            {
                FlightDates[szDateKey] = 1;
            }

            if (FlightDates[szDateKey] > MaxFlightsPerDay)
            {
                int cFlights = FlightDates[szDateKey];
                MaxFlightsPerDay                     = cFlights;
                miMostFlightsInDay.Progress          = cFlights;
                miMostFlightsInDay.MatchingEventText = String.Format(CultureInfo.InvariantCulture, Resources.Achievements.RecentAchievementMostFlightsInDay, cFlights, cfr.dtFlight);
                miMostFlightsInDay.Query             = new FlightQuery(Username)
                {
                    DateRange = FlightQuery.DateRanges.Custom, DateMin = cfr.dtFlight, DateMax = cfr.dtFlight
                };
            }

            // Longest flight
            if (cfr.Total > LongestFlightLength)
            {
                LongestFlightLength               = cfr.Total;
                miLongestFlight.Progress          = 1;
                miLongestFlight.MatchingEventID   = cfr.flightID;
                miLongestFlight.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementsLongestFlight, cfr.Total, dtFlight);
            }

            // Distinct aircraft/models
            DistinctAircraft.Add(cfr.idAircraft);
            DistinctModels.Add(cfr.idModel);
            DistinctICAO.Add(cfr.szFamily);

            // Furthest Flight & airport computations.
            AirportList al = AirportListOfRoutes.CloneSubset(cfr.Route, true);

            double distance = al.DistanceForRoute();

            if (distance > FurthestFlightDistance)
            {
                FurthestFlightDistance             = distance;
                miFurthestFlight.Progress          = 1;
                miFurthestFlight.MatchingEventID   = cfr.flightID;
                miFurthestFlight.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementsFurthestFlight, distance, dtFlight);
            }

            int cUniqueAirports           = 0;
            HashSet <string> hsThisFlight = new HashSet <string>();

            foreach (airport ap in al.UniqueAirports)
            {
                // Dedupe as we go based on latitude/longitude, ignoring non-ports.
                // We don't actually need the facility name here - so we can just round off the latitude/longitude and distinguish by type code.
                // Note: this can differ slightly from Visited Airports counts because for achievements, we're ignoring flights in training devices; visited airports doesn't ignore them.
                if (ap.IsPort)
                {
                    string szHash = ap.GeoHashKey;
                    if (!Airports.Contains(szHash))
                    {
                        Airports.Add(ap.GeoHashKey);
                        cUniqueAirports++;
                    }
                    hsThisFlight.Add(szHash);
                }
            }

            int cAirportsThisFlight = hsThisFlight.Count;

            if (cAirportsThisFlight > MostAirportsFlightCount)
            {
                MostAirportsFlightCount = cAirportsThisFlight;
                miMostAirportsFlight.MatchingEventID   = cfr.flightID;
                miMostAirportsFlight.Progress          = 1;
                miMostAirportsFlight.MatchingEventText = String.Format(CultureInfo.CurrentCulture, Resources.Achievements.RecentAchievementsAirportsOnFlight, cAirportsThisFlight, dtFlight.ToShortDateString());
                miMostAirportsFlight.Query             = new FlightQuery(Username)
                {
                    DateRange = FlightQuery.DateRanges.Custom, DateMax = dtFlight, DateMin = dtFlight
                };
            }
        }
Beispiel #6
0
 public bool ContainsAirport(string name)
 {
     return(Airports.Contains(name));
 }