From 85b92e26960e60720d410edfccb278e86445d9fa Mon Sep 17 00:00:00 2001 From: Alchav <59858495+Alchav@users.noreply.github.com> Date: Sun, 23 Jul 2023 18:46:54 -0400 Subject: [PATCH] =?UTF-8?q?Pok=C3=A9mon=20Red=20and=20Blue:=20Version=204?= =?UTF-8?q?=20update=20(#1963)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What is this fixing or adding? Adds a large number of new options, including: - Door Shuffle - Sphere-based level scaling - Key Item and Pokedex requirement options to reach the Elite Four - Split Card Key option - Dexsanity option can be set to a percentage of Pokémon that will be checks - Stonesanity: remove the stones from the Celadon Department Store and shuffle them into the item pool, replacing 4 of the 5 Moon Stone items - Sleep Trap items option - Randomize Move Types option - Town Map Fly Location option, to unlock a flight location when finding/receiving the Town Map Many enhancements have been made, including: - Game allows you to continue your save file _from Pallet Town_ as a way to save warp back to the beginning of the game. The one-way drop from Diglett's Cave to north Route 2 that had been added to the randomizer has been removed. - Client auto-hints some locations when you are able to see the item before you can obtain it (but would only show AP Item if it is for another player), including Bike Shop, Oak's Aides, Celadon Prize Corner, and the unchosen Fossil location. Various bugs have been fixed, including: - Route 13 wild Pokémon not correctly logically requiring Cut - Vanilla tm/hm compatibility options giving compatibility for many TMs/HMs erroneously - If an item that exists in multiple quantities in the item pool is chosen for one of the locations that are pre-filled with local items, it will continue placing that same item in the remaining locations as long as more of that item exist - `start_with` option for `randomize_pokedex` still shuffling a Pokédex into the item pool - The obedience threshold levels being incorrect with 0-2 badges, with Pokémon up to level 30 obeying with 0-1 badges and up to 10 with 2 badges - Receiving a DeathLink trigger in the Safari Zone causing issues. Now, you will have your steps remaining set to 0 instead of blacking out when you're in the Safari Zone. Many location names have been changed, as location names are automatically prepended using the Region name and a large number of areas have been split into new regions as part of the overhaul to add Door Shuffle. --- PokemonClient.py | 29 + setup.py | 1 - worlds/pokemon_rb/LICENSE | 2 +- worlds/pokemon_rb/__init__.py | 579 ++- worlds/pokemon_rb/basepatch_blue.bsdiff4 | Bin 38879 -> 45568 bytes worlds/pokemon_rb/basepatch_red.bsdiff4 | Bin 38928 -> 45587 bytes .../docs/en_Pokemon Red and Blue.md | 44 +- worlds/pokemon_rb/encounters.py | 275 ++ worlds/pokemon_rb/items.py | 76 +- worlds/pokemon_rb/level_scaling.py | 138 + worlds/pokemon_rb/locations.py | 3181 ++++++++++------- worlds/pokemon_rb/logic.py | 173 +- worlds/pokemon_rb/options.py | 323 +- worlds/pokemon_rb/poke_data.py | 31 +- worlds/pokemon_rb/pokemon.py | 348 ++ worlds/pokemon_rb/regions.py | 2645 ++++++++++++-- worlds/pokemon_rb/rom.py | 868 ++--- worlds/pokemon_rb/rom_addresses.py | 2569 ++++++++----- worlds/pokemon_rb/rules.py | 415 ++- worlds/pokemon_rb/text.py | 4 + 20 files changed, 8098 insertions(+), 3603 deletions(-) create mode 100644 worlds/pokemon_rb/encounters.py create mode 100644 worlds/pokemon_rb/level_scaling.py create mode 100644 worlds/pokemon_rb/pokemon.py diff --git a/PokemonClient.py b/PokemonClient.py index e7306d2b..ec653e96 100644 --- a/PokemonClient.py +++ b/PokemonClient.py @@ -29,6 +29,9 @@ for location in location_data: location_map[type(location.ram_address).__name__][location.ram_address.flag] = location.address location_bytes_bits[location.address] = {'byte': location.ram_address.byte, 'bit': location.ram_address.bit} +location_name_to_id = {location.name: location.address for location in location_data if location.type == "Item" + and location.address is not None} + SYSTEM_MESSAGE_ID = 0 CONNECTION_TIMING_OUT_STATUS = "Connection timing out. Please restart your emulator, then restart pkmn_rb.lua" @@ -72,6 +75,7 @@ class GBContext(CommonContext): self.items_handling = 0b001 self.sent_release = False self.sent_collect = False + self.auto_hints = set() async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: @@ -153,6 +157,31 @@ async def parse_locations(data: List, ctx: GBContext): locations.append(loc_id) elif flags[flag_type][location_bytes_bits[loc_id]['byte']] & 1 << location_bytes_bits[loc_id]['bit']: locations.append(loc_id) + + hints = [] + if flags["EventFlag"][280] & 16: + hints.append("Cerulean Bicycle Shop") + if flags["EventFlag"][280] & 32: + hints.append("Route 2 Gate - Oak's Aide") + if flags["EventFlag"][280] & 64: + hints.append("Route 11 Gate 2F - Oak's Aide") + if flags["EventFlag"][280] & 128: + hints.append("Route 15 Gate 2F - Oak's Aide") + if flags["EventFlag"][281] & 1: + hints += ["Celadon Prize Corner - Item Prize 1", "Celadon Prize Corner - Item Prize 2", + "Celadon Prize Corner - Item Prize 3"] + if (location_name_to_id["Fossil - Choice A"] in ctx.checked_locations and location_name_to_id["Fossil - Choice B"] + not in ctx.checked_locations): + hints.append("Fossil - Choice B") + elif (location_name_to_id["Fossil - Choice B"] in ctx.checked_locations and location_name_to_id["Fossil - Choice A"] + not in ctx.checked_locations): + hints.append("Fossil - Choice A") + hints = [location_name_to_id[loc] for loc in hints if loc not in ctx.auto_hints and location_name_to_id[loc] in + ctx.missing_locations and location_name_to_id[loc] not in ctx.locations_checked] + if hints: + await ctx.send_msgs([{"cmd": "LocationScouts", "locations": hints, "create_as_hint": 2}]) + ctx.auto_hints.update(hints) + if flags["EventFlag"][280] & 1 and not ctx.finished_game: await ctx.send_msgs([ {"cmd": "StatusUpdate", diff --git a/setup.py b/setup.py index c201c9d0..2af4bbde 100644 --- a/setup.py +++ b/setup.py @@ -77,7 +77,6 @@ non_apworlds: set = { "Meritous", "Ocarina of Time", "Overcooked! 2", - "Pokemon Red and Blue", "Raft", "Secret of Evermore", "Slay the Spire", diff --git a/worlds/pokemon_rb/LICENSE b/worlds/pokemon_rb/LICENSE index 0dc1b2dc..7ac515f4 100644 --- a/worlds/pokemon_rb/LICENSE +++ b/worlds/pokemon_rb/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Alex "Alchav" Avery +Copyright (c) 2022-2023 Alex "Alchav" Avery Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/worlds/pokemon_rb/__init__.py b/worlds/pokemon_rb/__init__.py index 2497c2de..791eb233 100644 --- a/worlds/pokemon_rb/__init__.py +++ b/worlds/pokemon_rb/__init__.py @@ -1,26 +1,27 @@ import os import settings import typing - +import threading from copy import deepcopy from typing import TextIO -from BaseClasses import Item, MultiWorld, Tutorial, ItemClassification +from BaseClasses import Item, MultiWorld, Tutorial, ItemClassification, LocationProgressType from Fill import fill_restrictive, FillError, sweep_from_pool from ..AutoWorld import World, WebWorld from ..generic.Rules import add_item_rule from .items import item_table, item_groups from .locations import location_data, PokemonRBLocation from .regions import create_regions -from .logic import PokemonLogic from .options import pokemon_rb_options from .rom_addresses import rom_addresses from .text import encode_text -from .rom import generate_output, get_base_rom_bytes, get_base_rom_path, process_pokemon_data, process_wild_pokemon,\ - process_static_pokemon, process_move_data, RedDeltaPatch, BlueDeltaPatch +from .rom import generate_output, get_base_rom_bytes, get_base_rom_path, RedDeltaPatch, BlueDeltaPatch +from .pokemon import process_pokemon_data, process_move_data +from .encounters import process_pokemon_locations, process_trainer_data from .rules import set_rules - -import worlds.pokemon_rb.poke_data as poke_data +from .level_scaling import level_scaling +from . import logic +from . import poke_data class PokemonSettings(settings.Group): @@ -67,10 +68,10 @@ class PokemonRedBlueWorld(World): option_definitions = pokemon_rb_options settings: typing.ClassVar[PokemonSettings] - data_version = 8 + data_version = 9 required_client_version = (0, 3, 9) - topology_present = False + topology_present = True item_name_to_id = {name: data.id for name, data in item_table.items()} location_name_to_id = {location.name: location.address for location in location_data if location.type == "Item" @@ -81,8 +82,12 @@ class PokemonRedBlueWorld(World): def __init__(self, world: MultiWorld, player: int): super().__init__(world, player) + self.item_pool = [] + self.total_key_items = None self.fly_map = None self.fly_map_code = None + self.town_map_fly_map = None + self.town_map_fly_map_code = None self.extra_badges = {} self.type_chart = None self.local_poke_data = None @@ -94,6 +99,9 @@ class PokemonRedBlueWorld(World): self.type_chart = None self.traps = None self.trade_mons = {} + self.finished_level_scaling = threading.Event() + self.dexsanity_table = [] + self.local_locs = [] @classmethod def stage_assert_generate(cls, multiworld: MultiWorld): @@ -125,11 +133,14 @@ class PokemonRedBlueWorld(World): if len(self.multiworld.player_name[self.player].encode()) > 16: raise Exception(f"Player name too long for {self.multiworld.get_player_name(self.player)}. Player name cannot exceed 16 bytes for Pokémon Red and Blue.") - if (self.multiworld.dexsanity[self.player] and self.multiworld.accessibility[self.player] == "locations" - and (self.multiworld.catch_em_all[self.player] != "all_pokemon" - or self.multiworld.randomize_wild_pokemon[self.player] == "vanilla" - or self.multiworld.randomize_legendary_pokemon[self.player] != "any")): - self.multiworld.accessibility[self.player] = self.multiworld.accessibility[self.player].from_text("items") + if not self.multiworld.badgesanity[self.player]: + self.multiworld.non_local_items[self.player].value -= self.item_name_groups["Badges"] + + if self.multiworld.key_items_only[self.player]: + self.multiworld.trainersanity[self.player] = self.multiworld.trainersanity[self.player].from_text("off") + self.multiworld.dexsanity[self.player] = self.multiworld.dexsanity[self.player].from_text("false") + self.multiworld.randomize_hidden_items[self.player] = \ + self.multiworld.randomize_hidden_items[self.player].from_text("off") if self.multiworld.badges_needed_for_hm_moves[self.player].value >= 2: badges_to_add = ["Marsh Badge", "Volcano Badge", "Earth Badge"] @@ -161,9 +172,14 @@ class PokemonRedBlueWorld(World): not_very_effectives = self.multiworld.not_very_effective_matchups[self.player].value normals = self.multiworld.normal_matchups[self.player].value while super_effectives + not_very_effectives + normals < 225 - immunities: - super_effectives += self.multiworld.super_effective_matchups[self.player].value - not_very_effectives += self.multiworld.not_very_effective_matchups[self.player].value - normals += self.multiworld.normal_matchups[self.player].value + if super_effectives == not_very_effectives == normals == 0: + super_effectives = 225 + not_very_effectives = 225 + normals = 225 + else: + super_effectives += self.multiworld.super_effective_matchups[self.player].value + not_very_effectives += self.multiworld.not_very_effective_matchups[self.player].value + normals += self.multiworld.normal_matchups[self.player].value if super_effectives + not_very_effectives + normals > 225 - immunities: total = super_effectives + not_very_effectives + normals excess = total - (225 - immunities) @@ -209,143 +225,228 @@ class PokemonRedBlueWorld(World): # damage being reduced by 1 which leads to a "not very effective" message appearing due to my changes # to the way effectiveness messages are generated. self.type_chart = sorted(chart, key=lambda matchup: -matchup[2]) - self.multiworld.early_items[self.player]["Exp. All"] = 1 - def create_items(self) -> None: - start_inventory = self.multiworld.start_inventory[self.player].value.copy() - if self.multiworld.randomize_pokedex[self.player] == "start_with": - start_inventory["Pokedex"] = 1 - self.multiworld.push_precollected(self.create_item("Pokedex")) + self.dexsanity_table = [ + *(True for _ in range(round(self.multiworld.dexsanity[self.player].value * 1.51))), + *(False for _ in range(151 - round(self.multiworld.dexsanity[self.player].value * 1.51))) + ] + self.multiworld.random.shuffle(self.dexsanity_table) - locations = [location for location in location_data if location.type == "Item"] - item_pool = [] - combined_traps = (self.multiworld.poison_trap_weight[self.player].value - + self.multiworld.fire_trap_weight[self.player].value - + self.multiworld.paralyze_trap_weight[self.player].value - + self.multiworld.ice_trap_weight[self.player].value) - for location in locations: - event = location.event - if not location.inclusion(self.multiworld, self.player): + def create_items(self): + self.multiworld.itempool += self.item_pool + + @classmethod + def stage_fill_hook(cls, multiworld, progitempool, usefulitempool, filleritempool, fill_locations): + locs = [] + for world in multiworld.get_game_worlds("Pokemon Red and Blue"): + locs += world.local_locs + for loc in sorted(locs): + if loc.item: continue - if location.original_item in self.multiworld.start_inventory[self.player].value and \ - location.original_item in item_groups["Unique"]: - start_inventory[location.original_item] -= 1 - item = self.create_filler() - elif location.original_item is None: - item = self.create_filler() - elif location.original_item == "Pokedex": - if self.multiworld.randomize_pokedex[self.player] == "vanilla": - self.multiworld.get_location(location.name, self.player).event = True - event = True - item = self.create_item("Pokedex") - elif location.original_item.startswith("TM"): - if self.multiworld.randomize_tm_moves[self.player]: - item = self.create_item(location.original_item.split(" ")[0]) + itempool = progitempool + usefulitempool + filleritempool + multiworld.random.shuffle(itempool) + unplaced_items = [] + for item in itempool: + if item.player == loc.player and loc.can_fill(multiworld.state, item, False): + if item in progitempool: + progitempool.remove(item) + elif item in usefulitempool: + usefulitempool.remove(item) + elif item in filleritempool: + filleritempool.remove(item) + if item.advancement: + state = sweep_from_pool(multiworld.state, progitempool + unplaced_items) + if (not item.advancement) or state.can_reach(loc, "Location", loc.player): + multiworld.push_item(loc, item, False) + loc.event = item.advancement + fill_locations.remove(loc) + break + else: + unplaced_items.append(item) + progitempool += [item for item in unplaced_items if item.advancement] + usefulitempool += [item for item in unplaced_items if item.useful] + filleritempool += [item for item in unplaced_items if (not item.advancement) and (not item.useful)] + + def fill_hook(self, progitempool, usefulitempool, filleritempool, fill_locations): + if not self.multiworld.badgesanity[self.player]: + # Door Shuffle options besides Simple place badges during door shuffling + if not self.multiworld.door_shuffle[self.player] not in ("off", "simple"): + badges = [item for item in progitempool if "Badge" in item.name and item.player == self.player] + for badge in badges: + self.multiworld.itempool.remove(badge) + progitempool.remove(badge) + for _ in range(5): + badgelocs = [self.multiworld.get_location(loc, self.player) for loc in [ + "Pewter Gym - Brock Prize", "Cerulean Gym - Misty Prize", + "Vermilion Gym - Lt. Surge Prize", "Celadon Gym - Erika Prize", + "Fuchsia Gym - Koga Prize", "Saffron Gym - Sabrina Prize", + "Cinnabar Gym - Blaine Prize", "Viridian Gym - Giovanni Prize"]] + state = self.multiworld.get_all_state(False) + self.multiworld.random.shuffle(badges) + self.multiworld.random.shuffle(badgelocs) + badgelocs_copy = badgelocs.copy() + # allow_partial so that unplaced badges aren't lost, for debugging purposes + fill_restrictive(self.multiworld, state, badgelocs_copy, badges, True, True, allow_partial=True) + if badges: + for location in badgelocs: + if location.item: + badges.append(location.item) + location.item = None + continue + else: + for location in badgelocs: + if location.item: + fill_locations.remove(location) + break else: - item = self.create_item(location.original_item) - else: - item = self.create_item(location.original_item) - if (item.classification == ItemClassification.filler and self.multiworld.random.randint(1, 100) - <= self.multiworld.trap_percentage[self.player].value and combined_traps != 0): - item = self.create_item(self.select_trap()) - if event: - self.multiworld.get_location(location.name, self.player).place_locked_item(item) - elif "Badge" not in item.name or self.multiworld.badgesanity[self.player].value: - item_pool.append(item) + raise FillError(f"Failed to place badges for player {self.player}") - self.multiworld.random.shuffle(item_pool) + if self.multiworld.key_items_only[self.player]: + return - self.multiworld.itempool += item_pool + tms = [item for item in usefulitempool + filleritempool if item.name.startswith("TM") and (item.player == + self.player or (item.player in self.multiworld.groups and self.player in + self.multiworld.groups[item.player]["players"]))] + if len(tms) > 7: + for gym_leader in (("Pewter Gym", "Brock"), ("Cerulean Gym", "Misty"), ("Vermilion Gym", "Lt. Surge"), + ("Celadon Gym-C", "Erika"), ("Fuchsia Gym", "Koga"), ("Saffron Gym-C", "Sabrina"), + ("Cinnabar Gym", "Blaine"), ("Viridian Gym", "Giovanni")): + loc = self.multiworld.get_location(f"{gym_leader[0].split('-')[0]} - {gym_leader[1]} TM", + self.player) + if loc.item: + continue + for party in self.multiworld.get_location(gym_leader[0] + " - Trainer Parties", self.player).party_data: + if party["party_address"] == \ + f"Trainer_Party_{gym_leader[1].replace('. ', '').replace('Giovanni', 'Viridian_Gym_Giovanni')}_A": + mon = party["party"][-1] + learnable_tms = [tm for tm in tms if self.local_poke_data[mon]["tms"][ + int((int(tm.name[2:4]) - 1) / 8)] & 1 << ((int(tm.name[2:4]) - 1) % 8)] + if not learnable_tms: + learnable_tms = tms + tm = self.multiworld.random.choice(learnable_tms) + + loc.place_locked_item(tm) + fill_locations.remove(loc) + tms.remove(tm) + if tm.useful: + usefulitempool.remove(tm) + else: + filleritempool.remove(tm) + break + else: + raise Exception("Missing Gym Leader data") def pre_fill(self) -> None: - process_wild_pokemon(self) - process_static_pokemon(self) - pokemon_locs = [location.name for location in location_data if location.type != "Item"] + process_pokemon_locations(self) + process_trainer_data(self) + locs = [location.name for location in location_data if location.type != "Item"] for location in self.multiworld.get_locations(self.player): - if location.name in pokemon_locs: - location.show_in_spoiler = False + if location.name in locs: + location.show_in_spoiler = False - def intervene(move): - accessible_slots = [loc for loc in self.multiworld.get_reachable_locations(test_state, self.player) if loc.type == "Wild Encounter"] - move_bit = pow(2, poke_data.hm_moves.index(move) + 2) - viable_mons = [mon for mon in self.local_poke_data if self.local_poke_data[mon]["tms"][6] & move_bit] - placed_mons = [slot.item.name for slot in accessible_slots] - # this sort method doesn't seem to work if you reference the same list being sorted in the lambda - placed_mons_copy = placed_mons.copy() - placed_mons.sort(key=lambda i: placed_mons_copy.count(i)) - placed_mon = placed_mons.pop() - if self.multiworld.area_1_to_1_mapping[self.player]: - zone = " - ".join(placed_mon.split(" - ")[:-1]) - replace_slots = [slot for slot in accessible_slots if slot.name.startswith(zone) and slot.item.name == - placed_mon] + def intervene(move, test_state): + if self.multiworld.randomize_wild_pokemon[self.player]: + accessible_slots = [loc for loc in self.multiworld.get_reachable_locations(test_state, self.player) if + loc.type == "Wild Encounter"] + + def number_of_zones(mon): + zones = set() + for loc in [slot for slot in accessible_slots if slot.item.name == mon]: + zones.add(loc.name.split(" - ")[0]) + return len(zones) + + move_bit = pow(2, poke_data.hm_moves.index(move) + 2) + viable_mons = [mon for mon in self.local_poke_data if self.local_poke_data[mon]["tms"][6] & move_bit] + placed_mons = [slot.item.name for slot in accessible_slots] + + if self.multiworld.area_1_to_1_mapping[self.player]: + placed_mons.sort(key=lambda i: number_of_zones(i)) + else: + # this sort method doesn't work if you reference the same list being sorted in the lambda + placed_mons_copy = placed_mons.copy() + placed_mons.sort(key=lambda i: placed_mons_copy.count(i)) + + placed_mon = placed_mons.pop() + replace_mon = self.multiworld.random.choice(viable_mons) + replace_slot = self.multiworld.random.choice([slot for slot in accessible_slots if slot.item.name + == placed_mon]) + if self.multiworld.area_1_to_1_mapping[self.player]: + zone = " - ".join(replace_slot.name.split(" - ")[:-1]) + replace_slots = [slot for slot in accessible_slots if slot.name.startswith(zone) and slot.item.name + == placed_mon] + for replace_slot in replace_slots: + replace_slot.item = self.create_item(replace_mon) + else: + replace_slot.item = self.create_item(replace_mon) else: - replace_slots = [self.multiworld.random.choice([slot for slot in accessible_slots if slot.item.name == - placed_mon])] - replace_mon = self.multiworld.random.choice(viable_mons) - for replace_slot in replace_slots: - replace_slot.item = self.create_item(replace_mon) + tms_hms = self.local_tms + poke_data.hm_moves + flag = tms_hms.index(move) + mon_list = [mon for mon in poke_data.pokemon_data.keys() if test_state.has(mon, self.player)] + self.multiworld.random.shuffle(mon_list) + mon_list.sort(key=lambda mon: self.local_move_data[move]["type"] not in + [self.local_poke_data[mon]["type1"], self.local_poke_data[mon]["type2"]]) + for mon in mon_list: + if test_state.has(mon, self.player): + self.local_poke_data[mon]["tms"][int(flag / 8)] |= 1 << (flag % 8) + break + last_intervene = None while True: intervene_move = None test_state = self.multiworld.get_all_state(False) - if not self.multiworld.badgesanity[self.player]: - for badge in ["Boulder Badge", "Cascade Badge", "Thunder Badge", "Rainbow Badge", "Soul Badge", - "Marsh Badge", "Volcano Badge", "Earth Badge"]: - test_state.collect(self.create_item(badge)) - if not test_state.pokemon_rb_can_surf(self.player): + if not logic.can_learn_hm(test_state, "Surf", self.player): intervene_move = "Surf" - if not test_state.pokemon_rb_can_strength(self.player): + elif not logic.can_learn_hm(test_state, "Strength", self.player): intervene_move = "Strength" # cut may not be needed if accessibility is minimal, unless you need all 8 badges and badgesanity is off, # as you will require cut to access celadon gyn - if (self.multiworld.accessibility[self.player] != "minimal" or ((not - self.multiworld.badgesanity[self.player]) and max(self.multiworld.elite_four_condition[self.player], - self.multiworld.victory_road_condition[self.player]) > 7)): - if not test_state.pokemon_rb_can_cut(self.player): - intervene_move = "Cut" - if (self.multiworld.accessibility[self.player].current_key != "minimal" and - (self.multiworld.trainersanity[self.player] or self.multiworld.extra_key_items[self.player])): - if not test_state.pokemon_rb_can_flash(self.player): - intervene_move = "Flash" + elif ((not logic.can_learn_hm(test_state, "Cut", self.player)) and + (self.multiworld.accessibility[self.player] != "minimal" or ((not + self.multiworld.badgesanity[self.player]) and max( + self.multiworld.elite_four_badges_condition[self.player], + self.multiworld.route_22_gate_condition[self.player], + self.multiworld.victory_road_condition[self.player]) + > 7) or (self.multiworld.door_shuffle[self.player] not in ("off", "simple")))): + intervene_move = "Cut" + elif ((not logic.can_learn_hm(test_state, "Flash", self.player)) and self.multiworld.dark_rock_tunnel_logic[self.player] + and (((self.multiworld.accessibility[self.player] != "minimal" and + (self.multiworld.trainersanity[self.player] or self.multiworld.extra_key_items[self.player])) or + self.multiworld.door_shuffle[self.player]))): + intervene_move = "Flash" + # If no Pokémon can learn Fly, then during door shuffle it would simply not treat the free fly maps + # as reachable, and if on no door shuffle or simple, fly is simply never necessary. + # We only intervene if a Pokémon is able to learn fly but none are reachable, as that would have been + # considered in door shuffle. + elif ((not logic.can_learn_hm(test_state, "Fly", self.player)) and logic.can_learn_hm(test_state, "Fly", self.player) + and self.multiworld.door_shuffle[self.player] not in + ("off", "simple") and [self.fly_map, self.town_map_fly_map] != ["Pallet Town", "Pallet Town"]): + intervene_move = "Fly" if intervene_move: if intervene_move == last_intervene: raise Exception(f"Caught in infinite loop attempting to ensure {intervene_move} is available to player {self.player}") - intervene(intervene_move) + intervene(intervene_move, test_state) last_intervene = intervene_move else: break + # Delete evolution events for Pokémon that are not in logic in an all_state so that accessibility check does not + # fail. Re-use test_state from previous final loop. + evolutions_region = self.multiworld.get_region("Evolution", self.player) + clear_cache = False + for location in evolutions_region.locations.copy(): + if not test_state.can_reach(location, player=self.player): + evolutions_region.locations.remove(location) + clear_cache = True + if clear_cache: + self.multiworld.clear_location_cache() + if self.multiworld.old_man[self.player] == "early_parcel": self.multiworld.local_early_items[self.player]["Oak's Parcel"] = 1 if self.multiworld.dexsanity[self.player]: - for location in [self.multiworld.get_location(f"Pokedex - {mon}", self.player) - for mon in poke_data.pokemon_data.keys()]: - add_item_rule(location, lambda item: item.name != "Oak's Parcel" or item.player != self.player) - - if not self.multiworld.badgesanity[self.player].value: - self.multiworld.non_local_items[self.player].value -= self.item_name_groups["Badges"] - for i in range(5): - try: - badges = [] - badgelocs = [] - for badge in ["Boulder Badge", "Cascade Badge", "Thunder Badge", "Rainbow Badge", "Soul Badge", - "Marsh Badge", "Volcano Badge", "Earth Badge"]: - badges.append(self.create_item(badge)) - for loc in ["Pewter Gym - Brock 1", "Cerulean Gym - Misty 1", "Vermilion Gym - Lt. Surge 1", - "Celadon Gym - Erika 1", "Fuchsia Gym - Koga 1", "Saffron Gym - Sabrina 1", - "Cinnabar Gym - Blaine 1", "Viridian Gym - Giovanni 1"]: - badgelocs.append(self.multiworld.get_location(loc, self.player)) - state = self.multiworld.get_all_state(False) - self.multiworld.random.shuffle(badges) - self.multiworld.random.shuffle(badgelocs) - fill_restrictive(self.multiworld, state, badgelocs.copy(), badges, True, True) - except FillError: - for location in badgelocs: - location.item = None - continue - break - else: - raise FillError(f"Failed to place badges for player {self.player}") + for i, mon in enumerate(poke_data.pokemon_data): + if self.dexsanity_table[i]: + location = self.multiworld.get_location(f"Pokedex - {mon}", self.player) + add_item_rule(location, lambda item: item.name != "Oak's Parcel" or item.player != self.player) # Place local items in some locations to prevent save-scumming. Also Oak's PC to prevent an "AP Item" from # entering the player's inventory. @@ -353,52 +454,144 @@ class PokemonRedBlueWorld(World): locs = {self.multiworld.get_location("Fossil - Choice A", self.player), self.multiworld.get_location("Fossil - Choice B", self.player)} - if self.multiworld.dexsanity[self.player]: - for mon in ([" ".join(self.multiworld.get_location( - f"Pallet Town - Starter {i}", self.player).item.name.split(" ")[1:]) for i in range(1, 4)] - + [" ".join(self.multiworld.get_location( - f"Fighting Dojo - Gift {i}", self.player).item.name.split(" ")[1:]) for i in range(1, 3)]): + for loc in locs: + if self.multiworld.fossil_check_item_types[self.player] == "key_items": + add_item_rule(loc, lambda i: i.advancement) + elif self.multiworld.fossil_check_item_types[self.player] == "unique_items": + add_item_rule(loc, lambda i: i.name in item_groups["Unique"]) + elif self.multiworld.fossil_check_item_types[self.player] == "no_key_items": + add_item_rule(loc, lambda i: not i.advancement) + + for mon in ([" ".join(self.multiworld.get_location( + f"Oak's Lab - Starter {i}", self.player).item.name.split(" ")[1:]) for i in range(1, 4)] + + [" ".join(self.multiworld.get_location( + f"Saffron Fighting Dojo - Gift {i}", self.player).item.name.split(" ")[1:]) for i in range(1, 3)] + + ["Vaporeon", "Jolteon", "Flareon"]): + if self.dexsanity_table[poke_data.pokemon_dex[mon] - 1]: loc = self.multiworld.get_location(f"Pokedex - {mon}", self.player) if loc.item is None: locs.add(loc) - loc = self.multiworld.get_location("Pallet Town - Player's PC", self.player) - if loc.item is None: - locs.add(loc) + if not self.multiworld.key_items_only[self.player]: + loc = self.multiworld.get_location("Player's House 2F - Player's PC", self.player) + if loc.item is None: + locs.add(loc) for loc in sorted(locs): - unplaced_items = [] if loc.name in self.multiworld.priority_locations[self.player].value: add_item_rule(loc, lambda i: i.advancement) - for item in reversed(self.multiworld.itempool): - if item.player == self.player and loc.can_fill(self.multiworld.state, item, False): - self.multiworld.itempool.remove(item) - if item.advancement: - state = sweep_from_pool(self.multiworld.state, self.multiworld.itempool + unplaced_items) - if (not item.advancement) or state.can_reach(loc, "Location", self.player): - loc.place_locked_item(item) - break + add_item_rule(loc, lambda i: i.player == self.player) + if self.multiworld.old_man[self.player] == "early_parcel" and loc.name != "Player's House 2F - Player's PC": + add_item_rule(loc, lambda i: i.name != "Oak's Parcel") + + self.local_locs = locs + + all_state = self.multiworld.get_all_state(False) + + reachable_mons = set() + for mon in poke_data.pokemon_data: + if all_state.has(mon, self.player) or all_state.has(f"Static {mon}", self.player): + reachable_mons.add(mon) + + # The large number of wild Pokemon can make sweeping for events time-consuming, and is especially bad in + # the spoiler playthrough calculation because it removes each advancement item one at a time to verify + # if the game is beatable without it. We go through each zone and flag any duplicates as useful. + # Especially with area 1-to-1 mapping / vanilla wild Pokémon, this should cut down significantly on wasted time. + for region in self.multiworld.get_regions(self.player): + region_mons = set() + for location in region.locations: + if "Wild Pokemon" in location.name: + if location.item.name in region_mons: + location.item.classification = ItemClassification.useful else: - unplaced_items.append(item) - self.multiworld.itempool += unplaced_items + region_mons.add(location.item.name) + + self.multiworld.elite_four_pokedex_condition[self.player].total = \ + int((len(reachable_mons) / 100) * self.multiworld.elite_four_pokedex_condition[self.player].value) + + if self.multiworld.accessibility[self.player] == "locations": + balls = [self.create_item(ball) for ball in ["Poke Ball", "Great Ball", "Ultra Ball"]] + traps = [self.create_item(trap) for trap in item_groups["Traps"]] + locations = [location for location in self.multiworld.get_locations(self.player) if "Pokedex - " in + location.name] + pokedex = self.multiworld.get_region("Pokedex", self.player) + remove_items = 0 + + for location in locations: + if not location.can_reach(all_state): + pokedex.locations.remove(location) + self.dexsanity_table[poke_data.pokemon_dex[location.name.split(" - ")[1]] - 1] = False + remove_items += 1 + + for _ in range(remove_items - 5): + balls.append(balls.pop(0)) + for ball in balls: + try: + self.multiworld.itempool.remove(ball) + except ValueError: + continue + else: + break + else: + self.multiworld.random.shuffle(traps) + for trap in traps: + try: + self.multiworld.itempool.remove(trap) + except ValueError: + continue + else: + break + else: + raise Exception("Failed to remove corresponding item while deleting unreachable Dexsanity location") + + self.multiworld._recache() + + if self.multiworld.door_shuffle[self.player] == "decoupled": + swept_state = self.multiworld.state.copy() + swept_state.sweep_for_events(player=self.player) + locations = [location for location in + self.multiworld.get_reachable_locations(swept_state, self.player) if location.item is + None] + self.multiworld.random.shuffle(locations) + while len(locations) > 10: + location = locations.pop() + location.progress_type = LocationProgressType.EXCLUDED + + if self.multiworld.key_items_only[self.player]: + locations = [location for location in self.multiworld.get_unfilled_locations(self.player) if + location.progress_type == LocationProgressType.DEFAULT] + for location in locations: + location.progress_type = LocationProgressType.PRIORITY def create_regions(self): - if self.multiworld.free_fly_location[self.player].value: - if self.multiworld.old_man[self.player].value == 0: - fly_map_code = self.multiworld.random.randint(1, 9) - else: - fly_map_code = self.multiworld.random.randint(5, 9) - if fly_map_code == 5: - fly_map_code = 4 - if fly_map_code == 9: - fly_map_code = 10 + if (self.multiworld.old_man[self.player] == "vanilla" or + self.multiworld.door_shuffle[self.player] in ("full", "insanity")): + fly_map_codes = self.multiworld.random.sample(range(2, 11), 2) + elif (self.multiworld.door_shuffle[self.player] == "simple" or + self.multiworld.route_3_condition[self.player] == "boulder_badge" or + (self.multiworld.route_3_condition[self.player] == "any_badge" and + self.multiworld.badgesanity[self.player])): + fly_map_codes = self.multiworld.random.sample(range(3, 11), 2) + + else: + fly_map_codes = self.multiworld.random.sample([4, 6, 7, 8, 9, 10], 2) + if self.multiworld.free_fly_location[self.player]: + fly_map_code = fly_map_codes[0] else: fly_map_code = 0 - self.fly_map = ["Pallet Town", "Viridian City", "Pewter City", "Cerulean City", "Lavender Town", - "Vermilion City", "Celadon City", "Fuchsia City", "Cinnabar Island", "Indigo Plateau", - "Saffron City"][fly_map_code] + if self.multiworld.town_map_fly_location[self.player]: + town_map_fly_map_code = fly_map_codes[1] + else: + town_map_fly_map_code = 0 + fly_maps = ["Pallet Town", "Viridian City", "Pewter City", "Cerulean City", "Lavender Town", + "Vermilion City", "Celadon City", "Fuchsia City", "Cinnabar Island", "Indigo Plateau", + "Saffron City"] + self.fly_map = fly_maps[fly_map_code] + self.town_map_fly_map = fly_maps[town_map_fly_map_code] self.fly_map_code = fly_map_code - create_regions(self.multiworld, self.player) + self.town_map_fly_map_code = town_map_fly_map_code + + create_regions(self) self.multiworld.completion_condition[self.player] = lambda state, player=self.player: state.has("Become Champion", player=player) def set_rules(self): @@ -407,12 +600,21 @@ class PokemonRedBlueWorld(World): def create_item(self, name: str) -> Item: return PokemonRBItem(name, self.player) + @classmethod + def stage_generate_output(cls, multiworld, output_directory): + level_scaling(multiworld) + def generate_output(self, output_directory: str): generate_output(self, output_directory) def write_spoiler_header(self, spoiler_handle: TextIO): - if self.multiworld.free_fly_location[self.player].value: - spoiler_handle.write('Fly unlocks: %s\n' % self.fly_map) + spoiler_handle.write(f"Cerulean Cave Total Key Items: {self.multiworld.cerulean_cave_key_items_condition[self.player].total}\n") + spoiler_handle.write(f"Elite Four Total Key Items: {self.multiworld.elite_four_key_items_condition[self.player].total}\n") + spoiler_handle.write(f"Elite Four Total Pokemon: {self.multiworld.elite_four_pokedex_condition[self.player].total}\n") + if self.multiworld.free_fly_location[self.player]: + spoiler_handle.write(f"Free Fly Location: {self.fly_map}\n") + if self.multiworld.town_map_fly_location[self.player]: + spoiler_handle.write(f"Town Map Fly Location: {self.town_map_fly_map}\n") if self.extra_badges: for hm_move, badge in self.extra_badges.items(): spoiler_handle.write(hm_move + " enabled by: " + (" " * 20)[:20 - len(hm_move)] + badge + "\n") @@ -423,20 +625,30 @@ class PokemonRedBlueWorld(World): for matchup in self.type_chart: spoiler_handle.write(f"{matchup[0]} deals {matchup[2] * 10}% damage to {matchup[1]}\n") spoiler_handle.write(f"\n\nPokémon locations ({self.multiworld.player_name[self.player]}):\n\n") - pokemon_locs = [location.name for location in location_data if location.type != "Item"] + pokemon_locs = [location.name for location in location_data if location.type not in ("Item", "Trainer Parties")] for location in self.multiworld.get_locations(self.player): if location.name in pokemon_locs: spoiler_handle.write(location.name + ": " + location.item.name + "\n") - def get_filler_item_name(self) -> str: - combined_traps = self.multiworld.poison_trap_weight[self.player].value + self.multiworld.fire_trap_weight[self.player].value + self.multiworld.paralyze_trap_weight[self.player].value + self.multiworld.ice_trap_weight[self.player].value - if self.multiworld.random.randint(1, 100) <= self.multiworld.trap_percentage[self.player].value and combined_traps != 0: + combined_traps = (self.multiworld.poison_trap_weight[self.player].value + + self.multiworld.fire_trap_weight[self.player].value + + self.multiworld.paralyze_trap_weight[self.player].value + + self.multiworld.ice_trap_weight[self.player].value + + self.multiworld.sleep_trap_weight[self.player].value) + if (combined_traps > 0 and + self.multiworld.random.randint(1, 100) <= self.multiworld.trap_percentage[self.player].value): return self.select_trap() - - return self.multiworld.random.choice([item for item in item_table if item_table[ - item].classification == ItemClassification.filler and item not in item_groups["Vending Machine Drinks"] + - item_groups["Unique"]]) + banned_items = item_groups["Unique"] + if (((not self.multiworld.tea[self.player]) or "Saffron City" not in [self.fly_map, self.town_map_fly_map]) + and (not self.multiworld.door_shuffle[self.player])): + # under these conditions, you should never be able to reach the Copycat or Pokémon Tower without being + # able to reach the Celadon Department Store, so Poké Dolls would not allow early access to anything + banned_items.append("Poke Doll") + if not self.multiworld.tea[self.player]: + banned_items += item_groups["Vending Machine Drinks"] + return self.multiworld.random.choice([item for item in item_table if item_table[item].id and item_table[ + item].classification == ItemClassification.filler and item not in banned_items]) def select_trap(self): if self.traps is None: @@ -445,23 +657,30 @@ class PokemonRedBlueWorld(World): self.traps += ["Fire Trap"] * self.multiworld.fire_trap_weight[self.player].value self.traps += ["Paralyze Trap"] * self.multiworld.paralyze_trap_weight[self.player].value self.traps += ["Ice Trap"] * self.multiworld.ice_trap_weight[self.player].value + self.traps += ["Sleep Trap"] * self.multiworld.sleep_trap_weight[self.player].value return self.multiworld.random.choice(self.traps) def extend_hint_information(self, hint_data): - if self.multiworld.dexsanity[self.player]: + if self.multiworld.dexsanity[self.player] or self.multiworld.door_shuffle[self.player]: hint_data[self.player] = {} + if self.multiworld.dexsanity[self.player]: mon_locations = {mon: set() for mon in poke_data.pokemon_data.keys()} - for loc in location_data: #self.multiworld.get_locations(self.player): + for loc in location_data: if loc.type in ["Wild Encounter", "Static Pokemon", "Legendary Pokemon", "Missable Pokemon"]: mon = self.multiworld.get_location(loc.name, self.player).item.name if mon.startswith("Static ") or mon.startswith("Missable "): mon = " ".join(mon.split(" ")[1:]) mon_locations[mon].add(loc.name.split(" -")[0]) - for mon in mon_locations: - if mon_locations[mon]: - hint_data[self.player][self.multiworld.get_location(f"Pokedex - {mon}", self.player).address] = \ + for i, mon in enumerate(mon_locations): + if self.dexsanity_table[i] and mon_locations[mon]: + hint_data[self.player][self.multiworld.get_location(f"Pokedex - {mon}", self.player).address] =\ ", ".join(mon_locations[mon]) + if self.multiworld.door_shuffle[self.player]: + for location in self.multiworld.get_locations(self.player): + if location.parent_region.entrance_hint and location.address: + hint_data[self.player][location.address] = location.parent_region.entrance_hint + def fill_slot_data(self) -> dict: return { "second_fossil_check_condition": self.multiworld.second_fossil_check_condition[self.player].value, @@ -475,17 +694,25 @@ class PokemonRedBlueWorld(World): "extra_strength_boulders": self.multiworld.extra_strength_boulders[self.player].value, "tea": self.multiworld.tea[self.player].value, "old_man": self.multiworld.old_man[self.player].value, - "elite_four_condition": self.multiworld.elite_four_condition[self.player].value, + "elite_four_badges_condition": self.multiworld.elite_four_badges_condition[self.player].value, + "elite_four_key_items_condition": self.multiworld.elite_four_key_items_condition[self.player].total, + "elite_four_pokedex_condition": self.multiworld.elite_four_pokedex_condition[self.player].total, "victory_road_condition": self.multiworld.victory_road_condition[self.player].value, + "route_22_gate_condition": self.multiworld.route_22_gate_condition[self.player].value, + "route_3_condition": self.multiworld.route_3_condition[self.player].value, + "robbed_house_officer": self.multiworld.robbed_house_officer[self.player].value, "viridian_gym_condition": self.multiworld.viridian_gym_condition[self.player].value, - "cerulean_cave_condition": self.multiworld.cerulean_cave_condition[self.player].value, + "cerulean_cave_badges_condition": self.multiworld.cerulean_cave_badges_condition[self.player].value, + "cerulean_cave_key_items_condition": self.multiworld.cerulean_cave_key_items_condition[self.player].total, "free_fly_map": self.fly_map_code, + "town_map_fly_map": self.town_map_fly_map_code, "extra_badges": self.extra_badges, "type_chart": self.type_chart, "randomize_pokedex": self.multiworld.randomize_pokedex[self.player].value, "trainersanity": self.multiworld.trainersanity[self.player].value, "death_link": self.multiworld.death_link[self.player].value, - "prizesanity": self.multiworld.prizesanity[self.player].value + "prizesanity": self.multiworld.prizesanity[self.player].value, + "key_items_only": self.multiworld.key_items_only[self.player].value, } @@ -499,4 +726,4 @@ class PokemonRBItem(Item): name, item_data.classification, item_data.id, player - ) + ) \ No newline at end of file diff --git a/worlds/pokemon_rb/basepatch_blue.bsdiff4 b/worlds/pokemon_rb/basepatch_blue.bsdiff4 index 895c5ddfe1c6ba36b6380db85a74a4d7bc29da0e..603252a894a9155d3227563bb7a3b22c2d7f24e3 100644 GIT binary patch literal 45568 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

U%JlC_vy!nqbt*bp>JJ6Wqmp3+4?Q6 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 E03J2Q$N&HU literal 38879 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 LP81|GO2Br2lwrCg diff --git a/worlds/pokemon_rb/basepatch_red.bsdiff4 b/worlds/pokemon_rb/basepatch_red.bsdiff4 index 1d69c48241af40eabac514550e6c9d8f0ed98c8e..9b9c93c520a6cc46bdb92a4442a8c9504230609f 100644 GIT binary patch literal 45587 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 literal 38928 zcmZ^~Wl$VE;O@J?0t?06Wm#N`EDkNQxNC8j#oeX2yL)jf?pEC0-L1u2v=mCud;Vwc z-236&e8`i@OeQkPB){Z|ga%AbS{ll^g8}%TP^@lpd2l}@nu`zM1rN|O-oWJ8C7`> z;DNLhIzNwEUig57BPvtMg=9+x5Gj!qFNFGtAuXxi2LYfq=O~etD8WhCswB&BQE@_1 z;5av&yCOOs#4B1=o)VZkS-`E7tOBh#RLs@f`YtejC%UBBF)}zDJ`X4i+mu$~0*MGgs}$vJXa3=<$=aK#s4Cx@i zI2?`%fJ3R0=Ap8(5+x;CU^Hx^{Lo0*Fb8stNcA#1bSnuDd9iS2AsW?AJUnr{cikOd zi-cyRFoO1JNE%ZybOsSe+eBg=#<~qN&s(^z@7Wv9cb2x@KFyu^Y%vip?`CBD!IrCY zib(qRlZVz~srQ1c*OD_mxjz6xC8cf z!cY{@61N(n*yZ;MDR2xm`#jZbC<@s33I!>AdqtF{C@lEX*!VNuy)~Urgjf)oX@0id z;W3%k@7VFysLK-FjP3pSwj4U;g|IVvW$t9h2Q8+3ntxiWf91KY@TqP_wV22zq5kaK zT_>Ret2bO1pu>!#C=3b;sjf&tv;v{&Q5c^)W9d05CRZ{YCqOPrpcQ2kIbJ?ucpog;Yl-;I-3FB=6;=QgaK1lL}D zwMpRmZR}hige7ldVlhX4UA*Yqhg&?9rNvDP-pr^s%P5_!X?|WpH-cQ9?wPzRa~4{; z98w=l3h}(zG_qQjI=9na

HGv>puH(l4q%5_T*2w@WNa= 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 diff --git a/worlds/pokemon_rb/docs/en_Pokemon Red and Blue.md b/worlds/pokemon_rb/docs/en_Pokemon Red and Blue.md index 556da203..53505418 100644 --- a/worlds/pokemon_rb/docs/en_Pokemon Red and Blue.md +++ b/worlds/pokemon_rb/docs/en_Pokemon Red and Blue.md @@ -11,35 +11,59 @@ Items which the player would normally acquire throughout the game have been move always able to be completed, but because of the item shuffle the player may need to access certain areas before they would in the vanilla game. -A great many things besides item placement can be randomized, such as the location of Pokémon, their stats, types, etc., depending on your yaml settings. +A great many things besides item placement can be randomized, such as the location of Pokémon, their stats, types, etc., +depending on your yaml settings. Many baseline changes are made to the game, including: -* Bag item space increased to 128 slots (up from 20) -* PC item storage increased to 64 slots (up from 50) +* Bag item space increased to 128 slots (up from 20). +* PC item storage increased to 64 slots (up from 50). * You can hold B to run (or bike extra fast!). * You can hold select while talking to a trainer to re-battle them. -* You can return to route 2 from Diglett's Cave without the use of Cut. +* You can select "Pallet Warp" below the "Continue" option to warp to Pallet Towna s you load your save. * Mew can be encountered at the S.S. Anne dock truck. This can be randomized depending on your settings. * The S.S. Anne will never depart. * Seafoam Islands entrances are swapped. This means you need Strength to travel through from Cinnabar Island to Fuchsia -City +City. You also cannot Surf onto the water from the end of Seafoam Islands going backwards if you have not yet dropped +the boulders. * After obtaining one of the fossil item checks in Mt Moon, the remaining item can be received from the Cinnabar Lab fossil scientist. This may require reviving a number of fossils, depending on your settings. * Obedience depends on the total number of badges you have obtained instead of depending on specific badges. * Pokémon that evolve by trading can also evolve by reaching level 35. -* Evolution stones are reusable. +* Evolution stones are reusable key items. * Much of the dialogue throughout the game has been removed or shortened. -* If the Old Man is blocking your way through Viridian City, you do not have Oak's Parcel in your inventory, and you've -exhausted your money and Poké Balls, you can get a free Poké Ball from your mom. +* The Pokédex shows which HMs can be learned by any Pokémon registered as seen. * HM moves can be overwritten if you have the HM for it in your bag. * The NPC on the left behind the Celadon Game Corner counter will sell 1500 coins at once instead of giving information -about the Prize Corner +about the Prize Corner. +* A woman in Oak's Lab can send you back in time to replay the first rival battle, in case you have no other reachable +and repeatable source of money. +* You can disable and re-enable experience gains by talking to an aide in Oak's Lab. +* You can reset static encounters (Poké Flute encounter, legendaries, and the trap Poké Ball battles in Power Plant) +for any Pokémon you have defeated but not caught, by talking to an aide in Oak's Lab. ## What items and locations get shuffled? All items that go into your bags given by NPCs or found on the ground, as well as gym badges. -Optionally, hidden items (those located with the Item Finder) can be shuffled as well. +Various options add more items / location checks to the pool, including: +* Randomize Hidden Items. +* Stonesanity: Replace 4 of the 5 Moon Stones in the item pool with the other 4 stones, and remove them from the +Celadon Department Store shop. Will shuffle the hidden item locations that contain Moon Stones in the original game +regardless of the Randomize Hidden Items option. +* Prizesanity: Shuffle the three item prizes from the Celadon Prize Corner. +* Tea: Adds a Tea item to the item pool which is required to pass the Saffron Gate guards instead of vending machine +drinks. Adds a location check to the woman in Celadon Mansion 1F, where the Tea item is found in FireRed and LeafGreen. +* Extra Key Items: Adds key items that will be required to access the Power Plant, Pokémon Mansion, Rocket Hideout, +and Safari Zone. Adds 4 extra item locations to Rock Tunnel B1F +* Split Card Key: Splits the Card Key into 10 different Card Keys, one for each floor of Silph Co that has locked doors. +Adds 9 location checks to friendly NPCs in Silph Co. You can also choose Progressive Card Keys to always obtain the +keys in order from Card Key 2F to Card Key 11F. +* Trainersanity: Adds location checks to 317 trainers. Does not include scripted trainers, most of which disappear +after battling them, but also includes Gym Leaders. You must talk to the trainer after defeating them to receive +your prize. Adds 317 random filler items to the item pool +* Dexsanity: Location checks occur when registering Pokémon as owned in the Pokédex. You can choose a percentage +of Pokémon to have checks added to, chosen randomly. You can identify which Pokémon have location checks by an empty +Poké Ball icon shown in battle or in the Pokédex menu. ## Which items can be in another player's world? diff --git a/worlds/pokemon_rb/encounters.py b/worlds/pokemon_rb/encounters.py new file mode 100644 index 00000000..a426374c --- /dev/null +++ b/worlds/pokemon_rb/encounters.py @@ -0,0 +1,275 @@ +from copy import deepcopy +from . import poke_data +from .locations import location_data + + +def get_encounter_slots(self): + encounter_slots = deepcopy([location for location in location_data if location.type == "Wild Encounter"]) + + for location in encounter_slots: + if isinstance(location.original_item, list): + location.original_item = location.original_item[not self.multiworld.game_version[self.player].value] + return encounter_slots + + +def get_base_stat_total(mon): + return (poke_data.pokemon_data[mon]["atk"] + poke_data.pokemon_data[mon]["def"] + + poke_data.pokemon_data[mon]["hp"] + poke_data.pokemon_data[mon]["spd"] + + poke_data.pokemon_data[mon]["spc"]) + + +def randomize_pokemon(self, mon, mons_list, randomize_type, random): + if randomize_type in [1, 3]: + type_mons = [pokemon for pokemon in mons_list if any([poke_data.pokemon_data[mon][ + "type1"] in [self.local_poke_data[pokemon]["type1"], self.local_poke_data[pokemon]["type2"]], + poke_data.pokemon_data[mon]["type2"] in [self.local_poke_data[pokemon]["type1"], + self.local_poke_data[pokemon]["type2"]]])] + if not type_mons: + type_mons = mons_list.copy() + if randomize_type == 3: + stat_base = get_base_stat_total(mon) + type_mons.sort(key=lambda mon: abs(get_base_stat_total(mon) - stat_base)) + mon = type_mons[round(random.triangular(0, len(type_mons) - 1, 0))] + if randomize_type == 2: + stat_base = get_base_stat_total(mon) + mons_list.sort(key=lambda mon: abs(get_base_stat_total(mon) - stat_base)) + mon = mons_list[round(random.triangular(0, 50, 0))] + elif randomize_type == 4: + mon = random.choice(mons_list) + return mon + + +def process_trainer_data(self): + mons_list = [pokemon for pokemon in poke_data.pokemon_data.keys() if pokemon not in poke_data.legendary_pokemon + or self.multiworld.trainer_legendaries[self.player].value] + unevolved_mons = [pokemon for pokemon in poke_data.first_stage_pokemon if pokemon not in poke_data.legendary_pokemon + or self.multiworld.randomize_legendary_pokemon[self.player].value == 3] + evolved_mons = [mon for mon in mons_list if mon not in unevolved_mons] + rival_map = { + "Charmander": self.multiworld.get_location("Oak's Lab - Starter 1", self.player).item.name[9:], # strip the + "Squirtle": self.multiworld.get_location("Oak's Lab - Starter 2", self.player).item.name[9:], # 'Missable' + "Bulbasaur": self.multiworld.get_location("Oak's Lab - Starter 3", self.player).item.name[9:], # from the name + } + + def add_evolutions(): + for a, b in rival_map.copy().items(): + if a in poke_data.evolves_to and poke_data.evolves_to[a] not in rival_map: + if b in poke_data.evolves_to: + rival_map[poke_data.evolves_to[a]] = poke_data.evolves_to[b] + else: + rival_map[poke_data.evolves_to[a]] = b + add_evolutions() + add_evolutions() + parties_objs = [location for location in self.multiworld.get_locations(self.player) + if location.type == "Trainer Parties"] + # Process Rival parties in order "Route 22 " is not a typo + parties_objs.sort(key=lambda i: 0 if "Oak's Lab" in i.name else 1 if "Route 22 " in i.name else 2 if "Cerulean City" + in i.name else 3 if "Anne" in i.name else 4 if "Pokemon Tower" in i.name else 5 if "Silph" in + i.name else 6 if "Route 22-F" in i.name else 7 if "Champion" in i.name else 8) + for parties in parties_objs: + parties_data = parties.party_data + for party in parties_data: + if party["party"] and isinstance(party["party"][0], list): + # only for Rival parties + for rival_party in party["party"]: + for i, mon in enumerate(rival_party): + if mon in ("Bulbasaur", "Ivysaur", "Venusaur", "Charmander", "Charmeleon", "Charizard", + "Squirtle", "Wartortle", "Blastoise"): + if self.multiworld.randomize_starter_pokemon[self.player]: + rival_party[i] = rival_map[mon] + elif self.multiworld.randomize_trainer_parties[self.player]: + if mon in rival_map: + rival_party[i] = rival_map[mon] + else: + new_mon = randomize_pokemon(self, mon, + unevolved_mons if mon in unevolved_mons else evolved_mons, + self.multiworld.randomize_trainer_parties[self.player].value, + self.multiworld.random) + rival_map[mon] = new_mon + rival_party[i] = new_mon + add_evolutions() + else: + if self.multiworld.randomize_trainer_parties[self.player]: + for i, mon in enumerate(party["party"]): + party["party"][i] = randomize_pokemon(self, mon, mons_list, + self.multiworld.randomize_trainer_parties[self.player].value, + self.multiworld.random) + + +def process_pokemon_locations(self): + starter_slots = deepcopy([location for location in location_data if location.type == "Starter Pokemon"]) + legendary_slots = deepcopy([location for location in location_data if location.type == "Legendary Pokemon"]) + static_slots = deepcopy([location for location in location_data if location.type in + ["Static Pokemon", "Missable Pokemon"]]) + legendary_mons = deepcopy([slot.original_item for slot in legendary_slots]) + + placed_mons = {pokemon: 0 for pokemon in poke_data.pokemon_data.keys()} + + mons_list = [pokemon for pokemon in poke_data.first_stage_pokemon if pokemon not in poke_data.legendary_pokemon + or self.multiworld.randomize_legendary_pokemon[self.player].value == 3] + if self.multiworld.randomize_legendary_pokemon[self.player] == "vanilla": + for slot in legendary_slots: + location = self.multiworld.get_location(slot.name, self.player) + location.place_locked_item(self.create_item("Static " + slot.original_item)) + elif self.multiworld.randomize_legendary_pokemon[self.player] == "shuffle": + self.multiworld.random.shuffle(legendary_mons) + for slot in legendary_slots: + location = self.multiworld.get_location(slot.name, self.player) + mon = legendary_mons.pop() + location.place_locked_item(self.create_item("Static " + mon)) + placed_mons[mon] += 1 + elif self.multiworld.randomize_legendary_pokemon[self.player] == "static": + static_slots = static_slots + legendary_slots + self.multiworld.random.shuffle(static_slots) + static_slots.sort(key=lambda s: s.name != "Pokemon Tower 6F - Restless Soul") + while legendary_slots: + swap_slot = legendary_slots.pop() + slot = static_slots.pop() + slot_type = slot.type.split()[0] + if slot_type == "Legendary": + slot_type = "Static" + location = self.multiworld.get_location(slot.name, self.player) + location.place_locked_item(self.create_item(slot_type + " " + swap_slot.original_item)) + swap_slot.original_item = slot.original_item + elif self.multiworld.randomize_legendary_pokemon[self.player] == "any": + static_slots = static_slots + legendary_slots + + for slot in static_slots: + location = self.multiworld.get_location(slot.name, self.player) + randomize_type = self.multiworld.randomize_static_pokemon[self.player].value + slot_type = slot.type.split()[0] + if slot_type == "Legendary": + slot_type = "Static" + if not randomize_type: + location.place_locked_item(self.create_item(slot_type + " " + slot.original_item)) + else: + mon = self.create_item(slot_type + " " + + randomize_pokemon(self, slot.original_item, mons_list, randomize_type, + self.multiworld.random)) + location.place_locked_item(mon) + if slot_type != "Missable": + placed_mons[mon.name.replace("Static ", "")] += 1 + + chosen_mons = set() + for slot in starter_slots: + location = self.multiworld.get_location(slot.name, self.player) + randomize_type = self.multiworld.randomize_starter_pokemon[self.player].value + slot_type = "Missable" + if not randomize_type: + location.place_locked_item(self.create_item(slot_type + " " + slot.original_item)) + else: + mon = self.create_item(slot_type + " " + randomize_pokemon(self, slot.original_item, mons_list, + randomize_type, self.multiworld.random)) + while mon.name in chosen_mons: + mon = self.create_item(slot_type + " " + randomize_pokemon(self, slot.original_item, mons_list, + randomize_type, self.multiworld.random)) + chosen_mons.add(mon.name) + location.place_locked_item(mon) + + encounter_slots_master = get_encounter_slots(self) + encounter_slots = encounter_slots_master.copy() + + zone_mapping = {} + if self.multiworld.randomize_wild_pokemon[self.player]: + mons_list = [pokemon for pokemon in poke_data.pokemon_data.keys() if pokemon not in poke_data.legendary_pokemon + or self.multiworld.randomize_legendary_pokemon[self.player].value == 3] + self.multiworld.random.shuffle(encounter_slots) + locations = [] + for slot in encounter_slots: + location = self.multiworld.get_location(slot.name, self.player) + zone = " - ".join(location.name.split(" - ")[:-1]) + if zone not in zone_mapping: + zone_mapping[zone] = {} + original_mon = slot.original_item + if self.multiworld.area_1_to_1_mapping[self.player] and original_mon in zone_mapping[zone]: + mon = zone_mapping[zone][original_mon] + else: + mon = randomize_pokemon(self, original_mon, mons_list, + self.multiworld.randomize_wild_pokemon[self.player].value, self.multiworld.random) + # + while ("Pokemon Tower 6F" in slot.name and + self.multiworld.get_location("Pokemon Tower 6F - Restless Soul", self.player).item.name + == f"Missable {mon}"): + # If you're fighting the Pokémon defined as the Restless Soul, and you're on the 6th floor of the tower, + # the battle is treates as the Restless Soul battle and you cannot catch it. So, prevent any wild mons + # from being the same species as the Restless Soul. + # to account for the possibility that only one ground type Pokemon exists, match only stats for this fix + mon = randomize_pokemon(self, original_mon, mons_list, 2, self.multiworld.random) + placed_mons[mon] += 1 + location.item = self.create_item(mon) + location.event = True + location.locked = True + location.item.location = location + locations.append(location) + zone_mapping[zone][original_mon] = mon + + mons_to_add = [] + remaining_pokemon = [pokemon for pokemon in poke_data.pokemon_data.keys() if placed_mons[pokemon] == 0 and + (pokemon not in poke_data.legendary_pokemon or self.multiworld.randomize_legendary_pokemon[self.player].value == 3)] + if self.multiworld.catch_em_all[self.player] == "first_stage": + mons_to_add = [pokemon for pokemon in poke_data.first_stage_pokemon if placed_mons[pokemon] == 0 and + (pokemon not in poke_data.legendary_pokemon or self.multiworld.randomize_legendary_pokemon[self.player].value == 3)] + elif self.multiworld.catch_em_all[self.player] == "all_pokemon": + mons_to_add = remaining_pokemon.copy() + logic_needed_mons = max(self.multiworld.oaks_aide_rt_2[self.player].value, + self.multiworld.oaks_aide_rt_11[self.player].value, + self.multiworld.oaks_aide_rt_15[self.player].value) + if self.multiworld.accessibility[self.player] == "minimal": + logic_needed_mons = 0 + + self.multiworld.random.shuffle(remaining_pokemon) + while (len([pokemon for pokemon in placed_mons if placed_mons[pokemon] > 0]) + + len(mons_to_add) < logic_needed_mons): + mons_to_add.append(remaining_pokemon.pop()) + for mon in mons_to_add: + stat_base = get_base_stat_total(mon) + candidate_locations = encounter_slots_master.copy() + if self.multiworld.randomize_wild_pokemon[self.player].current_key in ["match_base_stats", "match_types_and_base_stats"]: + candidate_locations.sort(key=lambda slot: abs(get_base_stat_total(slot.original_item) - stat_base)) + if self.multiworld.randomize_wild_pokemon[self.player].current_key in ["match_types", "match_types_and_base_stats"]: + candidate_locations.sort(key=lambda slot: not any([poke_data.pokemon_data[slot.original_item]["type1"] in + [self.local_poke_data[mon]["type1"], self.local_poke_data[mon]["type2"]], + poke_data.pokemon_data[slot.original_item]["type2"] in + [self.local_poke_data[mon]["type1"], self.local_poke_data[mon]["type2"]]])) + candidate_locations = [self.multiworld.get_location(location.name, self.player) for location in candidate_locations] + for location in candidate_locations: + zone = " - ".join(location.name.split(" - ")[:-1]) + if self.multiworld.catch_em_all[self.player] == "all_pokemon" and self.multiworld.area_1_to_1_mapping[self.player]: + if not [self.multiworld.get_location(l.name, self.player) for l in encounter_slots_master + if (not l.name.startswith(zone)) and + self.multiworld.get_location(l.name, self.player).item.name == location.item.name]: + continue + if self.multiworld.catch_em_all[self.player] == "first_stage" and self.multiworld.area_1_to_1_mapping[self.player]: + if not [self.multiworld.get_location(l.name, self.player) for l in encounter_slots_master + if (not l.name.startswith(zone)) and + self.multiworld.get_location(l.name, self.player).item.name == location.item.name and l.name + not in poke_data.evolves_from]: + continue + + if placed_mons[location.item.name] < 2 and (location.item.name in poke_data.first_stage_pokemon + or self.multiworld.catch_em_all[self.player]): + continue + + if self.multiworld.area_1_to_1_mapping[self.player]: + place_locations = [place_location for place_location in candidate_locations if + place_location.name.startswith(zone) and + place_location.item.name == location.item.name] + else: + place_locations = [location] + for place_location in place_locations: + placed_mons[place_location.item.name] -= 1 + place_location.item = self.create_item(mon) + place_location.item.location = place_location + placed_mons[mon] += 1 + break + else: + raise Exception + + else: + for slot in encounter_slots: + location = self.multiworld.get_location(slot.name, self.player) + location.item = self.create_item(slot.original_item) + location.event = True + location.locked = True + location.item.location = location + placed_mons[location.item.name] += 1 \ No newline at end of file diff --git a/worlds/pokemon_rb/items.py b/worlds/pokemon_rb/items.py index b30480ed..b584869f 100644 --- a/worlds/pokemon_rb/items.py +++ b/worlds/pokemon_rb/items.py @@ -1,11 +1,13 @@ from BaseClasses import ItemClassification from .poke_data import pokemon_data + class ItemData: - def __init__(self, id, classification, groups): + def __init__(self, item_id, classification, groups): self.groups = groups self.classification = classification - self.id = None if id is None else id + 172000000 + self.id = None if item_id is None else item_id + 172000000 + item_table = { "Master Ball": ItemData(1, ItemClassification.useful, ["Consumables", "Poke Balls"]), @@ -15,9 +17,9 @@ item_table = { "Town Map": ItemData(5, ItemClassification.progression_skip_balancing, ["Unique", "Key Items"]), "Bicycle": ItemData(6, ItemClassification.progression, ["Unique", "Key Items"]), # "Flippers": ItemData(7, ItemClassification.progression), - #"Safari Ball": ItemData(8, ItemClassification.filler), + # "Safari Ball": ItemData(8, ItemClassification.filler), "Pokedex": ItemData(9, ItemClassification.progression, ["Unique", "Key Items"]), - "Moon Stone": ItemData(10, ItemClassification.useful, ["Unique", "Evolution Stones"]), + "Moon Stone": ItemData(10, ItemClassification.progression_skip_balancing, ["Unique", "Evolution Stones", "Key Items"]), "Antidote": ItemData(11, ItemClassification.filler, ["Consumables"]), "Burn Heal": ItemData(12, ItemClassification.filler, ["Consumables"]), "Ice Heal": ItemData(13, ItemClassification.filler, ["Consumables"]), @@ -38,23 +40,23 @@ item_table = { "Earth Badge": ItemData(28, ItemClassification.progression, ["Unique", "Key Items", "Badges"]), "Escape Rope": ItemData(29, ItemClassification.filler, ["Consumables"]), "Repel": ItemData(30, ItemClassification.filler, ["Consumables"]), - "Old Amber": ItemData(31, ItemClassification.progression_skip_balancing, ["Unique", "Fossils"]), - "Fire Stone": ItemData(32, ItemClassification.useful, ["Unique", "Evolution Stones"]), - "Thunder Stone": ItemData(33, ItemClassification.useful, ["Unique", "Evolution Stones"]), - "Water Stone": ItemData(34, ItemClassification.useful, ["Unique", "Evolution Stones"]), + "Old Amber": ItemData(31, ItemClassification.progression_skip_balancing, ["Unique", "Fossils", "Key Items"]), + "Fire Stone": ItemData(32, ItemClassification.progression_skip_balancing, ["Unique", "Evolution Stones", "Key Items"]), + "Thunder Stone": ItemData(33, ItemClassification.progression_skip_balancing, ["Unique", "Evolution Stones" "Key Items"]), + "Water Stone": ItemData(34, ItemClassification.progression_skip_balancing, ["Unique", "Evolution Stones", "Key Items"]), "HP Up": ItemData(35, ItemClassification.filler, ["Consumables", "Vitamins"]), "Protein": ItemData(36, ItemClassification.filler, ["Consumables", "Vitamins"]), "Iron": ItemData(37, ItemClassification.filler, ["Consumables", "Vitamins"]), "Carbos": ItemData(38, ItemClassification.filler, ["Consumables", "Vitamins"]), "Calcium": ItemData(39, ItemClassification.filler, ["Consumables", "Vitamins"]), - "Rare Candy": ItemData(40, ItemClassification.useful, ["Consumables"]), - "Dome Fossil": ItemData(41, ItemClassification.progression_skip_balancing, ["Unique", "Fossils"]), - "Helix Fossil": ItemData(42, ItemClassification.progression_skip_balancing, ["Unique", "Fossils"]), + "Rare Candy": ItemData(40, ItemClassification.filler, ["Consumables"]), + "Dome Fossil": ItemData(41, ItemClassification.progression_skip_balancing, ["Unique", "Fossils", "Key Items"]), + "Helix Fossil": ItemData(42, ItemClassification.progression_skip_balancing, ["Unique", "Fossils", "Key Items"]), "Secret Key": ItemData(43, ItemClassification.progression, ["Unique", "Key Items"]), "Bike Voucher": ItemData(45, ItemClassification.progression, ["Unique", "Key Items"]), "X Accuracy": ItemData(46, ItemClassification.filler, ["Consumables", "Battle Items"]), - "Leaf Stone": ItemData(47, ItemClassification.useful, ["Unique", "Evolution Stones"]), - "Card Key": ItemData(48, ItemClassification.progression, ["Unique", "Key Items"]), + "Leaf Stone": ItemData(47, ItemClassification.progression_skip_balancing, ["Unique", "Evolution Stones", "Key Items"]), + "Card Key": ItemData(48, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), "Nugget": ItemData(49, ItemClassification.filler, []), #"Laptop": ItemData(50, ItemClassification.useful, ["Unique"]), "Poke Doll": ItemData(51, ItemClassification.filler, ["Consumables"]), @@ -75,13 +77,13 @@ item_table = { "X Defend": ItemData(66, ItemClassification.filler, ["Consumables", "Battle Items"]), "X Speed": ItemData(67, ItemClassification.filler, ["Consumables", "Battle Items"]), "X Special": ItemData(68, ItemClassification.filler, ["Consumables", "Battle Items"]), - "Coin Case": ItemData(69, ItemClassification.progression_skip_balancing, ["Unique", "Key Items"]), + "Coin Case": ItemData(69, ItemClassification.progression, ["Unique", "Key Items"]), "Oak's Parcel": ItemData(70, ItemClassification.progression, ["Unique", "Key Items"]), "Item Finder": ItemData(71, ItemClassification.progression, ["Unique", "Key Items"]), "Silph Scope": ItemData(72, ItemClassification.progression, ["Unique", "Key Items"]), "Poke Flute": ItemData(73, ItemClassification.progression, ["Unique", "Key Items"]), "Lift Key": ItemData(74, ItemClassification.progression, ["Unique", "Key Items"]), - "Exp. All": ItemData(75, ItemClassification.useful, ["Unique"]), + "Exp. All": ItemData(75, ItemClassification.progression_skip_balancing, ["Unique", "Key Items"]), "Old Rod": ItemData(76, ItemClassification.progression_skip_balancing, ["Unique", "Key Items", "Rods"]), "Good Rod": ItemData(77, ItemClassification.progression_skip_balancing, ["Unique", "Key Items", "Rods"]), "Super Rod": ItemData(78, ItemClassification.progression_skip_balancing, ["Unique", "Key Items", "Rods"]), @@ -105,11 +107,23 @@ item_table = { "Fire Trap": ItemData(97, ItemClassification.trap, ["Traps"]), "20 Coins": ItemData(98, ItemClassification.filler, ["Coins"]), "100 Coins": ItemData(99, ItemClassification.filler, ["Coins"]), - "HM01 Cut": ItemData(196, ItemClassification.progression, ["Unique", "HMs"]), - "HM02 Fly": ItemData(197, ItemClassification.progression, ["Unique", "HMs"]), - "HM03 Surf": ItemData(198, ItemClassification.progression, ["Unique", "HMs"]), - "HM04 Strength": ItemData(199, ItemClassification.progression, ["Unique", "HMs"]), - "HM05 Flash": ItemData(200, ItemClassification.progression, ["Unique", "HMs"]), + "Card Key 2F": ItemData(100, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), + "Card Key 3F": ItemData(101, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), + "Card Key 4F": ItemData(102, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), + "Card Key 5F": ItemData(103, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), + "Card Key 6F": ItemData(104, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), + "Card Key 7F": ItemData(105, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), + "Card Key 8F": ItemData(106, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), + "Card Key 9F": ItemData(107, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), + "Card Key 10F": ItemData(108, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), + "Card Key 11F": ItemData(109, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), + "Progressive Card Key": ItemData(110, ItemClassification.progression, ["Unique", "Key Items", "Card Keys"]), + "Sleep Trap": ItemData(111, ItemClassification.trap, ["Traps"]), + "HM01 Cut": ItemData(196, ItemClassification.progression, ["Unique", "HMs", "Key Items"]), + "HM02 Fly": ItemData(197, ItemClassification.progression, ["Unique", "HMs", "Key Items"]), + "HM03 Surf": ItemData(198, ItemClassification.progression, ["Unique", "HMs", "Key Items"]), + "HM04 Strength": ItemData(199, ItemClassification.progression, ["Unique", "HMs", "Key Items"]), + "HM05 Flash": ItemData(200, ItemClassification.progression, ["Unique", "HMs", "Key Items"]), "TM01 Mega Punch": ItemData(201, ItemClassification.useful, ["Unique", "TMs"]), "TM02 Razor Wind": ItemData(202, ItemClassification.filler, ["Unique", "TMs"]), "TM03 Swords Dance": ItemData(203, ItemClassification.useful, ["Unique", "TMs"]), @@ -161,9 +175,27 @@ item_table = { "TM49 Tri Attack": ItemData(249, ItemClassification.useful, ["Unique", "TMs"]), "TM50 Substitute": ItemData(250, ItemClassification.useful, ["Unique", "TMs"]), + "Game Corner": ItemData(None, ItemClassification.progression, []), + "Cinnabar Island": ItemData(None, ItemClassification.progression, []), + "Buy Poke Doll": ItemData(None, ItemClassification.progression, []), + "Vending Machine Drinks": ItemData(None, ItemClassification.progression, []), + "Help Bill": ItemData(None, ItemClassification.progression, []), + "Defeat Brock": ItemData(None, ItemClassification.progression, []), + "Defeat Misty": ItemData(None, ItemClassification.progression, []), + "Defeat Lt. Surge": ItemData(None, ItemClassification.progression, []), + "Defeat Erika": ItemData(None, ItemClassification.progression, []), + "Defeat Koga": ItemData(None, ItemClassification.progression, []), + "Defeat Blaine": ItemData(None, ItemClassification.progression, []), + "Defeat Sabrina": ItemData(None, ItemClassification.progression, []), + "Defeat Viridian Gym Giovanni": ItemData(None, ItemClassification.progression, []), + "Seafoam Exit Boulder": ItemData(None, ItemClassification.progression, []), + "Seafoam Boss Boulders": ItemData(None, ItemClassification.progression, []), + "Victory Road Boulder": ItemData(None, ItemClassification.progression, []), "Fuji Saved": ItemData(None, ItemClassification.progression, []), "Silph Co Liberated": ItemData(None, ItemClassification.progression, []), - "Become Champion": ItemData(None, ItemClassification.progression, []) + "Become Champion": ItemData(None, ItemClassification.progression, []), + + "Trainer Parties": ItemData(None, ItemClassification.filler, []) } item_table.update({f"TM{str(i).zfill(2)}": ItemData(i + 456, ItemClassification.filler, ["Unique", "TMs"]) @@ -183,4 +215,4 @@ item_table.update( item_groups = {} for item, data in item_table.items(): for group in data.groups: - item_groups[group] = item_groups.get(group, []) + [item] \ No newline at end of file + item_groups[group] = item_groups.get(group, []) + [item] diff --git a/worlds/pokemon_rb/level_scaling.py b/worlds/pokemon_rb/level_scaling.py new file mode 100644 index 00000000..5f3dfc1a --- /dev/null +++ b/worlds/pokemon_rb/level_scaling.py @@ -0,0 +1,138 @@ +from BaseClasses import CollectionState +from .locations import level_name_list, level_list + + +def level_scaling(multiworld): + state = CollectionState(multiworld) + locations = set(multiworld.get_filled_locations()) + spheres = [] + + while locations: + sphere = set() + for world in multiworld.get_game_worlds("Pokemon Red and Blue"): + if multiworld.level_scaling[world.player] != "by_spheres_and_distance": + continue + regions = {multiworld.get_region("Menu", world.player)} + checked_regions = set() + distance = 0 + while regions: + next_regions = set() + for region in regions: + if not getattr(region, "distance"): + region.distance = distance + next_regions.update({e.connected_region for e in region.exits if e.connected_region not in + checked_regions and e.access_rule(state)}) + checked_regions.update(regions) + regions = next_regions + distance += 1 + + distances = {} + + for location in locations: + def reachable(): + if location.can_reach(state): + return True + if location.parent_region.name == "Fossil" and state.can_reach("Mt Moon B2F", "Region", + location.player): + # We want areas that are accessible earlier to have lower levels. If an important item is at a + # fossil location, it may not be in logic until much later, despite your ability to potentially + # reach them earlier. We treat them both as reachable right away for this purpose + return True + if (location.name == "Route 25 - Item" and state.can_reach("Route 25", "Region", location.player) + and multiworld.blind_trainers[location.player].value < 100): + # Assume they will take their one chance to get the trainer to walk out of the way to reach + # the item behind them + return True + if (("Rock Tunnel 1F - Wild Pokemon" in location.name + and any([multiworld.get_entrance(e, location.player).connected_region.can_reach(state) + for e in ['Rock Tunnel 1F-NE to Route 10-N', + 'Rock Tunnel 1F-NE to Rock Tunnel B1F-E', + 'Rock Tunnel 1F-NW to Rock Tunnel B1F-E', + 'Rock Tunnel 1F-NW to Rock Tunnel B1F-W', + 'Rock Tunnel 1F-S to Route 10-S', + 'Rock Tunnel 1F-S to Rock Tunnel B1F-W']])) or + ("Rock Tunnel B1F - Wild Pokemon" in location.name and + any([multiworld.get_entrance(e, location.player).connected_region.can_reach(state) + for e in ['Rock Tunnel B1F-E to Rock Tunnel 1F-NE', + 'Rock Tunnel B1F-E to Rock Tunnel 1F-NW', + 'Rock Tunnel B1F-W to Rock Tunnel 1F-NW', + 'Rock Tunnel B1F-W to Rock Tunnel 1F-S']]))): + # Even if checks in Rock Tunnel are out of logic due to lack of Flash, it is very easy to + # wander in the dark and encounter wild Pokémon, even unintentionally while attempting to + # leave the way you entered. We'll count the wild Pokémon as reachable as soon as the Rock + # Tunnel is reachable, so you don't have an opportunity to catch high level Pokémon early. + # If the connections between Rock Tunnel floors are vanilla, you will still potentially + # have very high level Pokémon in B1F if you reach it out of logic, but that would always + # mean intentionally breaking the logic you picked in your yaml, and may require + # defeating trainers in 1F that would be at the higher levels. + return True + return False + if reachable(): + sphere.add(location) + parent_region = location.parent_region + if getattr(parent_region, "distance", None) is None: + distance = 0 + else: + distance = parent_region.distance + if distance not in distances: + distances[distance] = {location} + else: + distances[distance].add(location) + + if sphere: + for distance in sorted(distances.keys()): + spheres.append(distances[distance]) + locations -= distances[distance] + else: + spheres.append(locations) + break + + for location in sphere: + if not location.item: + continue + if (location.item.game == "Pokemon Red and Blue" and (location.item.name.startswith("Missable ") or + location.item.name.startswith("Static ")) and location.name != + "Pokemon Tower 6F - Restless Soul"): + # Normally, missable Pokemon (starters, the dojo rewards) are not considered in logic static Pokemon + # are not considered for moves or evolutions, as you could release them and potentially soft lock + # the game. However, for level scaling purposes, we will treat them as not missable or static. + # We would not want someone playing a minimal accessibility Dexsanity game to get what would be + # technically an "out of logic" Mansion Key from selecting Bulbasaur at the beginning of the game + # and end up in the Mansion early and encountering level 67 Pokémon + state.collect(multiworld.worlds[location.item.player].create_item( + location.item.name.split("Missable ")[-1].split("Static ")[-1]), True, location) + else: + state.collect(location.item, True, location) + for world in multiworld.get_game_worlds("Pokemon Red and Blue"): + if multiworld.level_scaling[world.player] == "off": + continue + level_list_copy = level_list.copy() + for sphere in spheres: + sphere_objects = {loc.name: loc for loc in sphere if loc.player == world.player + and (loc.type == "Wild Encounter" or "Pokemon" in loc.type) and loc.level is not None} + party_objects = [loc for loc in sphere if loc.player == world.player and loc.type == "Trainer Parties"] + for parties in party_objects: + for party in parties.party_data: + if isinstance(party["level"], int): + sphere_objects[(party["party_address"][0] if isinstance(party["party_address"], list) + else party["party_address"], 0)] = parties + else: + for i, level in enumerate(party["level"]): + sphere_objects[(party["party_address"][0] if isinstance(party["party_address"], list) + else party["party_address"], i)] = parties + ordered_sphere_objects = list(sphere_objects.keys()) + ordered_sphere_objects.sort(key=lambda obj: level_name_list.index(obj)) + for object in ordered_sphere_objects: + if sphere_objects[object].type == "Trainer Parties": + for party in sphere_objects[object].party_data: + if (isinstance(party["party_address"], list) and party["party_address"][0] == object[0]) or party["party_address"] == object[0]: + if isinstance(party["level"], int): + party["level"] = level_list_copy.pop(0) + else: + party["level"][object[1]] = level_list_copy.pop(0) + break + else: + sphere_objects[object].level = level_list_copy.pop(0) + for world in multiworld.get_game_worlds("Pokemon Red and Blue"): + world.finished_level_scaling.set() + diff --git a/worlds/pokemon_rb/locations.py b/worlds/pokemon_rb/locations.py index f942662c..ec637585 100644 --- a/worlds/pokemon_rb/locations.py +++ b/worlds/pokemon_rb/locations.py @@ -1,8 +1,7 @@ from BaseClasses import Location from .rom_addresses import rom_addresses -from .poke_data import pokemon_data - +from . import poke_data loc_id_start = 172000000 @@ -11,11 +10,17 @@ def trainersanity(multiworld, player): def dexsanity(multiworld, player): - return multiworld.dexsanity[player] + include = multiworld.worlds[player].dexsanity_table.pop(0) + multiworld.worlds[player].dexsanity_table.append(include) + return include def hidden_items(multiworld, player): - return multiworld.randomize_hidden_items[player].value > 0 + return multiworld.randomize_hidden_items[player] + + +def hidden_moon_stones(multiworld, player): + return multiworld.randomize_hidden_items[player] or multiworld.stonesanity[player] def tea(multiworld, player): @@ -34,19 +39,33 @@ def prizesanity(multiworld, player): return multiworld.prizesanity[player] -class LocationData: +def split_card_key(multiworld, player): + return multiworld.split_card_key[player].value > 0 - def __init__(self, region, name, original_item, rom_address=None, ram_address=None, event=False, type="Item", inclusion=always_on): + +def not_stonesanity(multiworld, player): + return not multiworld.stonesanity[player] + + +class LocationData: + def __init__(self, region, name, original_item, rom_address=None, ram_address=None, event=False, type="Item", + inclusion=always_on, level=None, level_address=None): self.region = region - if "Route" in region: - region = " ".join(region.split()[:2]) - self.name = region + " - " + name + self.name = region if name == "" else region.split("-")[0] + " - " + name if name != "Trainer Parties" else region + " - Trainer Parties" self.original_item = original_item self.rom_address = rom_address self.ram_address = ram_address self.event = event self.type = type self.inclusion = inclusion + self.level = level + self.address = None + if level_address: + self.level_address = level_address + elif level: + self.level_address = rom_address - 1 + else: + self.level_address = None class EventFlag: @@ -86,91 +105,89 @@ class DexSanityFlag: location_data = [ - LocationData("Vermilion City", "Fishing Guru", "Old Rod", rom_addresses["Rod_Vermilion_City_Fishing_Guru"], Rod(3)), - LocationData("Fuchsia City", "Fishing Guru's Brother", "Good Rod", rom_addresses["Rod_Fuchsia_City_Fishing_Brother"], Rod(4)), - LocationData("Route 12 South", "Fishing Guru's Brother", "Super Rod", rom_addresses["Rod_Route12_Fishing_Brother"], Rod(5)), + LocationData("Vermilion Old Rod House", "Fishing Guru", "Old Rod", rom_addresses["Rod_Vermilion_City_Fishing_Guru"], Rod(3)), + LocationData("Fuchsia Good Rod House", "Fishing Guru's Brother", "Good Rod", rom_addresses["Rod_Fuchsia_City_Fishing_Brother"], Rod(4)), + LocationData("Route 12 Super Rod House", "Fishing Guru's Brother", "Super Rod", rom_addresses["Rod_Route12_Fishing_Brother"], Rod(5)), - LocationData("Pallet Town", "Player's PC", "Potion", rom_addresses['PC_Item'], EventFlag(1),), - LocationData("Celadon City", "Mansion Lady", "Tea", rom_addresses["Event_Mansion_Lady"], EventFlag(2), inclusion=tea), - LocationData("Pallet Town", "Rival's Sister", "Town Map", rom_addresses["Event_Rivals_Sister"], EventFlag(24)), - LocationData("Pallet Town", "Oak's Post-Route-22-Rival Gift", "Poke Ball", rom_addresses["Event_Oaks_Gift"], EventFlag(36)), + LocationData("Player's House 2F", "Player's PC", "Potion", rom_addresses['PC_Item'], EventFlag(1),), + LocationData("Celadon Mansion 1F", "Mansion Lady", "Tea", rom_addresses["Event_Mansion_Lady"], EventFlag(2), inclusion=tea), + LocationData("Rival's House", "Rival's Sister", "Town Map", rom_addresses["Event_Rivals_Sister"], EventFlag(24)), + LocationData("Oak's Lab", "Oak's Post-Route-22-Rival Gift", "Poke Ball", rom_addresses["Event_Oaks_Gift"], EventFlag(36)), LocationData("Route 1", "Free Sample Man", "Potion", rom_addresses["Event_Free_Sample"], EventFlag(960)), LocationData("Viridian City", "Sleepy Guy", "TM42 Dream Eater", rom_addresses["Event_Sleepy_Guy"], EventFlag(41)), - LocationData("Viridian City", "Pokemart", "Oak's Parcel", rom_addresses["Event_Pokemart_Quest"], + LocationData("Viridian Pokemart", "Item for Oak", "Oak's Parcel", rom_addresses["Event_Pokemart_Quest"], EventFlag(57)), - LocationData("Viridian Gym", "Giovanni 2", "TM27 Fissure", rom_addresses["Event_Viridian_Gym"], EventFlag(80)), - LocationData("Route 2 East", "Oak's Aide", "HM05 Flash", rom_addresses["Event_Route_2_Oaks_Aide"], + LocationData("Viridian Gym", "Giovanni TM", "TM27 Fissure", rom_addresses["Event_Viridian_Gym"], EventFlag(80)), + LocationData("Route 2 Gate", "Oak's Aide", "HM05 Flash", rom_addresses["Event_Route_2_Oaks_Aide"], EventFlag(984)), - LocationData("Pewter City", "Museum", "Old Amber", rom_addresses["Event_Museum"], EventFlag(105)), - LocationData("Pewter Gym", "Brock 2", "TM34 Bide", rom_addresses["Event_Pewter_Gym"], EventFlag(118)), - LocationData("Cerulean City", "Bicycle Shop", "Bicycle", rom_addresses["Event_Bicycle_Shop"], EventFlag(192)), - LocationData("Cerulean Gym", "Misty 2", "TM11 Bubble Beam", rom_addresses["Event_Cerulean_Gym"], + LocationData("Pewter Museum 1F-E", "Scientist", "Old Amber", rom_addresses["Event_Museum"], EventFlag(105)), + LocationData("Pewter Gym", "Brock TM", "TM34 Bide", rom_addresses["Event_Pewter_Gym"], EventFlag(118)), + LocationData("Cerulean Bicycle Shop", "", "Bicycle", [rom_addresses["Event_Bicycle_Shop"], rom_addresses["Bike_Shop_Item_Display"]], EventFlag(192)), + LocationData("Cerulean Gym", "Misty TM", "TM11 Bubble Beam", rom_addresses["Event_Cerulean_Gym"], EventFlag(190)), LocationData("Route 24", "Nugget Bridge", "Nugget", rom_addresses["Event_Nugget_Bridge"], EventFlag(1344)), - LocationData("Route 25", "Bill", "S.S. Ticket", rom_addresses["Event_Bill"], EventFlag(1372)), - LocationData("Lavender Town", "Mr. Fuji", "Poke Flute", rom_addresses["Event_Fuji"], EventFlag(296)), - LocationData("Route 12 North", "Mourning Girl", "TM39 Swift", rom_addresses["Event_Mourning_Girl"], + LocationData("Bill's House", "Bill", "S.S. Ticket", rom_addresses["Event_Bill"], EventFlag(1372)), + LocationData("Lavender Mr. Fuji's House", "Mr. Fuji", "Poke Flute", rom_addresses["Event_Fuji"], EventFlag(296)), + LocationData("Route 12 Gate 2F", "Mourning Girl", "TM39 Swift", rom_addresses["Event_Mourning_Girl"], EventFlag(1152)), - LocationData("Vermilion City", "Pokemon Fan Club", "Bike Voucher", rom_addresses["Event_Pokemon_Fan_Club"], + LocationData("Vermilion Pokemon Fan Club", "Fan Club President", "Bike Voucher", rom_addresses["Event_Pokemon_Fan_Club"], EventFlag(337)), - LocationData("Vermilion Gym", "Lt. Surge 2", "TM24 Thunderbolt", rom_addresses["Event_Vermillion_Gym"], + LocationData("Vermilion Gym", "Lt. Surge TM", "TM24 Thunderbolt", rom_addresses["Event_Vermillion_Gym"], EventFlag(358)), - LocationData("S.S. Anne 2F", "Captain", "HM01 Cut", rom_addresses["Event_SS_Anne_Captain"], EventFlag(1504)), - LocationData("Route 11 East", "Oak's Aide", "Item Finder", rom_addresses["Event_Rt11_Oaks_Aide"], + LocationData("S.S. Anne Captain's Room", "Captain", "HM01 Cut", rom_addresses["Event_SS_Anne_Captain"], EventFlag(1504)), + LocationData("Route 11 Gate 2F", "Oak's Aide", "Item Finder", rom_addresses["Event_Rt11_Oaks_Aide"], EventFlag(1151)), LocationData("Celadon City", "Stranded Man", "TM41 Soft-Boiled", rom_addresses["Event_Stranded_Man"], EventFlag(384)), - LocationData("Celadon City", "Thirsty Girl Gets Water", "TM13 Ice Beam", + LocationData("Celadon Department Store Roof", "Thirsty Girl Gets Water", "TM13 Ice Beam", rom_addresses["Event_Thirsty_Girl_Water"], EventFlag(396)), - LocationData("Celadon City", "Thirsty Girl Gets Soda Pop", "TM48 Rock Slide", + LocationData("Celadon Department Store Roof", "Thirsty Girl Gets Soda Pop", "TM48 Rock Slide", rom_addresses["Event_Thirsty_Girl_Soda"], EventFlag(397)), - LocationData("Celadon City", "Thirsty Girl Gets Lemonade", "TM49 Tri Attack", + LocationData("Celadon Department Store Roof", "Thirsty Girl Gets Lemonade", "TM49 Tri Attack", rom_addresses["Event_Thirsty_Girl_Lemonade"], EventFlag(398)), - LocationData("Celadon City", "Counter Man", "TM18 Counter", rom_addresses["Event_Counter"], EventFlag(399)), - LocationData("Celadon City", "Gambling Addict", "Coin Case", rom_addresses["Event_Gambling_Addict"], + LocationData("Celadon Department Store 3F", "Counter Man", "TM18 Counter", rom_addresses["Event_Counter"], EventFlag(399)), + LocationData("Celadon Diner", "Gambling Addict", "Coin Case", rom_addresses["Event_Gambling_Addict"], EventFlag(480)), - LocationData("Celadon Gym", "Erika 2", "TM21 Mega Drain", rom_addresses["Event_Celadon_Gym"], EventFlag(424)), - LocationData("Silph Co 11F", "Silph Co President (Card Key)", "Master Ball", rom_addresses["Event_Silph_Co_President"], + LocationData("Celadon Gym-C", "Erika TM", "TM21 Mega Drain", rom_addresses["Event_Celadon_Gym"], EventFlag(424)), + LocationData("Silph Co 11F-C", "Silph Co President", "Master Ball", rom_addresses["Event_Silph_Co_President"], EventFlag(1933)), - LocationData("Silph Co 2F", "Woman", "TM36 Self-Destruct", rom_addresses["Event_Scared_Woman"], + LocationData("Silph Co 2F-NW", "Woman", "TM36 Self-Destruct", rom_addresses["Event_Scared_Woman"], EventFlag(1791)), - LocationData("Route 16 North", "House Woman", "HM02 Fly", rom_addresses["Event_Rt16_House_Woman"], EventFlag(1230)), - LocationData("Route 15", "Oak's Aide", "Exp. All", rom_addresses["Event_Rt_15_Oaks_Aide"], EventFlag(1200)), - LocationData("Fuchsia City", "Safari Zone Warden", "HM04 Strength", rom_addresses["Event_Warden"], EventFlag(568)), - LocationData("Fuchsia Gym", "Koga 2", "TM06 Toxic", rom_addresses["Event_Fuschia_Gym"], EventFlag(600)), - LocationData("Safari Zone West", "Secret House", "HM03 Surf", rom_addresses["Event_Safari_Zone_Secret_House"], EventFlag(2176)), - LocationData("Cinnabar Island", "Lab Scientist", "TM35 Metronome", rom_addresses["Event_Lab_Scientist"], EventFlag(727)), - LocationData("Cinnabar Gym", "Blaine 2", "TM38 Fire Blast", rom_addresses["Event_Cinnabar_Gym"], + LocationData("Route 16 Fly House", "Woman", "HM02 Fly", rom_addresses["Event_Rt16_House_Woman"], EventFlag(1230)), + LocationData("Route 15 Gate 2F", "Oak's Aide", "Exp. All", rom_addresses["Event_Rt_15_Oaks_Aide"], EventFlag(1200)), + LocationData("Fuchsia Warden's House", "Safari Zone Warden", "HM04 Strength", rom_addresses["Event_Warden"], EventFlag(568)), + LocationData("Fuchsia Gym", "Koga TM", "TM06 Toxic", rom_addresses["Event_Fuschia_Gym"], EventFlag(600)), + LocationData("Safari Zone Secret House", "", "HM03 Surf", rom_addresses["Event_Safari_Zone_Secret_House"], EventFlag(2176)), + LocationData("Cinnabar Lab R&D Room", "Lab Scientist", "TM35 Metronome", rom_addresses["Event_Lab_Scientist"], EventFlag(727)), + LocationData("Cinnabar Gym", "Blaine TM", "TM38 Fire Blast", rom_addresses["Event_Cinnabar_Gym"], EventFlag(664)), - LocationData("Copycat's House", "Copycat", "TM31 Mimic", rom_addresses["Event_Copycat"], EventFlag(832)), - LocationData("Saffron City", "Mr. Psychic", "TM29 Psychic", rom_addresses["Event_Mr_Psychic"], EventFlag(944)), - LocationData("Saffron Gym", "Sabrina 2", "TM46 Psywave", rom_addresses["Event_Saffron_Gym"], EventFlag(864)), - LocationData("Fossil", "Choice A", "Dome Fossil", - [rom_addresses["Event_Dome_Fossil"], rom_addresses["Event_Dome_Fossil_B"], + LocationData("Saffron Copycat's House 2F", "Copycat", "TM31 Mimic", rom_addresses["Event_Copycat"], EventFlag(832)), + LocationData("Saffron Mr. Psychic's House", "Mr. Psychic", "TM29 Psychic", rom_addresses["Event_Mr_Psychic"], EventFlag(944)), + LocationData("Saffron Gym-C", "Sabrina TM", "TM46 Psywave", rom_addresses["Event_Saffron_Gym"], EventFlag(864)), + LocationData("Fossil", "Choice A", "Dome Fossil", [rom_addresses["Event_Dome_Fossil"], rom_addresses["Event_Dome_Fossil_B"], rom_addresses["Dome_Fossil_Text"]], EventFlag(0x57E)), - LocationData("Fossil", "Choice B", "Helix Fossil", - [rom_addresses["Event_Helix_Fossil"], rom_addresses["Event_Helix_Fossil_B"], + LocationData("Fossil", "Choice B", "Helix Fossil", [rom_addresses["Event_Helix_Fossil"], rom_addresses["Event_Helix_Fossil_B"], rom_addresses["Helix_Fossil_Text"]], EventFlag(0x57F)), - LocationData("Cerulean City", "Rocket Thief", "TM28 Dig", rom_addresses["Event_Rocket_Thief"], + LocationData("Cerulean City-Outskirts", "Rocket Thief", "TM28 Dig", rom_addresses["Event_Rocket_Thief"], Missable(6)), - LocationData("Route 2 East", "South Item", "Moon Stone", rom_addresses["Missable_Route_2_Item_1"], + LocationData("Route 2-SE", "South Item", "Moon Stone", rom_addresses["Missable_Route_2_Item_1"], Missable(25)), - LocationData("Route 2 East", "North Item", "HP Up", rom_addresses["Missable_Route_2_Item_2"], Missable(26)), - LocationData("Route 4", "Item", "TM04 Whirlwind", rom_addresses["Missable_Route_4_Item"], Missable(27)), + LocationData("Route 2-SE", "North Item", "HP Up", rom_addresses["Missable_Route_2_Item_2"], Missable(26)), + LocationData("Route 4-E", "Item", "TM04 Whirlwind", rom_addresses["Missable_Route_4_Item"], Missable(27)), LocationData("Route 9", "Item", "TM30 Teleport", rom_addresses["Missable_Route_9_Item"], Missable(28)), - LocationData("Route 12 North", "Island Item", "TM16 Pay Day", rom_addresses["Missable_Route_12_Item_1"], Missable(30)), - LocationData("Route 12 South", "Item Behind Cuttable Tree", "Iron", rom_addresses["Missable_Route_12_Item_2"], Missable(31)), - LocationData("Route 15", "Item", "TM20 Rage", rom_addresses["Missable_Route_15_Item"], Missable(32)), + LocationData("Route 12-N", "Island Item", "TM16 Pay Day", rom_addresses["Missable_Route_12_Item_1"], Missable(30)), + LocationData("Route 12-Grass", "Item Behind Cuttable Tree", "Iron", rom_addresses["Missable_Route_12_Item_2"], Missable(31)), + LocationData("Route 15-N", "Item", "TM20 Rage", rom_addresses["Missable_Route_15_Item"], Missable(32)), LocationData("Route 24", "Item", "TM45 Thunder Wave", rom_addresses["Missable_Route_24_Item"], Missable(37)), LocationData("Route 25", "Item", "TM19 Seismic Toss", rom_addresses["Missable_Route_25_Item"], Missable(38)), LocationData("Viridian Gym", "Item", "Revive", rom_addresses["Missable_Viridian_Gym_Item"], Missable(51)), - LocationData("Cerulean Cave 1F", "Southwest Item", "Full Restore", rom_addresses["Missable_Cerulean_Cave_1F_Item_1"], + LocationData("Cerulean Cave 1F-Water", "Southwest Item", "Full Restore", rom_addresses["Missable_Cerulean_Cave_1F_Item_1"], Missable(53)), - LocationData("Cerulean Cave 1F", "Northeast Item", "Max Elixir", rom_addresses["Missable_Cerulean_Cave_1F_Item_2"], + LocationData("Cerulean Cave 1F-Water", "Northeast Item", "Max Elixir", rom_addresses["Missable_Cerulean_Cave_1F_Item_2"], Missable(54)), - LocationData("Cerulean Cave 1F", "Northwest Item", "Nugget", rom_addresses["Missable_Cerulean_Cave_1F_Item_3"], + LocationData("Cerulean Cave 1F-N", "Northwest Item", "Nugget", rom_addresses["Missable_Cerulean_Cave_1F_Item_3"], Missable(55)), LocationData("Pokemon Tower 3F", "North Item", "Escape Rope", rom_addresses["Missable_Pokemon_Tower_3F_Item"], Missable(57)), @@ -186,11 +203,11 @@ location_data = [ Missable(62)), LocationData("Pokemon Tower 6F", "Southeast Item", "X Accuracy", rom_addresses["Missable_Pokemon_Tower_6F_Item_2"], Missable(63)), - LocationData("Fuchsia City", "Warden's House Item", "Rare Candy", rom_addresses["Missable_Wardens_House_Item"], + LocationData("Fuchsia Warden's House", "Behind Boulder Item", "Rare Candy", rom_addresses["Missable_Wardens_House_Item"], Missable(71)), LocationData("Pokemon Mansion 1F", "North Item", "Escape Rope", rom_addresses["Missable_Pokemon_Mansion_1F_Item_1"], Missable(72)), - LocationData("Pokemon Mansion 1F", "South Item", "Carbos", rom_addresses["Missable_Pokemon_Mansion_1F_Item_2"], + LocationData("Pokemon Mansion 1F-SE", "South Item", "Carbos", rom_addresses["Missable_Pokemon_Mansion_1F_Item_2"], Missable(73)), LocationData("Power Plant", "Southwest Item", "Carbos", rom_addresses["Missable_Power_Plant_Item_1"], Missable(86)), LocationData("Power Plant", "North Item", "HP Up", rom_addresses["Missable_Power_Plant_Item_2"], Missable(87)), @@ -200,13 +217,13 @@ location_data = [ Missable(89)), LocationData("Power Plant", "South Item", "TM33 Reflect", rom_addresses["Missable_Power_Plant_Item_5"], Missable(90)), - LocationData("Victory Road 2F", "Northeast Item", "TM17 Submission", rom_addresses["Missable_Victory_Road_2F_Item_1"], + LocationData("Victory Road 2F-C", "Northeast Item", "TM17 Submission", rom_addresses["Missable_Victory_Road_2F_Item_1"], Missable(92)), - LocationData("Victory Road 2F", "East Item", "Full Heal", rom_addresses["Missable_Victory_Road_2F_Item_2"], + LocationData("Victory Road 2F-C", "East Item", "Full Heal", rom_addresses["Missable_Victory_Road_2F_Item_2"], Missable(93)), - LocationData("Victory Road 2F", "West Item", "TM05 Mega Kick", rom_addresses["Missable_Victory_Road_2F_Item_3"], + LocationData("Victory Road 2F-W", "West Item", "TM05 Mega Kick", rom_addresses["Missable_Victory_Road_2F_Item_3"], Missable(94)), - LocationData("Victory Road 2F", "North Item Near Moltres", "Guard Spec", rom_addresses["Missable_Victory_Road_2F_Item_4"], + LocationData("Victory Road 2F-NW", "North Item Near Moltres", "Guard Spec", rom_addresses["Missable_Victory_Road_2F_Item_4"], Missable(95)), LocationData("Viridian Forest", "East Item", "Antidote", rom_addresses["Missable_Viridian_Forest_Item_1"], Missable(100)), @@ -222,19 +239,19 @@ location_data = [ LocationData("Mt Moon 1F", "South Item", "Potion", rom_addresses["Missable_Mt_Moon_1F_Item_5"], Missable(107)), LocationData("Mt Moon 1F", "Southwest Item", "TM12 Water Gun", rom_addresses["Missable_Mt_Moon_1F_Item_6"], Missable(108)), - LocationData("Mt Moon B2F", "South Item", "HP Up", rom_addresses["Missable_Mt_Moon_B2F_Item_1"], Missable(111)), - LocationData("Mt Moon B2F", "North Item", "TM01 Mega Punch", rom_addresses["Missable_Mt_Moon_B2F_Item_2"], + LocationData("Mt Moon B2F-C", "South Item", "HP Up", rom_addresses["Missable_Mt_Moon_B2F_Item_1"], Missable(111)), + LocationData("Mt Moon B2F-NE", "North Item", "TM01 Mega Punch", rom_addresses["Missable_Mt_Moon_B2F_Item_2"], Missable(112)), - LocationData("S.S. Anne 1F", "Item", "TM08 Body Slam", rom_addresses["Missable_SS_Anne_1F_Item"], + LocationData("S.S. Anne 1F Rooms-Youngster and Lass Room", "Item", "TM08 Body Slam", rom_addresses["Missable_SS_Anne_1F_Item"], Missable(114)), - LocationData("S.S. Anne 2F", "Item 1", "Max Ether", rom_addresses["Missable_SS_Anne_2F_Item_1"], + LocationData("S.S. Anne 2F Rooms-Fisherman and Gentleman Room", "Fisherman and Gentleman Room Item", "Max Ether", rom_addresses["Missable_SS_Anne_2F_Item_1"], Missable(115)), - LocationData("S.S. Anne 2F", "Item 2", "Rare Candy", rom_addresses["Missable_SS_Anne_2F_Item_2"], + LocationData("S.S. Anne 2F Rooms-Gentleman and Lass Room", "Gentleman and Lass Room Item", "Rare Candy", rom_addresses["Missable_SS_Anne_2F_Item_2"], Missable(116)), - LocationData("S.S. Anne B1F", "Item 1", "Ether", rom_addresses["Missable_SS_Anne_B1F_Item_1"], Missable(117)), - LocationData("S.S. Anne B1F", "Item 2", "TM44 Rest", rom_addresses["Missable_SS_Anne_B1F_Item_2"], + LocationData("S.S. Anne B1F Rooms-East Single Sailor Room", "East Single Sailor Room Item", "Ether", rom_addresses["Missable_SS_Anne_B1F_Item_1"], Missable(117)), + LocationData("S.S. Anne B1F Rooms-West Single Sailor Room", "West Single Sailor Room Item", "TM44 Rest", rom_addresses["Missable_SS_Anne_B1F_Item_2"], Missable(118)), - LocationData("S.S. Anne B1F", "Item 3", "Max Potion", rom_addresses["Missable_SS_Anne_B1F_Item_3"], + LocationData("S.S. Anne B1F Rooms-Machoke Room", "Machoke Room Item", "Max Potion", rom_addresses["Missable_SS_Anne_B1F_Item_3"], Missable(119)), LocationData("Victory Road 3F", "Northeast Item", "Max Revive", rom_addresses["Missable_Victory_Road_3F_Item_1"], Missable(120)), @@ -242,7 +259,7 @@ location_data = [ Missable(121)), LocationData("Rocket Hideout B1F", "West Item", "Escape Rope", rom_addresses["Missable_Rocket_Hideout_B1F_Item_1"], Missable(123)), - LocationData("Rocket Hideout B1F", "Southwest Item", "Hyper Potion", + LocationData("Rocket Hideout B1F-S", "Southwest Item", "Hyper Potion", rom_addresses["Missable_Rocket_Hideout_B1F_Item_2"], Missable(124)), LocationData("Rocket Hideout B2F", "Northwest Left Item", "Moon Stone", rom_addresses["Missable_Rocket_Hideout_B2F_Item_1"], Missable(125)), @@ -256,32 +273,32 @@ location_data = [ rom_addresses["Missable_Rocket_Hideout_B3F_Item_1"], Missable(129)), LocationData("Rocket Hideout B3F", "Center Item", "Rare Candy", rom_addresses["Missable_Rocket_Hideout_B3F_Item_2"], Missable(130)), - LocationData("Rocket Hideout B4F", "West Item", "HP Up", rom_addresses["Missable_Rocket_Hideout_B4F_Item_1"], + LocationData("Rocket Hideout B4F-NW", "West Item", "HP Up", rom_addresses["Missable_Rocket_Hideout_B4F_Item_1"], Missable(132)), - LocationData("Rocket Hideout B4F", "Northwest Item", "TM02 Razor Wind", + LocationData("Rocket Hideout B4F-NW", "Northwest Item", "TM02 Razor Wind", rom_addresses["Missable_Rocket_Hideout_B4F_Item_2"], Missable(133)), - LocationData("Rocket Hideout B4F", "Southwest Item (Lift Key)", "Iron", rom_addresses["Missable_Rocket_Hideout_B4F_Item_3"], + LocationData("Rocket Hideout B4F", "Southwest Item", "Iron", rom_addresses["Missable_Rocket_Hideout_B4F_Item_3"], Missable(134)), - LocationData("Rocket Hideout B4F", "Giovanni Item (Lift Key)", "Silph Scope", + LocationData("Rocket Hideout B4F", "Giovanni Item", "Silph Scope", rom_addresses["Missable_Rocket_Hideout_B4F_Item_4"], [EventFlag(0x6A7), Missable(135)]), - LocationData("Rocket Hideout B4F", "Rocket Grunt Item", "Lift Key", rom_addresses["Missable_Rocket_Hideout_B4F_Item_5"], + LocationData("Rocket Hideout B4F-NW", "Rocket Grunt Item", "Lift Key", rom_addresses["Missable_Rocket_Hideout_B4F_Item_5"], [EventFlag(0x6A6), Missable(136)]), - LocationData("Silph Co 3F", "Item (Card Key)", "Hyper Potion", rom_addresses["Missable_Silph_Co_3F_Item"], Missable(144)), - LocationData("Silph Co 4F", "Left Item (Card Key)", "Full Heal", rom_addresses["Missable_Silph_Co_4F_Item_1"], + LocationData("Silph Co 3F-W", "Item", "Hyper Potion", rom_addresses["Missable_Silph_Co_3F_Item"], Missable(144)), + LocationData("Silph Co 4F-W", "Left Item", "Full Heal", rom_addresses["Missable_Silph_Co_4F_Item_1"], Missable(148)), - LocationData("Silph Co 4F", "Middle Item (Card Key)", "Max Revive", rom_addresses["Missable_Silph_Co_4F_Item_2"], + LocationData("Silph Co 4F-W", "Middle Item", "Max Revive", rom_addresses["Missable_Silph_Co_4F_Item_2"], Missable(149)), - LocationData("Silph Co 4F", "Right Item (Card Key)", "Escape Rope", rom_addresses["Missable_Silph_Co_4F_Item_3"], + LocationData("Silph Co 4F-W", "Right Item", "Escape Rope", rom_addresses["Missable_Silph_Co_4F_Item_3"], Missable(150)), - LocationData("Silph Co 5F", "Southwest Item", "TM09 Take Down", rom_addresses["Missable_Silph_Co_5F_Item_1"], + LocationData("Silph Co 5F-SW", "Southwest Item", "TM09 Take Down", rom_addresses["Missable_Silph_Co_5F_Item_1"], Missable(155)), - LocationData("Silph Co 5F", "Northwest Item (Card Key)", "Protein", rom_addresses["Missable_Silph_Co_5F_Item_2"], Missable(156)), + LocationData("Silph Co 5F-NW", "Northwest Item", "Protein", rom_addresses["Missable_Silph_Co_5F_Item_2"], Missable(156)), LocationData("Silph Co 5F", "Southeast Item", "Card Key", rom_addresses["Missable_Silph_Co_5F_Item_3"], Missable(157)), - LocationData("Silph Co 6F", "West Item (Card Key)", "HP Up", rom_addresses["Missable_Silph_Co_6F_Item_1"], Missable(161)), - LocationData("Silph Co 6F", "Southwest Item (Card Key)", "X Accuracy", rom_addresses["Missable_Silph_Co_6F_Item_2"], + LocationData("Silph Co 6F-SW", "Southwest Top Item", "HP Up", rom_addresses["Missable_Silph_Co_6F_Item_1"], Missable(161)), + LocationData("Silph Co 6F-SW", "Southwest Bottom Item", "X Accuracy", rom_addresses["Missable_Silph_Co_6F_Item_2"], Missable(162)), LocationData("Silph Co 7F", "West Item", "Calcium", rom_addresses["Missable_Silph_Co_7F_Item_1"], Missable(168)), - LocationData("Silph Co 7F", "East Item (Card Key)", "TM03 Swords Dance", rom_addresses["Missable_Silph_Co_7F_Item_2"], + LocationData("Silph Co 7F-E", "East Item", "TM03 Swords Dance", rom_addresses["Missable_Silph_Co_7F_Item_2"], Missable(169)), LocationData("Silph Co 10F", "Left Item", "TM26 Earthquake", rom_addresses["Missable_Silph_Co_10F_Item_1"], Missable(180)), @@ -290,7 +307,7 @@ location_data = [ LocationData("Silph Co 10F", "Right Item", "Carbos", rom_addresses["Missable_Silph_Co_10F_Item_3"], Missable(182)), LocationData("Pokemon Mansion 2F", "Northeast Item", "Calcium", rom_addresses["Missable_Pokemon_Mansion_2F_Item"], Missable(187)), - LocationData("Pokemon Mansion 3F", "Southwest Item", "Max Potion", rom_addresses["Missable_Pokemon_Mansion_3F_Item_1"], + LocationData("Pokemon Mansion 3F-SW", "Southwest Item", "Max Potion", rom_addresses["Missable_Pokemon_Mansion_3F_Item_1"], Missable(188)), LocationData("Pokemon Mansion 3F", "Northeast Item", "Iron", rom_addresses["Missable_Pokemon_Mansion_3F_Item_2"], Missable(189)), @@ -318,19 +335,19 @@ location_data = [ rom_addresses["Missable_Safari_Zone_North_Item_2"], Missable(200)), LocationData("Safari Zone West", "Southwest Item", "Max Potion", rom_addresses["Missable_Safari_Zone_West_Item_1"], Missable(201)), - LocationData("Safari Zone West", "Northwest Item", "TM32 Double Team", + LocationData("Safari Zone West-NW", "Northwest Item", "TM32 Double Team", rom_addresses["Missable_Safari_Zone_West_Item_2"], Missable(202)), LocationData("Safari Zone West", "Southeast Item", "Max Revive", rom_addresses["Missable_Safari_Zone_West_Item_3"], Missable(203)), - LocationData("Safari Zone West", "Northeast Item", "Gold Teeth", rom_addresses["Missable_Safari_Zone_West_Item_4"], + LocationData("Safari Zone West-NW", "Northeast Item", "Gold Teeth", rom_addresses["Missable_Safari_Zone_West_Item_4"], Missable(204)), - LocationData("Safari Zone Center", "Island Item", "Nugget", rom_addresses["Missable_Safari_Zone_Center_Item"], + LocationData("Safari Zone Center-C", "Island Item", "Nugget", rom_addresses["Missable_Safari_Zone_Center_Item"], Missable(205)), - LocationData("Cerulean Cave 2F", "East Item", "PP Up", rom_addresses["Missable_Cerulean_Cave_2F_Item_1"], + LocationData("Cerulean Cave 2F-E", "East Item", "PP Up", rom_addresses["Missable_Cerulean_Cave_2F_Item_1"], Missable(206)), - LocationData("Cerulean Cave 2F", "Southwest Item", "Ultra Ball", rom_addresses["Missable_Cerulean_Cave_2F_Item_2"], + LocationData("Cerulean Cave 2F-W", "Southwest Item", "Ultra Ball", rom_addresses["Missable_Cerulean_Cave_2F_Item_2"], Missable(207)), - LocationData("Cerulean Cave 2F", "North Item", "Full Restore", rom_addresses["Missable_Cerulean_Cave_2F_Item_3"], + LocationData("Cerulean Cave 2F-N", "North Item", "Full Restore", rom_addresses["Missable_Cerulean_Cave_2F_Item_3"], Missable(208)), LocationData("Cerulean Cave B1F", "Center Item", "Ultra Ball", rom_addresses["Missable_Cerulean_Cave_B1F_Item_1"], Missable(210)), @@ -340,101 +357,101 @@ location_data = [ Missable(212)), LocationData("Victory Road 1F", "Left Item", "Rare Candy", rom_addresses["Missable_Victory_Road_1F_Item_2"], Missable(213)), - LocationData("Rock Tunnel B1F", "Southwest Item", "Hideout Key", rom_addresses["Missable_Rock_Tunnel_B1F_Item_1"], + LocationData("Rock Tunnel B1F-E", "Southwest Item", "Hideout Key", rom_addresses["Missable_Rock_Tunnel_B1F_Item_1"], Missable(231), inclusion=extra_key_items), - LocationData("Rock Tunnel B1F", "West Item", "Mansion Key", rom_addresses["Missable_Rock_Tunnel_B1F_Item_2"], + LocationData("Rock Tunnel B1F-W", "West Item", "Mansion Key", rom_addresses["Missable_Rock_Tunnel_B1F_Item_2"], Missable(232), inclusion=extra_key_items), - LocationData("Rock Tunnel B1F", "Northwest Item", "Plant Key", rom_addresses["Missable_Rock_Tunnel_B1F_Item_3"], + LocationData("Rock Tunnel B1F-W", "Northwest Item", "Plant Key", rom_addresses["Missable_Rock_Tunnel_B1F_Item_3"], Missable(233), inclusion=extra_key_items), - LocationData("Rock Tunnel B1F", "North Item", "Safari Pass", rom_addresses["Missable_Rock_Tunnel_B1F_Item_4"], + LocationData("Rock Tunnel B1F-W", "North Item", "Safari Pass", rom_addresses["Missable_Rock_Tunnel_B1F_Item_4"], Missable(234), inclusion=extra_key_items), - LocationData("Pewter Gym", "Brock 1", "Boulder Badge", rom_addresses['Badge_Pewter_Gym'], EventFlag(0x8A0)), - LocationData("Cerulean Gym", "Misty 1", "Cascade Badge", rom_addresses['Badge_Cerulean_Gym'], EventFlag(0x8A1)), - LocationData("Vermilion Gym", "Lt. Surge 1", "Thunder Badge", rom_addresses['Badge_Vermilion_Gym'], EventFlag(0x8A2)), - LocationData("Celadon Gym", "Erika 1", "Rainbow Badge", rom_addresses['Badge_Celadon_Gym'], EventFlag(0x8A3)), - LocationData("Fuchsia Gym", "Koga 1", "Soul Badge", rom_addresses['Badge_Fuchsia_Gym'], EventFlag(0x8A4)), - LocationData("Saffron Gym", "Sabrina 1", "Marsh Badge", rom_addresses['Badge_Saffron_Gym'], EventFlag(0x8A5)), - LocationData("Cinnabar Gym", "Blaine 1", "Volcano Badge", rom_addresses['Badge_Cinnabar_Gym'], EventFlag(0x8A6)), - LocationData("Viridian Gym", "Giovanni 1", "Earth Badge", rom_addresses['Badge_Viridian_Gym'], EventFlag(0x8A7)), + LocationData("Pewter Gym", "Brock Prize", "Boulder Badge", rom_addresses['Badge_Pewter_Gym'], EventFlag(0x8A0)), + LocationData("Cerulean Gym", "Misty Prize", "Cascade Badge", rom_addresses['Badge_Cerulean_Gym'], EventFlag(0x8A1)), + LocationData("Vermilion Gym", "Lt. Surge Prize", "Thunder Badge", rom_addresses['Badge_Vermilion_Gym'], EventFlag(0x8A2)), + LocationData("Celadon Gym-C", "Erika Prize", "Rainbow Badge", rom_addresses['Badge_Celadon_Gym'], EventFlag(0x8A3)), + LocationData("Fuchsia Gym", "Koga Prize", "Soul Badge", rom_addresses['Badge_Fuchsia_Gym'], EventFlag(0x8A4)), + LocationData("Saffron Gym-C", "Sabrina Prize", "Marsh Badge", rom_addresses['Badge_Saffron_Gym'], EventFlag(0x8A5)), + LocationData("Cinnabar Gym", "Blaine Prize", "Volcano Badge", rom_addresses['Badge_Cinnabar_Gym'], EventFlag(0x8A6)), + LocationData("Viridian Gym", "Giovanni Prize", "Earth Badge", rom_addresses['Badge_Viridian_Gym'], EventFlag(0x8A7)), LocationData("Viridian Forest", "Hidden Item Northwest by Trainer", "Potion", rom_addresses['Hidden_Item_Viridian_Forest_1'], Hidden(0), inclusion=hidden_items), LocationData("Viridian Forest", "Hidden Item Entrance Tree", "Antidote", rom_addresses['Hidden_Item_Viridian_Forest_2'], Hidden(1), inclusion=hidden_items), - LocationData("Mt Moon B2F", "Hidden Item Dead End Before Fossils", "Moon Stone", rom_addresses['Hidden_Item_MtMoonB2F_1'], Hidden(2), inclusion=hidden_items), + LocationData("Mt Moon B2F", "Hidden Item Dead End Before Fossils", "Moon Stone", rom_addresses['Hidden_Item_MtMoonB2F_1'], Hidden(2), inclusion=hidden_moon_stones), LocationData("Route 25", "Hidden Item Fence Outside Bill's House", "Ether", rom_addresses['Hidden_Item_Route_25_1'], Hidden(3), inclusion=hidden_items), LocationData("Route 9", "Hidden Item Bush By Grass", "Ether", rom_addresses['Hidden_Item_Route_9'], Hidden(4), inclusion=hidden_items), - LocationData("S.S. Anne 1F", "Hidden Item Kitchen Trash", "Great Ball", rom_addresses['Hidden_Item_SS_Anne_Kitchen'], Hidden(5), inclusion=hidden_items), - LocationData("S.S. Anne B1F", "Hidden Item Under Pillow", "Hyper Potion", rom_addresses['Hidden_Item_SS_Anne_B1F'], Hidden(6), inclusion=hidden_items), - LocationData("Route 10 North", "Hidden Item Behind Rock Tunnel Entrance Cuttable Tree", "Super Potion", rom_addresses['Hidden_Item_Route_10_1'], Hidden(7), inclusion=hidden_items), - LocationData("Route 10 South", "Hidden Item Bush", "Max Ether", rom_addresses['Hidden_Item_Route_10_2'], Hidden(8), inclusion=hidden_items), + LocationData("S.S. Anne Kitchen", "Hidden Item Kitchen Trash", "Great Ball", rom_addresses['Hidden_Item_SS_Anne_Kitchen'], Hidden(5), inclusion=hidden_items), + LocationData("S.S. Anne B1F Rooms-Fisherman Room", "Hidden Item Under Pillow", "Hyper Potion", rom_addresses['Hidden_Item_SS_Anne_B1F'], Hidden(6), inclusion=hidden_items), + LocationData("Route 10-N", "Hidden Item Behind Rock Tunnel Entrance Cuttable Tree", "Super Potion", rom_addresses['Hidden_Item_Route_10_1'], Hidden(7), inclusion=hidden_items), + LocationData("Route 10-S", "Hidden Item Bush", "Max Ether", rom_addresses['Hidden_Item_Route_10_2'], Hidden(8), inclusion=hidden_items), LocationData("Rocket Hideout B1F", "Hidden Item Pot Plant", "PP Up", rom_addresses['Hidden_Item_Rocket_Hideout_B1F'], Hidden(9), inclusion=hidden_items), LocationData("Rocket Hideout B3F", "Hidden Item Near East Item", "Nugget", rom_addresses['Hidden_Item_Rocket_Hideout_B3F'], Hidden(10), inclusion=hidden_items), - LocationData("Rocket Hideout B4F", "Hidden Item Behind Giovanni (Lift Key)", "Super Potion", rom_addresses['Hidden_Item_Rocket_Hideout_B4F'], Hidden(11), inclusion=hidden_items), + LocationData("Rocket Hideout B4F", "Hidden Item Behind Giovanni", "Super Potion", rom_addresses['Hidden_Item_Rocket_Hideout_B4F'], Hidden(11), inclusion=hidden_items), LocationData("Pokemon Tower 5F", "Hidden Item Near West Staircase", "Elixir", rom_addresses['Hidden_Item_Pokemon_Tower_5F'], Hidden(12), inclusion=hidden_items), LocationData("Route 13", "Hidden Item Dead End Bush", "PP Up", rom_addresses['Hidden_Item_Route_13_1'], Hidden(13), inclusion=hidden_items), LocationData("Route 13", "Hidden Item Dead End By Water Corner", "Calcium", rom_addresses['Hidden_Item_Route_13_2'], Hidden(14), inclusion=hidden_items), LocationData("Pokemon Mansion B1F", "Hidden Item Secret Key Room Corner", "Rare Candy", rom_addresses['Hidden_Item_Pokemon_Mansion_B1F'], Hidden(15), inclusion=hidden_items), - LocationData("Safari Zone West", "Hidden Item Secret House Statue", "Revive", rom_addresses['Hidden_Item_Safari_Zone_West'], Hidden(17), inclusion=hidden_items), + LocationData("Safari Zone West-NW", "Hidden Item Secret House Statue", "Revive", rom_addresses['Hidden_Item_Safari_Zone_West'], Hidden(17), inclusion=hidden_items), LocationData("Silph Co 5F", "Hidden Item Pot Plant", "Elixir", rom_addresses['Hidden_Item_Silph_Co_5F'], Hidden(18), inclusion=hidden_items), - LocationData("Silph Co 9F", "Hidden Item Nurse Bed (Card Key)", "Max Potion", rom_addresses['Hidden_Item_Silph_Co_9F'], Hidden(19), inclusion=hidden_items), - LocationData("Copycat's House", "Hidden Item Desk", "Nugget", rom_addresses['Hidden_Item_Copycats_House'], Hidden(20), inclusion=hidden_items), - LocationData("Cerulean Cave 1F", "Hidden Item Center Rocks", "Rare Candy", rom_addresses['Hidden_Item_Cerulean_Cave_1F'], Hidden(21), inclusion=hidden_items), - LocationData("Cerulean Cave B1F", "Hidden Item Northeast Rocks", "Ultra Ball", rom_addresses['Hidden_Item_Cerulean_Cave_B1F'], Hidden(22), inclusion=hidden_items), + LocationData("Silph Co 9F-SW", "Hidden Item Nurse Bed", "Max Potion", rom_addresses['Hidden_Item_Silph_Co_9F'], Hidden(19), inclusion=hidden_items), + LocationData("Saffron Copycat's House 2F", "Hidden Item Desk", "Nugget", rom_addresses['Hidden_Item_Copycats_House'], Hidden(20), inclusion=hidden_items), + LocationData("Cerulean Cave 1F-NW", "Hidden Item Center Rocks", "Rare Candy", rom_addresses['Hidden_Item_Cerulean_Cave_1F'], Hidden(21), inclusion=hidden_items), + LocationData("Cerulean Cave B1F-E", "Hidden Item Northeast Rocks", "Ultra Ball", rom_addresses['Hidden_Item_Cerulean_Cave_B1F'], Hidden(22), inclusion=hidden_items), LocationData("Power Plant", "Hidden Item Central Dead End", "Max Elixir", rom_addresses['Hidden_Item_Power_Plant_1'], Hidden(23), inclusion=hidden_items), LocationData("Power Plant", "Hidden Item Before Zapdos", "PP Up", rom_addresses['Hidden_Item_Power_Plant_2'], Hidden(24), inclusion=hidden_items), - LocationData("Seafoam Islands B2F", "Hidden Item Rock", "Nugget", rom_addresses['Hidden_Item_Seafoam_Islands_B2F'], Hidden(25), inclusion=hidden_items), - LocationData("Seafoam Islands B4F", "Hidden Item Corner Island", "Ultra Ball", rom_addresses['Hidden_Item_Seafoam_Islands_B4F'], Hidden(26), inclusion=hidden_items), - LocationData("Pokemon Mansion 1F", "Hidden Item Block Near Entrance Carpet", "Moon Stone", rom_addresses['Hidden_Item_Pokemon_Mansion_1F'], Hidden(27), inclusion=hidden_items), - LocationData("Pokemon Mansion 3F", "Hidden Item Behind Burglar", "Max Revive", rom_addresses['Hidden_Item_Pokemon_Mansion_3F'], Hidden(28), inclusion=hidden_items), - LocationData("Route 23", "Hidden Item Rocks Before Victory Road", "Full Restore", rom_addresses['Hidden_Item_Route_23_1'], Hidden(29), inclusion=hidden_items), - LocationData("Route 23", "Hidden Item East Bush After Water", "Ultra Ball", rom_addresses['Hidden_Item_Route_23_2'], Hidden(30), inclusion=hidden_items), - LocationData("Route 23", "Hidden Item On Island", "Max Ether", rom_addresses['Hidden_Item_Route_23_3'], Hidden(31), inclusion=hidden_items), - LocationData("Victory Road 2F", "Hidden Item Rock Before Moltres", "Ultra Ball", rom_addresses['Hidden_Item_Victory_Road_2F_1'], Hidden(32), inclusion=hidden_items), - LocationData("Victory Road 2F", "Hidden Item Rock In Final Room", "Full Restore", rom_addresses['Hidden_Item_Victory_Road_2F_2'], Hidden(33), inclusion=hidden_items), + LocationData("Seafoam Islands B2F-NW", "Hidden Item Rock", "Nugget", rom_addresses['Hidden_Item_Seafoam_Islands_B2F'], Hidden(25), inclusion=hidden_items), + LocationData("Seafoam Islands B4F-W", "Hidden Item Corner Island", "Ultra Ball", rom_addresses['Hidden_Item_Seafoam_Islands_B4F'], Hidden(26), inclusion=hidden_items), + LocationData("Pokemon Mansion 1F", "Hidden Item Block Near Entrance Carpet", "Moon Stone", rom_addresses['Hidden_Item_Pokemon_Mansion_1F'], Hidden(27), inclusion=hidden_moon_stones), + LocationData("Pokemon Mansion 3F-SW", "Hidden Item Behind Burglar", "Max Revive", rom_addresses['Hidden_Item_Pokemon_Mansion_3F'], Hidden(28), inclusion=hidden_items), + LocationData("Route 23-Grass", "Hidden Item Rocks Before Victory Road", "Full Restore", rom_addresses['Hidden_Item_Route_23_1'], Hidden(29), inclusion=hidden_items), + LocationData("Route 23-Grass", "Hidden Item East Bush After Water", "Ultra Ball", rom_addresses['Hidden_Item_Route_23_2'], Hidden(30), inclusion=hidden_items), + LocationData("Route 23-S", "Hidden Item On Island", "Max Ether", rom_addresses['Hidden_Item_Route_23_3'], Hidden(31), inclusion=hidden_items), + LocationData("Victory Road 2F-NW", "Hidden Item Rock Before Moltres", "Ultra Ball", rom_addresses['Hidden_Item_Victory_Road_2F_1'], Hidden(32), inclusion=hidden_items), + LocationData("Victory Road 2F-E", "Hidden Item Rock In Final Room", "Full Restore", rom_addresses['Hidden_Item_Victory_Road_2F_2'], Hidden(33), inclusion=hidden_items), LocationData("Viridian City", "Hidden Item Cuttable Tree", "Potion", rom_addresses['Hidden_Item_Viridian_City'], Hidden(35), inclusion=hidden_items), LocationData("Route 11", "Hidden Item Isolated Bush Near Gate", "Potion", rom_addresses['Hidden_Item_Route_11'], Hidden(36), inclusion=hidden_items), - LocationData("Route 12 West", "Hidden Item Bush Near Gate", "Hyper Potion", rom_addresses['Hidden_Item_Route_12'], Hidden(37), inclusion=hidden_items), + LocationData("Route 12-W", "Hidden Item Bush Near Gate", "Hyper Potion", rom_addresses['Hidden_Item_Route_12'], Hidden(37), inclusion=hidden_items), LocationData("Route 17", "Hidden Item In Grass", "Rare Candy", rom_addresses['Hidden_Item_Route_17_1'], Hidden(38), inclusion=hidden_items), LocationData("Route 17", "Hidden Item Near Northernmost Sign", "Full Restore", rom_addresses['Hidden_Item_Route_17_2'], Hidden(39), inclusion=hidden_items), LocationData("Route 17", "Hidden Item East Center", "PP Up", rom_addresses['Hidden_Item_Route_17_3'], Hidden(40), inclusion=hidden_items), LocationData("Route 17", "Hidden Item West Center", "Max Revive", rom_addresses['Hidden_Item_Route_17_4'], Hidden(41), inclusion=hidden_items), LocationData("Route 17", "Hidden Item Before Final Bridge", "Max Elixir", rom_addresses['Hidden_Item_Route_17_5'], Hidden(42), inclusion=hidden_items), - LocationData("Underground Tunnel North-South", "Hidden Item Near Northern Stairs", "Full Restore", rom_addresses['Hidden_Item_Underground_Path_NS_1'], Hidden(43), inclusion=hidden_items), - LocationData("Underground Tunnel North-South", "Hidden Item Near Southern Stairs", "X Special", rom_addresses['Hidden_Item_Underground_Path_NS_2'], Hidden(44), inclusion=hidden_items), - LocationData("Underground Tunnel West-East", "Hidden Item West", "Nugget", rom_addresses['Hidden_Item_Underground_Path_WE_1'], Hidden(45), inclusion=hidden_items), - LocationData("Underground Tunnel West-East", "Hidden Item East", "Elixir", rom_addresses['Hidden_Item_Underground_Path_WE_2'], Hidden(46), inclusion=hidden_items), + LocationData("Underground Path North South", "Hidden Item Near Northern Stairs", "Full Restore", rom_addresses['Hidden_Item_Underground_Path_NS_1'], Hidden(43), inclusion=hidden_items), + LocationData("Underground Path North South", "Hidden Item Near Southern Stairs", "X Special", rom_addresses['Hidden_Item_Underground_Path_NS_2'], Hidden(44), inclusion=hidden_items), + LocationData("Underground Path West East", "Hidden Item West", "Nugget", rom_addresses['Hidden_Item_Underground_Path_WE_1'], Hidden(45), inclusion=hidden_items), + LocationData("Underground Path West East", "Hidden Item East", "Elixir", rom_addresses['Hidden_Item_Underground_Path_WE_2'], Hidden(46), inclusion=hidden_items), LocationData("Celadon City", "Hidden Item Dead End Near Cuttable Tree", "PP Up", rom_addresses['Hidden_Item_Celadon_City'], Hidden(47), inclusion=hidden_items), LocationData("Route 25", "Hidden Item Northeast Of Grass", "Elixir", rom_addresses['Hidden_Item_Route_25_2'], Hidden(48), inclusion=hidden_items), - LocationData("Mt Moon B2F", "Hidden Item Lone Rock", "Ether", rom_addresses['Hidden_Item_MtMoonB2F_2'], Hidden(49), inclusion=hidden_items), + LocationData("Mt Moon B2F-NE", "Hidden Item Lone Rock", "Ether", rom_addresses['Hidden_Item_MtMoonB2F_2'], Hidden(49), inclusion=hidden_items), LocationData("Seafoam Islands B3F", "Hidden Item Rock", "Max Elixir", rom_addresses['Hidden_Item_Seafoam_Islands_B3F'], Hidden(50), inclusion=hidden_items), LocationData("Vermilion City", "Hidden Item In Water Near Fan Club", "Max Ether", rom_addresses['Hidden_Item_Vermilion_City'], Hidden(51), inclusion=hidden_items), - LocationData("Cerulean City", "Hidden Item Gym Badge Guy's Backyard", "Rare Candy", rom_addresses['Hidden_Item_Cerulean_City'], Hidden(52), inclusion=hidden_items), - LocationData("Route 4", "Hidden Item Plateau East Of Mt Moon", "Great Ball", rom_addresses['Hidden_Item_Route_4'], Hidden(53), inclusion=hidden_items), + LocationData("Cerulean City-Badge House Backyard", "Hidden Item Gym Badge Guy's Backyard", "Rare Candy", rom_addresses['Hidden_Item_Cerulean_City'], Hidden(52), inclusion=hidden_items), + LocationData("Route 4-E", "Hidden Item Plateau East Of Mt Moon", "Great Ball", rom_addresses['Hidden_Item_Route_4'], Hidden(53), inclusion=hidden_items), - LocationData("Pallet Town", "Oak's Parcel Reward", "Pokedex", rom_addresses["Event_Pokedex"], EventFlag(0x38)), + LocationData("Oak's Lab", "Oak's Parcel Reward", "Pokedex", rom_addresses["Event_Pokedex"], EventFlag(0x38)), - LocationData("Pokemon Mansion 1F", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_MANSION_1_TRAINER_0_ITEM"], EventFlag(376), inclusion=trainersanity), + LocationData("Pokemon Mansion 1F-SE", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_MANSION_1_TRAINER_0_ITEM"], EventFlag(376), inclusion=trainersanity), LocationData("Pokemon Mansion 2F", "Burglar", None, rom_addresses["Trainersanity_EVENT_BEAT_MANSION_2_TRAINER_0_ITEM"], EventFlag(43), inclusion=trainersanity), - LocationData("Pokemon Mansion 3F", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_MANSION_3_TRAINER_1_ITEM"], EventFlag(31), inclusion=trainersanity), - LocationData("Pokemon Mansion 3F", "Burglar", None, rom_addresses["Trainersanity_EVENT_BEAT_MANSION_3_TRAINER_0_ITEM"], EventFlag(42), inclusion=trainersanity), + LocationData("Pokemon Mansion 3F-SE", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_MANSION_3_TRAINER_1_ITEM"], EventFlag(31), inclusion=trainersanity), + LocationData("Pokemon Mansion 3F-SW", "Burglar", None, rom_addresses["Trainersanity_EVENT_BEAT_MANSION_3_TRAINER_0_ITEM"], EventFlag(42), inclusion=trainersanity), LocationData("Pokemon Mansion B1F", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_MANSION_4_TRAINER_1_ITEM"], EventFlag(29), inclusion=trainersanity), LocationData("Pokemon Mansion B1F", "Burglar", None, rom_addresses["Trainersanity_EVENT_BEAT_MANSION_4_TRAINER_0_ITEM"], EventFlag(30), inclusion=trainersanity), LocationData("Silph Co 11F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_11F_TRAINER_1_ITEM"], EventFlag(45), inclusion=trainersanity), - LocationData("Silph Co 11F", "Rocket 2 (Card Key)", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_11F_TRAINER_0_ITEM"], EventFlag(46), inclusion=trainersanity), + LocationData("Silph Co 11F-W", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_11F_TRAINER_0_ITEM"], EventFlag(46), inclusion=trainersanity), LocationData("Silph Co 10F", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_10F_TRAINER_1_ITEM"], EventFlag(47), inclusion=trainersanity), LocationData("Silph Co 10F", "Rocket", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_10F_TRAINER_0_ITEM"], EventFlag(48), inclusion=trainersanity), LocationData("Silph Co 9F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_9F_TRAINER_2_ITEM"], EventFlag(49), inclusion=trainersanity), LocationData("Silph Co 9F", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_9F_TRAINER_1_ITEM"], EventFlag(50), inclusion=trainersanity), - LocationData("Silph Co 9F", "Rocket 2 (Card Key)", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_9F_TRAINER_0_ITEM"], EventFlag(51), inclusion=trainersanity), + LocationData("Silph Co 9F-NW", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_9F_TRAINER_0_ITEM"], EventFlag(51), inclusion=trainersanity), LocationData("Silph Co 8F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_8F_TRAINER_0_ITEM"], EventFlag(54), inclusion=trainersanity), LocationData("Silph Co 8F", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_8F_TRAINER_2_ITEM"], EventFlag(52), inclusion=trainersanity), LocationData("Silph Co 8F", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_8F_TRAINER_1_ITEM"], EventFlag(53), inclusion=trainersanity), LocationData("Silph Co 7F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_2_ITEM"], EventFlag(58), inclusion=trainersanity), LocationData("Silph Co 7F", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_0_ITEM"], EventFlag(60), inclusion=trainersanity), LocationData("Silph Co 7F", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_1_ITEM"], EventFlag(59), inclusion=trainersanity), - LocationData("Silph Co 7F", "Rocket 3", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_3_ITEM"], EventFlag(55), inclusion=trainersanity), + LocationData("Silph Co 7F-SE", "Rocket 3", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_3_ITEM"], EventFlag(55), inclusion=trainersanity), LocationData("Silph Co 6F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_0_ITEM"], EventFlag(64), inclusion=trainersanity), LocationData("Silph Co 6F", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_1_ITEM"], EventFlag(63), inclusion=trainersanity), LocationData("Silph Co 6F", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_2_ITEM"], EventFlag(62), inclusion=trainersanity), @@ -444,40 +461,40 @@ location_data = [ LocationData("Silph Co 5F", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_0_ITEM"], EventFlag(68), inclusion=trainersanity), LocationData("Silph Co 4F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_2_ITEM"], EventFlag(69), inclusion=trainersanity), LocationData("Silph Co 4F", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_0_ITEM"], EventFlag(71), inclusion=trainersanity), - LocationData("Silph Co 4F", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_1_ITEM"], EventFlag(70), inclusion=trainersanity), - LocationData("Silph Co 3F", "Scientist (Card Key)", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_3F_TRAINER_1_ITEM"], EventFlag(72), inclusion=trainersanity), + LocationData("Silph Co 4F-N", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_1_ITEM"], EventFlag(70), inclusion=trainersanity), + LocationData("Silph Co 3F-W", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_3F_TRAINER_1_ITEM"], EventFlag(72), inclusion=trainersanity), LocationData("Silph Co 3F", "Rocket", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_3F_TRAINER_0_ITEM"], EventFlag(73), inclusion=trainersanity), LocationData("Silph Co 2F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_3_ITEM"], EventFlag(74), inclusion=trainersanity), LocationData("Silph Co 2F", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_2_ITEM"], EventFlag(75), inclusion=trainersanity), - LocationData("Silph Co 2F", "Scientist 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_1_ITEM"], EventFlag(76), inclusion=trainersanity), - LocationData("Silph Co 2F", "Scientist 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_0_ITEM"], EventFlag(77), inclusion=trainersanity), + LocationData("Silph Co 2F", "Scientist 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_1_ITEM"], EventFlag(76), inclusion=trainersanity), ## + LocationData("Silph Co 2F-SW", "Scientist 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_0_ITEM"], EventFlag(77), inclusion=trainersanity), ## LocationData("Rocket Hideout B1F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_0_ITEM"], EventFlag(99), inclusion=trainersanity), LocationData("Rocket Hideout B1F", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_1_ITEM"], EventFlag(98), inclusion=trainersanity), - LocationData("Rocket Hideout B1F", "Rocket 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_3_ITEM"], EventFlag(96), inclusion=trainersanity), - LocationData("Rocket Hideout B1F", "Rocket 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_2_ITEM"], EventFlag(97), inclusion=trainersanity), - LocationData("Rocket Hideout B1F", "Rocket 5 (Lift Key)", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_4_ITEM"], EventFlag(95), inclusion=trainersanity), + LocationData("Rocket Hideout B1F-S", "Rocket 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_3_ITEM"], EventFlag(96), inclusion=trainersanity), + LocationData("Rocket Hideout B1F-S", "Rocket 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_2_ITEM"], EventFlag(97), inclusion=trainersanity), + LocationData("Rocket Hideout B1F-SE", "Rocket 5", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_4_ITEM"], EventFlag(95), inclusion=trainersanity), LocationData("Rocket Hideout B2F", "Rocket", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_2_TRAINER_0_ITEM"], EventFlag(94), inclusion=trainersanity), LocationData("Rocket Hideout B3F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_1_ITEM"], EventFlag(92), inclusion=trainersanity), LocationData("Rocket Hideout B3F", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_0_ITEM"], EventFlag(93), inclusion=trainersanity), - LocationData("Rocket Hideout B4F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_2_ITEM"], EventFlag(79), inclusion=trainersanity), - LocationData("Rocket Hideout B4F", "Rocket 2 (Lift Key)", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_0_ITEM"], EventFlag(91), inclusion=trainersanity), - LocationData("Rocket Hideout B4F", "Rocket 3 (Lift Key)", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_1_ITEM"], EventFlag(90), inclusion=trainersanity), - LocationData("S.S. Anne 1F", "Gentleman 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_1_ITEM"], EventFlag(121), inclusion=trainersanity), - LocationData("S.S. Anne 1F", "Gentleman 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_0_ITEM"], EventFlag(122), inclusion=trainersanity), - LocationData("S.S. Anne 1F", "Lass", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_3_ITEM"], EventFlag(117), inclusion=trainersanity), - LocationData("S.S. Anne 1F", "Youngster", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_2_ITEM"], EventFlag(120), inclusion=trainersanity), - LocationData("S.S. Anne 2F", "Fisherman", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_1_ITEM"], EventFlag(115), inclusion=trainersanity), - LocationData("S.S. Anne 2F", "Gentleman 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_0_ITEM"], EventFlag(116), inclusion=trainersanity), - LocationData("S.S. Anne 2F", "Gentleman 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_2_ITEM"], EventFlag(113), inclusion=trainersanity), - LocationData("S.S. Anne 2F", "Lass", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_3_ITEM"], EventFlag(112), inclusion=trainersanity), - LocationData("S.S. Anne 3F", "Sailor 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_5_TRAINER_1_ITEM"], EventFlag(123), inclusion=trainersanity), - LocationData("S.S. Anne 3F", "Sailor 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_5_TRAINER_0_ITEM"], EventFlag(124), inclusion=trainersanity), - LocationData("S.S. Anne B1F", "Sailor 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_1_ITEM"], EventFlag(110), inclusion=trainersanity), - LocationData("S.S. Anne B1F", "Sailor 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_0_ITEM"], EventFlag(111), inclusion=trainersanity), - LocationData("S.S. Anne B1F", "Sailor 3", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_3_ITEM"], EventFlag(108), inclusion=trainersanity), - LocationData("S.S. Anne B1F", "Sailor 4", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_2_ITEM"], EventFlag(109), inclusion=trainersanity), - LocationData("S.S. Anne B1F", "Fisherman", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_5_ITEM"], EventFlag(106), inclusion=trainersanity), - LocationData("S.S. Anne B1F", "Sailor 5", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_4_ITEM"], EventFlag(107), inclusion=trainersanity), + LocationData("Rocket Hideout B4F-NW", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_2_ITEM"], EventFlag(79), inclusion=trainersanity), + LocationData("Rocket Hideout B4F", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_0_ITEM"], EventFlag(91), inclusion=trainersanity), + LocationData("Rocket Hideout B4F", "Rocket 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_1_ITEM"], EventFlag(90), inclusion=trainersanity), + LocationData("S.S. Anne 1F Rooms-West Gentleman Room", "Gentleman 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_1_ITEM"], EventFlag(121), inclusion=trainersanity), + LocationData("S.S. Anne 1F Rooms-East Gentleman Room", "Gentleman 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_0_ITEM"], EventFlag(122), inclusion=trainersanity), + LocationData("S.S. Anne 1F Rooms-Youngster and Lass Room", "Lass", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_3_ITEM"], EventFlag(117), inclusion=trainersanity), + LocationData("S.S. Anne 1F Rooms-Youngster and Lass Room", "Youngster", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_2_ITEM"], EventFlag(120), inclusion=trainersanity), + LocationData("S.S. Anne 2F Rooms-Fisherman and Gentleman Room", "Fisherman", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_1_ITEM"], EventFlag(115), inclusion=trainersanity), + LocationData("S.S. Anne 2F Rooms-Fisherman and Gentleman Room", "Gentleman 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_0_ITEM"], EventFlag(116), inclusion=trainersanity), + LocationData("S.S. Anne 2F Rooms-Gentleman and Lass Room", "Gentleman 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_2_ITEM"], EventFlag(113), inclusion=trainersanity), + LocationData("S.S. Anne 2F Rooms-Gentleman and Lass Room", "Lass", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_3_ITEM"], EventFlag(112), inclusion=trainersanity), + LocationData("S.S. Anne Bow", "Sailor 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_5_TRAINER_1_ITEM"], EventFlag(123), inclusion=trainersanity), + LocationData("S.S. Anne Bow", "Sailor 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_5_TRAINER_0_ITEM"], EventFlag(124), inclusion=trainersanity), + LocationData("S.S. Anne B1F Rooms-Two Sailors Room", "Sailor 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_1_ITEM"], EventFlag(110), inclusion=trainersanity), + LocationData("S.S. Anne B1F Rooms-Two Sailors Room", "Sailor 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_0_ITEM"], EventFlag(111), inclusion=trainersanity), + LocationData("S.S. Anne B1F Rooms-East Single Sailor Room", "Sailor 3", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_3_ITEM"], EventFlag(108), inclusion=trainersanity), + LocationData("S.S. Anne B1F Rooms-West Single Sailor Room", "Sailor 4", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_2_ITEM"], EventFlag(109), inclusion=trainersanity), + LocationData("S.S. Anne B1F Rooms-Fisherman Room", "Fisherman", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_5_ITEM"], EventFlag(106), inclusion=trainersanity), + LocationData("S.S. Anne B1F Rooms-Fisherman Room", "Sailor 5", None, rom_addresses["Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_4_ITEM"], EventFlag(107), inclusion=trainersanity), LocationData("Mt Moon 1F", "Bug Catcher 1", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_5_ITEM"], EventFlag(131), inclusion=trainersanity), LocationData("Mt Moon 1F", "Lass 1", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_4_ITEM"], EventFlag(132), inclusion=trainersanity), LocationData("Mt Moon 1F", "Super Nerd", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_3_ITEM"], EventFlag(133), inclusion=trainersanity), @@ -485,8 +502,8 @@ location_data = [ LocationData("Mt Moon 1F", "Lass 2", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_2_ITEM"], EventFlag(134), inclusion=trainersanity), LocationData("Mt Moon 1F", "Youngster", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_1_ITEM"], EventFlag(135), inclusion=trainersanity), LocationData("Mt Moon 1F", "Hiker", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_0_ITEM"], EventFlag(136), inclusion=trainersanity), - LocationData("Mt Moon B2F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_1_ITEM"], EventFlag(127), inclusion=trainersanity), - LocationData("Mt Moon B2F", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_2_ITEM"], EventFlag(126), inclusion=trainersanity), + LocationData("Mt Moon B2F-NE", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_1_ITEM"], EventFlag(127), inclusion=trainersanity), + LocationData("Mt Moon B2F-C", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_2_ITEM"], EventFlag(126), inclusion=trainersanity), LocationData("Mt Moon B2F", "Rocket 3", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_3_ITEM"], EventFlag(125), inclusion=trainersanity), LocationData("Mt Moon B2F", "Rocket 4", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_0_ITEM"], EventFlag(128), inclusion=trainersanity), LocationData("Viridian Forest", "Bug Catcher 1", None, rom_addresses["Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_0_ITEM"], EventFlag(139), inclusion=trainersanity), @@ -516,29 +533,29 @@ location_data = [ LocationData("Route 21", "Swimmer 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_4_ITEM"], EventFlag(170), inclusion=trainersanity), LocationData("Route 21", "Swimmer 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_6_ITEM"], EventFlag(168), inclusion=trainersanity), LocationData("Route 21", "Swimmer 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_5_ITEM"], EventFlag(169), inclusion=trainersanity), - LocationData("Route 20 West", "Beauty 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_9_ITEM"], EventFlag(175), inclusion=trainersanity), - LocationData("Route 20 West", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_8_ITEM"], EventFlag(176), inclusion=trainersanity), - LocationData("Route 20 West", "Beauty 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_7_ITEM"], EventFlag(177), inclusion=trainersanity), - LocationData("Route 20 West", "Bird Keeper", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_6_ITEM"], EventFlag(178), inclusion=trainersanity), - LocationData("Route 20 West", "Swimmer 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_4_ITEM"], EventFlag(180), inclusion=trainersanity), - LocationData("Route 20 West", "Jr. Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_3_ITEM"], EventFlag(181), inclusion=trainersanity), - LocationData("Route 20 East", "Beauty 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_2_ITEM"], EventFlag(182), inclusion=trainersanity), - LocationData("Route 20 East", "Beauty 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_1_ITEM"], EventFlag(183), inclusion=trainersanity), - LocationData("Route 20 East", "Swimmer 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_5_ITEM"], EventFlag(179), inclusion=trainersanity), - LocationData("Route 20 East", "Swimmer 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_0_ITEM"], EventFlag(184), inclusion=trainersanity), - LocationData("Route 19", "Swimmer 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_0_ITEM"], EventFlag(199), inclusion=trainersanity), - LocationData("Route 19", "Swimmer 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_1_ITEM"], EventFlag(198), inclusion=trainersanity), - LocationData("Route 19", "Swimmer 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_5_ITEM"], EventFlag(194), inclusion=trainersanity), - LocationData("Route 19", "Swimmer 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_2_ITEM"], EventFlag(197), inclusion=trainersanity), - LocationData("Route 19", "Swimmer 5", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_3_ITEM"], EventFlag(196), inclusion=trainersanity), - LocationData("Route 19", "Swimmer 6", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_4_ITEM"], EventFlag(195), inclusion=trainersanity), - LocationData("Route 19", "Swimmer 7", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_8_ITEM"], EventFlag(188), inclusion=trainersanity), - LocationData("Route 19", "Beauty 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_7_ITEM"], EventFlag(189), inclusion=trainersanity), - LocationData("Route 19", "Beauty 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_6_ITEM"], EventFlag(193), inclusion=trainersanity), - LocationData("Route 19", "Beauty 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_9_ITEM"], EventFlag(185), inclusion=trainersanity), - LocationData("Route 18", "Bird Keeper 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_2_ITEM"], EventFlag(200), inclusion=trainersanity), - LocationData("Route 18", "Bird Keeper 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_1_ITEM"], EventFlag(201), inclusion=trainersanity), - LocationData("Route 18", "Bird Keeper 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_0_ITEM"], EventFlag(202), inclusion=trainersanity), + LocationData("Route 20-W", "Beauty 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_9_ITEM"], EventFlag(175), inclusion=trainersanity), + LocationData("Route 20-W", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_8_ITEM"], EventFlag(176), inclusion=trainersanity), + LocationData("Route 20-W", "Beauty 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_7_ITEM"], EventFlag(177), inclusion=trainersanity), + LocationData("Route 20-W", "Bird Keeper", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_6_ITEM"], EventFlag(178), inclusion=trainersanity), + LocationData("Route 20-W", "Swimmer 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_4_ITEM"], EventFlag(180), inclusion=trainersanity), + LocationData("Route 20-W", "Jr. Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_3_ITEM"], EventFlag(181), inclusion=trainersanity), + LocationData("Route 20-E", "Beauty 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_2_ITEM"], EventFlag(182), inclusion=trainersanity), + LocationData("Route 20-E", "Beauty 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_1_ITEM"], EventFlag(183), inclusion=trainersanity), + LocationData("Route 20-E", "Swimmer 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_5_ITEM"], EventFlag(179), inclusion=trainersanity), + LocationData("Route 20-E", "Swimmer 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_0_ITEM"], EventFlag(184), inclusion=trainersanity), + LocationData("Route 19-N", "Swimmer 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_0_ITEM"], EventFlag(199), inclusion=trainersanity), + LocationData("Route 19-N", "Swimmer 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_1_ITEM"], EventFlag(198), inclusion=trainersanity), + LocationData("Route 19-S", "Swimmer 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_5_ITEM"], EventFlag(194), inclusion=trainersanity), + LocationData("Route 19-S", "Swimmer 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_2_ITEM"], EventFlag(197), inclusion=trainersanity), + LocationData("Route 19-S", "Swimmer 5", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_3_ITEM"], EventFlag(196), inclusion=trainersanity), + LocationData("Route 19-S", "Swimmer 6", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_4_ITEM"], EventFlag(195), inclusion=trainersanity), + LocationData("Route 19-S", "Swimmer 7", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_8_ITEM"], EventFlag(188), inclusion=trainersanity), + LocationData("Route 19-S", "Beauty 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_7_ITEM"], EventFlag(189), inclusion=trainersanity), + LocationData("Route 19-S", "Beauty 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_6_ITEM"], EventFlag(193), inclusion=trainersanity), + LocationData("Route 19-S", "Beauty 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_9_ITEM"], EventFlag(185), inclusion=trainersanity), + LocationData("Route 18-E", "Bird Keeper 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_2_ITEM"], EventFlag(200), inclusion=trainersanity), + LocationData("Route 18-E", "Bird Keeper 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_1_ITEM"], EventFlag(201), inclusion=trainersanity), + LocationData("Route 18-E", "Bird Keeper 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_0_ITEM"], EventFlag(202), inclusion=trainersanity), LocationData("Route 17", "Cue Ball 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_1_ITEM"], EventFlag(211), inclusion=trainersanity), LocationData("Route 17", "Biker 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_2_ITEM"], EventFlag(210), inclusion=trainersanity), LocationData("Route 17", "Cue Ball 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_0_ITEM"], EventFlag(212), inclusion=trainersanity), @@ -549,13 +566,13 @@ location_data = [ LocationData("Route 17", "Biker 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_8_ITEM"], EventFlag(204), inclusion=trainersanity), LocationData("Route 17", "Cue Ball 5", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_7_ITEM"], EventFlag(205), inclusion=trainersanity), LocationData("Route 17", "Biker 5", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_9_ITEM"], EventFlag(203), inclusion=trainersanity), - LocationData("Route 16 West", "Biker", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_0_ITEM"], EventFlag(219), inclusion=trainersanity), - LocationData("Route 16 West", "Cue Ball 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_1_ITEM"], EventFlag(218), inclusion=trainersanity), - LocationData("Route 16 West", "Cue Ball 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_2_ITEM"], EventFlag(217), inclusion=trainersanity), - LocationData("Route 16 West", "Biker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_3_ITEM"], EventFlag(216), inclusion=trainersanity), - LocationData("Route 16 West", "Cue Ball 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_4_ITEM"], EventFlag(215), inclusion=trainersanity), - LocationData("Route 16 West", "Biker 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_5_ITEM"], EventFlag(214), inclusion=trainersanity), - LocationData("Route 15", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_8_ITEM"], EventFlag(221), inclusion=trainersanity), + LocationData("Route 16-SW", "Biker", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_0_ITEM"], EventFlag(219), inclusion=trainersanity), + LocationData("Route 16-SW", "Cue Ball 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_1_ITEM"], EventFlag(218), inclusion=trainersanity), + LocationData("Route 16-SW", "Cue Ball 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_2_ITEM"], EventFlag(217), inclusion=trainersanity), + LocationData("Route 16-SW", "Biker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_3_ITEM"], EventFlag(216), inclusion=trainersanity), + LocationData("Route 16-SW", "Cue Ball 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_4_ITEM"], EventFlag(215), inclusion=trainersanity), + LocationData("Route 16-SW", "Biker 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_5_ITEM"], EventFlag(214), inclusion=trainersanity), + LocationData("Route 15-N", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_8_ITEM"], EventFlag(221), inclusion=trainersanity), LocationData("Route 15", "Beauty 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_4_ITEM"], EventFlag(225), inclusion=trainersanity), LocationData("Route 15", "Jr. Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_1_ITEM"], EventFlag(228), inclusion=trainersanity), LocationData("Route 15", "Biker 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_6_ITEM"], EventFlag(223), inclusion=trainersanity), @@ -575,9 +592,9 @@ location_data = [ LocationData("Route 14", "Biker 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_7_ITEM"], EventFlag(232), inclusion=trainersanity), LocationData("Route 14", "Biker 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_6_ITEM"], EventFlag(233), inclusion=trainersanity), LocationData("Route 14", "Bird Keeper 6", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_5_ITEM"], EventFlag(234), inclusion=trainersanity), - LocationData("Route 13 East", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_4_ITEM"], EventFlag(253), inclusion=trainersanity), - LocationData("Route 13 East", "Bird Keeper 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_0_ITEM"], EventFlag(257), inclusion=trainersanity), - LocationData("Route 13 East", "Jr. Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_1_ITEM"], EventFlag(256), inclusion=trainersanity), + LocationData("Route 13-E", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_4_ITEM"], EventFlag(253), inclusion=trainersanity), + LocationData("Route 13-E", "Bird Keeper 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_0_ITEM"], EventFlag(257), inclusion=trainersanity), + LocationData("Route 13-E", "Jr. Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_1_ITEM"], EventFlag(256), inclusion=trainersanity), LocationData("Route 13", "Beauty 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_6_ITEM"], EventFlag(248), inclusion=trainersanity), LocationData("Route 13", "Beauty 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_7_ITEM"], EventFlag(247), inclusion=trainersanity), LocationData("Route 13", "Jr. Trainer F 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_2_ITEM"], EventFlag(255), inclusion=trainersanity), @@ -585,13 +602,13 @@ location_data = [ LocationData("Route 13", "Bird Keeper 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_9_ITEM"], EventFlag(245), inclusion=trainersanity), LocationData("Route 13", "Bird Keeper 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_5_ITEM"], EventFlag(252), inclusion=trainersanity), LocationData("Route 13", "Biker", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_8_ITEM"], EventFlag(246), inclusion=trainersanity), - LocationData("Route 12 North", "Fisherman 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_0_ITEM"], EventFlag(277), inclusion=trainersanity), - LocationData("Route 12 North", "Fisherman 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_1_ITEM"], EventFlag(276), inclusion=trainersanity), - LocationData("Route 12 North", "Fisherman 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_4_ITEM"], EventFlag(269), inclusion=trainersanity), - LocationData("Route 12 North", "Fisherman 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_5_ITEM"], EventFlag(268), inclusion=trainersanity), - LocationData("Route 12 South", "Rocker", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_3_ITEM"], EventFlag(270), inclusion=trainersanity), - LocationData("Route 12 South", "Jr. Trainer M", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_2_ITEM"], EventFlag(272), inclusion=trainersanity), - LocationData("Route 12 Grass", "Fisherman 5", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_6_ITEM"], EventFlag(264), inclusion=trainersanity), + LocationData("Route 12-N", "Fisherman 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_0_ITEM"], EventFlag(277), inclusion=trainersanity), + LocationData("Route 12-N", "Fisherman 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_1_ITEM"], EventFlag(276), inclusion=trainersanity), + LocationData("Route 12-N", "Fisherman 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_4_ITEM"], EventFlag(269), inclusion=trainersanity), + LocationData("Route 12-N", "Fisherman 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_5_ITEM"], EventFlag(268), inclusion=trainersanity), + LocationData("Route 12-S", "Rocker", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_3_ITEM"], EventFlag(270), inclusion=trainersanity), + LocationData("Route 12-S", "Jr. Trainer M", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_2_ITEM"], EventFlag(272), inclusion=trainersanity), + LocationData("Route 12-Grass", "Fisherman 5", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_6_ITEM"], EventFlag(264), inclusion=trainersanity), LocationData("Route 11", "Youngster 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_2_ITEM"], EventFlag(286), inclusion=trainersanity), LocationData("Route 11", "Gambler 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_0_ITEM"], EventFlag(288), inclusion=trainersanity), LocationData("Route 11", "Youngster 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_9_ITEM"], EventFlag(278), inclusion=trainersanity), @@ -602,27 +619,27 @@ location_data = [ LocationData("Route 11", "Engineer 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_8_ITEM"], EventFlag(280), inclusion=trainersanity), LocationData("Route 11", "Youngster 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_7_ITEM"], EventFlag(281), inclusion=trainersanity), LocationData("Route 11", "Gambler 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_5_ITEM"], EventFlag(283), inclusion=trainersanity), - LocationData("Rock Tunnel 1F", "PokeManiac", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_3_ITEM"], EventFlag(302), inclusion=trainersanity), - LocationData("Rock Tunnel 1F", "Hiker 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_0_ITEM"], EventFlag(305), inclusion=trainersanity), - LocationData("Rock Tunnel 1F", "Hiker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_1_ITEM"], EventFlag(304), inclusion=trainersanity), - LocationData("Rock Tunnel 1F", "Hiker 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_2_ITEM"], EventFlag(303), inclusion=trainersanity), - LocationData("Rock Tunnel 1F", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_4_ITEM"], EventFlag(301), inclusion=trainersanity), - LocationData("Rock Tunnel 1F", "Jr. Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_6_ITEM"], EventFlag(299), inclusion=trainersanity), - LocationData("Rock Tunnel 1F", "Jr. Trainer F 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_5_ITEM"], EventFlag(300), inclusion=trainersanity), - LocationData("Rock Tunnel B1F", "PokeManiac 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_7_ITEM"], EventFlag(5), inclusion=trainersanity), - LocationData("Rock Tunnel B1F", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_5_ITEM"], EventFlag(8), inclusion=trainersanity), - LocationData("Rock Tunnel B1F", "PokeManiac 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_3_ITEM"], EventFlag(10), inclusion=trainersanity), - LocationData("Rock Tunnel B1F", "Hiker 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_6_ITEM"], EventFlag(7), inclusion=trainersanity), - LocationData("Rock Tunnel B1F", "Hiker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_4_ITEM"], EventFlag(9), inclusion=trainersanity), - LocationData("Rock Tunnel B1F", "Jr. Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_0_ITEM"], EventFlag(13), inclusion=trainersanity), - LocationData("Rock Tunnel B1F", "Hiker 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_1_ITEM"], EventFlag(12), inclusion=trainersanity), - LocationData("Rock Tunnel B1F", "PokeManiac 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_2_ITEM"], EventFlag(11), inclusion=trainersanity), - LocationData("Route 10 North", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_3_ITEM"], EventFlag(308), inclusion=trainersanity), - LocationData("Route 10 North", "PokeManiac", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_0_ITEM"], EventFlag(311), inclusion=trainersanity), - LocationData("Route 10 South", "J.r Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_5_ITEM"], EventFlag(306), inclusion=trainersanity), - LocationData("Route 10 South", "Hiker 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_1_ITEM"], EventFlag(310), inclusion=trainersanity), - LocationData("Route 10 South", "Hiker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_4_ITEM"], EventFlag(307), inclusion=trainersanity), - LocationData("Route 10 South", "Super Nerd", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_2_ITEM"], EventFlag(309), inclusion=trainersanity), + LocationData("Rock Tunnel 1F-NE", "PokeManiac", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_3_ITEM"], EventFlag(302), inclusion=trainersanity), + LocationData("Rock Tunnel 1F-NW", "Hiker 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_0_ITEM"], EventFlag(305), inclusion=trainersanity), + LocationData("Rock Tunnel 1F-NW", "Hiker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_1_ITEM"], EventFlag(304), inclusion=trainersanity), + LocationData("Rock Tunnel 1F-NW", "Hiker 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_2_ITEM"], EventFlag(303), inclusion=trainersanity), + LocationData("Rock Tunnel 1F-S", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_4_ITEM"], EventFlag(301), inclusion=trainersanity), + LocationData("Rock Tunnel 1F-S", "Jr. Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_6_ITEM"], EventFlag(299), inclusion=trainersanity), + LocationData("Rock Tunnel 1F-S", "Jr. Trainer F 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_5_ITEM"], EventFlag(300), inclusion=trainersanity), + LocationData("Rock Tunnel B1F-E", "PokeManiac 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_7_ITEM"], EventFlag(5), inclusion=trainersanity), + LocationData("Rock Tunnel B1F-E", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_5_ITEM"], EventFlag(8), inclusion=trainersanity), + LocationData("Rock Tunnel B1F-E", "PokeManiac 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_3_ITEM"], EventFlag(10), inclusion=trainersanity), + LocationData("Rock Tunnel B1F-E", "Hiker 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_6_ITEM"], EventFlag(7), inclusion=trainersanity), + LocationData("Rock Tunnel B1F-E", "Hiker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_4_ITEM"], EventFlag(9), inclusion=trainersanity), + LocationData("Rock Tunnel B1F-W", "Jr. Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_0_ITEM"], EventFlag(13), inclusion=trainersanity), + LocationData("Rock Tunnel B1F-W", "Hiker 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_1_ITEM"], EventFlag(12), inclusion=trainersanity), + LocationData("Rock Tunnel B1F-W", "PokeManiac 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_2_ITEM"], EventFlag(11), inclusion=trainersanity), + LocationData("Route 10-N", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_3_ITEM"], EventFlag(308), inclusion=trainersanity), + LocationData("Route 10-C", "PokeManiac 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_0_ITEM"], EventFlag(311), inclusion=trainersanity), + LocationData("Route 10-S", "J.r Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_5_ITEM"], EventFlag(306), inclusion=trainersanity), + LocationData("Route 10-S", "Hiker 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_1_ITEM"], EventFlag(310), inclusion=trainersanity), + LocationData("Route 10-S", "Hiker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_4_ITEM"], EventFlag(307), inclusion=trainersanity), + LocationData("Route 10-S", "PokeManiac 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_2_ITEM"], EventFlag(309), inclusion=trainersanity), LocationData("Route 9", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_0_ITEM"], EventFlag(320), inclusion=trainersanity), LocationData("Route 9", "Hiker 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_4_ITEM"], EventFlag(316), inclusion=trainersanity), LocationData("Route 9", "Jr. Trainer M 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_1_ITEM"], EventFlag(319), inclusion=trainersanity), @@ -642,12 +659,12 @@ location_data = [ LocationData("Route 8", "Gambler 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_1_ITEM"], EventFlag(328), inclusion=trainersanity), LocationData("Route 8", "Super Nerd 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_0_ITEM"], EventFlag(329), inclusion=trainersanity), LocationData("Route 6", "Bug Catcher 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_2_ITEM"], EventFlag(333), inclusion=trainersanity), - LocationData("Route 6", "Jr. Trainer M 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_1_ITEM"], EventFlag(334), inclusion=trainersanity), - LocationData("Route 6", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_0_ITEM"], EventFlag(335), inclusion=trainersanity), + LocationData("Route 6", "Jr. Trainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_1_ITEM"], EventFlag(334), inclusion=trainersanity), + LocationData("Route 6", "Jr. Trainer M 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_0_ITEM"], EventFlag(335), inclusion=trainersanity), LocationData("Route 6", "Bug Catcher 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_5_ITEM"], EventFlag(330), inclusion=trainersanity), LocationData("Route 6", "Jr. Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_4_ITEM"], EventFlag(331), inclusion=trainersanity), LocationData("Route 6", "Jr. Trainer M 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_3_ITEM"], EventFlag(332), inclusion=trainersanity), - LocationData("Route 4", "Cooltrainer F", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_4_TRAINER_0_ITEM"], EventFlag(336), inclusion=trainersanity), + LocationData("Route 4-Lass", "Lass", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_4_TRAINER_0_ITEM"], EventFlag(336), inclusion=trainersanity), LocationData("Route 3", "Lass 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_2_ITEM"], EventFlag(345), inclusion=trainersanity), LocationData("Route 3", "Bug Catcher 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_0_ITEM"], EventFlag(347), inclusion=trainersanity), LocationData("Route 3", "Youngster 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_1_ITEM"], EventFlag(346), inclusion=trainersanity), @@ -656,17 +673,17 @@ location_data = [ LocationData("Route 3", "Youngster 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_5_ITEM"], EventFlag(340), inclusion=trainersanity), LocationData("Route 3", "Bug Catcher 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_6_ITEM"], EventFlag(339), inclusion=trainersanity), LocationData("Route 3", "Lass 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_7_ITEM"], EventFlag(338), inclusion=trainersanity), - LocationData("Saffron Gym", "Psychic 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_5_ITEM"], EventFlag(349), inclusion=trainersanity), - LocationData("Saffron Gym", "Psychic 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_3_ITEM"], EventFlag(351), inclusion=trainersanity), - LocationData("Saffron Gym", "Psychic 3", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_1_ITEM"], EventFlag(360), inclusion=trainersanity), - LocationData("Saffron Gym", "Channeler 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_0_ITEM"], EventFlag(361), inclusion=trainersanity), - LocationData("Saffron Gym", "Psychic 4", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_6_ITEM"], EventFlag(348), inclusion=trainersanity), - LocationData("Saffron Gym", "Channeler 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_2_ITEM"], EventFlag(357), inclusion=trainersanity), - LocationData("Saffron Gym", "Channeler 3", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_4_ITEM"], EventFlag(350), inclusion=trainersanity), - LocationData("Fighting Dojo", "Blackbelt 1", None, rom_addresses["Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_3_ITEM"], EventFlag(363), inclusion=trainersanity), - LocationData("Fighting Dojo", "Blackbelt 2", None, rom_addresses["Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_1_ITEM"], EventFlag(365), inclusion=trainersanity), - LocationData("Fighting Dojo", "Blackbelt 3", None, rom_addresses["Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_2_ITEM"], EventFlag(364), inclusion=trainersanity), - LocationData("Fighting Dojo", "Blackbelt 4", None, rom_addresses["Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_0_ITEM"], EventFlag(366), inclusion=trainersanity), + LocationData("Saffron Gym-NE", "Psychic 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_5_ITEM"], EventFlag(349), inclusion=trainersanity), + LocationData("Saffron Gym-E", "Psychic 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_3_ITEM"], EventFlag(351), inclusion=trainersanity), + LocationData("Saffron Gym-SE", "Psychic 3", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_1_ITEM"], EventFlag(360), inclusion=trainersanity), + LocationData("Saffron Gym-N", "Channeler 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_0_ITEM"], EventFlag(361), inclusion=trainersanity), + LocationData("Saffron Gym-NW", "Psychic 4", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_6_ITEM"], EventFlag(348), inclusion=trainersanity), + LocationData("Saffron Gym-W", "Channeler 2", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_2_ITEM"], EventFlag(357), inclusion=trainersanity), + LocationData("Saffron Gym-SW", "Channeler 3", None, rom_addresses["Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_4_ITEM"], EventFlag(350), inclusion=trainersanity), + LocationData("Saffron Fighting Dojo", "Blackbelt 1", None, rom_addresses["Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_3_ITEM"], EventFlag(363), inclusion=trainersanity), + LocationData("Saffron Fighting Dojo", "Blackbelt 2", None, rom_addresses["Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_1_ITEM"], EventFlag(365), inclusion=trainersanity), + LocationData("Saffron Fighting Dojo", "Blackbelt 3", None, rom_addresses["Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_2_ITEM"], EventFlag(364), inclusion=trainersanity), + LocationData("Saffron Fighting Dojo", "Blackbelt 4", None, rom_addresses["Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_0_ITEM"], EventFlag(366), inclusion=trainersanity), LocationData("Fuchsia Gym", "Juggler 1", None, rom_addresses["Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_2_ITEM"], EventFlag(380), inclusion=trainersanity), LocationData("Fuchsia Gym", "Juggler 2", None, rom_addresses["Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_0_ITEM"], EventFlag(382), inclusion=trainersanity), LocationData("Fuchsia Gym", "Juggler 3", None, rom_addresses["Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_1_ITEM"], EventFlag(381), inclusion=trainersanity), @@ -677,9 +694,9 @@ location_data = [ LocationData("Celadon Gym", "Beauty 1", None, rom_addresses["Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_1_ITEM"], EventFlag(390), inclusion=trainersanity), LocationData("Celadon Gym", "Beauty 2", None, rom_addresses["Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_3_ITEM"], EventFlag(388), inclusion=trainersanity), LocationData("Celadon Gym", "Jr. Trainer F", None, rom_addresses["Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_2_ITEM"], EventFlag(389), inclusion=trainersanity), - LocationData("Celadon Gym", "Lass 2", None, rom_addresses["Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_4_ITEM"], EventFlag(387), inclusion=trainersanity), - LocationData("Celadon Gym", "Cool Trainer F", None, rom_addresses["Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_6_ITEM"], EventFlag(385), inclusion=trainersanity), - LocationData("Celadon Gym", "Beauty 3", None, rom_addresses["Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_5_ITEM"], EventFlag(386), inclusion=trainersanity), + LocationData("Celadon Gym-C", "Lass 2", None, rom_addresses["Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_4_ITEM"], EventFlag(387), inclusion=trainersanity), + LocationData("Celadon Gym-C", "Cool Trainer F", None, rom_addresses["Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_6_ITEM"], EventFlag(385), inclusion=trainersanity), + LocationData("Celadon Gym-C", "Beauty 3", None, rom_addresses["Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_5_ITEM"], EventFlag(386), inclusion=trainersanity), LocationData("Vermilion Gym", "Sailor", None, rom_addresses["Trainersanity_EVENT_BEAT_VERMILION_GYM_TRAINER_2_ITEM"], EventFlag(394), inclusion=trainersanity), LocationData("Vermilion Gym", "Rocker", None, rom_addresses["Trainersanity_EVENT_BEAT_VERMILION_GYM_TRAINER_1_ITEM"], EventFlag(395), inclusion=trainersanity), LocationData("Vermilion Gym", "Gentleman", None, rom_addresses["Trainersanity_EVENT_BEAT_VERMILION_GYM_TRAINER_0_ITEM"], EventFlag(400), inclusion=trainersanity), @@ -712,19 +729,19 @@ location_data = [ LocationData("Viridian Gym", "Cooltrainer M 3", None, rom_addresses["Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_4_ITEM"], EventFlag(438), inclusion=trainersanity), LocationData("Victory Road 1F", "Cooltrainer F", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_1_TRAINER_0_ITEM"], EventFlag(15), inclusion=trainersanity), LocationData("Victory Road 1F", "Cooltrainer M", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_1_TRAINER_1_ITEM"], EventFlag(14), inclusion=trainersanity), - LocationData("Victory Road 2F", "Blackbelt", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_0_ITEM"], EventFlag(162), inclusion=trainersanity), - LocationData("Victory Road 2F", "Juggler 1", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_1_ITEM"], EventFlag(161), inclusion=trainersanity), - LocationData("Victory Road 2F", "Tamer", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_2_ITEM"], EventFlag(160), inclusion=trainersanity), - LocationData("Victory Road 2F", "Juggler 2", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_4_ITEM"], EventFlag(158), inclusion=trainersanity), - LocationData("Victory Road 2F", "PokeManiac", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_3_ITEM"], EventFlag(159), inclusion=trainersanity), + LocationData("Victory Road 2F-C", "Blackbelt", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_0_ITEM"], EventFlag(162), inclusion=trainersanity), + LocationData("Victory Road 2F-C", "Juggler 1", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_1_ITEM"], EventFlag(161), inclusion=trainersanity), + LocationData("Victory Road 2F-C", "Tamer", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_2_ITEM"], EventFlag(160), inclusion=trainersanity), + LocationData("Victory Road 2F-C", "Juggler 2", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_4_ITEM"], EventFlag(158), inclusion=trainersanity), + LocationData("Victory Road 2F-NW", "PokeManiac", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_3_ITEM"], EventFlag(159), inclusion=trainersanity), LocationData("Victory Road 3F", "Cooltrainer M 1", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_0_ITEM"], EventFlag(103), inclusion=trainersanity), - LocationData("Victory Road 3F", "Cooltrainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_3_ITEM"], EventFlag(100), inclusion=trainersanity), - LocationData("Victory Road 3F", "Cooltrainer M 2", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_2_ITEM"], EventFlag(101), inclusion=trainersanity), + LocationData("Victory Road 3F-S", "Cooltrainer F 1", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_3_ITEM"], EventFlag(100), inclusion=trainersanity), + LocationData("Victory Road 3F-S", "Cooltrainer M 2", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_2_ITEM"], EventFlag(101), inclusion=trainersanity), LocationData("Victory Road 3F", "Cooltrainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_1_ITEM"], EventFlag(102), inclusion=trainersanity), - LocationData("Indigo Plateau", "Lorelei", None, rom_addresses["Trainersanity_EVENT_BEAT_LORELEIS_ROOM_TRAINER_0_ITEM"], EventFlag(21), inclusion=trainersanity), - LocationData("Indigo Plateau", "Bruno", None, rom_addresses["Trainersanity_EVENT_BEAT_BRUNOS_ROOM_TRAINER_0_ITEM"], EventFlag(20), inclusion=trainersanity), - LocationData("Indigo Plateau", "Agatha", None, rom_addresses["Trainersanity_EVENT_BEAT_AGATHAS_ROOM_TRAINER_0_ITEM"], EventFlag(19), inclusion=trainersanity), - LocationData("Indigo Plateau", "Lance", None, rom_addresses["Trainersanity_EVENT_BEAT_LANCES_ROOM_TRAINER_0_ITEM"], EventFlag(18), inclusion=trainersanity), + LocationData("Indigo Plateau Lorelei's Room", "Lorelei", None, rom_addresses["Trainersanity_EVENT_BEAT_LORELEIS_ROOM_TRAINER_0_ITEM"], EventFlag(21), inclusion=trainersanity), + LocationData("Indigo Plateau Bruno's Room", "Bruno", None, rom_addresses["Trainersanity_EVENT_BEAT_BRUNOS_ROOM_TRAINER_0_ITEM"], EventFlag(20), inclusion=trainersanity), + LocationData("Indigo Plateau Agatha's Room", "Agatha", None, rom_addresses["Trainersanity_EVENT_BEAT_AGATHAS_ROOM_TRAINER_0_ITEM"], EventFlag(19), inclusion=trainersanity), + LocationData("Indigo Plateau Lance's Room", "Lance", None, rom_addresses["Trainersanity_EVENT_BEAT_LANCES_ROOM_TRAINER_0_ITEM"], EventFlag(18), inclusion=trainersanity), LocationData("Cinnabar Gym", "Burglar 1", None, rom_addresses["Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_A_ITEM"], EventFlag(374), inclusion=trainersanity), LocationData("Cinnabar Gym", "Super Nerd 1", None, rom_addresses["Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_B_ITEM"], EventFlag(373), inclusion=trainersanity), LocationData("Cinnabar Gym", "Super Nerd 2", None, rom_addresses["Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_2_ITEM"], EventFlag(372), inclusion=trainersanity), @@ -737,1241 +754,1277 @@ location_data = [ LocationData("Celadon Prize Corner", "Item Prize 2", "TM15 Hyper Beam", rom_addresses["Prize_Item_B"], EventFlag(0x69B), inclusion=prizesanity), LocationData("Celadon Prize Corner", "Item Prize 3", "TM50 Substitute", rom_addresses["Prize_Item_C"], EventFlag(0x69C), inclusion=prizesanity), - LocationData("Celadon Game Corner", "West Gambler's Gift (Coin Case)", "10 Coins", rom_addresses["Event_Game_Corner_Gift_A"], EventFlag(0x1ba)), - LocationData("Celadon Game Corner", "Center Gambler's Gift (Coin Case)", "20 Coins", rom_addresses["Event_Game_Corner_Gift_C"], EventFlag(0x1bc)), - LocationData("Celadon Game Corner", "East Gambler's Gift (Coin Case)", "20 Coins", rom_addresses["Event_Game_Corner_Gift_B"], EventFlag(0x1bb)), + LocationData("Celadon Game Corner", "West Gambler's Gift", "10 Coins", rom_addresses["Event_Game_Corner_Gift_A"], EventFlag(0x1ba)), + LocationData("Celadon Game Corner", "Center Gambler's Gift", "20 Coins", rom_addresses["Event_Game_Corner_Gift_C"], EventFlag(0x1bc)), + LocationData("Celadon Game Corner", "East Gambler's Gift", "20 Coins", rom_addresses["Event_Game_Corner_Gift_B"], EventFlag(0x1bb)), - LocationData("Celadon Game Corner", "Hidden Item Northwest By Counter (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_1"], Hidden(54), inclusion=hidden_items), - LocationData("Celadon Game Corner", "Hidden Item Southwest Corner (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_2"], Hidden(55), inclusion=hidden_items), - LocationData("Celadon Game Corner", "Hidden Item Near Rumor Man (Coin Case)", "20 Coins", rom_addresses["Hidden_Item_Game_Corner_3"], Hidden(56), inclusion=hidden_items), - LocationData("Celadon Game Corner", "Hidden Item Near Speculating Woman (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_4"], Hidden(57), inclusion=hidden_items), - LocationData("Celadon Game Corner", "Hidden Item Near West Gifting Gambler (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_5"], Hidden(58), inclusion=hidden_items), - LocationData("Celadon Game Corner", "Hidden Item Near Wonderful Time Woman (Coin Case)", "20 Coins", rom_addresses["Hidden_Item_Game_Corner_6"], Hidden(59), inclusion=hidden_items), - LocationData("Celadon Game Corner", "Hidden Item Near Failing Gym Information Guy (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_7"], Hidden(60), inclusion=hidden_items), - LocationData("Celadon Game Corner", "Hidden Item Near East Gifting Gambler (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_8"], Hidden(61), inclusion=hidden_items), - LocationData("Celadon Game Corner", "Hidden Item Near Hooked Guy (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_9"], Hidden(62), inclusion=hidden_items), - LocationData("Celadon Game Corner", "Hidden Item at End of Horizontal Machine Row (Coin Case)", "20 Coins", rom_addresses["Hidden_Item_Game_Corner_10"], Hidden(63), inclusion=hidden_items), - LocationData("Celadon Game Corner", "Hidden Item in Front of Horizontal Machine Row (Coin Case)", "100 Coins", rom_addresses["Hidden_Item_Game_Corner_11"], Hidden(64), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Northwest By Counter", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_1"], Hidden(54), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Southwest Corner", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_2"], Hidden(55), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near Rumor Man", "20 Coins", rom_addresses["Hidden_Item_Game_Corner_3"], Hidden(56), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near Speculating Woman", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_4"], Hidden(57), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near West Gifting Gambler", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_5"], Hidden(58), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near Wonderful Time Woman", "20 Coins", rom_addresses["Hidden_Item_Game_Corner_6"], Hidden(59), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near Failing Gym Information Guy", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_7"], Hidden(60), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near East Gifting Gambler", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_8"], Hidden(61), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near Hooked Guy", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_9"], Hidden(62), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item at End of Horizontal Machine Row", "20 Coins", rom_addresses["Hidden_Item_Game_Corner_10"], Hidden(63), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item in Front of Horizontal Machine Row", "100 Coins", rom_addresses["Hidden_Item_Game_Corner_11"], Hidden(64), inclusion=hidden_items), *[LocationData("Pokedex", mon, ball, rom_addresses["Dexsanity_Items"] + i, DexSanityFlag(i), type="Item", - inclusion=dexsanity) for (mon, i, ball) in zip(pokemon_data.keys(), range(0, 152), - ["Poke Ball", "Great Ball", "Ultra Ball"]* 51)], + inclusion=dexsanity) for (mon, i, ball) in zip(poke_data.pokemon_data.keys(), range(0, 152), + ["Poke Ball", "Great Ball", "Ultra Ball"] * 51)], - LocationData("Indigo Plateau", "Become Champion", "Become Champion", event=True), + LocationData("Silph Co 1F", "Receptionist", "Card Key 2F", rom_addresses["Event_SKC1F"], EventFlag(0x1c0), inclusion=split_card_key), + LocationData("Silph Co 4F-W", "Hostage", "Card Key 4F", rom_addresses["Event_SKC4F"], EventFlag(0x1c1), inclusion=split_card_key), + LocationData("Silph Co 5F", "Hostage", "Card Key 5F", rom_addresses["Event_SKC5F"], EventFlag(0x1c2), inclusion=split_card_key), + LocationData("Silph Co 6F", "Hostage", "Card Key 6F", rom_addresses["Event_SKC6F"], EventFlag(0x1c3), inclusion=split_card_key), + LocationData("Silph Co 7F", "Hostage", "Card Key 7F", rom_addresses["Event_SKC7F"], EventFlag(0x1c4), inclusion=split_card_key), + LocationData("Silph Co 8F-W", "Hostage", "Card Key 8F", rom_addresses["Event_SKC8F"], EventFlag(0x1c5), inclusion=split_card_key), + LocationData("Silph Co 9F-SW", "Nurse", "Card Key 9F", rom_addresses["Event_SKC9F"], EventFlag(0x1c6), inclusion=split_card_key), + LocationData("Silph Co 10F-SE", "Hostage", "Card Key 10F", rom_addresses["Event_SKC10F"], EventFlag(0x1c7), inclusion=split_card_key), + LocationData("Silph Co 11F-C", "Secretary", "Card Key 11F", rom_addresses["Event_SKC11F"], EventFlag(0x1c8), inclusion=split_card_key), + + LocationData("Celadon Game Corner", "", "Game Corner", event=True), + LocationData("Cinnabar Island", "", "Cinnabar Island", event=True), + LocationData("Celadon Department Store 4F", "Buy Poke Doll", "Buy Poke Doll", event=True), + LocationData("Celadon Department Store 4F", "Buy Fire Stone", "Fire Stone", event=True, inclusion=not_stonesanity), + LocationData("Celadon Department Store 4F", "Buy Water Stone", "Water Stone", event=True, inclusion=not_stonesanity), + LocationData("Celadon Department Store 4F", "Buy Thunder Stone", "Thunder Stone", event=True, inclusion=not_stonesanity), + LocationData("Celadon Department Store 4F", "Buy Leaf Stone", "Leaf Stone", event=True, inclusion=not_stonesanity), + LocationData("Celadon Department Store Roof", "Vending Machines", "Vending Machine Drinks", event=True), + LocationData("Pewter Gym", "Defeat Brock", "Defeat Brock", event=True), + LocationData("Cerulean Gym", "Defeat Misty", "Defeat Misty", event=True), + LocationData("Vermilion Gym", "Defeat Lt. Surge", "Defeat Lt. Surge", event=True), + LocationData("Celadon Gym", "Defeat Erika", "Defeat Erika", event=True), + LocationData("Fuchsia Gym", "Defeat Koga", "Defeat Koga", event=True), + LocationData("Cinnabar Gym", "Defeat Blaine", "Defeat Blaine", event=True), + LocationData("Saffron Gym-C", "Defeat Sabrina", "Defeat Sabrina", event=True), + LocationData("Viridian Gym", "Defeat Viridian Gym Giovanni", "Defeat Viridian Gym Giovanni", event=True), + LocationData("Bill's House", "Help Bill", "Help Bill", event=True), + LocationData("Victory Road 3F-S", "Victory Road Boulder", "Victory Road Boulder", event=True), + LocationData("Indigo Plateau Champion's Room", "Become Champion", "Become Champion", event=True), LocationData("Pokemon Tower 7F", "Fuji Saved", "Fuji Saved", event=True), - LocationData("Silph Co 11F", "Silph Co Liberated", "Silph Co Liberated", event=True), + LocationData("Silph Co 11F-C", "Silph Co Liberated", "Silph Co Liberated", event=True), + LocationData("Seafoam Islands 1F", "Seafoam Exit Boulder 1", "Seafoam Exit Boulder", event=True), + LocationData("Seafoam Islands 1F", "Seafoam Exit Boulder 2", "Seafoam Exit Boulder", event=True), + LocationData("Seafoam Islands B1F", "Seafoam Exit Boulder 1", "Seafoam Exit Boulder", event=True), + LocationData("Seafoam Islands B1F-NE", "Seafoam Exit Boulder 2", "Seafoam Exit Boulder", event=True), + LocationData("Seafoam Islands B2F-NW", "Seafoam Exit Boulder 1", "Seafoam Exit Boulder", event=True), + LocationData("Seafoam Islands B2F-NE", "Seafoam Exit Boulder 2", "Seafoam Exit Boulder", event=True), + LocationData("Seafoam Islands B3F", "Seafoam Boss Boulders", "Seafoam Boss Boulders", event=True), - LocationData("Pallet Town", "Super Rod Pokemon - 1", "Tentacool", rom_addresses["Wild_Super_Rod_A"] + 1, None, + LocationData("Pallet/Viridian Fishing", "Super Rod Pokemon - 1", "Tentacool", rom_addresses["Wild_Super_Rod_A"] + 1, None, + event=True, type="Wild Encounter", level=15), + LocationData("Pallet/Viridian Fishing", "Super Rod Pokemon - 2", "Poliwag", rom_addresses["Wild_Super_Rod_A"] + 3, None, + event=True, type="Wild Encounter", level=15), + LocationData("Route 22 Fishing", "Super Rod Pokemon - 1", "Goldeen", rom_addresses["Wild_Super_Rod_B"] + 1, None, + event=True, type="Wild Encounter", level=15), + LocationData("Route 22 Fishing", "Super Rod Pokemon - 2", "Poliwag", rom_addresses["Wild_Super_Rod_B"] + 3, None, + event=True, type="Wild Encounter", level=15), + LocationData("Route 24/25/Cerulean/Cerulean Gym Fishing", "Super Rod Pokemon - 1", "Psyduck", rom_addresses["Wild_Super_Rod_C"] + 1, None, + event=True, type="Wild Encounter", level=15), + LocationData("Route 24/25/Cerulean/Cerulean Gym Fishing", "Super Rod Pokemon - 2", "Goldeen", rom_addresses["Wild_Super_Rod_C"] + 3, None, + event=True, type="Wild Encounter", level=15), + LocationData("Route 24/25/Cerulean/Cerulean Gym Fishing", "Super Rod Pokemon - 3", "Krabby", rom_addresses["Wild_Super_Rod_C"] + 5, None, + event=True, type="Wild Encounter", level=15), + LocationData("Route 6/11/Vermilion/Dock Fishing", "Super Rod Pokemon - 1", "Krabby", rom_addresses["Wild_Super_Rod_D"] + 1, None, + event=True, type="Wild Encounter", level=15), + LocationData("Route 6/11/Vermilion/Dock Fishing", "Super Rod Pokemon - 2", "Shellder", rom_addresses["Wild_Super_Rod_D"] + 3, None, + event=True, type="Wild Encounter", level=15), + LocationData("Route 10/Celadon Fishing", "Super Rod Pokemon - 1", "Poliwhirl", rom_addresses["Wild_Super_Rod_E"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Pallet Town", "Super Rod Pokemon - 2", "Poliwag", rom_addresses["Wild_Super_Rod_A"] + 3, None, + LocationData("Route 10/Celadon Fishing", "Super Rod Pokemon - 2", "Slowpoke", rom_addresses["Wild_Super_Rod_E"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Route 22", "Super Rod Pokemon - 1", "Goldeen", rom_addresses["Wild_Super_Rod_B"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Route 22", "Super Rod Pokemon - 2", "Poliwag", rom_addresses["Wild_Super_Rod_B"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Route 24", "Super Rod Pokemon - 1", "Psyduck", rom_addresses["Wild_Super_Rod_C"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Route 24", "Super Rod Pokemon - 2", "Goldeen", rom_addresses["Wild_Super_Rod_C"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Route 24", "Super Rod Pokemon - 3", "Krabby", rom_addresses["Wild_Super_Rod_C"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Route 6", "Super Rod Pokemon - 1", "Krabby", rom_addresses["Wild_Super_Rod_D"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Route 6", "Super Rod Pokemon - 2", "Shellder", rom_addresses["Wild_Super_Rod_D"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Super Rod Pokemon - 1", "Poliwhirl", rom_addresses["Wild_Super_Rod_E"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Super Rod Pokemon - 2", "Slowpoke", rom_addresses["Wild_Super_Rod_E"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Super Rod Pokemon - 1", "Dratini", rom_addresses["Wild_Super_Rod_F"] + 1, + LocationData("Safari Zone Fishing", "Super Rod Pokemon - 1", "Dratini", rom_addresses["Wild_Super_Rod_F"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Super Rod Pokemon - 2", "Krabby", rom_addresses["Wild_Super_Rod_F"] + 3, + LocationData("Safari Zone Fishing", "Super Rod Pokemon - 2", "Krabby", rom_addresses["Wild_Super_Rod_F"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Super Rod Pokemon - 3", "Psyduck", rom_addresses["Wild_Super_Rod_F"] + 5, + LocationData("Safari Zone Fishing", "Super Rod Pokemon - 3", "Psyduck", rom_addresses["Wild_Super_Rod_F"] + 5, None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Super Rod Pokemon - 4", "Slowpoke", rom_addresses["Wild_Super_Rod_F"] + 7, + LocationData("Safari Zone Fishing", "Super Rod Pokemon - 4", "Slowpoke", rom_addresses["Wild_Super_Rod_F"] + 7, None, event=True, type="Wild Encounter"), - LocationData("Route 12 North", "Super Rod Pokemon - 1", "Tentacool", rom_addresses["Wild_Super_Rod_G"] + 1, + LocationData("Route 12/13/17/18 Fishing", "Super Rod Pokemon - 1", "Tentacool", rom_addresses["Wild_Super_Rod_G"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Route 12 North", "Super Rod Pokemon - 2", "Krabby", rom_addresses["Wild_Super_Rod_G"] + 3, + LocationData("Route 12/13/17/18 Fishing", "Super Rod Pokemon - 2", "Krabby", rom_addresses["Wild_Super_Rod_G"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Route 12 North", "Super Rod Pokemon - 3", "Goldeen", rom_addresses["Wild_Super_Rod_G"] + 5, + LocationData("Route 12/13/17/18 Fishing", "Super Rod Pokemon - 3", "Goldeen", rom_addresses["Wild_Super_Rod_G"] + 5, None, event=True, type="Wild Encounter"), - LocationData("Route 12 North", "Super Rod Pokemon - 4", "Magikarp", rom_addresses["Wild_Super_Rod_G"] + 7, + LocationData("Route 12/13/17/18 Fishing", "Super Rod Pokemon - 4", "Magikarp", rom_addresses["Wild_Super_Rod_G"] + 7, None, event=True, type="Wild Encounter"), - LocationData("Route 19", "Super Rod Pokemon - 1", "Staryu", rom_addresses["Wild_Super_Rod_H"] + 1, + LocationData("Sea Routes/Cinnabar/Seafoam Fishing", "Super Rod Pokemon - 1", "Staryu", rom_addresses["Wild_Super_Rod_H"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Route 19", "Super Rod Pokemon - 2", "Horsea", rom_addresses["Wild_Super_Rod_H"] + 3, + LocationData("Sea Routes/Cinnabar/Seafoam Fishing", "Super Rod Pokemon - 2", "Horsea", rom_addresses["Wild_Super_Rod_H"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Route 19", "Super Rod Pokemon - 3", "Shellder", rom_addresses["Wild_Super_Rod_H"] + 5, + LocationData("Sea Routes/Cinnabar/Seafoam Fishing", "Super Rod Pokemon - 3", "Shellder", rom_addresses["Wild_Super_Rod_H"] + 5, None, event=True, type="Wild Encounter"), - LocationData("Route 19", "Super Rod Pokemon - 4", "Goldeen", rom_addresses["Wild_Super_Rod_H"] + 7, + LocationData("Sea Routes/Cinnabar/Seafoam Fishing", "Super Rod Pokemon - 4", "Goldeen", rom_addresses["Wild_Super_Rod_H"] + 7, None, event=True, type="Wild Encounter"), - LocationData("Route 23", "Super Rod Pokemon - 1", "Slowbro", rom_addresses["Wild_Super_Rod_I"] + 1, + LocationData("Route 23/Cerulean Cave Fishing", "Super Rod Pokemon - 1", "Slowbro", rom_addresses["Wild_Super_Rod_I"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Route 23", "Super Rod Pokemon - 2", "Seaking", rom_addresses["Wild_Super_Rod_I"] + 3, + LocationData("Route 23/Cerulean Cave Fishing", "Super Rod Pokemon - 2", "Seaking", rom_addresses["Wild_Super_Rod_I"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Route 23", "Super Rod Pokemon - 3", "Kingler", rom_addresses["Wild_Super_Rod_I"] + 5, + LocationData("Route 23/Cerulean Cave Fishing", "Super Rod Pokemon - 3", "Kingler", rom_addresses["Wild_Super_Rod_I"] + 5, None, event=True, type="Wild Encounter"), - LocationData("Route 23", "Super Rod Pokemon - 4", "Seadra", rom_addresses["Wild_Super_Rod_I"] + 7, + LocationData("Route 23/Cerulean Cave Fishing", "Super Rod Pokemon - 4", "Seadra", rom_addresses["Wild_Super_Rod_I"] + 7, None, event=True, type="Wild Encounter"), - LocationData("Fuchsia City", "Super Rod Pokemon - 1", "Seaking", rom_addresses["Wild_Super_Rod_J"] + 1, + LocationData("Fuchsia Fishing", "Super Rod Pokemon - 1", "Seaking", rom_addresses["Wild_Super_Rod_J"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Fuchsia City", "Super Rod Pokemon - 2", "Krabby", rom_addresses["Wild_Super_Rod_J"] + 3, + LocationData("Fuchsia Fishing", "Super Rod Pokemon - 2", "Krabby", rom_addresses["Wild_Super_Rod_J"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Fuchsia City", "Super Rod Pokemon - 3", "Goldeen", rom_addresses["Wild_Super_Rod_J"] + 5, + LocationData("Fuchsia Fishing", "Super Rod Pokemon - 3", "Goldeen", rom_addresses["Wild_Super_Rod_J"] + 5, None, event=True, type="Wild Encounter"), - LocationData("Fuchsia City", "Super Rod Pokemon - 4", "Magikarp", rom_addresses["Wild_Super_Rod_J"] + 7, + LocationData("Fuchsia Fishing", "Super Rod Pokemon - 4", "Magikarp", rom_addresses["Wild_Super_Rod_J"] + 7, None, event=True, type="Wild Encounter"), LocationData("Route 1", "Wild Pokemon - 1", "Pidgey", rom_addresses["Wild_Route1"] + 1, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=3), LocationData("Route 1", "Wild Pokemon - 2", "Rattata", rom_addresses["Wild_Route1"] + 3, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=3), LocationData("Route 1", "Wild Pokemon - 3", "Rattata", rom_addresses["Wild_Route1"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=3), LocationData("Route 1", "Wild Pokemon - 4", "Rattata", rom_addresses["Wild_Route1"] + 7, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=2), LocationData("Route 1", "Wild Pokemon - 5", "Pidgey", rom_addresses["Wild_Route1"] + 9, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=2), LocationData("Route 1", "Wild Pokemon - 6", "Pidgey", rom_addresses["Wild_Route1"] + 11, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=3), LocationData("Route 1", "Wild Pokemon - 7", "Pidgey", rom_addresses["Wild_Route1"] + 13, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=3), LocationData("Route 1", "Wild Pokemon - 8", "Rattata", rom_addresses["Wild_Route1"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=4), LocationData("Route 1", "Wild Pokemon - 9", "Pidgey", rom_addresses["Wild_Route1"] + 17, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=4), LocationData("Route 1", "Wild Pokemon - 10", "Pidgey", rom_addresses["Wild_Route1"] + 19, None, event=True, - type="Wild Encounter"), - LocationData("Route 2", "Wild Pokemon - 1", "Rattata", rom_addresses["Wild_Route2"] + 1, None, event=True, - type="Wild Encounter"), - LocationData("Route 2", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route2"] + 3, None, event=True, - type="Wild Encounter"), - LocationData("Route 2", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route2"] + 5, None, event=True, - type="Wild Encounter"), - LocationData("Route 2", "Wild Pokemon - 4", "Rattata", rom_addresses["Wild_Route2"] + 7, None, event=True, - type="Wild Encounter"), - LocationData("Route 2", "Wild Pokemon - 5", "Pidgey", rom_addresses["Wild_Route2"] + 9, None, event=True, - type="Wild Encounter"), - LocationData("Route 2", "Wild Pokemon - 6", ["Weedle", "Caterpie"], rom_addresses["Wild_Route2"] + 11, None, - event=True, type="Wild Encounter"), - LocationData("Route 2", "Wild Pokemon - 7", "Rattata", rom_addresses["Wild_Route2"] + 13, None, event=True, - type="Wild Encounter"), - LocationData("Route 2", "Wild Pokemon - 8", "Rattata", rom_addresses["Wild_Route2"] + 15, None, event=True, - type="Wild Encounter"), - LocationData("Route 2", "Wild Pokemon - 9", ["Weedle", "Caterpie"], rom_addresses["Wild_Route2"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Route 2", "Wild Pokemon - 10", ["Weedle", "Caterpie"], rom_addresses["Wild_Route2"] + 19, None, - event=True, type="Wild Encounter"), + type="Wild Encounter", level=5), + LocationData("Route 2-Grass", "Wild Pokemon - 1", "Rattata", rom_addresses["Wild_Route2"] + 1, None, event=True, + type="Wild Encounter", level=3), + LocationData("Route 2-Grass", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route2"] + 3, None, event=True, + type="Wild Encounter", level=3), + LocationData("Route 2-Grass", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route2"] + 5, None, event=True, + type="Wild Encounter", level=4), + LocationData("Route 2-Grass", "Wild Pokemon - 4", "Rattata", rom_addresses["Wild_Route2"] + 7, None, event=True, + type="Wild Encounter", level=4), + LocationData("Route 2-Grass", "Wild Pokemon - 5", "Pidgey", rom_addresses["Wild_Route2"] + 9, None, event=True, + type="Wild Encounter", level=5), + LocationData("Route 2-Grass", "Wild Pokemon - 6", ["Weedle", "Caterpie"], rom_addresses["Wild_Route2"] + 11, None, + event=True, type="Wild Encounter", level=3), + LocationData("Route 2-Grass", "Wild Pokemon - 7", "Rattata", rom_addresses["Wild_Route2"] + 13, None, event=True, + type="Wild Encounter", level=2), + LocationData("Route 2-Grass", "Wild Pokemon - 8", "Rattata", rom_addresses["Wild_Route2"] + 15, None, event=True, + type="Wild Encounter", level=5), + LocationData("Route 2-Grass", "Wild Pokemon - 9", ["Weedle", "Caterpie"], rom_addresses["Wild_Route2"] + 17, None, + event=True, type="Wild Encounter", level=4), + LocationData("Route 2-Grass", "Wild Pokemon - 10", ["Weedle", "Caterpie"], rom_addresses["Wild_Route2"] + 19, None, + event=True, type="Wild Encounter", level=5), LocationData("Route 22", "Wild Pokemon - 1", "Rattata", rom_addresses["Wild_Route22"] + 1, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=3), LocationData("Route 22", "Wild Pokemon - 2", ["Nidoran M", "Nidoran F"], rom_addresses["Wild_Route22"] + 3, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=3), LocationData("Route 22", "Wild Pokemon - 3", "Rattata", rom_addresses["Wild_Route22"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=4), LocationData("Route 22", "Wild Pokemon - 4", ["Nidoran M", "Nidoran F"], rom_addresses["Wild_Route22"] + 7, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=4), LocationData("Route 22", "Wild Pokemon - 5", "Rattata", rom_addresses["Wild_Route22"] + 9, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=2), LocationData("Route 22", "Wild Pokemon - 6", ["Nidoran M", "Nidoran F"], rom_addresses["Wild_Route22"] + 11, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=2), LocationData("Route 22", "Wild Pokemon - 7", "Spearow", rom_addresses["Wild_Route22"] + 13, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=3), LocationData("Route 22", "Wild Pokemon - 8", "Spearow", rom_addresses["Wild_Route22"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=5), LocationData("Route 22", "Wild Pokemon - 9", ["Nidoran F", "Nidoran M"], rom_addresses["Wild_Route22"] + 17, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=3), LocationData("Route 22", "Wild Pokemon - 10", ["Nidoran F", "Nidoran M"], rom_addresses["Wild_Route22"] + 19, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=4), LocationData("Viridian Forest", "Wild Pokemon - 1", ["Weedle", "Caterpie"], - rom_addresses["Wild_ViridianForest"] + 1, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_ViridianForest"] + 1, None, event=True, type="Wild Encounter", level=4), LocationData("Viridian Forest", "Wild Pokemon - 2", ["Kakuna", "Metapod"], - rom_addresses["Wild_ViridianForest"] + 3, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_ViridianForest"] + 3, None, event=True, type="Wild Encounter", level=5), LocationData("Viridian Forest", "Wild Pokemon - 3", ["Weedle", "Caterpie"], - rom_addresses["Wild_ViridianForest"] + 5, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_ViridianForest"] + 5, None, event=True, type="Wild Encounter", level=3), LocationData("Viridian Forest", "Wild Pokemon - 4", ["Weedle", "Caterpie"], - rom_addresses["Wild_ViridianForest"] + 7, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_ViridianForest"] + 7, None, event=True, type="Wild Encounter", level=5), LocationData("Viridian Forest", "Wild Pokemon - 5", ["Kakuna", "Metapod"], - rom_addresses["Wild_ViridianForest"] + 9, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_ViridianForest"] + 9, None, event=True, type="Wild Encounter", level=4), LocationData("Viridian Forest", "Wild Pokemon - 6", ["Kakuna", "Metapod"], - rom_addresses["Wild_ViridianForest"] + 11, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_ViridianForest"] + 11, None, event=True, type="Wild Encounter", level=6), LocationData("Viridian Forest", "Wild Pokemon - 7", ["Metapod", "Kakuna"], - rom_addresses["Wild_ViridianForest"] + 13, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_ViridianForest"] + 13, None, event=True, type="Wild Encounter", level=4), LocationData("Viridian Forest", "Wild Pokemon - 8", ["Caterpie", "Weedle"], rom_addresses["Wild_ViridianForest"] + 15, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=3), LocationData("Viridian Forest", "Wild Pokemon - 9", "Pikachu", rom_addresses["Wild_ViridianForest"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=3), LocationData("Viridian Forest", "Wild Pokemon - 10", "Pikachu", rom_addresses["Wild_ViridianForest"] + 19, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=5), LocationData("Route 3", "Wild Pokemon - 1", "Pidgey", rom_addresses["Wild_Route3"] + 1, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=6), LocationData("Route 3", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route3"] + 3, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=5), LocationData("Route 3", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route3"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=7), LocationData("Route 3", "Wild Pokemon - 4", "Spearow", rom_addresses["Wild_Route3"] + 7, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=6), LocationData("Route 3", "Wild Pokemon - 5", "Spearow", rom_addresses["Wild_Route3"] + 9, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=7), LocationData("Route 3", "Wild Pokemon - 6", "Pidgey", rom_addresses["Wild_Route3"] + 11, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=8), LocationData("Route 3", "Wild Pokemon - 7", "Spearow", rom_addresses["Wild_Route3"] + 13, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=8), LocationData("Route 3", "Wild Pokemon - 8", "Jigglypuff", rom_addresses["Wild_Route3"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=3), LocationData("Route 3", "Wild Pokemon - 9", "Jigglypuff", rom_addresses["Wild_Route3"] + 17, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=5), LocationData("Route 3", "Wild Pokemon - 10", "Jigglypuff", rom_addresses["Wild_Route3"] + 19, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=7), LocationData("Mt Moon 1F", "Wild Pokemon - 1", "Zubat", rom_addresses["Wild_MtMoon1F"] + 1, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=8), LocationData("Mt Moon 1F", "Wild Pokemon - 2", "Zubat", rom_addresses["Wild_MtMoon1F"] + 3, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=7), LocationData("Mt Moon 1F", "Wild Pokemon - 3", "Zubat", rom_addresses["Wild_MtMoon1F"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=9), LocationData("Mt Moon 1F", "Wild Pokemon - 4", "Geodude", rom_addresses["Wild_MtMoon1F"] + 7, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=8), LocationData("Mt Moon 1F", "Wild Pokemon - 5", "Zubat", rom_addresses["Wild_MtMoon1F"] + 9, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=6), LocationData("Mt Moon 1F", "Wild Pokemon - 6", "Zubat", rom_addresses["Wild_MtMoon1F"] + 11, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=10), LocationData("Mt Moon 1F", "Wild Pokemon - 7", "Geodude", rom_addresses["Wild_MtMoon1F"] + 13, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=10), LocationData("Mt Moon 1F", "Wild Pokemon - 8", "Paras", rom_addresses["Wild_MtMoon1F"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=8), LocationData("Mt Moon 1F", "Wild Pokemon - 9", "Zubat", rom_addresses["Wild_MtMoon1F"] + 17, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=11), LocationData("Mt Moon 1F", "Wild Pokemon - 10", "Clefairy", rom_addresses["Wild_MtMoon1F"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Mt Moon B1F", "Wild Pokemon - 1", "Zubat", rom_addresses["Wild_MtMoonB1F"] + 1, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B1F", "Wild Pokemon - 2", "Zubat", rom_addresses["Wild_MtMoonB1F"] + 3, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B1F", "Wild Pokemon - 3", "Geodude", rom_addresses["Wild_MtMoonB1F"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Mt Moon B1F", "Wild Pokemon - 4", "Geodude", rom_addresses["Wild_MtMoonB1F"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Mt Moon B1F", "Wild Pokemon - 5", "Zubat", rom_addresses["Wild_MtMoonB1F"] + 9, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B1F", "Wild Pokemon - 6", "Paras", rom_addresses["Wild_MtMoonB1F"] + 11, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B1F", "Wild Pokemon - 7", "Zubat", rom_addresses["Wild_MtMoonB1F"] + 13, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B1F", "Wild Pokemon - 8", "Zubat", rom_addresses["Wild_MtMoonB1F"] + 15, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B1F", "Wild Pokemon - 9", "Clefairy", rom_addresses["Wild_MtMoonB1F"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Mt Moon B1F", "Wild Pokemon - 10", "Geodude", rom_addresses["Wild_MtMoonB1F"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Mt Moon B2F", "Wild Pokemon - 1", "Zubat", rom_addresses["Wild_MtMoonB2F"] + 1, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B2F", "Wild Pokemon - 2", "Geodude", rom_addresses["Wild_MtMoonB2F"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Mt Moon B2F", "Wild Pokemon - 3", "Zubat", rom_addresses["Wild_MtMoonB2F"] + 5, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B2F", "Wild Pokemon - 4", "Geodude", rom_addresses["Wild_MtMoonB2F"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Mt Moon B2F", "Wild Pokemon - 5", "Zubat", rom_addresses["Wild_MtMoonB2F"] + 9, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B2F", "Wild Pokemon - 6", "Paras", rom_addresses["Wild_MtMoonB2F"] + 11, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B2F", "Wild Pokemon - 7", "Paras", rom_addresses["Wild_MtMoonB2F"] + 13, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B2F", "Wild Pokemon - 8", "Clefairy", rom_addresses["Wild_MtMoonB2F"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Mt Moon B2F", "Wild Pokemon - 9", "Zubat", rom_addresses["Wild_MtMoonB2F"] + 17, None, event=True, - type="Wild Encounter"), - LocationData("Mt Moon B2F", "Wild Pokemon - 10", "Clefairy", rom_addresses["Wild_MtMoonB2F"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Route 4", "Wild Pokemon - 1", "Rattata", rom_addresses["Wild_Route4"] + 1, None, event=True, - type="Wild Encounter"), - LocationData("Route 4", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route4"] + 3, None, event=True, - type="Wild Encounter"), - LocationData("Route 4", "Wild Pokemon - 3", "Rattata", rom_addresses["Wild_Route4"] + 5, None, event=True, - type="Wild Encounter"), - LocationData("Route 4", "Wild Pokemon - 4", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route4"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Route 4", "Wild Pokemon - 5", "Spearow", rom_addresses["Wild_Route4"] + 9, None, event=True, - type="Wild Encounter"), - LocationData("Route 4", "Wild Pokemon - 6", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route4"] + 11, None, - event=True, type="Wild Encounter"), - LocationData("Route 4", "Wild Pokemon - 7", "Rattata", rom_addresses["Wild_Route4"] + 13, None, event=True, - type="Wild Encounter"), - LocationData("Route 4", "Wild Pokemon - 8", "Spearow", rom_addresses["Wild_Route4"] + 15, None, event=True, - type="Wild Encounter"), - LocationData("Route 4", "Wild Pokemon - 9", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route4"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Route 4", "Wild Pokemon - 10", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route4"] + 19, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=8), + LocationData("Mt Moon B1F-Wild", "Wild Pokemon - 1", "Zubat", rom_addresses["Wild_MtMoonB1F"] + 1, None, event=True, + type="Wild Encounter", level=8), + LocationData("Mt Moon B1F-Wild", "Wild Pokemon - 2", "Zubat", rom_addresses["Wild_MtMoonB1F"] + 3, None, event=True, + type="Wild Encounter", level=7), + LocationData("Mt Moon B1F-Wild", "Wild Pokemon - 3", "Geodude", rom_addresses["Wild_MtMoonB1F"] + 5, None, + event=True, type="Wild Encounter", level=7), + LocationData("Mt Moon B1F-Wild", "Wild Pokemon - 4", "Geodude", rom_addresses["Wild_MtMoonB1F"] + 7, None, + event=True, type="Wild Encounter", level=8), + LocationData("Mt Moon B1F-Wild", "Wild Pokemon - 5", "Zubat", rom_addresses["Wild_MtMoonB1F"] + 9, None, event=True, + type="Wild Encounter", level=9), + LocationData("Mt Moon B1F-Wild", "Wild Pokemon - 6", "Paras", rom_addresses["Wild_MtMoonB1F"] + 11, None, event=True, + type="Wild Encounter", level=10), + LocationData("Mt Moon B1F-Wild", "Wild Pokemon - 7", "Zubat", rom_addresses["Wild_MtMoonB1F"] + 13, None, event=True, + type="Wild Encounter", level=10), + LocationData("Mt Moon B1F-Wild", "Wild Pokemon - 8", "Zubat", rom_addresses["Wild_MtMoonB1F"] + 15, None, event=True, + type="Wild Encounter", level=11), + LocationData("Mt Moon B1F-Wild", "Wild Pokemon - 9", "Clefairy", rom_addresses["Wild_MtMoonB1F"] + 17, None, + event=True, type="Wild Encounter", level=9), + LocationData("Mt Moon B1F-Wild", "Wild Pokemon - 10", "Geodude", rom_addresses["Wild_MtMoonB1F"] + 19, None, + event=True, type="Wild Encounter", level=9), + LocationData("Mt Moon B2F-Wild", "Wild Pokemon - 1", "Zubat", rom_addresses["Wild_MtMoonB2F"] + 1, None, event=True, + type="Wild Encounter", level=9), + LocationData("Mt Moon B2F-Wild", "Wild Pokemon - 2", "Geodude", rom_addresses["Wild_MtMoonB2F"] + 3, None, + event=True, type="Wild Encounter", level=9), + LocationData("Mt Moon B2F-Wild", "Wild Pokemon - 3", "Zubat", rom_addresses["Wild_MtMoonB2F"] + 5, None, event=True, + type="Wild Encounter", level=10), + LocationData("Mt Moon B2F-Wild", "Wild Pokemon - 4", "Geodude", rom_addresses["Wild_MtMoonB2F"] + 7, None, + event=True, type="Wild Encounter", level=10), + LocationData("Mt Moon B2F-Wild", "Wild Pokemon - 5", "Zubat", rom_addresses["Wild_MtMoonB2F"] + 9, None, event=True, + type="Wild Encounter", level=11), + LocationData("Mt Moon B2F-Wild", "Wild Pokemon - 6", "Paras", rom_addresses["Wild_MtMoonB2F"] + 11, None, event=True, + type="Wild Encounter", level=10), + LocationData("Mt Moon B2F-Wild", "Wild Pokemon - 7", "Paras", rom_addresses["Wild_MtMoonB2F"] + 13, None, event=True, + type="Wild Encounter", level=12), + LocationData("Mt Moon B2F-Wild", "Wild Pokemon - 8", "Clefairy", rom_addresses["Wild_MtMoonB2F"] + 15, None, + event=True, type="Wild Encounter", level=10), + LocationData("Mt Moon B2F-Wild", "Wild Pokemon - 9", "Zubat", rom_addresses["Wild_MtMoonB2F"] + 17, None, event=True, + type="Wild Encounter", level=12), + LocationData("Mt Moon B2F-Wild", "Wild Pokemon - 10", "Clefairy", rom_addresses["Wild_MtMoonB2F"] + 19, None, + event=True, type="Wild Encounter", level=12), + LocationData("Route 4-Grass", "Wild Pokemon - 1", "Rattata", rom_addresses["Wild_Route4"] + 1, None, event=True, + type="Wild Encounter", level=10), + LocationData("Route 4-Grass", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route4"] + 3, None, event=True, + type="Wild Encounter", level=10), + LocationData("Route 4-Grass", "Wild Pokemon - 3", "Rattata", rom_addresses["Wild_Route4"] + 5, None, event=True, + type="Wild Encounter", level=8), + LocationData("Route 4-Grass", "Wild Pokemon - 4", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route4"] + 7, None, + event=True, type="Wild Encounter", level=6), + LocationData("Route 4-Grass", "Wild Pokemon - 5", "Spearow", rom_addresses["Wild_Route4"] + 9, None, event=True, + type="Wild Encounter", level=8), + LocationData("Route 4-Grass", "Wild Pokemon - 6", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route4"] + 11, None, + event=True, type="Wild Encounter", level=10), + LocationData("Route 4-Grass", "Wild Pokemon - 7", "Rattata", rom_addresses["Wild_Route4"] + 13, None, event=True, + type="Wild Encounter", level=12), + LocationData("Route 4-Grass", "Wild Pokemon - 8", "Spearow", rom_addresses["Wild_Route4"] + 15, None, event=True, + type="Wild Encounter", level=12), + LocationData("Route 4-Grass", "Wild Pokemon - 9", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route4"] + 17, None, + event=True, type="Wild Encounter", level=8), + LocationData("Route 4-Grass", "Wild Pokemon - 10", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route4"] + 19, None, + event=True, type="Wild Encounter", level=12), LocationData("Route 24", "Wild Pokemon - 1", ["Weedle", "Caterpie"], rom_addresses["Wild_Route24"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=7), LocationData("Route 24", "Wild Pokemon - 2", ["Kakuna", "Metapod"], rom_addresses["Wild_Route24"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=8), LocationData("Route 24", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route24"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=12), LocationData("Route 24", "Wild Pokemon - 4", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route24"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=12), LocationData("Route 24", "Wild Pokemon - 5", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route24"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=13), LocationData("Route 24", "Wild Pokemon - 6", "Abra", rom_addresses["Wild_Route24"] + 11, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=10), LocationData("Route 24", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route24"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=14), LocationData("Route 24", "Wild Pokemon - 8", "Pidgey", rom_addresses["Wild_Route24"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=13), LocationData("Route 24", "Wild Pokemon - 9", "Abra", rom_addresses["Wild_Route24"] + 17, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=8), LocationData("Route 24", "Wild Pokemon - 10", "Abra", rom_addresses["Wild_Route24"] + 19, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=12), LocationData("Route 25", "Wild Pokemon - 1", ["Weedle", "Caterpie"], rom_addresses["Wild_Route25"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=8), LocationData("Route 25", "Wild Pokemon - 2", ["Kakuna", "Metapod"], rom_addresses["Wild_Route25"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=9), LocationData("Route 25", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route25"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=13), LocationData("Route 25", "Wild Pokemon - 4", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route25"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=12), LocationData("Route 25", "Wild Pokemon - 5", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route25"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=13), LocationData("Route 25", "Wild Pokemon - 6", "Abra", rom_addresses["Wild_Route25"] + 11, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=12), LocationData("Route 25", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route25"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=14), LocationData("Route 25", "Wild Pokemon - 8", "Abra", rom_addresses["Wild_Route25"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=10), LocationData("Route 25", "Wild Pokemon - 9", ["Metapod", "Kakuna"], rom_addresses["Wild_Route25"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=7), LocationData("Route 25", "Wild Pokemon - 10", ["Caterpie", "Weedle"], rom_addresses["Wild_Route25"] + 19, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=8), LocationData("Route 9", "Wild Pokemon - 1", "Rattata", rom_addresses["Wild_Route9"] + 1, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=16), LocationData("Route 9", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route9"] + 3, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=16), LocationData("Route 9", "Wild Pokemon - 3", "Rattata", rom_addresses["Wild_Route9"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=14), LocationData("Route 9", "Wild Pokemon - 4", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route9"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=11), LocationData("Route 9", "Wild Pokemon - 5", "Spearow", rom_addresses["Wild_Route9"] + 9, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=13), LocationData("Route 9", "Wild Pokemon - 6", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route9"] + 11, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=15), LocationData("Route 9", "Wild Pokemon - 7", "Rattata", rom_addresses["Wild_Route9"] + 13, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=17), LocationData("Route 9", "Wild Pokemon - 8", "Spearow", rom_addresses["Wild_Route9"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=17), LocationData("Route 9", "Wild Pokemon - 9", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route9"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=13), LocationData("Route 9", "Wild Pokemon - 10", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route9"] + 19, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=17), LocationData("Route 5", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route5"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=13), LocationData("Route 5", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route5"] + 3, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=13), LocationData("Route 5", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route5"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=13), LocationData("Route 5", "Wild Pokemon - 4", ["Mankey", "Meowth"], rom_addresses["Wild_Route5"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=15), LocationData("Route 5", "Wild Pokemon - 5", ["Mankey", "Meowth"], rom_addresses["Wild_Route5"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=10), LocationData("Route 5", "Wild Pokemon - 6", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route5"] + 11, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=12), LocationData("Route 5", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route5"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=15), LocationData("Route 5", "Wild Pokemon - 8", "Pidgey", rom_addresses["Wild_Route5"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=16), LocationData("Route 5", "Wild Pokemon - 9", ["Mankey", "Meowth"], rom_addresses["Wild_Route5"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=14), LocationData("Route 5", "Wild Pokemon - 10", ["Mankey", "Meowth"], rom_addresses["Wild_Route5"] + 19, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=16), LocationData("Route 6", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route6"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=13), LocationData("Route 6", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route6"] + 3, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=13), LocationData("Route 6", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route6"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=15), LocationData("Route 6", "Wild Pokemon - 4", ["Mankey", "Meowth"], rom_addresses["Wild_Route6"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=10), LocationData("Route 6", "Wild Pokemon - 5", ["Mankey", "Meowth"], rom_addresses["Wild_Route6"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=12), LocationData("Route 6", "Wild Pokemon - 6", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route6"] + 11, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=15), LocationData("Route 6", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route6"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=16), LocationData("Route 6", "Wild Pokemon - 8", "Pidgey", rom_addresses["Wild_Route6"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=16), LocationData("Route 6", "Wild Pokemon - 9", ["Mankey", "Meowth"], rom_addresses["Wild_Route6"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=14), LocationData("Route 6", "Wild Pokemon - 10", ["Mankey", "Meowth"], rom_addresses["Wild_Route6"] + 19, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=16), LocationData("Route 11", "Wild Pokemon - 1", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route11"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=14), LocationData("Route 11", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route11"] + 3, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=15), LocationData("Route 11", "Wild Pokemon - 3", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route11"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=12), LocationData("Route 11", "Wild Pokemon - 4", "Drowzee", rom_addresses["Wild_Route11"] + 7, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=9), LocationData("Route 11", "Wild Pokemon - 5", "Spearow", rom_addresses["Wild_Route11"] + 9, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=13), LocationData("Route 11", "Wild Pokemon - 6", "Drowzee", rom_addresses["Wild_Route11"] + 11, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=13), LocationData("Route 11", "Wild Pokemon - 7", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route11"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=15), LocationData("Route 11", "Wild Pokemon - 8", "Spearow", rom_addresses["Wild_Route11"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=17), LocationData("Route 11", "Wild Pokemon - 9", "Drowzee", rom_addresses["Wild_Route11"] + 17, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=11), LocationData("Route 11", "Wild Pokemon - 10", "Drowzee", rom_addresses["Wild_Route11"] + 19, None, event=True, - type="Wild Encounter"), - LocationData("Rock Tunnel 1F", "Wild Pokemon - 1", "Zubat", rom_addresses["Wild_RockTunnel1F"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel 1F", "Wild Pokemon - 2", "Zubat", rom_addresses["Wild_RockTunnel1F"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel 1F", "Wild Pokemon - 3", "Geodude", rom_addresses["Wild_RockTunnel1F"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel 1F", "Wild Pokemon - 4", "Machop", rom_addresses["Wild_RockTunnel1F"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel 1F", "Wild Pokemon - 5", "Geodude", rom_addresses["Wild_RockTunnel1F"] + 9, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel 1F", "Wild Pokemon - 6", "Zubat", rom_addresses["Wild_RockTunnel1F"] + 11, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel 1F", "Wild Pokemon - 7", "Zubat", rom_addresses["Wild_RockTunnel1F"] + 13, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel 1F", "Wild Pokemon - 8", "Machop", rom_addresses["Wild_RockTunnel1F"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel 1F", "Wild Pokemon - 9", "Onix", rom_addresses["Wild_RockTunnel1F"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel 1F", "Wild Pokemon - 10", "Onix", rom_addresses["Wild_RockTunnel1F"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel B1F", "Wild Pokemon - 1", "Zubat", rom_addresses["Wild_RockTunnelB1F"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel B1F", "Wild Pokemon - 2", "Zubat", rom_addresses["Wild_RockTunnelB1F"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel B1F", "Wild Pokemon - 3", "Geodude", rom_addresses["Wild_RockTunnelB1F"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel B1F", "Wild Pokemon - 4", "Machop", rom_addresses["Wild_RockTunnelB1F"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel B1F", "Wild Pokemon - 5", "Geodude", rom_addresses["Wild_RockTunnelB1F"] + 9, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel B1F", "Wild Pokemon - 6", "Zubat", rom_addresses["Wild_RockTunnelB1F"] + 11, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel B1F", "Wild Pokemon - 7", "Machop", rom_addresses["Wild_RockTunnelB1F"] + 13, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel B1F", "Wild Pokemon - 8", "Onix", rom_addresses["Wild_RockTunnelB1F"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel B1F", "Wild Pokemon - 9", "Onix", rom_addresses["Wild_RockTunnelB1F"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Rock Tunnel B1F", "Wild Pokemon - 10", "Geodude", rom_addresses["Wild_RockTunnelB1F"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Wild Pokemon - 1", "Voltorb", rom_addresses["Wild_Route10"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route10"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Wild Pokemon - 3", "Voltorb", rom_addresses["Wild_Route10"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Wild Pokemon - 4", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route10"] + 7, - None, event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Wild Pokemon - 5", "Spearow", rom_addresses["Wild_Route10"] + 9, None, - event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Wild Pokemon - 6", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route10"] + 11, - None, event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Wild Pokemon - 7", "Voltorb", rom_addresses["Wild_Route10"] + 13, None, - event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Wild Pokemon - 8", "Spearow", rom_addresses["Wild_Route10"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Wild Pokemon - 9", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route10"] + 17, - None, event=True, type="Wild Encounter"), - LocationData("Route 10 North", "Wild Pokemon - 10", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route10"] + 19, - None, event=True, type="Wild Encounter"), - LocationData("Route 12 Grass", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route12"] + 1, - None, event=True, type="Wild Encounter"), - LocationData("Route 12 Grass", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route12"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Route 12 Grass", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route12"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Route 12 Grass", "Wild Pokemon - 4", "Venonat", rom_addresses["Wild_Route12"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Route 12 Grass", "Wild Pokemon - 5", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route12"] + 9, - None, event=True, type="Wild Encounter"), - LocationData("Route 12 Grass", "Wild Pokemon - 6", "Venonat", rom_addresses["Wild_Route12"] + 11, None, - event=True, type="Wild Encounter"), - LocationData("Route 12 Grass", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route12"] + 13, - None, event=True, type="Wild Encounter"), - LocationData("Route 12 Grass", "Wild Pokemon - 8", "Pidgey", rom_addresses["Wild_Route12"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Route 12 Grass", "Wild Pokemon - 9", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route12"] + 17, - None, event=True, type="Wild Encounter"), - LocationData("Route 12 Grass", "Wild Pokemon - 10", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route12"] + 19, - None, event=True, type="Wild Encounter"), - LocationData("Route 8 Grass", "Wild Pokemon - 1", "Pidgey", rom_addresses["Wild_Route8"] + 1, None, event=True, - type="Wild Encounter"), - LocationData("Route 8 Grass", "Wild Pokemon - 2", ["Mankey", "Meowth"], rom_addresses["Wild_Route8"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Route 8 Grass", "Wild Pokemon - 3", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route8"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Route 8 Grass", "Wild Pokemon - 4", ["Growlithe", "Vulpix"], rom_addresses["Wild_Route8"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Route 8 Grass", "Wild Pokemon - 5", "Pidgey", rom_addresses["Wild_Route8"] + 9, None, event=True, - type="Wild Encounter"), - LocationData("Route 8 Grass", "Wild Pokemon - 6", ["Mankey", "Meowth"], rom_addresses["Wild_Route8"] + 11, None, - event=True, type="Wild Encounter"), - LocationData("Route 8 Grass", "Wild Pokemon - 7", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route8"] + 13, None, - event=True, type="Wild Encounter"), - LocationData("Route 8 Grass", "Wild Pokemon - 8", ["Growlithe", "Vulpix"], rom_addresses["Wild_Route8"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Route 8 Grass", "Wild Pokemon - 9", ["Growlithe", "Vulpix"], rom_addresses["Wild_Route8"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Route 8 Grass", "Wild Pokemon - 10", ["Growlithe", "Vulpix"], rom_addresses["Wild_Route8"] + 19, None, - event=True, type="Wild Encounter"), + type="Wild Encounter", level=15), + LocationData("Rock Tunnel 1F-Wild", "Wild Pokemon - 1", "Zubat", rom_addresses["Wild_RockTunnel1F"] + 1, None, + event=True, type="Wild Encounter", level=16), + LocationData("Rock Tunnel 1F-Wild", "Wild Pokemon - 2", "Zubat", rom_addresses["Wild_RockTunnel1F"] + 3, None, + event=True, type="Wild Encounter", level=17), + LocationData("Rock Tunnel 1F-Wild", "Wild Pokemon - 3", "Geodude", rom_addresses["Wild_RockTunnel1F"] + 5, None, + event=True, type="Wild Encounter", level=17), + LocationData("Rock Tunnel 1F-Wild", "Wild Pokemon - 4", "Machop", rom_addresses["Wild_RockTunnel1F"] + 7, None, + event=True, type="Wild Encounter", level=15), + LocationData("Rock Tunnel 1F-Wild", "Wild Pokemon - 5", "Geodude", rom_addresses["Wild_RockTunnel1F"] + 9, None, + event=True, type="Wild Encounter", level=16), + LocationData("Rock Tunnel 1F-Wild", "Wild Pokemon - 6", "Zubat", rom_addresses["Wild_RockTunnel1F"] + 11, None, + event=True, type="Wild Encounter", level=18), + LocationData("Rock Tunnel 1F-Wild", "Wild Pokemon - 7", "Zubat", rom_addresses["Wild_RockTunnel1F"] + 13, None, + event=True, type="Wild Encounter", level=15), + LocationData("Rock Tunnel 1F-Wild", "Wild Pokemon - 8", "Machop", rom_addresses["Wild_RockTunnel1F"] + 15, None, + event=True, type="Wild Encounter", level=17), + LocationData("Rock Tunnel 1F-Wild", "Wild Pokemon - 9", "Onix", rom_addresses["Wild_RockTunnel1F"] + 17, None, + event=True, type="Wild Encounter", level=13), + LocationData("Rock Tunnel 1F-Wild", "Wild Pokemon - 10", "Onix", rom_addresses["Wild_RockTunnel1F"] + 19, None, + event=True, type="Wild Encounter", level=15), + LocationData("Rock Tunnel B1F-Wild", "Wild Pokemon - 1", "Zubat", rom_addresses["Wild_RockTunnelB1F"] + 1, None, + event=True, type="Wild Encounter", level=16), + LocationData("Rock Tunnel B1F-Wild", "Wild Pokemon - 2", "Zubat", rom_addresses["Wild_RockTunnelB1F"] + 3, None, + event=True, type="Wild Encounter", level=17), + LocationData("Rock Tunnel B1F-Wild", "Wild Pokemon - 3", "Geodude", rom_addresses["Wild_RockTunnelB1F"] + 5, None, + event=True, type="Wild Encounter", level=17), + LocationData("Rock Tunnel B1F-Wild", "Wild Pokemon - 4", "Machop", rom_addresses["Wild_RockTunnelB1F"] + 7, None, + event=True, type="Wild Encounter", level=15), + LocationData("Rock Tunnel B1F-Wild", "Wild Pokemon - 5", "Geodude", rom_addresses["Wild_RockTunnelB1F"] + 9, None, + event=True, type="Wild Encounter", level=16), + LocationData("Rock Tunnel B1F-Wild", "Wild Pokemon - 6", "Zubat", rom_addresses["Wild_RockTunnelB1F"] + 11, None, + event=True, type="Wild Encounter", level=18), + LocationData("Rock Tunnel B1F-Wild", "Wild Pokemon - 7", "Machop", rom_addresses["Wild_RockTunnelB1F"] + 13, None, + event=True, type="Wild Encounter", level=17), + LocationData("Rock Tunnel B1F-Wild", "Wild Pokemon - 8", "Onix", rom_addresses["Wild_RockTunnelB1F"] + 15, None, + event=True, type="Wild Encounter", level=17), + LocationData("Rock Tunnel B1F-Wild", "Wild Pokemon - 9", "Onix", rom_addresses["Wild_RockTunnelB1F"] + 17, None, + event=True, type="Wild Encounter", level=13), + LocationData("Rock Tunnel B1F-Wild", "Wild Pokemon - 10", "Geodude", rom_addresses["Wild_RockTunnelB1F"] + 19, None, + event=True, type="Wild Encounter", level=18), + LocationData("Route 10-N", "Wild Pokemon - 1", "Voltorb", rom_addresses["Wild_Route10"] + 1, None, + event=True, type="Wild Encounter", level=16), + LocationData("Route 10-N", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route10"] + 3, None, + event=True, type="Wild Encounter", level=16), + LocationData("Route 10-N", "Wild Pokemon - 3", "Voltorb", rom_addresses["Wild_Route10"] + 5, None, + event=True, type="Wild Encounter", level=14), + LocationData("Route 10-N", "Wild Pokemon - 4", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route10"] + 7, + None, event=True, type="Wild Encounter", level=11), + LocationData("Route 10-N", "Wild Pokemon - 5", "Spearow", rom_addresses["Wild_Route10"] + 9, None, + event=True, type="Wild Encounter", level=13), + LocationData("Route 10-N", "Wild Pokemon - 6", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route10"] + 11, + None, event=True, type="Wild Encounter", level=15), + LocationData("Route 10-N", "Wild Pokemon - 7", "Voltorb", rom_addresses["Wild_Route10"] + 13, None, + event=True, type="Wild Encounter", level=17), + LocationData("Route 10-N", "Wild Pokemon - 8", "Spearow", rom_addresses["Wild_Route10"] + 15, None, + event=True, type="Wild Encounter", level=17), + LocationData("Route 10-N", "Wild Pokemon - 9", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route10"] + 17, + None, event=True, type="Wild Encounter", level=13), + LocationData("Route 10-N", "Wild Pokemon - 10", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route10"] + 19, + None, event=True, type="Wild Encounter", level=17), + LocationData("Route 12-Grass", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route12"] + 1, + None, event=True, type="Wild Encounter", level=24), + LocationData("Route 12-Grass", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route12"] + 3, None, + event=True, type="Wild Encounter", level=25), + LocationData("Route 12-Grass", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route12"] + 5, None, + event=True, type="Wild Encounter", level=23), + LocationData("Route 12-Grass", "Wild Pokemon - 4", "Venonat", rom_addresses["Wild_Route12"] + 7, None, + event=True, type="Wild Encounter", level=24), + LocationData("Route 12-Grass", "Wild Pokemon - 5", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route12"] + 9, + None, event=True, type="Wild Encounter", level=22), + LocationData("Route 12-Grass", "Wild Pokemon - 6", "Venonat", rom_addresses["Wild_Route12"] + 11, None, + event=True, type="Wild Encounter", level=26), + LocationData("Route 12-Grass", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route12"] + 13, + None, event=True, type="Wild Encounter", level=26), + LocationData("Route 12-Grass", "Wild Pokemon - 8", "Pidgey", rom_addresses["Wild_Route12"] + 15, None, + event=True, type="Wild Encounter", level=27), + LocationData("Route 12-Grass", "Wild Pokemon - 9", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route12"] + 17, + None, event=True, type="Wild Encounter", level=28), + LocationData("Route 12-Grass", "Wild Pokemon - 10", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route12"] + 19, + None, event=True, type="Wild Encounter", level=30), + LocationData("Route 8-Grass", "Wild Pokemon - 1", "Pidgey", rom_addresses["Wild_Route8"] + 1, None, event=True, + type="Wild Encounter", level=18), + LocationData("Route 8-Grass", "Wild Pokemon - 2", ["Mankey", "Meowth"], rom_addresses["Wild_Route8"] + 3, None, + event=True, type="Wild Encounter", level=18), + LocationData("Route 8-Grass", "Wild Pokemon - 3", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route8"] + 5, None, + event=True, type="Wild Encounter", level=17), + LocationData("Route 8-Grass", "Wild Pokemon - 4", ["Growlithe", "Vulpix"], rom_addresses["Wild_Route8"] + 7, None, + event=True, type="Wild Encounter", level=16), + LocationData("Route 8-Grass", "Wild Pokemon - 5", "Pidgey", rom_addresses["Wild_Route8"] + 9, None, event=True, + type="Wild Encounter", level=20), + LocationData("Route 8-Grass", "Wild Pokemon - 6", ["Mankey", "Meowth"], rom_addresses["Wild_Route8"] + 11, None, + event=True, type="Wild Encounter", level=20), + LocationData("Route 8-Grass", "Wild Pokemon - 7", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route8"] + 13, None, + event=True, type="Wild Encounter", level=19), + LocationData("Route 8-Grass", "Wild Pokemon - 8", ["Growlithe", "Vulpix"], rom_addresses["Wild_Route8"] + 15, None, + event=True, type="Wild Encounter", level=17), + LocationData("Route 8-Grass", "Wild Pokemon - 9", ["Growlithe", "Vulpix"], rom_addresses["Wild_Route8"] + 17, None, + event=True, type="Wild Encounter", level=15), + LocationData("Route 8-Grass", "Wild Pokemon - 10", ["Growlithe", "Vulpix"], rom_addresses["Wild_Route8"] + 19, None, + event=True, type="Wild Encounter", level=18), LocationData("Route 7", "Wild Pokemon - 1", "Pidgey", rom_addresses["Wild_Route7"] + 1, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=19), LocationData("Route 7", "Wild Pokemon - 2", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route7"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=19), LocationData("Route 7", "Wild Pokemon - 3", ["Mankey", "Meowth"], rom_addresses["Wild_Route7"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=17), LocationData("Route 7", "Wild Pokemon - 4", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route7"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Route 7", "Wild Pokemon - 5", "Pidgey", rom_addresses["Wild_Route7"] + 9, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=22), LocationData("Route 7", "Wild Pokemon - 6", ["Mankey", "Meowth"], rom_addresses["Wild_Route7"] + 11, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=18), LocationData("Route 7", "Wild Pokemon - 7", ["Growlithe", "Vulpix"], rom_addresses["Wild_Route7"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=18), LocationData("Route 7", "Wild Pokemon - 8", ["Growlithe", "Vulpix"], rom_addresses["Wild_Route7"] + 15, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Route 7", "Wild Pokemon - 9", ["Mankey", "Meowth"], rom_addresses["Wild_Route7"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=19), LocationData("Route 7", "Wild Pokemon - 10", ["Mankey", "Meowth"], rom_addresses["Wild_Route7"] + 19, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Pokemon Tower 3F", "Wild Pokemon - 1", "Gastly", rom_addresses["Wild_PokemonTower3F"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Pokemon Tower 3F", "Wild Pokemon - 2", "Gastly", rom_addresses["Wild_PokemonTower3F"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=21), LocationData("Pokemon Tower 3F", "Wild Pokemon - 3", "Gastly", rom_addresses["Wild_PokemonTower3F"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Pokemon Tower 3F", "Wild Pokemon - 4", "Gastly", rom_addresses["Wild_PokemonTower3F"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=23), LocationData("Pokemon Tower 3F", "Wild Pokemon - 5", "Gastly", rom_addresses["Wild_PokemonTower3F"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=19), LocationData("Pokemon Tower 3F", "Wild Pokemon - 6", "Gastly", rom_addresses["Wild_PokemonTower3F"] + 11, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=18), LocationData("Pokemon Tower 3F", "Wild Pokemon - 7", "Gastly", rom_addresses["Wild_PokemonTower3F"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=24), LocationData("Pokemon Tower 3F", "Wild Pokemon - 8", "Cubone", rom_addresses["Wild_PokemonTower3F"] + 15, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Pokemon Tower 3F", "Wild Pokemon - 9", "Cubone", rom_addresses["Wild_PokemonTower3F"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Pokemon Tower 3F", "Wild Pokemon - 10", "Haunter", rom_addresses["Wild_PokemonTower3F"] + 19, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=25), LocationData("Pokemon Tower 4F", "Wild Pokemon - 1", "Gastly", rom_addresses["Wild_PokemonTower4F"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Pokemon Tower 4F", "Wild Pokemon - 2", "Gastly", rom_addresses["Wild_PokemonTower4F"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=21), LocationData("Pokemon Tower 4F", "Wild Pokemon - 3", "Gastly", rom_addresses["Wild_PokemonTower4F"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Pokemon Tower 4F", "Wild Pokemon - 4", "Gastly", rom_addresses["Wild_PokemonTower4F"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=23), LocationData("Pokemon Tower 4F", "Wild Pokemon - 5", "Gastly", rom_addresses["Wild_PokemonTower4F"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=19), LocationData("Pokemon Tower 4F", "Wild Pokemon - 6", "Gastly", rom_addresses["Wild_PokemonTower4F"] + 11, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=18), LocationData("Pokemon Tower 4F", "Wild Pokemon - 7", "Haunter", rom_addresses["Wild_PokemonTower4F"] + 13, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=25), LocationData("Pokemon Tower 4F", "Wild Pokemon - 8", "Cubone", rom_addresses["Wild_PokemonTower4F"] + 15, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Pokemon Tower 4F", "Wild Pokemon - 9", "Cubone", rom_addresses["Wild_PokemonTower4F"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Pokemon Tower 4F", "Wild Pokemon - 10", "Gastly", rom_addresses["Wild_PokemonTower4F"] + 19, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=24), LocationData("Pokemon Tower 5F", "Wild Pokemon - 1", "Gastly", rom_addresses["Wild_PokemonTower5F"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Pokemon Tower 5F", "Wild Pokemon - 2", "Gastly", rom_addresses["Wild_PokemonTower5F"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=21), LocationData("Pokemon Tower 5F", "Wild Pokemon - 3", "Gastly", rom_addresses["Wild_PokemonTower5F"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Pokemon Tower 5F", "Wild Pokemon - 4", "Gastly", rom_addresses["Wild_PokemonTower5F"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=23), LocationData("Pokemon Tower 5F", "Wild Pokemon - 5", "Gastly", rom_addresses["Wild_PokemonTower5F"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=19), LocationData("Pokemon Tower 5F", "Wild Pokemon - 6", "Gastly", rom_addresses["Wild_PokemonTower5F"] + 11, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=18), LocationData("Pokemon Tower 5F", "Wild Pokemon - 7", "Haunter", rom_addresses["Wild_PokemonTower5F"] + 13, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=25), LocationData("Pokemon Tower 5F", "Wild Pokemon - 8", "Cubone", rom_addresses["Wild_PokemonTower5F"] + 15, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Pokemon Tower 5F", "Wild Pokemon - 9", "Cubone", rom_addresses["Wild_PokemonTower5F"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Pokemon Tower 5F", "Wild Pokemon - 10", "Gastly", rom_addresses["Wild_PokemonTower5F"] + 19, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=24), LocationData("Pokemon Tower 6F", "Wild Pokemon - 1", "Gastly", rom_addresses["Wild_PokemonTower6F"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=21), LocationData("Pokemon Tower 6F", "Wild Pokemon - 2", "Gastly", rom_addresses["Wild_PokemonTower6F"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Pokemon Tower 6F", "Wild Pokemon - 3", "Gastly", rom_addresses["Wild_PokemonTower6F"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=23), LocationData("Pokemon Tower 6F", "Wild Pokemon - 4", "Gastly", rom_addresses["Wild_PokemonTower6F"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=24), LocationData("Pokemon Tower 6F", "Wild Pokemon - 5", "Gastly", rom_addresses["Wild_PokemonTower6F"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Pokemon Tower 6F", "Wild Pokemon - 6", "Gastly", rom_addresses["Wild_PokemonTower6F"] + 11, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=19), LocationData("Pokemon Tower 6F", "Wild Pokemon - 7", "Haunter", rom_addresses["Wild_PokemonTower6F"] + 13, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=26), LocationData("Pokemon Tower 6F", "Wild Pokemon - 8", "Cubone", rom_addresses["Wild_PokemonTower6F"] + 15, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Pokemon Tower 6F", "Wild Pokemon - 9", "Cubone", rom_addresses["Wild_PokemonTower6F"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=24), LocationData("Pokemon Tower 6F", "Wild Pokemon - 10", "Haunter", rom_addresses["Wild_PokemonTower6F"] + 19, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=28), LocationData("Pokemon Tower 7F", "Wild Pokemon - 1", "Gastly", rom_addresses["Wild_PokemonTower7F"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=21), LocationData("Pokemon Tower 7F", "Wild Pokemon - 2", "Gastly", rom_addresses["Wild_PokemonTower7F"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Pokemon Tower 7F", "Wild Pokemon - 3", "Gastly", rom_addresses["Wild_PokemonTower7F"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=23), LocationData("Pokemon Tower 7F", "Wild Pokemon - 4", "Gastly", rom_addresses["Wild_PokemonTower7F"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=24), LocationData("Pokemon Tower 7F", "Wild Pokemon - 5", "Gastly", rom_addresses["Wild_PokemonTower7F"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Pokemon Tower 7F", "Wild Pokemon - 6", "Haunter", rom_addresses["Wild_PokemonTower7F"] + 11, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=28), LocationData("Pokemon Tower 7F", "Wild Pokemon - 7", "Cubone", rom_addresses["Wild_PokemonTower7F"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Pokemon Tower 7F", "Wild Pokemon - 8", "Cubone", rom_addresses["Wild_PokemonTower7F"] + 15, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=24), LocationData("Pokemon Tower 7F", "Wild Pokemon - 9", "Haunter", rom_addresses["Wild_PokemonTower7F"] + 17, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=28), LocationData("Pokemon Tower 7F", "Wild Pokemon - 10", "Haunter", rom_addresses["Wild_PokemonTower7F"] + 19, - None, event=True, type="Wild Encounter"), - LocationData("Route 13", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route13"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Route 13", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route13"] + 3, None, event=True, - type="Wild Encounter"), - LocationData("Route 13", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route13"] + 5, None, event=True, - type="Wild Encounter"), - LocationData("Route 13", "Wild Pokemon - 4", "Venonat", rom_addresses["Wild_Route13"] + 7, None, event=True, - type="Wild Encounter"), - LocationData("Route 13", "Wild Pokemon - 5", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route13"] + 9, None, - event=True, type="Wild Encounter"), - LocationData("Route 13", "Wild Pokemon - 6", "Venonat", rom_addresses["Wild_Route13"] + 11, None, event=True, - type="Wild Encounter"), - LocationData("Route 13", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route13"] + 13, None, - event=True, type="Wild Encounter"), - LocationData("Route 13", "Wild Pokemon - 8", "Ditto", rom_addresses["Wild_Route13"] + 15, None, event=True, - type="Wild Encounter"), - LocationData("Route 13", "Wild Pokemon - 9", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route13"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Route 13", "Wild Pokemon - 10", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route13"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Route 14 Grass", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Route 14 Grass", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route14"] + 3, None, event=True, - type="Wild Encounter"), - LocationData("Route 14 Grass", "Wild Pokemon - 3", "Ditto", rom_addresses["Wild_Route14"] + 5, None, event=True, - type="Wild Encounter"), - LocationData("Route 14 Grass", "Wild Pokemon - 4", "Venonat", rom_addresses["Wild_Route14"] + 7, None, event=True, - type="Wild Encounter"), - LocationData("Route 14 Grass", "Wild Pokemon - 5", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 9, None, - event=True, type="Wild Encounter"), - LocationData("Route 14 Grass", "Wild Pokemon - 6", "Venonat", rom_addresses["Wild_Route14"] + 11, None, event=True, - type="Wild Encounter"), - LocationData("Route 14 Grass", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 13, None, - event=True, type="Wild Encounter"), - LocationData("Route 14 Grass", "Wild Pokemon - 8", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route14"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Route 14 Grass", "Wild Pokemon - 9", "Pidgeotto", rom_addresses["Wild_Route14"] + 17, None, event=True, - type="Wild Encounter"), - LocationData("Route 14 Grass", "Wild Pokemon - 10", "Pidgeotto", rom_addresses["Wild_Route14"] + 19, None, event=True, - type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=30), + LocationData("Route 13-Grass", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route13"] + 1, None, + event=True, type="Wild Encounter", level=24), + LocationData("Route 13-Grass", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route13"] + 3, None, event=True, + type="Wild Encounter", level=25), + LocationData("Route 13-Grass", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route13"] + 5, None, event=True, + type="Wild Encounter", level=27), + LocationData("Route 13-Grass", "Wild Pokemon - 4", "Venonat", rom_addresses["Wild_Route13"] + 7, None, event=True, + type="Wild Encounter", level=24), + LocationData("Route 13-Grass", "Wild Pokemon - 5", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route13"] + 9, None, + event=True, type="Wild Encounter", level=22), + LocationData("Route 13-Grass", "Wild Pokemon - 6", "Venonat", rom_addresses["Wild_Route13"] + 11, None, event=True, + type="Wild Encounter", level=26), + LocationData("Route 13-Grass", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route13"] + 13, None, + event=True, type="Wild Encounter", level=26), + LocationData("Route 13-Grass", "Wild Pokemon - 8", "Ditto", rom_addresses["Wild_Route13"] + 15, None, event=True, + type="Wild Encounter", level=25), + LocationData("Route 13-Grass", "Wild Pokemon - 9", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route13"] + 17, None, + event=True, type="Wild Encounter", level=28), + LocationData("Route 13-Grass", "Wild Pokemon - 10", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route13"] + 19, None, + event=True, type="Wild Encounter", level=30), + LocationData("Route 14-Grass", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 1, None, + event=True, type="Wild Encounter", level=24), + LocationData("Route 14-Grass", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route14"] + 3, None, event=True, + type="Wild Encounter", level=26), + LocationData("Route 14-Grass", "Wild Pokemon - 3", "Ditto", rom_addresses["Wild_Route14"] + 5, None, event=True, + type="Wild Encounter", level=23), + LocationData("Route 14-Grass", "Wild Pokemon - 4", "Venonat", rom_addresses["Wild_Route14"] + 7, None, event=True, + type="Wild Encounter", level=24), + LocationData("Route 14-Grass", "Wild Pokemon - 5", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 9, None, + event=True, type="Wild Encounter", level=22), + LocationData("Route 14-Grass", "Wild Pokemon - 6", "Venonat", rom_addresses["Wild_Route14"] + 11, None, event=True, + type="Wild Encounter", level=26), + LocationData("Route 14-Grass", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 13, None, + event=True, type="Wild Encounter", level=26), + LocationData("Route 14-Grass", "Wild Pokemon - 8", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route14"] + 15, None, + event=True, type="Wild Encounter", level=30), + LocationData("Route 14-Grass", "Wild Pokemon - 9", "Pidgeotto", rom_addresses["Wild_Route14"] + 17, None, event=True, + type="Wild Encounter", level=28), + LocationData("Route 14-Grass", "Wild Pokemon - 10", "Pidgeotto", rom_addresses["Wild_Route14"] + 19, None, event=True, + type="Wild Encounter", level=30), LocationData("Route 15", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route15"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=24), LocationData("Route 15", "Wild Pokemon - 2", "Ditto", rom_addresses["Wild_Route15"] + 3, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=26), LocationData("Route 15", "Wild Pokemon - 3", "Pidgey", rom_addresses["Wild_Route15"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=23), LocationData("Route 15", "Wild Pokemon - 4", "Venonat", rom_addresses["Wild_Route15"] + 7, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=26), LocationData("Route 15", "Wild Pokemon - 5", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route15"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Route 15", "Wild Pokemon - 6", "Venonat", rom_addresses["Wild_Route15"] + 11, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=28), LocationData("Route 15", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route15"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=26), LocationData("Route 15", "Wild Pokemon - 8", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route15"] + 15, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=30), LocationData("Route 15", "Wild Pokemon - 9", "Pidgeotto", rom_addresses["Wild_Route15"] + 17, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=28), LocationData("Route 15", "Wild Pokemon - 10", "Pidgeotto", rom_addresses["Wild_Route15"] + 19, None, event=True, - type="Wild Encounter"), - LocationData("Route 16 North", "Wild Pokemon - 1", "Spearow", rom_addresses["Wild_Route16"] + 1, None, event=True, - type="Wild Encounter"), - LocationData("Route 16 North", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route16"] + 3, None, event=True, - type="Wild Encounter"), - LocationData("Route 16 North", "Wild Pokemon - 3", "Rattata", rom_addresses["Wild_Route16"] + 5, None, event=True, - type="Wild Encounter"), - LocationData("Route 16 North", "Wild Pokemon - 4", "Doduo", rom_addresses["Wild_Route16"] + 7, None, event=True, - type="Wild Encounter"), - LocationData("Route 16 North", "Wild Pokemon - 5", "Rattata", rom_addresses["Wild_Route16"] + 9, None, event=True, - type="Wild Encounter"), - LocationData("Route 16 North", "Wild Pokemon - 6", "Doduo", rom_addresses["Wild_Route16"] + 11, None, event=True, - type="Wild Encounter"), - LocationData("Route 16 North", "Wild Pokemon - 7", "Doduo", rom_addresses["Wild_Route16"] + 13, None, event=True, - type="Wild Encounter"), - LocationData("Route 16 North", "Wild Pokemon - 8", "Rattata", rom_addresses["Wild_Route16"] + 15, None, event=True, - type="Wild Encounter"), - LocationData("Route 16 North", "Wild Pokemon - 9", "Raticate", rom_addresses["Wild_Route16"] + 17, None, event=True, - type="Wild Encounter"), - LocationData("Route 16 North", "Wild Pokemon - 10", "Raticate", rom_addresses["Wild_Route16"] + 19, None, + type="Wild Encounter", level=30), + LocationData("Route 16-NE", "Wild Pokemon - 1", "Spearow", rom_addresses["Wild_Route16"] + 1, None, event=True, + type="Wild Encounter", level=20), + LocationData("Route 16-NE", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route16"] + 3, None, event=True, + type="Wild Encounter", level=22), + LocationData("Route 16-NE", "Wild Pokemon - 3", "Rattata", rom_addresses["Wild_Route16"] + 5, None, event=True, + type="Wild Encounter", level=18), + LocationData("Route 16-NE", "Wild Pokemon - 4", "Doduo", rom_addresses["Wild_Route16"] + 7, None, event=True, + type="Wild Encounter", level=20), + LocationData("Route 16-NE", "Wild Pokemon - 5", "Rattata", rom_addresses["Wild_Route16"] + 9, None, event=True, + type="Wild Encounter", level=20), + LocationData("Route 16-NE", "Wild Pokemon - 6", "Doduo", rom_addresses["Wild_Route16"] + 11, None, event=True, + type="Wild Encounter", level=18), + LocationData("Route 16-NE", "Wild Pokemon - 7", "Doduo", rom_addresses["Wild_Route16"] + 13, None, event=True, + type="Wild Encounter", level=22), + LocationData("Route 16-NE", "Wild Pokemon - 8", "Rattata", rom_addresses["Wild_Route16"] + 15, None, event=True, + type="Wild Encounter", level=22), + LocationData("Route 16-NE", "Wild Pokemon - 9", "Raticate", rom_addresses["Wild_Route16"] + 17, None, event=True, + type="Wild Encounter", level=23), + LocationData("Route 16-NE", "Wild Pokemon - 10", "Raticate", rom_addresses["Wild_Route16"] + 19, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=25), LocationData("Route 17", "Wild Pokemon - 1", "Spearow", rom_addresses["Wild_Route17"] + 1, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=20), LocationData("Route 17", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route17"] + 3, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=22), LocationData("Route 17", "Wild Pokemon - 3", "Raticate", rom_addresses["Wild_Route17"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=25), LocationData("Route 17", "Wild Pokemon - 4", "Doduo", rom_addresses["Wild_Route17"] + 7, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=24), LocationData("Route 17", "Wild Pokemon - 5", "Raticate", rom_addresses["Wild_Route17"] + 9, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=27), LocationData("Route 17", "Wild Pokemon - 6", "Doduo", rom_addresses["Wild_Route17"] + 11, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=26), LocationData("Route 17", "Wild Pokemon - 7", "Doduo", rom_addresses["Wild_Route17"] + 13, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=28), LocationData("Route 17", "Wild Pokemon - 8", "Raticate", rom_addresses["Wild_Route17"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=29), LocationData("Route 17", "Wild Pokemon - 9", "Fearow", rom_addresses["Wild_Route17"] + 17, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=25), LocationData("Route 17", "Wild Pokemon - 10", "Fearow", rom_addresses["Wild_Route17"] + 19, None, event=True, - type="Wild Encounter"), - LocationData("Route 18", "Wild Pokemon - 1", "Spearow", rom_addresses["Wild_Route18"] + 1, None, event=True, - type="Wild Encounter"), - LocationData("Route 18", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route18"] + 3, None, event=True, - type="Wild Encounter"), - LocationData("Route 18", "Wild Pokemon - 3", "Raticate", rom_addresses["Wild_Route18"] + 5, None, event=True, - type="Wild Encounter"), - LocationData("Route 18", "Wild Pokemon - 4", "Doduo", rom_addresses["Wild_Route18"] + 7, None, event=True, - type="Wild Encounter"), - LocationData("Route 18", "Wild Pokemon - 5", "Fearow", rom_addresses["Wild_Route18"] + 9, None, event=True, - type="Wild Encounter"), - LocationData("Route 18", "Wild Pokemon - 6", "Doduo", rom_addresses["Wild_Route18"] + 11, None, event=True, - type="Wild Encounter"), - LocationData("Route 18", "Wild Pokemon - 7", "Doduo", rom_addresses["Wild_Route18"] + 13, None, event=True, - type="Wild Encounter"), - LocationData("Route 18", "Wild Pokemon - 8", "Raticate", rom_addresses["Wild_Route18"] + 15, None, event=True, - type="Wild Encounter"), - LocationData("Route 18", "Wild Pokemon - 9", "Fearow", rom_addresses["Wild_Route18"] + 17, None, event=True, - type="Wild Encounter"), - LocationData("Route 18", "Wild Pokemon - 10", "Fearow", rom_addresses["Wild_Route18"] + 19, None, event=True, - type="Wild Encounter"), - LocationData("Safari Zone Center", "Wild Pokemon - 1", ["Nidoran M", "Nidoran F"], - rom_addresses["Wild_SafariZoneCenter"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Wild Pokemon - 2", "Rhyhorn", rom_addresses["Wild_SafariZoneCenter"] + 3, - None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Wild Pokemon - 3", "Venonat", rom_addresses["Wild_SafariZoneCenter"] + 5, - None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Wild Pokemon - 4", "Exeggcute", rom_addresses["Wild_SafariZoneCenter"] + 7, - None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Wild Pokemon - 5", ["Nidorino", "Nidorina"], - rom_addresses["Wild_SafariZoneCenter"] + 9, None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Wild Pokemon - 6", "Exeggcute", rom_addresses["Wild_SafariZoneCenter"] + 11, - None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Wild Pokemon - 7", ["Nidorina", "Nidorino"], - rom_addresses["Wild_SafariZoneCenter"] + 13, None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Wild Pokemon - 8", "Parasect", rom_addresses["Wild_SafariZoneCenter"] + 15, - None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Wild Pokemon - 9", ["Scyther", "Pinsir"], - rom_addresses["Wild_SafariZoneCenter"] + 17, None, event=True, type="Wild Encounter"), - LocationData("Safari Zone Center", "Wild Pokemon - 10", "Chansey", rom_addresses["Wild_SafariZoneCenter"] + 19, - None, event=True, type="Wild Encounter"), + type="Wild Encounter", level=27), + LocationData("Route 18-E", "Wild Pokemon - 1", "Spearow", rom_addresses["Wild_Route18"] + 1, None, event=True, + type="Wild Encounter", level=20), + LocationData("Route 18-E", "Wild Pokemon - 2", "Spearow", rom_addresses["Wild_Route18"] + 3, None, event=True, + type="Wild Encounter", level=22), + LocationData("Route 18-E", "Wild Pokemon - 3", "Raticate", rom_addresses["Wild_Route18"] + 5, None, event=True, + type="Wild Encounter", level=25), + LocationData("Route 18-E", "Wild Pokemon - 4", "Doduo", rom_addresses["Wild_Route18"] + 7, None, event=True, + type="Wild Encounter", level=24), + LocationData("Route 18-E", "Wild Pokemon - 5", "Fearow", rom_addresses["Wild_Route18"] + 9, None, event=True, + type="Wild Encounter", level=25), + LocationData("Route 18-E", "Wild Pokemon - 6", "Doduo", rom_addresses["Wild_Route18"] + 11, None, event=True, + type="Wild Encounter", level=26), + LocationData("Route 18-E", "Wild Pokemon - 7", "Doduo", rom_addresses["Wild_Route18"] + 13, None, event=True, + type="Wild Encounter", level=28), + LocationData("Route 18-E", "Wild Pokemon - 8", "Raticate", rom_addresses["Wild_Route18"] + 15, None, event=True, + type="Wild Encounter", level=29), + LocationData("Route 18-E", "Wild Pokemon - 9", "Fearow", rom_addresses["Wild_Route18"] + 17, None, event=True, + type="Wild Encounter", level=27), + LocationData("Route 18-E", "Wild Pokemon - 10", "Fearow", rom_addresses["Wild_Route18"] + 19, None, event=True, + type="Wild Encounter", level=29), + LocationData("Safari Zone Center-Wild", "Wild Pokemon - 1", ["Nidoran M", "Nidoran F"], + rom_addresses["Wild_SafariZoneCenter"] + 1, None, event=True, type="Wild Encounter", level=22), + LocationData("Safari Zone Center-Wild", "Wild Pokemon - 2", "Rhyhorn", rom_addresses["Wild_SafariZoneCenter"] + 3, + None, event=True, type="Wild Encounter", level=25), + LocationData("Safari Zone Center-Wild", "Wild Pokemon - 3", "Venonat", rom_addresses["Wild_SafariZoneCenter"] + 5, + None, event=True, type="Wild Encounter", level=22), + LocationData("Safari Zone Center-Wild", "Wild Pokemon - 4", "Exeggcute", rom_addresses["Wild_SafariZoneCenter"] + 7, + None, event=True, type="Wild Encounter", level=24), + LocationData("Safari Zone Center-Wild", "Wild Pokemon - 5", ["Nidorino", "Nidorina"], + rom_addresses["Wild_SafariZoneCenter"] + 9, None, event=True, type="Wild Encounter", level=31), + LocationData("Safari Zone Center-Wild", "Wild Pokemon - 6", "Exeggcute", rom_addresses["Wild_SafariZoneCenter"] + 11, + None, event=True, type="Wild Encounter", level=25), + LocationData("Safari Zone Center-Wild", "Wild Pokemon - 7", ["Nidorina", "Nidorino"], + rom_addresses["Wild_SafariZoneCenter"] + 13, None, event=True, type="Wild Encounter", level=31), + LocationData("Safari Zone Center-Wild", "Wild Pokemon - 8", "Parasect", rom_addresses["Wild_SafariZoneCenter"] + 15, + None, event=True, type="Wild Encounter", level=30), + LocationData("Safari Zone Center-Wild", "Wild Pokemon - 9", ["Scyther", "Pinsir"], + rom_addresses["Wild_SafariZoneCenter"] + 17, None, event=True, type="Wild Encounter", level=23), + LocationData("Safari Zone Center-Wild", "Wild Pokemon - 10", "Chansey", rom_addresses["Wild_SafariZoneCenter"] + 19, + None, event=True, type="Wild Encounter", level=23), LocationData("Safari Zone East", "Wild Pokemon - 1", ["Nidoran M", "Nidoran F"], - rom_addresses["Wild_SafariZoneEast"] + 1, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SafariZoneEast"] + 1, None, event=True, type="Wild Encounter", level=24), LocationData("Safari Zone East", "Wild Pokemon - 2", "Doduo", rom_addresses["Wild_SafariZoneEast"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=26), LocationData("Safari Zone East", "Wild Pokemon - 3", "Paras", rom_addresses["Wild_SafariZoneEast"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Safari Zone East", "Wild Pokemon - 4", "Exeggcute", rom_addresses["Wild_SafariZoneEast"] + 7, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=25), LocationData("Safari Zone East", "Wild Pokemon - 5", ["Nidorino", "Nidorina"], - rom_addresses["Wild_SafariZoneEast"] + 9, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SafariZoneEast"] + 9, None, event=True, type="Wild Encounter", level=33), LocationData("Safari Zone East", "Wild Pokemon - 6", "Exeggcute", rom_addresses["Wild_SafariZoneEast"] + 11, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=23), LocationData("Safari Zone East", "Wild Pokemon - 7", ["Nidoran F", "Nidoran M"], - rom_addresses["Wild_SafariZoneEast"] + 13, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SafariZoneEast"] + 13, None, event=True, type="Wild Encounter", level=24), LocationData("Safari Zone East", "Wild Pokemon - 8", "Parasect", rom_addresses["Wild_SafariZoneEast"] + 15, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=25), LocationData("Safari Zone East", "Wild Pokemon - 9", "Kangaskhan", rom_addresses["Wild_SafariZoneEast"] + 17, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=25), LocationData("Safari Zone East", "Wild Pokemon - 10", ["Scyther", "Pinsir"], - rom_addresses["Wild_SafariZoneEast"] + 19, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SafariZoneEast"] + 19, None, event=True, type="Wild Encounter", level=28), LocationData("Safari Zone North", "Wild Pokemon - 1", ["Nidoran M", "Nidoran F"], - rom_addresses["Wild_SafariZoneNorth"] + 1, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SafariZoneNorth"] + 1, None, event=True, type="Wild Encounter", level=22), LocationData("Safari Zone North", "Wild Pokemon - 2", "Rhyhorn", rom_addresses["Wild_SafariZoneNorth"] + 3, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=26), LocationData("Safari Zone North", "Wild Pokemon - 3", "Paras", rom_addresses["Wild_SafariZoneNorth"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=23), LocationData("Safari Zone North", "Wild Pokemon - 4", "Exeggcute", rom_addresses["Wild_SafariZoneNorth"] + 7, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=25), LocationData("Safari Zone North", "Wild Pokemon - 5", ["Nidorino", "Nidorina"], - rom_addresses["Wild_SafariZoneNorth"] + 9, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SafariZoneNorth"] + 9, None, event=True, type="Wild Encounter", level=30), LocationData("Safari Zone North", "Wild Pokemon - 6", "Exeggcute", rom_addresses["Wild_SafariZoneNorth"] + 11, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=27), LocationData("Safari Zone North", "Wild Pokemon - 7", ["Nidorina", "Nidorino"], - rom_addresses["Wild_SafariZoneNorth"] + 13, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SafariZoneNorth"] + 13, None, event=True, type="Wild Encounter", level=30), LocationData("Safari Zone North", "Wild Pokemon - 8", "Venomoth", rom_addresses["Wild_SafariZoneNorth"] + 15, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=32), LocationData("Safari Zone North", "Wild Pokemon - 9", "Chansey", rom_addresses["Wild_SafariZoneNorth"] + 17, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=26), LocationData("Safari Zone North", "Wild Pokemon - 10", "Tauros", rom_addresses["Wild_SafariZoneNorth"] + 19, - None, event=True, type="Wild Encounter"), - LocationData("Safari Zone West", "Wild Pokemon - 1", ["Nidoran M", "Nidoran F"], - rom_addresses["Wild_SafariZoneWest"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Safari Zone West", "Wild Pokemon - 2", "Doduo", rom_addresses["Wild_SafariZoneWest"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Safari Zone West", "Wild Pokemon - 3", "Venonat", rom_addresses["Wild_SafariZoneWest"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Safari Zone West", "Wild Pokemon - 4", "Exeggcute", rom_addresses["Wild_SafariZoneWest"] + 7, - None, event=True, type="Wild Encounter"), - LocationData("Safari Zone West", "Wild Pokemon - 5", ["Nidorino", "Nidorina"], - rom_addresses["Wild_SafariZoneWest"] + 9, None, event=True, type="Wild Encounter"), - LocationData("Safari Zone West", "Wild Pokemon - 6", "Exeggcute", rom_addresses["Wild_SafariZoneWest"] + 11, - None, event=True, type="Wild Encounter"), - LocationData("Safari Zone West", "Wild Pokemon - 7", ["Nidoran F", "Nidoran M"], - rom_addresses["Wild_SafariZoneWest"] + 13, None, event=True, type="Wild Encounter"), - LocationData("Safari Zone West", "Wild Pokemon - 8", "Venomoth", rom_addresses["Wild_SafariZoneWest"] + 15, - None, event=True, type="Wild Encounter"), - LocationData("Safari Zone West", "Wild Pokemon - 9", "Tauros", rom_addresses["Wild_SafariZoneWest"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Safari Zone West", "Wild Pokemon - 10", "Kangaskhan", rom_addresses["Wild_SafariZoneWest"] + 19, - None, event=True, type="Wild Encounter"), - LocationData("Route 20 West", "Surf Pokemon - 1", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Route 20 West", "Surf Pokemon - 2", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Route 20 West", "Surf Pokemon - 3", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Route 20 West", "Surf Pokemon - 4", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Route 20 West", "Surf Pokemon - 5", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 9, None, - event=True, type="Wild Encounter"), - LocationData("Route 20 West", "Surf Pokemon - 6", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 11, None, - event=True, type="Wild Encounter"), - LocationData("Route 20 West", "Surf Pokemon - 7", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 13, None, - event=True, type="Wild Encounter"), - LocationData("Route 20 West", "Surf Pokemon - 8", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Route 20 West", "Surf Pokemon - 9", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Route 20 West", "Surf Pokemon - 10", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 19, None, - event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=28), + LocationData("Safari Zone West-Wild", "Wild Pokemon - 1", ["Nidoran M", "Nidoran F"], + rom_addresses["Wild_SafariZoneWest"] + 1, None, event=True, type="Wild Encounter", level=25), + LocationData("Safari Zone West-Wild", "Wild Pokemon - 2", "Doduo", rom_addresses["Wild_SafariZoneWest"] + 3, None, + event=True, type="Wild Encounter", level=26), + LocationData("Safari Zone West-Wild", "Wild Pokemon - 3", "Venonat", rom_addresses["Wild_SafariZoneWest"] + 5, None, + event=True, type="Wild Encounter", level=23), + LocationData("Safari Zone West-Wild", "Wild Pokemon - 4", "Exeggcute", rom_addresses["Wild_SafariZoneWest"] + 7, + None, event=True, type="Wild Encounter", level=24), + LocationData("Safari Zone West-Wild", "Wild Pokemon - 5", ["Nidorino", "Nidorina"], + rom_addresses["Wild_SafariZoneWest"] + 9, None, event=True, type="Wild Encounter", level=33), + LocationData("Safari Zone West-Wild", "Wild Pokemon - 6", "Exeggcute", rom_addresses["Wild_SafariZoneWest"] + 11, + None, event=True, type="Wild Encounter", level=26), + LocationData("Safari Zone West-Wild", "Wild Pokemon - 7", ["Nidoran F", "Nidoran M"], + rom_addresses["Wild_SafariZoneWest"] + 13, None, event=True, type="Wild Encounter", level=25), + LocationData("Safari Zone West-Wild", "Wild Pokemon - 8", "Venomoth", rom_addresses["Wild_SafariZoneWest"] + 15, + None, event=True, type="Wild Encounter", level=31), + LocationData("Safari Zone West-Wild", "Wild Pokemon - 9", "Tauros", rom_addresses["Wild_SafariZoneWest"] + 17, None, + event=True, type="Wild Encounter", level=26), + LocationData("Safari Zone West-Wild", "Wild Pokemon - 10", "Kangaskhan", rom_addresses["Wild_SafariZoneWest"] + 19, + None, event=True, type="Wild Encounter", level=28), + LocationData("Route 19/20-Water", "Surf Pokemon - 1", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 1, None, + event=True, type="Wild Encounter", level=5), + LocationData("Route 19/20-Water", "Surf Pokemon - 2", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 3, None, + event=True, type="Wild Encounter", level=10), + LocationData("Route 19/20-Water", "Surf Pokemon - 3", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 5, None, + event=True, type="Wild Encounter", level=15), + LocationData("Route 19/20-Water", "Surf Pokemon - 4", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 7, None, + event=True, type="Wild Encounter", level=5), + LocationData("Route 19/20-Water", "Surf Pokemon - 5", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 9, None, + event=True, type="Wild Encounter", level=10), + LocationData("Route 19/20-Water", "Surf Pokemon - 6", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 11, None, + event=True, type="Wild Encounter", level=15), + LocationData("Route 19/20-Water", "Surf Pokemon - 7", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 13, None, + event=True, type="Wild Encounter", level=20), + LocationData("Route 19/20-Water", "Surf Pokemon - 8", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 15, None, + event=True, type="Wild Encounter", level=30), + LocationData("Route 19/20-Water", "Surf Pokemon - 9", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 17, None, + event=True, type="Wild Encounter", level=35), + LocationData("Route 19/20-Water", "Surf Pokemon - 10", "Tentacool", rom_addresses["Wild_SeaRoutes"] + 19, None, + event=True, type="Wild Encounter", level=40), LocationData("Route 21", "Surf Pokemon - 1", "Tentacool", rom_addresses["Wild_Surf_Route21"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=5), LocationData("Route 21", "Surf Pokemon - 2", "Tentacool", rom_addresses["Wild_Surf_Route21"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=10), LocationData("Route 21", "Surf Pokemon - 3", "Tentacool", rom_addresses["Wild_Surf_Route21"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=15), LocationData("Route 21", "Surf Pokemon - 4", "Tentacool", rom_addresses["Wild_Surf_Route21"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=5), LocationData("Route 21", "Surf Pokemon - 5", "Tentacool", rom_addresses["Wild_Surf_Route21"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=10), LocationData("Route 21", "Surf Pokemon - 6", "Tentacool", rom_addresses["Wild_Surf_Route21"] + 11, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=15), LocationData("Route 21", "Surf Pokemon - 7", "Tentacool", rom_addresses["Wild_Surf_Route21"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Route 21", "Surf Pokemon - 8", "Tentacool", rom_addresses["Wild_Surf_Route21"] + 15, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=30), LocationData("Route 21", "Surf Pokemon - 9", "Tentacool", rom_addresses["Wild_Surf_Route21"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=35), LocationData("Route 21", "Surf Pokemon - 10", "Tentacool", rom_addresses["Wild_Surf_Route21"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Seafoam Islands 1F", "Wild Pokemon - 1", "Seel", rom_addresses["Wild_SeafoamIslands1F"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Seafoam Islands 1F", "Wild Pokemon - 2", ["Slowpoke", "Psyduck"], - rom_addresses["Wild_SeafoamIslands1F"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands 1F", "Wild Pokemon - 3", ["Shellder", "Staryu"], - rom_addresses["Wild_SeafoamIslands1F"] + 5, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands 1F", "Wild Pokemon - 4", ["Horsea", "Krabby"], - rom_addresses["Wild_SeafoamIslands1F"] + 7, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands 1F", "Wild Pokemon - 5", ["Horsea", "Krabby"], - rom_addresses["Wild_SeafoamIslands1F"] + 9, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands 1F", "Wild Pokemon - 6", "Zubat", rom_addresses["Wild_SeafoamIslands1F"] + 11, - None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands 1F", "Wild Pokemon - 7", "Golbat", rom_addresses["Wild_SeafoamIslands1F"] + 13, - None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands 1F", "Wild Pokemon - 8", ["Psyduck", "Slowpoke"], - rom_addresses["Wild_SeafoamIslands1F"] + 15, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands 1F", "Wild Pokemon - 9", ["Shellder", "Staryu"], - rom_addresses["Wild_SeafoamIslands1F"] + 17, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands 1F", "Wild Pokemon - 10", ["Golduck", "Slowbro"], - rom_addresses["Wild_SeafoamIslands1F"] + 19, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B1F", "Wild Pokemon - 1", ["Staryu", "Shellder"], - rom_addresses["Wild_SeafoamIslandsB1F"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B1F", "Wild Pokemon - 2", ["Horsea", "Krabby"], - rom_addresses["Wild_SeafoamIslandsB1F"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B1F", "Wild Pokemon - 3", ["Shellder", "Staryu"], - rom_addresses["Wild_SeafoamIslandsB1F"] + 5, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B1F", "Wild Pokemon - 4", ["Horsea", "Krabby"], - rom_addresses["Wild_SeafoamIslandsB1F"] + 7, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B1F", "Wild Pokemon - 5", ["Slowpoke", "Psyduck"], - rom_addresses["Wild_SeafoamIslandsB1F"] + 9, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B1F", "Wild Pokemon - 6", "Seel", rom_addresses["Wild_SeafoamIslandsB1F"] + 11, - None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B1F", "Wild Pokemon - 7", ["Slowpoke", "Psyduck"], - rom_addresses["Wild_SeafoamIslandsB1F"] + 13, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B1F", "Wild Pokemon - 8", "Seel", rom_addresses["Wild_SeafoamIslandsB1F"] + 15, - None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B1F", "Wild Pokemon - 9", "Dewgong", rom_addresses["Wild_SeafoamIslandsB1F"] + 17, - None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B1F", "Wild Pokemon - 10", ["Seadra", "Kingler"], - rom_addresses["Wild_SeafoamIslandsB1F"] + 19, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B2F", "Wild Pokemon - 1", "Seel", rom_addresses["Wild_SeafoamIslandsB2F"] + 1, - None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B2F", "Wild Pokemon - 2", ["Slowpoke", "Psyduck"], - rom_addresses["Wild_SeafoamIslandsB2F"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B2F", "Wild Pokemon - 3", "Seel", rom_addresses["Wild_SeafoamIslandsB2F"] + 5, - None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B2F", "Wild Pokemon - 4", ["Slowpoke", "Psyduck"], - rom_addresses["Wild_SeafoamIslandsB2F"] + 7, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B2F", "Wild Pokemon - 5", ["Horsea", "Krabby"], - rom_addresses["Wild_SeafoamIslandsB2F"] + 9, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B2F", "Wild Pokemon - 6", ["Staryu", "Shellder"], - rom_addresses["Wild_SeafoamIslandsB2F"] + 11, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B2F", "Wild Pokemon - 7", ["Horsea", "Krabby"], - rom_addresses["Wild_SeafoamIslandsB2F"] + 13, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B2F", "Wild Pokemon - 8", ["Shellder", "Staryu"], - rom_addresses["Wild_SeafoamIslandsB2F"] + 15, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B2F", "Wild Pokemon - 9", "Golbat", rom_addresses["Wild_SeafoamIslandsB2F"] + 17, - None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B2F", "Wild Pokemon - 10", ["Slowbro", "Golduck"], - rom_addresses["Wild_SeafoamIslandsB2F"] + 19, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B3F", "Wild Pokemon - 1", ["Slowpoke", "Psyduck"], - rom_addresses["Wild_SeafoamIslandsB3F"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B3F", "Wild Pokemon - 2", "Seel", rom_addresses["Wild_SeafoamIslandsB3F"] + 3, - None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B3F", "Wild Pokemon - 3", ["Slowpoke", "Psyduck"], - rom_addresses["Wild_SeafoamIslandsB3F"] + 5, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B3F", "Wild Pokemon - 4", "Seel", rom_addresses["Wild_SeafoamIslandsB3F"] + 7, - None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B3F", "Wild Pokemon - 5", ["Horsea", "Krabby"], - rom_addresses["Wild_SeafoamIslandsB3F"] + 9, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B3F", "Wild Pokemon - 6", ["Shellder", "Staryu"], - rom_addresses["Wild_SeafoamIslandsB3F"] + 11, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B3F", "Wild Pokemon - 7", ["Horsea", "Krabby"], - rom_addresses["Wild_SeafoamIslandsB3F"] + 13, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B3F", "Wild Pokemon - 8", ["Shellder", "Staryu"], - rom_addresses["Wild_SeafoamIslandsB3F"] + 15, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B3F", "Wild Pokemon - 9", ["Seadra", "Kingler"], - rom_addresses["Wild_SeafoamIslandsB3F"] + 17, None, event=True, type="Wild Encounter"), - LocationData("Seafoam Islands B3F", "Wild Pokemon - 10", "Dewgong", - rom_addresses["Wild_SeafoamIslandsB3F"] + 19, None, event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=40), + LocationData("Seafoam Islands 1F-Wild", "Wild Pokemon - 1", "Seel", rom_addresses["Wild_SeafoamIslands1F"] + 1, None, + event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands 1F-Wild", "Wild Pokemon - 2", ["Slowpoke", "Psyduck"], + rom_addresses["Wild_SeafoamIslands1F"] + 3, None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands 1F-Wild", "Wild Pokemon - 3", ["Shellder", "Staryu"], + rom_addresses["Wild_SeafoamIslands1F"] + 5, None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands 1F-Wild", "Wild Pokemon - 4", ["Horsea", "Krabby"], + rom_addresses["Wild_SeafoamIslands1F"] + 7, None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands 1F-Wild", "Wild Pokemon - 5", ["Horsea", "Krabby"], + rom_addresses["Wild_SeafoamIslands1F"] + 9, None, event=True, type="Wild Encounter", level=28), + LocationData("Seafoam Islands 1F-Wild", "Wild Pokemon - 6", "Zubat", rom_addresses["Wild_SeafoamIslands1F"] + 11, + None, event=True, type="Wild Encounter", level=21), + LocationData("Seafoam Islands 1F-Wild", "Wild Pokemon - 7", "Golbat", rom_addresses["Wild_SeafoamIslands1F"] + 13, + None, event=True, type="Wild Encounter", level=29), + LocationData("Seafoam Islands 1F-Wild", "Wild Pokemon - 8", ["Psyduck", "Slowpoke"], + rom_addresses["Wild_SeafoamIslands1F"] + 15, None, event=True, type="Wild Encounter", level=28), + LocationData("Seafoam Islands 1F-Wild", "Wild Pokemon - 9", ["Shellder", "Staryu"], + rom_addresses["Wild_SeafoamIslands1F"] + 17, None, event=True, type="Wild Encounter", level=28), + LocationData("Seafoam Islands 1F-Wild", "Wild Pokemon - 10", ["Golduck", "Slowbro"], + rom_addresses["Wild_SeafoamIslands1F"] + 19, None, event=True, type="Wild Encounter", level=38), + LocationData("Seafoam Islands B1F-Wild", "Wild Pokemon - 1", ["Staryu", "Shellder"], + rom_addresses["Wild_SeafoamIslandsB1F"] + 1, None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands B1F-Wild", "Wild Pokemon - 2", ["Horsea", "Krabby"], + rom_addresses["Wild_SeafoamIslandsB1F"] + 3, None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands B1F-Wild", "Wild Pokemon - 3", ["Shellder", "Staryu"], + rom_addresses["Wild_SeafoamIslandsB1F"] + 5, None, event=True, type="Wild Encounter", level=32), + LocationData("Seafoam Islands B1F-Wild", "Wild Pokemon - 4", ["Horsea", "Krabby"], + rom_addresses["Wild_SeafoamIslandsB1F"] + 7, None, event=True, type="Wild Encounter", level=32), + LocationData("Seafoam Islands B1F-Wild", "Wild Pokemon - 5", ["Slowpoke", "Psyduck"], + rom_addresses["Wild_SeafoamIslandsB1F"] + 9, None, event=True, type="Wild Encounter", level=28), + LocationData("Seafoam Islands B1F-Wild", "Wild Pokemon - 6", "Seel", rom_addresses["Wild_SeafoamIslandsB1F"] + 11, + None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands B1F-Wild", "Wild Pokemon - 7", ["Slowpoke", "Psyduck"], + rom_addresses["Wild_SeafoamIslandsB1F"] + 13, None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands B1F-Wild", "Wild Pokemon - 8", "Seel", rom_addresses["Wild_SeafoamIslandsB1F"] + 15, + None, event=True, type="Wild Encounter", level=28), + LocationData("Seafoam Islands B1F-Wild", "Wild Pokemon - 9", "Dewgong", rom_addresses["Wild_SeafoamIslandsB1F"] + 17, + None, event=True, type="Wild Encounter", level=38), + LocationData("Seafoam Islands B1F-Wild", "Wild Pokemon - 10", ["Seadra", "Kingler"], + rom_addresses["Wild_SeafoamIslandsB1F"] + 19, None, event=True, type="Wild Encounter", level=37), + LocationData("Seafoam Islands B2F-Wild", "Wild Pokemon - 1", "Seel", rom_addresses["Wild_SeafoamIslandsB2F"] + 1, + None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands B2F-Wild", "Wild Pokemon - 2", ["Slowpoke", "Psyduck"], + rom_addresses["Wild_SeafoamIslandsB2F"] + 3, None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands B2F-Wild", "Wild Pokemon - 3", "Seel", rom_addresses["Wild_SeafoamIslandsB2F"] + 5, + None, event=True, type="Wild Encounter", level=32), + LocationData("Seafoam Islands B2F-Wild", "Wild Pokemon - 4", ["Slowpoke", "Psyduck"], + rom_addresses["Wild_SeafoamIslandsB2F"] + 7, None, event=True, type="Wild Encounter", level=32), + LocationData("Seafoam Islands B2F-Wild", "Wild Pokemon - 5", ["Horsea", "Krabby"], + rom_addresses["Wild_SeafoamIslandsB2F"] + 9, None, event=True, type="Wild Encounter", level=28), + LocationData("Seafoam Islands B2F-Wild", "Wild Pokemon - 6", ["Staryu", "Shellder"], + rom_addresses["Wild_SeafoamIslandsB2F"] + 11, None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands B2F-Wild", "Wild Pokemon - 7", ["Horsea", "Krabby"], + rom_addresses["Wild_SeafoamIslandsB2F"] + 13, None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands B2F-Wild", "Wild Pokemon - 8", ["Shellder", "Staryu"], + rom_addresses["Wild_SeafoamIslandsB2F"] + 15, None, event=True, type="Wild Encounter", level=28), + LocationData("Seafoam Islands B2F-Wild", "Wild Pokemon - 9", "Golbat", rom_addresses["Wild_SeafoamIslandsB2F"] + 17, + None, event=True, type="Wild Encounter", level=30), + LocationData("Seafoam Islands B2F-Wild", "Wild Pokemon - 10", ["Slowbro", "Golduck"], + rom_addresses["Wild_SeafoamIslandsB2F"] + 19, None, event=True, type="Wild Encounter", level=37), + LocationData("Seafoam Islands B3F-Wild", "Wild Pokemon - 1", ["Slowpoke", "Psyduck"], + rom_addresses["Wild_SeafoamIslandsB3F"] + 1, None, event=True, type="Wild Encounter", level=31), + LocationData("Seafoam Islands B3F-Wild", "Wild Pokemon - 2", "Seel", rom_addresses["Wild_SeafoamIslandsB3F"] + 3, + None, event=True, type="Wild Encounter", level=31), + LocationData("Seafoam Islands B3F-Wild", "Wild Pokemon - 3", ["Slowpoke", "Psyduck"], + rom_addresses["Wild_SeafoamIslandsB3F"] + 5, None, event=True, type="Wild Encounter", level=33), + LocationData("Seafoam Islands B3F-Wild", "Wild Pokemon - 4", "Seel", rom_addresses["Wild_SeafoamIslandsB3F"] + 7, + None, event=True, type="Wild Encounter", level=33), + LocationData("Seafoam Islands B3F-Wild", "Wild Pokemon - 5", ["Horsea", "Krabby"], + rom_addresses["Wild_SeafoamIslandsB3F"] + 9, None, event=True, type="Wild Encounter", level=29), + LocationData("Seafoam Islands B3F-Wild", "Wild Pokemon - 6", ["Shellder", "Staryu"], + rom_addresses["Wild_SeafoamIslandsB3F"] + 11, None, event=True, type="Wild Encounter", level=31), + LocationData("Seafoam Islands B3F-Wild", "Wild Pokemon - 7", ["Horsea", "Krabby"], + rom_addresses["Wild_SeafoamIslandsB3F"] + 13, None, event=True, type="Wild Encounter", level=31), + LocationData("Seafoam Islands B3F-Wild", "Wild Pokemon - 8", ["Shellder", "Staryu"], + rom_addresses["Wild_SeafoamIslandsB3F"] + 15, None, event=True, type="Wild Encounter", level=29), + LocationData("Seafoam Islands B3F-Wild", "Wild Pokemon - 9", ["Seadra", "Kingler"], + rom_addresses["Wild_SeafoamIslandsB3F"] + 17, None, event=True, type="Wild Encounter", level=39), + LocationData("Seafoam Islands B3F-Wild", "Wild Pokemon - 10", "Dewgong", + rom_addresses["Wild_SeafoamIslandsB3F"] + 19, None, event=True, type="Wild Encounter", level=37), LocationData("Seafoam Islands B4F", "Wild Pokemon - 1", ["Horsea", "Krabby"], - rom_addresses["Wild_SeafoamIslandsB4F"] + 1, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SeafoamIslandsB4F"] + 1, None, event=True, type="Wild Encounter", level=31), LocationData("Seafoam Islands B4F", "Wild Pokemon - 2", ["Shellder", "Staryu"], - rom_addresses["Wild_SeafoamIslandsB4F"] + 3, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SeafoamIslandsB4F"] + 3, None, event=True, type="Wild Encounter", level=31), LocationData("Seafoam Islands B4F", "Wild Pokemon - 3", ["Horsea", "Krabby"], - rom_addresses["Wild_SeafoamIslandsB4F"] + 5, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SeafoamIslandsB4F"] + 5, None, event=True, type="Wild Encounter", level=33), LocationData("Seafoam Islands B4F", "Wild Pokemon - 4", "Shellder", rom_addresses["Wild_SeafoamIslandsB4F"] + 7, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=33), LocationData("Seafoam Islands B4F", "Wild Pokemon - 5", ["Slowpoke", "Psyduck"], - rom_addresses["Wild_SeafoamIslandsB4F"] + 9, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SeafoamIslandsB4F"] + 9, None, event=True, type="Wild Encounter", level=29), LocationData("Seafoam Islands B4F", "Wild Pokemon - 6", "Seel", rom_addresses["Wild_SeafoamIslandsB4F"] + 11, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=31), LocationData("Seafoam Islands B4F", "Wild Pokemon - 7", ["Slowpoke", "Psyduck"], - rom_addresses["Wild_SeafoamIslandsB4F"] + 13, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SeafoamIslandsB4F"] + 13, None, event=True, type="Wild Encounter", level=31), LocationData("Seafoam Islands B4F", "Wild Pokemon - 8", "Seel", rom_addresses["Wild_SeafoamIslandsB4F"] + 15, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=29), LocationData("Seafoam Islands B4F", "Wild Pokemon - 9", ["Slowbro", "Golduck"], - rom_addresses["Wild_SeafoamIslandsB4F"] + 17, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_SeafoamIslandsB4F"] + 17, None, event=True, type="Wild Encounter", level=39), LocationData("Seafoam Islands B4F", "Wild Pokemon - 10", "Golbat", rom_addresses["Wild_SeafoamIslandsB4F"] + 19, - None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 1F", "Wild Pokemon - 1", ["Koffing", "Grimer"], - rom_addresses["Wild_PokemonMansion1F"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 1F", "Wild Pokemon - 2", ["Koffing", "Grimer"], - rom_addresses["Wild_PokemonMansion1F"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 1F", "Wild Pokemon - 3", "Ponyta", rom_addresses["Wild_PokemonMansion1F"] + 5, - None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 1F", "Wild Pokemon - 4", "Ponyta", rom_addresses["Wild_PokemonMansion1F"] + 7, - None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 1F", "Wild Pokemon - 5", ["Growlithe", "Vulpix"], - rom_addresses["Wild_PokemonMansion1F"] + 9, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 1F", "Wild Pokemon - 6", "Ponyta", rom_addresses["Wild_PokemonMansion1F"] + 11, - None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 1F", "Wild Pokemon - 7", ["Grimer", "Koffing"], - rom_addresses["Wild_PokemonMansion1F"] + 13, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 1F", "Wild Pokemon - 8", "Ponyta", rom_addresses["Wild_PokemonMansion1F"] + 15, - None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 1F", "Wild Pokemon - 9", ["Weezing", "Muk"], - rom_addresses["Wild_PokemonMansion1F"] + 17, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 1F", "Wild Pokemon - 10", ["Muk", "Weezing"], - rom_addresses["Wild_PokemonMansion1F"] + 19, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 2F", "Wild Pokemon - 1", ["Growlithe", "Vulpix"], - rom_addresses["Wild_PokemonMansion2F"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 2F", "Wild Pokemon - 2", ["Koffing", "Grimer"], - rom_addresses["Wild_PokemonMansion2F"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 2F", "Wild Pokemon - 3", ["Koffing", "Grimer"], - rom_addresses["Wild_PokemonMansion2F"] + 5, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 2F", "Wild Pokemon - 4", "Ponyta", rom_addresses["Wild_PokemonMansion2F"] + 7, - None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 2F", "Wild Pokemon - 5", ["Koffing", "Grimer"], - rom_addresses["Wild_PokemonMansion2F"] + 9, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 2F", "Wild Pokemon - 6", "Ponyta", rom_addresses["Wild_PokemonMansion2F"] + 11, - None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 2F", "Wild Pokemon - 7", ["Grimer", "Koffing"], - rom_addresses["Wild_PokemonMansion2F"] + 13, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 2F", "Wild Pokemon - 8", "Ponyta", rom_addresses["Wild_PokemonMansion2F"] + 15, - None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 2F", "Wild Pokemon - 9", ["Weezing", "Muk"], - rom_addresses["Wild_PokemonMansion2F"] + 17, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 2F", "Wild Pokemon - 10", ["Muk", "Weezing"], - rom_addresses["Wild_PokemonMansion2F"] + 19, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 3F", "Wild Pokemon - 1", ["Koffing", "Grimer"], - rom_addresses["Wild_PokemonMansion3F"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 3F", "Wild Pokemon - 2", ["Growlithe", "Vulpix"], - rom_addresses["Wild_PokemonMansion3F"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 3F", "Wild Pokemon - 3", ["Koffing", "Grimer"], - rom_addresses["Wild_PokemonMansion3F"] + 5, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 3F", "Wild Pokemon - 4", "Ponyta", rom_addresses["Wild_PokemonMansion3F"] + 7, - None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 3F", "Wild Pokemon - 5", ["Ponyta", "Magmar"], - rom_addresses["Wild_PokemonMansion3F"] + 9, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 3F", "Wild Pokemon - 6", ["Weezing", "Muk"], - rom_addresses["Wild_PokemonMansion3F"] + 11, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 3F", "Wild Pokemon - 7", ["Grimer", "Koffing"], - rom_addresses["Wild_PokemonMansion3F"] + 13, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 3F", "Wild Pokemon - 8", ["Weezing", "Muk"], - rom_addresses["Wild_PokemonMansion3F"] + 15, None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 3F", "Wild Pokemon - 9", "Ponyta", rom_addresses["Wild_PokemonMansion3F"] + 17, - None, event=True, type="Wild Encounter"), - LocationData("Pokemon Mansion 3F", "Wild Pokemon - 10", ["Muk", "Weezing"], - rom_addresses["Wild_PokemonMansion3F"] + 19, None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=32), + LocationData("Pokemon Mansion 1F-Wild", "Wild Pokemon - 1", ["Koffing", "Grimer"], + rom_addresses["Wild_PokemonMansion1F"] + 1, None, event=True, type="Wild Encounter", level=32), + LocationData("Pokemon Mansion 1F-Wild", "Wild Pokemon - 2", ["Koffing", "Grimer"], + rom_addresses["Wild_PokemonMansion1F"] + 3, None, event=True, type="Wild Encounter", level=30), + LocationData("Pokemon Mansion 1F-Wild", "Wild Pokemon - 3", "Ponyta", rom_addresses["Wild_PokemonMansion1F"] + 5, + None, event=True, type="Wild Encounter", level=34), + LocationData("Pokemon Mansion 1F-Wild", "Wild Pokemon - 4", "Ponyta", rom_addresses["Wild_PokemonMansion1F"] + 7, + None, event=True, type="Wild Encounter", level=30), + LocationData("Pokemon Mansion 1F-Wild", "Wild Pokemon - 5", ["Growlithe", "Vulpix"], + rom_addresses["Wild_PokemonMansion1F"] + 9, None, event=True, type="Wild Encounter", level=34), + LocationData("Pokemon Mansion 1F-Wild", "Wild Pokemon - 6", "Ponyta", rom_addresses["Wild_PokemonMansion1F"] + 11, + None, event=True, type="Wild Encounter", level=32), + LocationData("Pokemon Mansion 1F-Wild", "Wild Pokemon - 7", ["Grimer", "Koffing"], + rom_addresses["Wild_PokemonMansion1F"] + 13, None, event=True, type="Wild Encounter", level=30), + LocationData("Pokemon Mansion 1F-Wild", "Wild Pokemon - 8", "Ponyta", rom_addresses["Wild_PokemonMansion1F"] + 15, + None, event=True, type="Wild Encounter", level=28), + LocationData("Pokemon Mansion 1F-Wild", "Wild Pokemon - 9", ["Weezing", "Muk"], + rom_addresses["Wild_PokemonMansion1F"] + 17, None, event=True, type="Wild Encounter", level=37), + LocationData("Pokemon Mansion 1F-Wild", "Wild Pokemon - 10", ["Muk", "Weezing"], + rom_addresses["Wild_PokemonMansion1F"] + 19, None, event=True, type="Wild Encounter", level=39), + LocationData("Pokemon Mansion 2F-Wild", "Wild Pokemon - 1", ["Growlithe", "Vulpix"], + rom_addresses["Wild_PokemonMansion2F"] + 1, None, event=True, type="Wild Encounter", level=32), + LocationData("Pokemon Mansion 2F-Wild", "Wild Pokemon - 2", ["Koffing", "Grimer"], + rom_addresses["Wild_PokemonMansion2F"] + 3, None, event=True, type="Wild Encounter", level=34), + LocationData("Pokemon Mansion 2F-Wild", "Wild Pokemon - 3", ["Koffing", "Grimer"], + rom_addresses["Wild_PokemonMansion2F"] + 5, None, event=True, type="Wild Encounter", level=34), + LocationData("Pokemon Mansion 2F-Wild", "Wild Pokemon - 4", "Ponyta", rom_addresses["Wild_PokemonMansion2F"] + 7, + None, event=True, type="Wild Encounter", level=30), + LocationData("Pokemon Mansion 2F-Wild", "Wild Pokemon - 5", ["Koffing", "Grimer"], + rom_addresses["Wild_PokemonMansion2F"] + 9, None, event=True, type="Wild Encounter", level=30), + LocationData("Pokemon Mansion 2F-Wild", "Wild Pokemon - 6", "Ponyta", rom_addresses["Wild_PokemonMansion2F"] + 11, + None, event=True, type="Wild Encounter", level=32), + LocationData("Pokemon Mansion 2F-Wild", "Wild Pokemon - 7", ["Grimer", "Koffing"], + rom_addresses["Wild_PokemonMansion2F"] + 13, None, event=True, type="Wild Encounter", level=30), + LocationData("Pokemon Mansion 2F-Wild", "Wild Pokemon - 8", "Ponyta", rom_addresses["Wild_PokemonMansion2F"] + 15, + None, event=True, type="Wild Encounter", level=28), + LocationData("Pokemon Mansion 2F-Wild", "Wild Pokemon - 9", ["Weezing", "Muk"], + rom_addresses["Wild_PokemonMansion2F"] + 17, None, event=True, type="Wild Encounter", level=39), + LocationData("Pokemon Mansion 2F-Wild", "Wild Pokemon - 10", ["Muk", "Weezing"], + rom_addresses["Wild_PokemonMansion2F"] + 19, None, event=True, type="Wild Encounter", level=37), + LocationData("Pokemon Mansion 3F-Wild", "Wild Pokemon - 1", ["Koffing", "Grimer"], + rom_addresses["Wild_PokemonMansion3F"] + 1, None, event=True, type="Wild Encounter", level=31), + LocationData("Pokemon Mansion 3F-Wild", "Wild Pokemon - 2", ["Growlithe", "Vulpix"], + rom_addresses["Wild_PokemonMansion3F"] + 3, None, event=True, type="Wild Encounter", level=33), + LocationData("Pokemon Mansion 3F-Wild", "Wild Pokemon - 3", ["Koffing", "Grimer"], + rom_addresses["Wild_PokemonMansion3F"] + 5, None, event=True, type="Wild Encounter", level=35), + LocationData("Pokemon Mansion 3F-Wild", "Wild Pokemon - 4", "Ponyta", rom_addresses["Wild_PokemonMansion3F"] + 7, + None, event=True, type="Wild Encounter", level=32), + LocationData("Pokemon Mansion 3F-Wild", "Wild Pokemon - 5", ["Ponyta", "Magmar"], + rom_addresses["Wild_PokemonMansion3F"] + 9, None, event=True, type="Wild Encounter", level=34), + LocationData("Pokemon Mansion 3F-Wild", "Wild Pokemon - 6", ["Weezing", "Muk"], + rom_addresses["Wild_PokemonMansion3F"] + 11, None, event=True, type="Wild Encounter", level=40), + LocationData("Pokemon Mansion 3F-Wild", "Wild Pokemon - 7", ["Grimer", "Koffing"], + rom_addresses["Wild_PokemonMansion3F"] + 13, None, event=True, type="Wild Encounter", level=34), + LocationData("Pokemon Mansion 3F-Wild", "Wild Pokemon - 8", ["Weezing", "Muk"], + rom_addresses["Wild_PokemonMansion3F"] + 15, None, event=True, type="Wild Encounter", level=38), + LocationData("Pokemon Mansion 3F-Wild", "Wild Pokemon - 9", "Ponyta", rom_addresses["Wild_PokemonMansion3F"] + 17, + None, event=True, type="Wild Encounter", level=36), + LocationData("Pokemon Mansion 3F-Wild", "Wild Pokemon - 10", ["Muk", "Weezing"], + rom_addresses["Wild_PokemonMansion3F"] + 19, None, event=True, type="Wild Encounter", level=42), LocationData("Pokemon Mansion B1F", "Wild Pokemon - 1", ["Koffing", "Grimer"], - rom_addresses["Wild_PokemonMansionB1F"] + 1, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_PokemonMansionB1F"] + 1, None, event=True, type="Wild Encounter", level=33), LocationData("Pokemon Mansion B1F", "Wild Pokemon - 2", ["Koffing", "Grimer"], - rom_addresses["Wild_PokemonMansionB1F"] + 3, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_PokemonMansionB1F"] + 3, None, event=True, type="Wild Encounter", level=31), LocationData("Pokemon Mansion B1F", "Wild Pokemon - 3", ["Growlithe", "Vulpix"], - rom_addresses["Wild_PokemonMansionB1F"] + 5, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_PokemonMansionB1F"] + 5, None, event=True, type="Wild Encounter", level=35), LocationData("Pokemon Mansion B1F", "Wild Pokemon - 4", "Ponyta", rom_addresses["Wild_PokemonMansionB1F"] + 7, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=32), LocationData("Pokemon Mansion B1F", "Wild Pokemon - 5", ["Koffing", "Grimer"], - rom_addresses["Wild_PokemonMansionB1F"] + 9, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_PokemonMansionB1F"] + 9, None, event=True, type="Wild Encounter", level=31), LocationData("Pokemon Mansion B1F", "Wild Pokemon - 6", ["Weezing", "Muk"], - rom_addresses["Wild_PokemonMansionB1F"] + 11, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_PokemonMansionB1F"] + 11, None, event=True, type="Wild Encounter", level=40), LocationData("Pokemon Mansion B1F", "Wild Pokemon - 7", "Ponyta", rom_addresses["Wild_PokemonMansionB1F"] + 13, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=34), LocationData("Pokemon Mansion B1F", "Wild Pokemon - 8", ["Grimer", "Koffing"], - rom_addresses["Wild_PokemonMansionB1F"] + 15, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_PokemonMansionB1F"] + 15, None, event=True, type="Wild Encounter", level=35), LocationData("Pokemon Mansion B1F", "Wild Pokemon - 9", ["Weezing", "Magmar"], - rom_addresses["Wild_PokemonMansionB1F"] + 17, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_PokemonMansionB1F"] + 17, None, event=True, type="Wild Encounter", level=42), LocationData("Pokemon Mansion B1F", "Wild Pokemon - 10", ["Muk", "Weezing"], - rom_addresses["Wild_PokemonMansionB1F"] + 19, None, event=True, type="Wild Encounter"), + rom_addresses["Wild_PokemonMansionB1F"] + 19, None, event=True, type="Wild Encounter", level=42), LocationData("Route 21", "Wild Pokemon - 1", "Rattata", rom_addresses["Wild_Route21"] + 1, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=21), LocationData("Route 21", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route21"] + 3, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=23), LocationData("Route 21", "Wild Pokemon - 3", "Raticate", rom_addresses["Wild_Route21"] + 5, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=30), LocationData("Route 21", "Wild Pokemon - 4", "Rattata", rom_addresses["Wild_Route21"] + 7, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=23), LocationData("Route 21", "Wild Pokemon - 5", "Pidgey", rom_addresses["Wild_Route21"] + 9, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=21), LocationData("Route 21", "Wild Pokemon - 6", "Pidgeotto", rom_addresses["Wild_Route21"] + 11, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=30), LocationData("Route 21", "Wild Pokemon - 7", "Pidgeotto", rom_addresses["Wild_Route21"] + 13, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=32), LocationData("Route 21", "Wild Pokemon - 8", "Tangela", rom_addresses["Wild_Route21"] + 15, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=28), LocationData("Route 21", "Wild Pokemon - 9", "Tangela", rom_addresses["Wild_Route21"] + 17, None, event=True, - type="Wild Encounter"), + type="Wild Encounter", level=30), LocationData("Route 21", "Wild Pokemon - 10", "Tangela", rom_addresses["Wild_Route21"] + 19, None, event=True, - type="Wild Encounter"), - LocationData("Cerulean Cave 1F", "Wild Pokemon - 1", "Golbat", rom_addresses["Wild_CeruleanCave1F"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 1F", "Wild Pokemon - 2", "Hypno", rom_addresses["Wild_CeruleanCave1F"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 1F", "Wild Pokemon - 3", "Magneton", rom_addresses["Wild_CeruleanCave1F"] + 5, - None, event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 1F", "Wild Pokemon - 4", "Dodrio", rom_addresses["Wild_CeruleanCave1F"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 1F", "Wild Pokemon - 5", "Venomoth", rom_addresses["Wild_CeruleanCave1F"] + 9, - None, event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 1F", "Wild Pokemon - 6", ["Arbok", "Sandslash"], - rom_addresses["Wild_CeruleanCave1F"] + 11, None, event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 1F", "Wild Pokemon - 7", "Kadabra", rom_addresses["Wild_CeruleanCave1F"] + 13, - None, event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 1F", "Wild Pokemon - 8", "Parasect", rom_addresses["Wild_CeruleanCave1F"] + 15, - None, event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 1F", "Wild Pokemon - 9", "Raichu", rom_addresses["Wild_CeruleanCave1F"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 1F", "Wild Pokemon - 10", "Ditto", rom_addresses["Wild_CeruleanCave1F"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 2F", "Wild Pokemon - 1", "Dodrio", rom_addresses["Wild_CeruleanCave2F"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 2F", "Wild Pokemon - 2", "Venomoth", rom_addresses["Wild_CeruleanCave2F"] + 3, - None, event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 2F", "Wild Pokemon - 3", "Kadabra", rom_addresses["Wild_CeruleanCave2F"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 2F", "Wild Pokemon - 4", "Rhydon", rom_addresses["Wild_CeruleanCave2F"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 2F", "Wild Pokemon - 5", "Marowak", rom_addresses["Wild_CeruleanCave2F"] + 9, None, - event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 2F", "Wild Pokemon - 6", "Electrode", rom_addresses["Wild_CeruleanCave2F"] + 11, - None, event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 2F", "Wild Pokemon - 7", "Chansey", rom_addresses["Wild_CeruleanCave2F"] + 13, - None, event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 2F", "Wild Pokemon - 8", "Wigglytuff", rom_addresses["Wild_CeruleanCave2F"] + 15, - None, event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 2F", "Wild Pokemon - 9", "Ditto", rom_addresses["Wild_CeruleanCave2F"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Cerulean Cave 2F", "Wild Pokemon - 10", "Ditto", rom_addresses["Wild_CeruleanCave2F"] + 19, None, - event=True, type="Wild Encounter"), + type="Wild Encounter", level=32), + LocationData("Cerulean Cave 1F-Wild", "Wild Pokemon - 1", "Golbat", rom_addresses["Wild_CeruleanCave1F"] + 1, None, + event=True, type="Wild Encounter", level=46), + LocationData("Cerulean Cave 1F-Wild", "Wild Pokemon - 2", "Hypno", rom_addresses["Wild_CeruleanCave1F"] + 3, None, + event=True, type="Wild Encounter", level=46), + LocationData("Cerulean Cave 1F-Wild", "Wild Pokemon - 3", "Magneton", rom_addresses["Wild_CeruleanCave1F"] + 5, + None, event=True, type="Wild Encounter", level=46), + LocationData("Cerulean Cave 1F-Wild", "Wild Pokemon - 4", "Dodrio", rom_addresses["Wild_CeruleanCave1F"] + 7, None, + event=True, type="Wild Encounter", level=49), + LocationData("Cerulean Cave 1F-Wild", "Wild Pokemon - 5", "Venomoth", rom_addresses["Wild_CeruleanCave1F"] + 9, + None, event=True, type="Wild Encounter", level=49), + LocationData("Cerulean Cave 1F-Wild", "Wild Pokemon - 6", ["Arbok", "Sandslash"], + rom_addresses["Wild_CeruleanCave1F"] + 11, None, event=True, type="Wild Encounter", level=52), + LocationData("Cerulean Cave 1F-Wild", "Wild Pokemon - 7", "Kadabra", rom_addresses["Wild_CeruleanCave1F"] + 13, + None, event=True, type="Wild Encounter", level=49), + LocationData("Cerulean Cave 1F-Wild", "Wild Pokemon - 8", "Parasect", rom_addresses["Wild_CeruleanCave1F"] + 15, + None, event=True, type="Wild Encounter", level=52), + LocationData("Cerulean Cave 1F-Wild", "Wild Pokemon - 9", "Raichu", rom_addresses["Wild_CeruleanCave1F"] + 17, None, + event=True, type="Wild Encounter", level=53), + LocationData("Cerulean Cave 1F-Wild", "Wild Pokemon - 10", "Ditto", rom_addresses["Wild_CeruleanCave1F"] + 19, None, + event=True, type="Wild Encounter", level=53), + LocationData("Cerulean Cave 2F-Wild", "Wild Pokemon - 1", "Dodrio", rom_addresses["Wild_CeruleanCave2F"] + 1, None, + event=True, type="Wild Encounter", level=51), + LocationData("Cerulean Cave 2F-Wild", "Wild Pokemon - 2", "Venomoth", rom_addresses["Wild_CeruleanCave2F"] + 3, + None, event=True, type="Wild Encounter", level=51), + LocationData("Cerulean Cave 2F-Wild", "Wild Pokemon - 3", "Kadabra", rom_addresses["Wild_CeruleanCave2F"] + 5, None, + event=True, type="Wild Encounter", level=51), + LocationData("Cerulean Cave 2F-Wild", "Wild Pokemon - 4", "Rhydon", rom_addresses["Wild_CeruleanCave2F"] + 7, None, + event=True, type="Wild Encounter", level=52), + LocationData("Cerulean Cave 2F-Wild", "Wild Pokemon - 5", "Marowak", rom_addresses["Wild_CeruleanCave2F"] + 9, None, + event=True, type="Wild Encounter", level=52), + LocationData("Cerulean Cave 2F-Wild", "Wild Pokemon - 6", "Electrode", rom_addresses["Wild_CeruleanCave2F"] + 11, + None, event=True, type="Wild Encounter", level=52), + LocationData("Cerulean Cave 2F-Wild", "Wild Pokemon - 7", "Chansey", rom_addresses["Wild_CeruleanCave2F"] + 13, + None, event=True, type="Wild Encounter", level=56), + LocationData("Cerulean Cave 2F-Wild", "Wild Pokemon - 8", "Wigglytuff", rom_addresses["Wild_CeruleanCave2F"] + 15, + None, event=True, type="Wild Encounter", level=54), + LocationData("Cerulean Cave 2F-Wild", "Wild Pokemon - 9", "Ditto", rom_addresses["Wild_CeruleanCave2F"] + 17, None, + event=True, type="Wild Encounter", level=55), + LocationData("Cerulean Cave 2F-Wild", "Wild Pokemon - 10", "Ditto", rom_addresses["Wild_CeruleanCave2F"] + 19, None, + event=True, type="Wild Encounter", level=60), LocationData("Cerulean Cave B1F", "Wild Pokemon - 1", "Rhydon", rom_addresses["Wild_CeruleanCaveB1F"] + 1, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=55), LocationData("Cerulean Cave B1F", "Wild Pokemon - 2", "Marowak", rom_addresses["Wild_CeruleanCaveB1F"] + 3, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=55), LocationData("Cerulean Cave B1F", "Wild Pokemon - 3", "Electrode", rom_addresses["Wild_CeruleanCaveB1F"] + 5, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=55), LocationData("Cerulean Cave B1F", "Wild Pokemon - 4", "Chansey", rom_addresses["Wild_CeruleanCaveB1F"] + 7, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=64), LocationData("Cerulean Cave B1F", "Wild Pokemon - 5", "Parasect", rom_addresses["Wild_CeruleanCaveB1F"] + 9, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=64), LocationData("Cerulean Cave B1F", "Wild Pokemon - 6", "Raichu", rom_addresses["Wild_CeruleanCaveB1F"] + 11, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=64), LocationData("Cerulean Cave B1F", "Wild Pokemon - 7", ["Arbok", "Sandslash"], rom_addresses["Wild_CeruleanCaveB1F"] + 13, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=57), LocationData("Cerulean Cave B1F", "Wild Pokemon - 8", "Ditto", rom_addresses["Wild_CeruleanCaveB1F"] + 15, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=65), LocationData("Cerulean Cave B1F", "Wild Pokemon - 9", "Ditto", rom_addresses["Wild_CeruleanCaveB1F"] + 17, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=63), LocationData("Cerulean Cave B1F", "Wild Pokemon - 10", "Ditto", rom_addresses["Wild_CeruleanCaveB1F"] + 19, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=67), LocationData("Power Plant", "Wild Pokemon - 1", "Voltorb", rom_addresses["Wild_PowerPlant"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=21), LocationData("Power Plant", "Wild Pokemon - 2", "Magnemite", rom_addresses["Wild_PowerPlant"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=21), LocationData("Power Plant", "Wild Pokemon - 3", "Pikachu", rom_addresses["Wild_PowerPlant"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Power Plant", "Wild Pokemon - 4", "Pikachu", rom_addresses["Wild_PowerPlant"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=24), LocationData("Power Plant", "Wild Pokemon - 5", "Magnemite", rom_addresses["Wild_PowerPlant"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=23), LocationData("Power Plant", "Wild Pokemon - 6", "Voltorb", rom_addresses["Wild_PowerPlant"] + 11, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=23), LocationData("Power Plant", "Wild Pokemon - 7", "Magneton", rom_addresses["Wild_PowerPlant"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=32), LocationData("Power Plant", "Wild Pokemon - 8", "Magneton", rom_addresses["Wild_PowerPlant"] + 15, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=35), LocationData("Power Plant", "Wild Pokemon - 9", ["Electabuzz", "Raichu"], rom_addresses["Wild_PowerPlant"] + 17, - None, event=True, type="Wild Encounter"), + None, event=True, type="Wild Encounter", level=33), LocationData("Power Plant", "Wild Pokemon - 10", ["Electabuzz", "Raichu"], - rom_addresses["Wild_PowerPlant"] + 19, None, event=True, type="Wild Encounter"), - LocationData("Route 23", "Wild Pokemon - 1", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route23"] + 1, - None, event=True, type="Wild Encounter"), - LocationData("Route 23", "Wild Pokemon - 2", "Ditto", rom_addresses["Wild_Route23"] + 3, None, event=True, - type="Wild Encounter"), - LocationData("Route 23", "Wild Pokemon - 3", "Spearow", rom_addresses["Wild_Route23"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Route 23", "Wild Pokemon - 4", "Fearow", rom_addresses["Wild_Route23"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Route 23", "Wild Pokemon - 5", "Ditto", rom_addresses["Wild_Route23"] + 9, None, event=True, - type="Wild Encounter"), - LocationData("Route 23", "Wild Pokemon - 6", "Fearow", rom_addresses["Wild_Route23"] + 11, None, - event=True, type="Wild Encounter"), - LocationData("Route 23", "Wild Pokemon - 7", ["Arbok", "Sandslash"], rom_addresses["Wild_Route23"] + 13, - None, event=True, type="Wild Encounter"), - LocationData("Route 23", "Wild Pokemon - 8", "Ditto", rom_addresses["Wild_Route23"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Route 23", "Wild Pokemon - 9", "Fearow", rom_addresses["Wild_Route23"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Route 23", "Wild Pokemon - 10", "Fearow", rom_addresses["Wild_Route23"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 2F", "Wild Pokemon - 1", "Machop", rom_addresses["Wild_VictoryRoad2F"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 2F", "Wild Pokemon - 2", "Geodude", rom_addresses["Wild_VictoryRoad2F"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 2F", "Wild Pokemon - 3", "Zubat", rom_addresses["Wild_VictoryRoad2F"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 2F", "Wild Pokemon - 4", "Onix", rom_addresses["Wild_VictoryRoad2F"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 2F", "Wild Pokemon - 5", "Onix", rom_addresses["Wild_VictoryRoad2F"] + 9, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 2F", "Wild Pokemon - 6", "Onix", rom_addresses["Wild_VictoryRoad2F"] + 11, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 2F", "Wild Pokemon - 7", "Machoke", rom_addresses["Wild_VictoryRoad2F"] + 13, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 2F", "Wild Pokemon - 8", "Golbat", rom_addresses["Wild_VictoryRoad2F"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 2F", "Wild Pokemon - 9", "Marowak", rom_addresses["Wild_VictoryRoad2F"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 2F", "Wild Pokemon - 10", "Graveler", rom_addresses["Wild_VictoryRoad2F"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 3F", "Wild Pokemon - 1", "Machop", rom_addresses["Wild_VictoryRoad3F"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 3F", "Wild Pokemon - 2", "Geodude", rom_addresses["Wild_VictoryRoad3F"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 3F", "Wild Pokemon - 3", "Zubat", rom_addresses["Wild_VictoryRoad3F"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 3F", "Wild Pokemon - 4", "Onix", rom_addresses["Wild_VictoryRoad3F"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 3F", "Wild Pokemon - 5", "Venomoth", rom_addresses["Wild_VictoryRoad3F"] + 9, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 3F", "Wild Pokemon - 6", "Onix", rom_addresses["Wild_VictoryRoad3F"] + 11, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 3F", "Wild Pokemon - 7", "Graveler", rom_addresses["Wild_VictoryRoad3F"] + 13, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 3F", "Wild Pokemon - 8", "Golbat", rom_addresses["Wild_VictoryRoad3F"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 3F", "Wild Pokemon - 9", "Machoke", rom_addresses["Wild_VictoryRoad3F"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 3F", "Wild Pokemon - 10", "Machoke", rom_addresses["Wild_VictoryRoad3F"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 1F", "Wild Pokemon - 1", "Machop", rom_addresses["Wild_VictoryRoad1F"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 1F", "Wild Pokemon - 2", "Geodude", rom_addresses["Wild_VictoryRoad1F"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 1F", "Wild Pokemon - 3", "Zubat", rom_addresses["Wild_VictoryRoad1F"] + 5, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 1F", "Wild Pokemon - 4", "Onix", rom_addresses["Wild_VictoryRoad1F"] + 7, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 1F", "Wild Pokemon - 5", "Onix", rom_addresses["Wild_VictoryRoad1F"] + 9, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 1F", "Wild Pokemon - 6", "Onix", rom_addresses["Wild_VictoryRoad1F"] + 11, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 1F", "Wild Pokemon - 7", "Graveler", rom_addresses["Wild_VictoryRoad1F"] + 13, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 1F", "Wild Pokemon - 8", "Golbat", rom_addresses["Wild_VictoryRoad1F"] + 15, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 1F", "Wild Pokemon - 9", "Machoke", rom_addresses["Wild_VictoryRoad1F"] + 17, None, - event=True, type="Wild Encounter"), - LocationData("Victory Road 1F", "Wild Pokemon - 10", "Marowak", rom_addresses["Wild_VictoryRoad1F"] + 19, None, - event=True, type="Wild Encounter"), + rom_addresses["Wild_PowerPlant"] + 19, None, event=True, type="Wild Encounter", level=36), + LocationData("Route 23-Grass", "Wild Pokemon - 1", ["Ekans", "Sandshrew"], rom_addresses["Wild_Route23"] + 1, + None, event=True, type="Wild Encounter", level=26), + LocationData("Route 23-Grass", "Wild Pokemon - 2", "Ditto", rom_addresses["Wild_Route23"] + 3, None, event=True, + type="Wild Encounter", level=33), + LocationData("Route 23-Grass", "Wild Pokemon - 3", "Spearow", rom_addresses["Wild_Route23"] + 5, None, + event=True, type="Wild Encounter", level=26), + LocationData("Route 23-Grass", "Wild Pokemon - 4", "Fearow", rom_addresses["Wild_Route23"] + 7, None, + event=True, type="Wild Encounter", level=38), + LocationData("Route 23-Grass", "Wild Pokemon - 5", "Ditto", rom_addresses["Wild_Route23"] + 9, None, event=True, + type="Wild Encounter", level=38), + LocationData("Route 23-Grass", "Wild Pokemon - 6", "Fearow", rom_addresses["Wild_Route23"] + 11, None, + event=True, type="Wild Encounter", level=38), + LocationData("Route 23-Grass", "Wild Pokemon - 7", ["Arbok", "Sandslash"], rom_addresses["Wild_Route23"] + 13, + None, event=True, type="Wild Encounter", level=41), + LocationData("Route 23-Grass", "Wild Pokemon - 8", "Ditto", rom_addresses["Wild_Route23"] + 15, None, + event=True, type="Wild Encounter", level=43), + LocationData("Route 23-Grass", "Wild Pokemon - 9", "Fearow", rom_addresses["Wild_Route23"] + 17, None, + event=True, type="Wild Encounter", level=41), + LocationData("Route 23-Grass", "Wild Pokemon - 10", "Fearow", rom_addresses["Wild_Route23"] + 19, None, + event=True, type="Wild Encounter", level=43), + LocationData("Victory Road 2F-Wild", "Wild Pokemon - 1", "Machop", rom_addresses["Wild_VictoryRoad2F"] + 1, None, + event=True, type="Wild Encounter", level=22), + LocationData("Victory Road 2F-Wild", "Wild Pokemon - 2", "Geodude", rom_addresses["Wild_VictoryRoad2F"] + 3, None, + event=True, type="Wild Encounter", level=24), + LocationData("Victory Road 2F-Wild", "Wild Pokemon - 3", "Zubat", rom_addresses["Wild_VictoryRoad2F"] + 5, None, + event=True, type="Wild Encounter", level=26), + LocationData("Victory Road 2F-Wild", "Wild Pokemon - 4", "Onix", rom_addresses["Wild_VictoryRoad2F"] + 7, None, + event=True, type="Wild Encounter", level=36), + LocationData("Victory Road 2F-Wild", "Wild Pokemon - 5", "Onix", rom_addresses["Wild_VictoryRoad2F"] + 9, None, + event=True, type="Wild Encounter", level=39), + LocationData("Victory Road 2F-Wild", "Wild Pokemon - 6", "Onix", rom_addresses["Wild_VictoryRoad2F"] + 11, None, + event=True, type="Wild Encounter", level=42), + LocationData("Victory Road 2F-Wild", "Wild Pokemon - 7", "Machoke", rom_addresses["Wild_VictoryRoad2F"] + 13, None, + event=True, type="Wild Encounter", level=41), + LocationData("Victory Road 2F-Wild", "Wild Pokemon - 8", "Golbat", rom_addresses["Wild_VictoryRoad2F"] + 15, None, + event=True, type="Wild Encounter", level=40), + LocationData("Victory Road 2F-Wild", "Wild Pokemon - 9", "Marowak", rom_addresses["Wild_VictoryRoad2F"] + 17, None, + event=True, type="Wild Encounter", level=40), + LocationData("Victory Road 2F-Wild", "Wild Pokemon - 10", "Graveler", rom_addresses["Wild_VictoryRoad2F"] + 19, None, + event=True, type="Wild Encounter", level=43), + LocationData("Victory Road 3F-Wild", "Wild Pokemon - 1", "Machop", rom_addresses["Wild_VictoryRoad3F"] + 1, None, + event=True, type="Wild Encounter", level=24), + LocationData("Victory Road 3F-Wild", "Wild Pokemon - 2", "Geodude", rom_addresses["Wild_VictoryRoad3F"] + 3, None, + event=True, type="Wild Encounter", level=26), + LocationData("Victory Road 3F-Wild", "Wild Pokemon - 3", "Zubat", rom_addresses["Wild_VictoryRoad3F"] + 5, None, + event=True, type="Wild Encounter", level=22), + LocationData("Victory Road 3F-Wild", "Wild Pokemon - 4", "Onix", rom_addresses["Wild_VictoryRoad3F"] + 7, None, + event=True, type="Wild Encounter", level=42), + LocationData("Victory Road 3F-Wild", "Wild Pokemon - 5", "Venomoth", rom_addresses["Wild_VictoryRoad3F"] + 9, None, + event=True, type="Wild Encounter", level=40), + LocationData("Victory Road 3F-Wild", "Wild Pokemon - 6", "Onix", rom_addresses["Wild_VictoryRoad3F"] + 11, None, + event=True, type="Wild Encounter", level=45), + LocationData("Victory Road 3F-Wild", "Wild Pokemon - 7", "Graveler", rom_addresses["Wild_VictoryRoad3F"] + 13, None, + event=True, type="Wild Encounter", level=43), + LocationData("Victory Road 3F-Wild", "Wild Pokemon - 8", "Golbat", rom_addresses["Wild_VictoryRoad3F"] + 15, None, + event=True, type="Wild Encounter", level=41), + LocationData("Victory Road 3F-Wild", "Wild Pokemon - 9", "Machoke", rom_addresses["Wild_VictoryRoad3F"] + 17, None, + event=True, type="Wild Encounter", level=42), + LocationData("Victory Road 3F-Wild", "Wild Pokemon - 10", "Machoke", rom_addresses["Wild_VictoryRoad3F"] + 19, None, + event=True, type="Wild Encounter", level=45), + LocationData("Victory Road 1F-Wild", "Wild Pokemon - 1", "Machop", rom_addresses["Wild_VictoryRoad1F"] + 1, None, + event=True, type="Wild Encounter", level=24), + LocationData("Victory Road 1F-Wild", "Wild Pokemon - 2", "Geodude", rom_addresses["Wild_VictoryRoad1F"] + 3, None, + event=True, type="Wild Encounter", level=26), + LocationData("Victory Road 1F-Wild", "Wild Pokemon - 3", "Zubat", rom_addresses["Wild_VictoryRoad1F"] + 5, None, + event=True, type="Wild Encounter", level=22), + LocationData("Victory Road 1F-Wild", "Wild Pokemon - 4", "Onix", rom_addresses["Wild_VictoryRoad1F"] + 7, None, + event=True, type="Wild Encounter", level=36), + LocationData("Victory Road 1F-Wild", "Wild Pokemon - 5", "Onix", rom_addresses["Wild_VictoryRoad1F"] + 9, None, + event=True, type="Wild Encounter", level=39), + LocationData("Victory Road 1F-Wild", "Wild Pokemon - 6", "Onix", rom_addresses["Wild_VictoryRoad1F"] + 11, None, + event=True, type="Wild Encounter", level=42), + LocationData("Victory Road 1F-Wild", "Wild Pokemon - 7", "Graveler", rom_addresses["Wild_VictoryRoad1F"] + 13, None, + event=True, type="Wild Encounter", level=41), + LocationData("Victory Road 1F-Wild", "Wild Pokemon - 8", "Golbat", rom_addresses["Wild_VictoryRoad1F"] + 15, None, + event=True, type="Wild Encounter", level=41), + LocationData("Victory Road 1F-Wild", "Wild Pokemon - 9", "Machoke", rom_addresses["Wild_VictoryRoad1F"] + 17, None, + event=True, type="Wild Encounter", level=42), + LocationData("Victory Road 1F-Wild", "Wild Pokemon - 10", "Marowak", rom_addresses["Wild_VictoryRoad1F"] + 19, None, + event=True, type="Wild Encounter", level=43), LocationData("Diglett's Cave", "Wild Pokemon - 1", "Diglett", rom_addresses["Wild_DiglettsCave"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=18), LocationData("Diglett's Cave", "Wild Pokemon - 2", "Diglett", rom_addresses["Wild_DiglettsCave"] + 3, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=19), LocationData("Diglett's Cave", "Wild Pokemon - 3", "Diglett", rom_addresses["Wild_DiglettsCave"] + 5, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=17), LocationData("Diglett's Cave", "Wild Pokemon - 4", "Diglett", rom_addresses["Wild_DiglettsCave"] + 7, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=20), LocationData("Diglett's Cave", "Wild Pokemon - 5", "Diglett", rom_addresses["Wild_DiglettsCave"] + 9, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=16), LocationData("Diglett's Cave", "Wild Pokemon - 6", "Diglett", rom_addresses["Wild_DiglettsCave"] + 11, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=15), LocationData("Diglett's Cave", "Wild Pokemon - 7", "Diglett", rom_addresses["Wild_DiglettsCave"] + 13, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=21), LocationData("Diglett's Cave", "Wild Pokemon - 8", "Diglett", rom_addresses["Wild_DiglettsCave"] + 15, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=22), LocationData("Diglett's Cave", "Wild Pokemon - 9", "Dugtrio", rom_addresses["Wild_DiglettsCave"] + 17, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=29), LocationData("Diglett's Cave", "Wild Pokemon - 10", "Dugtrio", rom_addresses["Wild_DiglettsCave"] + 19, None, - event=True, type="Wild Encounter"), - LocationData("Anywhere", "Good Rod Pokemon - 1", "Goldeen", rom_addresses["Wild_Good_Rod"] + 1, None, - event=True, type="Wild Encounter"), - LocationData("Anywhere", "Good Rod Pokemon - 2", "Poliwag", rom_addresses["Wild_Good_Rod"] + 3, None, - event=True, type="Wild Encounter"), - LocationData("Anywhere", "Old Rod Pokemon", "Magikarp", rom_addresses["Wild_Old_Rod"] + 1, None, - event=True, type="Wild Encounter"), + event=True, type="Wild Encounter", level=31), + LocationData("Good Rod Fishing", "Good Rod Pokemon - 1", "Goldeen", rom_addresses["Wild_Good_Rod"] + 1, None, + event=True, type="Wild Encounter", level=10), + LocationData("Good Rod Fishing", "Good Rod Pokemon - 2", "Poliwag", rom_addresses["Wild_Good_Rod"] + 3, None, + event=True, type="Wild Encounter", level=10), + LocationData("Old Rod Fishing", "Old Rod Pokemon", "Magikarp", rom_addresses["Wild_Old_Rod"] + 1, None, + event=True, type="Wild Encounter", level=5, level_address=rom_addresses["Wild_Old_Rod"] + 2), #, level=5, level_after=True), + # "Wild encounters" means a Pokemon you cannot miss or release and lose - re-use it for these LocationData("Celadon Prize Corner", "Pokemon Prize - 1", "Abra", [rom_addresses["Prize_Mon_A"], @@ -1996,55 +2049,57 @@ location_data = [ # counted for pokedex, because they cannot be permanently "missed" but not for HMs since they can be released # or evolved forms may not be able to learn the same HMs - LocationData("Celadon City", "Celadon Mansion Pokemon", "Eevee", rom_addresses["Gift_Eevee"], None, + LocationData("Celadon Mansion Roof House", "Celadon Mansion Pokemon", "Eevee", rom_addresses["Gift_Eevee"], None, + event=True, type="Static Pokemon", level=25), + LocationData("Silph Co 7F-NW", "Gift Pokemon", "Lapras", rom_addresses["Gift_Lapras"], None, + event=True, type="Static Pokemon", level=15), + LocationData("Route 4 Pokemon Center", "Pokemon For Sale", "Magikarp", rom_addresses["Gift_Magikarp"], None, + event=True, type="Static Pokemon", level=5), + + # Currently, all Fossil Pokemon's levels are set from the same byte in-game, so they are handled in a hacky way + # as a Trainer Party + LocationData("Cinnabar Lab Fossil Room", "Old Amber Pokemon", "Aerodactyl", rom_addresses["Gift_Aerodactyl"], None, event=True, type="Static Pokemon"), - LocationData("Silph Co 7F", "Gift Pokemon", "Lapras", rom_addresses["Gift_Lapras"], None, + LocationData("Cinnabar Lab Fossil Room", "Helix Fossil Pokemon", "Omanyte", rom_addresses["Gift_Omanyte"], None, event=True, type="Static Pokemon"), - LocationData("Route 3", "Pokemon For Sale", "Magikarp", rom_addresses["Gift_Magikarp"], None, - event=True, type="Static Pokemon"), - LocationData("Cinnabar Island", "Old Amber Pokemon", "Aerodactyl", rom_addresses["Gift_Aerodactyl"], None, - event=True, type="Static Pokemon"), - LocationData("Cinnabar Island", "Helix Fossil Pokemon", "Omanyte", rom_addresses["Gift_Omanyte"], None, - event=True, type="Static Pokemon"), - LocationData("Cinnabar Island", "Dome Fossil Pokemon", "Kabuto", rom_addresses["Gift_Kabuto"], None, + LocationData("Cinnabar Lab Fossil Room", "Dome Fossil Pokemon", "Kabuto", rom_addresses["Gift_Kabuto"], None, event=True, type="Static Pokemon"), - LocationData("Route 2 East", "Marcel Trade", "Mr Mime", rom_addresses["Trade_Marcel"] + 1, None, event=True, + LocationData("Route 2 Trade House", "Marcel Trade", "Mr Mime", rom_addresses["Trade_Marcel"] + 1, None, event=True, type="Static Pokemon"), - LocationData("Underground Tunnel North-South", "Spot Trade", "Nidoran F", rom_addresses["Trade_Spot"] + 1, None, + LocationData("Underground Path Route 5", "Spot Trade", "Nidoran F", rom_addresses["Trade_Spot"] + 1, None, event=True, type="Static Pokemon"), - LocationData("Route 11", "Terry Trade", "Nidorina", rom_addresses["Trade_Terry"] + 1, None, event=True, + LocationData("Route 11 Gate 2F", "Terry Trade", "Nidorina", rom_addresses["Trade_Terry"] + 1, None, event=True, type="Static Pokemon"), - LocationData("Route 18", "Marc Trade", "Lickitung", rom_addresses["Trade_Marc"] + 1, None, event=True, + LocationData("Route 18 Gate 2F", "Marc Trade", "Lickitung", rom_addresses["Trade_Marc"] + 1, None, event=True, type="Static Pokemon"), - LocationData("Cinnabar Island", "Sailor Trade", "Seel", rom_addresses["Trade_Sailor"] + 1, None, event=True, + LocationData("Cinnabar Lab Fossil Room", "Sailor Trade", "Seel", rom_addresses["Trade_Sailor"] + 1, None, event=True, type="Static Pokemon"), - LocationData("Cinnabar Island", "Crinkles Trade", "Tangela", rom_addresses["Trade_Crinkles"] + 1, None, + LocationData("Cinnabar Lab Trade Room", "Crinkles Trade", "Tangela", rom_addresses["Trade_Crinkles"] + 1, None, event=True, type="Static Pokemon"), - LocationData("Cinnabar Island", "Doris Trade", "Electrode", rom_addresses["Trade_Doris"] + 1, None, + LocationData("Cinnabar Lab Trade Room", "Doris Trade", "Electrode", rom_addresses["Trade_Doris"] + 1, None, event=True, type="Static Pokemon"), - LocationData("Vermilion City", "Dux Trade", "Farfetchd", rom_addresses["Trade_Dux"] + 1, None, event=True, + LocationData("Vermilion Trade House", "Dux Trade", "Farfetchd", rom_addresses["Trade_Dux"] + 1, None, event=True, type="Static Pokemon"), - LocationData("Cerulean City", "Lola Trade", "Jynx", rom_addresses["Trade_Lola"] + 1, None, event=True, + LocationData("Cerulean Trade House", "Lola Trade", "Jynx", rom_addresses["Trade_Lola"] + 1, None, event=True, type="Static Pokemon"), - # not counted for logic currently. Could perhaps make static encounters resettable in the future? - LocationData("Power Plant", "Fake Pokeball Battle 1", "Voltorb", rom_addresses["Static_Encounter_Voltorb_A"], - None, event=True, type="Missable Pokemon"), - LocationData("Power Plant", "Fake Pokeball Battle 2", "Voltorb", rom_addresses["Static_Encounter_Voltorb_B"], - None, event=True, type="Missable Pokemon"), - LocationData("Power Plant", "Fake Pokeball Battle 3", "Voltorb", rom_addresses["Static_Encounter_Voltorb_C"], - None, event=True, type="Missable Pokemon"), - LocationData("Power Plant", "Fake Pokeball Battle 4", "Voltorb", rom_addresses["Static_Encounter_Voltorb_D"], - None, event=True, type="Missable Pokemon"), - LocationData("Power Plant", "Fake Pokeball Battle 5", "Voltorb", rom_addresses["Static_Encounter_Voltorb_E"], - None, event=True, type="Missable Pokemon"), - LocationData("Power Plant", "Fake Pokeball Battle 6", "Voltorb", rom_addresses["Static_Encounter_Voltorb_F"], - None, event=True, type="Missable Pokemon"), - LocationData("Power Plant", "Fake Pokeball Battle 7", "Voltorb", rom_addresses["Static_Encounter_Electrode_A"], - None, event=True, type="Missable Pokemon"), - LocationData("Power Plant", "Fake Pokeball Battle 8", "Voltorb", rom_addresses["Static_Encounter_Electrode_B"], - None, event=True, type="Missable Pokemon"), + LocationData("Power Plant", "Fake Pokeball Battle 1", "Voltorb", [rom_addresses["Static_Encounter_Voltorb_A"], rom_addresses["Reset_C"]], + None, event=True, type="Static Pokemon", level=40, level_address=rom_addresses["Static_Encounter_Voltorb_A"] + 1), + LocationData("Power Plant", "Fake Pokeball Battle 2", "Voltorb", [rom_addresses["Static_Encounter_Voltorb_B"], rom_addresses["Reset_D"]], + None, event=True, type="Static Pokemon", level=40, level_address=rom_addresses["Static_Encounter_Voltorb_B"] + 1), + LocationData("Power Plant", "Fake Pokeball Battle 3", "Voltorb", [rom_addresses["Static_Encounter_Voltorb_C"], rom_addresses["Reset_E"]], + None, event=True, type="Static Pokemon", level=40, level_address=rom_addresses["Static_Encounter_Voltorb_C"] + 1), + LocationData("Power Plant", "Fake Pokeball Battle 4", "Voltorb", [rom_addresses["Static_Encounter_Voltorb_D"], rom_addresses["Reset_G"]], + None, event=True, type="Static Pokemon", level=40, level_address=rom_addresses["Static_Encounter_Voltorb_D"] + 1), + LocationData("Power Plant", "Fake Pokeball Battle 5", "Voltorb", [rom_addresses["Static_Encounter_Voltorb_E"], rom_addresses["Reset_H"]], + None, event=True, type="Static Pokemon", level=40, level_address=rom_addresses["Static_Encounter_Voltorb_E"] + 1), + LocationData("Power Plant", "Fake Pokeball Battle 6", "Voltorb", [rom_addresses["Static_Encounter_Voltorb_F"], rom_addresses["Reset_J"]], + None, event=True, type="Static Pokemon", level=40, level_address=rom_addresses["Static_Encounter_Voltorb_F"] + 1), + LocationData("Power Plant", "Fake Pokeball Battle 7", "Electrode", [rom_addresses["Static_Encounter_Electrode_A"], rom_addresses["Reset_F"]], + None, event=True, type="Static Pokemon", level=43, level_address=rom_addresses["Static_Encounter_Electrode_A"] + 1), + LocationData("Power Plant", "Fake Pokeball Battle 8", "Electrode", [rom_addresses["Static_Encounter_Electrode_B"], rom_addresses["Reset_I"]], + None, event=True, type="Static Pokemon", level=43, level_address=rom_addresses["Static_Encounter_Electrode_B"] + 1), LocationData("Pokemon Tower 6F", "Restless Soul", "Marowak", [rom_addresses["Ghost_Battle1"], rom_addresses["Ghost_Battle2"], @@ -2052,78 +2107,668 @@ location_data = [ rom_addresses["Ghost_Battle4"], rom_addresses["Ghost_Battle5"], rom_addresses["Ghost_Battle6"]], None, event=True, - type="Missable Pokemon"), + type="Missable Pokemon", level=30, level_address=rom_addresses["Ghost_Battle_Level"]), - LocationData("Route 12 West", "Sleeping Pokemon", "Snorlax", rom_addresses["Static_Encounter_Snorlax_A"], - None, event=True, type="Missable Pokemon"), - LocationData("Route 16", "Sleeping Pokemon", "Snorlax", rom_addresses["Static_Encounter_Snorlax_B"], - None, event=True, type="Missable Pokemon"), + LocationData("Route 12-W", "Sleeping Pokemon", "Snorlax", [rom_addresses["Static_Encounter_Snorlax_A"], rom_addresses["Reset_A"]], + None, event=True, type="Static Pokemon", level=30, level_address=rom_addresses["Static_Encounter_Snorlax_A_Level"]), + LocationData("Route 16-C", "Sleeping Pokemon", "Snorlax", [rom_addresses["Static_Encounter_Snorlax_B"], rom_addresses["Reset_B"]], + None, event=True, type="Static Pokemon", level=30, level_address=rom_addresses["Static_Encounter_Snorlax_B_Level"]), - LocationData("Fighting Dojo", "Gift 1", "Hitmonlee", rom_addresses["Gift_Hitmonlee"], - None, event=True, type="Missable Pokemon"), - LocationData("Fighting Dojo", "Gift 2", "Hitmonchan", rom_addresses["Gift_Hitmonchan"], - None, event=True, type="Missable Pokemon"), + LocationData("Saffron Fighting Dojo", "Gift 1", "Hitmonlee", rom_addresses["Gift_Hitmonlee"], + None, event=True, type="Missable Pokemon", level=30, level_address=rom_addresses["Gift_Hitmonlee_Level"]), + LocationData("Saffron Fighting Dojo", "Gift 2", "Hitmonchan", rom_addresses["Gift_Hitmonchan"], + None, event=True, type="Missable Pokemon", level=30, level_address=rom_addresses["Gift_Hitmonchan_Level"]), - LocationData("Pallet Town", "Starter 1", "Charmander", [rom_addresses["Starter1_A"], - rom_addresses["Starter1_B"], rom_addresses["Starter1_C"], - rom_addresses["Starter1_D"], - rom_addresses["Starter1_F"], rom_addresses["Starter1_H"]], + LocationData("Oak's Lab", "Starter 1", "Charmander", + [rom_addresses["Starter1_A"], rom_addresses["Starter1_B"], rom_addresses["Starter1_C"], + rom_addresses["Starter1_D"], rom_addresses["Starter1_F"], rom_addresses["Starter1_H"]], None, event=True, type="Starter Pokemon"), - LocationData("Pallet Town", "Starter 2", "Squirtle", [rom_addresses["Starter2_A"], - rom_addresses["Starter2_B"], rom_addresses["Starter2_E"], - rom_addresses["Starter2_F"], - rom_addresses["Starter2_G"], rom_addresses["Starter2_H"], - rom_addresses["Starter2_I"], - rom_addresses["Starter2_J"], rom_addresses["Starter2_K"], - rom_addresses["Starter2_L"], - rom_addresses["Starter2_M"], rom_addresses["Starter2_N"], - rom_addresses["Starter2_O"]], None, + LocationData("Oak's Lab", "Starter 2", "Squirtle", + [rom_addresses["Starter2_A"], rom_addresses["Starter2_B"], rom_addresses["Starter2_E"], + rom_addresses["Starter2_F"], rom_addresses["Starter2_G"], rom_addresses["Starter2_H"], + rom_addresses["Starter2_I"], rom_addresses["Starter2_J"], rom_addresses["Starter2_K"], + rom_addresses["Starter2_L"], rom_addresses["Starter2_M"], rom_addresses["Starter2_N"], + rom_addresses["Starter2_O"], rom_addresses["Starter2_P"]], None, event=True, type="Starter Pokemon"), - LocationData("Pallet Town", "Starter 3", "Bulbasaur", [rom_addresses["Starter3_A"], - rom_addresses["Starter3_B"], rom_addresses["Starter3_C"], - rom_addresses["Starter3_D"], - rom_addresses["Starter3_E"], rom_addresses["Starter3_G"], - rom_addresses["Starter3_I"], - rom_addresses["Starter3_J"], rom_addresses["Starter3_K"], - rom_addresses["Starter3_L"], - rom_addresses["Starter3_M"], rom_addresses["Starter3_N"], - rom_addresses["Starter3_O"]], None, + LocationData("Oak's Lab", "Starter 3", "Bulbasaur", + [rom_addresses["Starter3_A"], rom_addresses["Starter3_B"], rom_addresses["Starter3_C"], + rom_addresses["Starter3_D"], rom_addresses["Starter3_E"], rom_addresses["Starter3_G"], + rom_addresses["Starter3_I"], rom_addresses["Starter3_J"], rom_addresses["Starter3_K"], + rom_addresses["Starter3_L"], rom_addresses["Starter3_M"], rom_addresses["Starter3_N"], + rom_addresses["Starter3_O"], rom_addresses["Starter3_P"]], None, event=True, type="Starter Pokemon"), - LocationData("Power Plant", "Legendary Pokemon", "Zapdos", rom_addresses["Static_Encounter_Zapdos"], - None, event=True, type="Legendary Pokemon"), - LocationData("Seafoam Islands B4F", "Legendary Pokemon", "Articuno", rom_addresses["Static_Encounter_Articuno"], - None, event=True, type="Legendary Pokemon"), - LocationData("Victory Road 2F", "Legendary Pokemon", "Moltres", rom_addresses["Static_Encounter_Moltres"], - None, event=True, type="Legendary Pokemon"), - LocationData("Cerulean Cave B1F", "Legendary Pokemon", "Mewtwo", rom_addresses["Static_Encounter_Mewtwo"], - None, event=True, type="Legendary Pokemon"), - LocationData("Vermilion City", "Legendary Pokemon", "Mew", rom_addresses["Static_Encounter_Mew"], - None, event=True, type="Legendary Pokemon"), + LocationData("Power Plant", "Legendary Pokemon", "Zapdos", [rom_addresses["Static_Encounter_Zapdos"], rom_addresses["Reset_K"]], + None, event=True, type="Legendary Pokemon", level=50, level_address=rom_addresses["Static_Encounter_Zapdos"] + 1), + LocationData("Seafoam Islands B4F", "Legendary Pokemon", "Articuno", [rom_addresses["Static_Encounter_Articuno"], rom_addresses["Reset_L"]], + None, event=True, type="Legendary Pokemon", level=50, level_address=rom_addresses["Static_Encounter_Articuno"] + 1), + LocationData("Victory Road 2F-NW", "Legendary Pokemon", "Moltres", [rom_addresses["Static_Encounter_Moltres"], rom_addresses["Reset_M"]], + None, event=True, type="Legendary Pokemon", level=50, level_address=rom_addresses["Static_Encounter_Moltres"] + 1), + LocationData("Cerulean Cave B1F-E", "Legendary Pokemon", "Mewtwo", [rom_addresses["Static_Encounter_Mewtwo"], rom_addresses["Reset_N"]], + None, event=True, type="Legendary Pokemon", level=70, level_address=rom_addresses["Static_Encounter_Mewtwo"] + 1), + LocationData("Vermilion Dock", "Legendary Pokemon", "Mew", [rom_addresses["Static_Encounter_Mew"], rom_addresses["Reset_O"]], + None, event=True, type="Legendary Pokemon", level=10, level_address=rom_addresses["Static_Encounter_Mew"] + 1), ] - - i = 0 for location in location_data: - if location.event or location.rom_address is None: - location.address = None - else: + if (not location.event) and location.rom_address is not None: location.address = loc_id_start + i i += 1 +trainer_data = { + "Fossil Level": [{"level": 30, "party": [], "party_address": "Fossil_Level"}], + 'Route 3': [{'level': 11, 'party': ['Rattata', 'Ekans'], 'party_address': 'Trainer_Party_Route_3_Youngster_A'}, + {'level': 14, 'party': ['Spearow'], 'party_address': 'Trainer_Party_Route_3_Youngster_B'}, + {'level': 10, 'party': ['Caterpie', 'Weedle', 'Caterpie'], + 'party_address': 'Trainer_Party_Route_3_BugCatcher_A'}, + {'level': 9, 'party': ['Weedle', 'Kakuna', 'Caterpie', 'Metapod'], + 'party_address': 'Trainer_Party_Route_3_BugCatcher_B'}, + {'level': 11, 'party': ['Caterpie', 'Metapod'], 'party_address': 'Trainer_Party_Route_3_BugCatcher_C'}, + {'level': 9, 'party': ['Pidgey', 'Pidgey'], 'party_address': 'Trainer_Party_Route_3_Lass_A'}, + {'level': 10, 'party': ['Rattata', 'Nidoran M'], 'party_address': 'Trainer_Party_Route_3_Lass_B'}, + {'level': 14, 'party': ['Jigglypuff'], 'party_address': 'Trainer_Party_Route_3_Lass_C'}], + 'Mt Moon 1F': [{'level': 10, 'party': ['Rattata', 'Rattata', 'Zubat'], + 'party_address': 'Trainer_Party_Mt_Moon_1F_Youngster_A'}, + {'level': 11, 'party': ['Weedle', 'Kakuna'], + 'party_address': 'Trainer_Party_Mt_Moon_1F_BugCatcher_A'}, + {'level': 10, 'party': ['Caterpie', 'Metapod', 'Caterpie'], + 'party_address': 'Trainer_Party_Mt_Moon_1F_BugCatcher_B'}, + {'level': 11, 'party': ['Oddish', 'Bellsprout'], 'party_address': 'Trainer_Party_Mt_Moon_1F_Lass_A'}, + {'level': 14, 'party': ['Clefairy'], 'party_address': 'Trainer_Party_Mt_Moon_1F_Lass_B'}, + {'level': 11, 'party': ['Magnemite', 'Voltorb'], + 'party_address': 'Trainer_Party_Mt_Moon_1F_SuperNerd_A'}, + {'level': 10, 'party': ['Geodude', 'Geodude', 'Onix'], + 'party_address': 'Trainer_Party_Mt_Moon_1F_Hiker_A'}], + 'S.S. Anne 1F Rooms-Youngster and Lass Room': [{'level': 18, 'party': ['Pidgey', 'Nidoran F'], 'party_address': 'Trainer_Party_SS_Anne_1F_Rooms_Lass_A'}, + {'level': 21, 'party': ['Nidoran M'], 'party_address': 'Trainer_Party_SS_Anne_1F_Rooms_Youngster_A'}, + + ], + 'S.S. Anne 1F Rooms-East Gentleman Room': [ + {'level': 18, 'party': ['Growlithe', 'Growlithe'], + 'party_address': 'Trainer_Party_SS_Anne_1F_Rooms_Gentleman_A'}], + 'S.S. Anne 1F Rooms-West Gentleman Room': [ + {'level': 19, 'party': ['Nidoran M', 'Nidoran F'], + 'party_address': 'Trainer_Party_SS_Anne_1F_Rooms_Gentleman_B'}], 'Viridian Forest': [ + {'level': 6, 'party': ['Weedle', 'Caterpie'], 'party_address': 'Trainer_Party_Viridian_Forest_BugCatcher_A'}, + {'level': 7, 'party': ['Weedle', 'Kakuna', 'Weedle'], + 'party_address': 'Trainer_Party_Viridian_Forest_BugCatcher_B'}, + {'level': 9, 'party': ['Weedle'], 'party_address': 'Trainer_Party_Viridian_Forest_BugCatcher_C'}], + 'Route 24': [{'level': 14, 'party': ['Caterpie', 'Weedle'], 'party_address': 'Trainer_Party_Route_24_BugCatcher_A'}, + {'level': 16, 'party': ['Pidgey', 'Nidoran F'], 'party_address': 'Trainer_Party_Route_24_Lass_A'}, + {'level': 14, 'party': ['Pidgey', 'Nidoran F'], 'party_address': 'Trainer_Party_Route_24_Lass_B'}, + {'level': 14, 'party': ['Rattata', 'Ekans'], 'party_address': 'Trainer_Party_Route_24_JrTrainerM_A'}, + {'level': 18, 'party': ['Mankey'], 'party_address': 'Trainer_Party_Route_24_JrTrainerM_C'}, + {'level': 15, 'party': ['Ekans', 'Zubat'], 'party_address': 'Trainer_Party_Route_24_Rocket_A'}, + {'level': 14, 'party': ['Rattata', 'Ekans', 'Zubat'], + 'party_address': 'Trainer_Party_Route_24_Youngster_A'}], 'Route 6': [ + {'level': 16, 'party': ['Weedle', 'Caterpie', 'Weedle'], 'party_address': 'Trainer_Party_Route_6_BugCatcher_A'}, + {'level': 20, 'party': ['Butterfree'], 'party_address': 'Trainer_Party_Route_6_BugCatcher_B'}, + {'level': 20, 'party': ['Squirtle'], 'party_address': 'Trainer_Party_Route_6_JrTrainerM_A'}, + {'level': 16, 'party': ['Spearow', 'Raticate'], 'party_address': 'Trainer_Party_Route_6_JrTrainerM_B'}, + {'level': 16, 'party': ['Rattata', 'Pikachu'], 'party_address': 'Trainer_Party_Route_6_JrTrainerF_A'}, + {'level': 16, 'party': ['Pidgey', 'Pidgey', 'Pidgey'], 'party_address': 'Trainer_Party_Route_6_JrTrainerF_B'}], + 'Route 9': [{'level': 19, 'party': ['Beedrill', 'Beedrill'], 'party_address': 'Trainer_Party_Route_9_BugCatcher_A'}, + {'level': 20, 'party': ['Caterpie', 'Weedle', 'Venonat'], + 'party_address': 'Trainer_Party_Route_9_BugCatcher_B'}, + {'level': 21, 'party': ['Growlithe', 'Charmander'], + 'party_address': 'Trainer_Party_Route_9_JrTrainerM_A'}, + {'level': 19, 'party': ['Rattata', 'Diglett', 'Ekans', 'Sandshrew'], + 'party_address': 'Trainer_Party_Route_9_JrTrainerM_B'}, + {'level': 18, 'party': ['Oddish', 'Bellsprout', 'Oddish', 'Bellsprout'], + 'party_address': 'Trainer_Party_Route_9_JrTrainerF_A'}, + {'level': 23, 'party': ['Meowth'], 'party_address': 'Trainer_Party_Route_9_JrTrainerF_B'}, + {'level': 21, 'party': ['Geodude', 'Onix'], 'party_address': 'Trainer_Party_Route_9_Hiker_A'}, + {'level': 20, 'party': ['Geodude', 'Machop', 'Geodude'], + 'party_address': 'Trainer_Party_Route_9_Hiker_B'}, + {'level': 20, 'party': ['Machop', 'Onix'], 'party_address': 'Trainer_Party_Route_9_Hiker_D'}], + 'Route 4-Lass': [ + {'level': 31, 'party': ['Paras', 'Paras', 'Parasect'], 'party_address': 'Trainer_Party_Route_4_Lass_A'}], + 'Route 25': [{'level': 15, 'party': ['Nidoran M', 'Nidoran F'], 'party_address': 'Trainer_Party_Route_25_Lass_A'}, + {'level': 13, 'party': ['Oddish', 'Pidgey', 'Oddish'], + 'party_address': 'Trainer_Party_Route_25_Lass_B'}, + {'level': 14, 'party': ['Rattata', 'Ekans'], 'party_address': 'Trainer_Party_Route_25_JrTrainerM_A'}, + {'level': 15, 'party': ['Machop', 'Geodude'], 'party_address': 'Trainer_Party_Route_25_Hiker_A'}, + {'level': 13, 'party': ['Geodude', 'Geodude', 'Machop', 'Geodude'], + 'party_address': 'Trainer_Party_Route_25_Hiker_B'}, + {'level': 17, 'party': ['Onix'], 'party_address': 'Trainer_Party_Route_25_Hiker_C'}, + {'level': 15, 'party': ['Rattata', 'Spearow'], 'party_address': 'Trainer_Party_Route_25_Youngster_A'}, + {'level': 17, 'party': ['Slowpoke'], 'party_address': 'Trainer_Party_Route_25_Youngster_B'}, + {'level': 14, 'party': ['Ekans', 'Sandshrew'], 'party_address': 'Trainer_Party_Route_25_Youngster_C'}], + 'S.S. Anne 2F Rooms-Gentleman and Lass Room': [ + {'level': 18, 'party': ['Rattata', 'Pikachu'], 'party_address': 'Trainer_Party_SS_Anne_2F_Rooms_Lass_A'}, + {'level': 17, 'party': ['Growlithe', 'Ponyta'], 'party_address': 'Trainer_Party_SS_Anne_2F_Rooms_Gentleman_C'}], + 'S.S. Anne 2F Rooms-Fisherman and Gentleman Room': [ + {'level': 17, 'party': ['Goldeen', 'Tentacool', 'Goldeen'], + 'party_address': 'Trainer_Party_SS_Anne_2F_Rooms_Fisher_A'}, + {'level': 23, 'party': ['Pikachu'], 'party_address': 'Trainer_Party_SS_Anne_2F_Rooms_Gentleman_A'},], + 'Route 8': [{'level': 23, 'party': ['Nidoran F', 'Nidorina'], 'party_address': 'Trainer_Party_Route_8_Lass_A'}, + {'level': 24, 'party': ['Meowth', 'Meowth', 'Meowth'], 'party_address': 'Trainer_Party_Route_8_Lass_B'}, + {'level': 19, 'party': ['Pidgey', 'Rattata', 'Nidoran M', 'Meowth', 'Pikachu'], + 'party_address': 'Trainer_Party_Route_8_Lass_C'}, + {'level': 22, 'party': ['Clefairy', 'Clefairy'], 'party_address': 'Trainer_Party_Route_8_Lass_D'}, + {'level': 20, 'party': ['Voltorb', 'Koffing', 'Voltorb', 'Magnemite'], + 'party_address': 'Trainer_Party_Route_8_SuperNerd_A'}, + {'level': 22, 'party': ['Grimer', 'Muk', 'Grimer'], + 'party_address': 'Trainer_Party_Route_8_SuperNerd_B'}, + {'level': 26, 'party': ['Koffing'], 'party_address': 'Trainer_Party_Route_8_SuperNerd_C'}, + {'level': 22, 'party': ['Poliwag', 'Poliwag', 'Poliwhirl'], + 'party_address': 'Trainer_Party_Route_8_Gambler_A'}, + {'level': 24, 'party': ['Growlithe', 'Vulpix'], 'party_address': 'Trainer_Party_Route_8_Gambler_C'}], + 'Celadon Gym': [ + {'level': 23, 'party': ['Bellsprout', 'Weepinbell'], 'party_address': 'Trainer_Party_Celadon_Gym_Lass_A'}, + {'level': 24, 'party': ['Bulbasaur', 'Ivysaur'], 'party_address': 'Trainer_Party_Celadon_Gym_JrTrainerF_A'}, + {'level': 21, 'party': ['Oddish', 'Bellsprout', 'Oddish', 'Bellsprout'], + 'party_address': 'Trainer_Party_Celadon_Gym_Beauty_A'}, + {'level': 24, 'party': ['Bellsprout', 'Bellsprout'], 'party_address': 'Trainer_Party_Celadon_Gym_Beauty_B'}], + 'Celadon Gym-C': [ + {'level': 24, 'party': ['Weepinbell', 'Gloom', 'Ivysaur'], + 'party_address': 'Trainer_Party_Celadon_Gym_CooltrainerF_A'}, + {'level': [29, 24, 29], 'party': ['Victreebel', 'Tangela', 'Vileplume'], + 'party_address': 'Trainer_Party_Erika_A'}, + {'level': 23, 'party': ['Oddish', 'Gloom'], 'party_address': 'Trainer_Party_Celadon_Gym_Lass_B'}, + {'level': 26, 'party': ['Exeggcute'], 'party_address': 'Trainer_Party_Celadon_Gym_Beauty_C'}], + + 'S.S. Anne Bow': [ + {'level': 18, 'party': ['Machop', 'Shellder'], 'party_address': 'Trainer_Party_SS_Anne_Stern_Sailor_A'}, + {'level': 17, 'party': ['Machop', 'Tentacool'], 'party_address': 'Trainer_Party_SS_Anne_Stern_Sailor_B'}], + 'S.S. Anne B1F Rooms-Two Sailors Room': [{'level': 21, 'party': ['Shellder'], 'party_address': 'Trainer_Party_SS_Anne_B1F_Rooms_Sailor_A'}, + {'level': 17, 'party': ['Horsea', 'Shellder', 'Tentacool'], + 'party_address': 'Trainer_Party_SS_Anne_B1F_Rooms_Sailor_B'}], + 'S.S. Anne B1F Rooms-East Single Sailor Room': [ + {'level': 17, 'party': ['Horsea', 'Horsea', 'Horsea'], + 'party_address': 'Trainer_Party_SS_Anne_B1F_Rooms_Sailor_D'}], + 'S.S. Anne B1F Rooms-West Single Sailor Room': [ + {'level': 18, 'party': ['Tentacool', 'Staryu'], + 'party_address': 'Trainer_Party_SS_Anne_B1F_Rooms_Sailor_C'},], + 'S.S. Anne B1F Rooms-Fisherman Room': [ + {'level': 20, 'party': ['Machop'], 'party_address': 'Trainer_Party_SS_Anne_B1F_Rooms_Sailor_E'}, + {'level': 17, 'party': ['Tentacool', 'Staryu', 'Shellder'], + 'party_address': 'Trainer_Party_SS_Anne_B1F_Rooms_Fisher_A'}], 'Vermilion Gym': [ + {'level': 21, 'party': ['Pikachu', 'Pikachu'], 'party_address': 'Trainer_Party_Vermilion_Gym_Sailor_A'}, + {'level': 20, 'party': ['Voltorb', 'Magnemite', 'Voltorb'], + 'party_address': 'Trainer_Party_Vermilion_Gym_Rocker_A'}, + {'level': 23, 'party': ['Pikachu'], 'party_address': 'Trainer_Party_Vermilion_Gym_Gentleman_A'}, + {'level': [21, 18, 24], 'party': ['Voltorb', 'Pikachu', 'Raichu'], 'party_address': 'Trainer_Party_LtSurge_A'},], + 'Pewter Gym': [ + {'level': 11, 'party': ['Diglett', 'Sandshrew'], 'party_address': 'Trainer_Party_Pewter_Gym_JrTrainerM_A'}, + {'level': [12, 14], 'party': ['Geodude', 'Onix'], 'party_address': 'Trainer_Party_Brock_A'},], + 'Route 12-Grass': [{'level': 24, 'party': ['Magikarp', 'Magikarp'], 'party_address': 'Trainer_Party_Route_12_Fisher_F'}], + 'Route 12-S': [{'level': 29, 'party': ['Nidoran M', 'Nidorino'], 'party_address': 'Trainer_Party_Route_12_JrTrainerM_A'}, + {'level': 29, 'party': ['Voltorb', 'Electrode'], 'party_address': 'Trainer_Party_Route_12_Rocker_A'}], + 'Route 12-N': [ + + {'level': 22, 'party': ['Goldeen', 'Poliwag', 'Goldeen'], 'party_address': 'Trainer_Party_Route_12_Fisher_A'}, + {'level': 24, 'party': ['Tentacool', 'Goldeen'], 'party_address': 'Trainer_Party_Route_12_Fisher_B'}, + {'level': 27, 'party': ['Goldeen'], 'party_address': 'Trainer_Party_Route_12_Fisher_C'}, + {'level': 21, 'party': ['Poliwag', 'Shellder', 'Goldeen', 'Horsea'], + 'party_address': 'Trainer_Party_Route_12_Fisher_D'}], + 'Cerulean Gym': [{'level': 19, 'party': ['Goldeen'], 'party_address': 'Trainer_Party_Cerulean_Gym_JrTrainerF_A'}, + {'level': 16, 'party': ['Horsea', 'Shellder'], + 'party_address': 'Trainer_Party_Cerulean_Gym_Swimmer_A'}, + {'level': [18, 21], 'party': ['Staryu', 'Starmie'], 'party_address': 'Trainer_Party_Misty_A'},], 'Route 10-N': [ ### + {'level': 20, 'party': ['Pikachu', 'Clefairy'], 'party_address': 'Trainer_Party_Route_10_JrTrainerF_A'}, + {'level': 21, 'party': ['Pidgey', 'Pidgeotto'], 'party_address': 'Trainer_Party_Route_10_JrTrainerF_B'}, + {'level': 30, 'party': ['Rhyhorn', 'Lickitung'], 'party_address': 'Trainer_Party_Route_10_Pokemaniac_A'}, + {'level': 20, 'party': ['Cubone', 'Slowpoke'], 'party_address': 'Trainer_Party_Route_10_Pokemaniac_B'}, + {'level': 21, 'party': ['Geodude', 'Onix'], 'party_address': 'Trainer_Party_Route_10_Hiker_A'}, + {'level': 19, 'party': ['Onix', 'Graveler'], 'party_address': 'Trainer_Party_Route_10_Hiker_B'}], + 'Rock Tunnel B1F-E': [{'level': 21, 'party': ['Jigglypuff', 'Pidgey', 'Meowth'], ### + 'party_address': 'Trainer_Party_Rock_Tunnel_B1F_JrTrainerF_A'}, + {'level': 22, 'party': ['Oddish', 'Bulbasaur'], + 'party_address': 'Trainer_Party_Rock_Tunnel_B1F_JrTrainerF_B'}, + {'level': 20, 'party': ['Slowpoke', 'Slowpoke', 'Slowpoke'], + 'party_address': 'Trainer_Party_Rock_Tunnel_B1F_Pokemaniac_A'}, + {'level': 22, 'party': ['Charmander', 'Cubone'], + 'party_address': 'Trainer_Party_Rock_Tunnel_B1F_Pokemaniac_B'}, + {'level': 25, 'party': ['Slowpoke'], + 'party_address': 'Trainer_Party_Rock_Tunnel_B1F_Pokemaniac_C'}, + {'level': 21, 'party': ['Geodude', 'Geodude', 'Graveler'], + 'party_address': 'Trainer_Party_Rock_Tunnel_B1F_Hiker_A'}, + {'level': 25, 'party': ['Geodude'], 'party_address': 'Trainer_Party_Rock_Tunnel_B1F_Hiker_B'}, + {'level': 20, 'party': ['Machop', 'Onix'], + 'party_address': 'Trainer_Party_Rock_Tunnel_B1F_Hiker_D'}], 'Route 13': [ + {'level': 24, 'party': ['Pidgey', 'Meowth', 'Rattata', 'Pikachu', 'Meowth'], + 'party_address': 'Trainer_Party_Route_13_JrTrainerF_A'}, + {'level': 30, 'party': ['Poliwag', 'Poliwag'], 'party_address': 'Trainer_Party_Route_13_JrTrainerF_B'}, + {'level': 27, 'party': ['Pidgey', 'Meowth', 'Pidgey', 'Pidgeotto'], + 'party_address': 'Trainer_Party_Route_13_JrTrainerF_C'}, + {'level': 28, 'party': ['Goldeen', 'Poliwag', 'Horsea'], + 'party_address': 'Trainer_Party_Route_13_JrTrainerF_D'}, + {'level': 28, 'party': ['Koffing', 'Koffing', 'Koffing'], 'party_address': 'Trainer_Party_Route_13_Biker_A'}, + {'level': 27, 'party': ['Rattata', 'Pikachu', 'Rattata'], 'party_address': 'Trainer_Party_Route_13_Beauty_A'}, + {'level': 29, 'party': ['Clefairy', 'Meowth'], 'party_address': 'Trainer_Party_Route_13_Beauty_B'}, + {'level': 29, 'party': ['Pidgey', 'Pidgeotto'], 'party_address': 'Trainer_Party_Route_13_BirdKeeper_A'}, + {'level': 25, 'party': ['Spearow', 'Pidgey', 'Pidgey', 'Spearow', 'Spearow'], + 'party_address': 'Trainer_Party_Route_13_BirdKeeper_B'}, + {'level': 26, 'party': ['Pidgey', 'Pidgeotto', 'Spearow', 'Fearow'], + 'party_address': 'Trainer_Party_Route_13_BirdKeeper_C'}], + 'Route 20-E': [ + {'level': 31, 'party': ['Shellder', 'Cloyster'], 'party_address': 'Trainer_Party_Route_20_Swimmer_A'}, + {'level': 28, 'party': ['Horsea', 'Horsea', 'Seadra', 'Horsea'], + + 'party_address': 'Trainer_Party_Route_20_Swimmer_C'}, + + {'level': 30, 'party': ['Seadra', 'Horsea', 'Seadra'], + 'party_address': 'Trainer_Party_Route_20_Beauty_E'}], + 'Route 20-W': [ + {'level': 35, 'party': ['Seaking'], 'party_address': 'Trainer_Party_Route_20_Beauty_A'}, + {'level': 31, 'party': ['Goldeen', 'Seaking'], 'party_address': 'Trainer_Party_Route_20_JrTrainerF_A'}, + {'level': 30, 'party': ['Tentacool', 'Horsea', 'Seel'], + 'party_address': 'Trainer_Party_Route_20_JrTrainerF_C'}, + + {'level': 35, 'party': ['Staryu'], 'party_address': 'Trainer_Party_Route_20_Swimmer_B'}, + + {'level': 30, 'party': ['Shellder', 'Shellder', 'Cloyster'], + 'party_address': 'Trainer_Party_Route_20_Beauty_B'}, + {'level': 31, 'party': ['Poliwag', 'Seaking'], 'party_address': 'Trainer_Party_Route_20_Beauty_C'}, + + {'level': 30, 'party': ['Fearow', 'Fearow', 'Pidgeotto'], + 'party_address': 'Trainer_Party_Route_20_BirdKeeper_A'}], 'Rock Tunnel 1F-S': [ ### + {'level': 22, 'party': ['Bellsprout', 'Clefairy'], + 'party_address': 'Trainer_Party_Rock_Tunnel_1F_JrTrainerF_A'}, + {'level': 20, 'party': ['Meowth', 'Oddish', 'Pidgey'], + 'party_address': 'Trainer_Party_Rock_Tunnel_1F_JrTrainerF_B'}, + {'level': 19, 'party': ['Pidgey', 'Rattata', 'Rattata', 'Bellsprout'], + 'party_address': 'Trainer_Party_Rock_Tunnel_1F_JrTrainerF_C'}, + {'level': 23, 'party': ['Cubone', 'Slowpoke'], 'party_address': 'Trainer_Party_Rock_Tunnel_1F_Pokemaniac_A'}, + {'level': 19, 'party': ['Geodude', 'Machop', 'Geodude', 'Geodude'], + 'party_address': 'Trainer_Party_Rock_Tunnel_1F_Hiker_A'}, + {'level': 20, 'party': ['Onix', 'Onix', 'Geodude'], 'party_address': 'Trainer_Party_Rock_Tunnel_1F_Hiker_B'}, + {'level': 21, 'party': ['Geodude', 'Graveler'], 'party_address': 'Trainer_Party_Rock_Tunnel_1F_Hiker_C'}], + 'Route 15': [ + {'level': 28, 'party': ['Gloom', 'Oddish', 'Oddish'], 'party_address': 'Trainer_Party_Route_15_JrTrainerF_A'}, + {'level': 29, 'party': ['Pikachu', 'Raichu'], 'party_address': 'Trainer_Party_Route_15_JrTrainerF_B'}, + {'level': 33, 'party': ['Clefairy'], 'party_address': 'Trainer_Party_Route_15_JrTrainerF_C'}, + {'level': 29, 'party': ['Bellsprout', 'Oddish', 'Tangela'], + 'party_address': 'Trainer_Party_Route_15_JrTrainerF_D'}, + {'level': 25, 'party': ['Koffing', 'Koffing', 'Weezing', 'Koffing', 'Grimer'], + 'party_address': 'Trainer_Party_Route_15_Biker_A'}, + {'level': 28, 'party': ['Koffing', 'Grimer', 'Weezing'], 'party_address': 'Trainer_Party_Route_15_Biker_B'}, + {'level': 29, 'party': ['Pidgeotto', 'Wigglytuff'], 'party_address': 'Trainer_Party_Route_15_Beauty_A'}, + {'level': 29, 'party': ['Bulbasaur', 'Ivysaur'], 'party_address': 'Trainer_Party_Route_15_Beauty_B'}, + {'level': 26, 'party': ['Pidgeotto', 'Farfetchd', 'Doduo', 'Pidgey'], + 'party_address': 'Trainer_Party_Route_15_BirdKeeper_A'}, + {'level': 28, 'party': ['Dodrio', 'Doduo', 'Doduo'], 'party_address': 'Trainer_Party_Route_15_BirdKeeper_B'}], + 'Victory Road 2F-C': [{'level': 40, 'party': ['Charmeleon', 'Lapras', 'Lickitung'], ### + 'party_address': 'Trainer_Party_Victory_Road_2F_Pokemaniac_A'}, + {'level': 41, 'party': ['Drowzee', 'Hypno', 'Kadabra', 'Kadabra'], + 'party_address': 'Trainer_Party_Victory_Road_2F_Juggler_A'}, + {'level': 48, 'party': ['Mr Mime'], 'party_address': 'Trainer_Party_Victory_Road_2F_Juggler_C'}, + {'level': 44, 'party': ['Persian', 'Golduck'], + 'party_address': 'Trainer_Party_Victory_Road_2F_Tamer_A'}, + {'level': 43, 'party': ['Machoke', 'Machop', 'Machoke'], + 'party_address': 'Trainer_Party_Victory_Road_2F_Blackbelt_A'}], 'Mt Moon B2F': [ + {'level': 12, 'party': ['Grimer', 'Voltorb', 'Koffing'], + 'party_address': 'Trainer_Party_Mt_Moon_B2F_SuperNerd_A'}, + {'level': 13, 'party': ['Rattata', 'Zubat'], 'party_address': 'Trainer_Party_Mt_Moon_B2F_Rocket_A'}, + {'level': 16, 'party': ['Raticate'], 'party_address': 'Trainer_Party_Mt_Moon_B2F_Rocket_D'}], + 'Mt Moon B2F-NE': [{'level': 12, 'party': ['Zubat', 'Ekans'], 'party_address': 'Trainer_Party_Mt_Moon_B2F_Rocket_C'}], + 'Mt Moon B2F-C': [ + {'level': 11, 'party': ['Sandshrew', 'Rattata', 'Zubat'], + 'party_address': 'Trainer_Party_Mt_Moon_B2F_Rocket_B'}], 'Cinnabar Gym': [ + {'level': 36, 'party': ['Vulpix', 'Vulpix', 'Ninetales'], + 'party_address': 'Trainer_Party_Cinnabar_Gym_SuperNerd_A'}, + {'level': 34, 'party': ['Ponyta', 'Charmander', 'Vulpix', 'Growlithe'], + 'party_address': 'Trainer_Party_Cinnabar_Gym_SuperNerd_B'}, + {'level': 41, 'party': ['Rapidash'], 'party_address': 'Trainer_Party_Cinnabar_Gym_SuperNerd_C'}, + {'level': 37, 'party': ['Growlithe', 'Vulpix'], 'party_address': 'Trainer_Party_Cinnabar_Gym_SuperNerd_D'}, + {'level': 36, 'party': ['Growlithe', 'Vulpix', 'Ninetales'], + 'party_address': 'Trainer_Party_Cinnabar_Gym_Burglar_A'}, + {'level': 41, 'party': ['Ponyta'], 'party_address': 'Trainer_Party_Cinnabar_Gym_Burglar_B'}, + {'level': 37, 'party': ['Vulpix', 'Growlithe'], 'party_address': 'Trainer_Party_Cinnabar_Gym_Burglar_C'}, + {'level': [42, 40, 42, 47], 'party': ['Growlithe', 'Ponyta', 'Rapidash', 'Arcanine'], + 'party_address': 'Trainer_Party_Blaine_A'}], + 'Route 14': [{'level': 29, 'party': ['Koffing', 'Grimer'], 'party_address': 'Trainer_Party_Route_14_Biker_A'}, + {'level': 26, 'party': ['Koffing', 'Koffing', 'Grimer', 'Koffing'], + 'party_address': 'Trainer_Party_Route_14_Biker_C'}, + {'level': 28, 'party': ['Grimer', 'Grimer', 'Koffing'], + 'party_address': 'Trainer_Party_Route_14_Biker_D'}, + {'level': 29, 'party': ['Koffing', 'Muk'], 'party_address': 'Trainer_Party_Route_14_Biker_E'}, + {'level': 33, 'party': ['Farfetchd'], 'party_address': 'Trainer_Party_Route_14_BirdKeeper_A'}, + {'level': 29, 'party': ['Spearow', 'Fearow'], 'party_address': 'Trainer_Party_Route_14_BirdKeeper_B'}, + {'level': 28, 'party': ['Pidgey', 'Doduo', 'Pidgeotto'], + 'party_address': 'Trainer_Party_Route_14_BirdKeeper_D'}, + {'level': 26, 'party': ['Pidgey', 'Spearow', 'Pidgey', 'Fearow'], + 'party_address': 'Trainer_Party_Route_14_BirdKeeper_E'}, + {'level': 29, 'party': ['Pidgeotto', 'Fearow'], + 'party_address': 'Trainer_Party_Route_14_BirdKeeper_F'}, + {'level': 28, 'party': ['Spearow', 'Doduo', 'Fearow'], + 'party_address': 'Trainer_Party_Route_14_BirdKeeper_G'}], + 'Route 16-SW': [{'level': 29, 'party': ['Grimer', 'Koffing'], 'party_address': 'Trainer_Party_Route_16_Biker_A'}, + {'level': 33, 'party': ['Weezing'], 'party_address': 'Trainer_Party_Route_16_Biker_B'}, + {'level': 26, 'party': ['Grimer', 'Grimer', 'Grimer', 'Grimer'], + 'party_address': 'Trainer_Party_Route_16_Biker_C'}, + {'level': 28, 'party': ['Machop', 'Mankey', 'Machop'], + 'party_address': 'Trainer_Party_Route_16_CueBall_A'}, + {'level': 29, 'party': ['Mankey', 'Machop'], 'party_address': 'Trainer_Party_Route_16_CueBall_B'}, + {'level': 33, 'party': ['Machop'], 'party_address': 'Trainer_Party_Route_16_CueBall_C'}], 'Route 17': [ + {'level': 28, 'party': ['Weezing', 'Koffing', 'Weezing'], 'party_address': 'Trainer_Party_Route_17_Biker_A'}, + {'level': 33, 'party': ['Muk'], 'party_address': 'Trainer_Party_Route_17_Biker_B'}, + {'level': 29, 'party': ['Voltorb', 'Voltorb'], 'party_address': 'Trainer_Party_Route_17_Biker_C'}, + {'level': 29, 'party': ['Weezing', 'Muk'], 'party_address': 'Trainer_Party_Route_17_Biker_D'}, + {'level': 25, 'party': ['Koffing', 'Weezing', 'Koffing', 'Koffing', 'Weezing'], + 'party_address': 'Trainer_Party_Route_17_Biker_E'}, + {'level': 29, 'party': ['Mankey', 'Primeape'], 'party_address': 'Trainer_Party_Route_17_CueBall_A'}, + {'level': 29, 'party': ['Machop', 'Machoke'], 'party_address': 'Trainer_Party_Route_17_CueBall_B'}, + {'level': 33, 'party': ['Machoke'], 'party_address': 'Trainer_Party_Route_17_CueBall_C'}, + {'level': 26, 'party': ['Mankey', 'Mankey', 'Machoke', 'Machop'], + 'party_address': 'Trainer_Party_Route_17_CueBall_D'}, + {'level': 29, 'party': ['Primeape', 'Machoke'], 'party_address': 'Trainer_Party_Route_17_CueBall_E'}], + 'Pokemon Mansion 2F': [ + {'level': 34, 'party': ['Charmander', 'Charmeleon'], 'party_address': 'Trainer_Party_Mansion_2F_Burglar_A'}], + 'Pokemon Mansion 3F-SW': [{'level': 38, 'party': ['Ninetales'], 'party_address': 'Trainer_Party_Mansion_3F_Burglar_A'}], + 'Pokemon Mansion 3F-SE': [ + {'level': 33, 'party': ['Magnemite', 'Magneton', 'Voltorb'], + 'party_address': 'Trainer_Party_Mansion_3F_Scientist_A'}], 'Pokemon Mansion B1F': [ + {'level': 34, 'party': ['Growlithe', 'Ponyta'], 'party_address': 'Trainer_Party_Mansion_B1F_Burglar_A'}, + {'level': 34, 'party': ['Magnemite', 'Electrode'], 'party_address': 'Trainer_Party_Mansion_B1F_Scientist_A'}], + 'Route 11': [{'level': 21, 'party': ['Magnemite'], 'party_address': 'Trainer_Party_Route_11_Engineer_A'}, + {'level': 18, 'party': ['Magnemite', 'Magnemite', 'Magneton'], + 'party_address': 'Trainer_Party_Route_11_Engineer_B'}, + {'level': 18, 'party': ['Poliwag', 'Horsea'], 'party_address': 'Trainer_Party_Route_11_Gambler_A'}, + {'level': 18, 'party': ['Bellsprout', 'Oddish'], 'party_address': 'Trainer_Party_Route_11_Gambler_B'}, + {'level': 18, 'party': ['Voltorb', 'Magnemite'], 'party_address': 'Trainer_Party_Route_11_Gambler_C'}, + {'level': 18, 'party': ['Growlithe', 'Vulpix'], 'party_address': 'Trainer_Party_Route_11_Gambler_D'}, + {'level': 21, 'party': ['Ekans'], 'party_address': 'Trainer_Party_Route_11_Youngster_A'}, + {'level': 19, 'party': ['Sandshrew', 'Zubat'], 'party_address': 'Trainer_Party_Route_11_Youngster_B'}, + {'level': 17, 'party': ['Rattata', 'Rattata', 'Raticate'], + 'party_address': 'Trainer_Party_Route_11_Youngster_C'}, + {'level': 18, 'party': ['Nidoran M', 'Nidorino'], + 'party_address': 'Trainer_Party_Route_11_Youngster_D'}], 'Route 21': [ + {'level': 28, 'party': ['Seaking', 'Goldeen', 'Seaking', 'Seaking'], + 'party_address': 'Trainer_Party_Route_21_Fisher_A'}, + {'level': 31, 'party': ['Shellder', 'Cloyster'], 'party_address': 'Trainer_Party_Route_21_Fisher_B'}, + {'level': 27, 'party': ['Magikarp', 'Magikarp', 'Magikarp', 'Magikarp', 'Magikarp', 'Magikarp'], + 'party_address': 'Trainer_Party_Route_21_Fisher_C'}, + {'level': 33, 'party': ['Seaking', 'Goldeen'], 'party_address': 'Trainer_Party_Route_21_Fisher_D'}, + {'level': 33, 'party': ['Seadra', 'Tentacruel'], 'party_address': 'Trainer_Party_Route_21_Swimmer_A'}, + {'level': 37, 'party': ['Starmie'], 'party_address': 'Trainer_Party_Route_21_Swimmer_B'}, + {'level': 33, 'party': ['Staryu', 'Wartortle'], 'party_address': 'Trainer_Party_Route_21_Swimmer_C'}, + {'level': 32, 'party': ['Poliwhirl', 'Tentacool', 'Seadra'], + 'party_address': 'Trainer_Party_Route_21_Swimmer_D'}, + {'level': 31, 'party': ['Tentacool', 'Tentacool', 'Tentacruel'], + 'party_address': 'Trainer_Party_Route_21_CueBall_A'}], + 'Route 19-N': [{'level': 30, 'party': ['Tentacool', 'Shellder'], 'party_address': 'Trainer_Party_Route_19_Swimmer_A'}, + {'level': 29, 'party': ['Goldeen', 'Horsea', 'Staryu'], + 'party_address': 'Trainer_Party_Route_19_Swimmer_B'},], + 'Route 19-S': [ + {'level': 30, 'party': ['Poliwag', 'Poliwhirl'], 'party_address': 'Trainer_Party_Route_19_Swimmer_C'}, + {'level': 27, 'party': ['Horsea', 'Tentacool', 'Tentacool', 'Goldeen'], + 'party_address': 'Trainer_Party_Route_19_Swimmer_D'}, + {'level': 29, 'party': ['Goldeen', 'Shellder', 'Seaking'], + 'party_address': 'Trainer_Party_Route_19_Swimmer_E'}, + {'level': 30, 'party': ['Horsea', 'Horsea'], 'party_address': 'Trainer_Party_Route_19_Swimmer_F'}, + {'level': 27, 'party': ['Tentacool', 'Tentacool', 'Staryu', 'Horsea', 'Tentacruel'], + 'party_address': 'Trainer_Party_Route_19_Swimmer_G'}, + {'level': 27, 'party': ['Poliwag', 'Goldeen', 'Seaking', 'Goldeen', 'Poliwag'], + 'party_address': 'Trainer_Party_Route_19_Beauty_A'}, + {'level': 30, 'party': ['Goldeen', 'Seaking'], 'party_address': 'Trainer_Party_Route_19_Beauty_B'}, + {'level': 29, 'party': ['Staryu', 'Staryu', 'Staryu'], + 'party_address': 'Trainer_Party_Route_19_Beauty_C'}], + 'Saffron Gym-C': [ + {'level': [38, 37, 38, 43], 'party': ['Kadabra', 'Mr Mime', 'Venomoth', 'Alakazam'], + 'party_address': 'Trainer_Party_Sabrina_A'},], + 'Saffron Gym-NE': [ + {'level': 31, 'party': ['Kadabra', 'Slowpoke', 'Mr Mime', 'Kadabra'], + 'party_address': 'Trainer_Party_Saffron_Gym_Psychic_A'}], + 'Saffron Gym-E': [ + {'level': 34, 'party': ['Mr Mime', 'Kadabra'], 'party_address': 'Trainer_Party_Saffron_Gym_Psychic_B'}], + 'Saffron Gym-SE': [ + {'level': 33, 'party': ['Slowpoke', 'Slowpoke', 'Slowbro'], + 'party_address': 'Trainer_Party_Saffron_Gym_Psychic_C'}], + + 'Saffron Gym-NW': [ + {'level': 38, 'party': ['Slowbro'], 'party_address': 'Trainer_Party_Saffron_Gym_Psychic_D'}], + 'Saffron Gym-N': [ + {'level': 34, 'party': ['Gastly', 'Haunter'], 'party_address': 'Trainer_Party_Saffron_Gym_Channeler_A'}], + 'Saffron Gym-W': [ + {'level': 38, 'party': ['Haunter'], 'party_address': 'Trainer_Party_Saffron_Gym_Channeler_B'}], + 'Saffron Gym-SW': [ + {'level': 33, 'party': ['Gastly', 'Gastly', 'Haunter'], + 'party_address': 'Trainer_Party_Saffron_Gym_Channeler_C'}], 'Silph Co 5F': [ + {'level': 29, 'party': ['Kadabra', 'Mr Mime'], 'party_address': 'Trainer_Party_Silph_Co_5F_Juggler_A'}, + {'level': 26, 'party': ['Magneton', 'Koffing', 'Weezing', 'Magnemite'], + 'party_address': 'Trainer_Party_Silph_Co_5F_Scientist_A'}, + {'level': 33, 'party': ['Arbok'], 'party_address': 'Trainer_Party_Silph_Co_5F_Rocket_A'}, + {'level': 33, 'party': ['Hypno'], 'party_address': 'Trainer_Party_Silph_Co_5F_Rocket_B'}], 'Fuchsia Gym': [ + {'level': 31, 'party': ['Drowzee', 'Drowzee', 'Kadabra', 'Drowzee'], + 'party_address': 'Trainer_Party_Fuchsia_Gym_Juggler_A'}, + {'level': 34, 'party': ['Drowzee', 'Hypno'], 'party_address': 'Trainer_Party_Fuchsia_Gym_Juggler_B'}, + {'level': 38, 'party': ['Hypno'], 'party_address': 'Trainer_Party_Fuchsia_Gym_Juggler_D'}, + {'level': 34, 'party': ['Drowzee', 'Kadabra'], 'party_address': 'Trainer_Party_Fuchsia_Gym_Juggler_E'}, + {'level': 34, 'party': ['Sandslash', 'Arbok'], 'party_address': 'Trainer_Party_Fuchsia_Gym_Tamer_A'}, + {'level': 33, 'party': ['Arbok', 'Sandslash', 'Arbok'], 'party_address': 'Trainer_Party_Fuchsia_Gym_Tamer_B'}, + {'level': [37, 39, 37, 43], 'party': ['Koffing', 'Muk', 'Koffing', 'Weezing'], + 'party_address': 'Trainer_Party_Koga_A'},], + 'Viridian Gym': [{'level': 43, 'party': ['Rhyhorn'], 'party_address': 'Trainer_Party_Viridian_Gym_Tamer_A'}, + {'level': 39, 'party': ['Arbok', 'Tauros'], 'party_address': 'Trainer_Party_Viridian_Gym_Tamer_B'}, + {'level': 40, 'party': ['Machop', 'Machoke'], + 'party_address': 'Trainer_Party_Viridian_Gym_Blackbelt_A'}, + {'level': 43, 'party': ['Machoke'], 'party_address': 'Trainer_Party_Viridian_Gym_Blackbelt_B'}, + {'level': 38, 'party': ['Machoke', 'Machop', 'Machoke'], + 'party_address': 'Trainer_Party_Viridian_Gym_Blackbelt_C'}, + {'level': [45, 42, 44, 45, 50], 'party': ['Rhyhorn', 'Dugtrio', 'Nidoqueen', 'Nidoking', 'Rhydon'], + 'party_address': 'Trainer_Party_Viridian_Gym_Giovanni_A'}, + {'level': 39, 'party': ['Nidorino', 'Nidoking'], + 'party_address': 'Trainer_Party_Viridian_Gym_CooltrainerM_A'}, + {'level': 39, 'party': ['Sandslash', 'Dugtrio'], + 'party_address': 'Trainer_Party_Viridian_Gym_CooltrainerM_C'}, + {'level': 43, 'party': ['Rhyhorn'], 'party_address': 'Trainer_Party_Viridian_Gym_CooltrainerM_D'}], + 'Route 18-E': [{'level': 29, 'party': ['Spearow', 'Fearow'], 'party_address': 'Trainer_Party_Route_18_BirdKeeper_A'}, + {'level': 34, 'party': ['Dodrio'], 'party_address': 'Trainer_Party_Route_18_BirdKeeper_B'}, + {'level': 26, 'party': ['Spearow', 'Spearow', 'Fearow', 'Spearow'], + 'party_address': 'Trainer_Party_Route_18_BirdKeeper_C'}], 'Saffron Fighting Dojo': [ + {'level': 37, 'party': ['Hitmonlee', 'Hitmonchan'], 'party_address': 'Trainer_Party_Fighting_Dojo_Blackbelt_A'}, + {'level': 31, 'party': ['Mankey', 'Mankey', 'Primeape'], + 'party_address': 'Trainer_Party_Fighting_Dojo_Blackbelt_B'}, + {'level': 32, 'party': ['Machop', 'Machoke'], 'party_address': 'Trainer_Party_Fighting_Dojo_Blackbelt_C'}, + {'level': 36, 'party': ['Primeape'], 'party_address': 'Trainer_Party_Fighting_Dojo_Blackbelt_D'}, + {'level': 31, 'party': ['Machop', 'Mankey', 'Primeape'], + 'party_address': 'Trainer_Party_Fighting_Dojo_Blackbelt_E'}], + "Oak's Lab": [{'level': 5, 'party': [['Squirtle'], ['Bulbasaur'], ['Charmander']], + 'party_address': ['Trainer_Party_Pallet_Town_Green1_A', 'Trainer_Party_Pallet_Town_Green1_B', + 'Trainer_Party_Pallet_Town_Green1_C']}], + 'Route 22': [{'level': [9, 8], 'party': [['Pidgey', 'Squirtle'], ['Pidgey', 'Bulbasaur'], ['Pidgey', 'Charmander']], + 'party_address': ['Trainer_Party_Route_22_Green1_A', 'Trainer_Party_Route_22_Green1_B','Trainer_Party_Route_22_Green1_C']}], + 'Route 22-F': + [{'level': [47, 45, 45, 47, 50, 53], 'party': [['Pidgeot', 'Rhyhorn', 'Growlithe', 'Exeggcute', 'Alakazam', + 'Blastoise'], ['Pidgeot', 'Rhyhorn', 'Gyarados', 'Growlithe', 'Alakazam', 'Venusaur'], ['Pidgeot', 'Rhyhorn', 'Exeggcute', + 'Gyarados', 'Alakazam', 'Charizard']], + 'party_address': ['Trainer_Party_Route_22_Green2_A', 'Trainer_Party_Route_22_Green2_B', 'Trainer_Party_Route_22_Green2_C']}], + 'Cerulean City': [{'level': [18, 15, 15, 17], 'party': [['Pidgeotto', 'Abra', 'Rattata', 'Squirtle'], + ['Pidgeotto', 'Abra', 'Rattata', 'Bulbasaur'], + ['Pidgeotto', 'Abra', 'Rattata', 'Charmander']], + 'party_address': ['Trainer_Party_Cerulean_City_Green1_A', 'Trainer_Party_Cerulean_City_Green1_B', 'Trainer_Party_Cerulean_City_Green1_C']}, + {'level': 17, 'party': ['Machop', 'Drowzee'], + 'party_address': 'Trainer_Party_Cerulean_City_Rocket_A'}], 'Pokemon Mansion 1F': [ + {'level': 29, 'party': ['Electrode', 'Weezing'], 'party_address': 'Trainer_Party_Mansion_1F_Scientist_A'}], + 'Silph Co 2F-SW': [{'level': 26, 'party': ['Grimer', 'Weezing', 'Koffing', 'Weezing'], + 'party_address': 'Trainer_Party_Silph_Co_2F_Scientist_A'}], + 'Silph Co 2F': [{'level': 28, 'party': ['Magnemite', 'Voltorb', 'Magneton'], + 'party_address': 'Trainer_Party_Silph_Co_2F_Scientist_B'}, + {'level': 29, 'party': ['Cubone', 'Zubat'], 'party_address': 'Trainer_Party_Silph_Co_2F_Rocket_A'}, + {'level': 25, 'party': ['Golbat', 'Zubat', 'Zubat', 'Raticate', 'Zubat'], + 'party_address': 'Trainer_Party_Silph_Co_2F_Rocket_B'}], 'Silph Co 3F-W': [ + {'level': 29, 'party': ['Electrode', 'Weezing'], 'party_address': 'Trainer_Party_Silph_Co_3F_Scientist_A'}], + 'Silph Co 3F': [ {'level': 28, 'party': ['Raticate', 'Hypno', 'Raticate'], + 'party_address': 'Trainer_Party_Silph_Co_3F_Rocket_A'}], + 'Silph Co 4F-N': [{'level': 33, 'party': ['Electrode'], 'party_address': 'Trainer_Party_Silph_Co_4F_Scientist_A'}], + 'Silph Co 4F': [{'level': 29, 'party': ['Machop', 'Drowzee'], + 'party_address': 'Trainer_Party_Silph_Co_4F_Rocket_A'}, + {'level': 28, 'party': ['Ekans', 'Zubat', 'Cubone'], + 'party_address': 'Trainer_Party_Silph_Co_4F_Rocket_B'}], 'Silph Co 6F': [ + {'level': 25, 'party': ['Voltorb', 'Koffing', 'Magneton', 'Magnemite', 'Koffing'], + 'party_address': 'Trainer_Party_Silph_Co_6F_Scientist_A'}, + {'level': 29, 'party': ['Machop', 'Machoke'], 'party_address': 'Trainer_Party_Silph_Co_6F_Rocket_A'}, + {'level': 28, 'party': ['Zubat', 'Zubat', 'Golbat'], 'party_address': 'Trainer_Party_Silph_Co_6F_Rocket_B'}], + 'Silph Co 7F': [ + {'level': 29, 'party': ['Electrode', 'Muk'], 'party_address': 'Trainer_Party_Silph_Co_7F_Scientist_A'}, + {'level': 26, 'party': ['Raticate', 'Arbok', 'Koffing', 'Golbat'], + 'party_address': 'Trainer_Party_Silph_Co_7F_Rocket_A'}, + {'level': 29, 'party': ['Cubone', 'Cubone'], 'party_address': 'Trainer_Party_Silph_Co_7F_Rocket_B'}], + 'Silph Co 7F-SE': [ + {'level': 29, 'party': ['Sandshrew', 'Sandslash'], 'party_address': 'Trainer_Party_Silph_Co_7F_Rocket_C'}], + 'Silph Co 7F-NW': [{'level': [37, 38, 35, 35, 40], 'party': [['Pidgeot', 'Growlithe', 'Exeggcute', 'Alakazam', 'Blastoise'], + ['Pidgeot', 'Gyarados', 'Growlithe', 'Alakazam', 'Venusaur'], + ['Pidgeot', 'Exeggcute', 'Gyarados', 'Alakazam', 'Charizard']], + 'party_address': ['Trainer_Party_Silph_Co_7F_Green2_A', 'Trainer_Party_Silph_Co_7F_Green2_B', 'Trainer_Party_Silph_Co_7F_Green2_C']}], + 'Silph Co 8F': [ + {'level': 29, 'party': ['Grimer', 'Electrode'], 'party_address': 'Trainer_Party_Silph_Co_8F_Scientist_A'}, + {'level': 26, 'party': ['Raticate', 'Zubat', 'Golbat', 'Rattata'], + 'party_address': 'Trainer_Party_Silph_Co_8F_Rocket_A'}, + {'level': 28, 'party': ['Weezing', 'Golbat', 'Koffing'], + 'party_address': 'Trainer_Party_Silph_Co_8F_Rocket_B'}], 'Silph Co 9F': [ + {'level': 28, 'party': ['Voltorb', 'Koffing', 'Magneton'], + 'party_address': 'Trainer_Party_Silph_Co_9F_Scientist_A'}, + {'level': 28, 'party': ['Golbat', 'Drowzee', 'Hypno'], 'party_address': 'Trainer_Party_Silph_Co_9F_Rocket_B'}], + 'Silph Co 9F-NW': [ + {'level': 28, 'party': ['Drowzee', 'Grimer', 'Machop'], 'party_address': 'Trainer_Party_Silph_Co_9F_Rocket_A'},], + 'Silph Co 10F': [ + {'level': 29, 'party': ['Magnemite', 'Koffing'], 'party_address': 'Trainer_Party_Silph_Co_10F_Scientist_A'}, + {'level': 33, 'party': ['Machoke'], 'party_address': 'Trainer_Party_Silph_Co_10F_Rocket_A'}], + 'Rocket Hideout B4F': [{'level': [25, 24, 29], 'party': ['Onix', 'Rhyhorn', 'Kangaskhan'], + 'party_address': 'Trainer_Party_Rocket_Hideout_B4F_Giovanni_A'}, + {'level': 23, 'party': ['Sandshrew', 'Ekans', 'Sandslash'], + 'party_address': 'Trainer_Party_Rocket_Hideout_B4F_Rocket_A'}, + {'level': 23, 'party': ['Ekans', 'Sandshrew', 'Arbok'], + 'party_address': 'Trainer_Party_Rocket_Hideout_B4F_Rocket_B'}], + 'Rocket Hideout B4F-NW': [ + {'level': 21, 'party': ['Koffing', 'Zubat'], + 'party_address': 'Trainer_Party_Rocket_Hideout_B4F_Rocket_C'}], 'Silph Co 11F': [ + {'level': 25, 'party': ['Rattata', 'Rattata', 'Zubat', 'Rattata', 'Ekans'], + 'party_address': 'Trainer_Party_Silph_Co_11F_Rocket_A'},], + 'Silph Co 11F-W': [ + {'level': 32, 'party': ['Cubone', 'Drowzee', 'Marowak'], + 'party_address': 'Trainer_Party_Silph_Co_11F_Rocket_B'}], + 'Silph Co 11F-C': [ + {'level': [37, 35, 37, 41], 'party': ['Nidorino', 'Kangaskhan', 'Rhyhorn', 'Nidoqueen'], + 'party_address': 'Trainer_Party_Silph_Co_11F_Giovanni_A'}], + 'Celadon Game Corner': [ + {'level': 20, 'party': ['Raticate', 'Zubat'], 'party_address': 'Trainer_Party_Game_Corner_Rocket_A'}], + 'Rocket Hideout B1F': [ + {'level': 21, 'party': ['Drowzee', 'Machop'], 'party_address': 'Trainer_Party_Rocket_Hideout_B1F_Rocket_A'}, + {'level': 21, 'party': ['Raticate', 'Raticate'], 'party_address': 'Trainer_Party_Rocket_Hideout_B1F_Rocket_B'}], + 'Rocket Hideout B1F-S': [ + {'level': 20, 'party': ['Grimer', 'Koffing', 'Koffing'], + 'party_address': 'Trainer_Party_Rocket_Hideout_B1F_Rocket_C'}, + {'level': 19, 'party': ['Rattata', 'Raticate', 'Raticate', 'Rattata'], + 'party_address': 'Trainer_Party_Rocket_Hideout_B1F_Rocket_D'}], + 'Rocket Hideout B1F-SE': [ + {'level': 22, 'party': ['Grimer', 'Koffing'], 'party_address': 'Trainer_Party_Rocket_Hideout_B1F_Rocket_E'}], + 'Rocket Hideout B2F': [{'level': 17, 'party': ['Zubat', 'Koffing', 'Grimer', 'Zubat', 'Raticate'], + 'party_address': 'Trainer_Party_Rocket_Hideout_B2F_Rocket_A'}], 'Rocket Hideout B3F': [ + {'level': 20, 'party': ['Rattata', 'Raticate', 'Drowzee'], + 'party_address': 'Trainer_Party_Rocket_Hideout_B3F_Rocket_A'}, + {'level': 21, 'party': ['Machop', 'Machop'], 'party_address': 'Trainer_Party_Rocket_Hideout_B3F_Rocket_B'}], + 'Pokemon Tower 7F': [{'level': 25, 'party': ['Zubat', 'Zubat', 'Golbat'], + 'party_address': 'Trainer_Party_Pokemon_Tower_7F_Rocket_A'}, + {'level': 26, 'party': ['Koffing', 'Drowzee'], + 'party_address': 'Trainer_Party_Pokemon_Tower_7F_Rocket_B'}, + {'level': 23, 'party': ['Zubat', 'Rattata', 'Raticate', 'Zubat'], + 'party_address': 'Trainer_Party_Pokemon_Tower_7F_Rocket_C'}], 'Victory Road 3F': [ + {'level': 43, 'party': ['Exeggutor', 'Cloyster', 'Arcanine'], + 'party_address': 'Trainer_Party_Victory_Road_3F_CooltrainerM_A'}, + {'level': 43, 'party': ['Kingler', 'Tentacruel', 'Blastoise'], + 'party_address': 'Trainer_Party_Victory_Road_3F_CooltrainerM_B'}, + {'level': 43, 'party': ['Bellsprout', 'Weepinbell', 'Victreebel'], + 'party_address': 'Trainer_Party_Victory_Road_3F_CooltrainerF_A'}, + {'level': 43, 'party': ['Parasect', 'Dewgong', 'Chansey'], + 'party_address': 'Trainer_Party_Victory_Road_3F_CooltrainerF_B'}], 'Victory Road 1F': [ + {'level': 42, 'party': ['Ivysaur', 'Wartortle', 'Charmeleon', 'Charizard'], + 'party_address': 'Trainer_Party_Victory_Road_1F_CooltrainerM_A'}, + {'level': 44, 'party': ['Persian', 'Ninetales'], + 'party_address': 'Trainer_Party_Victory_Road_1F_CooltrainerF_A'}], + + + "Indigo Plateau Bruno's Room": [ + {'level': [53, 55, 55, 56, 58], 'party': ['Onix', 'Hitmonchan', 'Hitmonlee', 'Onix', 'Machamp'], + 'party_address': 'Trainer_Party_Bruno_A'}], + "Indigo Plateau Lorelei's Room": [{'level': [54, 53, 54, 56, 56], 'party': ['Dewgong', 'Cloyster', 'Slowbro', 'Jynx', 'Lapras'], + 'party_address': 'Trainer_Party_Lorelei_A'},], + "Indigo Plateau Agatha's Room": [ + {'level': [56, 56, 55, 58, 60], 'party': ['Gengar', 'Golbat', 'Haunter', 'Arbok', 'Gengar'], + 'party_address': 'Trainer_Party_Agatha_A'},], + "Indigo Plateau Lance's Room": [ + {'level': [58, 56, 56, 60, 62], 'party': ['Gyarados', 'Dragonair', 'Dragonair', 'Aerodactyl', 'Dragonite'], + 'party_address': 'Trainer_Party_Lance_A'}], + + + 'S.S. Anne 2F': [{'level': [19, 16, 18, 20], 'party': [['Pidgeotto', 'Raticate', 'Kadabra', 'Wartortle'], ['Pidgeotto', 'Raticate', 'Kadabra', 'Ivysaur'], ['Pidgeotto', 'Raticate', 'Kadabra', 'Charmeleon']], + 'party_address': ['Trainer_Party_SS_Anne_2F_Green2_A', 'Trainer_Party_SS_Anne_2F_Green2_B', 'Trainer_Party_SS_Anne_2F_Green2_C']}], + + 'Pokemon Tower 2F': + [{'level': [25, 23, 22, 20, 25], 'party': [['Pidgeotto', 'Growlithe', 'Exeggcute', 'Kadabra', 'Wartortle'], ['Pidgeotto', 'Gyarados', 'Growlithe', 'Kadabra', 'Ivysaur'], ['Pidgeotto', 'Exeggcute', 'Gyarados', 'Kadabra', 'Charmeleon']], + 'party_address': ['Trainer_Party_Pokemon_Tower_2F_Green2_A', 'Trainer_Party_Pokemon_Tower_2F_Green2_B', 'Trainer_Party_Pokemon_Tower_2F_Green2_C']}], + + "Indigo Plateau Champion's Room": [ + {'level': [61, 59, 61, 61, 63, 65], + 'party': [['Pidgeot', 'Alakazam', 'Rhydon', 'Arcanine', 'Exeggutor', 'Blastoise'], ['Pidgeot', 'Alakazam', 'Rhydon', + 'Gyarados', 'Arcanine', 'Venusaur'],['Pidgeot', 'Alakazam', 'Rhydon', 'Exeggutor', 'Gyarados', 'Charizard']], + 'party_address': ['Trainer_Party_Indigo_Plateau_Green3_A', 'Trainer_Party_Indigo_Plateau_Green3_B', 'Trainer_Party_Indigo_Plateau_Green3_C']}], + + + 'Pokemon Tower 3F': [ + {'level': 23, 'party': ['Gastly'], 'party_address': 'Trainer_Party_Pokemon_Tower_3F_Channeler_A'}, + {'level': 24, 'party': ['Gastly'], 'party_address': 'Trainer_Party_Pokemon_Tower_3F_Channeler_B'}, + {'level': 22, 'party': ['Gastly'], 'party_address': 'Trainer_Party_Pokemon_Tower_3F_Channeler_D'}], + 'Pokemon Tower 4F': [ + {'level': 24, 'party': ['Gastly'], 'party_address': 'Trainer_Party_Pokemon_Tower_4F_Channeler_A'}, + {'level': 23, 'party': ['Gastly', 'Gastly'], 'party_address': 'Trainer_Party_Pokemon_Tower_4F_Channeler_B'}, + {'level': 22, 'party': ['Gastly'], 'party_address': 'Trainer_Party_Pokemon_Tower_4F_Channeler_D'}], + 'Pokemon Tower 5F': [ + {'level': 23, 'party': ['Haunter'], 'party_address': 'Trainer_Party_Pokemon_Tower_5F_Channeler_A'}, + {'level': 22, 'party': ['Gastly'], 'party_address': 'Trainer_Party_Pokemon_Tower_5F_Channeler_C'}, + {'level': 24, 'party': ['Gastly'], 'party_address': 'Trainer_Party_Pokemon_Tower_5F_Channeler_D'}, + {'level': 22, 'party': ['Haunter'], 'party_address': 'Trainer_Party_Pokemon_Tower_5F_Channeler_E'}], + 'Pokemon Tower 6F': [{'level': 22, 'party': ['Gastly', 'Gastly', 'Gastly'], + 'party_address': 'Trainer_Party_Pokemon_Tower_6F_Channeler_A'}, + {'level': 24, 'party': ['Gastly'], + 'party_address': 'Trainer_Party_Pokemon_Tower_6F_Channeler_B'}, + {'level': 24, 'party': ['Gastly'], + 'party_address': 'Trainer_Party_Pokemon_Tower_6F_Channeler_C'}]} + +level_object_list = [(loc.name, loc.level) for loc in location_data if (loc.type == "Wild Encounter" or "Pokemon" in loc.type) and loc.level is not None] + +for region in trainer_data: + party_loc = LocationData(region, "Trainer Parties", "Trainer Parties", event=True, type="Trainer Parties") + party_loc.party_data = trainer_data[region] + for trainer in party_loc.party_data: + if isinstance(trainer["level"], int): + level_object_list.append(((trainer["party_address"][0] if isinstance(trainer["party_address"], list) + else trainer["party_address"], 0), trainer["level"])) + else: + for i, level in enumerate(trainer["level"]): + level_object_list.append(((trainer["party_address"][0] if isinstance(trainer["party_address"], list) else trainer["party_address"], i), level)) + location_data.append(party_loc) +level_object_list.sort(key=lambda i: i[1]) +level_list = [i[1] for i in level_object_list] +level_name_list = [i[0] for i in level_object_list] + + +for mon in poke_data.evolves_from: + location_data.append(LocationData("Evolution", mon, mon, event=True)) + class PokemonRBLocation(Location): game = "Pokemon Red and Blue" - def __init__(self, player, name, address, rom_address, type): + def __init__(self, player, name, address, rom_address, type, level, level_address): super(PokemonRBLocation, self).__init__( player, name, address ) self.rom_address = rom_address self.type = type + self.level = level + self.party_data = None + self.level_address = level_address + if type == "Trainer Parties": + self.item_rule = lambda i: i.player == player and i.name == "Trainer Parties" + elif type == "Wild Encounter" or "Pokemon" in type: + self.item_rule = lambda i: (i.player == player and i.name in poke_data.pokemon_data or + " ".join(i.name.split(" ")[1:]) in poke_data.pokemon_data) diff --git a/worlds/pokemon_rb/logic.py b/worlds/pokemon_rb/logic.py index 8425bcdb..87398c72 100644 --- a/worlds/pokemon_rb/logic.py +++ b/worlds/pokemon_rb/logic.py @@ -1,86 +1,121 @@ -from ..AutoWorld import LogicMixin -import worlds.pokemon_rb.poke_data as poke_data +from . import poke_data -class PokemonLogic(LogicMixin): - def pokemon_rb_can_surf(self, player): - return (((self.has("HM03 Surf", player) and self.can_learn_hm("10000", player)) - or self.has("Flippers", player)) and (self.has("Soul Badge", player) or - self.has(self.multiworld.worlds[player].extra_badges.get("Surf"), player) - or self.multiworld.badges_needed_for_hm_moves[player].value == 0)) +def can_surf(state, player): + return (((state.has("HM03 Surf", player) and can_learn_hm(state, "Surf", player)) + or state.has("Flippers", player)) and (state.has("Soul Badge", player) or + state.has(state.multiworld.worlds[player].extra_badges.get("Surf"), player) + or state.multiworld.badges_needed_for_hm_moves[player].value == 0)) - def pokemon_rb_can_cut(self, player): - return ((self.has("HM01 Cut", player) and self.can_learn_hm("100", player) or self.has("Master Sword", player)) - and (self.has("Cascade Badge", player) or - self.has(self.multiworld.worlds[player].extra_badges.get("Cut"), player) or - self.multiworld.badges_needed_for_hm_moves[player].value == 0)) - def pokemon_rb_can_fly(self, player): - return (((self.has("HM02 Fly", player) and self.can_learn_hm("1000", player)) or self.has("Flute", player)) and - (self.has("Thunder Badge", player) or self.has(self.multiworld.worlds[player].extra_badges.get("Fly"), player) - or self.multiworld.badges_needed_for_hm_moves[player].value == 0)) +def can_cut(state, player): + return ((state.has("HM01 Cut", player) and can_learn_hm(state, "Cut", player) or state.has("Master Sword", player)) + and (state.has("Cascade Badge", player) or + state.has(state.multiworld.worlds[player].extra_badges.get("Cut"), player) or + state.multiworld.badges_needed_for_hm_moves[player].value == 0)) - def pokemon_rb_can_strength(self, player): - return ((self.has("HM04 Strength", player) and self.can_learn_hm("100000", player)) or - self.has("Titan's Mitt", player)) and (self.has("Rainbow Badge", player) or - self.has(self.multiworld.worlds[player].extra_badges.get("Strength"), player) - or self.multiworld.badges_needed_for_hm_moves[player].value == 0) - def pokemon_rb_can_flash(self, player): - return (((self.has("HM05 Flash", player) and self.can_learn_hm("1000000", player)) or self.has("Lamp", player)) - and (self.has("Boulder Badge", player) or self.has(self.multiworld.worlds[player].extra_badges.get("Flash"), - player) or self.multiworld.badges_needed_for_hm_moves[player].value == 0)) +def can_fly(state, player): + return (((state.has("HM02 Fly", player) and can_learn_hm(state, "Fly", player)) or state.has("Flute", player)) and + (state.has("Thunder Badge", player) or state.has(state.multiworld.worlds[player].extra_badges.get("Fly"), player) + or state.multiworld.badges_needed_for_hm_moves[player].value == 0)) - def can_learn_hm(self, move, player): - for pokemon, data in self.multiworld.worlds[player].local_poke_data.items(): - if self.has(pokemon, player) and data["tms"][6] & int(move, 2): - return True - return False - def pokemon_rb_can_get_hidden_items(self, player): - return self.has("Item Finder", player) or not self.multiworld.require_item_finder[player].value +def can_strength(state, player): + return ((state.has("HM04 Strength", player) and can_learn_hm(state, "Strength", player)) or + state.has("Titan's Mitt", player)) and (state.has("Rainbow Badge", player) or + state.has(state.multiworld.worlds[player].extra_badges.get("Strength"), player) + or state.multiworld.badges_needed_for_hm_moves[player].value == 0) - def pokemon_rb_cerulean_cave(self, count, player): - return len([item for item in - ["Boulder Badge", "Cascade Badge", "Thunder Badge", "Rainbow Badge", "Soul Badge", "Marsh Badge", - "Volcano Badge", "Earth Badge", "Bicycle", "Silph Scope", "Item Finder", "Super Rod", "Good Rod", - "Old Rod", "Lift Key", "Card Key", "Town Map", "Coin Case", "S.S. Ticket", "Secret Key", - "Poke Flute", "Mansion Key", "Safari Pass", "Plant Key", "Hideout Key", "HM01 Cut", "HM02 Fly", - "HM03 Surf", "HM04 Strength", "HM05 Flash"] if self.has(item, player)]) >= count - def pokemon_rb_can_pass_guards(self, player): - if self.multiworld.tea[player].value: - return self.has("Tea", player) - else: - return self.can_reach("Celadon City - Counter Man", "Location", player) +def can_flash(state, player): + return (((state.has("HM05 Flash", player) and can_learn_hm(state, "Flash", player)) or state.has("Lamp", player)) + and (state.has("Boulder Badge", player) or state.has(state.multiworld.worlds[player].extra_badges.get("Flash"), + player) or state.multiworld.badges_needed_for_hm_moves[player].value == 0)) - def pokemon_rb_has_badges(self, count, player): - return len([item for item in ["Boulder Badge", "Cascade Badge", "Thunder Badge", "Rainbow Badge", "Marsh Badge", - "Soul Badge", "Volcano Badge", "Earth Badge"] if self.has(item, player)]) >= count - def pokemon_rb_oaks_aide(self, count, player): - return ((not self.multiworld.require_pokedex[player] or self.has("Pokedex", player)) - and self.pokemon_rb_has_pokemon(count, player)) +def can_learn_hm(state, move, player): + for pokemon, data in state.multiworld.worlds[player].local_poke_data.items(): + if state.has(pokemon, player) and data["tms"][6] & 1 << (["Cut", "Fly", "Surf", "Strength", + "Flash"].index(move) + 2): + return True + return False - def pokemon_rb_has_pokemon(self, count, player): - obtained_pokemon = set() - for pokemon in poke_data.pokemon_data.keys(): - if self.has(pokemon, player) or self.has(f"Static {pokemon}", player): - obtained_pokemon.add(pokemon) - return len(obtained_pokemon) >= count +def can_get_hidden_items(state, player): + return state.has("Item Finder", player) or not state.multiworld.require_item_finder[player].value - def pokemon_rb_fossil_checks(self, count, player): - return (self.can_reach('Mt Moon 1F - Southwest Item', 'Location', player) and - self.can_reach('Cinnabar Island - Lab Scientist', 'Location', player) and len( - [item for item in ["Dome Fossil", "Helix Fossil", "Old Amber"] if self.has(item, player)]) >= count) - def pokemon_rb_cinnabar_gym(self, player): - # ensures higher level Pokémon are obtainable before Cinnabar Gym is in logic - return ((self.multiworld.old_man[player] != "vanilla") or (not self.multiworld.extra_key_items[player]) or - self.has("Mansion Key", player) or self.has("Oak's Parcel", player) or self.pokemon_rb_can_surf(player)) +def has_key_items(state, count, player): + key_items = (len([item for item in ["Bicycle", "Silph Scope", "Item Finder", "Super Rod", "Good Rod", + "Old Rod", "Lift Key", "Card Key", "Town Map", "Coin Case", "S.S. Ticket", + "Secret Key", "Poke Flute", "Mansion Key", "Safari Pass", "Plant Key", + "Hideout Key", "Card Key 2F", "Card Key 3F", "Card Key 4F", "Card Key 5F", + "Card Key 6F", "Card Key 7F", "Card Key 8F", "Card Key 9F", "Card Key 10F", + "Card Key 11F", "Exp. All", "Fire Stone", "Thunder Stone", "Water Stone", + "Leaf Stone"] if state.has(item, player)]) + + min(state.count("Progressive Card Key", player), 10)) + return key_items >= count - def pokemon_rb_dojo(self, player): - # ensures higher level Pokémon are obtainable before Fighting Dojo is in logic - return (self.pokemon_rb_can_pass_guards(player) or self.has("Oak's Parcel", player) or - self.pokemon_rb_can_surf(player)) + +def can_pass_guards(state, player): + if state.multiworld.tea[player]: + return state.has("Tea", player) + else: + return state.has("Vending Machine Drinks", player) + + +def has_badges(state, count, player): + return len([item for item in ["Boulder Badge", "Cascade Badge", "Thunder Badge", "Rainbow Badge", "Marsh Badge", + "Soul Badge", "Volcano Badge", "Earth Badge"] if state.has(item, player)]) >= count + + +def oaks_aide(state, count, player): + return ((not state.multiworld.require_pokedex[player] or state.has("Pokedex", player)) + and has_pokemon(state, count, player)) + + +def has_pokemon(state, count, player): + obtained_pokemon = set() + for pokemon in poke_data.pokemon_data.keys(): + if state.has(pokemon, player) or state.has(f"Static {pokemon}", player): + obtained_pokemon.add(pokemon) + + return len(obtained_pokemon) >= count + + +def fossil_checks(state, count, player): + return (state.can_reach('Mt Moon B2F', 'Region', player) and + state.can_reach('Cinnabar Lab Fossil Room', 'Region', player) and + state.can_reach('Cinnabar Island', 'Region', player) and len( + [item for item in ["Dome Fossil", "Helix Fossil", "Old Amber"] if state.has(item, player)]) >= count) + + +def card_key(state, floor, player): + return state.has(f"Card Key {floor}F", player) or state.has("Card Key", player) or \ + state.has("Progressive Card Key", player, floor - 1) + + +def rock_tunnel(state, player): + return can_flash(state, player) or not state.multiworld.dark_rock_tunnel_logic[player] + + +def route_3(state, player): + if state.multiworld.route_3_condition[player] == "defeat_brock": + return state.has("Defeat Brock", player) + elif state.multiworld.route_3_condition[player] == "defeat_any_gym": + return state.has_any(["Defeat Brock", "Defeat Misty", "Defeat Lt. Surge", "Defeat Erika", "Defeat Koga", + "Defeat Blaine", "Defeat Sabrina", "Defeat Viridian Gym Giovanni"], player) + elif state.multiworld.route_3_condition[player] == "boulder_badge": + return state.has("Boulder Badge", player) + elif state.multiworld.route_3_condition[player] == "any_badge": + return state.has_any(["Boulder Badge", "Cascade Badge", "Thunder Badge", "Rainbow Badge", "Marsh Badge", + "Soul Badge", "Volcano Badge", "Earth Badge"], player) + # open + return True + + +def evolve_level(state, level, player): + return len([item for item in ( + "Defeat Brock", "Defeat Misty", "Defeat Lt. Surge", "Defeat Erika", "Defeat Koga", "Defeat Blaine", + "Defeat Sabrina", "Defeat Viridian Gym Giovanni") if state.has(item, player)]) > level / 7 diff --git a/worlds/pokemon_rb/options.py b/worlds/pokemon_rb/options.py index f33cb566..4176e94f 100644 --- a/worlds/pokemon_rb/options.py +++ b/worlds/pokemon_rb/options.py @@ -1,4 +1,3 @@ - from Options import Toggle, Choice, Range, SpecialRange, TextChoice, DeathLink @@ -35,21 +34,49 @@ class Goal(Choice): default = 0 -class EliteFourCondition(Range): +class EliteFourBadgesCondition(Range): """Number of badges required to challenge the Elite Four once the Indigo Plateau has been reached. Your rival will reveal the amount needed on the first Route 22 battle (after turning in Oak's Parcel).""" - display_name = "Elite Four Condition" + display_name = "Elite Four Badges Condition" range_start = 0 range_end = 8 default = 8 +class EliteFourKeyItemsCondition(Range): + """Percentage of available key items (not counting items you can lose) required to challenge the Elite Four. Does + not count HMs. Evolution stones and Exp. All are key items in Archipelago.""" + display_name = "Elite Four Key Items Condition" + range_start = 0 + range_end = 100 + default = 0 + total = 0 + + +class EliteFourPokedexCondition(Range): + """Percentage of logically-reachable Pokemon that must be registered as "owned" in the Pokedex in order to + challenge the Elite Four.""" + display_name = "Elite Four Pokedex Condition" + range_start = 0 + range_end = 100 + default = 0 + total = 0 + + class VictoryRoadCondition(Range): - """Number of badges required to reach Victory Road.""" - display_name = "Victory Road Condition" + """Number of badges required to reach the front entrance of Victory Road.""" + display_name = "Route 23 Condition" range_start = 0 range_end = 8 - default = 8 + default = 7 + + +class Route22GateCondition(Range): + """Number of badges required to pass through the Route 22 Gate""" + display_name = "Route 22 Gate Condition" + range_start = 0 + range_end = 7 + default = 7 class ViridianGymCondition(Range): @@ -60,13 +87,40 @@ class ViridianGymCondition(Range): default = 7 -class CeruleanCaveCondition(Range): - """Number of badges, HMs, and key items (not counting items you can lose) required to access Cerulean Cave. - If extra_key_items is turned on, the number chosen will be increased by 4.""" - display_name = "Cerulean Cave Condition" +class CeruleanCaveBadgesCondition(Range): + """Number of badges needed to access the Cerulean Cave entrance in addition to the required Key Items.""" + display_name = "Cerulean Cave Badges Condition" range_start = 0 - range_end = 26 - default = 20 + range_end = 8 + default = 4 + + +class CeruleanCaveKeyItemsCondition(Range): + """Percentage of available key items (not counting items you can lose) required to access the Cerulean Cave + entrance in addition to the required badges. Does not count HMs. + Evolution stones and Exp. All are key items in Archipelago.""" + display_name = "Cerulean Cave Key Items Condition" + range_start = 0 + range_end = 100 + default = 50 + total = 0 + + +class Route3Condition(Choice): + """Set a condition to pass through from Pewter City to Route 3.""" + display_name = "Route 3 Condition" + option_open = 0 + option_defeat_brock = 1 + option_defeat_any_gym = 2 + option_boulder_badge = 3 + option_any_badge = 4 + default = 1 + + +class RobbedHouseOfficer(Toggle): + """You can disable to remove the requirement to help Bill before you can enter the robbed house in Cerulean City.""" + display_name = "Robbed House Officer" + default = 1 class SecondFossilCheckCondition(Range): @@ -78,6 +132,18 @@ class SecondFossilCheckCondition(Range): default = 3 +class FossilCheckItemTypes(Choice): + """The two fossil checks always contain items for your own game. Here, you can choose what types of items can + appear. Key Items means only advancement items can appear. Unique means key items or TMs may appear. No Key Items + means no advancement items may appear.""" + display_name = "Fossil Check Item Types" + option_any = 0 + option_key_items = 1 + option_unique_items = 2 + option_no_key_items = 3 + default = 0 + + class BadgeSanity(Toggle): """Shuffle gym badges into the general item pool. If turned off, badges will be shuffled across the 8 gyms.""" display_name = "Badgesanity" @@ -108,8 +174,18 @@ class OldMan(Choice): default = 1 +class ExpAll(Choice): + """Choose how the Exp. All item is handled. It can be removed entirely, shuffled into the item pool, or you can + start with it.""" + display_name = "Exp. All" + option_remove = 0 + option_randomize = 1 + option_start_with = 2 + default = 1 + + class RandomizePokedex(Choice): - """Randomize the location of the Pokedex, or start with it. It is required to receive items from Oak's Aides.""" + """Randomize the location of the Pokedex, or start with it.""" display_name = "Randomize Pokedex" option_vanilla = 0 option_randomize = 1 @@ -117,6 +193,14 @@ class RandomizePokedex(Choice): default = 0 +class KeyItemsOnly(Toggle): + """Shuffle only Key Items. This overrides Randomize Hidden Items, Trainersanity, and Dexsanity. + Sets all non-excluded locations in your game to Priority Locations. + May have high generation failure rates for solo games or small multiworlds, especially with Door Shuffle.""" + display_name = "Key Items Only" + default = 0 + + class Tea(Toggle): """Adds a Tea item to the item pool which the Saffron guards require instead of the vending machine drinks. Adds a location check to the Celadon Mansion 1F, where Tea is acquired in FireRed and LeafGreen.""" @@ -131,6 +215,24 @@ class ExtraKeyItems(Toggle): default = 0 +class SplitCardKey(Choice): + """Splits the Card Key item into 10 different Keys, one for each Silph Co floor 2F through 11F. + Adds location checks to 9 NPCs in Silph Co. + With Progressive, you will always obtain the keys in order from 2F to 11F.""" + display_name = "Split Card Key" + option_off = 0 + option_on = 1 + option_progressive = 2 + default = 0 + + +class AllElevatorsLocked(Toggle): + """Adds requirements to the Celadon Department Store elevator and Silph Co elevators to have the Lift Key. + No logical implications normally, but may have a significant impact on Insanity Door Shuffle.""" + display_name = "All Elevators Locked" + default = 1 + + class ExtraStrengthBoulders(Toggle): """Adds Strength Boulders blocking the Route 11 gate, and in Route 13 (can be bypassed with Surf). This potentially increases the usefulness of Strength as well as the Bicycle.""" @@ -177,42 +279,95 @@ class RequirePokedex(Toggle): class AllPokemonSeen(Toggle): """Start with all Pokemon "seen" in your Pokedex. This allows you to see where Pokemon can be encountered in the - wild. Pokemon found by fishing or in the Cerulean Cave are not displayed.""" + wild. Pokemon found by fishing or in the Cerulean Cave are not displayed. + The Pokedex also shows which HMs can be learned by Pokemon registered as seen.""" default = 0 display_name = "All Pokemon Seen" -class DexSanity(Toggle): - """Adds a location check for each Pokemon flagged "Owned" on your Pokedex. If accessibility is set to `locations` - and randomize_wild_pokemon is off, catch_em_all is not `all_pokemon` or randomize_legendary_pokemon is not `any`, - accessibility will be forced to `items` instead, as not all Dexsanity locations can be guaranteed to be considered - reachable in logic. +class DexSanity(SpecialRange): + """Adds location checks for Pokemon flagged "owned" on your Pokedex. You may specify a percentage of Pokemon to + have checks added. If Accessibility is set to locations, this will be the percentage of all logically reachable + Pokemon that will get a location check added to it. With items or minimal Accessibility, it will be the percentage + of all 151 Pokemon. If Pokedex is required, the items for Pokemon acquired before acquiring the Pokedex can be found by talking to Professor Oak or evaluating the Pokedex via Oak's PC.""" display_name = "Dexsanity" default = 0 + range_start = 0 + range_end = 100 + special_range_names = { + "false": 0, + "true": 100 + } class FreeFlyLocation(Toggle): - """One random fly destination will be unlocked by default.""" + """One random Fly destination will be unlocked by default.""" display_name = "Free Fly Location" default = 1 +class TownMapFlyLocation(Toggle): + """One random Fly destination will be unlocked when you obtain the Town Map.""" + display_name = "Town Map Fly Location" + default = 0 + + +class DoorShuffle(Choice): + """Simple: entrances are randomized together in groups: Pokemarts, Gyms, single exit dungeons, dual exit dungeons, + single exit misc interiors, dual exit misc interiors are all shuffled separately. Safari Zone is not shuffled. + Full: Any outdoor entrance may lead to any interior. + Insanity: All rooms in the game are shuffled.""" + display_name = "Door Shuffle" + option_off = 0 + option_simple = 1 + option_full = 2 + option_insanity = 3 + # Disabled for now, has issues with elevators that need to be resolved + # option_decoupled = 4 + default = 0 + + # remove assertions that blow up checks for decoupled + def __eq__(self, other): + if isinstance(other, self.__class__): + return other.value == self.value + elif isinstance(other, str): + return other == self.current_key + elif isinstance(other, int): + return other == self.value + elif isinstance(other, bool): + return other == bool(self.value) + else: + raise TypeError(f"Can't compare {self.__class__.__name__} with {other.__class__.__name__}") + + +class WarpTileShuffle(Toggle): + """Shuffle the warp tiles in Silph Co and Sabrina's Gym among themselves, separately. + On Insanity, turning this off means they are mixed into the general door shuffle instead of only being shuffled + among themselves.""" + display_name = "Warp Tile Shuffle" + default = 0 + + class RandomizeRockTunnel(Toggle): - """Randomize the layout of Rock Tunnel. This is highly experimental, if you encounter any issues (items or trainers - unreachable, trainers walking over walls, inability to reach end of tunnel, anything looking strange) to - Alchav#8826 in the Archipelago Discord (directly or in #pkmn-red-blue) along with the seed number found on the - signs outside the tunnel.""" + """Randomize the layout of Rock Tunnel. + If Insanity Door Shuffle is on, this will cause only the main entrances to Rock Tunnel to be shuffled.""" display_name = "Randomize Rock Tunnel" default = 0 +class DarkRockTunnelLogic(Toggle): + """Logically require Flash to traverse the Rock Tunnel, so you are never forced to traverse it in the dark.""" + display_name = "Dark Rock Tunnel Logic" + default = 1 + + class OaksAidRt2(Range): """Number of Pokemon registered in the Pokedex required to receive the item from Oak's Aide on Route 2. Vanilla is 10.""" display_name = "Oak's Aide Route 2" - range_start = 0 + range_start = 1 range_end = 80 default = 10 @@ -221,7 +376,7 @@ class OaksAidRt11(Range): """Number of Pokemon registered in the Pokedex required to receive the item from Oak's Aide on Route 11. Vanilla is 30.""" display_name = "Oak's Aide Route 11" - range_start = 0 + range_start = 1 range_end = 80 default = 20 @@ -230,17 +385,39 @@ class OaksAidRt15(Range): """Number of Pokemon registered in the Pokedex required to receive the item from Oak's Aide on Route 15. Vanilla is 50.""" display_name = "Oak's Aide Route 15" - range_start = 0 + range_start = 1 range_end = 80 default = 30 +class Stonesanity(Toggle): + """Removes the four evolution stones from the Celadon Department Store and replaces four of the five Moon Stones + in the item pool with the four shop stones. If randomize_hidden_items is off, this will cause the two hidden + Moon Stone locations to be randomized anyway. These are in Pokemon Mansion 1F and Mt Moon B2F.""" + display_name = "Stonesanity" + default = 0 + + +class LevelScaling(Choice): + """Off: Encounters use vanilla game levels. + By Spheres: Levels are scaled by access sphere. Areas reachable in later spheres will have higher levels. + Spheres and Distance: Levels are scaled by access spheres as well as distance from Pallet Town, measured by number + of internal region connections. This is a much more severe curving of levels and may lead to much less variation in + levels found in a particular map. However, it may make the higher door shuffle settings significantly more bearable, + as these options more often result in a smaller number of larger access spheres.""" + display_name = "Level Scaling" + option_off = 0 + option_by_spheres = 1 + option_by_spheres_and_distance = 2 + default = 1 + + class ExpModifier(SpecialRange): """Modifier for EXP gained. When specifying a number, exp is multiplied by this amount and divided by 16.""" display_name = "Exp Modifier" - range_start = 0 - range_end = 255 default = 16 + range_start = default / 4 + range_end = 255 special_range_names = { "half": default / 2, "normal": default, @@ -351,7 +528,7 @@ class MinimumStepsBetweenEncounters(Range): """Minimum number of steps between wild Pokemon encounters.""" display_name = "Minimum Steps Between Encounters" default = 3 - range_start = 0 + range_start = 1 range_end = 255 @@ -387,6 +564,14 @@ class MoveBalancing(Toggle): default = 0 +class FixCombatBugs(Toggle): + """Fixes a variety of combat-related bugs. Note that this fixes the Focus Energy bug. The Focus Energy bug causes + critical strike chances to be doubled when Focus Energy has not been used and halved when it is used. + Fixing this bug means critical strike chances outside the use of Focus Energy are quartered from the vanilla rate.""" + display_name = "Fix Combat Bugs" + default = 1 + + class RandomizePokemonMovesets(Choice): """Randomize the moves learned by Pokemon. prefer_types will prefer moves that match the type of the Pokemon.""" display_name = "Randomize Pokemon Movesets" @@ -402,6 +587,7 @@ class ConfineTranstormToDitto(Toggle): display_name = "Confine Transform to Ditto" default = 1 + class StartWithFourMoves(Toggle): """If movesets are randomized, this will give all Pokemon 4 starting moves.""" display_name = "Start With Four Moves" @@ -483,6 +669,12 @@ class RandomizePokemonTypes(Choice): default = 0 +class RandomizeMoveTypes(Toggle): + """Randomize the types of each move.""" + display_name = "Randomize Move Types" + default = 0 + + class SecondaryTypeChance(SpecialRange): """If randomize_pokemon_types is on, this is the chance each Pokemon will have a secondary type. If follow_evolutions is selected, it is the chance a second type will be added at each evolution stage. vanilla will give secondary types @@ -511,7 +703,7 @@ class RandomizeTypeChart(Choice): class NormalMatchups(Range): - """If 'randomize' is chosen for randomize_type_chart, this will be the weight for neutral matchups. + """If 'randomize' is chosen for Randomize Type Chart, this will be the weight for neutral matchups. No effect if 'chaos' is chosen""" display_name = "Normal Matchups" default = 143 @@ -520,7 +712,7 @@ class NormalMatchups(Range): class SuperEffectiveMatchups(Range): - """If 'randomize' is chosen for randomize_type_chart, this will be the weight for super effective matchups. + """If 'randomize' is chosen for Randomize Type Chart, this will be the weight for super effective matchups. No effect if 'chaos' is chosen""" display_name = "Super Effective Matchups" default = 38 @@ -529,7 +721,7 @@ class SuperEffectiveMatchups(Range): class NotVeryEffectiveMatchups(Range): - """If 'randomize' is chosen for randomize_type_chart, this will be the weight for not very effective matchups. + """If 'randomize' is chosen for Randomize Type Chart, this will be the weight for not very effective matchups. No effect if 'chaos' is chosen""" display_name = "Not Very Effective Matchups" default = 38 @@ -538,7 +730,7 @@ class NotVeryEffectiveMatchups(Range): class ImmunityMatchups(Range): - """If 'randomize' is chosen for randomize_type_chart, this will be the exact number of immunities. + """If 'randomize' is chosen for Randomize Type Chart, this will be the exact number of immunities. No effect if 'chaos' is chosen""" display_name = "Immunity Matchups" default = 6 @@ -547,7 +739,7 @@ class ImmunityMatchups(Range): class SafariZoneNormalBattles(Toggle): - """Change the Safari Zone to have standard wild pokemon battles.""" + """Change the Safari Zone to have standard wild Pokemon battles.""" display_name = "Safari Zone Normal Battles" default = 0 @@ -576,7 +768,7 @@ class BetterShops(Choice): class MasterBallPrice(Range): - """Price for Master Balls. Can only be bought if better_shops is set to add_master_ball, but this will affect the + """Price for Master Balls. Can only be bought if Better Shops is set to Add Master Ball, but this will affect the sell price regardless. Vanilla is 0""" display_name = "Master Ball Price" range_end = 999999 @@ -628,12 +820,33 @@ class ParalyzeTrapWeight(TrapWeight): display_name = "Paralyze Trap Weight" +class SleepTrapWeight(TrapWeight): + """Weights for Sleep Traps. These apply the Sleep status to all your party members, for randomly between 1 and 7 turns.""" + display_name = "Sleep Trap Weight" + + class IceTrapWeight(TrapWeight): """Weights for Ice Traps. These apply the Ice status to all your party members. Don't forget to buy Ice Heals!""" display_name = "Ice Trap Weight" default = 0 +class PokeDollSkip(Choice): + """Patch out the Pokemon Tower Poke Doll skip or have this skip considered in logic.""" + display_name = "Poke Doll Skip" + option_patched = 0 + option_in_logic = 1 + default = 0 + + +class BicycleGateSkips(Choice): + """Patch out the Route 16/18 Bicycle Gate skips or have these skips considered in logic.""" + display_name = "Bicycle Gate Skips" + option_patched = 0 + option_in_logic = 1 + default = 0 + + class RandomizePokemonPalettes(Choice): """Modify palettes of Pokemon. Primary Type will set Pokemons' palettes based on their primary type, Follow Evolutions will randomize palettes but palettes will remain the same through evolutions (except Eeveelutions), @@ -650,32 +863,49 @@ pokemon_rb_options = { "trainer_name": TrainerName, "rival_name": RivalName, #"goal": Goal, - "elite_four_condition": EliteFourCondition, + "elite_four_badges_condition": EliteFourBadgesCondition, + "elite_four_key_items_condition": EliteFourKeyItemsCondition, + "elite_four_pokedex_condition": EliteFourPokedexCondition, "victory_road_condition": VictoryRoadCondition, + "route_22_gate_condition": Route22GateCondition, "viridian_gym_condition": ViridianGymCondition, - "cerulean_cave_condition": CeruleanCaveCondition, + "cerulean_cave_badges_condition": CeruleanCaveBadgesCondition, + "cerulean_cave_key_items_condition": CeruleanCaveKeyItemsCondition, + "route_3_condition": Route3Condition, + "robbed_house_officer": RobbedHouseOfficer, "second_fossil_check_condition": SecondFossilCheckCondition, - "badgesanity": BadgeSanity, + "fossil_check_item_types": FossilCheckItemTypes, + "exp_all": ExpAll, "old_man": OldMan, - "randomize_pokedex": RandomizePokedex, + "badgesanity": BadgeSanity, + "badges_needed_for_hm_moves": BadgesNeededForHMMoves, + "key_items_only": KeyItemsOnly, "tea": Tea, "extra_key_items": ExtraKeyItems, + "split_card_key": SplitCardKey, + "all_elevators_locked": AllElevatorsLocked, "extra_strength_boulders": ExtraStrengthBoulders, "require_item_finder": RequireItemFinder, "randomize_hidden_items": RandomizeHiddenItems, "prizesanity": PrizeSanity, "trainersanity": TrainerSanity, + "dexsanity": DexSanity, + "randomize_pokedex": RandomizePokedex, "require_pokedex": RequirePokedex, "all_pokemon_seen": AllPokemonSeen, - "dexsanity": DexSanity, "oaks_aide_rt_2": OaksAidRt2, "oaks_aide_rt_11": OaksAidRt11, "oaks_aide_rt_15": OaksAidRt15, - "badges_needed_for_hm_moves": BadgesNeededForHMMoves, - "free_fly_location": FreeFlyLocation, + "stonesanity": Stonesanity, + "door_shuffle": DoorShuffle, + "warp_tile_shuffle": WarpTileShuffle, "randomize_rock_tunnel": RandomizeRockTunnel, + "dark_rock_tunnel_logic": DarkRockTunnelLogic, + "free_fly_location": FreeFlyLocation, + "town_map_fly_location": TownMapFlyLocation, "blind_trainers": BlindTrainers, "minimum_steps_between_encounters": MinimumStepsBetweenEncounters, + "level_scaling": LevelScaling, "exp_modifier": ExpModifier, "randomize_wild_pokemon": RandomizeWildPokemon, "area_1_to_1_mapping": Area1To1Mapping, @@ -689,6 +919,7 @@ pokemon_rb_options = { "randomize_trainer_parties": RandomizeTrainerParties, "trainer_legendaries": TrainerLegendaries, "move_balancing": MoveBalancing, + "fix_combat_bugs": FixCombatBugs, "randomize_pokemon_movesets": RandomizePokemonMovesets, "confine_transform_to_ditto": ConfineTranstormToDitto, "start_with_four_moves": StartWithFourMoves, @@ -701,6 +932,7 @@ pokemon_rb_options = { "hm_normal_type_compatibility": HMNormalTypeCompatibility, "hm_other_type_compatibility": HMOtherTypeCompatibility, "inherit_tm_hm_compatibility": InheritTMHMCompatibility, + "randomize_move_types": RandomizeMoveTypes, "randomize_pokemon_types": RandomizePokemonTypes, "secondary_type_chance": SecondaryTypeChance, "randomize_type_chart": RandomizeTypeChart, @@ -715,11 +947,14 @@ pokemon_rb_options = { "master_ball_price": MasterBallPrice, "starting_money": StartingMoney, "lose_money_on_blackout": LoseMoneyOnBlackout, + "poke_doll_skip": PokeDollSkip, + "bicycle_gate_skips": BicycleGateSkips, "trap_percentage": TrapPercentage, "poison_trap_weight": PoisonTrapWeight, "fire_trap_weight": FireTrapWeight, "paralyze_trap_weight": ParalyzeTrapWeight, + "sleep_trap_weight": SleepTrapWeight, "ice_trap_weight": IceTrapWeight, "randomize_pokemon_palettes": RandomizePokemonPalettes, "death_link": DeathLink -} +} \ No newline at end of file diff --git a/worlds/pokemon_rb/poke_data.py b/worlds/pokemon_rb/poke_data.py index 6218c70a..cab835f6 100644 --- a/worlds/pokemon_rb/poke_data.py +++ b/worlds/pokemon_rb/poke_data.py @@ -1204,28 +1204,17 @@ tm_moves = [ 'Selfdestruct', 'Egg Bomb', 'Fire Blast', 'Swift', 'Skull Bash', 'Softboiled', 'Dream Eater', 'Sky Attack', 'Rest', 'Thunder Wave', 'Psywave', 'Explosion', 'Rock Slide', 'Tri Attack', 'Substitute' ] -#['No Move', 'Pound', 'Karate Chop', 'Doubleslap', 'Comet Punch', 'Fire Punch', 'Ice Punch', 'Thunderpunch', 'Scratch', -# 'Vicegrip', 'Guillotine', 'Cut', 'Gust', 'Wing Attack', 'Fly', 'Bind', 'Slam', 'Vine Whip', 'Stomp', 'Double Kick', 'Jump Kick', -# 'Rolling Kick', 'Sand Attack', 'Headbutt', 'Horn Attack', 'Fury Attack', 'Tackle', 'Wrap', 'Thrash', 'Tail Whip', 'Poison Sting', -# 'Twineedle', 'Pin Missile', 'Leer', 'Bite', 'Growl', 'Roar', 'Sing', 'Supersonic', 'Sonicboom', 'Disable', 'Acid', 'Ember', 'Flamethrower', -# 'Mist', 'Hydro Pump', 'Surf', 'Psybeam', 'Aurora Beam', 'Peck', 'Drill Peck', 'Low Kick', 'Strength', 'Absorb', 'Leech Seed', 'Growth', -# 'Razor Leaf', 'Poisonpowder', 'Stun Spore', 'Sleep Powder', 'Petal Dance', 'String Shot', 'Fire Spin', 'Thundershock', 'Rock Throw', 'Confusion', -# 'Hypnosis', 'Meditate', 'Agility', 'Quick Attack', 'Night Shade', 'Screech', 'Recover', 'Harden', 'Minimize', 'Smokescreen', 'Confuse Ray', 'Withdraw', -# 'Defense Curl', 'Barrier', 'Light Screen', 'Haze', 'Focus Energy', 'Mirror Move', 'Lick', 'Smog', 'Sludge', 'Bone Club', 'Waterfall', 'Clamp', 'Spike Cannon', -# 'Constrict', 'Amnesia', 'Kinesis', 'Hi Jump Kick', 'Glare', 'Poison Gas', 'Barrage', 'Leech Life', 'Lovely Kiss', 'Transform', 'Bubble', 'Dizzy Punch', 'Spore', 'Flash', -# 'Splash', 'Acid Armor', 'Crabhammer', 'Fury Swipes', 'Bonemerang', 'Hyper Fang', 'Sharpen', 'Conversion', 'Super Fang', 'Slash'] -# print([i for i in list(moves.keys()) if i not in tm_moves]) -# filler_moves = [ -# "Razor Wind", "Whirlwind", "Counter", "Teleport", "Bide", "Skull Bash", "Sky Attack", "Psywave", -# "Pound", "Karate Chop", "Doubleslap", "Comet Punch", "Scratch", "Vicegrip", "Gust", "Wing Attack", "Bind", -# "Vine Whip", "Sand Attack", "Fury Attack", "Tackle", "Wrap", "Tail Whip", "Poison Sting", "Twineedle", -# "Leer", "Growl", "Roar", "Sing", "Supersonic", "Sonicboom", "Disable", "Acid", "Ember", "Mist", "Peck", "Absorb", -# "Growth", "Poisonpowder", "String Shot", "Meditate", "Agility", "Screech", "Double Team", "Harden", "Minimize", -# "Smokescreen", "Confuse Ray", "Withdraw", "Defense Curl", "Barrier", "Light Screen", "Haze", "Reflect", -# "Focus Energy", "Lick", "Smog", "Clamp", "Spike Cannon", "Constrict" -# -# ] +evolution_levels = { + 'Bulbasaur': 16, 'Ivysaur': 32, 'Charmander': 16, 'Charmeleon': 36, 'Squirtle': 16, 'Wartortle': 36, 'Caterpie': 7, + 'Metapod': 10, 'Weedle': 7, 'Kakuna': 10, 'Pidgey': 18, 'Pidgeotto': 36, 'Rattata': 20, 'Spearow': 20, 'Ekans': 22, + 'Sandshrew': 22, 'Nidoran F': 16, 'Nidoran M': 16, 'Zubat': 22, 'Oddish': 21, 'Paras': 24, 'Venonat': 31, + 'Diglett': 26, 'Meowth': 28, 'Psyduck': 33, 'Mankey': 28, 'Poliwag': 25, 'Abra': 16, 'Kadabra': 35, 'Machop': 28, + 'Machoke': 35, 'Bellsprout': 21, 'Tentacool': 30, 'Geodude': 25, 'Graveler': 35, 'Ponyta': 40, 'Slowpoke': 37, + 'Magnemite': 30, 'Doduo': 31, 'Seel': 34, 'Grimer': 38, 'Gastly': 25, 'Haunter': 35, 'Drowzee': 26, 'Krabby': 28, + 'Voltorb': 30, 'Cubone': 28, 'Koffing': 35, 'Rhyhorn': 42, 'Horsea': 32, 'Goldeen': 33, 'Magikarp': 33, + 'Omanyte': 40, 'Kabuto': 40, 'Dratini': 30, 'Dragonair': 55 +} first_stage_pokemon = [pokemon for pokemon in pokemon_data.keys() if pokemon not in evolves_from] diff --git a/worlds/pokemon_rb/pokemon.py b/worlds/pokemon_rb/pokemon.py new file mode 100644 index 00000000..267f424c --- /dev/null +++ b/worlds/pokemon_rb/pokemon.py @@ -0,0 +1,348 @@ +from copy import deepcopy +from . import poke_data +from .rom_addresses import rom_addresses + + +def set_mon_palettes(self, random, data): + if self.multiworld.randomize_pokemon_palettes[self.player] == "vanilla": + return + pallet_map = { + "Poison": 0x0F, + "Normal": 0x10, + "Ice": 0x11, + "Fire": 0x12, + "Water": 0x13, + "Ghost": 0x14, + "Ground": 0x15, + "Grass": 0x16, + "Psychic": 0x17, + "Electric": 0x18, + "Rock": 0x19, + "Dragon": 0x1F, + "Flying": 0x20, + "Fighting": 0x21, + "Bug": 0x22 + } + palettes = [] + for mon in poke_data.pokemon_data: + if self.multiworld.randomize_pokemon_palettes[self.player] == "primary_type": + pallet = pallet_map[self.local_poke_data[mon]["type1"]] + elif (self.multiworld.randomize_pokemon_palettes[self.player] == "follow_evolutions" and mon in + poke_data.evolves_from and poke_data.evolves_from[mon] != "Eevee"): + pallet = palettes[-1] + else: # completely_random or follow_evolutions and it is not an evolved form (except eeveelutions) + pallet = random.choice(list(pallet_map.values())) + palettes.append(pallet) + address = rom_addresses["Mon_Palettes"] + for pallet in palettes: + data[address] = pallet + address += 1 + + +def choose_forced_type(chances, random): + n = random.randint(1, 100) + for chance in chances: + if chance[0] >= n: + return chance[1] + return None + + +def filter_moves(local_move_data, moves, type, random): + ret = [] + for move in moves: + if local_move_data[move]["type"] == type or type is None: + ret.append(move) + random.shuffle(ret) + return ret + + +def get_move(local_move_data, moves, chances, random, starting_move=False): + type = choose_forced_type(chances, random) + filtered_moves = filter_moves(local_move_data, moves, type, random) + for move in filtered_moves: + if (not starting_move) or (local_move_data[move]["accuracy"] > 80 and local_move_data[move]["power"] > 0): + moves.remove(move) + return move + else: + return get_move(local_move_data, moves, [], random, starting_move) + + +def move_power(move_data): + power = move_data["power"] + if move_data["effect"] in (29, 42): + # 29: two-to-five attacks. 42: trapping effect, two-to-five turns. + power *= 3 + elif move_data["effect"] in (77, 44): + # 77: Twineedle. Two attacks and poison chance. 44: Just two attacks + power *= 2 + elif move_data["effect"] == 48: + # 25% recoil damage taken. Reduce power considered by that amount + power *= 0.75 + elif move_data["effect"] == 3: + # 50% absorb. Increase power considered by that amount + power *= 1.5 + elif move_data["effect"] == 39 and move_data["id"] != 91: + # Takes two turns while vulnerable. Dig uses this effect ID but is semi-invulnerable + power *= 0.66 + elif move_data["effect"] == 7: + # Faint user + power *= 0.5 + elif move_data["id"] in (2, 75, 152, 163,): + # High critical strike moves: Karate Chop, Razor Leaf, Crabhammer, Slash + power *= 2 + return power + + +def process_move_data(self): + self.local_move_data = deepcopy(poke_data.moves) + + if self.multiworld.randomize_move_types[self.player]: + for move, data in self.local_move_data.items(): + if move == "No Move": + continue + # The chance of randomized moves choosing a normal type move is high, so we want to retain having a higher + # rate of normal type moves + data["type"] = self.multiworld.random.choice(list(poke_data.type_ids) + (["Normal"] * 4)) + + if self.multiworld.move_balancing[self.player]: + self.local_move_data["Sing"]["accuracy"] = 30 + self.local_move_data["Sleep Powder"]["accuracy"] = 40 + self.local_move_data["Spore"]["accuracy"] = 50 + self.local_move_data["Sonicboom"]["effect"] = 0 + self.local_move_data["Sonicboom"]["power"] = 50 + self.local_move_data["Dragon Rage"]["effect"] = 0 + self.local_move_data["Dragon Rage"]["power"] = 80 + self.local_move_data["Horn Drill"]["effect"] = 0 + self.local_move_data["Horn Drill"]["power"] = 70 + self.local_move_data["Horn Drill"]["accuracy"] = 90 + self.local_move_data["Guillotine"]["effect"] = 0 + self.local_move_data["Guillotine"]["power"] = 70 + self.local_move_data["Guillotine"]["accuracy"] = 90 + self.local_move_data["Fissure"]["effect"] = 0 + self.local_move_data["Fissure"]["power"] = 70 + self.local_move_data["Fissure"]["accuracy"] = 90 + self.local_move_data["Blizzard"]["accuracy"] = 70 + if self.multiworld.randomize_tm_moves[self.player]: + self.local_tms = self.multiworld.random.sample([move for move in poke_data.moves.keys() if move not in + ["No Move"] + poke_data.hm_moves], 50) + else: + self.local_tms = poke_data.tm_moves.copy() + + +def process_pokemon_data(self): + + local_poke_data = deepcopy(poke_data.pokemon_data) + learnsets = deepcopy(poke_data.learnsets) + tms_hms = self.local_tms + poke_data.hm_moves + + + compat_hms = set() + + for mon, mon_data in local_poke_data.items(): + if self.multiworld.randomize_pokemon_stats[self.player] == "shuffle": + stats = [mon_data["hp"], mon_data["atk"], mon_data["def"], mon_data["spd"], mon_data["spc"]] + if mon in poke_data.evolves_from: + stat_shuffle_map = local_poke_data[poke_data.evolves_from[mon]]["stat_shuffle_map"] + else: + stat_shuffle_map = self.multiworld.random.sample(range(0, 5), 5) + + mon_data["stat_shuffle_map"] = stat_shuffle_map + mon_data["hp"] = stats[stat_shuffle_map[0]] + mon_data["atk"] = stats[stat_shuffle_map[1]] + mon_data["def"] = stats[stat_shuffle_map[2]] + mon_data["spd"] = stats[stat_shuffle_map[3]] + mon_data["spc"] = stats[stat_shuffle_map[4]] + elif self.multiworld.randomize_pokemon_stats[self.player] == "randomize": + first_run = True + while (mon_data["hp"] > 255 or mon_data["atk"] > 255 or mon_data["def"] > 255 or mon_data["spd"] > 255 + or mon_data["spc"] > 255 or first_run): + first_run = False + total_stats = mon_data["hp"] + mon_data["atk"] + mon_data["def"] + mon_data["spd"] + mon_data["spc"] + for stat in ("hp", "atk", "def", "spd", "spc"): + if mon in poke_data.evolves_from: + mon_data[stat] = local_poke_data[poke_data.evolves_from[mon]][stat] + total_stats -= mon_data[stat] + elif stat == "hp": + mon_data[stat] = 20 + total_stats -= 20 + else: + mon_data[stat] = 10 + total_stats -= 10 + assert total_stats >= 0, f"Error distributing stats for {mon} for player {self.player}" + dist = [self.multiworld.random.randint(1, 101) / 100, self.multiworld.random.randint(1, 101) / 100, + self.multiworld.random.randint(1, 101) / 100, self.multiworld.random.randint(1, 101) / 100, + self.multiworld.random.randint(1, 101) / 100] + total_dist = sum(dist) + + mon_data["hp"] += int(round(dist[0] / total_dist * total_stats)) + mon_data["atk"] += int(round(dist[1] / total_dist * total_stats)) + mon_data["def"] += int(round(dist[2] / total_dist * total_stats)) + mon_data["spd"] += int(round(dist[3] / total_dist * total_stats)) + mon_data["spc"] += int(round(dist[4] / total_dist * total_stats)) + if self.multiworld.randomize_pokemon_types[self.player]: + if self.multiworld.randomize_pokemon_types[self.player].value == 1 and mon in poke_data.evolves_from: + type1 = local_poke_data[poke_data.evolves_from[mon]]["type1"] + type2 = local_poke_data[poke_data.evolves_from[mon]]["type2"] + if type1 == type2: + if self.multiworld.secondary_type_chance[self.player].value == -1: + if mon_data["type1"] != mon_data["type2"]: + while type2 == type1: + type2 = self.multiworld.random.choice(list(poke_data.type_names.values())) + elif self.multiworld.random.randint(1, 100) <= self.multiworld.secondary_type_chance[self.player].value: + type2 = self.multiworld.random.choice(list(poke_data.type_names.values())) + else: + type1 = self.multiworld.random.choice(list(poke_data.type_names.values())) + type2 = type1 + if ((self.multiworld.secondary_type_chance[self.player].value == -1 and mon_data["type1"] + != mon_data["type2"]) or self.multiworld.random.randint(1, 100) + <= self.multiworld.secondary_type_chance[self.player].value): + while type2 == type1: + type2 = self.multiworld.random.choice(list(poke_data.type_names.values())) + + mon_data["type1"] = type1 + mon_data["type2"] = type2 + if self.multiworld.randomize_pokemon_movesets[self.player]: + if self.multiworld.randomize_pokemon_movesets[self.player] == "prefer_types": + if mon_data["type1"] == "Normal" and mon_data["type2"] == "Normal": + chances = [[75, "Normal"]] + elif mon_data["type1"] == "Normal" or mon_data["type2"] == "Normal": + if mon_data["type1"] == "Normal": + second_type = mon_data["type2"] + else: + second_type = mon_data["type1"] + chances = [[30, "Normal"], [85, second_type]] + elif mon_data["type1"] == mon_data["type2"]: + chances = [[60, mon_data["type1"]], [80, "Normal"]] + else: + chances = [[50, mon_data["type1"]], [80, mon_data["type2"]], [85, "Normal"]] + else: + chances = [] + moves = list(poke_data.moves.keys()) + for move in ["No Move"] + poke_data.hm_moves: + moves.remove(move) + if self.multiworld.confine_transform_to_ditto[self.player]: + moves.remove("Transform") + if self.multiworld.start_with_four_moves[self.player]: + num_moves = 4 + else: + num_moves = len([i for i in [mon_data["start move 1"], mon_data["start move 2"], + mon_data["start move 3"], mon_data["start move 4"]] if i != "No Move"]) + if mon in learnsets: + num_moves += len(learnsets[mon]) + non_power_moves = [] + learnsets[mon] = [] + for i in range(num_moves): + if i == 0 and mon == "Ditto" and self.multiworld.confine_transform_to_ditto[self.player]: + move = "Transform" + else: + move = get_move(self.local_move_data, moves, chances, self.multiworld.random) + while move == "Transform" and self.multiworld.confine_transform_to_ditto[self.player]: + move = get_move(self.local_move_data, moves, chances, self.multiworld.random) + if self.local_move_data[move]["power"] < 5: + non_power_moves.append(move) + else: + learnsets[mon].append(move) + learnsets[mon].sort(key=lambda move: move_power(self.local_move_data[move])) + if learnsets[mon]: + for move in non_power_moves: + learnsets[mon].insert(self.multiworld.random.randint(1, len(learnsets[mon])), move) + else: + learnsets[mon] = non_power_moves + for i in range(1, 5): + if mon_data[f"start move {i}"] != "No Move" or self.multiworld.start_with_four_moves[self.player]: + mon_data[f"start move {i}"] = learnsets[mon].pop(0) + + if self.multiworld.randomize_pokemon_catch_rates[self.player]: + mon_data["catch rate"] = self.multiworld.random.randint(self.multiworld.minimum_catch_rate[self.player], + 255) + else: + mon_data["catch rate"] = max(self.multiworld.minimum_catch_rate[self.player], mon_data["catch rate"]) + + def roll_tm_compat(roll_move): + if self.local_move_data[roll_move]["type"] in [mon_data["type1"], mon_data["type2"]]: + if roll_move in poke_data.hm_moves: + if self.multiworld.hm_same_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] & 1 << (flag % 8) + r = self.multiworld.random.randint(1, 100) <= self.multiworld.hm_same_type_compatibility[self.player].value + if r and mon not in poke_data.legendary_pokemon: + compat_hms.add(roll_move) + return r + else: + if self.multiworld.tm_same_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] & 1 << (flag % 8) + return self.multiworld.random.randint(1, 100) <= self.multiworld.tm_same_type_compatibility[self.player].value + elif self.local_move_data[roll_move]["type"] == "Normal" and "Normal" not in [mon_data["type1"], mon_data["type2"]]: + if roll_move in poke_data.hm_moves: + if self.multiworld.hm_normal_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] & 1 << (flag % 8) + r = self.multiworld.random.randint(1, 100) <= self.multiworld.hm_normal_type_compatibility[self.player].value + if r and mon not in poke_data.legendary_pokemon: + compat_hms.add(roll_move) + return r + else: + if self.multiworld.tm_normal_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] & 1 << (flag % 8) + return self.multiworld.random.randint(1, 100) <= self.multiworld.tm_normal_type_compatibility[self.player].value + else: + if roll_move in poke_data.hm_moves: + if self.multiworld.hm_other_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] & 1 << (flag % 8) + r = self.multiworld.random.randint(1, 100) <= self.multiworld.hm_other_type_compatibility[self.player].value + if r and mon not in poke_data.legendary_pokemon: + compat_hms.add(roll_move) + return r + else: + if self.multiworld.tm_other_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] & 1 << (flag % 8) + return self.multiworld.random.randint(1, 100) <= self.multiworld.tm_other_type_compatibility[self.player].value + + for flag, tm_move in enumerate(tms_hms): + if mon in poke_data.evolves_from and self.multiworld.inherit_tm_hm_compatibility[self.player]: + + if local_poke_data[poke_data.evolves_from[mon]]["tms"][int(flag / 8)] & 1 << (flag % 8): + # always inherit learnable tms/hms + bit = 1 + else: + if self.local_move_data[tm_move]["type"] in [mon_data["type1"], mon_data["type2"]] and \ + self.local_move_data[tm_move]["type"] not in [ + local_poke_data[poke_data.evolves_from[mon]]["type1"], + local_poke_data[poke_data.evolves_from[mon]]["type2"]]: + # the tm/hm is for a move whose type matches current mon, but not pre-evolved form + # so this gets full chance roll + bit = roll_tm_compat(tm_move) + # otherwise 50% reduced chance to add compatibility over pre-evolved form + elif self.multiworld.random.randint(1, 100) > 50 and roll_tm_compat(tm_move): + bit = 1 + else: + bit = 0 + else: + bit = roll_tm_compat(tm_move) + if bit: + mon_data["tms"][int(flag / 8)] |= 1 << (flag % 8) + else: + mon_data["tms"][int(flag / 8)] &= ~(1 << (flag % 8)) + + hm_verify = ["Surf", "Strength"] + if self.multiworld.accessibility[self.player] == "locations" or ((not + self.multiworld.badgesanity[self.player]) and max(self.multiworld.elite_four_badges_condition[self.player], + self.multiworld.route_22_gate_condition[self.player], self.multiworld.victory_road_condition[self.player]) + > 7) or (self.multiworld.door_shuffle[self.player] not in ("off", "simple")): + hm_verify += ["Cut"] + if self.multiworld.accessibility[self.player] == "locations" or (not + self.multiworld.dark_rock_tunnel_logic[self.player]) and ((self.multiworld.trainersanity[self.player] or + self.multiworld.extra_key_items[self.player]) + or self.multiworld.door_shuffle[self.player]): + hm_verify += ["Flash"] + # Fly does not need to be verified. Full/Insanity door shuffle connects reachable regions to unreachable regions, + # so if Fly is available and can be learned, the towns you can fly to would be reachable, but if no Pokémon can + # learn it this simply would not occur + + for hm_move in hm_verify: + if hm_move not in compat_hms: + mon = self.multiworld.random.choice([mon for mon in poke_data.pokemon_data if mon not in + poke_data.legendary_pokemon]) + flag = tms_hms.index(hm_move) + local_poke_data[mon]["tms"][int(flag / 8)] |= 1 << (flag % 8) + + self.local_poke_data = local_poke_data + self.learnsets = learnsets diff --git a/worlds/pokemon_rb/regions.py b/worlds/pokemon_rb/regions.py index 98dbb3af..d82e5bb9 100644 --- a/worlds/pokemon_rb/regions.py +++ b/worlds/pokemon_rb/regions.py @@ -1,14 +1,1471 @@ - -from BaseClasses import MultiWorld, Region, Entrance, LocationProgressType +from copy import deepcopy +from BaseClasses import MultiWorld, Region, Entrance, LocationProgressType, ItemClassification +from .items import item_table, item_groups from .locations import location_data, PokemonRBLocation +from . import logic +from . import poke_data + +map_ids = { + "Pallet Town": 0x00, + "Viridian City": 0x01, + "Pewter City": 0x02, + "Cerulean City": 0x03, + "Lavender Town": 0x04, + "Vermilion City": 0x05, + "Celadon City": 0x06, + "Fuchsia City": 0x07, + "Cinnabar Island": 0x08, + "Indigo Plateau": 0x09, + "Saffron City": 0x0A, + # "Unused Map 0B": 0x0B, + "Route 1": 0x0C, + "Route 2": 0x0D, + "Route 3": 0x0E, + "Route 4": 0x0F, + "Route 5": 0x10, + "Route 6": 0x11, + "Route 7": 0x12, + "Route 8": 0x13, + "Route 9": 0x14, + "Route 10": 0x15, + "Route 11": 0x16, + "Route 12": 0x17, + "Route 13": 0x18, + "Route 14": 0x19, + "Route 15": 0x1A, + "Route 16": 0x1B, + "Route 17": 0x1C, + "Route 18": 0x1D, + "Route 19": 0x1E, + "Route 20": 0x1F, + "Route 21": 0x20, + "Route 22": 0x21, + "Route 23": 0x22, + "Route 24": 0x23, + "Route 25": 0x24, + "Player's House 1F": 0x25, + "Player's House 2F": 0x26, + "Rival's House": 0x27, + "Oak's Lab": 0x28, + "Viridian Pokemon Center": 0x29, + "Viridian Pokemart": 0x2A, + "Viridian School House": 0x2B, + "Viridian Nickname House": 0x2C, + "Viridian Gym": 0x2D, + "Diglett's Cave Route 2": 0x2E, + "Viridian Forest North Gate": 0x2F, + "Route 2 Trade House": 0x30, + "Route 2 Gate": 0x31, + "Viridian Forest South Gate": 0x32, + "Viridian Forest": 0x33, + "Pewter Museum 1F": 0x34, + "Pewter Museum 2F": 0x35, + "Pewter Gym": 0x36, + "Pewter Nidoran House": 0x37, + "Pewter Pokemart": 0x38, + "Pewter Speech House": 0x39, + "Pewter Pokemon Center": 0x3A, + "Mt Moon 1F": 0x3B, + "Mt Moon B1F": 0x3C, + "Mt Moon B2F": 0x3D, + "Cerulean Trashed House": 0x3E, + "Cerulean Trade House": 0x3F, + "Cerulean Pokemon Center": 0x40, + "Cerulean Gym": 0x41, + "Cerulean Bicycle Shop": 0x42, + "Cerulean Pokemart": 0x43, + "Route 4 Pokemon Center": 0x44, + # "Cerulean Trashed House Copy": 0x45, + "Route 5 Gate": 0x46, + "Underground Path Route 5": 0x47, + "Daycare": 0x48, + "Route 6 Gate": 0x49, + "Underground Path Route 6": 0x4A, + # "Underground Path Route 6 Copy": 0x4B, + "Route 7 Gate": 0x4C, + "Underground Path Route 7": 0x4D, + # "Underground Path Route 7 Copy": 0x4E, + "Route 8 Gate": 0x4F, + "Underground Path Route 8": 0x50, + "Rock Tunnel Pokemon Center": 0x51, + "Rock Tunnel 1F": 0x52, + "Power Plant": 0x53, + "Route 11 Gate 1F": 0x54, + "Diglett's Cave Route 11": 0x55, + "Route 11 Gate 2F": 0x56, + "Route 12 Gate 1F": 0x57, + "Bill's House": 0x58, + "Vermilion Pokemon Center": 0x59, + "Vermilion Pokemon Fan Club": 0x5A, + "Vermilion Pokemart": 0x5B, + "Vermilion Gym": 0x5C, + "Vermilion Pidgey House": 0x5D, + "Vermilion Dock": 0x5E, + "S.S. Anne 1F": 0x5F, + "S.S. Anne 2F": 0x60, + "S.S. Anne 3F": 0x61, + "S.S. Anne B1F": 0x62, + "S.S. Anne Bow": 0x63, + "S.S. Anne Kitchen": 0x64, + "S.S. Anne Captain's Room": 0x65, + "S.S. Anne 1F Rooms": 0x66, + "S.S. Anne 2F Rooms": 0x67, + "S.S. Anne B1F Rooms": 0x68, + # "Unused Map 69": 0x69, + # "Unused Map 6A": 0x6A, + # "Unused Map 6B": 0x6B, + "Victory Road 1F": 0x6C, + # "Unused Map 6D": 0x6D, + # "Unused Map 6E": 0x6E, + # "Unused Map 6F": 0x6F, + # "Unused Map 70": 0x70, + "Indigo Plateau Lance's Room": 0x71, + # "Unused Map 72": 0x72, + # "Unused Map 73": 0x73, + # "Unused Map 74": 0x74, + # "Unused Map 75": 0x75, + "Indigo Plateau Hall of Fame": 0x76, + "Underground Path North South": 0x77, + "Indigo Plateau Champion's Room": 0x78, + "Underground Path West East": 0x79, + "Celadon Department Store 1F": 0x7A, + "Celadon Department Store 2F": 0x7B, + "Celadon Department Store 3F": 0x7C, + "Celadon Department Store 4F": 0x7D, + "Celadon Department Store Roof": 0x7E, + "Celadon Department Store Elevator": 0x7F, + "Celadon Mansion 1F": 0x80, + "Celadon Mansion 2F": 0x81, + "Celadon Mansion 3F": 0x82, + "Celadon Mansion Roof": 0x83, + "Celadon Mansion Roof House": 0x84, + "Celadon Pokemon Center": 0x85, + "Celadon Gym": 0x86, + "Celadon Game Corner": 0x87, + "Celadon Department Store 5F": 0x88, + "Celadon Prize Corner": 0x89, + "Celadon Diner": 0x8A, + "Celadon Chief House": 0x8B, + "Celadon Hotel": 0x8C, + "Lavender Pokemon Center": 0x8D, + "Pokemon Tower 1F": 0x8E, + "Pokemon Tower 2F": 0x8F, + "Pokemon Tower 3F": 0x90, + "Pokemon Tower 4F": 0x91, + "Pokemon Tower 5F": 0x92, + "Pokemon Tower 6F": 0x93, + "Pokemon Tower 7F": 0x94, + "Lavender Mr. Fuji's House": 0x95, + "Lavender Pokemart": 0x96, + "Lavender Cubone House": 0x97, + "Fuchsia Pokemart": 0x98, + "Fuchsia Bill's Grandpa's House": 0x99, + "Fuchsia Pokemon Center": 0x9A, + "Fuchsia Warden's House": 0x9B, + "Safari Zone Gate": 0x9C, + "Fuchsia Gym": 0x9D, + "Fuchsia Meeting Room": 0x9E, + "Seafoam Islands B1F": 0x9F, + "Seafoam Islands B2F": 0xA0, + "Seafoam Islands B3F": 0xA1, + "Seafoam Islands B4F": 0xA2, + "Vermilion Old Rod House": 0xA3, + "Fuchsia Good Rod House": 0xA4, + "Pokemon Mansion 1F": 0xA5, + "Cinnabar Gym": 0xA6, + "Cinnabar Lab": 0xA7, + "Cinnabar Lab Trade Room": 0xA8, + "Cinnabar Lab R&D Room": 0xA9, + "Cinnabar Lab Fossil Room": 0xAA, + "Cinnabar Pokemon Center": 0xAB, + "Cinnabar Pokemart": 0xAC, + # "Cinnabar Pokemart Copy": 0xAD, + "Indigo Plateau Lobby": 0xAE, + "Saffron Copycat's House 1F": 0xAF, + "Saffron Copycat's House 2F": 0xB0, + "Saffron Fighting Dojo": 0xB1, + "Saffron Gym": 0xB2, + "Saffron Pidgey House": 0xB3, + "Saffron Pokemart": 0xB4, + "Silph Co 1F": 0xB5, + "Saffron Pokemon Center": 0xB6, + "Saffron Mr. Psychic's House": 0xB7, + "Route 15 Gate 1F": 0xB8, + "Route 15 Gate 2F": 0xB9, + "Route 16 Gate 1F": 0xBA, + "Route 16 Gate 2F": 0xBB, + "Route 16 Fly House": 0xBC, + "Route 12 Super Rod House": 0xBD, + "Route 18 Gate 1F": 0xBE, + "Route 18 Gate 2F": 0xBF, + "Seafoam Islands 1F": 0xC0, + "Route 22 Gate": 0xC1, + "Victory Road 2F": 0xC2, + "Route 12 Gate 2F": 0xC3, + "Vermilion Trade House": 0xC4, + "Diglett's Cave": 0xC5, + "Victory Road 3F": 0xC6, + "Rocket Hideout B1F": 0xC7, + "Rocket Hideout B2F": 0xC8, + "Rocket Hideout B3F": 0xC9, + "Rocket Hideout B4F": 0xCA, + "Rocket Hideout Elevator": 0xCB, + # "Unused Map Cc": 0xCC, + # "Unused Map Cd": 0xCD, + # "Unused Map Ce": 0xCE, + "Silph Co 2F": 0xCF, + "Silph Co 3F": 0xD0, + "Silph Co 4F": 0xD1, + "Silph Co 5F": 0xD2, + "Silph Co 6F": 0xD3, + "Silph Co 7F": 0xD4, + "Silph Co 8F": 0xD5, + "Pokemon Mansion 2F": 0xD6, + "Pokemon Mansion 3F": 0xD7, + "Pokemon Mansion B1F": 0xD8, + "Safari Zone East": 0xD9, + "Safari Zone North": 0xDA, + "Safari Zone West": 0xDB, + "Safari Zone Center": 0xDC, + "Safari Zone Center Rest House": 0xDD, + "Safari Zone Secret House": 0xDE, + "Safari Zone West Rest House": 0xDF, + "Safari Zone East Rest House": 0xE0, + "Safari Zone North Rest House": 0xE1, + "Cerulean Cave 2F": 0xE2, + "Cerulean Cave B1F": 0xE3, + "Cerulean Cave 1F": 0xE4, + "Lavender Name Rater's House": 0xE5, + "Cerulean Badge House": 0xE6, + # "Unused Map E7": 0xE7, + "Rock Tunnel B1F": 0xE8, + "Silph Co 9F": 0xE9, + "Silph Co 10F": 0xEA, + "Silph Co 11F": 0xEB, + "Silph Co Elevator": 0xEC, + # "Unused Map Ed": 0xED, + # "Unused Map Ee": 0xEE, + "Trade Center": 0xEF, + "Colosseum": 0xF0, + # "Unused Map F1": 0xF1, + # "Unused Map F2": 0xF2, + # "Unused Map F3": 0xF3, + # "Unused Map F4": 0xF4, + "Indigo Plateau Lorelei's Room": 0xF5, + "Indigo Plateau Bruno's Room": 0xF6, + "Indigo Plateau Agatha's Room": 0xF7, +} + +warp_data = {'Menu': [], 'Evolution': [], 'Old Rod Fishing': [], 'Good Rod Fishing': [], 'Fossil Level': [], + 'Pokedex': [], 'Fossil': [], 'Celadon City': [ + {'name': 'Celadon City to Celadon Department Store 1F W', 'address': 'Warps_CeladonCity', 'id': 0, + 'to': {'map': 'Celadon Department Store 1F', 'id': (1, 0)}}, + {'name': 'Celadon City to Celadon Department Store 1F E', 'address': 'Warps_CeladonCity', 'id': 1, + 'to': {'map': 'Celadon Department Store 1F', 'id': (3, 2)}}, + {'address': 'Warps_CeladonCity', 'id': 2, 'to': {'map': 'Celadon Mansion 1F', 'id': (0, 1)}}, + {'address': 'Warps_CeladonCity', 'id': (3, 4), 'to': {'map': 'Celadon Mansion 1F-Back', 'id': 2}}, + {'address': 'Warps_CeladonCity', 'id': 5, 'to': {'map': 'Celadon Pokemon Center', 'id': 0}}, + {'address': 'Warps_CeladonCity', 'id': 7, 'to': {'map': 'Celadon Game Corner', 'id': (0, 1)}}, + {'address': 'Warps_CeladonCity', 'id': 9, 'to': {'map': 'Celadon Prize Corner', 'id': (0, 1)}}, + {'address': 'Warps_CeladonCity', 'id': 10, 'to': {'map': 'Celadon Diner', 'id': (0, 1)}}, + {'address': 'Warps_CeladonCity', 'id': 11, 'to': {'map': 'Celadon Chief House', 'id': (0, 1)}}, + {'address': 'Warps_CeladonCity', 'id': 12, 'to': {'map': 'Celadon Hotel', 'id': (0, 1)}}], + 'Celadon City-G': [{'address': 'Warps_CeladonCity', 'id': 6, 'to': {'map': 'Celadon Gym', 'id': (0, 1)}}], + 'Pallet Town': [{'address': 'Warps_PalletTown', 'id': 0, 'to': {'map': "Player's House 1F", 'id': (0, 1)}}, + {'address': 'Warps_PalletTown', 'id': 1, 'to': {'map': "Rival's House", 'id': (0, 1)}}, + {'address': 'Warps_PalletTown', 'id': 2, 'to': {'map': "Oak's Lab", 'id': (1, 0)}}], + 'Viridian City': [ + {'address': 'Warps_ViridianCity', 'id': 0, 'to': {'map': 'Viridian Pokemon Center', 'id': (0, 1)}}, + {'address': 'Warps_ViridianCity', 'id': 1, 'to': {'map': 'Viridian Pokemart', 'id': (0, 1)}}, + {'address': 'Warps_ViridianCity', 'id': 2, 'to': {'map': 'Viridian School House', 'id': (0, 1)}}, + {'address': 'Warps_ViridianCity', 'id': 3, 'to': {'map': 'Viridian Nickname House', 'id': (0, 1)}}], + 'Viridian City-N': [], 'Viridian City-G': [ + {'address': 'Warps_ViridianCity', 'id': 4, 'to': {'map': 'Viridian Gym', 'id': (0, 1)}}], 'Pewter City-E': [], + 'Pewter City-M': [ + {'address': 'Warps_PewterCity', 'id': 1, 'to': {'map': 'Pewter Museum 1F-E', 'id': (2, 3)}}], + 'Pewter City': [{'address': 'Warps_PewterCity', 'id': 0, 'to': {'map': 'Pewter Museum 1F', 'id': (0, 1)}}, + {'address': 'Warps_PewterCity', 'id': 2, 'to': {'map': 'Pewter Gym', 'id': (0, 1)}}, + {'address': 'Warps_PewterCity', 'id': 3, + 'to': {'map': 'Pewter Nidoran House', 'id': (0, 1)}}, + {'address': 'Warps_PewterCity', 'id': 4, 'to': {'map': 'Pewter Pokemart', 'id': (0, 1)}}, + {'address': 'Warps_PewterCity', 'id': 5, + 'to': {'map': 'Pewter Speech House', 'id': (0, 1)}}, + {'address': 'Warps_PewterCity', 'id': 6, + 'to': {'map': 'Pewter Pokemon Center', 'id': (0, 1)}}], 'Cerulean City-T': [ + {'address': 'Warps_CeruleanCity', 'id': 0, 'to': {'map': 'Cerulean Trashed House', 'id': (0, 1)}}], + 'Cerulean City': [ + {'address': 'Warps_CeruleanCity', 'id': 1, 'to': {'map': 'Cerulean Trade House', 'id': (0, 1)}}, + {'address': 'Warps_CeruleanCity', 'id': 2, 'to': {'map': 'Cerulean Pokemon Center', 'id': (0, 1)}}, + {'address': 'Warps_CeruleanCity', 'id': 3, 'to': {'map': 'Cerulean Gym', 'id': (0, 1)}}, + {'address': 'Warps_CeruleanCity', 'id': 4, 'to': {'map': 'Cerulean Bicycle Shop', 'id': (0, 1)}}, + {'address': 'Warps_CeruleanCity', 'id': 5, 'to': {'map': 'Cerulean Pokemart', 'id': (0, 1)}}, + {'address': 'Warps_CeruleanCity', 'id': 8, 'to': {'map': 'Cerulean Badge House', 'id': (1, 2)}}], + 'Cerulean City-Badge House Backyard': [ + {'address': 'Warps_CeruleanCity', 'id': 9, 'to': {'map': 'Cerulean Badge House', 'id': 0}}], + 'Cerulean City-Water': [], 'Cerulean City-Cave': [ + {'address': 'Warps_CeruleanCity', 'id': 6, 'to': {'map': 'Cerulean Cave 1F-SE', 'id': (0, 1)}}], + 'Cerulean City-Outskirts': [ + {'address': 'Warps_CeruleanCity', 'id': 7, 'to': {'map': 'Cerulean Trashed House', 'id': 2}}], + 'Vermilion City': [ + {'address': 'Warps_VermilionCity', 'id': 0, 'to': {'map': 'Vermilion Pokemon Center', 'id': (0, 1)}}, + {'address': 'Warps_VermilionCity', 'id': 1, 'to': {'map': 'Vermilion Pokemon Fan Club', 'id': (0, 1)}}, + {'address': 'Warps_VermilionCity', 'id': 2, 'to': {'map': 'Vermilion Pokemart', 'id': (0, 1)}}, + {'address': 'Warps_VermilionCity', 'id': 4, 'to': {'map': 'Vermilion Pidgey House', 'id': 0}}, + {'address': 'Warps_VermilionCity', 'id': 7, 'to': {'map': 'Vermilion Trade House', 'id': 0}}, + {'address': 'Warps_VermilionCity', 'id': 8, 'to': {'map': 'Vermilion Old Rod House', 'id': 0}}], + 'Vermilion City-G': [ + {'address': 'Warps_VermilionCity', 'id': 3, 'to': {'map': 'Vermilion Gym', 'id': (0, 1)}}], + 'Vermilion City-Dock': [ + {'address': 'Warps_VermilionCity', 'id': (5, 6), 'to': {'map': 'Vermilion Dock', 'id': 0}}], + 'Fuchsia City': [ + {'address': 'Warps_FuchsiaCity', 'id': 0, 'to': {'map': 'Fuchsia Pokemart', 'id': (0, 1)}}, + {'address': 'Warps_FuchsiaCity', 'id': 1, 'to': {'map': "Fuchsia Bill's Grandpa's House", 'id': 0}}, + {'address': 'Warps_FuchsiaCity', 'id': 2, 'to': {'map': 'Fuchsia Pokemon Center', 'id': 0}}, + {'address': 'Warps_FuchsiaCity', 'id': 3, 'to': {'map': "Fuchsia Warden's House", 'id': 0}}, + {'address': 'Warps_FuchsiaCity', 'id': 4, 'to': {'map': 'Safari Zone Gate-S', 'id': (0, 1)}}, + {'address': 'Warps_FuchsiaCity', 'id': 5, 'to': {'map': 'Fuchsia Gym', 'id': 0}}, + {'address': 'Warps_FuchsiaCity', 'id': 6, 'to': {'map': 'Fuchsia Meeting Room', 'id': 0}}, + {'address': 'Warps_FuchsiaCity', 'id': 7, 'to': {'map': 'Fuchsia Good Rod House', 'id': 1}}], + 'Fuchsia City-Good Rod House Backyard': [ + {'address': 'Warps_FuchsiaCity', 'id': 8, 'to': {'map': 'Fuchsia Good Rod House', 'id': 0}}], + "Rival's House": [{'address': 'Warps_BluesHouse', 'id': (0, 1), 'to': {'map': 'Pallet Town', 'id': 1}}], + 'Vermilion Trade House': [ + {'address': 'Warps_VermilionTradeHouse', 'id': (0, 1), 'to': {'map': 'Vermilion City', 'id': 7}}], + 'Indigo Plateau Lobby': [ + {'address': 'Warps_IndigoPlateauLobby', 'id': (0, 1), 'to': {'map': 'Indigo Plateau', 'id': (0, 1)}}], + 'Indigo Plateau Lobby-N': [{'address': 'Warps_IndigoPlateauLobby', 'id': 2, + 'to': {'map': "Indigo Plateau Lorelei's Room", 'id': 0}}], + 'Silph Co 4F': [{'address': 'Warps_SilphCo4F', 'id': 0, 'to': {'map': 'Silph Co 3F', 'id': 1}}, + {'address': 'Warps_SilphCo4F', 'id': 1, 'to': {'map': 'Silph Co 5F', 'id': 1}}, + {'address': 'Warps_SilphCo4F', 'id': 2, 'to': {'map': 'Silph Co Elevator-4F', 'id': 3}}, + {'address': 'Warps_SilphCo4F', 'id': 5, 'to': {'map': 'Silph Co 10F-SE', 'id': 4}}, + {'address': 'Warps_SilphCo4F', 'id': 6, 'to': {'map': 'Silph Co 10F', 'id': 5}}], + 'Silph Co 4F-N': [{'address': 'Warps_SilphCo4F', 'id': 4, 'to': {'map': 'Silph Co 6F', 'id': 3}}, + {'address': 'Warps_SilphCo4F', 'id': 3, 'to': {'map': 'Silph Co 10F-SE', 'id': 3}}], + 'Silph Co 4F-W': [], 'Silph Co 5F-NW': [], 'Silph Co 6F-SW': [], + 'Silph Co 5F': [{'address': 'Warps_SilphCo5F', 'id': 0, 'to': {'map': 'Silph Co 6F', 'id': 1}}, + {'address': 'Warps_SilphCo5F', 'id': 1, 'to': {'map': 'Silph Co 4F', 'id': 1}}, + {'address': 'Warps_SilphCo5F', 'id': 2, 'to': {'map': 'Silph Co Elevator-5F', 'id': 4}}, + {'address': 'Warps_SilphCo5F', 'id': 3, 'to': {'map': 'Silph Co 7F-SE', 'id': 5}}, + {'address': 'Warps_SilphCo5F', 'id': 4, 'to': {'map': 'Silph Co 9F', 'id': 4}}, + {'address': 'Warps_SilphCo5F', 'id': 5, 'to': {'map': 'Silph Co 3F', 'id': 4}}], + 'Silph Co 5F-SW': [{'address': 'Warps_SilphCo5F', 'id': 6, 'to': {'map': 'Silph Co 3F', 'id': 5}}], + 'Silph Co 6F': [{'address': 'Warps_SilphCo6F', 'id': 0, 'to': {'map': 'Silph Co 7F', 'id': 1}}, + {'address': 'Warps_SilphCo6F', 'id': 1, 'to': {'map': 'Silph Co 5F', 'id': 0}}, + {'address': 'Warps_SilphCo6F', 'id': 2, 'to': {'map': 'Silph Co Elevator-7F', 'id': 6}}, + {'address': 'Warps_SilphCo6F', 'id': 3, 'to': {'map': 'Silph Co 4F-N', 'id': 4}}, + {'address': 'Warps_SilphCo6F', 'id': 4, 'to': {'map': 'Silph Co 2F-SW', 'id': 6}}], + 'Cinnabar Island-M': [ + {'address': 'Warps_CinnabarIsland', 'id': 0, 'to': {'map': 'Pokemon Mansion 1F', 'id': 1}}], + 'Cinnabar Island-G': [ + {'address': 'Warps_CinnabarIsland', 'id': 1, 'to': {'map': 'Cinnabar Gym', 'id': 0}}], + 'Cinnabar Island': [{'address': 'Warps_CinnabarIsland', 'id': 2, 'to': {'map': 'Cinnabar Lab', 'id': 0}}, + {'address': 'Warps_CinnabarIsland', 'id': 3, + 'to': {'map': 'Cinnabar Pokemon Center', 'id': 0}}, + {'address': 'Warps_CinnabarIsland', 'id': 4, + 'to': {'map': 'Cinnabar Pokemart', 'id': (0, 1)}}], 'Route 1': [], + "Oak's Lab": [{'address': 'Warps_OaksLab', 'id': (1, 0), 'to': {'map': 'Pallet Town', 'id': 2}}], + 'Viridian Pokemart': [ + {'address': 'Warps_ViridianMart', 'id': (0, 1), 'to': {'map': 'Viridian City', 'id': 1}}], + 'Viridian School House': [ + {'address': 'Warps_ViridianSchoolHouse', 'id': (0, 1), 'to': {'map': 'Viridian City', 'id': 2}}], + 'Viridian Nickname House': [ + {'address': 'Warps_ViridianNicknameHouse', 'id': (0, 1), 'to': {'map': 'Viridian City', 'id': 3}}], + 'Pewter Nidoran House': [ + {'address': 'Warps_PewterNidoranHouse', 'id': (0, 1), 'to': {'map': 'Pewter City', 'id': 3}}], + 'Pewter Speech House': [ + {'address': 'Warps_PewterSpeechHouse', 'id': (0, 1), 'to': {'map': 'Pewter City', 'id': 5}}], + 'Cerulean Trashed House': [ + {'address': 'Warps_CeruleanTrashedHouse', 'id': (0, 1), 'to': {'map': 'Cerulean City-T', 'id': 0}}, + {'address': 'Warps_CeruleanTrashedHouse', 'id': 2, 'to': {'map': 'Cerulean City-Outskirts', 'id': 7}}], + 'Cerulean Trade House': [ + {'address': 'Warps_CeruleanTradeHouse', 'id': (0, 1), 'to': {'map': 'Cerulean City', 'id': 1}}], + 'Cerulean Bicycle Shop': [ + {'address': 'Warps_BikeShop', 'id': (0, 1), 'to': {'map': 'Cerulean City', 'id': 4}}], + "Lavender Mr. Fuji's House": [ + {'address': 'Warps_MrFujisHouse', 'id': (0, 1), 'to': {'map': 'Lavender Town', 'id': 2}}], + 'Lavender Cubone House': [ + {'address': 'Warps_LavenderCuboneHouse', 'id': (0, 1), 'to': {'map': 'Lavender Town', 'id': 4}}], + "Lavender Name Rater's House": [ + {'address': 'Warps_NameRatersHouse', 'id': (0, 1), 'to': {'map': 'Lavender Town', 'id': 5}}], + 'Vermilion Pidgey House': [ + {'address': 'Warps_VermilionPidgeyHouse', 'id': (0, 1), 'to': {'map': 'Vermilion City', 'id': 4}}], + 'Vermilion Dock': [ + {'address': 'Warps_VermilionDock', 'id': 0, 'to': {'map': 'Vermilion City-Dock', 'id': 5}}, + {'address': 'Warps_VermilionDock', 'id': 1, 'to': {'map': 'S.S. Anne 1F', 'id': 1}}], + 'Celadon Mansion Roof House': [{'address': 'Warps_CeladonMansionRoofHouse', 'id': (0, 1), + 'to': {'map': 'Celadon Mansion Roof-Back', 'id': 2}}], + 'Fuchsia Pokemart': [ + {'address': 'Warps_FuchsiaMart', 'id': (0, 1), 'to': {'map': 'Fuchsia City', 'id': 0}}], + 'Saffron Pidgey House': [ + {'address': 'Warps_SaffronPidgeyHouse', 'id': (0, 1), 'to': {'map': 'Saffron City-Pidgey', 'id': 3}}], + "Saffron Mr. Psychic's House": [ + {'address': 'Warps_MrPsychicsHouse', 'id': (0, 1), 'to': {'map': 'Saffron City', 'id': 7}}], + "Diglett's Cave Route 2": [ + {'address': 'Warps_DiglettsCaveRoute2', 'id': (0, 1), 'to': {'map': 'Route 2-NE', 'id': 0}}, + {'address': 'Warps_DiglettsCaveRoute2', 'id': 2, 'to': {'map': "Diglett's Cave", 'id': 0}}], + 'Route 2 Trade House': [ + {'address': 'Warps_Route2TradeHouse', 'id': (0, 1), 'to': {'map': 'Route 2-NE', 'id': 2}}], + 'Route 5 Gate-S': [{'address': 'Warps_Route5Gate', 'id': (0, 1), 'to': {'map': 'Route 5-S', 'id': 2}}], + 'Route 5 Gate-N': [{'address': 'Warps_Route5Gate', 'id': (3, 2), 'to': {'map': 'Route 5', 'id': (1, 0)}}], + 'Route 6 Gate-S': [{'address': 'Warps_Route6Gate', 'id': (0, 1), 'to': {'map': 'Route 6', 'id': 2}}], + 'Route 6 Gate-N': [{'address': 'Warps_Route6Gate', 'id': (2, 3), 'to': {'map': 'Route 6-N', 'id': 1}}], + 'Route 7 Gate-W': [{'address': 'Warps_Route7Gate', 'id': (0, 1), 'to': {'map': 'Route 7', 'id': 3}}], + 'Route 7 Gate-E': [ + {'address': 'Warps_Route7Gate', 'id': (2, 3), 'to': {'map': 'Route 7-E', 'id': (0, 1)}}], + 'Route 8 Gate-W': [ + {'address': 'Warps_Route8Gate', 'id': (0, 1), 'to': {'map': 'Route 8-W', 'id': (0, 1)}}], + 'Route 8 Gate-E': [{'address': 'Warps_Route8Gate', 'id': (2, 3), 'to': {'map': 'Route 8', 'id': (2, 3)}}], + 'Underground Path Route 8': [ + {'address': 'Warps_UndergroundPathRoute8', 'id': (0, 1), 'to': {'map': 'Route 8', 'id': 4}}, + {'address': 'Warps_UndergroundPathRoute8', 'id': 2, + 'to': {'map': 'Underground Path West East', 'id': 1}}], + 'Power Plant': [{'address': 'Warps_PowerPlant', 'id': (0, 1), 'to': {'map': 'Route 10-P', 'id': 3}}, + {'name': 'Power Plant to Route 10-P Back Door', 'address': 'Warps_PowerPlant', 'id': 2, + 'to': {'map': 'Route 10-P', 'id': 3}}], "Diglett's Cave Route 11": [ + {'address': 'Warps_DiglettsCaveRoute11', 'id': (0, 1), 'to': {'map': 'Route 11', 'id': 4}}, + {'address': 'Warps_DiglettsCaveRoute11', 'id': 2, 'to': {'map': "Diglett's Cave", 'id': 1}}], + 'Route 16 Fly House': [ + {'address': 'Warps_Route16FlyHouse', 'id': (0, 1), 'to': {'map': 'Route 16-NW', 'id': 8}}], + 'Route 22 Gate-S': [{'address': 'Warps_Route22Gate', 'id': (0, 1), 'to': {'map': 'Route 22', 'id': 0}}], + 'Route 22 Gate-N': [ + {'address': 'Warps_Route22Gate', 'id': (2, 3), 'to': {'map': 'Route 23-S', 'id': (0, 1)}}], + "Bill's House": [{'address': 'Warps_BillsHouse', 'id': (0, 1), 'to': {'map': 'Route 25', 'id': 0}}], + 'Lavender Town': [ + {'address': 'Warps_LavenderTown', 'id': 0, 'to': {'map': 'Lavender Pokemon Center', 'id': 0}}, + {'address': 'Warps_LavenderTown', 'id': 1, 'to': {'map': 'Pokemon Tower 1F', 'id': 0}}, + {'address': 'Warps_LavenderTown', 'id': 2, 'to': {'map': "Lavender Mr. Fuji's House", 'id': 0}}, + {'address': 'Warps_LavenderTown', 'id': 3, 'to': {'map': 'Lavender Pokemart', 'id': 0}}, + {'address': 'Warps_LavenderTown', 'id': 4, 'to': {'map': 'Lavender Cubone House', 'id': 0}}, + {'address': 'Warps_LavenderTown', 'id': 5, 'to': {'map': "Lavender Name Rater's House", 'id': 0}}], + 'Viridian Pokemon Center': [ + {'address': 'Warps_ViridianPokecenter', 'id': (0, 1), 'to': {'map': 'Viridian City', 'id': 0}}], + 'Pokemon Mansion 1F-Wild': [], 'Pokemon Mansion 1F': [ + {'address': 'Warps_PokemonMansion1F', 'id': 4, 'to': {'map': 'Pokemon Mansion 2F', 'id': 0}}, + {'address': 'Warps_PokemonMansion1F', 'id': (0, 1, 2, 3), 'to': {'map': 'Cinnabar Island-M', 'id': 0}}], + 'Pokemon Mansion 1F-SE': [ + {'address': 'Warps_PokemonMansion1F', 'id': 5, 'to': {'map': 'Pokemon Mansion B1F', 'id': 0}}, + {'name': "Pokemon Mansion 1F-SE to Cinnabar Island-M", 'address': 'Warps_PokemonMansion1F', + 'id': (6, 7), 'to': {'map': 'Cinnabar Island-M', 'id': 0}}], + 'Pokemon Mansion 2F': [ + {'address': 'Warps_PokemonMansion2F', 'id': 0, 'to': {'map': 'Pokemon Mansion 1F', 'id': 4}}, + {'address': 'Warps_PokemonMansion2F', 'id': 1, 'to': {'map': 'Pokemon Mansion 3F-SW', 'id': 0}}, + {'address': 'Warps_PokemonMansion2F', 'id': 3, 'to': {'map': 'Pokemon Mansion 3F', 'id': 1}}], + 'Pokemon Mansion 2F-E': [ + {'address': 'Warps_PokemonMansion2F', 'id': 2, 'to': {'map': 'Pokemon Mansion 3F-SE', 'id': 2}}], + 'Pokemon Mansion 3F-Wild': [], 'Pokemon Mansion 2F-Wild': [], 'Pokemon Mansion 3F': [ + {'address': 'Warps_PokemonMansion3F', 'id': 1, 'to': {'map': 'Pokemon Mansion 2F', 'id': 3}}], + 'Pokemon Mansion 3F-SE': [ + {'address': 'Warps_PokemonMansion3F', 'id': 2, 'to': {'map': 'Pokemon Mansion 2F-E', 'id': 2}},], + 'Pokemon Mansion 3F-SW': [ + {'address': 'Warps_PokemonMansion3F', 'id': 0, 'to': {'map': 'Pokemon Mansion 2F', 'id': 1}}], + 'Pokemon Mansion B1F': [ + {'address': 'Warps_PokemonMansionB1F', 'id': 0, 'to': {'map': 'Pokemon Mansion 1F-SE', 'id': 5}}], + 'Rock Tunnel 1F-NE': [{'address': 'Warps_RockTunnel1F', 'id': 0, 'to': {'map': 'Route 10-N', 'id': 1}}, + {'address': 'Warps_RockTunnel1F', 'id': 4, + 'to': {'map': 'Rock Tunnel B1F-E', 'id': 0}}], 'Rock Tunnel 1F-NW': [ + {'address': 'Warps_RockTunnel1F', 'id': 5, 'to': {'map': 'Rock Tunnel B1F-E', 'id': 1}}, + {'address': 'Warps_RockTunnel1F', 'id': 6, 'to': {'map': 'Rock Tunnel B1F-W', 'id': 2}}], + 'Rock Tunnel 1F-S': [{'address': 'Warps_RockTunnel1F', 'id': 2, 'to': {'map': 'Route 10-S', 'id': 2}}, + {'address': 'Warps_RockTunnel1F', 'id': 7, + 'to': {'map': 'Rock Tunnel B1F-W', 'id': 3}}], 'Rock Tunnel 1F-Wild': [], + 'Rock Tunnel B1F-Wild': [], 'Seafoam Islands 1F': [ + {'address': 'Warps_SeafoamIslands1F', 'id': (2, 3), 'to': {'map': 'Route 20-IE', 'id': 1}}, + {'address': 'Warps_SeafoamIslands1F', 'id': 4, 'to': {'map': 'Seafoam Islands B1F', 'id': 1}}, + {'address': 'Warps_SeafoamIslands1F', 'id': 5, 'to': {'map': 'Seafoam Islands B1F-NE', 'id': 6}}], + 'Seafoam Islands B1F-Wild': [], 'Seafoam Islands 1F-Wild': [], 'Seafoam Islands 1F-SE': [ + {'address': 'Warps_SeafoamIslands1F', 'id': (0, 1), 'to': {'map': 'Route 20-IW', 'id': 0}}, + {'address': 'Warps_SeafoamIslands1F', 'id': 6, 'to': {'map': 'Seafoam Islands B1F-SE', 'id': 4}}], + 'S.S. Anne 3F': [{'address': 'Warps_SSAnne3F', 'id': 0, 'to': {'map': 'S.S. Anne Bow', 'id': 0}}, + {'address': 'Warps_SSAnne3F', 'id': 1, 'to': {'map': 'S.S. Anne 2F', 'id': 7}}], + 'Victory Road 3F': [ + {'address': 'Warps_VictoryRoad3F', 'id': 0, 'to': {'map': 'Victory Road 2F-C', 'id': 3}}, + {'address': 'Warps_VictoryRoad3F', 'id': 3, 'to': {'map': 'Victory Road 2F-NW', 'id': 6}}], + 'Victory Road 3F-SE': [ + {'address': 'Warps_VictoryRoad3F', 'id': 1, 'to': {'map': 'Victory Road 2F-E', 'id': 5}}, + {'address': 'Warps_VictoryRoad3F', 'id': 2, 'to': {'map': 'Victory Road 2F-SE', 'id': 4}}], + 'Victory Road 3F-S': [], 'Victory Road 3F-Wild': [], 'Rocket Hideout B1F': [ + {'address': 'Warps_RocketHideoutB1F', 'id': 0, 'to': {'map': 'Rocket Hideout B2F', 'id': 0}}, + {'address': 'Warps_RocketHideoutB1F', 'id': 1, 'to': {'map': 'Celadon Game Corner-Hidden Stairs', 'id': 2}}], + 'Rocket Hideout B1F-SE': [{'address': 'Warps_RocketHideoutB1F', 'id': (2, 4), + 'to': {'map': 'Rocket Hideout Elevator-B1F', 'id': 0}}], + 'Rocket Hideout B1F-S': [ + {'address': 'Warps_RocketHideoutB1F', 'id': 3, 'to': {'map': 'Rocket Hideout B2F', 'id': 3}}], + 'Rocket Hideout B2F': [ + {'address': 'Warps_RocketHideoutB2F', 'id': 0, 'to': {'map': 'Rocket Hideout B1F', 'id': 0}}, + {'address': 'Warps_RocketHideoutB2F', 'id': 1, 'to': {'map': 'Rocket Hideout B3F', 'id': 0}}, + {'address': 'Warps_RocketHideoutB2F', 'id': (2, 4), + 'to': {'map': 'Rocket Hideout Elevator-B2F', 'id': 1}}, + {'address': 'Warps_RocketHideoutB2F', 'id': 3, 'to': {'map': 'Rocket Hideout B1F-S', 'id': 3}}], + 'Rocket Hideout B3F': [ + {'address': 'Warps_RocketHideoutB3F', 'id': 0, 'to': {'map': 'Rocket Hideout B2F', 'id': 1}}, + {'address': 'Warps_RocketHideoutB3F', 'id': 1, 'to': {'map': 'Rocket Hideout B4F-NW', 'id': 0}}], + 'Rocket Hideout B4F': [{'address': 'Warps_RocketHideoutB4F', 'id': (1, 2), + 'to': {'map': 'Rocket Hideout Elevator-B4F', 'id': 2}}], 'Rocket Hideout B4F-NW': [ + {'address': 'Warps_RocketHideoutB4F', 'id': 0, 'to': {'map': 'Rocket Hideout B3F', 'id': 1}}], + 'Rocket Hideout Elevator': [], 'Silph Co Elevator': [], 'Celadon Department Store Elevator': [], + 'Rocket Hideout Elevator-B1F': [{'address': 'RocketHideoutElevatorWarpMaps', 'id': 0, + 'to': {'map': 'Rocket Hideout B1F-SE', 'id': 4}}], + 'Rocket Hideout Elevator-B2F': [ + {'address': 'RocketHideoutElevatorWarpMaps', 'id': 1, 'to': {'map': 'Rocket Hideout B2F', 'id': 4}}], + 'Rocket Hideout Elevator-B4F': [ + {'address': 'RocketHideoutElevatorWarpMaps', 'id': 2, 'to': {'map': 'Rocket Hideout B4F', 'id': 2}}], + 'Silph Co Elevator-1F': [ + {'address': 'SilphCoElevatorWarpMaps', 'id': 0, 'to': {'map': 'Silph Co 1F', 'id': 3}}], + 'Silph Co Elevator-2F': [ + {'address': 'SilphCoElevatorWarpMaps', 'id': 1, 'to': {'map': 'Silph Co 2F', 'id': 2}}], + 'Silph Co Elevator-3F': [ + {'address': 'SilphCoElevatorWarpMaps', 'id': 2, 'to': {'map': 'Silph Co 3F', 'id': 2}}], + 'Silph Co Elevator-4F': [ + {'address': 'SilphCoElevatorWarpMaps', 'id': 3, 'to': {'map': 'Silph Co 4F', 'id': 2}}], + 'Silph Co Elevator-5F': [ + {'address': 'SilphCoElevatorWarpMaps', 'id': 4, 'to': {'map': 'Silph Co 5F', 'id': 2}}], + 'Silph Co Elevator-6F': [ + {'address': 'SilphCoElevatorWarpMaps', 'id': 5, 'to': {'map': 'Silph Co 6F', 'id': 2}}], + 'Silph Co Elevator-7F': [ + {'address': 'SilphCoElevatorWarpMaps', 'id': 6, 'to': {'map': 'Silph Co 7F', 'id': 2}}], + 'Silph Co Elevator-8F': [ + {'address': 'SilphCoElevatorWarpMaps', 'id': 7, 'to': {'map': 'Silph Co 8F', 'id': 2}}], + 'Silph Co Elevator-9F': [ + {'address': 'SilphCoElevatorWarpMaps', 'id': 8, 'to': {'map': 'Silph Co 9F', 'id': 2}}], + 'Silph Co Elevator-10F': [ + {'address': 'SilphCoElevatorWarpMaps', 'id': 9, 'to': {'map': 'Silph Co 10F', 'id': 2}}], + 'Silph Co Elevator-11F': [ + {'address': 'SilphCoElevatorWarpMaps', 'id': 10, 'to': {'map': 'Silph Co 11F', 'id': 1}}], + 'Safari Zone East': [ + {'address': 'Warps_SafariZoneEast', 'id': (0, 1), 'to': {'map': 'Safari Zone North', 'id': (6, 7)}}, + {'address': 'Warps_SafariZoneEast', 'id': (2, 3), 'to': {'map': 'Safari Zone Center-S', 'id': (6, 7)}}, + {'address': 'Warps_SafariZoneEast', 'id': 4, 'to': {'map': 'Safari Zone East Rest House', 'id': 0}}], + 'Safari Zone North': [ + {'address': 'Warps_SafariZoneNorth', 'id': (0, 1), 'to': {'map': 'Safari Zone West-NW', 'id': (0, 1)}}, + {'address': 'Warps_SafariZoneNorth', 'id': (2, 3), 'to': {'map': 'Safari Zone West', 'id': (2, 3)}}, + {'address': 'Warps_SafariZoneNorth', 'id': (4, 5), + 'to': {'map': 'Safari Zone Center-NE', 'id': (4, 5)}}, + {'address': 'Warps_SafariZoneNorth', 'id': (6, 7), 'to': {'map': 'Safari Zone East', 'id': (0, 1)}}, + {'address': 'Warps_SafariZoneNorth', 'id': 8, 'to': {'map': 'Safari Zone North Rest House', 'id': 0}}], + 'Safari Zone Center-C': [], 'Safari Zone Center-Wild': [], 'Safari Zone Center-NW': [ + {'address': 'Warps_SafariZoneCenter', 'id': (2, 3), 'to': {'map': 'Safari Zone West', 'id': (4, 5)}}], + 'Safari Zone Center-NE': [ + {'address': 'Warps_SafariZoneCenter', 'id': (4, 5), 'to': {'map': 'Safari Zone North', 'id': (4, 5)}}], + 'Safari Zone Center-S': [ + {'address': 'Warps_SafariZoneCenter', 'id': (0, 1), 'to': {'map': 'Safari Zone Gate-N', 'id': (2, 3)}}, + {'address': 'Warps_SafariZoneCenter', 'id': (6, 7), 'to': {'map': 'Safari Zone East', 'id': (2, 3)}}, + {'address': 'Warps_SafariZoneCenter', 'id': 8, + 'to': {'map': 'Safari Zone Center Rest House', 'id': 0}}], 'Safari Zone Center Rest House': [ + {'address': 'Warps_SafariZoneCenterRestHouse', 'id': (0, 1), 'to': {'map': 'Safari Zone Center-S', 'id': 8}}], + 'Safari Zone West Rest House': [{'address': 'Warps_SafariZoneWestRestHouse', 'id': (0, 1), + 'to': {'map': 'Safari Zone West', 'id': 7}}], + 'Safari Zone East Rest House': [{'address': 'Warps_SafariZoneEastRestHouse', 'id': (0, 1), + 'to': {'map': 'Safari Zone East', 'id': 4}}], + 'Safari Zone North Rest House': [{'address': 'Warps_SafariZoneNorthRestHouse', 'id': (0, 1), + 'to': {'map': 'Safari Zone North', 'id': 8}}], 'Cerulean Cave 2F-E': [ + {'address': 'Warps_CeruleanCave2F', 'id': 0, 'to': {'map': 'Cerulean Cave 1F-NE', 'id': 2}}, + {'address': 'Warps_CeruleanCave2F', 'id': 1, 'to': {'map': 'Cerulean Cave 1F-SE', 'id': 3}}], + 'Cerulean Cave 2F-Wild': [], 'Cerulean Cave 2F-W': [ + {'address': 'Warps_CeruleanCave2F', 'id': 4, 'to': {'map': 'Cerulean Cave 1F-NW', 'id': 6}}, + {'address': 'Warps_CeruleanCave2F', 'id': 5, 'to': {'map': 'Cerulean Cave 1F-SW', 'id': 7}}], + 'Cerulean Cave 2F-N': [ + {'address': 'Warps_CeruleanCave2F', 'id': 2, 'to': {'map': 'Cerulean Cave 1F-SW', 'id': 4}}, + {'address': 'Warps_CeruleanCave2F', 'id': 3, 'to': {'map': 'Cerulean Cave 1F-N', 'id': 5}}], + 'Cerulean Cave B1F': [ + {'address': 'Warps_CeruleanCaveB1F', 'id': 0, 'to': {'map': 'Cerulean Cave 1F-NW', 'id': 8}}], + 'Cerulean Cave B1F-E': [], 'Rock Tunnel B1F-E': [ + {'address': 'Warps_RockTunnelB1F', 'id': 0, 'to': {'map': 'Rock Tunnel 1F-NE', 'id': 4}}, + {'address': 'Warps_RockTunnelB1F', 'id': 1, 'to': {'map': 'Rock Tunnel 1F-NW', 'id': 5}}], + 'Rock Tunnel B1F-W': [ + {'address': 'Warps_RockTunnelB1F', 'id': 2, 'to': {'map': 'Rock Tunnel 1F-NW', 'id': 6}}, + {'address': 'Warps_RockTunnelB1F', 'id': 3, 'to': {'map': 'Rock Tunnel 1F-S', 'id': 7}}], + 'Seafoam Islands B1F': [ + {'address': 'Warps_SeafoamIslandsB1F', 'id': 0, 'to': {'map': 'Seafoam Islands B2F-NW', 'id': 0}}, + {'address': 'Warps_SeafoamIslandsB1F', 'id': 1, 'to': {'map': 'Seafoam Islands 1F', 'id': 4}}, + {'name': 'Seafoam Islands B1F to Seafoam Islands B2F-SW N', 'address': 'Warps_SeafoamIslandsB1F', + 'id': 2, 'to': {'map': 'Seafoam Islands B2F-SW', 'id': 2}}, + {'name': 'Seafoam Islands B1F to Seafoam Islands B2F-SW S', 'address': 'Warps_SeafoamIslandsB1F', + 'id': 3, 'to': {'map': 'Seafoam Islands B2F-SW', 'id': 3}}], 'Seafoam Islands B1F-SE': [ + {'address': 'Warps_SeafoamIslandsB1F', 'id': 4, 'to': {'map': 'Seafoam Islands 1F-SE', 'id': 6}}, + {'address': 'Warps_SeafoamIslandsB1F', 'id': 5, 'to': {'map': 'Seafoam Islands B2F-SE', 'id': 5}}], + 'Seafoam Islands B1F-NE': [ + {'address': 'Warps_SeafoamIslandsB1F', 'id': 6, 'to': {'map': 'Seafoam Islands 1F', 'id': 5}}], + 'Seafoam Islands B2F-Wild': [], 'Seafoam Islands B2F-SE': [ + {'address': 'Warps_SeafoamIslandsB2F', 'id': 5, 'to': {'map': 'Seafoam Islands B1F-SE', 'id': 5}}, + {'address': 'Warps_SeafoamIslandsB2F', 'id': 6, 'to': {'map': 'Seafoam Islands B3F-SE', 'id': 4}}], + 'Seafoam Islands B2F-NE': [ + {'address': 'Warps_SeafoamIslandsB2F', 'id': 4, 'to': {'map': 'Seafoam Islands B3F-NE', 'id': 3}}], + 'Seafoam Islands B2F-SW': [ + {'name': 'Seafoam Islands B2F-SW to Seafoam Islands 1F-SW S', 'address': 'Warps_SeafoamIslandsB2F', + 'id': 3, 'to': {'map': 'Seafoam Islands B1F', 'id': 3}}, + {'address': 'Warps_SeafoamIslandsB2F', 'id': 1, 'to': {'map': 'Seafoam Islands B3F', 'id': 0}}, + {'name': 'Seafoam Islands B2F-SW to Seafoam Islands 1F-SW N', 'address': 'Warps_SeafoamIslandsB2F', + 'id': 2, 'to': {'map': 'Seafoam Islands B1F', 'id': 2}}], 'Seafoam Islands B2F-NW': [ + {'address': 'Warps_SeafoamIslandsB2F', 'id': 0, 'to': {'map': 'Seafoam Islands B1F', 'id': 0}}], + 'Seafoam Islands B3F': [ + {'address': 'Warps_SeafoamIslandsB3F', 'id': 0, 'to': {'map': 'Seafoam Islands B2F-SW', 'id': 1}}, + {'address': 'Warps_SeafoamIslandsB3F', 'id': 1, 'to': {'map': 'Seafoam Islands B4F', 'id': 2}} + ], 'Seafoam Islands B3F-SE': [ + {'address': 'Warps_SeafoamIslandsB3F', 'id': 4, 'to': {'map': 'Seafoam Islands B2F-SE', 'id': 6}}], + 'Seafoam Islands B3F-Wild': [], 'Seafoam Islands B3F-NE': [ + {'address': 'Warps_SeafoamIslandsB3F', 'id': 2, 'to': {'map': 'Seafoam Islands B4F', 'id': 3}}, + {'address': 'Warps_SeafoamIslandsB3F', 'id': 3, 'to': {'map': 'Seafoam Islands B2F-NE', 'id': 4}}], + 'Seafoam Islands B4F-W': [], + 'Seafoam Islands B4F': [ + {'address': 'Warps_SeafoamIslandsB4F', 'id': 2, + 'to': {'map': 'Seafoam Islands B3F', 'id': 1}}, + {'address': 'Warps_SeafoamIslandsB4F', 'id': 3, + 'to': {'map': 'Seafoam Islands B3F-NE', 'id': 2}}], + 'Route 7': [{'address': 'Warps_Route7', 'id': 3, 'to': {'map': 'Route 7 Gate-W', 'id': (0, 1)}}, + {'address': 'Warps_Route7', 'id': 4, 'to': {'map': 'Underground Path Route 7', 'id': 0}}], + 'Route 7-E': [{'address': 'Warps_Route7', 'id': (0, 1), 'to': {'map': 'Route 7 Gate-E', 'id': (2, 3)}}], + "Player's House 1F": [ + {'address': 'Warps_RedsHouse1F', 'id': (0, 1), 'to': {'map': 'Pallet Town', 'id': 0}}, + {'address': 'Warps_RedsHouse1F', 'id': 2, 'to': {'map': "Player's House 2F", 'id': 0}}], + 'Celadon Department Store 3F': [ + {'address': 'Warps_CeladonMart3F', 'id': 0, 'to': {'map': 'Celadon Department Store 4F', 'id': 0}}, + {'address': 'Warps_CeladonMart3F', 'id': 1, 'to': {'map': 'Celadon Department Store 2F', 'id': 1}}, + {'address': 'Warps_CeladonMart3F', 'id': 2, + 'to': {'map': 'Celadon Department Store Elevator-3F', 'id': 2}}], 'Celadon Department Store 4F': [ + {'address': 'Warps_CeladonMart4F', 'id': 0, 'to': {'map': 'Celadon Department Store 3F', 'id': 0}}, + {'address': 'Warps_CeladonMart4F', 'id': 1, 'to': {'map': 'Celadon Department Store 5F', 'id': 1}}, + {'address': 'Warps_CeladonMart4F', 'id': 2, 'to': {'map': 'Celadon Department Store Elevator-4F', 'id': 3}}], + 'Celadon Department Store Roof': [ + {'address': 'Warps_CeladonMartRoof', 'id': 0, 'to': {'map': 'Celadon Department Store 5F', 'id': 0}}], + 'Celadon Department Store Elevator-1F': [{'address': 'CeladonMartElevatorWarpMaps', 'id': 0, + 'to': {'map': 'Celadon Department Store 1F', 'id': 5}}], + 'Celadon Department Store Elevator-2F': [{'address': 'CeladonMartElevatorWarpMaps', 'id': 1, + 'to': {'map': 'Celadon Department Store 2F', 'id': 2}}], + 'Celadon Department Store Elevator-3F': [{'address': 'CeladonMartElevatorWarpMaps', 'id': 2, + 'to': {'map': 'Celadon Department Store 3F', 'id': 2}}], + 'Celadon Department Store Elevator-4F': [{'address': 'CeladonMartElevatorWarpMaps', 'id': 3, + 'to': {'map': 'Celadon Department Store 4F', 'id': 2}}], + 'Celadon Department Store Elevator-5F': [{'address': 'CeladonMartElevatorWarpMaps', 'id': 4, + 'to': {'map': 'Celadon Department Store 5F', 'id': 2}}], + 'Celadon Mansion 1F': [ + {'address': 'Warps_CeladonMansion1F', 'id': (0, 1), 'to': {'map': 'Celadon City', 'id': 2}}, + {'address': 'Warps_CeladonMansion1F', 'id': 3, 'to': {'map': 'Celadon Mansion 2F', 'id': 1}}], + 'Celadon Mansion 1F-Back': [ + {'address': 'Warps_CeladonMansion1F', 'id': 4, 'to': {'map': 'Celadon Mansion 2F-Back', 'id': 2}}, + {'address': 'Warps_CeladonMansion1F', 'id': 2, 'to': {'map': 'Celadon City', 'id': 4}}], + 'Celadon Mansion 2F': [ + {'address': 'Warps_CeladonMansion2F', 'id': 0, 'to': {'map': 'Celadon Mansion 3F', 'id': 0}}, + {'address': 'Warps_CeladonMansion2F', 'id': 1, 'to': {'map': 'Celadon Mansion 1F', 'id': 3}}], + 'Celadon Mansion 2F-Back': [ + {'address': 'Warps_CeladonMansion2F', 'id': 2, 'to': {'map': 'Celadon Mansion 1F-Back', 'id': 4}}, + {'address': 'Warps_CeladonMansion2F', 'id': 3, 'to': {'map': 'Celadon Mansion 3F-Back', 'id': 3}}], + 'Celadon Mansion 3F': [ + {'address': 'Warps_CeladonMansion3F', 'id': 0, 'to': {'map': 'Celadon Mansion 2F', 'id': 0}}, + {'address': 'Warps_CeladonMansion3F', 'id': 1, 'to': {'map': 'Celadon Mansion Roof', 'id': 0}}], + 'Celadon Mansion 3F-Back': [ + {'address': 'Warps_CeladonMansion3F', 'id': 2, 'to': {'map': 'Celadon Mansion Roof-Back', 'id': 1}}, + {'address': 'Warps_CeladonMansion3F', 'id': 3, 'to': {'map': 'Celadon Mansion 2F-Back', 'id': 3}}], + 'Celadon Mansion Roof': [ + {'address': 'Warps_CeladonMansionRoof', 'id': 0, 'to': {'map': 'Celadon Mansion 3F', 'id': 1}}], + 'Celadon Mansion Roof-Back': [ + {'address': 'Warps_CeladonMansionRoof', 'id': 1, 'to': {'map': 'Celadon Mansion 3F-Back', 'id': 2}}, + {'address': 'Warps_CeladonMansionRoof', 'id': 2, + 'to': {'map': 'Celadon Mansion Roof House', 'id': 0}}], 'Celadon Pokemon Center': [ + {'address': 'Warps_CeladonPokecenter', 'id': (0, 1), 'to': {'map': 'Celadon City', 'id': 5}}], + 'Celadon Gym': [{'address': 'Warps_CeladonGym', 'id': (0, 1), 'to': {'map': 'Celadon City-G', 'id': 6}}], + 'Celadon Gym-C': [], 'Celadon Game Corner': [ + {'address': 'Warps_GameCorner', 'id': (0, 1), 'to': {'map': 'Celadon City', 'id': 7}}], + 'Celadon Game Corner-Hidden Stairs': [ + {'address': 'Warps_GameCorner', 'id': 2, 'to': {'map': 'Rocket Hideout B1F', 'id': 1}}], + 'Celadon Department Store 5F': [ + {'address': 'Warps_CeladonMart5F', 'id': 0, 'to': {'map': 'Celadon Department Store Roof', 'id': 0}}, + {'address': 'Warps_CeladonMart5F', 'id': 1, 'to': {'map': 'Celadon Department Store 4F', 'id': 1}}, + {'address': 'Warps_CeladonMart5F', 'id': 2, + 'to': {'map': 'Celadon Department Store Elevator-5F', 'id': 4}}], 'Celadon Prize Corner': [ + {'address': 'Warps_GameCornerPrizeRoom', 'id': (0, 1), 'to': {'map': 'Celadon City', 'id': 9}}], + 'Celadon Diner': [ + {'address': 'Warps_CeladonDiner', 'id': (0, 1), 'to': {'map': 'Celadon City', 'id': 10}}], + 'Celadon Chief House': [ + {'address': 'Warps_CeladonChiefHouse', 'id': (0, 1), 'to': {'map': 'Celadon City', 'id': 11}}], + 'Celadon Hotel': [ + {'address': 'Warps_CeladonHotel', 'id': (0, 1), 'to': {'map': 'Celadon City', 'id': 12}}], + 'Route 4 Pokemon Center': [ + {'address': 'Warps_MtMoonPokecenter', 'id': (0, 1), 'to': {'map': 'Route 4-W', 'id': 0}}], + 'Rock Tunnel Pokemon Center': [ + {'address': 'Warps_RockTunnelPokecenter', 'id': (0, 1), 'to': {'map': 'Route 10-N', 'id': 0}}], + 'Route 11 Gate 1F': [ + {'address': 'Warps_Route11Gate1F', 'id': (0, 1), 'to': {'map': 'Route 11-C', 'id': (0, 1)}}, + {'address': 'Warps_Route11Gate1F', 'id': (2, 3), 'to': {'map': 'Route 11-E', 'id': (2, 3)}}, + {'address': 'Warps_Route11Gate1F', 'id': 4, 'to': {'map': 'Route 11 Gate 2F', 'id': 0}}], + 'Route 11 Gate 2F': [ + {'address': 'Warps_Route11Gate2F', 'id': 0, 'to': {'map': 'Route 11 Gate 1F', 'id': 4}}], + 'Route 12 Gate 1F': [ + {'address': 'Warps_Route12Gate1F', 'id': (0, 1), 'to': {'map': 'Route 12-L', 'id': (0, 1)}}, + {'address': 'Warps_Route12Gate1F', 'id': (2, 3), 'to': {'map': 'Route 12-N', 'id': 2}}, + {'address': 'Warps_Route12Gate1F', 'id': 4, 'to': {'map': 'Route 12 Gate 2F', 'id': 0}}], + 'Route 12 Gate 2F': [ + {'address': 'Warps_Route12Gate2F', 'id': 0, 'to': {'map': 'Route 12 Gate 1F', 'id': 4}}], + 'Route 15 Gate 1F': [ + {'address': 'Warps_Route15Gate1F', 'id': (0, 1), 'to': {'map': 'Route 15-W', 'id': (0, 1)}}, + {'address': 'Warps_Route15Gate1F', 'id': (2, 3), 'to': {'map': 'Route 15', 'id': (2, 3)}}, + {'address': 'Warps_Route15Gate1F', 'id': 4, 'to': {'map': 'Route 15 Gate 2F', 'id': 0}}], + 'Route 15 Gate 2F': [ + {'address': 'Warps_Route15Gate2F', 'id': 0, 'to': {'map': 'Route 15 Gate 1F', 'id': 4}}], + 'Route 16 Gate 1F-W': [ + {'address': 'Warps_Route16Gate1F', 'id': (0, 1), 'to': {'map': 'Route 16-SW', 'id': (0, 1)}}], + 'Route 16 Gate 1F-E': [ + {'address': 'Warps_Route16Gate1F', 'id': (2, 3), 'to': {'map': 'Route 16-C', 'id': 2}}, + {'address': 'Warps_Route16Gate1F', 'id': 8, 'to': {'map': 'Route 16 Gate 2F', 'id': 0}}], + 'Route 16 Gate 1F-N': [ + {'address': 'Warps_Route16Gate1F', 'id': (4, 5), 'to': {'map': 'Route 16-NW', 'id': (4, 5)}}, + {'address': 'Warps_Route16Gate1F', 'id': (6, 7), 'to': {'map': 'Route 16-NE', 'id': (6, 7)}}], + 'Route 16 Gate 2F': [ + {'address': 'Warps_Route16Gate2F', 'id': 0, 'to': {'map': 'Route 16 Gate 1F-E', 'id': 8}}], + 'Route 18 Gate 1F-W': [ + {'address': 'Warps_Route18Gate1F', 'id': (0, 1), 'to': {'map': 'Route 18-W', 'id': (0, 1)}}], + 'Route 18 Gate 1F-E': [ + {'address': 'Warps_Route18Gate1F', 'id': (2, 3), 'to': {'map': 'Route 18-E', 'id': (2, 3)}}, + {'address': 'Warps_Route18Gate1F', 'id': 4, 'to': {'map': 'Route 18 Gate 2F', 'id': 0}}], + 'Route 18 Gate 2F': [ + {'address': 'Warps_Route18Gate2F', 'id': 0, 'to': {'map': 'Route 18 Gate 1F-E', 'id': 4}}], + 'Mt Moon 1F': [{'address': 'Warps_MtMoon1F', 'id': (0, 1), 'to': {'map': 'Route 4-W', 'id': 1}}, + {'address': 'Warps_MtMoon1F', 'id': 2, 'to': {'map': 'Mt Moon B1F-W', 'id': 0}}, + {'address': 'Warps_MtMoon1F', 'id': 3, 'to': {'map': 'Mt Moon B1F-C', 'id': 2}}, + {'address': 'Warps_MtMoon1F', 'id': 4, 'to': {'map': 'Mt Moon B1F-SE', 'id': 3}}], + 'Mt Moon B2F': [{'address': 'Warps_MtMoonB2F', 'id': 1, 'to': {'map': 'Mt Moon B1F-W', 'id': 4}}, + {'address': 'Warps_MtMoonB2F', 'id': 3, 'to': {'map': 'Mt Moon B1F-NE', 'id': 6}}], + 'Mt Moon B2F-NE': [{'address': 'Warps_MtMoonB2F', 'id': 0, 'to': {'map': 'Mt Moon B1F-C', 'id': 1}}], + 'Mt Moon B2F-C': [{'address': 'Warps_MtMoonB2F', 'id': 2, 'to': {'map': 'Mt Moon B1F-SE', 'id': 5}}], + 'Mt Moon B2F-Wild': [], 'Victory Road 1F-Wild': [], 'Pallet/Viridian Fishing': [], 'Route 22 Fishing': [], + 'Route 24/25/Cerulean/Cerulean Gym Fishing': [], 'Route 6/11/Vermilion/Dock Fishing': [], + 'Route 10/Celadon Fishing': [], 'Safari Zone Fishing': [], 'Route 12/13/17/18 Fishing': [], + 'Sea Routes/Cinnabar/Seafoam Fishing': [], 'Route 23/Cerulean Cave Fishing': [], 'Fuchsia Fishing': [], + 'Safari Zone West': [ + {'address': 'Warps_SafariZoneWest', 'id': (2, 3), 'to': {'map': 'Safari Zone North', 'id': (2, 3)}}, + {'address': 'Warps_SafariZoneWest', 'id': (4, 5), + 'to': {'map': 'Safari Zone Center-NW', 'id': (2, 3)}}, + {'address': 'Warps_SafariZoneWest', 'id': 7, 'to': {'map': 'Safari Zone West Rest House', 'id': 0}}], + 'Safari Zone West-NW': [ + {'address': 'Warps_SafariZoneWest', 'id': (0, 1), 'to': {'map': 'Safari Zone North', 'id': (0, 1)}}, + {'address': 'Warps_SafariZoneWest', 'id': 6, 'to': {'map': 'Safari Zone Secret House', 'id': 0}}], + 'Safari Zone West-Wild': [], 'Safari Zone Secret House': [ + {'address': 'Warps_SafariZoneSecretHouse', 'id': (0, 1), 'to': {'map': 'Safari Zone West-NW', 'id': 6}}], + 'Route 22': [{'address': 'Warps_Route22', 'id': 0, 'to': {'map': 'Route 22 Gate-S', 'id': (0, 1)}}], + 'Route 22-F': [], + 'Route 20-IW': [{'address': 'Warps_Route20', 'id': 0, 'to': {'map': 'Seafoam Islands 1F-SE', 'id': 0}}], + 'Route 20-IE': [{'address': 'Warps_Route20', 'id': 1, 'to': {'map': 'Seafoam Islands 1F', 'id': 2}}], + 'Route 20-E': [], 'Route 20-W': [], 'Route 19/20-Water': [], + 'Route 23-S': [{'address': 'Warps_Route23', 'id': (0, 1), 'to': {'map': 'Route 22 Gate-N', 'id': (2, 3)}}], + 'Route 23-C': [{'address': 'Warps_Route23', 'id': 2, 'to': {'map': 'Victory Road 1F-S', 'id': 0}}], + 'Route 23-N': [{'address': 'Warps_Route23', 'id': 3, 'to': {'map': 'Victory Road 2F-E', 'id': 1}}], + 'Route 23-Grass': [], 'Route 24': [], + 'Route 25': [{'address': 'Warps_Route25', 'id': 0, 'to': {'map': "Bill's House", 'id': 0}}], + 'Indigo Plateau': [ + {'address': 'Warps_IndigoPlateau', 'id': (0, 1), 'to': {'map': 'Indigo Plateau Lobby', 'id': (0, 1)}}], + 'Saffron City': [ + {'address': 'Warps_SaffronCity', 'id': 1, 'to': {'map': 'Saffron Fighting Dojo', 'id': 0}}, + {'address': 'Warps_SaffronCity', 'id': 4, 'to': {'map': 'Saffron Pokemart', 'id': 0}}, + {'address': 'Warps_SaffronCity', 'id': 6, 'to': {'map': 'Saffron Pokemon Center', 'id': 0}}, + {'address': 'Warps_SaffronCity', 'id': 7, 'to': {'map': "Saffron Mr. Psychic's House", 'id': 0}}], + 'Saffron City-Pidgey': [ + {'address': 'Warps_SaffronCity', 'id': 3, 'to': {'map': 'Saffron Pidgey House', 'id': 0}}], + 'Saffron City-Copycat': [ + {'address': 'Warps_SaffronCity', 'id': 0, 'to': {'map': "Saffron Copycat's House 1F", 'id': 0}}], + 'Saffron City-G': [{'address': 'Warps_SaffronCity', 'id': 2, 'to': {'map': 'Saffron Gym-S', 'id': 0}}], + 'Saffron City-Silph': [{'address': 'Warps_SaffronCity', 'id': 5, 'to': {'map': 'Silph Co 1F', 'id': 0}}], + 'Victory Road 2F-E': [ + {'address': 'Warps_VictoryRoad2F', 'id': (1, 2), 'to': {'map': 'Route 23-N', 'id': 3}}, + {'address': 'Warps_VictoryRoad2F', 'id': 5, 'to': {'map': 'Victory Road 3F-SE', 'id': 1}}], + 'Victory Road 2F-W': [ + {'address': 'Warps_VictoryRoad2F', 'id': 0, 'to': {'map': 'Victory Road 1F', 'id': 2}}], + 'Victory Road 2F-NW': [ + {'address': 'Warps_VictoryRoad2F', 'id': 6, 'to': {'map': 'Victory Road 3F', 'id': 3}}], + 'Victory Road 2F-C': [ + {'address': 'Warps_VictoryRoad2F', 'id': 3, 'to': {'map': 'Victory Road 3F', 'id': 0}}], + 'Victory Road 2F-SE': [ + {'address': 'Warps_VictoryRoad2F', 'id': 4, 'to': {'map': 'Victory Road 3F-SE', 'id': 2}}], + 'Victory Road 2F-Wild': [], + 'Mt Moon B1F-W': [{'address': 'Warps_MtMoonB1F', 'id': 0, 'to': {'map': 'Mt Moon 1F', 'id': 2}}, + {'address': 'Warps_MtMoonB1F', 'id': 4, 'to': {'map': 'Mt Moon B2F', 'id': 1}}], + 'Mt Moon B1F-C': [{'address': 'Warps_MtMoonB1F', 'id': 1, 'to': {'map': 'Mt Moon B2F-NE', 'id': 0}}, + {'address': 'Warps_MtMoonB1F', 'id': 2, 'to': {'map': 'Mt Moon 1F', 'id': 3}}], + 'Mt Moon B1F-NE': [{'address': 'Warps_MtMoonB1F', 'id': 6, 'to': {'map': 'Mt Moon B2F', 'id': 3}}, + {'address': 'Warps_MtMoonB1F', 'id': 7, 'to': {'map': 'Route 4-C', 'id': 2}}], + 'Mt Moon B1F-SE': [{'address': 'Warps_MtMoonB1F', 'id': 3, 'to': {'map': 'Mt Moon 1F', 'id': 4}}, + {'address': 'Warps_MtMoonB1F', 'id': 5, 'to': {'map': 'Mt Moon B2F-C', 'id': 2}}], + 'Mt Moon B1F-Wild': [], + 'Silph Co 7F': [{'address': 'Warps_SilphCo7F', 'id': 0, 'to': {'map': 'Silph Co 8F', 'id': 1}}, + {'address': 'Warps_SilphCo7F', 'id': 1, 'to': {'map': 'Silph Co 6F', 'id': 0}}, + {'address': 'Warps_SilphCo7F', 'id': 2, 'to': {'map': 'Silph Co Elevator-7F', 'id': 6}}], + 'Silph Co 7F-NW': [{'address': 'Warps_SilphCo7F', 'id': 4, 'to': {'map': 'Silph Co 3F-C', 'id': 8}}, + {'address': 'Warps_SilphCo7F', 'id': 3, 'to': {'map': 'Silph Co 11F-W', 'id': 3}}], + 'Silph Co 7F-SE': [{'address': 'Warps_SilphCo7F', 'id': 5, 'to': {'map': 'Silph Co 5F', 'id': 3}}], + 'Silph Co 7F-E': [], 'Silph Co 11F-C': [], + 'Route 2-NW': [{'address': 'Warps_Route2', 'id': 1, 'to': {'map': 'Viridian Forest North Gate', 'id': 1}}], + 'Route 2-SW': [{'address': 'Warps_Route2', 'id': 5, 'to': {'map': 'Viridian Forest South Gate', 'id': 2}}], + 'Route 2-NE': [{'address': 'Warps_Route2', 'id': 0, 'to': {'map': "Diglett's Cave Route 2", 'id': 0}}, + {'address': 'Warps_Route2', 'id': 2, 'to': {'map': 'Route 2 Trade House', 'id': 0}}], + 'Route 2-E': [{'address': 'Warps_Route2', 'id': 3, 'to': {'map': 'Route 2 Gate', 'id': 1}}], + 'Route 2-SE': [{'address': 'Warps_Route2', 'id': 4, 'to': {'map': 'Route 2 Gate', 'id': 2}}], + 'Route 2-Grass': [], 'Route 3': [], + 'Route 4-W': [{'address': 'Warps_Route4', 'id': 0, 'to': {'map': 'Route 4 Pokemon Center', 'id': 0}}, + {'address': 'Warps_Route4', 'id': 1, 'to': {'map': 'Mt Moon 1F', 'id': 0}}], + 'Route 4-C': [{'address': 'Warps_Route4', 'id': 2, 'to': {'map': 'Mt Moon B1F-NE', 'id': 7}}], + 'Route 4-E': [], 'Route 4-Lass': [], 'Route 4-Grass': [], + 'Route 5': [{'address': 'Warps_Route5', 'id': (1, 0), 'to': {'map': 'Route 5 Gate-N', 'id': (3, 2)}}, + {'address': 'Warps_Route5', 'id': 3, 'to': {'map': 'Underground Path Route 5', 'id': 0}}, + {'address': 'Warps_Route5', 'id': 4, 'to': {'map': 'Daycare', 'id': 0}}], 'Route 9': [], + 'Route 5-S': [{'address': 'Warps_Route5', 'id': 2, 'to': {'map': 'Route 5 Gate-S', 'id': 0}}], + 'Route 13': [], 'Route 13-E': [], 'Route 13-Grass': [], 'Route 14': [], 'Route 14-Grass': [], + 'Route 17': [], 'Route 19-S': [], 'Route 19-N': [], 'Route 21': [], 'Vermilion Old Rod House': [ + {'address': 'Warps_VermilionOldRodHouse', 'id': (0, 1), 'to': {'map': 'Vermilion City', 'id': 8}}], + 'Celadon Department Store 2F': [ + {'address': 'Warps_CeladonMart2F', 'id': 0, 'to': {'map': 'Celadon Department Store 1F', 'id': 4}}, + {'address': 'Warps_CeladonMart2F', 'id': 1, 'to': {'map': 'Celadon Department Store 3F', 'id': 1}}, + {'address': 'Warps_CeladonMart2F', 'id': 2, + 'to': {'map': 'Celadon Department Store Elevator-2F', 'id': 1}}], 'Fuchsia Good Rod House': [ + {'address': 'Warps_FuchsiaGoodRodHouse', 'id': 0, + 'to': {'map': 'Fuchsia City-Good Rod House Backyard', 'id': 8}}, + {'address': 'Warps_FuchsiaGoodRodHouse', 'id': (1, 2), 'to': {'map': 'Fuchsia City', 'id': 7}}], + 'Daycare': [{'address': 'Warps_Daycare', 'id': (0, 1), 'to': {'map': 'Route 5', 'id': 4}}], + 'Route 12 Super Rod House': [ + {'address': 'Warps_Route12SuperRodHouse', 'id': (0, 1), 'to': {'map': 'Route 12-S', 'id': 3}}], + 'Silph Co 8F': [{'address': 'Warps_SilphCo8F', 'id': 0, 'to': {'map': 'Silph Co 9F', 'id': 1}}, + {'address': 'Warps_SilphCo8F', 'id': 1, 'to': {'map': 'Silph Co 7F', 'id': 0}}, + {'address': 'Warps_SilphCo8F', 'id': 2, 'to': {'map': 'Silph Co Elevator-8F', 'id': 7}}, + {'name': 'Silph Co 8F to Silph Co 2F S', 'address': 'Warps_SilphCo8F', 'id': 4, + 'to': {'map': 'Silph Co 2F', 'id': 4}}, + {'name': 'Silph Co 8F to Silph Co 2F N', 'address': 'Warps_SilphCo8F', 'id': 5, + 'to': {'map': 'Silph Co 2F', 'id': 5}}, + {'address': 'Warps_SilphCo8F', 'id': 6, 'to': {'map': 'Silph Co 8F-W', 'id': 3}}], + 'Silph Co 8F-W': [{'address': 'Warps_SilphCo8F', 'id': 3, 'to': {'map': 'Silph Co 8F', 'id': 6}}], + 'Route 6': [{'address': 'Warps_Route6', 'id': 2, 'to': {'map': 'Route 6 Gate-S', 'id': 0}}, + {'address': 'Warps_Route6', 'id': 3, 'to': {'map': 'Underground Path Route 6', 'id': 0}}], + 'Route 6-N': [{'address': 'Warps_Route6', 'id': 1, 'to': {'map': 'Route 6 Gate-N', 'id': 2}}], + 'Route 8-W': [{'address': 'Warps_Route8', 'id': (0, 1), 'to': {'map': 'Route 8 Gate-W', 'id': (0, 1)}}], + 'Route 8': [{'address': 'Warps_Route8', 'id': (2, 3), 'to': {'map': 'Route 8 Gate-E', 'id': (2, 3)}}, + {'address': 'Warps_Route8', 'id': 4, 'to': {'map': 'Underground Path Route 8', 'id': 0}}], + 'Route 8-Grass': [], + 'Route 10-N': [{'address': 'Warps_Route10', 'id': 0, 'to': {'map': 'Rock Tunnel Pokemon Center', 'id': 0}}, + {'address': 'Warps_Route10', 'id': 1, 'to': {'map': 'Rock Tunnel 1F-NE', 'id': 0}}], + 'Route 10-S': [{'address': 'Warps_Route10', 'id': 2, 'to': {'map': 'Rock Tunnel 1F-S', 'id': 2}}], + 'Route 10-P': [{'address': 'Warps_Route10', 'id': 3, 'to': {'map': 'Power Plant', 'id': 0}}], + 'Route 10-C': [], + 'Route 11': [{'address': 'Warps_Route11', 'id': 4, 'to': {'map': "Diglett's Cave Route 11", 'id': 0}}], + 'Route 11-E': [ + {'address': 'Warps_Route11', 'id': (2, 3), 'to': {'map': 'Route 11 Gate 1F', 'id': (2, 3)}}], + 'Route 11-C': [ + {'address': 'Warps_Route11', 'id': (0, 1), 'to': {'map': 'Route 11 Gate 1F', 'id': (0, 1)}}], + 'Route 12-L': [ + {'address': 'Warps_Route12', 'id': (0, 1), 'to': {'map': 'Route 12 Gate 1F', 'id': (0, 1)}}], + 'Route 12-N': [{'address': 'Warps_Route12', 'id': 2, 'to': {'map': 'Route 12 Gate 1F', 'id': 2}}], + 'Route 12-S': [{'address': 'Warps_Route12', 'id': 3, 'to': {'map': 'Route 12 Super Rod House', 'id': 0}}], + 'Route 12-W': [], 'Route 12-Grass': [], 'Route 15-N': [], 'Route 15-W': [ + {'address': 'Warps_Route15', 'id': (0, 1), 'to': {'map': 'Route 15 Gate 1F', 'id': (0, 1)}}], + 'Route 15': [{'address': 'Warps_Route15', 'id': (2, 3), 'to': {'map': 'Route 15 Gate 1F', 'id': (2, 3)}}], + 'Route 16-E': [], + 'Route 16-C': [{'address': 'Warps_Route16', 'id': 2, 'to': {'map': 'Route 16 Gate 1F-E', 'id': (2, 3)}}], + 'Route 16-SW': [ + {'address': 'Warps_Route16', 'id': (0, 1), 'to': {'map': 'Route 16 Gate 1F-W', 'id': (0, 1)}}], + 'Route 16-NW': [ + {'address': 'Warps_Route16', 'id': (4, 5), 'to': {'map': 'Route 16 Gate 1F-N', 'id': (4, 5)}}, + {'address': 'Warps_Route16', 'id': 8, 'to': {'map': 'Route 16 Fly House', 'id': 0}}], 'Route 16-NE': [ + {'address': 'Warps_Route16', 'id': (6, 7), 'to': {'map': 'Route 16 Gate 1F-N', 'id': (6, 7)}}], 'Route 18-W': [ + {'address': 'Warps_Route18', 'id': (0, 1), 'to': {'map': 'Route 18 Gate 1F-W', 'id': (0, 1)}}], 'Route 18-E': [ + {'address': 'Warps_Route18', 'id': (2, 3), 'to': {'map': 'Route 18 Gate 1F-E', 'id': (2, 3)}}], + 'Vermilion Pokemon Fan Club': [ + {'address': 'Warps_PokemonFanClub', 'id': (0, 1), 'to': {'map': 'Vermilion City', 'id': 1}}], + 'Silph Co 2F-NW': [{'address': 'Warps_SilphCo2F', 'id': 3, 'to': {'map': 'Silph Co 3F', 'id': 6}}], + 'Silph Co 2F': [{'address': 'Warps_SilphCo2F', 'id': 0, 'to': {'map': 'Silph Co 1F', 'id': 2}}, + {'address': 'Warps_SilphCo2F', 'id': 1, 'to': {'map': 'Silph Co 3F', 'id': 0}}, + {'address': 'Warps_SilphCo2F', 'id': 2, 'to': {'map': 'Silph Co Elevator-2F', 'id': 1}}, + {'name': 'Silph Co 2F to Silph Co 8F N', 'address': 'Warps_SilphCo2F', 'id': 4, + 'to': {'map': 'Silph Co 8F', 'id': 4}}, + {'name': 'Silph Co 2F to Silph Co 8F S', 'address': 'Warps_SilphCo2F', 'id': 5, + 'to': {'map': 'Silph Co 8F', 'id': 5}}], + 'Silph Co 2F-SW': [{'address': 'Warps_SilphCo2F', 'id': 6, 'to': {'map': 'Silph Co 6F', 'id': 4}}], + 'Silph Co 3F': [{'address': 'Warps_SilphCo3F', 'id': 0, 'to': {'map': 'Silph Co 2F', 'id': 1}}, + {'address': 'Warps_SilphCo3F', 'id': 1, 'to': {'map': 'Silph Co 4F', 'id': 0}}, + {'address': 'Warps_SilphCo3F', 'id': 2, 'to': {'map': 'Silph Co Elevator-3F', 'id': 2}}, + {'name': 'Silph Co 3F to Silph Co 3F N', 'address': 'Warps_SilphCo3F', 'id': 3, + 'to': {'map': 'Silph Co 3F', 'id': 9}}, + {'address': 'Warps_SilphCo3F', 'id': 4, 'to': {'map': 'Silph Co 5F', 'id': 5}}, + {'address': 'Warps_SilphCo3F', 'id': 5, 'to': {'map': 'Silph Co 5F-SW', 'id': 6}}, + {'address': 'Warps_SilphCo3F', 'id': 6, 'to': {'map': 'Silph Co 2F-NW', 'id': 3}}, + {'name': 'Silph Co 3F to Silph Co 3F S', 'address': 'Warps_SilphCo3F', 'id': 9, + 'to': {'map': 'Silph Co 3F', 'id': 3}}], + 'Silph Co 3F-C': [{'address': 'Warps_SilphCo3F', 'id': 8, 'to': {'map': 'Silph Co 7F-NW', 'id': 4}}], + 'Silph Co 3F-W': [{'address': 'Warps_SilphCo3F', 'id': 7, 'to': {'map': 'Silph Co 9F-NW', 'id': 3}}], + 'Silph Co 10F': [{'address': 'Warps_SilphCo10F', 'id': 0, 'to': {'map': 'Silph Co 9F', 'id': 0}}, + {'address': 'Warps_SilphCo10F', 'id': 1, 'to': {'map': 'Silph Co 11F', 'id': 0}}, + {'address': 'Warps_SilphCo10F', 'id': 2, 'to': {'map': 'Silph Co Elevator-10F', 'id': 9}}, + {'address': 'Warps_SilphCo10F', 'id': 5, 'to': {'map': 'Silph Co 4F', 'id': 6}}], + 'Silph Co 10F-SE': [{'address': 'Warps_SilphCo10F', 'id': 3, 'to': {'map': 'Silph Co 4F-N', 'id': 3}}, + {'address': 'Warps_SilphCo10F', 'id': 4, 'to': {'map': 'Silph Co 4F', 'id': 5}}], + "Indigo Plateau Lance's Room": [ + {'address': 'Warps_LancesRoom', 'id': 0, 'to': {'map': "Indigo Plateau Agatha's Room", 'id': 2}}, + {'address': 'Warps_LancesRoom', 'id': (1, 2), + 'to': {'map': "Indigo Plateau Champion's Room", 'id': 0}}], 'Indigo Plateau Hall of Fame': [ + {'address': 'Warps_HallOfFame', 'id': 0, 'to': {'map': "Indigo Plateau Champion's Room", 'id': (2, 3)}}], + "Player's House 2F": [ + {'address': 'Warps_RedsHouse2F', 'id': 0, 'to': {'map': "Player's House 1F", 'id': 2}}], + 'Pewter Museum 1F': [{'address': 'Warps_Museum1F', 'id': (0, 1), 'to': {'map': 'Pewter City', 'id': 0}}, + {'address': 'Warps_Museum1F', 'id': 4, 'to': {'map': 'Pewter Museum 2F', 'id': 0}}], + 'Pewter Museum 1F-E': [ + {'address': 'Warps_Museum1F', 'id': (2, 3), 'to': {'map': 'Pewter City-M', 'id': 1}}], + 'Pewter Museum 2F': [{'address': 'Warps_Museum2F', 'id': 0, 'to': {'map': 'Pewter Museum 1F', 'id': 4}}], + 'Pewter Gym': [{'address': 'Warps_PewterGym', 'id': (0, 1), 'to': {'map': 'Pewter City', 'id': 2}}], + 'Pewter Pokemon Center': [ + {'address': 'Warps_PewterPokecenter', 'id': (0, 1), 'to': {'map': 'Pewter City', 'id': 6}}], + 'Cerulean Pokemon Center': [ + {'address': 'Warps_CeruleanPokecenter', 'id': (0, 1), 'to': {'map': 'Cerulean City', 'id': 2}}], + 'Cerulean Gym': [{'address': 'Warps_CeruleanGym', 'id': (0, 1), 'to': {'map': 'Cerulean City', 'id': 3}}], + 'Cerulean Pokemart': [ + {'address': 'Warps_CeruleanMart', 'id': (0, 1), 'to': {'map': 'Cerulean City', 'id': 5}}], + 'Lavender Pokemon Center': [ + {'address': 'Warps_LavenderPokecenter', 'id': (0, 1), 'to': {'map': 'Lavender Town', 'id': 0}}], + 'Lavender Pokemart': [ + {'address': 'Warps_LavenderMart', 'id': (0, 1), 'to': {'map': 'Lavender Town', 'id': 3}}], + 'Vermilion Pokemon Center': [ + {'address': 'Warps_VermilionPokecenter', 'id': (0, 1), 'to': {'map': 'Vermilion City', 'id': 0}}], + 'Vermilion Pokemart': [ + {'address': 'Warps_VermilionMart', 'id': (0, 1), 'to': {'map': 'Vermilion City', 'id': 2}}], + 'Vermilion Gym': [ + {'address': 'Warps_VermilionGym', 'id': (0, 1), 'to': {'map': 'Vermilion City-G', 'id': 3}}], + "Saffron Copycat's House 2F": [ + {'address': 'Warps_CopycatsHouse2F', 'id': 0, 'to': {'map': "Saffron Copycat's House 1F", 'id': 2}}], + 'Saffron Fighting Dojo': [ + {'address': 'Warps_FightingDojo', 'id': (0, 1), 'to': {'map': 'Saffron City', 'id': 1}}], + 'Saffron Gym-NW': [{'address': 'Warps_SaffronGym', 'id': 2, 'to': {'map': 'Saffron Gym-NE', 'id': 22}}, + {'address': 'Warps_SaffronGym', 'id': 3, 'to': {'map': 'Saffron Gym-N', 'id': 15}}, + {'address': 'Warps_SaffronGym', 'id': 4, 'to': {'map': 'Saffron Gym-C', 'id': 18}}, + {'address': 'Warps_SaffronGym', 'id': 5, 'to': {'map': 'Saffron Gym-W', 'id': 8}}], + 'Saffron Gym-W': [{'address': 'Warps_SaffronGym', 'id': 6, 'to': {'map': 'Saffron Gym-E', 'id': 27}}, + {'address': 'Warps_SaffronGym', 'id': 7, 'to': {'map': 'Saffron Gym-N', 'id': 16}}, + {'address': 'Warps_SaffronGym', 'id': 8, 'to': {'map': 'Saffron Gym-NW', 'id': 5}}, + {'address': 'Warps_SaffronGym', 'id': 9, 'to': {'map': 'Saffron Gym-SW', 'id': 13}}], + 'Saffron Gym-SW': [{'address': 'Warps_SaffronGym', 'id': 10, 'to': {'map': 'Saffron Gym-NE', 'id': 23}}, + {'address': 'Warps_SaffronGym', 'id': 11, 'to': {'map': 'Saffron Gym-SE', 'id': 30}}, + {'address': 'Warps_SaffronGym', 'id': 12, 'to': {'map': 'Saffron Gym-N', 'id': 17}}, + {'address': 'Warps_SaffronGym', 'id': 13, 'to': {'map': 'Saffron Gym-W', 'id': 9}}], + 'Saffron Gym-N': [{'address': 'Warps_SaffronGym', 'id': 14, 'to': {'map': 'Saffron Gym-E', 'id': 26}}, + {'address': 'Warps_SaffronGym', 'id': 15, 'to': {'map': 'Saffron Gym-NW', 'id': 3}}, + {'address': 'Warps_SaffronGym', 'id': 16, 'to': {'map': 'Saffron Gym-W', 'id': 7}}, + {'address': 'Warps_SaffronGym', 'id': 17, 'to': {'map': 'Saffron Gym-SW', 'id': 12}}], + 'Saffron Gym-C': [{'address': 'Warps_SaffronGym', 'id': 18, 'to': {'map': 'Saffron Gym-NW', 'id': 4}}], + 'Saffron Gym-S': [{'address': 'Warps_SaffronGym', 'id': 19, 'to': {'map': 'Saffron Gym-SE', 'id': 31}}, + {'address': 'Warps_SaffronGym', 'id': (0, 1), 'to': {'map': 'Saffron City-G', 'id': 2}}], + 'Saffron Gym-NE': [{'address': 'Warps_SaffronGym', 'id': 20, 'to': {'map': 'Saffron Gym-E', 'id': 24}}, + {'address': 'Warps_SaffronGym', 'id': 21, 'to': {'map': 'Saffron Gym-SE', 'id': 28}}, + {'address': 'Warps_SaffronGym', 'id': 22, 'to': {'map': 'Saffron Gym-NW', 'id': 2}}, + {'address': 'Warps_SaffronGym', 'id': 23, 'to': {'map': 'Saffron Gym-SW', 'id': 10}}], + 'Saffron Gym-E': [{'address': 'Warps_SaffronGym', 'id': 24, 'to': {'map': 'Saffron Gym-NE', 'id': 20}}, + {'address': 'Warps_SaffronGym', 'id': 25, 'to': {'map': 'Saffron Gym-SE', 'id': 29}}, + {'address': 'Warps_SaffronGym', 'id': 26, 'to': {'map': 'Saffron Gym-N', 'id': 14}}, + {'address': 'Warps_SaffronGym', 'id': 27, 'to': {'map': 'Saffron Gym-W', 'id': 6}}], + 'Saffron Gym-SE': [{'address': 'Warps_SaffronGym', 'id': 28, 'to': {'map': 'Saffron Gym-NE', 'id': 21}}, + {'address': 'Warps_SaffronGym', 'id': 29, 'to': {'map': 'Saffron Gym-E', 'id': 25}}, + {'address': 'Warps_SaffronGym', 'id': 30, 'to': {'map': 'Saffron Gym-SW', 'id': 11}}, + {'address': 'Warps_SaffronGym', 'id': 31, 'to': {'map': 'Saffron Gym-S', 'id': 19}}], + 'Saffron Pokemart': [ + {'address': 'Warps_SaffronMart', 'id': (0, 1), 'to': {'map': 'Saffron City', 'id': 4}}], + 'Silph Co 1F': [{'address': 'Warps_SilphCo1F', 'id': (0, 1), 'to': {'map': 'Saffron City-Silph', 'id': 5}}, + {'address': 'Warps_SilphCo1F', 'id': 2, 'to': {'map': 'Silph Co 2F', 'id': 0}}, + {'address': 'Warps_SilphCo1F', 'id': 3, 'to': {'map': 'Silph Co Elevator-1F', 'id': 0}}], + 'Saffron Pokemon Center': [ + {'address': 'Warps_SaffronPokecenter', 'id': (0, 1), 'to': {'map': 'Saffron City', 'id': 6}}], + 'Viridian Forest North Gate': [ + {'address': 'Warps_ViridianForestNorthGate', 'id': 1, 'to': {'map': 'Route 2-NW', 'id': 1}}, + {'address': 'Warps_ViridianForestNorthGate', 'id': (2, 3), 'to': {'map': 'Viridian Forest', 'id': 0}}], + 'Route 2 Gate': [{'address': 'Warps_Route2Gate', 'id': 1, 'to': {'map': 'Route 2-E', 'id': 3}}, + {'address': 'Warps_Route2Gate', 'id': (2, 3), 'to': {'map': 'Route 2-SE', 'id': 4}}], + 'Viridian Forest South Gate': [ + {'address': 'Warps_ViridianForestSouthGate', 'id': 1, 'to': {'map': 'Viridian Forest', 'id': 4}}, + {'address': 'Warps_ViridianForestSouthGate', 'id': (2, 3), 'to': {'map': 'Route 2-SW', 'id': 5}}], + 'Underground Path Route 5': [ + {'address': 'Warps_UndergroundPathRoute5', 'id': (0, 1), 'to': {'map': 'Route 5', 'id': 3}}, + {'address': 'Warps_UndergroundPathRoute5', 'id': 2, + 'to': {'map': 'Underground Path North South', 'id': 0}}], 'Underground Path Route 6': [ + {'address': 'Warps_UndergroundPathRoute6', 'id': (0, 1), 'to': {'map': 'Route 6', 'id': 3}}, + {'address': 'Warps_UndergroundPathRoute6', 'id': 2, 'to': {'map': 'Underground Path North South', 'id': 1}}], + 'Underground Path Route 7': [ + {'address': 'Warps_UndergroundPathRoute7', 'id': (0, 1), 'to': {'map': 'Route 7', 'id': 4}}, + {'address': 'Warps_UndergroundPathRoute7', 'id': 2, + 'to': {'map': 'Underground Path West East', 'id': 0}}], 'Silph Co 9F-SW': [], + 'Silph Co 9F': [{'address': 'Warps_SilphCo9F', 'id': 0, 'to': {'map': 'Silph Co 10F', 'id': 0}}, + {'address': 'Warps_SilphCo9F', 'id': 1, 'to': {'map': 'Silph Co 8F', 'id': 0}}, + {'address': 'Warps_SilphCo9F', 'id': 2, 'to': {'map': 'Silph Co Elevator-9F', 'id': 8}}, + {'address': 'Warps_SilphCo9F', 'id': 4, 'to': {'map': 'Silph Co 5F', 'id': 4}}], + 'Silph Co 9F-NW': [{'address': 'Warps_SilphCo9F', 'id': 3, 'to': {'map': 'Silph Co 3F-W', 'id': 7}}], + 'Victory Road 1F-S': [ + {'address': 'Warps_VictoryRoad1F', 'id': (0, 1), 'to': {'map': 'Route 23-C', 'id': 2}}], + 'Victory Road 1F': [ + {'address': 'Warps_VictoryRoad1F', 'id': 2, 'to': {'map': 'Victory Road 2F-W', 'id': 0}}], + 'Pokemon Tower 1F': [ + {'address': 'Warps_PokemonTower1F', 'id': (0, 1), 'to': {'map': 'Lavender Town', 'id': 1}}, + {'address': 'Warps_PokemonTower1F', 'id': 2, 'to': {'map': 'Pokemon Tower 2F', 'id': 1}}], + 'Pokemon Tower 2F': [ + {'address': 'Warps_PokemonTower2F', 'id': 0, 'to': {'map': 'Pokemon Tower 3F', 'id': 0}}, + {'address': 'Warps_PokemonTower2F', 'id': 1, 'to': {'map': 'Pokemon Tower 1F', 'id': 2}}], + 'Pokemon Tower 3F': [ + {'address': 'Warps_PokemonTower3F', 'id': 0, 'to': {'map': 'Pokemon Tower 2F', 'id': 0}}, + {'address': 'Warps_PokemonTower3F', 'id': 1, 'to': {'map': 'Pokemon Tower 4F', 'id': 1}}], + 'Pokemon Tower 4F': [ + {'address': 'Warps_PokemonTower4F', 'id': 0, 'to': {'map': 'Pokemon Tower 5F', 'id': 0}}, + {'address': 'Warps_PokemonTower4F', 'id': 1, 'to': {'map': 'Pokemon Tower 3F', 'id': 1}}], + 'Pokemon Tower 5F': [ + {'address': 'Warps_PokemonTower5F', 'id': 0, 'to': {'map': 'Pokemon Tower 4F', 'id': 0}}, + {'address': 'Warps_PokemonTower5F', 'id': 1, 'to': {'map': 'Pokemon Tower 6F', 'id': 0}}], + 'Pokemon Tower 6F': [ + {'address': 'Warps_PokemonTower6F', 'id': 0, 'to': {'map': 'Pokemon Tower 5F', 'id': 1}}], + 'Pokemon Tower 6F-S': [ + {'address': 'Warps_PokemonTower6F', 'id': 1, 'to': {'map': 'Pokemon Tower 7F', 'id': 0}}], + 'Pokemon Tower 7F': [ + {'address': 'Warps_PokemonTower7F', 'id': 0, 'to': {'map': 'Pokemon Tower 6F-S', 'id': 1}}], + 'Celadon Department Store 1F': [ + {'name': 'Celadon Department Store 1F to Celadon City W', 'address': 'Warps_CeladonMart1F', + 'id': (1, 0), 'to': {'map': 'Celadon City', 'id': 0}}, + {'name': 'Celadon Department Store 1F to Celadon City E', 'address': 'Warps_CeladonMart1F', + 'id': (3, 2), 'to': {'map': 'Celadon City', 'id': 1}}, + {'address': 'Warps_CeladonMart1F', 'id': 4, 'to': {'map': 'Celadon Department Store 2F', 'id': 0}}, + {'address': 'Warps_CeladonMart1F', 'id': 5, + 'to': {'map': 'Celadon Department Store Elevator-1F', 'id': 0}}], 'Viridian Forest': [ + {'address': 'Warps_ViridianForest', 'id': (0, 1), 'to': {'map': 'Viridian Forest North Gate', 'id': (2, 3)}}, + {'address': 'Warps_ViridianForest', 'id': (4, 2, 5, 3), 'to': {'map': 'Viridian Forest South Gate', 'id': 1}}], + 'S.S. Anne 1F': [{'address': 'Warps_SSAnne1F', 'id': (0, 1), 'to': {'map': 'Vermilion Dock', 'id': 1}}, + {'address': 'Warps_SSAnne1F', 'id': 2, + 'to': {'map': 'S.S. Anne 1F Rooms-East Gentleman Room', 'id': 0}}, + {'address': 'Warps_SSAnne1F', 'id': 3, + 'to': {'map': 'S.S. Anne 1F Rooms-West Gentleman Room', 'id': 1}}, + {'address': 'Warps_SSAnne1F', 'id': 4, + 'to': {'map': 'S.S. Anne 1F Rooms-Cherry Pie Room', 'id': 2}}, + {'address': 'Warps_SSAnne1F', 'id': 5, + 'to': {'map': 'S.S. Anne 1F Rooms-Wigglytuff Room', 'id': 3}}, + {'address': 'Warps_SSAnne1F', 'id': 6, + 'to': {'map': 'S.S. Anne 1F Rooms-Youngster and Lass Room', 'id': 4}}, + {'address': 'Warps_SSAnne1F', 'id': 7, + 'to': {'map': 'S.S. Anne 1F Rooms-Police Room', 'id': 5}}, + {'address': 'Warps_SSAnne1F', 'id': 8, 'to': {'map': 'S.S. Anne 2F', 'id': 6}}, + {'address': 'Warps_SSAnne1F', 'id': 9, 'to': {'map': 'S.S. Anne B1F', 'id': 5}}, + {'address': 'Warps_SSAnne1F', 'id': 10, 'to': {'map': 'S.S. Anne Kitchen', 'id': 0}}], + 'S.S. Anne 2F': [ + {'address': 'Warps_SSAnne2F', 'id': 0, 'to': {'map': 'S.S. Anne 2F Rooms-Snorlax Room', 'id': 0}}, + {'address': 'Warps_SSAnne2F', 'id': 1, + 'to': {'map': 'S.S. Anne 2F Rooms-Fisherman and Gentleman Room', 'id': 2}}, + {'address': 'Warps_SSAnne2F', 'id': 2, 'to': {'map': 'S.S. Anne 2F Rooms-Surf and Cut Room', 'id': 4}}, + {'address': 'Warps_SSAnne2F', 'id': 3, + 'to': {'map': 'S.S. Anne 2F Rooms-Gentleman and Lass Room', 'id': 6}}, + {'address': 'Warps_SSAnne2F', 'id': 4, 'to': {'map': 'S.S. Anne 2F Rooms-Safari Zone Room', 'id': 8}}, + {'address': 'Warps_SSAnne2F', 'id': 5, 'to': {'map': 'S.S. Anne 2F Rooms-Seasickness Room', 'id': 10}}, + {'address': 'Warps_SSAnne2F', 'id': 6, 'to': {'map': 'S.S. Anne 1F', 'id': 8}}, + {'address': 'Warps_SSAnne2F', 'id': 7, 'to': {'map': 'S.S. Anne 3F', 'id': 1}}, + {'address': 'Warps_SSAnne2F', 'id': 8, 'to': {'map': "S.S. Anne Captain's Room", 'id': 0}}], + 'S.S. Anne B1F': [ + {'address': 'Warps_SSAnneB1F', 'id': 0, 'to': {'map': 'S.S. Anne B1F Rooms-Machoke Room', 'id': 8}}, + {'address': 'Warps_SSAnneB1F', 'id': 1, + 'to': {'map': 'S.S. Anne B1F Rooms-Two Sailors Room', 'id': 6}}, + {'address': 'Warps_SSAnneB1F', 'id': 2, + 'to': {'map': 'S.S. Anne B1F Rooms-East Single Sailor Room', 'id': 4}}, + {'address': 'Warps_SSAnneB1F', 'id': 3, + 'to': {'map': 'S.S. Anne B1F Rooms-West Single Sailor Room', 'id': 2}}, + {'address': 'Warps_SSAnneB1F', 'id': 4, 'to': {'map': 'S.S. Anne B1F Rooms-Fisherman Room', 'id': 0}}, + {'address': 'Warps_SSAnneB1F', 'id': 5, 'to': {'map': 'S.S. Anne 1F', 'id': 9}}], + 'S.S. Anne Bow': [{'address': 'Warps_SSAnneBow', 'id': (0, 1), 'to': {'map': 'S.S. Anne 3F', 'id': 0}}], + 'S.S. Anne Kitchen': [ + {'address': 'Warps_SSAnneKitchen', 'id': 0, 'to': {'map': 'S.S. Anne 1F', 'id': 10}}], + "S.S. Anne Captain's Room": [ + {'address': 'Warps_SSAnneCaptainsRoom', 'id': 0, 'to': {'map': 'S.S. Anne 2F', 'id': 8}}], + 'S.S. Anne 1F Rooms-West Gentleman Room': [ + {'address': 'Warps_SSAnne1FRooms', 'id': 1, 'to': {'map': 'S.S. Anne 1F', 'id': 3}}], + 'S.S. Anne 1F Rooms-East Gentleman Room': [ + {'address': 'Warps_SSAnne1FRooms', 'id': 0, 'to': {'map': 'S.S. Anne 1F', 'id': 2}}], + 'S.S. Anne 1F Rooms-Police Room': [ + {'address': 'Warps_SSAnne1FRooms', 'id': 5, 'to': {'map': 'S.S. Anne 1F', 'id': 7}}], + 'S.S. Anne 1F Rooms-Youngster and Lass Room': [ + {'address': 'Warps_SSAnne1FRooms', 'id': 4, 'to': {'map': 'S.S. Anne 1F', 'id': 6}}], + 'S.S. Anne 1F Rooms-Wigglytuff Room': [ + {'address': 'Warps_SSAnne1FRooms', 'id': 3, 'to': {'map': 'S.S. Anne 1F', 'id': 5}}], + 'S.S. Anne 1F Rooms-Cherry Pie Room': [ + {'address': 'Warps_SSAnne1FRooms', 'id': 2, 'to': {'map': 'S.S. Anne 1F', 'id': 4}}], + 'S.S. Anne 2F Rooms-Snorlax Room': [ + {'address': 'Warps_SSAnne2FRooms', 'id': (0, 1), 'to': {'map': 'S.S. Anne 2F', 'id': 0}}], + 'S.S. Anne 2F Rooms-Fisherman and Gentleman Room': [ + {'address': 'Warps_SSAnne2FRooms', 'id': (2, 3), 'to': {'map': 'S.S. Anne 2F', 'id': 1}}], + 'S.S. Anne 2F Rooms-Surf and Cut Room': [ + {'address': 'Warps_SSAnne2FRooms', 'id': (4, 5), 'to': {'map': 'S.S. Anne 2F', 'id': 2}}], + 'S.S. Anne 2F Rooms-Gentleman and Lass Room': [ + {'address': 'Warps_SSAnne2FRooms', 'id': (6, 7), 'to': {'map': 'S.S. Anne 2F', 'id': 3}}], + 'S.S. Anne 2F Rooms-Safari Zone Room': [ + {'address': 'Warps_SSAnne2FRooms', 'id': (8, 9), 'to': {'map': 'S.S. Anne 2F', 'id': 4}}], + 'S.S. Anne 2F Rooms-Seasickness Room': [ + {'address': 'Warps_SSAnne2FRooms', 'id': (10, 11), 'to': {'map': 'S.S. Anne 2F', 'id': 5}}], + 'S.S. Anne B1F Rooms-Fisherman Room': [ + {'address': 'Warps_SSAnneB1FRooms', 'id': (0, 1), 'to': {'map': 'S.S. Anne B1F', 'id': 4}}], + 'S.S. Anne B1F Rooms-West Single Sailor Room': [ + {'address': 'Warps_SSAnneB1FRooms', 'id': (2, 3), 'to': {'map': 'S.S. Anne B1F', 'id': 3}}], + 'S.S. Anne B1F Rooms-East Single Sailor Room': [ + {'address': 'Warps_SSAnneB1FRooms', 'id': (4, 5), 'to': {'map': 'S.S. Anne B1F', 'id': 2}}], + 'S.S. Anne B1F Rooms-Two Sailors Room': [ + {'address': 'Warps_SSAnneB1FRooms', 'id': (6, 7), 'to': {'map': 'S.S. Anne B1F', 'id': 1}}], + 'S.S. Anne B1F Rooms-Machoke Room': [ + {'address': 'Warps_SSAnneB1FRooms', 'id': (8, 9), 'to': {'map': 'S.S. Anne B1F', 'id': 0}}], + 'Underground Path North South': [{'address': 'Warps_UndergroundPathNorthSouth', 'id': 0, + 'to': {'map': 'Underground Path Route 5', 'id': 2}}, + {'address': 'Warps_UndergroundPathNorthSouth', 'id': 1, + 'to': {'map': 'Underground Path Route 6', 'id': 2}}], + 'Underground Path West East': [{'address': 'Warps_UndergroundPathWestEast', 'id': 0, + 'to': {'map': 'Underground Path Route 7', 'id': 2}}, + {'address': 'Warps_UndergroundPathWestEast', 'id': 1, + 'to': {'map': 'Underground Path Route 8', 'id': 2}}], "Diglett's Cave": [ + {'address': 'Warps_DiglettsCave', 'id': 0, 'to': {'map': "Diglett's Cave Route 2", 'id': 2}}, + {'address': 'Warps_DiglettsCave', 'id': 1, 'to': {'map': "Diglett's Cave Route 11", 'id': 2}}], + 'Silph Co 11F': [{'address': 'Warps_SilphCo11F', 'id': 0, 'to': {'map': 'Silph Co 10F', 'id': 1}}, + {'address': 'Warps_SilphCo11F', 'id': 1, + 'to': {'map': 'Silph Co Elevator-11F', 'id': 10}}], + 'Silph Co 11F-W': [{'address': 'Warps_SilphCo11F', 'id': 3, 'to': {'map': 'Silph Co 7F-NW', 'id': 3}}], + 'Viridian Gym': [ + {'address': 'Warps_ViridianGym', 'id': (0, 1), 'to': {'map': 'Viridian City-G', 'id': 4}}], + 'Pewter Pokemart': [{'address': 'Warps_PewterMart', 'id': (0, 1), 'to': {'map': 'Pewter City', 'id': 4}}], + 'Cerulean Cave 1F-SE': [ + {'address': 'Warps_CeruleanCave1F', 'id': (0, 1), 'to': {'map': 'Cerulean City-Cave', 'id': 6}}, + {'address': 'Warps_CeruleanCave1F', 'id': 3, 'to': {'map': 'Cerulean Cave 2F-E', 'id': 1}}], + 'Cerulean Cave 1F-NE': [ + {'address': 'Warps_CeruleanCave1F', 'id': 2, 'to': {'map': 'Cerulean Cave 2F-E', 'id': 0}}], + 'Cerulean Cave 1F-N': [ + {'address': 'Warps_CeruleanCave1F', 'id': 5, 'to': {'map': 'Cerulean Cave 2F-N', 'id': 3}}], + 'Cerulean Cave 1F-SW': [ + {'address': 'Warps_CeruleanCave1F', 'id': 4, 'to': {'map': 'Cerulean Cave 2F-N', 'id': 2}}, + {'address': 'Warps_CeruleanCave1F', 'id': 7, 'to': {'map': 'Cerulean Cave 2F-W', 'id': 5}}], + 'Cerulean Cave 1F-NW': [ + {'address': 'Warps_CeruleanCave1F', 'id': 6, 'to': {'map': 'Cerulean Cave 2F-W', 'id': 4}}, + {'address': 'Warps_CeruleanCave1F', 'id': 8, 'to': {'map': 'Cerulean Cave B1F', 'id': 0}}], + 'Cerulean Cave 1F-Wild': [], 'Cerulean Cave 1F-Water': [], 'Cerulean Badge House': [ + {'address': 'Warps_CeruleanBadgeHouse', 'id': 0, 'to': {'map': 'Cerulean City-Badge House Backyard', 'id': 9}}, + {'address': 'Warps_CeruleanBadgeHouse', 'id': (1, 2), 'to': {'map': 'Cerulean City', 'id': 8}}], + "Fuchsia Bill's Grandpa's House": [ + {'address': 'Warps_FuchsiaBillsGrandpasHouse', 'id': (0, 1), 'to': {'map': 'Fuchsia City', 'id': 1}}], + 'Fuchsia Pokemon Center': [ + {'address': 'Warps_FuchsiaPokecenter', 'id': (0, 1), 'to': {'map': 'Fuchsia City', 'id': 2}}], + "Fuchsia Warden's House": [ + {'address': 'Warps_WardensHouse', 'id': (0, 1), 'to': {'map': 'Fuchsia City', 'id': 3}}], + 'Safari Zone Gate-S': [ + {'address': 'Warps_SafariZoneGate', 'id': (0, 1), 'to': {'map': 'Fuchsia City', 'id': 4}}], + 'Safari Zone Gate-N': [{'address': 'Warps_SafariZoneGate', 'id': (2, 3), + 'to': {'map': 'Safari Zone Center-S', 'id': (0, 1)}}], + 'Fuchsia Gym': [{'address': 'Warps_FuchsiaGym', 'id': (0, 1), 'to': {'map': 'Fuchsia City', 'id': 5}}], + 'Fuchsia Meeting Room': [ + {'address': 'Warps_FuchsiaMeetingRoom', 'id': (0, 1), 'to': {'map': 'Fuchsia City', 'id': 6}}], + 'Cinnabar Gym': [ + {'address': 'Warps_CinnabarGym', 'id': (0, 1), 'to': {'map': 'Cinnabar Island-G', 'id': 1}}], + 'Cinnabar Lab': [{'address': 'Warps_CinnabarLab', 'id': (0, 1), 'to': {'map': 'Cinnabar Island', 'id': 2}}, + {'address': 'Warps_CinnabarLab', 'id': 2, + 'to': {'map': 'Cinnabar Lab Trade Room', 'id': 0}}, + {'address': 'Warps_CinnabarLab', 'id': 3, + 'to': {'map': 'Cinnabar Lab R&D Room', 'id': 0}}, + {'address': 'Warps_CinnabarLab', 'id': 4, + 'to': {'map': 'Cinnabar Lab Fossil Room', 'id': 0}}], 'Cinnabar Lab Trade Room': [ + {'address': 'Warps_CinnabarLabTradeRoom', 'id': (0, 1), 'to': {'map': 'Cinnabar Lab', 'id': 2}}], + 'Cinnabar Lab R&D Room': [ + {'address': 'Warps_CinnabarLabMetronomeRoom', 'id': (0, 1), 'to': {'map': 'Cinnabar Lab', 'id': 3}}], + 'Cinnabar Lab Fossil Room': [ + {'address': 'Warps_CinnabarLabFossilRoom', 'id': (0, 1), 'to': {'map': 'Cinnabar Lab', 'id': 4}}], + 'Cinnabar Pokemon Center': [ + {'address': 'Warps_CinnabarPokecenter', 'id': (0, 1), 'to': {'map': 'Cinnabar Island', 'id': 3}}], + 'Cinnabar Pokemart': [ + {'address': 'Warps_CinnabarMart', 'id': (0, 1), 'to': {'map': 'Cinnabar Island', 'id': 4}}], + "Saffron Copycat's House 1F": [ + {'address': 'Warps_CopycatsHouse1F', 'id': (0, 1), 'to': {'map': 'Saffron City-Copycat', 'id': 0}}, + {'address': 'Warps_CopycatsHouse1F', 'id': 2, 'to': {'map': "Saffron Copycat's House 2F", 'id': 0}}], + "Indigo Plateau Champion's Room": [{'address': 'Warps_ChampionsRoom', 'id': (0, 1), + 'to': {'map': "Indigo Plateau Lance's Room", 'id': (1, 2)}}, + {'address': 'Warps_ChampionsRoom', 'id': (2, 3), + 'to': {'map': 'Indigo Plateau Hall of Fame', 'id': 0}}], + "Indigo Plateau Lorelei's Room": [ + {'address': 'Warps_LoreleisRoom', 'id': (0, 1), 'to': {'map': 'Indigo Plateau Lobby-N', 'id': 2}}, + {'address': 'Warps_LoreleisRoom', 'id': (2, 3), + 'to': {'map': "Indigo Plateau Bruno's Room", 'id': (0, 1)}}], "Indigo Plateau Bruno's Room": [ + {'address': 'Warps_BrunosRoom', 'id': (0, 1), 'to': {'map': "Indigo Plateau Lorelei's Room", 'id': (2, 3)}}, + {'address': 'Warps_BrunosRoom', 'id': (2, 3), 'to': {'map': "Indigo Plateau Agatha's Room", 'id': (0, 1)}}], + "Indigo Plateau Agatha's Room": [{'address': 'Warps_AgathasRoom', 'id': (0, 1), + 'to': {'map': "Indigo Plateau Bruno's Room", 'id': (2, 3)}}, + {'address': 'Warps_AgathasRoom', 'id': (2, 3), + 'to': {'map': "Indigo Plateau Lance's Room", 'id': 0}}]} -def create_region(world: MultiWorld, player: int, name: str, locations_per_region=None, exits=None): - ret = Region(name, player, world) +silph_co_warps = [ + 'Silph Co 4F to Silph Co 10F-SE', 'Silph Co 4F to Silph Co 10F', 'Silph Co 4F-N to Silph Co 6F', + 'Silph Co 4F-N to Silph Co 10F-SE', 'Silph Co 5F to Silph Co 7F-SE', 'Silph Co 5F to Silph Co 9F', + 'Silph Co 5F to Silph Co 3F', 'Silph Co 5F-SW to Silph Co 3F', 'Silph Co 6F to Silph Co 4F-N', + 'Silph Co 6F to Silph Co 2F-SW', 'Silph Co 7F-NW to Silph Co 3F-C', 'Silph Co 7F-NW to Silph Co 11F-W', + 'Silph Co 7F-SE to Silph Co 5F', 'Silph Co 8F to Silph Co 2F S', 'Silph Co 8F to Silph Co 2F N', + 'Silph Co 8F to Silph Co 8F-W', 'Silph Co 8F-W to Silph Co 8F', 'Silph Co 2F-NW to Silph Co 3F', + 'Silph Co 2F to Silph Co 8F N', 'Silph Co 2F to Silph Co 8F S', 'Silph Co 2F-SW to Silph Co 6F', + 'Silph Co 3F to Silph Co 3F N', 'Silph Co 3F to Silph Co 5F', 'Silph Co 3F to Silph Co 5F-SW', + 'Silph Co 3F to Silph Co 2F-NW', 'Silph Co 3F to Silph Co 3F S', 'Silph Co 3F-C to Silph Co 7F-NW', + 'Silph Co 3F-W to Silph Co 9F-NW', 'Silph Co 10F to Silph Co 4F', 'Silph Co 10F-SE to Silph Co 4F-N', + 'Silph Co 10F-SE to Silph Co 4F', 'Silph Co 9F to Silph Co 5F', 'Silph Co 9F-NW to Silph Co 3F-W', + 'Silph Co 11F-W to Silph Co 7F-NW' +] + +saffron_gym_warps = [ + 'Saffron Gym-NW to Saffron Gym-NE', 'Saffron Gym-NW to Saffron Gym-N', 'Saffron Gym-NW to Saffron Gym-C', + 'Saffron Gym-NW to Saffron Gym-W', 'Saffron Gym-W to Saffron Gym-E', 'Saffron Gym-W to Saffron Gym-N', + 'Saffron Gym-W to Saffron Gym-NW', 'Saffron Gym-W to Saffron Gym-SW', 'Saffron Gym-SW to Saffron Gym-NE', + 'Saffron Gym-SW to Saffron Gym-SE', 'Saffron Gym-SW to Saffron Gym-N', 'Saffron Gym-SW to Saffron Gym-W', + 'Saffron Gym-N to Saffron Gym-E', 'Saffron Gym-N to Saffron Gym-NW', 'Saffron Gym-N to Saffron Gym-W', + 'Saffron Gym-N to Saffron Gym-SW', 'Saffron Gym-C to Saffron Gym-NW', 'Saffron Gym-S to Saffron Gym-SE', + 'Saffron Gym-NE to Saffron Gym-E', 'Saffron Gym-NE to Saffron Gym-SE', 'Saffron Gym-NE to Saffron Gym-NW', + 'Saffron Gym-NE to Saffron Gym-SW', 'Saffron Gym-E to Saffron Gym-NE', 'Saffron Gym-E to Saffron Gym-SE', + 'Saffron Gym-E to Saffron Gym-N', 'Saffron Gym-E to Saffron Gym-W', 'Saffron Gym-SE to Saffron Gym-NE', + 'Saffron Gym-SE to Saffron Gym-E', 'Saffron Gym-SE to Saffron Gym-SW', 'Saffron Gym-SE to Saffron Gym-S' +] + +entrance_only = [ + "Route 4-W to Mt Moon 1F", "Saffron City-G to Saffron Gym-S", "Saffron City-Copycat to Saffron Copycat's House 1F", + "Saffron City-Pidgey to Saffron Pidgey House", "Celadon Game Corner-Hidden Stairs to Rocket Hideout B1F" + "Cinnabar Island-M to Pokemon Mansion 1F", "Mt Moon B2F to Mt Moon B1F-W", "Silph Co 7F-NW to Silph Co 11F-W", + "Viridian City-G", "Cerulean City-Cave to Cerulean Cave 1F-SE", "Cerulean City-T to Cerulean Trashed House", + "Route 10-P to Power Plant", "S.S. Anne 2F to S.S. Anne Captain's Room", "Pewter City-M to Pewter Museum 1F-E", + "Pokemon Mansion 1F-SE to Cinnabar Island-M", "Cinnabar Island-G to Cinnabar Gym", + "Saffron City-Silph to Silph Co 1F", +] + +pokemon_center_entrances = ['Viridian City to Viridian Pokemon Center', 'Celadon City to Celadon Pokemon Center', + 'Route 4-W to Route 4 Pokemon Center', 'Route 10-N to Rock Tunnel Pokemon Center', + 'Pewter City to Pewter Pokemon Center', 'Cerulean City to Cerulean Pokemon Center', + 'Lavender Town to Lavender Pokemon Center', 'Vermilion City to Vermilion Pokemon Center', + 'Saffron City to Saffron Pokemon Center', 'Fuchsia City to Fuchsia Pokemon Center', + 'Cinnabar Island to Cinnabar Pokemon Center', 'Indigo Plateau to Indigo Plateau Lobby'] +pokemon_centers = ['Celadon Pokemon Center to Celadon City', 'Viridian Pokemon Center to Viridian City', + 'Pewter Pokemon Center to Pewter City', 'Cerulean Pokemon Center to Cerulean City', + 'Vermilion Pokemon Center to Vermilion City', 'Fuchsia Pokemon Center to Fuchsia City', + 'Cinnabar Pokemon Center to Cinnabar Island', 'Lavender Pokemon Center to Lavender Town', + 'Saffron Pokemon Center to Saffron City', 'Route 4 Pokemon Center to Route 4-W', + 'Rock Tunnel Pokemon Center to Route 10-N', 'Indigo Plateau Lobby to Indigo Plateau'] + +pokemart_entrances = ['Viridian City to Viridian Pokemart', 'Pewter City to Pewter Pokemart', + 'Cerulean City to Cerulean Pokemart', 'Lavender Town to Lavender Pokemart', + 'Vermilion City to Vermilion Pokemart', 'Saffron City to Saffron Pokemart', + 'Fuchsia City to Fuchsia Pokemart', 'Cinnabar Island to Cinnabar Pokemart'] + +pokemarts = ['Viridian Pokemart to Viridian City', 'Pewter Pokemart to Pewter City', + 'Cerulean Pokemart to Cerulean City', 'Lavender Pokemart to Lavender Town', + 'Vermilion Pokemart to Vermilion City', 'Saffron Pokemart to Saffron City', + 'Fuchsia Pokemart to Fuchsia City', 'Cinnabar Pokemart to Cinnabar Island'] + + +safe_rooms = ["Rival's House to Pallet Town", + 'Vermilion Trade House to Vermilion City', + 'Viridian School House to Viridian City', 'Viridian Nickname House to Viridian City', + 'Pewter Nidoran House to Pewter City', 'Pewter Speech House to Pewter City', + 'Cerulean Trade House to Cerulean City', 'Cerulean Bicycle Shop to Cerulean City', + "Lavender Mr. Fuji's House to Lavender Town", 'Lavender Cubone House to Lavender Town', + "Lavender Name Rater's House to Lavender Town", 'Vermilion Pidgey House to Vermilion City', + 'Saffron Pidgey House to Saffron City-Pidgey', "Saffron Mr. Psychic's House to Saffron City", + 'Route 2 Trade House to Route 2-NE', 'Route 16 Fly House to Route 16-NW', "Bill's House to Route 25", + 'Safari Zone Center Rest House to Safari Zone Center-S', + 'Safari Zone West Rest House to Safari Zone West', 'Safari Zone East Rest House to Safari Zone East', + 'Safari Zone North Rest House to Safari Zone North', + 'Celadon Prize Corner to Celadon City', 'Celadon Diner to Celadon City', + 'Celadon Chief House to Celadon City', 'Celadon Hotel to Celadon City', + 'Safari Zone Secret House to Safari Zone West-NW', + 'Vermilion Old Rod House to Vermilion City', 'Daycare to Route 5', + 'Route 12 Super Rod House to Route 12-S', 'Vermilion Pokemon Fan Club to Vermilion City', + "Fuchsia Bill's Grandpa's House to Fuchsia City", "Fuchsia Warden's House to Fuchsia City", + 'Fuchsia Meeting Room to Fuchsia City',] + +insanity_safe_rooms = [ + 'Cinnabar Lab Trade Room to Cinnabar Lab', + 'Cinnabar Lab R&D Room to Cinnabar Lab', 'Cinnabar Lab Fossil Room to Cinnabar Lab', + 'Celadon Mansion Roof House to Celadon Mansion Roof-Back', + "Saffron Copycat's House 2F to Saffron Copycat's House 1F", + 'Route 11 Gate 2F to Route 11 Gate 1F', 'Route 12 Gate 2F to Route 12 Gate 1F', + 'Route 15 Gate 2F to Route 15 Gate 1F', 'Route 16 Gate 2F to Route 16 Gate 1F-E', + 'Route 18 Gate 2F to Route 18 Gate 1F-E', + 'Celadon Department Store Roof to Celadon Department Store 5F', + 'Pewter Museum 2F to Pewter Museum 1F', + "Cerulean City-Badge House Backyard to Cerulean Badge House", + 'Fuchsia City-Good Rod House Backyard to Fuchsia Good Rod House', + 'S.S. Anne Kitchen to S.S. Anne 1F', "S.S. Anne Captain's Room to S.S. Anne 2F", + 'S.S. Anne 1F Rooms-Police Room to S.S. Anne 1F', + 'S.S. Anne 1F Rooms-Wigglytuff Room to S.S. Anne 1F', + 'S.S. Anne 1F Rooms-Cherry Pie Room to S.S. Anne 1F', + 'S.S. Anne 2F Rooms-Snorlax Room to S.S. Anne 2F', + 'S.S. Anne 2F Rooms-Surf and Cut Room to S.S. Anne 2F', + 'S.S. Anne 2F Rooms-Safari Zone Room to S.S. Anne 2F', + 'S.S. Anne 2F Rooms-Seasickness Room to S.S. Anne 2F', + 'S.S. Anne B1F Rooms-Machoke Room to S.S. Anne B1F', +] + + +def pair(a, b): + return (f"{a} to {b}", f"{b} to {a}") + + +mandatory_connections = { + pair("Safari Zone Center-S", "Safari Zone Gate-N"), + pair("Safari Zone East", "Safari Zone North"), + pair("Safari Zone East", "Safari Zone Center-S"), + pair("Safari Zone North", "Safari Zone Center-NE"), + pair("Safari Zone North", "Safari Zone West"), + pair("Safari Zone North", "Safari Zone West-NW"), + pair("Safari Zone West", "Safari Zone Center-NW"), +} +insanity_mandatory_connections = { + # pair("Seafoam Islands B1F-NE", "Seafoam Islands 1F"), + # pair("Seafoam Islands 1F", "Seafoam Islands B1F"), + # pair("Seafoam Islands B2F-NW", "Seafoam Islands B1F"), + # pair("Seafoam Islands B3F-SE", "Seafoam Islands B2F-SE"), + # pair("Seafoam Islands B3F-NE", "Seafoam Islands B2F-NE"), + # pair("Seafoam Islands B4F", "Seafoam Islands B3F-NE"), + # pair("Seafoam Islands B4F", "Seafoam Islands B3F"), + pair("Player's House 1F", "Player's House 2F"), + pair("Indigo Plateau Lorelei's Room", "Indigo Plateau Lobby-N"), + pair("Indigo Plateau Bruno's Room", "Indigo Plateau Lorelei's Room"), + pair("Indigo Plateau Bruno's Room", "Indigo Plateau Agatha's Room"), + pair("Indigo Plateau Agatha's Room", "Indigo Plateau Lance's Room"), + pair("Indigo Plateau Champion's Room", "Indigo Plateau Lance's Room"), + pair("Indigo Plateau Hall of Fame", "Indigo Plateau Champion's Room") +} + +simple_mandatory_connections = { + pair("Fuchsia City", "Safari Zone Gate-S") + +} + +safari_zone_houses = ["Safari Zone Center-S to Safari Zone Center Rest House", + "Safari Zone West to Safari Zone West Rest House", + "Safari Zone West-NW to Safari Zone Secret House", + "Safari Zone East to Safari Zone East Rest House", + "Safari Zone North to Safari Zone North Rest House"] + +safe_connecting_interior_dungeons = [ + ["Viridian Forest South Gate to Route 2-SW", "Viridian Forest North Gate to Route 2-NW"], + ["Diglett's Cave Route 2 to Route 2-NE", "Diglett's Cave Route 11 to Route 11"], + ["Mt Moon 1F to Route 4-W", "Mt Moon B1F-NE to Route 4-C"], +] + +unsafe_connecting_interior_dungeons = [ + ["Seafoam Islands 1F to Route 20-IE", "Seafoam Islands 1F-SE to Route 20-IW"], + ["Rock Tunnel 1F-NE to Route 10-N", "Rock Tunnel 1F-S to Route 10-S"], + ["Victory Road 1F-S to Route 23-C", "Victory Road 2F-E to Route 23-N"], +] + +multi_purpose_dungeons = [ + ["Pokemon Mansion 1F to Cinnabar Island-M", "Pokemon Mansion 1F-SE to Cinnabar Island-M"], + ["Power Plant to Route 10-P", "Power Plant to Route 10-P Back Door"] +] + +multi_purpose_dungeon_entrances = [ + 'Cinnabar Island-M to Pokemon Mansion 1F', + 'Route 10-P to Power Plant' +] + +connecting_interior_dungeon_entrances = [ + ['Route 2-SW to Viridian Forest South Gate', 'Route 2-NW to Viridian Forest North Gate'], + ["Route 2-NE to Diglett's Cave Route 2", "Route 11 to Diglett's Cave Route 11"], + ['Route 20-IE to Seafoam Islands 1F', 'Route 20-IW to Seafoam Islands 1F-SE'], + ['Route 4-W to Mt Moon 1F', 'Route 4-C to Mt Moon B1F-NE'], + ['Route 10-N to Rock Tunnel 1F-NE', 'Route 10-S to Rock Tunnel 1F-S'], + ['Route 23-C to Victory Road 1F-S', 'Route 23-N to Victory Road 2F-E'], +] + + +connecting_interiors = [ + ["Underground Path Route 5 to Route 5", "Underground Path Route 6 to Route 6"], + ["Underground Path Route 7 to Route 7", "Underground Path Route 8 to Route 8"], + ["Celadon Department Store 1F to Celadon City W", "Celadon Department Store 1F to Celadon City E"], + ["Route 2 Gate to Route 2-E", "Route 2 Gate to Route 2-SE"], + ["Cerulean Badge House to Cerulean City-Badge House Backyard", "Cerulean Badge House to Cerulean City"], + ["Cerulean Trashed House to Cerulean City-T", "Cerulean Trashed House to Cerulean City-Outskirts"], + ["Fuchsia Good Rod House to Fuchsia City", "Fuchsia Good Rod House to Fuchsia City-Good Rod House Backyard"], + ["Route 11 Gate 1F to Route 11-E", "Route 11 Gate 1F to Route 11-C"], + ["Route 12 Gate 1F to Route 12-N", "Route 12 Gate 1F to Route 12-L"], + ["Route 15 Gate 1F to Route 15", "Route 15 Gate 1F to Route 15-W"], + ["Route 16 Gate 1F-N to Route 16-NE", "Route 16 Gate 1F-N to Route 16-NW"], + ["Route 16 Gate 1F-W to Route 16-SW", "Route 16 Gate 1F-E to Route 16-C"], + ["Route 18 Gate 1F-W to Route 18-W", "Route 18 Gate 1F-E to Route 18-E"], + ["Route 5 Gate-N to Route 5", "Route 5 Gate-S to Route 5-S"], + ["Route 6 Gate-S to Route 6", "Route 6 Gate-N to Route 6-N"], + ["Route 7 Gate-W to Route 7", "Route 7 Gate-E to Route 7-E"], + ["Route 8 Gate-E to Route 8", "Route 8 Gate-W to Route 8-W"], + ["Route 22 Gate-S to Route 22", "Route 22 Gate-N to Route 23-S"], + +] + +connecting_interior_entrances = [ + ['Route 5 to Underground Path Route 5', 'Route 6 to Underground Path Route 6'], + ['Route 7 to Underground Path Route 7', 'Route 8 to Underground Path Route 8'], + ["Celadon City to Celadon Department Store 1F W", "Celadon City to Celadon Department Store 1F E"], + ['Route 2-E to Route 2 Gate', 'Route 2-SE to Route 2 Gate'], + ['Cerulean City-Badge House Backyard to Cerulean Badge House', + 'Cerulean City to Cerulean Badge House'], + ['Cerulean City-T to Cerulean Trashed House', + 'Cerulean City-Outskirts to Cerulean Trashed House'], + ['Fuchsia City to Fuchsia Good Rod House', + 'Fuchsia City-Good Rod House Backyard to Fuchsia Good Rod House'], + ['Route 11-E to Route 11 Gate 1F', 'Route 11-C to Route 11 Gate 1F'], + ['Route 12-N to Route 12 Gate 1F', 'Route 12-L to Route 12 Gate 1F'], + ['Route 15 to Route 15 Gate 1F', 'Route 15-W to Route 15 Gate 1F'], + ['Route 16-NE to Route 16 Gate 1F-N', 'Route 16-NW to Route 16 Gate 1F-N'], + ['Route 16-SW to Route 16 Gate 1F-W', 'Route 16-C to Route 16 Gate 1F-E'], + ['Route 18-W to Route 18 Gate 1F-W', 'Route 18-E to Route 18 Gate 1F-E'], + ['Route 5 to Route 5 Gate-N', 'Route 5-S to Route 5 Gate-S'], + ['Route 6 to Route 6 Gate-S', 'Route 6-N to Route 6 Gate-N'], + ['Route 7 to Route 7 Gate-W', 'Route 7-E to Route 7 Gate-E'], + ['Route 8 to Route 8 Gate-E', 'Route 8-W to Route 8 Gate-W'], + ['Route 22 to Route 22 Gate-S', 'Route 23-S to Route 22 Gate-N'] +] + +dungeons = [ + "Silph Co 1F to Saffron City-Silph", + "Rocket Hideout B1F to Celadon Game Corner-Hidden Stairs", + "Cerulean Cave 1F-SE to Cerulean City-Cave", + "Vermilion Dock to Vermilion City-Dock", + "Pokemon Tower 1F to Lavender Town" +] + +dungeon_entrances = [ + 'Saffron City-Silph to Silph Co 1F', 'Celadon Game Corner-Hidden Stairs to Rocket Hideout B1F', + 'Cerulean City-Cave to Cerulean Cave 1F-SE', 'Vermilion City-Dock to Vermilion Dock', + 'Lavender Town to Pokemon Tower 1F' +] + +gyms = [ + "Pewter Gym to Pewter City", "Cerulean Gym to Cerulean City", "Vermilion Gym to Vermilion City-G", + "Celadon Gym to Celadon City-G", "Fuchsia Gym to Fuchsia City", "Saffron Gym-S to Saffron City-G", + "Cinnabar Gym to Cinnabar Island-G", "Viridian Gym to Viridian City-G" +] + +gym_entrances = [ + 'Pewter City to Pewter Gym', 'Cerulean City to Cerulean Gym', 'Vermilion City-G to Vermilion Gym', + 'Celadon City-G to Celadon Gym', 'Fuchsia City to Fuchsia Gym', 'Saffron City-G to Saffron Gym-S', + 'Cinnabar Island-G to Cinnabar Gym', 'Viridian City-G to Viridian Gym' +] + +initial_doors = [ + "Viridian City to Viridian Pokemart", + "Viridian City to Viridian Nickname House", + "Viridian City to Viridian School House", + "Route 22 to Route 22 Gate-S" +] + +mansion_dead_ends = [ + "Pokemon Mansion 2F-E to Pokemon Mansion 3F-SE", + "Pokemon Mansion 3F-SW to Pokemon Mansion 2F", +] + +mansion_stair_destinations = [ + "Pokemon Mansion 2F to Pokemon Mansion 1F", + "Pokemon Mansion 2F to Pokemon Mansion 3F-SW", + "Pokemon Mansion 3F to Pokemon Mansion 2F", + "Pokemon Mansion 1F to Pokemon Mansion 2F" +] + +unreachable_outdoor_entrances = [ + "Route 4-C to Mt Moon B1F-NE", + "Fuchsia City-Good Rod House Backyard to Fuchsia Good Rod House", + "Cerulean City-Badge House Backyard to Cerulean Badge House" +] + + +def create_region(multiworld: MultiWorld, player: int, name: str, locations_per_region=None, exits=None): + ret = PokemonRBRegion(name, player, multiworld) for location in locations_per_region.get(name, []): location.parent_region = ret ret.locations.append(location) - if world.randomize_hidden_items[player] == "exclude" and "Hidden" in location.name: + if multiworld.randomize_hidden_items[player] == "exclude" and "Hidden" in location.name: location.progress_type = LocationProgressType.EXCLUDED if exits: for exit in exits: @@ -17,282 +1474,926 @@ def create_region(world: MultiWorld, player: int, name: str, locations_per_regio return ret -def create_regions(multiworld: MultiWorld, player: int): +def outdoor_map(name): + i = map_ids[name.split("-")[0]] + if i <= 0x24 or 0xD9 <= i <= 0xDC: + return True + return False + + +def create_regions(self): + multiworld = self.multiworld + player = self.player locations_per_region = {} + + start_inventory = self.multiworld.start_inventory[self.player].value.copy() + if self.multiworld.randomize_pokedex[self.player] == "start_with": + start_inventory["Pokedex"] = 1 + self.multiworld.push_precollected(self.create_item("Pokedex")) + if self.multiworld.exp_all[self.player] == "start_with": + start_inventory["Exp. All"] = 1 + self.multiworld.push_precollected(self.create_item("Exp. All")) + + # locations = [location for location in location_data if location.type in ("Item", "Trainer Parties")] + self.item_pool = [] + combined_traps = (self.multiworld.poison_trap_weight[self.player].value + + self.multiworld.fire_trap_weight[self.player].value + + self.multiworld.paralyze_trap_weight[self.player].value + + self.multiworld.ice_trap_weight[self.player].value) + stones = ["Moon Stone", "Fire Stone", "Water Stone", "Thunder Stone", "Leaf Stone"] + for location in location_data: locations_per_region.setdefault(location.region, []) - if location.inclusion(multiworld, player): - locations_per_region[location.region].append(PokemonRBLocation(player, location.name, location.address, - location.rom_address, location.type)) - regions = [ - create_region(multiworld, player, "Menu", locations_per_region), - create_region(multiworld, player, "Anywhere", locations_per_region), - create_region(multiworld, player, "Fossil", locations_per_region), - create_region(multiworld, player, "Pokedex", locations_per_region), - create_region(multiworld, player, "Pallet Town", locations_per_region), - create_region(multiworld, player, "Route 1", locations_per_region), - create_region(multiworld, player, "Viridian City", locations_per_region), - create_region(multiworld, player, "Viridian City North", locations_per_region), - create_region(multiworld, player, "Viridian Gym", locations_per_region), - create_region(multiworld, player, "Route 2", locations_per_region), - create_region(multiworld, player, "Route 2 East", locations_per_region), - create_region(multiworld, player, "Diglett's Cave", locations_per_region), - create_region(multiworld, player, "Route 22", locations_per_region), - create_region(multiworld, player, "Route 23", locations_per_region), - create_region(multiworld, player, "Viridian Forest", locations_per_region), - create_region(multiworld, player, "Pewter City", locations_per_region), - create_region(multiworld, player, "Pewter Gym", locations_per_region), - create_region(multiworld, player, "Route 3", locations_per_region), - create_region(multiworld, player, "Mt Moon 1F", locations_per_region), - create_region(multiworld, player, "Mt Moon B1F", locations_per_region), - create_region(multiworld, player, "Mt Moon B2F", locations_per_region), - create_region(multiworld, player, "Route 4", locations_per_region), - create_region(multiworld, player, "Cerulean City", locations_per_region), - create_region(multiworld, player, "Cerulean Gym", locations_per_region), - create_region(multiworld, player, "Route 24", locations_per_region), - create_region(multiworld, player, "Route 25", locations_per_region), - create_region(multiworld, player, "Route 9", locations_per_region), - create_region(multiworld, player, "Route 10 North", locations_per_region), - create_region(multiworld, player, "Rock Tunnel 1F", locations_per_region), - create_region(multiworld, player, "Rock Tunnel B1F", locations_per_region), - create_region(multiworld, player, "Power Plant", locations_per_region), - create_region(multiworld, player, "Route 10 South", locations_per_region), - create_region(multiworld, player, "Lavender Town", locations_per_region), - create_region(multiworld, player, "Pokemon Tower 1F", locations_per_region), - create_region(multiworld, player, "Pokemon Tower 2F", locations_per_region), - create_region(multiworld, player, "Pokemon Tower 3F", locations_per_region), - create_region(multiworld, player, "Pokemon Tower 4F", locations_per_region), - create_region(multiworld, player, "Pokemon Tower 5F", locations_per_region), - create_region(multiworld, player, "Pokemon Tower 6F", locations_per_region), - create_region(multiworld, player, "Pokemon Tower 7F", locations_per_region), - create_region(multiworld, player, "Route 5", locations_per_region), - create_region(multiworld, player, "Saffron City", locations_per_region), - create_region(multiworld, player, "Fighting Dojo", locations_per_region), - create_region(multiworld, player, "Saffron Gym", locations_per_region), - create_region(multiworld, player, "Copycat's House", locations_per_region), - create_region(multiworld, player, "Underground Tunnel North-South", locations_per_region), - create_region(multiworld, player, "Route 6", locations_per_region), - create_region(multiworld, player, "Vermilion City", locations_per_region), - create_region(multiworld, player, "Vermilion Gym", locations_per_region), - create_region(multiworld, player, "S.S. Anne 1F", locations_per_region), - create_region(multiworld, player, "S.S. Anne B1F", locations_per_region), - create_region(multiworld, player, "S.S. Anne 2F", locations_per_region), - create_region(multiworld, player, "S.S. Anne 3F", locations_per_region), - create_region(multiworld, player, "Route 11", locations_per_region), - create_region(multiworld, player, "Route 11 East", locations_per_region), - create_region(multiworld, player, "Route 12 North", locations_per_region), - create_region(multiworld, player, "Route 12 South", locations_per_region), - create_region(multiworld, player, "Route 12 Grass", locations_per_region), - create_region(multiworld, player, "Route 12 West", locations_per_region), - create_region(multiworld, player, "Route 7", locations_per_region), - create_region(multiworld, player, "Underground Tunnel West-East", locations_per_region), - create_region(multiworld, player, "Route 8", locations_per_region), - create_region(multiworld, player, "Route 8 Grass", locations_per_region), - create_region(multiworld, player, "Celadon City", locations_per_region), - create_region(multiworld, player, "Celadon Game Corner", locations_per_region), - create_region(multiworld, player, "Celadon Prize Corner", locations_per_region), - create_region(multiworld, player, "Celadon Gym", locations_per_region), - create_region(multiworld, player, "Route 16", locations_per_region), - create_region(multiworld, player, "Route 16 West", locations_per_region), - create_region(multiworld, player, "Route 16 North", locations_per_region), - create_region(multiworld, player, "Route 17", locations_per_region), - create_region(multiworld, player, "Route 18", locations_per_region), - create_region(multiworld, player, "Fuchsia City", locations_per_region), - create_region(multiworld, player, "Fuchsia Gym", locations_per_region), - create_region(multiworld, player, "Safari Zone Gate", locations_per_region), - create_region(multiworld, player, "Safari Zone Center", locations_per_region), - create_region(multiworld, player, "Safari Zone East", locations_per_region), - create_region(multiworld, player, "Safari Zone North", locations_per_region), - create_region(multiworld, player, "Safari Zone West", locations_per_region), - create_region(multiworld, player, "Route 15", locations_per_region), - create_region(multiworld, player, "Route 14", locations_per_region), - create_region(multiworld, player, "Route 14 Grass", locations_per_region), - create_region(multiworld, player, "Route 13", locations_per_region), - create_region(multiworld, player, "Route 13 East", locations_per_region), - create_region(multiworld, player, "Route 19", locations_per_region), - create_region(multiworld, player, "Route 20 East", locations_per_region), - create_region(multiworld, player, "Route 20 West", locations_per_region), - create_region(multiworld, player, "Seafoam Islands 1F", locations_per_region), - create_region(multiworld, player, "Seafoam Islands B1F", locations_per_region), - create_region(multiworld, player, "Seafoam Islands B2F", locations_per_region), - create_region(multiworld, player, "Seafoam Islands B3F", locations_per_region), - create_region(multiworld, player, "Seafoam Islands B4F", locations_per_region), - create_region(multiworld, player, "Cinnabar Island", locations_per_region), - create_region(multiworld, player, "Cinnabar Gym", locations_per_region), - create_region(multiworld, player, "Route 21", locations_per_region), - create_region(multiworld, player, "Silph Co 1F", locations_per_region), - create_region(multiworld, player, "Silph Co 2F", locations_per_region), - create_region(multiworld, player, "Silph Co 3F", locations_per_region), - create_region(multiworld, player, "Silph Co 4F", locations_per_region), - create_region(multiworld, player, "Silph Co 5F", locations_per_region), - create_region(multiworld, player, "Silph Co 6F", locations_per_region), - create_region(multiworld, player, "Silph Co 7F", locations_per_region), - create_region(multiworld, player, "Silph Co 8F", locations_per_region), - create_region(multiworld, player, "Silph Co 9F", locations_per_region), - create_region(multiworld, player, "Silph Co 10F", locations_per_region), - create_region(multiworld, player, "Silph Co 11F", locations_per_region), - create_region(multiworld, player, "Rocket Hideout B1F", locations_per_region), - create_region(multiworld, player, "Rocket Hideout B2F", locations_per_region), - create_region(multiworld, player, "Rocket Hideout B3F", locations_per_region), - create_region(multiworld, player, "Rocket Hideout B4F", locations_per_region), - create_region(multiworld, player, "Pokemon Mansion 1F", locations_per_region), - create_region(multiworld, player, "Pokemon Mansion 2F", locations_per_region), - create_region(multiworld, player, "Pokemon Mansion 3F", locations_per_region), - create_region(multiworld, player, "Pokemon Mansion B1F", locations_per_region), - create_region(multiworld, player, "Victory Road 1F", locations_per_region), - create_region(multiworld, player, "Victory Road 2F", locations_per_region), - create_region(multiworld, player, "Victory Road 3F", locations_per_region), - create_region(multiworld, player, "Indigo Plateau", locations_per_region), - create_region(multiworld, player, "Cerulean Cave 1F", locations_per_region), - create_region(multiworld, player, "Cerulean Cave 2F", locations_per_region), - create_region(multiworld, player, "Cerulean Cave B1F", locations_per_region), - ] + # The check for list is so that we don't try to check the item table with a list as a key + if location.inclusion(multiworld, player) and (isinstance(location.original_item, list) or + not (self.multiworld.key_items_only[self.player] and item_table[location.original_item].classification + not in (ItemClassification.progression, ItemClassification.progression_skip_balancing) and not + location.event)): + location_object = PokemonRBLocation(player, location.name, location.address, location.rom_address, + location.type, location.level, location.level_address) + locations_per_region[location.region].append(location_object) + + if location.type in ("Item", "Trainer Parties"): + event = location.event + + if location.original_item is None: + item = self.create_filler() + elif location.original_item == "Exp. All" and self.multiworld.exp_all[self.player] == "remove": + item = self.create_filler() + elif location.original_item == "Pokedex": + if self.multiworld.randomize_pokedex[self.player] == "vanilla": + location_object.event = True + event = True + item = self.create_item("Pokedex") + elif location.original_item == "Moon Stone" and self.multiworld.stonesanity[self.player]: + stone = stones.pop() + item = self.create_item(stone) + elif location.original_item.startswith("TM"): + if self.multiworld.randomize_tm_moves[self.player]: + item = self.create_item(location.original_item.split(" ")[0]) + else: + item = self.create_item(location.original_item) + elif location.original_item == "Card Key" and self.multiworld.split_card_key[self.player] == "on": + item = self.create_item("Card Key 3F") + elif "Card Key" in location.original_item and self.multiworld.split_card_key[self.player] == "progressive": + item = self.create_item("Progressive Card Key") + else: + item = self.create_item(location.original_item) + if (item.classification == ItemClassification.filler and self.multiworld.random.randint(1, 100) + <= self.multiworld.trap_percentage[self.player].value and combined_traps != 0): + item = self.create_item(self.select_trap()) + + if self.multiworld.key_items_only[self.player] and (not location.event) and (not item.advancement): + continue + + if item.name in start_inventory and start_inventory[item.name] > 0 and \ + location.original_item in item_groups["Unique"]: + start_inventory[location.original_item] -= 1 + item = self.create_filler() + + if event: + location_object.place_locked_item(item) + if location.type == "Trainer Parties": + # loc.item.classification = ItemClassification.filler + location_object.party_data = deepcopy(location.party_data) + else: + self.item_pool.append(item) + + self.multiworld.random.shuffle(self.item_pool) + advancement_items = [item.name for item in self.item_pool if item.advancement] \ + + [item.name for item in self.multiworld.precollected_items[self.player] if + item.advancement] + self.total_key_items = len( + # The stonesanity items are not checekd for here and instead just always added as the `+ 4` + # They will always exist, but if stonesanity is off, then only as events. + # We don't want to just add 4 if stonesanity is off while still putting them in this list in case + # the player puts stones in their start inventory, in which case they would be double-counted here. + [item for item in ["Bicycle", "Silph Scope", "Item Finder", "Super Rod", "Good Rod", + "Old Rod", "Lift Key", "Card Key", "Town Map", "Coin Case", "S.S. Ticket", + "Secret Key", "Poke Flute", "Mansion Key", "Safari Pass", "Plant Key", + "Hideout Key", "Card Key 2F", "Card Key 3F", "Card Key 4F", "Card Key 5F", + "Card Key 6F", "Card Key 7F", "Card Key 8F", "Card Key 9F", "Card Key 10F", + "Card Key 11F", "Exp. All", "Moon Stone"] if item in advancement_items]) + 4 + if "Progressive Card Key" in advancement_items: + self.total_key_items += 10 + + self.multiworld.cerulean_cave_key_items_condition[self.player].total = \ + int((self.total_key_items / 100) * self.multiworld.cerulean_cave_key_items_condition[self.player].value) + + self.multiworld.elite_four_key_items_condition[self.player].total = \ + int((self.total_key_items / 100) * self.multiworld.elite_four_key_items_condition[self.player].value) + + regions = [create_region(multiworld, player, region, locations_per_region) for region in warp_data] multiworld.regions += regions - connect(multiworld, player, "Menu", "Anywhere", one_way=True) + if __debug__: + for region in locations_per_region: + assert not locations_per_region[region], f"locations not assigned to region {region}" + connect(multiworld, player, "Menu", "Pallet Town", one_way=True) connect(multiworld, player, "Menu", "Pokedex", one_way=True) - connect(multiworld, player, "Menu", "Fossil", lambda state: state.pokemon_rb_fossil_checks( + connect(multiworld, player, "Menu", "Evolution", one_way=True) + connect(multiworld, player, "Menu", "Fossil", lambda state: logic.fossil_checks(state, state.multiworld.second_fossil_check_condition[player].value, player), one_way=True) connect(multiworld, player, "Pallet Town", "Route 1") connect(multiworld, player, "Route 1", "Viridian City") connect(multiworld, player, "Viridian City", "Route 22") - connect(multiworld, player, "Route 22", "Route 23", - lambda state: state.pokemon_rb_has_badges(state.multiworld.victory_road_condition[player].value, player) and - state.pokemon_rb_can_surf(player)) - connect(multiworld, player, "Viridian City North", "Viridian Gym", lambda state: - state.pokemon_rb_has_badges(state.multiworld.viridian_gym_condition[player].value, player), one_way=True) - connect(multiworld, player, "Route 2", "Route 2 East", lambda state: state.pokemon_rb_can_cut(player)) - connect(multiworld, player, "Route 2 East", "Diglett's Cave", lambda state: state.pokemon_rb_can_cut(player)) - connect(multiworld, player, "Route 2", "Viridian City North") - connect(multiworld, player, "Route 2", "Viridian Forest") - connect(multiworld, player, "Route 2", "Pewter City") - connect(multiworld, player, "Pewter City", "Pewter Gym", one_way=True) - connect(multiworld, player, "Pewter City", "Route 3") - connect(multiworld, player, "Route 4", "Route 3", one_way=True) - connect(multiworld, player, "Mt Moon 1F", "Mt Moon B1F", one_way=True) - connect(multiworld, player, "Mt Moon B1F", "Mt Moon B2F", one_way=True) - connect(multiworld, player, "Mt Moon B1F", "Route 4", one_way=True) - connect(multiworld, player, "Route 4", "Cerulean City") - connect(multiworld, player, "Cerulean City", "Cerulean Gym", one_way=True) + connect(multiworld, player, "Route 22", "Route 22-F", lambda state: state.has("Defeat Viridian Gym Giovanni", player), one_way=True) + connect(multiworld, player, "Route 2-SW", "Route 2-Grass", one_way=True) + connect(multiworld, player, "Route 2-NW", "Route 2-Grass", one_way=True) + connect(multiworld, player, "Route 22 Gate-S", "Route 22 Gate-N", + lambda state: logic.has_badges(state, state.multiworld.route_22_gate_condition[player].value, player)) + connect(multiworld, player, "Route 23-Grass", "Route 23-C", lambda state: logic.has_badges(state, state.multiworld.victory_road_condition[player].value, player)) + connect(multiworld, player, "Route 23-Grass", "Route 23-S", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Viridian City-N", "Viridian City-G", lambda state: + logic.has_badges(state, state.multiworld.viridian_gym_condition[player].value, player)) + connect(multiworld, player, "Route 2-SW", "Route 2-SE", lambda state: logic.can_cut(state, player)) + connect(multiworld, player, "Route 2-NW", "Route 2-NE", lambda state: logic.can_cut(state, player)) + connect(multiworld, player, "Route 2-E", "Route 2-NE", lambda state: logic.can_cut(state, player)) + connect(multiworld, player, "Route 2-SW", "Viridian City-N") + connect(multiworld, player, "Route 2-NW", "Pewter City") + connect(multiworld, player, "Pewter City", "Pewter City-E") + connect(multiworld, player, "Pewter City-M", "Pewter City", one_way=True) + connect(multiworld, player, "Pewter City", "Pewter City-M", lambda state: logic.can_cut(state, player), one_way=True) + connect(multiworld, player, "Pewter City-E", "Route 3", lambda state: logic.route_3(state, player), one_way=True) + connect(multiworld, player, "Route 3", "Pewter City-E", one_way=True) + connect(multiworld, player, "Route 4-W", "Route 3") + connect(multiworld, player, "Route 24", "Cerulean City-Water", one_way=True) + connect(multiworld, player, "Cerulean City-Water", "Route 4-Lass", lambda state: logic.can_surf(state, player), one_way=True) + connect(multiworld, player, "Mt Moon B2F", "Mt Moon B2F-Wild", one_way=True) + connect(multiworld, player, "Mt Moon B2F-NE", "Mt Moon B2F-Wild", one_way=True) + connect(multiworld, player, "Mt Moon B2F-C", "Mt Moon B2F-Wild", one_way=True) + connect(multiworld, player, "Route 4-Lass", "Route 4-E", one_way=True) + connect(multiworld, player, "Route 4-C", "Route 4-E", one_way=True) + connect(multiworld, player, "Route 4-E", "Route 4-Grass", one_way=True) + connect(multiworld, player, "Route 4-Grass", "Cerulean City", one_way=True) connect(multiworld, player, "Cerulean City", "Route 24", one_way=True) - connect(multiworld, player, "Route 24", "Route 25", one_way=True) - connect(multiworld, player, "Cerulean City", "Route 9", lambda state: state.pokemon_rb_can_cut(player)) - connect(multiworld, player, "Route 9", "Route 10 North") - connect(multiworld, player, "Route 10 North", "Rock Tunnel 1F", lambda state: state.pokemon_rb_can_flash(player)) - connect(multiworld, player, "Route 10 North", "Power Plant", lambda state: state.pokemon_rb_can_surf(player) and - (state.has("Plant Key", player) or not state.multiworld.extra_key_items[player].value), one_way=True) - connect(multiworld, player, "Rock Tunnel 1F", "Route 10 South", lambda state: state.pokemon_rb_can_flash(player)) - connect(multiworld, player, "Rock Tunnel 1F", "Rock Tunnel B1F") - connect(multiworld, player, "Lavender Town", "Pokemon Tower 1F", one_way=True) - connect(multiworld, player, "Lavender Town", "Pokemon Tower 1F", one_way=True) - connect(multiworld, player, "Pokemon Tower 1F", "Pokemon Tower 2F", one_way=True) - connect(multiworld, player, "Pokemon Tower 2F", "Pokemon Tower 3F", one_way=True) - connect(multiworld, player, "Pokemon Tower 3F", "Pokemon Tower 4F", one_way=True) - connect(multiworld, player, "Pokemon Tower 4F", "Pokemon Tower 5F", one_way=True) - connect(multiworld, player, "Pokemon Tower 5F", "Pokemon Tower 6F", one_way=True) - connect(multiworld, player, "Pokemon Tower 6F", "Pokemon Tower 7F", lambda state: state.has("Silph Scope", player)) - connect(multiworld, player, "Cerulean City", "Route 5") - connect(multiworld, player, "Route 5", "Saffron City", lambda state: state.pokemon_rb_can_pass_guards(player)) - connect(multiworld, player, "Saffron City", "Fighting Dojo", lambda state: state.pokemon_rb_dojo(player), one_way=True) - connect(multiworld, player, "Route 5", "Underground Tunnel North-South") - connect(multiworld, player, "Route 6", "Underground Tunnel North-South") - connect(multiworld, player, "Route 6", "Saffron City", lambda state: state.pokemon_rb_can_pass_guards(player)) - connect(multiworld, player, "Route 7", "Saffron City", lambda state: state.pokemon_rb_can_pass_guards(player)) - connect(multiworld, player, "Route 8", "Saffron City", lambda state: state.pokemon_rb_can_pass_guards(player)) - connect(multiworld, player, "Saffron City", "Copycat's House", lambda state: state.has("Silph Co Liberated", player), one_way=True) - connect(multiworld, player, "Saffron City", "Saffron Gym", lambda state: state.has("Silph Co Liberated", player), one_way=True) + connect(multiworld, player, "Cerulean City", "Cerulean City-T", lambda state: state.has("Help Bill", player)) + connect(multiworld, player, "Cerulean City-Outskirts", "Cerulean City", one_way=True) + connect(multiworld, player, "Cerulean City-Outskirts", "Cerulean City", lambda state: logic.can_cut(state, player)) + connect(multiworld, player, "Cerulean City-Outskirts", "Route 9", lambda state: logic.can_cut(state, player)) + connect(multiworld, player, "Cerulean City-Outskirts", "Route 5") + connect(multiworld, player, "Cerulean Cave B1F", "Cerulean Cave B1F-E", lambda state: logic.can_surf(state, player), one_way=True) + connect(multiworld, player, "Route 24", "Route 25") + connect(multiworld, player, "Route 9", "Route 10-N") + connect(multiworld, player, "Route 10-N", "Route 10-C", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Route 10-C", "Route 10-P", lambda state: state.has("Plant Key", player) or not state.multiworld.extra_key_items[player].value) + connect(multiworld, player, "Pallet Town", "Pallet/Viridian Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Viridian City", "Pallet/Viridian Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 22", "Route 22 Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 24", "Route 24/25/Cerulean/Cerulean Gym Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 25", "Route 24/25/Cerulean/Cerulean Gym Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Cerulean City", "Route 24/25/Cerulean/Cerulean Gym Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Cerulean Gym", "Route 24/25/Cerulean/Cerulean Gym Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 6", "Route 6/11/Vermilion/Dock Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 11", "Route 6/11/Vermilion/Dock Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Vermilion City", "Route 6/11/Vermilion/Dock Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Vermilion Dock", "Route 6/11/Vermilion/Dock Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 10-N", "Route 10/Celadon Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 10-C", "Route 10/Celadon Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Celadon City", "Route 10/Celadon Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Safari Zone Center-NW", "Safari Zone Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Safari Zone Center-NE", "Safari Zone Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Safari Zone Center-S", "Safari Zone Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Safari Zone West", "Safari Zone Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Safari Zone West-NW", "Safari Zone Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Safari Zone East", "Safari Zone Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Safari Zone North", "Safari Zone Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 12-N", "Route 12/13/17/18 Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 12-S", "Route 12/13/17/18 Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 13", "Route 12/13/17/18 Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 13-E", "Route 12/13/17/18 Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 17", "Route 12/13/17/18 Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 18-W", "Route 12/13/17/18 Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 21", "Sea Routes/Cinnabar/Seafoam Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Cinnabar Island", "Sea Routes/Cinnabar/Seafoam Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 20-IW", "Sea Routes/Cinnabar/Seafoam Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 20-IE", "Sea Routes/Cinnabar/Seafoam Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 19-N", "Sea Routes/Cinnabar/Seafoam Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Seafoam Islands B3F", "Sea Routes/Cinnabar/Seafoam Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Seafoam Islands B4F", "Sea Routes/Cinnabar/Seafoam Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 23-S", "Route 23/Cerulean Cave Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Route 23-Grass", "Route 23/Cerulean Cave Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Cerulean Cave 1F-SE", "Route 23/Cerulean Cave Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Cerulean Cave 1F-NE", "Route 23/Cerulean Cave Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Cerulean Cave 1F-N", "Route 23/Cerulean Cave Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Cerulean Cave 1F-SW", "Route 23/Cerulean Cave Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Cerulean Cave B1F", "Route 23/Cerulean Cave Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Fuchsia City", "Fuchsia Fishing", lambda state: state.has("Super Rod", player), one_way=True) + connect(multiworld, player, "Pallet Town", "Old Rod Fishing", lambda state: state.has("Old Rod", player), one_way=True) + connect(multiworld, player, "Pallet Town", "Good Rod Fishing", lambda state: state.has("Good Rod", player), one_way=True) + connect(multiworld, player, "Cinnabar Lab Fossil Room", "Good Rod Fishing", one_way=True) + connect(multiworld, player, "Cinnabar Lab Fossil Room", "Fossil Level", lambda state: logic.fossil_checks(state, 1, player), one_way=True) + connect(multiworld, player, "Route 5 Gate-N", "Route 5 Gate-S", lambda state: logic.can_pass_guards(state, player)) + connect(multiworld, player, "Route 6 Gate-N", "Route 6 Gate-S", lambda state: logic.can_pass_guards(state, player)) + connect(multiworld, player, "Route 7 Gate-W", "Route 7 Gate-E", lambda state: logic.can_pass_guards(state, player)) + connect(multiworld, player, "Route 8 Gate-W", "Route 8 Gate-E", lambda state: logic.can_pass_guards(state, player)) + connect(multiworld, player, "Saffron City", "Route 5-S") + connect(multiworld, player, "Saffron City", "Route 6-N") + connect(multiworld, player, "Saffron City", "Route 7-E") + connect(multiworld, player, "Saffron City", "Route 8-W") + connect(multiworld, player, "Saffron City", "Saffron City-Copycat", lambda state: state.has("Silph Co Liberated", player)) + connect(multiworld, player, "Saffron City", "Saffron City-Pidgey", lambda state: state.has("Silph Co Liberated", player)) + connect(multiworld, player, "Saffron City", "Saffron City-G", lambda state: state.has("Silph Co Liberated", player)) + connect(multiworld, player, "Saffron City", "Saffron City-Silph", lambda state: state.has("Fuji Saved", player)) connect(multiworld, player, "Route 6", "Vermilion City") - connect(multiworld, player, "Vermilion City", "Vermilion Gym", lambda state: state.pokemon_rb_can_surf(player) or state.pokemon_rb_can_cut(player), one_way=True) - connect(multiworld, player, "Vermilion City", "S.S. Anne 1F", lambda state: state.has("S.S. Ticket", player), one_way=True) - connect(multiworld, player, "S.S. Anne 1F", "S.S. Anne 2F", one_way=True) - connect(multiworld, player, "S.S. Anne 2F", "S.S. Anne 3F", one_way=True) - connect(multiworld, player, "S.S. Anne 1F", "S.S. Anne B1F", one_way=True) + connect(multiworld, player, "Vermilion City", "Vermilion City-G", lambda state: logic.can_surf(state, player) or logic.can_cut(state, player)) + connect(multiworld, player, "Vermilion City", "Vermilion City-Dock", lambda state: state.has("S.S. Ticket", player)) connect(multiworld, player, "Vermilion City", "Route 11") - connect(multiworld, player, "Vermilion City", "Diglett's Cave") - connect(multiworld, player, "Route 12 West", "Route 11 East", lambda state: state.pokemon_rb_can_strength(player) or not state.multiworld.extra_strength_boulders[player].value) - connect(multiworld, player, "Route 12 North", "Route 12 South", lambda state: state.has("Poke Flute", player) or state.pokemon_rb_can_surf(player)) - connect(multiworld, player, "Route 12 West", "Route 12 North", lambda state: state.has("Poke Flute", player)) - connect(multiworld, player, "Route 12 West", "Route 12 South", lambda state: state.has("Poke Flute", player)) - connect(multiworld, player, "Route 12 South", "Route 12 Grass", lambda state: state.pokemon_rb_can_cut(player)) - connect(multiworld, player, "Route 12 North", "Lavender Town") - connect(multiworld, player, "Route 7", "Lavender Town") - connect(multiworld, player, "Route 10 South", "Lavender Town") - connect(multiworld, player, "Route 7", "Underground Tunnel West-East") - connect(multiworld, player, "Route 8", "Underground Tunnel West-East") - connect(multiworld, player, "Route 8", "Celadon City") - connect(multiworld, player, "Route 8", "Route 8 Grass", lambda state: state.pokemon_rb_can_cut(player), one_way=True) + connect(multiworld, player, "Route 12-N", "Route 12-S", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Route 12-W", "Route 11-E", lambda state: state.has("Poke Flute", player)) + connect(multiworld, player, "Route 12-W", "Route 12-N", lambda state: state.has("Poke Flute", player)) + connect(multiworld, player, "Route 12-W", "Route 12-S", lambda state: state.has("Poke Flute", player)) + connect(multiworld, player, "Route 12-S", "Route 12-Grass", lambda state: logic.can_cut(state, player), one_way=True) + connect(multiworld, player, "Route 12-L", "Lavender Town") + connect(multiworld, player, "Route 10-S", "Lavender Town") + connect(multiworld, player, "Route 8-W", "Saffron City") + connect(multiworld, player, "Route 8", "Lavender Town") + connect(multiworld, player, "Pokemon Tower 6F", "Pokemon Tower 6F-S", lambda state: state.has("Silph Scope", player) or (state.has("Buy Poke Doll", player) and state.multiworld.poke_doll_skip[player])) + connect(multiworld, player, "Route 8", "Route 8-Grass", lambda state: logic.can_cut(state, player), one_way=True) connect(multiworld, player, "Route 7", "Celadon City") - connect(multiworld, player, "Celadon City", "Celadon Gym", lambda state: state.pokemon_rb_can_cut(player), one_way=True) - connect(multiworld, player, "Celadon City", "Celadon Game Corner") - connect(multiworld, player, "Celadon City", "Celadon Prize Corner") - connect(multiworld, player, "Celadon City", "Route 16") - connect(multiworld, player, "Route 16", "Route 16 North", lambda state: state.pokemon_rb_can_cut(player), one_way=True) - connect(multiworld, player, "Route 16", "Route 16 West", lambda state: state.has("Poke Flute", player) and state.has("Bicycle", player)) - connect(multiworld, player, "Route 17", "Route 16 West") - connect(multiworld, player, "Route 17", "Route 18", lambda state: state.has("Bicycle", player)) - connect(multiworld, player, "Fuchsia City", "Fuchsia Gym", one_way=True) - connect(multiworld, player, "Fuchsia City", "Route 18") - connect(multiworld, player, "Fuchsia City", "Safari Zone Gate", one_way=True) - connect(multiworld, player, "Safari Zone Gate", "Safari Zone Center", lambda state: state.has("Safari Pass", player) or not state.multiworld.extra_key_items[player].value, one_way=True) - connect(multiworld, player, "Safari Zone Center", "Safari Zone East", one_way=True) - connect(multiworld, player, "Safari Zone Center", "Safari Zone West", one_way=True) - connect(multiworld, player, "Safari Zone Center", "Safari Zone North", one_way=True) - connect(multiworld, player, "Fuchsia City", "Route 15") + connect(multiworld, player, "Celadon City", "Celadon City-G", lambda state: logic.can_cut(state, player)) + connect(multiworld, player, "Celadon City", "Route 16-E") + connect(multiworld, player, "Route 18 Gate 1F-W", "Route 18 Gate 1F-E", lambda state: state.has("Bicycle", player) or state.multiworld.bicycle_gate_skips[player] == "in_logic") + connect(multiworld, player, "Route 16 Gate 1F-W", "Route 16 Gate 1F-E", lambda state: state.has("Bicycle", player) or state.multiworld.bicycle_gate_skips[player] == "in_logic") + connect(multiworld, player, "Route 16-E", "Route 16-NE", lambda state: logic.can_cut(state, player)) + connect(multiworld, player, "Route 16-E", "Route 16-C", lambda state: state.has("Poke Flute", player)) + connect(multiworld, player, "Route 17", "Route 16-SW") + connect(multiworld, player, "Route 17", "Route 18-W") + # connect(multiworld, player, "Pokemon Mansion 2F", "Pokemon Mansion 2F-NW", one_way=True) + connect(multiworld, player, "Safari Zone Gate-S", "Safari Zone Gate-N", lambda state: state.has("Safari Pass", player) or not state.multiworld.extra_key_items[player].value, one_way=True) + connect(multiworld, player, "Fuchsia City", "Route 15-W") + connect(multiworld, player, "Fuchsia City", "Route 18-E") connect(multiworld, player, "Route 15", "Route 14") - connect(multiworld, player, "Route 14", "Route 14 Grass", lambda state: state.pokemon_rb_can_cut(player), one_way=True) + connect(multiworld, player, "Route 14", "Route 15-N", lambda state: logic.can_cut(state, player), one_way=True) + connect(multiworld, player, "Route 14", "Route 14-Grass", lambda state: logic.can_cut(state, player), one_way=True) + connect(multiworld, player, "Route 13", "Route 13-Grass", lambda state: logic.can_cut(state, player), one_way=True) connect(multiworld, player, "Route 14", "Route 13") - connect(multiworld, player, "Route 13", "Route 13 East", lambda state: state.pokemon_rb_can_strength(player) or state.pokemon_rb_can_surf(player) or not state.multiworld.extra_strength_boulders[player].value) - connect(multiworld, player, "Route 12 South", "Route 13 East") - connect(multiworld, player, "Fuchsia City", "Route 19", lambda state: state.pokemon_rb_can_surf(player)) - connect(multiworld, player, "Route 20 East", "Route 19") - connect(multiworld, player, "Route 20 West", "Cinnabar Island", lambda state: state.pokemon_rb_can_surf(player)) - connect(multiworld, player, "Route 20 West", "Seafoam Islands 1F") - connect(multiworld, player, "Route 20 East", "Seafoam Islands 1F", one_way=True) - connect(multiworld, player, "Seafoam Islands 1F", "Route 20 East", lambda state: state.pokemon_rb_can_strength(player), one_way=True) - connect(multiworld, player, "Viridian City", "Viridian City North", lambda state: state.has("Oak's Parcel", player) or state.multiworld.old_man[player].value == 2 or state.pokemon_rb_can_cut(player)) - connect(multiworld, player, "Route 3", "Mt Moon 1F", one_way=True) - connect(multiworld, player, "Route 11", "Route 11 East", lambda state: state.pokemon_rb_can_strength(player)) - connect(multiworld, player, "Cinnabar Island", "Cinnabar Gym", lambda state: state.has("Secret Key", player) and state.pokemon_rb_cinnabar_gym(player), one_way=True) - connect(multiworld, player, "Cinnabar Island", "Pokemon Mansion 1F", lambda state: state.has("Mansion Key", player) or not state.multiworld.extra_key_items[player].value, one_way=True) + connect(multiworld, player, "Route 13", "Route 13-E", lambda state: logic.can_strength(state, player) or logic.can_surf(state, player) or not state.multiworld.extra_strength_boulders[player].value) + connect(multiworld, player, "Route 12-S", "Route 13-E") + connect(multiworld, player, "Fuchsia City", "Route 19-N") + connect(multiworld, player, "Route 19-N", "Route 19-S", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Route 20-E", "Route 20-IW", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Route 20-E", "Route 19-S") + connect(multiworld, player, "Route 20-W", "Cinnabar Island", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Route 20-IE", "Route 20-W", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Route 20-E", "Route 19/20-Water", one_way=True) + connect(multiworld, player, "Route 20-W", "Route 19/20-Water", one_way=True) + connect(multiworld, player, "Route 19-S", "Route 19/20-Water", one_way=True) + connect(multiworld, player, "Safari Zone West-NW", "Safari Zone West", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Safari Zone West", "Safari Zone West-Wild", one_way=True) + connect(multiworld, player, "Safari Zone West-NW", "Safari Zone West-Wild", one_way=True) + connect(multiworld, player, "Safari Zone Center-NW", "Safari Zone Center-C", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Safari Zone Center-NE", "Safari Zone Center-C", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Safari Zone Center-S", "Safari Zone Center-C", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Safari Zone Center-S", "Safari Zone Center-Wild", one_way=True) + connect(multiworld, player, "Safari Zone Center-NW", "Safari Zone Center-Wild", one_way=True) + connect(multiworld, player, "Safari Zone Center-NE", "Safari Zone Center-Wild", one_way=True) + connect(multiworld, player, "Victory Road 3F-S", "Victory Road 3F", lambda state: logic.can_strength(state, player)) + connect(multiworld, player, "Victory Road 3F-SE", "Victory Road 3F-S", lambda state: logic.can_strength(state, player), one_way=True) + connect(multiworld, player, "Victory Road 3F", "Victory Road 3F-Wild", one_way=True) + connect(multiworld, player, "Victory Road 3F-SE", "Victory Road 3F-Wild", one_way=True) + connect(multiworld, player, "Victory Road 3F-S", "Victory Road 3F-Wild", one_way=True) + connect(multiworld, player, "Victory Road 2F-W", "Victory Road 2F-Wild", one_way=True) + connect(multiworld, player, "Victory Road 2F-NW", "Victory Road 2F-Wild", one_way=True) + connect(multiworld, player, "Victory Road 2F-C", "Victory Road 2F-Wild", one_way=True) + connect(multiworld, player, "Victory Road 2F-E", "Victory Road 2F-Wild", one_way=True) + connect(multiworld, player, "Victory Road 2F-SE", "Victory Road 2F-Wild", one_way=True) + connect(multiworld, player, "Victory Road 2F-W", "Victory Road 2F-C", lambda state: logic.can_strength(state, player), one_way=True) + connect(multiworld, player, "Victory Road 2F-NW", "Victory Road 2F-W", lambda state: logic.can_strength(state, player), one_way=True) + connect(multiworld, player, "Victory Road 2F-C", "Victory Road 2F-SE", lambda state: logic.can_strength(state, player) and state.has("Victory Road Boulder", player), one_way=True) + connect(multiworld, player, "Victory Road 1F-S", "Victory Road 1F", lambda state: logic.can_strength(state, player)) + connect(multiworld, player, "Victory Road 1F", "Victory Road 1F-Wild", one_way=True) + connect(multiworld, player, "Victory Road 1F-S", "Victory Road 1F-Wild", one_way=True) + connect(multiworld, player, "Mt Moon B1F-W", "Mt Moon B1F-Wild", one_way=True) + connect(multiworld, player, "Mt Moon B1F-C", "Mt Moon B1F-Wild", one_way=True) + connect(multiworld, player, "Mt Moon B1F-NE", "Mt Moon B1F-Wild", one_way=True) + connect(multiworld, player, "Mt Moon B1F-SE", "Mt Moon B1F-Wild", one_way=True) + connect(multiworld, player, "Cerulean Cave 2F-N", "Cerulean Cave 2F-Wild", one_way=True) + connect(multiworld, player, "Cerulean Cave 2F-E", "Cerulean Cave 2F-Wild", one_way=True) + connect(multiworld, player, "Cerulean Cave 2F-W", "Cerulean Cave 2F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands 1F", "Seafoam Islands 1F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands 1F-SE", "Seafoam Islands 1F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands B1F", "Seafoam Islands B1F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands B1F-SE", "Seafoam Islands B1F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands B1F-NE", "Seafoam Islands B1F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands B2F-NW", "Seafoam Islands B2F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands B2F-NE", "Seafoam Islands B2F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands B2F-SW", "Seafoam Islands B2F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands B2F-SE", "Seafoam Islands B2F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands B3F", "Seafoam Islands B3F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands B3F-NE", "Seafoam Islands B3F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands B3F-SE", "Seafoam Islands B3F-Wild", one_way=True) + connect(multiworld, player, "Seafoam Islands B4F", "Seafoam Islands B4F-W", lambda state: logic.can_surf(state, player), one_way=True) + connect(multiworld, player, "Seafoam Islands B4F-W", "Seafoam Islands B4F", one_way=True) + # This really shouldn't be necessary since if the boulders are reachable you can drop, but might as well be thorough + connect(multiworld, player, "Seafoam Islands B3F", "Seafoam Islands B3F-SE", lambda state: logic.can_surf(state, player) and logic.can_strength(state, player) and state.has("Seafoam Exit Boulder", player, 6)) + connect(multiworld, player, "Viridian City", "Viridian City-N", lambda state: state.has("Oak's Parcel", player) or state.multiworld.old_man[player].value == 2 or logic.can_cut(state, player)) + connect(multiworld, player, "Route 11", "Route 11-C", lambda state: logic.can_strength(state, player) or not state.multiworld.extra_strength_boulders[player]) + connect(multiworld, player, "Cinnabar Island", "Cinnabar Island-G", lambda state: state.has("Secret Key", player)) + connect(multiworld, player, "Cinnabar Island", "Cinnabar Island-M", lambda state: state.has("Mansion Key", player) or not state.multiworld.extra_key_items[player].value) + connect(multiworld, player, "Route 21", "Cinnabar Island", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Pallet Town", "Route 21", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Celadon Gym", "Celadon Gym-C", lambda state: logic.can_cut(state, player), one_way=True) + connect(multiworld, player, "Celadon Game Corner", "Celadon Game Corner-Hidden Stairs", lambda state: (not state.multiworld.extra_key_items[player]) or state.has("Hideout Key", player), one_way=True) + connect(multiworld, player, "Celadon Game Corner-Hidden Stairs", "Celadon Game Corner", one_way=True) + connect(multiworld, player, "Rocket Hideout B1F-SE", "Rocket Hideout B1F", one_way=True) + connect(multiworld, player, "Indigo Plateau Lobby", "Indigo Plateau Lobby-N", lambda state: logic.has_badges(state, state.multiworld.elite_four_badges_condition[player].value, player) and logic.has_pokemon(state, state.multiworld.elite_four_pokedex_condition[player].total, player) and logic.has_key_items(state, state.multiworld.elite_four_key_items_condition[player].total, player) and (state.has("Pokedex", player, int(state.multiworld.elite_four_pokedex_condition[player].total > 1) * state.multiworld.require_pokedex[player].value))) + connect(multiworld, player, "Pokemon Mansion 3F", "Pokemon Mansion 3F-Wild", one_way=True) + connect(multiworld, player, "Pokemon Mansion 3F-SW", "Pokemon Mansion 3F-Wild", one_way=True) + connect(multiworld, player, "Pokemon Mansion 3F-SE", "Pokemon Mansion 3F-Wild", one_way=True) + connect(multiworld, player, "Pokemon Mansion 2F-E", "Pokemon Mansion 2F-Wild", one_way=True) + connect(multiworld, player, "Pokemon Mansion 1F-SE", "Pokemon Mansion 1F-Wild", one_way=True) + connect(multiworld, player, "Pokemon Mansion 1F", "Pokemon Mansion 1F-Wild", one_way=True) + connect(multiworld, player, "Rock Tunnel 1F-S", "Rock Tunnel 1F-Wild", lambda state: logic.rock_tunnel(state, player), one_way=True) + connect(multiworld, player, "Rock Tunnel 1F-NW", "Rock Tunnel 1F-Wild", lambda state: logic.rock_tunnel(state, player), one_way=True) + connect(multiworld, player, "Rock Tunnel 1F-NE", "Rock Tunnel 1F-Wild", lambda state: logic.rock_tunnel(state, player), one_way=True) + connect(multiworld, player, "Rock Tunnel B1F-W", "Rock Tunnel B1F-Wild", lambda state: logic.rock_tunnel(state, player), one_way=True) + connect(multiworld, player, "Rock Tunnel B1F-E", "Rock Tunnel B1F-Wild", lambda state: logic.rock_tunnel(state, player), one_way=True) + connect(multiworld, player, "Cerulean Cave 1F-SE", "Cerulean Cave 1F-Wild", one_way=True) + connect(multiworld, player, "Cerulean Cave 1F-SW", "Cerulean Cave 1F-Wild", one_way=True) + connect(multiworld, player, "Cerulean Cave 1F-NE", "Cerulean Cave 1F-Wild", one_way=True) + connect(multiworld, player, "Cerulean Cave 1F-N", "Cerulean Cave 1F-Wild", one_way=True) + connect(multiworld, player, "Cerulean Cave 1F-NW", "Cerulean Cave 1F-Wild", one_way=True) + connect(multiworld, player, "Cerulean Cave 1F-SE", "Cerulean Cave 1F-Water", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Cerulean Cave 1F-SW", "Cerulean Cave 1F-Water", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Cerulean Cave 1F-N", "Cerulean Cave 1F-Water", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Cerulean Cave 1F-NE", "Cerulean Cave 1F-Water", lambda state: logic.can_surf(state, player)) + connect(multiworld, player, "Pokemon Mansion 3F", "Pokemon Mansion 3F-SE", one_way=True) + connect(multiworld, player, "Silph Co 2F", "Silph Co 2F-NW", lambda state: logic.card_key(state, 2, player)) + connect(multiworld, player, "Silph Co 2F", "Silph Co 2F-SW", lambda state: logic.card_key(state, 2, player)) + connect(multiworld, player, "Silph Co 3F", "Silph Co 3F-C", lambda state: logic.card_key(state, 3, player)) + connect(multiworld, player, "Silph Co 3F-W", "Silph Co 3F-C", lambda state: logic.card_key(state, 3, player)) + connect(multiworld, player, "Silph Co 4F", "Silph Co 4F-N", lambda state: logic.card_key(state, 4, player)) + connect(multiworld, player, "Silph Co 4F", "Silph Co 4F-W", lambda state: logic.card_key(state, 4, player)) + connect(multiworld, player, "Silph Co 5F", "Silph Co 5F-NW", lambda state: logic.card_key(state, 5, player)) + connect(multiworld, player, "Silph Co 5F", "Silph Co 5F-SW", lambda state: logic.card_key(state, 5, player)) + connect(multiworld, player, "Silph Co 6F", "Silph Co 6F-SW", lambda state: logic.card_key(state, 6, player)) + connect(multiworld, player, "Silph Co 7F", "Silph Co 7F-E", lambda state: logic.card_key(state, 7, player)) + connect(multiworld, player, "Silph Co 7F-SE", "Silph Co 7F-E", lambda state: logic.card_key(state, 7, player)) + connect(multiworld, player, "Silph Co 8F", "Silph Co 8F-W", lambda state: logic.card_key(state, 8, player)) + connect(multiworld, player, "Silph Co 9F", "Silph Co 9F-SW", lambda state: logic.card_key(state, 9, player)) + connect(multiworld, player, "Silph Co 9F-NW", "Silph Co 9F-SW", lambda state: logic.card_key(state, 9, player)) + connect(multiworld, player, "Silph Co 10F", "Silph Co 10F-SE", lambda state: logic.card_key(state, 10, player)) + connect(multiworld, player, "Silph Co 11F-W", "Silph Co 11F-C", lambda state: logic.card_key(state, 11, player)) + connect(multiworld, player, "Silph Co Elevator", "Silph Co Elevator-1F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Silph Co Elevator", "Silph Co Elevator-2F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Silph Co Elevator", "Silph Co Elevator-3F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Silph Co Elevator", "Silph Co Elevator-4F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Silph Co Elevator", "Silph Co Elevator-5F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Silph Co Elevator", "Silph Co Elevator-6F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Silph Co Elevator", "Silph Co Elevator-7F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Silph Co Elevator", "Silph Co Elevator-8F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Silph Co Elevator", "Silph Co Elevator-9F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Silph Co Elevator", "Silph Co Elevator-10F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Silph Co Elevator", "Silph Co Elevator-11F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Rocket Hideout Elevator", "Rocket Hideout Elevator-B1F", lambda state: state.has("Lift Key", player)) + connect(multiworld, player, "Rocket Hideout Elevator", "Rocket Hideout Elevator-B2F", lambda state: state.has("Lift Key", player)) + connect(multiworld, player, "Rocket Hideout Elevator", "Rocket Hideout Elevator-B4F", lambda state: state.has("Lift Key", player)) + connect(multiworld, player, "Celadon Department Store Elevator", "Celadon Department Store Elevator-1F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Celadon Department Store Elevator", "Celadon Department Store Elevator-2F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Celadon Department Store Elevator", "Celadon Department Store Elevator-3F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Celadon Department Store Elevator", "Celadon Department Store Elevator-4F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Celadon Department Store Elevator", "Celadon Department Store Elevator-5F", lambda state: (not state.multiworld.all_elevators_locked[player]) or state.has("Lift Key", player)), + connect(multiworld, player, "Route 23-N", "Indigo Plateau") + connect(multiworld, player, "Cerulean City-Water", "Cerulean City-Cave", lambda state: + logic.has_badges(state, self.multiworld.cerulean_cave_badges_condition[player].value, player) and + logic.has_key_items(state, self.multiworld.cerulean_cave_key_items_condition[player].total, player) and logic.can_surf(state, player)) + + + # access to any part of a city will enable flying to the Pokemon Center + connect(multiworld, player, "Cerulean City-Cave", "Cerulean City", lambda state: logic.can_fly(state, player), one_way=True) + connect(multiworld, player, "Cerulean City-Badge House Backyard", "Cerulean City", lambda state: logic.can_fly(state, player), one_way=True) + connect(multiworld, player, "Fuchsia City-Good Rod House Backyard", "Fuchsia City", lambda state: logic.can_fly(state, player), one_way=True) + connect(multiworld, player, "Saffron City-G", "Saffron City", lambda state: logic.can_fly(state, player), one_way=True) + connect(multiworld, player, "Saffron City-Pidgey", "Saffron City", lambda state: logic.can_fly(state, player), one_way=True) + connect(multiworld, player, "Saffron City-Silph", "Saffron City", lambda state: logic.can_fly(state, player), one_way=True) + connect(multiworld, player, "Saffron City-Copycat", "Saffron City", lambda state: logic.can_fly(state, player), one_way=True) + connect(multiworld, player, "Celadon City-G", "Celadon City", lambda state: logic.can_fly(state, player), one_way=True) + connect(multiworld, player, "Vermilion City-G", "Vermilion City", lambda state: logic.can_fly(state, player), one_way=True) + connect(multiworld, player, "Vermilion City-Dock", "Vermilion City", lambda state: logic.can_fly(state, player), one_way=True) + connect(multiworld, player, "Cinnabar Island-G", "Cinnabar Island", lambda state: logic.can_fly(state, player), one_way=True) + connect(multiworld, player, "Cinnabar Island-M", "Cinnabar Island", lambda state: logic.can_fly(state, player), one_way=True) + + + # drops connect(multiworld, player, "Seafoam Islands 1F", "Seafoam Islands B1F", one_way=True) - connect(multiworld, player, "Seafoam Islands B1F", "Seafoam Islands B2F", one_way=True) - connect(multiworld, player, "Seafoam Islands B2F", "Seafoam Islands B3F", one_way=True) + connect(multiworld, player, "Seafoam Islands 1F", "Seafoam Islands B1F-NE", one_way=True) + connect(multiworld, player, "Seafoam Islands B1F", "Seafoam Islands B2F-NW", one_way=True) + connect(multiworld, player, "Seafoam Islands B1F-NE", "Seafoam Islands B2F-NE", one_way=True) + connect(multiworld, player, "Seafoam Islands B2F-NW", "Seafoam Islands B3F", lambda state: logic.can_strength(state, player) and state.has("Seafoam Exit Boulder", player, 6), one_way=True) + connect(multiworld, player, "Seafoam Islands B2F-NE", "Seafoam Islands B3F", lambda state: logic.can_strength(state, player) and state.has("Seafoam Exit Boulder", player, 6), one_way=True) + connect(multiworld, player, "Seafoam Islands B2F-NW", "Seafoam Islands B3F-SE", lambda state: logic.can_strength(state, player) and state.has("Seafoam Exit Boulder", player, 6), one_way=True) + connect(multiworld, player, "Seafoam Islands B2F-NE", "Seafoam Islands B3F-SE", lambda state: logic.can_strength(state, player) and state.has("Seafoam Exit Boulder", player, 6), one_way=True) + # If you haven't dropped the boulders, you'll go straight to B4F + connect(multiworld, player, "Seafoam Islands B2F-NW", "Seafoam Islands B4F-W", one_way=True) + connect(multiworld, player, "Seafoam Islands B2F-NE", "Seafoam Islands B4F-W", one_way=True) connect(multiworld, player, "Seafoam Islands B3F", "Seafoam Islands B4F", one_way=True) - connect(multiworld, player, "Route 21", "Cinnabar Island", lambda state: state.pokemon_rb_can_surf(player)) - connect(multiworld, player, "Pallet Town", "Route 21", lambda state: state.pokemon_rb_can_surf(player)) - connect(multiworld, player, "Saffron City", "Silph Co 1F", lambda state: state.has("Fuji Saved", player), one_way=True) - connect(multiworld, player, "Silph Co 1F", "Silph Co 2F", one_way=True) - connect(multiworld, player, "Silph Co 2F", "Silph Co 3F", one_way=True) - connect(multiworld, player, "Silph Co 3F", "Silph Co 4F", one_way=True) - connect(multiworld, player, "Silph Co 4F", "Silph Co 5F", one_way=True) - connect(multiworld, player, "Silph Co 5F", "Silph Co 6F", one_way=True) - connect(multiworld, player, "Silph Co 6F", "Silph Co 7F", one_way=True) - connect(multiworld, player, "Silph Co 7F", "Silph Co 8F", one_way=True) - connect(multiworld, player, "Silph Co 8F", "Silph Co 9F", one_way=True) - connect(multiworld, player, "Silph Co 9F", "Silph Co 10F", one_way=True) - connect(multiworld, player, "Silph Co 10F", "Silph Co 11F", one_way=True) - connect(multiworld, player, "Celadon City", "Rocket Hideout B1F", lambda state: state.has("Hideout Key", player) or not state.multiworld.extra_key_items[player].value, one_way=True) - connect(multiworld, player, "Rocket Hideout B1F", "Rocket Hideout B2F", one_way=True) - connect(multiworld, player, "Rocket Hideout B2F", "Rocket Hideout B3F", one_way=True) - connect(multiworld, player, "Rocket Hideout B3F", "Rocket Hideout B4F", one_way=True) - connect(multiworld, player, "Pokemon Mansion 1F", "Pokemon Mansion 2F", one_way=True) - connect(multiworld, player, "Pokemon Mansion 2F", "Pokemon Mansion 3F", one_way=True) - connect(multiworld, player, "Pokemon Mansion 1F", "Pokemon Mansion B1F", one_way=True) - connect(multiworld, player, "Route 23", "Victory Road 1F", lambda state: state.pokemon_rb_can_strength(player), one_way=True) - connect(multiworld, player, "Victory Road 1F", "Victory Road 2F", one_way=True) - connect(multiworld, player, "Victory Road 2F", "Victory Road 3F", one_way=True) - connect(multiworld, player, "Victory Road 2F", "Indigo Plateau", lambda state: state.pokemon_rb_has_badges(state.multiworld.elite_four_condition[player], player), one_way=True) - connect(multiworld, player, "Cerulean City", "Cerulean Cave 1F", lambda state: - state.pokemon_rb_cerulean_cave(state.multiworld.cerulean_cave_condition[player].value + (state.multiworld.extra_key_items[player].value * 4), player) and - state.pokemon_rb_can_surf(player), one_way=True) - connect(multiworld, player, "Cerulean Cave 1F", "Cerulean Cave 2F", one_way=True) - connect(multiworld, player, "Cerulean Cave 1F", "Cerulean Cave B1F", lambda state: state.pokemon_rb_can_surf(player), one_way=True) + connect(multiworld, player, "Seafoam Islands B3F", "Seafoam Islands B4F-W", lambda state: logic.can_surf(state, player), one_way=True) + connect(multiworld, player, "Pokemon Mansion 3F-SE", "Pokemon Mansion 2F", one_way=True) + connect(multiworld, player, "Pokemon Mansion 3F-SE", "Pokemon Mansion 1F-SE", one_way=True) + connect(multiworld, player, "Victory Road 3F-S", "Victory Road 2F-C", one_way=True) + if multiworld.worlds[player].fly_map != "Pallet Town": - connect(multiworld, player, "Menu", multiworld.worlds[player].fly_map, lambda state: state.pokemon_rb_can_fly(player), one_way=True, - name="Fly to " + multiworld.worlds[player].fly_map) + connect(multiworld, player, "Menu", multiworld.worlds[player].fly_map, + lambda state: logic.can_fly(state, player), one_way=True, name="Free Fly Location") + + if multiworld.worlds[player].town_map_fly_map != "Pallet Town": + connect(multiworld, player, "Menu", multiworld.worlds[player].town_map_fly_map, + lambda state: logic.can_fly(state, player) and state.has("Town Map", player), one_way=True, + name="Town Map Fly Location") + + entrances = [] + for region_name, region_entrances in warp_data.items(): + for entrance_data in region_entrances: + region = multiworld.get_region(region_name, player) + shuffle = True + if not outdoor_map(region.name) and not outdoor_map(entrance_data['to']['map']) and \ + multiworld.door_shuffle[player] not in ("insanity", "decoupled"): + shuffle = False + if multiworld.door_shuffle[player] == "simple": + if sorted([entrance_data['to']['map'], region.name]) == ["Celadon Game Corner-Hidden Stairs", + "Rocket Hideout B1F"]: + shuffle = True + elif sorted([entrance_data['to']['map'], region.name]) == ["Celadon City", "Celadon Game Corner"]: + shuffle = False + if (multiworld.randomize_rock_tunnel[player] and "Rock Tunnel" in region.name and "Rock Tunnel" in + entrance_data['to']['map']): + shuffle = False + if (f"{region.name} to {entrance_data['to']['map']}" if "name" not in entrance_data else + entrance_data["name"]) in silph_co_warps + saffron_gym_warps: + if multiworld.warp_tile_shuffle[player] or multiworld.door_shuffle[player] in ("insanity", + "decoupled"): + shuffle = True + else: + shuffle = False + elif not multiworld.door_shuffle[player]: + shuffle = False + if shuffle: + entrance = PokemonRBWarp(player, f"{region.name} to {entrance_data['to']['map']}" if "name" not in + entrance_data else entrance_data["name"], region, entrance_data["id"], + entrance_data["address"], entrance_data["flags"] if "flags" in + entrance_data else "") + # if "Rock Tunnel" in region_name: + # entrance.access_rule = lambda state: logic.rock_tunnel(state, player) + entrances.append(entrance) + region.exits.append(entrance) + else: + # connect(multiworld, player, region.name, entrance_data['to']['map'], one_way=True) + if "Rock Tunnel" in region.name: + connect(multiworld, player, region.name, entrance_data["to"]["map"], + lambda state: logic.rock_tunnel(state, player), one_way=True) + else: + connect(multiworld, player, region.name, entrance_data["to"]["map"], one_way=True) + + forced_connections = set() + + if multiworld.door_shuffle[player]: + forced_connections.update(mandatory_connections.copy()) + usable_safe_rooms = safe_rooms.copy() + + if multiworld.door_shuffle[player] == "simple": + forced_connections.update(simple_mandatory_connections) + else: + usable_safe_rooms += pokemarts + if self.multiworld.key_items_only[self.player]: + usable_safe_rooms.remove("Viridian Pokemart to Viridian City") + if multiworld.door_shuffle[player] in ("insanity", "decoupled"): + forced_connections.update(insanity_mandatory_connections) + r = multiworld.random.randint(0, 3) + if r == 2: + forced_connections.add(("Pokemon Mansion 1F-SE to Pokemon Mansion B1F", + "Pokemon Mansion 3F-SE to Pokemon Mansion 2F-E")) + forced_connections.add(("Pokemon Mansion 2F to Pokemon Mansion 3F", + multiworld.random.choice(mansion_stair_destinations + mansion_dead_ends + + ["Pokemon Mansion B1F to Pokemon Mansion 1F-SE"]))) + elif r == 3: + dead_end = multiworld.random.randint(0, 1) + forced_connections.add(("Pokemon Mansion 3F-SE to Pokemon Mansion 2F-E", + mansion_dead_ends[dead_end])) + forced_connections.add(("Pokemon Mansion 1F-SE to Pokemon Mansion B1F", + "Pokemon Mansion B1F to Pokemon Mansion 1F-SE")) + forced_connections.add(("Pokemon Mansion 2F to Pokemon Mansion 3F", + multiworld.random.choice(mansion_stair_destinations + + [mansion_dead_ends[dead_end ^ 1]]))) + else: + forced_connections.add(("Pokemon Mansion 3F-SE to Pokemon Mansion 2F-E", + mansion_dead_ends[r])) + forced_connections.add(("Pokemon Mansion 1F-SE to Pokemon Mansion B1F", + mansion_dead_ends[r ^ 1])) + forced_connections.add(("Pokemon Mansion 2F to Pokemon Mansion 3F", + multiworld.random.choice(mansion_stair_destinations + + ["Pokemon Mansion B1F to Pokemon Mansion 1F-SE"]))) + + usable_safe_rooms += insanity_safe_rooms + + safe_rooms_sample = multiworld.random.sample(usable_safe_rooms, 6) + pallet_safe_room = safe_rooms_sample[-1] + + for a, b in zip(multiworld.random.sample(["Pallet Town to Player's House 1F", "Pallet Town to Oak's Lab", + "Pallet Town to Rival's House"], 3), ["Oak's Lab to Pallet Town", + "Player's House 1F to Pallet Town", pallet_safe_room]): + forced_connections.add((a, b)) + for a, b in zip(safari_zone_houses, safe_rooms_sample): + forced_connections.add((a, b)) + if multiworld.door_shuffle[player] == "simple": + # force Indigo Plateau Lobby to vanilla location on simple, otherwise shuffle with Pokemon Centers. + for a, b in zip(multiworld.random.sample(pokemon_center_entrances[0:-1], 11), pokemon_centers[0:-1]): + forced_connections.add((a, b)) + forced_connections.add((pokemon_center_entrances[-1], pokemon_centers[-1])) + forced_pokemarts = multiworld.random.sample(pokemart_entrances, 8) + if self.multiworld.key_items_only[self.player]: + forced_pokemarts.sort(key=lambda i: i[0] != "Viridian Pokemart to Viridian City") + for a, b in zip(forced_pokemarts, pokemarts): + forced_connections.add((a, b)) + else: + # Pokemon Centers must be reached from the Cities and Routes that have programmed coordinates for + # fly / blackout warps. Rather than mess with those coordinates (besides in Pallet Town) or have players + # warping outside an entrance that isn't the Pokemon Center, just always put Pokemon Centers at Pokemon + # Center entrances + for a, b in zip(multiworld.random.sample(pokemon_center_entrances, 12), pokemon_centers): + forced_connections.add((a, b)) + # Ensure a Pokemart is available at the beginning of the game + if multiworld.key_items_only[player]: + forced_connections.add((multiworld.random.choice(initial_doors), "Viridian Pokemart to Viridian City")) + elif "Pokemart" not in pallet_safe_room: + forced_connections.add((multiworld.random.choice(initial_doors), multiworld.random.choice( + [mart for mart in pokemarts if mart not in safe_rooms_sample]))) + + if multiworld.warp_tile_shuffle[player]: + warps = multiworld.random.sample(silph_co_warps, len(silph_co_warps)) + # The only warp tiles never reachable from the stairs/elevators are the two 7F-NW warps (where the rival is) + # and the final 11F-W warp. As long as the two 7F-NW warps aren't connected to each other, everything should + # always be reachable. + warps.sort(key=lambda i: 0 if i == "Silph Co 7F-NW to Silph Co 3F-C" else + 2 if i == "Silph Co 7F-NW to Silph Co 11F-W" else 1) + while warps: + forced_connections.add((warps.pop(), warps.pop(),)) + + # Shuffle Saffron Gym sections, then connect one warp from each section to the next. + # Then connect the rest at random. + warps = multiworld.random.sample(saffron_gym_warps, len(saffron_gym_warps)) + solution = ["SW", "W", "NW", "N", "NE", "E", "SE"] + multiworld.random.shuffle(solution) + solution = ["S"] + solution + ["C"] + for i in range(len(solution) - 1): + f, t = solution[i], solution[i + 1] + fw = None + tw = None + for warp in warps: + if fw is None and warp.split(" to ")[0].endswith(f"-{f}"): + fw = warp + if tw is None and warp.split(" to ")[0].endswith(f"-{t}"): + tw = warp + if fw is not None and tw is not None: + break + warps.remove(fw) + warps.remove(tw) + forced_connections.add((fw, tw)) + while warps: + forced_connections.add((warps.pop(), warps.pop(),)) + + for pair in forced_connections: + entrance_a = multiworld.get_entrance(pair[0], player) + entrance_b = multiworld.get_entrance(pair[1], player) + entrance_a.connect(entrance_b) + entrance_b.connect(entrance_a) + entrances.remove(entrance_a) + entrances.remove(entrance_b) + + if multiworld.door_shuffle[player] == "simple": + def connect_connecting_interiors(interior_exits, exterior_entrances): + for interior, exterior in zip(interior_exits, exterior_entrances): + for a, b in zip(interior, exterior): + entrance_a = multiworld.get_entrance(a, player) + if b is None: + #entrance_b = multiworld.get_entrance(entrances[0], player) + # should just be able to use the entrance_b from the previous link? + pass + else: + entrance_b = multiworld.get_entrance(b, player) + entrance_b.connect(entrance_a) + entrances.remove(entrance_b) + entrance_a.connect(entrance_b) + entrances.remove(entrance_a) + + def connect_interiors(interior_exits, exterior_entrances): + for a, b in zip(interior_exits, exterior_entrances): + if isinstance(a, list): + entrance_a = multiworld.get_entrance(a[0], player) + else: + entrance_a = multiworld.get_entrance(a, player) + entrance_b = multiworld.get_entrance(b, player) + entrance_a.connect(entrance_b) + entrance_b.connect(entrance_a) + entrances.remove(entrance_b) + entrances.remove(entrance_a) + if isinstance(a, list): + entrance_a = multiworld.get_entrance(a[1], player) + entrance_a.connect(entrance_b) + entrances.remove(entrance_a) + + placed_connecting_interior_dungeons = safe_connecting_interior_dungeons + unsafe_connecting_interior_dungeons + interior_dungeon_entrances = connecting_interior_dungeon_entrances.copy() + + placed_single_entrance_dungeons = dungeons.copy() + single_entrance_dungeon_entrances = dungeon_entrances.copy() + + for i in range(2): + if True or not multiworld.random.randint(0, 2): + placed_connecting_interior_dungeons.append(multi_purpose_dungeons[i]) + interior_dungeon_entrances.append([multi_purpose_dungeon_entrances[i], None]) + else: + placed_single_entrance_dungeons.append(multi_purpose_dungeons[i]) + single_entrance_dungeon_entrances.append(multi_purpose_dungeon_entrances[i]) + + multiworld.random.shuffle(placed_connecting_interior_dungeons) + while placed_connecting_interior_dungeons[0] in unsafe_connecting_interior_dungeons: + multiworld.random.shuffle(placed_connecting_interior_dungeons) + connect_connecting_interiors(placed_connecting_interior_dungeons, interior_dungeon_entrances) + + interiors = connecting_interiors.copy() + multiworld.random.shuffle(interiors) + while ((connecting_interiors[2] in (interiors[2], interiors[10], interiors[11]) # Dept Store at Dept Store + # or Rt 16 Gate S or N + and (interiors[11] in connecting_interiors[13:17] # Saffron Gate at Rt 16 Gate S + or interiors[12] in connecting_interiors[13:17])) # Saffron Gate at Rt 18 Gate + and interiors[15] in connecting_interiors[13:17] # Saffron Gate at Rt 7 Gate + and interiors[1] in connecting_interiors[13:17] # Saffron Gate at Rt 7-8 Underground Path + and (not multiworld.tea[player]) and multiworld.worlds[player].fly_map != "Celadon City" + and multiworld.worlds[player].town_map_fly_map != "Celadon City"): + multiworld.random.shuffle(interiors) + + connect_connecting_interiors(interiors, connecting_interior_entrances) + placed_gyms = gyms.copy() + multiworld.random.shuffle(placed_gyms) + + # Celadon Gym requires Cut access to reach the Gym Leader. There are some scenarios where its placement + # could make badge placement impossible + def celadon_gym_problem(): + # Badgesanity or no badges needed for HM moves means gyms can go anywhere + if multiworld.badgesanity[player] or not multiworld.badges_needed_for_hm_moves[player]: + return False + + # Celadon Gym in Pewter City and need one or more badges for Viridian City gym. + # No gym leaders would be reachable. + if gyms[3] == placed_gyms[0] and multiworld.viridian_gym_condition[player] > 0: + return True + + # Celadon Gym not on Cinnabar Island or can access Viridian City gym with one badge + if not gyms[3] == placed_gyms[6] and multiworld.viridian_gym_condition[player] > 1: + return False + + # At this point we need to see if we can get beyond Pewter/Cinnabar with just one badge + + # Can get Fly access from Pewter City gym and fly beyond Pewter/Cinnabar + if multiworld.worlds[player].fly_map not in ("Pallet Town", "Viridian City", "Cinnabar Island", + "Indigo Plateau") and multiworld.worlds[player].town_map_fly_map not in ("Pallet Town", + "Viridian City", "Cinnabar Island", "Indigo Plateau"): + return False + + # Route 3 condition is boulder badge but Mt Moon entrance leads to safe dungeons or Rock Tunnel + if multiworld.route_3_condition[player] == "boulder_badge" and placed_connecting_interior_dungeons[2] not \ + in (unsafe_connecting_interior_dungeons[0], unsafe_connecting_interior_dungeons[2]): + return False + + # Route 3 condition is Defeat Brock and he is in Pewter City, or any other condition besides Boulder Badge. + # Any badge can land in Pewter City, so the only problematic dungeon at Mt Moon is Seafoam Islands since + # it requires two badges + if (((multiworld.route_3_condition[player] == "defeat_brock" and gyms[0] == placed_gyms[0]) + or multiworld.route_3_condition[player] not in ("defeat_brock", "boulder_badge")) + and placed_connecting_interior_dungeons[2] != unsafe_connecting_interior_dungeons[0]): + return False + + # If dungeon at Diglett's Cave does not require a badge, we can get Cut access and make it through + if placed_connecting_interior_dungeons[1] in safe_connecting_interior_dungeons: + return False + + # If dungeon at Seafoam Islands does not require a badge, we can get Surf access and make it through + if placed_connecting_interior_dungeons[3] in safe_connecting_interior_dungeons: + return False + + # No apparent way to proceed, reshuffle + return True + + # Also check for a very specific situation where Brock or vending machines are needed to access + # Cerulean City, but they are placed in Cerulean City + def cerulean_city_problem(): + if (gyms[0] == placed_gyms[1] # Pewter Gym in Cerulean City + and interiors[0] in connecting_interiors[13:17] # Saffron Gate at Underground Path North South + and interiors[13] in connecting_interiors[13:17] # Saffron Gate at Route 5 Saffron Gate + and multi_purpose_dungeons[0] == placed_connecting_interior_dungeons[4] # Pokémon Mansion at Rock Tunnel, which is + and (not multiworld.tea[player]) # not traversable backwards + and multiworld.route_3_condition[player] == "defeat_brock" + and multiworld.worlds[player].fly_map != "Cerulean City" + and multiworld.worlds[player].town_map_fly_map != "Cerulean City"): + return True + + while celadon_gym_problem() or cerulean_city_problem(): + multiworld.random.shuffle(placed_gyms) + + connect_interiors(placed_gyms, gym_entrances) + + multiworld.random.shuffle(placed_single_entrance_dungeons) + while dungeons[4] == placed_single_entrance_dungeons[0]: # Pokémon Tower at Silph Co + multiworld.random.shuffle(placed_single_entrance_dungeons) + connect_interiors(placed_single_entrance_dungeons, single_entrance_dungeon_entrances) + + remaining_entrances = [entrance for entrance in entrances if outdoor_map(entrance.parent_region.name)] + multiworld.random.shuffle(remaining_entrances) + remaining_interiors = [entrance for entrance in entrances if entrance not in remaining_entrances] + for entrance_a, entrance_b in zip(remaining_entrances, remaining_interiors): + entrance_a.connect(entrance_b) + entrance_b.connect(entrance_a) + elif multiworld.door_shuffle[player]: + if multiworld.door_shuffle[player] == "full": + loop_out_interiors = [[multiworld.get_entrance(e[0], player), multiworld.get_entrance(e[1], player)] for e + in multiworld.random.sample(unsafe_connecting_interior_dungeons + + safe_connecting_interior_dungeons, 2)] + entrances.remove(loop_out_interiors[0][1]) + entrances.remove(loop_out_interiors[1][1]) + if not multiworld.badgesanity[player]: + badges = [item for item in self.item_pool if "Badge" in item.name] + for badge in badges: + self.item_pool.remove(badge) + badge_locs = [] + for loc in ["Pewter Gym - Brock Prize", "Cerulean Gym - Misty Prize", "Vermilion Gym - Lt. Surge Prize", + "Celadon Gym - Erika Prize", "Fuchsia Gym - Koga Prize", "Saffron Gym - Sabrina Prize", + "Cinnabar Gym - Blaine Prize", "Viridian Gym - Giovanni Prize"]: + badge_locs.append(multiworld.get_location(loc, player)) + multiworld.random.shuffle(badges) + while badges[3].name == "Cascade Badge" and multiworld.badges_needed_for_hm_moves[player] == "on": + multiworld.random.shuffle(badges) + for badge, loc in zip(badges, badge_locs): + loc.place_locked_item(badge) + + state = multiworld.state.copy() + for item, data in item_table.items(): + if (data.id or item in poke_data.pokemon_data) and data.classification == ItemClassification.progression \ + and ("Badge" not in item or multiworld.badgesanity[player]): + state.collect(self.create_item(item)) + + multiworld.random.shuffle(entrances) + reachable_entrances = [] + + relevant_events = [ + "Boulder Badge", + "Cascade Badge", + "Thunder Badge", + "Rainbow Badge", + "Soul Badge", + "Marsh Badge", + "Volcano Badge", + "Earth Badge", + "Seafoam Exit Boulder", + "Victory Road Boulder", + "Silph Co Liberated", + ] + if multiworld.robbed_house_officer[player]: + relevant_events.append("Help Bill") + if multiworld.tea[player]: + relevant_events.append("Vending Machine Drinks") + if multiworld.route_3_condition[player] == "defeat_brock": + relevant_events.append("Defeat Brock") + elif multiworld.route_3_condition[player] == "defeat_any_gym": + relevant_events += [ + "Defeat Brock", + "Defeat Misty", + "Defeat Lt. Surge", + "Defeat Erika", + "Defeat Koga", + "Defeat Sabrina", + "Defeat Blaine", + "Defeat Viridian Gym Giovanni", + ] + + def adds_reachable_entrances(entrances_copy, item): + state.collect(item, False) + ret = len([entrance for entrance in entrances_copy if entrance in reachable_entrances or + entrance.parent_region.can_reach(state)]) > len(reachable_entrances) + state.remove(item) + return ret + + def dead_end(entrances_copy, e): + region = e.parent_region + check_warps = set() + checked_regions = {region} + check_warps.update(region.exits) + check_warps.remove(e) + for location in region.locations: + if location.item and location.item.name in relevant_events and adds_reachable_entrances(entrances_copy, + location.item): + return False + while check_warps: + warp = check_warps.pop() + warp = warp + if warp not in reachable_entrances: + if "Rock Tunnel" not in warp.name or logic.rock_tunnel(state, player): + # confirm warp is in entrances list to ensure it's not a loop-out interior + if warp.connected_region is None and warp in entrances_copy: + return False + elif (isinstance(warp, PokemonRBWarp) and ("Rock Tunnel" not in warp.name or + logic.rock_tunnel(state, player))) or warp.access_rule(state): + if warp.connected_region and warp.connected_region not in checked_regions: + checked_regions.add(warp.connected_region) + check_warps.update(warp.connected_region.exits) + for location in warp.connected_region.locations: + if (location.item and location.item.name in relevant_events and + adds_reachable_entrances(entrances_copy, location.item)): + return False + return True + + starting_entrances = len(entrances) + dc_connected = [] + event_locations = self.multiworld.get_filled_locations(player) + while entrances: + state.update_reachable_regions(player) + state.sweep_for_events(locations=event_locations) + reachable_entrances = [entrance for entrance in entrances if entrance in reachable_entrances or + entrance.parent_region.can_reach(state)] + assert reachable_entrances, \ + "Ran out of reachable entrances in Pokemon Red and Blue door shuffle" + multiworld.random.shuffle(entrances) + if multiworld.door_shuffle[player] == "decoupled" and len(entrances) == 1: + entrances += dc_connected + entrances[-1].connect(entrances[0]) + while len(entrances) > 1: + entrances.pop(0).connect(entrances[0]) + break + if multiworld.door_shuffle[player] == "full" or len(entrances) != len(reachable_entrances): + entrances.sort(key=lambda e: e.name not in entrance_only) + + if len(entrances) < 48 and multiworld.door_shuffle[player] == "full": + # Prevent a situation where the only remaining outdoor entrances are ones that cannot be reached + # except by connecting directly to it. + entrances.sort(key=lambda e: e.name in unreachable_outdoor_entrances) + # entrances list is empty while it's being sorted, must pass a copy to iterate through + entrances_copy = entrances.copy() + if multiworld.door_shuffle[player] == "decoupled": + if len(reachable_entrances) <= 8 and not logic.rock_tunnel(state, player): + entrances.sort(key=lambda e: 1 if "Rock Tunnel" in e.name else 2 if e.connected_region is not + None else 3 if e not in reachable_entrances else 0) + else: + entrances.sort(key=lambda e: 1 if e.connected_region is not None else 2 if e not in + reachable_entrances else 0) + assert entrances[0].connected_region is None,\ + "Ran out of valid reachable entrances in Pokemon Red and Blue door shuffle" + elif len(reachable_entrances) > (1 if multiworld.door_shuffle[player] == "insanity" else 8) and len( + entrances) <= (starting_entrances - 3): + entrances.sort(key=lambda e: 0 if e in reachable_entrances else 2 if + dead_end(entrances_copy, e) else 1) + else: + entrances.sort(key=lambda e: 0 if e in reachable_entrances else 1 if + dead_end(entrances_copy, e) else 2) + if multiworld.door_shuffle[player] == "full": + outdoor = outdoor_map(entrances[0].parent_region.name) + entrances.sort(key=lambda e: outdoor_map(e.parent_region.name) != outdoor) + assert entrances[0] in reachable_entrances, \ + "Ran out of valid reachable entrances in Pokemon Red and Blue door shuffle" + if (multiworld.door_shuffle[player] == "decoupled" and len(reachable_entrances) > 8 and len(entrances) + <= (starting_entrances - 3)): + entrance_b = entrances.pop(1) + else: + entrance_b = entrances.pop() + entrance_a = entrances.pop(0) + entrance_a.connect(entrance_b) + if multiworld.door_shuffle[player] == "decoupled": + entrances.append(entrance_b) + dc_connected.append(entrance_a) + else: + entrance_b.connect(entrance_a) + + if multiworld.door_shuffle[player] == "full": + for pair in loop_out_interiors: + pair[1].connected_region = pair[0].connected_region + pair[1].parent_region.entrances.append(pair[0]) + pair[1].target = pair[0].target + + if multiworld.door_shuffle[player]: + for region in multiworld.get_regions(player): + checked_regions = {region} + + def check_region(region_to_check): + if "Safari Zone" not in region_to_check.name and outdoor_map(region_to_check.name): + return True + for entrance in region_to_check.entrances: + if entrance.parent_region not in checked_regions: + checked_regions.add(entrance.parent_region) + x = check_region(entrance.parent_region) + if x is True: + return entrance.name.split(" to ")[1].split("-")[0] + elif x is not None: + return x + return None + + if region.name.split("-")[0] not in map_ids or ("Safari Zone" not in region.name and + outdoor_map(region.name)): + region.entrance_hint = None + else: + region.entrance_hint = check_region(region) -def connect(world: MultiWorld, player: int, source: str, target: str, rule: callable = lambda state: True, one_way=False, name=None): +def connect(world: MultiWorld, player: int, source: str, target: str, rule: callable = lambda state: True, + one_way=False, name=None): source_region = world.get_region(source, player) target_region = world.get_region(target, player) @@ -311,3 +2412,27 @@ def connect(world: MultiWorld, player: int, source: str, target: str, rule: call connection.connect(target_region) if not one_way: connect(world, player, target, source, rule, True) + + +class PokemonRBWarp(Entrance): + def __init__(self, player, name, parent, warp_id, address, flags): + super().__init__(player, name, parent) + self.warp_id = warp_id + self.address = address + self.flags = flags + + def connect(self, entrance): + super().connect(entrance.parent_region, None, target=entrance.warp_id) + + def access_rule(self, state): + if self.connected_region is None: + return False + if "Rock Tunnel" in self.parent_region.name or "Rock Tunnel" in self.connected_region.name: + return logic.rock_tunnel(state, self.player) + return True + + +class PokemonRBRegion(Region): + def __init__(self, name, player, multiworld): + super().__init__(name, player, multiworld) + self.distance = None diff --git a/worlds/pokemon_rb/rom.py b/worlds/pokemon_rb/rom.py index 8faaf31b..d498ea64 100644 --- a/worlds/pokemon_rb/rom.py +++ b/worlds/pokemon_rb/rom.py @@ -5,548 +5,12 @@ import bsdiff4 from copy import deepcopy from worlds.Files import APDeltaPatch from .text import encode_text -from .rom_addresses import rom_addresses -from .locations import location_data from .items import item_table +from .pokemon import set_mon_palettes from .rock_tunnel import randomize_rock_tunnel -import worlds.pokemon_rb.poke_data as poke_data - - -def choose_forced_type(chances, random): - n = random.randint(1, 100) - for chance in chances: - if chance[0] >= n: - return chance[1] - return None - - -def filter_moves(moves, type, random): - ret = [] - for move in moves: - if poke_data.moves[move]["type"] == type or type is None: - ret.append(move) - random.shuffle(ret) - return ret - - -def get_move(local_move_data, moves, chances, random, starting_move=False): - type = choose_forced_type(chances, random) - filtered_moves = filter_moves(moves, type, random) - for move in filtered_moves: - if local_move_data[move]["accuracy"] > 80 and local_move_data[move]["power"] > 0 or not starting_move: - moves.remove(move) - return move - else: - return get_move(local_move_data, moves, [], random, starting_move) - - -def get_encounter_slots(self): - encounter_slots = deepcopy([location for location in location_data if location.type == "Wild Encounter"]) - - for location in encounter_slots: - if isinstance(location.original_item, list): - location.original_item = location.original_item[not self.multiworld.game_version[self.player].value] - return encounter_slots - - -def get_base_stat_total(mon): - return (poke_data.pokemon_data[mon]["atk"] + poke_data.pokemon_data[mon]["def"] - + poke_data.pokemon_data[mon]["hp"] + poke_data.pokemon_data[mon]["spd"] - + poke_data.pokemon_data[mon]["spc"]) - - -def randomize_pokemon(self, mon, mons_list, randomize_type, random): - if randomize_type in [1, 3]: - type_mons = [pokemon for pokemon in mons_list if any([poke_data.pokemon_data[mon][ - "type1"] in [self.local_poke_data[pokemon]["type1"], self.local_poke_data[pokemon]["type2"]], - poke_data.pokemon_data[mon]["type2"] in [self.local_poke_data[pokemon]["type1"], - self.local_poke_data[pokemon]["type2"]]])] - if not type_mons: - type_mons = mons_list.copy() - if randomize_type == 3: - stat_base = get_base_stat_total(mon) - type_mons.sort(key=lambda mon: abs(get_base_stat_total(mon) - stat_base)) - mon = type_mons[round(random.triangular(0, len(type_mons) - 1, 0))] - if randomize_type == 2: - stat_base = get_base_stat_total(mon) - mons_list.sort(key=lambda mon: abs(get_base_stat_total(mon) - stat_base)) - mon = mons_list[round(random.triangular(0, 50, 0))] - elif randomize_type == 4: - mon = random.choice(mons_list) - return mon - - -def set_mon_palettes(self, random, data): - if self.multiworld.randomize_pokemon_palettes[self.player] == "vanilla": - return - pallet_map = { - "Poison": 0x0F, - "Normal": 0x10, - "Ice": 0x11, - "Fire": 0x12, - "Water": 0x13, - "Ghost": 0x14, - "Ground": 0x15, - "Grass": 0x16, - "Psychic": 0x17, - "Electric": 0x18, - "Rock": 0x19, - "Dragon": 0x1F, - "Flying": 0x20, - "Fighting": 0x21, - "Bug": 0x22 - } - palettes = [] - for mon in poke_data.pokemon_data: - if self.multiworld.randomize_pokemon_palettes[self.player] == "primary_type": - pallet = pallet_map[self.local_poke_data[mon]["type1"]] - elif (self.multiworld.randomize_pokemon_palettes[self.player] == "follow_evolutions" and mon in - poke_data.evolves_from and poke_data.evolves_from[mon] != "Eevee"): - pallet = palettes[-1] - else: # completely_random or follow_evolutions and it is not an evolved form (except eeveelutions) - pallet = random.choice(list(pallet_map.values())) - palettes.append(pallet) - address = rom_addresses["Mon_Palettes"] - for pallet in palettes: - data[address] = pallet - address += 1 - - -def process_trainer_data(self, data, random): - mons_list = [pokemon for pokemon in poke_data.pokemon_data.keys() if pokemon not in poke_data.legendary_pokemon - or self.multiworld.trainer_legendaries[self.player].value] - address = rom_addresses["Trainer_Data"] - while address < rom_addresses["Trainer_Data_End"]: - if data[address] == 255: - mode = 1 - else: - mode = 0 - while True: - address += 1 - if data[address] == 0: - address += 1 - break - address += mode - mon = None - for i in range(1, 4): - for l in ["A", "B", "C", "D", "E", "F", "G", "H"]: - if rom_addresses[f"Rival_Starter{i}_{l}"] == address: - mon = " ".join(self.multiworld.get_location(f"Pallet Town - Starter {i}", - self.player).item.name.split()[1:]) - if l in ["D", "E", "F", "G", "H"] and mon in poke_data.evolves_to: - mon = poke_data.evolves_to[mon] - if l in ["F", "G", "H"] and mon in poke_data.evolves_to: - mon = poke_data.evolves_to[mon] - if mon is None and self.multiworld.randomize_trainer_parties[self.player].value: - mon = poke_data.id_to_mon[data[address]] - mon = randomize_pokemon(self, mon, mons_list, - self.multiworld.randomize_trainer_parties[self.player].value, random) - if mon is not None: - data[address] = poke_data.pokemon_data[mon]["id"] - - -def process_static_pokemon(self): - starter_slots = deepcopy([location for location in location_data if location.type == "Starter Pokemon"]) - legendary_slots = deepcopy([location for location in location_data if location.type == "Legendary Pokemon"]) - static_slots = deepcopy([location for location in location_data if location.type in - ["Static Pokemon", "Missable Pokemon"]]) - legendary_mons = deepcopy([slot.original_item for slot in legendary_slots]) - - tower_6F_mons = set() - for i in range(1, 11): - tower_6F_mons.add(self.multiworld.get_location(f"Pokemon Tower 6F - Wild Pokemon - {i}", self.player).item.name) - - mons_list = [pokemon for pokemon in poke_data.first_stage_pokemon if pokemon not in poke_data.legendary_pokemon - or self.multiworld.randomize_legendary_pokemon[self.player].value == 3] - if self.multiworld.randomize_legendary_pokemon[self.player].value == 0: - for slot in legendary_slots: - location = self.multiworld.get_location(slot.name, self.player) - location.place_locked_item(self.create_item("Missable " + slot.original_item)) - elif self.multiworld.randomize_legendary_pokemon[self.player].value == 1: - self.multiworld.random.shuffle(legendary_mons) - for slot in legendary_slots: - location = self.multiworld.get_location(slot.name, self.player) - location.place_locked_item(self.create_item("Missable " + legendary_mons.pop())) - elif self.multiworld.randomize_legendary_pokemon[self.player].value == 2: - static_slots = static_slots + legendary_slots - self.multiworld.random.shuffle(static_slots) - static_slots.sort(key=lambda s: 0 if s.name == "Pokemon Tower 6F - Restless Soul" else 1) - while legendary_slots: - swap_slot = legendary_slots.pop() - slot = static_slots.pop() - slot_type = slot.type.split()[0] - if slot_type == "Legendary": - slot_type = "Missable" - location = self.multiworld.get_location(slot.name, self.player) - location.place_locked_item(self.create_item(slot_type + " " + swap_slot.original_item)) - swap_slot.original_item = slot.original_item - elif self.multiworld.randomize_legendary_pokemon[self.player].value == 3: - static_slots = static_slots + legendary_slots - - for slot in static_slots: - location = self.multiworld.get_location(slot.name, self.player) - randomize_type = self.multiworld.randomize_static_pokemon[self.player].value - slot_type = slot.type.split()[0] - if slot_type == "Legendary": - slot_type = "Missable" - if not randomize_type: - location.place_locked_item(self.create_item(slot_type + " " + slot.original_item)) - else: - mon = self.create_item(slot_type + " " + - randomize_pokemon(self, slot.original_item, mons_list, randomize_type, - self.multiworld.random)) - while location.name == "Pokemon Tower 6F - Restless Soul" and mon in tower_6F_mons: - mon = self.create_item(slot_type + " " + randomize_pokemon(self, slot.original_item, mons_list, - randomize_type, self.multiworld.random)) - location.place_locked_item(mon) - - chosen_mons = set() - for slot in starter_slots: - location = self.multiworld.get_location(slot.name, self.player) - randomize_type = self.multiworld.randomize_starter_pokemon[self.player].value - slot_type = "Missable" - if not randomize_type: - location.place_locked_item(self.create_item(slot_type + " " + slot.original_item)) - else: - mon = self.create_item(slot_type + " " + randomize_pokemon(self, slot.original_item, mons_list, - randomize_type, self.multiworld.random)) - while mon.name in chosen_mons: - mon = self.create_item(slot_type + " " + randomize_pokemon(self, slot.original_item, mons_list, - randomize_type, self.multiworld.random)) - chosen_mons.add(mon.name) - location.place_locked_item(mon) - - -def process_wild_pokemon(self): - - encounter_slots = get_encounter_slots(self) - - placed_mons = {pokemon: 0 for pokemon in poke_data.pokemon_data.keys()} - zone_mapping = {} - if self.multiworld.randomize_wild_pokemon[self.player].value: - mons_list = [pokemon for pokemon in poke_data.pokemon_data.keys() if pokemon not in poke_data.legendary_pokemon - or self.multiworld.randomize_legendary_pokemon[self.player].value == 3] - self.multiworld.random.shuffle(encounter_slots) - locations = [] - for slot in encounter_slots: - location = self.multiworld.get_location(slot.name, self.player) - zone = " - ".join(location.name.split(" - ")[:-1]) - if zone not in zone_mapping: - zone_mapping[zone] = {} - original_mon = slot.original_item - if self.multiworld.area_1_to_1_mapping[self.player] and original_mon in zone_mapping[zone]: - mon = zone_mapping[zone][original_mon] - else: - mon = randomize_pokemon(self, original_mon, mons_list, - self.multiworld.randomize_wild_pokemon[self.player].value, self.multiworld.random) - # if static Pokemon are not randomized, we make sure nothing on Pokemon Tower 6F is a Marowak - # if static Pokemon are randomized we deal with that during static encounter randomization - while (self.multiworld.randomize_static_pokemon[self.player].value == 0 and mon == "Marowak" - and "Pokemon Tower 6F" in slot.name): - # to account for the possibility that only one ground type Pokemon exists, match only stats for this fix - mon = randomize_pokemon(self, original_mon, mons_list, 2, self.multiworld.random) - placed_mons[mon] += 1 - location.item = self.create_item(mon) - location.event = True - location.locked = True - location.item.location = location - locations.append(location) - zone_mapping[zone][original_mon] = mon - - mons_to_add = [] - remaining_pokemon = [pokemon for pokemon in poke_data.pokemon_data.keys() if placed_mons[pokemon] == 0 and - (pokemon not in poke_data.legendary_pokemon or self.multiworld.randomize_legendary_pokemon[self.player].value == 3)] - if self.multiworld.catch_em_all[self.player].value == 1: - mons_to_add = [pokemon for pokemon in poke_data.first_stage_pokemon if placed_mons[pokemon] == 0 and - (pokemon not in poke_data.legendary_pokemon or self.multiworld.randomize_legendary_pokemon[self.player].value == 3)] - elif self.multiworld.catch_em_all[self.player].value == 2: - mons_to_add = remaining_pokemon.copy() - logic_needed_mons = max(self.multiworld.oaks_aide_rt_2[self.player].value, - self.multiworld.oaks_aide_rt_11[self.player].value, - self.multiworld.oaks_aide_rt_15[self.player].value) - if self.multiworld.accessibility[self.player] == "minimal": - logic_needed_mons = 0 - - self.multiworld.random.shuffle(remaining_pokemon) - while (len([pokemon for pokemon in placed_mons if placed_mons[pokemon] > 0]) - + len(mons_to_add) < logic_needed_mons): - mons_to_add.append(remaining_pokemon.pop()) - for mon in mons_to_add: - stat_base = get_base_stat_total(mon) - candidate_locations = get_encounter_slots(self) - if self.multiworld.randomize_wild_pokemon[self.player].current_key in ["match_base_stats", "match_types_and_base_stats"]: - candidate_locations.sort(key=lambda slot: abs(get_base_stat_total(slot.original_item) - stat_base)) - if self.multiworld.randomize_wild_pokemon[self.player].current_key in ["match_types", "match_types_and_base_stats"]: - candidate_locations.sort(key=lambda slot: not any([poke_data.pokemon_data[slot.original_item]["type1"] in - [self.local_poke_data[mon]["type1"], self.local_poke_data[mon]["type2"]], - poke_data.pokemon_data[slot.original_item]["type2"] in - [self.local_poke_data[mon]["type1"], self.local_poke_data[mon]["type2"]]])) - candidate_locations = [self.multiworld.get_location(location.name, self.player) for location in candidate_locations] - for location in candidate_locations: - zone = " - ".join(location.name.split(" - ")[:-1]) - if self.multiworld.catch_em_all[self.player] == "all_pokemon" and self.multiworld.area_1_to_1_mapping[self.player]: - if not [self.multiworld.get_location(l.name, self.player) for l in get_encounter_slots(self) - if (not l.name.startswith(zone)) and - self.multiworld.get_location(l.name, self.player).item.name == location.item.name]: - continue - if self.multiworld.catch_em_all[self.player] == "first_stage" and self.multiworld.area_1_to_1_mapping[self.player]: - if not [self.multiworld.get_location(l.name, self.player) for l in get_encounter_slots(self) - if (not l.name.startswith(zone)) and - self.multiworld.get_location(l.name, self.player).item.name == location.item.name and l.name - not in poke_data.evolves_from]: - continue - - if placed_mons[location.item.name] < 2 and (location.item.name in poke_data.first_stage_pokemon - or self.multiworld.catch_em_all[self.player]): - continue - - if self.multiworld.area_1_to_1_mapping[self.player]: - place_locations = [place_location for place_location in candidate_locations if - place_location.name.startswith(zone) and - place_location.item.name == location.item.name] - else: - place_locations = [location] - for place_location in place_locations: - placed_mons[place_location.item.name] -= 1 - place_location.item = self.create_item(mon) - place_location.item.location = place_location - placed_mons[mon] += 1 - break - else: - raise Exception - - else: - for slot in encounter_slots: - location = self.multiworld.get_location(slot.name, self.player) - location.item = self.create_item(slot.original_item) - location.event = True - location.locked = True - location.item.location = location - placed_mons[location.item.name] += 1 - - -def process_move_data(self): - self.local_move_data = deepcopy(poke_data.moves) - if self.multiworld.move_balancing[self.player]: - self.local_move_data["Sing"]["accuracy"] = 30 - self.local_move_data["Sleep Powder"]["accuracy"] = 40 - self.local_move_data["Spore"]["accuracy"] = 50 - self.local_move_data["Sonicboom"]["effect"] = 0 - self.local_move_data["Sonicboom"]["power"] = 50 - self.local_move_data["Dragon Rage"]["effect"] = 0 - self.local_move_data["Dragon Rage"]["power"] = 80 - self.local_move_data["Horn Drill"]["effect"] = 0 - self.local_move_data["Horn Drill"]["power"] = 70 - self.local_move_data["Horn Drill"]["accuracy"] = 90 - self.local_move_data["Guillotine"]["effect"] = 0 - self.local_move_data["Guillotine"]["power"] = 70 - self.local_move_data["Guillotine"]["accuracy"] = 90 - self.local_move_data["Fissure"]["effect"] = 0 - self.local_move_data["Fissure"]["power"] = 70 - self.local_move_data["Fissure"]["accuracy"] = 90 - self.local_move_data["Blizzard"]["accuracy"] = 70 - if self.multiworld.randomize_tm_moves[self.player]: - self.local_tms = self.multiworld.random.sample([move for move in poke_data.moves.keys() if move not in - ["No Move"] + poke_data.hm_moves], 50) - else: - self.local_tms = poke_data.tm_moves.copy() - - -def process_pokemon_data(self): - - local_poke_data = deepcopy(poke_data.pokemon_data) - learnsets = deepcopy(poke_data.learnsets) - tms_hms = self.local_tms + poke_data.hm_moves - - - compat_hms = set() - - for mon, mon_data in local_poke_data.items(): - if self.multiworld.randomize_pokemon_stats[self.player].value == 1: - stats = [mon_data["hp"], mon_data["atk"], mon_data["def"], mon_data["spd"], mon_data["spc"]] - self.multiworld.random.shuffle(stats) - mon_data["hp"] = stats[0] - mon_data["atk"] = stats[1] - mon_data["def"] = stats[2] - mon_data["spd"] = stats[3] - mon_data["spc"] = stats[4] - elif self.multiworld.randomize_pokemon_stats[self.player].value == 2: - first_run = True - while (mon_data["hp"] > 255 or mon_data["atk"] > 255 or mon_data["def"] > 255 or mon_data["spd"] > 255 - or mon_data["spc"] > 255 or first_run): - first_run = False - total_stats = mon_data["hp"] + mon_data["atk"] + mon_data["def"] + mon_data["spd"] + mon_data["spc"] - 60 - dist = [self.multiworld.random.randint(1, 101) / 100, self.multiworld.random.randint(1, 101) / 100, - self.multiworld.random.randint(1, 101) / 100, self.multiworld.random.randint(1, 101) / 100, - self.multiworld.random.randint(1, 101) / 100] - total_dist = sum(dist) - - mon_data["hp"] = int(round(dist[0] / total_dist * total_stats) + 20) - mon_data["atk"] = int(round(dist[1] / total_dist * total_stats) + 10) - mon_data["def"] = int(round(dist[2] / total_dist * total_stats) + 10) - mon_data["spd"] = int(round(dist[3] / total_dist * total_stats) + 10) - mon_data["spc"] = int(round(dist[4] / total_dist * total_stats) + 10) - if self.multiworld.randomize_pokemon_types[self.player].value: - if self.multiworld.randomize_pokemon_types[self.player].value == 1 and mon in poke_data.evolves_from: - type1 = local_poke_data[poke_data.evolves_from[mon]]["type1"] - type2 = local_poke_data[poke_data.evolves_from[mon]]["type2"] - if type1 == type2: - if self.multiworld.secondary_type_chance[self.player].value == -1: - if mon_data["type1"] != mon_data["type2"]: - while type2 == type1: - type2 = self.multiworld.random.choice(list(poke_data.type_names.values())) - elif self.multiworld.random.randint(1, 100) <= self.multiworld.secondary_type_chance[self.player].value: - type2 = self.multiworld.random.choice(list(poke_data.type_names.values())) - else: - type1 = self.multiworld.random.choice(list(poke_data.type_names.values())) - type2 = type1 - if ((self.multiworld.secondary_type_chance[self.player].value == -1 and mon_data["type1"] - != mon_data["type2"]) or self.multiworld.random.randint(1, 100) - <= self.multiworld.secondary_type_chance[self.player].value): - while type2 == type1: - type2 = self.multiworld.random.choice(list(poke_data.type_names.values())) - - mon_data["type1"] = type1 - mon_data["type2"] = type2 - if self.multiworld.randomize_pokemon_movesets[self.player].value: - if self.multiworld.randomize_pokemon_movesets[self.player].value == 1: - if mon_data["type1"] == "Normal" and mon_data["type2"] == "Normal": - chances = [[75, "Normal"]] - elif mon_data["type1"] == "Normal" or mon_data["type2"] == "Normal": - if mon_data["type1"] == "Normal": - second_type = mon_data["type2"] - else: - second_type = mon_data["type1"] - chances = [[30, "Normal"], [85, second_type]] - elif mon_data["type1"] == mon_data["type2"]: - chances = [[60, mon_data["type1"]], [80, "Normal"]] - else: - chances = [[50, mon_data["type1"]], [80, mon_data["type2"]], [85, "Normal"]] - else: - chances = [] - moves = list(poke_data.moves.keys()) - for move in ["No Move"] + poke_data.hm_moves: - moves.remove(move) - if self.multiworld.confine_transform_to_ditto[self.player]: - moves.remove("Transform") - if self.multiworld.start_with_four_moves[self.player]: - num_moves = 4 - else: - num_moves = len([i for i in [mon_data["start move 1"], mon_data["start move 2"], - mon_data["start move 3"], mon_data["start move 4"]] if i != "No Move"]) - if mon in learnsets: - num_moves += len(learnsets[mon]) - non_power_moves = [] - learnsets[mon] = [] - for i in range(num_moves): - if i == 0 and mon == "Ditto" and self.multiworld.confine_transform_to_ditto[self.player]: - move = "Transform" - else: - move = get_move(self.local_move_data, moves, chances, self.multiworld.random) - while move == "Transform" and self.multiworld.confine_transform_to_ditto[self.player]: - move = get_move(self.local_move_data, moves, chances, self.multiworld.random) - if self.local_move_data[move]["power"] < 5: - non_power_moves.append(move) - else: - learnsets[mon].append(move) - learnsets[mon].sort(key=lambda move: self.local_move_data[move]["power"]) - if learnsets[mon]: - for move in non_power_moves: - learnsets[mon].insert(self.multiworld.random.randint(1, len(learnsets[mon])), move) - else: - learnsets[mon] = non_power_moves - for i in range(1, 5): - if mon_data[f"start move {i}"] != "No Move" or self.multiworld.start_with_four_moves[self.player]: - mon_data[f"start move {i}"] = learnsets[mon].pop(0) - - if self.multiworld.randomize_pokemon_catch_rates[self.player].value: - mon_data["catch rate"] = self.multiworld.random.randint(self.multiworld.minimum_catch_rate[self.player], 255) - else: - mon_data["catch rate"] = max(self.multiworld.minimum_catch_rate[self.player], mon_data["catch rate"]) - - def roll_tm_compat(roll_move): - if self.local_move_data[roll_move]["type"] in [mon_data["type1"], mon_data["type2"]]: - if roll_move in poke_data.hm_moves: - if self.multiworld.hm_same_type_compatibility[self.player].value == -1: - return mon_data["tms"][int(flag / 8)] - r = self.multiworld.random.randint(1, 100) <= self.multiworld.hm_same_type_compatibility[self.player].value - if r and mon not in poke_data.legendary_pokemon: - compat_hms.add(roll_move) - return r - else: - if self.multiworld.tm_same_type_compatibility[self.player].value == -1: - return mon_data["tms"][int(flag / 8)] - return self.multiworld.random.randint(1, 100) <= self.multiworld.tm_same_type_compatibility[self.player].value - elif self.local_move_data[roll_move]["type"] == "Normal" and "Normal" not in [mon_data["type1"], mon_data["type2"]]: - if roll_move in poke_data.hm_moves: - if self.multiworld.hm_normal_type_compatibility[self.player].value == -1: - return mon_data["tms"][int(flag / 8)] - r = self.multiworld.random.randint(1, 100) <= self.multiworld.hm_normal_type_compatibility[self.player].value - if r and mon not in poke_data.legendary_pokemon: - compat_hms.add(roll_move) - return r - else: - if self.multiworld.tm_normal_type_compatibility[self.player].value == -1: - return mon_data["tms"][int(flag / 8)] - return self.multiworld.random.randint(1, 100) <= self.multiworld.tm_normal_type_compatibility[self.player].value - else: - if roll_move in poke_data.hm_moves: - if self.multiworld.hm_other_type_compatibility[self.player].value == -1: - return mon_data["tms"][int(flag / 8)] - r = self.multiworld.random.randint(1, 100) <= self.multiworld.hm_other_type_compatibility[self.player].value - if r and mon not in poke_data.legendary_pokemon: - compat_hms.add(roll_move) - return r - else: - if self.multiworld.tm_other_type_compatibility[self.player].value == -1: - return mon_data["tms"][int(flag / 8)] - return self.multiworld.random.randint(1, 100) <= self.multiworld.tm_other_type_compatibility[self.player].value - - - for flag, tm_move in enumerate(tms_hms): - if mon in poke_data.evolves_from.keys() and self.multiworld.inherit_tm_hm_compatibility[self.player]: - - if local_poke_data[poke_data.evolves_from[mon]]["tms"][int(flag / 8)] & 1 << (flag % 8): - # always inherit learnable tms/hms - bit = 1 - else: - if self.local_move_data[tm_move]["type"] in [mon_data["type1"], mon_data["type2"]] and \ - self.local_move_data[tm_move]["type"] not in [ - local_poke_data[poke_data.evolves_from[mon]]["type1"], - local_poke_data[poke_data.evolves_from[mon]]["type2"]]: - # the tm/hm is for a move whose type matches current mon, but not pre-evolved form - # so this gets full chance roll - bit = roll_tm_compat(tm_move) - # otherwise 50% reduced chance to add compatibility over pre-evolved form - elif self.multiworld.random.randint(1, 100) > 50 and roll_tm_compat(tm_move): - bit = 1 - else: - bit = 0 - else: - bit = roll_tm_compat(tm_move) - if bit: - mon_data["tms"][int(flag / 8)] |= 1 << (flag % 8) - else: - mon_data["tms"][int(flag / 8)] &= ~(1 << (flag % 8)) - - hm_verify = ["Surf", "Strength"] - if self.multiworld.accessibility[self.player] != "minimal" or ((not - self.multiworld.badgesanity[self.player]) and max(self.multiworld.elite_four_condition[self.player], - self.multiworld.victory_road_condition[self.player]) > 7): - hm_verify += ["Cut"] - if self.multiworld.accessibility[self.player] != "minimal" and (self.multiworld.trainersanity[self.player] or - self.multiworld.extra_key_items[self.player]): - hm_verify += ["Flash"] - - for hm_move in hm_verify: - if hm_move not in compat_hms: - mon = self.multiworld.random.choice([mon for mon in poke_data.pokemon_data if mon not in - poke_data.legendary_pokemon]) - flag = tms_hms.index(hm_move) - local_poke_data[mon]["tms"][int(flag / 8)] |= 1 << (flag % 8) - - self.local_poke_data = local_poke_data - self.learnsets = learnsets +from .rom_addresses import rom_addresses +from .regions import PokemonRBWarp, map_ids +from . import poke_data def write_quizzes(self, data, random): @@ -599,7 +63,7 @@ def write_quizzes(self, data, random): return encode_text(f"#mon ispronouncedPo-kuh-mon?") elif q == 3: starters = [" ".join(self.multiworld.get_location( - f"Pallet Town - Starter {i}", self.player).item.name.split(" ")[1:]) for i in range(1, 4)] + f"Oak's Lab - Starter {i}", self.player).item.name.split(" ")[1:]) for i in range(1, 4)] mon = random.choice(starters) nots = random.choice(range(8, 16, 2)) if random.randint(0, 1): @@ -630,12 +94,12 @@ def write_quizzes(self, data, random): elif q == 5: i = 8 while not a and i in [1, 8]: - i = random.randint(0, 99999999) + i = random.randint(0, int("99999999"[random.randint(0, 7):])) return encode_text(f"There are {i}certified #MONLEAGUE BADGEs?") elif q == 6: i = 2 while not a and i in [1, 2]: - i = random.randint(0, 99) + i = random.randint(0, random.choice([9, 99])) return encode_text(f"POLIWAG evolves {i}times?") elif q == 7: entity = "Motor Carrier" @@ -644,11 +108,82 @@ def write_quizzes(self, data, random): return encode_text("Title 49 of theU.S. Code ofFederalRegulations part397.67 states" f"that the{entity}is responsiblefor planningroutes when" "hazardousmaterials aretransported?") + elif q == 8: + mon = random.choice(list(poke_data.evolution_levels.keys())) + level = poke_data.evolution_levels[mon] + if not a: + level += random.choice(range(1, 6)) * random.choice((-1, 1)) + return encode_text(f"{mon} evolvesat level {level}?") + elif q == 9: + move = random.choice(list(self.local_move_data.keys())) + actual_type = self.local_move_data[move]["type"] + question_type = actual_type + while question_type == actual_type and not a: + question_type = random.choice(list(poke_data.type_ids.keys())) + return encode_text(f"{move} is{question_type} type?") + elif q == 10: + mon = random.choice(list(poke_data.pokemon_data.keys())) + actual_type = self.local_poke_data[mon][random.choice(("type1", "type2"))] + question_type = actual_type + while question_type in [self.local_poke_data[mon]["type1"], self.local_poke_data[mon]["type2"]] and not a: + question_type = random.choice(list(poke_data.type_ids.keys())) + return encode_text(f"{mon} is{question_type} type?") + elif q == 11: + equation = "" + while "*" not in equation: + equation = f"{random.randint(0, 9)} {random.choice(['+', '-', '*'])} {random.randint(0, 9)} {random.choice(['+', '-', '*'])} {random.randint(0, 9)} {random.choice(['+', '-', '*'])} {random.randint(0, 9)}" + result = eval(equation) + question_result = result + if not a: + modifiers = random.sample(range(3), 3) + for modifier in modifiers: + question_result = eval(equation[:modifier * 4] + "(" + equation[modifier * 4:(modifier * 4) + 5] + + ")" + equation[5 + (modifier * 4):]) + if question_result != result: + break + else: + question_result += random.choice(range(1, 6)) * random.choice((-1, 1)) - answers = [random.randint(0, 1), random.randint(0, 1), random.randint(0, 1), - random.randint(0, 1), random.randint(0, 1), random.randint(0, 1)] + return encode_text(f"{equation}= {question_result}?") + elif q == 12: + route = random.choice((12, 16)) + actual_mon = self.multiworld.get_location(f"Route {route} - Sleeping Pokemon", + self.player).item.name.split("Static ")[1] + question_mon = actual_mon + while question_mon == actual_mon and not a: + question_mon = random.choice(list(poke_data.pokemon_data.keys())) + return encode_text(f"{question_mon} wassleeping on route{route}?") + elif q == 13: + type1 = random.choice(list(poke_data.type_ids.keys())) + type2 = random.choice(list(poke_data.type_ids.keys())) + eff_msgs = ["super effective", "no ", "not veryeffective", "normal "] + for matchup in self.type_chart: + if matchup[0] == type1 and matchup[1] == type2: + if matchup[2] > 10: + eff = eff_msgs[0] + elif matchup[2] == 0: + eff = eff_msgs[1] + elif matchup[2] < 10: + eff = eff_msgs[2] + else: + eff = eff_msgs[3] + break + else: + eff = eff_msgs[3] + if not a: + eff_msgs.remove(eff) + eff = random.choice(eff_msgs) + return encode_text(f"{type1} deals{eff}damage to{type2} type?") + elif q == 14: + fossil_level = self.multiworld.get_location("Fossil Level - Trainer Parties", + self.player).party_data[0]['level'] + if not a: + fossil_level += random.choice((-5, 5)) + return encode_text(f"Fossil #MONrevive at level{fossil_level}?") - questions = random.sample((range(0, 8)), 6) + answers = [random.randint(0, 1) for _ in range(6)] + + questions = random.sample((range(0, 15)), 6) question_texts = [] for i, question in enumerate(questions): question_texts.append(get_quiz(question, answers[i])) @@ -670,27 +205,52 @@ def generate_output(self, output_directory: str): basemd5 = hashlib.md5() basemd5.update(data) - for location in self.multiworld.get_locations(): - if location.player != self.player or location.rom_address is None: - continue - if location.item and location.item.player == self.player: - if location.rom_address: - rom_address = location.rom_address - if not isinstance(rom_address, list): - rom_address = [rom_address] - for address in rom_address: - if location.item.name in poke_data.pokemon_data.keys(): - data[address] = poke_data.pokemon_data[location.item.name]["id"] - elif " ".join(location.item.name.split()[1:]) in poke_data.pokemon_data.keys(): - data[address] = poke_data.pokemon_data[" ".join(location.item.name.split()[1:])]["id"] - else: - item_id = self.item_name_to_id[location.item.name] - 172000000 - if item_id > 255: - item_id -= 256 - data[address] = item_id + lab_loc = self.multiworld.get_entrance("Oak's Lab to Pallet Town", self.player).target + paths = None + if lab_loc == 0: # Player's House + paths = ((0x00, 4, 0x80, 5, 0x40, 1, 0xE0, 1, 0xFF), (0x40, 2, 0x20, 5, 0x80, 5, 0xFF)) + elif lab_loc == 1: # Rival's House + paths = ((0x00, 4, 0xC0, 3, 0x40, 1, 0xE0, 1, 0xFF), (0x40, 2, 0x10, 3, 0x80, 5, 0xFF)) + if paths: + write_bytes(data, paths[0], rom_addresses["Path_Pallet_Oak"]) + write_bytes(data, paths[1], rom_addresses["Path_Pallet_Player"]) + home_loc = self.multiworld.get_entrance("Player's House 1F to Pallet Town", self.player).target + if home_loc == 1: # Rival's House + write_bytes(data, [0x2F, 0xC7, 0x06, 0x0D, 0x00, 0x01], rom_addresses["Pallet_Fly_Coords"]) + elif home_loc == 2: # Oak's Lab + write_bytes(data, [0x5F, 0xC7, 0x0C, 0x0C, 0x00, 0x00], rom_addresses["Pallet_Fly_Coords"]) - else: - data[location.rom_address] = 0x2C # AP Item + for region in self.multiworld.get_regions(self.player): + for entrance in region.exits: + if isinstance(entrance, PokemonRBWarp): + self.multiworld.spoiler.set_entrance(entrance.name, entrance.connected_region.name, "entrance", + self.player) + warp_ids = (entrance.warp_id,) if isinstance(entrance.warp_id, int) else entrance.warp_id + warp_to_ids = (entrance.target,) if isinstance(entrance.target, int) else entrance.target + for i, warp_id in enumerate(warp_ids): + address = rom_addresses[entrance.address] + if "Elevator" in entrance.parent_region.name: + address += (2 * warp_id) + else: + address += (4 * warp_id) + while i > len(warp_to_ids) - 1: + i -= len(warp_to_ids) + connected_map_name = entrance.connected_region.name.split("-")[0] + data[address] = 0 if "Elevator" in connected_map_name else warp_to_ids[i] + data[address + 1] = map_ids[connected_map_name] + + for i, gym_leader in enumerate(("Pewter Gym - Brock TM", "Cerulean Gym - Misty TM", + "Vermilion Gym - Lt. Surge TM", "Celadon Gym - Erika TM", + "Fuchsia Gym - Koga TM", "Saffron Gym - Sabrina TM", + "Cinnabar Gym - Blaine TM", "Viridian Gym - Giovanni TM")): + item_name = self.multiworld.get_location(gym_leader, self.player).item.name + if item_name.startswith("TM"): + try: + tm = int(item_name[2:4]) + move = poke_data.moves[self.local_tms[tm - 1]]["id"] + data[rom_addresses["Gym_Leader_Moves"] + (2 * i)] = move + except KeyError: + pass def set_trade_mon(address, loc): mon = self.multiworld.get_location(loc, self.player).item.name @@ -706,48 +266,106 @@ def generate_output(self, output_directory: str): set_trade_mon("Trade_Marcel", "Route 24 - Wild Pokemon - 6") set_trade_mon("Trade_Sailor", "Pokemon Mansion 1F - Wild Pokemon - 3") set_trade_mon("Trade_Dux", "Route 3 - Wild Pokemon - 2") - set_trade_mon("Trade_Marc", "Route 23 - Super Rod Pokemon - 1") - set_trade_mon("Trade_Lola", "Route 10 - Super Rod Pokemon - 1") + set_trade_mon("Trade_Marc", "Route 23/Cerulean Cave Fishing - Super Rod Pokemon - 1") + set_trade_mon("Trade_Lola", "Route 10/Celadon Fishing - Super Rod Pokemon - 1") set_trade_mon("Trade_Doris", "Cerulean Cave 1F - Wild Pokemon - 9") set_trade_mon("Trade_Crinkles", "Route 12 - Wild Pokemon - 4") data[rom_addresses['Fly_Location']] = self.fly_map_code + data[rom_addresses['Map_Fly_Location']] = self.town_map_fly_map_code + + if self.multiworld.fix_combat_bugs[self.player]: + data[rom_addresses["Option_Fix_Combat_Bugs"]] = 1 + data[rom_addresses["Option_Fix_Combat_Bugs_Focus_Energy"]] = 0x28 # jr z + data[rom_addresses["Option_Fix_Combat_Bugs_HP_Drain_Dream_Eater"]] = 0x1A # ld a, (de) + data[rom_addresses["Option_Fix_Combat_Bugs_PP_Restore"]] = 0xe6 # and a, direct + data[rom_addresses["Option_Fix_Combat_Bugs_PP_Restore"] + 1] = 0b0011111 + data[rom_addresses["Option_Fix_Combat_Bugs_Struggle"]] = 0xe6 # and a, direct + data[rom_addresses["Option_Fix_Combat_Bugs_Struggle"] + 1] = 0x3f + data[rom_addresses["Option_Fix_Combat_Bugs_Dig_Fly"]] = 0b10001100 + data[rom_addresses["Option_Fix_Combat_Bugs_Heal_Effect"]] = 0x20 # jr nz, + data[rom_addresses["Option_Fix_Combat_Bugs_Heal_Effect"] + 1] = 5 # 5 bytes ahead + data[rom_addresses["Option_Fix_Combat_Bugs_Heal_Stat_Modifiers"]] = 1 + + if self.multiworld.poke_doll_skip[self.player] == "in_logic": + data[rom_addresses["Option_Silph_Scope_Skip"]] = 0x00 # nop + data[rom_addresses["Option_Silph_Scope_Skip"] + 1] = 0x00 # nop + data[rom_addresses["Option_Silph_Scope_Skip"] + 2] = 0x00 # nop + + if self.multiworld.bicycle_gate_skips[self.player] == "patched": + data[rom_addresses["Option_Route_16_Gate_Fix"]] = 0x00 # nop + data[rom_addresses["Option_Route_16_Gate_Fix"] + 1] = 0x00 # nop + data[rom_addresses["Option_Route_18_Gate_Fix"]] = 0x00 # nop + data[rom_addresses["Option_Route_18_Gate_Fix"] + 1] = 0x00 # nop + + if self.multiworld.door_shuffle[self.player]: + data[rom_addresses["Entrance_Shuffle_Fuji_Warp"]] = 1 # prevent warping to Fuji's House from Pokemon Tower 7F + + if self.multiworld.all_elevators_locked[self.player]: + data[rom_addresses["Option_Locked_Elevator_Celadon"]] = 0x20 # jr nz + data[rom_addresses["Option_Locked_Elevator_Silph"]] = 0x20 # jr nz if self.multiworld.tea[self.player].value: data[rom_addresses["Option_Tea"]] = 1 data[rom_addresses["Guard_Drink_List"]] = 0x54 data[rom_addresses["Guard_Drink_List"] + 1] = 0 data[rom_addresses["Guard_Drink_List"] + 2] = 0 + write_bytes(data, encode_text("Gee, I have theworst caffeineheadache though." + "Oh wait there,the road's closed."), + rom_addresses["Text_Saffron_Gate"]) data[rom_addresses["Fossils_Needed_For_Second_Item"]] = ( self.multiworld.second_fossil_check_condition[self.player].value) data[rom_addresses["Option_Lose_Money"]] = int(not self.multiworld.lose_money_on_blackout[self.player].value) - if self.multiworld.extra_key_items[self.player].value: - data[rom_addresses['Options']] |= 4 + if self.multiworld.extra_key_items[self.player]: + data[rom_addresses['Option_Extra_Key_Items_A']] = 1 + data[rom_addresses['Option_Extra_Key_Items_B']] = 1 + data[rom_addresses['Option_Extra_Key_Items_C']] = 1 + data[rom_addresses['Option_Extra_Key_Items_D']] = 1 + data[rom_addresses["Option_Split_Card_Key"]] = self.multiworld.split_card_key[self.player].value data[rom_addresses["Option_Blind_Trainers"]] = round(self.multiworld.blind_trainers[self.player].value * 2.55) - data[rom_addresses['Option_Cerulean_Cave_Condition']] = self.multiworld.cerulean_cave_condition[self.player].value + data[rom_addresses["Option_Cerulean_Cave_Badges"]] = self.multiworld.cerulean_cave_badges_condition[self.player].value + data[rom_addresses["Option_Cerulean_Cave_Key_Items"]] = self.multiworld.cerulean_cave_key_items_condition[self.player].total + write_bytes(data, encode_text(str(self.multiworld.cerulean_cave_badges_condition[self.player].value)), rom_addresses["Text_Cerulean_Cave_Badges"]) + write_bytes(data, encode_text(str(self.multiworld.cerulean_cave_key_items_condition[self.player].total) + " key items."), rom_addresses["Text_Cerulean_Cave_Key_Items"]) data[rom_addresses['Option_Encounter_Minimum_Steps']] = self.multiworld.minimum_steps_between_encounters[self.player].value - data[rom_addresses['Option_Victory_Road_Badges']] = self.multiworld.victory_road_condition[self.player].value - data[rom_addresses['Option_Pokemon_League_Badges']] = self.multiworld.elite_four_condition[self.player].value + data[rom_addresses['Option_Route23_Badges']] = self.multiworld.victory_road_condition[self.player].value + data[rom_addresses['Option_Victory_Road_Badges']] = self.multiworld.route_22_gate_condition[self.player].value + data[rom_addresses['Option_Elite_Four_Pokedex']] = self.multiworld.elite_four_pokedex_condition[self.player].total + data[rom_addresses['Option_Elite_Four_Key_Items']] = self.multiworld.elite_four_key_items_condition[self.player].total + data[rom_addresses['Option_Elite_Four_Badges']] = self.multiworld.elite_four_badges_condition[self.player].value + write_bytes(data, encode_text(str(self.multiworld.elite_four_badges_condition[self.player].value)), rom_addresses["Text_Elite_Four_Badges"]) + write_bytes(data, encode_text(str(self.multiworld.elite_four_key_items_condition[self.player].total) + " key items, and"), rom_addresses["Text_Elite_Four_Key_Items"]) + write_bytes(data, encode_text(str(self.multiworld.elite_four_pokedex_condition[self.player].total) + " #MON"), rom_addresses["Text_Elite_Four_Pokedex"]) + write_bytes(data, encode_text(str(self.total_key_items), length=2), rom_addresses["Trainer_Screen_Total_Key_Items"]) + data[rom_addresses['Option_Viridian_Gym_Badges']] = self.multiworld.viridian_gym_condition[self.player].value data[rom_addresses['Option_EXP_Modifier']] = self.multiworld.exp_modifier[self.player].value - if not self.multiworld.require_item_finder[self.player].value: - data[rom_addresses['Option_Itemfinder']] = 0 - if self.multiworld.extra_strength_boulders[self.player].value: + if not self.multiworld.require_item_finder[self.player]: + data[rom_addresses['Option_Itemfinder']] = 0 # nop + if self.multiworld.extra_strength_boulders[self.player]: for i in range(0, 3): data[rom_addresses['Option_Boulders'] + (i * 3)] = 0x15 - if self.multiworld.extra_key_items[self.player].value: + if self.multiworld.extra_key_items[self.player]: for i in range(0, 4): data[rom_addresses['Option_Rock_Tunnel_Extra_Items'] + (i * 3)] = 0x15 - if self.multiworld.old_man[self.player].value == 2: + if self.multiworld.old_man[self.player] == "open_viridian_city": data[rom_addresses['Option_Old_Man']] = 0x11 data[rom_addresses['Option_Old_Man_Lying']] = 0x15 + data[rom_addresses['Option_Route3_Guard_A']] = self.multiworld.route_3_condition[self.player].value + if self.multiworld.route_3_condition[self.player] == "open": + data[rom_addresses['Option_Route3_Guard_B']] = 0x11 + if not self.multiworld.robbed_house_officer[self.player]: + data[rom_addresses['Option_Trashed_House_Guard_A']] = 0x15 + data[rom_addresses['Option_Trashed_House_Guard_B']] = 0x11 if self.multiworld.require_pokedex[self.player]: data[rom_addresses["Require_Pokedex_A"]] = 1 data[rom_addresses["Require_Pokedex_B"]] = 1 data[rom_addresses["Require_Pokedex_C"]] = 1 + else: + data[rom_addresses["Require_Pokedex_D"]] = 0x18 # jr if self.multiworld.dexsanity[self.player]: data[rom_addresses["Option_Dexsanity_A"]] = 1 data[rom_addresses["Option_Dexsanity_B"]] = 1 @@ -759,13 +377,19 @@ def generate_output(self, output_directory: str): data[rom_addresses["Starting_Money_Low"]] = int(money[4:], 16) data[rom_addresses["Text_Badges_Needed_Viridian_Gym"]] = encode_text( str(self.multiworld.viridian_gym_condition[self.player].value))[0] + data[rom_addresses["Text_Rt23_Badges_A"]] = encode_text( + str(self.multiworld.victory_road_condition[self.player].value))[0] + data[rom_addresses["Text_Rt23_Badges_B"]] = encode_text( + str(self.multiworld.victory_road_condition[self.player].value))[0] + data[rom_addresses["Text_Rt23_Badges_C"]] = encode_text( + str(self.multiworld.victory_road_condition[self.player].value))[0] + data[rom_addresses["Text_Rt23_Badges_D"]] = encode_text( + str(self.multiworld.victory_road_condition[self.player].value))[0] data[rom_addresses["Text_Badges_Needed"]] = encode_text( - str(max(self.multiworld.victory_road_condition[self.player].value, - self.multiworld.elite_four_condition[self.player].value)))[0] + str(self.multiworld.elite_four_badges_condition[self.player].value))[0] write_bytes(data, encode_text( - " ".join(self.multiworld.get_location("Route 3 - Pokemon For Sale", self.player).item.name.upper().split()[1:])), + " ".join(self.multiworld.get_location("Route 4 Pokemon Center - Pokemon For Sale", self.player).item.name.upper().split()[1:])), rom_addresses["Text_Magikarp_Salesman"]) - write_quizzes(self, data, random) if self.multiworld.badges_needed_for_hm_moves[self.player].value == 0: for hm_move in poke_data.hm_moves: @@ -845,7 +469,7 @@ def generate_output(self, output_directory: str): data[rom_addresses["Option_Always_Half_STAB"]] = int(not self.multiworld.same_type_attack_bonus[self.player].value) - if self.multiworld.better_shops[self.player].value: + if self.multiworld.better_shops[self.player]: inventory = ["Poke Ball", "Great Ball", "Ultra Ball"] if self.multiworld.better_shops[self.player].value == 2: inventory.append("Master Ball") @@ -855,8 +479,11 @@ def generate_output(self, output_directory: str): shop_data = bytearray([0xFE, len(inventory)]) shop_data += bytearray([item_table[item].id - 172000000 for item in inventory]) shop_data.append(0xFF) - for shop in range(1, 10): + for shop in range(1, 11): write_bytes(data, shop_data, rom_addresses[f"Shop{shop}"]) + if self.multiworld.stonesanity[self.player]: + write_bytes(data, bytearray([0xFE, 1, item_table["Poke Doll"].id - 172000000, 0xFF]), rom_addresses[f"Shop_Stones"]) + price = str(self.multiworld.master_ball_price[self.player].value).zfill(6) price = bytearray([int(price[:2], 16), int(price[2:4], 16), int(price[4:], 16)]) write_bytes(data, price, rom_addresses["Price_Master_Ball"]) # Money values in Red and Blue are weird @@ -866,7 +493,6 @@ def generate_output(self, output_directory: str): data[rom_addresses["Start_Inventory"] + item.code - 172000000] += 1 set_mon_palettes(self, random, data) - process_trainer_data(self, data, random) for move_data in self.local_move_data.values(): if move_data["id"] == 0: @@ -888,13 +514,13 @@ def generate_output(self, output_directory: str): for mon in range(0, 16): data[rom_addresses['Title_Mons'] + mon] = mons.pop() if self.multiworld.game_version[self.player].value: - mons.sort(key=lambda mon: 0 if mon == self.multiworld.get_location("Pallet Town - Starter 1", self.player).item.name - else 1 if mon == self.multiworld.get_location("Pallet Town - Starter 2", self.player).item.name else - 2 if mon == self.multiworld.get_location("Pallet Town - Starter 3", self.player).item.name else 3) + mons.sort(key=lambda mon: 0 if mon == self.multiworld.get_location("Oak's Lab - Starter 1", self.player).item.name + else 1 if mon == self.multiworld.get_location("Oak's Lab - Starter 2", self.player).item.name else + 2 if mon == self.multiworld.get_location("Oak's Lab - Starter 3", self.player).item.name else 3) else: - mons.sort(key=lambda mon: 0 if mon == self.multiworld.get_location("Pallet Town - Starter 2", self.player).item.name - else 1 if mon == self.multiworld.get_location("Pallet Town - Starter 1", self.player).item.name else - 2 if mon == self.multiworld.get_location("Pallet Town - Starter 3", self.player).item.name else 3) + mons.sort(key=lambda mon: 0 if mon == self.multiworld.get_location("Oak's Lab - Starter 2", self.player).item.name + else 1 if mon == self.multiworld.get_location("Oak's Lab - Starter 1", self.player).item.name else + 2 if mon == self.multiworld.get_location("Oak's Lab - Starter 3", self.player).item.name else 3) write_bytes(data, encode_text(self.multiworld.seed_name[-20:], 20, True), rom_addresses['Title_Seed']) slot_name = self.multiworld.player_name[self.player] @@ -912,10 +538,68 @@ def generate_output(self, output_directory: str): else: write_bytes(data, self.rival_name, rom_addresses['Rival_Name']) - data[0xFF00] = 2 # client compatibility version + data[0xFF00] = 2 # client compatibility version write_bytes(data, self.multiworld.seed_name.encode(), 0xFFDB) write_bytes(data, self.multiworld.player_name[self.player].encode(), 0xFFF0) + self.finished_level_scaling.wait() + + write_quizzes(self, data, random) + + for location in self.multiworld.get_locations(): + if location.player != self.player: + continue + elif location.party_data: + for party in location.party_data: + if not isinstance(party["party_address"], list): + addresses = [rom_addresses[party["party_address"]]] + parties = [party["party"]] + else: + addresses = [rom_addresses[address] for address in party["party_address"]] + parties = party["party"] + levels = party["level"] + for address, party in zip(addresses, parties): + if isinstance(levels, int): + data[address] = levels + address += 1 + for mon in party: + data[address] = poke_data.pokemon_data[mon]["id"] + address += 1 + else: + address += 1 + for level, mon in zip(levels, party): + data[address] = level + data[address + 1] = poke_data.pokemon_data[mon]["id"] + address += 2 + assert data[address] == 0 or location.name == "Fossil Level - Trainer Parties" + continue + elif location.rom_address is None: + continue + if location.item and location.item.player == self.player: + if location.rom_address: + rom_address = location.rom_address + if not isinstance(rom_address, list): + rom_address = [rom_address] + for address in rom_address: + if location.item.name in poke_data.pokemon_data.keys(): + data[address] = poke_data.pokemon_data[location.item.name]["id"] + elif " ".join(location.item.name.split()[1:]) in poke_data.pokemon_data.keys(): + data[address] = poke_data.pokemon_data[" ".join(location.item.name.split()[1:])]["id"] + else: + item_id = self.item_name_to_id[location.item.name] - 172000000 + if item_id > 255: + item_id -= 256 + data[address] = item_id + if location.level: + data[location.level_address] = location.level + + else: + rom_address = location.rom_address + if not isinstance(rom_address, list): + rom_address = [rom_address] + for address in rom_address: + data[address] = 0x2C # AP Item + outfilepname = f'_P{self.player}' outfilepname += f"_{self.multiworld.get_file_safe_player_name(self.player).replace(' ', '_')}" \ if self.multiworld.player_name[self.player] != 'Player%d' % self.player else '' diff --git a/worlds/pokemon_rb/rom_addresses.py b/worlds/pokemon_rb/rom_addresses.py index eb9785ee..e9dc206e 100644 --- a/worlds/pokemon_rb/rom_addresses.py +++ b/worlds/pokemon_rb/rom_addresses.py @@ -1,980 +1,1630 @@ rom_addresses = { - "Option_Encounter_Minimum_Steps": 0x3c3, - "Option_Blind_Trainers": 0x30e2, - "Option_Trainersanity1": 0x3172, + "Option_Encounter_Minimum_Steps": 0x3c1, + "Option_Pitch_Black_Rock_Tunnel": 0x758, + "Option_Blind_Trainers": 0x30c3, + "Option_Trainersanity1": 0x3153, + "Option_Split_Card_Key": 0x3e09, + "Option_Fix_Combat_Bugs": 0x3e0a, "Option_Lose_Money": 0x40d4, "Base_Stats_Mew": 0x4260, "Title_Mon_First": 0x4373, - "Title_Mons": 0x454c, - "Player_Name": 0x456e, - "Rival_Name": 0x4576, - "Price_Master_Ball": 0x45d0, - "Title_Seed": 0x5e57, - "Title_Slot_Name": 0x5e77, - "PC_Item": 0x6245, - "PC_Item_Quantity": 0x624a, - "Options": 0x625a, - "Fly_Location": 0x625f, - "Skip_Player_Name": 0x6278, - "Skip_Rival_Name": 0x6286, - "Option_Old_Man": 0xcb05, - "Option_Old_Man_Lying": 0xcb08, - "Option_Boulders": 0xcdae, - "Option_Rock_Tunnel_Extra_Items": 0xcdb7, - "Wild_Route1": 0xd111, - "Wild_Route2": 0xd127, - "Wild_Route22": 0xd13d, - "Wild_ViridianForest": 0xd153, - "Wild_Route3": 0xd169, - "Wild_MtMoon1F": 0xd17f, - "Wild_MtMoonB1F": 0xd195, - "Wild_MtMoonB2F": 0xd1ab, - "Wild_Route4": 0xd1c1, - "Wild_Route24": 0xd1d7, - "Wild_Route25": 0xd1ed, - "Wild_Route9": 0xd203, - "Wild_Route5": 0xd219, - "Wild_Route6": 0xd22f, - "Wild_Route11": 0xd245, - "Wild_RockTunnel1F": 0xd25b, - "Wild_RockTunnelB1F": 0xd271, - "Wild_Route10": 0xd287, - "Wild_Route12": 0xd29d, - "Wild_Route8": 0xd2b3, - "Wild_Route7": 0xd2c9, - "Wild_PokemonTower3F": 0xd2e3, - "Wild_PokemonTower4F": 0xd2f9, - "Wild_PokemonTower5F": 0xd30f, - "Wild_PokemonTower6F": 0xd325, - "Wild_PokemonTower7F": 0xd33b, - "Wild_Route13": 0xd351, - "Wild_Route14": 0xd367, - "Wild_Route15": 0xd37d, - "Wild_Route16": 0xd393, - "Wild_Route17": 0xd3a9, - "Wild_Route18": 0xd3bf, - "Wild_SafariZoneCenter": 0xd3d5, - "Wild_SafariZoneEast": 0xd3eb, - "Wild_SafariZoneNorth": 0xd401, - "Wild_SafariZoneWest": 0xd417, - "Wild_SeaRoutes": 0xd42e, - "Wild_SeafoamIslands1F": 0xd443, - "Wild_SeafoamIslandsB1F": 0xd459, - "Wild_SeafoamIslandsB2F": 0xd46f, - "Wild_SeafoamIslandsB3F": 0xd485, - "Wild_SeafoamIslandsB4F": 0xd49b, - "Wild_PokemonMansion1F": 0xd4b1, - "Wild_PokemonMansion2F": 0xd4c7, - "Wild_PokemonMansion3F": 0xd4dd, - "Wild_PokemonMansionB1F": 0xd4f3, - "Wild_Route21": 0xd509, - "Wild_Surf_Route21": 0xd51e, - "Wild_CeruleanCave1F": 0xd533, - "Wild_CeruleanCave2F": 0xd549, - "Wild_CeruleanCaveB1F": 0xd55f, - "Wild_PowerPlant": 0xd575, - "Wild_Route23": 0xd58b, - "Wild_VictoryRoad2F": 0xd5a1, - "Wild_VictoryRoad3F": 0xd5b7, - "Wild_VictoryRoad1F": 0xd5cd, - "Wild_DiglettsCave": 0xd5e3, - "Ghost_Battle5": 0xd739, - "HM_Surf_Badge_a": 0xda2f, - "HM_Surf_Badge_b": 0xda34, - "Wild_Old_Rod": 0xe331, - "Wild_Good_Rod": 0xe35e, - "Option_Reusable_TMs": 0xe62a, - "Wild_Super_Rod_A": 0xea5f, - "Wild_Super_Rod_B": 0xea64, - "Wild_Super_Rod_C": 0xea69, - "Wild_Super_Rod_D": 0xea70, - "Wild_Super_Rod_E": 0xea75, - "Wild_Super_Rod_F": 0xea7a, - "Wild_Super_Rod_G": 0xea83, - "Wild_Super_Rod_H": 0xea8c, - "Wild_Super_Rod_I": 0xea95, - "Wild_Super_Rod_J": 0xea9e, - "Starting_Money_High": 0xf968, - "Starting_Money_Middle": 0xf96b, - "Starting_Money_Low": 0xf96e, - "Option_Pokedex_Seen": 0xf989, - "HM_Fly_Badge_a": 0x1318e, - "HM_Fly_Badge_b": 0x13193, - "HM_Cut_Badge_a": 0x131c4, - "HM_Cut_Badge_b": 0x131c9, - "HM_Strength_Badge_a": 0x131f4, - "HM_Strength_Badge_b": 0x131f9, - "HM_Flash_Badge_a": 0x13208, - "HM_Flash_Badge_b": 0x1320d, - "TM_Moves": 0x1376c, - "Encounter_Chances": 0x13911, + "Title_Mons": 0x4546, + "Player_Name": 0x4568, + "Rival_Name": 0x4570, + "Price_Master_Ball": 0x45c8, + "Title_Seed": 0x5f1b, + "Title_Slot_Name": 0x5f3b, + "PC_Item": 0x6309, + "PC_Item_Quantity": 0x630e, + "Fly_Location": 0x631c, + "Skip_Player_Name": 0x6335, + "Skip_Rival_Name": 0x6343, + "Pallet_Fly_Coords": 0x666e, + "Option_Old_Man": 0xcb0e, + "Option_Old_Man_Lying": 0xcb11, + "Option_Route3_Guard_A": 0xcb17, + "Option_Trashed_House_Guard_A": 0xcb20, + "Option_Trashed_House_Guard_B": 0xcb26, + "Option_Boulders": 0xcdb7, + "Option_Rock_Tunnel_Extra_Items": 0xcdc0, + "Wild_Route1": 0xd13b, + "Wild_Route2": 0xd151, + "Wild_Route22": 0xd167, + "Wild_ViridianForest": 0xd17d, + "Wild_Route3": 0xd193, + "Wild_MtMoon1F": 0xd1a9, + "Wild_MtMoonB1F": 0xd1bf, + "Wild_MtMoonB2F": 0xd1d5, + "Wild_Route4": 0xd1eb, + "Wild_Route24": 0xd201, + "Wild_Route25": 0xd217, + "Wild_Route9": 0xd22d, + "Wild_Route5": 0xd243, + "Wild_Route6": 0xd259, + "Wild_Route11": 0xd26f, + "Wild_RockTunnel1F": 0xd285, + "Wild_RockTunnelB1F": 0xd29b, + "Wild_Route10": 0xd2b1, + "Wild_Route12": 0xd2c7, + "Wild_Route8": 0xd2dd, + "Wild_Route7": 0xd2f3, + "Wild_PokemonTower3F": 0xd30d, + "Wild_PokemonTower4F": 0xd323, + "Wild_PokemonTower5F": 0xd339, + "Wild_PokemonTower6F": 0xd34f, + "Wild_PokemonTower7F": 0xd365, + "Wild_Route13": 0xd37b, + "Wild_Route14": 0xd391, + "Wild_Route15": 0xd3a7, + "Wild_Route16": 0xd3bd, + "Wild_Route17": 0xd3d3, + "Wild_Route18": 0xd3e9, + "Wild_SafariZoneCenter": 0xd3ff, + "Wild_SafariZoneEast": 0xd415, + "Wild_SafariZoneNorth": 0xd42b, + "Wild_SafariZoneWest": 0xd441, + "Wild_SeaRoutes": 0xd458, + "Wild_SeafoamIslands1F": 0xd46d, + "Wild_SeafoamIslandsB1F": 0xd483, + "Wild_SeafoamIslandsB2F": 0xd499, + "Wild_SeafoamIslandsB3F": 0xd4af, + "Wild_SeafoamIslandsB4F": 0xd4c5, + "Wild_PokemonMansion1F": 0xd4db, + "Wild_PokemonMansion2F": 0xd4f1, + "Wild_PokemonMansion3F": 0xd507, + "Wild_PokemonMansionB1F": 0xd51d, + "Wild_Route21": 0xd533, + "Wild_Surf_Route21": 0xd548, + "Wild_CeruleanCave1F": 0xd55d, + "Wild_CeruleanCave2F": 0xd573, + "Wild_CeruleanCaveB1F": 0xd589, + "Wild_PowerPlant": 0xd59f, + "Wild_Route23": 0xd5b5, + "Wild_VictoryRoad2F": 0xd5cb, + "Wild_VictoryRoad3F": 0xd5e1, + "Wild_VictoryRoad1F": 0xd5f7, + "Wild_DiglettsCave": 0xd60d, + "Ghost_Battle5": 0xd781, + "HM_Surf_Badge_a": 0xda73, + "HM_Surf_Badge_b": 0xda78, + "Option_Fix_Combat_Bugs_Heal_Stat_Modifiers": 0xdcc2, + "Option_Silph_Scope_Skip": 0xe207, + "Wild_Old_Rod": 0xe382, + "Wild_Good_Rod": 0xe3af, + "Option_Fix_Combat_Bugs_PP_Restore": 0xe541, + "Option_Reusable_TMs": 0xe675, + "Wild_Super_Rod_A": 0xeaa9, + "Wild_Super_Rod_B": 0xeaae, + "Wild_Super_Rod_C": 0xeab3, + "Wild_Super_Rod_D": 0xeaba, + "Wild_Super_Rod_E": 0xeabf, + "Wild_Super_Rod_F": 0xeac4, + "Wild_Super_Rod_G": 0xeacd, + "Wild_Super_Rod_H": 0xead6, + "Wild_Super_Rod_I": 0xeadf, + "Wild_Super_Rod_J": 0xeae8, + "Starting_Money_High": 0xf9aa, + "Starting_Money_Middle": 0xf9ad, + "Starting_Money_Low": 0xf9b0, + "Option_Pokedex_Seen": 0xf9cb, + "HM_Fly_Badge_a": 0x13182, + "HM_Fly_Badge_b": 0x13187, + "HM_Cut_Badge_a": 0x131b8, + "HM_Cut_Badge_b": 0x131bd, + "HM_Strength_Badge_a": 0x131e8, + "HM_Strength_Badge_b": 0x131ed, + "HM_Flash_Badge_a": 0x131fc, + "HM_Flash_Badge_b": 0x13201, + "Trainer_Screen_Total_Key_Items": 0x135dc, + "TM_Moves": 0x137b1, + "Encounter_Chances": 0x13950, + "Warps_CeladonCity": 0x18026, + "Warps_PalletTown": 0x182c7, + "Warps_ViridianCity": 0x18388, + "Warps_PewterCity": 0x1857b, + "Warps_CeruleanCity": 0x1878a, + "Warps_VermilionCity": 0x189be, + "Warps_FuchsiaCity": 0x18bd8, "Option_Viridian_Gym_Badges": 0x1901d, - "Event_Sleepy_Guy": 0x191bc, - "Starter2_K": 0x195a8, - "Starter3_K": 0x195b0, - "Event_Rocket_Thief": 0x196cc, - "Option_Cerulean_Cave_Condition": 0x19875, + "Event_Sleepy_Guy": 0x191d1, + "Option_Route3_Guard_B": 0x1928a, + "Starter2_K": 0x19611, + "Starter3_K": 0x19619, + "Event_Rocket_Thief": 0x19733, + "Option_Cerulean_Cave_Badges": 0x19857, + "Option_Cerulean_Cave_Key_Items": 0x1985e, + "Text_Cerulean_Cave_Badges": 0x198c3, + "Text_Cerulean_Cave_Key_Items": 0x198d1, "Event_Stranded_Man": 0x19b28, "Event_Rivals_Sister": 0x19cfb, - "Option_Pokemon_League_Badges": 0x19e18, - "Shop10": 0x19eef, - "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_0_ITEM": 0x1a043, - "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_1_ITEM": 0x1a051, - "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_2_ITEM": 0x1a05f, - "Missable_Silph_Co_4F_Item_1": 0x1a107, - "Missable_Silph_Co_4F_Item_2": 0x1a10e, - "Missable_Silph_Co_4F_Item_3": 0x1a115, - "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_0_ITEM": 0x1a26d, - "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_1_ITEM": 0x1a27b, - "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_2_ITEM": 0x1a289, - "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_3_ITEM": 0x1a297, - "Missable_Silph_Co_5F_Item_1": 0x1a36f, - "Missable_Silph_Co_5F_Item_2": 0x1a376, - "Missable_Silph_Co_5F_Item_3": 0x1a37d, - "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_0_ITEM": 0x1a4ad, - "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_1_ITEM": 0x1a4bb, - "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_2_ITEM": 0x1a4c9, - "Missable_Silph_Co_6F_Item_1": 0x1a5eb, - "Missable_Silph_Co_6F_Item_2": 0x1a5f2, - "Event_Free_Sample": 0x1cad6, - "Starter1_F": 0x1cca2, - "Starter2_F": 0x1cca6, - "Starter2_G": 0x1cddf, - "Starter3_G": 0x1cde7, - "Starter2_H": 0x1d0df, - "Starter1_H": 0x1d0e9, - "Starter3_I": 0x1d0f0, - "Starter2_I": 0x1d0fa, - "Starter1_D": 0x1d101, - "Starter3_D": 0x1d10b, - "Starter2_E": 0x1d300, - "Starter3_E": 0x1d308, - "Event_Pokedex": 0x1d36c, - "Event_Oaks_Gift": 0x1d39c, - "Event_Pokemart_Quest": 0x1d594, - "Shop1": 0x1d5be, - "Event_Bicycle_Shop": 0x1d858, - "Text_Bicycle": 0x1d8eb, - "Event_Fuji": 0x1da20, - "Trainersanity_EVENT_BEAT_MEW_ITEM": 0x1dc73, - "Static_Encounter_Mew": 0x1dca3, - "Gift_Eevee": 0x1dd1c, - "Shop7": 0x1dd6e, - "Event_Mr_Psychic": 0x1de4b, - "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_0_ITEM": 0x1e346, - "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_1_ITEM": 0x1e354, - "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_2_ITEM": 0x1e362, - "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_3_ITEM": 0x1e370, - "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_4_ITEM": 0x1e37e, - "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_5_ITEM": 0x1e38c, - "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_6_ITEM": 0x1e39a, - "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_7_ITEM": 0x1e3a8, - "Trainersanity_EVENT_BEAT_ZAPDOS_ITEM": 0x1e3b6, - "Static_Encounter_Voltorb_A": 0x1e425, - "Static_Encounter_Voltorb_B": 0x1e42d, - "Static_Encounter_Voltorb_C": 0x1e435, - "Static_Encounter_Electrode_A": 0x1e43d, - "Static_Encounter_Voltorb_D": 0x1e445, - "Static_Encounter_Voltorb_E": 0x1e44d, - "Static_Encounter_Electrode_B": 0x1e455, - "Static_Encounter_Voltorb_F": 0x1e45d, - "Static_Encounter_Zapdos": 0x1e465, - "Missable_Power_Plant_Item_1": 0x1e46d, - "Missable_Power_Plant_Item_2": 0x1e474, - "Missable_Power_Plant_Item_3": 0x1e47b, - "Missable_Power_Plant_Item_4": 0x1e482, - "Missable_Power_Plant_Item_5": 0x1e489, - "Event_Rt16_House_Woman": 0x1e662, - "Option_Victory_Road_Badges": 0x1e733, - "Event_Bill": 0x1e964, + "Warps_BluesHouse": 0x19d51, + "Warps_VermilionTradeHouse": 0x19da8, + "Require_Pokedex_D": 0x19e3f, + "Option_Elite_Four_Key_Items": 0x19e89, + "Option_Elite_Four_Pokedex": 0x19e90, + "Option_Elite_Four_Badges": 0x19e97, + "Text_Elite_Four_Badges": 0x19f33, + "Text_Elite_Four_Key_Items": 0x19f3d, + "Text_Elite_Four_Pokedex": 0x19f50, + "Shop10": 0x1a004, + "Warps_IndigoPlateauLobby": 0x1a030, + "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_0_ITEM": 0x1a158, + "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_1_ITEM": 0x1a166, + "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_2_ITEM": 0x1a174, + "Event_SKC4F": 0x1a187, + "Warps_SilphCo4F": 0x1a209, + "Missable_Silph_Co_4F_Item_1": 0x1a249, + "Missable_Silph_Co_4F_Item_2": 0x1a250, + "Missable_Silph_Co_4F_Item_3": 0x1a257, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_0_ITEM": 0x1a3af, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_1_ITEM": 0x1a3bd, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_2_ITEM": 0x1a3cb, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_3_ITEM": 0x1a3d9, + "Event_SKC5F": 0x1a3ec, + "Warps_SilphCo5F": 0x1a496, + "Missable_Silph_Co_5F_Item_1": 0x1a4de, + "Missable_Silph_Co_5F_Item_2": 0x1a4e5, + "Missable_Silph_Co_5F_Item_3": 0x1a4ec, + "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_0_ITEM": 0x1a61c, + "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_1_ITEM": 0x1a62a, + "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_2_ITEM": 0x1a638, + "Event_SKC6F": 0x1a666, + "Warps_SilphCo6F": 0x1a741, + "Missable_Silph_Co_6F_Item_1": 0x1a791, + "Missable_Silph_Co_6F_Item_2": 0x1a798, + "Path_Pallet_Oak": 0x1a91e, + "Path_Pallet_Player": 0x1a92b, + "Warps_CinnabarIsland": 0x1c026, + "Warps_Route1": 0x1c0e9, + "Option_Extra_Key_Items_B": 0x1ca46, + "Event_Free_Sample": 0x1cad7, + "Starter1_F": 0x1cca3, + "Starter2_F": 0x1cca7, + "Starter2_G": 0x1cde0, + "Starter3_G": 0x1cde8, + "Starter2_H": 0x1d0da, + "Starter1_H": 0x1d0e4, + "Starter3_I": 0x1d0eb, + "Starter2_I": 0x1d0f5, + "Starter1_D": 0x1d0fc, + "Starter3_D": 0x1d106, + "Starter2_E": 0x1d2f7, + "Starter3_E": 0x1d2ff, + "Event_Pokedex": 0x1d363, + "Event_Oaks_Gift": 0x1d393, + "Starter2_P": 0x1d481, + "Starter3_P": 0x1d489, + "Warps_OaksLab": 0x1d6af, + "Event_Pokemart_Quest": 0x1d76b, + "Shop1": 0x1d795, + "Warps_ViridianMart": 0x1d7d8, + "Warps_ViridianSchoolHouse": 0x1d82b, + "Warps_ViridianNicknameHouse": 0x1d889, + "Warps_PewterNidoranHouse": 0x1d8e4, + "Warps_PewterSpeechHouse": 0x1d927, + "Warps_CeruleanTrashedHouse": 0x1d98d, + "Warps_CeruleanTradeHouse": 0x1d9de, + "Event_Bicycle_Shop": 0x1da2f, + "Bike_Shop_Item_Display": 0x1da8a, + "Warps_BikeShop": 0x1db45, + "Event_Fuji": 0x1dbfd, + "Warps_MrFujisHouse": 0x1dc44, + "Warps_LavenderCuboneHouse": 0x1dcc0, + "Warps_NameRatersHouse": 0x1ddae, + "Warps_VermilionPidgeyHouse": 0x1ddf8, + "Trainersanity_EVENT_BEAT_MEW_ITEM": 0x1de4e, + "Warps_VermilionDock": 0x1de70, + "Static_Encounter_Mew": 0x1de7e, + "Gift_Eevee": 0x1def7, + "Warps_CeladonMansionRoofHouse": 0x1df0e, + "Shop7": 0x1df49, + "Warps_FuchsiaMart": 0x1df74, + "Warps_SaffronPidgeyHouse": 0x1dfdd, + "Event_Mr_Psychic": 0x1e020, + "Warps_MrPsychicsHouse": 0x1e05d, + "Warps_DiglettsCaveRoute2": 0x1e092, + "Warps_Route2TradeHouse": 0x1e0da, + "Warps_Route5Gate": 0x1e1db, + "Warps_Route6Gate": 0x1e2ad, + "Warps_Route7Gate": 0x1e383, + "Warps_Route8Gate": 0x1e454, + "Warps_UndergroundPathRoute8": 0x1e4a5, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_0_ITEM": 0x1e511, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_1_ITEM": 0x1e51f, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_2_ITEM": 0x1e52d, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_3_ITEM": 0x1e53b, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_4_ITEM": 0x1e549, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_5_ITEM": 0x1e557, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_6_ITEM": 0x1e565, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_7_ITEM": 0x1e573, + "Trainersanity_EVENT_BEAT_ZAPDOS_ITEM": 0x1e581, + "Warps_PowerPlant": 0x1e5de, + "Static_Encounter_Voltorb_A": 0x1e5f0, + "Static_Encounter_Voltorb_B": 0x1e5f8, + "Static_Encounter_Voltorb_C": 0x1e600, + "Static_Encounter_Electrode_A": 0x1e608, + "Static_Encounter_Voltorb_D": 0x1e610, + "Static_Encounter_Voltorb_E": 0x1e618, + "Static_Encounter_Electrode_B": 0x1e620, + "Static_Encounter_Voltorb_F": 0x1e628, + "Static_Encounter_Zapdos": 0x1e630, + "Missable_Power_Plant_Item_1": 0x1e638, + "Missable_Power_Plant_Item_2": 0x1e63f, + "Missable_Power_Plant_Item_3": 0x1e646, + "Missable_Power_Plant_Item_4": 0x1e64d, + "Missable_Power_Plant_Item_5": 0x1e654, + "Warps_DiglettsCaveRoute11": 0x1e7e9, + "Event_Rt16_House_Woman": 0x1e827, + "Warps_Route16FlyHouse": 0x1e870, + "Option_Victory_Road_Badges": 0x1e8f3, + "Warps_Route22Gate": 0x1e9e3, + "Event_Bill": 0x1eb24, + "Warps_BillsHouse": 0x1eb83, "Starter1_O": 0x372b0, "Starter2_O": 0x372b4, "Starter3_O": 0x372b8, "Move_Data": 0x38000, "Base_Stats": 0x383de, - "Starter3_C": 0x39cf2, - "Starter1_C": 0x39cf8, - "Trainer_Data": 0x39d99, - "Rival_Starter2_A": 0x3a1e5, - "Rival_Starter3_A": 0x3a1e8, - "Rival_Starter1_A": 0x3a1eb, - "Rival_Starter2_B": 0x3a1f1, - "Rival_Starter3_B": 0x3a1f7, - "Rival_Starter1_B": 0x3a1fd, - "Rival_Starter2_C": 0x3a207, - "Rival_Starter3_C": 0x3a211, - "Rival_Starter1_C": 0x3a21b, - "Rival_Starter2_D": 0x3a409, - "Rival_Starter3_D": 0x3a413, - "Rival_Starter1_D": 0x3a41d, - "Rival_Starter2_E": 0x3a429, - "Rival_Starter3_E": 0x3a435, - "Rival_Starter1_E": 0x3a441, - "Rival_Starter2_F": 0x3a44d, - "Rival_Starter3_F": 0x3a459, - "Rival_Starter1_F": 0x3a465, - "Rival_Starter2_G": 0x3a473, - "Rival_Starter3_G": 0x3a481, - "Rival_Starter1_G": 0x3a48f, - "Rival_Starter2_H": 0x3a49d, - "Rival_Starter3_H": 0x3a4ab, - "Rival_Starter1_H": 0x3a4b9, - "Trainer_Data_End": 0x3a52e, - "Learnset_Rhydon": 0x3b1e1, - "Learnset_Kangaskhan": 0x3b1ef, - "Learnset_NidoranM": 0x3b1fe, - "Learnset_Clefairy": 0x3b210, - "Learnset_Spearow": 0x3b221, - "Learnset_Voltorb": 0x3b230, - "Learnset_Nidoking": 0x3b23c, - "Learnset_Slowbro": 0x3b244, - "Learnset_Ivysaur": 0x3b257, - "Learnset_Exeggutor": 0x3b267, - "Learnset_Lickitung": 0x3b26b, - "Learnset_Exeggcute": 0x3b27b, - "Learnset_Grimer": 0x3b28c, - "Learnset_Gengar": 0x3b29a, - "Learnset_NidoranF": 0x3b2a3, - "Learnset_Nidoqueen": 0x3b2b1, - "Learnset_Cubone": 0x3b2bc, - "Learnset_Rhyhorn": 0x3b2cb, - "Learnset_Lapras": 0x3b2d9, - "Learnset_Mew": 0x3b2e9, - "Learnset_Gyarados": 0x3b2f3, - "Learnset_Shellder": 0x3b303, - "Learnset_Tentacool": 0x3b312, - "Learnset_Gastly": 0x3b327, - "Learnset_Scyther": 0x3b32d, - "Learnset_Staryu": 0x3b33f, - "Learnset_Blastoise": 0x3b34f, - "Learnset_Pinsir": 0x3b35d, - "Learnset_Tangela": 0x3b36b, - "Learnset_Growlithe": 0x3b381, - "Learnset_Onix": 0x3b38d, - "Learnset_Fearow": 0x3b399, - "Learnset_Pidgey": 0x3b3a8, - "Learnset_Slowpoke": 0x3b3b9, - "Learnset_Kadabra": 0x3b3d1, - "Learnset_Graveler": 0x3b3e9, - "Learnset_Chansey": 0x3b3f7, - "Learnset_Machoke": 0x3b40f, - "Learnset_MrMime": 0x3b41b, - "Learnset_Hitmonlee": 0x3b427, - "Learnset_Hitmonchan": 0x3b433, - "Learnset_Arbok": 0x3b43f, - "Learnset_Parasect": 0x3b44b, - "Learnset_Psyduck": 0x3b45a, - "Learnset_Drowzee": 0x3b469, - "Learnset_Golem": 0x3b477, - "Learnset_Magmar": 0x3b487, - "Learnset_Electabuzz": 0x3b497, - "Learnset_Magneton": 0x3b4a3, - "Learnset_Koffing": 0x3b4b4, - "Learnset_Mankey": 0x3b4c5, - "Learnset_Seel": 0x3b4d4, - "Learnset_Diglett": 0x3b4e3, - "Learnset_Tauros": 0x3b4ef, - "Learnset_Farfetchd": 0x3b501, - "Learnset_Venonat": 0x3b510, - "Learnset_Dragonite": 0x3b51e, - "Learnset_Doduo": 0x3b533, - "Learnset_Poliwag": 0x3b544, - "Learnset_Jynx": 0x3b552, - "Learnset_Moltres": 0x3b560, - "Learnset_Articuno": 0x3b568, - "Learnset_Zapdos": 0x3b570, - "Learnset_Meowth": 0x3b57d, - "Learnset_Krabby": 0x3b58c, - "Learnset_Vulpix": 0x3b5a2, - "Learnset_Pikachu": 0x3b5b4, - "Learnset_Dratini": 0x3b5c9, - "Learnset_Dragonair": 0x3b5d8, - "Learnset_Kabuto": 0x3b5e7, - "Learnset_Kabutops": 0x3b5f1, - "Learnset_Horsea": 0x3b5fe, - "Learnset_Seadra": 0x3b60a, - "Learnset_Sandshrew": 0x3b61d, - "Learnset_Sandslash": 0x3b629, - "Learnset_Omanyte": 0x3b638, - "Learnset_Omastar": 0x3b642, - "Learnset_Jigglypuff": 0x3b650, - "Learnset_Eevee": 0x3b66e, - "Learnset_Flareon": 0x3b678, - "Learnset_Jolteon": 0x3b68a, - "Learnset_Vaporeon": 0x3b69c, - "Learnset_Machop": 0x3b6b1, - "Learnset_Zubat": 0x3b6c0, - "Learnset_Ekans": 0x3b6cf, - "Learnset_Paras": 0x3b6de, - "Learnset_Poliwhirl": 0x3b6ee, - "Learnset_Poliwrath": 0x3b6fc, - "Learnset_Beedrill": 0x3b70c, - "Learnset_Dodrio": 0x3b71c, - "Learnset_Primeape": 0x3b72a, - "Learnset_Dugtrio": 0x3b736, - "Learnset_Venomoth": 0x3b742, - "Learnset_Dewgong": 0x3b750, - "Learnset_Butterfree": 0x3b76a, - "Learnset_Machamp": 0x3b77a, - "Learnset_Golduck": 0x3b788, - "Learnset_Hypno": 0x3b794, - "Learnset_Golbat": 0x3b7a2, - "Learnset_Mewtwo": 0x3b7ae, - "Learnset_Snorlax": 0x3b7ba, - "Learnset_Magikarp": 0x3b7c7, - "Learnset_Muk": 0x3b7cf, - "Learnset_Kingler": 0x3b7df, - "Learnset_Cloyster": 0x3b7eb, - "Learnset_Electrode": 0x3b7f1, - "Learnset_Weezing": 0x3b7ff, - "Learnset_Persian": 0x3b80b, - "Learnset_Marowak": 0x3b817, - "Learnset_Haunter": 0x3b82f, - "Learnset_Alakazam": 0x3b83a, - "Learnset_Pidgeotto": 0x3b84b, - "Learnset_Pidgeot": 0x3b859, - "Learnset_Bulbasaur": 0x3b86c, - "Learnset_Venusaur": 0x3b87c, - "Learnset_Tentacruel": 0x3b88c, - "Learnset_Goldeen": 0x3b8a3, - "Learnset_Seaking": 0x3b8b1, - "Learnset_Ponyta": 0x3b8ca, - "Learnset_Rapidash": 0x3b8d8, - "Learnset_Rattata": 0x3b8e9, - "Learnset_Raticate": 0x3b8f3, - "Learnset_Nidorino": 0x3b901, - "Learnset_Nidorina": 0x3b913, - "Learnset_Geodude": 0x3b924, - "Learnset_Porygon": 0x3b932, - "Learnset_Aerodactyl": 0x3b93c, - "Learnset_Magnemite": 0x3b94b, - "Learnset_Charmander": 0x3b960, - "Learnset_Squirtle": 0x3b971, - "Learnset_Charmeleon": 0x3b982, - "Learnset_Wartortle": 0x3b993, - "Learnset_Charizard": 0x3b9a1, - "Learnset_Oddish": 0x3b9ba, - "Learnset_Gloom": 0x3b9cc, - "Learnset_Vileplume": 0x3b9da, - "Learnset_Bellsprout": 0x3b9e5, - "Learnset_Weepinbell": 0x3b9f9, - "Learnset_Victreebel": 0x3ba09, - "Option_Always_Half_STAB": 0x3e3fb, - "Type_Chart": 0x3e4ee, - "Ghost_Battle3": 0x3f1be, - "Dexsanity_Items": 0x44254, - "Option_Dexsanity_A": 0x44301, - "Require_Pokedex_B": 0x44305, - "Option_Dexsanity_B": 0x44362, - "Require_Pokedex_C": 0x44366, - "Trainersanity_EVENT_BEAT_MANSION_1_TRAINER_0_ITEM": 0x4454b, - "Missable_Pokemon_Mansion_1F_Item_1": 0x445e2, - "Missable_Pokemon_Mansion_1F_Item_2": 0x445e9, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_0_ITEM": 0x4471e, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_1_ITEM": 0x4472c, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_2_ITEM": 0x4473a, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_3_ITEM": 0x44748, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_4_ITEM": 0x44756, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_5_ITEM": 0x44764, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_6_ITEM": 0x44772, - "Map_Rock_Tunnel1F": 0x4488f, - "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_0_ITEM": 0x44c5f, - "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_1_ITEM": 0x44c6d, - "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_2_ITEM": 0x44c7b, - "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_3_ITEM": 0x44c89, - "Missable_Victory_Road_3F_Item_1": 0x44d29, - "Missable_Victory_Road_3F_Item_2": 0x44d30, - "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_0_ITEM": 0x44e51, - "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_1_ITEM": 0x44e5f, - "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_2_ITEM": 0x44e6d, - "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_3_ITEM": 0x44e7b, - "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_4_ITEM": 0x44e89, - "Missable_Rocket_Hideout_B1F_Item_1": 0x44f59, - "Missable_Rocket_Hideout_B1F_Item_2": 0x44f60, - "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_2_TRAINER_0_ITEM": 0x4530a, - "Missable_Rocket_Hideout_B2F_Item_1": 0x4534b, - "Missable_Rocket_Hideout_B2F_Item_2": 0x45352, - "Missable_Rocket_Hideout_B2F_Item_3": 0x45359, - "Missable_Rocket_Hideout_B2F_Item_4": 0x45360, - "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_0_ITEM": 0x4553d, - "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_1_ITEM": 0x4554b, - "Missable_Rocket_Hideout_B3F_Item_1": 0x455a1, - "Missable_Rocket_Hideout_B3F_Item_2": 0x455a8, - "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_0_ITEM": 0x45754, - "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_1_ITEM": 0x45762, - "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_2_ITEM": 0x45770, - "Missable_Rocket_Hideout_B4F_Item_1": 0x4585f, - "Missable_Rocket_Hideout_B4F_Item_2": 0x45866, - "Missable_Rocket_Hideout_B4F_Item_3": 0x4586d, - "Missable_Rocket_Hideout_B4F_Item_4": 0x45874, - "Missable_Rocket_Hideout_B4F_Item_5": 0x4587b, - "Missable_Safari_Zone_East_Item_1": 0x45aea, - "Missable_Safari_Zone_East_Item_2": 0x45af1, - "Missable_Safari_Zone_East_Item_3": 0x45af8, - "Missable_Safari_Zone_East_Item_4": 0x45aff, - "Missable_Safari_Zone_North_Item_1": 0x45c4a, - "Missable_Safari_Zone_North_Item_2": 0x45c51, - "Missable_Safari_Zone_Center_Item": 0x45e31, - "Missable_Cerulean_Cave_2F_Item_1": 0x4606e, - "Missable_Cerulean_Cave_2F_Item_2": 0x46075, - "Missable_Cerulean_Cave_2F_Item_3": 0x4607c, - "Trainersanity_EVENT_BEAT_MEWTWO_ITEM": 0x46154, - "Static_Encounter_Mewtwo": 0x4617e, - "Missable_Cerulean_Cave_B1F_Item_1": 0x46186, - "Missable_Cerulean_Cave_B1F_Item_2": 0x4618d, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_0_ITEM": 0x46263, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_1_ITEM": 0x46271, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_2_ITEM": 0x4627f, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_3_ITEM": 0x4628d, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_4_ITEM": 0x4629b, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_5_ITEM": 0x462a9, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_6_ITEM": 0x462b7, - "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_7_ITEM": 0x462c5, - "Missable_Rock_Tunnel_B1F_Item_1": 0x463e9, - "Missable_Rock_Tunnel_B1F_Item_2": 0x463f0, - "Missable_Rock_Tunnel_B1F_Item_3": 0x463f7, - "Missable_Rock_Tunnel_B1F_Item_4": 0x463fe, - "Map_Rock_TunnelB1F": 0x4640f, - "Trainersanity_EVENT_BEAT_ARTICUNO_ITEM": 0x46b01, - "Static_Encounter_Articuno": 0x46b58, - "Hidden_Item_Game_Corner_1": 0x46ff0, - "Hidden_Item_Game_Corner_2": 0x46ff6, - "Hidden_Item_Game_Corner_3": 0x46ffc, - "Hidden_Item_Game_Corner_4": 0x47002, - "Hidden_Item_Game_Corner_5": 0x47008, - "Hidden_Item_Game_Corner_6": 0x4700e, - "Hidden_Item_Game_Corner_7": 0x47014, - "Hidden_Item_Game_Corner_8": 0x4701a, - "Hidden_Item_Game_Corner_9": 0x47020, - "Hidden_Item_Game_Corner_10": 0x47026, - "Hidden_Item_Game_Corner_11": 0x4702c, - "Quiz_Answer_A": 0x47060, - "Quiz_Answer_B": 0x47066, - "Quiz_Answer_C": 0x4706c, - "Quiz_Answer_D": 0x47072, - "Quiz_Answer_E": 0x47078, - "Quiz_Answer_F": 0x4707e, - "Hidden_Item_Viridian_Forest_1": 0x470b3, - "Hidden_Item_Viridian_Forest_2": 0x470b9, - "Hidden_Item_MtMoonB2F_1": 0x470c0, - "Hidden_Item_MtMoonB2F_2": 0x470c6, - "Hidden_Item_Route_25_1": 0x470da, - "Hidden_Item_Route_25_2": 0x470e0, - "Hidden_Item_Route_9": 0x470e7, - "Hidden_Item_SS_Anne_Kitchen": 0x470fa, - "Hidden_Item_SS_Anne_B1F": 0x47101, - "Hidden_Item_Route_10_1": 0x47108, - "Hidden_Item_Route_10_2": 0x4710e, - "Hidden_Item_Rocket_Hideout_B1F": 0x47115, - "Hidden_Item_Rocket_Hideout_B3F": 0x4711c, - "Hidden_Item_Rocket_Hideout_B4F": 0x47123, - "Hidden_Item_Pokemon_Tower_5F": 0x47137, - "Hidden_Item_Route_13_1": 0x4713e, - "Hidden_Item_Route_13_2": 0x47144, - "Hidden_Item_Safari_Zone_West": 0x47152, - "Hidden_Item_Silph_Co_5F": 0x47159, - "Hidden_Item_Silph_Co_9F": 0x47160, - "Hidden_Item_Copycats_House": 0x47167, - "Hidden_Item_Cerulean_Cave_1F": 0x4716e, - "Hidden_Item_Cerulean_Cave_B1F": 0x47175, - "Hidden_Item_Power_Plant_1": 0x4717c, - "Hidden_Item_Power_Plant_2": 0x47182, - "Hidden_Item_Seafoam_Islands_B2F": 0x47189, - "Hidden_Item_Seafoam_Islands_B4F": 0x47190, - "Hidden_Item_Pokemon_Mansion_1F": 0x47197, - "Hidden_Item_Pokemon_Mansion_3F": 0x471ab, - "Hidden_Item_Pokemon_Mansion_B1F": 0x471b8, - "Hidden_Item_Route_23_1": 0x471cb, - "Hidden_Item_Route_23_2": 0x471d1, - "Hidden_Item_Route_23_3": 0x471d7, - "Hidden_Item_Victory_Road_2F_1": 0x471de, - "Hidden_Item_Victory_Road_2F_2": 0x471e4, - "Hidden_Item_Unused_6F": 0x471eb, - "Hidden_Item_Viridian_City": 0x471f9, - "Hidden_Item_Route_11": 0x472a6, - "Hidden_Item_Route_12": 0x472ad, - "Hidden_Item_Route_17_1": 0x472bb, - "Hidden_Item_Route_17_2": 0x472c1, - "Hidden_Item_Route_17_3": 0x472c7, - "Hidden_Item_Route_17_4": 0x472cd, - "Hidden_Item_Route_17_5": 0x472d3, - "Hidden_Item_Underground_Path_NS_1": 0x472da, - "Hidden_Item_Underground_Path_NS_2": 0x472e0, - "Hidden_Item_Underground_Path_WE_1": 0x472e7, - "Hidden_Item_Underground_Path_WE_2": 0x472ed, - "Hidden_Item_Celadon_City": 0x472f4, - "Hidden_Item_Seafoam_Islands_B3F": 0x472fb, - "Hidden_Item_Vermilion_City": 0x47302, - "Hidden_Item_Cerulean_City": 0x47309, - "Hidden_Item_Route_4": 0x47310, - "Event_Counter": 0x482d3, - "Shop_Stones": 0x483e9, - "Event_Thirsty_Girl_Lemonade": 0x48501, - "Event_Thirsty_Girl_Soda": 0x48525, - "Event_Thirsty_Girl_Water": 0x48549, - "Option_Tea": 0x48725, - "Event_Mansion_Lady": 0x48732, - "Badge_Celadon_Gym": 0x48a23, - "Event_Celadon_Gym": 0x48a37, - "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_0_ITEM": 0x48a7d, - "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_1_ITEM": 0x48a8b, - "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_2_ITEM": 0x48a99, - "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_3_ITEM": 0x48aa7, - "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_4_ITEM": 0x48ab5, - "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_5_ITEM": 0x48ac3, - "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_6_ITEM": 0x48ad1, - "Event_Game_Corner_Gift_A": 0x48e98, - "Event_Game_Corner_Gift_C": 0x48f14, - "Event_Game_Corner_Gift_B": 0x48f63, - "Event_Gambling_Addict": 0x49306, - "Gift_Magikarp": 0x494a3, - "Option_Aide_Rt11": 0x49600, - "Event_Rt11_Oaks_Aide": 0x49604, - "Event_Mourning_Girl": 0x496fe, - "Option_Aide_Rt15": 0x497e9, - "Event_Rt_15_Oaks_Aide": 0x497ed, - "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_0_ITEM": 0x49b93, - "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_1_ITEM": 0x49ba1, - "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_2_ITEM": 0x49baf, - "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_3_ITEM": 0x49bbd, - "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_4_ITEM": 0x49bcb, - "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_5_ITEM": 0x49bd9, - "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_6_ITEM": 0x49be7, - "Missable_Mt_Moon_1F_Item_1": 0x49cf6, - "Missable_Mt_Moon_1F_Item_2": 0x49cfd, - "Missable_Mt_Moon_1F_Item_3": 0x49d04, - "Missable_Mt_Moon_1F_Item_4": 0x49d0b, - "Missable_Mt_Moon_1F_Item_5": 0x49d12, - "Missable_Mt_Moon_1F_Item_6": 0x49d19, - "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_0_ITEM": 0x49fec, - "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_1_ITEM": 0x49ffa, - "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_2_ITEM": 0x4a008, - "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_3_ITEM": 0x4a016, - "Dome_Fossil_Text": 0x4a08a, - "Event_Dome_Fossil": 0x4a0aa, - "Helix_Fossil_Text": 0x4a0e6, - "Event_Helix_Fossil": 0x4a106, - "Missable_Mt_Moon_B2F_Item_1": 0x4a1ef, - "Missable_Mt_Moon_B2F_Item_2": 0x4a1f6, - "Missable_Safari_Zone_West_Item_1": 0x4a3d8, - "Missable_Safari_Zone_West_Item_2": 0x4a3df, - "Missable_Safari_Zone_West_Item_3": 0x4a3e6, - "Missable_Safari_Zone_West_Item_4": 0x4a3ed, - "Event_Safari_Zone_Secret_House": 0x4a4f2, + "Starter3_C": 0x39cee, + "Starter1_C": 0x39cf4, + "Gym_Leader_Moves": 0x39d1f, + "Trainer_Party_Route_3_Youngster_A": 0x39d95, + "Trainer_Party_Route_3_Youngster_B": 0x39d99, + "Trainer_Party_Mt_Moon_1F_Youngster_A": 0x39d9c, + "Trainer_Party_Route_24_Youngster_A": 0x39da1, + "Trainer_Party_Route_25_Youngster_A": 0x39da6, + "Trainer_Party_Route_25_Youngster_B": 0x39daa, + "Trainer_Party_Route_25_Youngster_C": 0x39dad, + "Trainer_Party_SS_Anne_1F_Rooms_Youngster_A": 0x39db1, + "Trainer_Party_Route_11_Youngster_A": 0x39db4, + "Trainer_Party_Route_11_Youngster_B": 0x39db7, + "Trainer_Party_Route_11_Youngster_C": 0x39dbb, + "Trainer_Party_Route_11_Youngster_D": 0x39dc0, + "Trainer_Party_Viridian_Forest_BugCatcher_A": 0x39dca, + "Trainer_Party_Viridian_Forest_BugCatcher_B": 0x39dce, + "Trainer_Party_Viridian_Forest_BugCatcher_C": 0x39dd3, + "Trainer_Party_Route_3_BugCatcher_A": 0x39dd6, + "Trainer_Party_Route_3_BugCatcher_B": 0x39ddb, + "Trainer_Party_Route_3_BugCatcher_C": 0x39de1, + "Trainer_Party_Mt_Moon_1F_BugCatcher_A": 0x39de5, + "Trainer_Party_Mt_Moon_1F_BugCatcher_B": 0x39de9, + "Trainer_Party_Route_24_BugCatcher_A": 0x39dee, + "Trainer_Party_Route_6_BugCatcher_A": 0x39df2, + "Trainer_Party_Route_6_BugCatcher_B": 0x39df7, + "Trainer_Party_Route_9_BugCatcher_A": 0x39dff, + "Trainer_Party_Route_9_BugCatcher_B": 0x39e03, + "Trainer_Party_Route_3_Lass_A": 0x39e08, + "Trainer_Party_Route_3_Lass_B": 0x39e0c, + "Trainer_Party_Route_3_Lass_C": 0x39e10, + "Trainer_Party_Route_4_Lass_A": 0x39e13, + "Trainer_Party_Mt_Moon_1F_Lass_A": 0x39e18, + "Trainer_Party_Mt_Moon_1F_Lass_B": 0x39e1c, + "Trainer_Party_Route_24_Lass_A": 0x39e1f, + "Trainer_Party_Route_24_Lass_B": 0x39e23, + "Trainer_Party_Route_25_Lass_A": 0x39e27, + "Trainer_Party_Route_25_Lass_B": 0x39e2b, + "Trainer_Party_SS_Anne_1F_Rooms_Lass_A": 0x39e30, + "Trainer_Party_SS_Anne_2F_Rooms_Lass_A": 0x39e34, + "Trainer_Party_Route_8_Lass_A": 0x39e38, + "Trainer_Party_Route_8_Lass_B": 0x39e3c, + "Trainer_Party_Route_8_Lass_C": 0x39e41, + "Trainer_Party_Route_8_Lass_D": 0x39e48, + "Trainer_Party_Celadon_Gym_Lass_A": 0x39e4c, + "Trainer_Party_Celadon_Gym_Lass_B": 0x39e50, + "Trainer_Party_SS_Anne_Stern_Sailor_A": 0x39e54, + "Trainer_Party_SS_Anne_Stern_Sailor_B": 0x39e58, + "Trainer_Party_SS_Anne_B1F_Rooms_Sailor_A": 0x39e5c, + "Trainer_Party_SS_Anne_B1F_Rooms_Sailor_B": 0x39e5f, + "Trainer_Party_SS_Anne_B1F_Rooms_Sailor_C": 0x39e64, + "Trainer_Party_SS_Anne_B1F_Rooms_Sailor_D": 0x39e68, + "Trainer_Party_SS_Anne_B1F_Rooms_Sailor_E": 0x39e6d, + "Trainer_Party_Vermilion_Gym_Sailor_A": 0x39e70, + "Trainer_Party_Pewter_Gym_JrTrainerM_A": 0x39e74, + "Trainer_Party_Route_24_JrTrainerM_A": 0x39e78, + "Trainer_Party_Route_24_JrTrainerM_C": 0x39e7c, + "Trainer_Party_Route_6_JrTrainerM_A": 0x39e7f, + "Trainer_Party_Route_6_JrTrainerM_B": 0x39e82, + "Trainer_Party_Route_25_JrTrainerM_A": 0x39e86, + "Trainer_Party_Route_9_JrTrainerM_A": 0x39e8a, + "Trainer_Party_Route_9_JrTrainerM_B": 0x39e8e, + "Trainer_Party_Route_12_JrTrainerM_A": 0x39e94, + "Trainer_Party_Cerulean_Gym_JrTrainerF_A": 0x39e98, + "Trainer_Party_Route_6_JrTrainerF_A": 0x39e9b, + "Trainer_Party_Route_6_JrTrainerF_B": 0x39e9f, + "Trainer_Party_Route_9_JrTrainerF_A": 0x39ea7, + "Trainer_Party_Route_9_JrTrainerF_B": 0x39ead, + "Trainer_Party_Route_10_JrTrainerF_A": 0x39eb0, + "Trainer_Party_Route_10_JrTrainerF_B": 0x39eb4, + "Trainer_Party_Rock_Tunnel_B1F_JrTrainerF_A": 0x39eb8, + "Trainer_Party_Rock_Tunnel_B1F_JrTrainerF_B": 0x39ebd, + "Trainer_Party_Celadon_Gym_JrTrainerF_A": 0x39ec1, + "Trainer_Party_Route_13_JrTrainerF_A": 0x39ec5, + "Trainer_Party_Route_13_JrTrainerF_B": 0x39ecc, + "Trainer_Party_Route_13_JrTrainerF_C": 0x39ed0, + "Trainer_Party_Route_13_JrTrainerF_D": 0x39ed6, + "Trainer_Party_Route_20_JrTrainerF_A": 0x39edb, + "Trainer_Party_Rock_Tunnel_1F_JrTrainerF_A": 0x39edf, + "Trainer_Party_Rock_Tunnel_1F_JrTrainerF_B": 0x39ee3, + "Trainer_Party_Rock_Tunnel_1F_JrTrainerF_C": 0x39ee8, + "Trainer_Party_Route_15_JrTrainerF_A": 0x39eee, + "Trainer_Party_Route_15_JrTrainerF_B": 0x39ef3, + "Trainer_Party_Route_15_JrTrainerF_C": 0x39ef7, + "Trainer_Party_Route_15_JrTrainerF_D": 0x39efa, + "Trainer_Party_Route_20_JrTrainerF_C": 0x39eff, + "Trainer_Party_Route_10_Pokemaniac_A": 0x39f04, + "Trainer_Party_Route_10_Pokemaniac_B": 0x39f08, + "Trainer_Party_Rock_Tunnel_B1F_Pokemaniac_A": 0x39f0c, + "Trainer_Party_Rock_Tunnel_B1F_Pokemaniac_B": 0x39f11, + "Trainer_Party_Rock_Tunnel_B1F_Pokemaniac_C": 0x39f15, + "Trainer_Party_Victory_Road_2F_Pokemaniac_A": 0x39f18, + "Trainer_Party_Rock_Tunnel_1F_Pokemaniac_A": 0x39f1d, + "Trainer_Party_Mt_Moon_1F_SuperNerd_A": 0x39f21, + "Trainer_Party_Mt_Moon_B2F_SuperNerd_A": 0x39f25, + "Trainer_Party_Route_8_SuperNerd_A": 0x39f2a, + "Trainer_Party_Route_8_SuperNerd_B": 0x39f30, + "Trainer_Party_Route_8_SuperNerd_C": 0x39f35, + "Trainer_Party_Cinnabar_Gym_SuperNerd_A": 0x39f47, + "Trainer_Party_Cinnabar_Gym_SuperNerd_B": 0x39f4c, + "Trainer_Party_Cinnabar_Gym_SuperNerd_C": 0x39f52, + "Trainer_Party_Cinnabar_Gym_SuperNerd_D": 0x39f55, + "Trainer_Party_Mt_Moon_1F_Hiker_A": 0x39f59, + "Trainer_Party_Route_25_Hiker_A": 0x39f5e, + "Trainer_Party_Route_25_Hiker_B": 0x39f62, + "Trainer_Party_Route_25_Hiker_C": 0x39f68, + "Trainer_Party_Route_9_Hiker_A": 0x39f6b, + "Trainer_Party_Route_9_Hiker_B": 0x39f6f, + "Trainer_Party_Route_10_Hiker_A": 0x39f74, + "Trainer_Party_Route_10_Hiker_B": 0x39f78, + "Trainer_Party_Rock_Tunnel_B1F_Hiker_A": 0x39f7c, + "Trainer_Party_Rock_Tunnel_B1F_Hiker_B": 0x39f81, + "Trainer_Party_Route_9_Hiker_D": 0x39f84, + "Trainer_Party_Rock_Tunnel_1F_Hiker_A": 0x39f88, + "Trainer_Party_Rock_Tunnel_1F_Hiker_B": 0x39f8e, + "Trainer_Party_Rock_Tunnel_1F_Hiker_C": 0x39f93, + "Trainer_Party_Rock_Tunnel_B1F_Hiker_D": 0x39f97, + "Trainer_Party_Route_13_Biker_A": 0x39f9b, + "Trainer_Party_Route_14_Biker_A": 0x39fa0, + "Trainer_Party_Route_15_Biker_A": 0x39fa4, + "Trainer_Party_Route_15_Biker_B": 0x39fab, + "Trainer_Party_Route_16_Biker_A": 0x39fb0, + "Trainer_Party_Route_16_Biker_B": 0x39fb4, + "Trainer_Party_Route_16_Biker_C": 0x39fb7, + "Trainer_Party_Route_17_Biker_A": 0x39fbd, + "Trainer_Party_Route_17_Biker_B": 0x39fc2, + "Trainer_Party_Route_17_Biker_C": 0x39fc5, + "Trainer_Party_Route_17_Biker_D": 0x39fc9, + "Trainer_Party_Route_17_Biker_E": 0x39fcd, + "Trainer_Party_Route_14_Biker_C": 0x39fd4, + "Trainer_Party_Route_14_Biker_D": 0x39fda, + "Trainer_Party_Route_14_Biker_E": 0x39fdf, + "Trainer_Party_Cinnabar_Gym_Burglar_A": 0x39fef, + "Trainer_Party_Cinnabar_Gym_Burglar_B": 0x39ff4, + "Trainer_Party_Cinnabar_Gym_Burglar_C": 0x39ff7, + "Trainer_Party_Mansion_2F_Burglar_A": 0x39ffb, + "Trainer_Party_Mansion_3F_Burglar_A": 0x39fff, + "Trainer_Party_Mansion_B1F_Burglar_A": 0x3a002, + "Trainer_Party_Route_11_Engineer_A": 0x3a00a, + "Trainer_Party_Route_11_Engineer_B": 0x3a00d, + "Trainer_Party_SS_Anne_2F_Rooms_Fisher_A": 0x3a012, + "Trainer_Party_SS_Anne_B1F_Rooms_Fisher_A": 0x3a017, + "Trainer_Party_Route_12_Fisher_A": 0x3a01c, + "Trainer_Party_Route_12_Fisher_B": 0x3a021, + "Trainer_Party_Route_12_Fisher_C": 0x3a025, + "Trainer_Party_Route_12_Fisher_D": 0x3a028, + "Trainer_Party_Route_21_Fisher_A": 0x3a02e, + "Trainer_Party_Route_21_Fisher_B": 0x3a034, + "Trainer_Party_Route_21_Fisher_C": 0x3a038, + "Trainer_Party_Route_21_Fisher_D": 0x3a040, + "Trainer_Party_Route_12_Fisher_F": 0x3a044, + "Trainer_Party_Cerulean_Gym_Swimmer_A": 0x3a048, + "Trainer_Party_Route_19_Swimmer_A": 0x3a04c, + "Trainer_Party_Route_19_Swimmer_B": 0x3a050, + "Trainer_Party_Route_19_Swimmer_C": 0x3a055, + "Trainer_Party_Route_19_Swimmer_D": 0x3a059, + "Trainer_Party_Route_19_Swimmer_E": 0x3a05f, + "Trainer_Party_Route_19_Swimmer_F": 0x3a064, + "Trainer_Party_Route_19_Swimmer_G": 0x3a068, + "Trainer_Party_Route_20_Swimmer_A": 0x3a06f, + "Trainer_Party_Route_20_Swimmer_B": 0x3a073, + "Trainer_Party_Route_20_Swimmer_C": 0x3a076, + "Trainer_Party_Route_21_Swimmer_A": 0x3a07c, + "Trainer_Party_Route_21_Swimmer_B": 0x3a080, + "Trainer_Party_Route_21_Swimmer_C": 0x3a083, + "Trainer_Party_Route_21_Swimmer_D": 0x3a087, + "Trainer_Party_Route_16_CueBall_A": 0x3a08c, + "Trainer_Party_Route_16_CueBall_B": 0x3a091, + "Trainer_Party_Route_16_CueBall_C": 0x3a095, + "Trainer_Party_Route_17_CueBall_A": 0x3a098, + "Trainer_Party_Route_17_CueBall_B": 0x3a09c, + "Trainer_Party_Route_17_CueBall_C": 0x3a0a0, + "Trainer_Party_Route_17_CueBall_D": 0x3a0a3, + "Trainer_Party_Route_17_CueBall_E": 0x3a0a9, + "Trainer_Party_Route_21_CueBall_A": 0x3a0ad, + "Trainer_Party_Route_11_Gambler_A": 0x3a0b2, + "Trainer_Party_Route_11_Gambler_B": 0x3a0b6, + "Trainer_Party_Route_11_Gambler_C": 0x3a0ba, + "Trainer_Party_Route_11_Gambler_D": 0x3a0be, + "Trainer_Party_Route_8_Gambler_A": 0x3a0c2, + "Trainer_Party_Route_8_Gambler_C": 0x3a0cc, + "Trainer_Party_Celadon_Gym_Beauty_A": 0x3a0d0, + "Trainer_Party_Celadon_Gym_Beauty_B": 0x3a0d6, + "Trainer_Party_Celadon_Gym_Beauty_C": 0x3a0da, + "Trainer_Party_Route_13_Beauty_A": 0x3a0dd, + "Trainer_Party_Route_13_Beauty_B": 0x3a0e2, + "Trainer_Party_Route_20_Beauty_A": 0x3a0e6, + "Trainer_Party_Route_20_Beauty_B": 0x3a0e9, + "Trainer_Party_Route_20_Beauty_C": 0x3a0ee, + "Trainer_Party_Route_15_Beauty_A": 0x3a0f2, + "Trainer_Party_Route_15_Beauty_B": 0x3a0f6, + "Trainer_Party_Route_19_Beauty_A": 0x3a0ff, + "Trainer_Party_Route_19_Beauty_B": 0x3a106, + "Trainer_Party_Route_19_Beauty_C": 0x3a10a, + "Trainer_Party_Route_20_Beauty_E": 0x3a10f, + "Trainer_Party_Saffron_Gym_Psychic_A": 0x3a114, + "Trainer_Party_Saffron_Gym_Psychic_B": 0x3a11a, + "Trainer_Party_Saffron_Gym_Psychic_C": 0x3a11e, + "Trainer_Party_Saffron_Gym_Psychic_D": 0x3a123, + "Trainer_Party_Vermilion_Gym_Rocker_A": 0x3a126, + "Trainer_Party_Route_12_Rocker_A": 0x3a12b, + "Trainer_Party_Silph_Co_5F_Juggler_A": 0x3a12f, + "Trainer_Party_Victory_Road_2F_Juggler_A": 0x3a133, + "Trainer_Party_Fuchsia_Gym_Juggler_A": 0x3a139, + "Trainer_Party_Fuchsia_Gym_Juggler_B": 0x3a13f, + "Trainer_Party_Victory_Road_2F_Juggler_C": 0x3a143, + "Trainer_Party_Fuchsia_Gym_Juggler_D": 0x3a149, + "Trainer_Party_Fuchsia_Gym_Juggler_E": 0x3a14c, + "Trainer_Party_Fuchsia_Gym_Tamer_A": 0x3a150, + "Trainer_Party_Fuchsia_Gym_Tamer_B": 0x3a154, + "Trainer_Party_Viridian_Gym_Tamer_A": 0x3a159, + "Trainer_Party_Viridian_Gym_Tamer_B": 0x3a15c, + "Trainer_Party_Victory_Road_2F_Tamer_A": 0x3a160, + "Trainer_Party_Route_13_BirdKeeper_A": 0x3a16a, + "Trainer_Party_Route_13_BirdKeeper_B": 0x3a16e, + "Trainer_Party_Route_13_BirdKeeper_C": 0x3a175, + "Trainer_Party_Route_14_BirdKeeper_A": 0x3a17b, + "Trainer_Party_Route_14_BirdKeeper_B": 0x3a17e, + "Trainer_Party_Route_15_BirdKeeper_A": 0x3a182, + "Trainer_Party_Route_15_BirdKeeper_B": 0x3a188, + "Trainer_Party_Route_18_BirdKeeper_A": 0x3a18d, + "Trainer_Party_Route_18_BirdKeeper_B": 0x3a191, + "Trainer_Party_Route_18_BirdKeeper_C": 0x3a194, + "Trainer_Party_Route_20_BirdKeeper_A": 0x3a19a, + "Trainer_Party_Route_14_BirdKeeper_D": 0x3a1a9, + "Trainer_Party_Route_14_BirdKeeper_E": 0x3a1ae, + "Trainer_Party_Route_14_BirdKeeper_F": 0x3a1b4, + "Trainer_Party_Route_14_BirdKeeper_G": 0x3a1b8, + "Trainer_Party_Fighting_Dojo_Blackbelt_A": 0x3a1bd, + "Trainer_Party_Fighting_Dojo_Blackbelt_B": 0x3a1c1, + "Trainer_Party_Fighting_Dojo_Blackbelt_C": 0x3a1c6, + "Trainer_Party_Fighting_Dojo_Blackbelt_D": 0x3a1ca, + "Trainer_Party_Fighting_Dojo_Blackbelt_E": 0x3a1cd, + "Trainer_Party_Viridian_Gym_Blackbelt_A": 0x3a1d2, + "Trainer_Party_Viridian_Gym_Blackbelt_B": 0x3a1d6, + "Trainer_Party_Viridian_Gym_Blackbelt_C": 0x3a1d9, + "Trainer_Party_Victory_Road_2F_Blackbelt_A": 0x3a1de, + "Rival_Starter2_A": 0x3a1e4, + "Trainer_Party_Pallet_Town_Green1_A": 0x3a1e3, + "Trainer_Party_Pallet_Town_Green1_B": 0x3a1e6, + "Rival_Starter3_A": 0x3a1e7, + "Trainer_Party_Pallet_Town_Green1_C": 0x3a1e9, + "Rival_Starter1_A": 0x3a1ea, + "Trainer_Party_Route_22_Green1_A": 0x3a1ec, + "Rival_Starter2_B": 0x3a1f0, + "Rival_Starter3_B": 0x3a1f6, + "Trainer_Party_Route_22_Green1_B": 0x3a1f2, + "Rival_Starter1_B": 0x3a1fc, + "Trainer_Party_Route_22_Green1_C": 0x3a1f8, + "Trainer_Party_Cerulean_City_Green1_A": 0x3a1fe, + "Rival_Starter2_C": 0x3a206, + "Rival_Starter3_C": 0x3a210, + "Trainer_Party_Cerulean_City_Green1_B": 0x3a208, + "Rival_Starter1_C": 0x3a21a, + "Trainer_Party_Cerulean_City_Green1_C": 0x3a212, + "Trainer_Party_Mansion_1F_Scientist_A": 0x3a240, + "Trainer_Party_Silph_Co_2F_Scientist_A": 0x3a244, + "Trainer_Party_Silph_Co_2F_Scientist_B": 0x3a24a, + "Trainer_Party_Silph_Co_3F_Scientist_A": 0x3a24f, + "Trainer_Party_Silph_Co_4F_Scientist_A": 0x3a253, + "Trainer_Party_Silph_Co_5F_Scientist_A": 0x3a256, + "Trainer_Party_Silph_Co_6F_Scientist_A": 0x3a25c, + "Trainer_Party_Silph_Co_7F_Scientist_A": 0x3a263, + "Trainer_Party_Silph_Co_8F_Scientist_A": 0x3a267, + "Trainer_Party_Silph_Co_9F_Scientist_A": 0x3a26b, + "Trainer_Party_Silph_Co_10F_Scientist_A": 0x3a270, + "Trainer_Party_Mansion_3F_Scientist_A": 0x3a274, + "Trainer_Party_Mansion_B1F_Scientist_A": 0x3a279, + "Trainer_Party_Rocket_Hideout_B4F_Giovanni_A": 0x3a27d, + "Trainer_Party_Silph_Co_11F_Giovanni_A": 0x3a285, + "Trainer_Party_Viridian_Gym_Giovanni_A": 0x3a28f, + "Trainer_Party_Mt_Moon_B2F_Rocket_A": 0x3a29b, + "Trainer_Party_Mt_Moon_B2F_Rocket_B": 0x3a29f, + "Trainer_Party_Mt_Moon_B2F_Rocket_C": 0x3a2a4, + "Trainer_Party_Mt_Moon_B2F_Rocket_D": 0x3a2a8, + "Trainer_Party_Cerulean_City_Rocket_A": 0x3a2ab, + "Trainer_Party_Route_24_Rocket_A": 0x3a2af, + "Trainer_Party_Game_Corner_Rocket_A": 0x3a2b3, + "Trainer_Party_Rocket_Hideout_B1F_Rocket_A": 0x3a2b7, + "Trainer_Party_Rocket_Hideout_B1F_Rocket_B": 0x3a2bb, + "Trainer_Party_Rocket_Hideout_B1F_Rocket_C": 0x3a2bf, + "Trainer_Party_Rocket_Hideout_B1F_Rocket_D": 0x3a2c4, + "Trainer_Party_Rocket_Hideout_B1F_Rocket_E": 0x3a2ca, + "Trainer_Party_Rocket_Hideout_B2F_Rocket_A": 0x3a2ce, + "Trainer_Party_Rocket_Hideout_B3F_Rocket_A": 0x3a2d5, + "Trainer_Party_Rocket_Hideout_B3F_Rocket_B": 0x3a2da, + "Trainer_Party_Rocket_Hideout_B4F_Rocket_A": 0x3a2de, + "Trainer_Party_Rocket_Hideout_B4F_Rocket_B": 0x3a2e3, + "Trainer_Party_Rocket_Hideout_B4F_Rocket_C": 0x3a2e8, + "Trainer_Party_Pokemon_Tower_7F_Rocket_A": 0x3a2ec, + "Trainer_Party_Pokemon_Tower_7F_Rocket_B": 0x3a2f1, + "Trainer_Party_Pokemon_Tower_7F_Rocket_C": 0x3a2f5, + "Trainer_Party_Silph_Co_2F_Rocket_A": 0x3a2ff, + "Trainer_Party_Silph_Co_2F_Rocket_B": 0x3a303, + "Trainer_Party_Silph_Co_3F_Rocket_A": 0x3a30a, + "Trainer_Party_Silph_Co_4F_Rocket_A": 0x3a30f, + "Trainer_Party_Silph_Co_4F_Rocket_B": 0x3a313, + "Trainer_Party_Silph_Co_5F_Rocket_A": 0x3a318, + "Trainer_Party_Silph_Co_5F_Rocket_B": 0x3a31b, + "Trainer_Party_Silph_Co_6F_Rocket_A": 0x3a31e, + "Trainer_Party_Silph_Co_6F_Rocket_B": 0x3a322, + "Trainer_Party_Silph_Co_7F_Rocket_A": 0x3a327, + "Trainer_Party_Silph_Co_7F_Rocket_B": 0x3a32d, + "Trainer_Party_Silph_Co_7F_Rocket_C": 0x3a331, + "Trainer_Party_Silph_Co_8F_Rocket_A": 0x3a335, + "Trainer_Party_Silph_Co_8F_Rocket_B": 0x3a33b, + "Trainer_Party_Silph_Co_9F_Rocket_A": 0x3a340, + "Trainer_Party_Silph_Co_9F_Rocket_B": 0x3a345, + "Trainer_Party_Silph_Co_10F_Rocket_A": 0x3a34a, + "Trainer_Party_Silph_Co_11F_Rocket_A": 0x3a34d, + "Trainer_Party_Silph_Co_11F_Rocket_B": 0x3a354, + "Trainer_Party_Viridian_Gym_CooltrainerM_A": 0x3a359, + "Trainer_Party_Victory_Road_3F_CooltrainerM_A": 0x3a35d, + "Trainer_Party_Victory_Road_3F_CooltrainerM_B": 0x3a362, + "Trainer_Party_Victory_Road_1F_CooltrainerM_A": 0x3a36b, + "Trainer_Party_Viridian_Gym_CooltrainerM_C": 0x3a37d, + "Trainer_Party_Viridian_Gym_CooltrainerM_D": 0x3a381, + "Trainer_Party_Celadon_Gym_CooltrainerF_A": 0x3a384, + "Trainer_Party_Victory_Road_3F_CooltrainerF_A": 0x3a389, + "Trainer_Party_Victory_Road_3F_CooltrainerF_B": 0x3a38e, + "Trainer_Party_Victory_Road_1F_CooltrainerF_A": 0x3a397, + "Trainer_Party_Bruno_A": 0x3a3a8, + "Trainer_Party_Brock_A": 0x3a3b4, + "Trainer_Party_Misty_A": 0x3a3ba, + "Trainer_Party_LtSurge_A": 0x3a3c0, + "Trainer_Party_Erika_A": 0x3a3c8, + "Trainer_Party_Koga_A": 0x3a3d0, + "Trainer_Party_Blaine_A": 0x3a3da, + "Trainer_Party_Sabrina_A": 0x3a3e4, + "Trainer_Party_SS_Anne_1F_Rooms_Gentleman_A": 0x3a3ee, + "Trainer_Party_SS_Anne_1F_Rooms_Gentleman_B": 0x3a3f2, + "Trainer_Party_SS_Anne_2F_Rooms_Gentleman_A": 0x3a3f6, + "Trainer_Party_Vermilion_Gym_Gentleman_A": 0x3a3f9, + "Trainer_Party_SS_Anne_2F_Rooms_Gentleman_C": 0x3a3fc, + "Trainer_Party_SS_Anne_2F_Green2_A": 0x3a400, + "Rival_Starter2_D": 0x3a408, + "Trainer_Party_SS_Anne_2F_Green2_B": 0x3a40a, + "Rival_Starter3_D": 0x3a412, + "Rival_Starter1_D": 0x3a41c, + "Trainer_Party_SS_Anne_2F_Green2_C": 0x3a414, + "Trainer_Party_Pokemon_Tower_2F_Green2_A": 0x3a41e, + "Rival_Starter2_E": 0x3a428, + "Trainer_Party_Pokemon_Tower_2F_Green2_B": 0x3a42a, + "Rival_Starter3_E": 0x3a434, + "Trainer_Party_Pokemon_Tower_2F_Green2_C": 0x3a436, + "Rival_Starter1_E": 0x3a440, + "Rival_Starter2_F": 0x3a44c, + "Trainer_Party_Silph_Co_7F_Green2_A": 0x3a442, + "Rival_Starter3_F": 0x3a458, + "Trainer_Party_Silph_Co_7F_Green2_B": 0x3a44e, + "Trainer_Party_Silph_Co_7F_Green2_C": 0x3a45a, + "Rival_Starter1_F": 0x3a464, + "Rival_Starter2_G": 0x3a472, + "Trainer_Party_Route_22_Green2_A": 0x3a466, + "Trainer_Party_Route_22_Green2_B": 0x3a474, + "Rival_Starter3_G": 0x3a480, + "Rival_Starter1_G": 0x3a48e, + "Trainer_Party_Route_22_Green2_C": 0x3a482, + "Trainer_Party_Indigo_Plateau_Green3_A": 0x3a490, + "Rival_Starter2_H": 0x3a49c, + "Rival_Starter3_H": 0x3a4aa, + "Trainer_Party_Indigo_Plateau_Green3_B": 0x3a49e, + "Rival_Starter1_H": 0x3a4b8, + "Trainer_Party_Indigo_Plateau_Green3_C": 0x3a4ac, + "Trainer_Party_Lorelei_A": 0x3a4ba, + "Trainer_Party_Pokemon_Tower_3F_Channeler_A": 0x3a4d3, + "Trainer_Party_Pokemon_Tower_3F_Channeler_B": 0x3a4d6, + "Trainer_Party_Pokemon_Tower_3F_Channeler_D": 0x3a4dc, + "Trainer_Party_Pokemon_Tower_4F_Channeler_A": 0x3a4df, + "Trainer_Party_Pokemon_Tower_4F_Channeler_B": 0x3a4e2, + "Trainer_Party_Pokemon_Tower_4F_Channeler_D": 0x3a4e9, + "Trainer_Party_Pokemon_Tower_5F_Channeler_A": 0x3a4ef, + "Trainer_Party_Pokemon_Tower_5F_Channeler_C": 0x3a4f5, + "Trainer_Party_Pokemon_Tower_5F_Channeler_D": 0x3a4f8, + "Trainer_Party_Pokemon_Tower_5F_Channeler_E": 0x3a4fb, + "Trainer_Party_Pokemon_Tower_6F_Channeler_A": 0x3a4fe, + "Trainer_Party_Pokemon_Tower_6F_Channeler_B": 0x3a503, + "Trainer_Party_Pokemon_Tower_6F_Channeler_C": 0x3a506, + "Trainer_Party_Saffron_Gym_Channeler_A": 0x3a509, + "Trainer_Party_Saffron_Gym_Channeler_B": 0x3a50d, + "Trainer_Party_Saffron_Gym_Channeler_C": 0x3a510, + "Trainer_Party_Agatha_A": 0x3a515, + "Trainer_Party_Lance_A": 0x3a521, + "Learnset_Rhydon": 0x3b1d8, + "Learnset_Kangaskhan": 0x3b1e6, + "Learnset_NidoranM": 0x3b1f5, + "Learnset_Clefairy": 0x3b207, + "Learnset_Spearow": 0x3b218, + "Learnset_Voltorb": 0x3b227, + "Learnset_Nidoking": 0x3b233, + "Learnset_Slowbro": 0x3b23b, + "Learnset_Ivysaur": 0x3b24e, + "Learnset_Exeggutor": 0x3b25e, + "Learnset_Lickitung": 0x3b262, + "Learnset_Exeggcute": 0x3b272, + "Learnset_Grimer": 0x3b283, + "Learnset_Gengar": 0x3b291, + "Learnset_NidoranF": 0x3b29a, + "Learnset_Nidoqueen": 0x3b2a8, + "Learnset_Cubone": 0x3b2b3, + "Learnset_Rhyhorn": 0x3b2c2, + "Learnset_Lapras": 0x3b2d0, + "Learnset_Mew": 0x3b2e0, + "Learnset_Gyarados": 0x3b2ea, + "Learnset_Shellder": 0x3b2fa, + "Learnset_Tentacool": 0x3b309, + "Learnset_Gastly": 0x3b31e, + "Learnset_Scyther": 0x3b324, + "Learnset_Staryu": 0x3b336, + "Learnset_Blastoise": 0x3b346, + "Learnset_Pinsir": 0x3b354, + "Learnset_Tangela": 0x3b362, + "Learnset_Growlithe": 0x3b378, + "Learnset_Onix": 0x3b384, + "Learnset_Fearow": 0x3b390, + "Learnset_Pidgey": 0x3b39f, + "Learnset_Slowpoke": 0x3b3b0, + "Learnset_Kadabra": 0x3b3c8, + "Learnset_Graveler": 0x3b3e0, + "Learnset_Chansey": 0x3b3ee, + "Learnset_Machoke": 0x3b406, + "Learnset_MrMime": 0x3b412, + "Learnset_Hitmonlee": 0x3b41e, + "Learnset_Hitmonchan": 0x3b42a, + "Learnset_Arbok": 0x3b436, + "Learnset_Parasect": 0x3b442, + "Learnset_Psyduck": 0x3b451, + "Learnset_Drowzee": 0x3b460, + "Learnset_Golem": 0x3b46e, + "Learnset_Magmar": 0x3b47e, + "Learnset_Electabuzz": 0x3b48e, + "Learnset_Magneton": 0x3b49a, + "Learnset_Koffing": 0x3b4ab, + "Learnset_Mankey": 0x3b4bc, + "Learnset_Seel": 0x3b4cb, + "Learnset_Diglett": 0x3b4da, + "Learnset_Tauros": 0x3b4e6, + "Learnset_Farfetchd": 0x3b4f8, + "Learnset_Venonat": 0x3b507, + "Learnset_Dragonite": 0x3b515, + "Learnset_Doduo": 0x3b52a, + "Learnset_Poliwag": 0x3b53b, + "Learnset_Jynx": 0x3b549, + "Learnset_Moltres": 0x3b557, + "Learnset_Articuno": 0x3b55f, + "Learnset_Zapdos": 0x3b567, + "Learnset_Meowth": 0x3b574, + "Learnset_Krabby": 0x3b583, + "Learnset_Vulpix": 0x3b599, + "Learnset_Pikachu": 0x3b5ab, + "Learnset_Dratini": 0x3b5c0, + "Learnset_Dragonair": 0x3b5cf, + "Learnset_Kabuto": 0x3b5de, + "Learnset_Kabutops": 0x3b5e8, + "Learnset_Horsea": 0x3b5f5, + "Learnset_Seadra": 0x3b601, + "Learnset_Sandshrew": 0x3b614, + "Learnset_Sandslash": 0x3b620, + "Learnset_Omanyte": 0x3b62f, + "Learnset_Omastar": 0x3b639, + "Learnset_Jigglypuff": 0x3b647, + "Learnset_Eevee": 0x3b665, + "Learnset_Flareon": 0x3b66f, + "Learnset_Jolteon": 0x3b681, + "Learnset_Vaporeon": 0x3b693, + "Learnset_Machop": 0x3b6a8, + "Learnset_Zubat": 0x3b6b7, + "Learnset_Ekans": 0x3b6c6, + "Learnset_Paras": 0x3b6d5, + "Learnset_Poliwhirl": 0x3b6e5, + "Learnset_Poliwrath": 0x3b6f3, + "Learnset_Beedrill": 0x3b703, + "Learnset_Dodrio": 0x3b713, + "Learnset_Primeape": 0x3b721, + "Learnset_Dugtrio": 0x3b72d, + "Learnset_Venomoth": 0x3b739, + "Learnset_Dewgong": 0x3b747, + "Learnset_Butterfree": 0x3b761, + "Learnset_Machamp": 0x3b771, + "Learnset_Golduck": 0x3b77f, + "Learnset_Hypno": 0x3b78b, + "Learnset_Golbat": 0x3b799, + "Learnset_Mewtwo": 0x3b7a5, + "Learnset_Snorlax": 0x3b7b1, + "Learnset_Magikarp": 0x3b7be, + "Learnset_Muk": 0x3b7c6, + "Learnset_Kingler": 0x3b7d6, + "Learnset_Cloyster": 0x3b7e2, + "Learnset_Electrode": 0x3b7e8, + "Learnset_Weezing": 0x3b7f6, + "Learnset_Persian": 0x3b802, + "Learnset_Marowak": 0x3b80e, + "Learnset_Haunter": 0x3b826, + "Learnset_Alakazam": 0x3b831, + "Learnset_Pidgeotto": 0x3b842, + "Learnset_Pidgeot": 0x3b850, + "Learnset_Bulbasaur": 0x3b863, + "Learnset_Venusaur": 0x3b873, + "Learnset_Tentacruel": 0x3b883, + "Learnset_Goldeen": 0x3b89a, + "Learnset_Seaking": 0x3b8a8, + "Learnset_Ponyta": 0x3b8c1, + "Learnset_Rapidash": 0x3b8cf, + "Learnset_Rattata": 0x3b8e0, + "Learnset_Raticate": 0x3b8ea, + "Learnset_Nidorino": 0x3b8f8, + "Learnset_Nidorina": 0x3b90a, + "Learnset_Geodude": 0x3b91b, + "Learnset_Porygon": 0x3b929, + "Learnset_Aerodactyl": 0x3b933, + "Learnset_Magnemite": 0x3b942, + "Learnset_Charmander": 0x3b957, + "Learnset_Squirtle": 0x3b968, + "Learnset_Charmeleon": 0x3b979, + "Learnset_Wartortle": 0x3b98a, + "Learnset_Charizard": 0x3b998, + "Learnset_Oddish": 0x3b9b1, + "Learnset_Gloom": 0x3b9c3, + "Learnset_Vileplume": 0x3b9d1, + "Learnset_Bellsprout": 0x3b9dc, + "Learnset_Weepinbell": 0x3b9f0, + "Learnset_Victreebel": 0x3ba00, + "Option_Fix_Combat_Bugs_Heal_Effect": 0x3ba23, + "Option_Fix_Combat_Bugs_Struggle": 0x3d45d, + "Option_Fix_Combat_Bugs_Dig_Fly": 0x3d994, + "Option_Fix_Combat_Bugs_Focus_Energy": 0x3e0a1, + "Option_Always_Half_STAB": 0x3e423, + "Type_Chart": 0x3e516, + "Option_Fix_Combat_Bugs_HP_Drain_Dream_Eater": 0x3e7e7, + "Ghost_Battle3": 0x3f1e4, + "Warps_LavenderTown": 0x44031, + "Dexsanity_Items": 0x44252, + "Option_Dexsanity_A": 0x442ff, + "Require_Pokedex_B": 0x44303, + "Option_Dexsanity_B": 0x44363, + "Require_Pokedex_C": 0x44367, + "Warps_ViridianPokecenter": 0x444ac, + "Trainersanity_EVENT_BEAT_MANSION_1_TRAINER_0_ITEM": 0x44597, + "Warps_PokemonMansion1F": 0x44600, + "Missable_Pokemon_Mansion_1F_Item_1": 0x4462e, + "Missable_Pokemon_Mansion_1F_Item_2": 0x44635, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_0_ITEM": 0x4476a, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_1_ITEM": 0x44778, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_2_ITEM": 0x44786, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_3_ITEM": 0x44794, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_4_ITEM": 0x447a2, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_5_ITEM": 0x447b0, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_6_ITEM": 0x447be, + "Warps_RockTunnel1F": 0x44860, + "Map_Rock_Tunnel1F": 0x448db, + "Warps_SeafoamIslands1F": 0x44ab4, + "Warps_SSAnne3F": 0x44ba1, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_0_ITEM": 0x44ca6, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_1_ITEM": 0x44cb4, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_2_ITEM": 0x44cc2, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_3_ITEM": 0x44cd0, + "Warps_VictoryRoad3F": 0x44d3a, + "Missable_Victory_Road_3F_Item_1": 0x44d70, + "Missable_Victory_Road_3F_Item_2": 0x44d77, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_0_ITEM": 0x44e98, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_1_ITEM": 0x44ea6, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_2_ITEM": 0x44eb4, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_3_ITEM": 0x44ec2, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_4_ITEM": 0x44ed0, + "Warps_RocketHideoutB1F": 0x44f5e, + "Missable_Rocket_Hideout_B1F_Item_1": 0x44fa0, + "Missable_Rocket_Hideout_B1F_Item_2": 0x44fa7, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_2_TRAINER_0_ITEM": 0x45351, + "Warps_RocketHideoutB2F": 0x45370, + "Missable_Rocket_Hideout_B2F_Item_1": 0x45392, + "Missable_Rocket_Hideout_B2F_Item_2": 0x45399, + "Missable_Rocket_Hideout_B2F_Item_3": 0x453a0, + "Missable_Rocket_Hideout_B2F_Item_4": 0x453a7, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_0_ITEM": 0x45584, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_1_ITEM": 0x45592, + "Warps_RocketHideoutB3F": 0x455ca, + "Missable_Rocket_Hideout_B3F_Item_1": 0x455e8, + "Missable_Rocket_Hideout_B3F_Item_2": 0x455ef, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_0_ITEM": 0x4579b, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_1_ITEM": 0x457a9, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_2_ITEM": 0x457b7, + "Warps_RocketHideoutB4F": 0x45874, + "Missable_Rocket_Hideout_B4F_Item_1": 0x458a6, + "Missable_Rocket_Hideout_B4F_Item_2": 0x458ad, + "Missable_Rocket_Hideout_B4F_Item_3": 0x458b4, + "Missable_Rocket_Hideout_B4F_Item_4": 0x458bb, + "Missable_Rocket_Hideout_B4F_Item_5": 0x458c2, + "RocketHideoutElevatorWarpMaps": 0x459d8, + "Warps_RocketHideoutElevator": 0x45a12, + "SilphCoElevatorWarpMaps": 0x45a8e, + "Option_Locked_Elevator_Silph": 0x45ab6, + "Warps_SilphCoElevator": 0x45aee, + "Warps_SafariZoneEast": 0x45b35, + "Missable_Safari_Zone_East_Item_1": 0x45b58, + "Missable_Safari_Zone_East_Item_2": 0x45b5f, + "Missable_Safari_Zone_East_Item_3": 0x45b66, + "Missable_Safari_Zone_East_Item_4": 0x45b6d, + "Warps_SafariZoneNorth": 0x45c7f, + "Missable_Safari_Zone_North_Item_1": 0x45cb8, + "Missable_Safari_Zone_North_Item_2": 0x45cbf, + "Warps_SafariZoneCenter": 0x45e6f, + "Missable_Safari_Zone_Center_Item": 0x45e9f, + "Warps_SafariZoneCenterRestHouse": 0x45fa8, + "Warps_SafariZoneWestRestHouse": 0x45fed, + "Warps_SafariZoneEastRestHouse": 0x46038, + "Warps_SafariZoneNorthRestHouse": 0x46083, + "Warps_CeruleanCave2F": 0x460be, + "Missable_Cerulean_Cave_2F_Item_1": 0x460dc, + "Missable_Cerulean_Cave_2F_Item_2": 0x460e3, + "Missable_Cerulean_Cave_2F_Item_3": 0x460ea, + "Trainersanity_EVENT_BEAT_MEWTWO_ITEM": 0x461c2, + "Warps_CeruleanCaveB1F": 0x461e2, + "Static_Encounter_Mewtwo": 0x461ec, + "Missable_Cerulean_Cave_B1F_Item_1": 0x461f4, + "Missable_Cerulean_Cave_B1F_Item_2": 0x461fb, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_0_ITEM": 0x462d1, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_1_ITEM": 0x462df, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_2_ITEM": 0x462ed, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_3_ITEM": 0x462fb, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_4_ITEM": 0x46309, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_5_ITEM": 0x46317, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_6_ITEM": 0x46325, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_7_ITEM": 0x46333, + "Warps_RockTunnelB1F": 0x46401, + "Missable_Rock_Tunnel_B1F_Item_1": 0x46457, + "Missable_Rock_Tunnel_B1F_Item_2": 0x4645e, + "Missable_Rock_Tunnel_B1F_Item_3": 0x46465, + "Missable_Rock_Tunnel_B1F_Item_4": 0x4646c, + "Map_Rock_TunnelB1F": 0x4647d, + "Warps_SeafoamIslandsB1F": 0x46656, + "Warps_SeafoamIslandsB2F": 0x46792, + "Warps_SeafoamIslandsB3F": 0x46986, + "Trainersanity_EVENT_BEAT_ARTICUNO_ITEM": 0x46b6f, + "Warps_SeafoamIslandsB4F": 0x46b9e, + "Static_Encounter_Articuno": 0x46bc6, + "Hidden_Item_Game_Corner_1": 0x4705e, + "Hidden_Item_Game_Corner_2": 0x47064, + "Hidden_Item_Game_Corner_3": 0x4706a, + "Hidden_Item_Game_Corner_4": 0x47070, + "Hidden_Item_Game_Corner_5": 0x47076, + "Hidden_Item_Game_Corner_6": 0x4707c, + "Hidden_Item_Game_Corner_7": 0x47082, + "Hidden_Item_Game_Corner_8": 0x47088, + "Hidden_Item_Game_Corner_9": 0x4708e, + "Hidden_Item_Game_Corner_10": 0x47094, + "Hidden_Item_Game_Corner_11": 0x4709a, + "Quiz_Answer_A": 0x470ce, + "Quiz_Answer_B": 0x470d4, + "Quiz_Answer_C": 0x470da, + "Quiz_Answer_D": 0x470e0, + "Quiz_Answer_E": 0x470e6, + "Quiz_Answer_F": 0x470ec, + "Hidden_Item_Viridian_Forest_1": 0x47121, + "Hidden_Item_Viridian_Forest_2": 0x47127, + "Hidden_Item_MtMoonB2F_1": 0x4712e, + "Hidden_Item_MtMoonB2F_2": 0x47134, + "Hidden_Item_Route_25_1": 0x47148, + "Hidden_Item_Route_25_2": 0x4714e, + "Hidden_Item_Route_9": 0x47155, + "Hidden_Item_SS_Anne_Kitchen": 0x47168, + "Hidden_Item_SS_Anne_B1F": 0x4716f, + "Hidden_Item_Route_10_1": 0x47176, + "Hidden_Item_Route_10_2": 0x4717c, + "Hidden_Item_Rocket_Hideout_B1F": 0x47183, + "Hidden_Item_Rocket_Hideout_B3F": 0x4718a, + "Hidden_Item_Rocket_Hideout_B4F": 0x47191, + "Hidden_Item_Pokemon_Tower_5F": 0x471a5, + "Hidden_Item_Route_13_1": 0x471ac, + "Hidden_Item_Route_13_2": 0x471b2, + "Hidden_Item_Safari_Zone_West": 0x471c0, + "Hidden_Item_Silph_Co_5F": 0x471c7, + "Hidden_Item_Silph_Co_9F": 0x471ce, + "Hidden_Item_Copycats_House": 0x471d5, + "Hidden_Item_Cerulean_Cave_1F": 0x471dc, + "Hidden_Item_Cerulean_Cave_B1F": 0x471e3, + "Hidden_Item_Power_Plant_1": 0x471ea, + "Hidden_Item_Power_Plant_2": 0x471f0, + "Hidden_Item_Seafoam_Islands_B2F": 0x471f7, + "Hidden_Item_Seafoam_Islands_B4F": 0x471fe, + "Hidden_Item_Pokemon_Mansion_1F": 0x47205, + "Hidden_Item_Pokemon_Mansion_3F": 0x47219, + "Hidden_Item_Pokemon_Mansion_B1F": 0x47226, + "Hidden_Item_Route_23_1": 0x47239, + "Hidden_Item_Route_23_2": 0x4723f, + "Hidden_Item_Route_23_3": 0x47245, + "Hidden_Item_Victory_Road_2F_1": 0x4724c, + "Hidden_Item_Victory_Road_2F_2": 0x47252, + "Hidden_Item_Unused_6F": 0x47259, + "Hidden_Item_Viridian_City": 0x47267, + "Hidden_Item_Route_11": 0x47314, + "Hidden_Item_Route_12": 0x4731b, + "Hidden_Item_Route_17_1": 0x47329, + "Hidden_Item_Route_17_2": 0x4732f, + "Hidden_Item_Route_17_3": 0x47335, + "Hidden_Item_Route_17_4": 0x4733b, + "Hidden_Item_Route_17_5": 0x47341, + "Hidden_Item_Underground_Path_NS_1": 0x47348, + "Hidden_Item_Underground_Path_NS_2": 0x4734e, + "Hidden_Item_Underground_Path_WE_1": 0x47355, + "Hidden_Item_Underground_Path_WE_2": 0x4735b, + "Hidden_Item_Celadon_City": 0x47362, + "Hidden_Item_Seafoam_Islands_B3F": 0x47369, + "Hidden_Item_Vermilion_City": 0x47370, + "Hidden_Item_Cerulean_City": 0x47377, + "Hidden_Item_Route_4": 0x4737e, + "Warps_Route7": 0x48026, + "Warps_RedsHouse1F": 0x48258, + "Event_Counter": 0x482c4, + "Warps_CeladonMart3F": 0x48332, + "Shop_Stones": 0x483da, + "Warps_CeladonMart4F": 0x483e6, + "Event_Thirsty_Girl_Lemonade": 0x484ec, + "Event_Thirsty_Girl_Soda": 0x4850a, + "Event_Thirsty_Girl_Water": 0x48528, + "Warps_CeladonMartRoof": 0x485fd, + "CeladonMartElevatorWarpMaps": 0x4869b, + "Option_Locked_Elevator_Celadon": 0x486b5, + "Warps_CeladonMartElevator": 0x486ed, + "Option_Tea": 0x4872f, + "Event_Mansion_Lady": 0x4873c, + "Warps_CeladonMansion1F": 0x4878f, + "Warps_CeladonMansion2F": 0x48805, + "Warps_CeladonMansion3F": 0x488bd, + "Warps_CeladonMansionRoof": 0x48933, + "Warps_CeladonPokecenter": 0x48990, + "Badge_Celadon_Gym": 0x48a2b, + "Event_Celadon_Gym": 0x48a3f, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_0_ITEM": 0x48a85, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_1_ITEM": 0x48a93, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_2_ITEM": 0x48aa1, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_3_ITEM": 0x48aaf, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_4_ITEM": 0x48abd, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_5_ITEM": 0x48acb, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_6_ITEM": 0x48ad9, + "Warps_CeladonGym": 0x48bfa, + "Event_Game_Corner_Gift_A": 0x48e9a, + "Event_Game_Corner_Gift_C": 0x48f10, + "Event_Game_Corner_Gift_B": 0x48f59, + "Option_Extra_Key_Items_C": 0x48fd8, + "Warps_GameCorner": 0x49109, + "Warps_CeladonMart5F": 0x49200, + "Warps_GameCornerPrizeRoom": 0x49283, + "Event_Gambling_Addict": 0x492f4, + "Warps_CeladonDiner": 0x49331, + "Warps_CeladonChiefHouse": 0x4939c, + "Warps_CeladonHotel": 0x493f6, + "Gift_Magikarp": 0x49491, + "Warps_MtMoonPokecenter": 0x494eb, + "Warps_RockTunnelPokecenter": 0x49549, + "Warps_Route11Gate1F": 0x4958b, + "Option_Aide_Rt11": 0x495ee, + "Event_Rt11_Oaks_Aide": 0x495f2, + "Warps_Route11Gate2F": 0x49657, + "Warps_Route12Gate1F": 0x4968b, + "Event_Mourning_Girl": 0x496eb, + "Warps_Route12Gate2F": 0x49755, + "Warps_Route15Gate1F": 0x49783, + "Option_Aide_Rt15": 0x497d6, + "Event_Rt_15_Oaks_Aide": 0x497da, + "Warps_Route15Gate2F": 0x4981c, + "Option_Route_16_Gate_Fix": 0x49872, + "Warps_Route16Gate1F": 0x4991b, + "Warps_Route16Gate2F": 0x499dc, + "Option_Route_18_Gate_Fix": 0x49a3b, + "Warps_Route18Gate1F": 0x49ad8, + "Warps_Route18Gate2F": 0x49b45, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_0_ITEM": 0x49ba7, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_1_ITEM": 0x49bb5, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_2_ITEM": 0x49bc3, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_3_ITEM": 0x49bd1, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_4_ITEM": 0x49bdf, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_5_ITEM": 0x49bed, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_6_ITEM": 0x49bfb, + "Warps_MtMoon1F": 0x49cb5, + "Missable_Mt_Moon_1F_Item_1": 0x49d0a, + "Missable_Mt_Moon_1F_Item_2": 0x49d11, + "Missable_Mt_Moon_1F_Item_3": 0x49d18, + "Missable_Mt_Moon_1F_Item_4": 0x49d1f, + "Missable_Mt_Moon_1F_Item_5": 0x49d26, + "Missable_Mt_Moon_1F_Item_6": 0x49d2d, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_0_ITEM": 0x4a000, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_1_ITEM": 0x4a00e, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_2_ITEM": 0x4a01c, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_3_ITEM": 0x4a02a, + "Dome_Fossil_Text": 0x4a09e, + "Event_Dome_Fossil": 0x4a0be, + "Helix_Fossil_Text": 0x4a0fa, + "Event_Helix_Fossil": 0x4a11a, + "Warps_MtMoonB2F": 0x4a1b9, + "Missable_Mt_Moon_B2F_Item_1": 0x4a203, + "Missable_Mt_Moon_B2F_Item_2": 0x4a20a, + "Warps_SafariZoneWest": 0x4a3ba, + "Missable_Safari_Zone_West_Item_1": 0x4a3ec, + "Missable_Safari_Zone_West_Item_2": 0x4a3f3, + "Missable_Safari_Zone_West_Item_3": 0x4a3fa, + "Missable_Safari_Zone_West_Item_4": 0x4a401, + "Event_Safari_Zone_Secret_House": 0x4a500, + "Warps_SafariZoneSecretHouse": 0x4a53d, + "Warps_TradeCenter": 0x4fd57, + "Warps_Colosseum": 0x4fd8b, + "Warps_Route22": 0x50026, + "Warps_Route20": 0x50117, + "Warps_Route23": 0x50365, + "Warps_Route24": 0x506a8, "Missable_Route_24_Item": 0x506e6, + "Warps_Route25": 0x507b6, "Missable_Route_25_Item": 0x5080b, - "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_0_ITEM": 0x50d47, - "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_1_ITEM": 0x50d55, - "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_2_ITEM": 0x50d63, - "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_3_ITEM": 0x50d71, - "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_4_ITEM": 0x50d7f, - "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_5_ITEM": 0x50d8d, - "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_6_ITEM": 0x50d9b, - "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_7_ITEM": 0x50da9, - "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_8_ITEM": 0x50db7, - "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_9_ITEM": 0x50dc5, - "Starter2_B": 0x50fe2, - "Starter3_B": 0x50fe4, - "Starter1_B": 0x50fe6, - "Starter2_A": 0x51105, - "Starter3_A": 0x51107, - "Starter1_A": 0x51109, - "Option_Badge_Goal": 0x5132b, - "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_0_ITEM": 0x51452, - "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_1_ITEM": 0x51460, - "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_2_ITEM": 0x5146e, - "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_3_ITEM": 0x5147c, - "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_4_ITEM": 0x5148a, - "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_5_ITEM": 0x51498, - "Event_Nugget_Bridge": 0x514af, - "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_0_ITEM": 0x51641, - "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_1_ITEM": 0x5164f, - "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_2_ITEM": 0x5165d, - "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_3_ITEM": 0x5166b, - "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_4_ITEM": 0x51679, - "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_5_ITEM": 0x51687, - "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_6_ITEM": 0x51695, - "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_7_ITEM": 0x516a3, - "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_8_ITEM": 0x516b1, - "Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_0_ITEM": 0x5184a, - "Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_1_ITEM": 0x51858, - "Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_2_ITEM": 0x51866, - "Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_3_ITEM": 0x51874, - "Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_4_ITEM": 0x51882, - "Trainersanity_EVENT_BEAT_MOLTRES_ITEM": 0x51890, - "Static_Encounter_Moltres": 0x51977, - "Missable_Victory_Road_2F_Item_1": 0x5197f, - "Missable_Victory_Road_2F_Item_2": 0x51986, - "Missable_Victory_Road_2F_Item_3": 0x5198d, - "Missable_Victory_Road_2F_Item_4": 0x51994, - "Starter2_L": 0x51cc3, - "Starter3_L": 0x51ccb, - "Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_0_ITEM": 0x51d7e, - "Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_1_ITEM": 0x51d8c, - "Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_2_ITEM": 0x51d9a, - "Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_3_ITEM": 0x51da8, - "Gift_Lapras": 0x51dc9, - "Missable_Silph_Co_7F_Item_1": 0x51f53, - "Missable_Silph_Co_7F_Item_2": 0x51f5a, - "Trainersanity_EVENT_BEAT_MANSION_2_TRAINER_0_ITEM": 0x52080, - "Missable_Pokemon_Mansion_2F_Item": 0x52111, - "Trainersanity_EVENT_BEAT_MANSION_3_TRAINER_0_ITEM": 0x522c1, - "Trainersanity_EVENT_BEAT_MANSION_3_TRAINER_1_ITEM": 0x522cf, - "Missable_Pokemon_Mansion_3F_Item_1": 0x5232e, - "Missable_Pokemon_Mansion_3F_Item_2": 0x52335, - "Trainersanity_EVENT_BEAT_MANSION_4_TRAINER_0_ITEM": 0x52477, - "Trainersanity_EVENT_BEAT_MANSION_4_TRAINER_1_ITEM": 0x52485, - "Missable_Pokemon_Mansion_B1F_Item_1": 0x524dc, - "Missable_Pokemon_Mansion_B1F_Item_2": 0x524e3, - "Missable_Pokemon_Mansion_B1F_Item_3": 0x524ea, - "Missable_Pokemon_Mansion_B1F_Item_4": 0x524f1, - "Missable_Pokemon_Mansion_B1F_Item_5": 0x524fe, - "Option_Safari_Zone_Battle_Type": 0x52613, - "Prize_Mon_A2": 0x5287f, - "Prize_Mon_B2": 0x52880, - "Prize_Mon_C2": 0x52881, - "Prize_Mon_D2": 0x5288a, - "Prize_Mon_E2": 0x5288b, - "Prize_Mon_F2": 0x5288c, - "Prize_Item_A": 0x52895, - "Prize_Item_B": 0x52896, - "Prize_Item_C": 0x52897, - "Prize_Mon_A": 0x529cc, - "Prize_Mon_B": 0x529ce, - "Prize_Mon_C": 0x529d0, - "Prize_Mon_D": 0x529d2, - "Prize_Mon_E": 0x529d4, - "Prize_Mon_F": 0x529d6, - "Start_Inventory": 0x52af9, + "Warps_IndigoPlateau": 0x5093a, + "Warps_SaffronCity": 0x509e0, + "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_0_ITEM": 0x50d63, + "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_1_ITEM": 0x50d71, + "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_2_ITEM": 0x50d7f, + "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_3_ITEM": 0x50d8d, + "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_4_ITEM": 0x50d9b, + "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_5_ITEM": 0x50da9, + "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_6_ITEM": 0x50db7, + "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_7_ITEM": 0x50dc5, + "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_8_ITEM": 0x50dd3, + "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_9_ITEM": 0x50de1, + "Starter2_B": 0x50ffe, + "Starter3_B": 0x51000, + "Starter1_B": 0x51002, + "Starter2_A": 0x5111d, + "Starter3_A": 0x5111f, + "Starter1_A": 0x51121, + "Option_Route23_Badges": 0x5126e, + "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_0_ITEM": 0x51384, + "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_1_ITEM": 0x51392, + "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_2_ITEM": 0x513a0, + "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_3_ITEM": 0x513ae, + "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_4_ITEM": 0x513bc, + "Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_5_ITEM": 0x513ca, + "Event_Nugget_Bridge": 0x513e1, + "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_0_ITEM": 0x51569, + "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_1_ITEM": 0x51577, + "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_2_ITEM": 0x51585, + "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_3_ITEM": 0x51593, + "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_4_ITEM": 0x515a1, + "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_5_ITEM": 0x515af, + "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_6_ITEM": 0x515bd, + "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_7_ITEM": 0x515cb, + "Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_8_ITEM": 0x515d9, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_0_ITEM": 0x51772, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_1_ITEM": 0x51780, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_2_ITEM": 0x5178e, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_3_ITEM": 0x5179c, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_2_TRAINER_4_ITEM": 0x517aa, + "Trainersanity_EVENT_BEAT_MOLTRES_ITEM": 0x517b8, + "Warps_VictoryRoad2F": 0x51855, + "Static_Encounter_Moltres": 0x5189f, + "Missable_Victory_Road_2F_Item_1": 0x518a7, + "Missable_Victory_Road_2F_Item_2": 0x518ae, + "Missable_Victory_Road_2F_Item_3": 0x518b5, + "Missable_Victory_Road_2F_Item_4": 0x518bc, + "Warps_MtMoonB1F": 0x5198d, + "Starter2_L": 0x51beb, + "Starter3_L": 0x51bf3, + "Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_0_ITEM": 0x51ca4, + "Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_1_ITEM": 0x51cb2, + "Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_2_ITEM": 0x51cc0, + "Trainersanity_EVENT_BEAT_SILPH_CO_7F_TRAINER_3_ITEM": 0x51cce, + "Gift_Lapras": 0x51cef, + "Event_SKC7F": 0x51d7a, + "Warps_SilphCo7F": 0x51e49, + "Missable_Silph_Co_7F_Item_1": 0x51ea5, + "Missable_Silph_Co_7F_Item_2": 0x51eac, + "Trainersanity_EVENT_BEAT_MANSION_2_TRAINER_0_ITEM": 0x51fd2, + "Warps_PokemonMansion2F": 0x52045, + "Missable_Pokemon_Mansion_2F_Item": 0x52063, + "Trainersanity_EVENT_BEAT_MANSION_3_TRAINER_0_ITEM": 0x52213, + "Trainersanity_EVENT_BEAT_MANSION_3_TRAINER_1_ITEM": 0x52221, + "Warps_PokemonMansion3F": 0x5225e, + "Missable_Pokemon_Mansion_3F_Item_1": 0x52280, + "Missable_Pokemon_Mansion_3F_Item_2": 0x52287, + "Trainersanity_EVENT_BEAT_MANSION_4_TRAINER_0_ITEM": 0x523c9, + "Trainersanity_EVENT_BEAT_MANSION_4_TRAINER_1_ITEM": 0x523d7, + "Warps_PokemonMansionB1F": 0x52414, + "Missable_Pokemon_Mansion_B1F_Item_1": 0x5242e, + "Missable_Pokemon_Mansion_B1F_Item_2": 0x52435, + "Missable_Pokemon_Mansion_B1F_Item_3": 0x5243c, + "Missable_Pokemon_Mansion_B1F_Item_4": 0x52443, + "Missable_Pokemon_Mansion_B1F_Item_5": 0x52450, + "Option_Safari_Zone_Battle_Type": 0x52565, + "Prize_Mon_A2": 0x527ef, + "Prize_Mon_B2": 0x527f0, + "Prize_Mon_C2": 0x527f1, + "Prize_Mon_D2": 0x527fa, + "Prize_Mon_E2": 0x527fb, + "Prize_Mon_F2": 0x527fc, + "Prize_Item_A": 0x52805, + "Prize_Item_B": 0x52806, + "Prize_Item_C": 0x52807, + "Prize_Mon_A": 0x5293c, + "Prize_Mon_B": 0x5293e, + "Prize_Mon_C": 0x52940, + "Prize_Mon_D": 0x52942, + "Prize_Mon_E": 0x52944, + "Prize_Mon_F": 0x52946, + "Start_Inventory": 0x52a7b, + "Map_Fly_Location": 0x52c77, + "Reset_A": 0x52d27, + "Reset_B": 0x52d53, + "Reset_C": 0x52d7f, + "Reset_D": 0x52dab, + "Reset_E": 0x52dd7, + "Reset_F": 0x52e03, + "Reset_G": 0x52e2f, + "Reset_H": 0x52e5b, + "Reset_I": 0x52e87, + "Reset_J": 0x52eb3, + "Reset_K": 0x52edf, + "Reset_L": 0x52f0b, + "Reset_M": 0x52f37, + "Reset_N": 0x52f63, + "Reset_O": 0x52f8f, + "Warps_Route2": 0x54026, "Missable_Route_2_Item_1": 0x5404a, "Missable_Route_2_Item_2": 0x54051, + "Warps_Route3": 0x5420c, + "Warps_Route4": 0x543b6, "Missable_Route_4_Item": 0x543df, + "Warps_Route5": 0x545a7, + "Warps_Route9": 0x546ac, "Missable_Route_9_Item": 0x546fd, - "Option_EXP_Modifier": 0x552c5, - "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_0_ITEM": 0x55581, - "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_1_ITEM": 0x5558f, - "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_2_ITEM": 0x5559d, - "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_3_ITEM": 0x555ab, - "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_4_ITEM": 0x555b9, - "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_5_ITEM": 0x555c7, - "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_6_ITEM": 0x555d5, - "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_7_ITEM": 0x555e3, - "Trainersanity_EVENT_BEAT_ROUTE_4_TRAINER_0_ITEM": 0x556e9, - "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_0_ITEM": 0x55759, - "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_1_ITEM": 0x55767, - "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_2_ITEM": 0x55775, - "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_3_ITEM": 0x55783, - "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_4_ITEM": 0x55791, - "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_5_ITEM": 0x5579f, - "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_6_ITEM": 0x557ad, - "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_7_ITEM": 0x557bb, - "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_8_ITEM": 0x557c9, - "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_0_ITEM": 0x558d3, - "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_1_ITEM": 0x558e1, - "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_2_ITEM": 0x558ef, - "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_3_ITEM": 0x558fd, - "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_4_ITEM": 0x5590b, - "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_5_ITEM": 0x55919, - "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_6_ITEM": 0x55927, - "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_7_ITEM": 0x55935, - "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_8_ITEM": 0x55943, - "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_9_ITEM": 0x55951, - "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_0_ITEM": 0x55a98, - "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_1_ITEM": 0x55aa6, - "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_2_ITEM": 0x55ab4, - "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_3_ITEM": 0x55ac2, - "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_4_ITEM": 0x55ad0, - "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_5_ITEM": 0x55ade, - "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_6_ITEM": 0x55aec, - "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_7_ITEM": 0x55afa, - "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_8_ITEM": 0x55b08, - "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_9_ITEM": 0x55b16, - "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_0_ITEM": 0x55c5d, - "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_1_ITEM": 0x55c6b, - "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_2_ITEM": 0x55c79, - "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_3_ITEM": 0x55c87, - "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_4_ITEM": 0x55c95, - "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_5_ITEM": 0x55ca3, - "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_6_ITEM": 0x55cb1, - "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_7_ITEM": 0x55cbf, - "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_8_ITEM": 0x55ccd, - "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_9_ITEM": 0x55cdb, - "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_0_ITEM": 0x55e31, - "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_1_ITEM": 0x55e3f, - "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_2_ITEM": 0x55e4d, - "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_3_ITEM": 0x55e5b, - "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_4_ITEM": 0x55e69, - "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_5_ITEM": 0x55e77, - "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_6_ITEM": 0x55e85, - "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_7_ITEM": 0x55e93, - "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_8_ITEM": 0x55ea1, - "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_9_ITEM": 0x55eaf, - "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_0_ITEM": 0x55fe8, - "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_1_ITEM": 0x55ff6, - "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_2_ITEM": 0x56004, - "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_3_ITEM": 0x56012, - "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_4_ITEM": 0x56020, - "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_5_ITEM": 0x5602e, - "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_6_ITEM": 0x5603c, - "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_7_ITEM": 0x5604a, - "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_8_ITEM": 0x56058, - "Rod_Vermilion_City_Fishing_Guru": 0x56165, - "Shop6": 0x561e8, - "Rod_Fuchsia_City_Fishing_Brother": 0x562a7, - "Rod_Route12_Fishing_Brother": 0x565aa, - "Trainersanity_EVENT_BEAT_SILPH_CO_8F_TRAINER_0_ITEM": 0x5669f, - "Trainersanity_EVENT_BEAT_SILPH_CO_8F_TRAINER_1_ITEM": 0x566ad, - "Trainersanity_EVENT_BEAT_SILPH_CO_8F_TRAINER_2_ITEM": 0x566bb, + "Warps_Route13": 0x54832, + "Warps_Route14": 0x549c5, + "Warps_Route17": 0x54b4c, + "Warps_Route19": 0x54ea4, + "Warps_Route21": 0x5502b, + "Option_EXP_Modifier": 0x552ce, + "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_0_ITEM": 0x5557a, + "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_1_ITEM": 0x55588, + "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_2_ITEM": 0x55596, + "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_3_ITEM": 0x555a4, + "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_4_ITEM": 0x555b2, + "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_5_ITEM": 0x555c0, + "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_6_ITEM": 0x555ce, + "Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_7_ITEM": 0x555dc, + "Trainersanity_EVENT_BEAT_ROUTE_4_TRAINER_0_ITEM": 0x556e2, + "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_0_ITEM": 0x55752, + "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_1_ITEM": 0x55760, + "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_2_ITEM": 0x5576e, + "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_3_ITEM": 0x5577c, + "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_4_ITEM": 0x5578a, + "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_5_ITEM": 0x55798, + "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_6_ITEM": 0x557a6, + "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_7_ITEM": 0x557b4, + "Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_8_ITEM": 0x557c2, + "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_0_ITEM": 0x558cc, + "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_1_ITEM": 0x558da, + "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_2_ITEM": 0x558e8, + "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_3_ITEM": 0x558f6, + "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_4_ITEM": 0x55904, + "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_5_ITEM": 0x55912, + "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_6_ITEM": 0x55920, + "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_7_ITEM": 0x5592e, + "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_8_ITEM": 0x5593c, + "Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_9_ITEM": 0x5594a, + "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_0_ITEM": 0x55a91, + "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_1_ITEM": 0x55a9f, + "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_2_ITEM": 0x55aad, + "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_3_ITEM": 0x55abb, + "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_4_ITEM": 0x55ac9, + "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_5_ITEM": 0x55ad7, + "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_6_ITEM": 0x55ae5, + "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_7_ITEM": 0x55af3, + "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_8_ITEM": 0x55b01, + "Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_9_ITEM": 0x55b0f, + "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_0_ITEM": 0x55c56, + "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_1_ITEM": 0x55c64, + "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_2_ITEM": 0x55c72, + "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_3_ITEM": 0x55c80, + "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_4_ITEM": 0x55c8e, + "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_5_ITEM": 0x55c9c, + "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_6_ITEM": 0x55caa, + "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_7_ITEM": 0x55cb8, + "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_8_ITEM": 0x55cc6, + "Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_9_ITEM": 0x55cd4, + "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_0_ITEM": 0x55e2a, + "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_1_ITEM": 0x55e38, + "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_2_ITEM": 0x55e46, + "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_3_ITEM": 0x55e54, + "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_4_ITEM": 0x55e62, + "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_5_ITEM": 0x55e70, + "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_6_ITEM": 0x55e7e, + "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_7_ITEM": 0x55e8c, + "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_8_ITEM": 0x55e9a, + "Trainersanity_EVENT_BEAT_ROUTE_19_TRAINER_9_ITEM": 0x55ea8, + "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_0_ITEM": 0x55fe1, + "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_1_ITEM": 0x55fef, + "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_2_ITEM": 0x55ffd, + "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_3_ITEM": 0x5600b, + "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_4_ITEM": 0x56019, + "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_5_ITEM": 0x56027, + "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_6_ITEM": 0x56035, + "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_7_ITEM": 0x56043, + "Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_8_ITEM": 0x56051, + "Rod_Vermilion_City_Fishing_Guru": 0x5615e, + "Warps_VermilionOldRodHouse": 0x561a3, + "Shop6": 0x561e1, + "Warps_CeladonMart2F": 0x5621b, + "Rod_Fuchsia_City_Fishing_Brother": 0x562a0, + "Warps_FuchsiaGoodRodHouse": 0x5632b, + "Warps_Daycare": 0x5655d, + "Rod_Route12_Fishing_Brother": 0x5659d, + "Warps_Route12SuperRodHouse": 0x565e2, + "Trainersanity_EVENT_BEAT_SILPH_CO_8F_TRAINER_0_ITEM": 0x56692, + "Trainersanity_EVENT_BEAT_SILPH_CO_8F_TRAINER_1_ITEM": 0x566a0, + "Trainersanity_EVENT_BEAT_SILPH_CO_8F_TRAINER_2_ITEM": 0x566ae, + "Event_SKC8F": 0x566c1, + "Warps_SilphCo8F": 0x5674f, + "Warps_Route6": 0x58026, + "Warps_Route8": 0x58153, + "Warps_Route10": 0x582fa, + "Warps_Route11": 0x584e4, + "Warps_Route12": 0x586aa, "Missable_Route_12_Item_1": 0x58704, "Missable_Route_12_Item_2": 0x5870b, + "Warps_Route15": 0x5895e, "Missable_Route_15_Item": 0x589c7, - "Ghost_Battle6": 0x58df0, - "Require_Pokedex_A": 0x59051, - "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_0_ITEM": 0x5910b, - "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_1_ITEM": 0x59119, - "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_2_ITEM": 0x59127, - "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_3_ITEM": 0x59135, - "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_4_ITEM": 0x59143, - "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_5_ITEM": 0x59151, - "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_0_ITEM": 0x59223, - "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_1_ITEM": 0x59231, - "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_2_ITEM": 0x5923f, - "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_3_ITEM": 0x5924d, - "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_4_ITEM": 0x5925b, - "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_5_ITEM": 0x59269, - "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_6_ITEM": 0x59277, - "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_7_ITEM": 0x59285, - "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_8_ITEM": 0x59293, - "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_0_ITEM": 0x5940d, - "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_1_ITEM": 0x5941b, - "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_2_ITEM": 0x59429, - "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_3_ITEM": 0x59437, - "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_4_ITEM": 0x59445, - "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_5_ITEM": 0x59453, - "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_0_ITEM": 0x5953a, - "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_1_ITEM": 0x59548, - "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_2_ITEM": 0x59556, - "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_3_ITEM": 0x59564, - "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_4_ITEM": 0x59572, - "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_5_ITEM": 0x59580, - "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_6_ITEM": 0x5958e, - "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_7_ITEM": 0x5959c, - "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_8_ITEM": 0x595aa, - "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_9_ITEM": 0x595b8, - "Static_Encounter_Snorlax_A": 0x596f6, - "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_0_ITEM": 0x59764, - "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_1_ITEM": 0x59772, - "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_2_ITEM": 0x59780, - "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_3_ITEM": 0x5978e, - "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_4_ITEM": 0x5979c, - "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_5_ITEM": 0x597aa, - "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_6_ITEM": 0x597b8, - "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_0_ITEM": 0x598c0, - "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_1_ITEM": 0x598ce, - "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_2_ITEM": 0x598dc, - "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_3_ITEM": 0x598ea, - "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_4_ITEM": 0x598f8, - "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_5_ITEM": 0x59906, - "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_6_ITEM": 0x59914, - "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_7_ITEM": 0x59922, - "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_8_ITEM": 0x59930, - "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_9_ITEM": 0x5993e, - "Static_Encounter_Snorlax_B": 0x59a58, - "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_0_ITEM": 0x59ac4, - "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_1_ITEM": 0x59ad2, - "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_2_ITEM": 0x59ae0, - "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_3_ITEM": 0x59aee, - "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_4_ITEM": 0x59afc, - "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_5_ITEM": 0x59b0a, - "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_0_ITEM": 0x59beb, - "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_1_ITEM": 0x59bf9, - "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_2_ITEM": 0x59c07, - "Event_Pokemon_Fan_Club": 0x59d1a, - "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_0_ITEM": 0x59e7a, - "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_1_ITEM": 0x59e88, - "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_2_ITEM": 0x59e96, - "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_3_ITEM": 0x59ea4, - "Event_Scared_Woman": 0x59eb6, - "Trainersanity_EVENT_BEAT_SILPH_CO_3F_TRAINER_0_ITEM": 0x5a0be, - "Trainersanity_EVENT_BEAT_SILPH_CO_3F_TRAINER_1_ITEM": 0x5a0cc, - "Missable_Silph_Co_3F_Item": 0x5a166, - "Trainersanity_EVENT_BEAT_SILPH_CO_10F_TRAINER_0_ITEM": 0x5a288, - "Trainersanity_EVENT_BEAT_SILPH_CO_10F_TRAINER_1_ITEM": 0x5a296, - "Missable_Silph_Co_10F_Item_1": 0x5a320, - "Missable_Silph_Co_10F_Item_2": 0x5a327, - "Missable_Silph_Co_10F_Item_3": 0x5a32e, - "Trainersanity_EVENT_BEAT_LANCES_ROOM_TRAINER_0_ITEM": 0x5a491, - "Guard_Drink_List": 0x5a6a6, - "Event_Museum": 0x5c266, - "Badge_Pewter_Gym": 0x5c3ed, - "Event_Pewter_Gym": 0x5c401, - "Trainersanity_EVENT_BEAT_PEWTER_GYM_TRAINER_0_ITEM": 0x5c447, - "Badge_Cerulean_Gym": 0x5c718, - "Event_Cerulean_Gym": 0x5c72c, - "Trainersanity_EVENT_BEAT_CERULEAN_GYM_TRAINER_0_ITEM": 0x5c76a, - "Trainersanity_EVENT_BEAT_CERULEAN_GYM_TRAINER_1_ITEM": 0x5c778, - "Shop3": 0x5c8b0, - "Shop5": 0x5c98d, - "Shop4": 0x5ca4e, - "Badge_Vermilion_Gym": 0x5cb39, - "Event_Vermillion_Gym": 0x5cb4d, - "Trainersanity_EVENT_BEAT_VERMILION_GYM_TRAINER_0_ITEM": 0x5cb8d, - "Trainersanity_EVENT_BEAT_VERMILION_GYM_TRAINER_1_ITEM": 0x5cb9b, - "Trainersanity_EVENT_BEAT_VERMILION_GYM_TRAINER_2_ITEM": 0x5cba9, - "Event_Copycat": 0x5cd2e, - "Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_0_ITEM": 0x5cea8, - "Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_1_ITEM": 0x5ceb6, - "Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_2_ITEM": 0x5cec4, - "Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_3_ITEM": 0x5ced2, - "Gift_Hitmonlee": 0x5cfa7, - "Gift_Hitmonchan": 0x5cfef, - "Badge_Saffron_Gym": 0x5d106, - "Event_Saffron_Gym": 0x5d11a, - "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_0_ITEM": 0x5d162, - "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_1_ITEM": 0x5d170, - "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_2_ITEM": 0x5d17e, - "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_3_ITEM": 0x5d18c, - "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_4_ITEM": 0x5d19a, - "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_5_ITEM": 0x5d1a8, - "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_6_ITEM": 0x5d1b6, - "Shop9": 0x5d4b8, - "Option_Aide_Rt2": 0x5d6b0, - "Event_Route_2_Oaks_Aide": 0x5d6b4, - "Trainersanity_EVENT_BEAT_SILPH_CO_9F_TRAINER_0_ITEM": 0x5d966, - "Trainersanity_EVENT_BEAT_SILPH_CO_9F_TRAINER_1_ITEM": 0x5d974, - "Trainersanity_EVENT_BEAT_SILPH_CO_9F_TRAINER_2_ITEM": 0x5d982, - "Trainersanity_EVENT_BEAT_VICTORY_ROAD_1_TRAINER_0_ITEM": 0x5db46, - "Trainersanity_EVENT_BEAT_VICTORY_ROAD_1_TRAINER_1_ITEM": 0x5db54, - "Missable_Victory_Road_1F_Item_1": 0x5dbae, - "Missable_Victory_Road_1F_Item_2": 0x5dbb5, - "Starter2_J": 0x6060e, - "Starter3_J": 0x60616, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_3_TRAINER_0_ITEM": 0x606fa, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_3_TRAINER_1_ITEM": 0x60708, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_3_TRAINER_2_ITEM": 0x60716, - "Missable_Pokemon_Tower_3F_Item": 0x6078d, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_4_TRAINER_0_ITEM": 0x6082e, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_4_TRAINER_1_ITEM": 0x6083c, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_4_TRAINER_2_ITEM": 0x6084a, - "Missable_Pokemon_Tower_4F_Item_1": 0x608c1, - "Missable_Pokemon_Tower_4F_Item_2": 0x608c8, - "Missable_Pokemon_Tower_4F_Item_3": 0x608cf, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_0_ITEM": 0x609c2, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_1_ITEM": 0x609d0, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_2_ITEM": 0x609de, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_3_ITEM": 0x609ec, - "Missable_Pokemon_Tower_5F_Item": 0x60a94, - "Option_Trainersanity2": 0x60b2c, - "Ghost_Battle1": 0x60b7f, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_6_TRAINER_0_ITEM": 0x60c18, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_6_TRAINER_1_ITEM": 0x60c26, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_6_TRAINER_2_ITEM": 0x60c34, - "Ghost_Battle2": 0x60c5c, - "Missable_Pokemon_Tower_6F_Item_1": 0x60cd7, - "Missable_Pokemon_Tower_6F_Item_2": 0x60cde, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_7_TRAINER_0_ITEM": 0x60eb2, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_7_TRAINER_1_ITEM": 0x60ec0, - "Trainersanity_EVENT_BEAT_POKEMONTOWER_7_TRAINER_2_ITEM": 0x60ece, - "Gift_Aerodactyl": 0x610c8, - "Gift_Omanyte": 0x610cc, - "Gift_Kabuto": 0x610d0, - "Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_0_ITEM": 0x611b3, - "Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_1_ITEM": 0x611c1, - "Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_2_ITEM": 0x611cf, - "Missable_Viridian_Forest_Item_1": 0x61296, - "Missable_Viridian_Forest_Item_2": 0x6129d, - "Missable_Viridian_Forest_Item_3": 0x612a4, - "Starter2_M": 0x614ba, - "Starter3_M": 0x614c2, - "Trainersanity_EVENT_BEAT_SS_ANNE_5_TRAINER_0_ITEM": 0x61748, - "Trainersanity_EVENT_BEAT_SS_ANNE_5_TRAINER_1_ITEM": 0x61756, - "Event_SS_Anne_Captain": 0x61931, - "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_0_ITEM": 0x61a20, - "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_1_ITEM": 0x61a2e, - "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_2_ITEM": 0x61a3c, - "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_3_ITEM": 0x61a4a, - "Missable_SS_Anne_1F_Item": 0x61b36, - "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_0_ITEM": 0x61c07, - "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_1_ITEM": 0x61c15, - "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_2_ITEM": 0x61c23, - "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_3_ITEM": 0x61c31, - "Missable_SS_Anne_2F_Item_1": 0x61d6b, - "Missable_SS_Anne_2F_Item_2": 0x61d7e, - "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_0_ITEM": 0x61e0f, - "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_1_ITEM": 0x61e1d, - "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_2_ITEM": 0x61e2b, - "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_3_ITEM": 0x61e39, - "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_4_ITEM": 0x61e47, - "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_5_ITEM": 0x61e55, - "Missable_SS_Anne_B1F_Item_1": 0x61f6d, - "Missable_SS_Anne_B1F_Item_2": 0x61f74, - "Missable_SS_Anne_B1F_Item_3": 0x61f7b, - "Trainersanity_EVENT_BEAT_SILPH_CO_11F_TRAINER_0_ITEM": 0x6233c, - "Trainersanity_EVENT_BEAT_SILPH_CO_11F_TRAINER_1_ITEM": 0x6234a, - "Event_Silph_Co_President": 0x6235d, + "Warps_Route16": 0x58b0c, + "Warps_Route18": 0x58c6a, + "Ghost_Battle6": 0x58dee, + "Require_Pokedex_A": 0x59049, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_0_ITEM": 0x59103, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_1_ITEM": 0x59111, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_2_ITEM": 0x5911f, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_3_ITEM": 0x5912d, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_4_ITEM": 0x5913b, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_5_ITEM": 0x59149, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_0_ITEM": 0x5921b, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_1_ITEM": 0x59229, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_2_ITEM": 0x59237, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_3_ITEM": 0x59245, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_4_ITEM": 0x59253, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_5_ITEM": 0x59261, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_6_ITEM": 0x5926f, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_7_ITEM": 0x5927d, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_8_ITEM": 0x5928b, + "Option_Extra_Key_Items_D": 0x593aa, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_0_ITEM": 0x59407, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_1_ITEM": 0x59415, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_2_ITEM": 0x59423, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_3_ITEM": 0x59431, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_4_ITEM": 0x5943f, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_5_ITEM": 0x5944d, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_0_ITEM": 0x59534, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_1_ITEM": 0x59542, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_2_ITEM": 0x59550, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_3_ITEM": 0x5955e, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_4_ITEM": 0x5956c, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_5_ITEM": 0x5957a, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_6_ITEM": 0x59588, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_7_ITEM": 0x59596, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_8_ITEM": 0x595a4, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_9_ITEM": 0x595b2, + "Static_Encounter_Snorlax_A": 0x596f0, + "Static_Encounter_Snorlax_A_Level": 0x596f5, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_0_ITEM": 0x5975e, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_1_ITEM": 0x5976c, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_2_ITEM": 0x5977a, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_3_ITEM": 0x59788, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_4_ITEM": 0x59796, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_5_ITEM": 0x597a4, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_6_ITEM": 0x597b2, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_0_ITEM": 0x598ba, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_1_ITEM": 0x598c8, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_2_ITEM": 0x598d6, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_3_ITEM": 0x598e4, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_4_ITEM": 0x598f2, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_5_ITEM": 0x59900, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_6_ITEM": 0x5990e, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_7_ITEM": 0x5991c, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_8_ITEM": 0x5992a, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_9_ITEM": 0x59938, + "Static_Encounter_Snorlax_B": 0x59a52, + "Static_Encounter_Snorlax_B_Level": 0x59a57, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_0_ITEM": 0x59abe, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_1_ITEM": 0x59acc, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_2_ITEM": 0x59ada, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_3_ITEM": 0x59ae8, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_4_ITEM": 0x59af6, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_5_ITEM": 0x59b04, + "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_0_ITEM": 0x59be5, + "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_1_ITEM": 0x59bf3, + "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_2_ITEM": 0x59c01, + "Event_Pokemon_Fan_Club": 0x59d14, + "Warps_PokemonFanClub": 0x59d72, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_0_ITEM": 0x59e74, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_1_ITEM": 0x59e82, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_2_ITEM": 0x59e90, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_3_ITEM": 0x59e9e, + "Event_Scared_Woman": 0x59eb0, + "Warps_SilphCo2F": 0x59f49, + "Trainersanity_EVENT_BEAT_SILPH_CO_3F_TRAINER_0_ITEM": 0x5a0b8, + "Trainersanity_EVENT_BEAT_SILPH_CO_3F_TRAINER_1_ITEM": 0x5a0c6, + "Warps_SilphCo3F": 0x5a11c, + "Missable_Silph_Co_3F_Item": 0x5a160, + "Trainersanity_EVENT_BEAT_SILPH_CO_10F_TRAINER_0_ITEM": 0x5a282, + "Trainersanity_EVENT_BEAT_SILPH_CO_10F_TRAINER_1_ITEM": 0x5a290, + "Event_SKC10F": 0x5a2b7, + "Warps_SilphCo10F": 0x5a318, + "Missable_Silph_Co_10F_Item_1": 0x5a34c, + "Missable_Silph_Co_10F_Item_2": 0x5a353, + "Missable_Silph_Co_10F_Item_3": 0x5a35a, + "Trainersanity_EVENT_BEAT_LANCES_ROOM_TRAINER_0_ITEM": 0x5a4bd, + "Warps_LancesRoom": 0x5a4e9, + "Warps_HallOfFame": 0x5a68e, + "Guard_Drink_List": 0x5a6d0, + "Warps_RedsHouse2F": 0x5c0d4, + "Event_Museum": 0x5c260, + "Warps_Museum1F": 0x5c2bf, + "Warps_Museum2F": 0x5c349, + "Badge_Pewter_Gym": 0x5c3e7, + "Event_Pewter_Gym": 0x5c3fb, + "Trainersanity_EVENT_BEAT_PEWTER_GYM_TRAINER_0_ITEM": 0x5c437, + "Warps_PewterGym": 0x5c51f, + "Warps_PewterPokecenter": 0x5c5fe, + "Warps_CeruleanPokecenter": 0x5c650, + "Badge_Cerulean_Gym": 0x5c708, + "Event_Cerulean_Gym": 0x5c71c, + "Trainersanity_EVENT_BEAT_CERULEAN_GYM_TRAINER_0_ITEM": 0x5c75a, + "Trainersanity_EVENT_BEAT_CERULEAN_GYM_TRAINER_1_ITEM": 0x5c768, + "Warps_CeruleanGym": 0x5c830, + "Shop3": 0x5c8a0, + "Warps_CeruleanMart": 0x5c8cc, + "Warps_LavenderPokecenter": 0x5c918, + "Shop5": 0x5c97d, + "Warps_LavenderMart": 0x5c9ab, + "Warps_VermilionPokecenter": 0x5c9f7, + "Shop4": 0x5ca3e, + "Warps_VermilionMart": 0x5ca69, + "Badge_Vermilion_Gym": 0x5cb29, + "Event_Vermillion_Gym": 0x5cb3d, + "Trainersanity_EVENT_BEAT_VERMILION_GYM_TRAINER_0_ITEM": 0x5cb7d, + "Trainersanity_EVENT_BEAT_VERMILION_GYM_TRAINER_1_ITEM": 0x5cb8b, + "Trainersanity_EVENT_BEAT_VERMILION_GYM_TRAINER_2_ITEM": 0x5cb99, + "Warps_VermilionGym": 0x5cc7c, + "Event_Copycat": 0x5cd12, + "Warps_CopycatsHouse2F": 0x5cd98, + "Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_0_ITEM": 0x5ce90, + "Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_1_ITEM": 0x5ce9e, + "Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_2_ITEM": 0x5ceac, + "Trainersanity_EVENT_BEAT_FIGHTING_DOJO_TRAINER_3_ITEM": 0x5ceba, + "Gift_Hitmonlee": 0x5cf8f, + "Gift_Hitmonlee_Level": 0x5cfa7, + "Gift_Hitmonchan": 0x5cfd7, + "Gift_Hitmonchan_Level": 0x5cfef, + "Warps_FightingDojo": 0x5d017, + "Badge_Saffron_Gym": 0x5d0ee, + "Event_Saffron_Gym": 0x5d102, + "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_0_ITEM": 0x5d14a, + "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_1_ITEM": 0x5d158, + "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_2_ITEM": 0x5d166, + "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_3_ITEM": 0x5d174, + "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_4_ITEM": 0x5d182, + "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_5_ITEM": 0x5d190, + "Trainersanity_EVENT_BEAT_SAFFRON_GYM_TRAINER_6_ITEM": 0x5d19e, + "Warps_SaffronGym": 0x5d2e1, + "Shop9": 0x5d4a0, + "Warps_SaffronMart": 0x5d4cb, + "Event_SKC1F": 0x5d527, + "Warps_SilphCo1F": 0x5d55b, + "Warps_SaffronPokecenter": 0x5d63a, + "Warps_ViridianForestNorthGate": 0x5d683, + "Option_Aide_Rt2": 0x5d6d4, + "Event_Route_2_Oaks_Aide": 0x5d6d8, + "Warps_Route2Gate": 0x5d713, + "Warps_ViridianForestSouthGate": 0x5d760, + "Warps_UndergroundPathRoute5": 0x5d7b4, + "Warps_UndergroundPathRoute6": 0x5d7f1, + "Warps_UndergroundPathRoute7": 0x5d82e, + "Warps_UndergroundPathRoute7Copy": 0x5d87a, + "Trainersanity_EVENT_BEAT_SILPH_CO_9F_TRAINER_0_ITEM": 0x5d98f, + "Trainersanity_EVENT_BEAT_SILPH_CO_9F_TRAINER_1_ITEM": 0x5d99d, + "Trainersanity_EVENT_BEAT_SILPH_CO_9F_TRAINER_2_ITEM": 0x5d9ab, + "Event_SKC9F": 0x5d9be, + "Warps_SilphCo9F": 0x5da6a, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_1_TRAINER_0_ITEM": 0x5dba1, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_1_TRAINER_1_ITEM": 0x5dbaf, + "Warps_VictoryRoad1F": 0x5dbe7, + "Missable_Victory_Road_1F_Item_1": 0x5dc09, + "Missable_Victory_Road_1F_Item_2": 0x5dc10, + "Warps_PokemonTower1F": 0x60456, + "Starter2_J": 0x6060c, + "Starter3_J": 0x60614, + "Warps_PokemonTower2F": 0x60648, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_3_TRAINER_0_ITEM": 0x606f8, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_3_TRAINER_1_ITEM": 0x60706, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_3_TRAINER_2_ITEM": 0x60714, + "Warps_PokemonTower3F": 0x60765, + "Missable_Pokemon_Tower_3F_Item": 0x6078b, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_4_TRAINER_0_ITEM": 0x6082c, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_4_TRAINER_1_ITEM": 0x6083a, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_4_TRAINER_2_ITEM": 0x60848, + "Warps_PokemonTower4F": 0x60899, + "Missable_Pokemon_Tower_4F_Item_1": 0x608bf, + "Missable_Pokemon_Tower_4F_Item_2": 0x608c6, + "Missable_Pokemon_Tower_4F_Item_3": 0x608cd, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_0_ITEM": 0x609c0, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_1_ITEM": 0x609ce, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_2_ITEM": 0x609dc, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_3_ITEM": 0x609ea, + "Warps_PokemonTower5F": 0x60a5e, + "Missable_Pokemon_Tower_5F_Item": 0x60a92, + "Option_Trainersanity2": 0x60b2a, + "Ghost_Battle1": 0x60b83, + "Ghost_Battle_Level": 0x60b88, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_6_TRAINER_0_ITEM": 0x60c25, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_6_TRAINER_1_ITEM": 0x60c33, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_6_TRAINER_2_ITEM": 0x60c41, + "Ghost_Battle2": 0x60c69, + "Warps_PokemonTower6F": 0x60cbe, + "Missable_Pokemon_Tower_6F_Item_1": 0x60ce4, + "Missable_Pokemon_Tower_6F_Item_2": 0x60ceb, + "Entrance_Shuffle_Fuji_Warp": 0x60deb, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_7_TRAINER_0_ITEM": 0x60edf, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_7_TRAINER_1_ITEM": 0x60eed, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_7_TRAINER_2_ITEM": 0x60efb, + "Warps_PokemonTower7F": 0x60f8b, + "Warps_CeladonMart1F": 0x61033, + "Gift_Aerodactyl": 0x610f5, + "Gift_Omanyte": 0x610f9, + "Gift_Kabuto": 0x610fd, + "Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_0_ITEM": 0x611de, + "Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_1_ITEM": 0x611ec, + "Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_2_ITEM": 0x611fa, + "Warps_ViridianForest": 0x61273, + "Missable_Viridian_Forest_Item_1": 0x612c1, + "Missable_Viridian_Forest_Item_2": 0x612c8, + "Missable_Viridian_Forest_Item_3": 0x612cf, + "Warps_SSAnne1F": 0x61310, + "Starter2_M": 0x614e5, + "Starter3_M": 0x614ed, + "Warps_SSAnne2F": 0x615ab, + "Warps_SSAnneB1F": 0x616c9, + "Trainersanity_EVENT_BEAT_SS_ANNE_5_TRAINER_0_ITEM": 0x61771, + "Trainersanity_EVENT_BEAT_SS_ANNE_5_TRAINER_1_ITEM": 0x6177f, + "Warps_SSAnneBow": 0x617c6, + "Warps_SSAnneKitchen": 0x618b6, + "Event_SS_Anne_Captain": 0x6194e, + "Warps_SSAnneCaptainsRoom": 0x619d5, + "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_0_ITEM": 0x61a3d, + "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_1_ITEM": 0x61a4b, + "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_2_ITEM": 0x61a59, + "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_3_ITEM": 0x61a67, + "Warps_SSAnne1FRooms": 0x61af7, + "Missable_SS_Anne_1F_Item": 0x61b53, + "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_0_ITEM": 0x61c24, + "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_1_ITEM": 0x61c32, + "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_2_ITEM": 0x61c40, + "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_3_ITEM": 0x61c4e, + "Warps_SSAnne2FRooms": 0x61d2c, + "Missable_SS_Anne_2F_Item_1": 0x61d88, + "Missable_SS_Anne_2F_Item_2": 0x61d9b, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_0_ITEM": 0x61e2c, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_1_ITEM": 0x61e3a, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_2_ITEM": 0x61e48, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_3_ITEM": 0x61e56, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_4_ITEM": 0x61e64, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_5_ITEM": 0x61e72, + "Warps_SSAnneB1FRooms": 0x61f20, + "Missable_SS_Anne_B1F_Item_1": 0x61f8a, + "Missable_SS_Anne_B1F_Item_2": 0x61f91, + "Missable_SS_Anne_B1F_Item_3": 0x61f98, + "Warps_UndergroundPathNorthSouth": 0x61fd5, + "Warps_UndergroundPathWestEast": 0x61ff9, + "Warps_DiglettsCave": 0x6201d, + "Trainersanity_EVENT_BEAT_SILPH_CO_11F_TRAINER_0_ITEM": 0x62358, + "Trainersanity_EVENT_BEAT_SILPH_CO_11F_TRAINER_1_ITEM": 0x62366, + "Event_Silph_Co_President": 0x62373, + "Event_SKC11F": 0x623bd, + "Warps_SilphCo11F": 0x62446, "Ghost_Battle4": 0x708e1, - "Trade_Terry": 0x71b7b, - "Trade_Marcel": 0x71b89, - "Trade_Sailor": 0x71ba5, - "Trade_Dux": 0x71bb3, - "Trade_Marc": 0x71bc1, - "Trade_Lola": 0x71bcf, - "Trade_Doris": 0x71bdd, - "Trade_Crinkles": 0x71beb, - "Trade_Spot": 0x71bf9, - "Mon_Palettes": 0x725dd, - "Badge_Viridian_Gym": 0x749f7, - "Event_Viridian_Gym": 0x74a0b, - "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_0_ITEM": 0x74a66, - "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_1_ITEM": 0x74a74, - "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_2_ITEM": 0x74a82, - "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_3_ITEM": 0x74a90, - "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_4_ITEM": 0x74a9e, - "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_5_ITEM": 0x74aac, - "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_6_ITEM": 0x74aba, - "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_7_ITEM": 0x74ac8, - "Missable_Viridian_Gym_Item": 0x74ca0, - "Shop2": 0x74d3c, - "Missable_Cerulean_Cave_1F_Item_1": 0x74dcd, - "Missable_Cerulean_Cave_1F_Item_2": 0x74dd4, - "Missable_Cerulean_Cave_1F_Item_3": 0x74ddb, - "Event_Warden": 0x7518f, - "Missable_Wardens_House_Item": 0x7521c, - "Badge_Fuchsia_Gym": 0x75632, - "Event_Fuschia_Gym": 0x75646, - "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_0_ITEM": 0x7568c, - "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_1_ITEM": 0x7569a, - "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_2_ITEM": 0x756a8, - "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_3_ITEM": 0x756b6, - "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_4_ITEM": 0x756c4, - "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_5_ITEM": 0x756d2, - "Badge_Cinnabar_Gym": 0x75a06, - "Event_Cinnabar_Gym": 0x75a1a, - "Option_Trainersanity4": 0x75af6, - "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_B_ITEM": 0x75b02, - "Option_Trainersanity3": 0x75b46, - "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_A_ITEM": 0x75b52, - "Option_Trainersanity5": 0x75bad, - "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_2_ITEM": 0x75bb9, - "Option_Trainersanity6": 0x75bfd, - "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_3_ITEM": 0x75c09, - "Option_Trainersanity7": 0x75c4d, - "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_4_ITEM": 0x75c59, - "Option_Trainersanity8": 0x75c9d, - "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_5_ITEM": 0x75ca9, - "Option_Trainersanity9": 0x75ced, - "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_6_ITEM": 0x75cf9, - "Event_Lab_Scientist": 0x75f17, - "Fossils_Needed_For_Second_Item": 0x75fe4, - "Event_Dome_Fossil_B": 0x76061, - "Event_Helix_Fossil_B": 0x76081, - "Shop8": 0x7619f, - "Starter2_N": 0x762d2, - "Starter3_N": 0x762da, - "Trainersanity_EVENT_BEAT_LORELEIS_ROOM_TRAINER_0_ITEM": 0x7663d, - "Trainersanity_EVENT_BEAT_BRUNOS_ROOM_TRAINER_0_ITEM": 0x76796, - "Trainersanity_EVENT_BEAT_AGATHAS_ROOM_TRAINER_0_ITEM": 0x768f5, - "Option_Itemfinder": 0x76a6e, + "Trade_Terry": 0x71b77, + "Trade_Marcel": 0x71b85, + "Trade_Sailor": 0x71ba1, + "Trade_Dux": 0x71baf, + "Trade_Marc": 0x71bbd, + "Trade_Lola": 0x71bcb, + "Trade_Doris": 0x71bd9, + "Trade_Crinkles": 0x71be7, + "Trade_Spot": 0x71bf5, + "Mon_Palettes": 0x725d3, + "Badge_Viridian_Gym": 0x749d9, + "Event_Viridian_Gym": 0x749ed, + "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_0_ITEM": 0x74a48, + "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_1_ITEM": 0x74a56, + "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_2_ITEM": 0x74a64, + "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_3_ITEM": 0x74a72, + "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_4_ITEM": 0x74a80, + "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_5_ITEM": 0x74a8e, + "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_6_ITEM": 0x74a9c, + "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_7_ITEM": 0x74aaa, + "Warps_ViridianGym": 0x74c26, + "Missable_Viridian_Gym_Item": 0x74c82, + "Shop2": 0x74d1e, + "Warps_PewterMart": 0x74d4a, + "Warps_CeruleanCave1F": 0x74d85, + "Missable_Cerulean_Cave_1F_Item_1": 0x74daf, + "Missable_Cerulean_Cave_1F_Item_2": 0x74db6, + "Missable_Cerulean_Cave_1F_Item_3": 0x74dbd, + "Warps_CeruleanBadgeHouse": 0x74f28, + "Warps_FuchsiaBillsGrandpasHouse": 0x75095, + "Warps_FuchsiaPokecenter": 0x750e1, + "Event_Warden": 0x75169, + "Warps_WardensHouse": 0x751dc, + "Missable_Wardens_House_Item": 0x751f6, + "Option_Extra_Key_Items_A": 0x75324, + "Warps_SafariZoneGate": 0x7555e, + "Badge_Fuchsia_Gym": 0x7560a, + "Event_Fuschia_Gym": 0x7561e, + "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_0_ITEM": 0x75664, + "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_1_ITEM": 0x75672, + "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_2_ITEM": 0x75680, + "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_3_ITEM": 0x7568e, + "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_4_ITEM": 0x7569c, + "Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_5_ITEM": 0x756aa, + "Warps_FuchsiaGym": 0x757d5, + "Warps_FuchsiaMeetingRoom": 0x75879, + "Badge_Cinnabar_Gym": 0x759de, + "Event_Cinnabar_Gym": 0x759f2, + "Option_Trainersanity4": 0x75ace, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_B_ITEM": 0x75ada, + "Option_Trainersanity3": 0x75b1e, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_A_ITEM": 0x75b2a, + "Option_Trainersanity5": 0x75b85, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_2_ITEM": 0x75b91, + "Option_Trainersanity6": 0x75bd5, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_3_ITEM": 0x75be1, + "Option_Trainersanity7": 0x75c25, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_4_ITEM": 0x75c31, + "Option_Trainersanity8": 0x75c75, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_5_ITEM": 0x75c81, + "Option_Trainersanity9": 0x75cc5, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_6_ITEM": 0x75cd1, + "Warps_CinnabarGym": 0x75d1b, + "Warps_CinnabarLab": 0x75e02, + "Warps_CinnabarLabTradeRoom": 0x75e94, + "Event_Lab_Scientist": 0x75ee9, + "Warps_CinnabarLabMetronomeRoom": 0x75f35, + "Fossils_Needed_For_Second_Item": 0x75fb6, + "Fossil_Level": 0x76017, + "Event_Dome_Fossil_B": 0x76031, + "Event_Helix_Fossil_B": 0x76051, + "Warps_CinnabarLabFossilRoom": 0x760d2, + "Warps_CinnabarPokecenter": 0x76128, + "Shop8": 0x7616f, + "Warps_CinnabarMart": 0x7619b, + "Warps_CopycatsHouse1F": 0x761ed, + "Starter2_N": 0x762a2, + "Starter3_N": 0x762aa, + "Warps_ChampionsRoom": 0x764d5, + "Trainersanity_EVENT_BEAT_LORELEIS_ROOM_TRAINER_0_ITEM": 0x76604, + "Warps_LoreleisRoom": 0x76628, + "Trainersanity_EVENT_BEAT_BRUNOS_ROOM_TRAINER_0_ITEM": 0x7675d, + "Warps_BrunosRoom": 0x76781, + "Trainersanity_EVENT_BEAT_AGATHAS_ROOM_TRAINER_0_ITEM": 0x768bc, + "Warps_AgathasRoom": 0x768e0, + "Option_Itemfinder": 0x76a33, "Text_Quiz_A": 0x88806, "Text_Quiz_B": 0x8893a, "Text_Quiz_C": 0x88a6e, @@ -982,8 +1632,13 @@ rom_addresses = { "Text_Quiz_E": 0x88cd6, "Text_Quiz_F": 0x88e0a, "Text_Magikarp_Salesman": 0x8ae3f, - "Text_Rock_Tunnel_Sign": 0x8e82a, + "Text_Saffron_Gate": 0x8aef5, + "Text_Rock_Tunnel_Sign": 0x8e7db, "Text_Badges_Needed": 0x92304, + "Text_Rt23_Badges_A": 0x9245c, + "Text_Rt23_Badges_B": 0x92474, + "Text_Rt23_Badges_C": 0x924a6, + "Text_Rt23_Badges_D": 0x924c0, "Badge_Text_Boulder_Badge": 0x99010, "Badge_Text_Cascade_Badge": 0x99028, "Badge_Text_Thunder_Badge": 0x9906e, @@ -993,4 +1648,6 @@ rom_addresses = { "Badge_Text_Volcano_Badge": 0x99133, "Badge_Text_Earth_Badge": 0x99150, "Text_Badges_Needed_Viridian_Gym": 0xa49f2, + "Text_Gym_Guy": 0xa4c0b, + "wElevatorWarpMaps": 0xcc5b, } diff --git a/worlds/pokemon_rb/rules.py b/worlds/pokemon_rb/rules.py index 33fe248a..63930496 100644 --- a/worlds/pokemon_rb/rules.py +++ b/worlds/pokemon_rb/rules.py @@ -1,229 +1,279 @@ from ..generic.Rules import add_item_rule, add_rule, location_item_name from .items import item_groups +from . import logic -def set_rules(world, player): +def set_rules(multiworld, player): item_rules = { - "Pallet Town - Player's PC": (lambda i: i.player == player and "Badge" not in i.name and "Trap" not in i.name - and i.name != "Pokedex" and "Coins" not in i.name) + # Some items do special things when they are passed into the GiveItem function in the game, but + # withdrawing from the PC or buying from a shop will not call the function and will add the items + # directly to the inventory, so we need to avoid placing these special items (including "AP Item") to + # such places + "Player's House 2F - Player's PC": (lambda i: i.player == player and "Badge" not in i.name and "Trap" not in + i.name and i.name != "Pokedex" and "Coins" not in i.name and "Progressive" + not in i.name) } - if world.prizesanity[player]: + if multiworld.prizesanity[player]: def prize_rule(i): return i.player != player or i.name in item_groups["Unique"] item_rules["Celadon Prize Corner - Item Prize 1"] = prize_rule item_rules["Celadon Prize Corner - Item Prize 2"] = prize_rule item_rules["Celadon Prize Corner - Item Prize 3"] = prize_rule - if world.accessibility[player] != "locations": - world.get_location("Cerulean City - Bicycle Shop", player).always_allow = (lambda state, item: + if multiworld.accessibility[player] != "locations": + multiworld.get_location("Cerulean Bicycle Shop", player).always_allow = (lambda state, item: item.name == "Bike Voucher" and item.player == player) - world.get_location("Fuchsia City - Safari Zone Warden", player).always_allow = (lambda state, item: + multiworld.get_location("Fuchsia Warden's House - Safari Zone Warden", player).always_allow = (lambda state, item: item.name == "Gold Teeth" and item.player == player) access_rules = { - "Pallet Town - Rival's Sister": lambda state: state.has("Oak's Parcel", player), - "Pallet Town - Oak's Post-Route-22-Rival Gift": lambda state: state.has("Oak's Parcel", player), - "Viridian City - Sleepy Guy": lambda state: state.pokemon_rb_can_cut(player) or state.pokemon_rb_can_surf(player), - "Route 2 - Oak's Aide": lambda state: state.pokemon_rb_oaks_aide(state.multiworld.oaks_aide_rt_2[player].value + 5, player), - "Pewter City - Museum": lambda state: state.pokemon_rb_can_cut(player), - "Cerulean City - Bicycle Shop": lambda state: state.has("Bike Voucher", player) - or location_item_name(state, "Cerulean City - Bicycle Shop", player) == ("Bike Voucher", player), - "Lavender Town - Mr. Fuji": lambda state: state.has("Fuji Saved", player), - "Vermilion Gym - Lt. Surge 1": lambda state: state.pokemon_rb_can_cut(player or state.pokemon_rb_can_surf(player)), - "Vermilion Gym - Lt. Surge 2": lambda state: state.pokemon_rb_can_cut(player or state.pokemon_rb_can_surf(player)), - "Route 11 - Oak's Aide": lambda state: state.pokemon_rb_oaks_aide(state.multiworld.oaks_aide_rt_11[player].value + 5, player), - "Celadon City - Stranded Man": lambda state: state.pokemon_rb_can_surf(player), - "Silph Co 11F - Silph Co President (Card Key)": lambda state: state.has("Card Key", player), - "Fuchsia City - Safari Zone Warden": lambda state: state.has("Gold Teeth", player) - or location_item_name(state, "Fuchsia City - Safari Zone Warden", player) == ("Gold Teeth", player), - "Route 12 - Island Item": lambda state: state.pokemon_rb_can_surf(player), - "Route 12 - Item Behind Cuttable Tree": lambda state: state.pokemon_rb_can_cut(player), - "Route 15 - Oak's Aide": lambda state: state.pokemon_rb_oaks_aide(state.multiworld.oaks_aide_rt_15[player].value + 5, player), - "Route 15 - Item": lambda state: state.pokemon_rb_can_cut(player), - "Route 25 - Item": lambda state: state.pokemon_rb_can_cut(player), - "Fuchsia City - Warden's House Item": lambda state: state.pokemon_rb_can_strength(player), - "Rocket Hideout B4F - Southwest Item (Lift Key)": lambda state: state.has("Lift Key", player), - "Rocket Hideout B4F - Giovanni Item (Lift Key)": lambda state: state.has("Lift Key", player), - "Silph Co 3F - Item (Card Key)": lambda state: state.has("Card Key", player), - "Silph Co 4F - Left Item (Card Key)": lambda state: state.has("Card Key", player), - "Silph Co 4F - Middle Item (Card Key)": lambda state: state.has("Card Key", player), - "Silph Co 4F - Right Item (Card Key)": lambda state: state.has("Card Key", player), - "Silph Co 5F - Northwest Item (Card Key)": lambda state: state.has("Card Key", player), - "Silph Co 6F - West Item (Card Key)": lambda state: state.has("Card Key", player), - "Silph Co 6F - Southwest Item (Card Key)": lambda state: state.has("Card Key", player), - "Silph Co 7F - East Item (Card Key)": lambda state: state.has("Card Key", player), - "Safari Zone Center - Island Item": lambda state: state.pokemon_rb_can_surf(player), - "Celadon Prize Corner - Item Prize 1": lambda state: state.has("Coin Case", player), - "Celadon Prize Corner - Item Prize 2": lambda state: state.has("Coin Case", player), - "Celadon Prize Corner - Item Prize 3": lambda state: state.has("Coin Case", player), - "Celadon Game Corner - West Gambler's Gift (Coin Case)": lambda state: state.has("Coin Case", player), - "Celadon Game Corner - Center Gambler's Gift (Coin Case)": lambda state: state.has("Coin Case", player), - "Celadon Game Corner - East Gambler's Gift (Coin Case)": lambda state: state.has("Coin Case", player), - "Celadon Game Corner - Hidden Item Northwest By Counter (Coin Case)": lambda state: state.has("Coin Case", player) and state.pokemon_rb_can_get_hidden_items(player), - "Celadon Game Corner - Hidden Item Southwest Corner (Coin Case)": lambda state: state.has("Coin Case", player) and state.pokemon_rb_can_get_hidden_items(player), - "Celadon Game Corner - Hidden Item Near Rumor Man (Coin Case)": lambda state: state.has("Coin Case", player) and state.pokemon_rb_can_get_hidden_items(player), - "Celadon Game Corner - Hidden Item Near Speculating Woman (Coin Case)": lambda state: state.has("Coin Case", player) and state.pokemon_rb_can_get_hidden_items(player), - "Celadon Game Corner - Hidden Item Near West Gifting Gambler (Coin Case)": lambda state: state.has("Coin Case", player) and state.pokemon_rb_can_get_hidden_items(player), - "Celadon Game Corner - Hidden Item Near Wonderful Time Woman (Coin Case)": lambda state: state.has("Coin Case", player) and state.pokemon_rb_can_get_hidden_items(player), - "Celadon Game Corner - Hidden Item Near Failing Gym Information Guy (Coin Case)": lambda state: state.has( "Coin Case", player) and state.pokemon_rb_can_get_hidden_items(player), - "Celadon Game Corner - Hidden Item Near East Gifting Gambler (Coin Case)": lambda state: state.has("Coin Case", player) and state.pokemon_rb_can_get_hidden_items(player), - "Celadon Game Corner - Hidden Item Near Hooked Guy (Coin Case)": lambda state: state.has("Coin Case", player) and state.pokemon_rb_can_get_hidden_items(player), - "Celadon Game Corner - Hidden Item at End of Horizontal Machine Row (Coin Case)": lambda state: state.has("Coin Case", player) and state.pokemon_rb_can_get_hidden_items(player), - "Celadon Game Corner - Hidden Item in Front of Horizontal Machine Row (Coin Case)": lambda state: state.has("Coin Case", player) and state.pokemon_rb_can_get_hidden_items(player), + "Rival's House - Rival's Sister": lambda state: state.has("Oak's Parcel", player), + "Oak's Lab - Oak's Post-Route-22-Rival Gift": lambda state: state.has("Oak's Parcel", player), + "Viridian City - Sleepy Guy": lambda state: logic.can_cut(state, player) or logic.can_surf(state, player), + "Route 2 Gate - Oak's Aide": lambda state: logic.oaks_aide(state, state.multiworld.oaks_aide_rt_2[player].value + 5, player), + "Cerulean Bicycle Shop": lambda state: state.has("Bike Voucher", player) + or location_item_name(state, "Cerulean Bicycle Shop", player) == ("Bike Voucher", player), + "Lavender Mr. Fuji's House - Mr. Fuji": lambda state: state.has("Fuji Saved", player), + "Route 11 Gate 2F - Oak's Aide": lambda state: logic.oaks_aide(state, state.multiworld.oaks_aide_rt_11[player].value + 5, player), + "Celadon City - Stranded Man": lambda state: logic.can_surf(state, player), + "Fuchsia Warden's House - Safari Zone Warden": lambda state: state.has("Gold Teeth", player) + or location_item_name(state, "Fuchsia Warden's House - Safari Zone Warden", player) == ("Gold Teeth", player), + "Route 12 - Island Item": lambda state: logic.can_surf(state, player), + "Route 15 Gate 2F - Oak's Aide": lambda state: logic.oaks_aide(state, state.multiworld.oaks_aide_rt_15[player].value + 5, player), + "Route 25 - Item": lambda state: logic.can_cut(state, player), + "Fuchsia Warden's House - Behind Boulder Item": lambda state: logic.can_strength(state, player), + "Safari Zone Center - Island Item": lambda state: logic.can_surf(state, player), + "Saffron Copycat's House 2F - Copycat": lambda state: state.has("Buy Poke Doll", player), - "Silph Co 11F - Silph Co Liberated": lambda state: state.has("Card Key", player), + "Celadon Game Corner - West Gambler's Gift": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Center Gambler's Gift": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - East Gambler's Gift": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Hidden Item Northwest By Counter": lambda state: state.has("Coin Case", player) and logic.can_get_hidden_items(state, player), + "Celadon Game Corner - Hidden Item Southwest Corner": lambda state: state.has("Coin Case", player) and logic.can_get_hidden_items(state, player), + "Celadon Game Corner - Hidden Item Near Rumor Man": lambda state: state.has("Coin Case", player) and logic.can_get_hidden_items(state, player), + "Celadon Game Corner - Hidden Item Near Speculating Woman": lambda state: state.has("Coin Case", player) and logic.can_get_hidden_items(state, player), + "Celadon Game Corner - Hidden Item Near West Gifting Gambler": lambda state: state.has("Coin Case", player) and logic.can_get_hidden_items(state, player), + "Celadon Game Corner - Hidden Item Near Wonderful Time Woman": lambda state: state.has("Coin Case", player) and logic.can_get_hidden_items(state, player), + "Celadon Game Corner - Hidden Item Near Failing Gym Information Guy": lambda state: state.has( "Coin Case", player) and logic.can_get_hidden_items(state, player), + "Celadon Game Corner - Hidden Item Near East Gifting Gambler": lambda state: state.has("Coin Case", player) and logic.can_get_hidden_items(state, player), + "Celadon Game Corner - Hidden Item Near Hooked Guy": lambda state: state.has("Coin Case", player) and logic.can_get_hidden_items(state, player), + "Celadon Game Corner - Hidden Item at End of Horizontal Machine Row": lambda state: state.has("Coin Case", player) and logic.can_get_hidden_items(state, player), + "Celadon Game Corner - Hidden Item in Front of Horizontal Machine Row": lambda state: state.has("Coin Case", player) and logic.can_get_hidden_items(state, player), - "Pallet Town - Super Rod Pokemon - 1": lambda state: state.has("Super Rod", player), - "Pallet Town - Super Rod Pokemon - 2": lambda state: state.has("Super Rod", player), - "Route 22 - Super Rod Pokemon - 1": lambda state: state.has("Super Rod", player), - "Route 22 - Super Rod Pokemon - 2": lambda state: state.has("Super Rod", player), - "Route 24 - Super Rod Pokemon - 1": lambda state: state.has("Super Rod", player), - "Route 24 - Super Rod Pokemon - 2": lambda state: state.has("Super Rod", player), - "Route 24 - Super Rod Pokemon - 3": lambda state: state.has("Super Rod", player), - "Route 6 - Super Rod Pokemon - 1": lambda state: state.has("Super Rod", player), - "Route 6 - Super Rod Pokemon - 2": lambda state: state.has("Super Rod", player), - "Route 10 - Super Rod Pokemon - 1": lambda state: state.has("Super Rod", player), - "Route 10 - Super Rod Pokemon - 2": lambda state: state.has("Super Rod", player), - "Safari Zone Center - Super Rod Pokemon - 1": lambda state: state.has("Super Rod", player), - "Safari Zone Center - Super Rod Pokemon - 2": lambda state: state.has("Super Rod", player), - "Safari Zone Center - Super Rod Pokemon - 3": lambda state: state.has("Super Rod", player), - "Safari Zone Center - Super Rod Pokemon - 4": lambda state: state.has("Super Rod", player), - "Route 12 - Super Rod Pokemon - 1": lambda state: state.has("Super Rod", player), - "Route 12 - Super Rod Pokemon - 2": lambda state: state.has("Super Rod", player), - "Route 12 - Super Rod Pokemon - 3": lambda state: state.has("Super Rod", player), - "Route 12 - Super Rod Pokemon - 4": lambda state: state.has("Super Rod", player), - "Route 19 - Super Rod Pokemon - 1": lambda state: state.has("Super Rod", player), - "Route 19 - Super Rod Pokemon - 2": lambda state: state.has("Super Rod", player), - "Route 19 - Super Rod Pokemon - 3": lambda state: state.has("Super Rod", player), - "Route 19 - Super Rod Pokemon - 4": lambda state: state.has("Super Rod", player), - "Route 23 - Super Rod Pokemon - 1": lambda state: state.has("Super Rod", player), - "Route 23 - Super Rod Pokemon - 2": lambda state: state.has("Super Rod", player), - "Route 23 - Super Rod Pokemon - 3": lambda state: state.has("Super Rod", player), - "Route 23 - Super Rod Pokemon - 4": lambda state: state.has("Super Rod", player), - "Fuchsia City - Super Rod Pokemon - 1": lambda state: state.has("Super Rod", player), - "Fuchsia City - Super Rod Pokemon - 2": lambda state: state.has("Super Rod", player), - "Fuchsia City - Super Rod Pokemon - 3": lambda state: state.has("Super Rod", player), - "Fuchsia City - Super Rod Pokemon - 4": lambda state: state.has("Super Rod", player), - "Anywhere - Good Rod Pokemon - 1": lambda state: state.has("Good Rod", player), - "Anywhere - Good Rod Pokemon - 2": lambda state: state.has("Good Rod", player), - "Anywhere - Old Rod Pokemon": lambda state: state.has("Old Rod", player), - "Celadon Prize Corner - Pokemon Prize - 1": lambda state: state.has("Coin Case", player), - "Celadon Prize Corner - Pokemon Prize - 2": lambda state: state.has("Coin Case", player), - "Celadon Prize Corner - Pokemon Prize - 3": lambda state: state.has("Coin Case", player), - "Celadon Prize Corner - Pokemon Prize - 4": lambda state: state.has("Coin Case", player), - "Celadon Prize Corner - Pokemon Prize - 5": lambda state: state.has("Coin Case", player), - "Celadon Prize Corner - Pokemon Prize - 6": lambda state: state.has("Coin Case", player), - "Cinnabar Island - Old Amber Pokemon": lambda state: state.has("Old Amber", player), - "Cinnabar Island - Helix Fossil Pokemon": lambda state: state.has("Helix Fossil", player), - "Cinnabar Island - Dome Fossil Pokemon": lambda state: state.has("Dome Fossil", player), + "Celadon Prize Corner - Item Prize 1": lambda state: state.has("Coin Case", player) and state.has("Game Corner", player), + "Celadon Prize Corner - Item Prize 2": lambda state: state.has("Coin Case", player) and state.has("Game Corner", player), + "Celadon Prize Corner - Item Prize 3": lambda state: state.has("Coin Case", player) and state.has("Game Corner", player), + + "Celadon Prize Corner - Pokemon Prize - 1": lambda state: state.has("Coin Case", player) and state.has("Game Corner", player), + "Celadon Prize Corner - Pokemon Prize - 2": lambda state: state.has("Coin Case", player) and state.has("Game Corner", player), + "Celadon Prize Corner - Pokemon Prize - 3": lambda state: state.has("Coin Case", player) and state.has("Game Corner", player), + "Celadon Prize Corner - Pokemon Prize - 4": lambda state: state.has("Coin Case", player) and state.has("Game Corner", player), + "Celadon Prize Corner - Pokemon Prize - 5": lambda state: state.has("Coin Case", player) and state.has("Game Corner", player), + "Celadon Prize Corner - Pokemon Prize - 6": lambda state: state.has("Coin Case", player) and state.has("Game Corner", player), + "Cinnabar Lab Fossil Room - Old Amber Pokemon": lambda state: state.has("Old Amber", player) and state.has("Cinnabar Island", player), + "Cinnabar Lab Fossil Room - Helix Fossil Pokemon": lambda state: state.has("Helix Fossil", player) and state.has("Cinnabar Island", player), + "Cinnabar Lab Fossil Room - Dome Fossil Pokemon": lambda state: state.has("Dome Fossil", player) and state.has("Cinnabar Island", player), "Route 12 - Sleeping Pokemon": lambda state: state.has("Poke Flute", player), "Route 16 - Sleeping Pokemon": lambda state: state.has("Poke Flute", player), - "Seafoam Islands B4F - Legendary Pokemon": lambda state: state.pokemon_rb_can_strength(player), - "Vermilion City - Legendary Pokemon": lambda state: state.pokemon_rb_can_surf(player) and state.has("S.S. Ticket", player), + "Seafoam Islands B4F - Legendary Pokemon": lambda state: logic.can_strength(state, player) and state.has("Seafoam Boss Boulders", player), + "Vermilion Dock - Legendary Pokemon": lambda state: logic.can_surf(state, player), + "Cerulean Cave B1F - Legendary Pokemon": lambda state: logic.can_surf(state, player), **{f"Pokemon Tower {floor}F - Wild Pokemon - {slot}": lambda state: state.has("Silph Scope", player) for floor in range(3, 8) for slot in range(1, 11)}, + "Pokemon Tower 6F - Restless Soul": lambda state: state.has("Silph Scope", player), # just for level scaling - "Route 2 - Marcel Trade": lambda state: state.can_reach("Route 24 - Wild Pokemon - 6", "Location", player), - "Underground Tunnel West-East - Spot Trade": lambda state: state.can_reach("Route 24 - Wild Pokemon - 6", "Location", player), - "Route 11 - Terry Trade": lambda state: state.can_reach("Safari Zone Center - Wild Pokemon - 5", "Location", player), - "Route 18 - Marc Trade": lambda state: state.can_reach("Route 23 - Super Rod Pokemon - 1", "Location", player), - "Cinnabar Island - Sailor Trade": lambda state: state.can_reach("Pokemon Mansion 1F - Wild Pokemon - 3", "Location", player), - "Cinnabar Island - Crinkles Trade": lambda state: state.can_reach("Route 12 - Wild Pokemon - 4", "Location", player), - "Cinnabar Island - Doris Trade": lambda state: state.can_reach("Cerulean Cave 1F - Wild Pokemon - 9", "Location", player), - "Vermilion City - Dux Trade": lambda state: state.can_reach("Route 3 - Wild Pokemon - 2", "Location", player), - "Cerulean City - Lola Trade": lambda state: state.can_reach("Route 10 - Super Rod Pokemon - 1", "Location", player), + "Silph Co 1F - Receptionist": lambda state: state.has("Silph Co Liberated", player), + "Silph Co 5F - Hostage": lambda state: logic.card_key(state, 5, player), + "Silph Co 7F - Hostage": lambda state: logic.card_key(state, 7, player), + + "Route 2 Trade House - Marcel Trade": lambda state: state.can_reach("Route 24 - Wild Pokemon - 6", "Location", player), + "Underground Path Route 5 - Spot Trade": lambda state: state.can_reach("Route 24 - Wild Pokemon - 6", "Location", player), + "Route 11 Gate 2F - Terry Trade": lambda state: state.can_reach("Safari Zone Center - Wild Pokemon - 5", "Location", player), + "Route 18 Gate 2F - Marc Trade": lambda state: state.can_reach("Route 23/Cerulean Cave Fishing - Super Rod Pokemon - 1", "Location", player), + "Cinnabar Lab Fossil Room - Sailor Trade": lambda state: state.can_reach("Pokemon Mansion 1F - Wild Pokemon - 3", "Location", player), + "Cinnabar Lab Trade Room - Crinkles Trade": lambda state: state.can_reach("Route 12 - Wild Pokemon - 4", "Location", player), + "Cinnabar Lab Trade Room - Doris Trade": lambda state: state.can_reach("Cerulean Cave 1F - Wild Pokemon - 9", "Location", player), + "Vermilion Trade House - Dux Trade": lambda state: state.can_reach("Route 3 - Wild Pokemon - 2", "Location", player), + "Cerulean Trade House - Lola Trade": lambda state: state.can_reach("Route 10/Celadon Fishing - Super Rod Pokemon - 1", "Location", player), + + "Route 22 - Trainer Parties": lambda state: state.has("Oak's Parcel", player), + + # # Rock Tunnel + # "Rock Tunnel 1F - PokeManiac": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel 1F - Hiker 1": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel 1F - Hiker 2": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel 1F - Hiker 3": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel 1F - Jr. Trainer F 1": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel 1F - Jr. Trainer F 2": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel 1F - Jr. Trainer F 3": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - PokeManiac 1": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - PokeManiac 2": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - PokeManiac 3": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - Jr. Trainer F 1": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - Jr. Trainer F 2": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - Hiker 1": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - Hiker 2": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - Hiker 3": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - North Item": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - Northwest Item": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - Southwest Item": lambda state: logic.rock_tunnel(state, player), + # "Rock Tunnel B1F - West Item": lambda state: logic.rock_tunnel(state, player), # Pokédex check - "Pallet Town - Oak's Parcel Reward": lambda state: state.has("Oak's Parcel", player), + "Oak's Lab - Oak's Parcel Reward": lambda state: state.has("Oak's Parcel", player), - # trainers - "Route 4 - Cooltrainer F": lambda state: state.pokemon_rb_can_surf(player), - "Route 15 - Jr. Trainer F 1": lambda state: state.pokemon_rb_can_cut(player), - "Silph Co 11F - Rocket 2 (Card Key)": lambda state: state.has("Card Key", player), - "Silph Co 9F - Rocket 2 (Card Key)": lambda state: state.has("Card Key", player), - "Silph Co 3F - Scientist (Card Key)": lambda state: state.has("Card Key", player), - "Route 10 - Pokemaniac": lambda state: state.pokemon_rb_can_surf(player), - "Rocket Hideout B1F - Rocket 5 (Lift Key)": lambda state: state.has("Lift Key", player), - "Rocket Hideout B4F - Rocket 2 (Lift Key)": lambda state: state.has("Lift Key", player), - "Rocket Hideout B4F - Rocket 3 (Lift Key)": lambda state: state.has("Lift Key", player), - - # hidden items - "Viridian Forest - Hidden Item Northwest by Trainer": lambda state: state.pokemon_rb_can_get_hidden_items( + # Hidden items + "Viridian Forest - Hidden Item Northwest by Trainer": lambda state: logic.can_get_hidden_items(state, player), - "Viridian Forest - Hidden Item Entrance Tree": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Mt Moon B2F - Hidden Item Dead End Before Fossils": lambda state: state.pokemon_rb_can_get_hidden_items( + "Viridian Forest - Hidden Item Entrance Tree": lambda state: logic.can_get_hidden_items(state, player), + "Mt Moon B2F - Hidden Item Dead End Before Fossils": lambda state: logic.can_get_hidden_items(state, player), - "Route 25 - Hidden Item Fence Outside Bill's House": lambda state: state.pokemon_rb_can_get_hidden_items( + "Route 25 - Hidden Item Fence Outside Bill's House": lambda state: logic.can_get_hidden_items(state, player), - "Route 9 - Hidden Item Bush By Grass": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "S.S. Anne 1F - Hidden Item Kitchen Trash": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "S.S. Anne B1F - Hidden Item Under Pillow": lambda state: state.pokemon_rb_can_get_hidden_items(player), + "Route 9 - Hidden Item Bush By Grass": lambda state: logic.can_get_hidden_items(state, player), + "S.S. Anne Kitchen - Hidden Item Kitchen Trash": lambda state: logic.can_get_hidden_items(state, player), + "S.S. Anne B1F Rooms - Hidden Item Under Pillow": lambda state: logic.can_get_hidden_items(state, player), "Route 10 - Hidden Item Behind Rock Tunnel Entrance Cuttable Tree": lambda - state: state.pokemon_rb_can_get_hidden_items(player), - "Route 10 - Hidden Item Bush": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Rocket Hideout B1F - Hidden Item Pot Plant": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Rocket Hideout B3F - Hidden Item Near East Item": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Rocket Hideout B4F - Hidden Item Behind Giovanni (Lift Key)": lambda state: - state.pokemon_rb_can_get_hidden_items(player) and state.has("Lift Key", player), - "Pokemon Tower 5F - Hidden Item Near West Staircase": lambda state: state.pokemon_rb_can_get_hidden_items( + state: logic.can_get_hidden_items(state, player) and logic.can_cut(state, player), + "Route 10 - Hidden Item Bush": lambda state: logic.can_get_hidden_items(state, player), + "Rocket Hideout B1F - Hidden Item Pot Plant": lambda state: logic.can_get_hidden_items(state, player), + "Rocket Hideout B3F - Hidden Item Near East Item": lambda state: logic.can_get_hidden_items(state, player), + "Rocket Hideout B4F - Hidden Item Behind Giovanni": lambda state: + logic.can_get_hidden_items(state, player), + "Pokemon Tower 5F - Hidden Item Near West Staircase": lambda state: logic.can_get_hidden_items(state, player), - "Route 13 - Hidden Item Dead End Bush": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Route 13 - Hidden Item Dead End By Water Corner": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Pokemon Mansion B1F - Hidden Item Secret Key Room Corner": lambda state: state.pokemon_rb_can_get_hidden_items( + "Route 13 - Hidden Item Dead End Bush": lambda state: logic.can_get_hidden_items(state, player), + "Route 13 - Hidden Item Dead End By Water Corner": lambda state: logic.can_get_hidden_items(state, player), + "Pokemon Mansion B1F - Hidden Item Secret Key Room Corner": lambda state: logic.can_get_hidden_items(state, player), - "Safari Zone West - Hidden Item Secret House Statue": lambda state: state.pokemon_rb_can_get_hidden_items( + "Safari Zone West - Hidden Item Secret House Statue": lambda state: logic.can_get_hidden_items(state, player), - "Silph Co 5F - Hidden Item Pot Plant": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Silph Co 9F - Hidden Item Nurse Bed (Card Key)": lambda state: state.pokemon_rb_can_get_hidden_items( - player) and state.has("Card Key", player), - "Copycat's House - Hidden Item Desk": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Cerulean Cave 1F - Hidden Item Center Rocks": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Cerulean Cave B1F - Hidden Item Northeast Rocks": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Power Plant - Hidden Item Central Dead End": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Power Plant - Hidden Item Before Zapdos": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Seafoam Islands B2F - Hidden Item Rock": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Seafoam Islands B4F - Hidden Item Corner Island": lambda state: state.pokemon_rb_can_get_hidden_items(player), + "Silph Co 5F - Hidden Item Pot Plant": lambda state: logic.can_get_hidden_items(state, player), + "Silph Co 9F - Hidden Item Nurse Bed": lambda state: logic.can_get_hidden_items(state, player), + "Saffron Copycat's House 2F - Hidden Item Desk": lambda state: logic.can_get_hidden_items(state, player), + "Cerulean Cave 1F - Hidden Item Center Rocks": lambda state: logic.can_get_hidden_items(state, player), + "Cerulean Cave B1F - Hidden Item Northeast Rocks": lambda state: logic.can_get_hidden_items(state, player), + "Power Plant - Hidden Item Central Dead End": lambda state: logic.can_get_hidden_items(state, player), + "Power Plant - Hidden Item Before Zapdos": lambda state: logic.can_get_hidden_items(state, player), + "Seafoam Islands B2F - Hidden Item Rock": lambda state: logic.can_get_hidden_items(state, player), + "Seafoam Islands B3F - Hidden Item Rock": lambda state: logic.can_get_hidden_items(state, player), + # if you can reach any exit boulders, that means you can drop into the water tunnel and auto-surf + "Seafoam Islands B4F - Hidden Item Corner Island": lambda state: logic.can_get_hidden_items(state, player), "Pokemon Mansion 1F - Hidden Item Block Near Entrance Carpet": lambda - state: state.pokemon_rb_can_get_hidden_items(player), - "Pokemon Mansion 3F - Hidden Item Behind Burglar": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Route 23 - Hidden Item Rocks Before Victory Road": lambda state: state.pokemon_rb_can_get_hidden_items( + state: logic.can_get_hidden_items(state, player), + "Pokemon Mansion 3F - Hidden Item Behind Burglar": lambda state: logic.can_get_hidden_items(state, player), + "Route 23 - Hidden Item Rocks Before Victory Road": lambda state: logic.can_get_hidden_items(state, player), - "Route 23 - Hidden Item East Bush After Water": lambda state: state.pokemon_rb_can_get_hidden_items( + "Route 23 - Hidden Item East Bush After Water": lambda state: logic.can_get_hidden_items(state, player), - "Route 23 - Hidden Item On Island": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Victory Road 2F - Hidden Item Rock Before Moltres": lambda state: state.pokemon_rb_can_get_hidden_items( + "Route 23 - Hidden Item On Island": lambda state: logic.can_get_hidden_items(state, + player) and logic.can_surf(state, player), + "Victory Road 2F - Hidden Item Rock Before Moltres": lambda state: logic.can_get_hidden_items(state, player), - "Victory Road 2F - Hidden Item Rock In Final Room": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Viridian City - Hidden Item Cuttable Tree": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Route 11 - Hidden Item Isolated Bush Near Gate": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Route 12 - Hidden Item Bush Near Gate": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Route 17 - Hidden Item In Grass": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Route 17 - Hidden Item Near Northernmost Sign": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Route 17 - Hidden Item East Center": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Route 17 - Hidden Item West Center": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Route 17 - Hidden Item Before Final Bridge": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Underground Tunnel North-South - Hidden Item Near Northern Stairs": lambda - state: state.pokemon_rb_can_get_hidden_items(player), - "Underground Tunnel North-South - Hidden Item Near Southern Stairs": lambda - state: state.pokemon_rb_can_get_hidden_items(player), - "Underground Tunnel West-East - Hidden Item West": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Underground Tunnel West-East - Hidden Item East": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Celadon City - Hidden Item Dead End Near Cuttable Tree": lambda state: state.pokemon_rb_can_get_hidden_items( + "Victory Road 2F - Hidden Item Rock In Final Room": lambda state: logic.can_get_hidden_items(state, player), + "Viridian City - Hidden Item Cuttable Tree": lambda state: logic.can_get_hidden_items(state, player), + "Route 11 - Hidden Item Isolated Bush Near Gate": lambda state: logic.can_get_hidden_items(state, player), + "Route 12 - Hidden Item Bush Near Gate": lambda state: logic.can_get_hidden_items(state, player), + "Route 17 - Hidden Item In Grass": lambda state: logic.can_get_hidden_items(state, player), + "Route 17 - Hidden Item Near Northernmost Sign": lambda state: logic.can_get_hidden_items(state, player), + "Route 17 - Hidden Item East Center": lambda state: logic.can_get_hidden_items(state, player), + "Route 17 - Hidden Item West Center": lambda state: logic.can_get_hidden_items(state, player), + "Route 17 - Hidden Item Before Final Bridge": lambda state: logic.can_get_hidden_items(state, player), + "Underground Path North South - Hidden Item Near Northern Stairs": lambda + state: logic.can_get_hidden_items(state, player), + "Underground Path North South - Hidden Item Near Southern Stairs": lambda + state: logic.can_get_hidden_items(state, player), + "Underground Path West East - Hidden Item West": lambda state: logic.can_get_hidden_items(state, player), + "Underground Path West East - Hidden Item East": lambda state: logic.can_get_hidden_items(state, player), + "Celadon City - Hidden Item Dead End Near Cuttable Tree": lambda state: logic.can_get_hidden_items(state, player), - "Route 25 - Hidden Item Northeast Of Grass": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Mt Moon B2F - Hidden Item Lone Rock": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Seafoam Islands B3F - Hidden Item Rock": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Vermilion City - Hidden Item In Water Near Fan Club": lambda state: state.pokemon_rb_can_get_hidden_items( - player) and state.pokemon_rb_can_surf(player), - "Cerulean City - Hidden Item Gym Badge Guy's Backyard": lambda state: state.pokemon_rb_can_get_hidden_items( + "Route 25 - Hidden Item Northeast Of Grass": lambda state: logic.can_get_hidden_items(state, player), + "Mt Moon B2F - Hidden Item Lone Rock": lambda state: logic.can_get_hidden_items(state, player), + "Vermilion City - Hidden Item In Water Near Fan Club": lambda state: logic.can_get_hidden_items(state, + player) and logic.can_surf(state, player), + "Cerulean City - Hidden Item Gym Badge Guy's Backyard": lambda state: logic.can_get_hidden_items(state, player), - "Route 4 - Hidden Item Plateau East Of Mt Moon": lambda state: state.pokemon_rb_can_get_hidden_items(player), + "Route 4 - Hidden Item Plateau East Of Mt Moon": lambda state: logic.can_get_hidden_items(state, player), + + # Evolutions + "Evolution - Ivysaur": lambda state: state.has("Bulbasaur", player) and logic.evolve_level(state, 16, player), + "Evolution - Venusaur": lambda state: state.has("Ivysaur", player) and logic.evolve_level(state, 32, player), + "Evolution - Charmeleon": lambda state: state.has("Charmander", player) and logic.evolve_level(state, 16, player), + "Evolution - Charizard": lambda state: state.has("Charmeleon", player) and logic.evolve_level(state, 36, player), + "Evolution - Wartortle": lambda state: state.has("Squirtle", player) and logic.evolve_level(state, 16, player), + "Evolution - Blastoise": lambda state: state.has("Wartortle", player) and logic.evolve_level(state, 36, player), + "Evolution - Metapod": lambda state: state.has("Caterpie", player) and logic.evolve_level(state, 7, player), + "Evolution - Butterfree": lambda state: state.has("Metapod", player) and logic.evolve_level(state, 10, player), + "Evolution - Kakuna": lambda state: state.has("Weedle", player) and logic.evolve_level(state, 7, player), + "Evolution - Beedrill": lambda state: state.has("Kakuna", player) and logic.evolve_level(state, 10, player), + "Evolution - Pidgeotto": lambda state: state.has("Pidgey", player) and logic.evolve_level(state, 18, player), + "Evolution - Pidgeot": lambda state: state.has("Pidgeotto", player) and logic.evolve_level(state, 36, player), + "Evolution - Raticate": lambda state: state.has("Rattata", player) and logic.evolve_level(state, 20, player), + "Evolution - Fearow": lambda state: state.has("Spearow", player) and logic.evolve_level(state, 20, player), + "Evolution - Arbok": lambda state: state.has("Ekans", player) and logic.evolve_level(state, 22, player), + "Evolution - Raichu": lambda state: state.has("Pikachu", player) and state.has("Thunder Stone", player), + "Evolution - Sandslash": lambda state: state.has("Sandshrew", player) and logic.evolve_level(state, 22, player), + "Evolution - Nidorina": lambda state: state.has("Nidoran F", player) and logic.evolve_level(state, 16, player), + "Evolution - Nidoqueen": lambda state: state.has("Nidorina", player) and state.has("Moon Stone", player), + "Evolution - Nidorino": lambda state: state.has("Nidoran M", player) and logic.evolve_level(state, 16, player), + "Evolution - Nidoking": lambda state: state.has("Nidorino", player) and state.has("Moon Stone", player), + "Evolution - Clefable": lambda state: state.has("Clefairy", player) and state.has("Moon Stone", player), + "Evolution - Ninetales": lambda state: state.has("Vulpix", player) and state.has("Fire Stone", player), + "Evolution - Wigglytuff": lambda state: state.has("Jigglypuff", player) and state.has("Moon Stone", player), + "Evolution - Golbat": lambda state: state.has("Zubat", player) and logic.evolve_level(state, 22, player), + "Evolution - Gloom": lambda state: state.has("Oddish", player) and logic.evolve_level(state, 21, player), + "Evolution - Vileplume": lambda state: state.has("Gloom", player) and state.has("Leaf Stone", player), + "Evolution - Parasect": lambda state: state.has("Paras", player) and logic.evolve_level(state, 24, player), + "Evolution - Venomoth": lambda state: state.has("Venonat", player) and logic.evolve_level(state, 31, player), + "Evolution - Dugtrio": lambda state: state.has("Diglett", player) and logic.evolve_level(state, 26, player), + "Evolution - Persian": lambda state: state.has("Meowth", player) and logic.evolve_level(state, 28, player), + "Evolution - Golduck": lambda state: state.has("Psyduck", player) and logic.evolve_level(state, 33, player), + "Evolution - Primeape": lambda state: state.has("Mankey", player) and logic.evolve_level(state, 28, player), + "Evolution - Arcanine": lambda state: state.has("Growlithe", player) and state.has("Fire Stone", player), + "Evolution - Poliwhirl": lambda state: state.has("Poliwag", player) and logic.evolve_level(state, 25, player), + "Evolution - Poliwrath": lambda state: state.has("Poliwhirl", player) and state.has("Water Stone", player), + "Evolution - Kadabra": lambda state: state.has("Abra", player) and logic.evolve_level(state, 16, player), + "Evolution - Alakazam": lambda state: state.has("Kadabra", player) and logic.evolve_level(state, 35, player), + "Evolution - Machoke": lambda state: state.has("Machop", player) and logic.evolve_level(state, 28, player), + "Evolution - Machamp": lambda state: state.has("Machoke", player) and logic.evolve_level(state, 35, player), + "Evolution - Weepinbell": lambda state: state.has("Bellsprout", player) and logic.evolve_level(state, 21, player), + "Evolution - Victreebel": lambda state: state.has("Weepinbell", player) and state.has("Leaf Stone", player), + "Evolution - Tentacruel": lambda state: state.has("Tentacool", player) and logic.evolve_level(state, 30, player), + "Evolution - Graveler": lambda state: state.has("Geodude", player) and logic.evolve_level(state, 25, player), + "Evolution - Golem": lambda state: state.has("Graveler", player) and logic.evolve_level(state, 35, player), + "Evolution - Rapidash": lambda state: state.has("Ponyta", player) and logic.evolve_level(state, 40, player), + "Evolution - Slowbro": lambda state: state.has("Slowpoke", player) and logic.evolve_level(state, 37, player), + "Evolution - Magneton": lambda state: state.has("Magnemite", player) and logic.evolve_level(state, 30, player), + "Evolution - Dodrio": lambda state: state.has("Doduo", player) and logic.evolve_level(state, 31, player), + "Evolution - Dewgong": lambda state: state.has("Seel", player) and logic.evolve_level(state, 34, player), + "Evolution - Muk": lambda state: state.has("Grimer", player) and logic.evolve_level(state, 38, player), + "Evolution - Cloyster": lambda state: state.has("Shellder", player) and state.has("Water Stone", player), + "Evolution - Haunter": lambda state: state.has("Gastly", player) and logic.evolve_level(state, 25, player), + "Evolution - Gengar": lambda state: state.has("Haunter", player) and logic.evolve_level(state, 35, player), + "Evolution - Hypno": lambda state: state.has("Drowzee", player) and logic.evolve_level(state, 26, player), + "Evolution - Kingler": lambda state: state.has("Krabby", player) and logic.evolve_level(state, 28, player), + "Evolution - Electrode": lambda state: state.has("Voltorb", player) and logic.evolve_level(state, 30, player), + "Evolution - Exeggutor": lambda state: state.has("Exeggcute", player) and state.has("Leaf Stone", player), + "Evolution - Marowak": lambda state: state.has("Cubone", player) and logic.evolve_level(state, 28, player), + "Evolution - Weezing": lambda state: state.has("Koffing", player) and logic.evolve_level(state, 35, player), + "Evolution - Rhydon": lambda state: state.has("Rhyhorn", player) and logic.evolve_level(state, 42, player), + "Evolution - Seadra": lambda state: state.has("Horsea", player) and logic.evolve_level(state, 32, player), + "Evolution - Seaking": lambda state: state.has("Goldeen", player) and logic.evolve_level(state, 33, player), + "Evolution - Starmie": lambda state: state.has("Staryu", player) and state.has("Water Stone", player), + "Evolution - Gyarados": lambda state: state.has("Magikarp", player) and logic.evolve_level(state, 33, player), + "Evolution - Vaporeon": lambda state: state.has("Eevee", player) and state.has("Water Stone", player), + "Evolution - Jolteon": lambda state: state.has("Eevee", player) and state.has("Thunder Stone", player), + "Evolution - Flareon": lambda state: state.has("Eevee", player) and state.has("Fire Stone", player), + "Evolution - Omastar": lambda state: state.has("Omanyte", player) and logic.evolve_level(state, 40, player), + "Evolution - Kabutops": lambda state: state.has("Kabuto", player) and logic.evolve_level(state, 40, player), + "Evolution - Dragonair": lambda state: state.has("Dratini", player) and logic.evolve_level(state, 30, player), + "Evolution - Dragonite": lambda state: state.has("Dragonair", player) and logic.evolve_level(state, 55, player), } - for loc in world.get_locations(player): + for loc in multiworld.get_locations(player): if loc.name in access_rules: add_rule(loc, access_rules[loc.name]) if loc.name in item_rules: @@ -233,4 +283,3 @@ def set_rules(world, player): add_rule(loc, lambda state, i=mon: (state.has("Pokedex", player) or not state.multiworld.require_pokedex[player]) and (state.has(i, player) or state.has(f"Static {i}", player))) - diff --git a/worlds/pokemon_rb/text.py b/worlds/pokemon_rb/text.py index d20891d7..bdd9d6d3 100644 --- a/worlds/pokemon_rb/text.py +++ b/worlds/pokemon_rb/text.py @@ -1,6 +1,7 @@ special_chars = { "PKMN": 0x4A, "LINE": 0x4F, + "PARA": 0x51, "CONT": 0x55, "DONE": 0x57, "PROMPT": 0x58, @@ -90,10 +91,13 @@ char_map = { "?": 0xE6, "!": 0xE7, ".": 0xE8, + "+": 0xEA, + "=": 0xEB, "♂": 0xEF, "¥": 0xF0, "$": 0xF0, "×": 0xF1, + "*": 0xF1, # alias "/": 0xF3, ",": 0xF4, "♀": 0xF5,