public int GetTakenPlace(Game.Result result) { if (result == null) return UnremarkablePlace; var drift = result.GetExtraByType<Game.ResultExtraDrift>(); if (drift != null && Type == PlaceConditionsType.Points) { return GetTakenPlace(drift.Points); } var timeAttack = result.GetExtraByType<Game.ResultExtraTimeAttack>(); if (timeAttack != null && Type == PlaceConditionsType.Points) { return GetTakenPlace(timeAttack.Points); } switch (Type) { case PlaceConditionsType.Points: return UnremarkablePlace; case PlaceConditionsType.Position: var place = result.Sessions.LastOrDefault(x => x.BestLaps.Any())?.CarPerTakenPlace?.IndexOf(0); return place.HasValue ? GetTakenPlace(place.Value + 1) : UnremarkablePlace; case PlaceConditionsType.Time: var time = result.Sessions.LastOrDefault(x => x.BestLaps.Any())?.BestLaps.FirstOrDefault(x => x.CarNumber == 0)?.Time; return time.HasValue ? GetTakenPlace((int)time.Value.TotalMilliseconds) : UnremarkablePlace; default: throw new ArgumentOutOfRangeException(); } }
private static BaseFinishedData GetFinishedData(Game.StartProperties properties, Game.Result result) { var conditions = properties?.GetAdditional<PlaceConditions>(); var takenPlace = conditions?.GetTakenPlace(result) ?? PlaceConditions.UnremarkablePlace; Logging.Debug($"Place conditions: {conditions?.GetDescription()}, result: {result.GetDescription()}"); { var extra = result.GetExtraByType<Game.ResultExtraDrift>(); if (extra != null) { return new DriftFinishedData { Points = extra.Points, MaxCombo = extra.MaxCombo, MaxLevel = extra.MaxLevel, TakenPlace = takenPlace }; } } { var extra = result.GetExtraByType<Game.ResultExtraTimeAttack>(); if (extra != null) { var bestLapTime = result.Sessions.SelectMany(x => from lap in x.BestLaps where lap.CarNumber == 0 select lap.Time).MinOrDefault(); return new TimeAttackFinishedData { Points = extra.Points, Laps = result.Sessions.Sum(x => x.LapsTotalPerCar.FirstOrDefault()), BestLapTime = bestLapTime == TimeSpan.Zero ? (TimeSpan?)null : bestLapTime, TakenPlace = takenPlace }; } } { var extra = result.GetExtraByType<Game.ResultExtraBestLap>(); if (extra != null && extra.IsNotCancelled && result.Sessions.Length == 1 && result.Players.Length == 1) { var bestLapTime = result.Sessions.SelectMany(x => from lap in x.BestLaps where lap.CarNumber == 0 select lap.Time).MinOrDefault(); var sectorsPerSections = result.Sessions.SelectMany(x => from lap in x.Laps where lap.CarNumber == 0 select lap.SectorsTime).ToList(); var theoreticallLapTime = sectorsPerSections.FirstOrDefault()?.Select((x, i) => sectorsPerSections.Select(y => y[i]).Min()).Sum(); return new HotlapFinishedData { Laps = result.Sessions.Sum(x => x.LapsTotalPerCar.FirstOrDefault()), BestLapTime = bestLapTime == TimeSpan.Zero ? (TimeSpan?)null : bestLapTime, TheoreticallLapTime = theoreticallLapTime, TakenPlace = takenPlace }; } } var isOnline = properties?.ModeProperties is Game.OnlineProperties; var playerName = isOnline && SettingsHolder.Drive.DifferentPlayerNameOnline ? SettingsHolder.Drive.PlayerNameOnline : SettingsHolder.Drive.PlayerName; var sessionsData = (from session in result.Sessions let takenPlaces = session.GetTakenPlacesPerCar() select new SessionFinishedData(session.Name.ApartFromLast(@" Session")) { PlayerEntries = ( from player in result.Players let car = CarsManager.Instance.GetById(player.CarId) let carSkin = car.GetSkinById(player.CarSkinId) select new { Player = player, Car = car, CarSkin = carSkin } ).Select((entry, i) => new SessionFinishedData.PlayerEntry { Name = i == 0 ? playerName : entry.Player.Name, IsPlayer = i == 0, Car = entry.Car, CarSkin = entry.CarSkin, TakenPlace = takenPlaces.ElementAtOrDefault(i) + 1, PrizePlace = takenPlaces.Length > 1, LapsCount = session.LapsTotalPerCar.ElementAtOrDefault(i), BestLapTime = session.BestLaps.Where(x => x.CarNumber == i).MinEntryOrDefault(x => x.Time)?.Time, Total = session.Laps.Where(x => x.CarNumber == i).Select(x => x.Time).Sum() }).OrderBy(x => x.TakenPlace).ToList() }).ToList(); return sessionsData.Count == 1 ? (BaseFinishedData)sessionsData.First() : sessionsData.Any() ? new SessionsFinishedData(sessionsData) : null; }