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; }
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 })); }