private async void GameWrapper_Finished(object sender, GameFinishedArgs e) { var extra = e.Result?.GetExtraByType <Game.ResultExtraSpecialEvent>(); Logging.Debug("extra=" + extra); Logging.Debug("extra.Tier=" + extra?.Tier); Logging.Debug("extra.Guid=" + extra?.Guid); if (extra == null || extra.Tier == -1 || string.IsNullOrWhiteSpace(extra.Guid)) { return; } await EnsureLoadedAsync(); var eventObject = GetByGuid(extra.Guid); if (eventObject == null) { return; } eventObject.TakenPlace = (eventObject.ConditionType == null ? 4 : 3) - extra.Tier; // throw new NotImplementedException(); }
public void ShouldRaiseGameFinishedEventWithDrawAndNoWinner() { IBoard subject = new Board(); GameFinishedArgs gameFinishedArgument = null; subject.GameFinished += (GameFinishedArgs argument) => { gameFinishedArgument = argument; }; SetupTheBoardForADraw(subject); gameFinishedArgument.Result.Should().Be(GameResult.Draw); gameFinishedArgument.LineWin.Should().Be(LineWin.None); }
public void ShouldRaiseGameFinishedEventWhenTheRightDiagonalRowHasAllZeros() { IBoard subject = new Board(); GameFinishedArgs gameFinishedArgument = null; subject.GameFinished += (GameFinishedArgs argument) => { gameFinishedArgument = argument; }; MakeTheRightDiagonalRowOfZerosTheWinner(subject); gameFinishedArgument.Result.Should().Be(GameResult.Win); gameFinishedArgument.Winner.Team.Should().Be(Team.Zero); gameFinishedArgument.LineWin.Should().Be(LineWin.RightDiagonal); }
private void OnGameFinished(object sender, GameFinishedArgs gameFinishedArgs) { var result = gameFinishedArgs.Result; if (result == null) { return; } Task.Run(() => { AddNewResult(gameFinishedArgs.StartProperties, result); var toRemoval = new DirectoryInfo(SessionsDirectory) .GetFiles("*.json").OrderByDescending(x => x.LastWriteTime).Skip(SettingsHolder.Drive.RaceResultsLimit).ToList(); Logging.Debug($"Removing {toRemoval.Count} old race result(s): {toRemoval.Select(x => x.Name).JoinToString(", ")}"); FileUtils.Recycle(toRemoval.Select(x => x.FullName).ToArray()); }); }
private void GameWrapper_Finished(object sender, GameFinishedArgs e) { Logging.Write("Race finished"); var careerProperties = e.StartProperties.GetAdditional <CareerProperties>(); if (careerProperties == null) { Logging.Write("Not a career race"); return; } if (e.Result == null) { Logging.Write("Result=null"); return; } Logging.Write($"Career: {careerProperties.CareerId}"); var career = GetById(careerProperties.CareerId); var ev = career?.GetEventById(careerProperties.EventId); if (ev == null) { Logging.Warning("Can’t find career or event by ID."); return; } /* just for in case */ career.EnsureEventsLoaded(); Logging.Write($"Finished: {careerProperties.CareerId}, {careerProperties.EventId}."); switch (career.Type) { case KunosCareerObjectType.SingleEvents: var conditionProperties = e.StartProperties.GetAdditional <PlaceConditions>(); if (conditionProperties == null) { Logging.Warning("PlaceConditionsProperties are missing."); return; } var takenPlace = conditionProperties.GetTakenPlace(e.Result); if (takenPlace >= ev.TakenPlace) { Logging.Warning("Taken place is worse than saved place."); return; } Logging.Write($"Taken place is changed from {ev.TakenPlace} to {takenPlace}."); ev.TakenPlace = takenPlace; career.SaveProgress(true); if (!career.IsCompleted && CheckIfCareerCompleted(career)) { KunosCareerProgress.Instance.Completed = KunosCareerProgress.Instance.Completed.Append(career.Id).ToArray(); } break; case KunosCareerObjectType.Championship: if (e.Result.NumberOfSessions > 0) { var places = e.Result.Sessions.Last().GetTakenPlacesPerCar(); ev.TakenPlace = places[0] + 1; ev.IsPassed = true; var nextEvent = career.EventsManager.GetByNumber(ev.EventNumber + 1); if (nextEvent != null) { nextEvent.IsAvailable = true; } var pointsPerPlace = career.ChampionshipPointsPerPlace; career.ChampionshipPoints += pointsPerPlace.ElementAtOrDefault(places[0]); career.ChampionshipAiPoints = places.Skip(1).Select((place, id) => pointsPerPlace.ElementAtOrDefault(place) + career.ChampionshipAiPoints.ElementAtOrDefault(id)).ToArray(); career.SaveProgress(true); if (!career.IsCompleted && CheckIfCareerCompleted(career)) { KunosCareerProgress.Instance.Completed = KunosCareerProgress.Instance.Completed.Append(career.Id).ToArray(); } } else { throw new NotImplementedException(); } break; default: throw new ArgumentOutOfRangeException(); } }
protected void GameFinishedUpdate(object sender, GameFinishedArgs e) { GameFinished(e.FinalScore); }
private void GameWrapper_Finished(object sender, GameFinishedArgs e) { Logging.Write("Race finished"); var careerProperties = e.StartProperties.GetAdditional <ChampionshipProperties>(); if (careerProperties == null) { Logging.Write("Not a championship race"); return; } if (e.Result == null) { Logging.Write("Result=null"); return; } Logging.Write($"Championship: {careerProperties.ChampionshipId}"); var career = GetById(careerProperties.ChampionshipId); var ev = career?.ExtendedRounds.FirstOrDefault(x => x.Index == careerProperties.RoundIndex); if (ev == null) { Logging.Warning("Can’t find championship or round by ID."); return; } switch (career.Type) { case KunosCareerObjectType.SingleEvents: throw new NotSupportedException(); case KunosCareerObjectType.Championship: if (e.Result.NumberOfSessions > 0) { var places = e.Result.Sessions?.Last().GetTakenPlacesPerCar(); ev.TakenPlace = places?[0] +1 ?? 0; ev.IsPassed = true; var nextEvent = career.ExtendedRounds.FirstOrDefault(x => x.Index == careerProperties.RoundIndex + 1); if (nextEvent != null) { nextEvent.IsAvailable = true; } var pointsPerPlace = career.Rules.Points; var playerPointsDelta = pointsPerPlace.ArrayElementAtOrDefault(places?[0] ?? -1); if (career.PointsForBestLap != 0) { var bestLap = e.Result.Sessions?.SelectMany(x => x.BestLaps).MinEntryOrDefault(x => x.Time); if (bestLap == null) { Logging.Debug("Best lap: not set"); } else { Logging.Debug($"Best lap: set by {bestLap.CarNumber}, {bestLap.Time}"); var driver = career.Drivers.ElementAtOrDefault(bestLap.CarNumber); if (driver == null) { Logging.Warning("Best lap: driver not found!"); } else { Logging.Debug($"So, {PluralizingConverter.PluralizeExt(career.PointsForBestLap, "{0} bonus point")} for {driver.Name}!"); if (bestLap.CarNumber == 0) { playerPointsDelta += career.PointsForBestLap; } else { driver.Points += career.PointsForBestLap; } } } } if (career.PointsForPolePosition != 0) { var bestLap = e.Result.Sessions?.Where(x => x.Type == Game.SessionType.Qualification) .SelectMany(x => x.BestLaps) .MinEntryOrDefault(x => x.Time); if (bestLap == null) { Logging.Debug("Pole position: not set"); } else { Logging.Debug($"Pole position: set by {bestLap.CarNumber}, {bestLap.Time}"); var driver = career.Drivers.ElementAtOrDefault(bestLap.CarNumber); if (driver == null) { Logging.Warning("Pole position: driver not found!"); } else { Logging.Debug($"So, {PluralizingConverter.PluralizeExt(career.PointsForPolePosition, "{0} bonus point")} for {driver.Name}!"); if (bestLap.CarNumber == 0) { playerPointsDelta += career.PointsForPolePosition; } else { driver.Points += career.PointsForPolePosition; } } } } career.ChampionshipPoints += playerPointsDelta; for (var i = career.Drivers.Count - 1; i >= 0; i--) { var driver = career.Drivers[i]; if (driver.IsPlayer) { continue; } driver.Points += pointsPerPlace.ArrayElementAtOrDefault(places?.ArrayElementAtOrDefault(i) ?? -1); } career.UpdateTakenPlaces(); career.SaveProgress(true); } else { throw new NotImplementedException(); } break; default: throw new ArgumentOutOfRangeException(); } }