Exemplo n.º 1
0
        private List <BossFightProgressionOLD> GetBossFightProgression(int guildId)
        {
            var bossFights       = _bossFightRepository.GetAll(true);
            var guildProgression = _guildRepository.GetBossFightsCleared(guildId);

            return(bossFights.Select(bossFight => guildProgression.Contains(bossFight.Id)
                ? new BossFightProgressionOLD(bossFight, true)
                : new BossFightProgressionOLD(bossFight, false)).ToList());
        }
        private void Validate_Successful_Encounters(int id)
        {
            bool limitToCurrentlyInvalid = id == -1;
            // For now, limit it to one BossFight to check that it works
            //var bossFights = _bossFightRepository.GetAll(true).Where(bf => bf.Id == 86).ToList();
            var bossFights = _bossFightRepository.GetAll(true);

            if (id != -1)
            {
                bossFights = bossFights.Where(bf => bf.Id == id).ToList();
                limitToCurrentlyInvalid = false;
            }
            var i = 0;

            foreach (var bossFight in bossFights)
            {
                i++;

                _logger.Debug($"Checking BossFight: {i}/{bossFights.Count} {bossFight.Name}");

                // Check if this bossfight has difficulty settings
                #region Bosses with difficulty settings
                if (_bossFightRepository.DifficultyRecordsExist(bossFight.Id))
                {
                    var difficulties = _bossFightRepository.GetDifficultySettings(bossFight.Id).OrderByDescending(d => d.OverrideHitpoints);

                    _logger.Debug($"BossFight {bossFight.Name} has {difficulties.Count()} difficulty settings");

                    var encounters = _encounterRepository.GetSuccessfulEncounters(bossFight.Id, limitToCurrentlyInvalid);
                    _logger.Debug($"Encounters to check: {encounters.Count}");
                    var eN = 0;
                    foreach (var encounter in encounters)
                    {
                        eN++;
                        var damageTaken = _encounterRepository.GetTopDamageTakenForNpc(encounter.Id, difficulties.First().OverrideHitpointTarget);

                        bool passedOneDifficulty = false;
                        foreach (var difficulty in difficulties)
                        {
                            if (damageTaken >= difficulty.OverrideHitpoints)
                            {
                                if (encounter.EncounterDifficultyId == difficulty.EncounterDifficultyId)
                                {
                                    if (encounter.ValidForRanking)
                                    {
                                        //_logger.Debug(string.Format("Encounter {0} ({1}/{2}) is valid for {3} mode but the difficulty is already correct and the encounter is already valid.", encounter.Id, eN, encounters.Count, difficulty.EncounterDifficulty.Name));
                                        passedOneDifficulty = true;
                                        break;
                                    }

                                    //_logger.Debug(string.Format("Encounter {0} ({1}/{2}) is valid for {3} mode but the difficulty is already correct. Setting validity now.", encounter.Id, eN, encounters.Count, difficulty.EncounterDifficulty.Name));
                                    _encounterRepository.MakeValidForRankings(encounter.Id);
                                    passedOneDifficulty = true;
                                    break;
                                }

                                if (encounter.ValidForRanking)
                                {
                                    //_logger.Debug(string.Format("Encounter {0} ({1}/{2}) is valid for {3} mode and is already valid, but the difficulty is incorrect. Changing from {4} to {5}.", encounter.Id, eN, encounters.Count, difficulty.EncounterDifficulty.Name, encounter.EncounterDifficultyId, difficulty.EncounterDifficultyId));
                                    _encounterRepository.MakeValidForRankings(encounter.Id, difficulty.EncounterDifficultyId);
                                    passedOneDifficulty = true;
                                    break;
                                }

                                //_logger.Debug(string.Format("Encounter {0} ({1}/{2}) is valid for {3} mode. Updating both difficulty and validity now.", encounter.Id, eN, encounters.Count, difficulty.EncounterDifficulty.Name));
                                _encounterRepository.MakeValidForRankings(encounter.Id, difficulty.EncounterDifficultyId);
                                passedOneDifficulty = true;
                                break;
                            }

                            //_logger.Debug(string.Format("Encounter {0} ({1}/{2}) is not valid for {3} mode.", encounter.Id, eN, encounters.Count, difficulty.EncounterDifficulty.Name));
                        }

                        if (!passedOneDifficulty && encounter.ValidForRanking)
                        {
                            // This encounter should not be valid for ranking, so update it here
                            _logger.Debug(
                                $"Encounter {encounter.Id} ({eN}/{encounters.Count}) was marked as valid, but didn't pass any difficulty requirements");
                            _encounterRepository.MakeInvalidForRankings(encounter.Id);
                        }
                    }
                }
                #endregion
                else
                #region Bosses without difficulty settings
                {
                    // If we get here, then this bossfight doesn't have difficulty settings, so proceed normally
                    if (bossFight.Hitpoints == 0)
                    {
                        continue;
                    }

                    var encounters = _encounterRepository.GetSuccessfulEncounters(bossFight.Id, limitToCurrentlyInvalid);
                    _logger.Debug($"Encounters to check: {encounters.Count}");
                    var eN = 0;

                    foreach (var encounter in encounters)
                    {
                        eN++;
                        var damageTaken = _encounterRepository.GetTopDamageTakenForNpc(encounter.Id,
                                                                                       string.IsNullOrEmpty(bossFight.HitpointTarget) ? bossFight.Name : bossFight.HitpointTarget);

                        if (damageTaken >= bossFight.Hitpoints && !encounter.ValidForRanking)
                        {
                            // This encounter should be valid for ranking, so update it here
                            //_logger.Debug(string.Format("Encounter {0} ({1}/{2}) should be valid but has not been set yet - damage taken: {3}", encounter.Id, eN, encounters.Count, damageTaken));
                            _encounterRepository.MakeValidForRankings(encounter.Id);
                        }

                        if (damageTaken < bossFight.Hitpoints && encounter.ValidForRanking)
                        {
                            // This encounter should not be valid for ranking, so update it here
                            //_logger.Debug(string.Format("Encounter {0} ({1}/{2}) invalid - damage taken: {3}", encounter.Id, eN, encounters.Count, damageTaken));
                            _encounterRepository.MakeInvalidForRankings(encounter.Id);
                        }
                    }
                }
                #endregion
                _logger.Debug($"Finished checking encounters for {bossFight.Name}");
            }
        }