diff --git a/Utilities/DetermineOriginGame.py b/Utilities/DetermineOriginGame.py index 4f8a16e..200cc29 100644 --- a/Utilities/DetermineOriginGame.py +++ b/Utilities/DetermineOriginGame.py @@ -39,7 +39,7 @@ all_games = [ "Sword", "Shield", "Expansion Pass", "Brilliant Diamond", "Shining Pearl", "Legends: Arceus", - "Scarlet", "Violet", "The Teal Mask", "The Hidden Treasure of Area Zero", + "Scarlet", "Violet", "The Teal Mask", "The Hidden Treasure of Area Zero", "The Hidden Treasure of Area Zero (Scarlet)", "The Hidden Treasure of Area Zero (Violet)", "The Teal Mask (Scarlet)", "The Teal Mask (Violet)", "Unknown" ] @@ -173,15 +173,15 @@ class Pokemon: non_catchable_methods.append("event") for encounter in self.encounter_information: + encounter.method = None for location in encounter.locations: - encounter.method = "Catchable" - + skip_location = False for non_catchable in non_catchable_methods: if non_catchable in location.lower(): - encounter.method = None + skip_location = True break - if encounter.method is None: + if skip_location: continue if "first partner" in location.lower(): @@ -235,6 +235,8 @@ class EvolutionStage: self.stage = stage self.is_baby = self.stage is not None and 'Baby' in self.stage self.pokemon_reference = find_pokemon(pokemon, form) + if self.pokemon_reference == None: + self.pokemon_reference = find_pokemon(pokemon, None) self.form = form @@ -564,7 +566,12 @@ def get_evolution_data_from_bulbapedia(pokemon_name, form, cache): if not evolution_table: return None - evolution_chain = parse_evolution_chain(evolution_table, form) + eeveelutions = ["eevee", "vaporeon", "jolteon", "flareon", "espeon", "umbreon", "leafeon", "glaceon", "sylveon"] + + if pokemon_name == "Eevee": + evolution_chain = parse_eevee_evolution_chain(evolution_table) + else: + evolution_chain = parse_evolution_chain(evolution_table, form) return evolution_chain # This is going to be a little odd. @@ -575,7 +582,43 @@ def get_evolution_data_from_bulbapedia(pokemon_name, form, cache): # a table in a TD is information about the current Pokémon in that evolution stage # a TD without a table is information on how to trigger the next evolution - +def parse_pokemon_subtable(td): + if td.find('table'): + # This TD contains Pokemon information + pokemon_name = extract_pokemon_name(td) + stage = extract_stage_form(td) + return pokemon_name, stage + return None, None + +def parse_eevee_evolution_chain(table): + + tbody = table.find('tbody', recursive=False) + if not tbody: + return [] + + rows = tbody.find_all('tr', recursive=False) + eevee_row = rows[1] + method_row = rows[2] + eeveelutions_row = rows[3] + + eevee_td = eevee_row.find('td', recursive=False) + pokemon_name, stage = parse_pokemon_subtable(eevee_td) + eevee_stage = EvolutionStage(pokemon_name, None, stage, None) + + methods = [] + for method in method_row.find_all('td', recursive=False): + methods.append(extract_evolution_method(method)) + + eeveelutions = [] + index = 0 + for eeveelution in eeveelutions_row.find_all('td', recursive=False): + pokemon_name, stage = parse_pokemon_subtable(eeveelution) + eeveelutions.append(EvolutionStage(pokemon_name, methods[index], stage, None)) + index += 1 + + eevee_stage.branches.append(eeveelutions) + + return [eevee_stage] def get_locations_from_bulbapedia(pokemon_name, form, cache): @@ -674,6 +717,9 @@ def get_locations_from_bulbapedia(pokemon_name, form, cache): if not main_form: continue + if main_form == "All Forms": + main_form = form + main_form_match = fuzz.partial_ratio(form.lower(), main_form.lower()) >= 80 sub_form_match = False if not sub_form else fuzz.partial_ratio(form.lower(), sub_form.lower()) >= 80 @@ -796,7 +842,11 @@ list_of_shifting_form_pokemon = [ "Zygarde", "Magearna", "Vivillon", - "Minior" + "Minior", + "Urshifu", + "Oinkologne", + "Basculegion", + "Enamorus", ] def handle_form_shift(pokemon, encounter_data): @@ -813,8 +863,9 @@ def handle_form_shift(pokemon, encounter_data): pokemon.encounter_information = normal_form_pokemon.encounter_information phony_authentic = ["Sinistea", "Polteageist"] -countefieit_atrisan = ["Sinistcha", "Poltchageist"] -bad_tea_pokemon = phony_authentic + countefieit_atrisan +countefieit_atrisan = ["Poltchageist"] +unremarkable_masterpiece = ["Sinistcha"] +bad_tea_pokemon = phony_authentic + countefieit_atrisan + unremarkable_masterpiece def get_bad_tea_form(pokemon): if not pokemon.name in bad_tea_pokemon: @@ -831,6 +882,12 @@ def get_bad_tea_form(pokemon): return "Counterfeit Form" if pokemon.form == "Artisan Form": return None + + if pokemon.name in unremarkable_masterpiece: + if pokemon.form == None: + return "Unremarkable Form" + else: + return pokemon.form def determine_earliest_games(pokemon_list, cache): for pokemon in big_pokemon_list: @@ -838,6 +895,8 @@ def determine_earliest_games(pokemon_list, cache): form_to_find = pokemon.form if pokemon.name == "Minior" and pokemon.form == "Orange Core": form_to_find = None + if pokemon.name == "Squawkabilly" and pokemon.form: + form_to_find = pokemon.form.replace("Plumage", "").strip() if pokemon.name == "Alcremie": form_to_find = None if pokemon.name in bad_tea_pokemon: @@ -848,6 +907,8 @@ def determine_earliest_games(pokemon_list, cache): pokemon.encounter_information.append(encounter_information) handle_unown(pokemon, encounter_data) handle_form_shift(pokemon, encounter_data) + if pokemon.name == "Gimmighoul" and pokemon.form == "Roaming Form": + continue pokemon.determine_earliest_game() print(f"Processed {pokemon}: {pokemon.earliest_game.game} ({pokemon.earliest_game.method})") @@ -928,6 +989,7 @@ def adjust_for_evolution(pokemon_list, cache): pokemon.add_evolution_chain(evolution_chain) game, method = pokemon.get_earliest_game_and_method() print(f"Adjusted {pokemon}: {game} ({method})") + return [] pokemon_dict = {f"{pokemon['base_name']}_{pokemon['form']}".lower(): pokemon for pokemon in pokemon_list} @@ -969,13 +1031,17 @@ def save_to_csv(pokemon_list, filename='pokemon_earliest_games.csv'): writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() - for pokemon in pokemon_list: + for pokemon in big_pokemon_list: + encounter_locations = [] + for encounter in pokemon.encounter_information: + if encounter.game == pokemon.earliest_game and encounter.method == pokemon.obtain_method: + encounter_locations.append(encounter.locations) writer.writerow({ - 'number': pokemon['number'], - 'name': pokemon['name'], - 'earliest_game': pokemon['earliest_game'], - 'obtain_method': pokemon['obtain_method'], - 'encounter_locations': pokemon['encounter_locations'] + 'number': pokemon.number, + 'name': pokemon.name, + 'earliest_game': pokemon.earliest_game, + 'obtain_method': pokemon.obtain_method, + 'encounter_locations': ' | '.join(str(item) for item in encounter_locations) }) def parse_encounter_locations(encounter_data, game): @@ -1084,6 +1150,12 @@ def check_alternative_sources(pokemon, cache): return "Unknown", "Unknown" def handle_unknown_encounters(pokemon_list, cache): + for pokemon in big_pokemon_list: + if pokemon.earliest_game == None or pokemon.obtain_method == None: + print(f"Checking alternative sources for {pokemon.name}") + + return + for pokemon in pokemon_list: if pokemon['earliest_game'] == "Unknown" or pokemon['obtain_method'] == "Unknown": new_game, new_method = check_alternative_sources(pokemon, cache) @@ -1104,8 +1176,8 @@ if __name__ == "__main__": pokemon_list_with_games = determine_earliest_games(pokemon_list, cache) pokemon_list_adjusted = adjust_for_evolution(pokemon_list_with_games, cache) - pokemon_list_with_locations = add_encounter_locations(pokemon_list_adjusted, cache) - pokemon_list_final = handle_unknown_encounters(pokemon_list_with_locations, cache) + #pokemon_list_with_locations = add_encounter_locations(pokemon_list_adjusted, cache) + pokemon_list_final = handle_unknown_encounters(pokemon_list_adjusted, cache) save_to_csv(pokemon_list_final) save_cached_data() # Save any remaining new entries diff --git a/pokemon_earliest_games.csv b/pokemon_earliest_games.csv index b22d8f0..e69de29 100644 --- a/pokemon_earliest_games.csv +++ b/pokemon_earliest_games.csv @@ -1,152 +0,0 @@ -number,name,earliest_game,obtain_method,encounter_locations -0001,Bulbasaur,Yellow,Gift,N/A -0002,Ivysaur,Yellow,Evolve,N/A -0003,Venusaur,Yellow,Evolve,N/A -0004,Charmander,Yellow,Gift,N/A -0005,Charmeleon,Yellow,Evolve,N/A -0006,Charizard,Yellow,Evolve,N/A -0007,Squirtle,Yellow,Gift,N/A -0008,Wartortle,Yellow,Evolve,N/A -0009,Blastoise,Yellow,Evolve,N/A -0010,Caterpie,Yellow,Catchable,viridian-forest-area (walk) -0011,Metapod,Yellow,Evolve,N/A -0012,Butterfree,Yellow,Evolve,N/A -0013,Weedle,Red,Catchable,kanto-route-2-south-towards-viridian-city (walk) | kanto-route-24-area (walk) | kanto-route-25-area (walk) | viridian-forest-area (walk) -0014,Kakuna,Red,Evolve,N/A -0015,Beedrill,Red,Evolve,N/A -0016,Pidgey,Yellow,Catchable,kanto-route-12-area (walk) | kanto-route-1-area (walk) | kanto-route-2-south-towards-viridian-city (walk) | kanto-route-5-area (walk) | kanto-route-6-area (walk) | kanto-route-7-area (walk) | kanto-route-8-area (walk) | kanto-route-11-area (walk) | kanto-route-13-area (walk) | kanto-sea-route-21-area (walk) | kanto-route-24-area (walk) | kanto-route-25-area (walk) | viridian-forest-area (walk) -0017,Pidgeotto,Yellow,Evolve,N/A -0018,Pidgeot,Yellow,Evolve,N/A -0019,Rattata,Yellow,Catchable,kanto-route-1-area (walk) | kanto-route-2-south-towards-viridian-city (walk) | kanto-route-3-area (walk) | kanto-route-4-area (walk) | kanto-route-5-area (walk) | kanto-route-6-area (walk) | kanto-route-7-area (walk) | kanto-route-8-area (walk) | kanto-route-9-area (walk) | kanto-route-10-area (walk) | kanto-route-11-area (walk) | kanto-route-16-area (walk) | kanto-route-18-area (walk) | kanto-sea-route-21-area (walk) | kanto-route-22-area (walk) | pokemon-mansion-1f (walk) | pokemon-mansion-2f (walk) | pokemon-mansion-3f (walk) -0019,Rattata (Alolan Form),Ultra Sun,Catchable,Unknown -0020,Raticate,Yellow,Evolve,N/A -0020,Raticate (Alolan Form),Ultra Sun,Evolve,N/A -0021,Spearow,Yellow,Catchable,kanto-route-3-area (walk) | kanto-route-4-area (walk) | kanto-route-9-area (walk) | kanto-route-16-area (walk) | kanto-route-18-area (walk) | kanto-route-22-area (walk) -0022,Fearow,Yellow,Evolve,N/A -0023,Ekans,Red,Catchable,kanto-route-4-area (walk) | kanto-route-8-area (walk) | kanto-route-9-area (walk) | kanto-route-10-area (walk) | kanto-route-11-area (walk) | kanto-route-23-area (walk) -0024,Arbok,Red,Evolve,N/A -0025,Pikachu,Yellow,Catchable,pallet-town-area (gift) -0025,Pikachu (Original Cap),Event,Event,N/A -0025,Pikachu (Hoenn Cap),Event,Event,N/A -0025,Pikachu (Sinnoh Cap),Event,Event,N/A -0025,Pikachu (Unova Cap),Event,Event,N/A -0025,Pikachu (Kalos Cap),Event,Event,N/A -0025,Pikachu (Alola Cap),Event,Event,N/A -0025,Pikachu (Partner Cap),Event,Event,N/A -0025,Pikachu (World Cap),Unknown,Unknown,N/A -0026,Raichu,Yellow,Evolve,N/A -0026,Raichu (Alolan Form),Ultra Sun,Evolve,N/A -0027,Sandshrew,Yellow,Catchable,mt-moon-1f (walk) | kanto-route-3-area (walk) | kanto-route-4-area (walk) -0027,Sandshrew (Alolan Form),Ultra Moon,Catchable,Unknown -0028,Sandslash,Yellow,Evolve,N/A -0028,Sandslash (Alolan Form),Ultra Moon,Evolve,N/A -0029,Nidoran-f,Unknown,Unknown,N/A -0030,Nidorina,Yellow,Catchable,kanto-route-9-area (walk) | kanto-route-23-area (walk) | kanto-safari-zone-area-1-east (walk) | kanto-safari-zone-area-2-north (walk) -0031,Nidoqueen,Yellow,Evolve,N/A -0032,Nidoran-m,Unknown,Unknown,N/A -0033,Nidorino,Yellow,Catchable,kanto-route-9-area (walk) | kanto-route-23-area (walk) | kanto-safari-zone-middle (walk) | kanto-safari-zone-area-3-west (walk) -0034,Nidoking,Yellow,Evolve,N/A -0035,Clefairy,Yellow,Catchable,mt-moon-1f (walk) | mt-moon-b1f (walk) | mt-moon-b2f (walk) -0036,Clefable,Yellow,Evolve,N/A -0037,Vulpix,Yellow,Catchable,Unknown -0037,Vulpix (Alolan Form),Ultra Sun,Catchable,Unknown -0038,Ninetales,Yellow,Evolve,N/A -0038,Ninetales (Alolan Form),Ultra Sun,Evolve,N/A -0039,Jigglypuff,Yellow,Catchable,kanto-route-5-area (walk) | kanto-route-6-area (walk) | kanto-route-7-area (walk) | kanto-route-8-area (walk) -0040,Wigglytuff,Yellow,Evolve,N/A -0041,Zubat,Yellow,Catchable,seafoam-islands-1f (walk) | seafoam-islands-b1f (walk) | seafoam-islands-b2f (walk) | seafoam-islands-b3f (walk) | seafoam-islands-b4f (walk) | mt-moon-1f (walk) | rock-tunnel-b1f (walk) | mt-moon-b1f (walk) | mt-moon-b2f (walk) | rock-tunnel-b2f (walk) | kanto-victory-road-2-1f (walk) | kanto-victory-road-2-2f (walk) -0042,Golbat,Yellow,Evolve,N/A -0043,Oddish,Yellow,Catchable,kanto-route-12-area (walk) | kanto-route-13-area (walk) | kanto-route-14-area (walk) | kanto-route-15-area (walk) | kanto-route-24-area (walk) | kanto-route-25-area (walk) -0044,Gloom,Yellow,Evolve,N/A -0045,Vileplume,Yellow,Evolve,N/A -0046,Paras,Yellow,Catchable,mt-moon-b1f (walk) | mt-moon-b2f (walk) | kanto-safari-zone-middle (walk) -0047,Parasect,Yellow,Evolve,N/A -0048,Venonat,Yellow,Catchable,kanto-route-14-area (walk) | kanto-route-15-area (walk) | kanto-route-24-area (walk) | kanto-route-25-area (walk) -0049,Venomoth,Yellow,Evolve,N/A -0050,Diglett,Yellow,Catchable,digletts-cave-area (walk) -0050,Diglett (Alolan Form),Ultra Sun,Catchable,Unknown -0051,Dugtrio,Yellow,Evolve,N/A -0051,Dugtrio (Alolan Form),Ultra Sun,Evolve,N/A -0052,Meowth,Blue,Catchable,kanto-route-5-area (walk) | kanto-route-6-area (walk) | kanto-route-7-area (walk) | kanto-route-8-area (walk) -0052,Meowth (Alolan Form),Ultra Sun,Catchable,Unknown -0052,Meowth (Galarian Form),Sword,Catchable,Unknown -0053,Persian,Blue,Evolve,N/A -0053,Persian (Alolan Form),Ultra Sun,Evolve,N/A -0054,Psyduck,Yellow,Catchable,kanto-route-6-area (surf) -0055,Golduck,Yellow,Evolve,N/A -0056,Mankey,Yellow,Catchable,kanto-route-3-area (walk) | kanto-route-4-area (walk) | kanto-route-22-area (walk) | kanto-route-23-area (walk) -0057,Primeape,Yellow,Evolve,N/A -0058,Growlithe,Yellow,Catchable,pokemon-mansion-1f (walk) -0058,Growlithe (Hisuian Form),Legends: Arceus,Catchable,Unknown -0059,Arcanine,Yellow,Evolve,N/A -0059,Arcanine (Hisuian Form),Legends: Arceus,Evolve,N/A -0060,Poliwag,Yellow,Catchable,seafoam-islands-b3f (good-rod) | seafoam-islands-b4f (good-rod) | kanto-route-12-area (good-rod) | kanto-sea-route-19-area (good-rod) | kanto-sea-route-20-area (good-rod) | cinnabar-island-area (good-rod) | viridian-city-area (good-rod) | viridian-city-area (super-rod) | cerulean-city-area (good-rod) | vermilion-city-area (good-rod) | celadon-city-area (good-rod) | fuchsia-city-area (good-rod) | pallet-town-area (good-rod) | kanto-route-6-area (good-rod) | kanto-route-10-area (good-rod) | kanto-route-11-area (good-rod) | kanto-route-13-area (good-rod) | kanto-route-17-area (good-rod) | kanto-route-18-area (good-rod) | kanto-sea-route-21-area (good-rod) | kanto-route-22-area (good-rod) | kanto-route-22-area (super-rod) | kanto-route-24-area (good-rod) | kanto-route-25-area (good-rod) | cerulean-cave-1f (good-rod) | cerulean-cave-b1f (good-rod) | kanto-route-23-area (good-rod) | kanto-route-23-area (super-rod) | kanto-safari-zone-middle (good-rod) | kanto-safari-zone-area-1-east (good-rod) | kanto-safari-zone-area-2-north (good-rod) | kanto-safari-zone-area-3-west (good-rod) -0061,Poliwhirl,Yellow,Evolve,N/A -0062,Poliwrath,Yellow,Evolve,N/A -0063,Abra,Yellow,Catchable,kanto-route-5-area (walk) | kanto-route-6-area (walk) | kanto-route-7-area (walk) | kanto-route-8-area (walk) -0064,Kadabra,Yellow,Evolve,N/A -0065,Alakazam,Yellow,Evolve,N/A -0066,Machop,Yellow,Catchable,rock-tunnel-b1f (walk) | kanto-route-10-area (walk) | rock-tunnel-b2f (walk) -0067,Machoke,Yellow,Evolve,N/A -0068,Machamp,Yellow,Evolve,N/A -0069,Bellsprout,Yellow,Catchable,kanto-route-12-area (walk) | kanto-route-13-area (walk) | kanto-route-14-area (walk) | kanto-route-15-area (walk) | kanto-route-24-area (walk) | kanto-route-25-area (walk) -0070,Weepinbell,Yellow,Evolve,N/A -0071,Victreebel,Yellow,Evolve,N/A -0072,Tentacool,Yellow,Catchable,seafoam-islands-b3f (surf) | seafoam-islands-b4f (surf) | kanto-sea-route-19-area (surf) | kanto-sea-route-19-area (super-rod) | kanto-sea-route-20-area (surf) | kanto-sea-route-20-area (super-rod) | cinnabar-island-area (super-rod) | vermilion-city-area (super-rod) | pallet-town-area (super-rod) | kanto-route-11-area (super-rod) | kanto-route-13-area (super-rod) | kanto-route-17-area (super-rod) | kanto-route-18-area (super-rod) | kanto-sea-route-21-area (surf) | kanto-sea-route-21-area (super-rod) | vermilion-city-ss-anne-dock (super-rod) -0073,Tentacruel,Yellow,Evolve,N/A -0074,Geodude,Yellow,Catchable,mt-moon-1f (walk) | rock-tunnel-b1f (walk) | mt-moon-b1f (walk) | mt-moon-b2f (walk) | rock-tunnel-b2f (walk) | kanto-victory-road-2-1f (walk) | kanto-victory-road-2-2f (walk) | kanto-victory-road-2-3f (walk) -0074,Geodude (Alolan Form),Ultra Sun,Catchable,Unknown -0075,Graveler,Yellow,Evolve,N/A -0075,Graveler (Alolan Form),Ultra Sun,Evolve,N/A -0076,Golem,Yellow,Evolve,N/A -0076,Golem (Alolan Form),Ultra Sun,Evolve,N/A -0077,Ponyta,Yellow,Catchable,kanto-route-17-area (walk) -0077,Ponyta (Galarian Form),Sword,Catchable,Unknown -0078,Rapidash,Yellow,Evolve,N/A -0078,Rapidash (Galarian Form),Sword,Evolve,N/A -0079,Slowpoke,Yellow,Catchable,seafoam-islands-1f (walk) | seafoam-islands-b1f (walk) | seafoam-islands-b2f (walk) | kanto-route-12-area (surf) | kanto-route-13-area (surf) -0079,Slowpoke (Galarian Form),Sword,Catchable,Unknown -0080,Slowbro,Yellow,Evolve,N/A -0080,Slowbro (Galarian Form),Sword,Evolve,N/A -0081,Magnemite,Yellow,Catchable,kanto-route-10-area (walk) | power-plant-area (walk) -0082,Magneton,Yellow,Evolve,N/A -0083,Farfetch'd,Yellow,Catchable,kanto-route-12-area (walk) | kanto-route-13-area (walk) -0083,Farfetch'd (Galarian Form),Sword,Catchable,Unknown -0084,Doduo,Yellow,Catchable,kanto-route-16-area (walk) | kanto-route-17-area (walk) | kanto-route-18-area (walk) -0085,Dodrio,Yellow,Evolve,N/A -0086,Seel,Yellow,Catchable,seafoam-islands-b1f (walk) | seafoam-islands-b2f (walk) | seafoam-islands-b3f (walk) | seafoam-islands-b4f (walk) -0087,Dewgong,Yellow,Evolve,N/A -0088,Grimer,Yellow,Catchable,power-plant-area (walk) | pokemon-mansion-1f (walk) | pokemon-mansion-2f (walk) | pokemon-mansion-3f (walk) | pokemon-mansion-b1f (walk) -0088,Grimer (Alolan Form),Ultra Sun,Catchable,Unknown -0089,Muk,Yellow,Evolve,N/A -0089,Muk (Alolan Form),Ultra Sun,Evolve,N/A -0090,Shellder,Yellow,Catchable,kanto-route-17-area (super-rod) | kanto-route-18-area (super-rod) | vermilion-city-ss-anne-dock (super-rod) -0091,Cloyster,Yellow,Evolve,N/A -0092,Gastly,Yellow,Catchable,pokemon-tower-3f (walk) | pokemon-tower-4f (walk) | pokemon-tower-5f (walk) | pokemon-tower-6f (walk) | pokemon-tower-7f (walk) -0093,Haunter,Yellow,Evolve,N/A -0094,Gengar,Yellow,Evolve,N/A -0095,Onix,Yellow,Catchable,rock-tunnel-b2f (walk) | kanto-victory-road-2-1f (walk) | kanto-victory-road-2-2f (walk) | kanto-victory-road-2-3f (walk) -0096,Drowzee,Yellow,Catchable,kanto-route-11-area (walk) -0097,Hypno,Yellow,Evolve,N/A -0098,Krabby,Yellow,Catchable,seafoam-islands-1f (walk) | seafoam-islands-b1f (walk) | seafoam-islands-b2f (walk) | seafoam-islands-b3f (walk) | seafoam-islands-b3f (super-rod) | seafoam-islands-b4f (walk) | seafoam-islands-b4f (super-rod) | kanto-route-10-area (super-rod) | kanto-route-25-area (super-rod) -0099,Kingler,Yellow,Evolve,N/A -0100,Voltorb,Yellow,Catchable,power-plant-area (walk) | power-plant-area (only-one) -0100,Voltorb (Hisuian Form),Legends: Arceus,Catchable,Unknown -0101,Electrode,Yellow,Evolve,N/A -0101,Electrode (Hisuian Form),Legends: Arceus,Evolve,N/A -0102,Exeggcute,Yellow,Catchable,kanto-safari-zone-middle (walk) | kanto-safari-zone-area-1-east (walk) | kanto-safari-zone-area-2-north (walk) | kanto-safari-zone-area-3-west (walk) -0103,Exeggutor,Yellow,Evolve,N/A -0103,Exeggutor (Alolan Form),Ultra Sun,Catchable,Unknown -0104,Cubone,Yellow,Catchable,pokemon-tower-5f (walk) | pokemon-tower-6f (walk) | pokemon-tower-7f (walk) | kanto-safari-zone-area-1-east (walk) | kanto-safari-zone-area-2-north (walk) | kanto-safari-zone-area-3-west (walk) -0105,Marowak,Yellow,Evolve,N/A -0105,Marowak (Alolan Form),Ultra Sun,Gift,N/A -0106,Hitmonlee,Yellow,Gift,N/A -0107,Hitmonchan,Yellow,Evolve,N/A -0108,Lickitung,Yellow,Catchable,cerulean-cave-b1f (walk) -0109,Koffing,Red,Catchable,pokemon-mansion-1f (walk) | pokemon-mansion-2f (walk) | pokemon-mansion-3f (walk) | pokemon-mansion-b1f (walk) -0110,Weezing,Red,Evolve,N/A -0110,Weezing (Galarian Form),Sword,Catchable,Unknown -0111,Rhyhorn,Yellow,Catchable,cerulean-cave-2f (walk) | cerulean-cave-b1f (walk) | kanto-safari-zone-middle (walk) | kanto-safari-zone-area-2-north (walk) -0112,Rhydon,Yellow,Evolve,N/A -0113,Chansey,Yellow,Catchable,cerulean-cave-b1f (walk) | kanto-safari-zone-middle (walk) | kanto-safari-zone-area-1-east (walk) -0114,Tangela,Yellow,Catchable,kanto-safari-zone-middle (walk) | kanto-safari-zone-area-3-west (walk)