Exemple #1
0
        public async Task <IEnumerable <PokemonData> > GetPokemonToEvolve(Dictionary <PokemonId, EvolveFilter> filters = null)
        {
            var buddy = (await GetPlayerData().ConfigureAwait(false)).PlayerData.BuddyPokemon?.Id;

            IEnumerable <PokemonData> myPokemons = (await GetPokemons().ConfigureAwait(false)).OrderByDescending(p => p.Cp);

            List <PokemonData> possibleEvolvePokemons = new List <PokemonData>();

            foreach (var pokemon in myPokemons)
            {
                if (!filters.ContainsKey(pokemon.PokemonId))
                {
                    continue;
                }
                var filter = filters[pokemon.PokemonId];

                if (await CanEvolvePokemon(pokemon, filter, true).ConfigureAwait(false))
                {
                    possibleEvolvePokemons.Add(pokemon);
                }
            }

            var pokemonToEvolve = new List <PokemonData>();

            // Group pokemon by their PokemonId
            var groupedPokemons = possibleEvolvePokemons.GroupBy(p => p.PokemonId);

            foreach (var g in groupedPokemons)
            {
                PokemonId pokemonId = g.Key;

                var orderedGroup = g.OrderByDescending(p => p.Cp);

                //if (!filters.ContainsKey(pokemon.PokemonId)) continue;
                var filter = filters[pokemonId];

                int candiesLeft = await GetCandyCount(pokemonId).ConfigureAwait(false);

                PokemonSettings settings    = (await GetPokemonSettings().ConfigureAwait(false)).FirstOrDefault(x => x.PokemonId == pokemonId);
                int             pokemonLeft = orderedGroup.Count();

                int candyNeed = GetCandyToEvolve(settings, filter);

                if (candyNeed == -1)
                {
                    continue; // If we were unable to determine which branch to use, then skip this pokemon.
                }
                // Calculate the number of evolutions possible (taking into account +1 candy for evolve and +1 candy for transfer)
                EvolutionCalculations evolutionInfo = CalculatePokemonEvolution(pokemonLeft, candiesLeft, candyNeed, 1);

                if (evolutionInfo.Evolves > 0)
                {
                    // Add only the number of pokemon we can evolve.
                    pokemonToEvolve.AddRange(orderedGroup.Take(evolutionInfo.Evolves).ToList());
                }
            }

            return(pokemonToEvolve);
        }
Exemple #2
0
        public IEnumerable <PokemonData> GetPokemonToEvolve(IEnumerable <PokemonId> filter = null)
        {
            IEnumerable <PokemonData> myPokemon = GetPokemons().OrderByDescending(p => p.Cp);

            IEnumerable <PokemonId> pokemonIds = filter as PokemonId[] ?? filter.ToArray();

            if (pokemonIds.Any())
            {
                myPokemon =
                    myPokemon.Where(
                        p => (pokemonIds.Contains(p.PokemonId)) ||
                        (_logicSettings.EvolveAllPokemonAboveIv &&
                         (PokemonInfo.CalculatePokemonPerfection(p) >= _logicSettings.EvolveAboveIvValue)));
            }
            else if (_logicSettings.EvolveAllPokemonAboveIv)
            {
                myPokemon =
                    myPokemon.Where(
                        p => PokemonInfo.CalculatePokemonPerfection(p) >= _logicSettings.EvolveAboveIvValue);
            }

            // Only get evolvable pokemon (not in gym, enough candy, etc.)
            var evolvablePokemon = myPokemon.Where(p => CanEvolvePokemon(p).Result).ToList();

            var pokemonToEvolve = new List <PokemonData>();

            // Group pokemon by their PokemonId
            var groupedPokemons = evolvablePokemon.GroupBy(p => p.PokemonId);

            foreach (var group in groupedPokemons)
            {
                PokemonId       pokemonId   = group.Key;
                int             candiesLeft = GetCandyCount(pokemonId);
                PokemonSettings settings    = GetPokemonSettings().Result.FirstOrDefault(x => x.PokemonId == pokemonId);
                int             pokemonLeft = group.Count();

                // Calculate the number of evolutions possible (taking into account +1 candy for evolve and +1 candy for transfer)
                EvolutionCalculations evolutionInfo = CalculatePokemonEvolution(pokemonLeft, candiesLeft, settings.CandyToEvolve, 1);

                if (evolutionInfo.Evolves > 0)
                {
                    // Add only the number of pokemon we can evolve.
                    pokemonToEvolve.AddRange(group.Take(evolutionInfo.Evolves).ToList());
                }
            }

            return(pokemonToEvolve);
        }
Exemple #3
0
        public IEnumerable <PokemonData> GetPokemonToEvolve(Dictionary <PokemonId, EvolveFilter> filters = null)
        {
            var buddy = GetPlayerData().Result.PlayerData.BuddyPokemon?.Id;

            IEnumerable <PokemonData> myPokemons = GetPokemons().OrderByDescending(p => p.Cp);

            myPokemons = myPokemons.Where(p => string.IsNullOrEmpty(p.DeployedFortId) && (!buddy.HasValue || buddy.Value != p.Id));

            List <PokemonData> possibleEvolvePokemons = new List <PokemonData>();

            foreach (var pokemon in myPokemons)
            {
                if (!filters.ContainsKey(pokemon.PokemonId))
                {
                    continue;
                }
                var filter = filters[pokemon.PokemonId];

                if (filter.Operator.BoolFunc(
                        filter.MinIV <= pokemon.Perfection(),
                        filter.MinLV <= pokemon.Level(),
                        filter.MinCP <= pokemon.CP(),
                        (filter.Moves == null ||
                         filter.Moves.Count == 0 ||
                         filter.Moves.Any(x => x[0] == pokemon.Move1 && x[1] == pokemon.Move2)
                        )
                        ) &&
                    CanEvolvePokemon(pokemon, filter).Result
                    )
                {
                    possibleEvolvePokemons.Add(pokemon);
                }
            }

            var pokemonToEvolve = new List <PokemonData>();

            // Group pokemon by their PokemonId
            var groupedPokemons = possibleEvolvePokemons.GroupBy(p => p.PokemonId);

            foreach (var group in groupedPokemons)
            {
                PokemonId pokemonId = group.Key;
                //if (!filters.ContainsKey(pokemon.PokemonId)) continue;
                var filter = filters[pokemonId];

                int             candiesLeft = GetCandyCount(pokemonId);
                PokemonSettings settings    = GetPokemonSettings().Result.FirstOrDefault(x => x.PokemonId == pokemonId);
                int             pokemonLeft = group.Count();

                int candyNeed = settings.CandyToEvolve;

                if (filter.EvolveToPokemonId != PokemonId.Missingno)
                {
                    var branch = settings.EvolutionBranch.FirstOrDefault(x => x.Evolution == filter.EvolveToPokemonId);

                    if (branch != null)
                    {
                        candyNeed = branch.CandyCost;
                    }
                }

                // Calculate the number of evolutions possible (taking into account +1 candy for evolve and +1 candy for transfer)
                EvolutionCalculations evolutionInfo = CalculatePokemonEvolution(pokemonLeft, candiesLeft, candyNeed, 1);

                if (evolutionInfo.Evolves > 0)
                {
                    // Add only the number of pokemon we can evolve.
                    pokemonToEvolve.AddRange(group.Take(evolutionInfo.Evolves).ToList());
                }
            }

            return(pokemonToEvolve);
        }