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