コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }