Exemple #1
0
        private static void CreateResult(ref SessionResult session, YamlMappingNode result, ISimulation sim)
        {
            var carIdx = result.GetByte("CarIdx");
            var entity = sim.Session.Entities.FirstOrDefault(e => e.CarIdx == carIdx);

            if (entity == null)
            {
                return;
            }

            var sessionResult = new EntitySessionResult(session, entity);

            var pos = result.GetInt("Position") + 1;

            sessionResult.Position = pos > 0 ? pos : int.MaxValue;
            if (sessionResult.Position == 1)
            {
                session.Leader = entity;
            }

            sessionResult.ClassPosition  = result.GetInt("ClassPosition") + 1;
            sessionResult.FastestLapTime = result.GetFloat("FastestTime");

            session.ResultsInt.Add(sessionResult);
            if (sessionResult.FastestLapTime < session.FastestLapTime && sessionResult.FastestLapTime > 0)
            {
                session.FastestLapTime = sessionResult.FastestLapTime;
            }
        }
Exemple #2
0
        private void UpdateSector(ISimulation sim, SessionResult session, EntitySessionResult result, double curPos, double prevPos)
        {
            if (session.State != SessionState.Racing)
            {
                return;
            }

            var track = sim.Session.Track;

            if (track.SelectedSectors.Count <= 0)
            {
                return;
            }

            var i = 0;

            foreach (var location in track.SelectedSectors.OrderBy(s => s.Index).Select(s => s.Location))
            {
                if (curPos <= location || i <= result.CurrentLap.CurrentSector.Index)
                {
                    i++;
                    continue;
                }

                var now    = Updater.CurrentTime - (curPos - location) * (curPos - prevPos);
                var sector = new CompletedSector(result.CurrentLap.CurrentSector, now);
                result.CurrentLap.SectorsInt.Add(sector);

                result.CurrentLap.CurrentSector.BeginTime      = now;
                result.CurrentLap.CurrentSector.Index          = i;
                result.CurrentLap.CurrentSector.ReplayPosition = (int)(sim.Telemetry.SessionTime * 60 + Updater.TimeOffset);

                break;
            }
        }
Exemple #3
0
        private void OnFinishCrossing(ITelemetry telemetry, EntitySessionResult result, double now, SessionResult session, int newLapNumber)
        {
            // Complete last sector
            var sector = new CompletedSector(result.CurrentLap.CurrentSector, now);

            result.CurrentLap.SectorsInt.Add(sector);

            // Complete this lap and set it as previous lap
            result.PreviousLap = new CompletedLap(result.CurrentLap, now);
            result.LastLapTime = result.PreviousLap.Time;

            if (session.State != SessionState.ParadeLaps && !result.Finished)
            {
                // Start a new lap
                result.CurrentLap.BeginTime      = now;
                result.CurrentLap.Number         = newLapNumber;
                result.CurrentLap.ReplayPosition = (int)(telemetry.SessionTime * 60 + Updater.TimeOffset);
                result.CurrentLap.SectorsInt.Clear();

                result.CurrentLap.WasOnPitRoad = result.Entity.Car.Movement.IsInPits;

                // Set the caution state (can be FALSE if no caution during lap start)
                result.CurrentLap.WasUnderCaution = session.Flags.CheckBits(SessionFlags.Caution,
                                                                            SessionFlags.CautionWaving);

                // Update current sector
                result.CurrentLap.CurrentSector.BeginTime      = now;
                result.CurrentLap.CurrentSector.Index          = 0;
                result.CurrentLap.CurrentSector.ReplayPosition = (int)(telemetry.SessionTime * 60 + Updater.TimeOffset);
            }
        }
Exemple #4
0
 private void UpdateCurrentLap(EntitySessionResult result, SessionResult session)
 {
     result.CurrentLap.WasUnderCaution |= session.Flags.CheckBits(SessionFlags.Caution, SessionFlags.CautionWaving);
     result.CurrentLap.Position         = result.LivePosition;
     result.CurrentLap.ClassPosition    = result.LiveClassPosition;
     result.CurrentLap.Gap              = session.Type == SessionType.Race ? result.LiveGap : (result.CurrentLap.Time - session.FastestLapTime);
     result.CurrentLap.GapLaps          = session.Type == SessionType.Race ? result.LiveGapLaps : 0;
 }
Exemple #5
0
        private static EntitySessionResult InitResult(YamlMappingNode resultsInfo, Simulation sim, SessionResult session,
                                                      IEntity entity, int carIdx)
        {
            var result = new EntitySessionResult(session, entity)
            {
                FastestLapTime  = resultsInfo.GetFloat("FastestTime"),
                LapsLed         = resultsInfo.GetInt("LapsLed"),
                CurrentTrackPct = sim.Telemetry.CarIdxLap[carIdx] + sim.Telemetry.CarIdxLapDistPct[carIdx] - 1
            };

            var newLap = new CompletedLap(result)
            {
                Number        = resultsInfo.GetInt("LapsComplete"),
                Position      = resultsInfo.GetInt("Position"),
                ClassPosition = resultsInfo.GetInt("ClassPosition") + 1,
                Gap           = resultsInfo.GetFloat("Time"),
                GapLaps       = resultsInfo.GetInt("Lap")
            };

            newLap.SetExactLaptime(resultsInfo.GetFloat("LastTime"));

            result.PreviousLap = newLap;
            result.FastestLap  = newLap;
            result.Laps.AddLap(newLap);

            // Current lap is empty here, set all properties
            result.CurrentLap.Number        = newLap.Number + 1;
            result.CurrentLap.Position      = newLap.Position;
            result.CurrentLap.ClassPosition = newLap.ClassPosition;
            result.CurrentLap.Gap           = newLap.Gap;
            result.CurrentLap.GapLaps       = newLap.GapLaps;

            if (session.Flags.CheckBits(SessionFlags.Caution, SessionFlags.CautionWaving))
            {
                result.CurrentLap.WasUnderCaution = true;
            }

            lock (sim.SharedCollectionLock)
            {
                session.ResultsInt.Add(result);
                ((EntityResults)result.Entity.Results).SessionResultsInt.Add(result);
            }

            return(result);
        }
Exemple #6
0
        private static void AddMissingEntityResults(YamlMappingNode root, SessionResult sessionResult, Simulation sim)
        {
            // First force the QualifySessionParser to run
            if (sim.Session.GetQualification() == null)
            {
                var parser = new QualiSessionParser();
                parser.Parse(root, sim);
            }

            var entityResults = new List <EntitySessionResult>();

            var entities        = sim.Session.Entities.ToDictionary(e => e.CarIdx);
            var existingResults = sessionResult.Results.ToDictionary(r => r.Entity.CarIdx);

            if (sessionResult.HasQualifyPositions)
            {
                // If there are qualify positions, use them to build the grid
                foreach (var qp in sessionResult.QualifyPositions)
                {
                    if (!entities.ContainsKey(qp.CarIdx))
                    {
                        continue;
                    }

                    if (!(existingResults.TryGet(qp.CarIdx) is EntitySessionResult result))
                    {
                        result = new EntitySessionResult(sessionResult, entities[qp.CarIdx])
                        {
                            Position      = qp.Position,
                            ClassPosition = qp.ClassPosition
                        };
                        entityResults.Add(result);
                    }
                    result.StartPosition      = qp.Position;
                    result.ClassStartPosition = qp.ClassPosition;
                }
            }
            else
            {
                // No qualify positions means:
                // (1) P or Q session
                // (2) Non-heat race, or feature heat
                if (sessionResult.Type == SessionType.Race)
                {
                    if (sim.Session.Info.IsHeatRacing)
                    {
                        // This is a heat that has no grid yet, do NOT add any results
                    }
                    else
                    {
                        // This is a normal race, get the qual results
                        var qualResults = sim.Session.GetQualification();
                        if (qualResults?.Results?.Count > 0)
                        {
                            foreach (var qr in qualResults.Results)
                            {
                                if (!(existingResults.TryGet(qr.Entity.CarIdx) is EntitySessionResult result))
                                {
                                    result = new EntitySessionResult(sessionResult, qr.Entity)
                                    {
                                        Position      = qr.Position,
                                        ClassPosition = qr.ClassPosition
                                    };
                                    entityResults.Add(result);
                                }
                                result.StartPosition      = qr.Position;
                                result.ClassStartPosition = qr.ClassPosition;
                            }
                        }
                    }
                }
                else
                {
                    // Not a race yet, just add everyone
                    if (!(sessionResult.Type == SessionType.Race && sim.Session.Info.IsHeatRacing))
                    {
                        foreach (var entity in entities.Values)
                        {
                            if (sessionResult.Results.FirstOrDefault(r => r.Entity.CarIdx == entity.CarIdx) is EntitySessionResult)
                            {
                                continue;
                            }

                            var result = new EntitySessionResult(sessionResult, entity)
                            {
                                Position      = int.MaxValue,
                                ClassPosition = int.MaxValue
                            };
                            entityResults.Add(result);
                        }
                    }
                }
            }

            if (entityResults.Count > 0)
            {
                lock (sim.SharedCollectionLock)
                {
                    sessionResult.ResultsInt.AddRange(entityResults);
                }
            }
        }