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