Example #1
0
 public RacesController(FormulaContext context,
                        UserManager <SimUser> userManager,
                        IRaceService raceService,
                        ISeasonService seasonService,
                        ITrackService trackService,
                        RaceResultGenerator raceResultGenerator,
                        RaceBuilder raceBuilder)
     : base(context, userManager)
 {
     _raceService     = raceService;
     _seasonService   = seasonService;
     _trackService    = trackService;
     _resultGenerator = raceResultGenerator;
     _raceBuilder     = raceBuilder;
 }
Example #2
0
        public async Task <IActionResult> AdvanceStint(int raceId)
        {
            var race = await Context.Races
                       .Include(r => r.Stints)
                       .Include(r => r.Track)
                       .SingleOrDefaultAsync(r => r.RaceId == raceId);

            var driverResults = await Context.DriverResults
                                .Where(dr => dr.RaceId == raceId)
                                .Include(dr => dr.StintResults)
                                .Include(dr => dr.CurrTyre)
                                .Include(dr => dr.Strategy)
                                .ThenInclude(dr => dr.Tyres)
                                .ThenInclude(dr => dr.Tyre)
                                .Include(dr => dr.SeasonDriver)
                                .ToListAsync();

            var season = await Context.Seasons
                         .AsNoTracking()
                         .FirstAsync(s => s.SeasonId == race.SeasonId);

            var teams = await Context.SeasonTeams
                        .AsNoTracking()
                        .Where(st => st.SeasonId == season.SeasonId)
                        .Include(st => st.Team)
                        .Include(st => st.Engine)
                        .ToListAsync();

            var appConfig = await Context.AppConfig.FirstOrDefaultAsync();

            if (race.StintProgress == race.Stints.Count)
            {
                return(BadRequest());
            }

            race.StintProgress++;
            var stint = race.Stints.Single(s => s.Number == race.StintProgress);

            // Calculate results for all drivers who have not been DSQ'd or DNF'd.
            foreach (var result in driverResults.Where(d => d.Status == Status.Finished))
            {
                var stintResult = result.StintResults.Single(sr => sr.Number == race.StintProgress);
                var currentTeam = teams.First(t => t.SeasonTeamId == result.SeasonDriver.SeasonTeamId);

                _resultGenerator.UpdateStintResult(stintResult, stint, result, currentTeam, race.Weather, race.Track.Specification, driverResults.Count, season.QualyBonus, season.PitMin, season.PitMax, appConfig);

                // Driver isn't running anymore, which indicates that he DNFed
                if (stintResult.StintStatus == StintStatus.DriverDNF || stintResult.StintStatus == StintStatus.ChassisDNF)
                {
                    int upperRangeDSQ = 100 / appConfig.DisqualifyChance;
                    // RNG to determine the type of DNF.
                    int dnfvalue = rng.Next(1, 26);
                    if (dnfvalue == (upperRangeDSQ - 1))
                    {
                        result.Status       = Status.DSQ;
                        stintResult.Result += -2000;
                        if (stintResult.StintStatus == StintStatus.DriverDNF)
                        {
                            result.DSQCause = Helpers.RandomDriverDSQ();
                        }
                        else
                        {
                            result.DSQCause = Helpers.RandomChassisDSQ();
                        }
                    }
                    else
                    {
                        result.Status       = Status.DNF;
                        stintResult.Result += -1000;
                        if (stintResult.StintStatus == StintStatus.DriverDNF)
                        {
                            result.DNFCause = Helpers.RandomDriverDNF();
                        }
                        else
                        {
                            result.DNFCause = Helpers.RandomChassisDNF();
                        }
                    }
                }
                // It sums the score of all stintresults of a driver, could maybe also just add the current score up
                result.Points = result.StintResults.Sum(sr => sr.Result);
            }

            RaceResultGenerator.GetPositionsBasedOnRelativePoints(driverResults, race.StintProgress);
            Context.Update(race);
            Context.UpdateRange(driverResults);
            await Context.SaveChangesAsync();

            // Clear unneeded references so they won't be serialized and sent over
            foreach (var dr in driverResults)
            {
                dr.SeasonDriver = null;
                dr.Strategy     = null;
            }
            return(new JsonResult(driverResults, new JsonSerializerSettings()
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore, NullValueHandling = NullValueHandling.Ignore
            }));
        }