public Dictionary <string, DriversRating> CreateFieldRating(DriverInfo[] fieldDrivers, int difficulty)
        {
            InitializeReferenceRating(difficulty);
            fieldDrivers = fieldDrivers.OrderBy(x => x.Position).ToArray();
            Dictionary <string, DriversRating> ratings = new Dictionary <string, DriversRating>();
            int middleDriverIndex   = _referenceRatingProviderFactory.CreateReferenceRatingProvider().GetReferenceDriverIndex(fieldDrivers.Length);
            int ratingBetweenPlaces = _simulatorRatingController.QuickRaceAiRatingForPlace;

            for (int i = 0; i < fieldDrivers.Length; i++)
            {
                DriverInfo driver = fieldDrivers[i];
                if (driver.IsPlayer)
                {
                    ratings[driver.DriverName] = _simulatorRatingController.GetPlayerRating(driver.CarClassName).simRating;
                    continue;
                }

                DriverWithoutRating aiDriver = _simulatorRatingController.GetAiRating(driver.DriverName);
                int rating = AddNoise(_referenceRating + (middleDriverIndex - i) * ratingBetweenPlaces);
                ratings[driver.DriverName] = new DriversRating()
                {
                    Deviation  = aiDriver.Deviation,
                    Volatility = aiDriver.Volatility,
                    Rating     = rating
                };
            }

            return(ratings);
        }
        public Dictionary <string, DriversRating> CreateFieldRatingFromQualificationResult(List <Driver> qualificationResult, int difficulty)
        {
            InitializeReferenceTime(qualificationResult);
            InitializeReferenceRating(difficulty);

            Dictionary <string, DriversRating> ratings = new Dictionary <string, DriversRating>();
            int lastRating = 0;

            foreach (Driver driver in qualificationResult.Where(x => x.IsPlayer || (x.BestPersonalLap != null && x.BestPersonalLap.LapTime != TimeSpan.Zero)))
            {
                if (driver.IsPlayer)
                {
                    ratings[driver.DriverName] = _simulatorRatingController.GetPlayerRating(driver.ClassName).simRating;
                    continue;
                }

                DriverWithoutRating aiDriver = _simulatorRatingController.GetAiRating(driver.DriverName);
                lastRating = ComputeRating(driver.BestPersonalLap.LapTime);
                ratings[driver.DriverName] = new DriversRating()
                {
                    Deviation  = aiDriver.Deviation,
                    Volatility = aiDriver.Volatility,
                    Rating     = lastRating
                };
            }

            foreach (Driver driver in qualificationResult.Where(x => !x.IsPlayer && (x.BestPersonalLap == null || x.BestPersonalLap.LapTime == TimeSpan.Zero)))
            {
                DriverWithoutRating aiDriver = _simulatorRatingController.GetAiRating(driver.DriverName);
                ratings[driver.DriverName] = new DriversRating()
                {
                    Deviation  = aiDriver.Deviation,
                    Volatility = aiDriver.Volatility,
                    Rating     = lastRating
                };
            }

            return(ratings);
        }