Пример #1
0
        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();
        }
Пример #2
0
            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);
            }
Пример #3
0
            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);
            }
Пример #4
0
        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());
            });
        }
Пример #5
0
        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();
            }
        }
Пример #6
0
 protected void GameFinishedUpdate(object sender, GameFinishedArgs e)
 {
     GameFinished(e.FinalScore);
 }
Пример #7
0
        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();
            }
        }