From df55455fc0507fe4d4535b062d34c3acfba567f8 Mon Sep 17 00:00:00 2001 From: Alchav <59858495+Alchav@users.noreply.github.com> Date: Mon, 13 Mar 2023 18:40:55 -0400 Subject: [PATCH] =?UTF-8?q?Pok=C3=A9mon=20R/B:=20Version=203=20(#1520)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Coin items received or found in the Game Corner are now shuffled, locations require Coin Case * Prizesanity option (shuffle Game Corner Prizes) * DexSanity option: location checks for marking Pokémon as caught in your Pokédex. Also an option to set all Pokémon in your Pokédex as seen from the start, to aid in locating them. * Option to randomize the layout of the Rock Tunnel. * Area 1-to-1 mapping: When one instance of a Wild Pokémon in a given area is randomized, all instances of that Pokémon will be the same. So that if a route had 3 different Pokémon before, it will have 3 after randomization. * Option to randomize the moves taught by TMs. * Exact controls for TM/HM compatibility chances. * Option to randomize Pokémon's pallets or set them based on primary type. * Added Cinnabar Gym trainers to Trainersanity and randomized the quiz questions and answers. Getting a correct answer will flag the trainer as defeated so that you can obtain the Trainersanity check without defeating the trainer if you answer correctly. --- PokemonClient.py | 28 +- data/lua/PKMN_RB/pkmn_rb.lua | 79 +- worlds/pokemon_rb/__init__.py | 152 ++- worlds/pokemon_rb/basepatch_blue.bsdiff4 | Bin 36601 -> 38871 bytes worlds/pokemon_rb/basepatch_red.bsdiff4 | Bin 36602 -> 38878 bytes .../docs/en_Pokemon Red and Blue.md | 2 + worlds/pokemon_rb/items.py | 10 +- worlds/pokemon_rb/locations.py | 88 +- worlds/pokemon_rb/logic.py | 14 +- worlds/pokemon_rb/options.py | 169 ++- worlds/pokemon_rb/poke_data.py | 355 ++--- worlds/pokemon_rb/regions.py | 6 +- worlds/pokemon_rb/rock_tunnel.py | 294 ++++ worlds/pokemon_rb/rom.py | 487 ++++++- worlds/pokemon_rb/rom_addresses.py | 1177 +++++++++-------- worlds/pokemon_rb/rules.py | 72 +- worlds/pokemon_rb/text.py | 6 +- worlds/smz3/__init__.py | 4 +- 18 files changed, 2025 insertions(+), 918 deletions(-) create mode 100644 worlds/pokemon_rb/rock_tunnel.py diff --git a/PokemonClient.py b/PokemonClient.py index eb1f1243..e78e76fa 100644 --- a/PokemonClient.py +++ b/PokemonClient.py @@ -17,7 +17,7 @@ from CommonClient import CommonContext, server_loop, gui_enabled, ClientCommandP from worlds.pokemon_rb.locations import location_data from worlds.pokemon_rb.rom import RedDeltaPatch, BlueDeltaPatch -location_map = {"Rod": {}, "EventFlag": {}, "Missable": {}, "Hidden": {}, "list": {}} +location_map = {"Rod": {}, "EventFlag": {}, "Missable": {}, "Hidden": {}, "list": {}, "DexSanityFlag": {}} location_bytes_bits = {} for location in location_data: if location.ram_address is not None: @@ -40,7 +40,7 @@ CONNECTION_INITIAL_STATUS = "Connection has not been initiated" DISPLAY_MSGS = True -SCRIPT_VERSION = 1 +SCRIPT_VERSION = 3 class GBCommandProcessor(ClientCommandProcessor): @@ -70,6 +70,8 @@ class GBContext(CommonContext): self.set_deathlink = False self.client_compatibility_mode = 0 self.items_handling = 0b001 + self.sent_release = False + self.sent_collect = False async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: @@ -124,7 +126,8 @@ def get_payload(ctx: GBContext): "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}, - "deathlink": ctx.deathlink_pending + "deathlink": ctx.deathlink_pending, + "options": ((ctx.permissions['release'] in ('goal', 'enabled')) * 2) + (ctx.permissions['collect'] in ('goal', 'enabled')) } ) ctx.deathlink_pending = False @@ -134,10 +137,13 @@ def get_payload(ctx: GBContext): async def parse_locations(data: List, ctx: GBContext): locations = [] flags = {"EventFlag": data[:0x140], "Missable": data[0x140:0x140 + 0x20], - "Hidden": data[0x140 + 0x20: 0x140 + 0x20 + 0x0E], "Rod": data[0x140 + 0x20 + 0x0E:]} + "Hidden": data[0x140 + 0x20: 0x140 + 0x20 + 0x0E], + "Rod": data[0x140 + 0x20 + 0x0E:0x140 + 0x20 + 0x0E + 0x01]} - if len(flags['Rod']) > 1: - return + if len(data) > 0x140 + 0x20 + 0x0E + 0x01: + flags["DexSanityFlag"] = data[0x140 + 0x20 + 0x0E + 0x01:] + else: + flags["DexSanityFlag"] = [0] * 19 for flag_type, loc_map in location_map.items(): for flag, loc_id in loc_map.items(): @@ -207,6 +213,16 @@ async def gb_sync_task(ctx: GBContext): 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 'options' in data_decoded: + msgs = [] + if data_decoded['options'] & 4 and not ctx.sent_release: + ctx.sent_release = True + msgs.append({"cmd": "Say", "text": "!release"}) + if data_decoded['options'] & 8 and not ctx.sent_collect: + ctx.sent_collect = True + msgs.append({"cmd": "Say", "text": "!collect"}) + if msgs: + await ctx.send_msgs(msgs) if ctx.set_deathlink: await ctx.update_death_link(True) except asyncio.TimeoutError: diff --git a/data/lua/PKMN_RB/pkmn_rb.lua b/data/lua/PKMN_RB/pkmn_rb.lua index eaf75165..036f7a62 100644 --- a/data/lua/PKMN_RB/pkmn_rb.lua +++ b/data/lua/PKMN_RB/pkmn_rb.lua @@ -7,7 +7,7 @@ local STATE_TENTATIVELY_CONNECTED = "Tentatively Connected" local STATE_INITIAL_CONNECTION_MADE = "Initial Connection Made" local STATE_UNINITIALIZED = "Uninitialized" -local SCRIPT_VERSION = 1 +local SCRIPT_VERSION = 3 local APIndex = 0x1A6E local APDeathLinkAddress = 0x00FD @@ -16,7 +16,8 @@ local EventFlagAddress = 0x1735 local MissableAddress = 0x161A local HiddenItemsAddress = 0x16DE local RodAddress = 0x1716 -local InGame = 0x1A71 +local DexSanityAddress = 0x1A71 +local InGameAddress = 0x1A84 local ClientCompatibilityAddress = 0xFF00 local ItemsReceived = nil @@ -34,6 +35,7 @@ local frame = 0 local u8 = nil local wU8 = nil local u16 +local compat = nil local function defineMemoryFunctions() local memDomain = {} @@ -70,18 +72,6 @@ function slice (tbl, s, e) return new end -function processBlock(block) - if block == nil then - return - end - local itemsBlock = block["items"] - memDomain.wram() - if itemsBlock ~= nil then - ItemsReceived = itemsBlock - end - deathlink_rec = block["deathlink"] -end - function difference(a, b) local aa = {} for k,v in pairs(a) do aa[v]=true end @@ -99,6 +89,7 @@ function generateLocationsChecked() events = uRange(EventFlagAddress, 0x140) missables = uRange(MissableAddress, 0x20) hiddenitems = uRange(HiddenItemsAddress, 0x0E) + dexsanity = uRange(DexSanityAddress, 19) rod = u8(RodAddress) data = {} @@ -108,6 +99,9 @@ function generateLocationsChecked() table.foreach(hiddenitems, function(k, v) table.insert(data, v) end) table.insert(data, rod) + if compat > 1 then + table.foreach(dexsanity, function(k, v) table.insert(data, v) end) + end return data end @@ -141,7 +135,15 @@ function receive() return end if l ~= nil then - processBlock(json.decode(l)) + block = json.decode(l) + if block ~= nil then + local itemsBlock = block["items"] + if itemsBlock ~= nil then + ItemsReceived = itemsBlock + end + deathlink_rec = block["deathlink"] + + end end -- Determine Message to send back memDomain.rom() @@ -156,15 +158,31 @@ function receive() seedName = newSeedName local retTable = {} retTable["scriptVersion"] = SCRIPT_VERSION - retTable["clientCompatibilityVersion"] = u8(ClientCompatibilityAddress) + + if compat == nil then + compat = u8(ClientCompatibilityAddress) + if compat < 2 then + InGameAddress = 0x1A71 + end + end + + retTable["clientCompatibilityVersion"] = compat retTable["playerName"] = playerName retTable["seedName"] = seedName memDomain.wram() - if u8(InGame) == 0xAC then + + in_game = u8(InGameAddress) + if in_game == 0x2A or in_game == 0xAC then retTable["locations"] = generateLocationsChecked() + elseif in_game ~= 0 then + print("Game may have crashed") + curstate = STATE_UNINITIALIZED + return end + retTable["deathLink"] = deathlink_send deathlink_send = false + msg = json.encode(retTable).."\n" local ret, error = gbSocket:send(msg) if ret == nil then @@ -193,16 +211,23 @@ function main() if (curstate == STATE_OK) or (curstate == STATE_INITIAL_CONNECTION_MADE) or (curstate == STATE_TENTATIVELY_CONNECTED) then if (frame % 5 == 0) then 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) + in_game = u8(InGameAddress) + if in_game == 0x2A or in_game == 0xAC then + if 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 + item_id = ItemsReceived[ItemIndex + 1] - 172000000 + if item_id > 255 then + item_id = item_id - 256 + end + wU8(APItemAddress, item_id) + end end end end diff --git a/worlds/pokemon_rb/__init__.py b/worlds/pokemon_rb/__init__.py index 88813ad9..cea26d46 100644 --- a/worlds/pokemon_rb/__init__.py +++ b/worlds/pokemon_rb/__init__.py @@ -15,7 +15,7 @@ from .options import pokemon_rb_options from .rom_addresses import rom_addresses from .text import encode_text from .rom import generate_output, get_base_rom_bytes, get_base_rom_path, process_pokemon_data, process_wild_pokemon,\ - process_static_pokemon + process_static_pokemon, process_move_data from .rules import set_rules import worlds.pokemon_rb.poke_data as poke_data @@ -40,13 +40,14 @@ class PokemonRedBlueWorld(World): game = "Pokemon Red and Blue" option_definitions = pokemon_rb_options - data_version = 5 - required_client_version = (0, 3, 7) + data_version = 7 + required_client_version = (0, 3, 9) 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"} + location_name_to_id = {location.name: location.address for location in location_data if location.type == "Item" + and location.address is not None} item_name_groups = item_groups web = PokemonWebWorld() @@ -58,11 +59,14 @@ class PokemonRedBlueWorld(World): self.extra_badges = {} self.type_chart = None self.local_poke_data = None + self.local_move_data = None + self.local_tms = None self.learnsets = None self.trainer_name = None self.rival_name = None self.type_chart = None self.traps = None + self.trade_mons = {} @classmethod def stage_assert_generate(cls, multiworld: MultiWorld): @@ -94,6 +98,12 @@ class PokemonRedBlueWorld(World): if len(self.multiworld.player_name[self.player].encode()) > 16: raise Exception(f"Player name too long for {self.multiworld.get_player_name(self.player)}. Player name cannot exceed 16 bytes for Pokémon Red and Blue.") + if (self.multiworld.dexsanity[self.player] and self.multiworld.accessibility[self.player] == "locations" + and (self.multiworld.catch_em_all[self.player] != "all_pokemon" + or self.multiworld.randomize_wild_pokemon[self.player] == "vanilla" + or self.multiworld.randomize_legendary_pokemon[self.player] != "any")): + self.multiworld.accessibility[self.player] = self.multiworld.accessibility[self.player].from_text("items") + if self.multiworld.badges_needed_for_hm_moves[self.player].value >= 2: badges_to_add = ["Marsh Badge", "Volcano Badge", "Earth Badge"] if self.multiworld.badges_needed_for_hm_moves[self.player].value == 3: @@ -107,6 +117,7 @@ class PokemonRedBlueWorld(World): for badge in badges_to_add: self.extra_badges[hm_moves.pop()] = badge + process_move_data(self) process_pokemon_data(self) if self.multiworld.randomize_type_chart[self.player] == "vanilla": @@ -178,8 +189,13 @@ class PokemonRedBlueWorld(World): 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 = [] + combined_traps = (self.multiworld.poison_trap_weight[self.player].value + + self.multiworld.fire_trap_weight[self.player].value + + self.multiworld.paralyze_trap_weight[self.player].value + + self.multiworld.ice_trap_weight[self.player].value) for location in locations: if not location.inclusion(self.multiworld, self.player): continue @@ -189,9 +205,18 @@ class PokemonRedBlueWorld(World): item = self.create_filler() elif location.original_item is None: item = self.create_filler() + elif location.original_item == "Pokedex": + if self.multiworld.randomize_pokedex[self.player] == "vanilla": + self.multiworld.get_location(location.name, self.player).event = True + location.event = True + item = self.create_item("Pokedex") + elif location.original_item.startswith("TM"): + if self.multiworld.randomize_tm_moves[self.player]: + item = self.create_item(location.original_item.split(" ")[0]) + else: + item = self.create_item(location.original_item) else: item = self.create_item(location.original_item) - combined_traps = self.multiworld.poison_trap_weight[self.player].value + self.multiworld.fire_trap_weight[self.player].value + self.multiworld.paralyze_trap_weight[self.player].value + self.multiworld.ice_trap_weight[self.player].value if (item.classification == ItemClassification.filler and self.multiworld.random.randint(1, 100) <= self.multiworld.trap_percentage[self.player].value and combined_traps != 0): item = self.create_item(self.select_trap()) @@ -205,9 +230,62 @@ class PokemonRedBlueWorld(World): self.multiworld.itempool += item_pool def pre_fill(self) -> None: - process_wild_pokemon(self) process_static_pokemon(self) + pokemon_locs = [location.name for location in location_data if location.type != "Item"] + for location in self.multiworld.get_locations(self.player): + if location.name in pokemon_locs: + location.show_in_spoiler = False + + def intervene(move): + accessible_slots = [loc for loc in self.multiworld.get_reachable_locations(test_state, self.player) if loc.type == "Wild Encounter"] + move_bit = pow(2, poke_data.hm_moves.index(move) + 2) + viable_mons = [mon for mon in self.local_poke_data if self.local_poke_data[mon]["tms"][6] & move_bit] + placed_mons = [slot.item.name for slot in accessible_slots] + # this sort method doesn't seem to work if you reference the same list being sorted in the lambda + placed_mons_copy = placed_mons.copy() + placed_mons.sort(key=lambda i: placed_mons_copy.count(i)) + placed_mon = placed_mons.pop() + if self.multiworld.area_1_to_1_mapping[self.player]: + zone = " - ".join(placed_mon.split(" - ")[:-1]) + replace_slots = [slot for slot in accessible_slots if slot.name.startswith(zone) and slot.item.name == + placed_mon] + else: + replace_slots = [self.multiworld.random.choice([slot for slot in accessible_slots if slot.item.name == + placed_mon])] + replace_mon = self.multiworld.random.choice(viable_mons) + for replace_slot in replace_slots: + replace_slot.item = self.create_item(replace_mon) + last_intervene = None + while True: + intervene_move = None + test_state = self.multiworld.get_all_state(False) + if not self.multiworld.badgesanity[self.player]: + for badge in ["Boulder Badge", "Cascade Badge", "Thunder Badge", "Rainbow Badge", "Soul Badge", + "Marsh Badge", "Volcano Badge", "Earth Badge"]: + test_state.collect(self.create_item(badge)) + if not test_state.pokemon_rb_can_surf(self.player): + intervene_move = "Surf" + if not test_state.pokemon_rb_can_strength(self.player): + intervene_move = "Strength" + # cut may not be needed if accessibility is minimal, unless you need all 8 badges and badgesanity is off, + # as you will require cut to access celadon gyn + if (self.multiworld.accessibility[self.player] != "minimal" or ((not + self.multiworld.badgesanity[self.player]) and max(self.multiworld.elite_four_condition[self.player], + self.multiworld.victory_road_condition[self.player]) > 7)): + if not test_state.pokemon_rb_can_cut(self.player): + intervene_move = "Cut" + if (self.multiworld.accessibility[self.player].current_key != "minimal" and + (self.multiworld.trainersanity[self.player] or self.multiworld.extra_key_items[self.player])): + if not test_state.pokemon_rb_can_flash(self.player): + intervene_move = "Flash" + if intervene_move: + if intervene_move == last_intervene: + raise Exception(f"Caught in infinite loop attempting to ensure {intervene_move} is available to player {self.player}") + intervene(intervene_move) + last_intervene = intervene_move + else: + break if self.multiworld.old_man[self.player].value == 1: self.multiworld.local_early_items[self.player]["Oak's Parcel"] = 1 @@ -237,17 +315,26 @@ class PokemonRedBlueWorld(World): else: raise FillError(f"Failed to place badges for player {self.player}") - locs = [self.multiworld.get_location("Fossil - Choice A", self.player), - self.multiworld.get_location("Fossil - Choice B", self.player)] - for loc in locs: - add_item_rule(loc, lambda i: i.advancement or i.name in self.item_name_groups["Unique"] - or i.name == "Master Ball") + # Place local items in some locations to prevent save-scumming. Also Oak's PC to prevent an "AP Item" from + # entering the player's inventory. + + locs = {self.multiworld.get_location("Fossil - Choice A", self.player), + self.multiworld.get_location("Fossil - Choice B", self.player)} + + if self.multiworld.dexsanity[self.player]: + for mon in ([" ".join(self.multiworld.get_location( + f"Pallet Town - Starter {i}", self.player).item.name.split(" ")[1:]) for i in range(1, 4)] + + [" ".join(self.multiworld.get_location( + f"Fighting Dojo - Gift {i}", self.player).item.name.split(" ")[1:]) for i in range(1, 3)]): + loc = self.multiworld.get_location(f"Pokedex - {mon}", self.player) + if loc.item is None: + locs.add(loc) loc = self.multiworld.get_location("Pallet Town - Player's PC", self.player) if loc.item is None: - locs.append(loc) + locs.add(loc) - for loc in locs: + for loc in sorted(locs): unplaced_items = [] if loc.name in self.multiworld.priority_locations[self.player].value: add_item_rule(loc, lambda i: i.advancement) @@ -262,21 +349,6 @@ class PokemonRedBlueWorld(World): unplaced_items.append(item) self.multiworld.itempool += unplaced_items - intervene = False - test_state = self.multiworld.get_all_state(False) - if not test_state.pokemon_rb_can_surf(self.player) or not test_state.pokemon_rb_can_strength(self.player): - intervene = True - elif self.multiworld.accessibility[self.player].current_key != "minimal": - if not test_state.pokemon_rb_can_cut(self.player) or not test_state.pokemon_rb_can_flash(self.player): - intervene = True - if intervene: - # the way this is handled will be improved significantly in the future when I add options to - # let you choose the exact weights for HM compatibility - logging.warning( - f"HM-compatible Pokémon possibly missing, placing Mew on Route 1 for player {self.player}") - loc = self.multiworld.get_location("Route 1 - Wild Pokemon - 1", self.player) - loc.item = self.create_item("Mew") - def create_regions(self): if self.multiworld.free_fly_location[self.player].value: if self.multiworld.old_man[self.player].value == 0: @@ -317,6 +389,12 @@ class PokemonRedBlueWorld(World): 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") + spoiler_handle.write(f"\n\nPokémon locations ({self.multiworld.player_name[self.player]}):\n\n") + pokemon_locs = [location.name for location in location_data if location.type != "Item"] + for location in self.multiworld.get_locations(self.player): + if location.name in pokemon_locs: + spoiler_handle.write(location.name + ": " + location.item.name + "\n") + def get_filler_item_name(self) -> str: combined_traps = self.multiworld.poison_trap_weight[self.player].value + self.multiworld.fire_trap_weight[self.player].value + self.multiworld.paralyze_trap_weight[self.player].value + self.multiworld.ice_trap_weight[self.player].value @@ -336,6 +414,21 @@ class PokemonRedBlueWorld(World): self.traps += ["Ice Trap"] * self.multiworld.ice_trap_weight[self.player].value return self.multiworld.random.choice(self.traps) + def extend_hint_information(self, hint_data): + if self.multiworld.dexsanity[self.player]: + hint_data[self.player] = {} + mon_locations = {mon: set() for mon in poke_data.pokemon_data.keys()} + for loc in location_data: #self.multiworld.get_locations(self.player): + if loc.type in ["Wild Encounter", "Static Pokemon", "Legendary Pokemon", "Missable Pokemon"]: + mon = self.multiworld.get_location(loc.name, self.player).item.name + if mon.startswith("Static ") or mon.startswith("Missable "): + mon = " ".join(mon.split(" ")[1:]) + mon_locations[mon].add(loc.name.split(" -")[0]) + for mon in mon_locations: + if mon_locations[mon]: + hint_data[self.player][self.multiworld.get_location(f"Pokedex - {mon}", self.player).address] = \ + ", ".join(mon_locations[mon]) + def fill_slot_data(self) -> dict: return { "second_fossil_check_condition": self.multiworld.second_fossil_check_condition[self.player].value, @@ -358,7 +451,8 @@ class PokemonRedBlueWorld(World): "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 + "death_link": self.multiworld.death_link[self.player].value, + "prizesanity": self.multiworld.prizesanity[self.player].value } diff --git a/worlds/pokemon_rb/basepatch_blue.bsdiff4 b/worlds/pokemon_rb/basepatch_blue.bsdiff4 index 6932762f4d5f7374a19b00060fb3614defc9d4cc..6123d714151c7543e02cb834abeb42db32b7f87a 100644 GIT binary patch literal 38871 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 literal 36601 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

D8=XTmlIrNPH?6tWHiJPSn zKOqK|ctBK?8OsjnftTanlh+@jZKS8`Kr z7VS;*&~P03;xm^AE(waKjZm4j%7ub=Aotv;&lvh98A^X>;dyDu+;f5p%I)T1zo~R=kSpVupC8-azD7YGDjz^zrRt#x_q^MtO{hmMN+j zT||?gNwsPK(*wy`mmU*W5C)^=;&1!TRfjCt?Dee4b=3LZefl&d<5DmW zwm#gvpG^0e+0#_xm1F274rshu$88uWKZ$b>d$oXjc1=8(Mf)3e;c9t0rMaHO@$%g} z+>QGByXZJl(Ki<@-SU$;s?6w`c0C|ezk;NOtN^73x`>gtY-?=?ys(0vLvRD#(wO#NORp#xa}95`6>5$c$i)kx)EB z%x4+)o1X>S9H!VVd$ry#wA-JIK;a^%0@+CBI%geDF-U_hJzKWsuVVeV$zZH+IwKsw z+YS#k*@R|5E0QcH;i7Xj=RoN&a1;!g-o?zXtV)rEGwWG}{kROtF(JFJ*7$X>De`t5 zLp|bi+MRurd|m9C?$EylDcC;SFS$<-Hp-ktUxveud5$lS;_YA_f=!e8ecLB}EPPAv zRz?Xz&tq~iwt;bc((7YHTnfM6@BKag3;%7$T>N^72^pgc(T1G%cV4 zNtVVW9RbnI%Vx(4u$^3C7gY4Yp@ez~fgV90m&R%s%8?Slq$5w1$qkdh!17Ri^(H6B zyqOf9QcLAnbfy}nP<;Fom$c1F?k4bG5U*1qn`)>G#2HP5n>!OE2QIbck}=S$rtL%z zZ$KVYK#nb*=Jlv`@IqOxX$uq#ffU2-e;ccOOrj)GsX{Dtav>4rMnvVS!)s;;6isDr zDCcEMdYD6(WjB<1!7?)E)u*T|5I46=Z@w~a1ePa=>smHKt+V#Fy@ItAmStJ zh`ei*HBC=UcdlB+wDP!QLmaDp-N8MX7zf3SK<|!?s(1VnG>;wk@1henE+&gSbC+D( ztBu2;+nuMEqyJ(1@pHh>7C@RQ%{O2N1QIh5foL#TG%>}xtwhAswVYSrQbc(!cg1#V z0HJ46$R?j&_Sr11AXI=g^tx*D$liV|kib zg?2j>bUOM^$K&B+HthkX>gnuJJ1R}Nd`$AuByfikWsjSFqc$=e#Pl49Z^qA6)#|VV z+zbyTSO47K{JAZG?|I$b79nQ#z2#~SL@pu7K#~AD>HAa3bO)hY-t||F z#_@KRhyWEAf(EF7c<5aeI#4oh6p4na8Xn{6HH__BsiR+VL_HcYhPH~8f;^6)Y>;L} zJE#c(p)-d&whl>kb}Zcp0;b~DvO&9a-MO&?9I~J+!4gM5(5)s<2^RN^hHo^SwnJh) z@3}*Bm;BJy0CaY^aLajyA`3u60YYOJH#>pjEr;CwznQM!FogjgKv(xmAb{ygt-{s@ zq6ejb)Ibk?7U(Jp4O~)T06Yc)1;lQBL9fczK;~?1{`6LW%eXEWd=v)Z0fg>ypOiy_ zIzr9ssJ%C@3!VDzNY=V~Q}=YC_FtP31U13Xx%=C|y%6=7jGOsRhorbRX4KU+OGoG@ z7Eig_uf(~OW9ml_4hq1ad^v`mNeOcNU1yZ1A?=q*;`H`0b1=fqyN*7}Mj~kf$Y%rkm zu%^)?HrbeFAb|!AOAOA)eYa&Zdqg*QIV)gkkXfEA)X<{rnC4nBc&A$qr$|>% zCwHrjHckjXcGz_Y@kxyLjat%;LEJmXZD>@BqgD~Yg~IWnf1c1sjU zQ#+=EWY}F(e5RSR#DFNqCz)o+!mI;PR8d8S>0ohUAfs(!%A5UN!;KCKnFcRIFiwqf z%0?Q&ysgzs2ZJcgHXbf`0A8o0xeO2bTrbIumUyfO9C#uwf;sfi z9t#A?2pT{9UC9*TLP9s+!^lEfXgM)KSte6i*h4}T03H(m|NsC0|NsC0|NsC0|NsC0 z|NsC0|NsC0|NsC0|NsC0|KKdYdRJb%?W@c*9vWTR1Kf8v4r@-zx3_CRNe%CE$F$*DHeR5nxe%AS+-Q}rjP-jgWvQ9LKA zZBNwGQJEt^^)xim>K>=4G}CG{dYUn)dWWb6fHViFW}q|%5H$o$CIBWRWNE2}lL@Dw z36Z49>SWn5Pfaw@PYQTx4^v6)CX>x0O(XQu28|}3LTRR&ZB3?##PpgQQKzY)ri}ro zsgTi;pfu5unwl~h2BrcaO#q3AYIcy2GsOQ8&?_4uY->MPAjD)#9%~7gkpAU%!%2b+|nRCXy9-fW_%_Y zYakOD#(Fwgqi^rTB@L3_pn!lf9W5Fm5*ou0Bi5BwOdZ%Lbv7k<4xqxQXA_9*qsE2Y z*3jQsNwJOf??E7tZ@v`9_9(SdXL`^Uos1MRl_Q)NshWi={Dbb)!uo(Bk&jq4-R|=*rg$_LV!3NysO&; zL%6`e0dY|m9$wZRq&>>uolTihTv4txO19f+^d0A3-($==yjOE;>UsN1ICYN=W@*#` zQO&iR_soI8@(uu(Af(=XV9Tea9ohy~*t;1Ps)P$)qa1d-I)L}{@fR{fGQ3?!5-u~FB} zR&{erluoY`A?p=ts;uJkq5?BnREZ?mSi}olG`ZF#(3F+x;f^9lp{7670hp8{pUvZii7X zJ!PB4K9SKDRan8$kiR`8w{$donVbY2;Sq06NSF((Qac&A%5>(Y+1VAVv z5I*D202?DC8iQbv2?&6aP$CilL?qFLlS%i&2W&mGrvs7qwD#DIyih=4?lvjb*te~c zvQ8=ZY_)Hh5)q;3>>%{Yl1ciKD#Mp4v<(y+epe51U!#FlgDs((hnQYyff4^uC0YS; z0sz_|YhI|6bJL691hP*3l(0HsEvxkp4W`3mlh`RvM};7(gv6>SUw0PgO-)V2SvAuH zSRfJG)D;CvB9u~sfeJ_N?^eW)tr56Ej+PrzmaJ`#K(fl2E-2a&Ik-iM50atS!7#U7 z2GY0ScY-U(J?~M>t@m8*t-!}VCD+B`QlTg%uT|>vKUUo>LO${fIvW-auz^pH8lyeC zXxyp-8g&~8U|&+lch||G3o2WHO^p)jC@nUFsjVo&iO3<0>&qMB_Dpb!vKuXsGiA2g zUiO$XsaoZ|(q{%sK_~cnRezU|)^*MOL62LV77`{aQF8P)6X89$*JL)M*l(W@;3ijM z^_szM#%}q=`E(%|g(OdJPoitfRgh6*gCX`xuuO0SVg^}sFtQ!`%+rk~|sP34V>!K3`}M>!cEty2gk=2hRfQhF6U?3Y0{3 zWZ|$GdpwC@W%gwmA|o;Hqxy8f6;myAq9g?q9ATcBmt?Z+q}A_{6h1~7TE+Y@w$X-5zi_L6qgK7n~2+W8CkHSK`jz2Y=lUFp#+^n0b%D93JMcR zR7h35Ri;9M2}y+&2_eFYNiHZ2u|g6`4sy7_rB!cAOD!6f)CvzViD+q%!&*^zD(M4) zQKA8XLMbE?FV#sU7*vuAY69*R6rlvPpeZDR(Nac=qJqK{gdn3zpfsy)3vH-qgd`-@ zQb93QP5mOk(G3DJ&x%7&wyX+W1XE^X8z3-~Kdw+Hk-Zojk;EMi=j(H7ue>OU#yz|5 z!1m{;)Oqf`r{8b3p9EIhLS)UuZiH$i{NWxCNDb8xyOivBD&J+Zzv54;#qztQ*sS=H z67^_ca%bsVYFvPTASC_+r-lJD?6(T%&&#w5i;SXm%7 zV!7pfJBkByI9TK6>Ar;9D+10mIi9;##O6Ebte+osZtdODGn2&CCd@{nx79*3`N?V7 zn&u`Wa~8BpPyFxRc*mo!jMlZf*H!Tjyky!hrHt~{!4s1Z<|#$baHYAzX)9x%&0k@0 zfcoKf90|K7gp?8N@Dh+4NX{I%^Enc%EN>|cT`$SxhQvTsE-2W?yJlUCT0A!PUfPYF z^-#+o5DEwcZ)1@vWi?amb{Y{ei5Ht@cTuB8F=(Z{T77YYz1LiNo;wFpG&M$M@wX5G zjSpIsB|Vl_ib^c$>+jcyao&GxY!{OvSJ&duZQ|B%9+F*+Zm&ENY$JDhGVEaACT-xkw z)I^%Ev8#m~cGqPoqw$iR^+ItN63V8kR5oP)cb=2mx2lg{c%m4{jO+M*7o0=T=5{s_ zd9&*GeP2NA^YMB-ElPSyYZrJ{8Q5A7iQe{D025nxK8_cnnzwyt9z*u!e?d=lBsBWx zdy323uC_!p4JGwXpx2wFz3ov55V%D(RcV}=)-08T_QAp^-f$H@aZJAoWj{BDp%zf4 z6e)rL1%e&6)>SUcehM|LQEkCu`BBrYE{m_Bt=JlvZB|=nbKQC!kBaxZ6}I1dLc6=y zZ7d?V?62xH^>5a-+RCvfQ#QCV%O-|Pecw_C$OdYXicn=A(!^}A6bKq1A|jABN?myX zidp8O;$6P{`K<{O1PC^=5dZ|NAOe*UkT5Gyrwa;up}&XCuL$C9PW|SdX@o0k*{_o( z8qvAs)=r;mOBh%rNJ={?jv=Kv>g=C|_%3T~v=M#H&>?|or!(=?>)0ta>-KhXA&%XX zo(P`JqssPdC>kmPuLdVFA^OSa6sq8ej#T>&9KkjfHEmA`od!Jy##>BxLKBF>7- zVmB6NwxC*vvQ$Vorz3ByV>K#3Ko#nnMlI&naSgu&*YEgaWN?#^ygcux2Bv|7XK^5zelK#Bqh|no=XkuWc!j78k$Xui zr`%{)v5_-an?u2yq$wLaLnJ!GGLk_6 z>S&6{XwYN&wO29W5)?7>|WDxh*h zWp#3Rb7fRDB3DFcg>r}|WrajlaOlS7f&m8Q%~}p_h>ZnOu_Y;J1b8mG#`>pOO6Fn&aLlNvHRg&Hl}IQpYjksHZ-%C(A*-i??^C71 zvvt|&1PSx>R=pIZWMR_~yWc*p?;FFot87>b^h6CxRh8xzK~vk+DXlhhrlb51MCA-e(t! z$bILh2$OqdBqJe?M9%k6YYcOZH9)kDD67zDqV&=(8X9$bO|D+Y8B0p5BaE{p=Ufm3 zNdD~7CR#^^Y#AX}xKhHh5SBTd)a2<{S#{LAdCwpT!uf{g?&)X|jmz6t7~&rG^O zAV0N#o5-E2TWiLw_Bq2O>iA}=j5(Q)C#X%~#88x-vlVU-=e@5&WYEQyT<8odp=MYrFBWEzfd)*EBUv6u7?WBY0<2u13y{XsTKSDDeGH0GS)uFW zCsOAtU9zu-Le`lT>NQ6c4L=PpRO@C>HPqNmCFpB9IM_o#L{Yv)USki_A->i5-m>EJ z`$whfwESL|fqwHq_V~PDnX@rxg+ZMRl8(or@>E7=o3ffRM%f{z@RV9bDu<*ywjuT- zUwdTip%PRHR_~SZeb#`KfY+_j3i?JfyJFu0Zf@$cAOd&})Z~m7b9`LrkwjU;CH*}< zDWK&EQD>&HSu3+^Ah_ZJH$szO{?r{kPEw;g!yuQh3<)mr-0p+cU8hqC+PhSHEh}iMVnGD~BqZuevG$MLplFi|QL5LTe;g#aYeC^vezFWqO#_-#c2=>_>?*z?jSeq5fUZ?lH0Xq1Dbk=zKn37l(3uwg4U3v=20J zB@^&Cr$>cf482p4Au)b>Q8Or>iS5?Hj_@WFIiR-Q0o3(E*;Bj2`zbw|ZKn_A;W*=E zJf<;x?ZALB!&e=?Fo?4FS;P9vo|U2tx`;41m6s;X4`yjdsVR998#?MM;Q(az{(+E_ z4q8Qkwjbh8^p`z0lwlw_#(1i*d_GIR;Df9v8&!Mn@Aq^ljFguH!Un`@xRCZLBw_jQ zN$IxbC?GiF)(5V+Dk|l0vCkqadpgyM>g1E`+}{)gs!%@_u^3g&ePU4iQ*Hb3r;Z$s zzQSyi%og&#aJhpjI5()6C}@Gv0s;Ww00s@L40B1<^+i9|*M2)_#dB(#3!U|IOHHb? z>6GVAe<48Kw<9aPUhH&s)YVA6Kph} zv~EtBUT|f?Py;-cMrfE@4qmUue=SC?X~)G&=()~&JA^>mxw`3C`|!0Gon;j0I|F!s zwthU{hJPx{)5-2RK%{21mumC)AOZKd(znMe>h{TA{H}TQvro^7k!XHKB_`O7jPF{1 zbC)7D4Mx^aZws^KQhVw%?#BN2G~1jBD7V{s-W?xa{%7MmBlV3v%1dhNVVMx>hty3L z&WS)keBXT4k)Hl}PtZbs*F1>bNyubC`dg!-iihu!WzaIF83=cD-l*eMn2sHI3! zr3oskMwvw{Iiv3NIVzqp9y4vc z(t-qXoHj`;e7IjBNKJ-6Zj0a6a=5C8pdwNX3?L5ef`q!Sp_vzji?QT4uEG@Ob z)%kyugAe6f!+G&)Nfj&Zu|U7HNZ+Is0L=TDyg)&u_{!{1o|=+`_6GQ_rHzwOd!owqn<~O2EoI+qYn_vqXQE> zEG10cAu2YU{bP^jPb0l^h10TQq@hlaZviMM#JBgMI`Roz&E@J^SG~Q)QBS*P99Gxg z!^qq5?RmV&^|KHN^#ow_6w>o_8>5ruIX&_KAONzj9edyZUBi)oUj%;~xOv-Is91hN z@*Q?EY090nS?N9Wo^q*qgzP2y-^#kp4XXF?vhe4!+Dhdp5;@hMYwRrJ4ePSsSeCoH zR^nwOS}g#exgG>BM8Cj45zp|3N@UexC7F{rKe>1q9S7dowZ&?e(c$NA0o%<3uMF_e zT)LqPR+?)2*I_59XtcHKp0yxCS0Ccl0kh3^*f z4l<#T<;zpt6t0pX4Vi#`dlq=3W2PA$lK#m|e%SGX{v?3%BM1f<#9@X54H+@yWZPD( zFYcvjcr-nG^?m1C}n!cg=~Deol-z(!l#-PFk&$6a;4^StWm52Sr_BxQkSO}<1t&gcbo_PnPZvuSxo-@qQqlNC82RM@0<+KyZhU75`s$=>*ICd|GEJ zZ&AUiv?%ORg*`v;@wMkOn?g)KssMr;vsSAOQ|T;_wGw7=j*7%tI_ygD|KHgMmI<{A zUNMfJbIwgCi1Lh0_B7rPj;V=XB}0V=*jBA!C4Uy_DpZK`!#7&LXLH{>>@?;@Xlu5& z^rIJ2wsxHilB|4!kZNxAoqKpzmFG65oR1n>k%4l&Q9vE+wl+97Bb^sq6*ZPdR)@Rfb0QVq zOG{%h!-x!Zf;%;4%~<$!|M{W*@4>_bdOD&$n{Czo2_&W|Cz5u3^Mz|b1T^ZE2fTw5^-yd4&r0nu+I z&}Sz?@)1BUDRR|)5%cnvt$}k^ZzDXH+NtH4*!<)jF*8VG>~t72Jxx zM)71alf3%fA?mMbS;IrEG|P54d-#s`pdW*5LH4RLX>gp>nL|*0xOTB+I)RA#=H@>5 zje>xhRVd}HqK{Awz~Qj8rH^HOE?h_9skcIoA$%FVx(Ua7u#!1dc1r`xK0WSjTtL0V zt=~j&+zLJA_q#hw9xe3LUn8+m5$*28a5&I+fAywl&ZOdIqWoz{_!qCf1`3+}$-5Z~ z)~Cpnu>xjRw(kT&0s{uQcSV*@Gm7wcHUE8yZ{(#VDLFN@wQZ}IG4|YvV`@oIjgXLL z(Rl_?6*SLF+m%ZX6O15&-VVcxs>2@ZTwcwK>MiqyxPBlb4Pv_4Utdwgw%y#VL{|;tuf6Uo4RgssU`Z9=;ou-}sAM`Dm zz0*BDjT3J5({#=5b4RPydPO64;>9zI2hU_@^z-Nyr_&P%jHF}G=E;m{){)DS)~2zB z|FfD_U?HzBj*T7<5fP@QkhJfB0j^)rPT}S^5ev}|Abh@^tt?EjODMlD%GK&I;bKE8 z^*0?2F5i}Q>zwUu`UEmg*R&3MpCcGjJC`Hq3f|e; z_&S`a)Yrdnmd@DQ15a~;0eNqNgL%A7(~D*XJX)M*gz*PNJt_NmNIxHb&uY)Dxf|{- ztbWtN{DaCLHrpK&`Sdk9iD+1Um05gtc%u72>2$r?ucT5`r(Rd;sD6Jp=Xf>j%@pz` zE_JPC^cVe12@Zljq**)sFPiQGpE2S8=<=BJJms$VG$28!n6e!K<3c$ z_5HeghU4tdK2DXaaG?58)fMetBDbt!J5EOvP9`u5UB5$Hzv9d_!Gru!qAEg`f8^uO znO|Se^?KVJDr}xp5BGHU})g$q7G1yL=bYX{STIBL{X$r<~Ds*#979)acl2;->aJ*nk~_MIo^aa zT-jurg^YNJ))bQ#;$7DpzSAia8#rTWviAIS(l*ix7cn%EKULpn^YkMo7KfZHy)&rG zhF2Tm^M;k+D0^R``p?Xrz5{o(^{%&0{;XQ=1;&GRXI+N$4S8 zw1I;oR}mgDECD(FAC79nSUUTI4857dhZaZ{}QEp)F^w2`^NB6zBfQq~!c$gxf61E99#x^vWk0R-sn-ttJceSW#iU3|RWfkA*lacd)EYi74+ z@wfAVnK8?d8ZU8@&s7NG5@?0{wsD@~q?dpIDJTimJUzyO6FxPk%ytq)=S#&hS?^)f zGVt6eN(~dJDSSDN<9nLoX$tOfsrfMNcsQOup)C7&e8w`#tWNA$V9Tdgki!tcNC8SU z8?Xvfx{9&`Ec8Ai8D`+W?m$;8CNYGK|7ZJWCP}yw5}nm6dzeeAwU_Vt6xcv2)m6cw z7?=7trf~+CcZ=q)h29&Y7o%i-^b?$$4qOB-GSQOA%hSt1AmX_76riG`hZ}-ddmIgb6SsFBk#=o+bQ6KOmu!_!UX+r`PE=T4BMNsK9`k zc+PAuSL?~XBxK`#qf9^m5E(D-=J4Dv!{#yI@Zt>Vbk;@fIT9@BW`A<~6rZKi=E$DyZm7M3gIlME#`#0qSYs z{U0j2k1tLo50_#3!h%6X1sWhI?UW~?dtC~a4#>kIuQuB=Xx&k*le=Huhpw%s^1Pql zh2$QG!np3XeTE(Yse>1kk;zbbl+xt;V^aw z!ZTs#;sH9i5=gx3#h=^umHe?(arSVb@%6qo+X3qdxD*#DY@_K$|4&1-yZU;c@8JF4 zE07rrzU@UmC6uUbaf62K|A{|&6?m!oYQrbR`I`ZA=<;XW+{Tf0#KFUaPq=<|0H~py)6~k zIVN^KI6DbcZ7ReJ9QYP=bSw+}V;wNJi%EtKMYBGzQj-&b{wciV?KguA>l-oiEdVBsqTb|(=F5Oz?m0032Cj2iy-!c8KZHf-Ha4dzOuL2S z`LL}PMm_5$dF!Gc_chQ7Hyc;03!IB2R3bPQ_jNOt$Pr#$ppaz8rkQx@VypO7T z(vn4;)hBatr?1u&TnbU%-9@J3Lu5G8o-v&03Q*|dFgxFOQ^-N)@%#TzJmhR1&OgqR z`OXAdk?9bClmv~%f1gt3g@=iwpf$F2*Vq^IrZcSGZ|iF^V8mfY)_^hn%tVG*H%zKR zY}+yAGlCY2&wl8})966MJoPXt%_vl>Y_w27O%0WWCwzT&g)Bbk4&n{%oLHb8qQY%0 zFCpbvY70iC7)L4;w8*@g0YG+{*Ff&wQWg%f7V)624Q>rZPkQDJkCJq8>(DqxtP%-c zncY$|CBeqIVJj8|y`^-*Q&R$9mt1zWQ=JD3g8$tl00DGtTsr04Rkq% zr7xITaZ99?l*_VQiMZ_4mvnke@riXEb!UA)$LZ@8EJPe3Et;0vG0P^VOt)0RvYZ_^ zLS(2V4#A-GQPmsZ*7dj%>99b>5)rWhlpZ(HPV-rLFU5jwrj6;()2kJ0x;9$f$wV9D zMnAV?n#M33tl>lcyRd3rtjz?C3P_p9j+>;ZG^d>$h@MWjT@>`+p_ z<#{VeV)AMQC+PBhc1eI?A1g4P>qFF20EzWf?gu3? zp`2Nm^Fy)XEf3$v(A{mS!a5K#Fs%=)+?xxEfCO?8@|7^{0~_yx2H8PX(k+l$5Ubv6 z#kU=dw9OT8tZZ2cNUliClF4>$$wy^Epjb^wagnaDu3j(@-pfs6xP%iSRuKV0!v%$X za;S(&EQsSsqy(0!LxMi1J75ji-)JMOw0HUVuxwVEATG&znRT_Z^RE?KX9o@B#p-?` zyvS~^F_VCP)fKGNS%RpiW@>>R+g{-g&%(NaCFoEvLRq+-Osl+y$P9U^j4ViT691US zeeQ!4uuO<$-Den>Z{T9S{D4+OHdaoBRI}f{wLpL-Kpp~gjT6Eeg)1g@+IQG?)DT&K zbYwAaOQm8r7~o-Q!P$)QrL5RFT)LY=DoxflUOw;Is^Dy%9Ag$>qD0asUj;y;TIfg5 zTuGy)%e}m&764vFptVpIu-6ik8Lpg@D*-Yz)?Nph{a>g*hz~ukVCy(baFUAL`Z2jTU7_ABOyvS zpQ4(tf>z0YYpI7LQ*5?bhmBV5_CIPVEGj)^aBoHetB)9w^cxHx8& ztme38gu||KxyR-kY+;phvft; zQ`~Ma!tEl;6mrX)LZe&@j-@Mmo3lZO#+W`g;?R~H5~MM?}*D05Og^OPF;hnWw7?4tEP-z&z|@*U!L zx}C3cMvUzLMSnrG#-X}ph7}98G153#yWcml)P2;(*D5O@1nQxzn8O4u>yYC1oUWS7 z5ef=YsdfiPr_xclH3%CuC1oIq0#7Zz?{;W3WS{oZHFbQk(d$(!m1KB-drXuZK$+qf zp;yMercCivsB2uHHX|s9BQ1k0rDoyeBsf7psu8Jp%!bEvo@f#YH)1_KOsrzM%XM8< z*bN0NwL=0RK!tV4>xQ$NdATS!wF^0_h9nj64Obf$MRrvJLniC!&5Mh{it(08M25{F zDQ7m!W!e&?2T(Ezs%>j(NMKazS=bxj;aLF_p_) z<44$UtSfg4#2K#YpxW`?Yb;<|lVvl2h^Yuy+;Hr-*6}sjE!7Mxy}YA{RjD#G)izd1 zQBfu4gT*cgdAWLQcjEMZ#)N-&I_1_+#BYWi9v;2*ufw@OCWkrhS=I)>3$A+}Gt_O} zJgNuY5COyc}S7F5K#iWrIvV+^Rgx`1K|qJk3G zkd^L0dnDx3H88pKnB1HAKcIW3ehmP<-cH3#$_SJ>yz9Xbc}kVxzRujUBDMh!(-A^~ zl`eCt5PDX;&(HfXa7W_g&Z)AOD<-%i4v47eEDV+)3#UJ?O~f4a4WyCQ#yn(MWLiKN zVT07IbijlAKWfY8SgUR!RQbbUly#-Vk1j9t{N0pi`5*Zoi@&?2iP{gFFVM;0HQ!a; z;gGKdB%${#P{2tDLa0>X7YhUhK`bj?R1yg(h*-sSQ9(kd)~ww$(TJ&9X|*3Ap%S6J z5+&)PUEW;qedC%FT=70R<=02XpXO_7Y7j{^hIMnZu&L^KzOy>sB>Qb`<9#h@<7_gg zz1Lw5m$)O!-vmM7<9)xinw{HyI4gK|Ip=2=8J9zqV0?m#9VXkZFciAQwr$M~&G6I> z4>gQ|QmasKHl-16_ujwg%g7GHP(= z-AvBKYoTwuq5O9o&ygdmoAfp*6rf>@S+eaKX#$WYEiV&y%<>|+gOtcYrquSE(Ze&l0hS)3IzlLK`1nB zdZ>Yn<$$FIL}}LBSqYU5g5&7+$UHkAss_(t%8{aNA>B#EakOn*v1a#3ra+48y>+eh zJNM!j1jtN?i_Z^NKVg9IPG@-Z&x*TV(>a5CmV`E%c1^4yRj#z@C~AGO?uXGu9s^lo zkSe=@25pw;q^|(Fz9BRr3cDPvqY1#8^*ZLT6d*iSGIBcCADg`$fcJXvt{pSdbf+`5 z;K=k?Av-@OVSn!J$GKpsZMnUcf3)W~{LJqj9D*B{1ilg-_<$3JU6CUJIPiCEB=5t$Qbq13jDu`rF(D1t&i* zy**h6*!bo67w;PlrZ}AcaP4gQKJ`*w)c2idvC;RPof;DgPv_|(AolkyP~vGQ;97g0 zb3=ko-ABX+2IA<++3guM&;xU4ufp05R3;u`V+67TF#Hbi2jT1DHlD6ki)5^UHqt4P zoRozr4p~~TlQkvBl!Ce4QvHBAqV?KG&ypn!vNuqAXB>ncB3NEA=zAZ;-2G)ip@3sS zlg*<|0oe!$E>9uCb!2ZL9wc0{(5HaxLzKZ#erF#>RH+dM}VGbzc)OVA<`Y2J zd~nmp`~3gwmpikA26s`DymYV*k0_`Q_Dg`f$IBdH#GZtC<3enA_dY55>iY5<8S5$h z?bvSoE&}QjD!M6wdGW!ak}Rg#HCDls225H`v})0zMirE2Lmr(>@%(BZt%I26q&j-Gbs$w43_R0jFM@k#gv+D_vUTJ+?>*x zsV6ZbA=ak_Gba?riepJk#+ThFqKhd*d*8L;H?p9z%Pg^#RaX{W71v%;>)gqdvg=G) zX^XD9vzKMZCb{)I-Q8vwVO3UH)%WZ$y~_+rVTILQb{Ju5)tYIFwE5o}jY@9QsdqMO zvK+l@BOI=6LeR-*Ms(`GW$N+~gAmtAF6S!HG`bum<_Dy+%wwB-J> zr~2!B|9^X=>aP5IUmEx8^ULVglc2lN$+;MjnRi>I&tT<}FkGcF$-R3S2=`rPed;IlWkDB&Mza!go?RR(a zoe?<%mPp56U2P7`hspEmG35GcVGWakV?Nt;rGq{fCuLFfO;uNAHw4r4aVUEeZW zZ8w6{-#NG!)tI=a5;hIRbI4Le*XMQCxr++^RLnmq>rvJ6GH z#;564Krd>!w(HCL=<-UiQ0LeHONiE?T*9r||{XK;RT%FZQ@?UMxb%^oZ zE%aA0V%3tL2#OAp@mOO6HE+bWg76c!pK!4$)_P79oC(uFphN{;9=Q67#Kwk6q!PRE z$H_(`c=+=FRFlg5!q)A!bU)UUDnFWZ>klp?`#O|@R;XVPxLpK!rWRKs{2^x`4@h#a ze9!yqCyXwp#U@D`;>!clqnSA*w+tIOBmBmMvYCiNNG6JiGk14yKE|016^DuanOoZQ zT|vYMj9O3Aawz9tes_a(j(?|X?Pk~o0hU*@7>}3}GkBEF;GvdldK07wy^`4{0h!Er zt+;e^U`=L2UDfjsNdu>U`|Z;2)xPXZPQ2G}CIdB>j0o{!w&d00{tIt9Q_tLj94ta1 z2t_$RIYfA_Fi9dg4K<9$pmeZXU0ZEE2e|tO_K^pe2i~Xw2XI0M6T>0#Xx!@e4_@f8 z65;Zc)dUn@+^0{Km*ICFtGk-HP*j|lYEYh}8GMN)$mq%Rrx1py;fZ>tMvGnJEEFYY za?nBVdH463QC7>Yjry10+G6lE-e%;ka9GOq)uUI8ib9O<5_d0&+Wz)_A0pR)pEIWj zBuEwGE(9C-1z>fZR9@RtCo<(a-QBZgWgQahcoqR9V0uaR{L5ayL{Y!m`tvwFV+Y>u zi`1Zmry`F_@{Xs(DGR_Uv3!vV_S7h0{FEb>3tuMxP){!uQJ5KJ_=RkCQrQ3BOv1IG zE+q9Hi;n%p9?w_hUu9nS67NO!U0sInzzH=eQz(ALhe@wk??4ZdQ4{RBgG5-zr!Ru; znGxX)dL6V?LP8P&1d>=g5}sXKL_FdbYZVHY@wRne(WN0A2SlOOWt%&F*9ETdQThAW z2lM}r>>vW4r9ynoT$ai@X6r9EyTUW)p;)Jc<)T}-O+m|P5Xfw8_v#-uZwGas*T{?d zFWvIWKZ**TH-qp$;|3lkoiW4rb~Bw#=I8F;OoT9ZF$R=FMlRn z6_KF-N`<@N>gioeB<2oz1#-K++!WHlbq$+)#D+8HBQwfNcmq^A_g#CReFdX?l4{ZOHc3doj5)9w(Hl z1%q8FDnRpQhrh-2Ok#4qfL*@ zB^0K6`%SjhReh(_)F#1Q%SFoT`PVLF&#QJow=%-TL2FB z-~Uf~{`*(-{rT^=_q~0j?b=vwFtWZMWUC(lfWgKoeH2!Epi`scCSCq~9*1Xck3?dQ zsU`vPj^P?NzlY(%RO4m`a|#s{#3SUEib2unGRkKZh%&i=^1(<8rI|!@nbzlAn97wE ze~XvbW4MJfIh5del3=~VO09#ed6JeNGCryBFlJg)BrOjwZPMkITQ}Q?s*0-HgE5sw z)yFZV9}$*R@~wbkEffVUTuaLoW#uqM;CTeFhT30oEBWY(7qth4O8<%$;)*lGa&&<8 zxyiqIpObh8cn6?`1%voY1VNn#Snh7x1ThY~LDIL0GksZ9TJ zOyx%|?|_HkWr`v?YANtSX$%Q)dFk_cCc=EczmEBFwBThRT`)ILDlAw6%muWuJ_r5B zA^-rC0RON2=jeaE{8t57{S!Eu#bp(*`7rTT=75I`z(W3iy5|2)u{10IVEte1KP>=~ ze?x(8>h7tA=O8tCT1M6Nj8F>${M8nc&I`OINoGbteg<`-Rh%E4Z#i}vvba4%P3#;H zN!K1-BbW#)3H1&Un}=5o&KLNI%48N#|Lsm1%6OhyZhC}-cPhmx;nI&n$B#45>b)fE ztC1#lGYdPRjo;ZbTHXFiowx@ym!TK?%1j?O2zhfK%(-1=v&^wJFjQ3l&eSB(kH??k z@po=>C-FDFTWX4Q98tXbkM30a=M+p)@Hykw+$ z?2^}!`>3c>hpZ`*zykWm7y#C;TZQ!10#|VL)^W1Cum&K(A#dPg`vXNiPd{6YhKU9wD>BLYTi`-3R=9+D!uH)t~&`vieelDW4m()s1M%1k(wgA3|YL{-yPrD%2cYk&{&O$%O zj-W1`qig(VaZ$@Gpz}fDeNy7AyMD0o*4;p37hPCyWvXD zpF+fl>fBSmVu<4FV5*JBx4C<;Dw4j_@xa4j)s1T2?KUPme$H$CqrJaqwm)^W;HA5^ znUc^}(cqHiQaNw6i-ko7rWPaFky~51+EU9s%SH%lu+cOuw2lEkmy$Gj`Cwl!QsNJb zT)n_?j_=74kdF#)s^kRICeuAXOYo9d2@jYoz_RW3a1ut^%5wTBNQR}n!CrwYTv4uV zX0KW5=k|uCB%mcZqA+`~tH4n!vL8ykHf0k{%fE#Ps`IoqD9FF(e9YPIz_-l#>^Q`e zxb!u}`9)5c+g%fiZX)j<4ZVrqPmu|axE1IOtjI`g?Y|s`qmCITXjO_uhv&~|y*_bS zw?Gw`gK_+cSi|L`KyOnPiDXX?S8Hn-S`81ucb|!vdswtO_*>rWY`Ps{uIplZ(ieb( zuUC`Ouz4c06sPQ*Ez5m`O2DR>pXJ}39wEBqJZ@=CqP&)+L*Y{MkKeBDh(}1Nil@;4 zKTOlzgazR31H(Al6y`MEaVKTH3epX79YQ03ia7E@ZNVvNENZ0jw85Q-Q)_nBpdvbl-3A%RV3pxSwA4 zEZ?D{Z_o{4Wik4ic&)W43cTYb5vG-WsbBv#IeF=DzJ`{c#Vkdx9M$$UOEFb%LPx*w zn>AI}^Hc7RqQSDhI`fXfKjNJ58@Qi{M{M7J`r0WK)Pq@u6(MdPg^y(-5*Xt8Bt*PI z^!3RUk#iD5B>F)MRU_M#q)s8wL9?lq7DvS*ji7Wh96_g;5(a8YWQ_3F-XzF@LHOuHsVrXS_cvpCWEH*%Scz}$JmCiy zTlzzyLpp1n5R3?r2=A9LKxQoAgk zJO5v1I{heWyO4w9$pT3Vnjy|qFcdBlU67kWn*K>+cCunT_+%^OkC45Crgef7>QAB~ z*nK$lpfiEXxvXVZ&n2ZVv4F}YoP@K3it){&D7S8n=kv-ocdcU3a3E16q&Rd(TK`#Q z%|O0bS52Y)mWZBWUr%-NID{D))6C}b8rngeW@QAyJ2P0e{q3yh+fr%HdB6cQL393+ zNeLLC6^Lx41q3H~G2{{dxE+iz6u)a+EPYEz2@@&%=DYgh8DCz*nH=H6YPd7mU6T{D zKA*+_;e$bvEsWh}v$ktvVP1LuysEQJbVD|RRX4zu$FM_2tExiHn=P0*^rzQrxG0yf zXP}Z=)#Xq>0aa#6R|_aSrgLlPwl@`Cte8@LsK|4DG=5Xn!|$sL&~N>e!vphk<-p&6Yo)L?kfG`KDSn*)b_)hbEgU6Iz7MIo^sPTY!h#Ud zVeMVpFJnlA{w1n3q+wsKcd?>AsK=`aQh6NLKNXBj6_4^QqV%^-ERM z?5DWqB#(GMRkDQsx}qyoz0JilK+n`l^CGBbDuhidRT1rJaT<1E^(Nia<*T+x@4>8J z8SAGi{+N~R6gu^e8|5Fz@9bQq$NP5HQ!J9FRyF!}B+ERI5f^=VdjGXRrt(BLE*_$9 zk^R~9l=+=%RrlN1Z&}TfenU$=t~I>19@m+h3ME8*@eZP4e_cd|KG&sdVzCCsX=Qu@ zj21B@_h`utZ2Nj|+kCIO7(8qNiSfA^^Yz1O9i);s2>cJ7X&v-Vp#s zFp6|f^JZI)ks%vz4YvBzcu=)Z@5~kJ2@k;Ctyhoa`f{!Yrlnk&TfCep0RBIh1i_n; z!aoQMn0;97_U*bU<4D^f|GD!OQz0PPXvX4PMTb-fmUbrOQfPsZv+Z<$zw#_U?(F7e&v{g|0QM zC25d+01THoP@D+6G}8)h327ps&=?)XAFnibiOZTNLP%ag?V&%0TWKPN>s>yBj=rL- zwCr4o@d{p4)oL@htm5o|v3`YOMHqKUL1_hZUgfxSIamP+76}#>or^BLtRkXxfoqVx zthC}aw=6}NGnbpwJJUNu81Erh<=kpO7>)!TFpdsWR?g}D4^0az{0HTm&oBIA6`AHF zXjItp3P5pdB^!z5g;Qab)4@2IGhwNWilXItiz2CLx?md;u169~X~2?%SU#7z)%<@! z_Dbyyd7FxK_ zY|t_RfJeYMiT6L+A}kdH6#Iwx|Cs@TFqNrfB|pb-Dlt&ocxPrUer|!gkHZRwhPNou z$(JQmG)L0~49`$6n-7oX12B~VXbOmhz~y;#5_3+3OoU7mAb5NjAx?oZpJo|K$-xD; zphS{EU#f=UqlS~0>|J(t%Ge?*n>(2c!Ibv2R-&&Uv9I(}QaJ!UQe^&PK#vGwXCziI z`3Nx-`Hw&_3FZpSxpx3U;JFns(&w8LEh^y9-@coz3$_%w9K^0)??!c5nD6ecM=OmY znMiarSjvHa=R{z!_*V7fzXewgin5G0>$BWqXcw*og=x^lhpJRYvLoA!Y|a48xolR4 zdG_<}8?69?m|J6UAl5ZO#4n6lH(Rz_zH?t6am$&rx zXfGdua`VseUh;r-ZcP5?e|=AwT_I<27p5loT+9O4n57*!il3mrs0F{T-5VeVe;u@y zp(=!dULsH(%%G3Nybs$9Hff00+8+=Xbq8XQ0-<0XswOfY!o5fr94&p+UeYExEpSR0>9Xyd8&w z^hu**aCd(|K)e%@-|=`51z9%Vz$DT;T1M2$%5Oe+8XV6Y2n-#2G(A#IHI=k~wHBT$ z)||Fd#b>D^gYyY#kjv*cQM`eOdHj+<$qf752TqX!Pw#$e4Pin5t9EVpPjB71o&r9% zp@{ZT?o+2mZ=3mfbb`T%L`b}p(vBFPl}(3b4&mtOfWS+n0A4)pDyWY~ zv_L{EcE|-c3xsw*fyJANRojKc2fq{bxG=gQ3vs_ZJA|~o4|h0JuKWhF+AV|{k_NHL z6Z<8Kp>(p4dG5JFcsmHiM*MAL@^kA%?awq_X6%=s%E3v}m=|FG$m5%|EHz!C4B34Z z5<^w(&#e2#cz$}G0thBTGzbnW$n@Pn>Dj*-(v*iFQzWrniw#R{ZD6b#h>B+$YL>aF zjakbav(+B5Epr`ln-rMY?Xt==$y$@q2N+|kcwjsCrg)uI!@)I@vj{B3kkK^e(BVR0 z(u6r)=Ew|B9FD=l#Kdc%H#Mbo!VYUn?DBVTp(fJF^AnS>839W>w6pYxhr)Lhi}!O& zxEK6@B-;+a9?ga>pY`nvOaO3Z`<;npW}Hr3D&9Rb->`X@N(Z?-ESqhL)t>p^_tBJX zCJwfsTx91gy%#dw(rCRqfg z#=vkvrqK(&P2d7PsD1pAXhC_CS^W(&&LiQ5%Zm-IhOOvT*em7(T~6s>R>8&>5c;xx z50bRFYdn15yk{RgLZ%eX-JHfBIs#;NWky-HAyhsy;>3VtVk7b;=|AFy{xrkfHXQ(F zj3_Fvd3inG6Eyq46b(&`2kTt%^M)rPsVLg}v=gpF#O+#=)p=Mr#&rBD8Usec=iwJe z6?is+g%@GR$k&K{6{=6V%2H(0Vr-Ubj)6Sd8cVs85b(W})S*EHc-3)l@~G2FJ@VN$OD>Jo1$)tSR*cspn8xaytV`B}3&d{CLYP@t~;lsYMQa_m`m zKrzMV@zq`U8J`da2Jm%~lY znOJyvMKuzsTSNJhW)uoD^eC?Oa32S9+t;n)BAEcZYP0K_0l8l#>ce+rT}-3~tsTfX ze1WXR#KK)#_>u7h%ll5SIcLumOGOf+42VuG#|P5D%9r}_sLpfxn@8Ia8aMODRAihB zEN}wRvp5qk=bSx{r}7!`CS_e@SqPN4$jU1tbd~x8y5Ho_Rya%2d)9pQid}7@TD`Ik z>Qd^~fIidr(-E6Y_KFxllB{|{} zM`EA(X!_|+GsP_`*&e9NGD@kO+P~<~d4uyLSosb%`l>7~`0Tho7vl&sY~22yVy<{Z z#)^So%njTvX}4$#XGRO8IGjw!Q>FUYu3;<&FPl*ZqbY+_PQbvC8Stx;Yq0;4@?o3B zy6Ro%W4h%-PDrN(=Z`Uj*-F;pV$-vdWiU3TJD;14uQcjCJ=)~56a$#72Q?w$2^GDQ zkihSQmV0G+0z*YCiu&!AK`QTDW{UL3fHg7kFbw^CzlJBxg%fBrAoJF>{h-{0!s{|B z$4qB?U?|a=Zj6p6>C}&oy)aZqNKdayRBX8eGc?y};pVO+y4+&MN&LqELP2b~$yHH` z9SN!fEr!@9qp5`XsKZBVjqDG#o?v2!v_N6-;YDNH9l1ozbA8EeSr}#Dl7CF%Xt%=I zt57D}$kv1FP`p+`le|qAFD!^mmWE5VKZSbMZcj;BDRd|h8e$#0f+i78Vw(BKtFrMN;PyW95u`X6)o zFNV5f%!>~?q0t+c*4Xt58R`|BWRsV_BWFO$4C9vLcVwLL-3bYm;z9<4f%KZAe%e#A zk&60?C58?sFxGCgcVC)V?c;zhCAq2hUXUKoQB{1=0_ryW1Dbx$Sg+|A<69|ebI3AJ z(JJmt6+Phjp&bA7-A!=*1$4ArY{zk-1%H9Tikr4m&?Q=%e1BQ*_kC1jHR5cF|M2Xz z9pSzk@vx%uviqg?D9WB*A$1K!EJ0=@t2*Cqk3}uf!a=(fGmtc`nzip_4-GeKF`0=g zGn+>#2&>$HBIqC&mM560POZH`5DAsr@F}iAd4Ov~a2Pe^QGP^<$}BKZ^$FJzN+->b zz$8vgmEHuDT-N(2YR1!9CZMh*Aeo}0)gRwnlARwby>uW9995YN^w*~bX$W?hZM49p z5swSN4m10(Dg?P@QRzYT_jdh(q6Lxi2qAhxf zcRr{|;z^yd6qDk>NlTN+-X|-B6ulhV=v~nLKoir|t=Y$_ACJI>3bQiHrp$BPxQ+tK z>Vj^+8_B#B6@=r!@f^<~9BbgN^#o=USvL;si>{ia>%aLUCN95F#M}>2{J6<20$vbu z&4datRhqDP+1Tykli1dzrga?=OJu?nL|BOkXKXYCG+_*iT`>?2-c2Nb3a3UEORjQ) zgTR^*WJ0@jrm(h`tjOM{54Twh)qkxYHFC-&Cyas0i(Rul5_EpMMU1$OJDVF(V>orI4An5q@f-nc8 z%ucErN`D$PW6ki6r|w)!niujbWr~rDETv})ldFjA2k*jh6X?xzZrrW&7g?}|1EL+v zvHEghvW-ZiBHOx0Y^u2ONz+*YmThH$c=vr6U~-zuf-j%HGw=&_4DmL?NjDoZ83x>l zUczIPY>HiZVM+|eM^kU;Xbw3veyTg$0>0*>-dVQ%8XN?V0X}UU+KkP@L|SUz-262L z4vCC~WMzz4S+aQuA%qG?O|8EOD(+Z<;Ez{x(B7UIP$$I4*+$s4k?i#c-%6^xekHf< zS8F#$NwORxhdSAo4S3>)q(JzBOpMTecTQ?N22+!-)8)>vc<$&~%Ej z&y?~w$tI#%OXt^*#z|C7r)x~rg1>*AAlc($tVXPPm5~+mGm;-SX-9BtgvDInMX$=O zX%UN$kx{2~!SY0pT*z#Q&wXt9r$Y*Bxaj9cv1Whiq9;c)^QgvV5IVcD(A;HLJz|9< za<DTe>bZ>cZ)nILsI)D)L4An zSzZa*xm}PE!A!tF>Yw4orRCy1@YH|KK)1)b4sj`njO`68}Va( za*Qoq>fQKiVCHl$yf4%(1dqQH9_InCh~?C{~UkhQaw7 z-Q<)nNZA&3)-%VAi@yMsgCA^T`3{gB73b;&kyQZleCB0%=Q+70;gLaa)|6p zBYPM{c8je z=&VAz?EP(5vpkD)$!75p^mOYKW4J*NxVG8=^5?HD#|5IlX(<8`Qd4^lu&UXyCcAU0 zrrS*UoE7&?>>KXcvTYw=S;fX09i*y0YhofS8F?~yU2ty5NT{Cbf4cgJUmCm=PWFf_ za;EOytW*LWRaa>n@tIrua`q!a){&xC%lgUv3u4JEhZct2(KQrG-Dk(|*laJ|)1j48 z8b#=ZMjasQfaSuSEMM%|K^e;Dx@1J)Q@}*W_oYbRQoDZcisSjY#KE%d#PpR*PXKK8 zF|rnYPw<(N&FY1JB^U$X+0{I=`oa#7f%GhGdDjAes^772%P7j??Ph;wql-UESEQhQ zXIVk-?5g*`8o4O;6ey;lW7y2*0Lw>;dLESCqJ32cea%>48CS*6)tb^$5^923JhSE+ z?f8Xv@CiV|5Qqe8aX+yenZh8)6hVfmWB8_=UGGS|J8`gzAUa%s&Tsh>MXF( zV)^W9=fCj!?uItZIOiXVImJE`vgf0t%t8-~@KvDT-x6@&7%Ao9lXAkRjR_%>GZ{z$J0hkkCY29*Ro1*N2ccn4zGw{5pKX z0k8y|*@GC4%^@N242u3W05GTGOCk=! zpXw+AaT!oagkUr*B76KrGu_FcykzEg3(5r_kDgKl?zq~)B?L7z(|T=G6o~p^BEYq~ ztf(u0!S697844aQ7B}2zeL&c1waO~P%g(S}{4)!1u&o@4*-1t!z(O- zT!%0Nxcv(XtBG3D3K>fceY_pQdQ3lybDf>cGr`s2s+egRG}*Dz+%3;`V_b=N!-l$U z1A!y)i_%`J6TFZ>ZP<{k?N*|36bWPwJ$oBQ9aB}sU3E#r$9lCW)h1^}HWL+zV7f%f z!1@YaD=EoUtV+H?j?jQ{Wf>^RbU%0IxKn1yRuRpR^p(6~o)cwQx_vzg{}*lOAQLK{ zm}8{xxeHX|L%!Xa-J(}C<+U`YE2k3{BUOTQaYfxq>%BtF)ACroH472Vf(A-IZ&Q<1 zc{pCTRU?$Cypg3$Mv*8qXpjS zN|H3LgDr&*`WgD`PQXp0De3%HgDvt1%w{d!C$-o}Zn^S$JUqu%M&Odk7f!2>I#CUmy3Nr1gqD_l(=Ob`E*E{z;!UIOn80T?OdZg^QrZBnpMo>v{Wf0?D z32urP|Av!5YXdets>kNlMXoQ^fJw=2HYWn*-(zb~&YU2S=<18eS(uLw#Yv!l{X`bf ztH7`RG9^b2R#V6e9g3gtoIv*UWy7EG_uh2gHG zGFPfYNvT7ZU_NDUrkbS&gOc$H(*e&FzVWW~k?rXAouT0@58@iDPUYeWle2{__@$kZ zkZYP^PMlP{Mcu~lsC$cMBDE-lRYi0p;RG5fDe!?Kbg$`L6w!D%2w29(=SPdN#IbrB zNn+96rD`eYfmpNwB*^vOfgvFZ+wij566Y5@HGnA_Go%t8O9ONm01z3~M44A0TV9|G z^Z<4KrBW|{guKlWo#LL3E)|Z66>?d)C&Cy$HC=Y-OG8#U4YRj{iin`mE zp(};UD5#;KOHRQyLB17YB_Q*owSOWLM&sjg(gRU`?5CRX11c2635!bv{T8@sr;DUX zG`^x(%hiYv>}w-wW)uO!&`}F~kwbU@9u=z?Rq!A+%%(JE$EOak2_~e$~AjnZ; zRcWMMRTwRV(awkU;9M^-j^mSjr&d^H0P=tfD9VjA;0}wPd4UpDF}ChqcrfnKtl&OONW=LYoW5t?5lm>&~WfX?705wY&TTESu&!lZ?xZ7gBRxMi|S ze(&Bp7?AcpC~iI^$De0X3x%JP?LtO&$La#)#xXxUaozh%v(zJ-AdSFF4+kbK`!)|? z)S*aZREK24<^67zF6_sHGsmN%ibC(~XjI@3m#k){?=g1EH=~G@F57tA;Hri(u0+Wn zhEFgq5GVrXmgDUdZVl8y%Rlm=eoYnyrCeh1DlThq^McsW=t`ELYu`f8h z*JQ(>ENQFJjUS=^)+6@oDamUrb;A%9oef>(H1Y9qeQ&bAf2g(&i}xT0p(Ro8!#1 z^MJapXBzg@2$P~mPSuEEvoaJ$`9Z?1XU5GT!m&tc=!3RHRczn1SAy)y)Mk7>B3zcUe&4 zC*TPrwR0&iuWoO(u*Bd3*+H<{Ay~@ETjml`Lz~|aAG|Yq+qS0rlAgQ1_FaBk?Th&J zmwtc$w$JEKJL!!3TgSAbmFKBi87ceS0*z;Tda`G5_{xic(dyE}-?W+sVLwd5i2J_x z-N(MD<7IJOTTBx+t!Z#dY4x2gpG`@{wlBB zjGaYn!1wwV)9%lw>~SsaGi+}%PVph>n({b4Pb%+$Qa%inJX50e2CKWTc3+^`BykgtxhK^00TOU)UgSMkMob05e!;7K#eLU!X_vWZBb|0N~*pfPf z%oEI!71$FYUl;~Y%j3v#eY=ZQc>*X$l5nPyGm0}=)H2s%*W6q!8yvEFw-vUU7|sRH zPsN$EJ9R5FN4C?ZFrg>Dh-;dUlHo*lhqD%KiQmz~-j zrJY}4s)*128o9mKo+*R$oLMC(8w!+GI3ds~%gB<-Id+z`6BFYhIe`zU8zckJU~vob z1T20#NLkWWSRH1=2FRk7-T|bwrv#sbo2;YID>}522o@~8bX?h}a#?K$f2S{Z9kgq{ zhijOH8_XUEAxr>UI%7_FGSl7c5E}XwmDHl?-t}eXCuXvLFE3+QWyLQVU+9lIS9|`Q zv(=p&8taowfg-Y?bKM|@PvHgMt@S-6qutGIBsr3$qZxgey8Yp|)n0`jeELENhfegQ zT}{mU{f@4NrW;-QceNMXxm!P>Ck!J}z8P@tT7cwy8{SJku~>C^NG73SbvmJ)tOW;+ zp=p2By{VFYh-rVxKv-s8ZBm<$**_>JdgG7jQ7?}`;*j;bQ+XZAD_;yQ_+FdQdhjg& z;h{9;@R@0fhrm)I)`~nE!?>fzkvBS*qC~xNAH(nfvx`0}8LviU1S*nhadeVZF#ot|xe}69*8>ycZ^JGU zc~tvk6&Tg5UFB$`H|U?zUzWKF>FH`cI=5=|Jb1sUmu>Ez{g~|_qec+4;`r|Q^OI(5 zj7p2pOdOeV4ZAqF6AX&2PpyPgP42`X6z>-P?6QjMs#sjFcex4^saem1HW^>+#GS$E z(YDcB!T)rZt#({DxUUdUAQxI2})Mdew zXe@50u_5M$kyfTdIlNy20Fuhkeo1va1;Z^M4hfhNC?7N}aZr(J7bXt)ckeK4Mn-Z1 zIm-7ABf}-gGHN3vWvc@LhXZ^Y+FUJ+R*h1eIN)LP+jShcJ@Z5fS+D9qX)2Tk;~+-f z0)sPqJlJSRplb2(ZTu2CH=Jxgb191so!)BTXM9@e0z5rzX}$}!rN!DM&+2R>fAPC~-WQ<-C|i03FHEK){WRaznb4HlfhP^frW5>!Y9 z>gePb5k$hhAnFZe2?;##-rZx<3%w!LhZsgFNp1xpJ3)&NH4#^2dRf@g%1Vu6EH368$h3R(%WPH?3;evE@cXFmU)+)wHZLOC; zc~+E=aJ^jGiBv$CwEY)&=Jb3V$*jwdBdEmiPE!w9eDt5t25)|zK}XS!xA5_4(wV5l zsbn|^JbDrINlmMTJjkVFeiWcD`4!=)4l0_{U}Jc6{#p~uil@6FUKGNKq#mqdJBeDs6~N1HW?;H)hO;9Gj3iQh_*Ol# zJdC`yX_C31pf=(tm|3vAvfnfUryhwx+FyZ2*aCr({!BUTU6|s zX|+j&7&AlCVehXiH49gI<(xLoJR*xhrQ#x66oJj67zwyEHpxZt>G!S^nvnDcDyCZ6 z&3S8Q*aT8J4Q4!K0UZ<$a}nm@)Jj^)VC2UI+|j}L?a;dl`f^r|M&9m>&g3ZmCNd16 z!^NiE;wz^<5t_Uh^OWNi;5XP+GXU3w@E?u9V%Ub23feE=NNSY8n|1dLgtsp`nO@^>wETTYS;~x@d^?Ci^!07m# z@a81*Bza-HMEomS=}Lw|5HmJ$`&SnBDTqExdJwyD7!%V<08}!Fp@^XC7PfHw3+(tP znhvP47(dY7G>i*PhN%(*mNi24P<9y_T0^M{MIl{d`DuTAUeH9@5ppim#kTTE+r>n| zS8 z$evJlw=;Lu5sNhmgTQIGqBYB?P!&g;>DD(Fu2#aYB=Hnfqu?`58q{uZV=Hjzi5Xkx z#!YP#boYLMvg=OSPid28A~k+Ykc8bO4yb_V`C^>fUmXb= zfJo6Seq6()Z7q;m4Q-xo!mrTW(p=GRT^y0rM2bq#W!E!NCtyZoo%#}?5y?;<0dI<6 z!QrBi0fECNklKPLU{S#j%BM}7{>-4lkunNoZ-Gdvw`MjISXYr``Z(0La!8Uan=dMu zH-L(Dnov-AI_!p(AsXvnaulv~P{tK_?|5Q=Btjb*2~erdLbWHL>Yx1L)7f=E4Z$$* z;7BTLQ>yVG8X|d*pa@RNxC>>De;f}pa$G|sr-jZk{YSI{cUJt~*%ph)N0t6(!?QeU zKH(Lc$Z$MSl-a+e=*d1%eB==kApM7r@7^S>2uJQOnkJJ`v?kj!C{YB2s6pV$3DrjM z>vlZ{2x`WJK%>ny#b+NCSJz>J`Oco6 z=wM>O$5#kqK#Brc)0*ehw-O+ORFY&Kaz~Ra5*CXS?E)nF>_ElZ^`L2%fMSq1PGHmp zC%Dtnu%x&knlBQ)T|F?gnGq!#1ihAFhJc$+_B3G5q=0cs2}*Iwn*uN8!g;s$rN9g2Q${aD~{Nm-SZWSP=+#G?*+m zJIsoP4z)QDEOPR^G$r;sdcLl#S=z+IBqVVf=t)oV=dgSX={8LuNAIJp7|Ln!QABD# z@5Gc8en`8N_gQ&CpR(EH@{iJ&MHi;EoR5|mTH7zm&%k=)?lE4WtN)rZHEe=?xtcy3 zKIY%Vp%kbTv^;tVG}b_qWoUbC7EIv2+OaZZAAz(;jTHd<}XSWS!%Zy9GXxYecjyIyVZ;2DRKv#Bm2fPC%j<*~nhVvq+{3Y03)fp5g(6nz*rh6pH{Das% zNP6u*VmKGvmgL|V8e_7MPh!3gfbw8jeHAWMxo5}vdP(M83f~otIh3YQ5i2hGNr<=F zLpA9Hw2nu-kA+Y`T{KK_gX{OnxTCRlKr=Or(ZTFnQ^T`&~LINw-vG06lM~_iz9k#`68NRx^nYWa(^ycG) z&jJpHs`)5kbuNl5d&q8P-F3ObdofQ9hZluz2S6h00)9ohXX=_;@d?tkyXznE&>+`s1s zafndVO4$Gt3ml!^MG{$8f7q$1qYgg+tjsLKK(s^&?<_)fHe(8ZyF^j9ekC2H`Mvll z&24&bdH*FmKm8roapK!oQ~&7Gcl~QGI7{O2_)WO=Xrf7i?HlRAm2-Dwlo zdBd;I_@tAih0$wcxwMX)d&Jo2!{e#Ce{!@Lc(|6fzda?#Tc=@aZ06w3#nIAOSG+DL zbGtHMlDm19&SRdTS}TpsPd`*qp)l7~Yf{;WCPa&mF)~osdtlnQH=$xQ-jQJINdaZW zL*k7{i=%exx7T<7lsz5R;$cte^?W!Iq3LOS8q27c-f=a{bIQtONI0G$|b?I+Lt~RWqOt*@=0t^nZ9p(;a3r5FJ>#n7on$`c*M;jJV}uPp*RkPXo5mi z98NMwTyBu)nY>mWW%APHRkH;xw2>e z!9&V}0hG+clN zHtwcT(_S1KL*(*nA8VbXa*#5suUy{@4~Yf+bJ_L&Aqe-`^2X*qAK3OTiy54)TTUlU z9W`YrPCb<*oqzLqDLV~@t{H!73aOcsA(+rTX6h>YZ%TFMr7%t&0F~2yntDLF@Uy0v?lE*cCUZMHBbyh)pI9TepCYVmZa@ll)+o2}@sYbBRS=ojiZYUq5^&6UwZrxo zi#p1v_1AUvcQ+GKb3o6|g7ylP1*JbW6y>I!*{x`6o#aCsSQ!lGOjI5XC1o5t*{pCl z^0O`ojpjQI68smNmnKUElKR8{4z@}79h+v$O&~;GgvQV0y( zhsV-Uvac!>p)mZhe!zvFEQ&ALGf{+9@q^L%_&IK5aP_XrbVixY{RzTob}l-@;r0?5 zFyS|qSn=#V20VXf0|rP}AIry>US^jQNr@W>laH(cm_|TuUeD%27ZnI;Ar(Cdxv? z?nJsTT6=+LSPhjZ$_KQ5b$p>8@nR^G!x(D5FP*C|Y=*sDgc^_21NYE15#mmWMLrIp z*RM?qti@%&{#CAI^B+hw61o3BV+2!7M+ldDggGWSXb5Ab<{bIC^`tG%b z8Z%5iimYcB#r&=@8QsH2t}v(~yUk}`jY$49*l1RSHHyiH9VIVHiZiJCRT%erBV`d=%D{fW4vN!lpV&GZTI!3R<4udfxlbN7c%lC{60_IQ=#3u>Q_w+ z7m&5qzMJjw!4CQF6RH~V!clyia5WYNTqw$Z-J0W%FEn0FYxLLu!t$1qMnI$@r=$S}W5%y4&gP0Y_XhJ{wNqQ_=bb0$}zv&^Mk!SpUe32--yX zbnkn*i}?zIgj<7yEjVnF84hbW!U_<1(exNDV91Fe2; zs)kO8L?e)d=#ZF^LIy`c4Y^vMIso)g()$|o^G7qrPGPe-vEXdbL;&sL36a~-9i7~7 zUZgwPuog)rVF^&Ik_UMvBs-d+HccjYEU{ku&%Tp*!)0T>gr8)|Aau9A?l&h{FkqyN z(wo&_1JFQ(*25$PML}k*=Ut&D(S#;Fet(g0GfWWhzNUlu{i@1>KYQb8+Xh4pY*&8M zQN2es1UtwIXC(KjAwAA@E5Yn?{4dBDhKHiUoZQ(VIgh!nKGyBm4JwvkbeTB*qP~hA z{Ww@2LPO}XK;RG*0z_6skbwyRPum1CqJvReIGUST*y5uCmEo(D_6y+*KigkH0_i4h z8Bkq;ri#0`>R?{pYgq&IPYsuE6t&30qMcRxLs<}WaCb2R$bfS&3(;3i9M;R2u;F8J z7UH9`o;jUX*;25>vX$p>5N+@w;xa*G4$4W?K$L-D4&#f<>z)fAP@0)%Hq{CdNJs<= zKpRAHo2ZTZCx6~Ped0n@W0_p6xgGt)CQ0igoxe)CpAwE6L&51+A|DM2(O_V`41bq> zxzz4pu0knOE|*1==`|_hy2#~eHlCJ=JcLo2ZleDsM_Nb+aE>SmQ z?-jE?;NNFEWktY&HxEZH{Bkm=#psNbu$!WeU9`7O02{q#Nj5`Kk%?HF$Wi8f?Yam} z%8>c#!S3@ci{tTq3*1N(KFwR#R>VL3@B4Pe4&ni>9Nf_O%LO?-}+i34(I7*xG>+ zdb9;VSPIWG^H}p>U@^x1KQ8z{1(1pp_5JT!(57jMF@3V=xMWS3Yypmuy`9v;8_G8+X7Q-g)!VXQA@q3Abk0CH(<%W7BFS5e z0bUBvEfiET*lc?Hnl0bsVZD-ZW!SZVciEBRUk9ks`A;q*A4j$MjHhGT#ZWO91&Od% z%Itj=L<8iM=P5fX1X3AgYXQKA#%7MC8mghUr}Vr(eS|i-v0|QE(13jSmZIiobrlQ* zZAVcZBr)PVG|$Y4Z*bOqr_TEhTPnxWXnW)(f3k=8nI~n^EL8;qCIx5d^{`Gp3u-!8 zmEix)f>=p1ARCe{7a~%6@sb~aNxcsZ4)#)gN*^K8o_l^`)%oQ2tcEG>(1r;QAC|nN zHn?@#@eqf``_DeyZ`RhUV$lQLltc;6c~3r!+kbf$>5sZA_Cu7cA8bX2q;Q9nJfao1I1s$kkFFRgr zclGQ&CB0-gCbn^1IIM9wv`ho{F?dK-yv!%O4=c-+KA(}d`S|F2u)IU#`i-|b9tZV! zU8@hMmk$pO`A&{*99AuwDsknO?B4Wg-(rfE1MoEY?Ob(zGwIX4x;uF9Ud;B=J#HI0 zuh!+SV6LBgMHO255>|iL=zpHR`$ESP*9m9&mQ|a6Cr@63z65yFCzC$J9iuW8Mlf_w z*fET#R?A?-aKO@dHGL%vmXYP#XpW4Oe2HXQT+OBUHtL(tK)`QW;NrVTa5LyMD~BiE zq+wyZ&IBO`iSX!#fEaQy2%UT`KsB?liNe(jdIh+J?X@WEGU+!E4Mcz4sD8YpXvzsMI9x3uy7ACRAQU9l{f@WAs(wn zH@Tzemy#H%>k-A3%m`et22?sz_Pc!l?k_gbJjZ{LO_WImCyvQGxqbBtNfZE_R;A-FtehpYTo|jbq}_Z>Ot!(A4C)VRlie z`4_Fw=@fXh#?I%d>-$}MZ#chCmIpw?rRHj%P5MiZT2+i5o%`@Ha{kG?+tX_wYwj*# zqeA3LV4^IUQaWmBO<38s4(Ie)W|NQlKHE3{nxBt;x#JPpwL-Os+f-Pfip3Na_)k0h zy{!L|8;+iwD+QBgL)Ka^n(Nfl!L>Z3fN>d&wv8+|Azy6ha89!cLZN~g<=MBNdIA?> zGE)pa`re4nt*tPQ)wE|T&TsL^-ZxYZMVoV# z%IIV~^yFDBD+tk7?ALGD$r>dFjwMZ4C^}h&Mr8z4EOt`dJQc8- zB}|H3*#FFhMs^Ly*;msKh*+0YBm@?+50+$)Wl!f5#$=0Tv3j`)Lz6@`jk6&hmI*3s zPgnWA_QcZiKRLE^Y1vW~!o;eFw)bBi(*;a*mDO`_7|NjEOCD`QRyC6+t5h2h;&X3) zf-o!aTA!YRsFTzLLA734Ko*_K0f|{iVp6=7?0|Q5bm18x?-?5;X|_)f0q5P14C^hV zJw*|x7*OG&ccj}hFX%okb&7@tb3#sybS}-J(J}7+5AHDWwF9Rb?~Pk4lXajzziK&cza%lS*pq&)32=3)sV zD*+8R$Pkc01Ap6g8iKctqc}Ao?y{61l+2-D!&#iU1R$(X22X@9Z{tvYa3DgF_gWF_ zq>P8#^a)iPlV00)nrfG{I)b=z&e53&HaIgDbg2-h2rcHWj z4Bxw_o`QqrFzEmbb32=*Zb2~OCL}~65jt!#1;~;b9QPBIC`;3@yNju!y#_YRZ8}lm z4g{0FcEP=;xvK~XV^>k?P%C>@X`XyJY!r&F4SC6-J2NAf~1)`dVu5-60QT$bDlbTIir|VGKj-(BYR!u#UO=`kN!O ze>?E^Xwaf4gAn)@ZcnyN6K}^@1T)TT2t!qHi2F!9J#qwct}TuzfVr^3N11@sQ{D&p zaz59%e8zsd+z=YR2m2Q$s=5K6Pne0wx0Y08rvIbYt#hkvU_)yTeHxM~Y{ym~QV zpDY?oWV_uKgG@DaA}DPo21_UfAc47~%=g~B_xNy##G*SA`B7{D2Xa#=QJ+?PQKdo3uVp5pF zLPU`Xf}C6wHlVAWjYSOPJ+{t*e(5#1u=!7b@Nri`A(J=RnyU^(t5ppshtS|vN6Omx zte-Z|%pvq6@YB_Dyw5L6_~=bOR_cYBPAZ+I6UFINIh>QqdAn5&j946Ru*%kh+x?Z! z#-hk@`X)wEBYrOxe|g;_wroTdOj1%{zIN&{7&IQKm_#u_L7}t5IMYC0TTRZXdgi^e!%Wu&^PN6uJY zu?AIz*c6=TGQY88bQ(>@+&YD4R52D=Sd39*9gXL2BZ}K)>{gw71{b)?{ZlvJU(A~# znUhM77EuL_cf`A!cTSW;VKh{t|4-S3Vjt!8sNmpExtg%!wDb?;eKShTGpDR`n~$<} z+siC;Jm2u=vGGHw+PTjZ20XIR*hLl#V$pNN7((5OJl@7>F!p|2EzIQEWqB}Tp)=bL z3vto7V)DLwBK;m4F8_&FD{RY^E@rm@*>Sh1D300QTs?cGl|Tbrss=d;JcxAF6KzCg zV|31hgz%@Rql+s9#Viy9!=b}r`;2^NLYlw>n4_N|mNEi z^sHUnxw@Mgga99LK-b8$4v|x| zDHJc$Z*fCr#k9G70^^z3iUZ5+=;hRC7^cw`tEeHtRHT+fY(*_88uXEX zIVj^PXP*At6F$28y&`ObFLa<qbeI}O5DC-G(zTNA^2Fu0Z zt6B#L>%U0#D<$^r~tiqzqyA?15^cnde6#Vy#xzV}v-NSdimT zW%id;xztcW3U0dXrF$Rk0oQ~a|&F4V-yEhE z`@dL;563HMWS&BR)|N8)&$DIC8vS)vc9FbXRmX6Niko}|MnJ1URF~e!3i$c>AUQLz zmyHv;z07PAPEeH^zOf7;nAw_*5ZHcICjwA84*$aTSza71A(IcFoJ^iOafI;PP*QZ0 zrNFkxMS^wKHK_`ywbA0SsECzKL0v$IhYs+GS?Ky=hfAX20Uh5b$@sin{)^{*e^Y1Y z+?TH9^w@k48Te_KS16zz(F1$rEB*ybbczNrJ$gos)KKBM?`F6>*+^z{W(GFndC%h-&8>?^-I-9%2fgd zE<{EYuiHRCf#DvZZ-X}EijA(Q{X4YG9JN@uM-+;t1Fk5g1Um%)UGLS$k$y&b*3<`? zmtet%uj66vwy(yTw-T>Q;VWy+cVr#5kscKpl*ox5$zM%VQ3H7)^B*zjJSmv|5%76y zLyPcv>!j#*@zf`vl366KhHiUf+Iu|(=(i@v?Ek;h=V3lH?P!=~)+S6j!Sf4EUtpcjatoS*@)q|jNbQiBl$1yX{ksBx~? zaAYd5TQPjhzU4)RQpa3YXk&@qN)0Z7z_>M)7SIsQ4n!l12X zQU_{9I!Xgiq^pg3_OnxrQwYIWs8Xa;RUrKGCH&ENcpml|aKn_iWIHWDU)Ujk5eo%2 zOKCvnmK>}q>GXL_avJ;;n;=c-4HP|s@_hUFML|oYpQFc8qAA*FbR?|o2={G#wx>w> zSzxo~Q^NK1sBn+x(vZ%&EtYcfb6c?B{o+dCpqwlRADi0*sr$A6!ep{OjjmHVj5|l~=Co+PLF|)y?TC;$W38Qc;Drw={ zc&~SU$EKd^cAEj|urpz1RnI=en-idc_;l%@=k4rF5V8x^VGgdoJT4+k62sTo_Iq9( z1y1k%9^zxxiUG+mx{h&FhC+;l!U}=6FG{MAmN2v|MS&iDz>#1l%eUOkt|BtMI#q;K zQ+3r5-$&c^e=0fTaB7iK#-|gp)kx+jB2KTkVL?Rzs9mdzYM93UL?zCOdy3eN+fO7a zl~mS3T!X1bf;vP8&ROt2LOy8`>7uXa%FOmo1qtD;8$8rNfH^kf$oi(J6xToATJ8Cb zJp35qdvvB7wN%j0MY3CazQ*Q;0ee;=OhbGfj8$BaMbAu%jm1XEDtCvaMc78?aLLZN zwdG-AWE6}tNyCilHlN$!xK$qW_*f}5Q72fLiGVLH_N}+q!0?}#_xI&8eS-Q_nln&!1Kr8)y3EA|obh3i|2{yC8Tddj6?IhFtXuF~Rh&C!enmBXk6@SO}|)64c`5q_HEq zL(z2+Vm+w=9fF=2qcW{8pN9wmBQlLOR0q!~sJY`JpWaVb2($%?e=Pk{qd*zhk<@@G zh)?jmq4%^p_z+bQMm=eeIGSZj&AEw~c)WU&E?|p=n}=r}I4CW7?78V%Ex=o6yg(AVo|@eCa?*=s4*@ zSqa+U0?%CD-2-1I5!wiOpL5*jEzr(DIHA&$nC$br?LhSGfcyd2Nv z`2UlEqwp$wtpl;d#V!611ETxi=CFijWGzd5xBGo)39^Y5Bawp*S{l83qkWbNF`6RS z0`uE5!cL4jwm5a@uMlU)BDfZvjn=vzw9;T9y4Y-mbm=@BeZG4^h9TQc{2`+{IdfJ? zXw?iT3d=|g#Z-c=?B!HAb`eXnU>XEwuQ-C7U7f#Itj)y7E4HcqCmoe-@iM_Og7CI; zr(5A}q12U!Gh+jTCj=@vJJ~9_O*o=(YoU{qjH#_~aOJ-2=-)z+y^jMXpoRxCsEc>< zVc!=c1yrd|0D8O5G8Xy0G4Wjvapr`uSP~{ z$^9k=eg7WGyD*qA1qg9TT+p1N0=fZ!2i~@caXp5_{TS-|iuL790U~5X4t^v+2mVWL zU}uyX*LrQh*PGWsh6LU6KP(zuR zKWol{^ICznW7M6ouDnL5YQRg;K zW?|C(}Ylg048LZBTP&tObtu`0U0)cOeO|^5WoR2XiSD` zU=v1+0%B>2lM$wxX{MS65u+wd6+FqH)buiGlT3j@sDd;GiL^|b8U*q*G@gJOO@uTC zrUH6tFwrok#KHp;AZbUUZ5v8#Dd9!68s zNP3==OoTxY6Ab_`m;?c!O&T;tj7n{SXlNS>hNQRzKT(NEB!>IaGs zBy6Fh)MzvS12q`b0017N)DKWHdV|q4BAE>X1jrLoYIu{<2dT9`MLbcmYGm+@G@gXU zri_f44^Uu0Gz|?I27t++28{uxnGG~F0MG+QfwcezK+`|~VrVrm5TGWFOsAtkPt`vY zRPtb_r1dt`(^2I;BTotHo~F`znmneP)XFq^nqoah(s@RKq3Q;WH>ot!Kr{ww05+fi z0000D00000X{11z4FthWriApGU`!@S>5yo`Gy-OmCaL2SO)^i^8fiT>PbvCn1Y;_A zlhk^R=+RFpnrLXzsp;yTq2WQJYCR^>dQVLg^-l_Esb{Hmopr2^6d78l zicyll02usb>tf>;0Fw+a@Bdsu&shQh_u2>I-!1jN2O@Ur zEzL!pcnJi9d;8OOyZ|4Ztr~*j6exr!DIp_$=~dkO_Z}P!hU?vU`7&4#VO4wA;WapDwbad z`5qqcT_9fRLI4+aBOiy<;$HRLe9-*JM)=W~&Fl=lniZQC?kGuGn{OtNNn$E<%2hyR zGU}CS1b!7Iwh=$+oAK_13Y)dzGfmhbA27zIoAt_#=RPQ;n#8 z1gU5UU_*^~48jmE_R|3nFa*&~aU+-!#2PXXPr$)ZF0%A6*-ev(4tP`o=L}1Zo4HLB zuT%llxY|GfjYLeu2pFgaf{$qJrExG)T2O8x+SH5_VKW<6Mqs_c;%(Ssou9mzsP3KA z7QbPEt4+&rk|taP2tMne1`&l({UsM&2r8^M zIp%GO2lXQ1GC8hnbZacmzzfRN{H=@eRP=ou=^WCel4ns4;Eg|J*wxWcznatyq5=S@ zforNH{`=+fkY)^@-&v38*HJ(;OA?AwA>IBymFM3I6G8^&6#ywfNcf5i0>Eh=Nk%{v zSe0V!O<4+icNxcOli3_8JO%*a4-*(ok`1oAhU!%Ad!Z@>9X|wGXmDE0E0M-0#M>y& z4e+{4Yf1js2l3s6b-{{7ksG2n-5Zn}aTP(I0{*YVrEmuZh);mbaReni9u&HB9kOQO zfg_cu?QVAH-LN{*Dvj;mCej?Y5Kojr3aPwpOy!!B~y^c5#b)8p9%(Sa?+1 zj{rzfSB+UV!->Y{TUHHQ_=>5nRv&Zmx0-`7S;8ufC_x;P=R{Su=JH= zpKbCiz-l_Tymm)KP7=5wgdi+|L#cC(x+t_c{G8(kHR$<0fhbTU!vI+LR%Hlql2cmX z0HB1`@;Ort*d@L3`IZaBVR?J}nDIF{^>DKA_|il{B+_kbyud}khbInIE1dP*b`oXj zkv9b>s8T^aQxpaQgw|CA&54YxLV_J36cR>BP(dV;164pICw#6kN~-9MgryVm)#Hr& z)(X%__}U%g1kwYHT=_&{Lm^QVk}0Z^N-%{WwNXS$0)o|9g%pAdg;=Tz5Li)40th8G z9qOY7 z-bg%Q0LUoMASd3HE7r>oku4AlKrsYI-}i8J?coW}b5^V=zxem=M{t0t9IjM?Ii2Bu zZAjpJ2PNP!E{gm>gyIB9`I4n@i3vt%NTQ*FJt9Cv%NF=NBWA7J?}Va}^QB3Rwo6Ntb|b(*PD`Xjo$^lfgC)!Zm{G9x;8KhMn~ zV(z_-&KC!SYj$0sZ?&zzB?E+6`(Oqva$}g|@oC8Ej`*iDOl^~k9e6e^KNUKS3djag ztv-Wjy`A=uLK~yUaE`p~<77dq3id{CX3eT`?Upx10}Xk0V2?ZiV#38^dAN*``#fOL z-a}ykIi%B>%po#qqfsMsyLWc$0e#BZ^4$yI1iY6V&{7kBxy}{WYNyWU5V`;{twk`8!Ic=gQrUAkxtE%i@Eh~i-V*}C~B0yK+ zm%8oaHe$^*B&w1fa5_@ZW;EDlQd3t2n2TymY!v^ppQakn`q9Qhf5@_+6W+nS7WYk~ksiGIK!A_fs)EtCcn^6E0Oym+~5P&%C;5iL=J-_aa2Ui`0ceKUaEx(62)5GZ6Ydpi=>x@jMY5D1Dj$m_MR zmo&G_kMy^g4d)*62A2ALB_U?16iQix=D4mC=~-5l-M8*;6F^$=im$=bK4vBc_t!u2 z=-%5hPKQORnlOEzjRzL?o_y%FMXFAR6=|I^N-Qe9Cs(a&V$9-hc{USD3H$b4IQov` zXU%x=o5#V)d6YjGAIe64Ei!>(#l_5dix5BucsH&JLKhegp6titjG)P&%>t|iHFYOr zc!)D}g(GKZWQSO0Qb-^jO%YiQ9pMNAf`n6octs%aYGy`oNQUZajBp^8iPXvw$ykt` zAdr-x(j5_u+?Xq(g;WkmY_6_P4s5E1q)O)7s2(EC*kq8-` zf+NAWR3#&5SAID$5Prssn>3-t9XUagSUI7h&26oO2B>v(Z5AiVan_VzGAT^BmvtB} z!y~uAyuhw3ew?76(X^_Br3^6%U_6@$gG^4`WkNjseJ4lk(A$hbK}T-bTnNHr=4CpP z^Z*WYI%dCl;xv|o4dFuHDA3m3q8~` zO?cF1oa-0XwNn%nn=$rC%tWaMs~|YQ!sZkiSDR1c)rrEM740hSz=#0gq79cynfZ$_ z5r>MR+iJRrflj8`fKK9~04dBg$gKDOQlV;ONl|?9YaFhp&OD2Q; zem}|)UcPH&|9Xq=U234SvR>+Vd?qN^Sb0_MwHBC3YX<5Th(3CKVl3GyKF=mLXJ%(E z6O-QE^<1>(Nz`0;eiw;+q`CKXK}D+zNS^of7lgXSTO}MYE2LP#@l&Q;GE~LAX%cmu z&{Ti9K0+Es7=|Xfpn(+8M3;dH@+(k!9Iu4h-ZYmAI z1fW7f5NPGGTrdIU*YAe9uiMy`BjL30);D(i%Ben zs1r>$BeqcTJvwAlB$oMzW*?)0wcb6*uG7%%Z2~ytRirAyY63tAb9iIq@3QV4WT?HH zuKEVs3zJ4BcWU(?fxaumTq$!e-pA>Bg+4_~Us%onWIJy7{EH=0UG9V2->zwLU7fg| zI1Y(qZ~dJE9o4Ax)Y?-R_MSd;+z>O=;fM3fcG#e>6Q)5AJaA?bY;kqp%a-{q38lnvw1^bOlG%@wS;~qsM(NumSi5d|`aDSInMN4DKr6u8XEC z0VV5(HMvd>oQs=Yo6~PQwXxrB;dWO1&LlJ8>w?+)3cG>J@WLZMcp~?yl*?T zw&{26XyXXR#4!xw*?XGcH2qr7X=`M}ck-Aih*5Q4Q!Ookl_+v~@pJt4hq5C>RjkyM z1gUg}JL~p&+Eq?hx9@sg$Iz>``k$X)s>QXzJGjeC`wIw4u@|UvXNqV7M#RI6RAvoE-qi` zU&QGlC(Kbm#~#n7TdB@}a=_hX>MwHvT9bA#^Jx@&NN+`kzRv%2dIwyPoOS@RNV+Qm z_?^Tb0TvQel9yr$nUvG;k02I4#VsM}*_@Hd{&XDuD^B6s&rVsJt|3Xv_l|KbP!jyDIbW817MC~t} zCNd@n?Is&9_%?bJS1&fREC}@ogITPA+QOu7h`Trz+VwEMoNO}jz1y@Yo#~APa13s01K@ zh1i5oT5|PoRWM*Jy81D^W1UPYEYWov+hwqQ+)Jf1wq|-&HyCzrGylGm0ANf!|Nz=R!62_D{*}!5X5nJnoj+00R4YUA{|? z)6tFk4y}@)#4W?yea^Yp=;!1nO-enKK|xA`$Zo`hmN(#o!FDD|Zz-!zMyf5XtCoO& z*mu3+?~0cDbV;mi5X-1SXRdDsT)>83V(jRwscv29mR`n#yFFk&l4=kE10Ib8K{*8g z&=J0x-(>QKn7ujcV;>JRQ!8QaSj~OB7G+J!#-wpwE&$h4qal{4APp5;okF-qVI8Pd z1-)NUZFO%t!?G*>I`5bK&!t4}lW6>nND<^;12ND9?RdJDCwk`gi{JVtfm{+((6U6D zXa4~9vJK_8hQ`0ed5O8oBaDgR$FsXrsSv00MMT_+6qG1VO5S>{vC;gmq3E-@gT)+$ z`aTd|@cs_eO6#Y4CE5Kv?-#Eh(-60DGj5lG=EPSA5e#0i0jnjjF6vSMK= zrIdnd9@Pv~ju8-~Oo1$tu^2K^G&&enHF7zvrATCZw=MSBKl71`I{Xl0o8)f0UAWO{ zjtvU}0luJTXLqN`3N;&dy7&_Iy?cUxa&8J8eYIhmH>eEcXU?Et$jHVh9ttqcYbvBo z&_z^TgCSxaO--xJwZ1v;>PqeR-$mtHx0sUDki{G!TJ+6laicZXERc+!- zZfU9ao6g%MS_oBNmJG>{c#xr{JXV-yflVQ13K-_oIZq~E)$jB1YD#|VAFL63pSl*u zST~#aRX`C@vJa_0fRz@9c#_rTj!>`M#1ZO|Z{Waf_BP&<9nmNpAF|Vtu(Fk|6C*eE z)qOh(`iC5Wem#zpv&1<><#+$xIvuJF77YxE^OD6^8fC_MEV~a&=YrWu(az~Ui-&VF zJ$TW}!}hy`*=~*YW$@XQsTMa2{YqC7{#u9d5&zYHFSCIY6UQr%t19r6n=sb}nKA0?HHbD0o~hn?zFB`oW6?V29@*%na8XU)a<}%ooe{E~8T{q|+au z7MB+&IaKvZRcfo;4_faP4b6dT?*6WoRZrB9?QBS{*2*OXft2$M)Z3;59n5I)Tk&|b zzc@}q*-hQeZE=2$b~rRBh#WL9EQfPz;ZnH$DW**hNONodA{mj7RB*683CQRx?ZGw1oQo0YLzEB!jbr|Q<=Ur0Jk zP}Dts*62(ha(C+I6J+K*v@`z0Zc)92MBiBHUKq3_LAf+U_+z6qSHdr8=i}tBkd$*7 zA;V9fpBlR(ZI+KT?UIQNEVeW=aOHPS^M3MjU|_r$d?^qejc0`H#8W+^SJ1SPfm%fn zVuFgdYB?iDodp|d##rm-^?O*$gnW1*>mb=e%yRMVmp2v5c-(hD2wFOwhRe&^w`;9Z zk9I-kYq)pOc}rI(QA^|j;1;>Xl*%#Kl6BI?zZyC69D+J4%z z)9^IN@tpf#tRIw%qvYte8gQTuchPCoahCjEKkQwQRQprh6#pYQkf4QD{6`G@?d-#e6FUSh5X!aCOb&C z)7#kN^~NSfPhO{>&ZlA9!lP7A1EjDK3@>Mz#`7DSwO2Sbc1bV)#kohq&s_aD=-1Vw z`7N1@Y;5}rdH+m_uU^`Mv2N`dN7WsYk0x=8zFSP0V2s|i91b{epBPmtJ}W;tmqC+R z9JbYE-=1Wz`hNSHZ-IBiQM&Kjv6*rHPv*A=n+k@$@!2pzCx4hvE%~MJ`fqiwm~wAe zX2e%#sZgRRw@Fq#%gyb!tjf0t>h+t-)}<~_$U@N7iW6_^o%(8kw&$YE{Uf<7oo?19 zH3j13ch2`y+#W=o3C~Hz6cpgs+>gxGTc<6pzU@Z(`$TTvg&O#8I^XY?;NW-p54p+v zgWPS-Tz{RH1_I_1Sffw%#d&|TWYzTW`tq<-%nWf0UzrU>Rte_ci#Ja zSXqY>8I#*BFvg<*fB`}+O+O#ThNa+B9GmM!lQ40Uww;?Q_p{l&yzcoh(xRK8+A=cz znyWBg=v!UKh7iXsY8~0@%qowc*znjjDdJt%2Ele)U>f z9{Vx>G5+Z7Vt;+?=hsfILsY?o5f+w@&eWMcnLv!0j+)PW20##fRww#_2xr0e!UTfg z&+w~54nc>PVra1H&9HPwi8omd5PO7;gpm_2XlBXCjv3u-D$TW2lZ4-2!SY}AD?ph2 znYG4dwyA|pG$h89uDjPb$gMp~uxGMGp^h@qV`i`Nir(ZR22_r$54#c{^*oVO{r4PY zio0HV6ob2oCthFxE5Pwx*z%tpJSPecKSs8X<&<@wA8+@b?#f%A>M?CY&xc>d!YA^0 zu|s4oEPDbEU$lkF=Ft@DSxEVsB^Eef`Uw60w+>+gLCbEy$G?5M(3bbrr@mEM-_lcb zj9zs3023A7UE-I`EAY+~9tSmn0(d_sY1;hL{{%-<@vq5Yb@Fg_Xbq^Z6vg(zG9+Ab z6x|No9BS~N55y2LMF0UlKOCQp(IjO9S2bN=)h**~+%{%+iI76_w=V4F^E9~bJj`oL zpZ%nx9@~%cZHaC&(^13tmiWX^t*lka{9BvC6a-B(;Am#k+jH)9bM_ux49fWLuV~`4 zJ~^*f?rm_)m#M%FKj}U`wM8tv1&t5&{_F8x@7Xi2+}Zr>r2cu7E4MoY;j?>3mwk>C zT#pEh7`$__%;}-c!OU#JFv*wRM$KENoXgn!`14ITOTspWsvv<1BN%}DE@^+QnJ^?d zt^B5^HpxzQ28EblaI7?PxAYXuhMVG|Hk^ew{a&1u`mNzDN5NN!VNR55vScA|Hb1e~ zuS>OiZ@ls|v!gj3c7oTA92ZNW?Q@C3?sIdMCg$qeb;)z0)nlDb`!y}XCB1-5s_`R9 za3%O#O|9BsxIgb9;yLiXw?RxxwoS%ougPgV|8P=&DtzfOEEf)ZN4yDJYY(&CKQ3uq z9lv$hkz3<9YQtO63Z0+uh zB_hBP0FZQGkX^cth>c$3bKxv5QaXK2H9AjD=M!}GW^EX3pn%*${?1Lb=vu{o?|1+z ze$kK?5Hy3u0Rf`3qWGoQ*`DdY-wzt?=T@*f4qWy_o7_+_i;08?okxL;7rG>Q!b|eTrex4< zcid}}#fx`tc;cB%y~=Xt(i9K``=~degQlC3OQ`x|NGr3C@9}VVq+Z$Xbrul!;zXH* z6R)@&BZeeWYYX=LE2;G&CtkT1*LbemSl6{4eo-`EOWITUe?!6c2*|)Vk~~-UadFHb zv=_!KlYD<}cAmL|bl(^P^OICOk6Mi`l<(1&aS`ZMz3tpbOemDOk|A6xl$${+l{FkZ zK5_agdbom!(jmnEJ$cU_5v3WuFH>@(tSHEf?^k3bMA-nh5z$+4unl9s2E9@PM4l50 z_%#IW=Ifk)tvTS9@i3s|_o6G&Vm}xJh@_W2S%{0g-N^lqQlJX`5jqr0NC6Cn5d9%7Js|-v^RJ`0qQ|5V6yw9cT z?{nGeY3*r#pMfgEIuj^;?<^0v6V{AI3Hci8-XA@Q+k5|;!T}Ht+<=_{0Y)BbF^V61amra~O!Iw3!AvD|V7aq`5Q9^%kJR zfE`=)E;ezC_l^F>pr`ZrRlh^E{|RCxv*f^lb7Xb{H*n;hh*GkdfwPhiJV5*qn|sLP zUGSH>XnLZEf@InN(P^?poDwwF&w%zvD7vb@Hgz z+FRU|Fyoji`kJvunuOhI!AaWAoSTh}0IiJmy|E9Eh0XtVqQaHj<3lf;hLp2r?f+s- ziUo_x_u$L?HHz0uuhs<_YNx$*gCh-M{Gt-{gWtg&=ntC~6e~1~vJfcgMb$MRAdbyh z!-NunRO`$3#n#TdxX~UcYjZap4zUqB^XB^PSsqB=F`>SF!<+Io@q6C~p0I9G-ds;k z0)B>%utP~R+!VZ`WPD$Du#}f@U{xnRp2Ji-+E~4XytRY$<#_ioHEU3nV#1Cg~c zg(Le@(BiHoJcTe4@6CoGal#$hU8;qp$&mv4xd+-_ZEA$ zi<9pD6UqFmHTk_K^Vzw$@5D?x_`6EVcmd=JLjT{T`RT<)F|{WEq}%Oa%M33%&1}4b zzq61*1Irs?HwJ5*P4Dv{KsTM2J^~Ag7Tp^J$o3-|lwfyp*>d@ydq=yehBT|naQZAQ zH9D87s$sw0@@&i1bj>VF0&_8kPGc;KYLM$Oo(~C8a-s)iP~|a<;XqeQ-Z5@jVd5yw z(4~7Q-CihY`RUIBzBBb4=>W&Py!7l@swnOaEG>RA3+Cm=c02iTD)rbWQhZMJoZXI8 z!@3`igctTWIKC^q9=qbBg;sSL=fE!4D_whgpqT-lEPyKaT0MvWM~pz$&If(-VcuAe~5?URDzUcU20(w;MrHn zh7V}eUAcf_png4kdKCIAW7_#;H&TR8=c% z-6fN61{&)j!I=~PZ30YO9|2@k%97Rig2FawtniB!n(-;7I(3NQxpIBTVC74Y#9x_~h)K{g8`vyC zI#xZHpKhbt_DX}=MHQFc8}^(IC>78Y2}K8!4JUT^)+ z9YB}Pi)<*l7WEqSwY;jsYnn30bpRzu6@E(p*zQ0XUw5qNlddI{rGL&KrH{(aw)56K z3Ul`!;jzpN0-I;23*}v`F=x~ipMTvrxKjYaJ@#QdK9Y9B$4aMYicN?qV%T-s1(IC4abl8Enyj|ON zS?F#q848hEBV^`Ox^i+oJ{x8Y2&io6JdrgkDDqm8?d0aPY#vFFnwWW`3Y~@4LEYTFXSTm-V4-eE= zUn4^`MGOW01~tg5HSlUyaVQA!vh9a+$hecLW3fKEuhI~gam(e#^KST+LNfq(`8o;53w(#n~Ewt|vXt(6O}fnD8dyQGyQ zyKIs&NMU)-J6Q=pbo)hOJqXI=s)f-w1iZ#eTS;+lkj3GwEHJ4GHv#7j81l|a#-t2< z&vRe9Yp6uXa6yrL$wwyJCg%OY1sV#B#w-LB_+SE0 zH+&{T%z#46Bqb0`U~^Jc)6*aiH zHBz-}4a_y=3RR3EJpqL!TRaI6un0cI!iCfh2U@NOpfkvk6i*3nIfWf@;^hkUtu00_ z`@ZaP=3g44me~WTB-2blb~Xl|(u3slc$$9=#@^`D>|c%lq{%Aw*op{{u8# zj(Klqv}+tvb=U3;Z4R?%0C0&LH?E}Y-ourdA!#dsh$dsOW1O-mE67N6f`L>cYiU^v z9?5;Ag396U42K%xh+#Ic$c7-S5Je@Z;3N=4Fr+Uz7EySV8|h0`vY3!ogPF70@?d;i z6|HGBGXAl1Iy+5H;$#MyDJCXf3M**l1Jt%*Ab2{_JU-TJ^c9d=8&UxyrYP*ijsQ1l zDW$!7g+r_+21LZ80OhS~Dmg$}1-YBf1lA51)#-CN$B^_P#uJ1uAB*+-{J+!nb6yBG7{gFlJmZeQqc`??dm6MvtriE`kZG7L-xBr4 zdEzh~Penx)`SdF%ygBxB^OZJN5v8jshcaT^!ch5GbQ4K=|l}r~TY5J7lA* z8Jl3##h8QB`*nSsA=Ba2&DmGFTdNBX7R>?&kvFCEDtjMZ5VHT7 z&*>2m7{Da##DKx`*!-Fvk4t-luEMEx6_IDpzot$KQk4%Ks>JBZpdo=&2TGv%OP^ zTSwrST8Io2F`^R`{8mIj4&)@lOOireFl$R+l77i;HMxZ=6?LnEz}zt?1u1LocXb1n z*+R-=S-wV|oeeeOQtIQ^sD0Y16Ku3jadkwj&|bcp*tduI0;VqN`RoDAdoVKd*cA5 z1kRePxFIMEJF(!d$J&n)nVOFi!~ndiS3it4%7rguT>-}?L;dehm1$>?VO;<}+<=gJ zbV2Oj?KWD&&=l|p9B!k1qc?Z`gAt0^%)rl-zhR#Pb$bnaBAO(SwYe1QEgiUnyc&s9 zGD`@gwkWhu~y#OdXAnn()$D;-u3 zXD=qcFHUy0e7Mji+=PA2I%{5pMDx4-x1shc$~_|GW^8zFBx`%SQG1c2|AV1Ji4oh( zb?c-#ayQA-=y!Gc&0I1ul}h0;gsE0(@tkuUyWJ|a;i_Xxesew_$$h^bhIgBT!O0D% zkfC!Q@vW%Mm)zEn>EmmQu`Y%Vfo3xPOatW3oG4C1ndwv3?$Nyj7t(>K4L?|B1=3oK zl;nkn8E&z5KpZz63=Vt4((Grf5%{u*40BKC$LA)iWC{|V_vS?6?3Z8EdF|IV?}j{&lYOP9k+I@sTnVw|L>MJ*l=$kM;p;Io z_cUWybu=4WOmRW6p&Sl{NEBg46o3Qd{!Y#@fRc8f56*o?mmzAU1&-7yG#m>aXjV3m zTJz)2Nw^_0!u_?M6k4sH=S`o^ZyzyJQbHZ~oq)$N)6w;1t*SWP&Nq<~N+%Mb%o@1& zpDUdFH+D~_u_Dkzi))Q%Nbb`5dS8polaiCXY_YO%C7mrD+0x~rl1S#tNhz&0v{G#8 z?Ior?31_1FN`=A*p#>C9MHr|ejGbypB#N7QUhkySS{f{>s;a7ziYYNwqAaq~7FslU zDy*t%s+!9zq}Cc?nVvqzx{4^0Qs$>wMHEgdibqm+vsqNtRb`f;Ub`$Z-s_P;x^yX1 zWtRnX!wf94%dX5DEi$g@MOa;RS6yY-Q8m|UjS92p)URHp8cqKRv`liW<(Xxf)2B^g zqnepALrqLYCXr>TO-xy)s#U2~x!d_>G@A^w3S6|+Rb`b?RaH?n4^2d+QESRxaXs^K^>ZrhEkR&V$V~+dIkUN>e=0 z<8G52G3^SoNO?5!p$L{)WWAMgu2`2L^oYJpV$Ct7&YmmCGt0`bos!CNtSXBw3 zh6o^eHFjG2k-77XHJf7NEV24_bT-Uq9BE7labJ0?VaCm1nKzFpHf7X@ENv;ypBtpi zBpBjZilp-lwRg#8#0Lv=@IU142cJS~GiXrac|k5&11tiKH6lZY+W-hKV3tgm^i2^; zRhpFNP0f0ZdQ#z5yOeZX|8_mLvmo0;@);gvW8pwv7nw+q zFv*>}=2rQ)VXt3Y`aZ#5#Y;d$QXPpI5lC4oSC9~E% zr^Mj!0pLhk_ui*hrR^iD_5~|0)yT^FU1T0I$sExr27u#al%f;naeE9)v4_*&3o9x7 zJ1(=f;A(zIp$mV)gqA=)h`@;W*bod!j${ZrzZ8MAiR!X)3u@?zOp0?=aHEX5K)rO0gS*a&ZR5%9%+&!6BXO5qO`LXM#Flk-{9pO@pu0~{Y^hDK)Z85ewiUh!LHpdZ zuGUg^7EVZSagh2ho9{Wgh&Ygc)X97FYq`Q(@e&?^VI3d!e5tt0zx`kF@_XfXxE^Id zJ<4F&=^j=fxe7f}&lqpq?Xc~=m-P?+3 zi~)4w>S^_I70LC$8{qF~>gGC^ko;Gy7^U7u5YuR=oT_cG7q{g4-SD$$sQsWQ{dsvm zI@PT9t=4K7%s~ePnTN{DOHJVF|5oI4I4W;$7>y1UA*&KIo|cP?q4O@ft91WE*YgNV zp@B@k%&g2oq8PO7g0ORSS{afmr#aiILXDqZTYt1rZ1z?manC-5CQ}qF9Pt%pltaxJ zc;NdP^V?Si`L^WB0p8@{V2g&+Qc*Ncv7Lrjx}$|kcMF)LU}5UGu$E zQBN|2sw>{wowQfvBhQ$DvZ}!I!BvJnBbeLJlF&?BQ3$bDQ*VHWd&FwBIf7Q@vognC zthGcmn!@V@EDgw2T* 0 @@ -20,14 +26,13 @@ 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 +def prizesanity(multiworld, player): + return multiworld.prizesanity[player] + class LocationData: @@ -72,6 +77,13 @@ class Rod: self.flag = flag +class DexSanityFlag: + def __init__(self, flag): + self.byte = int(flag / 8) + self.bit = flag % 8 + self.flag = flag + + location_data = [ LocationData("Vermilion City", "Fishing Guru", "Old Rod", rom_addresses["Rod_Vermilion_City_Fishing_Guru"], Rod(3)), @@ -119,7 +131,7 @@ location_data = [ LocationData("Celadon City", "Gambling Addict", "Coin Case", rom_addresses["Event_Gambling_Addict"], EventFlag(480)), LocationData("Celadon Gym", "Erika 2", "TM21 Mega Drain", rom_addresses["Event_Celadon_Gym"], EventFlag(424)), - LocationData("Silph Co 11F", "Silph Co President", "Master Ball", rom_addresses["Event_Silph_Co_President"], + LocationData("Silph Co 11F", "Silph Co President (Card Key)", "Master Ball", rom_addresses["Event_Silph_Co_President"], EventFlag(1933)), LocationData("Silph Co 2F", "Woman", "TM36 Self-Destruct", rom_addresses["Event_Scared_Woman"], EventFlag(1791)), @@ -374,7 +386,7 @@ location_data = [ 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 Rocks Before Victory Road", "Full Restore", rom_addresses['Hidden_Item_Route_23_1'], Hidden(29), inclusion=hidden_items), LocationData("Route 23", "Hidden Item East Bush After Water", "Ultra Ball", rom_addresses['Hidden_Item_Route_23_2'], Hidden(30), inclusion=hidden_items), LocationData("Route 23", "Hidden Item On Island", "Max Ether", rom_addresses['Hidden_Item_Route_23_3'], Hidden(31), inclusion=hidden_items), LocationData("Victory Road 2F", "Hidden Item Rock Before Moltres", "Ultra Ball", rom_addresses['Hidden_Item_Victory_Road_2F_1'], Hidden(32), inclusion=hidden_items), @@ -400,7 +412,8 @@ location_data = [ 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("Pallet Town", "Oak's Parcel Reward", "Pokedex", rom_addresses["Event_Pokedex"], EventFlag(0x38)), LocationData("Pokemon Mansion 1F", "Scientist", None, rom_addresses["Trainersanity_EVENT_BEAT_MANSION_1_TRAINER_0_ITEM"], EventFlag(376), inclusion=trainersanity), LocationData("Pokemon Mansion 2F", "Burglar", None, rom_addresses["Trainersanity_EVENT_BEAT_MANSION_2_TRAINER_0_ITEM"], EventFlag(43), inclusion=trainersanity), @@ -712,6 +725,36 @@ location_data = [ 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("Cinnabar Gym", "Burglar 1", None, rom_addresses["Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_A_ITEM"], EventFlag(374), inclusion=trainersanity), + LocationData("Cinnabar Gym", "Super Nerd 1", None, rom_addresses["Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_B_ITEM"], EventFlag(373), inclusion=trainersanity), + LocationData("Cinnabar Gym", "Super Nerd 2", None, rom_addresses["Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_2_ITEM"], EventFlag(372), inclusion=trainersanity), + LocationData("Cinnabar Gym", "Burglar 2", None, rom_addresses["Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_3_ITEM"], EventFlag(371), inclusion=trainersanity), + LocationData("Cinnabar Gym", "Super Nerd 3", None, rom_addresses["Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_4_ITEM"], EventFlag(370), inclusion=trainersanity), + LocationData("Cinnabar Gym", "Super Nerd 4", None, rom_addresses["Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_5_ITEM"], EventFlag(369), inclusion=trainersanity), + LocationData("Cinnabar Gym", "Super Nerd 5", None, rom_addresses["Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_6_ITEM"], EventFlag(368), inclusion=trainersanity), + + LocationData("Celadon Prize Corner", "Item Prize 1", "TM23 Dragon Rage", rom_addresses["Prize_Item_A"], EventFlag(0x69a), inclusion=prizesanity), + LocationData("Celadon Prize Corner", "Item Prize 2", "TM15 Hyper Beam", rom_addresses["Prize_Item_B"], EventFlag(0x69B), inclusion=prizesanity), + LocationData("Celadon Prize Corner", "Item Prize 3", "TM50 Substitute", rom_addresses["Prize_Item_C"], EventFlag(0x69C), inclusion=prizesanity), + + LocationData("Celadon Game Corner", "West Gambler's Gift (Coin Case)", "10 Coins", rom_addresses["Event_Game_Corner_Gift_A"], EventFlag(0x1ba)), + LocationData("Celadon Game Corner", "Center Gambler's Gift (Coin Case)", "20 Coins", rom_addresses["Event_Game_Corner_Gift_C"], EventFlag(0x1bc)), + LocationData("Celadon Game Corner", "East Gambler's Gift (Coin Case)", "20 Coins", rom_addresses["Event_Game_Corner_Gift_B"], EventFlag(0x1bb)), + + LocationData("Celadon Game Corner", "Hidden Item Northwest By Counter (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_1"], Hidden(54), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Southwest Corner (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_2"], Hidden(55), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near Rumor Man (Coin Case)", "20 Coins", rom_addresses["Hidden_Item_Game_Corner_3"], Hidden(56), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near Speculating Woman (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_4"], Hidden(57), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near West Gifting Gambler (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_5"], Hidden(58), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near Wonderful Time Woman (Coin Case)", "20 Coins", rom_addresses["Hidden_Item_Game_Corner_6"], Hidden(59), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near Failing Gym Information Guy (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_7"], Hidden(60), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near East Gifting Gambler (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_8"], Hidden(61), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item Near Hooked Guy (Coin Case)", "10 Coins", rom_addresses["Hidden_Item_Game_Corner_9"], Hidden(62), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item at End of Horizontal Machine Row (Coin Case)", "20 Coins", rom_addresses["Hidden_Item_Game_Corner_10"], Hidden(63), inclusion=hidden_items), + LocationData("Celadon Game Corner", "Hidden Item in Front of Horizontal Machine Row (Coin Case)", "100 Coins", rom_addresses["Hidden_Item_Game_Corner_11"], Hidden(64), inclusion=hidden_items), + + *[LocationData("Pokedex", mon, None, rom_addresses["Dexsanity_Items"] + i, DexSanityFlag(i), + type="Item", inclusion=dexsanity) for (mon, i) in zip(pokemon_data.keys(), range(0, 152))], LocationData("Indigo Plateau", "Become Champion", "Become Champion", event=True), LocationData("Pokemon Tower 7F", "Fuji Saved", "Fuji Saved", event=True), @@ -1965,6 +2008,25 @@ location_data = [ LocationData("Cinnabar Island", "Dome Fossil Pokemon", "Kabuto", rom_addresses["Gift_Kabuto"], None, event=True, type="Static Pokemon"), + LocationData("Route 2 East", "Marcel Trade", "Mr Mime", rom_addresses["Trade_Marcel"] + 1, None, event=True, + type="Static Pokemon"), + LocationData("Underground Tunnel North-South", "Spot Trade", "Nidoran F", rom_addresses["Trade_Spot"] + 1, None, + event=True, type="Static Pokemon"), + LocationData("Route 11", "Terry Trade", "Nidorina", rom_addresses["Trade_Terry"] + 1, None, event=True, + type="Static Pokemon"), + LocationData("Route 18", "Marc Trade", "Lickitung", rom_addresses["Trade_Marc"] + 1, None, event=True, + type="Static Pokemon"), + LocationData("Cinnabar Island", "Sailor Trade", "Seel", rom_addresses["Trade_Sailor"] + 1, None, event=True, + type="Static Pokemon"), + LocationData("Cinnabar Island", "Crinkles Trade", "Tangela", rom_addresses["Trade_Crinkles"] + 1, None, + event=True, type="Static Pokemon"), + LocationData("Cinnabar Island", "Doris Trade", "Electrode", rom_addresses["Trade_Doris"] + 1, None, + event=True, type="Static Pokemon"), + LocationData("Vermilion City", "Dux Trade", "Farfetchd", rom_addresses["Trade_Dux"] + 1, None, event=True, + type="Static Pokemon"), + LocationData("Cerulean City", "Lola Trade", "Jynx", rom_addresses["Trade_Lola"] + 1, None, event=True, + type="Static Pokemon"), + # not counted for logic currently. Could perhaps make static encounters resettable in the future? LocationData("Power Plant", "Fake Pokeball Battle 1", "Voltorb", rom_addresses["Static_Encounter_Voltorb_A"], None, event=True, type="Missable Pokemon"), @@ -2043,20 +2105,24 @@ location_data = [ ] -for i, location in enumerate(location_data): + + +i = 0 +for location in location_data: if location.event or location.rom_address is None: location.address = None else: location.address = loc_id_start + i - + i += 1 class PokemonRBLocation(Location): game = "Pokemon Red and Blue" - def __init__(self, player, name, address, rom_address): + def __init__(self, player, name, address, rom_address, type): super(PokemonRBLocation, self).__init__( player, name, address ) - self.rom_address = rom_address \ No newline at end of file + self.rom_address = rom_address + self.type = type diff --git a/worlds/pokemon_rb/logic.py b/worlds/pokemon_rb/logic.py index 70e825c2..8425bcdb 100644 --- a/worlds/pokemon_rb/logic.py +++ b/worlds/pokemon_rb/logic.py @@ -45,14 +45,13 @@ class PokemonLogic(LogicMixin): ["Boulder Badge", "Cascade Badge", "Thunder Badge", "Rainbow Badge", "Soul Badge", "Marsh Badge", "Volcano Badge", "Earth Badge", "Bicycle", "Silph Scope", "Item Finder", "Super Rod", "Good Rod", "Old Rod", "Lift Key", "Card Key", "Town Map", "Coin Case", "S.S. Ticket", "Secret Key", - "Mansion Key", "Safari Pass", "Plant Key", "Hideout Key", "HM01 Cut", "HM02 Fly", "HM03 Surf", - "HM04 Strength", "HM05 Flash"] if self.has(item, player)]) >= count + "Poke Flute", "Mansion Key", "Safari Pass", "Plant Key", "Hideout Key", "HM01 Cut", "HM02 Fly", + "HM03 Surf", "HM04 Strength", "HM05 Flash"] if self.has(item, player)]) >= count def pokemon_rb_can_pass_guards(self, player): if self.multiworld.tea[player].value: return self.has("Tea", player) else: - # this could just be "True", but you never know what weird options I might introduce later ;) return self.can_reach("Celadon City - Counter Man", "Location", player) def pokemon_rb_has_badges(self, count, player): @@ -60,13 +59,8 @@ class PokemonLogic(LogicMixin): "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) + return ((not self.multiworld.require_pokedex[player] or self.has("Pokedex", player)) + and self.pokemon_rb_has_pokemon(count, player)) def pokemon_rb_has_pokemon(self, count, player): obtained_pokemon = set() diff --git a/worlds/pokemon_rb/options.py b/worlds/pokemon_rb/options.py index ae51c47b..b705e6f2 100644 --- a/worlds/pokemon_rb/options.py +++ b/worlds/pokemon_rb/options.py @@ -65,7 +65,7 @@ class CeruleanCaveCondition(Range): 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 + range_end = 26 default = 20 @@ -155,6 +155,12 @@ class RandomizeHiddenItems(Choice): default = 0 +class PrizeSanity(Toggle): + """Shuffles the TM prizes at the Celadon Prize Corner into the item pool.""" + display_name = "Prizesanity" + 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 @@ -163,12 +169,44 @@ class TrainerSanity(Toggle): default = 0 +class RequirePokedex(Toggle): + """Require the Pokedex to obtain items from Oak's Aides or from Dexsanity checks.""" + display_name = "Require Pokedex" + default = 1 + + +class AllPokemonSeen(Toggle): + """Start with all Pokemon "seen" in your Pokedex. This allows you to see where Pokemon can be encountered in the + wild. Pokemon found by fishing or in the Cerulean Cave are not displayed.""" + default = 0 + + +class DexSanity(Toggle): + """Adds a location check for each Pokemon flagged "Owned" on your Pokedex. If accessibility is set to `locations` + and randomize_wild_pokemon is off, catch_em_all is not `all_pokemon` or randomize_legendary_pokemon is not `any`, + accessibility will be forced to `items` instead, as not all Dexsanity locations can be guaranteed to be considered + reachable in logic. + If Pokedex is required, the items for Pokemon acquired before acquiring the Pokedex can be found by talking to + Professor Oak or evaluating the Pokedex via Oak's PC.""" + display_name = "Dexsanity" + default = 0 + + class FreeFlyLocation(Toggle): """One random fly destination will be unlocked by default.""" display_name = "Free Fly Location" default = 1 +class RandomizeRockTunnel(Toggle): + """Randomize the layout of Rock Tunnel. This is highly experimental, if you encounter any issues (items or trainers + unreachable, trainers walking over walls, inability to reach end of tunnel, anything looking strange) to + Alchav#8826 in the Archipelago Discord (directly or in #pkmn-red-blue) along with the seed number found on the + signs outside the tunnel.""" + display_name = "Randomize Rock Tunnel" + default = 0 + + class OaksAidRt2(Range): """Number of Pokemon registered in the Pokedex required to receive the item from Oak's Aide on Route 2. Vanilla is 10.""" @@ -229,6 +267,12 @@ class RandomizeWildPokemon(Choice): option_completely_random = 4 +class Area1To1Mapping(Toggle): + """When randomizing wild Pokemon, for each zone, all instances of a particular Pokemon will be replaced with the + same Pokemon, resulting in fewer Pokemon in each area.""" + default = 1 + + class RandomizeStarterPokemon(Choice): """Randomize the starter Pokemon choices.""" display_name = "Randomize Starter Pokemon" @@ -334,6 +378,13 @@ class MinimumCatchRate(Range): default = 3 +class MoveBalancing(Toggle): + """All one-hit-KO moves and fixed-damage moves become normal damaging moves. + Blizzard, and moves that cause sleep have their accuracy reduced.""" + display_name = "Move Balancing" + default = 0 + + class RandomizePokemonMovesets(Choice): """Randomize the moves learned by Pokemon. prefer_types will prefer moves that match the type of the Pokemon.""" display_name = "Randomize Pokemon Movesets" @@ -343,6 +394,12 @@ class RandomizePokemonMovesets(Choice): default = 0 +class ConfineTranstormToDitto(Toggle): + """Regardless of moveset randomization, will keep Ditto's first move as Transform no others will learn it. + If an enemy Pokemon uses transform before you catch it, it will permanently change to Ditto after capture.""" + display_name = "Confine Transform to Ditto" + default = 1 + class StartWithFourMoves(Toggle): """If movesets are randomized, this will give all Pokemon 4 starting moves.""" display_name = "Start With Four Moves" @@ -356,30 +413,62 @@ class SameTypeAttackBonus(Toggle): 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 - TM compatibility when they evolve if the evolved form has the same type(s). Mew will always be able to learn - every TM.""" - display_name = "TM Compatibility" - default = 0 - option_vanilla = 0 - option_prefer_types = 1 - option_completely_random = 2 - option_full_compatibility = 3 +class RandomizeTMMoves(Toggle): + """Randomize the moves taught by TMs. + All TM items will be flagged as 'filler' items regardless of how good the move they teach are.""" + display_name = "Randomize TM Moves" -class HMCompatibility(Choice): - """Randomize which Pokemon can learn each HM. prefer_types: 100% chance if Pokemon's type matches the move, - 75% chance if move is Normal type and the Pokemon is not, and 25% chance otherwise. Pokemon will retain the same - HM compatibility when they evolve if the evolved form has the same type(s). Mew will always be able to learn - every HM.""" - display_name = "HM Compatibility" - default = 0 - option_vanilla = 0 - option_prefer_types = 1 - option_completely_random = 2 - option_full_compatibility = 3 +class TMHMCompatibility(SpecialRange): + range_start = -1 + range_end = 100 + special_range_names = { + "vanilla": -1, + "none": 0, + "full": 100 + } + default = -1 + + +class TMSameTypeCompatibility(TMHMCompatibility): + """Chance of each TM being usable on each Pokemon whose type matches the move.""" + display_name = "TM Same-Type Compatibility" + + +class TMNormalTypeCompatibility(TMHMCompatibility): + """Chance of each TM being usable on each Pokemon if the move is Normal type and the Pokemon is not.""" + display_name = "TM Normal-Type Compatibility" + + +class TMOtherTypeCompatibility(TMHMCompatibility): + """Chance of each TM being usable on each Pokemon if the move a type other than Normal or one of the Pokemon's types.""" + display_name = "TM Other-Type Compatibility" + + +class HMSameTypeCompatibility(TMHMCompatibility): + """Chance of each HM being usable on each Pokemon whose type matches the move. + At least one Pokemon will always be able to learn the moves needed to meet your accessibility requirements.""" + display_name = "HM Same-Type Compatibility" + + +class HMNormalTypeCompatibility(TMHMCompatibility): + """Chance of each HM being usable on each Pokemon if the move is Normal type and the Pokemon is not. + At least one Pokemon will always be able to learn the moves needed to meet your accessibility requirements.""" + display_name = "HM Normal-Type Compatibility" + + +class HMOtherTypeCompatibility(TMHMCompatibility): + """Chance of each HM being usable on each Pokemon if the move a type other than Normal or one of the Pokemon's types. + At least one Pokemon will always be able to learn the moves needed to meet your accessibility requirements.""" + display_name = "HM Other-Type Compatibility" + + +class InheritTMHMCompatibility(Toggle): + """If on, evolved Pokemon will inherit their pre-evolved form's TM and HM compatibilities. + They will then roll the above set chances again at a 50% lower rate for all TMs and HMs their predecessor could not + learn, unless the evolved form has additional or different types, then moves of those new types will be rolled + at the full set chance.""" + display_name = "Inherit TM/HM Compatibility" class RandomizePokemonTypes(Choice): @@ -543,6 +632,17 @@ class IceTrapWeight(TrapWeight): default = 0 +class RandomizePokemonPalettes(Choice): + """Modify palettes of Pokemon. Primary Type will set Pokemons' palettes based on their primary type, Follow + Evolutions will randomize palettes but palettes will remain the same through evolutions (except Eeveelutions), + Completely Random will randomize all Pokemons' palettes individually""" + display_name = "Randomize Pokemon Palettes" + option_vanilla = 0 + option_primary_type = 1 + option_follow_evolutions = 2 + option_completely_random = 3 + + pokemon_rb_options = { "game_version": GameVersion, "trainer_name": TrainerName, @@ -561,16 +661,22 @@ pokemon_rb_options = { "extra_strength_boulders": ExtraStrengthBoulders, "require_item_finder": RequireItemFinder, "randomize_hidden_items": RandomizeHiddenItems, + "prizesanity": PrizeSanity, "trainersanity": TrainerSanity, - "badges_needed_for_hm_moves": BadgesNeededForHMMoves, - "free_fly_location": FreeFlyLocation, + "require_pokedex": RequirePokedex, + "all_pokemon_seen": AllPokemonSeen, + "dexsanity": DexSanity, "oaks_aide_rt_2": OaksAidRt2, "oaks_aide_rt_11": OaksAidRt11, "oaks_aide_rt_15": OaksAidRt15, + "badges_needed_for_hm_moves": BadgesNeededForHMMoves, + "free_fly_location": FreeFlyLocation, + "randomize_rock_tunnel": RandomizeRockTunnel, "blind_trainers": BlindTrainers, "minimum_steps_between_encounters": MinimumStepsBetweenEncounters, "exp_modifier": ExpModifier, "randomize_wild_pokemon": RandomizeWildPokemon, + "area_1_to_1_mapping": Area1To1Mapping, "randomize_starter_pokemon": RandomizeStarterPokemon, "randomize_static_pokemon": RandomizeStaticPokemon, "randomize_legendary_pokemon": RandomizeLegendaryPokemon, @@ -580,11 +686,19 @@ pokemon_rb_options = { "minimum_catch_rate": MinimumCatchRate, "randomize_trainer_parties": RandomizeTrainerParties, "trainer_legendaries": TrainerLegendaries, + "move_balancing": MoveBalancing, "randomize_pokemon_movesets": RandomizePokemonMovesets, + "confine_transform_to_ditto": ConfineTranstormToDitto, "start_with_four_moves": StartWithFourMoves, "same_type_attack_bonus": SameTypeAttackBonus, - "tm_compatibility": TMCompatibility, - "hm_compatibility": HMCompatibility, + "randomize_tm_moves": RandomizeTMMoves, + "tm_same_type_compatibility": TMSameTypeCompatibility, + "tm_normal_type_compatibility": TMNormalTypeCompatibility, + "tm_other_type_compatibility": TMOtherTypeCompatibility, + "hm_same_type_compatibility": HMSameTypeCompatibility, + "hm_normal_type_compatibility": HMNormalTypeCompatibility, + "hm_other_type_compatibility": HMOtherTypeCompatibility, + "inherit_tm_hm_compatibility": InheritTMHMCompatibility, "randomize_pokemon_types": RandomizePokemonTypes, "secondary_type_chance": SecondaryTypeChance, "randomize_type_chart": RandomizeTypeChart, @@ -604,5 +718,6 @@ pokemon_rb_options = { "fire_trap_weight": FireTrapWeight, "paralyze_trap_weight": ParalyzeTrapWeight, "ice_trap_weight": IceTrapWeight, + "randomize_pokemon_palettes": RandomizePokemonPalettes, "death_link": DeathLink } diff --git a/worlds/pokemon_rb/poke_data.py b/worlds/pokemon_rb/poke_data.py index 691db1c4..6218c70a 100644 --- a/worlds/pokemon_rb/poke_data.py +++ b/worlds/pokemon_rb/poke_data.py @@ -1006,172 +1006,172 @@ learnsets = { } moves = { - 'No Move': {'id': 0, 'power': 0, 'type': 'Typeless', 'accuracy': 0, 'pp': 0}, - 'Pound': {'id': 1, 'power': 40, 'type': 'Normal', 'accuracy': 100, 'pp': 35}, - 'Karate Chop': {'id': 2, 'power': 50, 'type': 'Normal', 'accuracy': 100, 'pp': 25}, - 'Doubleslap': {'id': 3, 'power': 15, 'type': 'Normal', 'accuracy': 85, 'pp': 10}, - 'Comet Punch': {'id': 4, 'power': 18, 'type': 'Normal', 'accuracy': 85, 'pp': 15}, - 'Mega Punch': {'id': 5, 'power': 80, 'type': 'Normal', 'accuracy': 85, 'pp': 20}, - 'Pay Day': {'id': 6, 'power': 40, 'type': 'Normal', 'accuracy': 100, 'pp': 20}, - 'Fire Punch': {'id': 7, 'power': 75, 'type': 'Fire', 'accuracy': 100, 'pp': 15}, - 'Ice Punch': {'id': 8, 'power': 75, 'type': 'Ice', 'accuracy': 100, 'pp': 15}, - 'Thunderpunch': {'id': 9, 'power': 75, 'type': 'Electric', 'accuracy': 100, 'pp': 15}, - 'Scratch': {'id': 10, 'power': 40, 'type': 'Normal', 'accuracy': 100, 'pp': 35}, - 'Vicegrip': {'id': 11, 'power': 55, 'type': 'Normal', 'accuracy': 100, 'pp': 30}, - 'Guillotine': {'id': 12, 'power': 1, 'type': 'Normal', 'accuracy': 30, 'pp': 5}, - 'Razor Wind': {'id': 13, 'power': 80, 'type': 'Normal', 'accuracy': 75, 'pp': 10}, - 'Swords Dance': {'id': 14, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30}, - 'Cut': {'id': 15, 'power': 50, 'type': 'Normal', 'accuracy': 95, 'pp': 30}, - 'Gust': {'id': 16, 'power': 40, 'type': 'Normal', 'accuracy': 100, 'pp': 35}, - 'Wing Attack': {'id': 17, 'power': 35, 'type': 'Flying', 'accuracy': 100, 'pp': 35}, - 'Whirlwind': {'id': 18, 'power': 0, 'type': 'Normal', 'accuracy': 85, 'pp': 20}, - 'Fly': {'id': 19, 'power': 70, 'type': 'Flying', 'accuracy': 95, 'pp': 15}, - 'Bind': {'id': 20, 'power': 15, 'type': 'Normal', 'accuracy': 75, 'pp': 20}, - 'Slam': {'id': 21, 'power': 80, 'type': 'Normal', 'accuracy': 75, 'pp': 20}, - 'Vine Whip': {'id': 22, 'power': 35, 'type': 'Grass', 'accuracy': 100, 'pp': 10}, - 'Stomp': {'id': 23, 'power': 65, 'type': 'Normal', 'accuracy': 100, 'pp': 20}, - 'Double Kick': {'id': 24, 'power': 30, 'type': 'Fighting', 'accuracy': 100, 'pp': 30}, - 'Mega Kick': {'id': 25, 'power': 120, 'type': 'Normal', 'accuracy': 75, 'pp': 5}, - 'Jump Kick': {'id': 26, 'power': 70, 'type': 'Fighting', 'accuracy': 95, 'pp': 25}, - 'Rolling Kick': {'id': 27, 'power': 60, 'type': 'Fighting', 'accuracy': 85, 'pp': 15}, - 'Sand Attack': {'id': 28, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 15}, - 'Headbutt': {'id': 29, 'power': 70, 'type': 'Normal', 'accuracy': 100, 'pp': 15}, - 'Horn Attack': {'id': 30, 'power': 65, 'type': 'Normal', 'accuracy': 100, 'pp': 25}, - 'Fury Attack': {'id': 31, 'power': 15, 'type': 'Normal', 'accuracy': 85, 'pp': 20}, - 'Horn Drill': {'id': 32, 'power': 1, 'type': 'Normal', 'accuracy': 30, 'pp': 5}, - 'Tackle': {'id': 33, 'power': 35, 'type': 'Normal', 'accuracy': 95, 'pp': 35}, - 'Body Slam': {'id': 34, 'power': 85, 'type': 'Normal', 'accuracy': 100, 'pp': 15}, - 'Wrap': {'id': 35, 'power': 15, 'type': 'Normal', 'accuracy': 85, 'pp': 20}, - 'Take Down': {'id': 36, 'power': 90, 'type': 'Normal', 'accuracy': 85, 'pp': 20}, - 'Thrash': {'id': 37, 'power': 90, 'type': 'Normal', 'accuracy': 100, 'pp': 20}, - 'Double Edge': {'id': 38, 'power': 100, 'type': 'Normal', 'accuracy': 100, 'pp': 15}, - 'Tail Whip': {'id': 39, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30}, - 'Poison Sting': {'id': 40, 'power': 15, 'type': 'Poison', 'accuracy': 100, 'pp': 35}, - 'Twineedle': {'id': 41, 'power': 25, 'type': 'Bug', 'accuracy': 100, 'pp': 20}, - 'Pin Missile': {'id': 42, 'power': 14, 'type': 'Bug', 'accuracy': 85, 'pp': 20}, - 'Leer': {'id': 43, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30}, - 'Bite': {'id': 44, 'power': 60, 'type': 'Normal', 'accuracy': 100, 'pp': 25}, - 'Growl': {'id': 45, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 40}, - 'Roar': {'id': 46, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 20}, - 'Sing': {'id': 47, 'power': 0, 'type': 'Normal', 'accuracy': 55, 'pp': 15}, - 'Supersonic': {'id': 48, 'power': 0, 'type': 'Normal', 'accuracy': 55, 'pp': 20}, - 'Sonicboom': {'id': 49, 'power': 1, 'type': 'Normal', 'accuracy': 90, 'pp': 20}, - 'Disable': {'id': 50, 'power': 0, 'type': 'Normal', 'accuracy': 55, 'pp': 20}, - 'Acid': {'id': 51, 'power': 40, 'type': 'Poison', 'accuracy': 100, 'pp': 30}, - 'Ember': {'id': 52, 'power': 40, 'type': 'Fire', 'accuracy': 100, 'pp': 25}, - 'Flamethrower': {'id': 53, 'power': 95, 'type': 'Fire', 'accuracy': 100, 'pp': 15}, - 'Mist': {'id': 54, 'power': 0, 'type': 'Ice', 'accuracy': 100, 'pp': 30}, - 'Water Gun': {'id': 55, 'power': 40, 'type': 'Water', 'accuracy': 100, 'pp': 25}, - 'Hydro Pump': {'id': 56, 'power': 120, 'type': 'Water', 'accuracy': 80, 'pp': 5}, - 'Surf': {'id': 57, 'power': 95, 'type': 'Water', 'accuracy': 100, 'pp': 15}, - 'Ice Beam': {'id': 58, 'power': 95, 'type': 'Ice', 'accuracy': 100, 'pp': 10}, - 'Blizzard': {'id': 59, 'power': 120, 'type': 'Ice', 'accuracy': 90, 'pp': 5}, - 'Psybeam': {'id': 60, 'power': 65, 'type': 'Psychic', 'accuracy': 100, 'pp': 20}, - 'Bubblebeam': {'id': 61, 'power': 65, 'type': 'Water', 'accuracy': 100, 'pp': 20}, - 'Aurora Beam': {'id': 62, 'power': 65, 'type': 'Ice', 'accuracy': 100, 'pp': 20}, - 'Hyper Beam': {'id': 63, 'power': 150, 'type': 'Normal', 'accuracy': 90, 'pp': 5}, - 'Peck': {'id': 64, 'power': 35, 'type': 'Flying', 'accuracy': 100, 'pp': 35}, - 'Drill Peck': {'id': 65, 'power': 80, 'type': 'Flying', 'accuracy': 100, 'pp': 20}, - 'Submission': {'id': 66, 'power': 80, 'type': 'Fighting', 'accuracy': 80, 'pp': 25}, - 'Low Kick': {'id': 67, 'power': 50, 'type': 'Fighting', 'accuracy': 90, 'pp': 20}, - 'Counter': {'id': 68, 'power': 1, 'type': 'Fighting', 'accuracy': 100, 'pp': 20}, - 'Seismic Toss': {'id': 69, 'power': 1, 'type': 'Fighting', 'accuracy': 100, 'pp': 20}, - 'Strength': {'id': 70, 'power': 80, 'type': 'Normal', 'accuracy': 100, 'pp': 15}, - 'Absorb': {'id': 71, 'power': 20, 'type': 'Grass', 'accuracy': 100, 'pp': 20}, - 'Mega Drain': {'id': 72, 'power': 40, 'type': 'Grass', 'accuracy': 100, 'pp': 10}, - 'Leech Seed': {'id': 73, 'power': 0, 'type': 'Grass', 'accuracy': 90, 'pp': 10}, - 'Growth': {'id': 74, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 40}, - 'Razor Leaf': {'id': 75, 'power': 55, 'type': 'Grass', 'accuracy': 95, 'pp': 25}, - 'Solarbeam': {'id': 76, 'power': 120, 'type': 'Grass', 'accuracy': 100, 'pp': 10}, - 'Poisonpowder': {'id': 77, 'power': 0, 'type': 'Poison', 'accuracy': 75, 'pp': 35}, - 'Stun Spore': {'id': 78, 'power': 0, 'type': 'Grass', 'accuracy': 75, 'pp': 30}, - 'Sleep Powder': {'id': 79, 'power': 0, 'type': 'Grass', 'accuracy': 75, 'pp': 15}, - 'Petal Dance': {'id': 80, 'power': 70, 'type': 'Grass', 'accuracy': 100, 'pp': 20}, - 'String Shot': {'id': 81, 'power': 0, 'type': 'Bug', 'accuracy': 95, 'pp': 40}, - 'Dragon Rage': {'id': 82, 'power': 1, 'type': 'Dragon', 'accuracy': 100, 'pp': 10}, - 'Fire Spin': {'id': 83, 'power': 15, 'type': 'Fire', 'accuracy': 70, 'pp': 15}, - 'Thundershock': {'id': 84, 'power': 40, 'type': 'Electric', 'accuracy': 100, 'pp': 30}, - 'Thunderbolt': {'id': 85, 'power': 95, 'type': 'Electric', 'accuracy': 100, 'pp': 15}, - 'Thunder Wave': {'id': 86, 'power': 0, 'type': 'Electric', 'accuracy': 100, 'pp': 20}, - 'Thunder': {'id': 87, 'power': 120, 'type': 'Electric', 'accuracy': 70, 'pp': 10}, - 'Rock Throw': {'id': 88, 'power': 50, 'type': 'Rock', 'accuracy': 65, 'pp': 15}, - 'Earthquake': {'id': 89, 'power': 100, 'type': 'Ground', 'accuracy': 100, 'pp': 10}, - 'Fissure': {'id': 90, 'power': 1, 'type': 'Ground', 'accuracy': 30, 'pp': 5}, - 'Dig': {'id': 91, 'power': 100, 'type': 'Ground', 'accuracy': 100, 'pp': 10}, - 'Toxic': {'id': 92, 'power': 0, 'type': 'Poison', 'accuracy': 85, 'pp': 10}, - 'Confusion': {'id': 93, 'power': 50, 'type': 'Psychic', 'accuracy': 100, 'pp': 25}, - 'Psychic': {'id': 94, 'power': 90, 'type': 'Psychic', 'accuracy': 100, 'pp': 10}, - 'Hypnosis': {'id': 95, 'power': 0, 'type': 'Psychic', 'accuracy': 60, 'pp': 20}, - 'Meditate': {'id': 96, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 40}, - 'Agility': {'id': 97, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 30}, - 'Quick Attack': {'id': 98, 'power': 40, 'type': 'Normal', 'accuracy': 100, 'pp': 30}, - 'Rage': {'id': 99, 'power': 20, 'type': 'Normal', 'accuracy': 100, 'pp': 20}, - 'Teleport': {'id': 100, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 20}, - 'Night Shade': {'id': 101, 'power': 0, 'type': 'Ghost', 'accuracy': 100, 'pp': 15}, - 'Mimic': {'id': 102, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10}, - 'Screech': {'id': 103, 'power': 0, 'type': 'Normal', 'accuracy': 85, 'pp': 40}, - 'Double Team': {'id': 104, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 15}, - 'Recover': {'id': 105, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 20}, - 'Harden': {'id': 106, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30}, - 'Minimize': {'id': 107, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 20}, - 'Smokescreen': {'id': 108, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 20}, - 'Confuse Ray': {'id': 109, 'power': 0, 'type': 'Ghost', 'accuracy': 100, 'pp': 10}, - 'Withdraw': {'id': 110, 'power': 0, 'type': 'Water', 'accuracy': 100, 'pp': 40}, - 'Defense Curl': {'id': 111, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 40}, - 'Barrier': {'id': 112, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 30}, - 'Light Screen': {'id': 113, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 30}, - 'Haze': {'id': 114, 'power': 0, 'type': 'Ice', 'accuracy': 100, 'pp': 30}, - 'Reflect': {'id': 115, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 20}, - 'Focus Energy': {'id': 116, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30}, - 'Bide': {'id': 117, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10}, - 'Metronome': {'id': 118, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10}, - 'Mirror Move': {'id': 119, 'power': 0, 'type': 'Flying', 'accuracy': 100, 'pp': 20}, - 'Selfdestruct': {'id': 120, 'power': 130, 'type': 'Normal', 'accuracy': 100, 'pp': 5}, - 'Egg Bomb': {'id': 121, 'power': 100, 'type': 'Normal', 'accuracy': 75, 'pp': 10}, - 'Lick': {'id': 122, 'power': 20, 'type': 'Ghost', 'accuracy': 100, 'pp': 30}, - 'Smog': {'id': 123, 'power': 20, 'type': 'Poison', 'accuracy': 70, 'pp': 20}, - 'Sludge': {'id': 124, 'power': 65, 'type': 'Poison', 'accuracy': 100, 'pp': 20}, - 'Bone Club': {'id': 125, 'power': 65, 'type': 'Ground', 'accuracy': 85, 'pp': 20}, - 'Fire Blast': {'id': 126, 'power': 120, 'type': 'Fire', 'accuracy': 85, 'pp': 5}, - 'Waterfall': {'id': 127, 'power': 80, 'type': 'Water', 'accuracy': 100, 'pp': 15}, - 'Clamp': {'id': 128, 'power': 35, 'type': 'Water', 'accuracy': 75, 'pp': 10}, - 'Swift': {'id': 129, 'power': 60, 'type': 'Normal', 'accuracy': 100, 'pp': 20}, - 'Skull Bash': {'id': 130, 'power': 100, 'type': 'Normal', 'accuracy': 100, 'pp': 15}, - 'Spike Cannon': {'id': 131, 'power': 20, 'type': 'Normal', 'accuracy': 100, 'pp': 15}, - 'Constrict': {'id': 132, 'power': 10, 'type': 'Normal', 'accuracy': 100, 'pp': 35}, - 'Amnesia': {'id': 133, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 20}, - 'Kinesis': {'id': 134, 'power': 0, 'type': 'Psychic', 'accuracy': 80, 'pp': 15}, - 'Softboiled': {'id': 135, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10}, - 'Hi Jump Kick': {'id': 136, 'power': 85, 'type': 'Fighting', 'accuracy': 90, 'pp': 20}, - 'Glare': {'id': 137, 'power': 0, 'type': 'Normal', 'accuracy': 75, 'pp': 30}, - 'Dream Eater': {'id': 138, 'power': 100, 'type': 'Psychic', 'accuracy': 100, 'pp': 15}, - 'Poison Gas': {'id': 139, 'power': 0, 'type': 'Poison', 'accuracy': 55, 'pp': 40}, - 'Barrage': {'id': 140, 'power': 15, 'type': 'Normal', 'accuracy': 85, 'pp': 20}, - 'Leech Life': {'id': 141, 'power': 20, 'type': 'Bug', 'accuracy': 100, 'pp': 15}, - 'Lovely Kiss': {'id': 142, 'power': 0, 'type': 'Normal', 'accuracy': 75, 'pp': 10}, - 'Sky Attack': {'id': 143, 'power': 140, 'type': 'Flying', 'accuracy': 90, 'pp': 5}, - 'Transform': {'id': 144, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10}, - 'Bubble': {'id': 145, 'power': 20, 'type': 'Water', 'accuracy': 100, 'pp': 30}, - 'Dizzy Punch': {'id': 146, 'power': 70, 'type': 'Normal', 'accuracy': 100, 'pp': 10}, - 'Spore': {'id': 147, 'power': 0, 'type': 'Grass', 'accuracy': 100, 'pp': 15}, - 'Flash': {'id': 148, 'power': 0, 'type': 'Normal', 'accuracy': 70, 'pp': 20}, - 'Psywave': {'id': 149, 'power': 1, 'type': 'Psychic', 'accuracy': 80, 'pp': 15}, - 'Splash': {'id': 150, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 40}, - 'Acid Armor': {'id': 151, 'power': 0, 'type': 'Poison', 'accuracy': 100, 'pp': 40}, - 'Crabhammer': {'id': 152, 'power': 90, 'type': 'Water', 'accuracy': 85, 'pp': 10}, - 'Explosion': {'id': 153, 'power': 170, 'type': 'Normal', 'accuracy': 100, 'pp': 5}, - 'Fury Swipes': {'id': 154, 'power': 18, 'type': 'Normal', 'accuracy': 80, 'pp': 15}, - 'Bonemerang': {'id': 155, 'power': 50, 'type': 'Ground', 'accuracy': 90, 'pp': 10}, - 'Rest': {'id': 156, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 10}, - 'Rock Slide': {'id': 157, 'power': 75, 'type': 'Rock', 'accuracy': 90, 'pp': 10}, - 'Hyper Fang': {'id': 158, 'power': 80, 'type': 'Normal', 'accuracy': 90, 'pp': 15}, - 'Sharpen': {'id': 159, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30}, - 'Conversion': {'id': 160, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30}, - 'Tri Attack': {'id': 161, 'power': 80, 'type': 'Normal', 'accuracy': 100, 'pp': 10}, - 'Super Fang': {'id': 162, 'power': 1, 'type': 'Normal', 'accuracy': 90, 'pp': 10}, - 'Slash': {'id': 163, 'power': 70, 'type': 'Normal', 'accuracy': 100, 'pp': 20}, - 'Substitute': {'id': 164, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10}, - #'Struggle': {'id': 165, 'power': 50, 'type': 'Struggle_Type', 'accuracy': 100, 'pp': 10} + 'No Move': {'id': 0, 'power': 0, 'type': 'Typeless', 'accuracy': 0, 'pp': 0, 'effect': 0}, + 'Pound': {'id': 1, 'power': 40, 'type': 'Normal', 'accuracy': 100, 'pp': 35, 'effect': 0}, + 'Karate Chop': {'id': 2, 'power': 50, 'type': 'Normal', 'accuracy': 100, 'pp': 25, 'effect': 0}, + 'Doubleslap': {'id': 3, 'power': 15, 'type': 'Normal', 'accuracy': 85, 'pp': 10, 'effect': 29}, + 'Comet Punch': {'id': 4, 'power': 18, 'type': 'Normal', 'accuracy': 85, 'pp': 15, 'effect': 29}, + 'Mega Punch': {'id': 5, 'power': 80, 'type': 'Normal', 'accuracy': 85, 'pp': 20, 'effect': 0}, + 'Pay Day': {'id': 6, 'power': 40, 'type': 'Normal', 'accuracy': 100, 'pp': 20, 'effect': 16}, + 'Fire Punch': {'id': 7, 'power': 75, 'type': 'Fire', 'accuracy': 100, 'pp': 15, 'effect': 4}, + 'Ice Punch': {'id': 8, 'power': 75, 'type': 'Ice', 'accuracy': 100, 'pp': 15, 'effect': 5}, + 'Thunderpunch': {'id': 9, 'power': 75, 'type': 'Electric', 'accuracy': 100, 'pp': 15, 'effect': 6}, + 'Scratch': {'id': 10, 'power': 40, 'type': 'Normal', 'accuracy': 100, 'pp': 35, 'effect': 0}, + 'Vicegrip': {'id': 11, 'power': 55, 'type': 'Normal', 'accuracy': 100, 'pp': 30, 'effect': 0}, + 'Guillotine': {'id': 12, 'power': 1, 'type': 'Normal', 'accuracy': 30, 'pp': 5, 'effect': 38}, + 'Razor Wind': {'id': 13, 'power': 80, 'type': 'Normal', 'accuracy': 75, 'pp': 10, 'effect': 39}, + 'Swords Dance': {'id': 14, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30, 'effect': 50}, + 'Cut': {'id': 15, 'power': 50, 'type': 'Normal', 'accuracy': 95, 'pp': 30, 'effect': 0}, + 'Gust': {'id': 16, 'power': 40, 'type': 'Normal', 'accuracy': 100, 'pp': 35, 'effect': 0}, + 'Wing Attack': {'id': 17, 'power': 35, 'type': 'Flying', 'accuracy': 100, 'pp': 35, 'effect': 0}, + 'Whirlwind': {'id': 18, 'power': 0, 'type': 'Normal', 'accuracy': 85, 'pp': 20, 'effect': 28}, + 'Fly': {'id': 19, 'power': 70, 'type': 'Flying', 'accuracy': 95, 'pp': 15, 'effect': 43}, + 'Bind': {'id': 20, 'power': 15, 'type': 'Normal', 'accuracy': 75, 'pp': 20, 'effect': 42}, + 'Slam': {'id': 21, 'power': 80, 'type': 'Normal', 'accuracy': 75, 'pp': 20, 'effect': 0}, + 'Vine Whip': {'id': 22, 'power': 35, 'type': 'Grass', 'accuracy': 100, 'pp': 10, 'effect': 0}, + 'Stomp': {'id': 23, 'power': 65, 'type': 'Normal', 'accuracy': 100, 'pp': 20, 'effect': 37}, + 'Double Kick': {'id': 24, 'power': 30, 'type': 'Fighting', 'accuracy': 100, 'pp': 30, 'effect': 44}, + 'Mega Kick': {'id': 25, 'power': 120, 'type': 'Normal', 'accuracy': 75, 'pp': 5, 'effect': 0}, + 'Jump Kick': {'id': 26, 'power': 70, 'type': 'Fighting', 'accuracy': 95, 'pp': 25, 'effect': 45}, + 'Rolling Kick': {'id': 27, 'power': 60, 'type': 'Fighting', 'accuracy': 85, 'pp': 15, 'effect': 37}, + 'Sand Attack': {'id': 28, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 15, 'effect': 22}, + 'Headbutt': {'id': 29, 'power': 70, 'type': 'Normal', 'accuracy': 100, 'pp': 15, 'effect': 37}, + 'Horn Attack': {'id': 30, 'power': 65, 'type': 'Normal', 'accuracy': 100, 'pp': 25, 'effect': 0}, + 'Fury Attack': {'id': 31, 'power': 15, 'type': 'Normal', 'accuracy': 85, 'pp': 20, 'effect': 29}, + 'Horn Drill': {'id': 32, 'power': 1, 'type': 'Normal', 'accuracy': 30, 'pp': 5, 'effect': 38}, + 'Tackle': {'id': 33, 'power': 35, 'type': 'Normal', 'accuracy': 95, 'pp': 35, 'effect': 0}, + 'Body Slam': {'id': 34, 'power': 85, 'type': 'Normal', 'accuracy': 100, 'pp': 15, 'effect': 36}, + 'Wrap': {'id': 35, 'power': 15, 'type': 'Normal', 'accuracy': 85, 'pp': 20, 'effect': 42}, + 'Take Down': {'id': 36, 'power': 90, 'type': 'Normal', 'accuracy': 85, 'pp': 20, 'effect': 48}, + 'Thrash': {'id': 37, 'power': 90, 'type': 'Normal', 'accuracy': 100, 'pp': 20, 'effect': 27}, + 'Double Edge': {'id': 38, 'power': 100, 'type': 'Normal', 'accuracy': 100, 'pp': 15, 'effect': 48}, + 'Tail Whip': {'id': 39, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30, 'effect': 19}, + 'Poison Sting': {'id': 40, 'power': 15, 'type': 'Poison', 'accuracy': 100, 'pp': 35, 'effect': 2}, + 'Twineedle': {'id': 41, 'power': 25, 'type': 'Bug', 'accuracy': 100, 'pp': 20, 'effect': 77}, + 'Pin Missile': {'id': 42, 'power': 14, 'type': 'Bug', 'accuracy': 85, 'pp': 20, 'effect': 29}, + 'Leer': {'id': 43, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30, 'effect': 19}, + 'Bite': {'id': 44, 'power': 60, 'type': 'Normal', 'accuracy': 100, 'pp': 25, 'effect': 31}, + 'Growl': {'id': 45, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 40, 'effect': 18}, + 'Roar': {'id': 46, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 20, 'effect': 28}, + 'Sing': {'id': 47, 'power': 0, 'type': 'Normal', 'accuracy': 55, 'pp': 15, 'effect': 32}, + 'Supersonic': {'id': 48, 'power': 0, 'type': 'Normal', 'accuracy': 55, 'pp': 20, 'effect': 49}, + 'Sonicboom': {'id': 49, 'power': 1, 'type': 'Normal', 'accuracy': 90, 'pp': 20, 'effect': 41}, + 'Disable': {'id': 50, 'power': 0, 'type': 'Normal', 'accuracy': 55, 'pp': 20, 'effect': 86}, + 'Acid': {'id': 51, 'power': 40, 'type': 'Poison', 'accuracy': 100, 'pp': 30, 'effect': 69}, + 'Ember': {'id': 52, 'power': 40, 'type': 'Fire', 'accuracy': 100, 'pp': 25, 'effect': 4}, + 'Flamethrower': {'id': 53, 'power': 95, 'type': 'Fire', 'accuracy': 100, 'pp': 15, 'effect': 4}, + 'Mist': {'id': 54, 'power': 0, 'type': 'Ice', 'accuracy': 100, 'pp': 30, 'effect': 46}, + 'Water Gun': {'id': 55, 'power': 40, 'type': 'Water', 'accuracy': 100, 'pp': 25, 'effect': 0}, + 'Hydro Pump': {'id': 56, 'power': 120, 'type': 'Water', 'accuracy': 80, 'pp': 5, 'effect': 0}, + 'Surf': {'id': 57, 'power': 95, 'type': 'Water', 'accuracy': 100, 'pp': 15, 'effect': 0}, + 'Ice Beam': {'id': 58, 'power': 95, 'type': 'Ice', 'accuracy': 100, 'pp': 10, 'effect': 5}, + 'Blizzard': {'id': 59, 'power': 120, 'type': 'Ice', 'accuracy': 90, 'pp': 5, 'effect': 5}, + 'Psybeam': {'id': 60, 'power': 65, 'type': 'Psychic', 'accuracy': 100, 'pp': 20, 'effect': 76}, + 'Bubblebeam': {'id': 61, 'power': 65, 'type': 'Water', 'accuracy': 100, 'pp': 20, 'effect': 70}, + 'Aurora Beam': {'id': 62, 'power': 65, 'type': 'Ice', 'accuracy': 100, 'pp': 20, 'effect': 68}, + 'Hyper Beam': {'id': 63, 'power': 150, 'type': 'Normal', 'accuracy': 90, 'pp': 5, 'effect': 80}, + 'Peck': {'id': 64, 'power': 35, 'type': 'Flying', 'accuracy': 100, 'pp': 35, 'effect': 0}, + 'Drill Peck': {'id': 65, 'power': 80, 'type': 'Flying', 'accuracy': 100, 'pp': 20, 'effect': 0}, + 'Submission': {'id': 66, 'power': 80, 'type': 'Fighting', 'accuracy': 80, 'pp': 25, 'effect': 48}, + 'Low Kick': {'id': 67, 'power': 50, 'type': 'Fighting', 'accuracy': 90, 'pp': 20, 'effect': 37}, + 'Counter': {'id': 68, 'power': 1, 'type': 'Fighting', 'accuracy': 100, 'pp': 20, 'effect': 0}, + 'Seismic Toss': {'id': 69, 'power': 1, 'type': 'Fighting', 'accuracy': 100, 'pp': 20, 'effect': 41}, + 'Strength': {'id': 70, 'power': 80, 'type': 'Normal', 'accuracy': 100, 'pp': 15, 'effect': 0}, + 'Absorb': {'id': 71, 'power': 20, 'type': 'Grass', 'accuracy': 100, 'pp': 20, 'effect': 3}, + 'Mega Drain': {'id': 72, 'power': 40, 'type': 'Grass', 'accuracy': 100, 'pp': 10, 'effect': 3}, + 'Leech Seed': {'id': 73, 'power': 0, 'type': 'Grass', 'accuracy': 90, 'pp': 10, 'effect': 84}, + 'Growth': {'id': 74, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 40, 'effect': 13}, + 'Razor Leaf': {'id': 75, 'power': 55, 'type': 'Grass', 'accuracy': 95, 'pp': 25, 'effect': 0}, + 'Solarbeam': {'id': 76, 'power': 120, 'type': 'Grass', 'accuracy': 100, 'pp': 10, 'effect': 39}, + 'Poisonpowder': {'id': 77, 'power': 0, 'type': 'Poison', 'accuracy': 75, 'pp': 35, 'effect': 66}, + 'Stun Spore': {'id': 78, 'power': 0, 'type': 'Grass', 'accuracy': 75, 'pp': 30, 'effect': 67}, + 'Sleep Powder': {'id': 79, 'power': 0, 'type': 'Grass', 'accuracy': 75, 'pp': 15, 'effect': 32}, + 'Petal Dance': {'id': 80, 'power': 70, 'type': 'Grass', 'accuracy': 100, 'pp': 20, 'effect': 27}, + 'String Shot': {'id': 81, 'power': 0, 'type': 'Bug', 'accuracy': 95, 'pp': 40, 'effect': 20}, + 'Dragon Rage': {'id': 82, 'power': 1, 'type': 'Dragon', 'accuracy': 100, 'pp': 10, 'effect': 41}, + 'Fire Spin': {'id': 83, 'power': 15, 'type': 'Fire', 'accuracy': 70, 'pp': 15, 'effect': 42}, + 'Thundershock': {'id': 84, 'power': 40, 'type': 'Electric', 'accuracy': 100, 'pp': 30, 'effect': 6}, + 'Thunderbolt': {'id': 85, 'power': 95, 'type': 'Electric', 'accuracy': 100, 'pp': 15, 'effect': 6}, + 'Thunder Wave': {'id': 86, 'power': 0, 'type': 'Electric', 'accuracy': 100, 'pp': 20, 'effect': 67}, + 'Thunder': {'id': 87, 'power': 120, 'type': 'Electric', 'accuracy': 70, 'pp': 10, 'effect': 6}, + 'Rock Throw': {'id': 88, 'power': 50, 'type': 'Rock', 'accuracy': 65, 'pp': 15, 'effect': 0}, + 'Earthquake': {'id': 89, 'power': 100, 'type': 'Ground', 'accuracy': 100, 'pp': 10, 'effect': 0}, + 'Fissure': {'id': 90, 'power': 1, 'type': 'Ground', 'accuracy': 30, 'pp': 5, 'effect': 38}, + 'Dig': {'id': 91, 'power': 100, 'type': 'Ground', 'accuracy': 100, 'pp': 10, 'effect': 39}, + 'Toxic': {'id': 92, 'power': 0, 'type': 'Poison', 'accuracy': 85, 'pp': 10, 'effect': 66}, + 'Confusion': {'id': 93, 'power': 50, 'type': 'Psychic', 'accuracy': 100, 'pp': 25, 'effect': 76}, + 'Psychic': {'id': 94, 'power': 90, 'type': 'Psychic', 'accuracy': 100, 'pp': 10, 'effect': 71}, + 'Hypnosis': {'id': 95, 'power': 0, 'type': 'Psychic', 'accuracy': 60, 'pp': 20, 'effect': 32}, + 'Meditate': {'id': 96, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 40, 'effect': 10}, + 'Agility': {'id': 97, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 30, 'effect': 52}, + 'Quick Attack': {'id': 98, 'power': 40, 'type': 'Normal', 'accuracy': 100, 'pp': 30, 'effect': 0}, + 'Rage': {'id': 99, 'power': 20, 'type': 'Normal', 'accuracy': 100, 'pp': 20, 'effect': 81}, + 'Teleport': {'id': 100, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 20, 'effect': 28}, + 'Night Shade': {'id': 101, 'power': 0, 'type': 'Ghost', 'accuracy': 100, 'pp': 15, 'effect': 41}, + 'Mimic': {'id': 102, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10, 'effect': 82}, + 'Screech': {'id': 103, 'power': 0, 'type': 'Normal', 'accuracy': 85, 'pp': 40, 'effect': 59}, + 'Double Team': {'id': 104, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 15, 'effect': 15}, + 'Recover': {'id': 105, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 20, 'effect': 56}, + 'Harden': {'id': 106, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30, 'effect': 11}, + 'Minimize': {'id': 107, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 20, 'effect': 15}, + 'Smokescreen': {'id': 108, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 20, 'effect': 22}, + 'Confuse Ray': {'id': 109, 'power': 0, 'type': 'Ghost', 'accuracy': 100, 'pp': 10, 'effect': 49}, + 'Withdraw': {'id': 110, 'power': 0, 'type': 'Water', 'accuracy': 100, 'pp': 40, 'effect': 11}, + 'Defense Curl': {'id': 111, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 40, 'effect': 11}, + 'Barrier': {'id': 112, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 30, 'effect': 51}, + 'Light Screen': {'id': 113, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 30, 'effect': 64}, + 'Haze': {'id': 114, 'power': 0, 'type': 'Ice', 'accuracy': 100, 'pp': 30, 'effect': 25}, + 'Reflect': {'id': 115, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 20, 'effect': 65}, + 'Focus Energy': {'id': 116, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30, 'effect': 47}, + 'Bide': {'id': 117, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10, 'effect': 26}, + 'Metronome': {'id': 118, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10, 'effect': 83}, + 'Mirror Move': {'id': 119, 'power': 0, 'type': 'Flying', 'accuracy': 100, 'pp': 20, 'effect': 9}, + 'Selfdestruct': {'id': 120, 'power': 130, 'type': 'Normal', 'accuracy': 100, 'pp': 5, 'effect': 7}, + 'Egg Bomb': {'id': 121, 'power': 100, 'type': 'Normal', 'accuracy': 75, 'pp': 10, 'effect': 0}, + 'Lick': {'id': 122, 'power': 20, 'type': 'Ghost', 'accuracy': 100, 'pp': 30, 'effect': 36}, + 'Smog': {'id': 123, 'power': 20, 'type': 'Poison', 'accuracy': 70, 'pp': 20, 'effect': 33}, + 'Sludge': {'id': 124, 'power': 65, 'type': 'Poison', 'accuracy': 100, 'pp': 20, 'effect': 33}, + 'Bone Club': {'id': 125, 'power': 65, 'type': 'Ground', 'accuracy': 85, 'pp': 20, 'effect': 31}, + 'Fire Blast': {'id': 126, 'power': 120, 'type': 'Fire', 'accuracy': 85, 'pp': 5, 'effect': 34}, + 'Waterfall': {'id': 127, 'power': 80, 'type': 'Water', 'accuracy': 100, 'pp': 15, 'effect': 0}, + 'Clamp': {'id': 128, 'power': 35, 'type': 'Water', 'accuracy': 75, 'pp': 10, 'effect': 42}, + 'Swift': {'id': 129, 'power': 60, 'type': 'Normal', 'accuracy': 100, 'pp': 20, 'effect': 17}, + 'Skull Bash': {'id': 130, 'power': 100, 'type': 'Normal', 'accuracy': 100, 'pp': 15, 'effect': 39}, + 'Spike Cannon': {'id': 131, 'power': 20, 'type': 'Normal', 'accuracy': 100, 'pp': 15, 'effect': 29}, + 'Constrict': {'id': 132, 'power': 10, 'type': 'Normal', 'accuracy': 100, 'pp': 35, 'effect': 70}, + 'Amnesia': {'id': 133, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 20, 'effect': 53}, + 'Kinesis': {'id': 134, 'power': 0, 'type': 'Psychic', 'accuracy': 80, 'pp': 15, 'effect': 22}, + 'Softboiled': {'id': 135, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10, 'effect': 56}, + 'Hi Jump Kick': {'id': 136, 'power': 85, 'type': 'Fighting', 'accuracy': 90, 'pp': 20, 'effect': 45}, + 'Glare': {'id': 137, 'power': 0, 'type': 'Normal', 'accuracy': 75, 'pp': 30, 'effect': 67}, + 'Dream Eater': {'id': 138, 'power': 100, 'type': 'Psychic', 'accuracy': 100, 'pp': 15, 'effect': 8}, + 'Poison Gas': {'id': 139, 'power': 0, 'type': 'Poison', 'accuracy': 55, 'pp': 40, 'effect': 66}, + 'Barrage': {'id': 140, 'power': 15, 'type': 'Normal', 'accuracy': 85, 'pp': 20, 'effect': 29}, + 'Leech Life': {'id': 141, 'power': 20, 'type': 'Bug', 'accuracy': 100, 'pp': 15, 'effect': 3}, + 'Lovely Kiss': {'id': 142, 'power': 0, 'type': 'Normal', 'accuracy': 75, 'pp': 10, 'effect': 32}, + 'Sky Attack': {'id': 143, 'power': 140, 'type': 'Flying', 'accuracy': 90, 'pp': 5, 'effect': 39}, + 'Transform': {'id': 144, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10, 'effect': 57}, + 'Bubble': {'id': 145, 'power': 20, 'type': 'Water', 'accuracy': 100, 'pp': 30, 'effect': 70}, + 'Dizzy Punch': {'id': 146, 'power': 70, 'type': 'Normal', 'accuracy': 100, 'pp': 10, 'effect': 0}, + 'Spore': {'id': 147, 'power': 0, 'type': 'Grass', 'accuracy': 100, 'pp': 15, 'effect': 32}, + 'Flash': {'id': 148, 'power': 0, 'type': 'Normal', 'accuracy': 70, 'pp': 20, 'effect': 22}, + 'Psywave': {'id': 149, 'power': 1, 'type': 'Psychic', 'accuracy': 80, 'pp': 15, 'effect': 41}, + 'Splash': {'id': 150, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 40, 'effect': 85}, + 'Acid Armor': {'id': 151, 'power': 0, 'type': 'Poison', 'accuracy': 100, 'pp': 40, 'effect': 51}, + 'Crabhammer': {'id': 152, 'power': 90, 'type': 'Water', 'accuracy': 85, 'pp': 10, 'effect': 0}, + 'Explosion': {'id': 153, 'power': 170, 'type': 'Normal', 'accuracy': 100, 'pp': 5, 'effect': 7}, + 'Fury Swipes': {'id': 154, 'power': 18, 'type': 'Normal', 'accuracy': 80, 'pp': 15, 'effect': 29}, + 'Bonemerang': {'id': 155, 'power': 50, 'type': 'Ground', 'accuracy': 90, 'pp': 10, 'effect': 44}, + 'Rest': {'id': 156, 'power': 0, 'type': 'Psychic', 'accuracy': 100, 'pp': 10, 'effect': 56}, + 'Rock Slide': {'id': 157, 'power': 75, 'type': 'Rock', 'accuracy': 90, 'pp': 10, 'effect': 0}, + 'Hyper Fang': {'id': 158, 'power': 80, 'type': 'Normal', 'accuracy': 90, 'pp': 15, 'effect': 31}, + 'Sharpen': {'id': 159, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30, 'effect': 10}, + 'Conversion': {'id': 160, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 30, 'effect': 24}, + 'Tri Attack': {'id': 161, 'power': 80, 'type': 'Normal', 'accuracy': 100, 'pp': 10, 'effect': 0}, + 'Super Fang': {'id': 162, 'power': 1, 'type': 'Normal', 'accuracy': 90, 'pp': 10, 'effect': 40}, + 'Slash': {'id': 163, 'power': 70, 'type': 'Normal', 'accuracy': 100, 'pp': 20, 'effect': 0}, + 'Substitute': {'id': 164, 'power': 0, 'type': 'Normal', 'accuracy': 100, 'pp': 10, 'effect': 79} + #'Struggle': {'id': 165, 'power': 50, 'type': 'Struggle_Type', 'accuracy': 100, 'pp': 10, 'effect': 48} } encounter_tables = {'Wild_Super_Rod_A': 2, 'Wild_Super_Rod_B': 2, 'Wild_Super_Rod_C': 3, 'Wild_Super_Rod_D': 2, @@ -1204,6 +1204,29 @@ tm_moves = [ 'Selfdestruct', 'Egg Bomb', 'Fire Blast', 'Swift', 'Skull Bash', 'Softboiled', 'Dream Eater', 'Sky Attack', 'Rest', 'Thunder Wave', 'Psywave', 'Explosion', 'Rock Slide', 'Tri Attack', 'Substitute' ] +#['No Move', 'Pound', 'Karate Chop', 'Doubleslap', 'Comet Punch', 'Fire Punch', 'Ice Punch', 'Thunderpunch', 'Scratch', +# 'Vicegrip', 'Guillotine', 'Cut', 'Gust', 'Wing Attack', 'Fly', 'Bind', 'Slam', 'Vine Whip', 'Stomp', 'Double Kick', 'Jump Kick', +# 'Rolling Kick', 'Sand Attack', 'Headbutt', 'Horn Attack', 'Fury Attack', 'Tackle', 'Wrap', 'Thrash', 'Tail Whip', 'Poison Sting', +# 'Twineedle', 'Pin Missile', 'Leer', 'Bite', 'Growl', 'Roar', 'Sing', 'Supersonic', 'Sonicboom', 'Disable', 'Acid', 'Ember', 'Flamethrower', +# 'Mist', 'Hydro Pump', 'Surf', 'Psybeam', 'Aurora Beam', 'Peck', 'Drill Peck', 'Low Kick', 'Strength', 'Absorb', 'Leech Seed', 'Growth', +# 'Razor Leaf', 'Poisonpowder', 'Stun Spore', 'Sleep Powder', 'Petal Dance', 'String Shot', 'Fire Spin', 'Thundershock', 'Rock Throw', 'Confusion', +# 'Hypnosis', 'Meditate', 'Agility', 'Quick Attack', 'Night Shade', 'Screech', 'Recover', 'Harden', 'Minimize', 'Smokescreen', 'Confuse Ray', 'Withdraw', +# 'Defense Curl', 'Barrier', 'Light Screen', 'Haze', 'Focus Energy', 'Mirror Move', 'Lick', 'Smog', 'Sludge', 'Bone Club', 'Waterfall', 'Clamp', 'Spike Cannon', +# 'Constrict', 'Amnesia', 'Kinesis', 'Hi Jump Kick', 'Glare', 'Poison Gas', 'Barrage', 'Leech Life', 'Lovely Kiss', 'Transform', 'Bubble', 'Dizzy Punch', 'Spore', 'Flash', +# 'Splash', 'Acid Armor', 'Crabhammer', 'Fury Swipes', 'Bonemerang', 'Hyper Fang', 'Sharpen', 'Conversion', 'Super Fang', 'Slash'] + +# print([i for i in list(moves.keys()) if i not in tm_moves]) +# filler_moves = [ +# "Razor Wind", "Whirlwind", "Counter", "Teleport", "Bide", "Skull Bash", "Sky Attack", "Psywave", +# "Pound", "Karate Chop", "Doubleslap", "Comet Punch", "Scratch", "Vicegrip", "Gust", "Wing Attack", "Bind", +# "Vine Whip", "Sand Attack", "Fury Attack", "Tackle", "Wrap", "Tail Whip", "Poison Sting", "Twineedle", +# "Leer", "Growl", "Roar", "Sing", "Supersonic", "Sonicboom", "Disable", "Acid", "Ember", "Mist", "Peck", "Absorb", +# "Growth", "Poisonpowder", "String Shot", "Meditate", "Agility", "Screech", "Double Team", "Harden", "Minimize", +# "Smokescreen", "Confuse Ray", "Withdraw", "Defense Curl", "Barrier", "Light Screen", "Haze", "Reflect", +# "Focus Energy", "Lick", "Smog", "Clamp", "Spike Cannon", "Constrict" +# +# ] + first_stage_pokemon = [pokemon for pokemon in pokemon_data.keys() if pokemon not in evolves_from] legendary_pokemon = ["Articuno", "Zapdos", "Moltres", "Mewtwo", "Mew"] diff --git a/worlds/pokemon_rb/regions.py b/worlds/pokemon_rb/regions.py index 674d24d1..98dbb3af 100644 --- a/worlds/pokemon_rb/regions.py +++ b/worlds/pokemon_rb/regions.py @@ -23,11 +23,12 @@ def create_regions(multiworld: MultiWorld, player: int): locations_per_region.setdefault(location.region, []) if location.inclusion(multiworld, player): locations_per_region[location.region].append(PokemonRBLocation(player, location.name, location.address, - location.rom_address)) + location.rom_address, location.type)) regions = [ create_region(multiworld, player, "Menu", locations_per_region), create_region(multiworld, player, "Anywhere", locations_per_region), create_region(multiworld, player, "Fossil", locations_per_region), + create_region(multiworld, player, "Pokedex", locations_per_region), create_region(multiworld, player, "Pallet Town", locations_per_region), create_region(multiworld, player, "Route 1", locations_per_region), create_region(multiworld, player, "Viridian City", locations_per_region), @@ -88,6 +89,7 @@ def create_regions(multiworld: MultiWorld, player: int): create_region(multiworld, player, "Route 8", locations_per_region), create_region(multiworld, player, "Route 8 Grass", locations_per_region), create_region(multiworld, player, "Celadon City", locations_per_region), + create_region(multiworld, player, "Celadon Game Corner", locations_per_region), create_region(multiworld, player, "Celadon Prize Corner", locations_per_region), create_region(multiworld, player, "Celadon Gym", locations_per_region), create_region(multiworld, player, "Route 16", locations_per_region), @@ -148,6 +150,7 @@ def create_regions(multiworld: MultiWorld, player: int): multiworld.regions += regions connect(multiworld, player, "Menu", "Anywhere", one_way=True) connect(multiworld, player, "Menu", "Pallet Town", one_way=True) + connect(multiworld, player, "Menu", "Pokedex", one_way=True) connect(multiworld, player, "Menu", "Fossil", lambda state: state.pokemon_rb_fossil_checks( state.multiworld.second_fossil_check_condition[player].value, player), one_way=True) connect(multiworld, player, "Pallet Town", "Route 1") @@ -220,6 +223,7 @@ def create_regions(multiworld: MultiWorld, player: int): 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 Game Corner") connect(multiworld, player, "Celadon City", "Celadon Prize Corner") connect(multiworld, player, "Celadon City", "Route 16") connect(multiworld, player, "Route 16", "Route 16 North", lambda state: state.pokemon_rb_can_cut(player), one_way=True) diff --git a/worlds/pokemon_rb/rock_tunnel.py b/worlds/pokemon_rb/rock_tunnel.py new file mode 100644 index 00000000..3a70709e --- /dev/null +++ b/worlds/pokemon_rb/rock_tunnel.py @@ -0,0 +1,294 @@ +from .rom_addresses import rom_addresses + +disallowed1F = [[2, 2], [3, 2], [1, 8], [2, 8], [7, 7], [8, 7], [10, 4], [11, 4], [11, 12], + [11, 13], [16, 10], [17, 10], [18, 10], [16, 12], [17, 12], [18, 12]] +disallowed2F = [[16, 2], [17, 2], [18, 2], [15, 5], [15, 6], [10, 10], [11, 10], [12, 10], [7, 14], [8, 14], [1, 15], + [13, 15], [13, 16], [1, 12], [1, 10], [3, 5], [3, 6], [5, 6], [5, 7], [5, 8], [1, 2], [1, 3], [1, 4], + [11, 1]] + + +def randomize_rock_tunnel(data, random): + + seed = random.randint(0, 999999999999999999) + random.seed(seed) + + map1f = [] + map2f = [] + + address = rom_addresses["Map_Rock_Tunnel1F"] + for y in range(0, 18): + row = [] + for x in range(0, 20): + row.append(data[address]) + address += 1 + map1f.append(row) + + address = rom_addresses["Map_Rock_TunnelB1F"] + for y in range(0, 18): + row = [] + for x in range(0, 20): + row.append(data[address]) + address += 1 + map2f.append(row) + + current_map = map1f + + def floor(x, y): + current_map[y][x] = 1 + + def wide(x, y): + current_map[y][x] = 32 + current_map[y][x + 1] = 34 + + def tall(x, y): + current_map[y][x] = 23 + current_map[y + 1][x] = 31 + + def single(x, y): + current_map[y][x] = 2 + + # 0 = top left, 1 = middle, 2 = top right, 3 = bottom right + entrance_c = random.choice([0, 1, 2]) + exit_c = [0, 1, 3] + if entrance_c == 2: + exit_c.remove(1) + else: + exit_c.remove(entrance_c) + exit_c = random.choice(exit_c) + remaining = [i for i in [0, 1, 2, 3] if i not in [entrance_c, exit_c]] + + if entrance_c == 0: + floor(6, 3) + floor(6, 4) + tall(random.randint(8, 10), 2) + wide(4, random.randint(5, 7)) + wide(1, random.choice([5, 6, 7, 9])) + elif entrance_c == 1: + if remaining == [0, 2] or random.randint(0, 1): + tall(random.randint(8, 10), 2) + floor(7, 4) + floor(8, 4) + else: + tall(random.randint(11, 12), 5) + floor(9, 5) + floor(9, 6) + elif entrance_c == 2: + floor(16, 2) + floor(16, 3) + if remaining == [1, 3]: + wide(17, 4) + else: + tall(random.randint(11, 17), random.choice([2, 5])) + + if exit_c == 0: + r = random.sample([0, 1, 2], 2) + if 0 in r: + floor(1, 11) + floor(2, 11) + if 1 in r: + floor(3, 11) + floor(4, 11) + if 2 in r: + floor(5, 11) + floor(6, 11) + elif exit_c == 1 or (exit_c == 3 and entrance_c == 0): + r = random.sample([1, 3, 5, 7], random.randint(1, 2)) + for i in r: + floor(i, 11) + floor(i + 1, 11) + if exit_c != 3: + tall(random.choice([9, 10, 12]), 12) + + # 0 = top left, 1 = middle, 2 = top right, 3 = bottom right + # [0, 1] [0, 2] [1, 2] [1, 3], [2, 3] + if remaining[0] == 1: + floor(9, 5) + floor(9, 6) + + if remaining == [0, 2]: + if random.randint(0, 1): + tall(9, 4) + floor(9, 6) + floor(9, 7) + else: + floor(10, 7) + floor(11, 7) + + if remaining == [1, 2]: + floor(16, 2) + floor(16, 3) + tall(random.randint(11, 17), random.choice([2, 5])) + if remaining in [[1, 3], [2, 3]]: + r = round(random.triangular(0, 3, 0)) + floor(12 + (r * 2), 7) + if r < 3: + floor(13 + (r * 2), 7) + if remaining == [1, 3]: + wide(10, random.choice([3, 5])) + + if remaining != [0, 1] and exit_c != 1: + wide(7, 6) + + if entrance_c != 0: + if random.randint(0, 1): + wide(4, random.randint(4, 7)) + else: + wide(1, random.choice([5, 6, 7, 9])) + + current_map = map2f + + if 3 in remaining: + c = random.choice([entrance_c, exit_c]) + else: + c = random.choice(remaining) + + # 0 = top right, 1 = middle, 2 = bottom right, 3 = top left + if c in [0, 1]: + if random.randint(0, 2): + tall(random.choice([2, 4]), 5) + r = random.choice([1, 3, 7, 9, 11]) + floor(3 if r < 11 else random.randint(1, 2), r) + floor(3 if r < 11 else random.randint(1, 2), r + 1) + if random.randint(0, 2): + tall(random.randint(6, 7), 7) + r = random.choice([1, 3, 5, 9]) + floor(6, r) + floor(6, r + 1) + if random.randint(0, 2): + wide(7, 15) + r = random.randint(0, 4) + if r == 0: + floor(9, 14) + floor(10, 14) + elif r == 1: + floor(11, 14) + floor(12, 14) + elif r == 2: + floor(13, 13) + floor(13, 14) + elif r == 3: + floor(13, 11) + floor(13, 12) + elif r == 4: + floor(13, 10) + floor(14, 10) + if c == 0: + tall(random.randint(9, 10), 5) + if random.randint(0, 1): + floor(10, 7) + floor(11, 7) + tall(random.randint(12, 17), 8) + else: + floor(12, 5) + floor(12, 6) + wide(13, random.randint(4, 5)) + wide(17, random.randint(3, 5)) + r = random.choice([1, 3]) + floor(12, r) + floor(12, + 1) + + elif c == 2: + r = random.randint(0, 6) + if r == 0: + floor(12, 1) + floor(12, 2) + elif r == 1: + floor(12, 3) + floor(12, 4) + elif r == 2: + floor(12, 5) + floor(12, 6) + elif r == 3: + floor(10, 7) + floor(11, 7) + elif r == 4: + floor(9, 7) + floor(9, 8) + elif r == 5: + floor(9, 9) + floor(9, 10) + elif r == 6: + floor(8, 11) + floor(9, 11) + if r < 2 or (r in [2, 3] and random.randint(0, 1)): + wide(7, random.randint(6, 7)) + elif r in [2, 3]: + tall(random.randint(9, 10), 5) + else: + tall(random.randint(6, 7), 7) + r = random.randint(r, 6) + if r == 0: + #early block + wide(13, random.randint(2, 5)) + tall(random.randint(14, 15), 1) + elif r == 1: + if random.randint(0, 1): + tall(16, 5) + tall(random.choice([14, 15, 17]), 1) + else: + wide(16, random.randint(6,8)) + single(18, 7) + elif r == 2: + tall(random.randint(12, 16), 8) + elif r == 3: + wide(10, 9) + single(12, 9) + elif r == 4: + wide(10, random.randint(11, 12)) + single(12, random.randint(11, 12)) + elif r == 5: + tall(random.randint(8, 10), 12) + elif r == 6: + wide(7, 15) + r = random.randint(r, 6) + if r == 6: + #late open + r2 = random.randint(0, 2) + floor(1 + (r2 * 2), 14) + floor(2 + (r2 * 2), 14) + elif r == 5: + floor(6, 12) + floor(6, 13) + elif r == 4: + if random.randint(0, 1): + floor(6, 11) + floor(7, 11) + else: + floor(8, 11) + floor(9, 11) + elif r == 3: + floor(9, 9) + floor(9, 10) + elif r < 3: + single(9, 7) + floor(9, 8) + + def check_addable_block(check_map, disallowed): + if check_map[y][x] == 1 and [x, y] not in disallowed: + i = 0 + for xx in range(x-1, x+2): + for yy in range(y-1, y+2): + if check_map[yy][xx] == 1: + i += 1 + if i >= 8: + single(x, y) + + for _ in range(100): + y = random.randint(1, 16) + x = random.randint(1, 18) + current_map = map1f + check_addable_block(map1f, disallowed1F) + current_map = map2f + check_addable_block(map2f, disallowed2F) + + address = rom_addresses["Map_Rock_Tunnel1F"] + for y in map1f: + for x in y: + data[address] = x + address += 1 + address = rom_addresses["Map_Rock_TunnelB1F"] + for y in map2f: + for x in y: + data[address] = x + address += 1 + return seed \ No newline at end of file diff --git a/worlds/pokemon_rb/rom.py b/worlds/pokemon_rb/rom.py index 9dbc3a8b..1a5f3250 100644 --- a/worlds/pokemon_rb/rom.py +++ b/worlds/pokemon_rb/rom.py @@ -8,6 +8,7 @@ from .text import encode_text from .rom_addresses import rom_addresses from .locations import location_data from .items import item_table +from .rock_tunnel import randomize_rock_tunnel import worlds.pokemon_rb.poke_data as poke_data @@ -28,15 +29,15 @@ def filter_moves(moves, type, random): return ret -def get_move(moves, chances, random, starting_move=False): +def get_move(local_move_data, moves, chances, random, starting_move=False): type = choose_forced_type(chances, random) filtered_moves = filter_moves(moves, type, random) for move in filtered_moves: - if poke_data.moves[move]["accuracy"] > 80 and poke_data.moves[move]["power"] > 0 or not starting_move: + if local_move_data[move]["accuracy"] > 80 and local_move_data[move]["power"] > 0 or not starting_move: moves.remove(move) return move else: - return get_move(moves, [], random, starting_move) + return get_move(local_move_data, moves, [], random, starting_move) def get_encounter_slots(self): @@ -75,6 +76,42 @@ def randomize_pokemon(self, mon, mons_list, randomize_type, random): return mon +def set_mon_palettes(self, random, data): + if self.multiworld.randomize_pokemon_palettes[self.player] == "vanilla": + return + pallet_map = { + "Poison": 0x0F, + "Normal": 0x10, + "Ice": 0x11, + "Fire": 0x12, + "Water": 0x13, + "Ghost": 0x14, + "Ground": 0x15, + "Grass": 0x16, + "Psychic": 0x17, + "Electric": 0x18, + "Rock": 0x19, + "Dragon": 0x1F, + "Flying": 0x20, + "Fighting": 0x21, + "Bug": 0x22 + } + palettes = [] + for mon in poke_data.pokemon_data: + if self.multiworld.randomize_pokemon_palettes[self.player] == "primary_type": + pallet = pallet_map[self.local_poke_data[mon]["type1"]] + elif (self.multiworld.randomize_pokemon_palettes[self.player] == "follow_evolutions" and mon in + poke_data.evolves_from and poke_data.evolves_from[mon] != "Eevee"): + pallet = palettes[-1] + else: # completely_random or follow_evolutions and it is not an evolved form (except eeveelutions) + pallet = random.choice(list(pallet_map.values())) + palettes.append(pallet) + address = rom_addresses["Mon_Palettes"] + for pallet in palettes: + data[address] = pallet + address += 1 + + def process_trainer_data(self, data, random): mons_list = [pokemon for pokemon in poke_data.pokemon_data.keys() if pokemon not in poke_data.legendary_pokemon or self.multiworld.trainer_legendaries[self.player].value] @@ -163,6 +200,7 @@ def process_static_pokemon(self): randomize_type, self.multiworld.random)) location.place_locked_item(mon) + chosen_mons = set() for slot in starter_slots: location = self.multiworld.get_location(slot.name, self.player) randomize_type = self.multiworld.randomize_starter_pokemon[self.player].value @@ -170,9 +208,13 @@ def process_static_pokemon(self): if not randomize_type: location.place_locked_item(self.create_item(slot_type + " " + slot.original_item)) else: - location.place_locked_item(self.create_item(slot_type + " " + - randomize_pokemon(self, slot.original_item, mons_list, randomize_type, - self.multiworld.random))) + mon = self.create_item(slot_type + " " + randomize_pokemon(self, slot.original_item, mons_list, + randomize_type, self.multiworld.random)) + while mon.name in chosen_mons: + mon = self.create_item(slot_type + " " + randomize_pokemon(self, slot.original_item, mons_list, + randomize_type, self.multiworld.random)) + chosen_mons.add(mon.name) + location.place_locked_item(mon) def process_wild_pokemon(self): @@ -180,27 +222,36 @@ def process_wild_pokemon(self): encounter_slots = get_encounter_slots(self) placed_mons = {pokemon: 0 for pokemon in poke_data.pokemon_data.keys()} + zone_mapping = {} if self.multiworld.randomize_wild_pokemon[self.player].value: mons_list = [pokemon for pokemon in poke_data.pokemon_data.keys() if pokemon not in poke_data.legendary_pokemon or self.multiworld.randomize_legendary_pokemon[self.player].value == 3] self.multiworld.random.shuffle(encounter_slots) locations = [] for slot in encounter_slots: - mon = randomize_pokemon(self, slot.original_item, mons_list, - self.multiworld.randomize_wild_pokemon[self.player].value, self.multiworld.random) + location = self.multiworld.get_location(slot.name, self.player) + zone = " - ".join(location.name.split(" - ")[:-1]) + if zone not in zone_mapping: + zone_mapping[zone] = {} + original_mon = slot.original_item + if self.multiworld.area_1_to_1_mapping[self.player] and original_mon in zone_mapping[zone]: + mon = zone_mapping[zone][original_mon] + else: + mon = randomize_pokemon(self, original_mon, mons_list, + self.multiworld.randomize_wild_pokemon[self.player].value, self.multiworld.random) # if static Pokemon are not randomized, we make sure nothing on Pokemon Tower 6F is a Marowak # if static Pokemon are randomized we deal with that during static encounter randomization while (self.multiworld.randomize_static_pokemon[self.player].value == 0 and mon == "Marowak" and "Pokemon Tower 6F" in slot.name): # to account for the possibility that only one ground type Pokemon exists, match only stats for this fix - mon = randomize_pokemon(self, slot.original_item, mons_list, 2, self.multiworld.random) + mon = randomize_pokemon(self, original_mon, mons_list, 2, self.multiworld.random) placed_mons[mon] += 1 - location = self.multiworld.get_location(slot.name, self.player) location.item = self.create_item(mon) location.event = True location.locked = True location.item.location = location locations.append(location) + zone_mapping[zone][original_mon] = mon mons_to_add = [] remaining_pokemon = [pokemon for pokemon in poke_data.pokemon_data.keys() if placed_mons[pokemon] == 0 and @@ -223,22 +274,46 @@ def process_wild_pokemon(self): for mon in mons_to_add: stat_base = get_base_stat_total(mon) candidate_locations = get_encounter_slots(self) - if self.multiworld.randomize_wild_pokemon[self.player].value in [1, 3]: - candidate_locations = [slot for slot in candidate_locations if any([poke_data.pokemon_data[slot.original_item][ - "type1"] in [self.local_poke_data[mon]["type1"], self.local_poke_data[mon]["type2"]], - poke_data.pokemon_data[slot.original_item]["type2"] in [self.local_poke_data[mon]["type1"], - self.local_poke_data[mon]["type2"]]])] - if not candidate_locations: - candidate_locations = get_encounter_slots(self) candidate_locations = [self.multiworld.get_location(location.name, self.player) for location in candidate_locations] - candidate_locations.sort(key=lambda slot: abs(get_base_stat_total(slot.item.name) - stat_base)) + if self.multiworld.randomize_wild_pokemon[self.player].current_key in ["match_base_stats", "match_types_and_base_stats"]: + candidate_locations.sort(key=lambda slot: abs(get_base_stat_total(slot.item.name) - stat_base)) + if self.multiworld.randomize_wild_pokemon[self.player].current_key in ["match_types", "match_types_and_base_stats"]: + candidate_locations.sort(key=lambda slot: not any([poke_data.pokemon_data[slot.original_item]["type1"] in + [self.local_poke_data[mon]["type1"], self.local_poke_data[mon]["type2"]], + poke_data.pokemon_data[slot.original_item]["type2"] in + [self.local_poke_data[mon]["type1"], self.local_poke_data[mon]["type2"]]])) for location in candidate_locations: - if placed_mons[location.item.name] > 1 or location.item.name not in poke_data.first_stage_pokemon: - placed_mons[location.item.name] -= 1 - location.item = self.create_item(mon) - location.item.location = location + zone = " - ".join(location.name.split(" - ")[:-1]) + if self.multiworld.catch_em_all[self.player] == "all_pokemon" and self.multiworld.area_1_to_1_mapping[self.player]: + if not [self.multiworld.get_location(l.name, self.player) for l in get_encounter_slots(self) + if (not l.name.startswith(zone)) and + self.multiworld.get_location(l.name, self.player).item.name == location.item.name]: + continue + if self.multiworld.catch_em_all[self.player] == "first_stage" and self.multiworld.area_1_to_1_mapping[self.player]: + if not [self.multiworld.get_location(l.name, self.player) for l in get_encounter_slots(self) + if (not l.name.startswith(zone)) and + self.multiworld.get_location(l.name, self.player).item.name == location.item.name and l.name + not in poke_data.evolves_from]: + continue + + if placed_mons[location.item.name] < 2 and (location.item.name in poke_data.first_stage_pokemon + or self.multiworld.catch_em_all[self.player]): + continue + + if self.multiworld.area_1_to_1_mapping[self.player]: + place_locations = [place_location for place_location in candidate_locations if + place_location.name.startswith(zone) and + place_location.item.name == location.item.name] + else: + place_locations = [location] + for place_location in place_locations: + placed_mons[place_location.item.name] -= 1 + place_location.item = self.create_item(mon) + place_location.item.location = place_location placed_mons[mon] += 1 - break + break + else: + raise Exception else: for slot in encounter_slots: @@ -250,10 +325,41 @@ def process_wild_pokemon(self): placed_mons[location.item.name] += 1 +def process_move_data(self): + self.local_move_data = deepcopy(poke_data.moves) + if self.multiworld.move_balancing[self.player]: + self.local_move_data["Sing"]["accuracy"] = 30 + self.local_move_data["Sleep Powder"]["accuracy"] = 40 + self.local_move_data["Spore"]["accuracy"] = 50 + self.local_move_data["Sonicboom"]["effect"] = 0 + self.local_move_data["Sonicboom"]["power"] = 50 + self.local_move_data["Dragon Rage"]["effect"] = 0 + self.local_move_data["Dragon Rage"]["power"] = 80 + self.local_move_data["Horn Drill"]["effect"] = 0 + self.local_move_data["Horn Drill"]["power"] = 70 + self.local_move_data["Horn Drill"]["accuracy"] = 90 + self.local_move_data["Guillotine"]["effect"] = 0 + self.local_move_data["Guillotine"]["power"] = 70 + self.local_move_data["Guillotine"]["accuracy"] = 90 + self.local_move_data["Fissure"]["effect"] = 0 + self.local_move_data["Fissure"]["power"] = 70 + self.local_move_data["Fissure"]["accuracy"] = 90 + self.local_move_data["Blizzard"]["accuracy"] = 70 + if self.multiworld.randomize_tm_moves[self.player]: + self.local_tms = self.multiworld.random.sample([move for move in poke_data.moves.keys() if move not in + ["No Move"] + poke_data.hm_moves], 50) + else: + self.local_tms = poke_data.tm_moves.copy() + + def process_pokemon_data(self): local_poke_data = deepcopy(poke_data.pokemon_data) learnsets = deepcopy(poke_data.learnsets) + tms_hms = self.local_tms + poke_data.hm_moves + + + compat_hms = set() for mon, mon_data in local_poke_data.items(): if self.multiworld.randomize_pokemon_stats[self.player].value == 1: @@ -265,18 +371,21 @@ def process_pokemon_data(self): mon_data["spd"] = stats[3] mon_data["spc"] = stats[4] elif self.multiworld.randomize_pokemon_stats[self.player].value == 2: - old_stats = mon_data["hp"] + mon_data["atk"] + mon_data["def"] + mon_data["spd"] + mon_data["spc"] - 5 - stats = [1, 1, 1, 1, 1] - while old_stats > 0: - stat = self.multiworld.random.randint(0, 4) - if stats[stat] < 255: - old_stats -= 1 - stats[stat] += 1 - mon_data["hp"] = stats[0] - mon_data["atk"] = stats[1] - mon_data["def"] = stats[2] - mon_data["spd"] = stats[3] - mon_data["spc"] = stats[4] + first_run = True + while (mon_data["hp"] > 255 or mon_data["atk"] > 255 or mon_data["def"] > 255 or mon_data["spd"] > 255 + or mon_data["spc"] > 255 or first_run): + first_run = False + total_stats = mon_data["hp"] + mon_data["atk"] + mon_data["def"] + mon_data["spd"] + mon_data["spc"] - 60 + dist = [self.multiworld.random.randint(1, 101) / 100, self.multiworld.random.randint(1, 101) / 100, + self.multiworld.random.randint(1, 101) / 100, self.multiworld.random.randint(1, 101) / 100, + self.multiworld.random.randint(1, 101) / 100] + total_dist = sum(dist) + + mon_data["hp"] = int(round(dist[0] / total_dist * total_stats) + 20) + mon_data["atk"] = int(round(dist[1] / total_dist * total_stats) + 10) + mon_data["def"] = int(round(dist[2] / total_dist * total_stats) + 10) + mon_data["spd"] = int(round(dist[3] / total_dist * total_stats) + 10) + mon_data["spc"] = int(round(dist[4] / total_dist * total_stats) + 10) if self.multiworld.randomize_pokemon_types[self.player].value: if self.multiworld.randomize_pokemon_types[self.player].value == 1 and mon in poke_data.evolves_from: type1 = local_poke_data[poke_data.evolves_from[mon]]["type1"] @@ -318,46 +427,237 @@ def process_pokemon_data(self): moves = list(poke_data.moves.keys()) for move in ["No Move"] + poke_data.hm_moves: moves.remove(move) - mon_data["start move 1"] = get_move(moves, chances, self.multiworld.random, True) - for i in range(2, 5): - if mon_data[f"start move {i}"] != "No Move" or self.multiworld.start_with_four_moves[ - self.player].value == 1: - mon_data[f"start move {i}"] = get_move(moves, chances, self.multiworld.random) + if self.multiworld.confine_transform_to_ditto[self.player]: + moves.remove("Transform") + if self.multiworld.start_with_four_moves[self.player]: + num_moves = 4 + else: + num_moves = len([i for i in [mon_data["start move 1"], mon_data["start move 2"], + mon_data["start move 3"], mon_data["start move 4"]] if i != "No Move"]) if mon in learnsets: - for move_num in range(0, len(learnsets[mon])): - learnsets[mon][move_num] = get_move(moves, chances, self.multiworld.random) + num_moves += len(learnsets[mon]) + non_power_moves = [] + learnsets[mon] = [] + for i in range(num_moves): + if i == 0 and mon == "Ditto" and self.multiworld.confine_transform_to_ditto[self.player]: + move = "Transform" + else: + move = get_move(self.local_move_data, moves, chances, self.multiworld.random) + while move == "Transform" and self.multiworld.confine_transform_to_ditto[self.player]: + move = get_move(self.local_move_data, moves, chances, self.multiworld.random) + if self.local_move_data[move]["power"] < 5: + non_power_moves.append(move) + else: + learnsets[mon].append(move) + learnsets[mon].sort(key=lambda move: self.local_move_data[move]["power"]) + if learnsets[mon]: + for move in non_power_moves: + learnsets[mon].insert(self.multiworld.random.randint(1, len(learnsets[mon])), move) + else: + learnsets[mon] = non_power_moves + for i in range(1, 5): + if mon_data[f"start move {i}"] != "No Move" or self.multiworld.start_with_four_moves[self.player]: + mon_data[f"start move {i}"] = learnsets[mon].pop(0) + if self.multiworld.randomize_pokemon_catch_rates[self.player].value: mon_data["catch rate"] = self.multiworld.random.randint(self.multiworld.minimum_catch_rate[self.player], 255) else: mon_data["catch rate"] = max(self.multiworld.minimum_catch_rate[self.player], mon_data["catch rate"]) - if mon != "Mew": - tms_hms = poke_data.tm_moves + poke_data.hm_moves - for flag, tm_move in enumerate(tms_hms): - if ((mon in poke_data.evolves_from.keys() and mon_data["type1"] == - local_poke_data[poke_data.evolves_from[mon]]["type1"] and mon_data["type2"] == - local_poke_data[poke_data.evolves_from[mon]]["type2"]) and ( - (flag < 50 and self.multiworld.tm_compatibility[self.player].value in [1, 2]) or ( - flag >= 51 and self.multiworld.hm_compatibility[self.player].value in [1, 2]))): - bit = 1 if local_poke_data[poke_data.evolves_from[mon]]["tms"][int(flag / 8)] & 1 << (flag % 8) else 0 - elif (flag < 50 and self.multiworld.tm_compatibility[self.player].value == 1) or (flag >= 50 and self.multiworld.hm_compatibility[self.player].value == 1): - type_match = poke_data.moves[tm_move]["type"] in [mon_data["type1"], mon_data["type2"]] - bit = int(self.multiworld.random.randint(1, 100) < [[90, 50, 25], [100, 75, 25]][flag >= 50][0 if type_match else 1 if poke_data.moves[tm_move]["type"] == "Normal" else 2]) - elif (flag < 50 and self.multiworld.tm_compatibility[self.player].value == 2) or (flag >= 50 and self.multiworld.hm_compatibility[self.player].value == 2): - bit = self.multiworld.random.randint(0, 1) - elif (flag < 50 and self.multiworld.tm_compatibility[self.player].value == 3) or (flag >= 50 and self.multiworld.hm_compatibility[self.player].value == 3): + def roll_tm_compat(roll_move): + if self.local_move_data[roll_move]["type"] in [mon_data["type1"], mon_data["type2"]]: + if roll_move in poke_data.hm_moves: + if self.multiworld.hm_same_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] + r = self.multiworld.random.randint(1, 100) <= self.multiworld.hm_same_type_compatibility[self.player].value + if r and mon not in poke_data.legendary_pokemon: + compat_hms.add(roll_move) + return r + else: + if self.multiworld.tm_same_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] + return self.multiworld.random.randint(1, 100) <= self.multiworld.tm_same_type_compatibility[self.player].value + elif self.local_move_data[roll_move]["type"] == "Normal" and "Normal" not in [mon_data["type1"], mon_data["type2"]]: + if roll_move in poke_data.hm_moves: + if self.multiworld.hm_normal_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] + r = self.multiworld.random.randint(1, 100) <= self.multiworld.hm_normal_type_compatibility[self.player].value + if r and mon not in poke_data.legendary_pokemon: + compat_hms.add(roll_move) + return r + else: + if self.multiworld.tm_normal_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] + return self.multiworld.random.randint(1, 100) <= self.multiworld.tm_normal_type_compatibility[self.player].value + else: + if roll_move in poke_data.hm_moves: + if self.multiworld.hm_other_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] + r = self.multiworld.random.randint(1, 100) <= self.multiworld.hm_other_type_compatibility[self.player].value + if r and mon not in poke_data.legendary_pokemon: + compat_hms.add(roll_move) + return r + else: + if self.multiworld.tm_other_type_compatibility[self.player].value == -1: + return mon_data["tms"][int(flag / 8)] + return self.multiworld.random.randint(1, 100) <= self.multiworld.tm_other_type_compatibility[self.player].value + + + for flag, tm_move in enumerate(tms_hms): + if mon in poke_data.evolves_from.keys() and self.multiworld.inherit_tm_hm_compatibility[self.player]: + + if local_poke_data[poke_data.evolves_from[mon]]["tms"][int(flag / 8)] & 1 << (flag % 8): + # always inherit learnable tms/hms bit = 1 else: - continue - if bit: - mon_data["tms"][int(flag / 8)] |= 1 << (flag % 8) - else: - mon_data["tms"][int(flag / 8)] &= ~(1 << (flag % 8)) + if self.local_move_data[tm_move]["type"] in [mon_data["type1"], mon_data["type2"]] and \ + self.local_move_data[tm_move]["type"] not in [ + local_poke_data[poke_data.evolves_from[mon]]["type1"], + local_poke_data[poke_data.evolves_from[mon]]["type2"]]: + # the tm/hm is for a move whose type matches current mon, but not pre-evolved form + # so this gets full chance roll + bit = roll_tm_compat(tm_move) + # otherwise 50% reduced chance to add compatibility over pre-evolved form + elif self.multiworld.random.randint(1, 100) > 50 and roll_tm_compat(tm_move): + bit = 1 + else: + bit = 0 + else: + bit = roll_tm_compat(tm_move) + if bit: + mon_data["tms"][int(flag / 8)] |= 1 << (flag % 8) + else: + mon_data["tms"][int(flag / 8)] &= ~(1 << (flag % 8)) + + hm_verify = ["Surf", "Strength"] + if self.multiworld.accessibility[self.player] != "minimal" or ((not + self.multiworld.badgesanity[self.player]) and max(self.multiworld.elite_four_condition[self.player], + self.multiworld.victory_road_condition[self.player]) > 7): + hm_verify += ["Cut"] + if self.multiworld.accessibility[self.player] != "minimal" and (self.multiworld.trainersanity[self.player] or + self.multiworld.extra_key_items[self.player]): + hm_verify += ["Flash"] + + for hm_move in hm_verify: + if hm_move not in compat_hms: + mon = self.multiworld.random.choice([mon for mon in poke_data.pokemon_data if mon not in + poke_data.legendary_pokemon]) + flag = tms_hms.index(hm_move) + local_poke_data[mon]["tms"][int(flag / 8)] |= 1 << (flag % 8) self.local_poke_data = local_poke_data self.learnsets = learnsets +def write_quizzes(self, data, random): + + def get_quiz(q, a): + if q == 0: + r = random.randint(0, 3) + if r == 0: + mon = self.trade_mons["Trade_Dux"] + text = "A woman inVermilion City" + elif r == 1: + mon = self.trade_mons["Trade_Lola"] + text = "A man inCerulean City" + elif r == 2: + mon = self.trade_mons["Trade_Marcel"] + text = "Someone on Route 2" + elif r == 3: + mon = self.trade_mons["Trade_Spot"] + text = "Someone on Route 5" + if not a: + answers.append(0) + old_mon = mon + while old_mon == mon: + mon = random.choice(list(poke_data.pokemon_data.keys())) + + return encode_text(f"{text}was looking for{mon}?") + elif q == 1: + for location in self.multiworld.get_filled_locations(): + if location.item.name == "Secret Key" and location.item.player == self.player: + break + if location.player == self.player: + player_name = "yourself" + else: + player_name = self.multiworld.player_names[location.player] + if not a: + if len(self.multiworld.player_name) > 1: + old_name = player_name + while old_name == player_name: + player_name = random.choice(list(self.multiworld.player_name.values())) + else: + return encode_text("You're playingin a multiworldwith otherplayers?") + return encode_text(f"The Secret Key wasfound by{player_name[:17]}?") + elif q == 2: + if a: + return encode_text(f"#mon ispronouncedPo-kay-mon?") + else: + if random.randint(0, 1): + return encode_text(f"#mon ispronouncedPo-key-mon?") + else: + return encode_text(f"#mon ispronouncedPo-kuh-mon?") + elif q == 3: + starters = [" ".join(self.multiworld.get_location( + f"Pallet Town - Starter {i}", self.player).item.name.split(" ")[1:]) for i in range(1, 4)] + mon = random.choice(starters) + nots = random.choice(range(8, 16, 2)) + if random.randint(0, 1): + while mon in starters: + mon = random.choice(list(poke_data.pokemon_data.keys())) + if a: + nots += 1 + elif not a: + nots += 1 + text = f"{mon} was" + while nots > 0: + i = random.randint(1, min(4, nots)) + text += ("not " * i) + "" + nots -= i + text += "a starter choice?" + return encode_text(text) + elif q == 4: + if a: + tm_text = self.local_tms[27] + else: + if self.multiworld.randomize_tm_moves[self.player]: + wrong_tms = self.local_tms.copy() + wrong_tms.pop(27) + tm_text = random.choice(wrong_tms) + else: + tm_text = "TOMBSTONER" + return encode_text(f"TM28 contains{tm_text.upper()}?") + elif q == 5: + i = 8 + while not a and i in [1, 8]: + i = random.randint(0, 99999999) + return encode_text(f"There are {i}certified #MONLEAGUE BADGEs?") + elif q == 6: + i = 2 + while not a and i in [1, 2]: + i = random.randint(0, 99) + return encode_text(f"POLIWAG evolves {i}times?") + elif q == 7: + entity = "Motor Carrier" + if not a: + entity = random.choice(["Driver", "Shipper"]) + return encode_text("Title 49 of theU.S. Code ofFederalRegulations part397.67 states" + f"that the{entity}is responsiblefor planningroutes when" + "hazardousmaterials aretransported?") + + answers = [random.randint(0, 1), random.randint(0, 1), random.randint(0, 1), + random.randint(0, 1), random.randint(0, 1), random.randint(0, 1)] + + questions = random.sample((range(0, 8)), 6) + question_texts = [] + for i, question in enumerate(questions): + question_texts.append(get_quiz(question, answers[i])) + + for i, quiz in enumerate(["A", "B", "C", "D", "E", "F"]): + data[rom_addresses[f"Quiz_Answer_{quiz}"]] = int(not answers[i]) << 4 | (i + 1) + write_bytes(data, question_texts[i], rom_addresses[f"Text_Quiz_{quiz}"]) + + def generate_output(self, output_directory: str): random = self.multiworld.per_slot_randoms[self.player] game_version = self.multiworld.game_version[self.player].current_key @@ -384,10 +684,33 @@ def generate_output(self, output_directory: str): elif " ".join(location.item.name.split()[1:]) in poke_data.pokemon_data.keys(): data[address] = poke_data.pokemon_data[" ".join(location.item.name.split()[1:])]["id"] else: - data[address] = self.item_name_to_id[location.item.name] - 172000000 + item_id = self.item_name_to_id[location.item.name] - 172000000 + if item_id > 255: + item_id -= 256 + data[address] = item_id else: data[location.rom_address] = 0x2C # AP Item + + def set_trade_mon(address, loc): + mon = self.multiworld.get_location(loc, self.player).item.name + data[rom_addresses[address]] = poke_data.pokemon_data[mon]["id"] + self.trade_mons[address] = mon + + if game_version == "red": + set_trade_mon("Trade_Terry", "Safari Zone Center - Wild Pokemon - 5") + set_trade_mon("Trade_Spot", "Safari Zone East - Wild Pokemon - 1") + else: + set_trade_mon("Trade_Terry", "Safari Zone Center - Wild Pokemon - 7") + set_trade_mon("Trade_Spot", "Safari Zone East - Wild Pokemon - 7") + set_trade_mon("Trade_Marcel", "Route 24 - Wild Pokemon - 6") + set_trade_mon("Trade_Sailor", "Pokemon Mansion 1F - Wild Pokemon - 3") + set_trade_mon("Trade_Dux", "Route 3 - Wild Pokemon - 2") + set_trade_mon("Trade_Marc", "Route 23 - Super Rod Pokemon - 1") + set_trade_mon("Trade_Lola", "Route 10 - Super Rod Pokemon - 1") + set_trade_mon("Trade_Doris", "Cerulean Cave 1F - Wild Pokemon - 9") + set_trade_mon("Trade_Crinkles", "Route 12 - Wild Pokemon - 4") + data[rom_addresses['Fly_Location']] = self.fly_map_code if self.multiworld.tea[self.player].value: @@ -421,6 +744,14 @@ 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 + if self.multiworld.require_pokedex[self.player]: + data[rom_addresses["Require_Pokedex_A"]] = 1 + data[rom_addresses["Require_Pokedex_B"]] = 1 + if self.multiworld.dexsanity[self.player]: + data[rom_addresses["Option_Dexsanity_A"]] = 1 + data[rom_addresses["Option_Dexsanity_B"]] = 1 + if self.multiworld.all_pokemon_seen[self.player]: + data[rom_addresses["Option_Pokedex_Seen"]] = 1 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) @@ -433,6 +764,7 @@ def generate_output(self, output_directory: str): 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"]) + write_quizzes(self, data, random) if self.multiworld.badges_needed_for_hm_moves[self.player].value == 0: for hm_move in poke_data.hm_moves: @@ -492,10 +824,10 @@ def generate_output(self, output_directory: str): data[address + 17] = poke_data.moves[self.local_poke_data[mon]["start move 3"]]["id"] data[address + 18] = poke_data.moves[self.local_poke_data[mon]["start move 4"]]["id"] write_bytes(data, self.local_poke_data[mon]["tms"], address + 20) - if mon in self.learnsets: - address = rom_addresses["Learnset_" + mon.replace(" ", "")] - for i, move in enumerate(self.learnsets[mon]): - data[(address + 1) + i * 2] = poke_data.moves[move]["id"] + if mon in self.learnsets and self.learnsets[mon]: + address = rom_addresses["Learnset_" + mon.replace(" ", "")] + 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].value data[rom_addresses["Option_Aide_Rt11"]] = self.multiworld.oaks_aide_rt_11[self.player].value @@ -507,8 +839,8 @@ 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 + for i in range(1, 10): + data[rom_addresses[f"Option_Trainersanity{i}"]] = self.multiworld.trainersanity[self.player].value data[rom_addresses["Option_Always_Half_STAB"]] = int(not self.multiworld.same_type_attack_bonus[self.player].value) @@ -532,8 +864,23 @@ def generate_output(self, output_directory: str): if data[rom_addresses["Start_Inventory"] + item.code - 172000000] < 255: data[rom_addresses["Start_Inventory"] + item.code - 172000000] += 1 + set_mon_palettes(self, random, data) process_trainer_data(self, data, random) + for move_data in self.local_move_data.values(): + if move_data["id"] == 0: + continue + address = rom_addresses["Move_Data"] + ((move_data["id"] - 1) * 6) + write_bytes(data, bytearray([move_data["id"], move_data["effect"], move_data["power"], + poke_data.type_ids[move_data["type"]], round(move_data["accuracy"] * 2.55), move_data["pp"]]), address) + + TM_IDs = bytearray([poke_data.moves[move]["id"] for move in self.local_tms]) + write_bytes(data, TM_IDs, rom_addresses["TM_Moves"]) + + if self.multiworld.randomize_rock_tunnel[self.player]: + seed = randomize_rock_tunnel(data, random) + write_bytes(data, encode_text(f"SEED: {seed}"), rom_addresses["Text_Rock_Tunnel_Sign"]) + mons = [mon["id"] for mon in poke_data.pokemon_data.values()] random.shuffle(mons) data[rom_addresses['Title_Mon_First']] = mons.pop() @@ -564,7 +911,7 @@ def generate_output(self, output_directory: str): else: write_bytes(data, self.rival_name, rom_addresses['Rival_Name']) - data[0xFF00] = 1 # client compatibility version + data[0xFF00] = 2 # client compatibility version write_bytes(data, self.multiworld.seed_name.encode(), 0xFFDB) write_bytes(data, self.multiworld.player_name[self.player].encode(), 0xFFF0) diff --git a/worlds/pokemon_rb/rom_addresses.py b/worlds/pokemon_rb/rom_addresses.py index 30c38fa2..11b6e146 100644 --- a/worlds/pokemon_rb/rom_addresses.py +++ b/worlds/pokemon_rb/rom_addresses.py @@ -1,7 +1,7 @@ rom_addresses = { "Option_Encounter_Minimum_Steps": 0x3c3, - "Option_Blind_Trainers": 0x30fc, - "Option_Trainersanity": 0x318c, + "Option_Blind_Trainers": 0x30e2, + "Option_Trainersanity1": 0x3172, "Option_Lose_Money": 0x40d4, "Base_Stats_Mew": 0x4260, "Title_Mon_First": 0x4373, @@ -9,94 +9,95 @@ rom_addresses = { "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, + "Title_Seed": 0x5e57, + "Title_Slot_Name": 0x5e77, + "PC_Item": 0x6245, + "PC_Item_Quantity": 0x624a, + "Options": 0x625a, + "Fly_Location": 0x625f, + "Skip_Player_Name": 0x6278, + "Skip_Rival_Name": 0x6286, + "Option_Old_Man": 0xcb05, + "Option_Old_Man_Lying": 0xcb08, + "Option_Boulders": 0xcdae, + "Option_Rock_Tunnel_Extra_Items": 0xcdb7, + "Wild_Route1": 0xd111, + "Wild_Route2": 0xd127, + "Wild_Route22": 0xd13d, + "Wild_ViridianForest": 0xd153, + "Wild_Route3": 0xd169, + "Wild_MtMoon1F": 0xd17f, + "Wild_MtMoonB1F": 0xd195, + "Wild_MtMoonB2F": 0xd1ab, + "Wild_Route4": 0xd1c1, + "Wild_Route24": 0xd1d7, + "Wild_Route25": 0xd1ed, + "Wild_Route9": 0xd203, + "Wild_Route5": 0xd219, + "Wild_Route6": 0xd22f, + "Wild_Route11": 0xd245, + "Wild_RockTunnel1F": 0xd25b, + "Wild_RockTunnelB1F": 0xd271, + "Wild_Route10": 0xd287, + "Wild_Route12": 0xd29d, + "Wild_Route8": 0xd2b3, + "Wild_Route7": 0xd2c9, + "Wild_PokemonTower3F": 0xd2e3, + "Wild_PokemonTower4F": 0xd2f9, + "Wild_PokemonTower5F": 0xd30f, + "Wild_PokemonTower6F": 0xd325, + "Wild_PokemonTower7F": 0xd33b, + "Wild_Route13": 0xd351, + "Wild_Route14": 0xd367, + "Wild_Route15": 0xd37d, + "Wild_Route16": 0xd393, + "Wild_Route17": 0xd3a9, + "Wild_Route18": 0xd3bf, + "Wild_SafariZoneCenter": 0xd3d5, + "Wild_SafariZoneEast": 0xd3eb, + "Wild_SafariZoneNorth": 0xd401, + "Wild_SafariZoneWest": 0xd417, + "Wild_SeaRoutes": 0xd42e, + "Wild_SeafoamIslands1F": 0xd443, + "Wild_SeafoamIslandsB1F": 0xd459, + "Wild_SeafoamIslandsB2F": 0xd46f, + "Wild_SeafoamIslandsB3F": 0xd485, + "Wild_SeafoamIslandsB4F": 0xd49b, + "Wild_PokemonMansion1F": 0xd4b1, + "Wild_PokemonMansion2F": 0xd4c7, + "Wild_PokemonMansion3F": 0xd4dd, + "Wild_PokemonMansionB1F": 0xd4f3, + "Wild_Route21": 0xd509, + "Wild_Surf_Route21": 0xd51e, + "Wild_CeruleanCave1F": 0xd533, + "Wild_CeruleanCave2F": 0xd549, + "Wild_CeruleanCaveB1F": 0xd55f, + "Wild_PowerPlant": 0xd575, + "Wild_Route23": 0xd58b, + "Wild_VictoryRoad2F": 0xd5a1, + "Wild_VictoryRoad3F": 0xd5b7, + "Wild_VictoryRoad1F": 0xd5cd, + "Wild_DiglettsCave": 0xd5e3, + "Ghost_Battle5": 0xd739, + "HM_Surf_Badge_a": 0xda2f, + "HM_Surf_Badge_b": 0xda34, + "Wild_Old_Rod": 0xe331, + "Wild_Good_Rod": 0xe35e, + "Option_Reusable_TMs": 0xe62a, + "Wild_Super_Rod_A": 0xea5f, + "Wild_Super_Rod_B": 0xea64, + "Wild_Super_Rod_C": 0xea69, + "Wild_Super_Rod_D": 0xea70, + "Wild_Super_Rod_E": 0xea75, + "Wild_Super_Rod_F": 0xea7a, + "Wild_Super_Rod_G": 0xea83, + "Wild_Super_Rod_H": 0xea8c, + "Wild_Super_Rod_I": 0xea95, + "Wild_Super_Rod_J": 0xea9e, + "Starting_Money_High": 0xf968, + "Starting_Money_Middle": 0xf96b, + "Starting_Money_Low": 0xf96e, + "Option_Pokedex_Seen": 0xf989, "HM_Fly_Badge_a": 0x1318e, "HM_Fly_Badge_b": 0x13193, "HM_Cut_Badge_a": 0x131c4, @@ -105,35 +106,36 @@ rom_addresses = { "HM_Strength_Badge_b": 0x131f9, "HM_Flash_Badge_a": 0x13208, "HM_Flash_Badge_b": 0x1320d, + "TM_Moves": 0x1376c, "Encounter_Chances": 0x13911, "Option_Viridian_Gym_Badges": 0x1901d, "Event_Sleepy_Guy": 0x191bc, "Starter2_K": 0x195a8, "Starter3_K": 0x195b0, "Event_Rocket_Thief": 0x196cc, - "Option_Cerulean_Cave_Condition": 0x1986c, - "Event_Stranded_Man": 0x19b1f, - "Event_Rivals_Sister": 0x19cf2, - "Option_Pokemon_League_Badges": 0x19e0f, - "Shop10": 0x19ee6, - "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_0_ITEM": 0x1a03a, - "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_1_ITEM": 0x1a048, - "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_2_ITEM": 0x1a056, - "Missable_Silph_Co_4F_Item_1": 0x1a0fe, - "Missable_Silph_Co_4F_Item_2": 0x1a105, - "Missable_Silph_Co_4F_Item_3": 0x1a10c, - "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_0_ITEM": 0x1a264, - "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_1_ITEM": 0x1a272, - "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_2_ITEM": 0x1a280, - "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_3_ITEM": 0x1a28e, - "Missable_Silph_Co_5F_Item_1": 0x1a366, - "Missable_Silph_Co_5F_Item_2": 0x1a36d, - "Missable_Silph_Co_5F_Item_3": 0x1a374, - "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_0_ITEM": 0x1a4a4, - "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_1_ITEM": 0x1a4b2, - "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_2_ITEM": 0x1a4c0, - "Missable_Silph_Co_6F_Item_1": 0x1a5e2, - "Missable_Silph_Co_6F_Item_2": 0x1a5e9, + "Option_Cerulean_Cave_Condition": 0x19875, + "Event_Stranded_Man": 0x19b28, + "Event_Rivals_Sister": 0x19cfb, + "Option_Pokemon_League_Badges": 0x19e18, + "Shop10": 0x19eef, + "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_0_ITEM": 0x1a043, + "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_1_ITEM": 0x1a051, + "Trainersanity_EVENT_BEAT_SILPH_CO_4F_TRAINER_2_ITEM": 0x1a05f, + "Missable_Silph_Co_4F_Item_1": 0x1a107, + "Missable_Silph_Co_4F_Item_2": 0x1a10e, + "Missable_Silph_Co_4F_Item_3": 0x1a115, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_0_ITEM": 0x1a26d, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_1_ITEM": 0x1a27b, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_2_ITEM": 0x1a289, + "Trainersanity_EVENT_BEAT_SILPH_CO_5F_TRAINER_3_ITEM": 0x1a297, + "Missable_Silph_Co_5F_Item_1": 0x1a36f, + "Missable_Silph_Co_5F_Item_2": 0x1a376, + "Missable_Silph_Co_5F_Item_3": 0x1a37d, + "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_0_ITEM": 0x1a4ad, + "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_1_ITEM": 0x1a4bb, + "Trainersanity_EVENT_BEAT_SILPH_CO_6F_TRAINER_2_ITEM": 0x1a4c9, + "Missable_Silph_Co_6F_Item_1": 0x1a5eb, + "Missable_Silph_Co_6F_Item_2": 0x1a5f2, "Event_Free_Sample": 0x1cad6, "Starter1_F": 0x1cca2, "Starter2_F": 0x1cca6, @@ -145,49 +147,50 @@ rom_addresses = { "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, + "Starter2_E": 0x1d300, + "Starter3_E": 0x1d308, + "Event_Pokedex": 0x1d36c, + "Event_Oaks_Gift": 0x1d39c, + "Event_Pokemart_Quest": 0x1d594, + "Shop1": 0x1d5be, + "Event_Bicycle_Shop": 0x1d858, + "Text_Bicycle": 0x1d8eb, + "Event_Fuji": 0x1da20, + "Trainersanity_EVENT_BEAT_MEW_ITEM": 0x1dc73, + "Static_Encounter_Mew": 0x1dca3, + "Gift_Eevee": 0x1dd1c, + "Shop7": 0x1dd6e, + "Event_Mr_Psychic": 0x1de4b, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_0_ITEM": 0x1e346, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_1_ITEM": 0x1e354, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_2_ITEM": 0x1e362, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_3_ITEM": 0x1e370, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_4_ITEM": 0x1e37e, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_5_ITEM": 0x1e38c, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_6_ITEM": 0x1e39a, + "Trainersanity_EVENT_BEAT_POWER_PLANT_VOLTORB_7_ITEM": 0x1e3a8, + "Trainersanity_EVENT_BEAT_ZAPDOS_ITEM": 0x1e3b6, + "Static_Encounter_Voltorb_A": 0x1e425, + "Static_Encounter_Voltorb_B": 0x1e42d, + "Static_Encounter_Voltorb_C": 0x1e435, + "Static_Encounter_Electrode_A": 0x1e43d, + "Static_Encounter_Voltorb_D": 0x1e445, + "Static_Encounter_Voltorb_E": 0x1e44d, + "Static_Encounter_Electrode_B": 0x1e455, + "Static_Encounter_Voltorb_F": 0x1e45d, + "Static_Encounter_Zapdos": 0x1e465, + "Missable_Power_Plant_Item_1": 0x1e46d, + "Missable_Power_Plant_Item_2": 0x1e474, + "Missable_Power_Plant_Item_3": 0x1e47b, + "Missable_Power_Plant_Item_4": 0x1e482, + "Missable_Power_Plant_Item_5": 0x1e489, + "Event_Rt16_House_Woman": 0x1e662, + "Option_Victory_Road_Badges": 0x1e733, + "Event_Bill": 0x1e964, "Starter1_O": 0x372b0, "Starter2_O": 0x372b4, "Starter3_O": 0x372b8, + "Move_Data": 0x38000, "Base_Stats": 0x383de, "Starter3_C": 0x39cf2, "Starter1_C": 0x39cf8, @@ -217,320 +220,345 @@ rom_addresses = { "Rival_Starter3_H": 0x3a4ab, "Rival_Starter1_H": 0x3a4b9, "Trainer_Data_End": 0x3a52e, - "Learnset_Rhydon": 0x3b1d9, - "Learnset_Kangaskhan": 0x3b1e7, - "Learnset_NidoranM": 0x3b1f6, - "Learnset_Clefairy": 0x3b208, - "Learnset_Spearow": 0x3b219, - "Learnset_Voltorb": 0x3b228, - "Learnset_Nidoking": 0x3b234, - "Learnset_Slowbro": 0x3b23c, - "Learnset_Ivysaur": 0x3b24f, - "Learnset_Exeggutor": 0x3b25f, - "Learnset_Lickitung": 0x3b263, - "Learnset_Exeggcute": 0x3b273, - "Learnset_Grimer": 0x3b284, - "Learnset_Gengar": 0x3b292, - "Learnset_NidoranF": 0x3b29b, - "Learnset_Nidoqueen": 0x3b2a9, - "Learnset_Cubone": 0x3b2b4, - "Learnset_Rhyhorn": 0x3b2c3, - "Learnset_Lapras": 0x3b2d1, - "Learnset_Mew": 0x3b2e1, - "Learnset_Gyarados": 0x3b2eb, - "Learnset_Shellder": 0x3b2fb, - "Learnset_Tentacool": 0x3b30a, - "Learnset_Gastly": 0x3b31f, - "Learnset_Scyther": 0x3b325, - "Learnset_Staryu": 0x3b337, - "Learnset_Blastoise": 0x3b347, - "Learnset_Pinsir": 0x3b355, - "Learnset_Tangela": 0x3b363, - "Learnset_Growlithe": 0x3b379, - "Learnset_Onix": 0x3b385, - "Learnset_Fearow": 0x3b391, - "Learnset_Pidgey": 0x3b3a0, - "Learnset_Slowpoke": 0x3b3b1, - "Learnset_Kadabra": 0x3b3c9, - "Learnset_Graveler": 0x3b3e1, - "Learnset_Chansey": 0x3b3ef, - "Learnset_Machoke": 0x3b407, - "Learnset_MrMime": 0x3b413, - "Learnset_Hitmonlee": 0x3b41f, - "Learnset_Hitmonchan": 0x3b42b, - "Learnset_Arbok": 0x3b437, - "Learnset_Parasect": 0x3b443, - "Learnset_Psyduck": 0x3b452, - "Learnset_Drowzee": 0x3b461, - "Learnset_Golem": 0x3b46f, - "Learnset_Magmar": 0x3b47f, - "Learnset_Electabuzz": 0x3b48f, - "Learnset_Magneton": 0x3b49b, - "Learnset_Koffing": 0x3b4ac, - "Learnset_Mankey": 0x3b4bd, - "Learnset_Seel": 0x3b4cc, - "Learnset_Diglett": 0x3b4db, - "Learnset_Tauros": 0x3b4e7, - "Learnset_Farfetchd": 0x3b4f9, - "Learnset_Venonat": 0x3b508, - "Learnset_Dragonite": 0x3b516, - "Learnset_Doduo": 0x3b52b, - "Learnset_Poliwag": 0x3b53c, - "Learnset_Jynx": 0x3b54a, - "Learnset_Moltres": 0x3b558, - "Learnset_Articuno": 0x3b560, - "Learnset_Zapdos": 0x3b568, - "Learnset_Meowth": 0x3b575, - "Learnset_Krabby": 0x3b584, - "Learnset_Vulpix": 0x3b59a, - "Learnset_Pikachu": 0x3b5ac, - "Learnset_Dratini": 0x3b5c1, - "Learnset_Dragonair": 0x3b5d0, - "Learnset_Kabuto": 0x3b5df, - "Learnset_Kabutops": 0x3b5e9, - "Learnset_Horsea": 0x3b5f6, - "Learnset_Seadra": 0x3b602, - "Learnset_Sandshrew": 0x3b615, - "Learnset_Sandslash": 0x3b621, - "Learnset_Omanyte": 0x3b630, - "Learnset_Omastar": 0x3b63a, - "Learnset_Jigglypuff": 0x3b648, - "Learnset_Eevee": 0x3b666, - "Learnset_Flareon": 0x3b670, - "Learnset_Jolteon": 0x3b682, - "Learnset_Vaporeon": 0x3b694, - "Learnset_Machop": 0x3b6a9, - "Learnset_Zubat": 0x3b6b8, - "Learnset_Ekans": 0x3b6c7, - "Learnset_Paras": 0x3b6d6, - "Learnset_Poliwhirl": 0x3b6e6, - "Learnset_Poliwrath": 0x3b6f4, - "Learnset_Beedrill": 0x3b704, - "Learnset_Dodrio": 0x3b714, - "Learnset_Primeape": 0x3b722, - "Learnset_Dugtrio": 0x3b72e, - "Learnset_Venomoth": 0x3b73a, - "Learnset_Dewgong": 0x3b748, - "Learnset_Butterfree": 0x3b762, - "Learnset_Machamp": 0x3b772, - "Learnset_Golduck": 0x3b780, - "Learnset_Hypno": 0x3b78c, - "Learnset_Golbat": 0x3b79a, - "Learnset_Mewtwo": 0x3b7a6, - "Learnset_Snorlax": 0x3b7b2, - "Learnset_Magikarp": 0x3b7bf, - "Learnset_Muk": 0x3b7c7, - "Learnset_Kingler": 0x3b7d7, - "Learnset_Cloyster": 0x3b7e3, - "Learnset_Electrode": 0x3b7e9, - "Learnset_Weezing": 0x3b7f7, - "Learnset_Persian": 0x3b803, - "Learnset_Marowak": 0x3b80f, - "Learnset_Haunter": 0x3b827, - "Learnset_Alakazam": 0x3b832, - "Learnset_Pidgeotto": 0x3b843, - "Learnset_Pidgeot": 0x3b851, - "Learnset_Bulbasaur": 0x3b864, - "Learnset_Venusaur": 0x3b874, - "Learnset_Tentacruel": 0x3b884, - "Learnset_Goldeen": 0x3b89b, - "Learnset_Seaking": 0x3b8a9, - "Learnset_Ponyta": 0x3b8c2, - "Learnset_Rapidash": 0x3b8d0, - "Learnset_Rattata": 0x3b8e1, - "Learnset_Raticate": 0x3b8eb, - "Learnset_Nidorino": 0x3b8f9, - "Learnset_Nidorina": 0x3b90b, - "Learnset_Geodude": 0x3b91c, - "Learnset_Porygon": 0x3b92a, - "Learnset_Aerodactyl": 0x3b934, - "Learnset_Magnemite": 0x3b942, - "Learnset_Charmander": 0x3b957, - "Learnset_Squirtle": 0x3b968, - "Learnset_Charmeleon": 0x3b979, - "Learnset_Wartortle": 0x3b98a, - "Learnset_Charizard": 0x3b998, - "Learnset_Oddish": 0x3b9b1, - "Learnset_Gloom": 0x3b9c3, - "Learnset_Vileplume": 0x3b9d1, - "Learnset_Bellsprout": 0x3b9dc, - "Learnset_Weepinbell": 0x3b9f0, - "Learnset_Victreebel": 0x3ba00, + "Learnset_Rhydon": 0x3b1e1, + "Learnset_Kangaskhan": 0x3b1ef, + "Learnset_NidoranM": 0x3b1fe, + "Learnset_Clefairy": 0x3b210, + "Learnset_Spearow": 0x3b221, + "Learnset_Voltorb": 0x3b230, + "Learnset_Nidoking": 0x3b23c, + "Learnset_Slowbro": 0x3b244, + "Learnset_Ivysaur": 0x3b257, + "Learnset_Exeggutor": 0x3b267, + "Learnset_Lickitung": 0x3b26b, + "Learnset_Exeggcute": 0x3b27b, + "Learnset_Grimer": 0x3b28c, + "Learnset_Gengar": 0x3b29a, + "Learnset_NidoranF": 0x3b2a3, + "Learnset_Nidoqueen": 0x3b2b1, + "Learnset_Cubone": 0x3b2bc, + "Learnset_Rhyhorn": 0x3b2cb, + "Learnset_Lapras": 0x3b2d9, + "Learnset_Mew": 0x3b2e9, + "Learnset_Gyarados": 0x3b2f3, + "Learnset_Shellder": 0x3b303, + "Learnset_Tentacool": 0x3b312, + "Learnset_Gastly": 0x3b327, + "Learnset_Scyther": 0x3b32d, + "Learnset_Staryu": 0x3b33f, + "Learnset_Blastoise": 0x3b34f, + "Learnset_Pinsir": 0x3b35d, + "Learnset_Tangela": 0x3b36b, + "Learnset_Growlithe": 0x3b381, + "Learnset_Onix": 0x3b38d, + "Learnset_Fearow": 0x3b399, + "Learnset_Pidgey": 0x3b3a8, + "Learnset_Slowpoke": 0x3b3b9, + "Learnset_Kadabra": 0x3b3d1, + "Learnset_Graveler": 0x3b3e9, + "Learnset_Chansey": 0x3b3f7, + "Learnset_Machoke": 0x3b40f, + "Learnset_MrMime": 0x3b41b, + "Learnset_Hitmonlee": 0x3b427, + "Learnset_Hitmonchan": 0x3b433, + "Learnset_Arbok": 0x3b43f, + "Learnset_Parasect": 0x3b44b, + "Learnset_Psyduck": 0x3b45a, + "Learnset_Drowzee": 0x3b469, + "Learnset_Golem": 0x3b477, + "Learnset_Magmar": 0x3b487, + "Learnset_Electabuzz": 0x3b497, + "Learnset_Magneton": 0x3b4a3, + "Learnset_Koffing": 0x3b4b4, + "Learnset_Mankey": 0x3b4c5, + "Learnset_Seel": 0x3b4d4, + "Learnset_Diglett": 0x3b4e3, + "Learnset_Tauros": 0x3b4ef, + "Learnset_Farfetchd": 0x3b501, + "Learnset_Venonat": 0x3b510, + "Learnset_Dragonite": 0x3b51e, + "Learnset_Doduo": 0x3b533, + "Learnset_Poliwag": 0x3b544, + "Learnset_Jynx": 0x3b552, + "Learnset_Moltres": 0x3b560, + "Learnset_Articuno": 0x3b568, + "Learnset_Zapdos": 0x3b570, + "Learnset_Meowth": 0x3b57d, + "Learnset_Krabby": 0x3b58c, + "Learnset_Vulpix": 0x3b5a2, + "Learnset_Pikachu": 0x3b5b4, + "Learnset_Dratini": 0x3b5c9, + "Learnset_Dragonair": 0x3b5d8, + "Learnset_Kabuto": 0x3b5e7, + "Learnset_Kabutops": 0x3b5f1, + "Learnset_Horsea": 0x3b5fe, + "Learnset_Seadra": 0x3b60a, + "Learnset_Sandshrew": 0x3b61d, + "Learnset_Sandslash": 0x3b629, + "Learnset_Omanyte": 0x3b638, + "Learnset_Omastar": 0x3b642, + "Learnset_Jigglypuff": 0x3b650, + "Learnset_Eevee": 0x3b66e, + "Learnset_Flareon": 0x3b678, + "Learnset_Jolteon": 0x3b68a, + "Learnset_Vaporeon": 0x3b69c, + "Learnset_Machop": 0x3b6b1, + "Learnset_Zubat": 0x3b6c0, + "Learnset_Ekans": 0x3b6cf, + "Learnset_Paras": 0x3b6de, + "Learnset_Poliwhirl": 0x3b6ee, + "Learnset_Poliwrath": 0x3b6fc, + "Learnset_Beedrill": 0x3b70c, + "Learnset_Dodrio": 0x3b71c, + "Learnset_Primeape": 0x3b72a, + "Learnset_Dugtrio": 0x3b736, + "Learnset_Venomoth": 0x3b742, + "Learnset_Dewgong": 0x3b750, + "Learnset_Butterfree": 0x3b76a, + "Learnset_Machamp": 0x3b77a, + "Learnset_Golduck": 0x3b788, + "Learnset_Hypno": 0x3b794, + "Learnset_Golbat": 0x3b7a2, + "Learnset_Mewtwo": 0x3b7ae, + "Learnset_Snorlax": 0x3b7ba, + "Learnset_Magikarp": 0x3b7c7, + "Learnset_Muk": 0x3b7cf, + "Learnset_Kingler": 0x3b7df, + "Learnset_Cloyster": 0x3b7eb, + "Learnset_Electrode": 0x3b7f1, + "Learnset_Weezing": 0x3b7ff, + "Learnset_Persian": 0x3b80b, + "Learnset_Marowak": 0x3b817, + "Learnset_Haunter": 0x3b82f, + "Learnset_Alakazam": 0x3b83a, + "Learnset_Pidgeotto": 0x3b84b, + "Learnset_Pidgeot": 0x3b859, + "Learnset_Bulbasaur": 0x3b86c, + "Learnset_Venusaur": 0x3b87c, + "Learnset_Tentacruel": 0x3b88c, + "Learnset_Goldeen": 0x3b8a3, + "Learnset_Seaking": 0x3b8b1, + "Learnset_Ponyta": 0x3b8ca, + "Learnset_Rapidash": 0x3b8d8, + "Learnset_Rattata": 0x3b8e9, + "Learnset_Raticate": 0x3b8f3, + "Learnset_Nidorino": 0x3b901, + "Learnset_Nidorina": 0x3b913, + "Learnset_Geodude": 0x3b924, + "Learnset_Porygon": 0x3b932, + "Learnset_Aerodactyl": 0x3b93c, + "Learnset_Magnemite": 0x3b94b, + "Learnset_Charmander": 0x3b960, + "Learnset_Squirtle": 0x3b971, + "Learnset_Charmeleon": 0x3b982, + "Learnset_Wartortle": 0x3b993, + "Learnset_Charizard": 0x3b9a1, + "Learnset_Oddish": 0x3b9ba, + "Learnset_Gloom": 0x3b9cc, + "Learnset_Vileplume": 0x3b9da, + "Learnset_Bellsprout": 0x3b9e5, + "Learnset_Weepinbell": 0x3b9f9, + "Learnset_Victreebel": 0x3ba09, "Option_Always_Half_STAB": 0x3e3fb, "Type_Chart": 0x3e4ee, "Ghost_Battle3": 0x3f1be, - "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, + "Dexsanity_Items": 0x44254, + "Option_Dexsanity_A": 0x44301, + "Require_Pokedex_B": 0x44305, + "Option_Dexsanity_B": 0x44362, + "Trainersanity_EVENT_BEAT_MANSION_1_TRAINER_0_ITEM": 0x44540, + "Missable_Pokemon_Mansion_1F_Item_1": 0x445d7, + "Missable_Pokemon_Mansion_1F_Item_2": 0x445de, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_0_ITEM": 0x44713, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_1_ITEM": 0x44721, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_2_ITEM": 0x4472f, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_3_ITEM": 0x4473d, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_4_ITEM": 0x4474b, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_5_ITEM": 0x44759, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_6_ITEM": 0x44767, + "Map_Rock_Tunnel1F": 0x44884, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_0_ITEM": 0x44c54, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_1_ITEM": 0x44c62, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_2_ITEM": 0x44c70, + "Trainersanity_EVENT_BEAT_VICTORY_ROAD_3_TRAINER_3_ITEM": 0x44c7e, + "Missable_Victory_Road_3F_Item_1": 0x44d1e, + "Missable_Victory_Road_3F_Item_2": 0x44d25, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_0_ITEM": 0x44e46, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_1_ITEM": 0x44e54, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_2_ITEM": 0x44e62, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_3_ITEM": 0x44e70, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_4_ITEM": 0x44e7e, + "Missable_Rocket_Hideout_B1F_Item_1": 0x44f4e, + "Missable_Rocket_Hideout_B1F_Item_2": 0x44f55, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_2_TRAINER_0_ITEM": 0x452ff, + "Missable_Rocket_Hideout_B2F_Item_1": 0x45340, + "Missable_Rocket_Hideout_B2F_Item_2": 0x45347, + "Missable_Rocket_Hideout_B2F_Item_3": 0x4534e, + "Missable_Rocket_Hideout_B2F_Item_4": 0x45355, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_0_ITEM": 0x45532, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_1_ITEM": 0x45540, + "Missable_Rocket_Hideout_B3F_Item_1": 0x45596, + "Missable_Rocket_Hideout_B3F_Item_2": 0x4559d, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_0_ITEM": 0x45749, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_1_ITEM": 0x45757, + "Trainersanity_EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_2_ITEM": 0x45765, + "Missable_Rocket_Hideout_B4F_Item_1": 0x45854, + "Missable_Rocket_Hideout_B4F_Item_2": 0x4585b, + "Missable_Rocket_Hideout_B4F_Item_3": 0x45862, + "Missable_Rocket_Hideout_B4F_Item_4": 0x45869, + "Missable_Rocket_Hideout_B4F_Item_5": 0x45870, + "Missable_Safari_Zone_East_Item_1": 0x45adf, + "Missable_Safari_Zone_East_Item_2": 0x45ae6, + "Missable_Safari_Zone_East_Item_3": 0x45aed, + "Missable_Safari_Zone_East_Item_4": 0x45af4, + "Missable_Safari_Zone_North_Item_1": 0x45c3f, + "Missable_Safari_Zone_North_Item_2": 0x45c46, + "Missable_Safari_Zone_Center_Item": 0x45e26, + "Missable_Cerulean_Cave_2F_Item_1": 0x46063, + "Missable_Cerulean_Cave_2F_Item_2": 0x4606a, + "Missable_Cerulean_Cave_2F_Item_3": 0x46071, + "Trainersanity_EVENT_BEAT_MEWTWO_ITEM": 0x46149, + "Static_Encounter_Mewtwo": 0x46173, + "Missable_Cerulean_Cave_B1F_Item_1": 0x4617b, + "Missable_Cerulean_Cave_B1F_Item_2": 0x46182, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_0_ITEM": 0x46258, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_1_ITEM": 0x46266, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_2_ITEM": 0x46274, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_3_ITEM": 0x46282, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_4_ITEM": 0x46290, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_5_ITEM": 0x4629e, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_6_ITEM": 0x462ac, + "Trainersanity_EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_7_ITEM": 0x462ba, + "Missable_Rock_Tunnel_B1F_Item_1": 0x463de, + "Missable_Rock_Tunnel_B1F_Item_2": 0x463e5, + "Missable_Rock_Tunnel_B1F_Item_3": 0x463ec, + "Missable_Rock_Tunnel_B1F_Item_4": 0x463f3, + "Map_Rock_TunnelB1F": 0x46404, + "Trainersanity_EVENT_BEAT_ARTICUNO_ITEM": 0x46af6, + "Static_Encounter_Articuno": 0x46b4d, + "Hidden_Item_Game_Corner_1": 0x46fe5, + "Hidden_Item_Game_Corner_2": 0x46feb, + "Hidden_Item_Game_Corner_3": 0x46ff1, + "Hidden_Item_Game_Corner_4": 0x46ff7, + "Hidden_Item_Game_Corner_5": 0x46ffd, + "Hidden_Item_Game_Corner_6": 0x47003, + "Hidden_Item_Game_Corner_7": 0x47009, + "Hidden_Item_Game_Corner_8": 0x4700f, + "Hidden_Item_Game_Corner_9": 0x47015, + "Hidden_Item_Game_Corner_10": 0x4701b, + "Hidden_Item_Game_Corner_11": 0x47021, + "Quiz_Answer_A": 0x47055, + "Quiz_Answer_B": 0x4705b, + "Quiz_Answer_C": 0x47061, + "Quiz_Answer_D": 0x47067, + "Quiz_Answer_E": 0x4706d, + "Quiz_Answer_F": 0x47073, + "Hidden_Item_Viridian_Forest_1": 0x470a8, + "Hidden_Item_Viridian_Forest_2": 0x470ae, + "Hidden_Item_MtMoonB2F_1": 0x470b5, + "Hidden_Item_MtMoonB2F_2": 0x470bb, + "Hidden_Item_Route_25_1": 0x470cf, + "Hidden_Item_Route_25_2": 0x470d5, + "Hidden_Item_Route_9": 0x470dc, + "Hidden_Item_SS_Anne_Kitchen": 0x470ef, + "Hidden_Item_SS_Anne_B1F": 0x470f6, + "Hidden_Item_Route_10_1": 0x470fd, + "Hidden_Item_Route_10_2": 0x47103, + "Hidden_Item_Rocket_Hideout_B1F": 0x4710a, + "Hidden_Item_Rocket_Hideout_B3F": 0x47111, + "Hidden_Item_Rocket_Hideout_B4F": 0x47118, + "Hidden_Item_Pokemon_Tower_5F": 0x4712c, + "Hidden_Item_Route_13_1": 0x47133, + "Hidden_Item_Route_13_2": 0x47139, + "Hidden_Item_Safari_Zone_West": 0x47147, + "Hidden_Item_Silph_Co_5F": 0x4714e, + "Hidden_Item_Silph_Co_9F": 0x47155, + "Hidden_Item_Copycats_House": 0x4715c, + "Hidden_Item_Cerulean_Cave_1F": 0x47163, + "Hidden_Item_Cerulean_Cave_B1F": 0x4716a, + "Hidden_Item_Power_Plant_1": 0x47171, + "Hidden_Item_Power_Plant_2": 0x47177, + "Hidden_Item_Seafoam_Islands_B2F": 0x4717e, + "Hidden_Item_Seafoam_Islands_B4F": 0x47185, + "Hidden_Item_Pokemon_Mansion_1F": 0x4718c, + "Hidden_Item_Pokemon_Mansion_3F": 0x471a0, + "Hidden_Item_Pokemon_Mansion_B1F": 0x471ad, + "Hidden_Item_Route_23_1": 0x471c0, + "Hidden_Item_Route_23_2": 0x471c6, + "Hidden_Item_Route_23_3": 0x471cc, + "Hidden_Item_Victory_Road_2F_1": 0x471d3, + "Hidden_Item_Victory_Road_2F_2": 0x471d9, + "Hidden_Item_Unused_6F": 0x471e0, + "Hidden_Item_Viridian_City": 0x471ee, + "Hidden_Item_Route_11": 0x4729b, + "Hidden_Item_Route_12": 0x472a2, + "Hidden_Item_Route_17_1": 0x472b0, + "Hidden_Item_Route_17_2": 0x472b6, + "Hidden_Item_Route_17_3": 0x472bc, + "Hidden_Item_Route_17_4": 0x472c2, + "Hidden_Item_Route_17_5": 0x472c8, + "Hidden_Item_Underground_Path_NS_1": 0x472cf, + "Hidden_Item_Underground_Path_NS_2": 0x472d5, + "Hidden_Item_Underground_Path_WE_1": 0x472dc, + "Hidden_Item_Underground_Path_WE_2": 0x472e2, + "Hidden_Item_Celadon_City": 0x472e9, + "Hidden_Item_Seafoam_Islands_B3F": 0x472f0, + "Hidden_Item_Vermilion_City": 0x472f7, + "Hidden_Item_Cerulean_City": 0x472fe, + "Hidden_Item_Route_4": 0x47305, "Event_Counter": 0x482d3, - "Event_Thirsty_Girl_Lemonade": 0x484f9, - "Event_Thirsty_Girl_Soda": 0x4851d, - "Event_Thirsty_Girl_Water": 0x48541, - "Option_Tea": 0x4871d, - "Event_Mansion_Lady": 0x4872a, - "Badge_Celadon_Gym": 0x48a1b, - "Event_Celadon_Gym": 0x48a2f, - "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, + "Event_Thirsty_Girl_Lemonade": 0x48501, + "Event_Thirsty_Girl_Soda": 0x48525, + "Event_Thirsty_Girl_Water": 0x48549, + "Option_Tea": 0x48725, + "Event_Mansion_Lady": 0x48732, + "Badge_Celadon_Gym": 0x48a23, + "Event_Celadon_Gym": 0x48a37, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_0_ITEM": 0x48a7d, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_1_ITEM": 0x48a8b, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_2_ITEM": 0x48a99, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_3_ITEM": 0x48aa7, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_4_ITEM": 0x48ab5, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_5_ITEM": 0x48ac3, + "Trainersanity_EVENT_BEAT_CELADON_GYM_TRAINER_6_ITEM": 0x48ad1, + "Event_Game_Corner_Gift_A": 0x48e98, + "Event_Game_Corner_Gift_C": 0x48f14, + "Event_Game_Corner_Gift_B": 0x48f63, + "Event_Gambling_Addict": 0x49306, + "Gift_Magikarp": 0x494a3, + "Option_Aide_Rt11": 0x49600, + "Event_Rt11_Oaks_Aide": 0x49604, + "Event_Mourning_Girl": 0x496fe, + "Option_Aide_Rt15": 0x497e9, + "Event_Rt_15_Oaks_Aide": 0x497ed, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_0_ITEM": 0x49b93, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_1_ITEM": 0x49ba1, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_2_ITEM": 0x49baf, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_3_ITEM": 0x49bbd, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_4_ITEM": 0x49bcb, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_5_ITEM": 0x49bd9, + "Trainersanity_EVENT_BEAT_MT_MOON_1_TRAINER_6_ITEM": 0x49be7, + "Missable_Mt_Moon_1F_Item_1": 0x49cf6, + "Missable_Mt_Moon_1F_Item_2": 0x49cfd, + "Missable_Mt_Moon_1F_Item_3": 0x49d04, + "Missable_Mt_Moon_1F_Item_4": 0x49d0b, + "Missable_Mt_Moon_1F_Item_5": 0x49d12, + "Missable_Mt_Moon_1F_Item_6": 0x49d19, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_0_ITEM": 0x49fec, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_1_ITEM": 0x49ffa, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_2_ITEM": 0x4a008, + "Trainersanity_EVENT_BEAT_MT_MOON_3_TRAINER_3_ITEM": 0x4a016, + "Dome_Fossil_Text": 0x4a08a, + "Event_Dome_Fossil": 0x4a0aa, + "Helix_Fossil_Text": 0x4a0e6, + "Event_Helix_Fossil": 0x4a106, + "Missable_Mt_Moon_B2F_Item_1": 0x4a1ef, + "Missable_Mt_Moon_B2F_Item_2": 0x4a1f6, + "Missable_Safari_Zone_West_Item_1": 0x4a3d8, + "Missable_Safari_Zone_West_Item_2": 0x4a3df, + "Missable_Safari_Zone_West_Item_3": 0x4a3e6, + "Missable_Safari_Zone_West_Item_4": 0x4a3ed, + "Event_Safari_Zone_Secret_House": 0x4a4f2, "Missable_Route_24_Item": 0x506e6, "Missable_Route_25_Item": 0x5080b, "Trainersanity_EVENT_BEAT_ROUTE_20_TRAINER_0_ITEM": 0x50d47, @@ -606,13 +634,16 @@ rom_addresses = { "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, + "Prize_Item_A": 0x52895, + "Prize_Item_B": 0x52896, + "Prize_Item_C": 0x52897, + "Prize_Mon_A": 0x529cc, + "Prize_Mon_B": 0x529ce, + "Prize_Mon_C": 0x529d0, + "Prize_Mon_D": 0x529d2, + "Prize_Mon_E": 0x529d4, + "Prize_Mon_F": 0x529d6, + "Start_Inventory": 0x52af9, "Missable_Route_2_Item_1": 0x5404a, "Missable_Route_2_Item_2": 0x54051, "Missable_Route_4_Item": 0x543df, @@ -696,81 +727,82 @@ rom_addresses = { "Missable_Route_12_Item_2": 0x5870b, "Missable_Route_15_Item": 0x589c7, "Ghost_Battle6": 0x58df0, - "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, + "Require_Pokedex_A": 0x59051, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_0_ITEM": 0x5910b, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_1_ITEM": 0x59119, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_2_ITEM": 0x59127, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_3_ITEM": 0x59135, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_4_ITEM": 0x59143, + "Trainersanity_EVENT_BEAT_ROUTE_6_TRAINER_5_ITEM": 0x59151, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_0_ITEM": 0x59223, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_1_ITEM": 0x59231, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_2_ITEM": 0x5923f, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_3_ITEM": 0x5924d, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_4_ITEM": 0x5925b, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_5_ITEM": 0x59269, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_6_ITEM": 0x59277, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_7_ITEM": 0x59285, + "Trainersanity_EVENT_BEAT_ROUTE_8_TRAINER_8_ITEM": 0x59293, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_0_ITEM": 0x5940d, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_1_ITEM": 0x5941b, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_2_ITEM": 0x59429, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_3_ITEM": 0x59437, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_4_ITEM": 0x59445, + "Trainersanity_EVENT_BEAT_ROUTE_10_TRAINER_5_ITEM": 0x59453, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_0_ITEM": 0x5953a, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_1_ITEM": 0x59548, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_2_ITEM": 0x59556, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_3_ITEM": 0x59564, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_4_ITEM": 0x59572, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_5_ITEM": 0x59580, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_6_ITEM": 0x5958e, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_7_ITEM": 0x5959c, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_8_ITEM": 0x595aa, + "Trainersanity_EVENT_BEAT_ROUTE_11_TRAINER_9_ITEM": 0x595b8, + "Static_Encounter_Snorlax_A": 0x596f6, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_0_ITEM": 0x59764, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_1_ITEM": 0x59772, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_2_ITEM": 0x59780, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_3_ITEM": 0x5978e, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_4_ITEM": 0x5979c, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_5_ITEM": 0x597aa, + "Trainersanity_EVENT_BEAT_ROUTE_12_TRAINER_6_ITEM": 0x597b8, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_0_ITEM": 0x598c0, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_1_ITEM": 0x598ce, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_2_ITEM": 0x598dc, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_3_ITEM": 0x598ea, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_4_ITEM": 0x598f8, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_5_ITEM": 0x59906, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_6_ITEM": 0x59914, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_7_ITEM": 0x59922, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_8_ITEM": 0x59930, + "Trainersanity_EVENT_BEAT_ROUTE_15_TRAINER_9_ITEM": 0x5993e, + "Static_Encounter_Snorlax_B": 0x59a58, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_0_ITEM": 0x59ac4, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_1_ITEM": 0x59ad2, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_2_ITEM": 0x59ae0, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_3_ITEM": 0x59aee, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_4_ITEM": 0x59afc, + "Trainersanity_EVENT_BEAT_ROUTE_16_TRAINER_5_ITEM": 0x59b0a, + "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_0_ITEM": 0x59beb, + "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_1_ITEM": 0x59bf9, + "Trainersanity_EVENT_BEAT_ROUTE_18_TRAINER_2_ITEM": 0x59c07, + "Event_Pokemon_Fan_Club": 0x59d1a, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_0_ITEM": 0x59e7a, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_1_ITEM": 0x59e88, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_2_ITEM": 0x59e96, + "Trainersanity_EVENT_BEAT_SILPH_CO_2F_TRAINER_3_ITEM": 0x59ea4, + "Event_Scared_Woman": 0x59eb6, + "Trainersanity_EVENT_BEAT_SILPH_CO_3F_TRAINER_0_ITEM": 0x5a0be, + "Trainersanity_EVENT_BEAT_SILPH_CO_3F_TRAINER_1_ITEM": 0x5a0cc, + "Missable_Silph_Co_3F_Item": 0x5a166, + "Trainersanity_EVENT_BEAT_SILPH_CO_10F_TRAINER_0_ITEM": 0x5a288, + "Trainersanity_EVENT_BEAT_SILPH_CO_10F_TRAINER_1_ITEM": 0x5a296, + "Missable_Silph_Co_10F_Item_1": 0x5a320, + "Missable_Silph_Co_10F_Item_2": 0x5a327, + "Missable_Silph_Co_10F_Item_3": 0x5a32e, + "Trainersanity_EVENT_BEAT_LANCES_ROOM_TRAINER_0_ITEM": 0x5a491, + "Guard_Drink_List": 0x5a6a6, "Event_Museum": 0x5c266, "Badge_Pewter_Gym": 0x5c3ed, "Event_Pewter_Gym": 0x5c401, @@ -879,6 +911,16 @@ rom_addresses = { "Trainersanity_EVENT_BEAT_SILPH_CO_11F_TRAINER_1_ITEM": 0x6234a, "Event_Silph_Co_President": 0x6235d, "Ghost_Battle4": 0x708e1, + "Trade_Terry": 0x71b7b, + "Trade_Marcel": 0x71b89, + "Trade_Sailor": 0x71ba5, + "Trade_Dux": 0x71bb3, + "Trade_Marc": 0x71bc1, + "Trade_Lola": 0x71bcf, + "Trade_Doris": 0x71bdd, + "Trade_Crinkles": 0x71beb, + "Trade_Spot": 0x71bf9, + "Mon_Palettes": 0x725dd, "Badge_Viridian_Gym": 0x749f7, "Event_Viridian_Gym": 0x74a0b, "Trainersanity_EVENT_BEAT_VIRIDIAN_GYM_TRAINER_0_ITEM": 0x74a66, @@ -906,18 +948,39 @@ rom_addresses = { "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, + "Option_Trainersanity4": 0x75af6, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_B_ITEM": 0x75b02, + "Option_Trainersanity3": 0x75b46, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_A_ITEM": 0x75b52, + "Option_Trainersanity5": 0x75bad, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_2_ITEM": 0x75bb9, + "Option_Trainersanity6": 0x75bfd, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_3_ITEM": 0x75c09, + "Option_Trainersanity7": 0x75c4d, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_4_ITEM": 0x75c59, + "Option_Trainersanity8": 0x75c9d, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_5_ITEM": 0x75ca9, + "Option_Trainersanity9": 0x75ced, + "Trainersanity_EVENT_BEAT_CINNABAR_GYM_TRAINER_6_ITEM": 0x75cf9, + "Event_Lab_Scientist": 0x75f17, + "Fossils_Needed_For_Second_Item": 0x75fe4, + "Event_Dome_Fossil_B": 0x76061, + "Event_Helix_Fossil_B": 0x76081, + "Shop8": 0x7619f, + "Starter2_N": 0x762d2, + "Starter3_N": 0x762da, + "Trainersanity_EVENT_BEAT_LORELEIS_ROOM_TRAINER_0_ITEM": 0x7663d, + "Trainersanity_EVENT_BEAT_BRUNOS_ROOM_TRAINER_0_ITEM": 0x76796, + "Trainersanity_EVENT_BEAT_AGATHAS_ROOM_TRAINER_0_ITEM": 0x768f5, + "Option_Itemfinder": 0x76a6e, + "Text_Quiz_A": 0x88806, + "Text_Quiz_B": 0x8893a, + "Text_Quiz_C": 0x88a6e, + "Text_Quiz_D": 0x88ba2, + "Text_Quiz_E": 0x88cd6, + "Text_Quiz_F": 0x88e0a, + "Text_Magikarp_Salesman": 0x8ae3f, + "Text_Rock_Tunnel_Sign": 0x8e82a, "Text_Badges_Needed": 0x92304, "Badge_Text_Boulder_Badge": 0x99010, "Badge_Text_Cascade_Badge": 0x99028, diff --git a/worlds/pokemon_rb/rules.py b/worlds/pokemon_rb/rules.py index 493a58e5..5d117dc5 100644 --- a/worlds/pokemon_rb/rules.py +++ b/worlds/pokemon_rb/rules.py @@ -1,26 +1,45 @@ -from ..generic.Rules import add_item_rule, add_rule +from ..generic.Rules import add_item_rule, add_rule, item_name +from .items import item_groups + 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 and "Trap" not in i.name and - i.name != "Pokedex") + item_rules = { + "Pallet Town - Player's PC": (lambda i: i.player == player and "Badge" not in i.name and "Trap" not in i.name + and i.name != "Pokedex" and "Coins" not in i.name) + } + + if world.prizesanity[player]: + def prize_rule(i): + return i.player != player or i.name in item_groups["Unique"] + item_rules["Celadon Prize Corner - Item Prize 1"] = prize_rule + item_rules["Celadon Prize Corner - Item Prize 2"] = prize_rule + item_rules["Celadon Prize Corner - Item Prize 3"] = prize_rule + + if world.accessibility[player] != "locations": + world.get_location("Cerulean City - Bicycle Shop", player).always_allow = (lambda state, item: + item.name == "Bike Voucher" + and item.player == player) + world.get_location("Fuchsia City - Safari Zone Warden", player).always_allow = (lambda state, item: + item.name == "Gold Teeth" and + item.player == player) access_rules = { - "Pallet Town - Rival's Sister": lambda state: state.has("Oak's Parcel", player), "Pallet Town - Oak's Post-Route-22-Rival Gift": lambda state: state.has("Oak's Parcel", player), "Viridian City - Sleepy Guy": lambda state: state.pokemon_rb_can_cut(player) or state.pokemon_rb_can_surf(player), "Route 2 - Oak's Aide": lambda state: state.pokemon_rb_oaks_aide(state.multiworld.oaks_aide_rt_2[player].value + 5, player), "Pewter City - Museum": lambda state: state.pokemon_rb_can_cut(player), - "Cerulean City - Bicycle Shop": lambda state: state.has("Bike Voucher", player), + "Cerulean City - Bicycle Shop": lambda state: state.has("Bike Voucher", player) + or item_name(state, "Cerulean City - Bicycle Shop", player) == ("Bike Voucher", player), "Lavender Town - Mr. Fuji": lambda state: state.has("Fuji Saved", player), "Vermilion Gym - Lt. Surge 1": lambda state: state.pokemon_rb_can_cut(player or state.pokemon_rb_can_surf(player)), "Vermilion Gym - Lt. Surge 2": lambda state: state.pokemon_rb_can_cut(player or state.pokemon_rb_can_surf(player)), "Route 11 - Oak's Aide": lambda state: state.pokemon_rb_oaks_aide(state.multiworld.oaks_aide_rt_11[player].value + 5, player), "Celadon City - Stranded Man": lambda state: state.pokemon_rb_can_surf(player), - "Silph Co 11F - Silph Co President": lambda state: state.has("Card Key", player), - "Fuchsia City - Safari Zone Warden": lambda state: state.has("Gold Teeth", player), + "Silph Co 11F - Silph Co President (Card Key)": lambda state: state.has("Card Key", player), + "Fuchsia City - Safari Zone Warden": lambda state: state.has("Gold Teeth", player) + or item_name(state, "Fuchsia City - Safari Zone Warden", player) == ("Gold Teeth", player), "Route 12 - Island Item": lambda state: state.pokemon_rb_can_surf(player), "Route 12 - Item Behind Cuttable Tree": lambda state: state.pokemon_rb_can_cut(player), "Route 15 - Oak's Aide": lambda state: state.pokemon_rb_oaks_aide(state.multiworld.oaks_aide_rt_15[player].value + 5, player), @@ -38,6 +57,23 @@ def set_rules(world, player): "Silph Co 6F - Southwest Item (Card Key)": lambda state: state.has("Card Key", player), "Silph Co 7F - East Item (Card Key)": lambda state: state.has("Card Key", player), "Safari Zone Center - Island Item": lambda state: state.pokemon_rb_can_surf(player), + "Celadon Prize Corner - Item Prize 1": lambda state: state.has("Coin Case", player), + "Celadon Prize Corner - Item Prize 2": lambda state: state.has("Coin Case", player), + "Celadon Prize Corner - Item Prize 3": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - West Gambler's Gift (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Center Gambler's Gift (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - East Gambler's Gift (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Hidden Item Northwest By Counter (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Hidden Item Southwest Corner (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Hidden Item Near Rumor Man (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Hidden Item Near Speculating Woman (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Hidden Item Near West Gifting Gambler (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Hidden Item Near Wonderful Time Woman (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Hidden Item Near Failing Gym Information Guy (Coin Case)": lambda state: state.has( "Coin Case", player), + "Celadon Game Corner - Hidden Item Near East Gifting Gambler (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Hidden Item Near Hooked Guy (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Hidden Item at End of Horizontal Machine Row (Coin Case)": lambda state: state.has("Coin Case", player), + "Celadon Game Corner - Hidden Item in Front of Horizontal Machine Row (Coin Case)": lambda state: state.has("Coin Case", player), "Silph Co 11F - Silph Co Liberated": lambda state: state.has("Card Key", player), @@ -89,6 +125,16 @@ def set_rules(world, 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), + "Route 2 - Marcel Trade": lambda state: state.can_reach("Route 24 - Wild Pokemon - 6", "Location", player), + "Underground Tunnel West-East - Spot Trade": lambda state: state.can_reach("Route 24 - Wild Pokemon - 6", "Location", player), + "Route 11 - Terry Trade": lambda state: state.can_reach("Safari Zone Center - Wild Pokemon - 5", "Location", player), + "Route 18 - Marc Trade": lambda state: state.can_reach("Route 23 - Super Rod Pokemon - 1", "Location", player), + "Cinnabar Island - Sailor Trade": lambda state: state.can_reach("Pokemon Mansion 1F - Wild Pokemon - 3", "Location", player), + "Cinnabar Island - Crinkles Trade": lambda state: state.can_reach("Route 12 - Wild Pokemon - 4", "Location", player), + "Cinnabar Island - Doris Trade": lambda state: state.can_reach("Cerulean Cave 1F - Wild Pokemon - 9", "Location", player), + "Vermilion City - Dux Trade": lambda state: state.can_reach("Route 3 - Wild Pokemon - 2", "Location", player), + "Cerulean City - Lola Trade": lambda state: state.can_reach("Route 10 - Super Rod Pokemon - 1", "Location", player), + # Pokédex check "Pallet Town - Oak's Parcel Reward": lambda state: state.has("Oak's Parcel", player), @@ -142,7 +188,7 @@ def set_rules(world, player): "Pokemon Mansion 1F - Hidden Item Block Near Entrance Carpet": lambda state: state.pokemon_rb_can_get_hidden_items(player), "Pokemon Mansion 3F - Hidden Item Behind Burglar": lambda state: state.pokemon_rb_can_get_hidden_items(player), - "Route 23 - Hidden Item Rocks Before Final Guard": lambda state: state.pokemon_rb_can_get_hidden_items( + "Route 23 - Hidden Item Rocks Before Victory Road": lambda state: state.pokemon_rb_can_get_hidden_items( player), "Route 23 - Hidden Item East Bush After Water": lambda state: state.pokemon_rb_can_get_hidden_items( player), @@ -178,3 +224,11 @@ def set_rules(world, player): for loc in world.get_locations(player): if loc.name in access_rules: add_rule(loc, access_rules[loc.name]) + if loc.name in item_rules: + add_item_rule(loc, item_rules[loc.name]) + if loc.name.startswith("Pokedex"): + mon = loc.name.split(" - ")[1] + add_rule(loc, lambda state, i=mon: (state.has("Pokedex", player) or not + state.multiworld.require_pokedex[player]) and (state.has(i, player) + or state.has(f"Static {i}", player))) + diff --git a/worlds/pokemon_rb/text.py b/worlds/pokemon_rb/text.py index e15623d4..feb54e65 100644 --- a/worlds/pokemon_rb/text.py +++ b/worlds/pokemon_rb/text.py @@ -1,5 +1,9 @@ special_chars = { "PKMN": 0x4A, + "LINE": 0x4F, + "CONT": 0x55, + "DONE": 0x57, + "PROMPT": 0x58, "'d": 0xBB, "'l": 0xBC, "'t": 0xBE, @@ -105,7 +109,7 @@ char_map = { "9": 0xFF, } -unsafe_chars = ["@", "#", "PKMN"] +unsafe_chars = ["@", "#", "PKMN", "LINE", "DONE", "CONT", "PROMPT"] def encode_text(text: str, length: int=0, whitespace=False, force=False, safety=False): diff --git a/worlds/smz3/__init__.py b/worlds/smz3/__init__.py index 93ac7fbd..5e73f5db 100644 --- a/worlds/smz3/__init__.py +++ b/worlds/smz3/__init__.py @@ -509,7 +509,7 @@ class SMZ3World(World): return self.smz3DungeonItems else: return [] - + def post_fill(self): # some small or big keys (those always_allow) can be unreachable in-game # while logic still collects some of them (probably to simulate the player collecting pot keys in the logic), some others don't @@ -524,7 +524,7 @@ class SMZ3World(World): loc.item.classification = ItemClassification.filler loc.item.item.Progression = False loc.item.location.event = False - self.unreachable.append(loc) + self.unreachable.append(loc) def get_filler_item_name(self) -> str: return self.multiworld.random.choice(self.junkItemsNames)