public virtual LapTimeResult GetLapTime(int lapsOnTires, RaceState raceState, VehicleState vehicleStatus) { LapTimeResult result = null; if (vehicleStatus == VehicleState.OnTrack) { switch (raceState) { case RaceState.PreRace: { result = new LapTimeResult(); break; } case RaceState.GreenFlag: case RaceState.WhiteFlag: case RaceState.Checkered: case RaceState.Overdrive: { result = GetLapTime(lapsOnTires); break; } case RaceState.EndOfStage: case RaceState.Caution: case RaceState.OneToGo: { result = GetCautionLapTime(); break; } default: throw new ArgumentException($"Unknown race state: {raceState.ToString()}", nameof(raceState)); } } else if (vehicleStatus == VehicleState.PitInLap) { result = GetPitInLapTime(); } else if (vehicleStatus == VehicleState.PitOutLap) { result = GetPitOutLapTime(); } else if (vehicleStatus == VehicleState.InPit || vehicleStatus == VehicleState.InGarage || vehicleStatus == VehicleState.Retired) { result = new LapTimeResult(); } else { throw new ArgumentException($"Unknown vehicle status: {vehicleStatus.ToString()}", nameof(vehicleStatus)); } return(result); }
protected virtual NascarRaceLap[] GetNewRaceLaps(List <NascarRaceLap> lastLaps, LapState state) { NascarRaceLap[] newLaps = lastLaps.Select(l => new NascarRaceLap() { Position = l.Position, DriverId = l.DriverId, VehicleId = l.VehicleId, TotalTime = l.TotalTime, LapNumber = l.LapNumber, LapsSincePit = l.LapsSincePit, PitInLap = l.PitInLap, PitOutLap = l.PitOutLap, IsLuckyDog = l.IsLuckyDog, LeaderLap = l.LeaderLap }).ToArray(); LapTimeResult lapTimeResult = null; for (int i = 0; i < newLaps.Length; i++) { if (newLaps[i].PitInLap && !newLaps[i].PitOutLap) { newLaps[i].LapsSincePit = -1; newLaps[i].PitOutLap = true; } else { if (!newLaps[i].PitInLap && newLaps[i].PitOutLap) { lapTimeResult = LapTimeService.GetPitInLapTime(); newLaps[i].PitOutLap = false; } if (newLaps[i].PitInLap && newLaps[i].PitOutLap) { lapTimeResult = LapTimeService.GetPitOutLapTime(); LapTimeResult pitLapTimeResult = null; if (state == LapState.CautionFlag || state == LapState.OneToGreenFlag) { pitLapTimeResult = LapTimeService.GetCautionLapTime(); } else if (state == LapState.GreenFlag) { pitLapTimeResult = LapTimeService.GetLapTime(0); } lapTimeResult.LapTime += pitLapTimeResult.LapTime; lapTimeResult.LapSpeed = LapTimeService.GetLapSpeed(lapTimeResult.LapTime); newLaps[i].PitInLap = false; } else if (state == LapState.CautionFlag || state == LapState.OneToGreenFlag) { lapTimeResult = LapTimeService.GetCautionLapTime(); } else if (state == LapState.GreenFlag) { lapTimeResult = LapTimeService.GetLapTime(newLaps[i].LapsSincePit); } newLaps[i].LapNumber += 1; newLaps[i].LapTime = lapTimeResult.LapTime; newLaps[i].LapSpeed = lapTimeResult.LapSpeed; newLaps[i].TotalTime += lapTimeResult.LapTime; newLaps[i].LapsSincePit += 1; } } Array.Sort(newLaps); newLaps[0].LeaderLap = newLaps[0].LapNumber; newLaps[0].Delta = 0; newLaps[0].DeltaLeader = 0; newLaps[0].Position = 1; double leaderTotalTime = newLaps[0].TotalTime; int leaderLap = newLaps[0].LeaderLap; for (int i = 1; i < newLaps.Length; i++) { newLaps[i].Position = i + 1; newLaps[i].LeaderLap = leaderLap; if (newLaps[i].LapsBehind > 0) { // vehicle is laps down newLaps[i].Delta = newLaps[i].LapsBehind * -1; newLaps[i].DeltaLeader = newLaps[i].LapsBehind * -1; newLaps[i].DeltaPhysical = Math.Round((newLaps[i].TotalTime - (newLaps[0].AverageLapTime * newLaps[i].LapNumber)) % LapTimeService.BaseLapTime, 3); newLaps[i].DeltaTravelledLeader = newLaps[i].TotalTime - (newLaps[0].AverageLapTime * newLaps[i].LapNumber) + (LapTimeService.BaseLapTime * newLaps[i].LapsBehind); } else { // vehicle is on lead lap newLaps[i].Delta = newLaps[i].TotalTime - newLaps[i - 1].TotalTime; newLaps[i].DeltaLeader = newLaps[i].TotalTime - leaderTotalTime; newLaps[i].DeltaPhysical = Math.Round((newLaps[i].TotalTime - leaderTotalTime) % LapTimeService.BaseLapTime, 3); newLaps[i].DeltaTravelledLeader = newLaps[i].DeltaLeader; } } return(newLaps); }