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