From 82f544aa1be933055de5d0f6466056ea26ade0dd Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Tue, 26 Jul 2016 17:04:58 -0400 Subject: [PATCH 01/18] Does evolves when bag gets almost full, doesn't filter at all --- src/main/kotlin/ink/abb/pogo/scraper/Bot.kt | 6 +- .../ink/abb/pogo/scraper/tasks/SmartEvolve.kt | 79 +++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt diff --git a/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt b/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt index cf6337911..b31ed7d7e 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt @@ -92,6 +92,7 @@ class Bot(val api: PokemonGo, val settings: Settings) { val catch = CatchOneNearbyPokemon() val release = ReleasePokemon() val evolve = EvolvePokemon() + val smartEvolve = SmartEvolve() val hatchEggs = HatchEggs() val export = Export() @@ -154,8 +155,11 @@ class Bot(val api: PokemonGo, val settings: Settings) { } if (settings.dropItems) task(drop) - if (settings.autotransfer) + if (settings.autotransfer) { task(release) + } else { + task(smartEvolve) + } } diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt new file mode 100644 index 000000000..c9601d309 --- /dev/null +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt @@ -0,0 +1,79 @@ +package ink.abb.pogo.scraper.tasks + +import POGOProtos.Enums.PokemonIdOuterClass +import com.pokegoapi.api.pokemon.PokemonMetaRegistry +import ink.abb.pogo.scraper.Bot +import ink.abb.pogo.scraper.Context +import ink.abb.pogo.scraper.Settings +import ink.abb.pogo.scraper.Task +import ink.abb.pogo.scraper.util.Log +import kotlin.comparisons.compareBy + +/** + * Created by ddcbdevins on 7/26/16. + */ +class SmartEvolve : Task { + override fun run(bot: Bot, ctx: Context, settings: Settings) { + val pokebagFillPercent = ctx.api.inventories.pokebank.pokemons.size.toDouble() / ctx.profile.pokemonStorage + Log.white("Pokebag ${pokebagFillPercent * 100} % full.") + val groupedPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } + if (pokebagFillPercent >= 0.7) { + val canEvolve = groupedPokemon.filter { + PokemonMetaRegistry.getMeta(it.key).candyToEvolve > 0 + } + if (canEvolve.isEmpty()) { + return + } + val evolveSorted = canEvolve.entries.map({ group -> + val descendant = PokemonMetaRegistry.getHightestForFamily(PokemonMetaRegistry.getMeta(group.key).family) + if (group.key == PokemonIdOuterClass.PokemonId.EEVEE) { + Pair(-1, group) + } else if (ctx.api.inventories.pokedex.getPokedexEntry(descendant) == null) { + Pair(0, group) + } else { + Pair(PokemonMetaRegistry.getMeta(group.key).candyToEvolve, group) + } + }).sortedWith(compareBy { it.first }) + + evolveSorted.forEach { + val poke = it.second + val sorted = poke.value.sortedByDescending { + if (settings.sortByIV) { + (it.ivRatio * 100).toInt() + } else { + it.cp + } + } + val candyNeeded = PokemonMetaRegistry.getMeta(poke.key).candyToEvolve + for ((index, pokemon) in sorted.withIndex()) { + if (ctx.api.inventories.candyjar.getCandies(pokemon.pokemonFamily) < candyNeeded) { + break; + } + Log.green("Evolving ${pokemon.pokemonId.name} because we have ${pokemon.candy} candy and only need ${candyNeeded}.") + pokemon.evolve() + } + + val currentPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } + currentPokemon.forEach { + if (it.value.size > 0) { + val pokes = it.value.sortedBy { + if (settings.sortByIV) { + (it.ivRatio * 100).toInt() + } else { + it.cp + } + } + for ((index, value) in pokes.withIndex()) { + if (index != pokes.size - 1) { + Log.red("Transfering ${value.pokemonId.name} (${value.ivRatio} - ${value.cp}cp) because it is not the best") + value.transferPokemon() + } else { + Log.green("The best ${value.pokemonId.name}'s stats are: ${value.ivRatio} & ${value.cp}cp") + } + } + } + } + } + } + } +} \ No newline at end of file From 0e09dfc7da96e33bf3dd3fc38a6553f8a5d380f5 Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 27 Jul 2016 10:53:46 -0400 Subject: [PATCH 02/18] Don't let it run in multiple threads --- .../ink/abb/pogo/scraper/tasks/SmartEvolve.kt | 108 ++++++++++-------- 1 file changed, 59 insertions(+), 49 deletions(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt index c9601d309..a07a3e7c1 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt @@ -7,73 +7,83 @@ import ink.abb.pogo.scraper.Context import ink.abb.pogo.scraper.Settings import ink.abb.pogo.scraper.Task import ink.abb.pogo.scraper.util.Log +import java.util.concurrent.locks.ReentrantLock import kotlin.comparisons.compareBy /** * Created by ddcbdevins on 7/26/16. */ class SmartEvolve : Task { + + private val lock = ReentrantLock(); + override fun run(bot: Bot, ctx: Context, settings: Settings) { - val pokebagFillPercent = ctx.api.inventories.pokebank.pokemons.size.toDouble() / ctx.profile.pokemonStorage - Log.white("Pokebag ${pokebagFillPercent * 100} % full.") - val groupedPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } - if (pokebagFillPercent >= 0.7) { - val canEvolve = groupedPokemon.filter { - PokemonMetaRegistry.getMeta(it.key).candyToEvolve > 0 - } - if (canEvolve.isEmpty()) { - return - } - val evolveSorted = canEvolve.entries.map({ group -> - val descendant = PokemonMetaRegistry.getHightestForFamily(PokemonMetaRegistry.getMeta(group.key).family) - if (group.key == PokemonIdOuterClass.PokemonId.EEVEE) { - Pair(-1, group) - } else if (ctx.api.inventories.pokedex.getPokedexEntry(descendant) == null) { - Pair(0, group) - } else { - Pair(PokemonMetaRegistry.getMeta(group.key).candyToEvolve, group) - } - }).sortedWith(compareBy { it.first }) + try { + lock.tryLock() - evolveSorted.forEach { - val poke = it.second - val sorted = poke.value.sortedByDescending { - if (settings.sortByIV) { - (it.ivRatio * 100).toInt() + val pokebagFillPercent = ctx.api.inventories.pokebank.pokemons.size.toDouble() / ctx.profile.pokemonStorage + Log.white("Pokebag ${pokebagFillPercent * 100} % full.") + val groupedPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } + if (pokebagFillPercent >= 0.7) { + val canEvolve = groupedPokemon.filter { + PokemonMetaRegistry.getMeta(it.key).candyToEvolve > 0 + } + if (canEvolve.isEmpty()) { + return + } + val evolveSorted = canEvolve.entries.map({ group -> + val descendant = PokemonMetaRegistry.getHightestForFamily(PokemonMetaRegistry.getMeta(group.key).family) + if (group.key == PokemonIdOuterClass.PokemonId.EEVEE) { + Pair(-1, group) + } else if (ctx.api.inventories.pokedex.getPokedexEntry(descendant) == null) { + Pair(0, group) } else { - it.cp + Pair(PokemonMetaRegistry.getMeta(group.key).candyToEvolve, group) } - } - val candyNeeded = PokemonMetaRegistry.getMeta(poke.key).candyToEvolve - for ((index, pokemon) in sorted.withIndex()) { - if (ctx.api.inventories.candyjar.getCandies(pokemon.pokemonFamily) < candyNeeded) { - break; + }).sortedWith(compareBy { it.first }) + + evolveSorted.forEach { + val poke = it.second + val sorted = poke.value.sortedByDescending { + if (settings.sortByIV) { + (it.ivRatio * 100).toInt() + } else { + it.cp + } + } + val candyNeeded = PokemonMetaRegistry.getMeta(poke.key).candyToEvolve + for ((index, pokemon) in sorted.withIndex()) { + if (ctx.api.inventories.candyjar.getCandies(pokemon.pokemonFamily) < candyNeeded) { + break; + } + Log.green("Evolving ${pokemon.pokemonId.name} because we have ${pokemon.candy} candy and only need ${candyNeeded}.") + pokemon.evolve() } - Log.green("Evolving ${pokemon.pokemonId.name} because we have ${pokemon.candy} candy and only need ${candyNeeded}.") - pokemon.evolve() - } - val currentPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } - currentPokemon.forEach { - if (it.value.size > 0) { - val pokes = it.value.sortedBy { - if (settings.sortByIV) { - (it.ivRatio * 100).toInt() - } else { - it.cp + val currentPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } + currentPokemon.forEach { + if (it.value.size > 0) { + val pokes = it.value.sortedBy { + if (settings.sortByIV) { + (it.ivRatio * 100).toInt() + } else { + it.cp + } } - } - for ((index, value) in pokes.withIndex()) { - if (index != pokes.size - 1) { - Log.red("Transfering ${value.pokemonId.name} (${value.ivRatio} - ${value.cp}cp) because it is not the best") - value.transferPokemon() - } else { - Log.green("The best ${value.pokemonId.name}'s stats are: ${value.ivRatio} & ${value.cp}cp") + for ((index, value) in pokes.withIndex()) { + if (index != pokes.size - 1) { + Log.red("Transfering ${value.pokemonId.name} (${value.ivRatio} - ${value.cp}cp) because it is not the best") + value.transferPokemon() + } else { + Log.green("The best ${value.pokemonId.name}'s stats are: ${value.ivRatio} & ${value.cp}cp") + } } } } } } + } finally { + lock.unlock() } } } \ No newline at end of file From 77a9a93b374dd39934954ba94f7701950167530b Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 27 Jul 2016 12:11:29 -0400 Subject: [PATCH 03/18] Well, thats embrarassing --- .../ink/abb/pogo/scraper/tasks/SmartEvolve.kt | 100 ++++++++---------- 1 file changed, 46 insertions(+), 54 deletions(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt index a07a3e7c1..2068f9716 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt @@ -15,75 +15,67 @@ import kotlin.comparisons.compareBy */ class SmartEvolve : Task { - private val lock = ReentrantLock(); - override fun run(bot: Bot, ctx: Context, settings: Settings) { - try { - lock.tryLock() - - val pokebagFillPercent = ctx.api.inventories.pokebank.pokemons.size.toDouble() / ctx.profile.pokemonStorage - Log.white("Pokebag ${pokebagFillPercent * 100} % full.") - val groupedPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } - if (pokebagFillPercent >= 0.7) { - val canEvolve = groupedPokemon.filter { - PokemonMetaRegistry.getMeta(it.key).candyToEvolve > 0 - } - if (canEvolve.isEmpty()) { - return + val pokebagFillPercent = ctx.api.inventories.pokebank.pokemons.size.toDouble() / ctx.profile.pokemonStorage + Log.white("Pokebag ${pokebagFillPercent * 100} % full.") + val groupedPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } + if (pokebagFillPercent >= 0.7) { + val canEvolve = groupedPokemon.filter { + PokemonMetaRegistry.getMeta(it.key).candyToEvolve > 0 + } + if (canEvolve.isEmpty()) { + return + } + val evolveSorted = canEvolve.entries.map({ group -> + val descendant = PokemonMetaRegistry.getHightestForFamily(PokemonMetaRegistry.getMeta(group.key).family) + if (group.key == PokemonIdOuterClass.PokemonId.EEVEE) { + Pair(-1, group) + } else if (ctx.api.inventories.pokedex.getPokedexEntry(descendant) == null) { + Pair(0, group) + } else { + Pair(PokemonMetaRegistry.getMeta(group.key).candyToEvolve, group) } - val evolveSorted = canEvolve.entries.map({ group -> - val descendant = PokemonMetaRegistry.getHightestForFamily(PokemonMetaRegistry.getMeta(group.key).family) - if (group.key == PokemonIdOuterClass.PokemonId.EEVEE) { - Pair(-1, group) - } else if (ctx.api.inventories.pokedex.getPokedexEntry(descendant) == null) { - Pair(0, group) + }).sortedWith(compareBy { it.first }) + + evolveSorted.forEach { + val poke = it.second + val sorted = poke.value.sortedByDescending { + if (settings.sortByIV) { + (it.ivRatio * 100).toInt() } else { - Pair(PokemonMetaRegistry.getMeta(group.key).candyToEvolve, group) + it.cp + } + } + val candyNeeded = PokemonMetaRegistry.getMeta(poke.key).candyToEvolve + for ((index, pokemon) in sorted.withIndex()) { + if (ctx.api.inventories.candyjar.getCandies(pokemon.pokemonFamily) < candyNeeded) { + break; } - }).sortedWith(compareBy { it.first }) + Log.green("Evolving ${pokemon.pokemonId.name} because we have ${pokemon.candy} candy and only need ${candyNeeded}.") + pokemon.evolve() + } + } - evolveSorted.forEach { - val poke = it.second - val sorted = poke.value.sortedByDescending { + val currentPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } + currentPokemon.forEach { + if (it.value.size > 0) { + val pokes = it.value.sortedBy { if (settings.sortByIV) { (it.ivRatio * 100).toInt() } else { it.cp } } - val candyNeeded = PokemonMetaRegistry.getMeta(poke.key).candyToEvolve - for ((index, pokemon) in sorted.withIndex()) { - if (ctx.api.inventories.candyjar.getCandies(pokemon.pokemonFamily) < candyNeeded) { - break; - } - Log.green("Evolving ${pokemon.pokemonId.name} because we have ${pokemon.candy} candy and only need ${candyNeeded}.") - pokemon.evolve() - } - - val currentPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } - currentPokemon.forEach { - if (it.value.size > 0) { - val pokes = it.value.sortedBy { - if (settings.sortByIV) { - (it.ivRatio * 100).toInt() - } else { - it.cp - } - } - for ((index, value) in pokes.withIndex()) { - if (index != pokes.size - 1) { - Log.red("Transfering ${value.pokemonId.name} (${value.ivRatio} - ${value.cp}cp) because it is not the best") - value.transferPokemon() - } else { - Log.green("The best ${value.pokemonId.name}'s stats are: ${value.ivRatio} & ${value.cp}cp") - } - } + for ((index, value) in pokes.withIndex()) { + if (index != pokes.size - 1) { + Log.red("Transfering ${value.pokemonId.name} (${value.ivRatio} - ${value.cp}cp) because it is not the best") + value.transferPokemon() + } else { + Log.yellow("The best ${value.pokemonId.name}'s stats are: ${value.ivRatio} & ${value.cp}cp") } } } } - } finally { - lock.unlock() } } } \ No newline at end of file From 0f47a7ac862965b78c82b8de4c1d7e437b5d11a9 Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 27 Jul 2016 13:36:18 -0400 Subject: [PATCH 04/18] Eevee optimization, and use the base release logic --- .../ink/abb/pogo/scraper/tasks/SmartEvolve.kt | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt index 2068f9716..260c558e1 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt @@ -15,6 +15,12 @@ import kotlin.comparisons.compareBy */ class SmartEvolve : Task { + lateinit private var release: ReleasePokemon + + constructor(release: ReleasePokemon) { + this.release = release + } + override fun run(bot: Bot, ctx: Context, settings: Settings) { val pokebagFillPercent = ctx.api.inventories.pokebank.pokemons.size.toDouble() / ctx.profile.pokemonStorage Log.white("Pokebag ${pokebagFillPercent * 100} % full.") @@ -51,31 +57,21 @@ class SmartEvolve : Task { if (ctx.api.inventories.candyjar.getCandies(pokemon.pokemonFamily) < candyNeeded) { break; } + if (pokemon.pokemonId == PokemonIdOuterClass.PokemonId.EEVEE) { + if (ctx.api.inventories.pokedex.getPokedexEntry(PokemonIdOuterClass.PokemonId.VAPOREON) == null) { + pokemon.renamePokemon("Rainer") + } else if (ctx.api.inventories.pokedex.getPokedexEntry(PokemonIdOuterClass.PokemonId.FLAREON) == null) { + pokemon.renamePokemon("Pyro") + } else if (ctx.api.inventories.pokedex.getPokedexEntry(PokemonIdOuterClass.PokemonId.JOLTEON) == null) { + pokemon.renamePokemon("Sparky") + } + } Log.green("Evolving ${pokemon.pokemonId.name} because we have ${pokemon.candy} candy and only need ${candyNeeded}.") pokemon.evolve() } } - val currentPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } - currentPokemon.forEach { - if (it.value.size > 0) { - val pokes = it.value.sortedBy { - if (settings.sortByIV) { - (it.ivRatio * 100).toInt() - } else { - it.cp - } - } - for ((index, value) in pokes.withIndex()) { - if (index != pokes.size - 1) { - Log.red("Transfering ${value.pokemonId.name} (${value.ivRatio} - ${value.cp}cp) because it is not the best") - value.transferPokemon() - } else { - Log.yellow("The best ${value.pokemonId.name}'s stats are: ${value.ivRatio} & ${value.cp}cp") - } - } - } - } + release.run(bot,ctx,settings) } } } \ No newline at end of file From c8ad35fd568366e7bc728a02985b070dbf7e6828 Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 27 Jul 2016 17:25:38 -0400 Subject: [PATCH 05/18] EEVEE (shrug) --- .../ink/abb/pogo/scraper/tasks/SmartEvolve.kt | 117 +++++++++++------- 1 file changed, 75 insertions(+), 42 deletions(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt index 260c558e1..768325c8c 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt @@ -1,6 +1,8 @@ package ink.abb.pogo.scraper.tasks +import POGOProtos.Enums.PokemonFamilyIdOuterClass import POGOProtos.Enums.PokemonIdOuterClass +import com.pokegoapi.api.pokemon.Pokemon import com.pokegoapi.api.pokemon.PokemonMetaRegistry import ink.abb.pogo.scraper.Bot import ink.abb.pogo.scraper.Context @@ -16,62 +18,93 @@ import kotlin.comparisons.compareBy class SmartEvolve : Task { lateinit private var release: ReleasePokemon + lateinit private var EEVEE_EVOLUTION_DATA: Map constructor(release: ReleasePokemon) { this.release = release + + EEVEE_EVOLUTION_DATA = mapOf( + Pair(PokemonIdOuterClass.PokemonId.VAPOREON, "Rainer"), + Pair(PokemonIdOuterClass.PokemonId.FLAREON, "Pyro"), + Pair(PokemonIdOuterClass.PokemonId.JOLTEON, "Sparky") + ) } override fun run(bot: Bot, ctx: Context, settings: Settings) { val pokebagFillPercent = ctx.api.inventories.pokebank.pokemons.size.toDouble() / ctx.profile.pokemonStorage Log.white("Pokebag ${pokebagFillPercent * 100} % full.") - val groupedPokemon = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } - if (pokebagFillPercent >= 0.7) { - val canEvolve = groupedPokemon.filter { - PokemonMetaRegistry.getMeta(it.key).candyToEvolve > 0 - } - if (canEvolve.isEmpty()) { - return - } - val evolveSorted = canEvolve.entries.map({ group -> - val descendant = PokemonMetaRegistry.getHightestForFamily(PokemonMetaRegistry.getMeta(group.key).family) - if (group.key == PokemonIdOuterClass.PokemonId.EEVEE) { - Pair(-1, group) - } else if (ctx.api.inventories.pokedex.getPokedexEntry(descendant) == null) { - Pair(0, group) - } else { - Pair(PokemonMetaRegistry.getMeta(group.key).candyToEvolve, group) - } - }).sortedWith(compareBy { it.first }) - - evolveSorted.forEach { - val poke = it.second - val sorted = poke.value.sortedByDescending { - if (settings.sortByIV) { - (it.ivRatio * 100).toInt() - } else { - it.cp - } - } - val candyNeeded = PokemonMetaRegistry.getMeta(poke.key).candyToEvolve - for ((index, pokemon) in sorted.withIndex()) { - if (ctx.api.inventories.candyjar.getCandies(pokemon.pokemonFamily) < candyNeeded) { - break; - } - if (pokemon.pokemonId == PokemonIdOuterClass.PokemonId.EEVEE) { - if (ctx.api.inventories.pokedex.getPokedexEntry(PokemonIdOuterClass.PokemonId.VAPOREON) == null) { - pokemon.renamePokemon("Rainer") - } else if (ctx.api.inventories.pokedex.getPokedexEntry(PokemonIdOuterClass.PokemonId.FLAREON) == null) { - pokemon.renamePokemon("Pyro") - } else if (ctx.api.inventories.pokedex.getPokedexEntry(PokemonIdOuterClass.PokemonId.JOLTEON) == null) { - pokemon.renamePokemon("Sparky") - } + if (pokebagFillPercent >= 0.5) { + val pokemonFamilies = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonFamily } + + pokemonFamilies.forEach { + var run = true + while (run) { + val pokemon = nextPokemonToEvolve(ctx, settings, it.key) + if (pokemon == null) { + run = false + continue } - Log.green("Evolving ${pokemon.pokemonId.name} because we have ${pokemon.candy} candy and only need ${candyNeeded}.") + + Log.green("Evolving ${pokemon.pokemonId.name} with IV ${pokemon.ivRatio} and ${pokemon.cp}cp") pokemon.evolve() + + // This might work. not sure +// if (pokemon.pokemonFamily == PokemonFamilyIdOuterClass.PokemonFamilyId.FAMILY_EEVEE) { +// pokemon.renamePokemon("") +// } } } release.run(bot,ctx,settings) } } + + /* + * Prioritize IV over xp farming + */ + fun nextPokemonToEvolve(ctx: Context, settings: Settings, family: PokemonFamilyIdOuterClass.PokemonFamilyId) : Pokemon? { + val familyMetas = PokemonMetaRegistry.meta.filter { it.value.family == family } + + if (familyMetas.size == 1) { + return null + } + + val candies = ctx.api.inventories.candyjar.getCandies(family) + val pokemonFamily = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonFamily }.get(family) + + var evolvePriority = pokemonFamily.orEmpty().sortedByDescending { it.ivRatio } + var pokemonToEvolve = evolvePriority[0] + + if (pokemonToEvolve.candiesToEvolve == 0) { + val generations = pokemonFamily.orEmpty().filter { it.candiesToEvolve > 0 }.groupBy { it.candiesToEvolve } + if (generations.size == 0) { + Log.white("Only have pokemon that cannot evolve in ${family.name}") + return null + } + + evolvePriority = generations.getOrElse(generations.keys.sorted()[0]){ listOf() }.sortedByDescending { it.ivRatio } + pokemonToEvolve = evolvePriority[0] + } + + if (pokemonToEvolve.candiesToEvolve > candies) { + return null + } + + if (pokemonToEvolve.pokemonId == PokemonIdOuterClass.PokemonId.EEVEE) { + EEVEE_EVOLUTION_DATA.forEach { + if (ctx.api.inventories.pokedex.getPokedexEntry(it.component1()) == null) { + pokemonToEvolve.renamePokemon(it.component2()) + return pokemonToEvolve + } + + val current = ctx.api.inventories.pokebank.getPokemonByPokemonId(it.key).sortedByDescending { it.ivRatio } + if (current[0].ivRatio < pokemonToEvolve.ivRatio) { + pokemonToEvolve.renamePokemon(it.component2()) + return pokemonToEvolve + } + } + } + + return pokemonToEvolve + } } \ No newline at end of file From 5bcc512e0520e3bd273075162811a94fed74959f Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 27 Jul 2016 17:34:58 -0400 Subject: [PATCH 06/18] Remove dependency on modification to api --- .../kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt index 768325c8c..abe78e872 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt @@ -3,14 +3,11 @@ package ink.abb.pogo.scraper.tasks import POGOProtos.Enums.PokemonFamilyIdOuterClass import POGOProtos.Enums.PokemonIdOuterClass import com.pokegoapi.api.pokemon.Pokemon -import com.pokegoapi.api.pokemon.PokemonMetaRegistry import ink.abb.pogo.scraper.Bot import ink.abb.pogo.scraper.Context import ink.abb.pogo.scraper.Settings import ink.abb.pogo.scraper.Task import ink.abb.pogo.scraper.util.Log -import java.util.concurrent.locks.ReentrantLock -import kotlin.comparisons.compareBy /** * Created by ddcbdevins on 7/26/16. @@ -63,12 +60,6 @@ class SmartEvolve : Task { * Prioritize IV over xp farming */ fun nextPokemonToEvolve(ctx: Context, settings: Settings, family: PokemonFamilyIdOuterClass.PokemonFamilyId) : Pokemon? { - val familyMetas = PokemonMetaRegistry.meta.filter { it.value.family == family } - - if (familyMetas.size == 1) { - return null - } - val candies = ctx.api.inventories.candyjar.getCandies(family) val pokemonFamily = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonFamily }.get(family) From 5425847e5522cd0b244b6092de4abc1e66f7d986 Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Tue, 2 Aug 2016 11:41:22 -0400 Subject: [PATCH 07/18] Better percentage --- src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt index abe78e872..6edddd9e6 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt @@ -30,7 +30,7 @@ class SmartEvolve : Task { override fun run(bot: Bot, ctx: Context, settings: Settings) { val pokebagFillPercent = ctx.api.inventories.pokebank.pokemons.size.toDouble() / ctx.profile.pokemonStorage Log.white("Pokebag ${pokebagFillPercent * 100} % full.") - if (pokebagFillPercent >= 0.5) { + if (pokebagFillPercent >= 0.8) { val pokemonFamilies = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonFamily } pokemonFamilies.forEach { From a345e71ad76487694e4be554f69baf0680e68faa Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 3 Aug 2016 09:41:54 -0400 Subject: [PATCH 08/18] Update for new api version --- src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt index 6edddd9e6..04ffe1821 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt @@ -28,7 +28,7 @@ class SmartEvolve : Task { } override fun run(bot: Bot, ctx: Context, settings: Settings) { - val pokebagFillPercent = ctx.api.inventories.pokebank.pokemons.size.toDouble() / ctx.profile.pokemonStorage + val pokebagFillPercent = ctx.api.inventories.pokebank.pokemons.size.toDouble() / ctx.profile.playerData.maxPokemonStorage Log.white("Pokebag ${pokebagFillPercent * 100} % full.") if (pokebagFillPercent >= 0.8) { val pokemonFamilies = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonFamily } @@ -44,11 +44,6 @@ class SmartEvolve : Task { Log.green("Evolving ${pokemon.pokemonId.name} with IV ${pokemon.ivRatio} and ${pokemon.cp}cp") pokemon.evolve() - - // This might work. not sure -// if (pokemon.pokemonFamily == PokemonFamilyIdOuterClass.PokemonFamilyId.FAMILY_EEVEE) { -// pokemon.renamePokemon("") -// } } } From 2758f9767805d6195af2517f6b00424f5e6ed078 Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Tue, 9 Aug 2016 14:53:49 -0400 Subject: [PATCH 09/18] Error when transfering bulk ammounts of pokemon like happens whti evolver --- .../ink/abb/pogo/scraper/tasks/ReleasePokemon.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/ReleasePokemon.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/ReleasePokemon.kt index 6cfa14639..d981a79ec 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/ReleasePokemon.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/ReleasePokemon.kt @@ -9,6 +9,7 @@ package ink.abb.pogo.scraper.tasks import POGOProtos.Networking.Responses.ReleasePokemonResponseOuterClass.ReleasePokemonResponse.Result +import com.pokegoapi.exceptions.AsyncPokemonGoException import ink.abb.pogo.scraper.Bot import ink.abb.pogo.scraper.Context import ink.abb.pogo.scraper.Settings @@ -45,7 +46,14 @@ class ReleasePokemon : Task { if (shouldRelease) { Log.yellow("Going to transfer ${pokemon.pokemonId.name} with " + "CP ${pokemon.cp} and IV $ivPercentage%; reason: $reason") - val result = pokemon.transferPokemon() + val result : Result + try { + result = pokemon.transferPokemon() + } catch(e: AsyncPokemonGoException) { + Log.red("Failed to transfer ${pokemon.pokemonId.name} with " + + "CP ${pokemon.cp} and IV $ivPercentage% due to ${e.cause?.message}") + continue + } if(ctx.pokemonInventoryFullStatus.second.get() && !settings.catchPokemon) { // Just released a pokemon so the inventory is not full anymore From 5b883525d15c777b75e8dd3482afa56c72f250aa Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 10 Aug 2016 11:36:16 -0400 Subject: [PATCH 10/18] Changes for configurability. Also interop with other implementations Compatible with #939 Don't care about bag fullness anymore Only run in the profile loop --- src/main/kotlin/ink/abb/pogo/scraper/Bot.kt | 17 ++++--- .../kotlin/ink/abb/pogo/scraper/Settings.kt | 11 ++++- .../pogo/scraper/evolve/EvolutionStrategy.kt | 12 +++++ .../IvMaximizingStrategy.kt} | 49 +++++++------------ .../ink/abb/pogo/scraper/tasks/Evolve.kt | 36 ++++++++++++++ 5 files changed, 86 insertions(+), 39 deletions(-) create mode 100644 src/main/kotlin/ink/abb/pogo/scraper/evolve/EvolutionStrategy.kt rename src/main/kotlin/ink/abb/pogo/scraper/{tasks/SmartEvolve.kt => evolve/IvMaximizingStrategy.kt} (61%) create mode 100644 src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt diff --git a/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt b/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt index b31ed7d7e..422296916 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt @@ -92,7 +92,7 @@ class Bot(val api: PokemonGo, val settings: Settings) { val catch = CatchOneNearbyPokemon() val release = ReleasePokemon() val evolve = EvolvePokemon() - val smartEvolve = SmartEvolve() + val myEvolve = Evolve() val hatchEggs = HatchEggs() val export = Export() @@ -141,6 +141,15 @@ class Bot(val api: PokemonGo, val settings: Settings) { task(export) if (settings.evolveStackLimit > 0) task(evolve) + if (settings.autoEvolve) { + // Pausing to not cause too much strain if a bunch or evolves happen at the same time + try { + ctx.pauseWalking.set(true) + task(myEvolve) + } finally { + ctx.pauseWalking.set(false) + } + } } runLoop(TimeUnit.SECONDS.toMillis(5), "BotLoop") { @@ -155,12 +164,8 @@ class Bot(val api: PokemonGo, val settings: Settings) { } if (settings.dropItems) task(drop) - if (settings.autotransfer) { + if (settings.autotransfer) task(release) - } else { - task(smartEvolve) - } - } runLoop(500, "PokestopLoop") { diff --git a/src/main/kotlin/ink/abb/pogo/scraper/Settings.kt b/src/main/kotlin/ink/abb/pogo/scraper/Settings.kt index 6da7a6ce3..ade362ce0 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/Settings.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/Settings.kt @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties import POGOProtos.Enums.PokemonIdOuterClass.PokemonId import POGOProtos.Inventory.Item.ItemIdOuterClass.ItemId import com.pokegoapi.google.common.geometry.S2LatLng +import ink.abb.pogo.scraper.evolve.EvolutionStrategy import ink.abb.pogo.scraper.util.Log import ink.abb.pogo.scraper.util.credentials.* import java.io.BufferedReader @@ -124,12 +125,15 @@ class SettingsParser(val properties: Properties) { guiPortSocket = getPropertyIfSet("Port where the socketserver should listen", "gui_port_socket", defaults.guiPortSocket, String::toInt), initialMapSize = getPropertyIfSet("Initial map size (S2 tiles) to fetch", "initial_map_size", defaults.initialMapSize, String::toInt), - + waitChance = getPropertyIfSet("Chance to wait on a pokestop", "wait_chance", defaults.waitChance, String::toDouble), waitTimeMin = getPropertyIfSet("Minimal time to wait", "wait_time_min", defaults.waitTimeMin, String::toInt), - waitTimeMax = getPropertyIfSet("Maximal time to wait", "wait_time_max", defaults.waitTimeMax, String::toInt) + waitTimeMax = getPropertyIfSet("Maximal time to wait", "wait_time_max", defaults.waitTimeMax, String::toInt), + + autoEvolve = getPropertyIfSet("Should auto evolve", "auto_evolve", defaults.autoEvolve, String::toBoolean), + evolutionStrategy = getPropertyIfSet("Evolution strategy to use", "evolution_strategy", defaults.evolutionStrategy, String::toString) ) } @@ -254,6 +258,9 @@ data class Settings( val export: String = "", + val autoEvolve: Boolean = false, + val evolutionStrategy: String = "", + val guiPortSocket: Int = 8001, var initialMapSize: Int = 9, diff --git a/src/main/kotlin/ink/abb/pogo/scraper/evolve/EvolutionStrategy.kt b/src/main/kotlin/ink/abb/pogo/scraper/evolve/EvolutionStrategy.kt new file mode 100644 index 000000000..7804bf6cb --- /dev/null +++ b/src/main/kotlin/ink/abb/pogo/scraper/evolve/EvolutionStrategy.kt @@ -0,0 +1,12 @@ +package ink.abb.pogo.scraper.evolve + +import ink.abb.pogo.scraper.Bot +import ink.abb.pogo.scraper.Context +import ink.abb.pogo.scraper.Settings + +/** + * Created by ddcbdevins on 8/10/16. + */ +interface EvolutionStrategy { + fun evolve(bot: Bot, ctx: Context, settings: Settings) +} \ No newline at end of file diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt similarity index 61% rename from src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt rename to src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt index 04ffe1821..46fd30af5 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/SmartEvolve.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt @@ -1,4 +1,4 @@ -package ink.abb.pogo.scraper.tasks +package ink.abb.pogo.scraper.evolve import POGOProtos.Enums.PokemonFamilyIdOuterClass import POGOProtos.Enums.PokemonIdOuterClass @@ -6,20 +6,17 @@ import com.pokegoapi.api.pokemon.Pokemon import ink.abb.pogo.scraper.Bot import ink.abb.pogo.scraper.Context import ink.abb.pogo.scraper.Settings -import ink.abb.pogo.scraper.Task +import ink.abb.pogo.scraper.tasks.ReleasePokemon import ink.abb.pogo.scraper.util.Log /** - * Created by ddcbdevins on 7/26/16. + * Created by ddcbdevins on 8/10/16. */ -class SmartEvolve : Task { +class IvMaximizingStrategy : EvolutionStrategy { - lateinit private var release: ReleasePokemon lateinit private var EEVEE_EVOLUTION_DATA: Map - constructor(release: ReleasePokemon) { - this.release = release - + constructor() { EEVEE_EVOLUTION_DATA = mapOf( Pair(PokemonIdOuterClass.PokemonId.VAPOREON, "Rainer"), Pair(PokemonIdOuterClass.PokemonId.FLAREON, "Pyro"), @@ -27,34 +24,25 @@ class SmartEvolve : Task { ) } - override fun run(bot: Bot, ctx: Context, settings: Settings) { - val pokebagFillPercent = ctx.api.inventories.pokebank.pokemons.size.toDouble() / ctx.profile.playerData.maxPokemonStorage - Log.white("Pokebag ${pokebagFillPercent * 100} % full.") - if (pokebagFillPercent >= 0.8) { - val pokemonFamilies = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonFamily } - - pokemonFamilies.forEach { - var run = true - while (run) { - val pokemon = nextPokemonToEvolve(ctx, settings, it.key) - if (pokemon == null) { - run = false - continue - } + override fun evolve(bot: Bot, ctx: Context, settings: Settings) { + val pokemonFamilies = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonFamily } - Log.green("Evolving ${pokemon.pokemonId.name} with IV ${pokemon.ivRatio} and ${pokemon.cp}cp") - pokemon.evolve() + pokemonFamilies.forEach { + var run = true + while (run) { + val pokemon = nextPokemonToEvolve(ctx, it.key) + if (pokemon == null) { + run = false + continue } - } - release.run(bot,ctx,settings) + Log.green("Evolving ${pokemon.pokemonId.name} with IV ${pokemon.ivRatio} and ${pokemon.cp}cp") + pokemon.evolve() + } } } - /* - * Prioritize IV over xp farming - */ - fun nextPokemonToEvolve(ctx: Context, settings: Settings, family: PokemonFamilyIdOuterClass.PokemonFamilyId) : Pokemon? { + fun nextPokemonToEvolve(ctx: Context, family: PokemonFamilyIdOuterClass.PokemonFamilyId) : Pokemon? { val candies = ctx.api.inventories.candyjar.getCandies(family) val pokemonFamily = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonFamily }.get(family) @@ -64,7 +52,6 @@ class SmartEvolve : Task { if (pokemonToEvolve.candiesToEvolve == 0) { val generations = pokemonFamily.orEmpty().filter { it.candiesToEvolve > 0 }.groupBy { it.candiesToEvolve } if (generations.size == 0) { - Log.white("Only have pokemon that cannot evolve in ${family.name}") return null } diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt new file mode 100644 index 000000000..208fdb27a --- /dev/null +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt @@ -0,0 +1,36 @@ +package ink.abb.pogo.scraper.tasks + +import POGOProtos.Enums.PokemonFamilyIdOuterClass +import POGOProtos.Enums.PokemonIdOuterClass +import com.pokegoapi.api.pokemon.Pokemon +import ink.abb.pogo.scraper.Bot +import ink.abb.pogo.scraper.Context +import ink.abb.pogo.scraper.Settings +import ink.abb.pogo.scraper.Task +import ink.abb.pogo.scraper.evolve.EvolutionStrategy +import ink.abb.pogo.scraper.evolve.IvMaximizingStrategy +import ink.abb.pogo.scraper.util.Log + +/** + * Created by ddcbdevins on 7/26/16. + */ +class Evolve : Task { + + private val DEFAULT_EVOLUTION_STRATEGY = "max_iv" + + private val EVOLVE_STRATEGY_MAPPER = mapOf( + Pair("max_iv", IvMaximizingStrategy()) + ) + + override fun run(bot: Bot, ctx: Context, settings: Settings) { + if (EVOLVE_STRATEGY_MAPPER.containsKey(settings.evolutionStrategy)) { + EVOLVE_STRATEGY_MAPPER.get(settings.evolutionStrategy)?.evolve(bot, ctx, settings) + } else { + if (settings.evolutionStrategy.isNotBlank()) { + Log.red("Evolution strategy ${settings.evolutionStrategy} does not exist. Not running this task") + } else { + EVOLVE_STRATEGY_MAPPER.get(DEFAULT_EVOLUTION_STRATEGY)?.evolve(bot, ctx, settings) + } + } + } +} \ No newline at end of file From b32c4fbb1a35d0cf51f38afb1159f6c78123a71e Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 10 Aug 2016 11:40:36 -0400 Subject: [PATCH 11/18] Small cleanup --- .../kotlin/ink/abb/pogo/scraper/evolve/EvolutionStrategy.kt | 3 --- .../ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt | 4 ---- 2 files changed, 7 deletions(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/evolve/EvolutionStrategy.kt b/src/main/kotlin/ink/abb/pogo/scraper/evolve/EvolutionStrategy.kt index 7804bf6cb..0de775fcd 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/evolve/EvolutionStrategy.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/evolve/EvolutionStrategy.kt @@ -4,9 +4,6 @@ import ink.abb.pogo.scraper.Bot import ink.abb.pogo.scraper.Context import ink.abb.pogo.scraper.Settings -/** - * Created by ddcbdevins on 8/10/16. - */ interface EvolutionStrategy { fun evolve(bot: Bot, ctx: Context, settings: Settings) } \ No newline at end of file diff --git a/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt index 46fd30af5..1f41b19d2 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt @@ -6,12 +6,8 @@ import com.pokegoapi.api.pokemon.Pokemon import ink.abb.pogo.scraper.Bot import ink.abb.pogo.scraper.Context import ink.abb.pogo.scraper.Settings -import ink.abb.pogo.scraper.tasks.ReleasePokemon import ink.abb.pogo.scraper.util.Log -/** - * Created by ddcbdevins on 8/10/16. - */ class IvMaximizingStrategy : EvolutionStrategy { lateinit private var EEVEE_EVOLUTION_DATA: Map From 07fd045a9a154613cf52b756d14fb5531d97e87f Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 10 Aug 2016 11:52:45 -0400 Subject: [PATCH 12/18] Adding a comment for status watching. Logic could use some work --- .../ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt index 1f41b19d2..ef6e5a7cf 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt @@ -8,6 +8,9 @@ import ink.abb.pogo.scraper.Context import ink.abb.pogo.scraper.Settings import ink.abb.pogo.scraper.util.Log +/* + * Evolution strategy that prioritizes maximizing IV, then prioritizes getting to highest evolution + */ class IvMaximizingStrategy : EvolutionStrategy { lateinit private var EEVEE_EVOLUTION_DATA: Map @@ -47,7 +50,7 @@ class IvMaximizingStrategy : EvolutionStrategy { if (pokemonToEvolve.candiesToEvolve == 0) { val generations = pokemonFamily.orEmpty().filter { it.candiesToEvolve > 0 }.groupBy { it.candiesToEvolve } - if (generations.size == 0) { + if (generations.size == 0) { // When you don't have any pokemon in the family that can evolve return null } @@ -56,6 +59,8 @@ class IvMaximizingStrategy : EvolutionStrategy { } if (pokemonToEvolve.candiesToEvolve > candies) { + Log.yellow("Would like to evolve ${pokemonToEvolve.pokemonId.name} with IV ${pokemonToEvolve.ivRatio * 100}%,\n" + + "\tbut only have ${candies}/${pokemonToEvolve.candiesToEvolve} candies") return null } From f3b5299acbf74e9554df53477d0c8df425f49a6f Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 10 Aug 2016 11:57:18 -0400 Subject: [PATCH 13/18] Add defualt setting to properties file --- config.properties.template | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config.properties.template b/config.properties.template index d1fd815d4..d959371d5 100644 --- a/config.properties.template +++ b/config.properties.template @@ -147,6 +147,11 @@ timer_walk_to_start_pokestop=-1 # Set profile update timer (Default: 60) profile_update_timer=60 +# Whether to run an evolution strategy every time the profile is updated +auto_evolve=false +# Evolution strategy to use, blank will use max_iv by default +evolution_strategy= + # Minimum IV percentage to keep a pokemon (to ignore IV: use -1) # between 0 and 100, suggested 80 transfer_iv_threshold=80 From aa45521120982fbf3c0722d1b2a94c6537d91cef Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 10 Aug 2016 12:53:49 -0400 Subject: [PATCH 14/18] More cleanup --- src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt index 208fdb27a..10e447763 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt @@ -1,8 +1,5 @@ package ink.abb.pogo.scraper.tasks -import POGOProtos.Enums.PokemonFamilyIdOuterClass -import POGOProtos.Enums.PokemonIdOuterClass -import com.pokegoapi.api.pokemon.Pokemon import ink.abb.pogo.scraper.Bot import ink.abb.pogo.scraper.Context import ink.abb.pogo.scraper.Settings @@ -11,9 +8,6 @@ import ink.abb.pogo.scraper.evolve.EvolutionStrategy import ink.abb.pogo.scraper.evolve.IvMaximizingStrategy import ink.abb.pogo.scraper.util.Log -/** - * Created by ddcbdevins on 7/26/16. - */ class Evolve : Task { private val DEFAULT_EVOLUTION_STRATEGY = "max_iv" From 94d6377e48d34dfd511eead32bd1bb59ee8e95df Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 10 Aug 2016 13:09:11 -0400 Subject: [PATCH 15/18] Stop wasting candy on weeklings --- .../scraper/evolve/IvMaximizingStrategy.kt | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt index ef6e5a7cf..ee7f06567 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt @@ -29,7 +29,7 @@ class IvMaximizingStrategy : EvolutionStrategy { pokemonFamilies.forEach { var run = true while (run) { - val pokemon = nextPokemonToEvolve(ctx, it.key) + val pokemon = nextPokemonToEvolve(ctx, settings, it.key) if (pokemon == null) { run = false continue @@ -41,23 +41,21 @@ class IvMaximizingStrategy : EvolutionStrategy { } } - fun nextPokemonToEvolve(ctx: Context, family: PokemonFamilyIdOuterClass.PokemonFamilyId) : Pokemon? { + fun nextPokemonToEvolve(ctx: Context, settings: Settings, family: PokemonFamilyIdOuterClass.PokemonFamilyId) : Pokemon? { val candies = ctx.api.inventories.candyjar.getCandies(family) val pokemonFamily = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonFamily }.get(family) var evolvePriority = pokemonFamily.orEmpty().sortedByDescending { it.ivRatio } var pokemonToEvolve = evolvePriority[0] - if (pokemonToEvolve.candiesToEvolve == 0) { - val generations = pokemonFamily.orEmpty().filter { it.candiesToEvolve > 0 }.groupBy { it.candiesToEvolve } - if (generations.size == 0) { // When you don't have any pokemon in the family that can evolve - return null - } - - evolvePriority = generations.getOrElse(generations.keys.sorted()[0]){ listOf() }.sortedByDescending { it.ivRatio } - pokemonToEvolve = evolvePriority[0] + // Highest in family cannot evolve and no others are high enough priority + if (pokemonToEvolve.ivRatio * 100 < settings.transferIvThreshold && pokemonToEvolve.candiesToEvolve == 0) { + return null } + val priorityEvolves = evolvePriority.filter { it.ivRatio * 100 >= settings.transferIvThreshold } + pokemonToEvolve = priorityEvolves.find { it.candiesToEvolve > 0 } + if (pokemonToEvolve.candiesToEvolve > candies) { Log.yellow("Would like to evolve ${pokemonToEvolve.pokemonId.name} with IV ${pokemonToEvolve.ivRatio * 100}%,\n" + "\tbut only have ${candies}/${pokemonToEvolve.candiesToEvolve} candies") From e797532a5a65567fdd747cf802c8939e4f7115f5 Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Wed, 10 Aug 2016 13:21:50 -0400 Subject: [PATCH 16/18] Logic fail --- .../pogo/scraper/evolve/IvMaximizingStrategy.kt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt index ee7f06567..fdb887755 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt @@ -49,12 +49,18 @@ class IvMaximizingStrategy : EvolutionStrategy { var pokemonToEvolve = evolvePriority[0] // Highest in family cannot evolve and no others are high enough priority - if (pokemonToEvolve.ivRatio * 100 < settings.transferIvThreshold && pokemonToEvolve.candiesToEvolve == 0) { - return null - } + if (pokemonToEvolve.ivRatio * 100 < settings.transferIvThreshold) { + if (pokemonToEvolve.candiesToEvolve == 0) { + return null + } + } else { + val priorityEvolves = evolvePriority.filter { it.ivRatio * 100 >= settings.transferIvThreshold } + pokemonToEvolve = priorityEvolves.find { it.candiesToEvolve > 0 } - val priorityEvolves = evolvePriority.filter { it.ivRatio * 100 >= settings.transferIvThreshold } - pokemonToEvolve = priorityEvolves.find { it.candiesToEvolve > 0 } + if (pokemonToEvolve == null) { + return null + } + } if (pokemonToEvolve.candiesToEvolve > candies) { Log.yellow("Would like to evolve ${pokemonToEvolve.pokemonId.name} with IV ${pokemonToEvolve.ivRatio * 100}%,\n" + From 354f0d660f3cd6a3a9756a8a28d614f385a839b8 Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Mon, 15 Aug 2016 09:59:45 -0400 Subject: [PATCH 17/18] Use the int instead of double/float --- .../kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt index fdb887755..5d6acd610 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/evolve/IvMaximizingStrategy.kt @@ -7,6 +7,7 @@ import ink.abb.pogo.scraper.Bot import ink.abb.pogo.scraper.Context import ink.abb.pogo.scraper.Settings import ink.abb.pogo.scraper.util.Log +import ink.abb.pogo.scraper.util.pokemon.getIvPercentage /* * Evolution strategy that prioritizes maximizing IV, then prioritizes getting to highest evolution @@ -49,7 +50,7 @@ class IvMaximizingStrategy : EvolutionStrategy { var pokemonToEvolve = evolvePriority[0] // Highest in family cannot evolve and no others are high enough priority - if (pokemonToEvolve.ivRatio * 100 < settings.transferIvThreshold) { + if (pokemonToEvolve.getIvPercentage() < settings.transferIvThreshold) { if (pokemonToEvolve.candiesToEvolve == 0) { return null } From 4e7c313eb554e23cbbbed2d12f8b41deaff7a0d1 Mon Sep 17 00:00:00 2001 From: Brian Devins Date: Mon, 15 Aug 2016 10:28:01 -0400 Subject: [PATCH 18/18] Use other strategy as default and make it a strategy --- src/main/kotlin/ink/abb/pogo/scraper/Bot.kt | 7 ++----- src/main/kotlin/ink/abb/pogo/scraper/Settings.kt | 2 +- .../{tasks/EvolvePokemon.kt => evolve/XpBatchStrategy.kt} | 6 +++--- src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt | 4 +++- 4 files changed, 9 insertions(+), 10 deletions(-) rename src/main/kotlin/ink/abb/pogo/scraper/{tasks/EvolvePokemon.kt => evolve/XpBatchStrategy.kt} (96%) diff --git a/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt b/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt index 422296916..4737e2a4b 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/Bot.kt @@ -91,8 +91,7 @@ class Bot(val api: PokemonGo, val settings: Settings) { val profile = UpdateProfile() val catch = CatchOneNearbyPokemon() val release = ReleasePokemon() - val evolve = EvolvePokemon() - val myEvolve = Evolve() + val evolve = Evolve() val hatchEggs = HatchEggs() val export = Export() @@ -139,13 +138,11 @@ class Bot(val api: PokemonGo, val settings: Settings) { task(hatchEggs) if (settings.export.length > 0) task(export) - if (settings.evolveStackLimit > 0) - task(evolve) if (settings.autoEvolve) { // Pausing to not cause too much strain if a bunch or evolves happen at the same time try { ctx.pauseWalking.set(true) - task(myEvolve) + task(evolve) } finally { ctx.pauseWalking.set(false) } diff --git a/src/main/kotlin/ink/abb/pogo/scraper/Settings.kt b/src/main/kotlin/ink/abb/pogo/scraper/Settings.kt index ade362ce0..888090217 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/Settings.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/Settings.kt @@ -125,7 +125,7 @@ class SettingsParser(val properties: Properties) { guiPortSocket = getPropertyIfSet("Port where the socketserver should listen", "gui_port_socket", defaults.guiPortSocket, String::toInt), initialMapSize = getPropertyIfSet("Initial map size (S2 tiles) to fetch", "initial_map_size", defaults.initialMapSize, String::toInt), - + waitChance = getPropertyIfSet("Chance to wait on a pokestop", "wait_chance", defaults.waitChance, String::toDouble), waitTimeMin = getPropertyIfSet("Minimal time to wait", "wait_time_min", defaults.waitTimeMin, String::toInt), diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/EvolvePokemon.kt b/src/main/kotlin/ink/abb/pogo/scraper/evolve/XpBatchStrategy.kt similarity index 96% rename from src/main/kotlin/ink/abb/pogo/scraper/tasks/EvolvePokemon.kt rename to src/main/kotlin/ink/abb/pogo/scraper/evolve/XpBatchStrategy.kt index 06c9bb13b..c067f3e1e 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/EvolvePokemon.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/evolve/XpBatchStrategy.kt @@ -6,7 +6,7 @@ * For more information, refer to the LICENSE file in this repositories root directory */ -package ink.abb.pogo.scraper.tasks +package ink.abb.pogo.scraper.evolve import POGOProtos.Networking.Responses.ReleasePokemonResponseOuterClass import com.pokegoapi.api.pokemon.Pokemon @@ -20,8 +20,8 @@ import ink.abb.pogo.scraper.util.cachedInventories import ink.abb.pogo.scraper.util.pokemon.getIv import ink.abb.pogo.scraper.util.pokemon.getIvPercentage -class EvolvePokemon : Task { - override fun run(bot: Bot, ctx: Context, settings: Settings) { +class XpBatchStrategy : EvolutionStrategy { + override fun evolve(bot: Bot, ctx: Context, settings: Settings) { //count the current stack of possible evolves var countEvolveStack = 0 val groupedPokemonForCount = ctx.api.inventories.pokebank.pokemons.groupBy { it.pokemonId } diff --git a/src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt b/src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt index 10e447763..8fb9640ed 100644 --- a/src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt +++ b/src/main/kotlin/ink/abb/pogo/scraper/tasks/Evolve.kt @@ -6,13 +6,15 @@ import ink.abb.pogo.scraper.Settings import ink.abb.pogo.scraper.Task import ink.abb.pogo.scraper.evolve.EvolutionStrategy import ink.abb.pogo.scraper.evolve.IvMaximizingStrategy +import ink.abb.pogo.scraper.evolve.XpBatchStrategy import ink.abb.pogo.scraper.util.Log class Evolve : Task { - private val DEFAULT_EVOLUTION_STRATEGY = "max_iv" + private val DEFAULT_EVOLUTION_STRATEGY = "xp_batch" private val EVOLVE_STRATEGY_MAPPER = mapOf( + Pair("xp_batch", XpBatchStrategy()), Pair("max_iv", IvMaximizingStrategy()) )