From e206c065bf8e0892dd2d00c511d3ae225bb41318 Mon Sep 17 00:00:00 2001 From: Alchav <59858495+Alchav@users.noreply.github.com> Date: Wed, 7 Dec 2022 18:38:34 -0500 Subject: [PATCH] =?UTF-8?q?Pok=C3=A9mon=20Red=20and=20Blue:=20Version=202?= =?UTF-8?q?=20(#1282)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds Trainersanity option (Each non-scripted trainer has a location check, adding 317 locations) Adds Randomize Pokedex option. It is required to obtain items from Oak's Aides. Adds option to add all normal shop items to all normal shops. Adds DeathLink option. Adds traps. Improves Type Chart randomization. Items can be received during battle. Stores start inventory in ROM. Only requests remote start inventory if patch is from v1. Fixes logic bugs. Various other improvements. --- PokemonClient.py | 46 +- Utils.py | 2 +- data/lua/PKMN_RB/pkmn_rb.lua | 39 +- worlds/pokemon_rb/__init__.py | 64 +- worlds/pokemon_rb/basepatch_blue.bsdiff4 | Bin 29579 -> 36544 bytes worlds/pokemon_rb/basepatch_red.bsdiff4 | Bin 29743 -> 36528 bytes .../docs/en_Pokemon Red and Blue.md | 1 + worlds/pokemon_rb/docs/setup_en.md | 4 +- worlds/pokemon_rb/items.py | 12 +- worlds/pokemon_rb/locations.py | 486 ++++++-- worlds/pokemon_rb/logic.py | 9 + worlds/pokemon_rb/options.py | 170 ++- worlds/pokemon_rb/regions.py | 516 ++++---- worlds/pokemon_rb/rom.py | 173 ++- worlds/pokemon_rb/rom_addresses.py | 1088 +++++++++++------ worlds/pokemon_rb/rules.py | 35 +- 16 files changed, 1775 insertions(+), 870 deletions(-) diff --git a/PokemonClient.py b/PokemonClient.py index f71efbcf..d5f6e09f 100644 --- a/PokemonClient.py +++ b/PokemonClient.py @@ -39,6 +39,8 @@ CONNECTION_INITIAL_STATUS = "Connection has not been initiated" DISPLAY_MSGS = True +SCRIPT_VERSION = 1 + class GBCommandProcessor(ClientCommandProcessor): def __init__(self, ctx: CommonContext): @@ -53,7 +55,6 @@ class GBCommandProcessor(ClientCommandProcessor): class GBContext(CommonContext): command_processor = GBCommandProcessor game = 'Pokemon Red and Blue' - items_handling = 0b101 def __init__(self, server_address, password): super().__init__(server_address, password) @@ -64,6 +65,10 @@ class GBContext(CommonContext): self.gb_status = CONNECTION_INITIAL_STATUS self.awaiting_rom = False self.display_msgs = True + self.deathlink_pending = False + self.set_deathlink = False + self.client_compatibility_mode = 0 + self.items_handling = 0b001 async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: @@ -82,6 +87,8 @@ class GBContext(CommonContext): def on_package(self, cmd: str, args: dict): if cmd == 'Connected': self.locations_array = None + if 'death_link' in args['slot_data'] and args['slot_data']['death_link']: + self.set_deathlink = True elif cmd == "RoomInfo": self.seed_name = args['seed_name'] elif cmd == 'Print': @@ -92,6 +99,10 @@ class GBContext(CommonContext): msg = f"Received {', '.join([self.item_names[item.item] for item in args['items']])}" self._set_message(msg, SYSTEM_MESSAGE_ID) + def on_deathlink(self, data: dict): + self.deathlink_pending = True + super().on_deathlink(data) + def run_gui(self): from kvui import GameManager @@ -107,13 +118,16 @@ class GBContext(CommonContext): def get_payload(ctx: GBContext): current_time = time.time() - return json.dumps( + ret = json.dumps( { "items": [item.item for item in ctx.items_received], "messages": {f'{key[0]}:{key[1]}': value for key, value in ctx.messages.items() - if key[0] > current_time - 10} + if key[0] > current_time - 10}, + "deathlink": ctx.deathlink_pending } ) + ctx.deathlink_pending = False + return ret async def parse_locations(data: List, ctx: GBContext): @@ -121,14 +135,8 @@ async def parse_locations(data: List, ctx: GBContext): flags = {"EventFlag": data[:0x140], "Missable": data[0x140:0x140 + 0x20], "Hidden": data[0x140 + 0x20: 0x140 + 0x20 + 0x0E], "Rod": data[0x140 + 0x20 + 0x0E:]} - # Check for clear problems if len(flags['Rod']) > 1: return - if flags["EventFlag"][1] + flags["EventFlag"][8] + flags["EventFlag"][9] + flags["EventFlag"][12] \ - + flags["EventFlag"][61] + flags["EventFlag"][62] + flags["EventFlag"][63] + flags["EventFlag"][64] \ - + flags["EventFlag"][65] + flags["EventFlag"][66] + flags["EventFlag"][67] + flags["EventFlag"][68] \ - + flags["EventFlag"][69] + flags["EventFlag"][70] != 0: - return for flag_type, loc_map in location_map.items(): for flag, loc_id in loc_map.items(): @@ -168,8 +176,15 @@ async def gb_sync_task(ctx: GBContext): # 2. An array representing the memory values of the locations area (if in game) data = await asyncio.wait_for(reader.readline(), timeout=5) data_decoded = json.loads(data.decode()) - #print(data_decoded) - + if 'scriptVersion' not in data_decoded or data_decoded['scriptVersion'] != SCRIPT_VERSION: + msg = "You are connecting with an incompatible Lua script version. Ensure your connector Lua " \ + "and PokemonClient are from the same Archipelago installation." + logger.info(msg, extra={'compact_gui': True}) + ctx.gui_error('Error', msg) + error_status = CONNECTION_RESET_STATUS + ctx.client_compatibility_mode = data_decoded['clientCompatibilityVersion'] + if ctx.client_compatibility_mode == 0: + ctx.items_handling = 0b101 # old patches will not have local start inventory, must be requested if ctx.seed_name and ctx.seed_name != ''.join([chr(i) for i in data_decoded['seedName'] if i != 0]): msg = "The server is running a different multiworld than your client is. (invalid seed_name)" logger.info(msg, extra={'compact_gui': True}) @@ -179,13 +194,20 @@ async def gb_sync_task(ctx: GBContext): if not ctx.auth: ctx.auth = ''.join([chr(i) for i in data_decoded['playerName'] if i != 0]) if ctx.auth == '': - logger.info("Invalid ROM detected. No player name built into the ROM.") + msg = "Invalid ROM detected. No player name built into the ROM." + logger.info(msg, extra={'compact_gui': True}) + ctx.gui_error('Error', msg) + error_status = CONNECTION_RESET_STATUS if ctx.awaiting_rom: await ctx.server_auth(False) if 'locations' in data_decoded and ctx.game and ctx.gb_status == CONNECTION_CONNECTED_STATUS \ and not error_status and ctx.auth: # Not just a keep alive ping, parse async_start(parse_locations(data_decoded['locations'], ctx)) + if 'deathLink' in data_decoded and data_decoded['deathLink'] and 'DeathLink' in ctx.tags: + await ctx.send_death(ctx.auth + " is out of usable Pokémon! " + ctx.auth + " blacked out!") + if ctx.set_deathlink: + await ctx.update_death_link(True) except asyncio.TimeoutError: logger.debug("Read Timed Out, Reconnecting") error_status = CONNECTION_TIMING_OUT_STATUS diff --git a/Utils.py b/Utils.py index 59220780..fdb86e63 100644 --- a/Utils.py +++ b/Utils.py @@ -38,7 +38,7 @@ class Version(typing.NamedTuple): build: int -__version__ = "0.3.6" +__version__ = "0.3.7" version_tuple = tuplize_version(__version__) is_linux = sys.platform.startswith("linux") diff --git a/data/lua/PKMN_RB/pkmn_rb.lua b/data/lua/PKMN_RB/pkmn_rb.lua index c439d53b..eaf75165 100644 --- a/data/lua/PKMN_RB/pkmn_rb.lua +++ b/data/lua/PKMN_RB/pkmn_rb.lua @@ -7,18 +7,25 @@ local STATE_TENTATIVELY_CONNECTED = "Tentatively Connected" local STATE_INITIAL_CONNECTION_MADE = "Initial Connection Made" local STATE_UNINITIALIZED = "Uninitialized" +local SCRIPT_VERSION = 1 + local APIndex = 0x1A6E +local APDeathLinkAddress = 0x00FD local APItemAddress = 0x00FF local EventFlagAddress = 0x1735 local MissableAddress = 0x161A local HiddenItemsAddress = 0x16DE local RodAddress = 0x1716 local InGame = 0x1A71 +local ClientCompatibilityAddress = 0xFF00 local ItemsReceived = nil local playerName = nil local seedName = nil +local deathlink_rec = nil +local deathlink_send = false + local prevstate = "" local curstate = STATE_UNINITIALIZED local gbSocket = nil @@ -69,11 +76,10 @@ function processBlock(block) end local itemsBlock = block["items"] memDomain.wram() - if itemsBlock ~= nil then-- and u8(0x116B) ~= 0x00 then - -- print(itemsBlock) - ItemsReceived = itemsBlock - + if itemsBlock ~= nil then + ItemsReceived = itemsBlock end + deathlink_rec = block["deathlink"] end function difference(a, b) @@ -104,14 +110,7 @@ function generateLocationsChecked() return data end -function generateSerialData() - memDomain.wram() - status = u8(0x1A73) - if status == 0 then - return nil - end - return uRange(0x1A76, u8(0x1A74)) -end + local function arrayEqual(a1, a2) if #a1 ~= #a2 then return false @@ -135,7 +134,6 @@ function receive() curstate = STATE_UNINITIALIZED return elseif e == 'timeout' then - print("timeout") return elseif e ~= nil then print(e) @@ -157,16 +155,16 @@ function receive() playerName = newPlayerName seedName = newSeedName local retTable = {} + retTable["scriptVersion"] = SCRIPT_VERSION + retTable["clientCompatibilityVersion"] = u8(ClientCompatibilityAddress) retTable["playerName"] = playerName retTable["seedName"] = seedName memDomain.wram() if u8(InGame) == 0xAC then retTable["locations"] = generateLocationsChecked() - serialData = generateSerialData() - if serialData ~= nil then - retTable["serial"] = serialData - end end + retTable["deathLink"] = deathlink_send + deathlink_send = false msg = json.encode(retTable).."\n" local ret, error = gbSocket:send(msg) if ret == nil then @@ -197,6 +195,12 @@ function main() receive() if u8(InGame) == 0xAC and u8(APItemAddress) == 0x00 then ItemIndex = u16(APIndex) + if deathlink_rec == true then + wU8(APDeathLinkAddress, 1) + elseif u8(APDeathLinkAddress) == 3 then + wU8(APDeathLinkAddress, 0) + deathlink_send = true + end if ItemsReceived[ItemIndex + 1] ~= nil then wU8(APItemAddress, ItemsReceived[ItemIndex + 1] - 172000000) end @@ -212,7 +216,6 @@ function main() print("Attempting to connect") local client, timeout = server:accept() if timeout == nil then - -- print('Initial Connection Made') curstate = STATE_INITIAL_CONNECTION_MADE gbSocket = client gbSocket:settimeout(0) diff --git a/worlds/pokemon_rb/__init__.py b/worlds/pokemon_rb/__init__.py index 8d31f663..7d1984d1 100644 --- a/worlds/pokemon_rb/__init__.py +++ b/worlds/pokemon_rb/__init__.py @@ -39,9 +39,12 @@ class PokemonRedBlueWorld(World): game = "Pokemon Red and Blue" option_definitions = pokemon_rb_options remote_items = False - data_version = 1 + data_version = 3 + required_client_version = (0, 3, 7) topology_present = False + + 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"} item_name_groups = item_groups @@ -77,8 +80,14 @@ class PokemonRedBlueWorld(World): return encode_text(name, length=8, whitespace="@", safety=True) except KeyError as e: raise KeyError(f"Invalid character(s) in {t} name for player {self.multiworld.player_name[self.player]}") from e - self.trainer_name = encode_name(self.multiworld.trainer_name[self.player].value, "Player") - self.rival_name = encode_name(self.multiworld.rival_name[self.player].value, "Rival") + if self.multiworld.trainer_name[self.player] == "choose_in_game": + self.trainer_name = "choose_in_game" + else: + self.trainer_name = encode_name(self.multiworld.trainer_name[self.player].value, "Player") + if self.multiworld.rival_name[self.player] == "choose_in_game": + self.rival_name = "choose_in_game" + else: + self.rival_name = encode_name(self.multiworld.rival_name[self.player].value, "Rival") 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.") @@ -100,26 +109,31 @@ class PokemonRedBlueWorld(World): 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")) locations = [location for location in location_data if location.type == "Item"] item_pool = [] for location in locations: - if "Hidden" in location.name and not self.multiworld.randomize_hidden_items[self.player].value: - continue - if "Rock Tunnel B1F" in location.region and not self.multiworld.extra_key_items[self.player].value: - continue - if location.name == "Celadon City - Mansion Lady" and not self.multiworld.tea[self.player].value: + if not location.inclusion(self.multiworld, self.player): 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() 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): + item = self.create_item(self.multiworld.random.choice([item for item in item_table if + item_table[item].classification == ItemClassification.trap])) if location.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) and \ - (item.name != "Oak's Parcel" or self.multiworld.old_man[self.player].value != 1): + elif "Badge" not in item.name or self.multiworld.badgesanity[self.player].value: item_pool.append(item) + self.multiworld.random.shuffle(item_pool) self.multiworld.itempool += item_pool @@ -130,13 +144,7 @@ class PokemonRedBlueWorld(World): process_static_pokemon(self) if self.multiworld.old_man[self.player].value == 1: - item = self.create_item("Oak's Parcel") - locations = [] - for location in self.multiworld.get_locations(): - if location.player == self.player and location.item is None and location.can_reach(self.multiworld.state) \ - and location.item_rule(item): - locations.append(location) - self.multiworld.random.choice(locations).place_locked_item(item) + self.multiworld.local_early_items[self.player]["Oak's Parcel"] = 1 if not self.multiworld.badgesanity[self.player].value: self.multiworld.non_local_items[self.player].value -= self.item_name_groups["Badges"] @@ -178,7 +186,7 @@ class PokemonRedBlueWorld(World): 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.item_rule(item): + if item.player == self.player and loc.can_fill(self.multiworld.state, item, False): self.multiworld.itempool.remove(item) state = sweep_from_pool(self.multiworld.state, self.multiworld.itempool + unplaced_items) if state.can_reach(loc, "Location", self.player): @@ -239,19 +247,21 @@ class PokemonRedBlueWorld(World): spoiler_handle.write(hm_move + " enabled by: " + (" " * 20)[:20 - len(hm_move)] + badge + "\n") def write_spoiler(self, spoiler_handle): - if self.multiworld.randomize_type_matchup_types[self.player].value or \ - self.multiworld.randomize_type_matchup_type_effectiveness[self.player].value: + if self.multiworld.randomize_type_chart[self.player].value: spoiler_handle.write(f"\n\nType matchups ({self.multiworld.player_name[self.player]}):\n\n") for matchup in self.type_chart: spoiler_handle.write(f"{matchup[0]} deals {matchup[2] * 10}% damage to {matchup[1]}\n") def get_filler_item_name(self) -> str: - return self.multiworld.random.choice([item for item in item_table if item_table[item].classification in - [ItemClassification.filler, ItemClassification.trap] and item not in - item_groups["Vending Machine Drinks"]]) + if self.multiworld.random.randint(1, 100) <= self.multiworld.trap_percentage[self.player].value: + return self.multiworld.random.choice([item for item in item_table if + item_table[item].classification == ItemClassification.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"]]) def fill_slot_data(self) -> dict: - # for trackers return { "second_fossil_check_condition": self.multiworld.second_fossil_check_condition[self.player].value, "require_item_finder": self.multiworld.require_item_finder[self.player].value, @@ -268,7 +278,11 @@ class PokemonRedBlueWorld(World): "victory_road_condition": self.multiworld.victory_road_condition[self.player].value, "viridian_gym_condition": self.multiworld.viridian_gym_condition[self.player].value, "free_fly_map": self.fly_map_code, - "extra_badges": self.extra_badges + "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 } diff --git a/worlds/pokemon_rb/basepatch_blue.bsdiff4 b/worlds/pokemon_rb/basepatch_blue.bsdiff4 index 1dd71016867957282d45f6354630dd429e5c573f..dfffd8299b5bd3068e506e6007825b609fbd4807 100644 GIT binary patch literal 36544 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 literal 29579 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 XR8Yu*cZyFMr~emnML1B9JXgWUwB}H) diff --git a/worlds/pokemon_rb/basepatch_red.bsdiff4 b/worlds/pokemon_rb/basepatch_red.bsdiff4 index 488ae2727c4bbbcbc8cbfc7d6aa7ef1fabb7b747..cfcfab59b08ee28e567278d70bc64d549a755db0 100644 GIT binary patch literal 36528 zcmZ^}Ra6{I&;>ZS4z7b_7+ix4E*V^cy9al74<6jz-Q9x)ch{f^?h;%A+3)}NtUT=A zhwj^bs$Qxd>fX~WrY0dPB?Vh+4n0o0RL9{H36omOLNmwdYSPBLLa)LlWo&xAS6j)hc#z_jS00M^Y z|IbPz2ZH{m;{Po`0CFH;?*Hn;{~Q2tWl8cW9F@gOAP{maWdgSH8~{No@V`h9067Z^ zSMa~=|IU~r(@^(FGdu;W$%)sFd$rM1$CZ5(yU6&wN*D$m@sY8TnzkY+L%hw zwtt7=SZd*V5|1ZT$l{KpStQ~9GQ-7SxT;Bcz%^g{^5@({p8B`cJV%QDGc{&;SJM@F zuP|BmWu+hYkY<#zEiiE?T5HUh%kJz^OR%HSN)Z9}8%4DN#^pe@eE3>1fnXjeSD9Rd zp~q-Q_BuR*j(Ho%GlD*3<_V9E&fY!0I1rxInH>4+-oJ&hM8mMKdbUB1O1W=nrTxJD z*1@o`FEJ=wPl1I;hCgNaNq~5i0L)jXr}5*_tPSLA@%v@5jF>9dfR(g;;ZGBwL zmm1SxP8LYgy|XY-RraqbLPGoY}}&=&)zI z$o<(+{#za&hDwje3Tje4GycG#@*U~0Tj{=z54J%#)o-(fixyrM?IDDZq`d|ieT6H! zkLGqHuO4`uEc!6LiFog_V(SnM%?I}BMvO5;7Uh}bI%jM;*W&SP95uQAaUEtT@ZMC> zU=`+A5-5R3ZtrV`@BKZ21wG%Uk?}duFzMMZr($xX8HG>lCNS>}B2Sf}+A`=Kw(sm# zx6D$8K$|VjcBIr9TW;Jr{JZe3Qj05K`yb`~P!q~zSytx1;5;rq&u!ikO$_YknYwtPAe77BB(X zr6fAnYIq&R#OZqN>@La`lL|b)RZiVryUX6OrTN{XqxbeyA5SHPh83#*nc2LR_r5h; zyWbwLX1`Dv_-0Cs$}^(fMPc~QPU4AcD3RsnhzY9Z1eKni(-_JUE)l{ z+P&|=%L8#eq)$(O0Jii$!NlVxPEPX59CMOG@8Vh)-P%=tP|R*Mj1DTapR&9Nah^5_ zze?x29~S)O0Q(5_=jfp8!yBRF0KlP4ioS4tryo?$#Fprf_!K2bu!PSz?-z7tKhUWY z!dwK94gps@N1uhE>Z$0}zlO(y7%xd_cu)@tsjL$(NoSxCK%lM4c z>Z@BhLLq+!>Q4=LJY3~qQ~_w$KmwKOglud&v6{U6zK8Rko51m! zq0aa7H8r9z3jbO_ab~|d^o)ypgf9?4gC?~0#P2;F&z35n z;`!ycE9O3rwoo|%4ejmc`oYd(#duDdY3TQdyAl+mBzOraY3aT;Perutryoj_F4+M{ z%*#7@Hyl&RV2&y@dqJO-;LkQMp9s2gSGIc+efkt?5i1jiS~B4fIhYMoBoPZzP?13- z>_T>ert;_{!yk4@cHxjB)c@Y3;((Q6c=qV@qp9secMc~CB|#yW6WX|dMA35NN-@~0 z-1p^WejIn6+3oW)muC6sh%Y6>B*Xwn39;-;vq<>W!Ja~F8XtVMyqp3#+P=NYa2FQS z>uaf&pt+A2rVMyURm|WiY|d|Hq-8?#Cd+>02jZfHq;dzDvM3e~`jx)hTZ>e`w`AEw z7Gi6U=DNy#Y;<6)8dW-41R1LJcv^}WT$G&RWs@Whs?hDY#4|{-*m^Epxa4>C`zVC)QLTVV4OBrV9Chc@)ebQy7b09{4&VWZ4q%+Tq8s zh-S|DwY$m<3H9XfCl$Rj6XhCC&=NQO=fPI)FL^Uj!H7JmrH_sD@=)EpRcn{dLt~#2 zYwl|Oe?GUAv;k3j(OQ3=_Ve&VdRGmXIEiC7JnlwnG%dy4^DNpSY^EC^yc8RmhV-q= z0J`05k>whrmHTOPPHXarh4`OW?4{Jaa_^26HbuY4DYY({x;Hb<$O^*y;}8*GKt2HC zP#+vT9wNLwbRFM>jH(UB(FBJ{29|9B+q2tah6ken;qBct=IzNphMH#UeEAxarOGMm zR{up(KaPSrGc(08x4d~ETG8o^2tOI<&r!928-bizJ5Egeb(Qb}RM14cp~sDvo@PNK z+fg9Mx}nY|UZ9+o8^(%sy0lESParL*%-Ph)Y^vS+(PMd3MpDK=ac6}18%4x`>l6_TDNtT5LMvlpR+dnj-xLAFk|>-j1R+^T!4{chLj$WTmSt|pN-9E zMEe+7{LU&8Ju~V_OncG3-y)LAf=WXSM(h8EHxm^JXgG*fsbK$)D0iq6jsgIG{eNrn z*Zi7I+oRVZ#6nE8n{|R>%DB z?z^^~*#=Km!Mqf|q&Ht}&l=!1R(v{Hf0nNVwJqbJZ-C%x8~#^u67|lXT*Cl>KUd9c zwjR$@F6Rsd3pFUiN- z5^Ou4jSDvV?iUD|hn}rj=A$;wR!6Tb9PN@>C9l#h1qBUy7IhCh-c#3VTtT=^n6Ocv!3qvVE zkPn;#KoP`Y$g%&M^&i8tk%^_lp+mLtp)0cvRuapzE>r^2DU|rAlvm8%a|#2wg%v6j zPoXyrJPo3vh2si<+BCEgpoVok!1wPRppYIk*9mqzXFkX@gDhG~^ zInxskIoGql3bs+B04Cbn-?pERBTtY-5joH*nfZ*RaV);Hy*|d1BlE&hh7%`0SiA^4 zeWv4dko#m4Lv};6`if*~nls=tSfzI8duh9*{&(^%NvL)SPu_ooj#N$9vxN%h{gR7j zf{QdB7VZ^T@ocCk6ujox7S#2td^RpsrkD6An)TxJl!^=XM-nvlV`5U+@f(t>(r(orLtjxsMg z`C>bhcXnqmL6e$kbE|yq@Y0ygg4=>B@w~=xzr;1yb!j^7VsuVdI0NJ62j6DK|`Q+OV79ZuMQ$9fK4X_(NKYf=#qQUc~kbsvj zQjtmAF@}iW?|-LJ%&f(JZ1wc${u=Nyfa?4=eqfB#?~j3BXLi&3w^DC=PCT7xraZN; zXD-Na%75QC%!Flsns~N{ZKtZs7TCoV-+rYd|Kw6pN{JGJRRi7~h<1(xnRFMUcj%GR z@T5x;5hc@mN_HQmxSO+>6SNXE;(o%3JeXJUl~#@Zg5)F`9>p@r)DXZNB`@xUarTUB zaw-Ukb`YT*v8~fka(()Q=XkuFjU-eRzZ%oTYWPL^&GPTf1D+{awQgd&-I@^h7}Lak z&&CE&8-7u?IM3Y}o#m|i`0sfMmW@i43c{cq7*!1I+s(tL)k_F%E&WX_|63Ov4umKA z99@~pB(|W=qqgX*1~}+(DJqTchbsbd=F&^cmduoVXy*M*YWc^XMI?LSzV3jNis!C_ z8|bv3YVn^dfsM=c`Ebiu6dpEFtE0p-w0u$_&3OWb<_8sv{ny~$A-2_?KMClV^?m2;o($gDLPPC4Viv0h6L+B;nbbPZI__0yWkO;l<}`OIkn zpWS|RAfTh8T5;D*?O==AG(=i--4QRa+zo`VAcY(f`=Ab?DW|{{n`Ld+U?u}y^y(Ge zD!K>twgojs1A8GBa_tmWkQ;({4+c?{%+tnx<@L{Iuh`YiQ;(fJ%_E-qJ&#>(pq{9Q zY|v%gTS_4Ba)%Et2SH6A3s&*?69e~($|v^wU#lZK4CqLV8XdY)oP`W%qG<#>MW6rK zL_WFU)*B)LG%1iJ9@#T_PE|R3={z*FJ*$;((lyc@Ni{5bUH-0=1fJCiYF;Dalm+Te zCArn)FVoM2;gs&L{~+r|t#8Pq#iy366~*2q@VedUitcb<@y|3G3J2Tv6P*^DAc%h@ zmQak$>{3D`zFGC&g-1r>w73N*^0U{Ld3t*sjd`o6-vklK^UfL_GQ~(nH6Y)aQ_-of zsq=4eUwh>!dkQ;>miIYdlpAu8j%Os06fu(C59E>(`;G+A^-YLIg} zH(LDhOwJ(?$2mP5{nmF#@t)eo6fz8<$wNc`1QbgLd2$2R(iu=*w!{qx4^sg5p zyPGgMi}Oh5-4GJES$94rRi>(OIHa*CO2(s5yt5*jJuaIQMMS&ho;)a}46V6Z``53o zz27ORDFxs#^h8NuGpR(Hg4i~W+Cat6NO*4rtFv}A;_q9Qr|^G;McJ?RO#5b28{viu zU7j^F1yh_`oNG;ugm1pYMTfdJOyO>ImeCSKViJ?F;7BZL_j0UwEtxw&FURBwCpGSW{ARQo96$2p{jQHQs?n8}6xhr<&s!6+Ea+%7f_)AHoebPA)^k!75&z`i%{y zY^{7WM^@{e>`wbx(@oQ{hcEd$DH>um+X}7A`30x?-$t%vZSI?Dr%tV=11nvOk^9re zMyJy}I;`|=7+lbbUIzs5{PLy+xkBz|aWEg1zAFUopY_}EvMSG8$P96Q#%l0UlSto_ znbIO1IdxP^I{d08z8b2PDWHJ2vWXhF>q1qciKZ%yJb!;L$+u|`Hyxt4;X&Kl+vVa# zRmKh#S1lhgsI+Fygk^q+G8!n#(9{=*uhZ`$RQyLqL?*f7_x<7H_!9YIUUv`VFLV?x z(s;UD^mf2kT5uIJkGhvjr>4#^W2!Ann|xJGpUn~uHZ9c)`aa4ZLl+Zkg1di7fY#Zj zem3E=q?x?$&UEL=7d>13DOLpYp-o?5<#UhY;cet!SvgmtPb_hp=`qQ0DejeGJR!r3 zSZL@B_TRb*=4*KYkIY6a@fS|Ra~_DLX5gO*oODG!=;0xndV9Zeg8Lqas=oUXe!i*C zXL|E4p0Ry)>`^L^q$g9nByK6xyVczn#5*zdVW?UYkE1>3Zk(tm8!Blq5Av0K`f(M` zSFUwTPXwBd6C&7+XfQBL+AD)-g=-kL2R8{JA{Ett)%vZ@p0%HQgER|F;Z#W|*fq=f zi_RxOKtmu)NQF5spBYqj&YJ&upxCH#^)rUG4revflPht~T@G~;_tTZ~O-^&gmko(B z^zvJwSgwm5W62q@(h3apX6K+}nlE+Yk#?Z=k--K1DD;6h|0STOs}zAV0cO@@@loHb zyWy?5;y_Zag0onmq4FB>VG&P_YO+peJgS>X)_cI`3)bPS_)T$O(f6E0icN@>ax(zt(&`>czK> z^Z5M^*cXjMuA{S#2YLuKIE22RJ8X07Mz^MQ7(GuoF9psgTKRQByUgLw1(&{c|L*1c z%%eO*9%G4Fs+Rx(6OeKf$nMW*ho7nxoSdpEjI5V`iBI#x%Q8~6WEm(*TyXxGv{)O} zp!F(fi4i=4LT$P*ebAE8Zw*3oOxeHdhvgDkY0HQ4kFWkZ{NSV{l~vJ}j6KSH-C#n! zd-jW@F1~HSNB!Jm%x)^!pYu+4#xN(vb$25_=Jm5>E{HsJ5P5Wqz_euKrH3f=gNXVq zg_GeG`hzxU!w z*V|byv7e>Lvi}@mb|nd(-v6JAGP$YFKyRA zHNV%kc8>i?Suf3@ui9#?)N^wG=!YtYYvX30nM z85xf3t`zj+i!3P*Sm`ZCaN5|b^_UQ@r{lLFZO=*;>k+p-y=3 zVH5Zhb#7)gFt6V+X=*X`1>?zYE2GJdo~vIDQLabXnQV+Eu% zj^fEnmf4kP+zPRU(c5}l|LzWQoZRV0R&_AU=Hb+*FXqKPc*x=<93^CD{|Bj#<>#>s z(lH;G8j+6>9py3v5{3O?J{~rr%sG$!IgmPmwNMrcq|>GOK0|XO%rWF&o5H z2-b`Ebh-y|F44m^%QY8#i4#$erIgXajuGfJ)aN&oEQSF~c5?!FMSzU@VO48}nfZ3j zlx160_;SDxxnWV@abBf~t{ZQ>WbbW-YtMw!-{Jz2eP4`vQ3X&2bxhpMKdrP)j-=BH zX`*M0>cy>3+58S|T|N1vZNB+-FWeH(TV9~a@6X5fDtWI+hgk;-6i0g$zAV`Sxfn`r z)}clsWwhZ}UvLCoF7P(O&+BTJ7wCU|{7R4W_=ht!@A--nxegUt1nklAH2sQxHe|B6 z^3xa(eGr#)BfT{Y!*gLYD+4a}$^3Aqr1nxGt2jM4PHJ+};v=x`S2EGo`BA^l$na9f z$-2J1fpj@}%TK!3a^v-7#WZooWohh`C$&}clfy{eKa{;*(4^cv%>9SH16rpel#j}| zi0#*-BD|?*^gje{TXD^->%5XPv}tbV+`^;hZ;-b4wmH=V{dZqd z1c&gSveRfBW{@n;}=)RAEci`J4FN22niLp2UGG&CAq?qbB|w}Oc? zw|&;I;e1@lqkp{K@Ni#vU!OOt+^?euN@4JdVK?Tc1r6$aA341gFv5WFTS%i~q1v_(jV>WSg7uE$s!gq7ZxeZn4H=ZrrVj z0cWg2$X^mjFy5l4syr=80jVb>h4fq*9RJsEFbq z!5Q;|o%%SqKZ6zc0$n6-bs2k_(rAoGVv6sWs$Q=F6TzAh)cL} z{9|(?UcwOC?_~*%KYB>~ zt;{^K)0b5YE@lfd4LpQ&FSv>Bp-ge?F~&xm1b6}~aIWk?_9NDhvof~Ls#a^1jFB6+ z3#5b1z(+V~mTFuQNl}vswida3JH!&|J!oFY0DNG{;rJ%(m=igPks!^($4f5v zd$j9RWX~qg-mnBH20su=?c7KMUWi_nOcB+POt>0Bw>u9{AYgJg4`w1s(RJr%YDitH zEY_3^`VE6J62cMUYD5)PBSJW05^;41bO`ZSWQL?{sDR0`WiIV*zmGDCvW%NC6_qOe z4c)U?rAO@|LJd?eOs)5I=~|=dbXjQ4Ocqu~Qktsy`WmCCf2IZ(RZTS%4Fy*`v5m;I zP1e=An6Z{rfTBWchqyt0IF==Brmgsp9TJ_~E)qV)LD=;(=5O_>4 zpbQ#EIn6CnwV~{l$0}rc|)85weC>dC=@j4G{}3ZlGIiriOgXKo`mS|cL)^@i)Vdrk*fh(Lz;X|SPBf2V2iEi;Xp$xhX7 zV%QhWd_@$tNXA1Dv?fNaXYY5xy#;LZn+U#hk<)s@w5=49F+;~MfnQps8 zuN=Pdd+`DrB)L%15~vU=`=9dFmS9KW0ZI3KgE?RELUcy(p0gVRD2a85Kt` zmj(WOa8BlU%u{OX!iQacx3q3ioS5jVypQX9*r?@E}Q)D0AfoS)!IP&O147WVBe}XuF@sIPm2g} zq0(d#t}j3O?z;u~lep&_7s+!zb}B!!@Mqt~v-3GcOU$VvB3K|tE6#yxqF zD|B^p^Ulqr%hap7A%e{eGch4cmI*R|Kj+eP&=z~&7=-2uFmths*`Nc~ zLNXl|#yukVDl{B3_kTUz)WQKV{}P&2xHb~DHf_0eej|XtK|h!j<3B64tUB){5W!j> z2)~!GUzCk#?l=j}R>+j23f!M&cG6p^O%)s!*GbgEtXtF^R2Rb;O0`x-2u?K1%ut^4 zK6B=ttnyhxi~Kp+>Z3>TJ*GmrVLJ)+atYDYVa9N8@7M{M$7e3)rFO_0l^~B$<{KWQ zB*O!#O#KF)G$&NzGG+c@d;1UK%?9Fu6}@ZKlyo(N=|v{0n`B-vMaaU;{^Tqt?7@JQ z*@p*0^o5ok22BzVcUFu2J%@K?5yZ*mymwdx=R8-JO2uZ3k%4&ArNlFmH=2jRAZv^| zB&y0mgXt*oVC_TpQw2zuiN=oi^*}vQGLQjvj6p(@h|J?|96FpRi#||-abbt`f}HW7 z1Ih2aT7%ZW8C9Vd3?U^NHDnJWgsG$3oPaz)bm0`Obgb|JViem8zsCFQ-?<=yNQEOV zEpGD3+2x&mMM_S2SF8c?0>+B!!d(+7E5txmpUo<`JDaZC%TvXkFT(tVJ0_D=7^*#X zd5GDlcN?efG><3q!VANiG$s|Ez)tHL^DlYF%I$EDPCp7M8N z-r&r4idpN_2cAUB#=q{^CLAP`beanJ!_C|5{bA?u4+*MjENl9Ia=ilEA{T_!MC|j3 z9FiRRZswThYp@)fAAD^o#Hl}AsHvYP3~Qy_C`)I|4Q{JR*=*eAqKOvT*}^kN)KvQi=b^9uEC)@|d{O8#{{o8%9Kd5CLgahy=8pP2l0v)*s{lK52=c z|0A+6)T+OFi{F3Oqg2{{ukRW>^`Cur>L63dN8uN|-WgKtwnf3Jgp7`iln+xVeVjgc z@%f>4dcRp;-+b9F;;41|_20F3{_{Uxg!CO(-^FMcnk$_+R@9(!O zmpw}Hr#`*yYsH?+SNz-g*59A=w2UHCu(BRl=sO|lk$w5uY8yK|*ZL6yWxk{VOeJ0w zve850S8+jj;^o6@D~;byKyRP1Na1jCTR1Y310KsCr^#*;Ngm}}9xKYU1yP$R1*vIk zbrUg3TI_zmZ5TP*YVMpZk)tfa$-vxt zgwB4xSW&Xb4@Pl=o0*`N%g@5pv7GNJ4f_qw0}NmJ=Q1z4Z|~${mQiG$>CdKcY^u;0 z%abQ%HYRx*LAXeWxb`m@a9*LOm9kuZy&j$pOKmQ|g+MvXa)Ll=7KTAV6p}`AWecey z*_}i)T7l2Pmk~0Tb?kpR)m?v+7?68 z2u&%H7~54|f~TPxLQd$@%Ny||@~i*V-rc%xbU44U2e%1VlgIGX(^nvfEGY7fAmdak z-HT1T@-g)$0P67LD}_6R z6rd9p>$hJ8YB*`B4O?YC;`K{yqm+F;bv#TR_~&Sy{aIBs!BU{UyWcmUtLTqca!-W4 z=ewTxJCS;JmaIivp2i&{IdFXQS^UZ;-Lvy`N+r5ygYcvli|Es4;#%#2OB=gm-!kt8 z>Tlb~4ukNpGv7cSs9&xKc69TrFppAj2&sk(*R4-(>0tjE^06xl!ra(~P_depXe~bH zB`TY-(J7Z{WBS0H^`44CbMPO7YgVdn=5gMg9)hgEz2(eA;3X~VP_DF=qhn@$W_9G2 zWT8Wp=7W1v32{-Nv7|FHYK{Pz;rHocM}1G}-sSUQL0m){Offh_4~bS~NJ{0N#fr!L zVC^hn%&LZb_**r=yxyB1i&44ayk3Kl;`NePJLY0aQ?0&sQ|H_;3R1O7-!SceoV7%t z!_C4b&kz&f@vZZTSRRQVUOo4PP+&nrlmry;dH>wfAnvl3cPcA>1nk|;+%lexRylCucotBO#ytZI^G$|d3c80F3q`bdu{5HH_fYoQXe z9|`i5Hh0M5ZL?Ky9s3+EFBL}+?5kZ3ha`t*ff4j@hSQUZ=d|^a+a~T_viSF^p*7ZJ z9o@+-srXkBQk33ROsr*$xXI?62xe8b9Vh)v8hMr@?+F@}dXKb$GO4s~WSnMB+PW6D zA+ObBX)0wpBTU;E*s-|p3Qm*0JRF21hpzSvii4? ziMV_aD#(n;5SPr7#AO9FVI{ao+6|%vIaG#t>kLRFk?^Imk^6;ZARE-wKrMOgCi(W> zAZbEcnL=nZ0xSAbG`N7Ur35KXhZx3UDGf4vKN)y6}bpr@j!zL)bp(dv@-QQN`k4-nWejPz~5nl zl~{(|2%#Dwn#>MHyWlMvYQ#KXdmnUQu0qCh^X5{%0hO{rm?w<65JnR%(84K+!HIqb zf}&c8^UxW4J*p3xBD-x664GQaLBt@k97JBdMEYbVH6l8rDoK8wINQ!vLn#f(MR=&+ z)OP&M=PZu#zjASwmn6&8&eO@sfyGFyj#$4M#xi}MbG*AFlNrOag^{lfI5(vfOv=^C zCL!A$*fFYnRxUwIPQfwZaIRpgURlxzjA%5;2vkSq!ayyR(WEwKXb~&a6N@qWQ0jLm zX4j_!ttP=MZ0u)|B*H}Yu4J^@xP2(f7CwYk#K2p%R~>@P@`sG9fr;*PT>hn>@0kkZ ziF7lQ4zShE7~p1m<7&f0kq96OkfaZ^N$OkSCp_Xkt${u*@R==9HOLH!jDezJ;&bdD znsNFG4#B)IvyYvdUoiaVFm@Xv$lLUXlVltQVMY3h8ol5zh-@@85m;`7thnJBh}sMVz!F4R_(GbcGb4AQnYzWQ zi&tM$1vI%tfli=&hi+tMFeC^w@q;5kY+hw9)94pcC%sc}seD6)q>3aioOZZ zE@a1S2sZ??s9&=NQH%vwlB9JHz{C=+%o1ZXqzX}1j0Qfy5|{<18t6iG;ADZEC2UI~t?1!gVqz?bW_fMw3}bA1 zWz-x&YNY5B!;mo89iBCUymC}Sm@zZhhUPYT21Y-jFzfo$$VAC#HCx+1-r*fKLS}Dv zvHiEqfRI4X?D2%&nPy?VMMJEJy}r_{s8N;(ONW7`LQ^hG)TkjEPNoVzVt9WQ$b-zD zXwr{EmS#S}V{A{s8PW4q)>#NuJs1)t6JfV(uF)d#<{~~)3>cA+B*XN#0 zqOM^S@tv?3sf|$7q^We$Wz9sxB#H?lsvVRWqrYgO0*5G>*w!x@O(1Dhfo9f>J3%0C z?i@J9s)DP*T2_mcWy8T1{o6gPF^XX&nl8zfHWCR^*`zLNvC5heg&Ng`+1%PInNSnD z=r1VkmK4#%NQ4173DX{rQ0I!KVmE3MHARL;4k`cAR7gb(l0|KB%N2)8Jy7n+*l`i&@7Q;o}UU_q8Qd z5LOTZYIG|#7-*nJVO3V5rp{`ZX0(z?1(c1UL&+XQrXf)f_`rxJ_<<5PesXltSPO!I{GiZJBs!AN8~%Yd3%Xn7;RWV|i^D84R#2>LYXP@*d{` zdcU%JIxRg;zs*oM&&N4H6R62GPYV+H?O~}q+TfrXV-%n;y`uQ6)@X~9CF!R0iVVCM zoN@kEJBi+?5x67q99|$ChG^B>yut48=bbcJfIw2rb79056#Ss|_KrevEG)emjl#w8 zs($(C?Tdwp+M6$}Yqas5eu%4m;3<`E(V7~oGm>vpI3=u46`u2Z)c}f*5#JA5mr6ze z$r=~!YD-Lc?n>Vs(ja+6`SxvAjt&p`qL+bBTXv$-pueB$`SO)c7`aL((J!;0$4n$7 zqhmSIz17|7fVp5dM>cY`ch?RMvyqNjDr*aETL9#g?BhtyyJKqai7nXB|yuHJcdzsZXuZa|2 zy1zwJtS_md9pU8LZ_f^0`|!`=b5&a#vi9CMWc5`0`_4uDEl=7u>%tomxWE4Xtjns~ zj{8}#7%jO+tm$sRJ`Gy`gK)!11Fb1W{yo2bkW7e~yQ`OO$agTD<#Ln?uuON1iZA*m zg8j?<1LPEoB00Fx-*F#d|8vz+pO~Pa3~$DxNlJ-mfwDCKMwTQ^O%mWxAI9~ir=y`? zH&)1H^YGrF{LuT;>ieuN*>8DxK|48k-VeBH(sw+S>NfBh=R-RitC8nn^mND(McYR%e4}^ynJ>*fIP)<$HUtzl_0nUr;Coy6Vti7E(Zetvb90ey2TCT+#}Ph;2MNatrG(C zSSd;i*PeO~v;K!?R!cw19m{uKcx?63y=^hJ)-WkWj;Mv<`U>6u1k_Vfyg%6|yCG8v z!Jti0aU8rDnIEo1jz3J3pIDxHXGcp}dU#t;11Qf{wzY3X^78ZlDTyDwc)!<&y#;)^ zd0hM(i~W83s=N2G_pNR+x%b`i=IVE!^?;0h34T4|JCkJe*LOx z_`6X~3RupOKfyIpk*joc=8@UNAH$<4ton~1g@A=2QSVdwA=g4wVSDc(6DY0(WcK-_ zmtQH0;$HhJZTb#9FW)f+?mI61gty$(l!H|h9}m(}Rd9*-2;}!Nbd|aM>SToM8vk&F z{=p9B7smSb?Y>*29>;2VcmZdaTSapW2YaSow?wh-UnF*CoNkbm`{%_GN!c*rE+LHP zLd^*36g9qY7y_D{Vn5Ip>U^7T*-WFpuyrKP3eFtS$8R{4?OHsv9FKx-_gtQUlRx>t zw;r}P*IKc!bs&3JYjOnQrslZC`sZ|dZ)<)<>P%YLWKEgKTG}9KgQ_W(Eh)TyWK^)^ zau2W*mOqQ{(7)}DVcBnwj@F6vMUkx*0bV+oD1&$VLM$Q za-XFT6!2bZPkhN1zKeTNd~D2;42(qoEp8A+imolgFlasq4nYbc3qEQH8Po#ScP{Nb zczp;ip(NOw;9Wq(jj|lz!~u?GJ?oi$j|Af&1WF)7y!d+Dc$VAyu@XZNn%?v;ntH0So@mdEbey1-0%hj}{PjNIBoWwfCit6xV&@R# zITURj9rITcMZ2RY&1JH(C=8hqNBt%iR#3J(K3l+-sh{e;R26>Mr9h}57w-~5-;$HU z>)-KKTdA7R2iv4S}Nefjy{?w7X`7e+t=dJ)9)#_}u4TFDN9bn^@5AV4`-nYBCT z!e-O@Lf)ETy@B9OAh2(L8s;~2Abn4*$(wk_~^Kgf-FIdv?@|+P0BmPhc?cL zv440fam4uLGCWzZhQpZ-f}X#5VuoN>a5{SSo>Z4CQ#EP8K}+xezN z>`5`oIC5tgU*)R|zYvm^0pftNUK-~@@Xf3us z#Tb5g

~xtv8RamvJ4k`Y1ktS~R@S+OL&W)~d&PUPQLlQ(jpX}qwktHpI&TbE&^N@z=>hUrPOE?;7syR= z#+z*l5?K7azCKo&xp^58YFA&2!7Zp%IJS#N7b7SKWgz&g?qiy987<;3ckygQn@^#e zY#dq%kNgVh&tpOiKgHQi4Bf#@au(MN{Dv0ZL5qgqge0oZYj?V`WP&Q@RtYR~i)H4~ z;fo1uvYMA+H?!#3FTlDbWWf39X~K?^Bz`)?k4-6h%D?J0drKu`cqQRsPaZN><%^$E z+;wq?S=qB$9wEET@AZ^#;pKh*;9{_LS3FuqLEXrzIJh;4vt4t$*N7oqq~xA6|8c+?bqW01 z^zggkvS;5EEGy(~TY2U?iK2bVfQ|}?mm8KagIy%2Z?vkuh55<$4@?RAiBdWRBD6*o zd!El;N-kri{ml{ah;6{eprM$}Jq@7e_!_%c-ri7sI#v*`(Ns+7Z!7H$-`aUM8+pf4 zAM9M8HI>G&P?W$z@pLKC{KCkTUpi1y)I)yj!M85$6DI}~(Sx7{whBnq-x%qjS5s8< zhkt+0N0L8267?PRE&=d5L643{<>-T=z-D0)9$r8g+-^aH0o?nX09IZrU8Pg2;x7MN zSR&#sEDy&-o$R$=*T^d8p7~u^QLznbv9RL zXfTW9_}g)S`y`WsyL0?ybn7}sKU}Y6U-tLc!Wj`AX(l0{+U#;vo)W z4WAGdsA6LmntUR&{QK&Y(pLX2)ZO`KiBa_nMXa~e6SL&!m?^;y-NT>%SkH3=m$6V! zCmO$TnDO*88>CMi(7R80j2t`<1*FnWjHnQ#7yW80>&p3OODIC2ZP7lKj+VG;xRts^ zKjT<&6O);i;&vnWe*j`Yoxf?UzeLK8JUjKJf^JJ7i)qy2|3q3o*T0H+quWt&>&0i{ zmLS(ROlAd9!*YoYjiUv;b(Aao4c^t(F(j-&X{JOZkZGzCKUXQAarhcuVR#lqVYgZ^ z6F5$VfoHqqJ-3ZIz;=sa2rD-N&8F)JO|g`q;F*{mt;en17;UFeT}3?kP#{!hp)Q|l zqNSw0GuyTP4d7MR9FMeWU==;zxlkw$WmrQvgd}JG1WHA6Ai|={WNL{w%7PLjwQ7|T z)_n`(8tyTL2tCxjCJUf79#t`i-a4$8Zolns_x#^c6pf`k*4f6Q^IsJ_=Vb}5kdx)a zgbViCoD}R^Y}Q;lO`EJDpoBp1q=6i2fRF_{%3gBywpWSP-y>y%CqyC%3vMC+eh7kZe}aI~!HTr5Q)P7_BCAmnR4XKb z;z@}QD^w=Qq|Y|X74f}XQNl#NNX#?~?qaBH@$*?Flr-5SX}}FG+A1CFpehwFkiWHN{9zb?o~2Vk`rm$nAR_8nM%YAFcwLk>;YK zyUeD#&f`~}=F9<#Yec6921rfA(N@PBS61NCRI>ws$+6ehzC*uFb_X>f@0lQL2nqnO zk}MQK6a@TmLw<@4MQzAapB=`X7nLN^tBRX~>(c+~uXurSNrQem3z!{qB%kokavCw$ zaEI_dN438(cP|Qxc^w)(rNyp5_6P~aPzWb{zmoaUQ_O{O5lWf# zx-6$zu}>-1XFJWc^tDaqB#hK`7<`o-k4P-YIMti!6bfh6ZDopJQ8#7kt7v|7;lb8y z>bQ_7;dpYcZY>HbP;f-U(V<;uwb@mG?fF$CnA3ky&e)ldqn+d1Z3(KW4|1B_?gf#0 z-S@n@;UG*pYPSZoA^+X~QEW(dXa%AnkRDoN@d^^nTrsnS@ZhtXxvd3<78>#hS5 z683dWA&rHYLzv0j@j6cLmTlsmLnb>zyljzFMhdG1Rf`y`MlQ+qnIS}quvn`gpb8LD z5kL$|kcg5aBOt|n{Z{p*;y3)4rk(nB=rwCkUrO3jIO&?=J}Ql+{>F~zJ{;Gh@mAkP zqe^)(6xiNX6!7zfPk-HZQ?J@B&RU50N+5d0Sv+T4p+n~688#>JRlr!7tuxtzJ(4BY zXIX+~Tr6S|HES8gM#PJGtZQO1wlW-q1x*bMpEQuuAU-{_BiDX1U~q>#p*xxCbGgw# zSL;gO2>3)ZlDKCQq_=o9?@_hn)2Xk$WWYi6c`x$=d@lt1$Ei`VlH3+L zE@*EKT$m_`$wRSJfeqGLISSt4TzK6+BS*#ZzDG|CuPa4D$(U@pORnC$edUloLq1uY zx~w9QO3MhW!o8Q9MLG@wrbb*D|Sj>E+oBN#>A+=?-qyc1UTLvC8TY0s+td z4w;pYV6m~qNF8}h2MFM&J1piqrqjr*|4TCsvuLwUj z#@6spz{QP{$w zC5x(kSl>FEeU;_YSfO&^tuH>(vwO$vEKc`6EQyoMrDgv0yTwt~5m|iWGi@ux^Xfpv z)|j=uH4K-T=i$7EMruB?d6u71wZ9h*$~`pmdwU_{L4SVn)pO! zK`CEdQoITS#UgBs^ouGgZE_=Jr&g(H1B`{Izp5Db7s+Ikup4mSgn+^Na8p+??SsKkyLh}bj>$9Hj`D(%MFjzY+n{uaYO_(AiNVK0 zp8wuxy6<~i7COHV(AYoJoowBC*j~jNpDFEhIz=7YV`qEE=l|bcmyQ?YGK3Yz%mWh3 z`=aNyCSms;tB86~tj`JkODZ`Wf0yg9;xB`YGozff@LfPyzvFf>Ya3#epwsFZJ$in5 znv?JMc#bxxR6ls5;q(W`zWlEVwIvJ}X>MNP+DLx6>*h{q%k#KbMnE$|`6>k?Ir*a@98x z^p+NlNO$jz&0AJq7oDn1b4p_SRduMxp-YL9$pt5r-RI-)Z-NKKe{u5mC{3{Deh{GI0ZpeDdgaA-c1yX{ssLp?flJH1J z&!;!w*2A`%h+`AnJjaa8x774rTHe~}kjp{3;F&XFYm?TvCD3kE`3Rmpw6R=!7M&#P zxq4PSn~Oa{Ts6ugJLkgpo>neUdnD#6zG;v@1w_=MWr01P&bi-nggH+sf2~ z!_QEHQ!<5h-&KQ&I=n&>1v7oBfZk!Hr9|FCTRjGnV3?T=j$II*od7y}>-lb=vNOAhrh?3;YhOL*ivm2yEBF|3K$3mxh=vc<8D;( zY@-<&1D=b9JLFNRoqYs5Ee6IN3>Sor@l3EC7}_Rm9y%$T6ME3p&D-*NSX*PEIw<>y zrYSU5;X~S8v!zfCmKU-cjD;YkRxJNbD!KOPL$72zwoG~GP%$utkoCx6YPl~FyDyJZ zWOi@W{4MloQ4~Rld>c1U=%$Ic$FK-zwrmJPTijv&guQ;V4EPr~?ah$oX+@qCjZMD{ zf6u=C!>0MG9}(#gPL9v{98#{{(sKWXo&N9iVkW!ew4)2q_-Q!{2U zBn5)Nb!uhRqFj{;s2^CRaI8byf7%v^#3H0HTbFrt?dMp;0bmsJI#`5UuqEl^BQlmfBLeT+f) zJC)JFO^{;onGr;Z*&KEH4|R`gF%VWT$3q5T-l)c4({iTJh#`JX_57qQv7+qya^Q6C3=rQrtHVh0jP#XrjTx=eI1Zd+SL!f}FGXV8WmCc~)ngZN_QntlIkGlGy!rK*w%0d^xD1%e1B z{e80c*#2d^@{Nxc-Tx*`eGlw)DF1EY)(-K(1Tv~+w!xbB-pG_Gu1Y<_sNo?%n zp-pDSvQ(x8MEI2iNkNu8>q$ojBQZfsVu`0H4T@A`+-WzQcIz|;YNFzg1G>U{3>Ok}^#adCV&-ML+j z@1xS5j@5WgH6p>~c6-e6q=ZgDq(cac3Wh;$OM9CR6^cevy*h>fK_jR7K3-3#J$G)% zjQNFataOM_8q&sPohw$JXwTYKXLS>WB@0_VH*Q|x^ zUj8Ntq)?Swzi5UK%#Kf8afaS5KDFY)^f?_rS&ryyw8I+@dYk4>wYXrLQsMz2E)jBt zxI!!PUt?O3DvNx4b~O}7 zmpiV->HMmgshn3Zpgj^D&D6uV&ts?PR6f%c9FA=Pyz~=45~0U%N<)z3Oc-ZN*=#!; zwk`pk^$?~``J3+x=(@|h4yu5qu@Ww(!#OEhPlcG?@49onfXo(4a+%ULg!j=FTykuF zO*7umJl}C--35?(teg6a_3k0q!*LW@)vGJO%?Slqdxy7uXLG@I?dh`((gtf*eJY2D zlIA&vEoH3MoZIm2?lK|myyhzf$Oe-)nU!K$D`RV0F@JNbQcWfr;eKS-E-rB-%8E`R zZ_|p&k<+RLGPuyTokhvFcAgi^ZZD3~M+AiR3McWNY`Ya1C_?ImV}349_ecmx&WrXZ z!XohwD5WBc(SfM!bxBJ>K{~1p?Zq5pX9j%{Uw0^=`{S7vI=j_G80M*klzwqk2q}RQ z7}now0tg;4>X!Hz&kfncrxnc8IICIj%jB-H8|ww^>KcO{ivyMO4$H;Mjh=PgnD4HchX`S_mV+ZPrlJ^->k@Og9!ADQ$xwjl~mjOKV#9$~a1GHjY*SiTkA*ivyk23l=)XYBlC5K`};nt~!*QI;JeWA{!SLO30*4L-?81m^eeufcxZ)L0V7nsC6 z2ODIEO3OPO-HQdtB?t4BC@&eetBb0mFW@MyPz*vR(NF-;p`f!~tn5S>CmP#Z%bm*L zu|n6&n&i7(oq~vw0z?{A3f-_$sb%9%6P%2V?x0MdQU`;uX(^F4 z@fUPb@>eiMdld(^H!1VQ2PC^N^xx+E{6NH_XhM4$DEFs}iA8$v0U8rd@K#ldr6!># zg*yi{j%7HQ0Ophe0)d8A$CI%pgxg4bQ#Vj>^42BnvJ1Sz8`<_RxI!Yxk#lzZja6<- zj-U6|lM}} zWlf|e1RaVs5z-(&lhcXw67&d{O%;8Tv_1L6p*(i0X`+ZA3)SYl+K?&*F;DtzX>Fku z`W)fLAxa8yszOt!EFqF)-i(w1Qtl%X+!m=j$2slK zEy|eaD9}!NPX60C_xRprjq||rWZb6{Hr|U)3B#^6)xgEIVAy)kGhYpp*f5#df+#vF zWp>mNA`;fKrvj%JL>Avn+T=WOX$DNcmz9e8e%Jn)99*U(Re$LZg5c0Vxd3*&ZmUS8 zGCr%?0Xw@NjgOSgAWTCDO#Foj+0&0I+%497MnSc*+?tCh8ga0b+x+UybHsEq&Q+ zo8gZ|44Rr|{t3l&oJP5AmSTVks4gN}88~l!huoi>2i*^0rf~ifgAQEQEu7ghhuC-; ze*&+$LGT>ju~(|{J>?w~Rx~63w`s z^leE-taoT@AW`ZFNk}$p!L>r&MIu23+k(g%rAXx4^=G&g5`%ddV+9knr$y=^sJb+u zy)=VbxxBNbG! zPOT5QZ_8Ld>CdrUf?I5>kTt|QuBOGbZ>E{noIu)5JY?M14!3S?h8gjgD<|kMIKTVT z8o0ta8U8;Z?yF z#LAi~&?Ly~iEvU$B3DY*V<4Ua%+_K3wi*&}n8<7*SVxR_ieQC-tJEC zxUTgM?#}}SeD~hldGqge?d}~BA_``JnWljjCYou9JdF&QGEj&>NsNkk38~~JQ}m6aModK7 zQ}o0cG-#O6mO^q6-lSWaoH9bM5C$&#Zr>3W=>OC7#Hku&yG}F+J zNub(Csp+Y;Hl}JGQ%$HfOp`>$fHVds0D@sLG}BEK@S14TDe63v3Fu85RPvronhj6X z4K!&QdQ6^#dPdS2pc85yplE0sXwdY7)MyNkP+}S}JwqS{fQh0F0MG&=pM;vH`b{tz znN!$P!$C}^r;2)wJrmV8rkamRW&uI!c~4R8PgK(yntrM3c}MDj>UxjVK*{MINB{w# zF{z+wkOR~`MrwL$20(crH82q-f?_6(G{Tz`MAJ-}O_cCa>4`C>Q^h?;l-e|&iRg`_ zHjrti5E^L64XA0RfB<@$4FDMc13=IK8UO$Q!~~|12onMt4NMazCKF8!08APQrV~aA zU`?sC8lH)%S)pEjSo{#)jc5D zK>a9sM$!!$U~FZFafL&&pSIb|n$5HT4VQNPwJz;I8nUB1jsMh%JysYd^#%C7)8=Lq zHviyBLyG57E1X&O)KS;V*7Gg;TW@iC_W5E$LehAaIK602w|JWrNXe5j97P7JI%;^5 zeZ3!%KQAt9ysSz(PHg9=6V!Djmv}0KAW_}L!Q4*nQle<4GBUP=mBck;*hWF801lf< z*I|DA$+bdNfc?5|YGRIbs`=eRFrCcuI-S)6FIX@S(oorUeU7g$xbAC{t5GjX45jpt zGI7s^iqd7+s#_hk)GS3NVDl1yVy^ebfPtO_CL$EUdiy~f3|K<{%_jGWv*gchZtHhb zbyDu7j(njZjO9h$>T;mPDXZqQFknJVRB2ZNgN##Rp}M6Am3G+Bt=>676m#d-w|i(y zkw>p=kH*g7=&0XuJxe(6fL3kZ9dU36(Gt52l1!)(G?;)fC?#d~!ebB1jm5NFFppt4+t5ITHvA5a)p1A&2zt!I*$HU5Og4VWeYDhAs5Du2jE% zqnAql#XVrH7om}yRjqk0;w8SR!0e=r*aJnGx&UGh!HadvmuYUL{94(Gz|I|MK^}%e zbc|Mm$-v0OAt#%lr&|s=`Apn-9ZfwO*A`Kye^=bs{s`P~f6`xLTe7i9i~V{La*`_J z3^Dxjfdpyp=Vx5YD8;9vk9iJ_F*{>TV>Z{DF7r(FRORCBEbiu`53TjN6ZxsqNn8?U z8tzYfdy``>v{;R}Fgq~#PR(P(_}(iUlWDnn)3vXz!Xi{Drn*GDZG^K-IM{*0px`=T zBk?9J)C71A?Knm1ct1j|Pj%l(4)QLSdb4SDkO>hoRR-O$(C#}qTI=$D6*=rTdwI=P zbZ%8v=AYQ>40}eA5gwFTJf?fhMghdFr%` zQBC7^H7Z@!n*JOZ4NuwYxYo5;i%nxSOQUl)ikovKDFg{&wd(en)wVdZd-f~i0V9>Z zBynh7n)*YS0}FB%cW!2Z0OyQ#R$CXz&plvEOcbwsoULa24cKcROFCK=kKux#M;U7+ zqZr4Segv?d`W3=NsH&)5tExbRCBGMILQ<0DGG7eZ5#%7Hf)HXHY-q>Me^M33o*9jS zivkj4%83-`k3f)lEEX?7aOku6Cq=|r%sBM08tl7|-+!SL&VeG~3VFLl66mWBVg#c! z)Nl+7QVA^YD!vcdg_w+pN_8ojKSCi-N>y{VH=6lQD63W=sJE|oCsNBZyO}P=GC+&3fu5oVm zdOFrA)z>pzEax33PP-HiAuH!`D-QR_aT2B+NgG7s5=kbDyCgS+@zI)2G zlUz=Z9Xd2#-<=LW+1hk~=t}nbQbKHtWH5 zii%+%x=iUQoz{~HKp-Phi4g>regrAZFaV^ZBO!n@99NeCco}#r8!Z*!@=Z9~&l(ZO zUPMS<&6JjE1Te{VvEV5;>G^7O9vhfxH#u0*(CJ?#V)!369i6Qe-v;u&rnnE%E@vjU zw?u6{OQ!H}X3Zs=cwbHGcS|EYr0a%_n|E;X_YS;Q+U_nEgo=biSs!7Uv6ABL=_P9& zMNK4;YXRC!w)KjENq`k~>*kl&N48SYgC6}Cc8`~zPJO#gHq4$GfSlo5Bh&B!!z2)< zAo>kG;i+L&HZKV@K*0nsM}hvg5iqV4yjZu0-&;Xl|7wtNZmgCrUTKBCjSS9inS-(o zjp%3g^fQxBi6^B?xu;KD#NsZcs-~(`{^;(nJZ7~>YPQN9jEK&j8})Lin45oZZ->I+ zn%tKdxxGVkgrIQC(QN=3==d?O>w1cIogv_gY-x+IabwYgV$pR8(_$=uWg3I$c||;{ zi5P-6uc5`M*GIj-s6u|m`zy4%y_EYZ%*pkryt|MHQe91mGWcAy{m4nyZrTPT)9@Cj zh^AxKaV09d1qc(<++FZHq=}stObJ}uE6$%PijKVn3=shVCk%*w&*1Ht}?vCRKYguVlul>b{ zK;gj?=T{M1axP92-R3Dx7{iqIv865k4S-4j20TdtA&&%BJ03MF)@c}Qt{USTO^kzd zwvFK@fxd(8o-t1=>=6ka&7BGy@0Dkbo~^u3eB~|ovo?8+I5b1K9Dt@6#MEn*Wuv)8 zRhn$fHdh%#S!<-)8c9!D#e%gKt}PL*TY6wwR$DW)_O2nvEju*vRDkSPM-d&Sq?6EX5VF!8qL#8(f|5zVh1A`Gj!)g-{Agj$22}biTB53IE zVI*uS0!6d_@&;lEuoUc(spixzW_3c{ognG)fQfPj51gV=P=T?rUC6#Mvhv_eoT1Ca z>fz{_OoGiQ&Wc)@2^e?l=2x)T*izY`>`0SnIvAnzoAAXUebCzCP6qY(FzkH+xWhHBwO125R=A8Cj zrw5Wb35MX}A|NU6}fVC^Bd>K&t^wT}jy9A`IOjNZHyMA=Vj`k_ZP= zL{>vbctQZ+p%mbr5lB25nUS0lA-bBQ90(<1buxrkn<}BH61pQqE0jSyGeaseuykW{K>&k7E1WVULI!7Gi12O|2}s!?->xPi582UY zxk@Ba(6Gj~>)553sR5eN9Bz`t$eI+SfVk_LCazooafSGHwic|`P4HX-cwJ>t1W6UR zGGs1#=gc+J$ien7RaIl_a(v2Lf*2_*_3S1ASyY|Aw(?`}1WUqHIt%UG*au;x4X7U- zf(YvY-d5GHvFoz5z`|CuHi$&IIkB6&xF|JW!!rv#yfaODnlnyyMfIwsF+oYQAE!oQ zB}g?|gCIg}RW`hS=iTyx@YH1GT}e5Z4!M}#^^Jt8)g807uGnbUVYbH(C4SwQ3^=Ot zNW%hQuTXIi(`kF|iq5}ZpP>ADwR7j|dDgZZMicC5A|rjT;rZKYyG4zTxSJXb4MTPP zhU1LvUuzudEwp>y6gHVA_Wu7ST0KfK;%WfEuC2BX=jG^vDpby6KF&vx3P=-nhr3h< z0GS{BxC~&>$6BCEib)F1$!NWp8$qbScB*GI3kdHG+Y8y`=#LQT+ z*7{T~77pHDkIM3XJHlewa)06AFbR`kp{|=qXhOVY-+OR9KF%8jKD+*oK68dPNS*U(%!x1sOrDy)8p9=b`RG2EAFr$u=%!lQ+%Hs zha~!E(l2Z}LF?4xczMs%?i%#8i=acHDAiqq)*?qj%hQ$?Ajr8Xwd#}HXl!?cMr3|vw*ODS%_$uV_&Ei&Nj7D>Qy zdI3slwb$!VX>ja>oM=@$N|=Bh8DLO4ZQ)9mCjhJ1QZATW&?eCLBOfJUCQXy#72@Yc zwUg8C6Eoz1&uo&)r*L|ne@2*#-Q+qr(V?IsDA6LW)rUkwHzT0>i@M$C_?#XEoXiu% z>%rcJQO)M9hojT7i?Th_o_7d7?Ox5UYc)$GJq^0{hIWppr|HU? z{B~ySy*x>!e!wiD2@q6$(!*h7Y;UezB4Z@Cs2-v$nhex^X$Jd*OpPVChk2w?$drml zs)NJuel=5(4*=#P{0Be^go_nN*Ob=MFOZ=ZH5>ncUe8<}Y&jsN_o)2{ru!lYZ*Wj@ zzLj1>rJ30JdCa)<$69x0a=p=>cF+o8fL%yIJ|h<2(nsk*{;a-e<<(o#w!bsMQ#e(Z z>hc>@e+gMX6t!e=+|ukSIp4L@bjB3HaiarO^75xHV!hh4sJ@flW<()Uwgdgf-KP`d z4BlV%W$}dH^2q`5-0p%TDZ~JD02X)F4vb9@w^UR(Sr?|0Za+wjT{C(5l`^h-cy_oimq}<(k@olkD zWM%EBxAPgCQN6KB@V$ylNBT~t;IQef_c>;A-OnJ?NO->|MQDv)7V=MxbO7piHw6gS z<>M?@UHsQ_!t98)!T=V#szlA?K89yQ>OzVyvwqOeuJw~&_?*hcFV&5CK0!fBg2m!r z@}td}0g>H(hCI`Ui>8ZLR^OHx_qKjlSA{Cwd33e)-dfrSvX-|at$Dd?i`Dsy3J3gY zb%%xXzD<$u1dLNafDnCC2tpS$uo?nC)b!&1bFEbunS0D&X*$OpqsMf{qE%bu**ELB zCo_0PF!+WAPZupOyLwm4B~J0K#FK@iB8zo0;aTOujpNiCI#`6*7%6V%1Rz?IgOOM*a=SP}@p zgg>Za04YR53WSLfS?kk!2uPaHgqZa6z&~0ze4)ahZ|hsjb1bR_Jr3Km)_W((LkID| zzvc7$fYWz}=G**XzKUbv_MHckS^L?Zx%3c~`W-qFbO|K?uI&U6Oz2TrB`y53kty=0 zbhv(nS1J^}ic^xJCh&z-La6QGqu)&=1cIt=X)dJ5Or;2A*&hCfD#_>!t2^qlLLfyW zgrPe@%>xi71|n#HLPCZn5}G|~C|fu&Q9+mp$P%(B)yfWt zS|lL^F^3(gWmK88QV;^3>{bAp1kDgi#~J+mZ&ZsEdASY7mzqN6<5R$3Zh971P|pc_$xA6+t0VPFi=syJaZ+Q-Bnv@LmRJHBg_|AiiG!1Gi)bcyI z?^c4DHAQ&w%cP|=M#df}i3$WuY4D!1> zpLW$Z+xAYqjeB9$m$Pz|z4vj0uFX4b>!2UkJdnv)xkc1%!@TdkfS&zV5+946Z#DiM zRLZwYjYyp(^nl2pUM#>oYtx!W{<7vVdc>=NP?+E;y!-U6{`iY zW1CHU9k-(Ju5|b8(CfSc1kU40q)%uozl%@oK)CFOgvUtD2((71c5vs2vA{9|C8r~6 zpSWtmgIh_e@8PJ z>#fUwKMVhT(D_;%mWG`ay$tFG2F@LLI|R$Pw}C0?2V>iam%Fb2&j*H~i1Emdx%#e~ zDl^k9D(syZ?^tbHMDb)L=iWbyQvDOigynO2L)il|^4LW>X5JobrAf@n$1$Uo&Nn_p zgX>J&33u0zzkJGSxKVGsW~qzi1pp3k)%V(le*fc|W%-UkS-)?Evh#9UFn4m5AA6(V<~g3p)&3ZL0;G>2Bk>&nk(abUyNa{hK~TSEr^VwTy|xP>kJ zzj$uRdBE=SD4wu7FE|AW@FnyRp*zTp)pnkQn(wrdyC;8~%|zIxAXJL~D&FHKVWsxU zX%ngS&x!o!|1k0J=51E#w5~qiGy#$GWv@;9@DPwBEyw<8{5(!=JV)Lurq+JHpX2vQ zJipIc(2>AbfqTKez{%}qMPssQ%Sb?k$b*;T^^o}X3$FK1dckKO&*r`B`Z9Ui^szgd zI`x(tJBZrq(8G`ETb1K?s_={;2mmFLk@q!9O^!B7HxAo7RzDGcvUWS!F zaz3{s+`N%b*sMfe>%uZsm{mRYpn{|aAH^Y*Gv4R7-yS_?j(=W7)SGm@d9O$SH668c zD3^WC&pwSr>p||BEb1X@bK{*eIIe8d7}0f-(>J?+uNT6&=r@II`lV2`bb{vIhME@v z-X&Ia9noCrawEQ6Pdywz({_oO64%`>>pM~9hHsgMvh5TAa-riQr|G1%Mu$_F-mD<$ z2D#E)%amdJi}x2(rw76E+UpwsJW2z5<=2twANx)x2SN}(3;+Vn&Glx~;QtBa)4awK$)*e0AtIBcGK?8M!C{|pVu!R>W#zY zCHJ(|{p#E6NV{|~wFmB8oVP=D1CiXM&(FQ4W-j}l=&EG!b*2s_STR7?C>T3E9 zPFT1CI0tr_BfHDn2ZL%KuoIcqSv@UQ)(|Ao}=f{zkz)cWZi z=Afi0!he3}6XP4iIU12;%V+={{g`+P!vqEa2i;d<>izc@lX$wteSO_s1F6yRQzj5V z01$z-7+d7K%2#*WdIzv!p!Km{sJ1Yzvl})HyxV-AQtxE`c2a6PW zi*juxv_R*iem`deWQX^-WeEp-PlO>1Ck$w$wf{0`81N#)%{!~yY-Bm@Z|-P)5~Wc+ zmrkSHb#0Yw>}RX5_)nnETf722Ar>s@yr^ zEVhQ-DfL!C3e&E%ejKzQrU8L95}ALpNUCBIxve?DpB1?Z-G19n7Ay%QdD@Pdh7YG- zr^dI`>TK!xR&%3w^uJQ4;rV`diE7p3ece}`{`Br@*{x^R`Jw8K&8k%r{;kdjslnCm zKgZ7T*cdrUhUpMGJ*1=>Mlt61M}6!Q1SIKB$^<>%z4vytxt0ai!pi}Lz`ihcq+%Q5 zU~bB`VPi4SkID9v9;ZMW*Z%mps#I;IzPv%1(()m4r&RU_tyhcZxO`hWrgsCtJpUZZ z)8NFtyeMD%gYDbp((m~^^ExY;tLRhMT}wueW^|qG8H{*lmoAwQ6D{+YKyruTCA@x3 zM{_Yb{jem|mOC$9*3h;lb}~b=;;V-hF@lEZarj?7_Qky);U&UG4FvtP*HB|17H+KkE_R$J@kHXTr3fUjG^V6sx8 zUBg@Uv7IW5#|TF-VC@u-{l+GFaPReWz)PLPF$-=G?n>oUV8?D`K+qapP^uzcRz}IH)~l=N}Lb^ycg88+&7umLLB(DVRlNLg4iF?fcSAe zrBR!{(i%fsW-D%VF0ZR8GqwqD?~+smzXbCPjsX3$Zl0W|0}-xQyN4zqoh}N7p}<8k z36S7#vs8hnW2Rf_n7#`I z=dmS(ETR!1SdObf9FsZs6m9H`-90IztJRpdS28rkDx;VW_ryTiUuM(pC)?Lq_o=Ie za>RdD_7pT}jGBWsh^eVH;l2oYFgt8%%LteVCg@G9jLW$unGx+NT7iW1$0%EWRwzX? zLFT$Rncn_2+p$X!jXTKDjMqWdJh*ORaGtrQ=ZcfH%lZd$8 z!&($cS+-++`fux5H5c?vGR9OJoMd7)^pb#^1oetXkZnk6w7oi>%Bacdw{4A0p|6K* ziN=gQT^r!-1!UltpT`SxV=#(y-rR;5Ir2LqaB5WD95Cf6J#UBA!@^ONrGwWX ztMn^ZYl|2s&0A|`#{ggupJ0B==iI5-xU>Z);A=X2=Kv@fNK;G?9_;Oco6{Ylks^dK z2r&YX3W*ibkNCaU)=L-?VTe^P1#2_8LnJKjCdRN95Y#N&WRa8e1|)_HyvVX3dI198 z-U3>?EHts@V!F7@6hf?sGv=1PH^{6MSul(up^%IF6S`-jy;S+7ljaG1EA z$-KyATrq!;KS+wz;;g|`RpC$(;#myJ+IsASmpY6Pm4s1fxv=+vj!vTs5*n*}i>JNL z3zsHDFPa;Y#D+}k6{^t+B#z`-4yU!vJbF2=X# z^+w_NcfN%kZf|O1Y%c_3CY0J}EV^*VQpgzq#VA88S@f^9cML=f$cab_wRFd4(vYo$ z^^&Q2S5MFLXME~ScmfDe+5WATvXCu~nPTy>@w>3J{$oI62s-MCma;f@-oLLxFQL`j;`3 zGovd@#*7R1MQEWCS!jhLTp@l#rB|wao+L9U$=c$#n~38!)>2)rWGXEDZ2XM!?ox%- zmlD@T42ZvI0*8TeLl#-W2rPvK5@jIaxkU-jGS;a^m?butbCE*_crbG16RFIq7qHi2 z4Tnv%(&Cu0$Lw)*TTLVt;16}rhi(?7Gy1+|bCx+512lpH84aHyawoD0ww_K-1SzDU z2GF;JC~IkM(Mr1ToWo!!QmQWz;FwZXuZ1EO0STe%Y&?SpQ(;{%7^=G9TZYu!$sV(4 zGISXHwws>f^?3U$x?<24JwlHV(xgipHG%ZRl4wVLCDli<|_!MY+Qqtk` z@X%TfYAK+L3~6ytC>D4Ap5GVf3`n- ztSf$ux319#>nQ}%`_NVXykAG#&c2U+{&MA5+)Kn%v;0G<=!@U-mFy^%8&6F6{fmbU zA1)Fa?%Cb$i7RBUDH%>+>p|UA!F&x??ug(R#xV~xvJ@-9y9j{p5~mP4e8l2HNZY4U zJ33_PCP<^Xat8){IUh5|TUwv3zu%!Gt(H$WFOAUXH<|hy99(n3;IPMsKlnX$uRZGw zS8Am%DW?KbX$dH2Wr+`!9u%822UWpYu<)9HF^k7K@r9XC2Zn+K0E8x9e_xI{3O#|p z2Ee*^DhN|$u=@DeezJm%Em7UI&|v5_ydO#eN@+(XvqFKl*JmP=y8)L#VGXEhtTvfa z%%z*^Rx8UQ7ed}8_RH88h2(s6xEJ1qJ#u2Adw4(~g?rm!?D6HFKyq@K;jFsZl9DdV zIKZ_!oYOSeFo1hWoiY<_qr!m{B*I3`4B|K08A+1fCXzuW@SQj~nIRz0EqkzZ#g0An zx`W@D7x6zUs<4R^?+Rl2PCSfvv#WQ8M` z=>dE~-HI+2LQVxp{k5y2fbHDHV=cC?vOPVZg)$7HltYe}veG>GdR3HsF4j&QJHLs< zCnJ#la%dTGr)Q_8D8XY5-cA40%(t7po@}1iH?~q-tlP+Z_@w^My!;R>zCFiKGo$qr z?RIsXI>pw!DMYsBFvdZUr?h4m{ATD7g`5xyEM@M>?flKJ!%GL!Z@ZJ9x(H-bBC$Q?Z+}$w!;I2TKy_GJ|Z_jA$q9A3lC&;49y6&(yRf|*9TQz z0Bw!(-z1Y|@ox11w{F0JG2IrYTSutBu{@!%k+I$Yc~HSEd%HtGDFy<0*hc6&QTQtirOu8=<~A(vHow*FyYInPhQ0O?miEw@ zCg*+jZr7lF&mZ<9xQf5k7#_ZjjmLF^gGe271%NO$vMBfkCl%Z`;mMx1R59WBKZrwL zi98z`0}e3b5&(AV<7)b20v*S&8rfanqw>V}2Z9JvZ34Ch0!Kl&k3Eh)*CtK)Y>i7J z+T8s#Sonm$dAZs_GG_%1O%0AtP7Y4)tdbiSrnP3M95+g`>*;JvdyW30WINK1W+o<< z%Fc$%J8zwCw{x_v=M&>9qPjDnPEr);lak!TojD}aOQ)EcbK7sBR(%RBr=2w!(^7$! ziRh$^G?IvtNFtI_`qa}+C3f`u4*9n6Z(3PpmRU7bRmGQ%y6ehac@kx;y2>oFi>|t} z*=?4b+1F7;5=l2FUnruJqo|~XC;O$9oT{rVwHo!=VVaws%8g2NZ)vpCvu_z?mDgQ{ z8i#({OKw$JmKa%v7h#1|VTSK%R-;C(diAeq)%54yx_Gq(+G(m3C{Ja$jkx5d+i@h@ zNv7$x;_bIu`nC019zOX)oK>dVjG~IJy9_R}>#nk^BC6A`R$7gPI#u=?t6w|3tndUxwQ9HI$iD?jIh1+%lJ*yamXNn{fmw{1CT)E4X*PKd5`%Izuq|plaRS#zlG>t zh8XI%-K%XUEV9cBpSzhGvBz;X-iy|c>t;-u&wHean#q$UINXv+wU%Eo2t=|wu*F1C zJrhkn+)hQwjR-_>#pK5HalZT75x4H#s*$#&k~Z6c$Poe%`|du%>pb;i3_R-yc?e}6 z>6Tet+bgfYDt^L;%;~d{bCtWYv`(kwBhEN5Cl?UGc004v`2}>(>d9A|K z4K>s@+qB+gpT^D`&ud%Z`tJDq&wIXQKZJ+kjQl9=kF~_OIvv|^cqu*wA9>~iLgG4`(Jf`44tGjSE+%3^0< z#pa7lEtc0!DOd^Bv=I~_p+RigZ&WF>=a4!s$pOCziMoX*A=be#BUi4bXiAdWMVYS8 zBf`M{*-z`Cy+h=~@BjdScm6&2z0mI6t?q4X(w*(*vnEq*=xBNAUI$`kr5( z@p3(LbroRTctzvD3FrS-p@yDkPRqw~Ty$V~Yg&TUmXDr1Orm;`I1IZ|GT%E~xhxu< zT-)<6$Yu5ow}2&CE^j4{R3fOyu&*>m(K zFlILBEd_coB^bVEjB_lr*RZUb$H4vP927kC4nSj~A_7_DPuTL3cq=SttE(92b{NTb zxVWH`iMX3{OTji!2Lex@_AAaG-OH6++VBeq$lDgGXK4ysIr38DladQ05D$_74Y^g@ z4nRPb1BNKd0Z5)PPsTjhx=Q2YTV%1mt_ieXkF3qtd_6Svm5$U6cL#sJ%-Cl0!3N&i z*|Z4>0NCIJ(9zYx)m&Nd=`_pMJHS#^1q9M*Nda{jTdl}fFiHkvfQRAV?>cR_F8Y&N zi7W8|*=bFgmpdcYY`ME};LqN%sDm?XUc5{#>t_{3MY>z$lK!1sRbCAmypg zc=2Ll-)-_3rJFaMn?Nwe>@Ls7B=$dqIS3tH3@Z_w;y%+Mgx?T+uzs-gtsZZYa$LYn z?2L0a?4LE!mvZk0hk1LEPQE@Dva>=|Xwe9x5)b7rDE^s}Fj|7Lp_nh25)vvEH8W_1 zzPo^Xa-&F)Ybw_G-d$3trZ|8b@lZuS3qTyBbj!E*(N`e*Nq7xAlbd3rRUN0Yk~9lk zL-KU_8#?p!JmH5_L5a|+_Iysw1tcszti4)+IiWZ-V>o+u6q9mN=&8G~FBvx(AIVWo z)@t`|4Pl{KmH(J6rWmRxfn2mj^dO1;ay*?J6I;l_T(QoYUt*q3DaWlzzCO0L#Wdt+ zHU_dAU9=q!bx-Pny}5LPnWi;4i9^H!Qtlp3gxiq0EE7cOqvQ;NI1N2t+N__qkd*pJ z34o&|+vU-H-h|w#Yk-%wbG~%+OI!YxoL>D{|Ef+NJ;iRIj~1X605r+u0ojAjz4LQ< zIsF-i4nY;7QIYVSo)yNZ(}X;A@~ik7g Bh@Jod literal 29743 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 b31EbDb3?FVONK4{$Nnzlig2MJAY@hqPbju9 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 fe2550d4..b857f234 100644 --- a/worlds/pokemon_rb/docs/en_Pokemon Red and Blue.md +++ b/worlds/pokemon_rb/docs/en_Pokemon Red and Blue.md @@ -32,6 +32,7 @@ fossil scientist. This may require reviving a number of fossils, depending on yo * 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. +* HM moves can be overwritten if you have the HM for it in your bag. ## What items and locations get shuffled? diff --git a/worlds/pokemon_rb/docs/setup_en.md b/worlds/pokemon_rb/docs/setup_en.md index ef0a5b3e..5d83cb65 100644 --- a/worlds/pokemon_rb/docs/setup_en.md +++ b/worlds/pokemon_rb/docs/setup_en.md @@ -25,8 +25,8 @@ Once Bizhawk has been installed, open Bizhawk and change the following settings: - Under Config > Customize > Advanced, make sure the box for AutoSaveRAM is checked, and click the 5s button. This reduces the possibility of losing save data in emulator crashes. -- Under Config > Customize, check the "Run in background" and "Accept background input" boxes. This will allow you to - continue playing in the background, even if another window is selected. +- Under Config > Customize, check the "Run in background" box. This will prevent disconnecting from the client while +BizHawk is running in the background. It is strongly recommended to associate GB rom extensions (\*.gb) to the Bizhawk we've just installed. To do so, we simply have to search any Gameboy rom we happened to own, right click and select "Open with...", unfold diff --git a/worlds/pokemon_rb/items.py b/worlds/pokemon_rb/items.py index 82ac6345..8afde919 100644 --- a/worlds/pokemon_rb/items.py +++ b/worlds/pokemon_rb/items.py @@ -16,7 +16,7 @@ item_table = { "Bicycle": ItemData(6, ItemClassification.progression, ["Unique", "Key Items"]), # "Flippers": ItemData(7, ItemClassification.progression), #"Safari Ball": ItemData(8, ItemClassification.filler), - #"Pokedex": ItemData(9, ItemClassification.filler), + "Pokedex": ItemData(9, ItemClassification.progression, ["Unique", "Key Items"]), "Moon Stone": ItemData(10, ItemClassification.useful, ["Unique", "Evolution Stones"]), "Antidote": ItemData(11, ItemClassification.filler, ["Consumables"]), "Burn Heal": ItemData(12, ItemClassification.filler, ["Consumables"]), @@ -99,13 +99,17 @@ item_table = { "Mansion Key": ItemData(90, ItemClassification.progression, ["Unique", "Key Items"]), "Hideout Key": ItemData(91, ItemClassification.progression, ["Unique", "Key Items"]), "Safari Pass": ItemData(93, ItemClassification.progression, ["Unique", "Key Items"]), + "Poison Trap": ItemData(94, ItemClassification.trap, ["Traps"]), + "Paralyze Trap": ItemData(95, ItemClassification.trap, ["Traps"]), + "Ice Trap": ItemData(96, ItemClassification.trap, ["Traps"]), + "Fire Trap": ItemData(97, ItemClassification.trap, ["Traps"]), "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"]), "TM01 Mega Punch": ItemData(201, ItemClassification.useful, ["Unique", "TMs"]), - "TM02 Razor Wind": ItemData(202, ItemClassification.useful, ["Unique", "TMs"]), + "TM02 Razor Wind": ItemData(202, ItemClassification.filler, ["Unique", "TMs"]), "TM03 Swords Dance": ItemData(203, ItemClassification.useful, ["Unique", "TMs"]), "TM04 Whirlwind": ItemData(204, ItemClassification.filler, ["Unique", "TMs"]), "TM05 Mega Kick": ItemData(205, ItemClassification.useful, ["Unique", "TMs"]), @@ -139,12 +143,12 @@ item_table = { "TM33 Reflect": ItemData(233, ItemClassification.useful, ["Unique", "TMs"]), "TM34 Bide": ItemData(234, ItemClassification.filler, ["Unique", "TMs"]), "TM35 Metronome": ItemData(235, ItemClassification.useful, ["Unique", "TMs"]), - "TM36 Self Destruct": ItemData(236, ItemClassification.useful, ["Unique", "TMs"]), + "TM36 Self-Destruct": ItemData(236, ItemClassification.useful, ["Unique", "TMs"]), "TM37 Egg Bomb": ItemData(237, ItemClassification.useful, ["Unique", "TMs"]), "TM38 Fire Blast": ItemData(238, ItemClassification.useful, ["Unique", "TMs"]), "TM39 Swift": ItemData(239, ItemClassification.useful, ["Unique", "TMs"]), "TM40 Skull Bash": ItemData(240, ItemClassification.filler, ["Unique", "TMs"]), - "TM41 Soft Boiled": ItemData(241, ItemClassification.useful, ["Unique", "TMs"]), + "TM41 Soft-Boiled": ItemData(241, ItemClassification.useful, ["Unique", "TMs"]), "TM42 Dream Eater": ItemData(242, ItemClassification.useful, ["Unique", "TMs"]), "TM43 Sky Attack": ItemData(243, ItemClassification.filler, ["Unique", "TMs"]), "TM44 Rest": ItemData(244, ItemClassification.useful, ["Unique", "TMs"]), diff --git a/worlds/pokemon_rb/locations.py b/worlds/pokemon_rb/locations.py index 3ba7eb77..3e0148a8 100644 --- a/worlds/pokemon_rb/locations.py +++ b/worlds/pokemon_rb/locations.py @@ -3,8 +3,34 @@ from BaseClasses import Location from .rom_addresses import rom_addresses loc_id_start = 172000000 + +def trainersanity(multiworld, player): + return multiworld.trainersanity[player] + + +def hidden_items(multiworld, player): + return multiworld.randomize_hidden_items[player].value > 0 + + +def tea(multiworld, player): + return multiworld.tea[player] + + +def extra_key_items(multiworld, player): + return multiworld.extra_key_items[player] + + +def pokedex(multiworld, player): + return multiworld.randomize_pokedex[player].value > 0 + + +def always_on(multiworld, player): + return True + + class LocationData: - def __init__(self, region, name, original_item, rom_address=None, ram_address=None, event=False, type="Item"): + + def __init__(self, region, name, original_item, rom_address=None, ram_address=None, event=False, type="Item", inclusion=always_on): self.region = region if "Route" in region: region = " ".join(region.split()[:2]) @@ -14,6 +40,7 @@ class LocationData: self.ram_address = ram_address self.event = event self.type = type + self.inclusion = inclusion class EventFlag: def __init__(self, flag): @@ -42,6 +69,7 @@ class Rod: self.bit = flag self.flag = flag + location_data = [ LocationData("Vermilion City", "Fishing Guru", "Old Rod", rom_addresses["Rod_Vermilion_City_Fishing_Guru"], Rod(3)), @@ -49,7 +77,7 @@ location_data = [ LocationData("Route 12 South", "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)), + 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("Route 1", "Free Sample Man", "Potion", rom_addresses["Event_Free_Sample"], EventFlag(960)), @@ -77,7 +105,7 @@ location_data = [ 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"], EventFlag(1151)), - LocationData("Celadon City", "Stranded Man", "TM41 Soft Boiled", rom_addresses["Event_Stranded_Man"], + 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", rom_addresses["Event_Thirsty_Girl_Water"], EventFlag(396)), @@ -91,7 +119,7 @@ location_data = [ LocationData("Celadon Gym", "Erika 2", "TM21 Mega Drain", rom_addresses["Event_Celadon_Gym"], EventFlag(424)), LocationData("Silph Co 11F", "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", "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)), @@ -299,13 +327,13 @@ location_data = [ 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"], - Missable(231)), + Missable(231), inclusion=extra_key_items), LocationData("Rock Tunnel B1F", "West Item", "Mansion Key", rom_addresses["Missable_Rock_Tunnel_B1F_Item_2"], - Missable(232)), + Missable(232), inclusion=extra_key_items), LocationData("Rock Tunnel B1F", "Northwest Item", "Plant Key", rom_addresses["Missable_Rock_Tunnel_B1F_Item_3"], - Missable(233)), + Missable(233), inclusion=extra_key_items), LocationData("Rock Tunnel B1F", "North Item", "Safari Pass", rom_addresses["Missable_Rock_Tunnel_B1F_Item_4"], - Missable(234)), + 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)), @@ -316,59 +344,372 @@ location_data = [ 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("Viridian Forest", "Hidden Item Northwest by Trainer", "Potion", rom_addresses['Hidden_Item_Viridian_Forest_1'], Hidden(0)), - LocationData("Viridian Forest", "Hidden Item Entrance Tree", "Antidote", rom_addresses['Hidden_Item_Viridian_Forest_2'], Hidden(1)), - LocationData("Mt Moon B2F", "Hidden Item Dead End Before Fossils", "Moon Stone", rom_addresses['Hidden_Item_MtMoonB2F_1'], Hidden(2)), - LocationData("Route 25", "Hidden Item Fence Outside Bill's House", "Ether", rom_addresses['Hidden_Item_Route_25_1'], Hidden(3)), - LocationData("Route 9", "Hidden Item Bush By Grass", "Ether", rom_addresses['Hidden_Item_Route_9'], Hidden(4)), - LocationData("S.S. Anne 1F", "Hidden Item Kitchen Trash", "Great Ball", rom_addresses['Hidden_Item_SS_Anne_Kitchen'], Hidden(5)), - LocationData("S.S. Anne B1F", "Hidden Item Under Pillow", "Hyper Potion", rom_addresses['Hidden_Item_SS_Anne_B1F'], Hidden(6)), - LocationData("Route 10 North", "Hidden Item Behind Rock Tunnel Entrance Cuttable Tree", "Super Potion", rom_addresses['Hidden_Item_Route_10_1'], Hidden(7)), - LocationData("Route 10 South", "Hidden Item Bush", "Max Ether", rom_addresses['Hidden_Item_Route_10_2'], Hidden(8)), - LocationData("Rocket Hideout B1F", "Hidden Item Pot Plant", "PP Up", rom_addresses['Hidden_Item_Rocket_Hideout_B1F'], Hidden(9)), - LocationData("Rocket Hideout B3F", "Hidden Item Near East Item", "Nugget", rom_addresses['Hidden_Item_Rocket_Hideout_B3F'], Hidden(10)), - LocationData("Rocket Hideout B4F", "Hidden Item Behind Giovanni", "Super Potion", rom_addresses['Hidden_Item_Rocket_Hideout_B4F'], Hidden(11)), - LocationData("Pokemon Tower 5F", "Hidden Item Near West Staircase", "Elixir", rom_addresses['Hidden_Item_Pokemon_Tower_5F'], Hidden(12)), - LocationData("Route 13", "Hidden Item Dead End Bush", "PP Up", rom_addresses['Hidden_Item_Route_13_1'], Hidden(13)), - LocationData("Route 13", "Hidden Item Dead End By Water Corner", "Calcium", rom_addresses['Hidden_Item_Route_13_2'], Hidden(14)), - LocationData("Pokemon Mansion B1F", "Hidden Item Secret Key Room Corner", "Rare Candy", rom_addresses['Hidden_Item_Pokemon_Mansion_B1F'], Hidden(15)), - LocationData("Safari Zone West", "Hidden Item Secret House Statue", "Revive", rom_addresses['Hidden_Item_Safari_Zone_West'], Hidden(17)), - LocationData("Silph Co 5F", "Hidden Item Pot Plant", "Elixir", rom_addresses['Hidden_Item_Silph_Co_5F'], Hidden(18)), - LocationData("Silph Co 9F", "Hidden Item Nurse Bed (Card Key)", "Max Potion", rom_addresses['Hidden_Item_Silph_Co_9F'], Hidden(19)), - LocationData("Copycat's House", "Hidden Item Desk", "Nugget", rom_addresses['Hidden_Item_Copycats_House'], Hidden(20)), - LocationData("Cerulean Cave 1F", "Hidden Item Center Rocks", "Rare Candy", rom_addresses['Hidden_Item_Cerulean_Cave_1F'], Hidden(21)), - LocationData("Cerulean Cave B1F", "Hidden Item Northeast Rocks", "Ultra Ball", rom_addresses['Hidden_Item_Cerulean_Cave_B1F'], Hidden(22)), - LocationData("Power Plant", "Hidden Item Central Dead End", "Max Elixir", rom_addresses['Hidden_Item_Power_Plant_1'], Hidden(23)), - LocationData("Power Plant", "Hidden Item Before Zapdos", "PP Up", rom_addresses['Hidden_Item_Power_Plant_2'], Hidden(24)), - LocationData("Seafoam Islands B2F", "Hidden Item Rock", "Nugget", rom_addresses['Hidden_Item_Seafoam_Islands_B2F'], Hidden(25)), - LocationData("Seafoam Islands B4F", "Hidden Item Corner Island", "Ultra Ball", rom_addresses['Hidden_Item_Seafoam_Islands_B4F'], Hidden(26)), - LocationData("Pokemon Mansion 1F", "Hidden Item Block Near Entrance Carpet", "Moon Stone", rom_addresses['Hidden_Item_Pokemon_Mansion_1F'], Hidden(27)), - LocationData("Pokemon Mansion 3F", "Hidden Item Behind Burglar", "Max Revive", rom_addresses['Hidden_Item_Pokemon_Mansion_3F'], Hidden(28)), - LocationData("Route 23", "Hidden Item Rocks Before Final Guard", "Full Restore", rom_addresses['Hidden_Item_Route_23_1'], Hidden(29)), - LocationData("Route 23", "Hidden Item East Bush After Water", "Ultra Ball", rom_addresses['Hidden_Item_Route_23_2'], Hidden(30)), - LocationData("Route 23", "Hidden Item On Island", "Max Ether", rom_addresses['Hidden_Item_Route_23_3'], Hidden(31)), - LocationData("Victory Road 2F", "Hidden Item Rock Before Moltres", "Ultra Ball", rom_addresses['Hidden_Item_Victory_Road_2F_1'], Hidden(32)), - LocationData("Victory Road 2F", "Hidden Item Rock In Final Room", "Full Restore", rom_addresses['Hidden_Item_Victory_Road_2F_2'], Hidden(33)), + 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("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("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", "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("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("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 Final Guard", "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("Viridian City", "Hidden Item Cuttable Tree", "Potion", rom_addresses['Hidden_Item_Viridian_City'], Hidden(35)), - LocationData("Route 11", "Hidden Item Isolated Bush Near Gate", "Potion", rom_addresses['Hidden_Item_Route_11'], Hidden(36)), - LocationData("Route 12 West", "Hidden Item Bush Near Gate", "Hyper Potion", rom_addresses['Hidden_Item_Route_12'], Hidden(37)), - LocationData("Route 17", "Hidden Item In Grass", "Rare Candy", rom_addresses['Hidden_Item_Route_17_1'], Hidden(38)), - LocationData("Route 17", "Hidden Item Near Northernmost Sign", "Full Restore", rom_addresses['Hidden_Item_Route_17_2'], Hidden(39)), - LocationData("Route 17", "Hidden Item East Center", "PP Up", rom_addresses['Hidden_Item_Route_17_3'], Hidden(40)), - LocationData("Route 17", "Hidden Item West Center", "Max Revive", rom_addresses['Hidden_Item_Route_17_4'], Hidden(41)), - LocationData("Route 17", "Hidden Item Before Final Bridge", "Max Elixir", rom_addresses['Hidden_Item_Route_17_5'], Hidden(42)), - LocationData("Underground Tunnel North-South", "Hidden Item Near Northern Stairs", "Full Restore", rom_addresses['Hidden_Item_Underground_Path_NS_1'], Hidden(43)), - LocationData("Underground Tunnel North-South", "Hidden Item Near Southern Stairs", "X Special", rom_addresses['Hidden_Item_Underground_Path_NS_2'], Hidden(44)), - LocationData("Underground Tunnel West-East", "Hidden Item West", "Nugget", rom_addresses['Hidden_Item_Underground_Path_WE_1'], Hidden(45)), - LocationData("Underground Tunnel West-East", "Hidden Item East", "Elixir", rom_addresses['Hidden_Item_Underground_Path_WE_2'], Hidden(46)), - LocationData("Celadon City", "Hidden Item Dead End Near Cuttable Tree", "PP Up", rom_addresses['Hidden_Item_Celadon_City'], Hidden(47)), - LocationData("Route 25", "Hidden Item Northeast Of Grass", "Elixir", rom_addresses['Hidden_Item_Route_25_2'], Hidden(48)), - LocationData("Mt Moon B2F", "Hidden Item Lone Rock", "Ether", rom_addresses['Hidden_Item_MtMoonB2F_2'], Hidden(49)), - LocationData("Seafoam Islands B3F", "Hidden Item Rock", "Max Elixir", rom_addresses['Hidden_Item_Seafoam_Islands_B3F'], Hidden(50)), - LocationData("Vermilion City", "Hidden Item In Water Near Fan Club", "Max Ether", rom_addresses['Hidden_Item_Vermilion_City'], Hidden(51)), - LocationData("Cerulean City", "Hidden Item Gym Badge Guy's Backyard", "Rare Candy", rom_addresses['Hidden_Item_Cerulean_City'], Hidden(52)), - LocationData("Route 4", "Hidden Item Plateau East Of Mt Moon", "Great Ball", rom_addresses['Hidden_Item_Route_4'], Hidden(53)), + 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 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("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("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("Pallet Town", "Oak's Parcel Reward", "Pokedex", rom_addresses["Event_Pokedex"], EventFlag(0x38), inclusion=pokedex), + + LocationData("Pokemon Mansion 1F", "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 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 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 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 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), + LocationData("Silph Co 5F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_3_ITEM"], EventFlag(65), inclusion=trainersanity), + LocationData("Silph Co 5F", "Juggler", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_2_ITEM"], EventFlag(66), inclusion=trainersanity), + LocationData("Silph Co 5F", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_1_ITEM"], EventFlag(67), inclusion=trainersanity), + 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 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("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 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("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), + LocationData("Mt Moon 1F", "Bug Catcher 2", None, rom_addresses["Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_6_ITEM"], EventFlag(130), inclusion=trainersanity), + 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", "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), + LocationData("Viridian Forest", "Bug Catcher 2", None, rom_addresses["Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_1_ITEM"], EventFlag(138), inclusion=trainersanity), + LocationData("Viridian Forest", "Bug Catcher 3", None, rom_addresses["Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_2_ITEM"], EventFlag(137), inclusion=trainersanity), + LocationData("Route 25", "Hiker 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_6_ITEM"], EventFlag(142), inclusion=trainersanity), + LocationData("Route 25", "Youngster 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_0_ITEM"], EventFlag(148), inclusion=trainersanity), + LocationData("Route 25", "Hiker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_8_ITEM"], EventFlag(140), inclusion=trainersanity), + LocationData("Route 25", "Youngster 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_1_ITEM"], EventFlag(147), inclusion=trainersanity), + LocationData("Route 25", "Lass 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_3_ITEM"], EventFlag(145), inclusion=trainersanity), + LocationData("Route 25", "Hiker 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_7_ITEM"], EventFlag(141), inclusion=trainersanity), + LocationData("Route 25", "Jr. Trainer M", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_2_ITEM"], EventFlag(146), inclusion=trainersanity), + LocationData("Route 25", "Youngster 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_4_ITEM"], EventFlag(144), inclusion=trainersanity), + LocationData("Route 25", "Lass 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_25_TRAINER_5_ITEM"], EventFlag(143), inclusion=trainersanity), + LocationData("Route 24", "Bug Catcher", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_5_ITEM"], EventFlag(149), inclusion=trainersanity), + LocationData("Route 24", "Lass 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_4_ITEM"], EventFlag(150), inclusion=trainersanity), + LocationData("Route 24", "Youngster", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_3_ITEM"], EventFlag(151), inclusion=trainersanity), + LocationData("Route 24", "Lass 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_2_ITEM"], EventFlag(153), inclusion=trainersanity), + LocationData("Route 24", "Jr. Trainer M 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_1_ITEM"], EventFlag(154), inclusion=trainersanity), + LocationData("Route 24", "Jr. Trainer M 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_24_TRAINER_0_ITEM"], EventFlag(155), inclusion=trainersanity), + LocationData("Route 21", "Fisherman 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_0_ITEM"], EventFlag(174), inclusion=trainersanity), + LocationData("Route 21", "Fisherman 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_1_ITEM"], EventFlag(173), inclusion=trainersanity), + LocationData("Route 21", "Cue Ball", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_3_ITEM"], EventFlag(171), inclusion=trainersanity), + LocationData("Route 21", "Swimmer 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_2_ITEM"], EventFlag(172), inclusion=trainersanity), + LocationData("Route 21", "Fisherman 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_7_ITEM"], EventFlag(166), inclusion=trainersanity), + LocationData("Route 21", "Fisherman 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_21_TRAINER_8_ITEM"], EventFlag(165), inclusion=trainersanity), + 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", "Cooltrainer M", 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 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), + LocationData("Route 17", "Biker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_3_ITEM"], EventFlag(209), inclusion=trainersanity), + LocationData("Route 17", "Biker 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_4_ITEM"], EventFlag(208), inclusion=trainersanity), + LocationData("Route 17", "Cue Ball 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_5_ITEM"], EventFlag(207), inclusion=trainersanity), + LocationData("Route 17", "Cue Ball 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_17_TRAINER_6_ITEM"], EventFlag(206), inclusion=trainersanity), + 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 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), + LocationData("Route 15", "Biker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_7_ITEM"], EventFlag(222), inclusion=trainersanity), + LocationData("Route 15", "Jr. Trainer F 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_0_ITEM"], EventFlag(229), inclusion=trainersanity), + LocationData("Route 15", "Beauty 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_5_ITEM"], EventFlag(224), inclusion=trainersanity), + LocationData("Route 15", "Bird Keeper 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_3_ITEM"], EventFlag(226), inclusion=trainersanity), + LocationData("Route 15", "Bird Keeper 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_2_ITEM"], EventFlag(227), inclusion=trainersanity), + LocationData("Route 15", "Jr. Trainer F 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_9_ITEM"], EventFlag(220), inclusion=trainersanity), + LocationData("Route 14", "Bird Keeper 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_0_ITEM"], EventFlag(244), inclusion=trainersanity), + LocationData("Route 14", "Bird Keeper 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_1_ITEM"], EventFlag(240), inclusion=trainersanity), + LocationData("Route 14", "Bird Keeper 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_2_ITEM"], EventFlag(237), inclusion=trainersanity), + LocationData("Route 14", "Bird Keeper 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_3_ITEM"], EventFlag(236), inclusion=trainersanity), + LocationData("Route 14", "Biker 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_8_ITEM"], EventFlag(231), inclusion=trainersanity), + LocationData("Route 14", "Bird Keeper 5", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_4_ITEM"], EventFlag(235), inclusion=trainersanity), + LocationData("Route 14", "Biker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_14_TRAINER_9_ITEM"], EventFlag(230), inclusion=trainersanity), + 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", "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), + LocationData("Route 13", "Jr. Trainer F 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_13_TRAINER_3_ITEM"], EventFlag(254), inclusion=trainersanity), + 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 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), + LocationData("Route 11", "Youngster 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_4_ITEM"], EventFlag(284), inclusion=trainersanity), + LocationData("Route 11", "Gambler 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_1_ITEM"], EventFlag(287), inclusion=trainersanity), + LocationData("Route 11", "Gambler 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_6_ITEM"], EventFlag(282), inclusion=trainersanity), + LocationData("Route 11", "Engineer 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_3_ITEM"], EventFlag(285), inclusion=trainersanity), + 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("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), + LocationData("Route 9", "Bug Catcher 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_6_ITEM"], EventFlag(314), inclusion=trainersanity), + LocationData("Route 9", "Hiker 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_7_ITEM"], EventFlag(313), inclusion=trainersanity), + LocationData("Route 9", "Bug Catcher 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_8_ITEM"], EventFlag(312), inclusion=trainersanity), + LocationData("Route 9", "Jr. Trainer M 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_2_ITEM"], EventFlag(318), inclusion=trainersanity), + LocationData("Route 9", "Hiker 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_5_ITEM"], EventFlag(315), inclusion=trainersanity), + LocationData("Route 9", "Jr. Trainer F 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_9_TRAINER_3_ITEM"], EventFlag(317), inclusion=trainersanity), + LocationData("Route 8", "Lass 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_8_ITEM"], EventFlag(321), inclusion=trainersanity), + LocationData("Route 8", "Gambler 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_7_ITEM"], EventFlag(322), inclusion=trainersanity), + LocationData("Route 8", "Super Nerd 1", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_2_ITEM"], EventFlag(327), inclusion=trainersanity), + LocationData("Route 8", "Lass 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_3_ITEM"], EventFlag(326), inclusion=trainersanity), + LocationData("Route 8", "Super Nerd 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_4_ITEM"], EventFlag(325), inclusion=trainersanity), + LocationData("Route 8", "Lass 3", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_5_ITEM"], EventFlag(324), inclusion=trainersanity), + LocationData("Route 8", "Lass 4", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_6_ITEM"], EventFlag(323), inclusion=trainersanity), + 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", "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 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), + LocationData("Route 3", "Bug Catcher 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_3_ITEM"], EventFlag(344), inclusion=trainersanity), + LocationData("Route 3", "Lass 2", None, rom_addresses["Trainersanity_EVENT_BEAT_ROUTE_3_TRAINER_4_ITEM"], EventFlag(341), inclusion=trainersanity), + 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("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), + LocationData("Fuchsia Gym", "Tamer 1", None, rom_addresses["Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_4_ITEM"], EventFlag(378), inclusion=trainersanity), + LocationData("Fuchsia Gym", "Tamer 2", None, rom_addresses["Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_3_ITEM"], EventFlag(379), inclusion=trainersanity), + LocationData("Fuchsia Gym", "Juggler 4", None, rom_addresses["Trainersanity_EVENT_BEAT_FUCHSIA_GYM_TRAINER_5_ITEM"], EventFlag(377), inclusion=trainersanity), + LocationData("Celadon Gym", "Lass 1", None, rom_addresses["Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_0_ITEM"], EventFlag(391), inclusion=trainersanity), + 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("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), + LocationData("Pokemon Tower 3F", "Channeler 1", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_3_TRAINER_0_ITEM"], EventFlag(417), inclusion=trainersanity), + LocationData("Pokemon Tower 3F", "Channeler 2", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_3_TRAINER_1_ITEM"], EventFlag(416), inclusion=trainersanity), + LocationData("Pokemon Tower 3F", "Channeler 3", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_3_TRAINER_2_ITEM"], EventFlag(415), inclusion=trainersanity), + LocationData("Pokemon Tower 4F", "Channeler 1", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_4_TRAINER_1_ITEM"], EventFlag(413), inclusion=trainersanity), + LocationData("Pokemon Tower 4F", "Channeler 2", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_4_TRAINER_2_ITEM"], EventFlag(412), inclusion=trainersanity), + LocationData("Pokemon Tower 4F", "Channeler 3", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_4_TRAINER_0_ITEM"], EventFlag(414), inclusion=trainersanity), + LocationData("Pokemon Tower 5F", "Channeler 1", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_1_ITEM"], EventFlag(410), inclusion=trainersanity), + LocationData("Pokemon Tower 5F", "Channeler 2", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_0_ITEM"], EventFlag(411), inclusion=trainersanity), + LocationData("Pokemon Tower 5F", "Channeler 3", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_2_ITEM"], EventFlag(409), inclusion=trainersanity), + LocationData("Pokemon Tower 5F", "Channeler 4", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_5_TRAINER_3_ITEM"], EventFlag(408), inclusion=trainersanity), + LocationData("Pokemon Tower 6F", "Channeler 1", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_6_TRAINER_0_ITEM"], EventFlag(407), inclusion=trainersanity), + LocationData("Pokemon Tower 6F", "Channeler 2", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_6_TRAINER_2_ITEM"], EventFlag(405), inclusion=trainersanity), + LocationData("Pokemon Tower 6F", "Channeler 3", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_6_TRAINER_1_ITEM"], EventFlag(406), inclusion=trainersanity), + LocationData("Pokemon Tower 7F", "Rocket 1", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_7_TRAINER_0_ITEM"], EventFlag(403), inclusion=trainersanity), + LocationData("Pokemon Tower 7F", "Rocket 2", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_7_TRAINER_1_ITEM"], EventFlag(402), inclusion=trainersanity), + LocationData("Pokemon Tower 7F", "Rocket 3", None, rom_addresses["Trainersanity_EVENT_BEAT_POKEMONTOWER_7_TRAINER_2_ITEM"], EventFlag(401), inclusion=trainersanity), + LocationData("Cerulean Gym", "Swimmer", None, rom_addresses["Trainersanity_EVENT_BEAT_CERULEAN_GYM_TRAINER_1_ITEM"], EventFlag(420), inclusion=trainersanity), + LocationData("Cerulean Gym", "Jr. Trainer F", None, rom_addresses["Trainersanity_EVENT_BEAT_CERULEAN_GYM_TRAINER_0_ITEM"], EventFlag(421), inclusion=trainersanity), + LocationData("Pewter Gym", "Jr. Trainer M", None, rom_addresses["Trainersanity_EVENT_BEAT_PEWTER_GYM_TRAINER_0_ITEM"], EventFlag(434), inclusion=trainersanity), + LocationData("Viridian Gym", "Tamer 1", None, rom_addresses["Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_6_ITEM"], EventFlag(436), inclusion=trainersanity), + LocationData("Viridian Gym", "Blackbelt 1", None, rom_addresses["Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_3_ITEM"], EventFlag(439), inclusion=trainersanity), + LocationData("Viridian Gym", "Cooltrainer M 1", None, rom_addresses["Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_7_ITEM"], EventFlag(435), inclusion=trainersanity), + LocationData("Viridian Gym", "Cooltrainer M 2", None, rom_addresses["Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_0_ITEM"], EventFlag(446), inclusion=trainersanity), + LocationData("Viridian Gym", "Blackbelt 2", None, rom_addresses["Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_1_ITEM"], EventFlag(445), inclusion=trainersanity), + LocationData("Viridian Gym", "Tamer 2", None, rom_addresses["Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_2_ITEM"], EventFlag(440), inclusion=trainersanity), + LocationData("Viridian Gym", "Cooltrainer M 3", None, rom_addresses["Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_5_ITEM"], EventFlag(437), inclusion=trainersanity), + LocationData("Viridian Gym", "Blackbelt 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 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", "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", "Become Champion", "Become Champion", event=True), LocationData("Pokemon Tower 7F", "Fuji Saved", "Fuji Saved", event=True), @@ -977,25 +1318,25 @@ location_data = [ 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", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 1, None, + LocationData("Route 14 Grass", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 1, None, event=True, type="Wild Encounter"), - LocationData("Route 14", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route14"] + 3, None, event=True, + LocationData("Route 14 Grass", "Wild Pokemon - 2", "Pidgey", rom_addresses["Wild_Route14"] + 3, None, event=True, type="Wild Encounter"), - LocationData("Route 14", "Wild Pokemon - 3", "Ditto", rom_addresses["Wild_Route14"] + 5, None, event=True, + LocationData("Route 14 Grass", "Wild Pokemon - 3", "Ditto", rom_addresses["Wild_Route14"] + 5, None, event=True, type="Wild Encounter"), - LocationData("Route 14", "Wild Pokemon - 4", "Venonat", rom_addresses["Wild_Route14"] + 7, None, event=True, + LocationData("Route 14 Grass", "Wild Pokemon - 4", "Venonat", rom_addresses["Wild_Route14"] + 7, None, event=True, type="Wild Encounter"), - LocationData("Route 14", "Wild Pokemon - 5", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 9, None, + LocationData("Route 14 Grass", "Wild Pokemon - 5", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 9, None, event=True, type="Wild Encounter"), - LocationData("Route 14", "Wild Pokemon - 6", "Venonat", rom_addresses["Wild_Route14"] + 11, None, event=True, + LocationData("Route 14 Grass", "Wild Pokemon - 6", "Venonat", rom_addresses["Wild_Route14"] + 11, None, event=True, type="Wild Encounter"), - LocationData("Route 14", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 13, None, + LocationData("Route 14 Grass", "Wild Pokemon - 7", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route14"] + 13, None, event=True, type="Wild Encounter"), - LocationData("Route 14", "Wild Pokemon - 8", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route14"] + 15, None, + LocationData("Route 14 Grass", "Wild Pokemon - 8", ["Gloom", "Weepinbell"], rom_addresses["Wild_Route14"] + 15, None, event=True, type="Wild Encounter"), - LocationData("Route 14", "Wild Pokemon - 9", "Pidgeotto", rom_addresses["Wild_Route14"] + 17, None, event=True, + LocationData("Route 14 Grass", "Wild Pokemon - 9", "Pidgeotto", rom_addresses["Wild_Route14"] + 17, None, event=True, type="Wild Encounter"), - LocationData("Route 14", "Wild Pokemon - 10", "Pidgeotto", rom_addresses["Wild_Route14"] + 19, None, event=True, + LocationData("Route 14 Grass", "Wild Pokemon - 10", "Pidgeotto", rom_addresses["Wild_Route14"] + 19, None, event=True, type="Wild Encounter"), LocationData("Route 15", "Wild Pokemon - 1", ["Oddish", "Bellsprout"], rom_addresses["Wild_Route15"] + 1, None, event=True, type="Wild Encounter"), @@ -1653,9 +1994,9 @@ location_data = [ LocationData("Route 16", "Sleeping Pokemon", "Snorlax", rom_addresses["Static_Encounter_Snorlax_B"], None, event=True, type="Missable Pokemon"), - LocationData("Saffron City", "Fighting Dojo Gift 1", "Hitmonlee", rom_addresses["Gift_Hitmonlee"], + LocationData("Fighting Dojo", "Gift 1", "Hitmonlee", rom_addresses["Gift_Hitmonlee"], None, event=True, type="Missable Pokemon"), - LocationData("Saffron City", "Fighting Dojo Gift 2", "Hitmonchan", rom_addresses["Gift_Hitmonchan"], + LocationData("Fighting Dojo", "Gift 2", "Hitmonchan", rom_addresses["Gift_Hitmonchan"], None, event=True, type="Missable Pokemon"), LocationData("Pallet Town", "Starter 1", "Charmander", [rom_addresses["Starter1_A"], @@ -1697,6 +2038,7 @@ location_data = [ None, event=True, type="Legendary Pokemon"), LocationData("Vermilion City", "Legendary Pokemon", "Mew", rom_addresses["Static_Encounter_Mew"], None, event=True, type="Legendary Pokemon"), + ] for i, location in enumerate(location_data): diff --git a/worlds/pokemon_rb/logic.py b/worlds/pokemon_rb/logic.py index 8b60bd8b..6f2c1d79 100644 --- a/worlds/pokemon_rb/logic.py +++ b/worlds/pokemon_rb/logic.py @@ -59,6 +59,15 @@ class PokemonLogic(LogicMixin): 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): + if self.multiworld.randomize_pokedex[player].value > 0: + if not self.has("Pokedex", player): + return False + else: + if not self.has("Oak's Parcel", player): + return False + return self.pokemon_rb_has_pokemon(count, player) + def pokemon_rb_has_pokemon(self, count, player): obtained_pokemon = set() for pokemon in poke_data.pokemon_data.keys(): diff --git a/worlds/pokemon_rb/options.py b/worlds/pokemon_rb/options.py index 6cb4267a..3b6739a9 100644 --- a/worlds/pokemon_rb/options.py +++ b/worlds/pokemon_rb/options.py @@ -1,5 +1,5 @@ -from Options import Toggle, Choice, Range, SpecialRange, FreeText, TextChoice +from Options import Toggle, Choice, Range, SpecialRange, TextChoice, DeathLink class GameVersion(Choice): @@ -10,23 +10,25 @@ class GameVersion(Choice): default = "random" -class TrainerName(FreeText): - """Your trainer name. Cannot exceed 7 characters. - See the setup guide on archipelago.gg for a list of allowed characters.""" +class TrainerName(TextChoice): + """Your trainer name. If not set to choose_in_game, must be a name not exceeding 7 characters, and the prompt to + name your character in-game will be skipped. See the setup guide on archipelago.gg for a list of allowed characters.""" display_name = "Trainer Name" - default = "ASH" + option_choose_in_game = -1 + default = -1 -class RivalName(FreeText): - """Your rival's name. Cannot exceed 7 characters. - See the setup guide on archipelago.gg for a list of allowed characters.""" +class RivalName(TextChoice): + """Your rival's name. If not set to choose_in_game, must be a name not exceeding 7 characters, and the prompt to + name your rival in-game will be skipped. See the setup guide on archipelago.gg for a list of allowed characters.""" display_name = "Rival's Name" - default = "GARY" + option_choose_in_game = -1 + default = -1 class Goal(Choice): - """If Professor Oak is selected, your victory condition will require challenging and defeating Oak after becoming""" - """Champion and defeating or capturing the Pokemon at the end of Cerulean Cave.""" + """If Professor Oak is selected, your victory condition will require challenging and defeating Oak after becoming + Champion and defeating or capturing the Pokemon at the end of Cerulean Cave.""" display_name = "Goal" option_pokemon_league = 0 option_professor_oak = 1 @@ -59,8 +61,8 @@ class ViridianGymCondition(Range): 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.""" + """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" range_start = 0 range_end = 25 @@ -97,8 +99,8 @@ class BadgesNeededForHMMoves(Choice): class OldMan(Choice): - """With Open Viridian City, the Old Man will let you through without needing to turn in Oak's Parcel.""" - """Early Parcel will ensure Oak's Parcel is available at the beginning of your game.""" + """With Open Viridian City, the Old Man will let you through without needing to turn in Oak's Parcel. + Early Parcel will ensure Oak's Parcel is available at the beginning of your game.""" display_name = "Old Man" option_vanilla = 0 option_early_parcel = 1 @@ -106,6 +108,15 @@ class OldMan(Choice): 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.""" + display_name = "Randomize Pokedex" + option_vanilla = 0 + option_randomize = 1 + option_start_with = 2 + 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.""" @@ -144,6 +155,14 @@ class RandomizeHiddenItems(Choice): default = 0 +class TrainerSanity(Toggle): + """Add a location check to every trainer in the game, which can be obtained by talking to a trainer after defeating + them. Does not affect gym leaders and some scripted event battles (including all Rival, Giovanni, and + Cinnabar Gym battles).""" + display_name = "Trainersanity" + default = 0 + + class FreeFlyLocation(Toggle): """One random fly destination will be unlocked by default.""" display_name = "Free Fly Location" @@ -180,7 +199,7 @@ class OaksAidRt15(Range): 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_start = 1 range_end = 255 default = 16 special_range_names = { @@ -330,6 +349,13 @@ class StartWithFourMoves(Toggle): default = 0 +class SameTypeAttackBonus(Toggle): + """Here you can disable Same Type Attack Bonus, so that a move matching a Pokemon's type has no benefit. + If disabled, all moves will gain 25% extra damage, instead of same type moves gaining 50% extra damage.""" + display_name = "Same Type Attack Bonus" + default = 1 + + class TMCompatibility(Choice): """Randomize which Pokemon can learn each TM. prefer_types: 90% chance if Pokemon's type matches the move, 50% chance if move is Normal type and the Pokemon is not, and 25% chance otherwise. Pokemon will retain the same @@ -379,31 +405,54 @@ class SecondaryTypeChance(SpecialRange): } -class RandomizeTypeChartTypes(Choice): - """The game's type chart consists of 3 columns: attacking type, defending type, and type effectiveness. - Matchups that have regular type effectiveness are not in the chart. Shuffle will shuffle the attacking types - across the attacking type column and the defending types across the defending type column (so for example Normal - type will still have exactly 2 types that it receives non-regular damage from, and 2 types it deals non-regular - damage to). Randomize will randomize each type in both columns to any random type.""" - display_name = "Randomize Type Chart Types" +class RandomizeTypeChart(Choice): + """Randomize the type chart. If 'randomize' is chosen, the matchup weight options will determine the weights. + If the numbers chosen across the 4 settings add up to exactly 225, they will be the exact numbers of those matchups. + Otherwise, the normal super effective, and not very effective matchup settings will be used as weights. + The immunities option will always be the exact amount of immunity matchups. + If 'chaos' is chosen, the matchup settings will be ignored and every type matchup will be given a random damage + modifier anywhere between 0 to 200% damage, in 10% increments.""" + display_name = "Randomize Type Chart" option_vanilla = 0 - option_shuffle = 1 - option_randomize = 2 + option_randomize = 1 + option_chaos = 2 default = 0 -class RandomizeTypeChartTypeEffectiveness(Choice): - """The game's type chart consists of 3 columns: attacking type, defending type, and type effectiveness. - Matchups that have regular type effectiveness are not in the chart. Shuffle will shuffle the type effectiveness - across the type effectiveness column (so for example there will always be 6 type immunities). Randomize will - randomize each entry in the table to no effect, not very effective, or super effective; with no effect occurring - at a low chance. Chaos will randomize the values to anywhere between 0% and 200% damage, in 10% increments.""" - display_name = "Randomize Type Chart Type Effectiveness" - option_vanilla = 0 - option_shuffle = 1 - option_randomize = 2 - option_chaos = 3 - default = 0 +class NormalMatchups(Range): + """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 + range_start = 0 + range_end = 225 + + +class SuperEffectiveMatchups(Range): + """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 + range_start = 0 + range_end = 225 + + +class NotVeryEffectiveMatchups(Range): + """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 + range_start = 0 + range_end = 225 + + +class ImmunityMatchups(Range): + """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 + range_start = 0 + range_end = 100 class SafariZoneNormalBattles(Toggle): @@ -425,6 +474,23 @@ class ReusableTMs(Toggle): default = 0 +class BetterShops(Choice): + """Change every town's Pokemart to contain all normal Pokemart items. Additionally, you can add the Master Ball + to these shops.""" + display_name = "Better Shops" + option_off = 0 + option_on = 1 + option_add_master_ball = 2 + default = 0 + + +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 + sell price regardless. Vanilla is 0""" + range_end = 999999 + default = 5000 + + class StartingMoney(Range): """The amount of money you start with.""" display_name = "Starting Money" @@ -433,6 +499,21 @@ class StartingMoney(Range): range_end = 999999 +class LoseMoneyOnBlackout(Toggle): + """Lose half your money when blacking out, as in vanilla.""" + display_name = "Lose Money on Blackout" + default = 1 + + +class TrapPercentage(Range): + """Chance for each filler item to be replaced with trap items: Poison Trap, Paralyze Trap, Ice Trap, and + Fire Trap. These traps apply the status to your entire party! Keep in mind that trainersanity vastly increases the + number of filler items. Make sure to stock up on Ice Heals!""" + display_name = "Trap Percentage" + range_end = 100 + default = 0 + + pokemon_rb_options = { "game_version": GameVersion, "trainer_name": TrainerName, @@ -445,11 +526,13 @@ pokemon_rb_options = { "second_fossil_check_condition": SecondFossilCheckCondition, "badgesanity": BadgeSanity, "old_man": OldMan, + "randomize_pokedex": RandomizePokedex, "tea": Tea, "extra_key_items": ExtraKeyItems, "extra_strength_boulders": ExtraStrengthBoulders, "require_item_finder": RequireItemFinder, "randomize_hidden_items": RandomizeHiddenItems, + "trainersanity": TrainerSanity, "badges_needed_for_hm_moves": BadgesNeededForHMMoves, "free_fly_location": FreeFlyLocation, "oaks_aide_rt_2": OaksAidRt2, @@ -470,14 +553,23 @@ pokemon_rb_options = { "trainer_legendaries": TrainerLegendaries, "randomize_pokemon_movesets": RandomizePokemonMovesets, "start_with_four_moves": StartWithFourMoves, + "same_type_attack_bonus": SameTypeAttackBonus, "tm_compatibility": TMCompatibility, "hm_compatibility": HMCompatibility, "randomize_pokemon_types": RandomizePokemonTypes, "secondary_type_chance": SecondaryTypeChance, - "randomize_type_matchup_types": RandomizeTypeChartTypes, - "randomize_type_matchup_type_effectiveness": RandomizeTypeChartTypeEffectiveness, + "randomize_type_chart": RandomizeTypeChart, + "normal_matchups": NormalMatchups, + "super_effective_matchups": SuperEffectiveMatchups, + "not_very_effective_matchups": NotVeryEffectiveMatchups, + "immunity_matchups": ImmunityMatchups, "safari_zone_normal_battles": SafariZoneNormalBattles, "normalize_encounter_chances": NormalizeEncounterChances, "reusable_tms": ReusableTMs, + "better_shops": BetterShops, + "master_ball_price": MasterBallPrice, "starting_money": StartingMoney, + "lose_money_on_blackout": LoseMoneyOnBlackout, + "trap_percentage": TrapPercentage, + "death_link": DeathLink } \ No newline at end of file diff --git a/worlds/pokemon_rb/regions.py b/worlds/pokemon_rb/regions.py index 9640e0a8..904dc3a1 100644 --- a/worlds/pokemon_rb/regions.py +++ b/worlds/pokemon_rb/regions.py @@ -1,19 +1,15 @@ from BaseClasses import MultiWorld, Region, Entrance, RegionType, LocationProgressType -from worlds.generic.Rules import add_item_rule from .locations import location_data, PokemonRBLocation def create_region(world: MultiWorld, player: int, name: str, locations_per_region=None, exits=None): ret = Region(name, RegionType.Generic, name, player, world) for location in locations_per_region.get(name, []): - if (world.randomize_hidden_items[player].value or "Hidden" not in location.name) and \ - (world.extra_key_items[player].value or name != "Rock Tunnel B1F" or "Item" not in location.name) and \ - (world.tea[player].value or location.name != "Celadon City - Mansion Lady"): - location.parent_region = ret - ret.locations.append(location) - if world.randomize_hidden_items[player].value == 2 and "Hidden" in location.name: - location.progress_type = LocationProgressType.EXCLUDED + location.parent_region = ret + ret.locations.append(location) + if world.randomize_hidden_items[player] == "exclude" and "Hidden" in location.name: + location.progress_type = LocationProgressType.EXCLUDED if exits: for exit in exits: ret.exits.append(Entrance(player, exit, ret)) @@ -21,265 +17,275 @@ def create_region(world: MultiWorld, player: int, name: str, locations_per_regio return ret -def create_regions(world: MultiWorld, player: int): +def create_regions(multiworld: MultiWorld, player: int): locations_per_region = {} for location in location_data: locations_per_region.setdefault(location.region, []) - locations_per_region[location.region].append(PokemonRBLocation(player, location.name, location.address, + if location.inclusion(multiworld, player): + locations_per_region[location.region].append(PokemonRBLocation(player, location.name, location.address, location.rom_address)) regions = [ - create_region(world, player, "Menu", locations_per_region), - create_region(world, player, "Anywhere", locations_per_region), - create_region(world, player, "Fossil", locations_per_region), - create_region(world, player, "Pallet Town", locations_per_region), - create_region(world, player, "Route 1", locations_per_region), - create_region(world, player, "Viridian City", locations_per_region), - create_region(world, player, "Viridian City North", locations_per_region), - create_region(world, player, "Viridian Gym", locations_per_region), - create_region(world, player, "Route 2", locations_per_region), - create_region(world, player, "Route 2 East", locations_per_region), - create_region(world, player, "Diglett's Cave", locations_per_region), - create_region(world, player, "Route 22", locations_per_region), - create_region(world, player, "Route 23", locations_per_region), - create_region(world, player, "Viridian Forest", locations_per_region), - create_region(world, player, "Pewter City", locations_per_region), - create_region(world, player, "Pewter Gym", locations_per_region), - create_region(world, player, "Route 3", locations_per_region), - create_region(world, player, "Mt Moon 1F", locations_per_region), - create_region(world, player, "Mt Moon B1F", locations_per_region), - create_region(world, player, "Mt Moon B2F", locations_per_region), - create_region(world, player, "Route 4", locations_per_region), - create_region(world, player, "Cerulean City", locations_per_region), - create_region(world, player, "Cerulean Gym", locations_per_region), - create_region(world, player, "Route 24", locations_per_region), - create_region(world, player, "Route 25", locations_per_region), - create_region(world, player, "Route 9", locations_per_region), - create_region(world, player, "Route 10 North", locations_per_region), - create_region(world, player, "Rock Tunnel 1F", locations_per_region), - create_region(world, player, "Rock Tunnel B1F", locations_per_region), - create_region(world, player, "Power Plant", locations_per_region), - create_region(world, player, "Route 10 South", locations_per_region), - create_region(world, player, "Lavender Town", locations_per_region), - create_region(world, player, "Pokemon Tower 1F", locations_per_region), - create_region(world, player, "Pokemon Tower 2F", locations_per_region), - create_region(world, player, "Pokemon Tower 3F", locations_per_region), - create_region(world, player, "Pokemon Tower 4F", locations_per_region), - create_region(world, player, "Pokemon Tower 5F", locations_per_region), - create_region(world, player, "Pokemon Tower 6F", locations_per_region), - create_region(world, player, "Pokemon Tower 7F", locations_per_region), - create_region(world, player, "Route 5", locations_per_region), - create_region(world, player, "Saffron City", locations_per_region), - create_region(world, player, "Saffron Gym", locations_per_region), - create_region(world, player, "Copycat's House", locations_per_region), - create_region(world, player, "Underground Tunnel North-South", locations_per_region), - create_region(world, player, "Route 6", locations_per_region), - create_region(world, player, "Vermilion City", locations_per_region), - create_region(world, player, "Vermilion Gym", locations_per_region), - create_region(world, player, "S.S. Anne 1F", locations_per_region), - create_region(world, player, "S.S. Anne B1F", locations_per_region), - create_region(world, player, "S.S. Anne 2F", locations_per_region), - create_region(world, player, "Route 11", locations_per_region), - create_region(world, player, "Route 11 East", locations_per_region), - create_region(world, player, "Route 12 North", locations_per_region), - create_region(world, player, "Route 12 South", locations_per_region), - create_region(world, player, "Route 12 Grass", locations_per_region), - create_region(world, player, "Route 12 West", locations_per_region), - create_region(world, player, "Route 7", locations_per_region), - create_region(world, player, "Underground Tunnel West-East", locations_per_region), - create_region(world, player, "Route 8", locations_per_region), - create_region(world, player, "Route 8 Grass", locations_per_region), - create_region(world, player, "Celadon City", locations_per_region), - create_region(world, player, "Celadon Prize Corner", locations_per_region), - create_region(world, player, "Celadon Gym", locations_per_region), - create_region(world, player, "Route 16", locations_per_region), - create_region(world, player, "Route 16 North", locations_per_region), - create_region(world, player, "Route 17", locations_per_region), - create_region(world, player, "Route 18", locations_per_region), - create_region(world, player, "Fuchsia City", locations_per_region), - create_region(world, player, "Fuchsia Gym", locations_per_region), - create_region(world, player, "Safari Zone Gate", locations_per_region), - create_region(world, player, "Safari Zone Center", locations_per_region), - create_region(world, player, "Safari Zone East", locations_per_region), - create_region(world, player, "Safari Zone North", locations_per_region), - create_region(world, player, "Safari Zone West", locations_per_region), - create_region(world, player, "Route 15", locations_per_region), - create_region(world, player, "Route 14", locations_per_region), - create_region(world, player, "Route 13", locations_per_region), - create_region(world, player, "Route 19", locations_per_region), - create_region(world, player, "Route 20 East", locations_per_region), - create_region(world, player, "Route 20 West", locations_per_region), - create_region(world, player, "Seafoam Islands 1F", locations_per_region), - create_region(world, player, "Seafoam Islands B1F", locations_per_region), - create_region(world, player, "Seafoam Islands B2F", locations_per_region), - create_region(world, player, "Seafoam Islands B3F", locations_per_region), - create_region(world, player, "Seafoam Islands B4F", locations_per_region), - create_region(world, player, "Cinnabar Island", locations_per_region), - create_region(world, player, "Cinnabar Gym", locations_per_region), - create_region(world, player, "Route 21", locations_per_region), - create_region(world, player, "Silph Co 1F", locations_per_region), - create_region(world, player, "Silph Co 2F", locations_per_region), - create_region(world, player, "Silph Co 3F", locations_per_region), - create_region(world, player, "Silph Co 4F", locations_per_region), - create_region(world, player, "Silph Co 5F", locations_per_region), - create_region(world, player, "Silph Co 6F", locations_per_region), - create_region(world, player, "Silph Co 7F", locations_per_region), - create_region(world, player, "Silph Co 8F", locations_per_region), - create_region(world, player, "Silph Co 9F", locations_per_region), - create_region(world, player, "Silph Co 10F", locations_per_region), - create_region(world, player, "Silph Co 11F", locations_per_region), - create_region(world, player, "Rocket Hideout B1F", locations_per_region), - create_region(world, player, "Rocket Hideout B2F", locations_per_region), - create_region(world, player, "Rocket Hideout B3F", locations_per_region), - create_region(world, player, "Rocket Hideout B4F", locations_per_region), - create_region(world, player, "Pokemon Mansion 1F", locations_per_region), - create_region(world, player, "Pokemon Mansion 2F", locations_per_region), - create_region(world, player, "Pokemon Mansion 3F", locations_per_region), - create_region(world, player, "Pokemon Mansion B1F", locations_per_region), - create_region(world, player, "Victory Road 1F", locations_per_region), - create_region(world, player, "Victory Road 2F", locations_per_region), - create_region(world, player, "Victory Road 3F", locations_per_region), - create_region(world, player, "Indigo Plateau", locations_per_region), - create_region(world, player, "Cerulean Cave 1F", locations_per_region), - create_region(world, player, "Cerulean Cave 2F", locations_per_region), - create_region(world, player, "Cerulean Cave B1F", locations_per_region), - create_region(world, player, "Evolution", locations_per_region), + 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, "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 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), ] - world.regions += regions - connect(world, player, "Menu", "Anywhere", one_way=True) - connect(world, player, "Menu", "Pallet Town", one_way=True) - connect(world, player, "Menu", "Fossil", lambda state: state.pokemon_rb_fossil_checks( + multiworld.regions += regions + connect(multiworld, player, "Menu", "Anywhere", one_way=True) + connect(multiworld, player, "Menu", "Pallet Town", one_way=True) + connect(multiworld, player, "Menu", "Fossil", lambda state: state.pokemon_rb_fossil_checks( state.multiworld.second_fossil_check_condition[player].value, player), one_way=True) - connect(world, player, "Pallet Town", "Route 1") - connect(world, player, "Route 1", "Viridian City") - connect(world, player, "Viridian City", "Route 22") - connect(world, player, "Route 22", "Route 23", + 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(world, player, "Viridian City North", "Viridian Gym", lambda state: + 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(world, player, "Route 2", "Route 2 East", lambda state: state.pokemon_rb_can_cut(player)) - connect(world, player, "Route 2 East", "Diglett's Cave", lambda state: state.pokemon_rb_can_cut(player)) - connect(world, player, "Route 2", "Viridian City North") - connect(world, player, "Route 2", "Viridian Forest") - connect(world, player, "Route 2", "Pewter City") - connect(world, player, "Pewter City", "Pewter Gym", one_way=True) - connect(world, player, "Pewter City", "Route 3") - connect(world, player, "Route 4", "Route 3", one_way=True) - connect(world, player, "Mt Moon 1F", "Mt Moon B1F", one_way=True) - connect(world, player, "Mt Moon B1F", "Mt Moon B2F", one_way=True) - connect(world, player, "Mt Moon B1F", "Route 4", one_way=True) - connect(world, player, "Route 4", "Cerulean City") - connect(world, player, "Cerulean City", "Cerulean Gym", one_way=True) - connect(world, player, "Cerulean City", "Route 24", one_way=True) - connect(world, player, "Route 24", "Route 25", one_way=True) - connect(world, player, "Cerulean City", "Route 9", lambda state: state.pokemon_rb_can_cut(player)) - connect(world, player, "Route 9", "Route 10 North") - connect(world, player, "Route 10 North", "Rock Tunnel 1F", lambda state: state.pokemon_rb_can_flash(player)) - connect(world, 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(world, player, "Rock Tunnel 1F", "Route 10 South", lambda state: state.pokemon_rb_can_flash(player)) - connect(world, player, "Rock Tunnel 1F", "Rock Tunnel B1F") - connect(world, player, "Lavender Town", "Pokemon Tower 1F", one_way=True) - connect(world, player, "Lavender Town", "Pokemon Tower 1F", one_way=True) - connect(world, player, "Pokemon Tower 1F", "Pokemon Tower 2F", one_way=True) - connect(world, player, "Pokemon Tower 2F", "Pokemon Tower 3F", one_way=True) - connect(world, player, "Pokemon Tower 3F", "Pokemon Tower 4F", one_way=True) - connect(world, player, "Pokemon Tower 4F", "Pokemon Tower 5F", one_way=True) - connect(world, player, "Pokemon Tower 5F", "Pokemon Tower 6F", one_way=True) - connect(world, player, "Pokemon Tower 6F", "Pokemon Tower 7F", lambda state: state.has("Silph Scope", player)) - connect(world, player, "Cerulean City", "Route 5") - connect(world, player, "Route 5", "Saffron City", lambda state: state.pokemon_rb_can_pass_guards(player)) - connect(world, player, "Route 5", "Underground Tunnel North-South") - connect(world, player, "Route 6", "Underground Tunnel North-South") - connect(world, player, "Route 6", "Saffron City", lambda state: state.pokemon_rb_can_pass_guards(player)) - connect(world, player, "Route 7", "Saffron City", lambda state: state.pokemon_rb_can_pass_guards(player)) - connect(world, player, "Route 8", "Saffron City", lambda state: state.pokemon_rb_can_pass_guards(player)) - connect(world, player, "Saffron City", "Copycat's House", lambda state: state.has("Silph Co Liberated", player), one_way=True) - connect(world, player, "Saffron City", "Saffron Gym", lambda state: state.has("Silph Co Liberated", player), one_way=True) - connect(world, player, "Route 6", "Vermilion City") - connect(world, player, "Vermilion City", "Vermilion Gym", lambda state: state.pokemon_rb_can_surf(player) or state.pokemon_rb_can_cut(player), one_way=True) - connect(world, player, "Vermilion City", "S.S. Anne 1F", lambda state: state.has("S.S. Ticket", player), one_way=True) - connect(world, player, "S.S. Anne 1F", "S.S. Anne 2F", one_way=True) - connect(world, player, "S.S. Anne 1F", "S.S. Anne B1F", one_way=True) - connect(world, player, "Vermilion City", "Route 11") - connect(world, player, "Vermilion City", "Diglett's Cave") - connect(world, 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(world, player, "Route 12 North", "Route 12 South", lambda state: state.has("Poke Flute", player) or state.pokemon_rb_can_surf( player)) - connect(world, player, "Route 12 West", "Route 12 North", lambda state: state.has("Poke Flute", player)) - connect(world, player, "Route 12 West", "Route 12 South", lambda state: state.has("Poke Flute", player)) - connect(world, player, "Route 12 South", "Route 12 Grass", lambda state: state.pokemon_rb_can_cut(player)) - connect(world, player, "Route 12 North", "Lavender Town") - connect(world, player, "Route 7", "Lavender Town") - connect(world, player, "Route 10 South", "Lavender Town") - connect(world, player, "Route 7", "Underground Tunnel West-East") - connect(world, player, "Route 8", "Underground Tunnel West-East") - connect(world, player, "Route 8", "Celadon City") - connect(world, player, "Route 8", "Route 8 Grass", lambda state: state.pokemon_rb_can_cut(player), one_way=True) - connect(world, player, "Route 7", "Celadon City") - connect(world, player, "Celadon City", "Celadon Gym", lambda state: state.pokemon_rb_can_cut(player), one_way=True) - connect(world, player, "Celadon City", "Celadon Prize Corner") - connect(world, player, "Celadon City", "Route 16") - connect(world, player, "Route 16", "Route 16 North", lambda state: state.pokemon_rb_can_cut(player), one_way=True) - connect(world, player, "Route 16", "Route 17", lambda state: state.has("Poke Flute", player) and state.has("Bicycle", player)) - connect(world, player, "Route 17", "Route 18", lambda state: state.has("Bicycle", player)) - connect(world, player, "Fuchsia City", "Fuchsia Gym", one_way=True) - connect(world, player, "Fuchsia City", "Route 18") - connect(world, player, "Fuchsia City", "Safari Zone Gate", one_way=True) - connect(world, 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(world, player, "Safari Zone Center", "Safari Zone East", one_way=True) - connect(world, player, "Safari Zone Center", "Safari Zone West", one_way=True) - connect(world, player, "Safari Zone Center", "Safari Zone North", one_way=True) - connect(world, player, "Fuchsia City", "Route 15") - connect(world, player, "Route 15", "Route 14") - connect(world, player, "Route 14", "Route 13") - connect(world, player, "Route 13", "Route 12 South", 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(world, player, "Fuchsia City", "Route 19", lambda state: state.pokemon_rb_can_surf(player)) - connect(world, player, "Route 20 East", "Route 19") - connect(world, player, "Route 20 West", "Cinnabar Island", lambda state: state.pokemon_rb_can_surf(player)) - connect(world, player, "Route 20 West", "Seafoam Islands 1F") - connect(world, player, "Route 20 East", "Seafoam Islands 1F", one_way=True) - connect(world, player, "Seafoam Islands 1F", "Route 20 East", lambda state: state.pokemon_rb_can_strength(player), one_way=True) - connect(world, 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(world, player, "Route 3", "Mt Moon 1F", one_way=True) - connect(world, player, "Route 11", "Route 11 East", lambda state: state.pokemon_rb_can_strength(player)) - connect(world, player, "Cinnabar Island", "Cinnabar Gym", lambda state: state.has("Secret Key", player), one_way=True) - connect(world, 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(world, player, "Seafoam Islands 1F", "Seafoam Islands B1F", one_way=True) - connect(world, player, "Seafoam Islands B1F", "Seafoam Islands B2F", one_way=True) - connect(world, player, "Seafoam Islands B2F", "Seafoam Islands B3F", one_way=True) - connect(world, player, "Seafoam Islands B3F", "Seafoam Islands B4F", one_way=True) - connect(world, player, "Route 21", "Cinnabar Island", lambda state: state.pokemon_rb_can_surf(player)) - connect(world, player, "Pallet Town", "Route 21", lambda state: state.pokemon_rb_can_surf(player)) - connect(world, player, "Saffron City", "Silph Co 1F", lambda state: state.has("Fuji Saved", player), one_way=True) - connect(world, player, "Silph Co 1F", "Silph Co 2F", one_way=True) - connect(world, player, "Silph Co 2F", "Silph Co 3F", one_way=True) - connect(world, player, "Silph Co 3F", "Silph Co 4F", one_way=True) - connect(world, player, "Silph Co 4F", "Silph Co 5F", one_way=True) - connect(world, player, "Silph Co 5F", "Silph Co 6F", one_way=True) - connect(world, player, "Silph Co 6F", "Silph Co 7F", one_way=True) - connect(world, player, "Silph Co 7F", "Silph Co 8F", one_way=True) - connect(world, player, "Silph Co 8F", "Silph Co 9F", one_way=True) - connect(world, player, "Silph Co 9F", "Silph Co 10F", one_way=True) - connect(world, player, "Silph Co 10F", "Silph Co 11F", one_way=True) - connect(world, 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(world, player, "Rocket Hideout B1F", "Rocket Hideout B2F", one_way=True) - connect(world, player, "Rocket Hideout B2F", "Rocket Hideout B3F", one_way=True) - connect(world, player, "Rocket Hideout B3F", "Rocket Hideout B4F", one_way=True) - connect(world, player, "Pokemon Mansion 1F", "Pokemon Mansion 2F", one_way=True) - connect(world, player, "Pokemon Mansion 2F", "Pokemon Mansion 3F", one_way=True) - connect(world, player, "Pokemon Mansion 1F", "Pokemon Mansion B1F", one_way=True) - connect(world, player, "Route 23", "Victory Road 1F", lambda state: state.pokemon_rb_can_strength(player), one_way=True) - connect(world, player, "Victory Road 1F", "Victory Road 2F", one_way=True) - connect(world, player, "Victory Road 2F", "Victory Road 3F", one_way=True) - connect(world, player, "Victory Road 2F", "Indigo Plateau", lambda state: state.pokemon_rb_has_badges(state.multiworld.elite_four_condition[player], player), one_way=True) - connect(world, player, "Cerulean City", "Cerulean Cave 1F", lambda state: + 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, "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", 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, "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", "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 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 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, "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 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), 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, "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 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(world, player, "Cerulean Cave 1F", "Cerulean Cave 2F", one_way=True) - connect(world, player, "Cerulean Cave 1F", "Cerulean Cave B1F", lambda state: state.pokemon_rb_can_surf(player), one_way=True) - if world.worlds[player].fly_map != "Pallet Town": - connect(world, player, "Menu", world.worlds[player].fly_map, lambda state: state.pokemon_rb_can_fly(player), one_way=True, - name="Fly to " + world.worlds[player].fly_map) + 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) + 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) def connect(world: MultiWorld, player: int, source: str, target: str, rule: callable = lambda state: True, one_way=False, name=None): diff --git a/worlds/pokemon_rb/rom.py b/worlds/pokemon_rb/rom.py index f91c91e9..d209f0b2 100644 --- a/worlds/pokemon_rb/rom.py +++ b/worlds/pokemon_rb/rom.py @@ -7,6 +7,7 @@ from Patch import APDeltaPatch from .text import encode_text from .rom_addresses import rom_addresses from .locations import location_data +from .items import item_table import worlds.pokemon_rb.poke_data as poke_data @@ -386,6 +387,9 @@ def generate_output(self, output_directory: str): data[rom_addresses["Guard_Drink_List"] + 1] = 0 data[rom_addresses["Guard_Drink_List"] + 2] = 0 + data[rom_addresses["Fossils_Needed_For_Second_Item"]] = ( + self.multiworld.second_fossil_check_condition[self.player].value) + if self.multiworld.extra_key_items[self.player].value: data[rom_addresses['Options']] |= 4 data[rom_addresses["Option_Blind_Trainers"]] = round(self.multiworld.blind_trainers[self.player].value * 2.55) @@ -406,9 +410,7 @@ def generate_output(self, output_directory: str): if self.multiworld.old_man[self.player].value == 2: data[rom_addresses['Option_Old_Man']] = 0x11 data[rom_addresses['Option_Old_Man_Lying']] = 0x15 - money = str(self.multiworld.starting_money[self.player].value) - while len(money) < 6: - money = "0" + money + money = str(self.multiworld.starting_money[self.player].value).zfill(6) data[rom_addresses["Starting_Money_High"]] = int(money[:2], 16) data[rom_addresses["Starting_Money_Middle"]] = int(money[2:4], 16) data[rom_addresses["Starting_Money_Low"]] = int(money[4:], 16) @@ -417,6 +419,10 @@ def generate_output(self, output_directory: str): 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] + write_bytes(data, encode_text( + " ".join(self.multiworld.get_location("Route 3 - Pokemon For Sale", self.player).item.name.upper().split()[1:])), + rom_addresses["Text_Magikarp_Salesman"]) + if self.multiworld.badges_needed_for_hm_moves[self.player].value == 0: for hm_move in poke_data.hm_moves: write_bytes(data, bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), @@ -441,61 +447,80 @@ def generate_output(self, output_directory: str): if badge not in written_badges: write_bytes(data, encode_text("Nothing"), rom_addresses["Badge_Text_" + badge.replace(" ", "_")]) - chart = deepcopy(poke_data.type_chart) - if self.multiworld.randomize_type_matchup_types[self.player].value == 1: - attacking_types = [] - defending_types = [] - for matchup in chart: - attacking_types.append(matchup[0]) - defending_types.append(matchup[1]) - random.shuffle(attacking_types) - random.shuffle(defending_types) + if self.multiworld.randomize_type_chart[self.player] == "vanilla": + chart = deepcopy(poke_data.type_chart) + elif self.multiworld.randomize_type_chart[self.player] == "randomize": + types = poke_data.type_names.values() matchups = [] - while len(attacking_types) > 0: - if [attacking_types[0], defending_types[0]] not in matchups: - matchups.append([attacking_types.pop(0), defending_types.pop(0)]) - else: - matchup = matchups.pop(0) - attacking_types.append(matchup[0]) - defending_types.append(matchup[1]) - random.shuffle(attacking_types) - random.shuffle(defending_types) - for matchup, chart_row in zip(matchups, chart): - chart_row[0] = matchup[0] - chart_row[1] = matchup[1] - elif self.multiworld.randomize_type_matchup_types[self.player].value == 2: - used_matchups = [] - for matchup in chart: - matchup[0] = random.choice(list(poke_data.type_names.values())) - matchup[1] = random.choice(list(poke_data.type_names.values())) - while [matchup[0], matchup[1]] in used_matchups: - matchup[0] = random.choice(list(poke_data.type_names.values())) - matchup[1] = random.choice(list(poke_data.type_names.values())) - used_matchups.append([matchup[0], matchup[1]]) - if self.multiworld.randomize_type_matchup_type_effectiveness[self.player].value == 1: - effectiveness_list = [] - for matchup in chart: - effectiveness_list.append(matchup[2]) - random.shuffle(effectiveness_list) - for (matchup, effectiveness) in zip(chart, effectiveness_list): - matchup[2] = effectiveness - elif self.multiworld.randomize_type_matchup_type_effectiveness[self.player].value == 2: - for matchup in chart: - matchup[2] = random.choice([0] + ([5, 20] * 5)) - elif self.multiworld.randomize_type_matchup_type_effectiveness[self.player].value == 3: - for matchup in chart: - matchup[2] = random.choice([i for i in range(0, 21) if i != 10]) - type_loc = rom_addresses["Type_Chart"] - for matchup in chart: - data[type_loc] = poke_data.type_ids[matchup[0]] - data[type_loc + 1] = poke_data.type_ids[matchup[1]] - data[type_loc + 2] = matchup[2] - type_loc += 3 + for type1 in types: + for type2 in types: + matchups.append([type1, type2]) + self.multiworld.random.shuffle(matchups) + immunities = self.multiworld.immunity_matchups[self.player].value + 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 + 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 > 225 - immunities: + total = super_effectives + not_very_effectives + normals + excess = total - (225 - immunities) + subtract_amounts = (int((excess / (super_effectives + not_very_effectives + normals)) * super_effectives), + int((excess / (super_effectives + not_very_effectives + normals)) * not_very_effectives), + int((excess / (super_effectives + not_very_effectives + normals)) * normals)) + super_effectives -= subtract_amounts[0] + not_very_effectives -= subtract_amounts[1] + normals -= subtract_amounts[2] + while super_effectives + not_very_effectives + normals > 225 - immunities: + r = self.multiworld.random.randint(0, 2) + if r == 0: + super_effectives -= 1 + elif r == 1: + not_very_effectives -= 1 + else: + normals -= 1 + chart = [] + for matchup_list, matchup_value in zip([immunities, normals, super_effectives, not_very_effectives], + [0, 10, 20, 5]): + for _ in range(matchup_list): + matchup = matchups.pop() + matchup.append(matchup_value) + chart.append(matchup) + elif self.multiworld.randomize_type_chart[self.player] == "chaos": + types = poke_data.type_names.values() + matchups = [] + for type1 in types: + for type2 in types: + matchups.append([type1, type2]) + chart = [] + values = list(range(21)) + self.multiworld.random.shuffle(matchups) + self.multiworld.random.shuffle(values) + for matchup in matchups: + value = values.pop(0) + values.append(value) + matchup.append(value) + chart.append(matchup) # sort so that super-effective matchups occur first, to prevent dual "not very effective" / "super effective" # matchups from leading to damage being ultimately divided by 2 and then multiplied by 2, which can lead to # 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: 0 - matchup[2]) + chart = sorted(chart, key=lambda matchup: -matchup[2]) + + type_loc = rom_addresses["Type_Chart"] + for matchup in chart: + if matchup[2] != 10: # don't needlessly divide damage by 10 and multiply by 10 + data[type_loc] = poke_data.type_ids[matchup[0]] + data[type_loc + 1] = poke_data.type_ids[matchup[1]] + data[type_loc + 2] = matchup[2] + type_loc += 3 + data[type_loc] = 0xFF + data[type_loc + 1] = 0xFF + data[type_loc + 2] = 0xFF + + self.type_chart = chart if self.multiworld.normalize_encounter_chances[self.player].value: chances = [25, 51, 77, 103, 129, 155, 180, 205, 230, 255] @@ -525,9 +550,9 @@ def generate_output(self, output_directory: str): for i, move in enumerate(self.learnsets[mon]): data[(address + 1) + i * 2] = poke_data.moves[move]["id"] - data[rom_addresses["Option_Aide_Rt2"]] = self.multiworld.oaks_aide_rt_2[self.player] - data[rom_addresses["Option_Aide_Rt11"]] = self.multiworld.oaks_aide_rt_11[self.player] - data[rom_addresses["Option_Aide_Rt15"]] = self.multiworld.oaks_aide_rt_15[self.player] + data[rom_addresses["Option_Aide_Rt2"]] = self.multiworld.oaks_aide_rt_2[self.player].value + data[rom_addresses["Option_Aide_Rt11"]] = self.multiworld.oaks_aide_rt_11[self.player].value + data[rom_addresses["Option_Aide_Rt15"]] = self.multiworld.oaks_aide_rt_15[self.player].value if self.multiworld.safari_zone_normal_battles[self.player].value == 1: data[rom_addresses["Option_Safari_Zone_Battle_Type"]] = 255 @@ -535,6 +560,31 @@ def generate_output(self, output_directory: str): if self.multiworld.reusable_tms[self.player].value: data[rom_addresses["Option_Reusable_TMs"]] = 0xC9 + data[rom_addresses["Option_Trainersanity"]] = self.multiworld.trainersanity[self.player].value + data[rom_addresses["Option_Trainersanity2"]] = self.multiworld.trainersanity[self.player].value + + 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: + inventory = ["Poke Ball", "Great Ball", "Ultra Ball"] + if self.multiworld.better_shops[self.player].value == 2: + inventory.append("Master Ball") + inventory += ["Potion", "Super Potion", "Hyper Potion", "Max Potion", "Full Restore", "Antidote", "Awakening", + "Burn Heal", "Ice Heal", "Paralyze Heal", "Full Heal", "Repel", "Super Repel", "Max Repel", + "Escape Rope"] + 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): + write_bytes(data, shop_data, rom_addresses[f"Shop{shop}"]) + 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 + + for item in reversed(self.multiworld.precollected_items[self.player]): + if data[rom_addresses["Start_Inventory"] + item.code - 172000000] < 255: + data[rom_addresses["Start_Inventory"] + item.code - 172000000] += 1 + process_trainer_data(self, data) mons = [mon["id"] for mon in poke_data.pokemon_data.values()] @@ -558,9 +608,16 @@ def generate_output(self, output_directory: str): slot_name.replace(">", " ") write_bytes(data, encode_text(slot_name, 16, True, True), rom_addresses['Title_Slot_Name']) - write_bytes(data, self.trainer_name, rom_addresses['Player_Name']) - write_bytes(data, self.rival_name, rom_addresses['Rival_Name']) + if self.trainer_name == "choose_in_game": + data[rom_addresses["Skip_Player_Name"]] = 0 + else: + write_bytes(data, self.trainer_name, rom_addresses['Player_Name']) + if self.rival_name == "choose_in_game": + data[rom_addresses["Skip_Rival_Name"]] = 0 + else: + write_bytes(data, self.rival_name, rom_addresses['Rival_Name']) + data[0xFF00] = 1 # client compatibility version write_bytes(data, self.multiworld.seed_name.encode(), 0xFFDB) write_bytes(data, self.multiworld.player_name[self.player].encode(), 0xFFF0) diff --git a/worlds/pokemon_rb/rom_addresses.py b/worlds/pokemon_rb/rom_addresses.py index 206365a2..b475b58c 100644 --- a/worlds/pokemon_rb/rom_addresses.py +++ b/worlds/pokemon_rb/rom_addresses.py @@ -1,97 +1,102 @@ rom_addresses = { "Option_Encounter_Minimum_Steps": 0x3c3, - "Option_Blind_Trainers": 0x317e, - "Base_Stats_Mew": 0x425b, - "Title_Mon_First": 0x436e, - "Title_Mons": 0x4547, - "Player_Name": 0x4569, - "Rival_Name": 0x4571, - "Title_Seed": 0x5dfe, - "Title_Slot_Name": 0x5e1e, - "PC_Item": 0x61ec, - "PC_Item_Quantity": 0x61f1, - "Options": 0x61f9, - "Fly_Location": 0x61fe, - "Option_Old_Man": 0xcaef, - "Option_Old_Man_Lying": 0xcaf2, - "Option_Boulders": 0xcd98, - "Option_Rock_Tunnel_Extra_Items": 0xcda1, - "Wild_Route1": 0xd0fb, - "Wild_Route2": 0xd111, - "Wild_Route22": 0xd127, - "Wild_ViridianForest": 0xd13d, - "Wild_Route3": 0xd153, - "Wild_MtMoon1F": 0xd169, - "Wild_MtMoonB1F": 0xd17f, - "Wild_MtMoonB2F": 0xd195, - "Wild_Route4": 0xd1ab, - "Wild_Route24": 0xd1c1, - "Wild_Route25": 0xd1d7, - "Wild_Route9": 0xd1ed, - "Wild_Route5": 0xd203, - "Wild_Route6": 0xd219, - "Wild_Route11": 0xd22f, - "Wild_RockTunnel1F": 0xd245, - "Wild_RockTunnelB1F": 0xd25b, - "Wild_Route10": 0xd271, - "Wild_Route12": 0xd287, - "Wild_Route8": 0xd29d, - "Wild_Route7": 0xd2b3, - "Wild_PokemonTower3F": 0xd2cd, - "Wild_PokemonTower4F": 0xd2e3, - "Wild_PokemonTower5F": 0xd2f9, - "Wild_PokemonTower6F": 0xd30f, - "Wild_PokemonTower7F": 0xd325, - "Wild_Route13": 0xd33b, - "Wild_Route14": 0xd351, - "Wild_Route15": 0xd367, - "Wild_Route16": 0xd37d, - "Wild_Route17": 0xd393, - "Wild_Route18": 0xd3a9, - "Wild_SafariZoneCenter": 0xd3bf, - "Wild_SafariZoneEast": 0xd3d5, - "Wild_SafariZoneNorth": 0xd3eb, - "Wild_SafariZoneWest": 0xd401, - "Wild_SeaRoutes": 0xd418, - "Wild_SeafoamIslands1F": 0xd42d, - "Wild_SeafoamIslandsB1F": 0xd443, - "Wild_SeafoamIslandsB2F": 0xd459, - "Wild_SeafoamIslandsB3F": 0xd46f, - "Wild_SeafoamIslandsB4F": 0xd485, - "Wild_PokemonMansion1F": 0xd49b, - "Wild_PokemonMansion2F": 0xd4b1, - "Wild_PokemonMansion3F": 0xd4c7, - "Wild_PokemonMansionB1F": 0xd4dd, - "Wild_Route21": 0xd4f3, - "Wild_Surf_Route21": 0xd508, - "Wild_CeruleanCave1F": 0xd51d, - "Wild_CeruleanCave2F": 0xd533, - "Wild_CeruleanCaveB1F": 0xd549, - "Wild_PowerPlant": 0xd55f, - "Wild_Route23": 0xd575, - "Wild_VictoryRoad2F": 0xd58b, - "Wild_VictoryRoad3F": 0xd5a1, - "Wild_VictoryRoad1F": 0xd5b7, - "Wild_DiglettsCave": 0xd5cd, - "Ghost_Battle5": 0xd723, - "HM_Surf_Badge_a": 0xda11, - "HM_Surf_Badge_b": 0xda16, - "Wild_Old_Rod": 0xe313, - "Wild_Good_Rod": 0xe340, - "Option_Reusable_TMs": 0xe60c, - "Wild_Super_Rod_A": 0xea40, - "Wild_Super_Rod_B": 0xea45, - "Wild_Super_Rod_C": 0xea4a, - "Wild_Super_Rod_D": 0xea51, - "Wild_Super_Rod_E": 0xea56, - "Wild_Super_Rod_F": 0xea5b, - "Wild_Super_Rod_G": 0xea64, - "Wild_Super_Rod_H": 0xea6d, - "Wild_Super_Rod_I": 0xea76, - "Wild_Super_Rod_J": 0xea7f, - "Starting_Money_High": 0xf949, - "Starting_Money_Middle": 0xf94c, - "Starting_Money_Low": 0xf94f, + "Option_Blind_Trainers": 0x30fc, + "Option_Trainersanity": 0x318c, + "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": 0x5e3a, + "Title_Slot_Name": 0x5e5a, + "PC_Item": 0x6228, + "PC_Item_Quantity": 0x622d, + "Options": 0x623d, + "Fly_Location": 0x6242, + "Skip_Player_Name": 0x625b, + "Skip_Rival_Name": 0x6269, + "Option_Old_Man": 0xcafc, + "Option_Old_Man_Lying": 0xcaff, + "Option_Boulders": 0xcda5, + "Option_Rock_Tunnel_Extra_Items": 0xcdae, + "Wild_Route1": 0xd108, + "Wild_Route2": 0xd11e, + "Wild_Route22": 0xd134, + "Wild_ViridianForest": 0xd14a, + "Wild_Route3": 0xd160, + "Wild_MtMoon1F": 0xd176, + "Wild_MtMoonB1F": 0xd18c, + "Wild_MtMoonB2F": 0xd1a2, + "Wild_Route4": 0xd1b8, + "Wild_Route24": 0xd1ce, + "Wild_Route25": 0xd1e4, + "Wild_Route9": 0xd1fa, + "Wild_Route5": 0xd210, + "Wild_Route6": 0xd226, + "Wild_Route11": 0xd23c, + "Wild_RockTunnel1F": 0xd252, + "Wild_RockTunnelB1F": 0xd268, + "Wild_Route10": 0xd27e, + "Wild_Route12": 0xd294, + "Wild_Route8": 0xd2aa, + "Wild_Route7": 0xd2c0, + "Wild_PokemonTower3F": 0xd2da, + "Wild_PokemonTower4F": 0xd2f0, + "Wild_PokemonTower5F": 0xd306, + "Wild_PokemonTower6F": 0xd31c, + "Wild_PokemonTower7F": 0xd332, + "Wild_Route13": 0xd348, + "Wild_Route14": 0xd35e, + "Wild_Route15": 0xd374, + "Wild_Route16": 0xd38a, + "Wild_Route17": 0xd3a0, + "Wild_Route18": 0xd3b6, + "Wild_SafariZoneCenter": 0xd3cc, + "Wild_SafariZoneEast": 0xd3e2, + "Wild_SafariZoneNorth": 0xd3f8, + "Wild_SafariZoneWest": 0xd40e, + "Wild_SeaRoutes": 0xd425, + "Wild_SeafoamIslands1F": 0xd43a, + "Wild_SeafoamIslandsB1F": 0xd450, + "Wild_SeafoamIslandsB2F": 0xd466, + "Wild_SeafoamIslandsB3F": 0xd47c, + "Wild_SeafoamIslandsB4F": 0xd492, + "Wild_PokemonMansion1F": 0xd4a8, + "Wild_PokemonMansion2F": 0xd4be, + "Wild_PokemonMansion3F": 0xd4d4, + "Wild_PokemonMansionB1F": 0xd4ea, + "Wild_Route21": 0xd500, + "Wild_Surf_Route21": 0xd515, + "Wild_CeruleanCave1F": 0xd52a, + "Wild_CeruleanCave2F": 0xd540, + "Wild_CeruleanCaveB1F": 0xd556, + "Wild_PowerPlant": 0xd56c, + "Wild_Route23": 0xd582, + "Wild_VictoryRoad2F": 0xd598, + "Wild_VictoryRoad3F": 0xd5ae, + "Wild_VictoryRoad1F": 0xd5c4, + "Wild_DiglettsCave": 0xd5da, + "Ghost_Battle5": 0xd730, + "HM_Surf_Badge_a": 0xda1e, + "HM_Surf_Badge_b": 0xda23, + "Wild_Old_Rod": 0xe320, + "Wild_Good_Rod": 0xe34d, + "Option_Reusable_TMs": 0xe619, + "Wild_Super_Rod_A": 0xea4e, + "Wild_Super_Rod_B": 0xea53, + "Wild_Super_Rod_C": 0xea58, + "Wild_Super_Rod_D": 0xea5f, + "Wild_Super_Rod_E": 0xea64, + "Wild_Super_Rod_F": 0xea69, + "Wild_Super_Rod_G": 0xea72, + "Wild_Super_Rod_H": 0xea7b, + "Wild_Super_Rod_I": 0xea84, + "Wild_Super_Rod_J": 0xea8d, + "Starting_Money_High": 0xf957, + "Starting_Money_Middle": 0xf95a, + "Starting_Money_Low": 0xf95d, "HM_Fly_Badge_a": 0x1318e, "HM_Fly_Badge_b": 0x13193, "HM_Cut_Badge_a": 0x131c4, @@ -107,55 +112,79 @@ rom_addresses = { "Starter3_K": 0x195b0, "Event_Rocket_Thief": 0x196cc, "Option_Cerulean_Cave_Condition": 0x1986c, - "Event_Stranded_Man": 0x19b2b, - "Event_Rivals_Sister": 0x19cf9, - "Option_Pokemon_League_Badges": 0x19e16, - "Missable_Silph_Co_4F_Item_1": 0x1a0d7, - "Missable_Silph_Co_4F_Item_2": 0x1a0de, - "Missable_Silph_Co_4F_Item_3": 0x1a0e5, - "Missable_Silph_Co_5F_Item_1": 0x1a337, - "Missable_Silph_Co_5F_Item_2": 0x1a33e, - "Missable_Silph_Co_5F_Item_3": 0x1a345, - "Missable_Silph_Co_6F_Item_1": 0x1a5ad, - "Missable_Silph_Co_6F_Item_2": 0x1a5b4, - "Event_Free_Sample": 0x1cade, - "Starter1_F": 0x1cca5, - "Starter2_F": 0x1cca9, - "Starter2_G": 0x1cde2, - "Starter3_G": 0x1cdea, - "Starter2_H": 0x1d0e5, - "Starter1_H": 0x1d0ef, - "Starter3_I": 0x1d0f6, - "Starter2_I": 0x1d100, - "Starter1_D": 0x1d107, - "Starter3_D": 0x1d111, - "Starter2_E": 0x1d2eb, - "Starter3_E": 0x1d2f3, - "Event_Oaks_Gift": 0x1d373, - "Event_Pokemart_Quest": 0x1d566, - "Event_Bicycle_Shop": 0x1d805, - "Text_Bicycle": 0x1d898, - "Event_Fuji": 0x1d9cd, - "Static_Encounter_Mew": 0x1dc4e, - "Gift_Eevee": 0x1dcc7, - "Event_Mr_Psychic": 0x1ddcf, - "Static_Encounter_Voltorb_A": 0x1e397, - "Static_Encounter_Voltorb_B": 0x1e39f, - "Static_Encounter_Voltorb_C": 0x1e3a7, - "Static_Encounter_Electrode_A": 0x1e3af, - "Static_Encounter_Voltorb_D": 0x1e3b7, - "Static_Encounter_Voltorb_E": 0x1e3bf, - "Static_Encounter_Electrode_B": 0x1e3c7, - "Static_Encounter_Voltorb_F": 0x1e3cf, - "Static_Encounter_Zapdos": 0x1e3d7, - "Missable_Power_Plant_Item_1": 0x1e3df, - "Missable_Power_Plant_Item_2": 0x1e3e6, - "Missable_Power_Plant_Item_3": 0x1e3ed, - "Missable_Power_Plant_Item_4": 0x1e3f4, - "Missable_Power_Plant_Item_5": 0x1e3fb, - "Event_Rt16_House_Woman": 0x1e5d4, - "Option_Victory_Road_Badges": 0x1e6a5, - "Event_Bill": 0x1e8d6, + "Event_Stranded_Man": 0x19b1f, + "Event_Rivals_Sister": 0x19ced, + "Option_Pokemon_League_Badges": 0x19e0a, + "Shop10": 0x19ee1, + "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_0_ITEM": 0x1a035, + "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_1_ITEM": 0x1a043, + "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_2_ITEM": 0x1a051, + "Missable_Silph_Co_4F_Item_1": 0x1a0f9, + "Missable_Silph_Co_4F_Item_2": 0x1a100, + "Missable_Silph_Co_4F_Item_3": 0x1a107, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_0_ITEM": 0x1a25f, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_1_ITEM": 0x1a26d, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_2_ITEM": 0x1a27b, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_3_ITEM": 0x1a289, + "Missable_Silph_Co_5F_Item_1": 0x1a361, + "Missable_Silph_Co_5F_Item_2": 0x1a368, + "Missable_Silph_Co_5F_Item_3": 0x1a36f, + "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_0_ITEM": 0x1a49f, + "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_1_ITEM": 0x1a4ad, + "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_2_ITEM": 0x1a4bb, + "Missable_Silph_Co_6F_Item_1": 0x1a5dd, + "Missable_Silph_Co_6F_Item_2": 0x1a5e4, + "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": 0x1d2e5, + "Starter3_E": 0x1d2ed, + "Event_Pokedex": 0x1d351, + "Event_Oaks_Gift": 0x1d381, + "Event_Pokemart_Quest": 0x1d579, + "Shop1": 0x1d5a3, + "Event_Bicycle_Shop": 0x1d83d, + "Text_Bicycle": 0x1d8d0, + "Event_Fuji": 0x1da05, + "Trainersanity_EVENT_BEAT_MEW_ITEM": 0x1dc58, + "Static_Encounter_Mew": 0x1dc88, + "Gift_Eevee": 0x1dd01, + "Shop7": 0x1dd53, + "Event_Mr_Psychic": 0x1de30, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_0_ITEM": 0x1e32b, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_1_ITEM": 0x1e339, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_2_ITEM": 0x1e347, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_3_ITEM": 0x1e355, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_4_ITEM": 0x1e363, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_5_ITEM": 0x1e371, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_6_ITEM": 0x1e37f, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_7_ITEM": 0x1e38d, + "Trainersanity_EVENT_BEAT_ZAPDOS_ITEM": 0x1e39b, + "Static_Encounter_Voltorb_A": 0x1e40a, + "Static_Encounter_Voltorb_B": 0x1e412, + "Static_Encounter_Voltorb_C": 0x1e41a, + "Static_Encounter_Electrode_A": 0x1e422, + "Static_Encounter_Voltorb_D": 0x1e42a, + "Static_Encounter_Voltorb_E": 0x1e432, + "Static_Encounter_Electrode_B": 0x1e43a, + "Static_Encounter_Voltorb_F": 0x1e442, + "Static_Encounter_Zapdos": 0x1e44a, + "Missable_Power_Plant_Item_1": 0x1e452, + "Missable_Power_Plant_Item_2": 0x1e459, + "Missable_Power_Plant_Item_3": 0x1e460, + "Missable_Power_Plant_Item_4": 0x1e467, + "Missable_Power_Plant_Item_5": 0x1e46e, + "Event_Rt16_House_Woman": 0x1e647, + "Option_Victory_Road_Badges": 0x1e718, + "Event_Bill": 0x1e949, "Starter1_O": 0x372b0, "Starter2_O": 0x372b4, "Starter3_O": 0x372b8, @@ -327,98 +356,131 @@ rom_addresses = { "Learnset_Bellsprout": 0x3b9dc, "Learnset_Weepinbell": 0x3b9f0, "Learnset_Victreebel": 0x3ba00, - "Type_Chart": 0x3e4b0, - "Type_Chart_Divider": 0x3e5a6, - "Ghost_Battle3": 0x3efd3, - "Missable_Pokemon_Mansion_1F_Item_1": 0x443d6, - "Missable_Pokemon_Mansion_1F_Item_2": 0x443dd, - "Map_Rock_TunnelF": 0x44676, - "Missable_Victory_Road_3F_Item_1": 0x44b07, - "Missable_Victory_Road_3F_Item_2": 0x44b0e, - "Missable_Rocket_Hideout_B1F_Item_1": 0x44d2d, - "Missable_Rocket_Hideout_B1F_Item_2": 0x44d34, - "Missable_Rocket_Hideout_B2F_Item_1": 0x4511d, - "Missable_Rocket_Hideout_B2F_Item_2": 0x45124, - "Missable_Rocket_Hideout_B2F_Item_3": 0x4512b, - "Missable_Rocket_Hideout_B2F_Item_4": 0x45132, - "Missable_Rocket_Hideout_B3F_Item_1": 0x4536f, - "Missable_Rocket_Hideout_B3F_Item_2": 0x45376, - "Missable_Rocket_Hideout_B4F_Item_1": 0x45627, - "Missable_Rocket_Hideout_B4F_Item_2": 0x4562e, - "Missable_Rocket_Hideout_B4F_Item_3": 0x45635, - "Missable_Rocket_Hideout_B4F_Item_4": 0x4563c, - "Missable_Rocket_Hideout_B4F_Item_5": 0x45643, - "Missable_Safari_Zone_East_Item_1": 0x458b2, - "Missable_Safari_Zone_East_Item_2": 0x458b9, - "Missable_Safari_Zone_East_Item_3": 0x458c0, - "Missable_Safari_Zone_East_Item_4": 0x458c7, - "Missable_Safari_Zone_North_Item_1": 0x45a12, - "Missable_Safari_Zone_North_Item_2": 0x45a19, - "Missable_Safari_Zone_Center_Item": 0x45bf9, - "Missable_Cerulean_Cave_2F_Item_1": 0x45e36, - "Missable_Cerulean_Cave_2F_Item_2": 0x45e3d, - "Missable_Cerulean_Cave_2F_Item_3": 0x45e44, - "Static_Encounter_Mewtwo": 0x45f44, - "Missable_Cerulean_Cave_B1F_Item_1": 0x45f4c, - "Missable_Cerulean_Cave_B1F_Item_2": 0x45f53, - "Missable_Rock_Tunnel_B1F_Item_1": 0x4619f, - "Missable_Rock_Tunnel_B1F_Item_2": 0x461a6, - "Missable_Rock_Tunnel_B1F_Item_3": 0x461ad, - "Missable_Rock_Tunnel_B1F_Item_4": 0x461b4, - "Static_Encounter_Articuno": 0x4690c, - "Hidden_Item_Viridian_Forest_1": 0x46e6d, - "Hidden_Item_Viridian_Forest_2": 0x46e73, - "Hidden_Item_MtMoonB2F_1": 0x46e7a, - "Hidden_Item_MtMoonB2F_2": 0x46e80, - "Hidden_Item_Route_25_1": 0x46e94, - "Hidden_Item_Route_25_2": 0x46e9a, - "Hidden_Item_Route_9": 0x46ea1, - "Hidden_Item_SS_Anne_Kitchen": 0x46eb4, - "Hidden_Item_SS_Anne_B1F": 0x46ebb, - "Hidden_Item_Route_10_1": 0x46ec2, - "Hidden_Item_Route_10_2": 0x46ec8, - "Hidden_Item_Rocket_Hideout_B1F": 0x46ecf, - "Hidden_Item_Rocket_Hideout_B3F": 0x46ed6, - "Hidden_Item_Rocket_Hideout_B4F": 0x46edd, - "Hidden_Item_Pokemon_Tower_5F": 0x46ef1, - "Hidden_Item_Route_13_1": 0x46ef8, - "Hidden_Item_Route_13_2": 0x46efe, - "Hidden_Item_Safari_Zone_West": 0x46f0c, - "Hidden_Item_Silph_Co_5F": 0x46f13, - "Hidden_Item_Silph_Co_9F": 0x46f1a, - "Hidden_Item_Copycats_House": 0x46f21, - "Hidden_Item_Cerulean_Cave_1F": 0x46f28, - "Hidden_Item_Cerulean_Cave_B1F": 0x46f2f, - "Hidden_Item_Power_Plant_1": 0x46f36, - "Hidden_Item_Power_Plant_2": 0x46f3c, - "Hidden_Item_Seafoam_Islands_B2F": 0x46f43, - "Hidden_Item_Seafoam_Islands_B4F": 0x46f4a, - "Hidden_Item_Pokemon_Mansion_1F": 0x46f51, - "Hidden_Item_Pokemon_Mansion_3F": 0x46f65, - "Hidden_Item_Pokemon_Mansion_B1F": 0x46f72, - "Hidden_Item_Route_23_1": 0x46f85, - "Hidden_Item_Route_23_2": 0x46f8b, - "Hidden_Item_Route_23_3": 0x46f91, - "Hidden_Item_Victory_Road_2F_1": 0x46f98, - "Hidden_Item_Victory_Road_2F_2": 0x46f9e, - "Hidden_Item_Unused_6F": 0x46fa5, - "Hidden_Item_Viridian_City": 0x46fb3, - "Hidden_Item_Route_11": 0x47060, - "Hidden_Item_Route_12": 0x47067, - "Hidden_Item_Route_17_1": 0x47075, - "Hidden_Item_Route_17_2": 0x4707b, - "Hidden_Item_Route_17_3": 0x47081, - "Hidden_Item_Route_17_4": 0x47087, - "Hidden_Item_Route_17_5": 0x4708d, - "Hidden_Item_Underground_Path_NS_1": 0x47094, - "Hidden_Item_Underground_Path_NS_2": 0x4709a, - "Hidden_Item_Underground_Path_WE_1": 0x470a1, - "Hidden_Item_Underground_Path_WE_2": 0x470a7, - "Hidden_Item_Celadon_City": 0x470ae, - "Hidden_Item_Seafoam_Islands_B3F": 0x470b5, - "Hidden_Item_Vermilion_City": 0x470bc, - "Hidden_Item_Cerulean_City": 0x470c3, - "Hidden_Item_Route_4": 0x470ca, + "Option_Always_Half_STAB": 0x3e3fb, + "Type_Chart": 0x3e4ee, + "Ghost_Battle3": 0x3f1be, + "Trainersanity_EVENT_BEAT_MANSION_1_TRAINER_0_ITEM": 0x44341, + "Missable_Pokemon_Mansion_1F_Item_1": 0x443d8, + "Missable_Pokemon_Mansion_1F_Item_2": 0x443df, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_0_ITEM": 0x44514, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_1_ITEM": 0x44522, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_2_ITEM": 0x44530, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_3_ITEM": 0x4453e, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_4_ITEM": 0x4454c, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_5_ITEM": 0x4455a, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_6_ITEM": 0x44568, + "Map_Rock_TunnelF": 0x44686, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_0_ITEM": 0x44a55, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_1_ITEM": 0x44a63, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_2_ITEM": 0x44a71, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_3_ITEM": 0x44a7f, + "Missable_Victory_Road_3F_Item_1": 0x44b1f, + "Missable_Victory_Road_3F_Item_2": 0x44b26, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_0_ITEM": 0x44c47, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_1_ITEM": 0x44c55, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_2_ITEM": 0x44c63, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_3_ITEM": 0x44c71, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_4_ITEM": 0x44c7f, + "Missable_Rocket_Hideout_B1F_Item_1": 0x44d4f, + "Missable_Rocket_Hideout_B1F_Item_2": 0x44d56, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_2_TRAINER_0_ITEM": 0x45100, + "Missable_Rocket_Hideout_B2F_Item_1": 0x45141, + "Missable_Rocket_Hideout_B2F_Item_2": 0x45148, + "Missable_Rocket_Hideout_B2F_Item_3": 0x4514f, + "Missable_Rocket_Hideout_B2F_Item_4": 0x45156, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_0_ITEM": 0x45333, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_1_ITEM": 0x45341, + "Missable_Rocket_Hideout_B3F_Item_1": 0x45397, + "Missable_Rocket_Hideout_B3F_Item_2": 0x4539e, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_0_ITEM": 0x4554a, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_1_ITEM": 0x45558, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_2_ITEM": 0x45566, + "Missable_Rocket_Hideout_B4F_Item_1": 0x45655, + "Missable_Rocket_Hideout_B4F_Item_2": 0x4565c, + "Missable_Rocket_Hideout_B4F_Item_3": 0x45663, + "Missable_Rocket_Hideout_B4F_Item_4": 0x4566a, + "Missable_Rocket_Hideout_B4F_Item_5": 0x45671, + "Missable_Safari_Zone_East_Item_1": 0x458e0, + "Missable_Safari_Zone_East_Item_2": 0x458e7, + "Missable_Safari_Zone_East_Item_3": 0x458ee, + "Missable_Safari_Zone_East_Item_4": 0x458f5, + "Missable_Safari_Zone_North_Item_1": 0x45a40, + "Missable_Safari_Zone_North_Item_2": 0x45a47, + "Missable_Safari_Zone_Center_Item": 0x45c27, + "Missable_Cerulean_Cave_2F_Item_1": 0x45e64, + "Missable_Cerulean_Cave_2F_Item_2": 0x45e6b, + "Missable_Cerulean_Cave_2F_Item_3": 0x45e72, + "Trainersanity_EVENT_BEAT_MEWTWO_ITEM": 0x45f4a, + "Static_Encounter_Mewtwo": 0x45f74, + "Missable_Cerulean_Cave_B1F_Item_1": 0x45f7c, + "Missable_Cerulean_Cave_B1F_Item_2": 0x45f83, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_0_ITEM": 0x46059, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_1_ITEM": 0x46067, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_2_ITEM": 0x46075, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_3_ITEM": 0x46083, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_4_ITEM": 0x46091, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_5_ITEM": 0x4609f, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_6_ITEM": 0x460ad, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_7_ITEM": 0x460bb, + "Missable_Rock_Tunnel_B1F_Item_1": 0x461df, + "Missable_Rock_Tunnel_B1F_Item_2": 0x461e6, + "Missable_Rock_Tunnel_B1F_Item_3": 0x461ed, + "Missable_Rock_Tunnel_B1F_Item_4": 0x461f4, + "Trainersanity_EVENT_BEAT_ARTICUNO_ITEM": 0x468f7, + "Static_Encounter_Articuno": 0x4694e, + "Hidden_Item_Viridian_Forest_1": 0x46eaf, + "Hidden_Item_Viridian_Forest_2": 0x46eb5, + "Hidden_Item_MtMoonB2F_1": 0x46ebc, + "Hidden_Item_MtMoonB2F_2": 0x46ec2, + "Hidden_Item_Route_25_1": 0x46ed6, + "Hidden_Item_Route_25_2": 0x46edc, + "Hidden_Item_Route_9": 0x46ee3, + "Hidden_Item_SS_Anne_Kitchen": 0x46ef6, + "Hidden_Item_SS_Anne_B1F": 0x46efd, + "Hidden_Item_Route_10_1": 0x46f04, + "Hidden_Item_Route_10_2": 0x46f0a, + "Hidden_Item_Rocket_Hideout_B1F": 0x46f11, + "Hidden_Item_Rocket_Hideout_B3F": 0x46f18, + "Hidden_Item_Rocket_Hideout_B4F": 0x46f1f, + "Hidden_Item_Pokemon_Tower_5F": 0x46f33, + "Hidden_Item_Route_13_1": 0x46f3a, + "Hidden_Item_Route_13_2": 0x46f40, + "Hidden_Item_Safari_Zone_West": 0x46f4e, + "Hidden_Item_Silph_Co_5F": 0x46f55, + "Hidden_Item_Silph_Co_9F": 0x46f5c, + "Hidden_Item_Copycats_House": 0x46f63, + "Hidden_Item_Cerulean_Cave_1F": 0x46f6a, + "Hidden_Item_Cerulean_Cave_B1F": 0x46f71, + "Hidden_Item_Power_Plant_1": 0x46f78, + "Hidden_Item_Power_Plant_2": 0x46f7e, + "Hidden_Item_Seafoam_Islands_B2F": 0x46f85, + "Hidden_Item_Seafoam_Islands_B4F": 0x46f8c, + "Hidden_Item_Pokemon_Mansion_1F": 0x46f93, + "Hidden_Item_Pokemon_Mansion_3F": 0x46fa7, + "Hidden_Item_Pokemon_Mansion_B1F": 0x46fb4, + "Hidden_Item_Route_23_1": 0x46fc7, + "Hidden_Item_Route_23_2": 0x46fcd, + "Hidden_Item_Route_23_3": 0x46fd3, + "Hidden_Item_Victory_Road_2F_1": 0x46fda, + "Hidden_Item_Victory_Road_2F_2": 0x46fe0, + "Hidden_Item_Unused_6F": 0x46fe7, + "Hidden_Item_Viridian_City": 0x46ff5, + "Hidden_Item_Route_11": 0x470a2, + "Hidden_Item_Route_12": 0x470a9, + "Hidden_Item_Route_17_1": 0x470b7, + "Hidden_Item_Route_17_2": 0x470bd, + "Hidden_Item_Route_17_3": 0x470c3, + "Hidden_Item_Route_17_4": 0x470c9, + "Hidden_Item_Route_17_5": 0x470cf, + "Hidden_Item_Underground_Path_NS_1": 0x470d6, + "Hidden_Item_Underground_Path_NS_2": 0x470dc, + "Hidden_Item_Underground_Path_WE_1": 0x470e3, + "Hidden_Item_Underground_Path_WE_2": 0x470e9, + "Hidden_Item_Celadon_City": 0x470f0, + "Hidden_Item_Seafoam_Islands_B3F": 0x470f7, + "Hidden_Item_Vermilion_City": 0x470fe, + "Hidden_Item_Cerulean_City": 0x47105, + "Hidden_Item_Route_4": 0x4710c, "Event_Counter": 0x482d3, "Event_Thirsty_Girl_Lemonade": 0x484f9, "Event_Thirsty_Girl_Soda": 0x4851d, @@ -427,163 +489,443 @@ rom_addresses = { "Event_Mansion_Lady": 0x4872a, "Badge_Celadon_Gym": 0x48a1b, "Event_Celadon_Gym": 0x48a2f, - "Event_Gambling_Addict": 0x49293, - "Gift_Magikarp": 0x49430, - "Option_Aide_Rt11": 0x4958d, - "Event_Rt11_Oaks_Aide": 0x49591, - "Event_Mourning_Girl": 0x4968b, - "Option_Aide_Rt15": 0x49776, - "Event_Rt_15_Oaks_Aide": 0x4977a, - "Missable_Mt_Moon_1F_Item_1": 0x49c75, - "Missable_Mt_Moon_1F_Item_2": 0x49c7c, - "Missable_Mt_Moon_1F_Item_3": 0x49c83, - "Missable_Mt_Moon_1F_Item_4": 0x49c8a, - "Missable_Mt_Moon_1F_Item_5": 0x49c91, - "Missable_Mt_Moon_1F_Item_6": 0x49c98, - "Dome_Fossil_Text": 0x4a001, - "Event_Dome_Fossil": 0x4a021, - "Helix_Fossil_Text": 0x4a05d, - "Event_Helix_Fossil": 0x4a07d, - "Missable_Mt_Moon_B2F_Item_1": 0x4a166, - "Missable_Mt_Moon_B2F_Item_2": 0x4a16d, - "Missable_Safari_Zone_West_Item_1": 0x4a34f, - "Missable_Safari_Zone_West_Item_2": 0x4a356, - "Missable_Safari_Zone_West_Item_3": 0x4a35d, - "Missable_Safari_Zone_West_Item_4": 0x4a364, - "Event_Safari_Zone_Secret_House": 0x4a469, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_0_ITEM": 0x48a75, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_1_ITEM": 0x48a83, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_2_ITEM": 0x48a91, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_3_ITEM": 0x48a9f, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_4_ITEM": 0x48aad, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_5_ITEM": 0x48abb, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_6_ITEM": 0x48ac9, + "Event_Gambling_Addict": 0x492a1, + "Gift_Magikarp": 0x4943e, + "Option_Aide_Rt11": 0x4959b, + "Event_Rt11_Oaks_Aide": 0x4959f, + "Event_Mourning_Girl": 0x49699, + "Option_Aide_Rt15": 0x49784, + "Event_Rt_15_Oaks_Aide": 0x49788, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_0_ITEM": 0x49b2e, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_1_ITEM": 0x49b3c, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_2_ITEM": 0x49b4a, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_3_ITEM": 0x49b58, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_4_ITEM": 0x49b66, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_5_ITEM": 0x49b74, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_6_ITEM": 0x49b82, + "Missable_Mt_Moon_1F_Item_1": 0x49c91, + "Missable_Mt_Moon_1F_Item_2": 0x49c98, + "Missable_Mt_Moon_1F_Item_3": 0x49c9f, + "Missable_Mt_Moon_1F_Item_4": 0x49ca6, + "Missable_Mt_Moon_1F_Item_5": 0x49cad, + "Missable_Mt_Moon_1F_Item_6": 0x49cb4, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_0_ITEM": 0x49f87, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_1_ITEM": 0x49f95, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_2_ITEM": 0x49fa3, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_3_ITEM": 0x49fb1, + "Dome_Fossil_Text": 0x4a025, + "Event_Dome_Fossil": 0x4a045, + "Helix_Fossil_Text": 0x4a081, + "Event_Helix_Fossil": 0x4a0a1, + "Missable_Mt_Moon_B2F_Item_1": 0x4a18a, + "Missable_Mt_Moon_B2F_Item_2": 0x4a191, + "Missable_Safari_Zone_West_Item_1": 0x4a373, + "Missable_Safari_Zone_West_Item_2": 0x4a37a, + "Missable_Safari_Zone_West_Item_3": 0x4a381, + "Missable_Safari_Zone_West_Item_4": 0x4a388, + "Event_Safari_Zone_Secret_House": 0x4a48d, "Missable_Route_24_Item": 0x506e6, "Missable_Route_25_Item": 0x5080b, - "Starter2_B": 0x50fce, - "Starter3_B": 0x50fd0, - "Starter1_B": 0x50fd2, - "Starter2_A": 0x510f1, - "Starter3_A": 0x510f3, - "Starter1_A": 0x510f5, - "Option_Badge_Goal": 0x51317, - "Event_Nugget_Bridge": 0x5148f, - "Static_Encounter_Moltres": 0x51939, - "Missable_Victory_Road_2F_Item_1": 0x51941, - "Missable_Victory_Road_2F_Item_2": 0x51948, - "Missable_Victory_Road_2F_Item_3": 0x5194f, - "Missable_Victory_Road_2F_Item_4": 0x51956, - "Starter2_L": 0x51c85, - "Starter3_L": 0x51c8d, - "Gift_Lapras": 0x51d83, - "Missable_Silph_Co_7F_Item_1": 0x51f0d, - "Missable_Silph_Co_7F_Item_2": 0x51f14, - "Missable_Pokemon_Mansion_2F_Item": 0x520c9, - "Missable_Pokemon_Mansion_3F_Item_1": 0x522e2, - "Missable_Pokemon_Mansion_3F_Item_2": 0x522e9, - "Missable_Pokemon_Mansion_B1F_Item_1": 0x5248c, - "Missable_Pokemon_Mansion_B1F_Item_2": 0x52493, - "Missable_Pokemon_Mansion_B1F_Item_3": 0x5249a, - "Missable_Pokemon_Mansion_B1F_Item_4": 0x524a1, - "Missable_Pokemon_Mansion_B1F_Item_5": 0x524ae, - "Option_Safari_Zone_Battle_Type": 0x525c3, - "Prize_Mon_A2": 0x5282f, - "Prize_Mon_B2": 0x52830, - "Prize_Mon_C2": 0x52831, - "Prize_Mon_D2": 0x5283a, - "Prize_Mon_E2": 0x5283b, - "Prize_Mon_F2": 0x5283c, - "Prize_Mon_A": 0x52960, - "Prize_Mon_B": 0x52962, - "Prize_Mon_C": 0x52964, - "Prize_Mon_D": 0x52966, - "Prize_Mon_E": 0x52968, - "Prize_Mon_F": 0x5296a, + "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_Mon_A": 0x529b0, + "Prize_Mon_B": 0x529b2, + "Prize_Mon_C": 0x529b4, + "Prize_Mon_D": 0x529b6, + "Prize_Mon_E": 0x529b8, + "Prize_Mon_F": 0x529ba, + "Start_Inventory": 0x52add, "Missable_Route_2_Item_1": 0x5404a, "Missable_Route_2_Item_2": 0x54051, "Missable_Route_4_Item": 0x543df, "Missable_Route_9_Item": 0x546fd, "Option_EXP_Modifier": 0x552c5, - "Rod_Vermilion_City_Fishing_Guru": 0x560df, - "Rod_Fuchsia_City_Fishing_Brother": 0x561eb, - "Rod_Route12_Fishing_Brother": 0x564ee, + "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, "Missable_Route_12_Item_1": 0x58704, "Missable_Route_12_Item_2": 0x5870b, "Missable_Route_15_Item": 0x589c7, "Ghost_Battle6": 0x58df0, - "Static_Encounter_Snorlax_A": 0x5969b, - "Static_Encounter_Snorlax_B": 0x599db, - "Event_Pokemon_Fan_Club": 0x59c8b, - "Event_Scared_Woman": 0x59e1f, - "Missable_Silph_Co_3F_Item": 0x5a0cb, - "Missable_Silph_Co_10F_Item_1": 0x5a281, - "Missable_Silph_Co_10F_Item_2": 0x5a288, - "Missable_Silph_Co_10F_Item_3": 0x5a28f, - "Guard_Drink_List": 0x5a600, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_0_ITEM": 0x59106, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_1_ITEM": 0x59114, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_2_ITEM": 0x59122, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_3_ITEM": 0x59130, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_4_ITEM": 0x5913e, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_5_ITEM": 0x5914c, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_0_ITEM": 0x5921e, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_1_ITEM": 0x5922c, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_2_ITEM": 0x5923a, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_3_ITEM": 0x59248, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_4_ITEM": 0x59256, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_5_ITEM": 0x59264, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_6_ITEM": 0x59272, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_7_ITEM": 0x59280, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_8_ITEM": 0x5928e, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_0_ITEM": 0x59406, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_1_ITEM": 0x59414, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_2_ITEM": 0x59422, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_3_ITEM": 0x59430, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_4_ITEM": 0x5943e, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_5_ITEM": 0x5944c, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_0_ITEM": 0x59533, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_1_ITEM": 0x59541, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_2_ITEM": 0x5954f, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_3_ITEM": 0x5955d, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_4_ITEM": 0x5956b, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_5_ITEM": 0x59579, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_6_ITEM": 0x59587, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_7_ITEM": 0x59595, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_8_ITEM": 0x595a3, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_9_ITEM": 0x595b1, + "Static_Encounter_Snorlax_A": 0x596ef, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_0_ITEM": 0x5975d, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_1_ITEM": 0x5976b, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_2_ITEM": 0x59779, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_3_ITEM": 0x59787, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_4_ITEM": 0x59795, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_5_ITEM": 0x597a3, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_6_ITEM": 0x597b1, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_0_ITEM": 0x598b9, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_1_ITEM": 0x598c7, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_2_ITEM": 0x598d5, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_3_ITEM": 0x598e3, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_4_ITEM": 0x598f1, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_5_ITEM": 0x598ff, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_6_ITEM": 0x5990d, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_7_ITEM": 0x5991b, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_8_ITEM": 0x59929, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_9_ITEM": 0x59937, + "Static_Encounter_Snorlax_B": 0x59a51, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_0_ITEM": 0x59abd, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_1_ITEM": 0x59acb, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_2_ITEM": 0x59ad9, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_3_ITEM": 0x59ae7, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_4_ITEM": 0x59af5, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_5_ITEM": 0x59b03, + "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_0_ITEM": 0x59be4, + "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_1_ITEM": 0x59bf2, + "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_2_ITEM": 0x59c00, + "Event_Pokemon_Fan_Club": 0x59d13, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_0_ITEM": 0x59e73, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_1_ITEM": 0x59e81, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_2_ITEM": 0x59e8f, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_3_ITEM": 0x59e9d, + "Event_Scared_Woman": 0x59eaf, + "Trainersanity_EVENT_BEAT_SILPH_CO_3F_TRAINER_0_ITEM": 0x5a0b7, + "Trainersanity_EVENT_BEAT_SILPH_CO_3F_TRAINER_1_ITEM": 0x5a0c5, + "Missable_Silph_Co_3F_Item": 0x5a15f, + "Trainersanity_EVENT_BEAT_SILPH_CO_10F_TRAINER_0_ITEM": 0x5a281, + "Trainersanity_EVENT_BEAT_SILPH_CO_10F_TRAINER_1_ITEM": 0x5a28f, + "Missable_Silph_Co_10F_Item_1": 0x5a319, + "Missable_Silph_Co_10F_Item_2": 0x5a320, + "Missable_Silph_Co_10F_Item_3": 0x5a327, + "Trainersanity_EVENT_BEAT_LANCES_ROOM_TRAINER_0_ITEM": 0x5a48a, + "Guard_Drink_List": 0x5a69f, "Event_Museum": 0x5c266, "Badge_Pewter_Gym": 0x5c3ed, "Event_Pewter_Gym": 0x5c401, - "Badge_Cerulean_Gym": 0x5c716, - "Event_Cerulean_Gym": 0x5c72a, - "Badge_Vermilion_Gym": 0x5caba, - "Event_Vermillion_Gym": 0x5cace, - "Event_Copycat": 0x5cca9, - "Gift_Hitmonlee": 0x5cf1a, - "Gift_Hitmonchan": 0x5cf62, - "Badge_Saffron_Gym": 0x5d079, - "Event_Saffron_Gym": 0x5d08d, - "Option_Aide_Rt2": 0x5d5f2, - "Event_Route_2_Oaks_Aide": 0x5d5f6, - "Missable_Victory_Road_1F_Item_1": 0x5dae6, - "Missable_Victory_Road_1F_Item_2": 0x5daed, + "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, - "Missable_Pokemon_Tower_3F_Item": 0x60787, - "Missable_Pokemon_Tower_4F_Item_1": 0x608b5, - "Missable_Pokemon_Tower_4F_Item_2": 0x608bc, - "Missable_Pokemon_Tower_4F_Item_3": 0x608c3, - "Missable_Pokemon_Tower_5F_Item": 0x60a80, - "Ghost_Battle1": 0x60b33, - "Ghost_Battle2": 0x60c0a, - "Missable_Pokemon_Tower_6F_Item_1": 0x60c85, - "Missable_Pokemon_Tower_6F_Item_2": 0x60c8c, - "Gift_Aerodactyl": 0x61064, - "Gift_Omanyte": 0x61068, - "Gift_Kabuto": 0x6106c, - "Missable_Viridian_Forest_Item_1": 0x6122c, - "Missable_Viridian_Forest_Item_2": 0x61233, - "Missable_Viridian_Forest_Item_3": 0x6123a, - "Starter2_M": 0x61450, - "Starter3_M": 0x61458, - "Event_SS_Anne_Captain": 0x618c3, - "Missable_SS_Anne_1F_Item": 0x61ac0, - "Missable_SS_Anne_2F_Item_1": 0x61ced, - "Missable_SS_Anne_2F_Item_2": 0x61d00, - "Missable_SS_Anne_B1F_Item_1": 0x61ee3, - "Missable_SS_Anne_B1F_Item_2": 0x61eea, - "Missable_SS_Anne_B1F_Item_3": 0x61ef1, - "Event_Silph_Co_President": 0x622ed, + "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": 0x60ea6, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_7_TRAINER_1_ITEM": 0x60eb4, + "Trainersanity_EVENT_BEAT_POKEMONTOWER_7_TRAINER_2_ITEM": 0x60ec2, + "Gift_Aerodactyl": 0x610bc, + "Gift_Omanyte": 0x610c0, + "Gift_Kabuto": 0x610c4, + "Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_0_ITEM": 0x611a7, + "Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_1_ITEM": 0x611b5, + "Trainersanity_EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_2_ITEM": 0x611c3, + "Missable_Viridian_Forest_Item_1": 0x6128a, + "Missable_Viridian_Forest_Item_2": 0x61291, + "Missable_Viridian_Forest_Item_3": 0x61298, + "Starter2_M": 0x614ae, + "Starter3_M": 0x614b6, + "Trainersanity_EVENT_BEAT_SS_ANNE_5_TRAINER_0_ITEM": 0x6173c, + "Trainersanity_EVENT_BEAT_SS_ANNE_5_TRAINER_1_ITEM": 0x6174a, + "Event_SS_Anne_Captain": 0x61925, + "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_0_ITEM": 0x61a14, + "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_1_ITEM": 0x61a22, + "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_2_ITEM": 0x61a30, + "Trainersanity_EVENT_BEAT_SS_ANNE_8_TRAINER_3_ITEM": 0x61a3e, + "Missable_SS_Anne_1F_Item": 0x61b2a, + "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_0_ITEM": 0x61bfb, + "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_1_ITEM": 0x61c09, + "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_2_ITEM": 0x61c17, + "Trainersanity_EVENT_BEAT_SS_ANNE_9_TRAINER_3_ITEM": 0x61c25, + "Missable_SS_Anne_2F_Item_1": 0x61d5f, + "Missable_SS_Anne_2F_Item_2": 0x61d72, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_0_ITEM": 0x61e03, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_1_ITEM": 0x61e11, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_2_ITEM": 0x61e1f, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_3_ITEM": 0x61e2d, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_4_ITEM": 0x61e3b, + "Trainersanity_EVENT_BEAT_SS_ANNE_10_TRAINER_5_ITEM": 0x61e49, + "Missable_SS_Anne_B1F_Item_1": 0x61f61, + "Missable_SS_Anne_B1F_Item_2": 0x61f68, + "Missable_SS_Anne_B1F_Item_3": 0x61f6f, + "Trainersanity_EVENT_BEAT_SILPH_CO_11F_TRAINER_0_ITEM": 0x62330, + "Trainersanity_EVENT_BEAT_SILPH_CO_11F_TRAINER_1_ITEM": 0x6233e, + "Event_Silph_Co_President": 0x62351, "Ghost_Battle4": 0x708e1, - "Badge_Viridian_Gym": 0x749ca, - "Event_Viridian_Gym": 0x749de, - "Missable_Viridian_Gym_Item": 0x74c63, - "Missable_Cerulean_Cave_1F_Item_1": 0x74d68, - "Missable_Cerulean_Cave_1F_Item_2": 0x74d6f, - "Missable_Cerulean_Cave_1F_Item_3": 0x74d76, - "Event_Warden": 0x7512a, - "Missable_Wardens_House_Item": 0x751b7, - "Badge_Fuchsia_Gym": 0x755cd, - "Event_Fuschia_Gym": 0x755e1, - "Badge_Cinnabar_Gym": 0x75995, - "Event_Cinnabar_Gym": 0x759a9, - "Event_Lab_Scientist": 0x75dd6, - "Fossils_Needed_For_Second_Item": 0x75ea3, - "Event_Dome_Fossil_B": 0x75f20, - "Event_Helix_Fossil_B": 0x75f40, - "Starter2_N": 0x76169, - "Starter3_N": 0x76171, - "Option_Itemfinder": 0x76864, + "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, + "Event_Lab_Scientist": 0x75e43, + "Fossils_Needed_For_Second_Item": 0x75f10, + "Event_Dome_Fossil_B": 0x75f8d, + "Event_Helix_Fossil_B": 0x75fad, + "Shop8": 0x760cb, + "Starter2_N": 0x761fe, + "Starter3_N": 0x76206, + "Trainersanity_EVENT_BEAT_LORELEIS_ROOM_TRAINER_0_ITEM": 0x764ce, + "Trainersanity_EVENT_BEAT_BRUNOS_ROOM_TRAINER_0_ITEM": 0x76627, + "Trainersanity_EVENT_BEAT_AGATHAS_ROOM_TRAINER_0_ITEM": 0x76786, + "Option_Itemfinder": 0x768ff, + "Text_Magikarp_Salesman": 0x8a7fe, "Text_Badges_Needed": 0x92304, - "Badge_Text_Boulder_Badge": 0x990b3, - "Badge_Text_Cascade_Badge": 0x990cb, - "Badge_Text_Thunder_Badge": 0x99111, - "Badge_Text_Rainbow_Badge": 0x9912e, - "Badge_Text_Soul_Badge": 0x99177, - "Badge_Text_Marsh_Badge": 0x9918c, - "Badge_Text_Volcano_Badge": 0x991d6, - "Badge_Text_Earth_Badge": 0x991f3, + "Badge_Text_Boulder_Badge": 0x99010, + "Badge_Text_Cascade_Badge": 0x99028, + "Badge_Text_Thunder_Badge": 0x9906e, + "Badge_Text_Rainbow_Badge": 0x9908b, + "Badge_Text_Soul_Badge": 0x990d4, + "Badge_Text_Marsh_Badge": 0x990e9, + "Badge_Text_Volcano_Badge": 0x99133, + "Badge_Text_Earth_Badge": 0x99150, "Text_Badges_Needed_Viridian_Gym": 0xa49f2, } diff --git a/worlds/pokemon_rb/rules.py b/worlds/pokemon_rb/rules.py index 6a8399bd..e24eaf5e 100644 --- a/worlds/pokemon_rb/rules.py +++ b/worlds/pokemon_rb/rules.py @@ -3,25 +3,27 @@ from ..generic.Rules import add_item_rule, add_rule def set_rules(world, player): add_item_rule(world.get_location("Pallet Town - Player's PC", player), - lambda i: i.player == player and "Badge" not in i.name) + lambda i: i.player == player and "Badge" not in i.name and "Trap" not in i.name and + i.name != "Pokedex") 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_has_pokemon(state.multiworld.oaks_aide_rt_2[player].value + 5, 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), "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_has_pokemon(state.multiworld.oaks_aide_rt_11[player].value + 5, 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": lambda state: state.has("Card Key", player), "Fuchsia City - Safari Zone Warden": lambda state: state.has("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), @@ -85,10 +87,23 @@ def set_rules(world, 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) - } + "Vermilion City - Legendary Pokemon": lambda state: state.pokemon_rb_can_surf(player) and state.has("S.S. Ticket", player), - hidden_item_access_rules = { + # Pokédex check + "Pallet Town - 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 North - 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( player), "Viridian Forest - Hidden Item Entrance Tree": lambda state: state.pokemon_rb_can_get_hidden_items(player), @@ -159,8 +174,6 @@ def set_rules(world, player): player), "Route 4 - Hidden Item Plateau East Of Mt Moon": lambda state: state.pokemon_rb_can_get_hidden_items(player), } - for loc, rule in access_rules.items(): - add_rule(world.get_location(loc, player), rule) - if world.randomize_hidden_items[player].value != 0: - for loc, rule in hidden_item_access_rules.items(): - add_rule(world.get_location(loc, player), rule) + for loc in world.get_locations(player): + if loc.name in access_rules: + add_rule(loc, access_rules[loc.name])