From 90417e002292b3982f8dff68fae4270bdbd9db5c Mon Sep 17 00:00:00 2001 From: qwint Date: Sun, 26 Jan 2025 07:06:27 -0500 Subject: [PATCH 001/227] CommonClient: Expand on make_gui docstring (#4449) * adds docstring to make_gui describing what things you might want to change without dealing with kivy/kvui directly (there are better places to document those) * Update CommonClient.py Co-authored-by: Doug Hoskisson * Update CommonClient.py Co-authored-by: Doug Hoskisson --------- Co-authored-by: Doug Hoskisson --- CommonClient.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CommonClient.py b/CommonClient.py index f6b2623f8c..996ba33005 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -709,8 +709,16 @@ class CommonContext: logger.exception(msg, exc_info=exc_info, extra={'compact_gui': True}) self._messagebox_connection_loss = self.gui_error(msg, exc_info[1]) - def make_gui(self) -> typing.Type["kvui.GameManager"]: - """To return the Kivy App class needed for run_gui so it can be overridden before being built""" + def make_gui(self) -> "type[kvui.GameManager]": + """ + To return the Kivy `App` class needed for `run_gui` so it can be overridden before being built + + Common changes are changing `base_title` to update the window title of the client and + updating `logging_pairs` to automatically make new tabs that can be filled with their respective logger. + + ex. `logging_pairs.append(("Foo", "Bar"))` + will add a "Bar" tab which follows the logger returned from `logging.getLogger("Foo")` + """ from kvui import GameManager class TextManager(GameManager): From 8622cb62040e1da2d1d3c66cb1563f76bddb57f9 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sun, 26 Jan 2025 22:14:39 +0100 Subject: [PATCH 002/227] Factorio: Inventory Spill Traps (#4457) --- worlds/factorio/Options.py | 7 ++++ worlds/factorio/__init__.py | 22 +++++------ worlds/factorio/data/mod/lib.lua | 37 +++++++++++++++++++ worlds/factorio/data/mod_template/control.lua | 5 +++ 4 files changed, 59 insertions(+), 12 deletions(-) diff --git a/worlds/factorio/Options.py b/worlds/factorio/Options.py index 0fa75e1b8b..4848cd9926 100644 --- a/worlds/factorio/Options.py +++ b/worlds/factorio/Options.py @@ -304,6 +304,11 @@ class EvolutionTrapIncrease(Range): range_end = 100 +class InventorySpillTrapCount(TrapCount): + """Trap items that when received trigger dropping your main inventory and trash inventory onto the ground.""" + display_name = "Inventory Spill Traps" + + class FactorioWorldGen(OptionDict): """World Generation settings. Overview of options at https://wiki.factorio.com/Map_generator, with in-depth documentation at https://lua-api.factorio.com/latest/Concepts.html#MapGenSettings""" @@ -484,6 +489,7 @@ class FactorioOptions(PerGameCommonOptions): artillery_traps: ArtilleryTrapCount atomic_rocket_traps: AtomicRocketTrapCount atomic_cliff_remover_traps: AtomicCliffRemoverTrapCount + inventory_spill_traps: InventorySpillTrapCount attack_traps: AttackTrapCount evolution_traps: EvolutionTrapCount evolution_trap_increase: EvolutionTrapIncrease @@ -518,6 +524,7 @@ option_groups: list[OptionGroup] = [ ArtilleryTrapCount, AtomicRocketTrapCount, AtomicCliffRemoverTrapCount, + InventorySpillTrapCount, ], start_collapsed=True ), diff --git a/worlds/factorio/__init__.py b/worlds/factorio/__init__.py index a2bc518ae3..ca9f12f1b2 100644 --- a/worlds/factorio/__init__.py +++ b/worlds/factorio/__init__.py @@ -78,6 +78,7 @@ all_items["Cluster Grenade Trap"] = factorio_base_id - 5 all_items["Artillery Trap"] = factorio_base_id - 6 all_items["Atomic Rocket Trap"] = factorio_base_id - 7 all_items["Atomic Cliff Remover Trap"] = factorio_base_id - 8 +all_items["Inventory Spill Trap"] = factorio_base_id - 9 class Factorio(World): @@ -112,6 +113,8 @@ class Factorio(World): science_locations: typing.List[FactorioScienceLocation] removed_technologies: typing.Set[str] settings: typing.ClassVar[FactorioSettings] + trap_names: tuple[str] = ("Evolution", "Attack", "Teleport", "Grenade", "Cluster Grenade", "Artillery", + "Atomic Rocket", "Atomic Cliff Remover", "Inventory Spill") def __init__(self, world, player: int): super(Factorio, self).__init__(world, player) @@ -136,15 +139,11 @@ class Factorio(World): random = self.random nauvis = Region("Nauvis", player, self.multiworld) - location_count = len(base_tech_table) - len(useless_technologies) - self.skip_silo + \ - self.options.evolution_traps + \ - self.options.attack_traps + \ - self.options.teleport_traps + \ - self.options.grenade_traps + \ - self.options.cluster_grenade_traps + \ - self.options.atomic_rocket_traps + \ - self.options.atomic_cliff_remover_traps + \ - self.options.artillery_traps + location_count = len(base_tech_table) - len(useless_technologies) - self.skip_silo + + for name in self.trap_names: + name = name.replace(" ", "_").lower()+"_traps" + location_count += getattr(self.options, name) location_pool = [] @@ -196,9 +195,8 @@ class Factorio(World): def create_items(self) -> None: self.custom_technologies = self.set_custom_technologies() self.set_custom_recipes() - traps = ("Evolution", "Attack", "Teleport", "Grenade", "Cluster Grenade", "Artillery", "Atomic Rocket", - "Atomic Cliff Remover") - for trap_name in traps: + + for trap_name in self.trap_names: self.multiworld.itempool.extend(self.create_item(f"{trap_name} Trap") for _ in range(getattr(self.options, f"{trap_name.lower().replace(' ', '_')}_traps"))) diff --git a/worlds/factorio/data/mod/lib.lua b/worlds/factorio/data/mod/lib.lua index 517a54e3d6..edec5b7acd 100644 --- a/worlds/factorio/data/mod/lib.lua +++ b/worlds/factorio/data/mod/lib.lua @@ -48,3 +48,40 @@ function fire_entity_at_entities(entity_name, entities, speed) target=target, speed=speed} end end + +function spill_character_inventory(character) + if not (character and character.valid) then + return false + end + + -- grab attrs once pre-loop + local position = character.position + local surface = character.surface + + local inventories_to_spill = { + defines.inventory.character_main, -- Main inventory + defines.inventory.character_trash, -- Logistic trash slots + } + + for _, inventory_type in pairs(inventories_to_spill) do + local inventory = character.get_inventory(inventory_type) + if inventory and inventory.valid then + -- Spill each item stack onto the ground + for i = 1, #inventory do + local stack = inventory[i] + if stack and stack.valid_for_read then + local spilled_items = surface.spill_item_stack{ + position = position, + stack = stack, + enable_looted = false, -- do not mark for auto-pickup + force = nil, -- do not mark for auto-deconstruction + allow_belts = true, -- do mark for putting it onto belts + } + if #spilled_items > 0 then + stack.clear() -- only delete if spilled successfully + end + end + end + end + end +end diff --git a/worlds/factorio/data/mod_template/control.lua b/worlds/factorio/data/mod_template/control.lua index 87669beaf1..07fd4c04af 100644 --- a/worlds/factorio/data/mod_template/control.lua +++ b/worlds/factorio/data/mod_template/control.lua @@ -750,6 +750,11 @@ end, fire_entity_at_entities("atomic-rocket", {cliffs[math.random(#cliffs)]}, 0.1) end end, +["Inventory Spill Trap"] = function () + for _, player in ipairs(game.forces["player"].players) do + spill_character_inventory(player.character) + end +end, } commands.add_command("ap-get-technology", "Grant a technology, used by the Archipelago Client.", function(call) From 57a571cc110a0df310f0debc2a6fbbb9ea9304ca Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 26 Jan 2025 18:52:02 -0600 Subject: [PATCH 003/227] KDL3: Fix world access on non-strict open world (#4543) * Update rules.py * lambda capture --- worlds/kdl3/rules.py | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/worlds/kdl3/rules.py b/worlds/kdl3/rules.py index a08e99257e..828740859e 100644 --- a/worlds/kdl3/rules.py +++ b/worlds/kdl3/rules.py @@ -206,19 +206,19 @@ def set_rules(world: "KDL3World") -> None: lambda state: can_reach_needle(state, world.player)) set_rule(world.multiworld.get_location(location_name.sand_canyon_5_u2, world.player), lambda state: can_reach_ice(state, world.player) and - (can_reach_rick(state, world.player) or can_reach_coo(state, world.player) - or can_reach_chuchu(state, world.player) or can_reach_pitch(state, world.player) - or can_reach_nago(state, world.player))) + (can_reach_rick(state, world.player) or can_reach_coo(state, world.player) + or can_reach_chuchu(state, world.player) or can_reach_pitch(state, world.player) + or can_reach_nago(state, world.player))) set_rule(world.multiworld.get_location(location_name.sand_canyon_5_u3, world.player), lambda state: can_reach_ice(state, world.player) and - (can_reach_rick(state, world.player) or can_reach_coo(state, world.player) - or can_reach_chuchu(state, world.player) or can_reach_pitch(state, world.player) - or can_reach_nago(state, world.player))) + (can_reach_rick(state, world.player) or can_reach_coo(state, world.player) + or can_reach_chuchu(state, world.player) or can_reach_pitch(state, world.player) + or can_reach_nago(state, world.player))) set_rule(world.multiworld.get_location(location_name.sand_canyon_5_u4, world.player), lambda state: can_reach_ice(state, world.player) and - (can_reach_rick(state, world.player) or can_reach_coo(state, world.player) - or can_reach_chuchu(state, world.player) or can_reach_pitch(state, world.player) - or can_reach_nago(state, world.player))) + (can_reach_rick(state, world.player) or can_reach_coo(state, world.player) + or can_reach_chuchu(state, world.player) or can_reach_pitch(state, world.player) + or can_reach_nago(state, world.player))) set_rule(world.multiworld.get_location(location_name.cloudy_park_6_u1, world.player), lambda state: can_reach_cutter(state, world.player)) @@ -248,9 +248,9 @@ def set_rules(world: "KDL3World") -> None: for i in range(12, 18): set_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), lambda state: can_reach_ice(state, world.player) and - (can_reach_rick(state, world.player) or can_reach_coo(state, world.player) - or can_reach_chuchu(state, world.player) or can_reach_pitch(state, world.player) - or can_reach_nago(state, world.player))) + (can_reach_rick(state, world.player) or can_reach_coo(state, world.player) + or can_reach_chuchu(state, world.player) or can_reach_pitch(state, world.player) + or can_reach_nago(state, world.player))) for i in range(21, 23): set_rule(world.multiworld.get_location(f"Sand Canyon 5 - Star {i}", world.player), lambda state: can_reach_chuchu(state, world.player)) @@ -307,7 +307,7 @@ def set_rules(world: "KDL3World") -> None: lambda state: can_reach_coo(state, world.player) and can_reach_burning(state, world.player)) set_rule(world.multiworld.get_location(animal_friend_spawns.iceberg_4_a3, world.player), lambda state: can_reach_chuchu(state, world.player) and can_reach_coo(state, world.player) - and can_reach_burning(state, world.player)) + and can_reach_burning(state, world.player)) for boss_flag, purification, i in zip(["Level 1 Boss - Purified", "Level 2 Boss - Purified", "Level 3 Boss - Purified", "Level 4 Boss - Purified", @@ -329,6 +329,14 @@ def set_rules(world: "KDL3World") -> None: world.options.ow_boss_requirement.value, world.player_levels))) + if world.options.open_world: + for boss_flag, level in zip(["Level 1 Boss - Defeated", "Level 2 Boss - Defeated", "Level 3 Boss - Defeated", + "Level 4 Boss - Defeated", "Level 5 Boss - Defeated"], + location_name.level_names.keys()): + set_rule(world.get_location(boss_flag), + lambda state, lvl=level: state.has(f"{lvl} - Stage Completion", world.player, + world.options.ow_boss_requirement.value)) + set_rule(world.multiworld.get_entrance("To Level 6", world.player), lambda state: state.has("Heart Star", world.player, world.required_heart_stars)) From c43233120a828b4c89ee6c8ce1352c396fbe7266 Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Mon, 27 Jan 2025 07:24:26 -0800 Subject: [PATCH 004/227] Pokemon Emerald: Clarify death link and start inventory descriptions (#4517) --- worlds/pokemon_emerald/__init__.py | 3 ++- worlds/pokemon_emerald/options.py | 27 +++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/worlds/pokemon_emerald/__init__.py b/worlds/pokemon_emerald/__init__.py index 7b62b9ef73..50d6279179 100644 --- a/worlds/pokemon_emerald/__init__.py +++ b/worlds/pokemon_emerald/__init__.py @@ -22,7 +22,7 @@ from .locations import (PokemonEmeraldLocation, create_location_label_to_id_map, set_free_fly, set_legendary_cave_entrances) from .opponents import randomize_opponent_parties from .options import (Goal, DarkCavesRequireFlash, HmRequirements, ItemPoolType, PokemonEmeraldOptions, - RandomizeWildPokemon, RandomizeBadges, RandomizeHms, NormanRequirement) + RandomizeWildPokemon, RandomizeBadges, RandomizeHms, NormanRequirement, OPTION_GROUPS) from .pokemon import (get_random_move, get_species_id_by_label, randomize_abilities, randomize_learnsets, randomize_legendary_encounters, randomize_misc_pokemon, randomize_starters, randomize_tm_hm_compatibility,randomize_types, randomize_wild_encounters) @@ -63,6 +63,7 @@ class PokemonEmeraldWebWorld(WebWorld): ) tutorials = [setup_en, setup_es, setup_sv] + option_groups = OPTION_GROUPS class PokemonEmeraldSettings(settings.Group): diff --git a/worlds/pokemon_emerald/options.py b/worlds/pokemon_emerald/options.py index cf0c692d06..32644d52e0 100644 --- a/worlds/pokemon_emerald/options.py +++ b/worlds/pokemon_emerald/options.py @@ -4,7 +4,7 @@ Option definitions for Pokemon Emerald from dataclasses import dataclass from Options import (Choice, DeathLink, DefaultOnToggle, OptionSet, NamedRange, Range, Toggle, FreeText, - PerGameCommonOptions) + PerGameCommonOptions, OptionGroup, StartInventory) from .data import data @@ -803,6 +803,10 @@ class RandomizeFanfares(Toggle): display_name = "Randomize Fanfares" +class PokemonEmeraldDeathLink(DeathLink): + __doc__ = DeathLink.__doc__ + "\n\n In Pokemon Emerald, whiting out sends a death and receiving a death causes you to white out." + + class WonderTrading(DefaultOnToggle): """ Allows participation in wonder trading with other players in your current multiworld. Speak with the center receptionist on the second floor of any pokecenter. @@ -828,6 +832,14 @@ class EasterEgg(FreeText): default = "EMERALD SECRET" +class PokemonEmeraldStartInventory(StartInventory): + """ + Start with these items. + + They will be in your PC, which you can access from your home or a pokemon center. + """ + + @dataclass class PokemonEmeraldOptions(PerGameCommonOptions): goal: Goal @@ -904,7 +916,18 @@ class PokemonEmeraldOptions(PerGameCommonOptions): music: RandomizeMusic fanfares: RandomizeFanfares - death_link: DeathLink + death_link: PokemonEmeraldDeathLink enable_wonder_trading: WonderTrading easter_egg: EasterEgg + + start_inventory: PokemonEmeraldStartInventory + + +OPTION_GROUPS = [ + OptionGroup( + "Item & Location Options", [ + PokemonEmeraldStartInventory, + ], True, + ), +] From b570aa2ec6c811db280a835827aa3983f145a1a6 Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Mon, 27 Jan 2025 07:25:31 -0800 Subject: [PATCH 005/227] Pokemon Emerald: Clean up free fly blacklist (#4552) --- worlds/pokemon_emerald/locations.py | 10 +++++++++- worlds/pokemon_emerald/options.py | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/worlds/pokemon_emerald/locations.py b/worlds/pokemon_emerald/locations.py index 2bae8e00ed..49ce147041 100644 --- a/worlds/pokemon_emerald/locations.py +++ b/worlds/pokemon_emerald/locations.py @@ -34,6 +34,11 @@ VISITED_EVENT_NAME_TO_ID = { } BLACKLIST_OPTION_TO_VISITED_EVENT = { + "Littleroot Town": "EVENT_VISITED_LITTLEROOT_TOWN", + "Oldale Town": "EVENT_VISITED_OLDALE_TOWN", + "Petalburg City": "EVENT_VISITED_PETALBURG_CITY", + "Rustboro City": "EVENT_VISITED_RUSTBORO_CITY", + "Dewford Town": "EVENT_VISITED_DEWFORD_TOWN", "Slateport City": "EVENT_VISITED_SLATEPORT_CITY", "Mauville City": "EVENT_VISITED_MAUVILLE_CITY", "Verdanturf Town": "EVENT_VISITED_VERDANTURF_TOWN", @@ -46,6 +51,9 @@ BLACKLIST_OPTION_TO_VISITED_EVENT = { "Ever Grande City": "EVENT_VISITED_EVER_GRANDE_CITY", } +VISITED_EVENTS = frozenset(BLACKLIST_OPTION_TO_VISITED_EVENT.values()) + + class PokemonEmeraldLocation(Location): game: str = "Pokemon Emerald" item_address: Optional[int] @@ -142,7 +150,7 @@ def set_free_fly(world: "PokemonEmeraldWorld") -> None: fly_location_name = "EVENT_VISITED_LITTLEROOT_TOWN" if world.options.free_fly_location: blacklisted_locations = set(BLACKLIST_OPTION_TO_VISITED_EVENT[city] for city in world.options.free_fly_blacklist.value) - free_fly_locations = sorted(set(BLACKLIST_OPTION_TO_VISITED_EVENT.values()) - blacklisted_locations) + free_fly_locations = sorted(VISITED_EVENTS - blacklisted_locations) if free_fly_locations: fly_location_name = world.random.choice(free_fly_locations) diff --git a/worlds/pokemon_emerald/options.py b/worlds/pokemon_emerald/options.py index 32644d52e0..29929bd672 100644 --- a/worlds/pokemon_emerald/options.py +++ b/worlds/pokemon_emerald/options.py @@ -725,13 +725,20 @@ class FreeFlyLocation(Toggle): """ display_name = "Free Fly Location" + class FreeFlyBlacklist(OptionSet): """ Disables specific locations as valid free fly locations. + Has no effect if Free Fly Location is disabled. """ display_name = "Free Fly Blacklist" valid_keys = [ + "Littleroot Town", + "Oldale Town", + "Petalburg City", + "Rustboro City", + "Dewford Town", "Slateport City", "Mauville City", "Verdanturf Town", @@ -743,6 +750,14 @@ class FreeFlyBlacklist(OptionSet): "Sootopolis City", "Ever Grande City", ] + default = [ + "Littleroot Town", + "Oldale Town", + "Petalburg City", + "Rustboro City", + "Dewford Town", + ] + class HmRequirements(Choice): """ From 43874b1d28fa8d5a5bdc96d4408e303f57763ddd Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Mon, 27 Jan 2025 10:27:43 -0500 Subject: [PATCH 006/227] Noita: Add clarification to check option descriptions (#4553) --- worlds/noita/options.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/worlds/noita/options.py b/worlds/noita/options.py index 0fdd62365a..8a973a0d72 100644 --- a/worlds/noita/options.py +++ b/worlds/noita/options.py @@ -20,6 +20,8 @@ class PathOption(Choice): class HiddenChests(Range): """ Number of hidden chest checks added to the applicable biomes. + Note: The number of hidden chests that spawn per run in each biome varies. + You are expected do multiple runs to get all of your checks. """ display_name = "Hidden Chests per Biome" range_start = 0 @@ -30,6 +32,8 @@ class HiddenChests(Range): class PedestalChecks(Range): """ Number of checks that will spawn on pedestals in the applicable biomes. + Note: The number of pedestals that spawn per run in each biome varies. + You are expected do multiple runs to get all of your checks. """ display_name = "Pedestal Checks per Biome" range_start = 0 From 41055cd963c183244e262344e03d6ae6369fc52a Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Mon, 27 Jan 2025 08:01:18 -0800 Subject: [PATCH 007/227] Pokemon Emerald: Update changelog (#4551) --- worlds/pokemon_emerald/CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/worlds/pokemon_emerald/CHANGELOG.md b/worlds/pokemon_emerald/CHANGELOG.md index 0dd874b250..8d33d70900 100644 --- a/worlds/pokemon_emerald/CHANGELOG.md +++ b/worlds/pokemon_emerald/CHANGELOG.md @@ -1,3 +1,16 @@ +# 2.4.0 + +### Features + +- New option `free_fly_blacklist` limits which cities can show up as a free fly location. +- Spoiler log and hint text for maps where a species can be found now use human-friendly labels. +- Added many item and location groups based on item type, location type, and location geography. + +### Fixes + +- Now excludes the location "Navel Rock Top - Hidden Item Sacred Ash" if your goal is Champion and you didn't randomize +event tickets. + # 2.3.0 ### Features From 8c5592e40684af4b9ac855e1a3b4b6e69622bffb Mon Sep 17 00:00:00 2001 From: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Date: Mon, 27 Jan 2025 11:06:10 -0500 Subject: [PATCH 008/227] KH2: Fix determinism by using tuples instead of sets (#4548) --- worlds/kh2/Regions.py | 176 +++++++++++++++++++++--------------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/worlds/kh2/Regions.py b/worlds/kh2/Regions.py index e6e8a7b2f6..72b3c95b09 100644 --- a/worlds/kh2/Regions.py +++ b/worlds/kh2/Regions.py @@ -1032,99 +1032,99 @@ def connect_regions(self): multiworld = self.multiworld player = self.player # connecting every first visit to the GoA - KH2RegionConnections: typing.Dict[str, typing.Set[str]] = { - "Menu": {RegionName.GoA}, - RegionName.GoA: {RegionName.Sp, RegionName.Pr, RegionName.Tt, RegionName.Oc, RegionName.Ht, + KH2RegionConnections: typing.Dict[str, typing.Tuple[str]] = { + "Menu": (RegionName.GoA,), + RegionName.GoA: (RegionName.Sp, RegionName.Pr, RegionName.Tt, RegionName.Oc, RegionName.Ht, RegionName.LoD, RegionName.Twtnw, RegionName.Bc, RegionName.Ag, RegionName.Pl, RegionName.Hb, RegionName.Dc, RegionName.Stt, RegionName.Ha1, RegionName.Keyblade, RegionName.LevelsVS1, RegionName.Valor, RegionName.Wisdom, RegionName.Limit, RegionName.Master, - RegionName.Final, RegionName.Summon, RegionName.AtlanticaSongOne}, - RegionName.LoD: {RegionName.ShanYu}, - RegionName.ShanYu: {RegionName.LoD2}, - RegionName.LoD2: {RegionName.AnsemRiku}, - RegionName.AnsemRiku: {RegionName.StormRider}, - RegionName.StormRider: {RegionName.DataXigbar}, - RegionName.Ag: {RegionName.TwinLords}, - RegionName.TwinLords: {RegionName.Ag2}, - RegionName.Ag2: {RegionName.GenieJafar}, - RegionName.GenieJafar: {RegionName.DataLexaeus}, - RegionName.Dc: {RegionName.Tr}, - RegionName.Tr: {RegionName.OldPete}, - RegionName.OldPete: {RegionName.FuturePete}, - RegionName.FuturePete: {RegionName.Terra, RegionName.DataMarluxia}, - RegionName.Ha1: {RegionName.Ha2}, - RegionName.Ha2: {RegionName.Ha3}, - RegionName.Ha3: {RegionName.Ha4}, - RegionName.Ha4: {RegionName.Ha5}, - RegionName.Ha5: {RegionName.Ha6}, - RegionName.Pr: {RegionName.Barbosa}, - RegionName.Barbosa: {RegionName.Pr2}, - RegionName.Pr2: {RegionName.GrimReaper1}, - RegionName.GrimReaper1: {RegionName.GrimReaper2}, - RegionName.GrimReaper2: {RegionName.DataLuxord}, - RegionName.Oc: {RegionName.Cerberus}, - RegionName.Cerberus: {RegionName.OlympusPete}, - RegionName.OlympusPete: {RegionName.Hydra}, - RegionName.Hydra: {RegionName.OcPainAndPanicCup, RegionName.OcCerberusCup, RegionName.Oc2}, - RegionName.Oc2: {RegionName.Hades}, - RegionName.Hades: {RegionName.Oc2TitanCup, RegionName.Oc2GofCup, RegionName.DataZexion}, - RegionName.Oc2GofCup: {RegionName.HadesCups}, - RegionName.Bc: {RegionName.Thresholder}, - RegionName.Thresholder: {RegionName.Beast}, - RegionName.Beast: {RegionName.DarkThorn}, - RegionName.DarkThorn: {RegionName.Bc2}, - RegionName.Bc2: {RegionName.Xaldin}, - RegionName.Xaldin: {RegionName.DataXaldin}, - RegionName.Sp: {RegionName.HostileProgram}, - RegionName.HostileProgram: {RegionName.Sp2}, - RegionName.Sp2: {RegionName.Mcp}, - RegionName.Mcp: {RegionName.DataLarxene}, - RegionName.Ht: {RegionName.PrisonKeeper}, - RegionName.PrisonKeeper: {RegionName.OogieBoogie}, - RegionName.OogieBoogie: {RegionName.Ht2}, - RegionName.Ht2: {RegionName.Experiment}, - RegionName.Experiment: {RegionName.DataVexen}, - RegionName.Hb: {RegionName.Hb2}, - RegionName.Hb2: {RegionName.CoR, RegionName.HBDemyx}, - RegionName.HBDemyx: {RegionName.ThousandHeartless}, - RegionName.ThousandHeartless: {RegionName.Mushroom13, RegionName.DataDemyx, RegionName.Sephi}, - RegionName.CoR: {RegionName.CorFirstFight}, - RegionName.CorFirstFight: {RegionName.CorSecondFight}, - RegionName.CorSecondFight: {RegionName.Transport}, - RegionName.Pl: {RegionName.Scar}, - RegionName.Scar: {RegionName.Pl2}, - RegionName.Pl2: {RegionName.GroundShaker}, - RegionName.GroundShaker: {RegionName.DataSaix}, - RegionName.Stt: {RegionName.TwilightThorn}, - RegionName.TwilightThorn: {RegionName.Axel1}, - RegionName.Axel1: {RegionName.Axel2}, - RegionName.Axel2: {RegionName.DataRoxas}, - RegionName.Tt: {RegionName.Tt2}, - RegionName.Tt2: {RegionName.Tt3}, - RegionName.Tt3: {RegionName.DataAxel}, - RegionName.Twtnw: {RegionName.Roxas}, - RegionName.Roxas: {RegionName.Xigbar}, - RegionName.Xigbar: {RegionName.Luxord}, - RegionName.Luxord: {RegionName.Saix}, - RegionName.Saix: {RegionName.Twtnw2}, - RegionName.Twtnw2: {RegionName.Xemnas}, - RegionName.Xemnas: {RegionName.ArmoredXemnas, RegionName.DataXemnas}, - RegionName.ArmoredXemnas: {RegionName.ArmoredXemnas2}, - RegionName.ArmoredXemnas2: {RegionName.FinalXemnas}, - RegionName.LevelsVS1: {RegionName.LevelsVS3}, - RegionName.LevelsVS3: {RegionName.LevelsVS6}, - RegionName.LevelsVS6: {RegionName.LevelsVS9}, - RegionName.LevelsVS9: {RegionName.LevelsVS12}, - RegionName.LevelsVS12: {RegionName.LevelsVS15}, - RegionName.LevelsVS15: {RegionName.LevelsVS18}, - RegionName.LevelsVS18: {RegionName.LevelsVS21}, - RegionName.LevelsVS21: {RegionName.LevelsVS24}, - RegionName.LevelsVS24: {RegionName.LevelsVS26}, - RegionName.AtlanticaSongOne: {RegionName.AtlanticaSongTwo}, - RegionName.AtlanticaSongTwo: {RegionName.AtlanticaSongThree}, - RegionName.AtlanticaSongThree: {RegionName.AtlanticaSongFour}, + RegionName.Final, RegionName.Summon, RegionName.AtlanticaSongOne), + RegionName.LoD: (RegionName.ShanYu,), + RegionName.ShanYu: (RegionName.LoD2,), + RegionName.LoD2: (RegionName.AnsemRiku,), + RegionName.AnsemRiku: (RegionName.StormRider,), + RegionName.StormRider: (RegionName.DataXigbar,), + RegionName.Ag: (RegionName.TwinLords,), + RegionName.TwinLords: (RegionName.Ag2,), + RegionName.Ag2: (RegionName.GenieJafar,), + RegionName.GenieJafar: (RegionName.DataLexaeus,), + RegionName.Dc: (RegionName.Tr,), + RegionName.Tr: (RegionName.OldPete,), + RegionName.OldPete: (RegionName.FuturePete,), + RegionName.FuturePete: (RegionName.Terra, RegionName.DataMarluxia), + RegionName.Ha1: (RegionName.Ha2,), + RegionName.Ha2: (RegionName.Ha3,), + RegionName.Ha3: (RegionName.Ha4,), + RegionName.Ha4: (RegionName.Ha5,), + RegionName.Ha5: (RegionName.Ha6,), + RegionName.Pr: (RegionName.Barbosa,), + RegionName.Barbosa: (RegionName.Pr2,), + RegionName.Pr2: (RegionName.GrimReaper1,), + RegionName.GrimReaper1: (RegionName.GrimReaper2,), + RegionName.GrimReaper2: (RegionName.DataLuxord,), + RegionName.Oc: (RegionName.Cerberus,), + RegionName.Cerberus: (RegionName.OlympusPete,), + RegionName.OlympusPete: (RegionName.Hydra,), + RegionName.Hydra: (RegionName.OcPainAndPanicCup, RegionName.OcCerberusCup, RegionName.Oc2), + RegionName.Oc2: (RegionName.Hades,), + RegionName.Hades: (RegionName.Oc2TitanCup, RegionName.Oc2GofCup, RegionName.DataZexion), + RegionName.Oc2GofCup: (RegionName.HadesCups,), + RegionName.Bc: (RegionName.Thresholder,), + RegionName.Thresholder: (RegionName.Beast,), + RegionName.Beast: (RegionName.DarkThorn,), + RegionName.DarkThorn: (RegionName.Bc2,), + RegionName.Bc2: (RegionName.Xaldin,), + RegionName.Xaldin: (RegionName.DataXaldin,), + RegionName.Sp: (RegionName.HostileProgram,), + RegionName.HostileProgram: (RegionName.Sp2,), + RegionName.Sp2: (RegionName.Mcp,), + RegionName.Mcp: (RegionName.DataLarxene,), + RegionName.Ht: (RegionName.PrisonKeeper,), + RegionName.PrisonKeeper: (RegionName.OogieBoogie,), + RegionName.OogieBoogie: (RegionName.Ht2,), + RegionName.Ht2: (RegionName.Experiment,), + RegionName.Experiment: (RegionName.DataVexen,), + RegionName.Hb: (RegionName.Hb2,), + RegionName.Hb2: (RegionName.CoR, RegionName.HBDemyx), + RegionName.HBDemyx: (RegionName.ThousandHeartless,), + RegionName.ThousandHeartless: (RegionName.Mushroom13, RegionName.DataDemyx, RegionName.Sephi), + RegionName.CoR: (RegionName.CorFirstFight,), + RegionName.CorFirstFight: (RegionName.CorSecondFight,), + RegionName.CorSecondFight: (RegionName.Transport,), + RegionName.Pl: (RegionName.Scar,), + RegionName.Scar: (RegionName.Pl2,), + RegionName.Pl2: (RegionName.GroundShaker,), + RegionName.GroundShaker: (RegionName.DataSaix,), + RegionName.Stt: (RegionName.TwilightThorn,), + RegionName.TwilightThorn: (RegionName.Axel1,), + RegionName.Axel1: (RegionName.Axel2,), + RegionName.Axel2: (RegionName.DataRoxas,), + RegionName.Tt: (RegionName.Tt2,), + RegionName.Tt2: (RegionName.Tt3,), + RegionName.Tt3: (RegionName.DataAxel,), + RegionName.Twtnw: (RegionName.Roxas,), + RegionName.Roxas: (RegionName.Xigbar,), + RegionName.Xigbar: (RegionName.Luxord,), + RegionName.Luxord: (RegionName.Saix,), + RegionName.Saix: (RegionName.Twtnw2,), + RegionName.Twtnw2: (RegionName.Xemnas,), + RegionName.Xemnas: (RegionName.ArmoredXemnas, RegionName.DataXemnas), + RegionName.ArmoredXemnas: (RegionName.ArmoredXemnas2,), + RegionName.ArmoredXemnas2: (RegionName.FinalXemnas,), + RegionName.LevelsVS1: (RegionName.LevelsVS3,), + RegionName.LevelsVS3: (RegionName.LevelsVS6,), + RegionName.LevelsVS6: (RegionName.LevelsVS9,), + RegionName.LevelsVS9: (RegionName.LevelsVS12,), + RegionName.LevelsVS12: (RegionName.LevelsVS15,), + RegionName.LevelsVS15: (RegionName.LevelsVS18,), + RegionName.LevelsVS18: (RegionName.LevelsVS21,), + RegionName.LevelsVS21: (RegionName.LevelsVS24,), + RegionName.LevelsVS24: (RegionName.LevelsVS26,), + RegionName.AtlanticaSongOne: (RegionName.AtlanticaSongTwo,), + RegionName.AtlanticaSongTwo: (RegionName.AtlanticaSongThree,), + RegionName.AtlanticaSongThree: (RegionName.AtlanticaSongFour,), } for source, target in KH2RegionConnections.items(): From a53bcb4697f1a077075cc603ad4588a693c3b23d Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 27 Jan 2025 23:13:10 +0100 Subject: [PATCH 009/227] KH2: Use int(..., 0) in Client #4562 --- worlds/kh2/Client.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/worlds/kh2/Client.py b/worlds/kh2/Client.py index 0254d46e93..a21c8c7c55 100644 --- a/worlds/kh2/Client.py +++ b/worlds/kh2/Client.py @@ -836,12 +836,12 @@ class KH2Context(CommonContext): if self.mem_json: for key in self.mem_json.keys(): - if self.kh2_read_string(eval(self.mem_json[key]["GameVersionCheck"]), 4) == "KH2J": - self.Now = eval(self.mem_json[key]["Now"]) - self.Save=eval(self.mem_json[key]["Save"]) - self.Slot1 = eval(self.mem_json[key]["Slot1"]) - self.Journal = eval(self.mem_json[key]["Journal"]) - self.Shop = eval(self.mem_json[key]["Shop"]) + if self.kh2_read_string(int(self.mem_json[key]["GameVersionCheck"], 0), 4) == "KH2J": + self.Now = int(self.mem_json[key]["Now"], 0) + self.Save = int(self.mem_json[key]["Save"], 0) + self.Slot1 = int(self.mem_json[key]["Slot1"], 0) + self.Journal = int(self.mem_json[key]["Journal"], 0) + self.Shop = int(self.mem_json[key]["Shop"], 0) self.kh2_game_version = key if self.kh2_game_version is not None: From 9466d5274e5759d0081f02e0aad9829dd1f1dbd3 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:45:28 -0600 Subject: [PATCH 010/227] MM2: fix plando and weakness special cases (#4561) --- worlds/mm2/options.py | 2 +- worlds/mm2/rules.py | 61 ++++++++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/worlds/mm2/options.py b/worlds/mm2/options.py index 2d90395cac..f333348982 100644 --- a/worlds/mm2/options.py +++ b/worlds/mm2/options.py @@ -175,7 +175,7 @@ class WeaknessPlando(OptionDict): display_name = "Plando Weaknesses" schema = Schema({ Optional(And(str, Use(str.title), lambda s: s in bosses)): { - And(str, Use(str.title), lambda s: s in weapons_to_id): And(int, lambda i: i in range(-1, 14)) + And(str, Use(str.title), lambda s: s in weapons_to_id): And(int, lambda i: i in range(-1, 15)) } }) default = {} diff --git a/worlds/mm2/rules.py b/worlds/mm2/rules.py index 7e2ce1f3c7..7e03edf3a2 100644 --- a/worlds/mm2/rules.py +++ b/worlds/mm2/rules.py @@ -135,41 +135,47 @@ def set_rules(world: "MM2World") -> None: world.weapon_damage[weapon][i] = 0 for p_boss in world.options.plando_weakness: + boss = bosses[p_boss] for p_weapon in world.options.plando_weakness[p_boss]: - if world.options.plando_weakness[p_boss][p_weapon] < minimum_weakness_requirement[p_weapon] \ - and not any(w != p_weapon - and world.weapon_damage[w][bosses[p_boss]] > minimum_weakness_requirement[w] - for w in world.weapon_damage): + weapon = weapons_to_id[p_weapon] + if world.options.plando_weakness[p_boss][p_weapon] < minimum_weakness_requirement[weapon] \ + and not any(w != weapon + and world.weapon_damage[w][boss] >= minimum_weakness_requirement[w] + for w in world.weapon_damage): # we need to replace this weakness - weakness = world.random.choice([key for key in world.weapon_damage if key != p_weapon]) - world.weapon_damage[weakness][bosses[p_boss]] = minimum_weakness_requirement[weakness] - world.weapon_damage[weapons_to_id[p_weapon]][bosses[p_boss]] \ - = world.options.plando_weakness[p_boss][p_weapon] + weakness = world.random.choice([key for key in world.weapon_damage if key != weapon]) + world.weapon_damage[weakness][boss] = minimum_weakness_requirement[weakness] + world.weapon_damage[weapon][boss] = world.options.plando_weakness[p_boss][p_weapon] # handle special cases for boss in range(14): for weapon in (1, 2, 3, 6, 8): if (0 < world.weapon_damage[weapon][boss] < minimum_weakness_requirement[weapon] and - not any(world.weapon_damage[i][boss] >= minimum_weakness_requirement[weapon] + not any(world.weapon_damage[i][boss] >= minimum_weakness_requirement[i] for i in range(9) if i != weapon)): # Weapon does not have enough possible ammo to kill the boss, raise the damage - if boss == 9: - if weapon in (1, 6): - # Atomic Fire and Crash Bomber cannot be Picopico-kun's only weakness - world.weapon_damage[weapon][boss] = 0 - weakness = world.random.choice((2, 3, 4, 5, 7, 8)) - world.weapon_damage[weakness][boss] = minimum_weakness_requirement[weakness] - elif boss == 11: - if weapon == 1: - # Atomic Fire cannot be Boobeam Trap's only weakness - world.weapon_damage[weapon][boss] = 0 - weakness = world.random.choice((2, 3, 4, 5, 6, 7, 8)) - world.weapon_damage[weakness][boss] = minimum_weakness_requirement[weakness] - else: - world.weapon_damage[weapon][boss] = minimum_weakness_requirement[weapon] + world.weapon_damage[weapon][boss] = minimum_weakness_requirement[weapon] + + for weapon in (1, 6): + if (world.weapon_damage[weapon][9] >= minimum_weakness_requirement[weapon] and + not any(world.weapon_damage[i][9] >= minimum_weakness_requirement[i] + for i in range(9) if i not in (1, 6))): + # Atomic Fire and Crash Bomber cannot be Picopico-kun's only weakness + world.weapon_damage[weapon][9] = 0 + weakness = world.random.choice((2, 3, 4, 5, 7, 8)) + world.weapon_damage[weakness][9] = minimum_weakness_requirement[weakness] + + if (world.weapon_damage[1][11] >= minimum_weakness_requirement[1] and + not any(world.weapon_damage[i][11] >= minimum_weakness_requirement[i] + for i in range(9) if i != 1)): + # Atomic Fire cannot be Boobeam Trap's only weakness + world.weapon_damage[1][11] = 0 + weakness = world.random.choice((2, 3, 4, 5, 6, 7, 8)) + world.weapon_damage[weakness][11] = minimum_weakness_requirement[weakness] if world.weapon_damage[0][world.options.starting_robot_master.value] < 1: - world.weapon_damage[0][world.options.starting_robot_master.value] = weapon_damage[0][world.options.starting_robot_master.value] + world.weapon_damage[0][world.options.starting_robot_master.value] = \ + weapon_damage[0][world.options.starting_robot_master.value] # final special case # There's a vanilla crash if Time Stopper kills Wily phase 1 @@ -218,9 +224,10 @@ def set_rules(world: "MM2World") -> None: # we are out of weapons that can actually damage the boss # so find the weapon that has the most uses, and apply that as an additional weakness # it should be impossible to be out of energy, simply because even if every boss took 1 from - # Quick Boomerang and no other, it would only be 28 off from defeating all 9, which Metal Blade should - # be able to cover - wp, max_uses = max((weapon, weapon_energy[weapon] // weapon_costs[weapon]) for weapon in weapon_weight + # Quick Boomerang and no other, it would only be 28 off from defeating all 9, + # which Metal Blade should be able to cover + wp, max_uses = max((weapon, weapon_energy[weapon] // weapon_costs[weapon]) + for weapon in weapon_weight if weapon != 0 and (weapon != 8 or boss != 12)) # Wily Machine cannot under any circumstances take damage from Time Stopper, prevent this world.weapon_damage[wp][boss] = minimum_weakness_requirement[wp] From 1ebc9e2ec03de4dc3c18af6b0d9e82655614ff81 Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Tue, 28 Jan 2025 17:19:20 -0500 Subject: [PATCH 011/227] Stardew Valley: Tests: Restructure the tests that validate Mods + ER together, improved performance (#4557) * - Unrolled and improved the structure of the test for Mods + ER, to improve total performance and performance on individual tests for threading purposes * Use | instead of Union[] Co-authored-by: Jouramie <16137441+Jouramie@users.noreply.github.com> * - Remove unused using --------- Co-authored-by: Jouramie <16137441+Jouramie@users.noreply.github.com> --- worlds/stardew_valley/test/mods/TestMods.py | 65 +++++++++++++++++---- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/worlds/stardew_valley/test/mods/TestMods.py b/worlds/stardew_valley/test/mods/TestMods.py index 89f82870e4..02592cc383 100644 --- a/worlds/stardew_valley/test/mods/TestMods.py +++ b/worlds/stardew_valley/test/mods/TestMods.py @@ -7,7 +7,9 @@ from ..assertion import ModAssertMixin, WorldAssertMixin from ... import items, Group, ItemClassification, create_content from ... import options from ...items import items_by_group +from ...mods.mod_data import ModNames from ...options import SkillProgression, Walnutsanity +from ...options.options import all_mods from ...regions import RandomizationFlag, randomize_connections, create_final_connections_and_regions @@ -20,17 +22,58 @@ class TestGenerateModsOptions(WorldAssertMixin, ModAssertMixin, SVTestCase): self.assert_basic_checks(multi_world) self.assert_stray_mod_items(mod, multi_world) - def test_given_mod_names_when_generate_paired_with_entrance_randomizer_then_basic_checks(self): - for option in options.EntranceRandomization.options: - for mod in options.Mods.valid_keys: - world_options = { - options.EntranceRandomization: options.EntranceRandomization.options[option], - options.Mods: mod, - options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false - } - with self.solo_world_sub_test(f"entrance_randomization: {option}, Mod: {mod}", world_options) as (multi_world, _): - self.assert_basic_checks(multi_world) - self.assert_stray_mod_items(mod, multi_world) + # The following tests validate that ER still generates winnable and logically-sane games with given mods. + # Mods that do not interact with entrances are skipped + # Not all ER settings are tested, because 'buildings' is, essentially, a superset of all others + def test_deepwoods_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.deepwoods, options.EntranceRandomization.option_buildings) + + def test_juna_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.juna, options.EntranceRandomization.option_buildings) + + def test_jasper_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.jasper, options.EntranceRandomization.option_buildings) + + def test_alec_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.alec, options.EntranceRandomization.option_buildings) + + def test_yoba_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.yoba, options.EntranceRandomization.option_buildings) + + def test_eugene_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.eugene, options.EntranceRandomization.option_buildings) + + def test_ayeisha_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.ayeisha, options.EntranceRandomization.option_buildings) + + def test_riley_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.riley, options.EntranceRandomization.option_buildings) + + def test_sve_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.sve, options.EntranceRandomization.option_buildings) + + def test_alecto_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.alecto, options.EntranceRandomization.option_buildings) + + def test_lacey_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.lacey, options.EntranceRandomization.option_buildings) + + def test_boarding_house_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.boarding_house, options.EntranceRandomization.option_buildings) + + def test_all_mods_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(all_mods, options.EntranceRandomization.option_buildings) + + def perform_basic_checks_on_mod_with_er(self, mods: str | set[str], er_option: int) -> None: + if isinstance(mods, str): + mods = {mods} + world_options = { + options.EntranceRandomization: er_option, + options.Mods: frozenset(mods), + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false + } + with self.solo_world_sub_test(f"entrance_randomization: {er_option}, Mods: {mods}", world_options) as (multi_world, _): + self.assert_basic_checks(multi_world) def test_allsanity_all_mods_when_generate_then_basic_checks(self): with self.solo_world_sub_test(world_options=allsanity_mods_6_x_x()) as (multi_world, _): From 41898ed6403fa62487c51880792a648d1f4d246b Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Wed, 29 Jan 2025 01:42:46 +0100 Subject: [PATCH 012/227] MultiServer: implement NoText and deprecate uncompressed Websocket connections (#4540) * MultiServer: add NoText tag and handling * MultiServer: deprecate and warn for uncompressed connections * MultiServer: fix missing space in no compression warning --- MultiServer.py | 51 +++++++++++++++++++++++++++++----------- NetUtils.py | 5 ++-- docs/network protocol.md | 4 ++++ 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/MultiServer.py b/MultiServer.py index 9e0868b0f4..51b72c93ad 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -28,9 +28,11 @@ ModuleUpdate.update() if typing.TYPE_CHECKING: import ssl + from NetUtils import ServerConnection -import websockets import colorama +import websockets +from websockets.extensions.permessage_deflate import PerMessageDeflate try: # ponyorm is a requirement for webhost, not default server, so may not be importable from pony.orm.dbapiprovider import OperationalError @@ -119,13 +121,14 @@ def get_saving_second(seed_name: str, interval: int = 60) -> int: class Client(Endpoint): version = Version(0, 0, 0) - tags: typing.List[str] = [] + tags: typing.List[str] remote_items: bool remote_start_inventory: bool no_items: bool no_locations: bool + no_text: bool - def __init__(self, socket: websockets.WebSocketServerProtocol, ctx: Context): + def __init__(self, socket: "ServerConnection", ctx: Context) -> None: super().__init__(socket) self.auth = False self.team = None @@ -175,6 +178,7 @@ class Context: "compatibility": int} # team -> slot id -> list of clients authenticated to slot. clients: typing.Dict[int, typing.Dict[int, typing.List[Client]]] + endpoints: list[Client] locations: LocationStore # typing.Dict[int, typing.Dict[int, typing.Tuple[int, int, int]]] location_checks: typing.Dict[typing.Tuple[int, int], typing.Set[int]] hints_used: typing.Dict[typing.Tuple[int, int], int] @@ -364,18 +368,28 @@ class Context: return True def broadcast_all(self, msgs: typing.List[dict]): - msgs = self.dumper(msgs) - endpoints = (endpoint for endpoint in self.endpoints if endpoint.auth) - async_start(self.broadcast_send_encoded_msgs(endpoints, msgs)) + msg_is_text = all(msg["cmd"] == "PrintJSON" for msg in msgs) + data = self.dumper(msgs) + endpoints = ( + endpoint + for endpoint in self.endpoints + if endpoint.auth and not (msg_is_text and endpoint.no_text) + ) + async_start(self.broadcast_send_encoded_msgs(endpoints, data)) def broadcast_text_all(self, text: str, additional_arguments: dict = {}): self.logger.info("Notice (all): %s" % text) self.broadcast_all([{**{"cmd": "PrintJSON", "data": [{ "text": text }]}, **additional_arguments}]) def broadcast_team(self, team: int, msgs: typing.List[dict]): - msgs = self.dumper(msgs) - endpoints = (endpoint for endpoint in itertools.chain.from_iterable(self.clients[team].values())) - async_start(self.broadcast_send_encoded_msgs(endpoints, msgs)) + msg_is_text = all(msg["cmd"] == "PrintJSON" for msg in msgs) + data = self.dumper(msgs) + endpoints = ( + endpoint + for endpoint in itertools.chain.from_iterable(self.clients[team].values()) + if not (msg_is_text and endpoint.no_text) + ) + async_start(self.broadcast_send_encoded_msgs(endpoints, data)) def broadcast(self, endpoints: typing.Iterable[Client], msgs: typing.List[dict]): msgs = self.dumper(msgs) @@ -389,13 +403,13 @@ class Context: await on_client_disconnected(self, endpoint) def notify_client(self, client: Client, text: str, additional_arguments: dict = {}): - if not client.auth: + if not client.auth or client.no_text: return self.logger.info("Notice (Player %s in team %d): %s" % (client.name, client.team + 1, text)) async_start(self.send_msgs(client, [{"cmd": "PrintJSON", "data": [{ "text": text }], **additional_arguments}])) def notify_client_multiple(self, client: Client, texts: typing.List[str], additional_arguments: dict = {}): - if not client.auth: + if not client.auth or client.no_text: return async_start(self.send_msgs(client, [{"cmd": "PrintJSON", "data": [{ "text": text }], **additional_arguments} @@ -760,7 +774,7 @@ class Context: self.on_new_hint(team, slot) for slot, hint_data in concerns.items(): if recipients is None or slot in recipients: - clients = self.clients[team].get(slot) + clients = filter(lambda c: not c.no_text, self.clients[team].get(slot, [])) if not clients: continue client_hints = [datum[1] for datum in sorted(hint_data, key=lambda x: x[0].finding_player != slot)] @@ -819,7 +833,7 @@ def update_aliases(ctx: Context, team: int): async_start(ctx.send_encoded_msgs(client, cmd)) -async def server(websocket, path: str = "/", ctx: Context = None): +async def server(websocket: "ServerConnection", path: str = "/", ctx: Context = None) -> None: client = Client(websocket, ctx) ctx.endpoints.append(client) @@ -910,6 +924,10 @@ async def on_client_joined(ctx: Context, client: Client): "If your client supports it, " "you may have additional local commands you can list with /help.", {"type": "Tutorial"}) + if not any(isinstance(extension, PerMessageDeflate) for extension in client.socket.extensions): + ctx.notify_client(client, "Warning: your client does not support compressed websocket connections! " + "It may stop working in the future. If you are a player, please report this to the " + "client's developer.") ctx.client_connection_timers[client.team, client.slot] = datetime.datetime.now(datetime.timezone.utc) @@ -1803,7 +1821,9 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict): ctx.clients[team][slot].append(client) client.version = args['version'] client.tags = args['tags'] - client.no_locations = 'TextOnly' in client.tags or 'Tracker' in client.tags + client.no_locations = "TextOnly" in client.tags or "Tracker" in client.tags + # set NoText for old PopTracker clients that predate the tag to save traffic + client.no_text = "NoText" in client.tags or ("PopTracker" in client.tags and client.version < (0, 5, 1)) connected_packet = { "cmd": "Connected", "team": client.team, "slot": client.slot, @@ -1876,6 +1896,9 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict): client.tags = args["tags"] if set(old_tags) != set(client.tags): client.no_locations = 'TextOnly' in client.tags or 'Tracker' in client.tags + client.no_text = "NoText" in client.tags or ( + "PopTracker" in client.tags and client.version < (0, 5, 1) + ) ctx.broadcast_text_all( f"{ctx.get_aliased_name(client.team, client.slot)} (Team #{client.team + 1}) has changed tags " f"from {old_tags} to {client.tags}.", diff --git a/NetUtils.py b/NetUtils.py index d58bbe81e3..5bcc583c53 100644 --- a/NetUtils.py +++ b/NetUtils.py @@ -5,7 +5,8 @@ import enum import warnings from json import JSONEncoder, JSONDecoder -import websockets +if typing.TYPE_CHECKING: + from websockets import WebSocketServerProtocol as ServerConnection from Utils import ByValue, Version @@ -151,7 +152,7 @@ decode = JSONDecoder(object_hook=_object_hook).decode class Endpoint: - socket: websockets.WebSocketServerProtocol + socket: "ServerConnection" def __init__(self, socket): self.socket = socket diff --git a/docs/network protocol.md b/docs/network protocol.md index e32c266ffb..2eb3b0d6f3 100644 --- a/docs/network protocol.md +++ b/docs/network protocol.md @@ -47,6 +47,9 @@ Packets are simple JSON lists in which any number of ordered network commands ca An object can contain the "class" key, which will tell the content data type, such as "Version" in the following example. +Websocket connections should support per-message compression. Uncompressed connections are deprecated and may stop +working in the future. + Example: ```javascript [{"cmd": "RoomInfo", "version": {"major": 0, "minor": 1, "build": 3, "class": "Version"}, "tags": ["WebHost"], ... }] @@ -745,6 +748,7 @@ Tags are represented as a list of strings, the common client tags follow: | HintGame | Indicates the client is a hint game, made to send hints instead of locations. Special join/leave message,¹ `game` is optional.² | | Tracker | Indicates the client is a tracker, made to track instead of sending locations. Special join/leave message,¹ `game` is optional.² | | TextOnly | Indicates the client is a basic client, made to chat instead of sending locations. Special join/leave message,¹ `game` is optional.² | +| NoText | Indicates the client does not want to receive text messages, improving performance if not needed. | ¹: When connecting or disconnecting, the chat message shows e.g. "tracking".\ ²: Allows `game` to be empty or null in [Connect](#connect). Game and version validation will then be skipped. From 738c21c625f673caac2d10c173688a10f23c86a1 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Wed, 29 Jan 2025 01:52:01 +0100 Subject: [PATCH 013/227] Tests: massively improve the memory leak test performance (#4568) * Tests: massively improve the memory leak test performance With the growing number of worlds, GC becomes the bottleneck and slows down the test. * Tests: fix typing in general/test_memory --- test/general/test_memory.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/general/test_memory.py b/test/general/test_memory.py index 987d19acf3..a4b2f1bd25 100644 --- a/test/general/test_memory.py +++ b/test/general/test_memory.py @@ -1,5 +1,6 @@ import unittest +from BaseClasses import MultiWorld from worlds.AutoWorld import AutoWorldRegister from . import setup_solo_multiworld @@ -9,8 +10,12 @@ class TestWorldMemory(unittest.TestCase): """Tests that worlds don't leak references to MultiWorld or themselves with default options.""" import gc import weakref + refs: dict[str, weakref.ReferenceType[MultiWorld]] = {} for game_name, world_type in AutoWorldRegister.world_types.items(): - with self.subTest("Game", game_name=game_name): + with self.subTest("Game creation", game_name=game_name): weak = weakref.ref(setup_solo_multiworld(world_type)) - gc.collect() + refs[game_name] = weak + gc.collect() + for game_name, weak in refs.items(): + with self.subTest("Game cleanup", game_name=game_name): self.assertFalse(weak(), "World leaked a reference") From 57afdfda6f6535bc592581d70d97a3f12977b5a1 Mon Sep 17 00:00:00 2001 From: Felix R <50271878+FelicitusNeko@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:03:37 -0400 Subject: [PATCH 014/227] meritous: move completion_condition to set_rules (#4567) --- worlds/meritous/__init__.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/worlds/meritous/__init__.py b/worlds/meritous/__init__.py index 7a21b19ef2..2263478ff5 100644 --- a/worlds/meritous/__init__.py +++ b/worlds/meritous/__init__.py @@ -136,6 +136,12 @@ class MeritousWorld(World): def set_rules(self): set_rules(self.multiworld, self.player) + if self.goal == 0: + self.multiworld.completion_condition[self.player] = lambda state: state.has_any( + ["Victory", "Full Victory"], self.player) + else: + self.multiworld.completion_condition[self.player] = lambda state: state.has( + "Full Victory", self.player) def generate_basic(self): self.multiworld.get_location("Place of Power", self.player).place_locked_item( @@ -166,13 +172,6 @@ class MeritousWorld(World): self.multiworld.get_location(boss, self.player).place_locked_item( self.create_item("Evolution Trap")) - if self.goal == 0: - self.multiworld.completion_condition[self.player] = lambda state: state.has_any( - ["Victory", "Full Victory"], self.player) - else: - self.multiworld.completion_condition[self.player] = lambda state: state.has( - "Full Victory", self.player) - def fill_slot_data(self) -> dict: return { "goal": self.goal, From b8666b25625b0cd2341b9747bc126127cd26022e Mon Sep 17 00:00:00 2001 From: Jouramie <16137441+Jouramie@users.noreply.github.com> Date: Wed, 29 Jan 2025 13:56:50 -0500 Subject: [PATCH 015/227] Stardew Valley: Remove weird magic trap test? (#4570) --- worlds/stardew_valley/test/mods/TestMods.py | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/worlds/stardew_valley/test/mods/TestMods.py b/worlds/stardew_valley/test/mods/TestMods.py index 02592cc383..1dd2ab4902 100644 --- a/worlds/stardew_valley/test/mods/TestMods.py +++ b/worlds/stardew_valley/test/mods/TestMods.py @@ -1,12 +1,10 @@ import random from BaseClasses import get_seed -from .. import SVTestBase, SVTestCase, allsanity_no_mods_6_x_x, allsanity_mods_6_x_x, solo_multiworld, \ - fill_dataclass_with_default +from .. import SVTestBase, SVTestCase, allsanity_mods_6_x_x, fill_dataclass_with_default from ..assertion import ModAssertMixin, WorldAssertMixin from ... import items, Group, ItemClassification, create_content from ... import options -from ...items import items_by_group from ...mods.mod_data import ModNames from ...options import SkillProgression, Walnutsanity from ...options.options import all_mods @@ -190,19 +188,3 @@ class TestModEntranceRando(SVTestCase): self.assertEqual(len(set(randomized_connections.values())), len(randomized_connections.values()), f"Connections are duplicated in randomization.") - - -class TestModTraps(SVTestCase): - def test_given_traps_when_generate_then_all_traps_in_pool(self): - for value in options.TrapItems.options: - if value == "no_traps": - continue - - world_options = allsanity_no_mods_6_x_x() - world_options.update({options.TrapItems.internal_name: options.TrapItems.options[value], options.Mods.internal_name: "Magic"}) - with solo_multiworld(world_options) as (multi_world, _): - trap_items = [item_data.name for item_data in items_by_group[Group.TRAP] if Group.DEPRECATED not in item_data.groups] - multiworld_items = [item.name for item in multi_world.get_items()] - for item in trap_items: - with self.subTest(f"Option: {value}, Item: {item}"): - self.assertIn(item, multiworld_items) From 8e14e463e41945378090da40ab620698baf6d8cc Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Thu, 30 Jan 2025 03:05:51 -0500 Subject: [PATCH 016/227] Stardew Valley: Radioactive slot machine should be a ginger island check (#4578) --- worlds/stardew_valley/data/locations.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/stardew_valley/data/locations.csv b/worlds/stardew_valley/data/locations.csv index 43883b86f8..66a9157b34 100644 --- a/worlds/stardew_valley/data/locations.csv +++ b/worlds/stardew_valley/data/locations.csv @@ -2938,7 +2938,7 @@ id,region,name,tags,mod_name 7440,Farm,Craft Copper Slot Machine,"CRAFTSANITY",Luck Skill 7441,Farm,Craft Gold Slot Machine,"CRAFTSANITY",Luck Skill 7442,Farm,Craft Iridium Slot Machine,"CRAFTSANITY",Luck Skill -7443,Farm,Craft Radioactive Slot Machine,"CRAFTSANITY",Luck Skill +7443,Farm,Craft Radioactive Slot Machine,"CRAFTSANITY,GINGER_ISLAND",Luck Skill 7451,Adventurer's Guild,Magic Elixir Recipe,"CHEFSANITY,CHEFSANITY_PURCHASE",Magic 7452,Adventurer's Guild,Travel Core Recipe,CRAFTSANITY,Magic 7453,Alesia Shop,Haste Elixir Recipe,CRAFTSANITY,Stardew Valley Expanded From 1fe8024b438dd56bd20e6b26c8d14fe1e1fbd0b4 Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Thu, 30 Jan 2025 03:19:06 -0500 Subject: [PATCH 017/227] Stardew valley: Add Mod Recipes tests (#4580) * `- Add Craftsanity Mod tests * - Add the same test for cooking --------- Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- .../stardew_valley/test/mods/TestModsFill.py | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 worlds/stardew_valley/test/mods/TestModsFill.py diff --git a/worlds/stardew_valley/test/mods/TestModsFill.py b/worlds/stardew_valley/test/mods/TestModsFill.py new file mode 100644 index 0000000000..a140f5abae --- /dev/null +++ b/worlds/stardew_valley/test/mods/TestModsFill.py @@ -0,0 +1,28 @@ +from .. import SVTestBase +from ... import options + + +class TestNoGingerIslandCraftingRecipesAreRequired(SVTestBase): + options = { + options.Goal.internal_name: options.Goal.option_craft_master, + options.Craftsanity.internal_name: options.Craftsanity.option_all, + options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, + options.Mods.internal_name: frozenset(options.Mods.valid_keys) + } + + @property + def run_default_tests(self) -> bool: + return True + + +class TestNoGingerIslandCookingRecipesAreRequired(SVTestBase): + options = { + options.Goal.internal_name: options.Goal.option_gourmet_chef, + options.Cooksanity.internal_name: options.Cooksanity.option_all, + options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, + options.Mods.internal_name: frozenset(options.Mods.valid_keys) + } + + @property + def run_default_tests(self) -> bool: + return True From 67e8877143aecf3587f7b60bdb34659de1500e0d Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Fri, 31 Jan 2025 08:38:17 +0100 Subject: [PATCH 018/227] Docs: fix lower limit of valid IDs in network protocol.md (#4579) --- docs/network protocol.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/network protocol.md b/docs/network protocol.md index 2eb3b0d6f3..e5d3b7e6c2 100644 --- a/docs/network protocol.md +++ b/docs/network protocol.md @@ -533,9 +533,9 @@ In JSON this may look like: {"item": 3, "location": 3, "player": 3, "flags": 0} ] ``` -`item` is the item id of the item. Item ids are only supported in the range of [-253, 253 - 1], with anything ≤ 0 reserved for Archipelago use. +`item` is the item id of the item. Item ids are only supported in the range of [-253 + 1, 253 - 1], with anything ≤ 0 reserved for Archipelago use. -`location` is the location id of the item inside the world. Location ids are only supported in the range of [-253, 253 - 1], with anything ≤ 0 reserved for Archipelago use. +`location` is the location id of the item inside the world. Location ids are only supported in the range of [-253 + 1, 253 - 1], with anything ≤ 0 reserved for Archipelago use. `player` is the player slot of the world the item is located in, except when inside an [LocationInfo](#LocationInfo) Packet then it will be the slot of the player to receive the item From 445c9b22d6cfb9b8ff4e76b91995d08abf154ff5 Mon Sep 17 00:00:00 2001 From: qwint Date: Fri, 31 Jan 2025 20:11:04 -0500 Subject: [PATCH 019/227] Settings: Handle empty Groups (#4576) * export empty groups as an empty dict instead of crashing * Update settings.py Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> * check instance values from self as well * Apply suggestions from code review Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --------- Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- settings.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/settings.py b/settings.py index 12dace632c..cc808c2732 100644 --- a/settings.py +++ b/settings.py @@ -109,7 +109,7 @@ class Group: def get_type_hints(cls) -> Dict[str, Any]: """Returns resolved type hints for the class""" if cls._type_cache is None: - if not isinstance(next(iter(cls.__annotations__.values())), str): + if not cls.__annotations__ or not isinstance(next(iter(cls.__annotations__.values())), str): # non-str: assume already resolved cls._type_cache = cls.__annotations__ else: @@ -270,11 +270,15 @@ class Group: # fetch class to avoid going through getattr cls = self.__class__ type_hints = cls.get_type_hints() + entries = [e for e in self] + if not entries: + # write empty dict for empty Group with no instance values + cls._dump_value({}, f, indent=" " * level) # validate group for name in cls.__annotations__.keys(): assert hasattr(cls, name), f"{cls}.{name} is missing a default value" # dump ordered members - for name in self: + for name in entries: attr = cast(object, getattr(self, name)) attr_cls = type_hints[name] if name in type_hints else attr.__class__ attr_cls_origin = typing.get_origin(attr_cls) From d1167027f4d723856e555a8c9ca7cfe7ce8dde4f Mon Sep 17 00:00:00 2001 From: Jarno Date: Sat, 1 Feb 2025 02:26:59 +0100 Subject: [PATCH 020/227] Core: Make csv options output ignore hidden options (#4539) * Core: Make csv options output ignore hidden options * Update Options.py Co-authored-by: Aaron Wagener --------- Co-authored-by: Aaron Wagener --- Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Options.py b/Options.py index d9122d444c..49e82069ee 100644 --- a/Options.py +++ b/Options.py @@ -1582,7 +1582,7 @@ def dump_player_options(multiworld: MultiWorld) -> None: } output.append(player_output) for option_key, option in world.options_dataclass.type_hints.items(): - if issubclass(Removed, option): + if option.visibility == Visibility.none: continue display_name = getattr(option, "display_name", option_key) player_output[display_name] = getattr(world.options, option_key).current_option_name From b7b78dead3bf181545352df1b0e3229fc592b9f2 Mon Sep 17 00:00:00 2001 From: Spineraks Date: Sat, 1 Feb 2025 22:03:49 +0100 Subject: [PATCH 021/227] LADX: Fix generation error on minimal accessibility (#4281) * [LADX] Fix minimal accessibility * allow_partial for minimal accessibility * create the correct partial_all_state * skip our prefills rather than removing after * dont rebuild our prefill list --------- Co-authored-by: threeandthreee --- worlds/ladx/__init__.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/worlds/ladx/__init__.py b/worlds/ladx/__init__.py index 7b1a35666a..a887638e37 100644 --- a/worlds/ladx/__init__.py +++ b/worlds/ladx/__init__.py @@ -9,7 +9,7 @@ import re import bsdiff4 import settings -from BaseClasses import Entrance, Item, ItemClassification, Location, Tutorial, MultiWorld +from BaseClasses import CollectionState, Entrance, Item, ItemClassification, Location, Tutorial, MultiWorld from Fill import fill_restrictive from worlds.AutoWorld import WebWorld, World from .Common import * @@ -315,8 +315,6 @@ class LinksAwakeningWorld(World): # Set up filter rules - # The list of items we will pass to fill_restrictive, contains at first the items that go to all dungeons - all_dungeon_items_to_fill = list(self.prefill_own_dungeons) # set containing the list of all possible dungeon locations for the player all_dungeon_locs = set() @@ -327,9 +325,6 @@ class LinksAwakeningWorld(World): for item in self.prefill_original_dungeon[dungeon_index]: allowed_locations_by_item[item] = locs - # put the items for this dungeon in the list to fill - all_dungeon_items_to_fill.extend(self.prefill_original_dungeon[dungeon_index]) - # ...and gather the list of all dungeon locations all_dungeon_locs |= locs # ...also set the rules for the dungeon @@ -369,16 +364,27 @@ class LinksAwakeningWorld(World): if allowed_locations_by_item[item] is all_dungeon_locs: i += 3 return i + all_dungeon_items_to_fill = self.get_pre_fill_items() all_dungeon_items_to_fill.sort(key=priority) # Set up state - all_state = self.multiworld.get_all_state(use_cache=False) - # Remove dungeon items we are about to put in from the state so that we don't double count - for item in all_dungeon_items_to_fill: - all_state.remove(item) + partial_all_state = CollectionState(self.multiworld) + # Collect every item from the item pool and every pre-fill item like MultiWorld.get_all_state, except not our own pre-fill items. + for item in self.multiworld.itempool: + partial_all_state.collect(item, prevent_sweep=True) + for player in self.multiworld.player_ids: + if player == self.player: + # Don't collect the items we're about to place. + continue + subworld = self.multiworld.worlds[player] + for item in subworld.get_pre_fill_items(): + partial_all_state.collect(item, prevent_sweep=True) + + # Sweep to pick up already placed items that are reachable with everything but the dungeon items. + partial_all_state.sweep_for_advancements() - # Finally, fill! - fill_restrictive(self.multiworld, all_state, all_dungeon_locs_to_fill, all_dungeon_items_to_fill, lock=True, single_player_placement=True, allow_partial=False) + fill_restrictive(self.multiworld, partial_all_state, all_dungeon_locs_to_fill, all_dungeon_items_to_fill, lock=True, single_player_placement=True, allow_partial=False) + name_cache = {} # Tries to associate an icon from another game with an icon we have From 051518e72aaed0b49d43fe80c01129fd52aca729 Mon Sep 17 00:00:00 2001 From: Jouramie <16137441+Jouramie@users.noreply.github.com> Date: Sat, 1 Feb 2025 16:07:08 -0500 Subject: [PATCH 022/227] Stardew Valley: Fix unresolved reference warning and unused imports (#4360) * fix unresolved reference warning and unused imports * revert stuff * just a commit to rerun the tests cuz messenger fail --- worlds/stardew_valley/__init__.py | 6 +- worlds/stardew_valley/bundles/bundle_room.py | 2 +- worlds/stardew_valley/content/mods/sve.py | 19 +- .../content/vanilla/qi_board.py | 1 - worlds/stardew_valley/data/bundle_data.py | 4 +- worlds/stardew_valley/data/craftable_data.py | 11 +- worlds/stardew_valley/data/recipe_data.py | 42 +- worlds/stardew_valley/data/recipe_source.py | 2 +- worlds/stardew_valley/logic/ability_logic.py | 10 +- worlds/stardew_valley/logic/action_logic.py | 1 - worlds/stardew_valley/logic/skill_logic.py | 8 +- .../stardew_valley/mods/logic/item_logic.py | 7 +- .../stardew_valley/mods/logic/quests_logic.py | 5 +- worlds/stardew_valley/regions.py | 621 +++++++++--------- worlds/stardew_valley/scripts/update_data.py | 8 +- worlds/stardew_valley/stardew_rule/base.py | 4 +- .../test/TestMultiplePlayers.py | 2 - .../stardew_valley/test/TestWalnutsanity.py | 12 +- .../stardew_valley/test/rules/TestFishing.py | 3 +- 19 files changed, 395 insertions(+), 373 deletions(-) diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index ef842263ad..e2d49e64ae 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -1,6 +1,6 @@ import logging from random import Random -from typing import Dict, Any, Iterable, Optional, List, TextIO +from typing import Dict, Any, Iterable, Optional, List, TextIO, cast from BaseClasses import Region, Entrance, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState from Options import PerGameCommonOptions @@ -124,7 +124,7 @@ class StardewValleyWorld(World): self.options) def add_location(name: str, code: Optional[int], region: str): - region = world_regions[region] + region: Region = world_regions[region] location = StardewLocation(self.player, name, code, region) region.locations.append(location) @@ -314,9 +314,9 @@ class StardewValleyWorld(World): include_traps = True exclude_island = False for player in link_group["players"]: - player_options = self.multiworld.worlds[player].options if self.multiworld.game[player] != self.game: continue + player_options = cast(StardewValleyOptions, self.multiworld.worlds[player].options) if player_options.trap_items == TrapItems.option_no_traps: include_traps = False if player_options.exclude_ginger_island == ExcludeGingerIsland.option_true: diff --git a/worlds/stardew_valley/bundles/bundle_room.py b/worlds/stardew_valley/bundles/bundle_room.py index 8068ff17ac..225fb4feab 100644 --- a/worlds/stardew_valley/bundles/bundle_room.py +++ b/worlds/stardew_valley/bundles/bundle_room.py @@ -4,7 +4,7 @@ from typing import List from .bundle import Bundle, BundleTemplate from ..content import StardewContent -from ..options import BundlePrice, StardewValleyOptions +from ..options import StardewValleyOptions @dataclass diff --git a/worlds/stardew_valley/content/mods/sve.py b/worlds/stardew_valley/content/mods/sve.py index a68d4ae9c0..12b3e3558a 100644 --- a/worlds/stardew_valley/content/mods/sve.py +++ b/worlds/stardew_valley/content/mods/sve.py @@ -10,15 +10,14 @@ from ...data.shop import ShopSource from ...mods.mod_data import ModNames from ...strings.craftable_names import ModEdible from ...strings.crop_names import Fruit, SVEVegetable, SVEFruit -from ...strings.fish_names import WaterItem, SVEFish, SVEWaterItem +from ...strings.fish_names import WaterItem, SVEWaterItem from ...strings.flower_names import Flower from ...strings.food_names import SVEMeal, SVEBeverage from ...strings.forageable_names import Mushroom, Forageable, SVEForage from ...strings.gift_names import SVEGift -from ...strings.metal_names import Ore -from ...strings.monster_drop_names import ModLoot, Loot +from ...strings.monster_drop_names import ModLoot from ...strings.performance_names import Performance -from ...strings.region_names import Region, SVERegion, LogicRegion +from ...strings.region_names import Region, SVERegion from ...strings.season_names import Season from ...strings.seed_names import SVESeed from ...strings.skill_names import Skill @@ -81,7 +80,8 @@ register_mod_content_pack(SVEContentPack( ModEdible.lightning_elixir: (ShopSource(money_price=12000, shop_region=SVERegion.galmoran_outpost),), ModEdible.barbarian_elixir: (ShopSource(money_price=22000, shop_region=SVERegion.galmoran_outpost),), ModEdible.gravity_elixir: (ShopSource(money_price=4000, shop_region=SVERegion.galmoran_outpost),), - SVEMeal.grampleton_orange_chicken: (ShopSource(money_price=650, shop_region=Region.saloon, other_requirements=(RelationshipRequirement(ModNPC.sophia, 6),)),), + SVEMeal.grampleton_orange_chicken: ( + ShopSource(money_price=650, shop_region=Region.saloon, other_requirements=(RelationshipRequirement(ModNPC.sophia, 6),)),), ModEdible.hero_elixir: (ShopSource(money_price=8000, shop_region=SVERegion.isaac_shop),), ModEdible.aegis_elixir: (ShopSource(money_price=28000, shop_region=SVERegion.galmoran_outpost),), SVEBeverage.sports_drink: (ShopSource(money_price=750, shop_region=Region.hospital),), @@ -92,7 +92,8 @@ register_mod_content_pack(SVEContentPack( ForagingSource(regions=(SVERegion.forest_west,), seasons=(Season.summer, Season.fall)), ForagingSource(regions=(SVERegion.sprite_spring_cave,), ) ), Mushroom.purple: ( - ForagingSource(regions=(SVERegion.forest_west,), seasons=(Season.fall,)), ForagingSource(regions=(SVERegion.sprite_spring_cave, SVERegion.junimo_woods), ) + ForagingSource(regions=(SVERegion.forest_west,), seasons=(Season.fall,)), + ForagingSource(regions=(SVERegion.sprite_spring_cave, SVERegion.junimo_woods), ) ), Mushroom.morel: ( ForagingSource(regions=(SVERegion.forest_west,), seasons=(Season.fall,)), ForagingSource(regions=(SVERegion.sprite_spring_cave,), ) @@ -117,7 +118,8 @@ register_mod_content_pack(SVEContentPack( ModLoot.green_mushroom: (ForagingSource(regions=(SVERegion.highlands_pond,), seasons=Season.not_winter),), ModLoot.ornate_treasure_chest: (ForagingSource(regions=(SVERegion.highlands_outside,), - other_requirements=(CombatRequirement(Performance.galaxy), ToolRequirement(Tool.axe, ToolMaterial.iron))),), + other_requirements=( + CombatRequirement(Performance.galaxy), ToolRequirement(Tool.axe, ToolMaterial.iron))),), ModLoot.swirl_stone: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.galaxy),)),), ModLoot.void_soul: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.good),)),), SVEForage.winter_star_rose: (ForagingSource(regions=(SVERegion.summit,), seasons=(Season.winter,)),), @@ -137,7 +139,8 @@ register_mod_content_pack(SVEContentPack( SVEForage.thistle: (ForagingSource(regions=(SVERegion.summit,)),), ModLoot.void_pebble: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.great),)),), ModLoot.void_shard: (ForagingSource(regions=(SVERegion.crimson_badlands,), - other_requirements=(CombatRequirement(Performance.galaxy), SkillRequirement(Skill.combat, 10), YearRequirement(3),)),), + other_requirements=( + CombatRequirement(Performance.galaxy), SkillRequirement(Skill.combat, 10), YearRequirement(3),)),), SVEWaterItem.dulse_seaweed: (ForagingSource(regions=(Region.beach,), other_requirements=(FishingRequirement(Region.beach),)),), # Fable Reef diff --git a/worlds/stardew_valley/content/vanilla/qi_board.py b/worlds/stardew_valley/content/vanilla/qi_board.py index d859d3b16f..e5f67c4319 100644 --- a/worlds/stardew_valley/content/vanilla/qi_board.py +++ b/worlds/stardew_valley/content/vanilla/qi_board.py @@ -6,7 +6,6 @@ from ...data.game_item import GenericSource, ItemTag from ...data.harvest import HarvestCropSource from ...strings.crop_names import Fruit from ...strings.region_names import Region -from ...strings.season_names import Season from ...strings.seed_names import Seed diff --git a/worlds/stardew_valley/data/bundle_data.py b/worlds/stardew_valley/data/bundle_data.py index 8b2e189c79..75f0f75a23 100644 --- a/worlds/stardew_valley/data/bundle_data.py +++ b/worlds/stardew_valley/data/bundle_data.py @@ -10,7 +10,7 @@ from ..strings.craftable_names import Fishing, Craftable, Bomb, Consumable, Ligh from ..strings.crop_names import Fruit, Vegetable from ..strings.currency_names import Currency from ..strings.fertilizer_names import Fertilizer, RetainingSoil, SpeedGro -from ..strings.fish_names import Fish, WaterItem, Trash, all_fish +from ..strings.fish_names import Fish, WaterItem, Trash from ..strings.flower_names import Flower from ..strings.food_names import Beverage, Meal from ..strings.forageable_names import Forageable, Mushroom @@ -832,7 +832,7 @@ calico_items = [calico_egg.as_amount(200), calico_egg.as_amount(200), calico_egg magic_rock_candy, mega_bomb.as_amount(10), mystery_box.as_amount(10), mixed_seeds.as_amount(50), strawberry_seeds.as_amount(20), spicy_eel.as_amount(5), crab_cakes.as_amount(5), eggplant_parmesan.as_amount(5), - pumpkin_soup.as_amount(5), lucky_lunch.as_amount(5),] + pumpkin_soup.as_amount(5), lucky_lunch.as_amount(5)] calico_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.calico, calico_items, 2, 2) raccoon_bundle = BundleTemplate(CCRoom.bulletin_board, BundleName.raccoon, raccoon_foraging_items, 4, 4) diff --git a/worlds/stardew_valley/data/craftable_data.py b/worlds/stardew_valley/data/craftable_data.py index 1bb4b2bea7..de371b7c3a 100644 --- a/worlds/stardew_valley/data/craftable_data.py +++ b/worlds/stardew_valley/data/craftable_data.py @@ -14,7 +14,7 @@ from ..strings.fertilizer_names import Fertilizer, RetainingSoil, SpeedGro from ..strings.fish_names import Fish, WaterItem, ModTrash, Trash from ..strings.flower_names import Flower from ..strings.food_names import Meal -from ..strings.forageable_names import Forageable, SVEForage, DistantLandsForageable, Mushroom +from ..strings.forageable_names import Forageable, DistantLandsForageable, Mushroom from ..strings.gift_names import Gift from ..strings.ingredient_names import Ingredient from ..strings.machine_names import Machine @@ -318,7 +318,8 @@ travel_charm = shop_recipe(ModCraftable.travel_core, Region.adventurer_guild, 25 preservation_chamber = skill_recipe(ModMachine.preservation_chamber, ModSkill.archaeology, 1, {MetalBar.copper: 1, Material.wood: 15, ArtisanGood.oak_resin: 30}, ModNames.archaeology) -restoration_table = skill_recipe(ModMachine.restoration_table, ModSkill.archaeology, 1, {Material.wood: 15, MetalBar.copper: 1, MetalBar.iron: 1}, ModNames.archaeology) +restoration_table = skill_recipe(ModMachine.restoration_table, ModSkill.archaeology, 1, {Material.wood: 15, MetalBar.copper: 1, MetalBar.iron: 1}, + ModNames.archaeology) preservation_chamber_h = skill_recipe(ModMachine.hardwood_preservation_chamber, ModSkill.archaeology, 6, {MetalBar.copper: 1, Material.hardwood: 15, ArtisanGood.oak_resin: 30}, ModNames.archaeology) grinder = skill_recipe(ModMachine.grinder, ModSkill.archaeology, 2, {Artifact.rusty_cog: 10, MetalBar.iron: 5, ArtisanGood.battery_pack: 1}, @@ -330,12 +331,14 @@ glass_path = skill_recipe(ModFloor.glass_path, ModSkill.archaeology, 3, {Artifac glass_fence = skill_recipe(ModCraftable.glass_fence, ModSkill.archaeology, 7, {Artifact.glass_shards: 5}, ModNames.archaeology) bone_path = skill_recipe(ModFloor.bone_path, ModSkill.archaeology, 4, {Fossil.bone_fragment: 1}, ModNames.archaeology) rust_path = skill_recipe(ModFloor.rusty_path, ModSkill.archaeology, 2, {ModTrash.rusty_scrap: 2}, ModNames.archaeology) -rusty_brazier = skill_recipe(ModCraftable.rusty_brazier, ModSkill.archaeology, 3, {ModTrash.rusty_scrap: 10, Material.coal: 1, Material.fiber: 1}, ModNames.archaeology) +rusty_brazier = skill_recipe(ModCraftable.rusty_brazier, ModSkill.archaeology, 3, {ModTrash.rusty_scrap: 10, Material.coal: 1, Material.fiber: 1}, + ModNames.archaeology) bone_fence = skill_recipe(ModCraftable.bone_fence, ModSkill.archaeology, 8, {Fossil.bone_fragment: 2}, ModNames.archaeology) water_shifter = skill_recipe(ModCraftable.water_shifter, ModSkill.archaeology, 4, {Material.wood: 40, MetalBar.copper: 4}, ModNames.archaeology) wooden_display = skill_recipe(ModCraftable.wooden_display, ModSkill.archaeology, 1, {Material.wood: 25}, ModNames.archaeology) hardwood_display = skill_recipe(ModCraftable.hardwood_display, ModSkill.archaeology, 7, {Material.hardwood: 10}, ModNames.archaeology) -lucky_ring = skill_recipe(Ring.lucky_ring, ModSkill.archaeology, 8, {Artifact.elvish_jewelry: 1, AnimalProduct.rabbit_foot: 5, Mineral.tigerseye: 1}, ModNames.archaeology) +lucky_ring = skill_recipe(Ring.lucky_ring, ModSkill.archaeology, 8, {Artifact.elvish_jewelry: 1, AnimalProduct.rabbit_foot: 5, Mineral.tigerseye: 1}, + ModNames.archaeology) volcano_totem = skill_recipe(ModConsumable.volcano_totem, ModSkill.archaeology, 9, {Material.cinder_shard: 5, Artifact.rare_disc: 1, Artifact.dwarf_gadget: 1}, ModNames.archaeology) haste_elixir = shop_recipe(ModEdible.haste_elixir, SVERegion.alesia_shop, 35000, {Loot.void_essence: 35, ModLoot.void_soul: 5, Ingredient.sugar: 1, diff --git a/worlds/stardew_valley/data/recipe_data.py b/worlds/stardew_valley/data/recipe_data.py index 3123bb9243..667227cb9e 100644 --- a/worlds/stardew_valley/data/recipe_data.py +++ b/worlds/stardew_valley/data/recipe_data.py @@ -1,15 +1,16 @@ from typing import Dict, List, Optional -from ..mods.mod_data import ModNames + from .recipe_source import RecipeSource, FriendshipSource, SkillSource, QueenOfSauceSource, ShopSource, StarterSource, ShopTradeSource, ShopFriendshipSource +from ..mods.mod_data import ModNames from ..strings.animal_product_names import AnimalProduct from ..strings.artisan_good_names import ArtisanGood from ..strings.craftable_names import ModEdible, Edible from ..strings.crop_names import Fruit, Vegetable, SVEFruit, DistantLandsCrop from ..strings.fish_names import Fish, SVEFish, WaterItem, DistantLandsFish, SVEWaterItem from ..strings.flower_names import Flower -from ..strings.forageable_names import Forageable, SVEForage, DistantLandsForageable, Mushroom -from ..strings.ingredient_names import Ingredient from ..strings.food_names import Meal, SVEMeal, Beverage, DistantLandsMeal, BoardingHouseMeal, ArchaeologyMeal, TrashyMeal +from ..strings.forageable_names import Forageable, SVEForage, Mushroom +from ..strings.ingredient_names import Ingredient from ..strings.material_names import Material from ..strings.metal_names import Fossil, Artifact from ..strings.monster_drop_names import Loot @@ -45,7 +46,8 @@ def friendship_recipe(name: str, friend: str, hearts: int, ingredients: Dict[str return create_recipe(name, ingredients, source, mod_name) -def friendship_and_shop_recipe(name: str, friend: str, hearts: int, region: str, price: int, ingredients: Dict[str, int], mod_name: Optional[str] = None) -> CookingRecipe: +def friendship_and_shop_recipe(name: str, friend: str, hearts: int, region: str, price: int, ingredients: Dict[str, int], + mod_name: Optional[str] = None) -> CookingRecipe: source = ShopFriendshipSource(friend, hearts, region, price) return create_recipe(name, ingredients, source, mod_name) @@ -85,7 +87,8 @@ algae_soup = friendship_recipe(Meal.algae_soup, NPC.clint, 3, {WaterItem.green_a artichoke_dip = queen_of_sauce_recipe(Meal.artichoke_dip, 1, Season.fall, 28, {Vegetable.artichoke: 1, AnimalProduct.cow_milk: 1}) autumn_bounty = friendship_recipe(Meal.autumn_bounty, NPC.demetrius, 7, {Vegetable.yam: 1, Vegetable.pumpkin: 1}) baked_fish = queen_of_sauce_recipe(Meal.baked_fish, 1, Season.summer, 7, {Fish.sunfish: 1, Fish.bream: 1, Ingredient.wheat_flour: 1}) -banana_pudding = shop_trade_recipe(Meal.banana_pudding, Region.island_trader, Fossil.bone_fragment, 30, {Fruit.banana: 1, AnimalProduct.cow_milk: 1, Ingredient.sugar: 1}) +banana_pudding = shop_trade_recipe(Meal.banana_pudding, Region.island_trader, Fossil.bone_fragment, 30, + {Fruit.banana: 1, AnimalProduct.cow_milk: 1, Ingredient.sugar: 1}) bean_hotpot = friendship_recipe(Meal.bean_hotpot, NPC.clint, 7, {Vegetable.green_bean: 2}) blackberry_cobbler_ingredients = {Forageable.blackberry: 2, Ingredient.sugar: 1, Ingredient.wheat_flour: 1} blackberry_cobbler_qos = queen_of_sauce_recipe(Meal.blackberry_cobbler, 2, Season.fall, 14, blackberry_cobbler_ingredients) @@ -181,21 +184,23 @@ vegetable_medley = friendship_recipe(Meal.vegetable_medley, NPC.caroline, 7, {Ve magic_elixir = shop_recipe(ModEdible.magic_elixir, Region.adventurer_guild, 3000, {Edible.life_elixir: 1, Mushroom.purple: 1}, ModNames.magic) baked_berry_oatmeal = shop_recipe(SVEMeal.baked_berry_oatmeal, SVERegion.bear_shop, 0, {Forageable.salmonberry: 15, Forageable.blackberry: 15, - Ingredient.sugar: 1, Ingredient.wheat_flour: 2}, ModNames.sve) + Ingredient.sugar: 1, Ingredient.wheat_flour: 2}, ModNames.sve) big_bark_burger = friendship_and_shop_recipe(SVEMeal.big_bark_burger, NPC.gus, 5, Region.saloon, 5500, {SVEFish.puppyfish: 1, Meal.bread: 1, Ingredient.oil: 1}, ModNames.sve) flower_cookie = shop_recipe(SVEMeal.flower_cookie, SVERegion.bear_shop, 0, {SVEForage.ferngill_primrose: 1, SVEForage.goldenrod: 1, - SVEForage.winter_star_rose: 1, Ingredient.wheat_flour: 1, Ingredient.sugar: 1, - AnimalProduct.large_egg: 1}, ModNames.sve) + SVEForage.winter_star_rose: 1, Ingredient.wheat_flour: 1, Ingredient.sugar: 1, + AnimalProduct.large_egg: 1}, ModNames.sve) frog_legs = shop_recipe(SVEMeal.frog_legs, Region.adventurer_guild, 2000, {SVEFish.frog: 1, Ingredient.oil: 1, Ingredient.wheat_flour: 1}, ModNames.sve) glazed_butterfish = friendship_and_shop_recipe(SVEMeal.glazed_butterfish, NPC.gus, 10, Region.saloon, 4000, {SVEFish.butterfish: 1, Ingredient.wheat_flour: 1, Ingredient.oil: 1}, ModNames.sve) mixed_berry_pie = shop_recipe(SVEMeal.mixed_berry_pie, Region.saloon, 3500, {Fruit.strawberry: 6, SVEFruit.salal_berry: 6, Forageable.blackberry: 6, SVEForage.bearberry: 6, Ingredient.sugar: 1, Ingredient.wheat_flour: 1}, ModNames.sve) -mushroom_berry_rice = friendship_and_shop_recipe(SVEMeal.mushroom_berry_rice, ModNPC.marlon, 6, Region.adventurer_guild, 1500, {SVEForage.poison_mushroom: 3, SVEForage.red_baneberry: 10, - Ingredient.rice: 1, Ingredient.sugar: 2}, ModNames.sve) -seaweed_salad = shop_recipe(SVEMeal.seaweed_salad, Region.fish_shop, 1250, {SVEWaterItem.dulse_seaweed: 2, WaterItem.seaweed: 2, Ingredient.oil: 1}, ModNames.sve) +mushroom_berry_rice = friendship_and_shop_recipe(SVEMeal.mushroom_berry_rice, ModNPC.marlon, 6, Region.adventurer_guild, 1500, + {SVEForage.poison_mushroom: 3, SVEForage.red_baneberry: 10, Ingredient.rice: 1, Ingredient.sugar: 2}, + ModNames.sve) +seaweed_salad = shop_recipe(SVEMeal.seaweed_salad, Region.fish_shop, 1250, {SVEWaterItem.dulse_seaweed: 2, WaterItem.seaweed: 2, Ingredient.oil: 1}, + ModNames.sve) void_delight = friendship_and_shop_recipe(SVEMeal.void_delight, NPC.krobus, 10, Region.sewer, 5000, {SVEFish.void_eel: 1, Loot.void_essence: 50, Loot.solar_essence: 20}, ModNames.sve) void_salmon_sushi = friendship_and_shop_recipe(SVEMeal.void_salmon_sushi, NPC.krobus, 10, Region.sewer, 5000, @@ -205,17 +210,22 @@ mushroom_kebab = friendship_recipe(DistantLandsMeal.mushroom_kebab, ModNPC.gobli Mushroom.red: 1, Material.wood: 1}, ModNames.distant_lands) void_mint_tea = friendship_recipe(DistantLandsMeal.void_mint_tea, ModNPC.goblin, 4, {DistantLandsCrop.void_mint: 1}, ModNames.distant_lands) crayfish_soup = friendship_recipe(DistantLandsMeal.crayfish_soup, ModNPC.goblin, 6, {Forageable.cave_carrot: 1, Fish.crayfish: 1, - DistantLandsFish.purple_algae: 1, WaterItem.white_algae: 1}, ModNames.distant_lands) + DistantLandsFish.purple_algae: 1, WaterItem.white_algae: 1}, + ModNames.distant_lands) pemmican = friendship_recipe(DistantLandsMeal.pemmican, ModNPC.goblin, 8, {Loot.bug_meat: 1, Fish.any: 1, Forageable.salmonberry: 3, Material.stone: 2}, ModNames.distant_lands) special_pumpkin_soup = friendship_recipe(BoardingHouseMeal.special_pumpkin_soup, ModNPC.joel, 6, {Vegetable.pumpkin: 2, AnimalProduct.large_goat_milk: 1, Vegetable.garlic: 1}, ModNames.boarding_house) -diggers_delight = skill_recipe(ArchaeologyMeal.diggers_delight, ModSkill.archaeology, 3, {Forageable.cave_carrot: 2, Ingredient.sugar: 1, AnimalProduct.milk: 1}, ModNames.archaeology) -rocky_root = skill_recipe(ArchaeologyMeal.rocky_root, ModSkill.archaeology, 7, {Forageable.cave_carrot: 3, Seed.coffee: 1, Material.stone: 1}, ModNames.archaeology) -ancient_jello = skill_recipe(ArchaeologyMeal.ancient_jello, ModSkill.archaeology, 9, {WaterItem.cave_jelly: 6, Ingredient.sugar: 5, AnimalProduct.egg: 1, AnimalProduct.milk: 1, Artifact.chipped_amphora: 1}, ModNames.archaeology) +diggers_delight = skill_recipe(ArchaeologyMeal.diggers_delight, ModSkill.archaeology, 3, + {Forageable.cave_carrot: 2, Ingredient.sugar: 1, AnimalProduct.milk: 1}, ModNames.archaeology) +rocky_root = skill_recipe(ArchaeologyMeal.rocky_root, ModSkill.archaeology, 7, {Forageable.cave_carrot: 3, Seed.coffee: 1, Material.stone: 1}, + ModNames.archaeology) +ancient_jello = skill_recipe(ArchaeologyMeal.ancient_jello, ModSkill.archaeology, 9, + {WaterItem.cave_jelly: 6, Ingredient.sugar: 5, AnimalProduct.egg: 1, AnimalProduct.milk: 1, Artifact.chipped_amphora: 1}, + ModNames.archaeology) grilled_cheese = skill_recipe(TrashyMeal.grilled_cheese, ModSkill.binning, 1, {Meal.bread: 1, ArtisanGood.cheese: 1}, ModNames.binning_skill) fish_casserole = skill_recipe(TrashyMeal.fish_casserole, ModSkill.binning, 8, {Fish.any: 1, AnimalProduct.milk: 1, Vegetable.carrot: 1}, ModNames.binning_skill) -all_cooking_recipes_by_name = {recipe.meal: recipe for recipe in all_cooking_recipes} \ No newline at end of file +all_cooking_recipes_by_name = {recipe.meal: recipe for recipe in all_cooking_recipes} diff --git a/worlds/stardew_valley/data/recipe_source.py b/worlds/stardew_valley/data/recipe_source.py index ead4d62f16..bc8c09ee92 100644 --- a/worlds/stardew_valley/data/recipe_source.py +++ b/worlds/stardew_valley/data/recipe_source.py @@ -106,7 +106,7 @@ class MasterySource(RecipeSource): self.skill = skill def __repr__(self): - return f"MasterySource at level {self.level} {self.skill}" + return f"MasterySource {self.skill}" class ShopSource(RecipeSource): diff --git a/worlds/stardew_valley/logic/ability_logic.py b/worlds/stardew_valley/logic/ability_logic.py index add99a2c2e..2038d995a7 100644 --- a/worlds/stardew_valley/logic/ability_logic.py +++ b/worlds/stardew_valley/logic/ability_logic.py @@ -1,7 +1,7 @@ +import typing from typing import Union from .base_logic import BaseLogicMixin, BaseLogic -from .cooking_logic import CookingLogicMixin from .mine_logic import MineLogicMixin from .received_logic import ReceivedLogicMixin from .region_logic import RegionLogicMixin @@ -13,6 +13,11 @@ from ..strings.region_names import Region from ..strings.skill_names import Skill, ModSkill from ..strings.tool_names import ToolMaterial, Tool +if typing.TYPE_CHECKING: + from ..mods.logic.mod_logic import ModLogicMixin +else: + ModLogicMixin = object + class AbilityLogicMixin(BaseLogicMixin): def __init__(self, *args, **kwargs): @@ -20,7 +25,8 @@ class AbilityLogicMixin(BaseLogicMixin): self.ability = AbilityLogic(*args, **kwargs) -class AbilityLogic(BaseLogic[Union[AbilityLogicMixin, RegionLogicMixin, ReceivedLogicMixin, ToolLogicMixin, SkillLogicMixin, MineLogicMixin, MagicLogicMixin]]): +class AbilityLogic(BaseLogic[Union[AbilityLogicMixin, RegionLogicMixin, ReceivedLogicMixin, ToolLogicMixin, SkillLogicMixin, MineLogicMixin, MagicLogicMixin, +ModLogicMixin]]): def can_mine_perfectly(self) -> StardewRule: return self.logic.mine.can_progress_in_the_mines_from_floor(160) diff --git a/worlds/stardew_valley/logic/action_logic.py b/worlds/stardew_valley/logic/action_logic.py index dc5deda427..5b117de68c 100644 --- a/worlds/stardew_valley/logic/action_logic.py +++ b/worlds/stardew_valley/logic/action_logic.py @@ -6,7 +6,6 @@ from .has_logic import HasLogicMixin from .received_logic import ReceivedLogicMixin from .region_logic import RegionLogicMixin from .tool_logic import ToolLogicMixin -from ..options import ToolProgression from ..stardew_rule import StardewRule, True_ from ..strings.generic_names import Generic from ..strings.geode_names import Geode diff --git a/worlds/stardew_valley/logic/skill_logic.py b/worlds/stardew_valley/logic/skill_logic.py index bc2f6cb126..6d0cd11baf 100644 --- a/worlds/stardew_valley/logic/skill_logic.py +++ b/worlds/stardew_valley/logic/skill_logic.py @@ -1,3 +1,4 @@ +import typing from functools import cached_property from typing import Union, Tuple @@ -24,6 +25,11 @@ from ..strings.skill_names import Skill, all_mod_skills, all_vanilla_skills from ..strings.tool_names import ToolMaterial, Tool from ..strings.wallet_item_names import Wallet +if typing.TYPE_CHECKING: + from ..mods.logic.mod_logic import ModLogicMixin +else: + ModLogicMixin = object + fishing_regions = (Region.beach, Region.town, Region.forest, Region.mountain, Region.island_south, Region.island_west) vanilla_skill_items = ("Farming Level", "Mining Level", "Foraging Level", "Fishing Level", "Combat Level") @@ -35,7 +41,7 @@ class SkillLogicMixin(BaseLogicMixin): class SkillLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, RegionLogicMixin, SeasonLogicMixin, TimeLogicMixin, ToolLogicMixin, SkillLogicMixin, -CombatLogicMixin, MagicLogicMixin, HarvestingLogicMixin]]): +CombatLogicMixin, MagicLogicMixin, HarvestingLogicMixin, ModLogicMixin]]): # Should be cached def can_earn_level(self, skill: str, level: int) -> StardewRule: diff --git a/worlds/stardew_valley/mods/logic/item_logic.py b/worlds/stardew_valley/mods/logic/item_logic.py index ef5eab0134..12e824d212 100644 --- a/worlds/stardew_valley/mods/logic/item_logic.py +++ b/worlds/stardew_valley/mods/logic/item_logic.py @@ -2,7 +2,6 @@ from typing import Dict, Union from ..mod_data import ModNames from ... import options -from ...data.craftable_data import all_crafting_recipes_by_name from ...logic.base_logic import BaseLogicMixin, BaseLogic from ...logic.combat_logic import CombatLogicMixin from ...logic.cooking_logic import CookingLogicMixin @@ -20,11 +19,9 @@ from ...logic.season_logic import SeasonLogicMixin from ...logic.skill_logic import SkillLogicMixin from ...logic.time_logic import TimeLogicMixin from ...logic.tool_logic import ToolLogicMixin -from ...options import Cropsanity -from ...stardew_rule import StardewRule, True_ +from ...stardew_rule import StardewRule from ...strings.artisan_good_names import ModArtisanGood -from ...strings.craftable_names import ModCraftable, ModMachine -from ...strings.fish_names import ModTrash +from ...strings.craftable_names import ModCraftable from ...strings.ingredient_names import Ingredient from ...strings.material_names import Material from ...strings.metal_names import all_fossils, all_artifacts, Ore, ModFossil diff --git a/worlds/stardew_valley/mods/logic/quests_logic.py b/worlds/stardew_valley/mods/logic/quests_logic.py index 1aa71404ae..2ff7452394 100644 --- a/worlds/stardew_valley/mods/logic/quests_logic.py +++ b/worlds/stardew_valley/mods/logic/quests_logic.py @@ -3,8 +3,8 @@ from typing import Dict, Union from ..mod_data import ModNames from ...logic.base_logic import BaseLogic, BaseLogicMixin from ...logic.has_logic import HasLogicMixin -from ...logic.quest_logic import QuestLogicMixin from ...logic.monster_logic import MonsterLogicMixin +from ...logic.quest_logic import QuestLogicMixin from ...logic.received_logic import ReceivedLogicMixin from ...logic.region_logic import RegionLogicMixin from ...logic.relationship_logic import RelationshipLogicMixin @@ -16,7 +16,6 @@ from ...strings.artisan_good_names import ArtisanGood from ...strings.crop_names import Fruit, SVEFruit, SVEVegetable, Vegetable from ...strings.fertilizer_names import Fertilizer from ...strings.food_names import Meal, Beverage -from ...strings.forageable_names import SVEForage from ...strings.material_names import Material from ...strings.metal_names import Ore, MetalBar from ...strings.monster_drop_names import Loot, ModLoot @@ -35,7 +34,7 @@ class ModQuestLogicMixin(BaseLogicMixin): class ModQuestLogic(BaseLogic[Union[HasLogicMixin, QuestLogicMixin, ReceivedLogicMixin, RegionLogicMixin, - TimeLogicMixin, SeasonLogicMixin, RelationshipLogicMixin, MonsterLogicMixin]]): +TimeLogicMixin, SeasonLogicMixin, RelationshipLogicMixin, MonsterLogicMixin]]): def get_modded_quest_rules(self) -> Dict[str, StardewRule]: quests = dict() quests.update(self._get_juna_quest_rules()) diff --git a/worlds/stardew_valley/regions.py b/worlds/stardew_valley/regions.py index d59439a487..7a680d5faa 100644 --- a/worlds/stardew_valley/regions.py +++ b/worlds/stardew_valley/regions.py @@ -7,7 +7,7 @@ from .mods.mod_regions import ModDataList, vanilla_connections_to_remove_by_mod from .options import EntranceRandomization, ExcludeGingerIsland, StardewValleyOptions from .region_classes import RegionData, ConnectionData, RandomizationFlag, ModificationFlag from .strings.entrance_names import Entrance, LogicEntrance -from .strings.region_names import Region, LogicRegion +from .strings.region_names import Region as RegionName, LogicRegion class RegionFactory(Protocol): @@ -16,192 +16,192 @@ class RegionFactory(Protocol): vanilla_regions = [ - RegionData(Region.menu, [Entrance.to_stardew_valley]), - RegionData(Region.stardew_valley, [Entrance.to_farmhouse]), - RegionData(Region.farm_house, + RegionData(RegionName.menu, [Entrance.to_stardew_valley]), + RegionData(RegionName.stardew_valley, [Entrance.to_farmhouse]), + RegionData(RegionName.farm_house, [Entrance.farmhouse_to_farm, Entrance.downstairs_to_cellar, LogicEntrance.farmhouse_cooking, LogicEntrance.watch_queen_of_sauce]), - RegionData(Region.cellar), - RegionData(Region.farm, + RegionData(RegionName.cellar), + RegionData(RegionName.farm, [Entrance.farm_to_backwoods, Entrance.farm_to_bus_stop, Entrance.farm_to_forest, Entrance.farm_to_farmcave, Entrance.enter_greenhouse, Entrance.enter_coop, Entrance.enter_barn, Entrance.enter_shed, Entrance.enter_slime_hutch, LogicEntrance.grow_spring_crops, LogicEntrance.grow_summer_crops, LogicEntrance.grow_fall_crops, LogicEntrance.grow_winter_crops, LogicEntrance.shipping]), - RegionData(Region.backwoods, [Entrance.backwoods_to_mountain]), - RegionData(Region.bus_stop, + RegionData(RegionName.backwoods, [Entrance.backwoods_to_mountain]), + RegionData(RegionName.bus_stop, [Entrance.bus_stop_to_town, Entrance.take_bus_to_desert, Entrance.bus_stop_to_tunnel_entrance]), - RegionData(Region.forest, + RegionData(RegionName.forest, [Entrance.forest_to_town, Entrance.enter_secret_woods, Entrance.forest_to_wizard_tower, Entrance.forest_to_marnie_ranch, Entrance.forest_to_leah_cottage, Entrance.forest_to_sewer, Entrance.forest_to_mastery_cave, LogicEntrance.buy_from_traveling_merchant, LogicEntrance.complete_raccoon_requests, LogicEntrance.fish_in_waterfall, LogicEntrance.attend_flower_dance, LogicEntrance.attend_trout_derby, LogicEntrance.attend_festival_of_ice]), RegionData(LogicRegion.forest_waterfall), - RegionData(Region.farm_cave), - RegionData(Region.greenhouse, + RegionData(RegionName.farm_cave), + RegionData(RegionName.greenhouse, [LogicEntrance.grow_spring_crops_in_greenhouse, LogicEntrance.grow_summer_crops_in_greenhouse, LogicEntrance.grow_fall_crops_in_greenhouse, LogicEntrance.grow_winter_crops_in_greenhouse, LogicEntrance.grow_indoor_crops_in_greenhouse]), - RegionData(Region.mountain, + RegionData(RegionName.mountain, [Entrance.mountain_to_railroad, Entrance.mountain_to_tent, Entrance.mountain_to_carpenter_shop, Entrance.mountain_to_the_mines, Entrance.enter_quarry, Entrance.mountain_to_adventurer_guild, Entrance.mountain_to_town, Entrance.mountain_to_maru_room, Entrance.mountain_to_leo_treehouse]), - RegionData(Region.leo_treehouse, is_ginger_island=True), - RegionData(Region.maru_room), - RegionData(Region.tunnel_entrance, [Entrance.tunnel_entrance_to_bus_tunnel]), - RegionData(Region.bus_tunnel), - RegionData(Region.town, + RegionData(RegionName.leo_treehouse, is_ginger_island=True), + RegionData(RegionName.maru_room), + RegionData(RegionName.tunnel_entrance, [Entrance.tunnel_entrance_to_bus_tunnel]), + RegionData(RegionName.bus_tunnel), + RegionData(RegionName.town, [Entrance.town_to_community_center, Entrance.town_to_beach, Entrance.town_to_hospital, Entrance.town_to_pierre_general_store, Entrance.town_to_saloon, Entrance.town_to_alex_house, Entrance.town_to_trailer, Entrance.town_to_mayor_manor, Entrance.town_to_sam_house, Entrance.town_to_haley_house, Entrance.town_to_sewer, Entrance.town_to_clint_blacksmith, Entrance.town_to_museum, Entrance.town_to_jojamart, Entrance.purchase_movie_ticket, LogicEntrance.buy_experience_books, LogicEntrance.attend_egg_festival, LogicEntrance.attend_fair, LogicEntrance.attend_spirit_eve, LogicEntrance.attend_winter_star]), - RegionData(Region.beach, + RegionData(RegionName.beach, [Entrance.beach_to_willy_fish_shop, Entrance.enter_elliott_house, Entrance.enter_tide_pools, LogicEntrance.fishing, LogicEntrance.attend_luau, LogicEntrance.attend_moonlight_jellies, LogicEntrance.attend_night_market, LogicEntrance.attend_squidfest]), - RegionData(Region.railroad, [Entrance.enter_bathhouse_entrance, Entrance.enter_witch_warp_cave]), - RegionData(Region.ranch), - RegionData(Region.leah_house), - RegionData(Region.mastery_cave), - RegionData(Region.sewer, [Entrance.enter_mutant_bug_lair]), - RegionData(Region.mutant_bug_lair), - RegionData(Region.wizard_tower, [Entrance.enter_wizard_basement, Entrance.use_desert_obelisk, Entrance.use_island_obelisk]), - RegionData(Region.wizard_basement), - RegionData(Region.tent), - RegionData(Region.carpenter, [Entrance.enter_sebastian_room]), - RegionData(Region.sebastian_room), - RegionData(Region.adventurer_guild, [Entrance.adventurer_guild_to_bedroom]), - RegionData(Region.adventurer_guild_bedroom), - RegionData(Region.community_center, + RegionData(RegionName.railroad, [Entrance.enter_bathhouse_entrance, Entrance.enter_witch_warp_cave]), + RegionData(RegionName.ranch), + RegionData(RegionName.leah_house), + RegionData(RegionName.mastery_cave), + RegionData(RegionName.sewer, [Entrance.enter_mutant_bug_lair]), + RegionData(RegionName.mutant_bug_lair), + RegionData(RegionName.wizard_tower, [Entrance.enter_wizard_basement, Entrance.use_desert_obelisk, Entrance.use_island_obelisk]), + RegionData(RegionName.wizard_basement), + RegionData(RegionName.tent), + RegionData(RegionName.carpenter, [Entrance.enter_sebastian_room]), + RegionData(RegionName.sebastian_room), + RegionData(RegionName.adventurer_guild, [Entrance.adventurer_guild_to_bedroom]), + RegionData(RegionName.adventurer_guild_bedroom), + RegionData(RegionName.community_center, [Entrance.access_crafts_room, Entrance.access_pantry, Entrance.access_fish_tank, Entrance.access_boiler_room, Entrance.access_bulletin_board, Entrance.access_vault]), - RegionData(Region.crafts_room), - RegionData(Region.pantry), - RegionData(Region.fish_tank), - RegionData(Region.boiler_room), - RegionData(Region.bulletin_board), - RegionData(Region.vault), - RegionData(Region.hospital, [Entrance.enter_harvey_room]), - RegionData(Region.harvey_room), - RegionData(Region.pierre_store, [Entrance.enter_sunroom]), - RegionData(Region.sunroom), - RegionData(Region.saloon, [Entrance.play_journey_of_the_prairie_king, Entrance.play_junimo_kart]), - RegionData(Region.jotpk_world_1, [Entrance.reach_jotpk_world_2]), - RegionData(Region.jotpk_world_2, [Entrance.reach_jotpk_world_3]), - RegionData(Region.jotpk_world_3), - RegionData(Region.junimo_kart_1, [Entrance.reach_junimo_kart_2]), - RegionData(Region.junimo_kart_2, [Entrance.reach_junimo_kart_3]), - RegionData(Region.junimo_kart_3, [Entrance.reach_junimo_kart_4]), - RegionData(Region.junimo_kart_4), - RegionData(Region.alex_house), - RegionData(Region.trailer), - RegionData(Region.mayor_house), - RegionData(Region.sam_house), - RegionData(Region.haley_house), - RegionData(Region.blacksmith, [LogicEntrance.blacksmith_copper]), - RegionData(Region.museum), - RegionData(Region.jojamart, [Entrance.enter_abandoned_jojamart]), - RegionData(Region.abandoned_jojamart, [Entrance.enter_movie_theater]), - RegionData(Region.movie_ticket_stand), - RegionData(Region.movie_theater), - RegionData(Region.fish_shop, [Entrance.fish_shop_to_boat_tunnel]), - RegionData(Region.boat_tunnel, [Entrance.boat_to_ginger_island], is_ginger_island=True), - RegionData(Region.elliott_house), - RegionData(Region.tide_pools), - RegionData(Region.bathhouse_entrance, [Entrance.enter_locker_room]), - RegionData(Region.locker_room, [Entrance.enter_public_bath]), - RegionData(Region.public_bath), - RegionData(Region.witch_warp_cave, [Entrance.enter_witch_swamp]), - RegionData(Region.witch_swamp, [Entrance.enter_witch_hut]), - RegionData(Region.witch_hut, [Entrance.witch_warp_to_wizard_basement]), - RegionData(Region.quarry, [Entrance.enter_quarry_mine_entrance]), - RegionData(Region.quarry_mine_entrance, [Entrance.enter_quarry_mine]), - RegionData(Region.quarry_mine), - RegionData(Region.secret_woods), - RegionData(Region.desert, [Entrance.enter_skull_cavern_entrance, Entrance.enter_oasis, LogicEntrance.attend_desert_festival]), - RegionData(Region.oasis, [Entrance.enter_casino]), - RegionData(Region.casino), - RegionData(Region.skull_cavern_entrance, [Entrance.enter_skull_cavern]), - RegionData(Region.skull_cavern, [Entrance.mine_to_skull_cavern_floor_25]), - RegionData(Region.skull_cavern_25, [Entrance.mine_to_skull_cavern_floor_50]), - RegionData(Region.skull_cavern_50, [Entrance.mine_to_skull_cavern_floor_75]), - RegionData(Region.skull_cavern_75, [Entrance.mine_to_skull_cavern_floor_100]), - RegionData(Region.skull_cavern_100, [Entrance.mine_to_skull_cavern_floor_125]), - RegionData(Region.skull_cavern_125, [Entrance.mine_to_skull_cavern_floor_150]), - RegionData(Region.skull_cavern_150, [Entrance.mine_to_skull_cavern_floor_175]), - RegionData(Region.skull_cavern_175, [Entrance.mine_to_skull_cavern_floor_200]), - RegionData(Region.skull_cavern_200, [Entrance.enter_dangerous_skull_cavern]), - RegionData(Region.dangerous_skull_cavern, is_ginger_island=True), - RegionData(Region.island_south, + RegionData(RegionName.crafts_room), + RegionData(RegionName.pantry), + RegionData(RegionName.fish_tank), + RegionData(RegionName.boiler_room), + RegionData(RegionName.bulletin_board), + RegionData(RegionName.vault), + RegionData(RegionName.hospital, [Entrance.enter_harvey_room]), + RegionData(RegionName.harvey_room), + RegionData(RegionName.pierre_store, [Entrance.enter_sunroom]), + RegionData(RegionName.sunroom), + RegionData(RegionName.saloon, [Entrance.play_journey_of_the_prairie_king, Entrance.play_junimo_kart]), + RegionData(RegionName.jotpk_world_1, [Entrance.reach_jotpk_world_2]), + RegionData(RegionName.jotpk_world_2, [Entrance.reach_jotpk_world_3]), + RegionData(RegionName.jotpk_world_3), + RegionData(RegionName.junimo_kart_1, [Entrance.reach_junimo_kart_2]), + RegionData(RegionName.junimo_kart_2, [Entrance.reach_junimo_kart_3]), + RegionData(RegionName.junimo_kart_3, [Entrance.reach_junimo_kart_4]), + RegionData(RegionName.junimo_kart_4), + RegionData(RegionName.alex_house), + RegionData(RegionName.trailer), + RegionData(RegionName.mayor_house), + RegionData(RegionName.sam_house), + RegionData(RegionName.haley_house), + RegionData(RegionName.blacksmith, [LogicEntrance.blacksmith_copper]), + RegionData(RegionName.museum), + RegionData(RegionName.jojamart, [Entrance.enter_abandoned_jojamart]), + RegionData(RegionName.abandoned_jojamart, [Entrance.enter_movie_theater]), + RegionData(RegionName.movie_ticket_stand), + RegionData(RegionName.movie_theater), + RegionData(RegionName.fish_shop, [Entrance.fish_shop_to_boat_tunnel]), + RegionData(RegionName.boat_tunnel, [Entrance.boat_to_ginger_island], is_ginger_island=True), + RegionData(RegionName.elliott_house), + RegionData(RegionName.tide_pools), + RegionData(RegionName.bathhouse_entrance, [Entrance.enter_locker_room]), + RegionData(RegionName.locker_room, [Entrance.enter_public_bath]), + RegionData(RegionName.public_bath), + RegionData(RegionName.witch_warp_cave, [Entrance.enter_witch_swamp]), + RegionData(RegionName.witch_swamp, [Entrance.enter_witch_hut]), + RegionData(RegionName.witch_hut, [Entrance.witch_warp_to_wizard_basement]), + RegionData(RegionName.quarry, [Entrance.enter_quarry_mine_entrance]), + RegionData(RegionName.quarry_mine_entrance, [Entrance.enter_quarry_mine]), + RegionData(RegionName.quarry_mine), + RegionData(RegionName.secret_woods), + RegionData(RegionName.desert, [Entrance.enter_skull_cavern_entrance, Entrance.enter_oasis, LogicEntrance.attend_desert_festival]), + RegionData(RegionName.oasis, [Entrance.enter_casino]), + RegionData(RegionName.casino), + RegionData(RegionName.skull_cavern_entrance, [Entrance.enter_skull_cavern]), + RegionData(RegionName.skull_cavern, [Entrance.mine_to_skull_cavern_floor_25]), + RegionData(RegionName.skull_cavern_25, [Entrance.mine_to_skull_cavern_floor_50]), + RegionData(RegionName.skull_cavern_50, [Entrance.mine_to_skull_cavern_floor_75]), + RegionData(RegionName.skull_cavern_75, [Entrance.mine_to_skull_cavern_floor_100]), + RegionData(RegionName.skull_cavern_100, [Entrance.mine_to_skull_cavern_floor_125]), + RegionData(RegionName.skull_cavern_125, [Entrance.mine_to_skull_cavern_floor_150]), + RegionData(RegionName.skull_cavern_150, [Entrance.mine_to_skull_cavern_floor_175]), + RegionData(RegionName.skull_cavern_175, [Entrance.mine_to_skull_cavern_floor_200]), + RegionData(RegionName.skull_cavern_200, [Entrance.enter_dangerous_skull_cavern]), + RegionData(RegionName.dangerous_skull_cavern, is_ginger_island=True), + RegionData(RegionName.island_south, [Entrance.island_south_to_west, Entrance.island_south_to_north, Entrance.island_south_to_east, Entrance.island_south_to_southeast, Entrance.use_island_resort, Entrance.parrot_express_docks_to_volcano, Entrance.parrot_express_docks_to_dig_site, Entrance.parrot_express_docks_to_jungle], is_ginger_island=True), - RegionData(Region.island_resort, is_ginger_island=True), - RegionData(Region.island_west, + RegionData(RegionName.island_resort, is_ginger_island=True), + RegionData(RegionName.island_west, [Entrance.island_west_to_islandfarmhouse, Entrance.island_west_to_gourmand_cave, Entrance.island_west_to_crystals_cave, Entrance.island_west_to_shipwreck, Entrance.island_west_to_qi_walnut_room, Entrance.use_farm_obelisk, Entrance.parrot_express_jungle_to_docks, Entrance.parrot_express_jungle_to_dig_site, Entrance.parrot_express_jungle_to_volcano, LogicEntrance.grow_spring_crops_on_island, LogicEntrance.grow_summer_crops_on_island, LogicEntrance.grow_fall_crops_on_island, LogicEntrance.grow_winter_crops_on_island, LogicEntrance.grow_indoor_crops_on_island], is_ginger_island=True), - RegionData(Region.island_east, [Entrance.island_east_to_leo_hut, Entrance.island_east_to_island_shrine], is_ginger_island=True), - RegionData(Region.island_shrine, is_ginger_island=True), - RegionData(Region.island_south_east, [Entrance.island_southeast_to_pirate_cove], is_ginger_island=True), - RegionData(Region.island_north, + RegionData(RegionName.island_east, [Entrance.island_east_to_leo_hut, Entrance.island_east_to_island_shrine], is_ginger_island=True), + RegionData(RegionName.island_shrine, is_ginger_island=True), + RegionData(RegionName.island_south_east, [Entrance.island_southeast_to_pirate_cove], is_ginger_island=True), + RegionData(RegionName.island_north, [Entrance.talk_to_island_trader, Entrance.island_north_to_field_office, Entrance.island_north_to_dig_site, Entrance.island_north_to_volcano, Entrance.parrot_express_volcano_to_dig_site, Entrance.parrot_express_volcano_to_jungle, Entrance.parrot_express_volcano_to_docks], is_ginger_island=True), - RegionData(Region.volcano, [Entrance.climb_to_volcano_5, Entrance.volcano_to_secret_beach], is_ginger_island=True), - RegionData(Region.volcano_secret_beach, is_ginger_island=True), - RegionData(Region.volcano_floor_5, [Entrance.talk_to_volcano_dwarf, Entrance.climb_to_volcano_10], is_ginger_island=True), - RegionData(Region.volcano_dwarf_shop, is_ginger_island=True), - RegionData(Region.volcano_floor_10, is_ginger_island=True), - RegionData(Region.island_trader, is_ginger_island=True), - RegionData(Region.island_farmhouse, [LogicEntrance.island_cooking], is_ginger_island=True), - RegionData(Region.gourmand_frog_cave, is_ginger_island=True), - RegionData(Region.colored_crystals_cave, is_ginger_island=True), - RegionData(Region.shipwreck, is_ginger_island=True), - RegionData(Region.qi_walnut_room, is_ginger_island=True), - RegionData(Region.leo_hut, is_ginger_island=True), - RegionData(Region.pirate_cove, is_ginger_island=True), - RegionData(Region.field_office, is_ginger_island=True), - RegionData(Region.dig_site, + RegionData(RegionName.volcano, [Entrance.climb_to_volcano_5, Entrance.volcano_to_secret_beach], is_ginger_island=True), + RegionData(RegionName.volcano_secret_beach, is_ginger_island=True), + RegionData(RegionName.volcano_floor_5, [Entrance.talk_to_volcano_dwarf, Entrance.climb_to_volcano_10], is_ginger_island=True), + RegionData(RegionName.volcano_dwarf_shop, is_ginger_island=True), + RegionData(RegionName.volcano_floor_10, is_ginger_island=True), + RegionData(RegionName.island_trader, is_ginger_island=True), + RegionData(RegionName.island_farmhouse, [LogicEntrance.island_cooking], is_ginger_island=True), + RegionData(RegionName.gourmand_frog_cave, is_ginger_island=True), + RegionData(RegionName.colored_crystals_cave, is_ginger_island=True), + RegionData(RegionName.shipwreck, is_ginger_island=True), + RegionData(RegionName.qi_walnut_room, is_ginger_island=True), + RegionData(RegionName.leo_hut, is_ginger_island=True), + RegionData(RegionName.pirate_cove, is_ginger_island=True), + RegionData(RegionName.field_office, is_ginger_island=True), + RegionData(RegionName.dig_site, [Entrance.dig_site_to_professor_snail_cave, Entrance.parrot_express_dig_site_to_volcano, Entrance.parrot_express_dig_site_to_docks, Entrance.parrot_express_dig_site_to_jungle], is_ginger_island=True), - RegionData(Region.professor_snail_cave, is_ginger_island=True), - RegionData(Region.coop), - RegionData(Region.barn), - RegionData(Region.shed), - RegionData(Region.slime_hutch), + RegionData(RegionName.professor_snail_cave, is_ginger_island=True), + RegionData(RegionName.coop), + RegionData(RegionName.barn), + RegionData(RegionName.shed), + RegionData(RegionName.slime_hutch), - RegionData(Region.mines, [LogicEntrance.talk_to_mines_dwarf, - Entrance.dig_to_mines_floor_5]), - RegionData(Region.mines_floor_5, [Entrance.dig_to_mines_floor_10]), - RegionData(Region.mines_floor_10, [Entrance.dig_to_mines_floor_15]), - RegionData(Region.mines_floor_15, [Entrance.dig_to_mines_floor_20]), - RegionData(Region.mines_floor_20, [Entrance.dig_to_mines_floor_25]), - RegionData(Region.mines_floor_25, [Entrance.dig_to_mines_floor_30]), - RegionData(Region.mines_floor_30, [Entrance.dig_to_mines_floor_35]), - RegionData(Region.mines_floor_35, [Entrance.dig_to_mines_floor_40]), - RegionData(Region.mines_floor_40, [Entrance.dig_to_mines_floor_45]), - RegionData(Region.mines_floor_45, [Entrance.dig_to_mines_floor_50]), - RegionData(Region.mines_floor_50, [Entrance.dig_to_mines_floor_55]), - RegionData(Region.mines_floor_55, [Entrance.dig_to_mines_floor_60]), - RegionData(Region.mines_floor_60, [Entrance.dig_to_mines_floor_65]), - RegionData(Region.mines_floor_65, [Entrance.dig_to_mines_floor_70]), - RegionData(Region.mines_floor_70, [Entrance.dig_to_mines_floor_75]), - RegionData(Region.mines_floor_75, [Entrance.dig_to_mines_floor_80]), - RegionData(Region.mines_floor_80, [Entrance.dig_to_mines_floor_85]), - RegionData(Region.mines_floor_85, [Entrance.dig_to_mines_floor_90]), - RegionData(Region.mines_floor_90, [Entrance.dig_to_mines_floor_95]), - RegionData(Region.mines_floor_95, [Entrance.dig_to_mines_floor_100]), - RegionData(Region.mines_floor_100, [Entrance.dig_to_mines_floor_105]), - RegionData(Region.mines_floor_105, [Entrance.dig_to_mines_floor_110]), - RegionData(Region.mines_floor_110, [Entrance.dig_to_mines_floor_115]), - RegionData(Region.mines_floor_115, [Entrance.dig_to_mines_floor_120]), - RegionData(Region.mines_floor_120, [Entrance.dig_to_dangerous_mines_20, Entrance.dig_to_dangerous_mines_60, Entrance.dig_to_dangerous_mines_100]), - RegionData(Region.dangerous_mines_20, is_ginger_island=True), - RegionData(Region.dangerous_mines_60, is_ginger_island=True), - RegionData(Region.dangerous_mines_100, is_ginger_island=True), + RegionData(RegionName.mines, [LogicEntrance.talk_to_mines_dwarf, + Entrance.dig_to_mines_floor_5]), + RegionData(RegionName.mines_floor_5, [Entrance.dig_to_mines_floor_10]), + RegionData(RegionName.mines_floor_10, [Entrance.dig_to_mines_floor_15]), + RegionData(RegionName.mines_floor_15, [Entrance.dig_to_mines_floor_20]), + RegionData(RegionName.mines_floor_20, [Entrance.dig_to_mines_floor_25]), + RegionData(RegionName.mines_floor_25, [Entrance.dig_to_mines_floor_30]), + RegionData(RegionName.mines_floor_30, [Entrance.dig_to_mines_floor_35]), + RegionData(RegionName.mines_floor_35, [Entrance.dig_to_mines_floor_40]), + RegionData(RegionName.mines_floor_40, [Entrance.dig_to_mines_floor_45]), + RegionData(RegionName.mines_floor_45, [Entrance.dig_to_mines_floor_50]), + RegionData(RegionName.mines_floor_50, [Entrance.dig_to_mines_floor_55]), + RegionData(RegionName.mines_floor_55, [Entrance.dig_to_mines_floor_60]), + RegionData(RegionName.mines_floor_60, [Entrance.dig_to_mines_floor_65]), + RegionData(RegionName.mines_floor_65, [Entrance.dig_to_mines_floor_70]), + RegionData(RegionName.mines_floor_70, [Entrance.dig_to_mines_floor_75]), + RegionData(RegionName.mines_floor_75, [Entrance.dig_to_mines_floor_80]), + RegionData(RegionName.mines_floor_80, [Entrance.dig_to_mines_floor_85]), + RegionData(RegionName.mines_floor_85, [Entrance.dig_to_mines_floor_90]), + RegionData(RegionName.mines_floor_90, [Entrance.dig_to_mines_floor_95]), + RegionData(RegionName.mines_floor_95, [Entrance.dig_to_mines_floor_100]), + RegionData(RegionName.mines_floor_100, [Entrance.dig_to_mines_floor_105]), + RegionData(RegionName.mines_floor_105, [Entrance.dig_to_mines_floor_110]), + RegionData(RegionName.mines_floor_110, [Entrance.dig_to_mines_floor_115]), + RegionData(RegionName.mines_floor_115, [Entrance.dig_to_mines_floor_120]), + RegionData(RegionName.mines_floor_120, [Entrance.dig_to_dangerous_mines_20, Entrance.dig_to_dangerous_mines_60, Entrance.dig_to_dangerous_mines_100]), + RegionData(RegionName.dangerous_mines_20, is_ginger_island=True), + RegionData(RegionName.dangerous_mines_60, is_ginger_island=True), + RegionData(RegionName.dangerous_mines_100, is_ginger_island=True), RegionData(LogicRegion.mines_dwarf_shop), RegionData(LogicRegion.blacksmith_copper, [LogicEntrance.blacksmith_iron]), @@ -256,206 +256,207 @@ vanilla_regions = [ # Exists and where they lead vanilla_connections = [ - ConnectionData(Entrance.to_stardew_valley, Region.stardew_valley), - ConnectionData(Entrance.to_farmhouse, Region.farm_house), - ConnectionData(Entrance.farmhouse_to_farm, Region.farm), - ConnectionData(Entrance.downstairs_to_cellar, Region.cellar), - ConnectionData(Entrance.farm_to_backwoods, Region.backwoods), - ConnectionData(Entrance.farm_to_bus_stop, Region.bus_stop), - ConnectionData(Entrance.farm_to_forest, Region.forest), - ConnectionData(Entrance.farm_to_farmcave, Region.farm_cave, flag=RandomizationFlag.NON_PROGRESSION), - ConnectionData(Entrance.enter_greenhouse, Region.greenhouse), - ConnectionData(Entrance.enter_coop, Region.coop), - ConnectionData(Entrance.enter_barn, Region.barn), - ConnectionData(Entrance.enter_shed, Region.shed), - ConnectionData(Entrance.enter_slime_hutch, Region.slime_hutch), - ConnectionData(Entrance.use_desert_obelisk, Region.desert), - ConnectionData(Entrance.use_island_obelisk, Region.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.use_farm_obelisk, Region.farm), - ConnectionData(Entrance.backwoods_to_mountain, Region.mountain), - ConnectionData(Entrance.bus_stop_to_town, Region.town), - ConnectionData(Entrance.bus_stop_to_tunnel_entrance, Region.tunnel_entrance), - ConnectionData(Entrance.tunnel_entrance_to_bus_tunnel, Region.bus_tunnel, flag=RandomizationFlag.NON_PROGRESSION), - ConnectionData(Entrance.take_bus_to_desert, Region.desert), - ConnectionData(Entrance.forest_to_town, Region.town), - ConnectionData(Entrance.forest_to_wizard_tower, Region.wizard_tower, + ConnectionData(Entrance.to_stardew_valley, RegionName.stardew_valley), + ConnectionData(Entrance.to_farmhouse, RegionName.farm_house), + ConnectionData(Entrance.farmhouse_to_farm, RegionName.farm), + ConnectionData(Entrance.downstairs_to_cellar, RegionName.cellar), + ConnectionData(Entrance.farm_to_backwoods, RegionName.backwoods), + ConnectionData(Entrance.farm_to_bus_stop, RegionName.bus_stop), + ConnectionData(Entrance.farm_to_forest, RegionName.forest), + ConnectionData(Entrance.farm_to_farmcave, RegionName.farm_cave, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(Entrance.enter_greenhouse, RegionName.greenhouse), + ConnectionData(Entrance.enter_coop, RegionName.coop), + ConnectionData(Entrance.enter_barn, RegionName.barn), + ConnectionData(Entrance.enter_shed, RegionName.shed), + ConnectionData(Entrance.enter_slime_hutch, RegionName.slime_hutch), + ConnectionData(Entrance.use_desert_obelisk, RegionName.desert), + ConnectionData(Entrance.use_island_obelisk, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.use_farm_obelisk, RegionName.farm), + ConnectionData(Entrance.backwoods_to_mountain, RegionName.mountain), + ConnectionData(Entrance.bus_stop_to_town, RegionName.town), + ConnectionData(Entrance.bus_stop_to_tunnel_entrance, RegionName.tunnel_entrance), + ConnectionData(Entrance.tunnel_entrance_to_bus_tunnel, RegionName.bus_tunnel, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(Entrance.take_bus_to_desert, RegionName.desert), + ConnectionData(Entrance.forest_to_town, RegionName.town), + ConnectionData(Entrance.forest_to_wizard_tower, RegionName.wizard_tower, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_wizard_basement, Region.wizard_basement, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.forest_to_marnie_ranch, Region.ranch, + ConnectionData(Entrance.enter_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.forest_to_marnie_ranch, RegionName.ranch, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.forest_to_leah_cottage, Region.leah_house, + ConnectionData(Entrance.forest_to_leah_cottage, RegionName.leah_house, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_secret_woods, Region.secret_woods), - ConnectionData(Entrance.forest_to_sewer, Region.sewer, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.forest_to_mastery_cave, Region.mastery_cave, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.MASTERIES), - ConnectionData(Entrance.town_to_sewer, Region.sewer, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_mutant_bug_lair, Region.mutant_bug_lair, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.mountain_to_railroad, Region.railroad), - ConnectionData(Entrance.mountain_to_tent, Region.tent, + ConnectionData(Entrance.enter_secret_woods, RegionName.secret_woods), + ConnectionData(Entrance.forest_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.forest_to_mastery_cave, RegionName.mastery_cave, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.MASTERIES), + ConnectionData(Entrance.town_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_mutant_bug_lair, RegionName.mutant_bug_lair, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.mountain_to_railroad, RegionName.railroad), + ConnectionData(Entrance.mountain_to_tent, RegionName.tent, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.mountain_to_leo_treehouse, Region.leo_treehouse, + ConnectionData(Entrance.mountain_to_leo_treehouse, RegionName.leo_treehouse, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.mountain_to_carpenter_shop, Region.carpenter, + ConnectionData(Entrance.mountain_to_carpenter_shop, RegionName.carpenter, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.mountain_to_maru_room, Region.maru_room, + ConnectionData(Entrance.mountain_to_maru_room, RegionName.maru_room, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_sebastian_room, Region.sebastian_room, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.mountain_to_adventurer_guild, Region.adventurer_guild, + ConnectionData(Entrance.enter_sebastian_room, RegionName.sebastian_room, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.mountain_to_adventurer_guild, RegionName.adventurer_guild, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.adventurer_guild_to_bedroom, Region.adventurer_guild_bedroom), - ConnectionData(Entrance.enter_quarry, Region.quarry), - ConnectionData(Entrance.enter_quarry_mine_entrance, Region.quarry_mine_entrance, + ConnectionData(Entrance.adventurer_guild_to_bedroom, RegionName.adventurer_guild_bedroom), + ConnectionData(Entrance.enter_quarry, RegionName.quarry), + ConnectionData(Entrance.enter_quarry_mine_entrance, RegionName.quarry_mine_entrance, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_quarry_mine, Region.quarry_mine), - ConnectionData(Entrance.mountain_to_town, Region.town), - ConnectionData(Entrance.town_to_community_center, Region.community_center, + ConnectionData(Entrance.enter_quarry_mine, RegionName.quarry_mine), + ConnectionData(Entrance.mountain_to_town, RegionName.town), + ConnectionData(Entrance.town_to_community_center, RegionName.community_center, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.access_crafts_room, Region.crafts_room), - ConnectionData(Entrance.access_pantry, Region.pantry), - ConnectionData(Entrance.access_fish_tank, Region.fish_tank), - ConnectionData(Entrance.access_boiler_room, Region.boiler_room), - ConnectionData(Entrance.access_bulletin_board, Region.bulletin_board), - ConnectionData(Entrance.access_vault, Region.vault), - ConnectionData(Entrance.town_to_hospital, Region.hospital, + ConnectionData(Entrance.access_crafts_room, RegionName.crafts_room), + ConnectionData(Entrance.access_pantry, RegionName.pantry), + ConnectionData(Entrance.access_fish_tank, RegionName.fish_tank), + ConnectionData(Entrance.access_boiler_room, RegionName.boiler_room), + ConnectionData(Entrance.access_bulletin_board, RegionName.bulletin_board), + ConnectionData(Entrance.access_vault, RegionName.vault), + ConnectionData(Entrance.town_to_hospital, RegionName.hospital, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_harvey_room, Region.harvey_room, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.town_to_pierre_general_store, Region.pierre_store, + ConnectionData(Entrance.enter_harvey_room, RegionName.harvey_room, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.town_to_pierre_general_store, RegionName.pierre_store, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_sunroom, Region.sunroom, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.town_to_clint_blacksmith, Region.blacksmith, + ConnectionData(Entrance.enter_sunroom, RegionName.sunroom, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.town_to_clint_blacksmith, RegionName.blacksmith, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_saloon, Region.saloon, + ConnectionData(Entrance.town_to_saloon, RegionName.saloon, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.play_journey_of_the_prairie_king, Region.jotpk_world_1), - ConnectionData(Entrance.reach_jotpk_world_2, Region.jotpk_world_2), - ConnectionData(Entrance.reach_jotpk_world_3, Region.jotpk_world_3), - ConnectionData(Entrance.play_junimo_kart, Region.junimo_kart_1), - ConnectionData(Entrance.reach_junimo_kart_2, Region.junimo_kart_2), - ConnectionData(Entrance.reach_junimo_kart_3, Region.junimo_kart_3), - ConnectionData(Entrance.reach_junimo_kart_4, Region.junimo_kart_4), - ConnectionData(Entrance.town_to_sam_house, Region.sam_house, + ConnectionData(Entrance.play_journey_of_the_prairie_king, RegionName.jotpk_world_1), + ConnectionData(Entrance.reach_jotpk_world_2, RegionName.jotpk_world_2), + ConnectionData(Entrance.reach_jotpk_world_3, RegionName.jotpk_world_3), + ConnectionData(Entrance.play_junimo_kart, RegionName.junimo_kart_1), + ConnectionData(Entrance.reach_junimo_kart_2, RegionName.junimo_kart_2), + ConnectionData(Entrance.reach_junimo_kart_3, RegionName.junimo_kart_3), + ConnectionData(Entrance.reach_junimo_kart_4, RegionName.junimo_kart_4), + ConnectionData(Entrance.town_to_sam_house, RegionName.sam_house, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_haley_house, Region.haley_house, + ConnectionData(Entrance.town_to_haley_house, RegionName.haley_house, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_mayor_manor, Region.mayor_house, + ConnectionData(Entrance.town_to_mayor_manor, RegionName.mayor_house, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_alex_house, Region.alex_house, + ConnectionData(Entrance.town_to_alex_house, RegionName.alex_house, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_trailer, Region.trailer, + ConnectionData(Entrance.town_to_trailer, RegionName.trailer, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_museum, Region.museum, + ConnectionData(Entrance.town_to_museum, RegionName.museum, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_jojamart, Region.jojamart, + ConnectionData(Entrance.town_to_jojamart, RegionName.jojamart, flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.purchase_movie_ticket, Region.movie_ticket_stand), - ConnectionData(Entrance.enter_abandoned_jojamart, Region.abandoned_jojamart), - ConnectionData(Entrance.enter_movie_theater, Region.movie_theater), - ConnectionData(Entrance.town_to_beach, Region.beach), - ConnectionData(Entrance.enter_elliott_house, Region.elliott_house, + ConnectionData(Entrance.purchase_movie_ticket, RegionName.movie_ticket_stand), + ConnectionData(Entrance.enter_abandoned_jojamart, RegionName.abandoned_jojamart), + ConnectionData(Entrance.enter_movie_theater, RegionName.movie_theater), + ConnectionData(Entrance.town_to_beach, RegionName.beach), + ConnectionData(Entrance.enter_elliott_house, RegionName.elliott_house, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.beach_to_willy_fish_shop, Region.fish_shop, + ConnectionData(Entrance.beach_to_willy_fish_shop, RegionName.fish_shop, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.fish_shop_to_boat_tunnel, Region.boat_tunnel, + ConnectionData(Entrance.fish_shop_to_boat_tunnel, RegionName.boat_tunnel, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.boat_to_ginger_island, Region.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.enter_tide_pools, Region.tide_pools), - ConnectionData(Entrance.mountain_to_the_mines, Region.mines, + ConnectionData(Entrance.boat_to_ginger_island, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.enter_tide_pools, RegionName.tide_pools), + ConnectionData(Entrance.mountain_to_the_mines, RegionName.mines, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.dig_to_mines_floor_5, Region.mines_floor_5), - ConnectionData(Entrance.dig_to_mines_floor_10, Region.mines_floor_10), - ConnectionData(Entrance.dig_to_mines_floor_15, Region.mines_floor_15), - ConnectionData(Entrance.dig_to_mines_floor_20, Region.mines_floor_20), - ConnectionData(Entrance.dig_to_mines_floor_25, Region.mines_floor_25), - ConnectionData(Entrance.dig_to_mines_floor_30, Region.mines_floor_30), - ConnectionData(Entrance.dig_to_mines_floor_35, Region.mines_floor_35), - ConnectionData(Entrance.dig_to_mines_floor_40, Region.mines_floor_40), - ConnectionData(Entrance.dig_to_mines_floor_45, Region.mines_floor_45), - ConnectionData(Entrance.dig_to_mines_floor_50, Region.mines_floor_50), - ConnectionData(Entrance.dig_to_mines_floor_55, Region.mines_floor_55), - ConnectionData(Entrance.dig_to_mines_floor_60, Region.mines_floor_60), - ConnectionData(Entrance.dig_to_mines_floor_65, Region.mines_floor_65), - ConnectionData(Entrance.dig_to_mines_floor_70, Region.mines_floor_70), - ConnectionData(Entrance.dig_to_mines_floor_75, Region.mines_floor_75), - ConnectionData(Entrance.dig_to_mines_floor_80, Region.mines_floor_80), - ConnectionData(Entrance.dig_to_mines_floor_85, Region.mines_floor_85), - ConnectionData(Entrance.dig_to_mines_floor_90, Region.mines_floor_90), - ConnectionData(Entrance.dig_to_mines_floor_95, Region.mines_floor_95), - ConnectionData(Entrance.dig_to_mines_floor_100, Region.mines_floor_100), - ConnectionData(Entrance.dig_to_mines_floor_105, Region.mines_floor_105), - ConnectionData(Entrance.dig_to_mines_floor_110, Region.mines_floor_110), - ConnectionData(Entrance.dig_to_mines_floor_115, Region.mines_floor_115), - ConnectionData(Entrance.dig_to_mines_floor_120, Region.mines_floor_120), - ConnectionData(Entrance.dig_to_dangerous_mines_20, Region.dangerous_mines_20, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.dig_to_dangerous_mines_60, Region.dangerous_mines_60, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.dig_to_dangerous_mines_100, Region.dangerous_mines_100, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.enter_skull_cavern_entrance, Region.skull_cavern_entrance, + ConnectionData(Entrance.dig_to_mines_floor_5, RegionName.mines_floor_5), + ConnectionData(Entrance.dig_to_mines_floor_10, RegionName.mines_floor_10), + ConnectionData(Entrance.dig_to_mines_floor_15, RegionName.mines_floor_15), + ConnectionData(Entrance.dig_to_mines_floor_20, RegionName.mines_floor_20), + ConnectionData(Entrance.dig_to_mines_floor_25, RegionName.mines_floor_25), + ConnectionData(Entrance.dig_to_mines_floor_30, RegionName.mines_floor_30), + ConnectionData(Entrance.dig_to_mines_floor_35, RegionName.mines_floor_35), + ConnectionData(Entrance.dig_to_mines_floor_40, RegionName.mines_floor_40), + ConnectionData(Entrance.dig_to_mines_floor_45, RegionName.mines_floor_45), + ConnectionData(Entrance.dig_to_mines_floor_50, RegionName.mines_floor_50), + ConnectionData(Entrance.dig_to_mines_floor_55, RegionName.mines_floor_55), + ConnectionData(Entrance.dig_to_mines_floor_60, RegionName.mines_floor_60), + ConnectionData(Entrance.dig_to_mines_floor_65, RegionName.mines_floor_65), + ConnectionData(Entrance.dig_to_mines_floor_70, RegionName.mines_floor_70), + ConnectionData(Entrance.dig_to_mines_floor_75, RegionName.mines_floor_75), + ConnectionData(Entrance.dig_to_mines_floor_80, RegionName.mines_floor_80), + ConnectionData(Entrance.dig_to_mines_floor_85, RegionName.mines_floor_85), + ConnectionData(Entrance.dig_to_mines_floor_90, RegionName.mines_floor_90), + ConnectionData(Entrance.dig_to_mines_floor_95, RegionName.mines_floor_95), + ConnectionData(Entrance.dig_to_mines_floor_100, RegionName.mines_floor_100), + ConnectionData(Entrance.dig_to_mines_floor_105, RegionName.mines_floor_105), + ConnectionData(Entrance.dig_to_mines_floor_110, RegionName.mines_floor_110), + ConnectionData(Entrance.dig_to_mines_floor_115, RegionName.mines_floor_115), + ConnectionData(Entrance.dig_to_mines_floor_120, RegionName.mines_floor_120), + ConnectionData(Entrance.dig_to_dangerous_mines_20, RegionName.dangerous_mines_20, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.dig_to_dangerous_mines_60, RegionName.dangerous_mines_60, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.dig_to_dangerous_mines_100, RegionName.dangerous_mines_100, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.enter_skull_cavern_entrance, RegionName.skull_cavern_entrance, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_oasis, Region.oasis, + ConnectionData(Entrance.enter_oasis, RegionName.oasis, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_casino, Region.casino, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_skull_cavern, Region.skull_cavern), - ConnectionData(Entrance.mine_to_skull_cavern_floor_25, Region.skull_cavern_25), - ConnectionData(Entrance.mine_to_skull_cavern_floor_50, Region.skull_cavern_50), - ConnectionData(Entrance.mine_to_skull_cavern_floor_75, Region.skull_cavern_75), - ConnectionData(Entrance.mine_to_skull_cavern_floor_100, Region.skull_cavern_100), - ConnectionData(Entrance.mine_to_skull_cavern_floor_125, Region.skull_cavern_125), - ConnectionData(Entrance.mine_to_skull_cavern_floor_150, Region.skull_cavern_150), - ConnectionData(Entrance.mine_to_skull_cavern_floor_175, Region.skull_cavern_175), - ConnectionData(Entrance.mine_to_skull_cavern_floor_200, Region.skull_cavern_200), - ConnectionData(Entrance.enter_dangerous_skull_cavern, Region.dangerous_skull_cavern, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.enter_witch_warp_cave, Region.witch_warp_cave, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_witch_swamp, Region.witch_swamp, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_witch_hut, Region.witch_hut, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.witch_warp_to_wizard_basement, Region.wizard_basement, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_bathhouse_entrance, Region.bathhouse_entrance, + ConnectionData(Entrance.enter_casino, RegionName.casino, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_skull_cavern, RegionName.skull_cavern), + ConnectionData(Entrance.mine_to_skull_cavern_floor_25, RegionName.skull_cavern_25), + ConnectionData(Entrance.mine_to_skull_cavern_floor_50, RegionName.skull_cavern_50), + ConnectionData(Entrance.mine_to_skull_cavern_floor_75, RegionName.skull_cavern_75), + ConnectionData(Entrance.mine_to_skull_cavern_floor_100, RegionName.skull_cavern_100), + ConnectionData(Entrance.mine_to_skull_cavern_floor_125, RegionName.skull_cavern_125), + ConnectionData(Entrance.mine_to_skull_cavern_floor_150, RegionName.skull_cavern_150), + ConnectionData(Entrance.mine_to_skull_cavern_floor_175, RegionName.skull_cavern_175), + ConnectionData(Entrance.mine_to_skull_cavern_floor_200, RegionName.skull_cavern_200), + ConnectionData(Entrance.enter_dangerous_skull_cavern, RegionName.dangerous_skull_cavern, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.enter_witch_warp_cave, RegionName.witch_warp_cave, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_witch_swamp, RegionName.witch_swamp, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_witch_hut, RegionName.witch_hut, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.witch_warp_to_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_bathhouse_entrance, RegionName.bathhouse_entrance, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_locker_room, Region.locker_room, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_public_bath, Region.public_bath, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.island_south_to_west, Region.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_south_to_north, Region.island_north, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_south_to_east, Region.island_east, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_south_to_southeast, Region.island_south_east, + ConnectionData(Entrance.enter_locker_room, RegionName.locker_room, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_public_bath, RegionName.public_bath, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_south_to_west, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.island_south_to_north, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.island_south_to_east, RegionName.island_east, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.island_south_to_southeast, RegionName.island_south_east, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.use_island_resort, Region.island_resort, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_islandfarmhouse, Region.island_farmhouse, + ConnectionData(Entrance.use_island_resort, RegionName.island_resort, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.island_west_to_islandfarmhouse, RegionName.island_farmhouse, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_gourmand_cave, Region.gourmand_frog_cave, + ConnectionData(Entrance.island_west_to_gourmand_cave, RegionName.gourmand_frog_cave, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_crystals_cave, Region.colored_crystals_cave, + ConnectionData(Entrance.island_west_to_crystals_cave, RegionName.colored_crystals_cave, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_shipwreck, Region.shipwreck, + ConnectionData(Entrance.island_west_to_shipwreck, RegionName.shipwreck, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_qi_walnut_room, Region.qi_walnut_room, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_east_to_leo_hut, Region.leo_hut, + ConnectionData(Entrance.island_west_to_qi_walnut_room, RegionName.qi_walnut_room, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.island_east_to_leo_hut, RegionName.leo_hut, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_east_to_island_shrine, Region.island_shrine, + ConnectionData(Entrance.island_east_to_island_shrine, RegionName.island_shrine, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_southeast_to_pirate_cove, Region.pirate_cove, + ConnectionData(Entrance.island_southeast_to_pirate_cove, RegionName.pirate_cove, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_north_to_field_office, Region.field_office, + ConnectionData(Entrance.island_north_to_field_office, RegionName.field_office, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_north_to_dig_site, Region.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.dig_site_to_professor_snail_cave, Region.professor_snail_cave, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_north_to_volcano, Region.volcano, + ConnectionData(Entrance.island_north_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.dig_site_to_professor_snail_cave, RegionName.professor_snail_cave, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.volcano_to_secret_beach, Region.volcano_secret_beach, + ConnectionData(Entrance.island_north_to_volcano, RegionName.volcano, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.talk_to_island_trader, Region.island_trader, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.climb_to_volcano_5, Region.volcano_floor_5, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.talk_to_volcano_dwarf, Region.volcano_dwarf_shop, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.climb_to_volcano_10, Region.volcano_floor_10, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_jungle_to_docks, Region.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_dig_site_to_docks, Region.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_volcano_to_docks, Region.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_volcano_to_jungle, Region.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_docks_to_jungle, Region.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_dig_site_to_jungle, Region.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_docks_to_dig_site, Region.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_volcano_to_dig_site, Region.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_jungle_to_dig_site, Region.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_dig_site_to_volcano, Region.island_north, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_docks_to_volcano, Region.island_north, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_jungle_to_volcano, Region.island_north, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.volcano_to_secret_beach, RegionName.volcano_secret_beach, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.talk_to_island_trader, RegionName.island_trader, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.climb_to_volcano_5, RegionName.volcano_floor_5, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.talk_to_volcano_dwarf, RegionName.volcano_dwarf_shop, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.climb_to_volcano_10, RegionName.volcano_floor_10, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_jungle_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_dig_site_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_volcano_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_volcano_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_docks_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_dig_site_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_docks_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_volcano_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_jungle_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_dig_site_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_docks_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(Entrance.parrot_express_jungle_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), ConnectionData(LogicEntrance.talk_to_mines_dwarf, LogicRegion.mines_dwarf_shop), @@ -708,7 +709,7 @@ def swap_connections_until_valid(regions_by_name, connections_by_name: Dict[str, def region_should_be_reachable(region_name: str, connections_in_slot: Iterable[ConnectionData]) -> bool: - if region_name == Region.menu: + if region_name == RegionName.menu: return True for connection in connections_in_slot: if region_name == connection.destination: @@ -718,11 +719,11 @@ def region_should_be_reachable(region_name: str, connections_in_slot: Iterable[C def find_reachable_regions(regions_by_name, connections_by_name, randomized_connections: Dict[ConnectionData, ConnectionData]): - reachable_regions = {Region.menu} + reachable_regions = {RegionName.menu} unreachable_regions = {region for region in regions_by_name.keys()} # unreachable_regions = {region for region in regions_by_name.keys() if region_should_be_reachable(region, connections_by_name.values())} - unreachable_regions.remove(Region.menu) - exits_to_explore = list(regions_by_name[Region.menu].exits) + unreachable_regions.remove(RegionName.menu) + exits_to_explore = list(regions_by_name[RegionName.menu].exits) while exits_to_explore: exit_name = exits_to_explore.pop() # if exit_name not in connections_by_name: diff --git a/worlds/stardew_valley/scripts/update_data.py b/worlds/stardew_valley/scripts/update_data.py index ae8f7f8d55..5c2e6a57a4 100644 --- a/worlds/stardew_valley/scripts/update_data.py +++ b/worlds/stardew_valley/scripts/update_data.py @@ -12,7 +12,7 @@ from typing import List from worlds.stardew_valley import LocationData from worlds.stardew_valley.items import load_item_csv, Group, ItemData -from worlds.stardew_valley.locations import load_location_csv, LocationTags +from worlds.stardew_valley.locations import load_location_csv RESOURCE_PACK_CODE_OFFSET = 5000 script_folder = Path(__file__) @@ -56,9 +56,9 @@ if __name__ == "__main__": and item.code_without_offset is not None) + 1) resource_pack_counter = itertools.count(max(item.code_without_offset - for item in loaded_items - if Group.RESOURCE_PACK in item.groups - and item.code_without_offset is not None) + 1) + for item in loaded_items + if Group.RESOURCE_PACK in item.groups + and item.code_without_offset is not None) + 1) items_to_write = [] for item in loaded_items: if item.code_without_offset is None: diff --git a/worlds/stardew_valley/stardew_rule/base.py b/worlds/stardew_valley/stardew_rule/base.py index af4c3c3533..ff1fbba376 100644 --- a/worlds/stardew_valley/stardew_rule/base.py +++ b/worlds/stardew_valley/stardew_rule/base.py @@ -6,7 +6,7 @@ from dataclasses import dataclass, field from functools import cached_property from itertools import chain from threading import Lock -from typing import Iterable, Dict, List, Union, Sized, Hashable, Callable, Tuple, Set, Optional +from typing import Iterable, Dict, List, Union, Sized, Hashable, Callable, Tuple, Set, Optional, cast from BaseClasses import CollectionState from .literal import true_, false_, LiteralStardewRule @@ -318,6 +318,7 @@ class Or(AggregatingStardewRule): return Or(_combinable_rules=other.add_into(self.combinable_rules, self.combine), _simplification_state=self.simplification_state) if type(other) is Or: + other = cast(Or, other) return Or(_combinable_rules=self.merge(self.combinable_rules, other.combinable_rules), _simplification_state=self.simplification_state.merge(other.simplification_state)) @@ -344,6 +345,7 @@ class And(AggregatingStardewRule): return And(_combinable_rules=other.add_into(self.combinable_rules, self.combine), _simplification_state=self.simplification_state) if type(other) is And: + other = cast(And, other) return And(_combinable_rules=self.merge(self.combinable_rules, other.combinable_rules), _simplification_state=self.simplification_state.merge(other.simplification_state)) diff --git a/worlds/stardew_valley/test/TestMultiplePlayers.py b/worlds/stardew_valley/test/TestMultiplePlayers.py index 2f2092fdf7..d8db616f66 100644 --- a/worlds/stardew_valley/test/TestMultiplePlayers.py +++ b/worlds/stardew_valley/test/TestMultiplePlayers.py @@ -53,8 +53,6 @@ class TestDifferentSettings(SVTestCase): def test_money_rule_caching(self): options_festivals_limited_money = {FestivalLocations.internal_name: FestivalLocations.option_easy, StartingMoney.internal_name: 5000} - options_festivals_limited_money = {FestivalLocations.internal_name: FestivalLocations.option_easy, - StartingMoney.internal_name: 5000} multiplayer_options = [options_festivals_limited_money, options_festivals_limited_money] multiworld = setup_multiworld(multiplayer_options) diff --git a/worlds/stardew_valley/test/TestWalnutsanity.py b/worlds/stardew_valley/test/TestWalnutsanity.py index c1e8c2c8f0..da17d749ea 100644 --- a/worlds/stardew_valley/test/TestWalnutsanity.py +++ b/worlds/stardew_valley/test/TestWalnutsanity.py @@ -25,7 +25,7 @@ class TestWalnutsanityNone(SVTestBase): self.collect("Island Obelisk") self.collect("Island West Turtle") self.collect("Progressive House") - items = self.collect("5 Golden Walnuts", 10) + self.collect("5 Golden Walnuts", 10) self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) self.collect("Island North Turtle") @@ -126,10 +126,10 @@ class TestWalnutsanityPuzzlesAndBushes(SVTestBase): # You need to receive 25, and collect 15 self.collect("Island Obelisk") self.collect("Island West Turtle") - items = self.collect("5 Golden Walnuts", 5) + self.collect("5 Golden Walnuts", 5) self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) - items = self.collect("Island North Turtle") + self.collect("Island North Turtle") self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) @@ -203,7 +203,7 @@ class TestWalnutsanityAll(SVTestBase): self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) self.remove(items) self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) - items = self.collect("5 Golden Walnuts", 4) - items = self.collect("3 Golden Walnuts", 6) - items = self.collect("Golden Walnut", 2) + self.collect("5 Golden Walnuts", 4) + self.collect("3 Golden Walnuts", 6) + self.collect("Golden Walnut", 2) self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) diff --git a/worlds/stardew_valley/test/rules/TestFishing.py b/worlds/stardew_valley/test/rules/TestFishing.py index 04a1528dd8..513bb951e9 100644 --- a/worlds/stardew_valley/test/rules/TestFishing.py +++ b/worlds/stardew_valley/test/rules/TestFishing.py @@ -1,5 +1,4 @@ -from ...options import SeasonRandomization, Friendsanity, FriendsanityHeartSize, Fishsanity, ExcludeGingerIsland, SkillProgression, ToolProgression, \ - ElevatorProgression, SpecialOrderLocations +from ...options import SeasonRandomization, Fishsanity, ExcludeGingerIsland, SkillProgression, ToolProgression, ElevatorProgression, SpecialOrderLocations from ...strings.fish_names import Fish from ...test import SVTestBase From 894732be474a63f84783de6cfad2260a047e8ad8 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sun, 2 Feb 2025 02:53:16 +0100 Subject: [PATCH 023/227] kvui: set home folder to non-default (#4590) Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- kvui.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kvui.py b/kvui.py index f47e45b93c..6718e48bee 100644 --- a/kvui.py +++ b/kvui.py @@ -26,6 +26,10 @@ import Utils if Utils.is_frozen(): os.environ["KIVY_DATA_DIR"] = Utils.local_path("data") +import platformdirs +os.environ["KIVY_HOME"] = os.path.join(platformdirs.user_config_dir("Archipelago", False), "kivy") +os.makedirs(os.environ["KIVY_HOME"], exist_ok=True) + from kivy.config import Config Config.set("input", "mouse", "mouse,disable_multitouch") From f28aff6f9a86b6adff6f67253d17ee12a5c49c92 Mon Sep 17 00:00:00 2001 From: Mysteryem Date: Sun, 2 Feb 2025 14:25:34 +0000 Subject: [PATCH 024/227] Core: Replace generator creation/iteration in CollectionState methods (#4587) * Core: Replace generator creation/iteration in CollectionState methods Using generators in these functions incurs overhead to create the new generator instance, call the `any`/`all`/`sum` function and have the `any`/`all`/`sum` function iterate the generator, which in turn iterates the iterable. Replacing the use of generators with for loops is faster. Getting `self.prog_items[player]` once in advance also improves performance of iterating longer iterables. * Add comment on the choice of for loops instead of any()/all()/sum() --- BaseClasses.py | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index e19ba5f777..3d0004806c 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -869,21 +869,40 @@ class CollectionState(): def has(self, item: str, player: int, count: int = 1) -> bool: return self.prog_items[player][item] >= count + # for loops are specifically used in all/any/count methods, instead of all()/any()/sum(), to avoid the overhead of + # creating and iterating generator instances. In `return all(player_prog_items[item] for item in items)`, the + # argument to all() would be a new generator instance, for example. def has_all(self, items: Iterable[str], player: int) -> bool: """Returns True if each item name of items is in state at least once.""" - return all(self.prog_items[player][item] for item in items) + player_prog_items = self.prog_items[player] + for item in items: + if not player_prog_items[item]: + return False + return True def has_any(self, items: Iterable[str], player: int) -> bool: """Returns True if at least one item name of items is in state at least once.""" - return any(self.prog_items[player][item] for item in items) + player_prog_items = self.prog_items[player] + for item in items: + if player_prog_items[item]: + return True + return False def has_all_counts(self, item_counts: Mapping[str, int], player: int) -> bool: """Returns True if each item name is in the state at least as many times as specified.""" - return all(self.prog_items[player][item] >= count for item, count in item_counts.items()) + player_prog_items = self.prog_items[player] + for item, count in item_counts.items(): + if player_prog_items[item] < count: + return False + return True def has_any_count(self, item_counts: Mapping[str, int], player: int) -> bool: """Returns True if at least one item name is in the state at least as many times as specified.""" - return any(self.prog_items[player][item] >= count for item, count in item_counts.items()) + player_prog_items = self.prog_items[player] + for item, count in item_counts.items(): + if player_prog_items[item] >= count: + return True + return False def count(self, item: str, player: int) -> int: return self.prog_items[player][item] @@ -911,11 +930,20 @@ class CollectionState(): def count_from_list(self, items: Iterable[str], player: int) -> int: """Returns the cumulative count of items from a list present in state.""" - return sum(self.prog_items[player][item_name] for item_name in items) + player_prog_items = self.prog_items[player] + total = 0 + for item_name in items: + total += player_prog_items[item_name] + return total def count_from_list_unique(self, items: Iterable[str], player: int) -> int: """Returns the cumulative count of items from a list present in state. Ignores duplicates of the same item.""" - return sum(self.prog_items[player][item_name] > 0 for item_name in items) + player_prog_items = self.prog_items[player] + total = 0 + for item_name in items: + if player_prog_items[item_name] > 0: + total += 1 + return total # item name group related def has_group(self, item_name_group: str, player: int, count: int = 1) -> bool: From 628252896e41d5d3e10414149a7bf50eed1307e3 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Mon, 3 Feb 2025 09:53:56 -0500 Subject: [PATCH 025/227] TUNIC: Call Combat Logic experimental (#4594) * Update options.py * Update options.py --- worlds/tunic/options.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/tunic/options.py b/worlds/tunic/options.py index d2ea828037..8fe2ea5ce8 100644 --- a/worlds/tunic/options.py +++ b/worlds/tunic/options.py @@ -197,6 +197,7 @@ class TunicPlandoConnections(PlandoConnections): class CombatLogic(Choice): """ + EXPERIMENTAL - may cause gen failures, especially when playthrough generation for the spoiler log is enabled, and may have slight logic issues. If enabled, the player will logically require a combination of stat upgrade items and equipment to get some checks or navigate to some areas, with a goal of matching the vanilla combat difficulty. The player may still be expected to run past enemies, reset aggro (by using a checkpoint or doing a scene transition), or find sneaky paths to checks. This option marks many more items as progression and may force weapons much earlier than normal. From 19faaa4104a97cac4a7980454ba55dae42758ea7 Mon Sep 17 00:00:00 2001 From: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> Date: Mon, 3 Feb 2025 19:49:07 -0500 Subject: [PATCH 026/227] Core: Fix #4595 by using first type's docstring in a union type (#4600) * Fix #4595: use first type's docstring in a union type. * Reuse existing import. --- settings.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/settings.py b/settings.py index cc808c2732..14d4ba30ce 100644 --- a/settings.py +++ b/settings.py @@ -282,7 +282,8 @@ class Group: attr = cast(object, getattr(self, name)) attr_cls = type_hints[name] if name in type_hints else attr.__class__ attr_cls_origin = typing.get_origin(attr_cls) - while attr_cls_origin is Union: # resolve to first type for doc string + # resolve to first type for doc string + while attr_cls_origin is Union or attr_cls_origin is types.UnionType: attr_cls = typing.get_args(attr_cls)[0] attr_cls_origin = typing.get_origin(attr_cls) if attr_cls.__doc__ and attr_cls.__module__ != "builtins": From da48af60dc443526cf28a16568e6cdb9d5732f09 Mon Sep 17 00:00:00 2001 From: Jouramie <16137441+Jouramie@users.noreply.github.com> Date: Tue, 4 Feb 2025 02:27:23 -0500 Subject: [PATCH 027/227] Stardew Valley: add assert_can_reach_region_* for better tests (#4556) * add assert_reach_region_*; refactor existing assert_reach_location_* to allow string * rename asserts --- worlds/stardew_valley/test/TestBooksanity.py | 8 ++-- .../stardew_valley/test/TestWalnutsanity.py | 4 +- .../test/assertion/rule_assert.py | 41 +++++++++++++++---- .../test/assertion/world_assert.py | 2 +- worlds/stardew_valley/test/rules/TestBooks.py | 8 ++-- .../stardew_valley/test/rules/TestFishing.py | 6 +-- .../stardew_valley/test/rules/TestSkills.py | 10 ++--- 7 files changed, 50 insertions(+), 29 deletions(-) diff --git a/worlds/stardew_valley/test/TestBooksanity.py b/worlds/stardew_valley/test/TestBooksanity.py index 942f35d961..3c737e502c 100644 --- a/worlds/stardew_valley/test/TestBooksanity.py +++ b/worlds/stardew_valley/test/TestBooksanity.py @@ -65,7 +65,7 @@ class TestBooksanityNone(SVTestBase): if item_to_ship not in power_books and item_to_ship not in skill_books: continue with self.subTest(location.name): - self.assert_reach_location_true(location, self.multiworld.state) + self.assert_can_reach_location(location, self.multiworld.state) class TestBooksanityPowers(SVTestBase): @@ -111,7 +111,7 @@ class TestBooksanityPowers(SVTestBase): if item_to_ship not in power_books and item_to_ship not in skill_books: continue with self.subTest(location.name): - self.assert_reach_location_true(location, self.multiworld.state) + self.assert_can_reach_location(location, self.multiworld.state) class TestBooksanityPowersAndSkills(SVTestBase): @@ -157,7 +157,7 @@ class TestBooksanityPowersAndSkills(SVTestBase): if item_to_ship not in power_books and item_to_ship not in skill_books: continue with self.subTest(location.name): - self.assert_reach_location_true(location, self.multiworld.state) + self.assert_can_reach_location(location, self.multiworld.state) class TestBooksanityAll(SVTestBase): @@ -203,4 +203,4 @@ class TestBooksanityAll(SVTestBase): if item_to_ship not in power_books and item_to_ship not in skill_books: continue with self.subTest(location.name): - self.assert_reach_location_true(location, self.multiworld.state) + self.assert_can_reach_location(location, self.multiworld.state) diff --git a/worlds/stardew_valley/test/TestWalnutsanity.py b/worlds/stardew_valley/test/TestWalnutsanity.py index da17d749ea..862553dee1 100644 --- a/worlds/stardew_valley/test/TestWalnutsanity.py +++ b/worlds/stardew_valley/test/TestWalnutsanity.py @@ -81,10 +81,10 @@ class TestWalnutsanityPuzzles(SVTestBase): self.collect("Combat Level", 10) self.collect("Mining Level", 10) for location in locations: - self.assert_reach_location_false(location, self.multiworld.state) + self.assert_cannot_reach_location(location, self.multiworld.state) self.collect("Open Professor Snail Cave") for location in locations: - self.assert_reach_location_true(location, self.multiworld.state) + self.assert_can_reach_location(location, self.multiworld.state) class TestWalnutsanityBushes(SVTestBase): diff --git a/worlds/stardew_valley/test/assertion/rule_assert.py b/worlds/stardew_valley/test/assertion/rule_assert.py index 1031a18e11..02362f2d15 100644 --- a/worlds/stardew_valley/test/assertion/rule_assert.py +++ b/worlds/stardew_valley/test/assertion/rule_assert.py @@ -1,7 +1,7 @@ from typing import List from unittest import TestCase -from BaseClasses import CollectionState, Location +from BaseClasses import CollectionState, Location, Region from ...stardew_rule import StardewRule, false_, MISSING_ITEM, Reach from ...stardew_rule.rule_explain import explain @@ -40,19 +40,42 @@ class RuleAssertMixin(TestCase): raise AssertionError(f"Error while checking rule {rule}: {e}" f"\nExplanation: {expl}") - def assert_reach_location_true(self, location: Location, state: CollectionState): - expl = explain(Reach(location.name, "Location", 1), state) + def assert_can_reach_location(self, location: Location | str, state: CollectionState) -> None: + location_name = location.name if isinstance(location, Location) else location + expl = explain(Reach(location_name, "Location", 1), state) try: - can_reach = location.can_reach(state) + can_reach = state.can_reach_location(location_name, 1) self.assertTrue(can_reach, expl) except KeyError as e: - raise AssertionError(f"Error while checking location {location.name}: {e}" + raise AssertionError(f"Error while checking location {location_name}: {e}" f"\nExplanation: {expl}") - def assert_reach_location_false(self, location: Location, state: CollectionState): - expl = explain(Reach(location.name, "Location", 1), state, expected=False) + def assert_cannot_reach_location(self, location: Location | str, state: CollectionState) -> None: + location_name = location.name if isinstance(location, Location) else location + expl = explain(Reach(location_name, "Location", 1), state, expected=False) try: - self.assertFalse(location.can_reach(state), expl) + can_reach = state.can_reach_location(location_name, 1) + self.assertFalse(can_reach, expl) except KeyError as e: - raise AssertionError(f"Error while checking location {location.name}: {e}" + raise AssertionError(f"Error while checking location {location_name}: {e}" + f"\nExplanation: {expl}") + + def assert_can_reach_region(self, region: Region | str, state: CollectionState) -> None: + region_name = region.name if isinstance(region, Region) else region + expl = explain(Reach(region_name, "Region", 1), state) + try: + can_reach = state.can_reach_region(region_name, 1) + self.assertTrue(can_reach, expl) + except KeyError as e: + raise AssertionError(f"Error while checking region {region_name}: {e}" + f"\nExplanation: {expl}") + + def assert_cannot_reach_region(self, region: Region | str, state: CollectionState) -> None: + region_name = region.name if isinstance(region, Region) else region + expl = explain(Reach(region_name, "Region", 1), state, expected=False) + try: + can_reach = state.can_reach_region(region_name, 1) + self.assertFalse(can_reach, expl) + except KeyError as e: + raise AssertionError(f"Error while checking region {region_name}: {e}" f"\nExplanation: {expl}") diff --git a/worlds/stardew_valley/test/assertion/world_assert.py b/worlds/stardew_valley/test/assertion/world_assert.py index 9717283454..97f5376058 100644 --- a/worlds/stardew_valley/test/assertion/world_assert.py +++ b/worlds/stardew_valley/test/assertion/world_assert.py @@ -53,7 +53,7 @@ class WorldAssertMixin(RuleAssertMixin, TestCase): def assert_can_reach_everything(self, multiworld: MultiWorld): for location in multiworld.get_locations(): - self.assert_reach_location_true(location, multiworld.state) + self.assert_can_reach_location(location, multiworld.state) def assert_basic_checks(self, multiworld: MultiWorld): self.assert_same_number_items_locations(multiworld) diff --git a/worlds/stardew_valley/test/rules/TestBooks.py b/worlds/stardew_valley/test/rules/TestBooks.py index 6605e7e645..af0055d228 100644 --- a/worlds/stardew_valley/test/rules/TestBooks.py +++ b/worlds/stardew_valley/test/rules/TestBooks.py @@ -12,15 +12,13 @@ class TestBooksLogic(SVTestBase): location = self.multiworld.get_location("Read Mapping Cave Systems", self.player) - self.assert_reach_location_false(location, self.multiworld.state) + self.assert_cannot_reach_location(location, self.multiworld.state) self.collect("Progressive Mine Elevator") self.collect("Progressive Mine Elevator") self.collect("Progressive Mine Elevator") self.collect("Progressive Mine Elevator") - self.assert_reach_location_false(location, self.multiworld.state) + self.assert_cannot_reach_location(location, self.multiworld.state) self.collect("Progressive Weapon") - self.assert_reach_location_true(location, self.multiworld.state) - - + self.assert_can_reach_location(location, self.multiworld.state) diff --git a/worlds/stardew_valley/test/rules/TestFishing.py b/worlds/stardew_valley/test/rules/TestFishing.py index 513bb951e9..74a33f3668 100644 --- a/worlds/stardew_valley/test/rules/TestFishing.py +++ b/worlds/stardew_valley/test/rules/TestFishing.py @@ -43,18 +43,18 @@ class TestNeedRegionToCatchFish(SVTestBase): self.collect_all_the_money() item_names = fish_and_items[fish] location = self.multiworld.get_location(f"Fishsanity: {fish}", self.player) - self.assert_reach_location_false(location, self.multiworld.state) + self.assert_cannot_reach_location(location, self.multiworld.state) items = [] for item_name in item_names: items.append(self.collect(item_name)) with self.subTest(f"{fish} can be reached with {item_names}"): - self.assert_reach_location_true(location, self.multiworld.state) + self.assert_can_reach_location(location, self.multiworld.state) for item_required in items: self.multiworld.state = self.original_state.copy() with self.subTest(f"{fish} requires {item_required.name}"): for item_to_collect in items: if item_to_collect.name != item_required.name: self.collect(item_to_collect) - self.assert_reach_location_false(location, self.multiworld.state) + self.assert_cannot_reach_location(location, self.multiworld.state) self.multiworld.state = self.original_state.copy() diff --git a/worlds/stardew_valley/test/rules/TestSkills.py b/worlds/stardew_valley/test/rules/TestSkills.py index 77adade886..ee605bfaa1 100644 --- a/worlds/stardew_valley/test/rules/TestSkills.py +++ b/worlds/stardew_valley/test/rules/TestSkills.py @@ -39,10 +39,10 @@ class TestSkillProgressionProgressive(SVTestBase): with self.subTest(location_name): if level > 1: - self.assert_reach_location_false(location, self.multiworld.state) + self.assert_cannot_reach_location(location, self.multiworld.state) self.collect(f"{skill} Level") - self.assert_reach_location_true(location, self.multiworld.state) + self.assert_can_reach_location(location, self.multiworld.state) self.reset_collection_state() @@ -88,7 +88,7 @@ class TestSkillProgressionProgressiveWithMasteryWithoutMods(SVTestBase): for skill in all_vanilla_skills: with self.subTest(skill): location = self.multiworld.get_location(f"{skill} Mastery", self.player) - self.assert_reach_location_true(location, self.multiworld.state) + self.assert_can_reach_location(location, self.multiworld.state) self.reset_collection_state() @@ -99,7 +99,7 @@ class TestSkillProgressionProgressiveWithMasteryWithoutMods(SVTestBase): self.remove_one_by_name(f"{skill} Level") location = self.multiworld.get_location(f"{skill} Mastery", self.player) - self.assert_reach_location_false(location, self.multiworld.state) + self.assert_cannot_reach_location(location, self.multiworld.state) self.reset_collection_state() @@ -108,6 +108,6 @@ class TestSkillProgressionProgressiveWithMasteryWithoutMods(SVTestBase): self.remove_one_by_name(f"Progressive Pickaxe") location = self.multiworld.get_location("Mining Mastery", self.player) - self.assert_reach_location_false(location, self.multiworld.state) + self.assert_cannot_reach_location(location, self.multiworld.state) self.reset_collection_state() From db11c620a746b23c46216cae1e2f05a013aeb341 Mon Sep 17 00:00:00 2001 From: shananas <47014056+shananas@users.noreply.github.com> Date: Tue, 4 Feb 2025 11:09:02 -0500 Subject: [PATCH 028/227] =?UTF-8?q?KH2=20Doc=20Update=C2=A0#4609?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mod Manager Version Number --- worlds/kh2/docs/setup_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/kh2/docs/setup_en.md b/worlds/kh2/docs/setup_en.md index bee60bd36b..2e1022f3ef 100644 --- a/worlds/kh2/docs/setup_en.md +++ b/worlds/kh2/docs/setup_en.md @@ -10,7 +10,7 @@ Kingdom Hearts II Final Mix from the [Epic Games Store](https://store.epicgames.com/en-US/discover/kingdom-hearts) or [Steam](https://store.steampowered.com/app/2552430/KINGDOM_HEARTS_HD_1525_ReMIX/) - Follow this Guide to set up these requirements [KH2Rando.com](https://tommadness.github.io/KH2Randomizer/setup/Panacea-ModLoader/) - 1. Version 3.4.0 or greater OpenKH Mod Manager with Panacea + 1. Version 25.01.26.0 or greater OpenKH Mod Manager with Panacea 2. Lua Backend from the OpenKH Mod Manager 3. Install the mod `KH2FM-Mods-Num/GoA-ROM-Edition` using OpenKH Mod Manager - Needed for Archipelago From f6668997e61a0e2ea53bf2e6f92a070686659f8c Mon Sep 17 00:00:00 2001 From: Martmists Date: Fri, 7 Feb 2025 21:02:37 +0100 Subject: [PATCH 029/227] [AHIT] Fix small options issue (#4615) --- worlds/ahit/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/ahit/Options.py b/worlds/ahit/Options.py index 17c4b95efc..b331ca5242 100644 --- a/worlds/ahit/Options.py +++ b/worlds/ahit/Options.py @@ -338,7 +338,7 @@ class MinExtraYarn(Range): There must be at least this much more yarn over the total number of yarn needed to craft all hats. For example, if this option's value is 10, and the total yarn needed to craft all hats is 40, there must be at least 50 yarn in the pool.""" - display_name = "Max Extra Yarn" + display_name = "Min Extra Yarn" range_start = 5 range_end = 15 default = 10 From 768ccffe722551f6225c70003906f2b787bffdd0 Mon Sep 17 00:00:00 2001 From: Kory Dondzila Date: Fri, 7 Feb 2025 15:06:06 -0500 Subject: [PATCH 030/227] Shivers: Update shivers links and guides (#4592) --- worlds/shivers/docs/en_Shivers.md | 4 +++- worlds/shivers/docs/setup_en.md | 12 +++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/worlds/shivers/docs/en_Shivers.md b/worlds/shivers/docs/en_Shivers.md index 9490b577bd..f36cbcce36 100644 --- a/worlds/shivers/docs/en_Shivers.md +++ b/worlds/shivers/docs/en_Shivers.md @@ -9,6 +9,7 @@ configuration file. All Ixupi pot pieces are randomized. Keys have been added to the game to lock off different rooms in the museum, these are randomized. Crawling has been added and is required to use any crawl space. +Randomization can also control if Ixupi pots are in pieces, mixed, or complete, and in which worlds they will show up in. ## What is considered a location check in Shivers? @@ -27,4 +28,5 @@ Victory is achieved when the player has captured the required number Ixupi set i ## Encountered a bug? -Please contact GodlFire or Cynbel_Terreus on Discord for bugs related to Shivers world generation or the Shivers Randomizer. +Please contact GodlFire or Cynbel_Terreus on Discord for bugs related to Shivers world generation or the Shivers Randomizer. +You may also open issues for the Shivers Randomizer Client [here](https://github.com/Shivers-Randomizer/Shivers-Randomizer/issues). diff --git a/worlds/shivers/docs/setup_en.md b/worlds/shivers/docs/setup_en.md index a495c87b22..5d73a81b29 100644 --- a/worlds/shivers/docs/setup_en.md +++ b/worlds/shivers/docs/setup_en.md @@ -5,12 +5,12 @@ - [Shivers (GOG version)](https://www.gog.com/en/game/shivers) or original disc - [ScummVM](https://www.scummvm.org/downloads/) version 2.7.0 or later -- [Shivers Randomizer](https://github.com/GodlFire/Shivers-Randomizer-CSharp/releases/latest) Latest release version +- [Shivers Randomizer Client](https://github.com/Shivers-Randomizer/Shivers-Randomizer/releases/latest) Latest release version ## Optional Software - [PopTracker](https://github.com/black-sliver/PopTracker/releases/) - - [Jax's Shivers PopTracker pack](https://github.com/blazik-barth/Shivers-Tracker/releases/) + - [Shivers PopTracker pack](https://github.com/Shivers-Randomizer/Shivers-AP-Tracker/releases/latest) ## Setup ScummVM for Shivers @@ -59,7 +59,9 @@ validator page: [YAML Validation page](/mysterycheck) ## What is a check -- Every puzzle -- Every puzzle hint/solution -- Every document that is considered a Flashback +- All puzzles +- All puzzle hints or solutions +- All documents that are considered Flashbacks +- All Ixupi captures (Lightning only if early) - Optionally information plaques +- Optionally elevators From f75a1ae1174fb467e5c5bd5568d7de3c806d5b1c Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 8 Feb 2025 00:06:04 +0100 Subject: [PATCH 031/227] KH2: Fix lambda capture issue with weapon slot logic (#4604) * KH2: Fix lambda capture issue with weapon slot logic * Update Rules.py * Improved by JaredWeakStrike (#4605) * Apparently this wasn't meant to be indented --------- Co-authored-by: JaredWeakStrike <96694163+JaredWeakStrike@users.noreply.github.com> --- worlds/kh2/Rules.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/worlds/kh2/Rules.py b/worlds/kh2/Rules.py index 767c564341..a59fbfd8ab 100644 --- a/worlds/kh2/Rules.py +++ b/worlds/kh2/Rules.py @@ -263,7 +263,10 @@ class KH2WorldRules(KH2Rules): weapon_region = self.multiworld.get_region(RegionName.Keyblade, self.player) for location in weapon_region.locations: - add_rule(location, lambda state: state.has(exclusion_table["WeaponSlots"][location.name], self.player)) + if location.name in exclusion_table["WeaponSlots"]: # shop items and starting items are not in this list + exclusion_item = exclusion_table["WeaponSlots"][location.name] + add_rule(location, lambda state, e_item=exclusion_item: state.has(e_item, self.player)) + if location.name in Goofy_Checks: add_item_rule(location, lambda item: item.player == self.player and item.name in GoofyAbility_Table.keys()) elif location.name in Donald_Checks: From f5c574c37ac6283cb360432e6c5b5cc35b2d1780 Mon Sep 17 00:00:00 2001 From: qwint Date: Sun, 9 Feb 2025 06:11:27 -0500 Subject: [PATCH 032/227] Settings: add format handling to yaml exception marks for readability (#4531) --- settings.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/settings.py b/settings.py index 14d4ba30ce..255c537fe0 100644 --- a/settings.py +++ b/settings.py @@ -792,7 +792,17 @@ class Settings(Group): if location: from Utils import parse_yaml with open(location, encoding="utf-8-sig") as f: - options = parse_yaml(f.read()) + from yaml.error import MarkedYAMLError + try: + options = parse_yaml(f.read()) + except MarkedYAMLError as ex: + if ex.problem_mark: + f.seek(0) + lines = f.readlines() + problem_line = lines[ex.problem_mark.line] + error_line = " " * ex.problem_mark.column + "^" + raise Exception(f"{ex.context} {ex.problem}\n{problem_line}{error_line}") + raise ex # TODO: detect if upgrade is required # TODO: once we have a cache for _world_settings_name_cache, detect if any game section is missing self.update(options or {}) From 359f45d50f3872fe097b6e605faf494398c8ff8a Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Sun, 9 Feb 2025 13:12:17 -0500 Subject: [PATCH 033/227] TUNIC: Combat logic fix (#4589) * Potential fix for attack issue * also put the lazy version of the swamp fix in for good measure * fix extra line * now it is good * Add the test, roll the other PR into this one * Make the test exception more useful * Remove debug print * Combat logic fixed? * Move a few areas to before well instead of east forest * Put in qwint's suggestions in test * Implement qwint's suggestions in combat_logic.py * Implement qwint's suggestions for combat_logic.py * Fix typo * Remove experimental from combat logic description * Remove copy_mixin again * Add comment about copy_mixin * Use a more proper random * Some optimizations from Vi's comments --- worlds/tunic/combat_logic.py | 308 +++++++++++++++++-------------- worlds/tunic/er_rules.py | 20 +- worlds/tunic/options.py | 1 - worlds/tunic/test/test_combat.py | 83 +++++++++ 4 files changed, 261 insertions(+), 151 deletions(-) create mode 100644 worlds/tunic/test/test_combat.py diff --git a/worlds/tunic/combat_logic.py b/worlds/tunic/combat_logic.py index 9ff363942c..2e490d1dad 100644 --- a/worlds/tunic/combat_logic.py +++ b/worlds/tunic/combat_logic.py @@ -8,6 +8,7 @@ from worlds.AutoWorld import LogicMixin # the vanilla stats you are expected to have to get through an area, based on where they are in vanilla class AreaStats(NamedTuple): + """Attack, Defense, Potion, HP, SP, MP, Flasks, Equipment, is_boss""" att_level: int def_level: int potion_level: int # all 3 are before your first bonfire after getting the upgrade page, third costs 1k @@ -41,7 +42,7 @@ area_data: Dict[str, AreaStats] = { "Rooted Ziggurat": AreaStats(5, 5, 3, 5, 3, 3, 6, ["Sword", "Shield", "Magic"]), "Boss Scavenger": AreaStats(5, 5, 3, 5, 3, 3, 6, ["Sword", "Shield", "Magic"], is_boss=True), "Swamp": AreaStats(1, 1, 1, 1, 1, 1, 6, ["Sword", "Shield", "Magic"]), - "Cathedral": AreaStats(1, 1, 1, 1, 1, 1, 6, ["Sword", "Shield", "Magic"]), + # Cathedral has the same requirements as Swamp # marked as boss because the garden knights can't get hurt by stick "Gauntlet": AreaStats(1, 1, 1, 1, 1, 1, 6, ["Sword", "Shield", "Magic"], is_boss=True), "The Heir": AreaStats(5, 5, 3, 5, 3, 3, 6, ["Sword", "Shield", "Magic", "Laurels"], is_boss=True), @@ -49,8 +50,10 @@ area_data: Dict[str, AreaStats] = { # these are used for caching which areas can currently be reached in state +# Gauntlet does not have exclusively higher stat requirements, so it will be checked separately boss_areas: List[str] = [name for name, data in area_data.items() if data.is_boss and name != "Gauntlet"] -non_boss_areas: List[str] = [name for name, data in area_data.items() if not data.is_boss] +# Swamp does not have exclusively higher stat requirements, so it will be checked separately +non_boss_areas: List[str] = [name for name, data in area_data.items() if not data.is_boss and name != "Swamp"] class CombatState(IntEnum): @@ -89,6 +92,7 @@ def has_combat_reqs(area_name: str, state: CollectionState, player: int) -> bool elif area_name in non_boss_areas: area_list = non_boss_areas else: + # this is to check Swamp and Gauntlet on their own area_list = [area_name] if met_combat_reqs: @@ -114,88 +118,99 @@ def check_combat_reqs(area_name: str, state: CollectionState, player: int, alt_d extra_att_needed = 0 extra_def_needed = 0 extra_mp_needed = 0 - has_magic = state.has_any({"Magic Wand", "Gun"}, player) - stick_bool = False - sword_bool = False + has_magic = state.has_any(("Magic Wand", "Gun"), player) + sword_bool = has_sword(state, player) + stick_bool = sword_bool or has_melee(state, player) + equipment = data.equipment.copy() for item in data.equipment: if item == "Stick": - if not has_melee(state, player): + if not stick_bool: if has_magic: + equipment.remove("Stick") + if "Magic" not in equipment: + equipment.append("Magic") # magic can make up for the lack of stick extra_mp_needed += 2 - extra_att_needed -= 16 + extra_att_needed -= 32 else: return False - else: - stick_bool = True elif item == "Sword": - if not has_sword(state, player): + if not sword_bool: # need sword for bosses if data.is_boss: return False + equipment.remove("Sword") if has_magic: + if "Magic" not in equipment: + equipment.append("Magic") # +4 mp pretty much makes up for the lack of sword, at least in Quarry extra_mp_needed += 4 - # stick is a backup plan, and doesn't scale well, so let's require a little less - extra_att_needed -= 2 - elif has_melee(state, player): + if stick_bool: + # stick is a backup plan, and doesn't scale well, so let's require a little less + equipment.append("Stick") + extra_att_needed -= 2 + else: + extra_mp_needed += 2 + extra_att_needed -= 32 + elif stick_bool: + equipment.append("Stick") # may revise this later based on feedback extra_att_needed += 3 extra_def_needed += 2 else: return False - else: - sword_bool = True + # just increase the stat requirement, we'll check for shield when calculating defense elif item == "Shield": - if not state.has("Shield", player): - extra_def_needed += 2 + equipment.remove("Shield") + extra_def_needed += 2 + elif item == "Laurels": if not state.has("Hero's Laurels", player): - # these are entirely based on vibes - extra_att_needed += 2 - extra_def_needed += 3 + # require Laurels for the Heir + return False + elif item == "Magic": if not has_magic: + equipment.remove("Magic") extra_att_needed += 2 extra_def_needed += 2 - extra_mp_needed -= 16 + extra_mp_needed -= 32 + modified_stats = AreaStats(data.att_level + extra_att_needed, data.def_level + extra_def_needed, data.potion_level, - data.hp_level, data.sp_level, data.mp_level + extra_mp_needed, data.potion_count) - if not has_required_stats(modified_stats, state, player): + data.hp_level, data.sp_level, data.mp_level + extra_mp_needed, data.potion_count, + equipment, data.is_boss) + if has_required_stats(modified_stats, state, player): + return True + else: # we may need to check if you would have the required stats if you were missing a weapon - # it's kinda janky, but these only get hit in less than once per 100 generations, so whatever - if sword_bool and "Sword" in data.equipment and "Magic" in data.equipment: - # we need to check if you would have the required stats if you didn't have melee - equip_list = [item for item in data.equipment if item != "Sword"] - more_modified_stats = AreaStats(data.att_level - 16, data.def_level, data.potion_level, - data.hp_level, data.sp_level, data.mp_level + 4, data.potion_count, - equip_list) + if sword_bool and "Sword" in equipment and has_magic: + # we need to check if you would have the required stats if you didn't have the sword + equip_list = [item for item in equipment if item != "Sword"] + if "Magic" not in equip_list: + equip_list.append("Magic") + more_modified_stats = AreaStats(modified_stats.att_level - 32, modified_stats.def_level, + modified_stats.potion_level, modified_stats.hp_level, + modified_stats.sp_level, modified_stats.mp_level + 4, + modified_stats.potion_count, equip_list, data.is_boss) if check_combat_reqs("none", state, player, more_modified_stats): return True - # and we need to check if you would have the required stats if you didn't have magic - equip_list = [item for item in data.equipment if item != "Magic"] - more_modified_stats = AreaStats(data.att_level + 2, data.def_level + 2, data.potion_level, - data.hp_level, data.sp_level, data.mp_level - 16, data.potion_count, - equip_list) - if check_combat_reqs("none", state, player, more_modified_stats): - return True - return False - - elif stick_bool and "Stick" in data.equipment and "Magic" in data.equipment: + elif stick_bool and "Stick" in equipment and has_magic: # we need to check if you would have the required stats if you didn't have the stick - equip_list = [item for item in data.equipment if item != "Stick"] - more_modified_stats = AreaStats(data.att_level - 16, data.def_level, data.potion_level, - data.hp_level, data.sp_level, data.mp_level + 4, data.potion_count, - equip_list) + equip_list = [item for item in equipment if item != "Stick"] + if "Magic" not in equip_list: + equip_list.append("Magic") + more_modified_stats = AreaStats(modified_stats.att_level - 32, modified_stats.def_level, + modified_stats.potion_level, modified_stats.hp_level, + modified_stats.sp_level, modified_stats.mp_level + 4, + modified_stats.potion_count, equip_list, data.is_boss) if check_combat_reqs("none", state, player, more_modified_stats): return True - return False else: return False - return True + return False # check if you have the required stats, and the money to afford them @@ -203,72 +218,63 @@ def check_combat_reqs(area_name: str, state: CollectionState, player: int, alt_d # but that's fine -- it's already pretty generous to begin with def has_required_stats(data: AreaStats, state: CollectionState, player: int) -> bool: money_required = 0 - player_att = 0 + att_required = data.att_level + player_att, att_offerings = get_att_level(state, player) - # check if we actually need the stat before checking state - if data.att_level > 1: - player_att, att_offerings = get_att_level(state, player) - if player_att < data.att_level: - return False + # if you have 2 more attack than needed, we can forego needing mp + if data.mp_level > 1: + if player_att < data.att_level + 2: + player_mp, mp_offerings = get_mp_level(state, player) + if player_mp < data.mp_level: + return False + else: + extra_mp = player_mp - data.mp_level + paid_mp = max(0, mp_offerings - extra_mp) + # mp costs 300 for the first, +50 for each additional + money_per_mp = 300 + for _ in range(paid_mp): + money_required += money_per_mp + money_per_mp += 50 else: - extra_att = player_att - data.att_level - paid_att = max(0, att_offerings - extra_att) - # attack upgrades cost 100 for the first, +50 for each additional - money_per_att = 100 - for _ in range(paid_att): - money_required += money_per_att - money_per_att += 50 + att_required += 2 + + if player_att < att_required: + return False + else: + extra_att = player_att - att_required + paid_att = max(0, att_offerings - extra_att) + # attack upgrades cost 100 for the first, +50 for each additional + money_per_att = 100 + for _ in range(paid_att): + money_required += money_per_att + money_per_att += 50 # adding defense and sp together since they accomplish similar things: making you take less damage if data.def_level + data.sp_level > 2: player_def, def_offerings = get_def_level(state, player) player_sp, sp_offerings = get_sp_level(state, player) - if player_def + player_sp < data.def_level + data.sp_level: + req_stats = data.def_level + data.sp_level + if player_def + player_sp < req_stats: return False else: free_def = player_def - def_offerings free_sp = player_sp - sp_offerings - paid_stats = data.def_level + data.sp_level - free_def - free_sp - sp_to_buy = 0 - - if paid_stats <= 0: - # if you don't have to pay for any stats, you don't need money for these upgrades - def_to_buy = 0 - elif paid_stats <= def_offerings: - # get the amount needed to buy these def offerings - def_to_buy = paid_stats + if free_sp + free_def >= req_stats: + # you don't need to buy upgrades + pass else: - def_to_buy = def_offerings - sp_to_buy = max(0, paid_stats - def_offerings) - - # if you have to buy more than 3 def, it's cheaper to buy 1 extra sp - if def_to_buy > 3 and sp_offerings > 0: - def_to_buy -= 1 - sp_to_buy += 1 - # def costs 100 for the first, +50 for each additional - money_per_def = 100 - for _ in range(def_to_buy): - money_required += money_per_def - money_per_def += 50 - # sp costs 200 for the first, +200 for each additional - money_per_sp = 200 - for _ in range(sp_to_buy): - money_required += money_per_sp - money_per_sp += 200 - - # if you have 2 more attack than needed, we can forego needing mp - if data.mp_level > 1 and player_att < data.att_level + 2: - player_mp, mp_offerings = get_mp_level(state, player) - if player_mp < data.mp_level: - return False - else: - extra_mp = player_mp - data.mp_level - paid_mp = max(0, mp_offerings - extra_mp) - # mp costs 300 for the first, +50 for each additional - money_per_mp = 300 - for _ in range(paid_mp): - money_required += money_per_mp - money_per_mp += 50 + # we need to pick the cheapest option that gets us above the stats we need + # first number is def, second number is sp + upgrade_options: set[tuple[int, int]] = set() + stats_to_buy = req_stats - free_def - free_sp + for paid_def in range(0, min(def_offerings + 1, stats_to_buy + 1)): + sp_required = stats_to_buy - paid_def + if sp_offerings >= sp_required: + if sp_required < 0: + break + upgrade_options.add((paid_def, stats_to_buy - paid_def)) + costs = [calc_def_sp_cost(defense, sp) for defense, sp in upgrade_options] + money_required += min(costs) req_effective_hp = calc_effective_hp(data.hp_level, data.potion_level, data.potion_count) player_potion, potion_offerings = get_potion_level(state, player) @@ -279,53 +285,30 @@ def has_required_stats(data: AreaStats, state: CollectionState, player: int) -> return False else: # need a way to determine which of potion offerings or hp offerings you can reduce - # your level if you didn't pay for offerings free_potion = player_potion - potion_offerings free_hp = player_hp - hp_offerings - paid_hp_count = 0 - paid_potion_count = 0 if calc_effective_hp(free_hp, free_potion, player_potion_count) >= req_effective_hp: # you don't need to buy upgrades pass - # if you have no potions, or no potion upgrades, you only need to check your hp upgrades - elif player_potion_count == 0 or potion_offerings == 0: - # check if you have enough hp at each paid hp offering - for i in range(hp_offerings): - paid_hp_count = i + 1 - if calc_effective_hp(paid_hp_count, 0, player_potion_count) > req_effective_hp: - break else: - for i in range(potion_offerings): - paid_potion_count = i + 1 - if calc_effective_hp(free_hp, free_potion + paid_potion_count, player_potion_count) > req_effective_hp: - break - for j in range(hp_offerings): - paid_hp_count = j + 1 - if (calc_effective_hp(free_hp + paid_hp_count, free_potion + paid_potion_count, player_potion_count) - > req_effective_hp): + # we need to pick the cheapest option that gets us above the amount of effective HP we need + # first number is hp, second number is potion + upgrade_options: set[tuple[int, int]] = set() + # filter out exclusively worse options + lowest_hp_added = hp_offerings + 1 + for paid_potion in range(0, potion_offerings + 1): + # check quantities of hp offerings for each potion offering + for paid_hp in range(0, lowest_hp_added): + if (calc_effective_hp(free_hp + paid_hp, free_potion + paid_potion, player_potion_count) + >= req_effective_hp): + upgrade_options.add((paid_hp, paid_potion)) + lowest_hp_added = paid_hp break - # hp costs 200 for the first, +50 for each additional - money_per_hp = 200 - for _ in range(paid_hp_count): - money_required += money_per_hp - money_per_hp += 50 - # potion costs 100 for the first, 300 for the second, 1,000 for the third, and +200 for each additional - # currently we assume you will not buy past the second potion upgrade, but we might change our minds later - money_per_potion = 100 - for _ in range(paid_potion_count): - money_required += money_per_potion - if money_per_potion == 100: - money_per_potion = 300 - elif money_per_potion == 300: - money_per_potion = 1000 - else: - money_per_potion += 200 + costs = [calc_hp_potion_cost(hp, potion) for hp, potion in upgrade_options] + money_required += min(costs) - if money_required > get_money_count(state, player): - return False - - return True + return get_money_count(state, player) >= money_required # returns a tuple of your max attack level, the number of attack offerings @@ -336,7 +319,8 @@ def get_att_level(state: CollectionState, player: int) -> Tuple[int, int]: if sword_level >= 3: att_upgrades += min(2, sword_level - 2) # attack falls off, can just cap it at 8 for simplicity - return min(8, 1 + att_offerings + att_upgrades), att_offerings + return (min(8, 1 + att_offerings + att_upgrades) + + (1 if state.has("Hero's Laurels", player) else 0), att_offerings) # returns a tuple of your max defense level, the number of defense offerings @@ -344,7 +328,9 @@ def get_def_level(state: CollectionState, player: int) -> Tuple[int, int]: def_offerings = state.count("DEF Offering", player) # defense falls off, can just cap it at 8 for simplicity return (min(8, 1 + def_offerings - + state.count_from_list({"Hero Relic - DEF", "Secret Legend", "Phonomath"}, player)), + + state.count_from_list({"Hero Relic - DEF", "Secret Legend", "Phonomath"}, player)) + + (2 if state.has("Shield", player) else 0) + + (2 if state.has("Hero's Laurels", player) else 0), def_offerings) @@ -408,6 +394,46 @@ def get_money_count(state: CollectionState, player: int) -> int: return money +def calc_hp_potion_cost(hp_upgrades: int, potion_upgrades: int) -> int: + money = 0 + + # hp costs 200 for the first, +50 for each additional + money_per_hp = 200 + for _ in range(hp_upgrades): + money += money_per_hp + money_per_hp += 50 + + # potion costs 100 for the first, 300 for the second, 1,000 for the third, and +200 for each additional + # currently we assume you will not buy past the second potion upgrade, but we might change our minds later + money_per_potion = 100 + for _ in range(potion_upgrades): + money += money_per_potion + if money_per_potion == 100: + money_per_potion = 300 + elif money_per_potion == 300: + money_per_potion = 1000 + else: + money_per_potion += 200 + + return money + + +def calc_def_sp_cost(def_upgrades: int, sp_upgrades: int) -> int: + money = 0 + + money_per_def = 100 + for _ in range(def_upgrades): + money += money_per_def + money_per_def += 50 + + money_per_sp = 200 + for _ in range(sp_upgrades): + money += money_per_sp + money_per_sp += 200 + + return money + + class TunicState(LogicMixin): tunic_need_to_reset_combat_from_collect: Dict[int, bool] tunic_need_to_reset_combat_from_remove: Dict[int, bool] @@ -420,3 +446,5 @@ class TunicState(LogicMixin): self.tunic_need_to_reset_combat_from_remove = defaultdict(lambda: False) # the per-player, per-area state of combat checking -- unchecked, failed, or succeeded self.tunic_area_combat_state = defaultdict(lambda: defaultdict(lambda: CombatState.unchecked)) + # a copy_mixin was intentionally excluded because the empty state from init_mixin + # will always be appropriate for recalculating the logic cache diff --git a/worlds/tunic/er_rules.py b/worlds/tunic/er_rules.py index 08b088f7e4..4d0a462cbb 100644 --- a/worlds/tunic/er_rules.py +++ b/worlds/tunic/er_rules.py @@ -1386,9 +1386,9 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ # need to fight through the rudelings and turret, or just laurels from near the windmill set_rule(ow_to_well_entry, lambda state: state.has(laurels, player) - or has_combat_reqs("East Forest", state, player)) + or has_combat_reqs("Before Well", state, player)) set_rule(ow_tunnel_beach, - lambda state: has_combat_reqs("East Forest", state, player)) + lambda state: has_combat_reqs("Before Well", state, player)) add_rule(atoll_statue, lambda state: has_combat_reqs("Ruined Atoll", state, player)) @@ -1467,12 +1467,12 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ set_rule(cath_entry_to_elev, lambda state: options.entrance_rando or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - or (has_ability(prayer, state, world) and has_combat_reqs("Cathedral", state, player))) + or (has_ability(prayer, state, world) and has_combat_reqs("Swamp", state, player))) set_rule(cath_entry_to_main, - lambda state: has_combat_reqs("Cathedral", state, player)) + lambda state: has_combat_reqs("Swamp", state, player)) set_rule(cath_elev_to_main, - lambda state: has_combat_reqs("Cathedral", state, player)) + lambda state: has_combat_reqs("Swamp", state, player)) # for spots where you can go into and come out of an entrance to reset enemy aggro if world.options.entrance_rando: @@ -1835,10 +1835,10 @@ def set_er_location_rules(world: "TunicWorld") -> None: combat_logic_to_loc("Overworld - [Northeast] Chest Above Patrol Cave", "Garden Knight", dagger=True) combat_logic_to_loc("Overworld - [Southwest] West Beach Guarded By Turret", "Overworld", dagger=True) combat_logic_to_loc("Overworld - [Southwest] West Beach Guarded By Turret 2", "Overworld") - combat_logic_to_loc("Overworld - [Southwest] Bombable Wall Near Fountain", "East Forest", dagger=True) - combat_logic_to_loc("Overworld - [Southwest] Fountain Holy Cross", "East Forest", dagger=True) - combat_logic_to_loc("Overworld - [Southwest] South Chest Near Guard", "East Forest", dagger=True) - combat_logic_to_loc("Overworld - [Southwest] Tunnel Guarded By Turret", "East Forest", dagger=True) + combat_logic_to_loc("Overworld - [Southwest] Bombable Wall Near Fountain", "Before Well", dagger=True) + combat_logic_to_loc("Overworld - [Southwest] Fountain Holy Cross", "Before Well", dagger=True) + combat_logic_to_loc("Overworld - [Southwest] South Chest Near Guard", "Before Well", dagger=True) + combat_logic_to_loc("Overworld - [Southwest] Tunnel Guarded By Turret", "Before Well", dagger=True) combat_logic_to_loc("Overworld - [Northwest] Chest Near Turret", "Before Well") add_rule(world.get_location("Hourglass Cave - Hourglass Chest"), @@ -1927,4 +1927,4 @@ def set_er_location_rules(world: "TunicWorld") -> None: # zip through the rubble to sneakily grab this chest, or just fight to it add_rule(world.get_location("Cathedral - [1F] Near Spikes"), - lambda state: laurels_zip(state, world) or has_combat_reqs("Cathedral", state, player)) + lambda state: laurels_zip(state, world) or has_combat_reqs("Swamp", state, player)) diff --git a/worlds/tunic/options.py b/worlds/tunic/options.py index 8fe2ea5ce8..d2ea828037 100644 --- a/worlds/tunic/options.py +++ b/worlds/tunic/options.py @@ -197,7 +197,6 @@ class TunicPlandoConnections(PlandoConnections): class CombatLogic(Choice): """ - EXPERIMENTAL - may cause gen failures, especially when playthrough generation for the spoiler log is enabled, and may have slight logic issues. If enabled, the player will logically require a combination of stat upgrade items and equipment to get some checks or navigate to some areas, with a goal of matching the vanilla combat difficulty. The player may still be expected to run past enemies, reset aggro (by using a checkpoint or doing a scene transition), or find sneaky paths to checks. This option marks many more items as progression and may force weapons much earlier than normal. diff --git a/worlds/tunic/test/test_combat.py b/worlds/tunic/test/test_combat.py new file mode 100644 index 0000000000..866dc5f814 --- /dev/null +++ b/worlds/tunic/test/test_combat.py @@ -0,0 +1,83 @@ +from BaseClasses import ItemClassification +from collections import Counter + +from . import TunicTestBase +from .. import options +from ..combat_logic import (check_combat_reqs, area_data, get_money_count, calc_effective_hp, get_potion_level, + get_hp_level, get_def_level, get_sp_level) +from ..items import item_table +from .. import TunicWorld + + +class TestCombat(TunicTestBase): + options = {options.CombatLogic.internal_name: options.CombatLogic.option_on} + player = 1 + world: TunicWorld + combat_items = [] + # these are items that are progression that do not contribute to combat logic + # it's listed as using skipped items instead of a list of viable items so that if we add/remove some later, + # that this won't require updates most likely + # Stick and Sword are in here because sword progression is the clear determining case here + skipped_items = {"Fairy", "Stick", "Sword", "Magic Dagger", "Magic Orb", "Lantern", "Old House Key", "Key", + "Fortress Vault Key", "Golden Coin", "Red Questagon", "Green Questagon", "Blue Questagon", + "Scavenger Mask", "Pages 24-25 (Prayer)", "Pages 42-43 (Holy Cross)", "Pages 52-53 (Icebolt)"} + # converts golden trophies to their hero relic stat equivalent, for easier parsing + converter = { + "Secret Legend": "Hero Relic - DEF", + "Phonomath": "Hero Relic - DEF", + "Just Some Pals": "Hero Relic - POTION", + "Spring Falls": "Hero Relic - POTION", + "Back To Work": "Hero Relic - POTION", + "Mr Mayor": "Hero Relic - SP", + "Power Up": "Hero Relic - SP", + "Regal Weasel": "Hero Relic - SP", + "Forever Friend": "Hero Relic - SP", + "Sacred Geometry": "Hero Relic - MP", + "Vintage": "Hero Relic - MP", + "Dusty": "Hero Relic - MP", + } + skipped_items.update({item for item in item_table.keys() if item.startswith("Ladder")}) + for item, data in item_table.items(): + if item in skipped_items: + continue + ic = data.combat_ic or data.classification + if item in converter: + item = converter[item] + if ItemClassification.progression in ic: + combat_items += [item] * data.quantity_in_item_pool + + # we had an issue where collecting certain items brought certain areas out of logic + # due to the weirdness of swapping between "you have enough attack that you don't need magic" + # so this will make sure collecting an item doesn't bring something out of logic + def test_combat_doesnt_fail_backwards(self): + combat_items = self.combat_items.copy() + self.multiworld.worlds[1].random.shuffle(combat_items) + curr_statuses = {name: False for name in area_data.keys()} + prev_statuses = curr_statuses.copy() + area_names = list(area_data.keys()) + current_items = Counter() + for current_item_name in combat_items: + current_items[current_item_name] += 1 + current_item = TunicWorld.create_item(self.world, current_item_name) + self.collect(current_item) + self.multiworld.worlds[1].random.shuffle(area_names) + for area in area_names: + curr_statuses[area] = check_combat_reqs(area, self.multiworld.state, self.player) + if curr_statuses[area] < prev_statuses[area]: + data = area_data[area] + state = self.multiworld.state + player = self.player + req_effective_hp = calc_effective_hp(data.hp_level, data.potion_level, data.potion_count) + player_potion, potion_offerings = get_potion_level(state, player) + player_hp, hp_offerings = get_hp_level(state, player) + player_def, def_offerings = get_def_level(state, player) + player_sp, sp_offerings = get_sp_level(state, player) + raise Exception(f"Status for {area} decreased after collecting {current_item_name}.\n" + f"Current items: {current_items}.\n" + f"Total money: {get_money_count(self.multiworld.state, self.player)}.\n" + f"Required Effective HP: {req_effective_hp}.\n" + f"Free HP and Offerings: {player_hp - hp_offerings}, {hp_offerings}\n" + f"Free Potion and Offerings: {player_potion - potion_offerings}, {potion_offerings}\n" + f"Free Def and Offerings: {player_def - def_offerings}, {def_offerings}\n" + f"Free SP and Offerings: {player_sp - sp_offerings}, {sp_offerings}") + prev_statuses[area] = curr_statuses[area] From 18bcaa85a27890de47e623c630a65dddb3d644d4 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Mon, 10 Feb 2025 19:18:14 +0100 Subject: [PATCH 034/227] Test: ensure get_all_state() does not error in between steps (#4612) --- test/general/test_state.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 test/general/test_state.py diff --git a/test/general/test_state.py b/test/general/test_state.py new file mode 100644 index 0000000000..460fc3d608 --- /dev/null +++ b/test/general/test_state.py @@ -0,0 +1,29 @@ +import unittest + +from worlds.AutoWorld import AutoWorldRegister, call_all +from . import setup_solo_multiworld + + +class TestBase(unittest.TestCase): + gen_steps = ( + "generate_early", + "create_regions", + ) + + test_steps = ( + "create_items", + "set_rules", + "connect_entrances", + "generate_basic", + "pre_fill", + ) + + def test_all_state_is_available(self): + """Ensure all_state can be created at certain steps.""" + for game_name, world_type in AutoWorldRegister.world_types.items(): + with self.subTest("Game", game=game_name): + multiworld = setup_solo_multiworld(world_type, self.gen_steps) + for step in self.test_steps: + with self.subTest("Step", step=step): + call_all(multiworld, step) + self.assertTrue(multiworld.get_all_state(False, True)) From a298be9c41a60da209bf1eb6da15ff16f33350f1 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Mon, 10 Feb 2025 19:19:00 +0100 Subject: [PATCH 035/227] Core: change HINT_FOUND to 40 and HINT_UNSPECIFIED to 0 (#4620) --- NetUtils.py | 4 ++-- docs/network protocol.md | 4 ++-- kvui.py | 15 ++++++++++++--- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/NetUtils.py b/NetUtils.py index 5bcc583c53..f2ae2a63a0 100644 --- a/NetUtils.py +++ b/NetUtils.py @@ -12,11 +12,11 @@ from Utils import ByValue, Version class HintStatus(ByValue, enum.IntEnum): - HINT_FOUND = 0 - HINT_UNSPECIFIED = 1 + HINT_UNSPECIFIED = 0 HINT_NO_PRIORITY = 10 HINT_AVOID = 20 HINT_PRIORITY = 30 + HINT_FOUND = 40 class JSONMessagePart(typing.TypedDict, total=False): diff --git a/docs/network protocol.md b/docs/network protocol.md index e5d3b7e6c2..05a5334426 100644 --- a/docs/network protocol.md +++ b/docs/network protocol.md @@ -363,11 +363,11 @@ An enumeration containing the possible hint states. ```python import enum class HintStatus(enum.IntEnum): - HINT_FOUND = 0 # The location has been collected. Status cannot be changed once found. - HINT_UNSPECIFIED = 1 # The receiving player has not specified any status + HINT_UNSPECIFIED = 0 # The receiving player has not specified any status HINT_NO_PRIORITY = 10 # The receiving player has specified that the item is unneeded HINT_AVOID = 20 # The receiving player has specified that the item is detrimental HINT_PRIORITY = 30 # The receiving player has specified that the item is needed + HINT_FOUND = 40 # The location has been collected. Status cannot be changed once found. ``` - Hints for items with `ItemClassification.trap` default to `HINT_AVOID`. - Hints created with `LocationScouts`, `!hint_location`, or similar (hinting a location) default to `HINT_UNSPECIFIED`. diff --git a/kvui.py b/kvui.py index 6718e48bee..60042b00ec 100644 --- a/kvui.py +++ b/kvui.py @@ -444,8 +444,11 @@ class HintLabel(RecycleDataViewBehavior, BoxLayout): if child.collide_point(*touch.pos): key = child.sort_key if key == "status": - parent.hint_sorter = lambda element: element["status"]["hint"]["status"] - else: parent.hint_sorter = lambda element: remove_between_brackets.sub("", element[key]["text"]).lower() + parent.hint_sorter = lambda element: status_sort_weights[element["status"]["hint"]["status"]] + else: + parent.hint_sorter = lambda element: ( + remove_between_brackets.sub("", element[key]["text"]).lower() + ) if key == parent.sort_key: # second click reverses order parent.reversed = not parent.reversed @@ -829,7 +832,13 @@ status_colors: typing.Dict[HintStatus, str] = { HintStatus.HINT_AVOID: "salmon", HintStatus.HINT_PRIORITY: "plum", } - +status_sort_weights: dict[HintStatus, int] = { + HintStatus.HINT_FOUND: 0, + HintStatus.HINT_UNSPECIFIED: 1, + HintStatus.HINT_NO_PRIORITY: 2, + HintStatus.HINT_AVOID: 3, + HintStatus.HINT_PRIORITY: 4, +} class HintLog(RecycleView): From f4e43ca9e097f8301ce71bb0f53cbd9fca504a5d Mon Sep 17 00:00:00 2001 From: qwint Date: Mon, 10 Feb 2025 13:22:06 -0500 Subject: [PATCH 036/227] LttP: mock world.random in adjuster (#4623) --- LttPAdjuster.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/LttPAdjuster.py b/LttPAdjuster.py index 7e33a3d5ef..963557e8da 100644 --- a/LttPAdjuster.py +++ b/LttPAdjuster.py @@ -33,10 +33,15 @@ WINDOW_MIN_HEIGHT = 525 WINDOW_MIN_WIDTH = 425 class AdjusterWorld(object): + class AdjusterSubWorld(object): + def __init__(self, random): + self.random = random + def __init__(self, sprite_pool): import random self.sprite_pool = {1: sprite_pool} self.per_slot_randoms = {1: random} + self.worlds = {1: self.AdjusterSubWorld(random)} class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter): From e9c463c897449202c4e958fe5a13947eee3325f2 Mon Sep 17 00:00:00 2001 From: qwint Date: Mon, 10 Feb 2025 13:23:09 -0500 Subject: [PATCH 037/227] CC: Force Text Client to always connect with empty game (#4607) --- CommonClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CommonClient.py b/CommonClient.py index 996ba33005..eb38195216 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -1095,7 +1095,7 @@ def run_as_textclient(*args): if password_requested and not self.password: await super(TextContext, self).server_auth(password_requested) await self.get_username() - await self.send_connect() + await self.send_connect(game="") def on_package(self, cmd: str, args: dict): if cmd == "Connected": From dbf6b6f935c7b049c015a8a6830e078c769326ec Mon Sep 17 00:00:00 2001 From: qwint Date: Mon, 10 Feb 2025 13:23:58 -0500 Subject: [PATCH 038/227] CC: don't try to reconnect on invalid version (#4606) --- CommonClient.py | 1 + 1 file changed, 1 insertion(+) diff --git a/CommonClient.py b/CommonClient.py index eb38195216..33792f0ed2 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -907,6 +907,7 @@ async def process_server_cmd(ctx: CommonContext, args: dict): ctx.disconnected_intentionally = True ctx.event_invalid_game() elif 'IncompatibleVersion' in errors: + ctx.disconnected_intentionally = True raise Exception('Server reported your client version as incompatible. ' 'This probably means you have to update.') elif 'InvalidItemsHandling' in errors: From 910369a7f8d1e08744c616b59beedbeb5b2c3f90 Mon Sep 17 00:00:00 2001 From: PinkSwitch <52474902+PinkSwitch@users.noreply.github.com> Date: Mon, 10 Feb 2025 12:27:10 -0600 Subject: [PATCH 039/227] Bizhawk Client: Display Err (#4532) Co-authored-by: Bryce Wilson --- worlds/_bizhawk/context.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/_bizhawk/context.py b/worlds/_bizhawk/context.py index cb59050b84..accb5f94c4 100644 --- a/worlds/_bizhawk/context.py +++ b/worlds/_bizhawk/context.py @@ -238,6 +238,7 @@ def _patch_and_run_game(patch_file: str): return metadata except Exception as exc: logger.exception(exc) + Utils.messagebox("Error Patching Game", str(exc), True) return {} From f520c1d9f28d50850f7cb3b2cd58e5ad8984e43d Mon Sep 17 00:00:00 2001 From: qwint Date: Mon, 10 Feb 2025 13:34:27 -0500 Subject: [PATCH 040/227] Launcher: Allow for --nogui client launches (#4549) --- worlds/_bizhawk/client.py | 4 ++-- worlds/ahit/__init__.py | 4 ++-- worlds/factorio/__init__.py | 4 ++-- worlds/kh1/__init__.py | 4 ++-- worlds/kh2/__init__.py | 4 ++-- worlds/zork_grand_inquisitor/__init__.py | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/worlds/_bizhawk/client.py b/worlds/_bizhawk/client.py index ce75b864b8..16a8325a10 100644 --- a/worlds/_bizhawk/client.py +++ b/worlds/_bizhawk/client.py @@ -7,7 +7,7 @@ from __future__ import annotations import abc from typing import TYPE_CHECKING, Any, ClassVar -from worlds.LauncherComponents import Component, SuffixIdentifier, Type, components, launch_subprocess +from worlds.LauncherComponents import Component, SuffixIdentifier, Type, components, launch as launch_component if TYPE_CHECKING: from .context import BizHawkClientContext @@ -15,7 +15,7 @@ if TYPE_CHECKING: def launch_client(*args) -> None: from .context import launch - launch_subprocess(launch, name="BizHawkClient", args=args) + launch_component(launch, name="BizHawkClient", args=args) component = Component("BizHawk Client", "BizHawkClient", component_type=Type.CLIENT, func=launch_client, diff --git a/worlds/ahit/__init__.py b/worlds/ahit/__init__.py index 14cf13ec34..c2fe39872f 100644 --- a/worlds/ahit/__init__.py +++ b/worlds/ahit/__init__.py @@ -12,13 +12,13 @@ from .DeathWishRules import set_dw_rules, create_enemy_events, hit_list, bosses from worlds.AutoWorld import World, WebWorld, CollectionState from worlds.generic.Rules import add_rule from typing import List, Dict, TextIO -from worlds.LauncherComponents import Component, components, icon_paths, launch_subprocess, Type +from worlds.LauncherComponents import Component, components, icon_paths, launch as launch_component, Type from Utils import local_path def launch_client(): from .Client import launch - launch_subprocess(launch, name="AHITClient") + launch_component(launch, name="AHITClient") components.append(Component("A Hat in Time Client", "AHITClient", func=launch_client, diff --git a/worlds/factorio/__init__.py b/worlds/factorio/__init__.py index ca9f12f1b2..3f480527f5 100644 --- a/worlds/factorio/__init__.py +++ b/worlds/factorio/__init__.py @@ -8,7 +8,7 @@ import Utils import settings from BaseClasses import Region, Location, Item, Tutorial, ItemClassification from worlds.AutoWorld import World, WebWorld -from worlds.LauncherComponents import Component, components, Type, launch_subprocess +from worlds.LauncherComponents import Component, components, Type, launch as launch_component from worlds.generic import Rules from .Locations import location_pools, location_table from .Mod import generate_mod @@ -24,7 +24,7 @@ from .Technologies import base_tech_table, recipe_sources, base_technology_table def launch_client(): from .Client import launch - launch_subprocess(launch, name="FactorioClient") + launch_component(launch, name="FactorioClient") components.append(Component("Factorio Client", "FactorioClient", func=launch_client, component_type=Type.CLIENT)) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index 3b498acf46..ac0afca501 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -9,12 +9,12 @@ from .Options import KH1Options, kh1_option_groups from .Regions import connect_entrances, create_regions from .Rules import set_rules from .Presets import kh1_option_presets -from worlds.LauncherComponents import Component, components, Type, launch_subprocess +from worlds.LauncherComponents import Component, components, Type, launch as launch_component def launch_client(): from .Client import launch - launch_subprocess(launch, name="KH1 Client") + launch_component(launch, name="KH1 Client") components.append(Component("KH1 Client", "KH1Client", func=launch_client, component_type=Type.CLIENT)) diff --git a/worlds/kh2/__init__.py b/worlds/kh2/__init__.py index 59c77627ee..edc4305acc 100644 --- a/worlds/kh2/__init__.py +++ b/worlds/kh2/__init__.py @@ -3,7 +3,7 @@ from typing import List from BaseClasses import Tutorial, ItemClassification from Fill import fast_fill -from worlds.LauncherComponents import Component, components, Type, launch_subprocess +from worlds.LauncherComponents import Component, components, Type, launch as launch_component from worlds.AutoWorld import World, WebWorld from .Items import * from .Locations import * @@ -17,7 +17,7 @@ from .Subclasses import KH2Item def launch_client(): from .Client import launch - launch_subprocess(launch, name="KH2Client") + launch_component(launch, name="KH2Client") components.append(Component("KH2 Client", "KH2Client", func=launch_client, component_type=Type.CLIENT)) diff --git a/worlds/zork_grand_inquisitor/__init__.py b/worlds/zork_grand_inquisitor/__init__.py index 4da257e47b..791f41dd00 100644 --- a/worlds/zork_grand_inquisitor/__init__.py +++ b/worlds/zork_grand_inquisitor/__init__.py @@ -5,7 +5,7 @@ from .world import ZorkGrandInquisitorWorld def launch_client() -> None: from .client import main - LauncherComponents.launch_subprocess(main, name="ZorkGrandInquisitorClient") + LauncherComponents.launch(main, name="ZorkGrandInquisitorClient") LauncherComponents.components.append( From f1769a8d0070dad489e35edb481e81ba0330c95f Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Wed, 12 Feb 2025 19:45:03 +0300 Subject: [PATCH 041/227] Stardew Valley: Fixed Powdermelon and option inconsistencies (#4632) * - Fixed powdermelon season * - Improve cohesion in presets * - Update several tooltips to be more consistent and accurate --- worlds/stardew_valley/content/vanilla/base.py | 2 +- worlds/stardew_valley/options/options.py | 35 ++++++++++--------- worlds/stardew_valley/options/presets.py | 2 +- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/worlds/stardew_valley/content/vanilla/base.py b/worlds/stardew_valley/content/vanilla/base.py index 2c910df5d0..9e5f53eb86 100644 --- a/worlds/stardew_valley/content/vanilla/base.py +++ b/worlds/stardew_valley/content/vanilla/base.py @@ -140,7 +140,7 @@ base_game = BaseGameContentPack( Vegetable.broccoli: (HarvestCropSource(seed=Seed.broccoli, seasons=(Season.fall,)),), Vegetable.carrot: (HarvestCropSource(seed=Seed.carrot, seasons=(Season.spring,)),), - Fruit.powdermelon: (HarvestCropSource(seed=Seed.powdermelon, seasons=(Season.summer,)),), + Fruit.powdermelon: (HarvestCropSource(seed=Seed.powdermelon, seasons=(Season.winter,)),), Vegetable.summer_squash: (HarvestCropSource(seed=Seed.summer_squash, seasons=(Season.summer,)),), Fruit.strawberry: (HarvestCropSource(seed=Seed.strawberry, seasons=(Season.spring,)),), diff --git a/worlds/stardew_valley/options/options.py b/worlds/stardew_valley/options/options.py index f66ec3bdad..aaeeedd1b3 100644 --- a/worlds/stardew_valley/options/options.py +++ b/worlds/stardew_valley/options/options.py @@ -66,7 +66,8 @@ class Goal(Choice): class FarmType(Choice): - """What farm to play on?""" + """What farm to play on? + Custom farms are not supported""" internal_name = "farm_type" display_name = "Farm Type" default = "random" @@ -203,7 +204,7 @@ class SeasonRandomization(Choice): class Cropsanity(Choice): - """Formerly named "Seed Shuffle" + """ Pierre now sells a random amount of seasonal seeds and Joja sells them without season requirements, but only in huge packs. Disabled: All the seeds are unlocked from the start, there are no location checks for growing and harvesting crops Enabled: Seeds are unlocked as archipelago items, for each seed there is a location check for growing and harvesting that crop @@ -233,9 +234,9 @@ class BackpackProgression(Choice): class ToolProgression(Choice): """Shuffle the tool upgrades? Vanilla: Clint will upgrade your tools with metal bars. - Progressive: You will randomly find Progressive Tool upgrades. - Cheap: Tool Upgrades will cost 2/5th as much - Very Cheap: Tool Upgrades will cost 1/5th as much""" + Progressive: Your tools upgrades are randomized. + Cheap: Tool Upgrades have a 60% discount + Very Cheap: Tool Upgrades have an 80% discount""" internal_name = "tool_progression" display_name = "Tool Progression" default = 1 @@ -279,8 +280,8 @@ class BuildingProgression(Choice): Vanilla: You can buy each building normally. Progressive: You will receive the buildings and will be able to build the first one of each type for free, once it is received. If you want more of the same building, it will cost the vanilla price. - Cheap: Buildings will cost half as much - Very Cheap: Buildings will cost 1/5th as much + Cheap: Buildings will have a 50% discount + Very Cheap: Buildings will an 80% discount """ internal_name = "building_progression" display_name = "Building Progression" @@ -327,7 +328,7 @@ class ArcadeMachineLocations(Choice): class SpecialOrderLocations(Choice): """Shuffle Special Orders? - Disabled: The special orders are not included in the Archipelago shuffling. + Vanilla: The special orders are not included in the Archipelago shuffling. You may need to complete some of them anyway for their vanilla rewards Board Only: The Special Orders on the board in town are location checks Board and Qi: The Special Orders from Mr Qi's walnut room are checks, in addition to the board in town Short: All Special Order requirements are reduced by 40% @@ -377,12 +378,12 @@ class QuestLocations(NamedRange): class Fishsanity(Choice): - """Locations for catching a fish the first time? + """Locations for catching each fish the first time? None: There are no locations for catching fish Legendaries: Each of the 5 legendary fish are checks, plus the extended family if qi board is turned on Special: A curated selection of strong fish are checks Randomized: A random selection of fish are checks - All: Every single fish in the game is a location that contains an item. Pairs well with the Master Angler Goal + All: Every single fish in the game is a location that contains an item. Exclude Legendaries: Every fish except legendaries Exclude Hard Fish: Every fish under difficulty 80 Only Easy Fish: Every fish under difficulty 50 @@ -517,7 +518,7 @@ class Chefsanity(NamedRange): class Craftsanity(Choice): """Checks for crafting items? If enabled, all recipes purchased in shops will be checks as well. - Recipes obtained from other sources will depend on related archipelago settings + Recipes obtained from other sources will depend on their respective archipelago settings """ internal_name = "craftsanity" display_name = "Craftsanity" @@ -530,9 +531,9 @@ class Friendsanity(Choice): """Shuffle Friendships? None: Friendship hearts are earned normally Bachelors: Hearts with bachelors are shuffled - Starting NPCs: Hearts for NPCs available immediately are checks - All: Hearts for all npcs are checks, including Leo, Kent, Sandy, etc - All With Marriage: Hearts for all npcs are checks, including romance hearts up to 14 when applicable + Starting NPCs: Hearts for NPCs available immediately are shuffled + All: Hearts for all npcs are shuffled, including Leo, Kent, Sandy, etc + All With Marriage: All hearts for all npcs are shuffled, including romance hearts up to 14 when applicable """ internal_name = "friendsanity" display_name = "Friendsanity" @@ -577,7 +578,7 @@ class Walnutsanity(OptionSet): """Shuffle walnuts? Puzzles: Walnuts obtained from solving a special puzzle or winning a minigame Bushes: Walnuts that are in a bush and can be collected by clicking it - Dig spots: Walnuts that are underground and must be digged up. Includes Journal scrap walnuts + Dig Spots: Walnuts that are underground and must be digged up. Includes Journal scrap walnuts Repeatables: Random chance walnuts from normal actions (fishing, farming, combat, etc) """ internal_name = "walnutsanity" @@ -612,7 +613,7 @@ class NumberOfMovementBuffs(Range): class EnabledFillerBuffs(OptionSet): """Enable various permanent player buffs to roll as filler items - Luck: Increase daily luck + Luck: Increased daily luck Damage: Increased Damage % Defense: Increased Defense Immunity: Increased Immunity @@ -637,7 +638,7 @@ class EnabledFillerBuffs(OptionSet): class ExcludeGingerIsland(Toggle): """Exclude Ginger Island? This option will forcefully exclude everything related to Ginger Island from the slot. - If you pick a goal that requires Ginger Island, you cannot exclude it and it will get included anyway""" + If you pick a goal that requires Ginger Island, this option will get forced to 'false'""" internal_name = "exclude_ginger_island" display_name = "Exclude Ginger Island" default = 0 diff --git a/worlds/stardew_valley/options/presets.py b/worlds/stardew_valley/options/presets.py index c2c210e5ca..3dbb5ab3f5 100644 --- a/worlds/stardew_valley/options/presets.py +++ b/worlds/stardew_valley/options/presets.py @@ -122,7 +122,7 @@ medium_settings = { options.Friendsanity.internal_name: options.Friendsanity.option_starting_npcs, options.FriendsanityHeartSize.internal_name: 4, options.Booksanity.internal_name: options.Booksanity.option_power_skill, - options.Walnutsanity.internal_name: [WalnutsanityOptionName.puzzles], + options.Walnutsanity.internal_name: options.Walnutsanity.preset_none, options.NumberOfMovementBuffs.internal_name: 6, options.EnabledFillerBuffs.internal_name: options.EnabledFillerBuffs.preset_all, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, From b2162bb8e698fcc910377c3f76d5893c5f36ff3e Mon Sep 17 00:00:00 2001 From: qwint Date: Wed, 12 Feb 2025 11:46:07 -0500 Subject: [PATCH 042/227] Docs: clean up create_item/event example (#4596) * eyes * remove line wraps where unnecessary --- docs/world api.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/world api.md b/docs/world api.md index da74be70fb..6a45ccbf99 100644 --- a/docs/world api.md +++ b/docs/world api.md @@ -562,17 +562,13 @@ from .items import is_progression # this is just a dummy def create_item(self, item: str) -> MyGameItem: # this is called when AP wants to create an item by name (for plando) or when you call it from your own code - classification = ItemClassification.progression if is_progression(item) else - ItemClassification.filler - - -return MyGameItem(item, classification, self.item_name_to_id[item], - self.player) + classification = ItemClassification.progression if is_progression(item) else ItemClassification.filler + return MyGameItem(item, classification, self.item_name_to_id[item], self.player) def create_event(self, event: str) -> MyGameItem: # while we are at it, we can also add a helper to create events - return MyGameItem(event, True, None, self.player) + return MyGameItem(event, ItemClassification.progression, None, self.player) ``` #### create_items From 5c1ded1fe97a8f9fc5c69ac24d2832605c34347b Mon Sep 17 00:00:00 2001 From: threeandthreee Date: Wed, 12 Feb 2025 11:46:43 -0500 Subject: [PATCH 043/227] LADX: bomb as logical bush breaker #4636 --- worlds/ladx/LADXR/logic/requirements.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/ladx/LADXR/logic/requirements.py b/worlds/ladx/LADXR/logic/requirements.py index fa01627a15..4e1fe03b09 100644 --- a/worlds/ladx/LADXR/logic/requirements.py +++ b/worlds/ladx/LADXR/logic/requirements.py @@ -253,7 +253,7 @@ def isConsumable(item) -> bool: class RequirementsSettings: def __init__(self, options): - self.bush = OR(SWORD, MAGIC_POWDER, MAGIC_ROD, POWER_BRACELET, BOOMERANG) + self.bush = OR(SWORD, MAGIC_POWDER, MAGIC_ROD, POWER_BRACELET, BOOMERANG, BOMB) self.pit_bush = OR(SWORD, MAGIC_POWDER, MAGIC_ROD, BOOMERANG, BOMB) # unique self.attack = OR(SWORD, BOMB, BOW, MAGIC_ROD, BOOMERANG) self.attack_hookshot = OR(SWORD, BOMB, BOW, MAGIC_ROD, BOOMERANG, HOOKSHOT) # hinox, shrouded stalfos From c799531105808c45849aa282168a3efa1a58f2e7 Mon Sep 17 00:00:00 2001 From: Matthew Wells <91291346+richarm4@users.noreply.github.com> Date: Wed, 12 Feb 2025 08:47:17 -0800 Subject: [PATCH 044/227] Docs: Add missing plural in faq (#4622) --- WebHostLib/static/assets/faq/en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebHostLib/static/assets/faq/en.md b/WebHostLib/static/assets/faq/en.md index e64535b42d..96e526612b 100644 --- a/WebHostLib/static/assets/faq/en.md +++ b/WebHostLib/static/assets/faq/en.md @@ -22,7 +22,7 @@ players to rely upon each other to complete their game. While a multiworld game traditionally requires all players to be playing the same game, a multi-game multiworld allows players to randomize any of the supported games, and send items between them. This allows players of different -games to interact with one another in a single multiplayer environment. Archipelago supports multi-game multiworld. +games to interact with one another in a single multiplayer environment. Archipelago supports multi-game multiworlds. Here is a list of our [Supported Games](https://archipelago.gg/games). ## Can I generate a single-player game with Archipelago? From efd5004330e2cb25bac094a2b78f370cacece635 Mon Sep 17 00:00:00 2001 From: JoshuaEagles Date: Wed, 12 Feb 2025 11:47:43 -0500 Subject: [PATCH 045/227] Docs: Update SA2B Linux and Steam Deck Setup Guide + Add Celeste 64 Linux Setup Guide (#4593) * Update Linux and Steam Deck setup guide for sa2b * Add Linux and Steam Deck setup guide for Celeste 64 --- worlds/celeste64/docs/guide_en.md | 8 +++++-- worlds/sa2b/docs/setup_en.md | 36 ++++++++++++++----------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/worlds/celeste64/docs/guide_en.md b/worlds/celeste64/docs/guide_en.md index 74ab94b913..87ebf09f75 100644 --- a/worlds/celeste64/docs/guide_en.md +++ b/worlds/celeste64/docs/guide_en.md @@ -12,6 +12,12 @@ 1. Download the above release and extract it. +## Installation Procedures (Linux and Steam Deck) + +1. Download the above release and extract it. + +2. Add Celeste64.exe to Steam as a Non-Steam Game. In the properties for it on Steam, set it to use Proton as the compatibility tool. Launch the game through Steam in order to run it. + ## Joining a MultiWorld Game 1. Before launching the game, edit the `AP.json` file in the root of the Celeste 64 install. @@ -33,5 +39,3 @@ An Example `AP.json` file: "Password": "" } ``` - - diff --git a/worlds/sa2b/docs/setup_en.md b/worlds/sa2b/docs/setup_en.md index f32001a678..c34e45ce9b 100644 --- a/worlds/sa2b/docs/setup_en.md +++ b/worlds/sa2b/docs/setup_en.md @@ -5,7 +5,7 @@ - Sonic Adventure 2: Battle from: [Sonic Adventure 2: Battle Steam Store Page](https://store.steampowered.com/app/213610/Sonic_Adventure_2/) - The Battle DLC is required if you choose to add Chao Karate locations to the randomizer - SA Mod Manager from: [SA Mod Manager GitHub Releases Page](https://github.com/X-Hax/SA-Mod-Manager/releases) -- .NET Desktop Runtime 7.0 from: [.NET Desktop Runtime 7.0 Download Page](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-7.0.9-windows-x64-installer) +- .NET Desktop Runtime 8.0 from: [.NET Desktop Runtime 8.0 Download Page](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.12-windows-x64-installer) - Archipelago Mod for Sonic Adventure 2: Battle from: [Sonic Adventure 2: Battle Archipelago Randomizer Mod Releases Page](https://github.com/PoryGone/SA2B_Archipelago/releases/) @@ -36,27 +36,23 @@ 1. Install Sonic Adventure 2: Battle from Steam. -2. In the properties for Sonic Adventure 2 on Steam, force the use of Proton Experimental as the compatibility tool. +2. Launch the game at least once without mods. -3. Launch the game at least once without mods. +3. Create both a `/mods` directory and a `/SAManager` directory in the folder into which you installed Sonic Adventure 2: Battle. -4. Create both a `/mods` directory and a `/SAManager` directory in the folder into which you installed Sonic Adventure 2: Battle. +4. Unpack the Archipelago Mod into this folder, so that `/mods/SA2B_Archipelago` is a valid path. -5. Install SA Mod Manager as per [its instructions](https://github.com/X-Hax/SA-Mod-Manager/tree/master?tab=readme-ov-file). Specifically, extract SAModManager.exe file to the folder that Sonic Adventure 2: Battle is installed to. To launch it, add ``SAModManager.exe`` as a non-Steam game. In the properties on Steam for SA Mod Manager, set it to use Proton as the compatibility tool. +5. In the SA2B_Archipelago folder, copy the `APCpp.dll` file and paste it in the Sonic Adventure 2 install folder (where `sonic2app.exe` is). -6. Run SAModManager.exe from Steam once. It should produce an error popup for a missing dependency, close the error. +6. Install SA Mod Manager as per [its instructions](https://github.com/X-Hax/SA-Mod-Manager/tree/master?tab=readme-ov-file). Specifically, extract SAModManager.exe file to the folder that Sonic Adventure 2: Battle is installed to. To launch it, add ``SAModManager.exe`` as a non-Steam game. In the properties on Steam for SA Mod Manager, set it to use Proton as the compatibility tool. -7. Install protontricks, on the Steam Deck this can be done via the Discover store, on other distros instructions vary, [see its github page](https://github.com/Matoking/protontricks). +7. Run SAModManager.exe from Steam once. It should produce an error popup saying you need .NET Desktop Runtime and ask you if you'd like to download it. Say yes and it will download through your browser. -8. Download the [.NET 7 Desktop Runtime for x64 Windows](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-7.0.17-windows-x64-installer). If this link does not work, the download can be found on [this page](https://dotnet.microsoft.com/en-us/download/dotnet/7.0). +8. Install protontricks, on the Steam Deck this can be done via the Discover store, on other distros instructions vary, [see its github page](https://github.com/Matoking/protontricks). -9. Right click the .NET 7 Desktop Runtime exe, and assuming protontricks was installed correctly, the option to "Open with Protontricks Launcher" should be available. Click that, and in the popup window that opens, select SAModManager.exe. Follow the prompts after this to install the .NET 7 Desktop Runtime for SAModManager. Once it is done, you should be able to successfully launch SAModManager to steam. +9. Right click the .NET Desktop Runtime exe that was downloaded in step 6, and assuming protontricks was installed correctly, the option to "Open with Protontricks Launcher" should be available. Click that, and in the popup window that opens, select SAModManager.exe. Follow the prompts after this to install the .NET Desktop Runtime for SAModManager. Once it is done, you should be able to successfully launch SAModManager to steam. -6. Unpack the Archipelago Mod into this folder, so that `/mods/SA2B_Archipelago` is a valid path. - -7. In the SA2B_Archipelago folder, copy the `APCpp.dll` file and paste it in the Sonic Adventure 2 install folder (where `sonic2app.exe` is). - -8. Launch `SAModManager.exe` from Steam and make sure the SA2B_Archipelago mod is listed and enabled. +10. Launch `SAModManager.exe` from Steam and make sure the SA2B_Archipelago mod is listed and enabled. Note: Ensure that you launch Sonic Adventure 2 from Steam directly on Linux, rather than launching using the `Save & Play` button in SA Mod Manager. @@ -77,7 +73,7 @@ Note: Ensure that you launch Sonic Adventure 2 from Steam directly on Linux, rat ## Additional Options Some additional settings related to the Archipelago messages in game can be adjusted in the SAModManager if you select `Configure Mod` on the SA2B_Archipelago mod. This settings will be under a `General Settings` tab. - + - Message Display Count: This is the maximum number of Archipelago messages that can be displayed on screen at any given time. - Message Display Duration: This dictates how long Archipelago messages are displayed on screen (in seconds). - Message Font Size: The is the size of the font used to display the messages from Archipelago. @@ -94,7 +90,7 @@ If you wish to use the `SADX Music` option of the Randomizer, you must own a cop - "The following mods didn't load correctly: SA2B_Archipelago: DLL error - The specified module could not be found." - Make sure the `APCpp.dll` is in the same folder as the `sonic2app.exe`. (See Installation Procedures step 6) - + - "sonic2app.exe - Entry Point Not Found" - Make sure the `APCpp.dll` is up to date. Follow Installation Procedures step 6 to update the dll. @@ -116,7 +112,7 @@ If you wish to use the `SADX Music` option of the Randomizer, you must own a cop 1. Run the Launcher.exe which should be in the same folder as the your Sonic Adventure 2: Battle install. 2. Select the `Player` tab and reselect the controller for the player 1 input method. 3. Click the `Save settings and launch SONIC ADVENTURE 2` button. (Any mod manager settings will apply even if the game is launched this way rather than through the mod manager) - + - Game crashes after display logos. - This may be caused by a high monitor refresh rate. - Change the monitor refresh rate to 60 Hz [Change display refresh rate on Windows] (https://support.microsoft.com/en-us/windows/change-your-display-refresh-rate-in-windows-c8ea729e-0678-015c-c415-f806f04aae5a) @@ -125,13 +121,13 @@ If you wish to use the `SADX Music` option of the Randomizer, you must own a cop 2. Select the `Compatibility` tab. 3. Check the `Run this program in compatility mode for:` box and select Windows 7 in the drop down. 4. Click the `Apply` button. - + - No resolution options in the Launcher.exe. - In the `Graphics device` dropdown, select the device and display you plan to run the game on. The `Resolution` dropdown should populate once a graphics device is selected. - + - No music is playing in the game. - If you enabled an `SADX Music` option, then most likely the music data was not copied properly into the mod folder (See Additional Options for instructions). - + - Mission 1 is missing a texture in the stage select UI. - Most likely another mod is conflicting and overwriting the texture pack. It is recommeded to have the SA2B Archipelago mod load last in the mod manager. From 34795b598a7a94cca93a744c8e8a115183f9e028 Mon Sep 17 00:00:00 2001 From: qwint Date: Sun, 16 Feb 2025 14:21:09 -0500 Subject: [PATCH 046/227] GER: Use Itempool Count for Minimal handling (#4649) * uses itempool count vs unfilled location count instead of counting prog_items values which could have custom counters * move unfilled location check to before can_reach * add tests for successful minimal GER call with extra collect override prog_items in the pool to regression test issue fixed in this PR --- entrance_rando.py | 5 +++-- test/general/test_entrance_rando.py | 31 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/entrance_rando.py b/entrance_rando.py index 5aa16fa0bb..b6e64002bd 100644 --- a/entrance_rando.py +++ b/entrance_rando.py @@ -378,13 +378,14 @@ def randomize_entrances( and world.multiworld.has_beaten_game(er_state.collection_state, world.player): # ensure that we have enough locations to place our progression accessible_location_count = 0 - prog_item_count = sum(er_state.collection_state.prog_items[world.player].values()) + prog_item_count = len([item for item in world.multiworld.itempool if item.advancement and item.player == world.player]) # short-circuit location checking in this case if prog_item_count == 0: return True for region in er_state.placed_regions: for loc in region.locations: - if loc.can_reach(er_state.collection_state): + if not loc.item and loc.can_reach(er_state.collection_state): + # don't count locations with preplaced items accessible_location_count += 1 if accessible_location_count >= prog_item_count: perform_validity_check = False diff --git a/test/general/test_entrance_rando.py b/test/general/test_entrance_rando.py index efbcf7df46..7e904d3340 100644 --- a/test/general/test_entrance_rando.py +++ b/test/general/test_entrance_rando.py @@ -311,6 +311,37 @@ class TestRandomizeEntrances(unittest.TestCase): self.assertEqual([], [exit_ for region in multiworld.get_regions() for exit_ in region.exits if not exit_.connected_region]) + def test_minimal_entrance_rando_with_collect_override(self): + """ + tests that entrance randomization can complete with minimal accessibility and unreachable exits + when the world defines a collect override that add extra values to prog_items + """ + multiworld = generate_test_multiworld() + multiworld.worlds[1].options.accessibility = Accessibility.from_any(Accessibility.option_minimal) + multiworld.completion_condition[1] = lambda state: state.can_reach("region24", player=1) + generate_disconnected_region_grid(multiworld, 5, 1) + prog_items = generate_items(10, 1, True) + multiworld.itempool += prog_items + filler_items = generate_items(15, 1, False) + multiworld.itempool += filler_items + e = multiworld.get_entrance("region1_right", 1) + set_rule(e, lambda state: False) + + old_collect = multiworld.worlds[1].collect + + def new_collect(state, item): + old_collect(state, item) + state.prog_items[item.player]["counter"] += 300 + + multiworld.worlds[1].collect = new_collect + + randomize_entrances(multiworld.worlds[1], False, directionally_matched_group_lookup) + + self.assertEqual([], [entrance for region in multiworld.get_regions() + for entrance in region.entrances if not entrance.parent_region]) + self.assertEqual([], [exit_ for region in multiworld.get_regions() + for exit_ in region.exits if not exit_.connected_region]) + def test_restrictive_region_requirement_does_not_fail(self): multiworld = generate_test_multiworld() generate_disconnected_region_grid(multiworld, 2, 1) From 8349774c5cfb18487124019c43d1c03dcb6e5698 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Sun, 16 Feb 2025 23:51:36 +0100 Subject: [PATCH 047/227] customserver: ignore static datapackage optimization for old games (#4650) --- WebHostLib/customserver.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/WebHostLib/customserver.py b/WebHostLib/customserver.py index a2eef108b0..76a2b8a4dc 100644 --- a/WebHostLib/customserver.py +++ b/WebHostLib/customserver.py @@ -117,6 +117,7 @@ class WebHostContext(Context): self.gamespackage = {"Archipelago": static_gamespackage.get("Archipelago", {})} # this may be modified by _load self.item_name_groups = {"Archipelago": static_item_name_groups.get("Archipelago", {})} self.location_name_groups = {"Archipelago": static_location_name_groups.get("Archipelago", {})} + missing_checksum = False for game in list(multidata.get("datapackage", {})): game_data = multidata["datapackage"][game] @@ -132,11 +133,13 @@ class WebHostContext(Context): continue else: self.logger.warning(f"Did not find game_data_package for {game}: {game_data['checksum']}") + else: + missing_checksum = True # Game rolled on old AP and will load data package from multidata self.gamespackage[game] = static_gamespackage.get(game, {}) self.item_name_groups[game] = static_item_name_groups.get(game, {}) self.location_name_groups[game] = static_location_name_groups.get(game, {}) - if not game_data_packages: + if not game_data_packages and not missing_checksum: # all static -> use the static dicts directly self.gamespackage = static_gamespackage self.item_name_groups = static_item_name_groups From 378fa5d5c4b5dfea8ebd51e67ae4fc8309cfedff Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Sun, 16 Feb 2025 19:30:40 -0500 Subject: [PATCH 048/227] Fix gun missing from combat_items, add new for combat logic cache, very slight refactor of check_combat_reqs to let it do the changeover in a less complicated fashion, fix area being a boss area rather than non-boss area for a check (#4657) --- worlds/tunic/combat_logic.py | 22 +++++------------- worlds/tunic/er_rules.py | 2 +- worlds/tunic/items.py | 2 +- worlds/tunic/test/test_combat.py | 38 +++++++++++++++++++++++++++++++- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/worlds/tunic/combat_logic.py b/worlds/tunic/combat_logic.py index 2e490d1dad..2e9f19dbc2 100644 --- a/worlds/tunic/combat_logic.py +++ b/worlds/tunic/combat_logic.py @@ -140,24 +140,14 @@ def check_combat_reqs(area_name: str, state: CollectionState, player: int, alt_d # need sword for bosses if data.is_boss: return False - equipment.remove("Sword") - if has_magic: - if "Magic" not in equipment: - equipment.append("Magic") - # +4 mp pretty much makes up for the lack of sword, at least in Quarry - extra_mp_needed += 4 - if stick_bool: - # stick is a backup plan, and doesn't scale well, so let's require a little less - equipment.append("Stick") - extra_att_needed -= 2 - else: - extra_mp_needed += 2 - extra_att_needed -= 32 - elif stick_bool: + if stick_bool: + equipment.remove("Sword") equipment.append("Stick") # may revise this later based on feedback extra_att_needed += 3 extra_def_needed += 2 + # this is for when it changes over to the magic-only state if it needs to later + extra_mp_needed += 4 else: return False @@ -204,7 +194,7 @@ def check_combat_reqs(area_name: str, state: CollectionState, player: int, alt_d equip_list.append("Magic") more_modified_stats = AreaStats(modified_stats.att_level - 32, modified_stats.def_level, modified_stats.potion_level, modified_stats.hp_level, - modified_stats.sp_level, modified_stats.mp_level + 4, + modified_stats.sp_level, modified_stats.mp_level + 2, modified_stats.potion_count, equip_list, data.is_boss) if check_combat_reqs("none", state, player, more_modified_stats): return True @@ -222,7 +212,7 @@ def has_required_stats(data: AreaStats, state: CollectionState, player: int) -> player_att, att_offerings = get_att_level(state, player) # if you have 2 more attack than needed, we can forego needing mp - if data.mp_level > 1: + if data.mp_level > 1 and "Magic" in data.equipment: if player_att < data.att_level + 2: player_mp, mp_offerings = get_mp_level(state, player) if player_mp < data.mp_level: diff --git a/worlds/tunic/er_rules.py b/worlds/tunic/er_rules.py index 4d0a462cbb..f111fed8b1 100644 --- a/worlds/tunic/er_rules.py +++ b/worlds/tunic/er_rules.py @@ -1832,7 +1832,7 @@ def set_er_location_rules(world: "TunicWorld") -> None: if world.options.combat_logic == CombatLogic.option_on: combat_logic_to_loc("Overworld - [Northeast] Flowers Holy Cross", "Garden Knight") combat_logic_to_loc("Overworld - [Northwest] Chest Near Quarry Gate", "Before Well", dagger=True) - combat_logic_to_loc("Overworld - [Northeast] Chest Above Patrol Cave", "Garden Knight", dagger=True) + combat_logic_to_loc("Overworld - [Northeast] Chest Above Patrol Cave", "West Garden", dagger=True) combat_logic_to_loc("Overworld - [Southwest] West Beach Guarded By Turret", "Overworld", dagger=True) combat_logic_to_loc("Overworld - [Southwest] West Beach Guarded By Turret 2", "Overworld") combat_logic_to_loc("Overworld - [Southwest] Bombable Wall Near Fountain", "Before Well", dagger=True) diff --git a/worlds/tunic/items.py b/worlds/tunic/items.py index 846650c68f..20696eb511 100644 --- a/worlds/tunic/items.py +++ b/worlds/tunic/items.py @@ -212,7 +212,7 @@ slot_data_item_names = [ combat_items: List[str] = [name for name, data in item_table.items() if data.combat_ic and IC.progression in data.combat_ic] -combat_items.extend(["Stick", "Sword", "Sword Upgrade", "Magic Wand", "Hero's Laurels"]) +combat_items.extend(["Stick", "Sword", "Sword Upgrade", "Magic Wand", "Hero's Laurels", "Gun"]) item_name_to_id: Dict[str, int] = {name: item_base_id + data.item_id_offset for name, data in item_table.items()} diff --git a/worlds/tunic/test/test_combat.py b/worlds/tunic/test/test_combat.py index 866dc5f814..c0e76ef92b 100644 --- a/worlds/tunic/test/test_combat.py +++ b/worlds/tunic/test/test_combat.py @@ -4,7 +4,7 @@ from collections import Counter from . import TunicTestBase from .. import options from ..combat_logic import (check_combat_reqs, area_data, get_money_count, calc_effective_hp, get_potion_level, - get_hp_level, get_def_level, get_sp_level) + get_hp_level, get_def_level, get_sp_level, has_combat_reqs) from ..items import item_table from .. import TunicWorld @@ -81,3 +81,39 @@ class TestCombat(TunicTestBase): f"Free Def and Offerings: {player_def - def_offerings}, {def_offerings}\n" f"Free SP and Offerings: {player_sp - sp_offerings}, {sp_offerings}") prev_statuses[area] = curr_statuses[area] + + # the issue was that a direct check of the logic and the cache had different results + # it was actually due to the combat_items in items.py not having the Gun in it + # but this test is still helpful for verifying the cache + def test_combat_magic_weapons(self): + combat_items = self.combat_items.copy() + combat_items.remove("Magic Wand") + combat_items.remove("Gun") + area_names = list(area_data.keys()) + self.multiworld.worlds[1].random.shuffle(combat_items) + self.multiworld.worlds[1].random.shuffle(area_names) + current_items = Counter() + state = self.multiworld.state.copy() + player = self.player + gun = TunicWorld.create_item(self.world, "Gun") + + for current_item_name in combat_items: + current_item = TunicWorld.create_item(self.world, current_item_name) + state.collect(current_item) + current_items[current_item_name] += 1 + for area in area_names: + if check_combat_reqs(area, state, player) != has_combat_reqs(area, state, player): + raise Exception(f"Cache for {area} does not match a direct check " + f"after collecting {current_item_name}.\n" + f"Current items: {current_items}.\n" + f"Cache {'succeeded' if has_combat_reqs(area, state, player) else 'failed'}\n" + f"Direct {'succeeded' if check_combat_reqs(area, state, player) else 'failed'}") + state.collect(gun) + for area in area_names: + if check_combat_reqs(area, state, player) != has_combat_reqs(area, state, player): + raise Exception(f"Cache for {area} does not match a direct check " + f"after collecting the Gun.\n" + f"Current items: {current_items}.\n" + f"Cache {'succeeded' if has_combat_reqs(area, state, player) else 'failed'}\n" + f"Direct {'succeeded' if check_combat_reqs(area, state, player) else 'failed'}") + state.remove(gun) From d744e086efb23673326d791a01a748c0f7213597 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 17 Feb 2025 15:16:18 +0100 Subject: [PATCH 049/227] MultiServer: Fix hinting an item that someone else already hinted in their slot not resolving correctly (#4655) * Fix get_hint not checking for finding_player * Fix using the wrong variable for slot lookup --- MultiServer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MultiServer.py b/MultiServer.py index 51b72c93ad..a310808b3a 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -783,7 +783,7 @@ class Context: def get_hint(self, team: int, finding_player: int, seeked_location: int) -> typing.Optional[Hint]: for hint in self.hints[team, finding_player]: - if hint.location == seeked_location: + if hint.location == seeked_location and hint.finding_player == finding_player: return hint return None @@ -1135,7 +1135,7 @@ def collect_hints(ctx: Context, team: int, slot: int, item: typing.Union[int, st seeked_item_id = item if isinstance(item, int) else ctx.item_names_for_game(ctx.games[slot])[item] for finding_player, location_id, item_id, receiving_player, item_flags \ in ctx.locations.find_item(slots, seeked_item_id): - prev_hint = ctx.get_hint(team, slot, location_id) + prev_hint = ctx.get_hint(team, finding_player, location_id) if prev_hint: hints.append(prev_hint) else: From 15bde565511e4d1e4eb4522df6cc938cf9e33ba0 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Mon, 17 Feb 2025 18:58:38 +0100 Subject: [PATCH 050/227] Factorio: prevent invalid starting items count (#4658) --- worlds/factorio/Options.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/worlds/factorio/Options.py b/worlds/factorio/Options.py index 4848cd9926..fe72d38650 100644 --- a/worlds/factorio/Options.py +++ b/worlds/factorio/Options.py @@ -235,6 +235,12 @@ class FactorioStartItems(OptionDict): """Mapping of Factorio internal item-name to amount granted on start.""" display_name = "Starting Items" default = {"burner-mining-drill": 4, "stone-furnace": 4, "raw-fish": 50} + schema = Schema( + { + str: And(int, lambda n: n > 0, + error="amount of starting items has to be a positive integer"), + } + ) class FactorioFreeSampleBlacklist(OptionSet): From 91a8fc91d6636e15a8967b764928bd37bae5e656 Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Wed, 19 Feb 2025 13:50:25 +0100 Subject: [PATCH 051/227] CI: fix native tests toolchain on windows (#4668) * CI: ctest: fix trigger on CMakeLists change * CI: ctest: update cmake version this removes a warning and matches gtest * CI: ctest: remove explicit build mode for MSVC gtest switched to dynamic libc (/MD), which is default, so this just works now --- .github/workflows/ctest.yml | 4 ++-- test/cpp/CMakeLists.txt | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ctest.yml b/.github/workflows/ctest.yml index 9492c83c9e..a0ae2cb252 100644 --- a/.github/workflows/ctest.yml +++ b/.github/workflows/ctest.yml @@ -11,7 +11,7 @@ on: - '**.hh?' - '**.hpp' - '**.hxx' - - '**.CMakeLists' + - '**/CMakeLists.txt' - '.github/workflows/ctest.yml' pull_request: paths: @@ -21,7 +21,7 @@ on: - '**.hh?' - '**.hpp' - '**.hxx' - - '**.CMakeLists' + - '**/CMakeLists.txt' - '.github/workflows/ctest.yml' jobs: diff --git a/test/cpp/CMakeLists.txt b/test/cpp/CMakeLists.txt index 927b7494da..03deb8f982 100644 --- a/test/cpp/CMakeLists.txt +++ b/test/cpp/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.16) project(ap-cpp-tests) enable_testing() @@ -7,8 +7,8 @@ find_package(GTest REQUIRED) if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") add_definitions("/source-charset:utf-8") - set(CMAKE_CXX_FLAGS_DEBUG "/MTd") - set(CMAKE_CXX_FLAGS_RELEASE "/MT") + # set(CMAKE_CXX_FLAGS_DEBUG "/MDd") # this is the default + # set(CMAKE_CXX_FLAGS_RELEASE "/MD") # this is the default elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # enable static analysis for gcc add_compile_options(-fanalyzer -Werror) From 11fa43f0a49abcab762bc15613e1d74ce4d5869b Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Thu, 20 Feb 2025 00:17:19 +0100 Subject: [PATCH 052/227] Factorio: prevent players from getting stuck from Teleport Traps (#4537) --- worlds/factorio/Options.py | 3 +- worlds/factorio/data/mod/lib.lua | 67 +++++++++++++++++++ worlds/factorio/data/mod_template/control.lua | 13 ++-- 3 files changed, 77 insertions(+), 6 deletions(-) diff --git a/worlds/factorio/Options.py b/worlds/factorio/Options.py index fe72d38650..481ed00987 100644 --- a/worlds/factorio/Options.py +++ b/worlds/factorio/Options.py @@ -263,7 +263,8 @@ class AttackTrapCount(TrapCount): class TeleportTrapCount(TrapCount): - """Trap items that when received trigger a random teleport.""" + """Trap items that when received trigger a random teleport. + It is ensured the player can walk back to where they got teleported from.""" display_name = "Teleport Traps" diff --git a/worlds/factorio/data/mod/lib.lua b/worlds/factorio/data/mod/lib.lua index edec5b7acd..aa50b926f0 100644 --- a/worlds/factorio/data/mod/lib.lua +++ b/worlds/factorio/data/mod/lib.lua @@ -49,6 +49,73 @@ function fire_entity_at_entities(entity_name, entities, speed) end end +local teleport_requests = {} +local teleport_attempts = {} +local max_attempts = 100 + +function attempt_teleport_player(player, attempt) + -- global attempt storage as metadata can't be stored + if attempt == nil then + attempt = teleport_attempts[player.index] + else + teleport_attempts[player.index] = attempt + end + + if attempt > max_attempts then + player.print("Teleport failed: No valid position found after " .. max_attempts .. " attempts!") + teleport_attempts[player.index] = 0 + return + end + + local surface = player.character.surface + local prototype_name = player.character.prototype.name + local original_position = player.character.position + local candidate_position = random_offset_position(original_position, 1024) + + local non_colliding_position = surface.find_non_colliding_position( + prototype_name, candidate_position, 0, 1 + ) + + if non_colliding_position then + -- Request pathfinding asynchronously + local path_id = surface.request_path{ + bounding_box = player.character.prototype.collision_box, + collision_mask = { layers = { ["player"] = true } }, + start = original_position, + goal = non_colliding_position, + force = player.force.name, + radius = 1, + pathfind_flags = {cache = true, low_priority = true, allow_paths_through_own_entities = true}, + } + + -- Store the request with the player index as the key + teleport_requests[player.index] = path_id + else + attempt_teleport_player(player, attempt + 1) + end +end + +function handle_teleport_attempt(event) + for player_index, path_id in pairs(teleport_requests) do + -- Check if the event matches the stored path_id + if path_id == event.id then + local player = game.players[player_index] + + if event.path then + if player.character then + player.character.teleport(event.path[#event.path].position) -- Teleport to the last point in the path + -- Clear the attempts for this player + teleport_attempts[player_index] = 0 + return + end + return + end + + attempt_teleport_player(player, nil) + break + end + end +end function spill_character_inventory(character) if not (character and character.valid) then return false diff --git a/worlds/factorio/data/mod_template/control.lua b/worlds/factorio/data/mod_template/control.lua index 07fd4c04af..cd0c00e987 100644 --- a/worlds/factorio/data/mod_template/control.lua +++ b/worlds/factorio/data/mod_template/control.lua @@ -134,6 +134,9 @@ end script.on_event(defines.events.on_player_changed_position, on_player_changed_position) {% endif %} +-- Handle the pathfinding result of teleport traps +script.on_event(defines.events.on_script_path_request_finished, handle_teleport_attempt) + function count_energy_bridges() local count = 0 for i, bridge in pairs(storage.energy_link_bridges) do @@ -143,9 +146,11 @@ function count_energy_bridges() end return count end + function get_energy_increment(bridge) return ENERGY_INCREMENT + (ENERGY_INCREMENT * 0.3 * bridge.quality.level) end + function on_check_energy_link(event) --- assuming 1 MJ increment and 5MJ battery: --- first 2 MJ request fill, last 2 MJ push energy, middle 1 MJ does nothing @@ -722,12 +727,10 @@ end, game.forces["enemy"].set_evolution_factor(new_factor, "nauvis") game.print({"", "New evolution factor:", new_factor}) end, -["Teleport Trap"] = function () +["Teleport Trap"] = function() for _, player in ipairs(game.forces["player"].players) do - current_character = player.character - if current_character ~= nil then - current_character.teleport(current_character.surface.find_non_colliding_position( - current_character.prototype.name, random_offset_position(current_character.position, 1024), 0, 1)) + if player.character then + attempt_teleport_player(player, 1) end end end, From 18de035b4deec96a237a8dd49a739db3ac659039 Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Sat, 22 Feb 2025 05:33:58 -0800 Subject: [PATCH 053/227] DS3: Update setup documentation (#4437) --- worlds/dark_souls_3/docs/setup_en.md | 68 +++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/worlds/dark_souls_3/docs/setup_en.md b/worlds/dark_souls_3/docs/setup_en.md index 484afdce3f..4c3a6b2a7d 100644 --- a/worlds/dark_souls_3/docs/setup_en.md +++ b/worlds/dark_souls_3/docs/setup_en.md @@ -3,11 +3,13 @@ ## Required Software - [Dark Souls III](https://store.steampowered.com/app/374320/DARK_SOULS_III/) -- [Dark Souls III AP Client](https://github.com/nex3/Dark-Souls-III-Archipelago-client/releases/latest) +- [Dark Souls III AP Client] + +[Dark Souls III AP Client]: https://github.com/nex3/Dark-Souls-III-Archipelago-client/releases/latest ## Optional Software -- Map tracker not yet updated for 3.0.0 +- [Map tracker](https://github.com/TVV1GK/DS3_AP_Maptracker) ## Setting Up @@ -73,3 +75,65 @@ things to keep in mind: [.NET Runtime]: https://dotnet.microsoft.com/en-us/download/dotnet/8.0 [WINE]: https://www.winehq.org/ + +## Troubleshooting + +### Enemy randomizer issues + +The DS3 Archipelago randomizer uses [thefifthmatt's DS3 enemy randomizer], +essentially unchanged. Unfortunately, this randomizer has a few known issues, +including enemy AI not working, enemies spawning in places they can't be killed, +and, in a few rare cases, enemies spawning in ways that crash the game when they +load. These bugs should be [reported upstream], but unfortunately the +Archipelago devs can't help much with them. + +[thefifthmatt's DS3 enemy randomizer]: https://www.nexusmods.com/darksouls3/mods/484 +[reported upstream]: https://github.com/thefifthmatt/SoulsRandomizers/issues + +Because in rare cases the enemy randomizer can cause seeds to be impossible to +complete, we recommend disabling it for large async multiworlds for safety +purposes. + +### `launchmod_darksouls3.bat` isn't working + +Sometimes `launchmod_darksouls3.bat` will briefly flash a terminal on your +screen and then terminate without actually starting the game. This is usually +caused by some issue communicating with Steam either to find `DarkSoulsIII.exe` +or to launch it properly. If this is happening to you, make sure: + +* You have DS3 1.15.2 installed. This is the latest patch as of January 2025. + (Note that older versions of Archipelago required an older patch, but that + _will not work_ with the current version.) + +* You own the DS3 DLC if your randomizer config has DLC enabled. (It's possible, + but unconfirmed, that you need the DLC even when it's disabled in your config). + +* Steam is not running in administrator mode. To fix this, right-click + `steam.exe` (by default this is in `C:\Program Files\Steam`), select + "Properties", open the "Compatiblity" tab, and uncheck "Run this program as an + administrator". + +* There is no `dinput8.dll` file in your DS3 game directory. This is the old way + of installing mods, and it can interfere with the new ModEngine2 workflow. + +If you've checked all of these, you can also try: + +* Running `launchmod_darksouls3.bat` as an administrator. + +* Reinstalling DS3 or even reinstalling Steam itself. + +* Making sure DS3 is installed on the same drive as Steam and as the randomizer. + (A number of users are able to run these on different drives, but this has + helped some users.) + +If none of this works, unfortunately there's not much we can do. We use +ModEngine2 to launch DS3 with the Archipelago mod enabled, but unfortunately +it's no longer maintained and its successor, ModEngine3, isn't usable yet. + +### `DS3Randomizer.exe` isn't working + +This is almost always caused by using a version of the randomizer client that's +not compatible with the version used to generate the multiworld. If you're +generating your multiworld on archipelago.gg, you *must* use the latest [Dark +Souls III AP Client]. If you want to use a different client version, you *must* +generate the multiworld locally using the apworld bundled with the client. From 0f7fd48cddac9dc5d6da8347aca7ee27afc7bb8a Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Sun, 23 Feb 2025 11:02:30 -0500 Subject: [PATCH 054/227] TUNIC: Add some more rules for Monastery connections (#4564) * Move a couple locations to monastery * Connect Quarry Back to Monastery * Quarry Back -> Monastery with laurels, Monastery -> Monastery Back with wand/sword * Add Monastery Back region * Move a couple non-ER locations to monastery back * Monastery front -> back with sword, wand, or laurels zip * also laurels zip for non-ER --- worlds/tunic/er_rules.py | 4 +++- worlds/tunic/locations.py | 8 ++++---- worlds/tunic/regions.py | 5 +++-- worlds/tunic/rules.py | 5 +++++ 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/worlds/tunic/er_rules.py b/worlds/tunic/er_rules.py index f111fed8b1..1d3ede21a4 100644 --- a/worlds/tunic/er_rules.py +++ b/worlds/tunic/er_rules.py @@ -990,7 +990,9 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ rule=lambda state: has_ice_grapple_logic(True, IceGrappling.option_hard, state, world)) monastery_front_to_back = regions["Monastery Front"].connect( - connecting_region=regions["Monastery Back"]) + connecting_region=regions["Monastery Back"], + rule=lambda state: has_sword(state, player) or state.has(fire_wand, player) + or laurels_zip(state, world)) # laurels through the gate, no setup needed regions["Monastery Back"].connect( connecting_region=regions["Monastery Front"], diff --git a/worlds/tunic/locations.py b/worlds/tunic/locations.py index d0c4f860e4..d3c23406ed 100644 --- a/worlds/tunic/locations.py +++ b/worlds/tunic/locations.py @@ -206,7 +206,7 @@ location_table: Dict[str, TunicLocationData] = { "Fountain Cross Door - Page Pickup": TunicLocationData("Overworld Holy Cross", "Fountain Cross Room", location_group="Holy Cross"), "Secret Gathering Place - Holy Cross Chest": TunicLocationData("Overworld Holy Cross", "Secret Gathering Place", location_group="Holy Cross"), "Top of the Mountain - Page At The Peak": TunicLocationData("Overworld Holy Cross", "Top of the Mountain", location_group="Holy Cross"), - "Monastery - Monastery Chest": TunicLocationData("Monastery", "Monastery Back"), + "Monastery - Monastery Chest": TunicLocationData("Monastery Back", "Monastery Back"), "Quarry - [Back Entrance] Bushes Holy Cross": TunicLocationData("Quarry Back", "Quarry Back", location_group="Holy Cross"), "Quarry - [Back Entrance] Chest": TunicLocationData("Quarry Back", "Quarry Back"), "Quarry - [Central] Near Shortcut Ladder": TunicLocationData("Quarry Back", "Quarry Back"), @@ -220,12 +220,12 @@ location_table: Dict[str, TunicLocationData] = { "Quarry - [Central] Obscured Below Entry Walkway": TunicLocationData("Quarry Back", "Quarry Back"), "Quarry - [Central] Top Floor Overhang": TunicLocationData("Quarry", "Quarry"), "Quarry - [East] Near Bridge": TunicLocationData("Quarry", "Quarry"), - "Quarry - [Central] Above Ladder": TunicLocationData("Quarry", "Quarry Monastery Entry"), + "Quarry - [Central] Above Ladder": TunicLocationData("Monastery", "Quarry Monastery Entry"), "Quarry - [Central] Obscured Behind Staircase": TunicLocationData("Quarry", "Quarry"), - "Quarry - [Central] Above Ladder Dash Chest": TunicLocationData("Quarry", "Quarry Monastery Entry"), + "Quarry - [Central] Above Ladder Dash Chest": TunicLocationData("Monastery", "Quarry Monastery Entry"), "Quarry - [West] Upper Area Bombable Wall": TunicLocationData("Quarry Back", "Quarry Back"), "Quarry - [East] Bombable Wall": TunicLocationData("Quarry", "Quarry"), - "Hero's Grave - Ash Relic": TunicLocationData("Monastery", "Hero Relic - Quarry"), + "Hero's Grave - Ash Relic": TunicLocationData("Monastery Back", "Hero Relic - Quarry"), "Quarry - [West] Shooting Range Secret Path": TunicLocationData("Lower Quarry", "Lower Quarry"), "Quarry - [West] Near Shooting Range": TunicLocationData("Lower Quarry", "Lower Quarry"), "Quarry - [West] Below Shooting Range": TunicLocationData("Lower Quarry", "Lower Quarry"), diff --git a/worlds/tunic/regions.py b/worlds/tunic/regions.py index 8f5df8896a..f21af11ee4 100644 --- a/worlds/tunic/regions.py +++ b/worlds/tunic/regions.py @@ -13,9 +13,10 @@ tunic_regions: dict[str, tuple[str]] = { "Library": tuple(), "Eastern Vault Fortress": ("Beneath the Vault",), "Beneath the Vault": ("Eastern Vault Fortress",), - "Quarry Back": ("Quarry",), + "Quarry Back": ("Quarry", "Monastery"), "Quarry": ("Monastery", "Lower Quarry"), - "Monastery": tuple(), + "Monastery": ("Monastery Back",), + "Monastery Back": tuple(), "Lower Quarry": ("Rooted Ziggurat",), "Rooted Ziggurat": tuple(), "Swamp": ("Cathedral",), diff --git a/worlds/tunic/rules.py b/worlds/tunic/rules.py index 959376787d..63f76ac929 100644 --- a/worlds/tunic/rules.py +++ b/worlds/tunic/rules.py @@ -124,6 +124,11 @@ def set_region_rules(world: "TunicWorld") -> None: and (state.has_any({grapple, laurels, gun}, player) or can_ladder_storage(state, world)) world.get_entrance("Quarry Back -> Quarry").access_rule = \ lambda state: has_sword(state, player) or state.has(fire_wand, player) + world.get_entrance("Quarry Back -> Monastery").access_rule = \ + lambda state: state.has(laurels, player) + world.get_entrance("Monastery -> Monastery Back").access_rule = \ + lambda state: (has_sword(state, player) or state.has(fire_wand, player) + or laurels_zip(state, world)) world.get_entrance("Quarry -> Lower Quarry").access_rule = \ lambda state: has_mask(state, world) world.get_entrance("Lower Quarry -> Rooted Ziggurat").access_rule = \ From 58d460678e5e0e22995e3ce0b0fd93fa86db0c99 Mon Sep 17 00:00:00 2001 From: threeandthreee Date: Sun, 23 Feb 2025 11:11:24 -0500 Subject: [PATCH 055/227] LADX: drop rupee farm condition (#4189) * drop rupee farm condition * cleanup * rupee farm backup for all spending checks * not power bracelet * oops --- worlds/ladx/LADXR/logic/overworld.py | 12 ++++++------ worlds/ladx/LADXR/logic/requirements.py | 1 + worlds/ladx/Locations.py | 13 +------------ 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/worlds/ladx/LADXR/logic/overworld.py b/worlds/ladx/LADXR/logic/overworld.py index a85a97ae64..b63aad2b34 100644 --- a/worlds/ladx/LADXR/logic/overworld.py +++ b/worlds/ladx/LADXR/logic/overworld.py @@ -11,7 +11,7 @@ class World: mabe_village = Location("Mabe Village") Location().add(HeartPiece(0x2A4)).connect(mabe_village, r.bush) # well - Location().add(FishingMinigame()).connect(mabe_village, AND(r.bush, COUNT("RUPEES", 20))) # fishing game, heart piece is directly done by the minigame. + Location().add(FishingMinigame()).connect(mabe_village, AND(r.can_farm, COUNT("RUPEES", 20))) # fishing game, heart piece is directly done by the minigame. Location().add(Seashell(0x0A3)).connect(mabe_village, r.bush) # bushes below the shop Location().add(Seashell(0x0D2)).connect(mabe_village, PEGASUS_BOOTS) # smash into tree next to lv1 Location().add(Song(0x092)).connect(mabe_village, OCARINA) # Marins song @@ -23,7 +23,7 @@ class World: papahl_house.connect(mamasha_trade, TRADING_ITEM_YOSHI_DOLL) trendy_shop = Location("Trendy Shop") - trendy_shop.connect(Location().add(TradeSequenceItem(0x2A0, TRADING_ITEM_YOSHI_DOLL)), FOUND("RUPEES", 50)) + trendy_shop.connect(Location().add(TradeSequenceItem(0x2A0, TRADING_ITEM_YOSHI_DOLL)), AND(r.can_farm, FOUND("RUPEES", 50))) outside_trendy = Location() outside_trendy.connect(mabe_village, r.bush) @@ -43,8 +43,8 @@ class World: self._addEntrance("start_house", mabe_village, start_house, None) shop = Location("Shop") - Location().add(ShopItem(0)).connect(shop, OR(COUNT("RUPEES", 500), SWORD)) - Location().add(ShopItem(1)).connect(shop, OR(COUNT("RUPEES", 1480), SWORD)) + Location().add(ShopItem(0)).connect(shop, OR(AND(r.can_farm, COUNT("RUPEES", 500)), SWORD)) + Location().add(ShopItem(1)).connect(shop, OR(AND(r.can_farm, COUNT("RUPEES", 1480)), SWORD)) self._addEntrance("shop", mabe_village, shop, None) dream_hut = Location("Dream Hut") @@ -164,7 +164,7 @@ class World: self._addEntrance("prairie_left_cave2", ukuku_prairie, prairie_left_cave2, BOMB) self._addEntranceRequirementExit("prairie_left_cave2", None) # if exiting, you do not need bombs - mamu = Location().connect(Location().add(Song(0x2FB)), AND(OCARINA, COUNT("RUPEES", 1480))) + mamu = Location().connect(Location().add(Song(0x2FB)), AND(OCARINA, r.can_farm, COUNT("RUPEES", 1480))) self._addEntrance("mamu", ukuku_prairie, mamu, AND(OR(AND(FEATHER, PEGASUS_BOOTS), ROOSTER), OR(HOOKSHOT, ROOSTER), POWER_BRACELET)) dungeon3_entrance = Location().connect(ukuku_prairie, OR(FEATHER, ROOSTER, FLIPPERS)) @@ -377,7 +377,7 @@ class World: # Raft game. raft_house = Location("Raft House") - Location().add(KeyLocation("RAFT")).connect(raft_house, AND(r.bush, COUNT("RUPEES", 100))) # add bush requirement for farming in case player has to try again + Location().add(KeyLocation("RAFT")).connect(raft_house, AND(r.can_farm, COUNT("RUPEES", 100))) raft_return_upper = Location() raft_return_lower = Location().connect(raft_return_upper, None, one_way=True) outside_raft_house = Location().connect(below_right_taltal, HOOKSHOT).connect(below_right_taltal, FLIPPERS, one_way=True) diff --git a/worlds/ladx/LADXR/logic/requirements.py b/worlds/ladx/LADXR/logic/requirements.py index 4e1fe03b09..8d637ecfe9 100644 --- a/worlds/ladx/LADXR/logic/requirements.py +++ b/worlds/ladx/LADXR/logic/requirements.py @@ -253,6 +253,7 @@ def isConsumable(item) -> bool: class RequirementsSettings: def __init__(self, options): + self.can_farm = OR(SWORD, MAGIC_POWDER, MAGIC_ROD, BOOMERANG, BOMB, HOOKSHOT, BOW) self.bush = OR(SWORD, MAGIC_POWDER, MAGIC_ROD, POWER_BRACELET, BOOMERANG, BOMB) self.pit_bush = OR(SWORD, MAGIC_POWDER, MAGIC_ROD, BOOMERANG, BOMB) # unique self.attack = OR(SWORD, BOMB, BOW, MAGIC_ROD, BOOMERANG) diff --git a/worlds/ladx/Locations.py b/worlds/ladx/Locations.py index 8670738e08..45fa99adc5 100644 --- a/worlds/ladx/Locations.py +++ b/worlds/ladx/Locations.py @@ -110,15 +110,6 @@ class LinksAwakeningLocation(Location): add_item_rule(self, filter_item) -def has_free_weapon(state: CollectionState, player: int) -> bool: - return state.has("Progressive Sword", player) or state.has("Magic Rod", player) or state.has("Boomerang", player) or state.has("Hookshot", player) - - -# If the player has access to farm enough rupees to afford a game, we assume that they can keep beating the game -def can_farm_rupees(state: CollectionState, player: int) -> bool: - return has_free_weapon(state, player) and (state.has("Can Play Trendy Game", player=player) or state.has("RAFT", player=player)) - - class LinksAwakeningRegion(Region): dungeon_index = None ladxr_region = None @@ -154,9 +145,7 @@ class GameStateAdapater: def get(self, item, default): # Don't allow any money usage if you can't get back wasted rupees if item == "RUPEES": - if can_farm_rupees(self.state, self.player): - return self.state.prog_items[self.player]["RUPEES"] - return 0 + return self.state.prog_items[self.player]["RUPEES"] elif item.endswith("_USED"): return 0 else: From 6dc461609b1df651e327050f279f8cdce38fe95b Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Sun, 23 Feb 2025 11:27:05 -0500 Subject: [PATCH 056/227] Noita: Fix bug with Traps disabled in 1-player games #4651 --- worlds/noita/items.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/noita/items.py b/worlds/noita/items.py index 394bcdb575..20d9ff1930 100644 --- a/worlds/noita/items.py +++ b/worlds/noita/items.py @@ -52,8 +52,8 @@ def create_kantele(victory_condition: VictoryCondition) -> List[str]: def create_random_items(world: NoitaWorld, weights: Dict[str, int], count: int) -> List[str]: filler_pool = weights.copy() if not world.options.bad_effects: - del filler_pool["Trap"] - del filler_pool["Greed Die"] + filler_pool["Trap"] = 0 + filler_pool["Greed Die"] = 0 return world.random.choices(population=list(filler_pool.keys()), weights=list(filler_pool.values()), From 69940374e13d27faae30c13fe6e6e0396b21000c Mon Sep 17 00:00:00 2001 From: BadMagic100 Date: Thu, 27 Feb 2025 08:12:35 -0800 Subject: [PATCH 057/227] Core: Only consider requested exits during ER placement and speculative sweep #4684 --- entrance_rando.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/entrance_rando.py b/entrance_rando.py index b6e64002bd..67ca656720 100644 --- a/entrance_rando.py +++ b/entrance_rando.py @@ -157,17 +157,16 @@ class ERPlacementState: def placed_regions(self) -> set[Region]: return self.collection_state.reachable_regions[self.world.player] - def find_placeable_exits(self, check_validity: bool) -> list[Entrance]: + def find_placeable_exits(self, check_validity: bool, usable_exits: list[Entrance]) -> list[Entrance]: if check_validity: blocked_connections = self.collection_state.blocked_connections[self.world.player] - blocked_connections = sorted(blocked_connections, key=lambda x: x.name) - placeable_randomized_exits = [connection for connection in blocked_connections - if not connection.connected_region - and connection.is_valid_source_transition(self)] + placeable_randomized_exits = [ex for ex in usable_exits + if not ex.connected_region + and ex in blocked_connections + and ex.is_valid_source_transition(self)] else: # this is on a beaten minimal attempt, so any exit anywhere is fair game - placeable_randomized_exits = [ex for region in self.world.multiworld.get_regions(self.world.player) - for ex in region.exits if not ex.connected_region] + placeable_randomized_exits = [ex for ex in usable_exits if not ex.connected_region] self.world.random.shuffle(placeable_randomized_exits) return placeable_randomized_exits @@ -181,7 +180,8 @@ class ERPlacementState: self.placements.append(source_exit) self.pairings.append((source_exit.name, target_entrance.name)) - def test_speculative_connection(self, source_exit: Entrance, target_entrance: Entrance) -> bool: + def test_speculative_connection(self, source_exit: Entrance, target_entrance: Entrance, + usable_exits: list[Entrance]) -> bool: copied_state = self.collection_state.copy() # simulated connection. A real connection is unsafe because the region graph is shallow-copied and would # propagate back to the real multiworld. @@ -198,6 +198,9 @@ class ERPlacementState: # ignore the source exit, and, if coupled, the reverse exit. They're not actually new if _exit.name == source_exit.name or (self.coupled and _exit.name == target_entrance.name): continue + # make sure we are only paying attention to usable exits + if _exit not in usable_exits: + continue # technically this should be is_valid_source_transition, but that may rely on side effects from # on_connect, which have not happened here (because we didn't do a real connection, and if we did, we would # not want them to persist). can_reach is a close enough approximation most of the time. @@ -339,7 +342,7 @@ def randomize_entrances( def find_pairing(dead_end: bool, require_new_exits: bool) -> bool: nonlocal perform_validity_check - placeable_exits = er_state.find_placeable_exits(perform_validity_check) + placeable_exits = er_state.find_placeable_exits(perform_validity_check, exits) for source_exit in placeable_exits: target_groups = target_group_lookup[source_exit.randomization_group] for target_entrance in entrance_lookup.get_targets(target_groups, dead_end, preserve_group_order): @@ -355,7 +358,7 @@ def randomize_entrances( and len(placeable_exits) == 1) if exit_requirement_satisfied and source_exit.can_connect_to(target_entrance, dead_end, er_state): if (needs_speculative_sweep - and not er_state.test_speculative_connection(source_exit, target_entrance)): + and not er_state.test_speculative_connection(source_exit, target_entrance, exits)): continue do_placement(source_exit, target_entrance) return True From adc5f3a07d40341f6e50da932286075a3882ca0c Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Thu, 27 Feb 2025 10:13:37 -0600 Subject: [PATCH 058/227] MM2: Fix Shuffled Weaknesses Seed Bleed (#4689) --- worlds/mm2/rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/mm2/rules.py b/worlds/mm2/rules.py index 7e03edf3a2..d84c13c827 100644 --- a/worlds/mm2/rules.py +++ b/worlds/mm2/rules.py @@ -92,7 +92,7 @@ def set_rules(world: "MM2World") -> None: world.wily_5_weapons = slot_data["wily_5_weapons"] else: if world.options.random_weakness == RandomWeaknesses.option_shuffled: - weapon_tables = [table for weapon, table in weapon_damage.items() if weapon not in (0, 8)] + weapon_tables = [table.copy() for weapon, table in weapon_damage.items() if weapon not in (0, 8)] world.random.shuffle(weapon_tables) for i in range(1, 8): world.weapon_damage[i] = weapon_tables.pop() From 026011323eb2a35bbeeed68428f9dcc6abf86c06 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 27 Feb 2025 10:42:41 -0600 Subject: [PATCH 059/227] The Messenger: Fix 0 Required Power Seals (#4692) --- worlds/messenger/__init__.py | 2 +- worlds/messenger/rules.py | 7 +++++-- worlds/messenger/test/test_shop_chest.py | 26 +++++++++++++++++++++--- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index 043be455bc..a6effc31d5 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -228,7 +228,7 @@ class MessengerWorld(World): f"({self.options.total_seals}). Adjusting to {total_seals}" ) self.total_seals = total_seals - self.required_seals = int(self.options.percent_seals_required.value / 100 * self.total_seals) + self.required_seals = max(1, int(self.options.percent_seals_required.value / 100 * self.total_seals)) seals = [self.create_item("Power Seal") for _ in range(self.total_seals)] itempool += seals diff --git a/worlds/messenger/rules.py b/worlds/messenger/rules.py index f09025c7ed..2a3434266f 100644 --- a/worlds/messenger/rules.py +++ b/worlds/messenger/rules.py @@ -26,7 +26,7 @@ class MessengerRules: maximum_price = (world.multiworld.get_location("The Shop - Demon's Bane", self.player).cost + world.multiworld.get_location("The Shop - Focused Power Sense", self.player).cost) self.maximum_price = min(maximum_price, world.total_shards) - self.required_seals = max(1, world.required_seals) + self.required_seals = world.required_seals # dict of connection names and requirements to traverse the exit self.connection_rules = { @@ -34,7 +34,7 @@ class MessengerRules: "Artificer's Portal": lambda state: state.has_all({"Demon King Crown", "Magic Firefly"}, self.player), "Shrink Down": - lambda state: state.has_all(NOTES, self.player) or self.has_enough_seals(state), + lambda state: state.has_all(NOTES, self.player), # the shop "Money Sink": lambda state: state.has("Money Wrench", self.player) and self.can_shop(state), @@ -314,6 +314,9 @@ class MessengerRules: self.has_dart, } + if self.required_seals: + self.connection_rules["Shrink Down"] = self.has_enough_seals + def has_wingsuit(self, state: CollectionState) -> bool: return state.has("Wingsuit", self.player) diff --git a/worlds/messenger/test/test_shop_chest.py b/worlds/messenger/test/test_shop_chest.py index 2ac3069726..cd65424bc8 100644 --- a/worlds/messenger/test/test_shop_chest.py +++ b/worlds/messenger/test/test_shop_chest.py @@ -1,4 +1,4 @@ -from BaseClasses import ItemClassification, CollectionState +from BaseClasses import CollectionState, ItemClassification from . import MessengerTestBase @@ -10,8 +10,9 @@ class AllSealsRequired(MessengerTestBase): def test_chest_access(self) -> None: """Defaults to a total of 45 power seals in the pool and required.""" with self.subTest("Access Dependency"): - self.assertEqual(len([seal for seal in self.multiworld.itempool if seal.name == "Power Seal"]), - self.world.options.total_seals) + self.assertEqual( + len([seal for seal in self.multiworld.itempool if seal.name == "Power Seal"]), + self.world.options.total_seals) locations = ["Rescue Phantom"] items = [["Power Seal"]] self.assertAccessDependency(locations, items) @@ -93,3 +94,22 @@ class MaxSealsWithShards(MessengerTestBase): if seal.classification == ItemClassification.progression_skip_balancing] self.assertEqual(len(total_seals), 85) self.assertEqual(len(required_seals), 85) + + +class NoSealsRequired(MessengerTestBase): + options = { + "goal": "power_seal_hunt", + "total_seals": 1, + "percent_seals_required": 10, # percentage + } + + def test_seals_amount(self) -> None: + """Should be 1 seal and it should be progression.""" + self.assertEqual(self.world.options.total_seals, 1) + self.assertEqual(self.world.total_seals, 1) + self.assertEqual(self.world.required_seals, 1) + total_seals = [item for item in self.multiworld.itempool if item.name == "Power Seal"] + required_seals = [item for item in self.multiworld.itempool if + item.advancement and item.name == "Power Seal"] + self.assertEqual(len(total_seals), 1) + self.assertEqual(len(required_seals), 1) From cd761db17035254559306f835c80f91c11e3b7af Mon Sep 17 00:00:00 2001 From: BadMagic100 Date: Thu, 27 Feb 2025 10:21:48 -0800 Subject: [PATCH 060/227] Core: Do GER speculative sweep membership checks against a set #4698 --- entrance_rando.py | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/entrance_rando.py b/entrance_rando.py index 67ca656720..2cfebe74ad 100644 --- a/entrance_rando.py +++ b/entrance_rando.py @@ -181,7 +181,7 @@ class ERPlacementState: self.pairings.append((source_exit.name, target_entrance.name)) def test_speculative_connection(self, source_exit: Entrance, target_entrance: Entrance, - usable_exits: list[Entrance]) -> bool: + usable_exits: set[Entrance]) -> bool: copied_state = self.collection_state.copy() # simulated connection. A real connection is unsafe because the region graph is shallow-copied and would # propagate back to the real multiworld. @@ -329,6 +329,24 @@ def randomize_entrances( # similar to fill, skip validity checks on entrances if the game is beatable on minimal accessibility perform_validity_check = True + if not er_targets: + er_targets = sorted([entrance for region in world.multiworld.get_regions(world.player) + for entrance in region.entrances if not entrance.parent_region], key=lambda x: x.name) + if not exits: + exits = sorted([ex for region in world.multiworld.get_regions(world.player) + for ex in region.exits if not ex.connected_region], key=lambda x: x.name) + if len(er_targets) != len(exits): + raise EntranceRandomizationError(f"Unable to randomize entrances due to a mismatched count of " + f"entrances ({len(er_targets)}) and exits ({len(exits)}.") + + # used when membership checks are needed on the exit list, e.g. speculative sweep + exits_set = set(exits) + for entrance in er_targets: + entrance_lookup.add(entrance) + + # place the menu region and connected start region(s) + er_state.collection_state.update_reachable_regions(world.player) + def do_placement(source_exit: Entrance, target_entrance: Entrance) -> None: placed_exits, removed_entrances = er_state.connect(source_exit, target_entrance) # remove the placed targets from consideration @@ -358,7 +376,7 @@ def randomize_entrances( and len(placeable_exits) == 1) if exit_requirement_satisfied and source_exit.can_connect_to(target_entrance, dead_end, er_state): if (needs_speculative_sweep - and not er_state.test_speculative_connection(source_exit, target_entrance, exits)): + and not er_state.test_speculative_connection(source_exit, target_entrance, exits_set)): continue do_placement(source_exit, target_entrance) return True @@ -410,21 +428,6 @@ def randomize_entrances( f"All unplaced entrances: {unplaced_entrances}\n" f"All unplaced exits: {unplaced_exits}") - if not er_targets: - er_targets = sorted([entrance for region in world.multiworld.get_regions(world.player) - for entrance in region.entrances if not entrance.parent_region], key=lambda x: x.name) - if not exits: - exits = sorted([ex for region in world.multiworld.get_regions(world.player) - for ex in region.exits if not ex.connected_region], key=lambda x: x.name) - if len(er_targets) != len(exits): - raise EntranceRandomizationError(f"Unable to randomize entrances due to a mismatched count of " - f"entrances ({len(er_targets)}) and exits ({len(exits)}.") - for entrance in er_targets: - entrance_lookup.add(entrance) - - # place the menu region and connected start region(s) - er_state.collection_state.update_reachable_regions(world.player) - # stage 1 - try to place all the non-dead-end entrances while entrance_lookup.others: if not find_pairing(dead_end=False, require_new_exits=True): From 91d977479d3bd736a4b79cb7608ac1066cf00e5c Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Wed, 5 Mar 2025 23:48:03 +0100 Subject: [PATCH 061/227] Tests: test that collect and remove have expected behaviour. (#2062) --------- Co-authored-by: qwint Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- test/general/test_items.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/test/general/test_items.py b/test/general/test_items.py index 91d334e968..f9488e1b25 100644 --- a/test/general/test_items.py +++ b/test/general/test_items.py @@ -1,5 +1,6 @@ import unittest +from BaseClasses import CollectionState from worlds.AutoWorld import AutoWorldRegister, call_all from . import setup_solo_multiworld @@ -8,12 +9,31 @@ class TestBase(unittest.TestCase): def test_create_item(self): """Test that a world can successfully create all items in its datapackage""" for game_name, world_type in AutoWorldRegister.world_types.items(): - proxy_world = setup_solo_multiworld(world_type, ()).worlds[1] + multiworld = setup_solo_multiworld(world_type, steps=("generate_early", "create_regions", "create_items")) + proxy_world = multiworld.worlds[1] for item_name in world_type.item_name_to_id: + test_state = CollectionState(multiworld) with self.subTest("Create Item", item_name=item_name, game_name=game_name): item = proxy_world.create_item(item_name) + + with self.subTest("Item Name", item_name=item_name, game_name=game_name): self.assertEqual(item.name, item_name) + if item.advancement: + with self.subTest("Item State Collect", item_name=item_name, game_name=game_name): + test_state.collect(item, True) + + with self.subTest("Item State Remove", item_name=item_name, game_name=game_name): + test_state.remove(item) + + self.assertEqual(test_state.prog_items, multiworld.state.prog_items, + "Item Collect -> Remove should restore empty state.") + else: + with self.subTest("Item State Collect No Change", item_name=item_name, game_name=game_name): + # Non-Advancement should not modify state. + test_state.collect(item) + self.assertEqual(test_state.prog_items, multiworld.state.prog_items) + def test_item_name_group_has_valid_item(self): """Test that all item name groups contain valid items. """ # This cannot test for Event names that you may have declared for logic, only sendable Items. From 0eb6150e953189f60cc0fdd41de19a0e4748b139 Mon Sep 17 00:00:00 2001 From: Silent <110704408+silent-destroyer@users.noreply.github.com> Date: Wed, 5 Mar 2025 18:17:27 -0500 Subject: [PATCH 062/227] TUNIC: Fix rule for some grass in West Garden (#4682) --- worlds/tunic/grass.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/worlds/tunic/grass.py b/worlds/tunic/grass.py index eb688199dc..971ac4c0fe 100644 --- a/worlds/tunic/grass.py +++ b/worlds/tunic/grass.py @@ -7938,6 +7938,18 @@ def set_grass_location_rules(world: "TunicWorld") -> None: add_rule(world.get_location("West Garden - West Garden Grass (174) (-243.9, 0.5, 52.1)"), lambda state: state.has("Hero's Laurels", player)) add_rule(world.get_location("West Garden - West Garden Grass (262) (-244.8, 0.5, 51.3)"), lambda state: state.has("Hero's Laurels", player)) add_rule(world.get_location("West Garden - West Garden Grass (263) (-244.8, 0.5, 52.3)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (269) (-162.5, 2.0, 75.0)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (267) (-161.3, 2.0, 75.0)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (268) (-161.3, 2.0, 74.0)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (299) (-172.1, 2.0, 81.5)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (404) (-172.1, 2.0, 80.0)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (402) (-172.1, 2.0, 82.5)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (403) (-173.4, 2.0, 81.0)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (401) (-173.4, 2.0, 82.5)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (261) (-182.8, 2.0, 75.0)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (259) (-183.8, 2.0, 75.0)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (260) (-183.8, 2.0, 74.0)"), lambda state: state.has("Hero's Laurels", player)) + add_rule(world.get_location("West Garden - West Garden Laurels Exit Grass (258) (-184.8, 2.0, 75.0)"), lambda state: state.has("Hero's Laurels", player)) add_rule(world.get_location("Swamp - Back of Swamp Laurels Area Grass swamp (991) (34.5, 8.3, 31.8)"), lambda state: state.has("Hero's Laurels", player)) add_rule(world.get_location("Swamp - Back of Swamp Laurels Area Grass swamp (992) (34.5, 8.0, 30.8)"), lambda state: state.has("Hero's Laurels", player)) add_rule(world.get_location("Swamp - Back of Swamp Laurels Area Grass swamp (989) (35.5, 8.0, 30.8)"), lambda state: state.has("Hero's Laurels", player)) From e00467c2a299623f630d5a3e68f35bc56ccaa8aa Mon Sep 17 00:00:00 2001 From: Silent <110704408+silent-destroyer@users.noreply.github.com> Date: Wed, 5 Mar 2025 18:18:27 -0500 Subject: [PATCH 063/227] TUNIC: Update logic for chest in fortress dark area (#4691) * Update logic for beneath the vault chest * use helper method instead so that it checks the lanternless option --- worlds/tunic/er_rules.py | 8 ++------ worlds/tunic/rules.py | 3 ++- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/worlds/tunic/er_rules.py b/worlds/tunic/er_rules.py index 1d3ede21a4..fe01337c64 100644 --- a/worlds/tunic/er_rules.py +++ b/worlds/tunic/er_rules.py @@ -1697,7 +1697,8 @@ def set_er_location_rules(world: "TunicWorld") -> None: # Beneath the Vault set_rule(world.get_location("Beneath the Fortress - Bridge"), - lambda state: has_melee(state, player) or state.has_any((laurels, fire_wand, ice_dagger, gun), player)) + lambda state: has_lantern(state, world) and + (has_melee(state, player) or state.has_any((laurels, fire_wand, ice_dagger, gun), player))) # Quarry set_rule(world.get_location("Quarry - [Central] Above Ladder Dash Chest"), @@ -1877,11 +1878,6 @@ def set_er_location_rules(world: "TunicWorld") -> None: combat_logic_to_loc("West Garden - [Central Highlands] Holy Cross (Blue Lines)", "West Garden") combat_logic_to_loc("West Garden - [Central Highlands] Behind Guard Captain", "West Garden") - # with combat logic on, I presume the player will want to be able to see to avoid the spiders - set_rule(world.get_location("Beneath the Fortress - Bridge"), - lambda state: has_lantern(state, world) - and (state.has_any({laurels, fire_wand, "Gun"}, player) or has_melee(state, player))) - combat_logic_to_loc("Eastern Vault Fortress - [West Wing] Candles Holy Cross", "Eastern Vault Fortress", dagger=True) diff --git a/worlds/tunic/rules.py b/worlds/tunic/rules.py index 63f76ac929..b58ad73072 100644 --- a/worlds/tunic/rules.py +++ b/worlds/tunic/rules.py @@ -328,7 +328,8 @@ def set_location_rules(world: "TunicWorld") -> None: # Beneath the Vault set_rule(world.get_location("Beneath the Fortress - Bridge"), - lambda state: has_melee(state, player) or state.has_any((laurels, fire_wand, ice_dagger, gun), player)) + lambda state: has_lantern(state, world) and + (has_melee(state, player) or state.has_any((laurels, fire_wand, ice_dagger, gun), player))) set_rule(world.get_location("Beneath the Fortress - Obscured Behind Waterfall"), lambda state: has_melee(state, player) and has_lantern(state, world)) From c8b7ef10160820a77326aa4fc03d6bf353d26eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Fri, 7 Mar 2025 18:14:10 -0500 Subject: [PATCH 064/227] Stardew Valley: Fix a logic bug where the Tea Sapling would be considered available without having the recipe (#4703) --- worlds/stardew_valley/content/vanilla/base.py | 3 ++- worlds/stardew_valley/logic/logic.py | 2 -- worlds/stardew_valley/strings/fruit_tree_names.py | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/worlds/stardew_valley/content/vanilla/base.py b/worlds/stardew_valley/content/vanilla/base.py index 9e5f53eb86..2215215c39 100644 --- a/worlds/stardew_valley/content/vanilla/base.py +++ b/worlds/stardew_valley/content/vanilla/base.py @@ -150,7 +150,8 @@ base_game = BaseGameContentPack( Seed.coffee_starter: (CustomRuleSource(lambda logic: logic.traveling_merchant.has_days(3) & logic.monster.can_kill_many(Monster.dust_sprite)),), Seed.coffee: (HarvestCropSource(seed=Seed.coffee_starter, seasons=(Season.spring, Season.summer,)),), - Vegetable.tea_leaves: (CustomRuleSource(lambda logic: logic.has(Sapling.tea) & logic.time.has_lived_months(2) & logic.season.has_any_not_winter()),), + Vegetable.tea_leaves: ( + CustomRuleSource(lambda logic: logic.has(WildSeeds.tea_sapling) & logic.time.has_lived_months(2) & logic.season.has_any_not_winter()),), }, artisan_good_sources={ Beverage.beer: (MachineSource(item=Vegetable.wheat, machine=Machine.keg),), diff --git a/worlds/stardew_valley/logic/logic.py b/worlds/stardew_valley/logic/logic.py index 6efc1ade49..34f609c0e2 100644 --- a/worlds/stardew_valley/logic/logic.py +++ b/worlds/stardew_valley/logic/logic.py @@ -67,7 +67,6 @@ from ..strings.fish_names import Fish, Trash, WaterItem, WaterChest from ..strings.flower_names import Flower from ..strings.food_names import Meal, Beverage from ..strings.forageable_names import Forageable -from ..strings.fruit_tree_names import Sapling from ..strings.generic_names import Generic from ..strings.geode_names import Geode from ..strings.gift_names import Gift @@ -300,7 +299,6 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin Ore.radioactive: self.ability.can_mine_perfectly() & self.region.can_reach(Region.qi_walnut_room), RetainingSoil.basic: self.money.can_spend_at(Region.pierre_store, 100), RetainingSoil.quality: self.time.has_year_two & self.money.can_spend_at(Region.pierre_store, 150), - Sapling.tea: self.relationship.has_hearts(NPC.caroline, 2) & self.has(Material.fiber) & self.has(Material.wood), SpeedGro.basic: self.money.can_spend_at(Region.pierre_store, 100), SpeedGro.deluxe: self.time.has_year_two & self.money.can_spend_at(Region.pierre_store, 150), Trash.broken_cd: self.skill.can_crab_pot, diff --git a/worlds/stardew_valley/strings/fruit_tree_names.py b/worlds/stardew_valley/strings/fruit_tree_names.py index bd49dc5730..fce34205f7 100644 --- a/worlds/stardew_valley/strings/fruit_tree_names.py +++ b/worlds/stardew_valley/strings/fruit_tree_names.py @@ -7,4 +7,3 @@ class Sapling: pomegranate = "Pomegranate Sapling" banana = "Banana Sapling" mango = "Mango Sapling" - tea = "Tea Sapling" From bb9a6bcd2e82b8827659c63b6e2f1d49d4bffe4d Mon Sep 17 00:00:00 2001 From: threeandthreee Date: Fri, 7 Mar 2025 19:19:51 -0500 Subject: [PATCH 065/227] LADX: more marin joke text (#3966) * marin text * Adds lots of Marin Flavour Text (#32) * Updates of Splash text 24-09-18 * Re-Adds ' * use pkgutil * Adds all community suggestions up until 20/09/2024 (#33) * Adds all community suggestions up until 20/09/2024 * cutting deathlink jokes --------- Co-authored-by: Alex Nordstrom * drop piracy-adjacent jokes * marin text was too long * more submissions * no longer looking for new maintainer --------- Co-authored-by: palex00 <32203971+palex00@users.noreply.github.com> --- worlds/ladx/LADXR/patches/aesthetics.py | 22 +- worlds/ladx/LADXR/patches/marin.txt | 465 ++++++++++++++++++++++++ 2 files changed, 469 insertions(+), 18 deletions(-) create mode 100644 worlds/ladx/LADXR/patches/marin.txt diff --git a/worlds/ladx/LADXR/patches/aesthetics.py b/worlds/ladx/LADXR/patches/aesthetics.py index 2975c804d4..6ca7d3d973 100644 --- a/worlds/ladx/LADXR/patches/aesthetics.py +++ b/worlds/ladx/LADXR/patches/aesthetics.py @@ -4,6 +4,7 @@ from ..roomEditor import RoomEditor from .. import entityData import os import bsdiff4 +import pkgutil def imageTo2bpp(filename): import PIL.Image @@ -179,24 +180,9 @@ def noText(rom): def reduceMessageLengths(rom, rnd): # Into text from Marin. Got to go fast, so less text. (This intro text is very long) - rom.texts[0x01] = formatText(rnd.choice([ - "Let's a go!", - "Remember, sword goes on A!", - "Avoid the heart piece of shame!", - "Marin? No, this is Zelda. Welcome to Hyrule", - "Why are you in my bed?", - "This is not a Mario game!", - "MuffinJets was here...", - "Remember, there are no bugs in LADX", - "#####, #####, you got to wake up!\nDinner is ready.", - "Go find the stepladder", - "Pizza power!", - "Eastmost penninsula is the secret", - "There is no cow level", - "You cannot lift rocks with your bear hands", - "Thank you, daid!", - "There, there now. Just relax. You've been asleep for almost nine hours now." - ])) + lines = pkgutil.get_data(__name__, "marin.txt").decode("unicode_escape").splitlines() + lines = [l for l in lines if l.strip()] + rom.texts[0x01] = formatText(rnd.choice(lines).strip()) # Reduce length of a bunch of common texts rom.texts[0xEA] = formatText("You've got a Guardian Acorn!") diff --git a/worlds/ladx/LADXR/patches/marin.txt b/worlds/ladx/LADXR/patches/marin.txt new file mode 100644 index 0000000000..3634014afe --- /dev/null +++ b/worlds/ladx/LADXR/patches/marin.txt @@ -0,0 +1,465 @@ +Let's a go! +Remember, sword goes on A! +Remember, sword goes on B! +It's pronounced Hydrocity Zone. +Avoid the heart piece of shame! +Marin? No, this is Zelda. Welcome to Hyrule +Why are you in my bed? +This is not a Mario game! +Wait, I thought Daid was French! +Is it spicefather or spaceotter? +kbranch finally took a break! +Baby seed ahead. +Abandon all hope ye who enter here... +Link... Open your eyes...\nWait, you're #####? +Remember, there are no bugs in LADX. +#####, #####, you got to wake up!\nDinner is ready. +Go find the stepladder. +Pizza power! +Eastmost peninsula is the secret. +There is no cow level. +You cannot lift rocks with your bear hands. +Don't worry, the doghouse was patched. +The carpet whale isn't real, it can't hurt you. +Isn't this a demake of Phantom Hourglass? +Go try the LAS rando! +Go try the Oracles rando! +Go try Archipelago! +Go try touching grass! +Please leave my house. +Trust me, this will be a 2 hour seed, max. +This is still better than doing Dampe dungeons. +They say that Marin can be found here. +Stalfos are such boneheads. +90 percent bug-free! +404 Marin.personality not found. +Idk man, works on my machine. +Hey guys, did you know that Vaporeon +Trans rights! +Support gay rights!\nAnd their lefts! +Snake? Snake?! SNAAAAKE!!! +Oh, you chose THESE settings? +As seen on TV! +May contain nuts. +Limited edition! +May contain RNG. +Reticulating splines! +Keyboard compatible! +Teetsuuuuoooo! +Kaaneeeedaaaa! +Learn about allyship! +This Marin text left intentionally blank. +'Autological' is! +Technoblade never dies! +Thank you, CrystalSaver! +Wait, LADX has a rando? +Wait, how many Pokemon are there now? +GOOD EMU +Good luck finding the feather. +Good luck finding the bracelets. +Good luck finding the boots. +Good luck finding your swords. +Good luck finding the flippers. +Good luck finding the rooster. +Good luck finding the hookshot. +Good luck finding the magic rod. +It's not a fire rod.\nIt's a magic rod, it shoots magic. +You should check the Seashell Mansion. +Mt. Tamaranch +WIND FISH IN NAME ONLY, FOR IT IS NEITHER. +Stuck? Try Magpie! +Ribbit! Ribbit! I'm Marin, on vocals! +Try this rando at ladxr.daid.eu! +He turned himself into a carpet whale! +Which came first, the whale or the egg? +Glan - Known Death and Taxes appreciator. +Pokemon number 591. +Would you? +Sprinkle the desert skulls. +Please don't curse in my Christian LADXR seed. +... ... ... \n... ...smash. +How was bedwetting practice? +The Oracles decomp project is going well! +#####, how do I download RAM? +Is this a delayed April Fool's Joke? +Play as if your footage will go in a\nSummoning Salt video. +I hope you prepared for our date later. +Isn't this the game where you date a seagull? +You look pretty good for a guy who probably drowned. +Remember, we race on Sundays. +This randomizer was made possible by players like you. \n \n Thank you! +Now with real fake doors! +Now with real fake floors! +You could be doing something productive right now. +No eggs were harmed in the making of this game. +I'm helping the goat, \ncatfishing Mr. Write is kinda the goal. +There are actually two LADX randomizers. +You're not gonna cheat... \n ...right? +Mamu's singing is so bad it wakes the dead. +Don't forget the Richard picture. +Are you sure you wanna do this? I kinda like this island. +SJ, BT, WW, OoB, HIJKLMNOP. +5 dollars in the swear jar. Now. +#####, I promise this seed will be better than the last one. +Want your name here? Contribute to LADXR! +Kappa +HEY! \n \n LANGUAGE! +I sell seashells on the seashore. +Hey! Are you even listening to me? +Your stay will total 10,000 rupees. I hope you have good insurance. +I have like the biggest crush on you. Will you get the hints now? +Daid watches Matty for ideas. \nBlame her if things go wrong. +'All of you are to blame.' -Daid +Batman Contingency Plan: Link. Step 1: Disguise yourself as a maiden to attract the young hero. +I have flooded Koholint with a deadly neurotoxin. +Ahh, General #####. +Finally, Link's Awakening! +Is the Wind Fish dreaming that he's sleeping in an egg? Or is he dreaming that he's you? +Save Koholint. By destroying it. Huh? Don't ask me, I'm just a kid! +There aren't enough women in this village to sustain a civilization. +So does this game take place before or after Oracles? +Have you tried the critically acclaimed MMORPG FINAL FANTASY XIV that has a free trial up to level 60 including the Heavensward expansion? +The thumbs-up sign had been used by the Galactic Federation for ages. Me, I was known for giving the thumbs-down during briefing. I had my reasons, though... Commander Adam Malkovich was normally cool and not one to joke around, but he would end all of his mission briefings by saying, 'Any objections, Lady?' +Hot hippos are near your location! +#####, get up! It's my turn in the bed! Tarin's smells too much... +Have you ever had a dream\nthat\nyo wa-\nyo had\nyo\nthat\nthat you could do anything? +Next time, try a salad. +seagull noises +I'm telling you, YOU HAVE UNO, it came free with your Xbox! +I'm telling you, YOU HAVE TRENDY, it came free with your Mabe! +LADXR - Now with even more Marin quotes! +You guys are spending more time adding Marin quotes than actually playing the game. +NASA faked the moon. +Doh, I missed! +Beginning the seed in... 100\n99\n98\n97\n96\n...\nJust Kidding. +Consider libre software! +Consider a GNU/Linux installation! +Now you're gonna tell me about how you need to get some instruments or maybe shells to hatch a whale out of an egg, right? All you boys are the same... +Oh hey #####! I made pancakes! +Oh hey #####! I made breakfast! +Alright Tarin, test subject number 142857 was a failure, give him the item and the memory drug and we'll try next time. +Betcha 100 rupees that Tarin gives you a sword. +Betcha 100 rupees that Tarin gives you the feather. +Betcha 100 rupees that Tarin gives you a bracelet. +Betcha 100 rupees that Tarin gives you the boots. +Betcha 100 rupees that Tarin gives you the hookshot. +Betcha 100 rupees that Tarin gives you the rod. +You'd think that Madam MeowMeow would be a cat person. +Look at you, with them dry lips. +You are now manually breathing. Hope that doesn't throw you off for this race. +Lemme get a number nine, a number nine large, a number six, with extra dip... +Tarin, the red-nosed deadbeat \nHad a mushroom addiction! +I'm using tilt controls! +SPLASH! \n \n \n ...Wait, you meant something else by 'splash text'? +CRACKLE-FWOOSH! +'Logic' is a strong word. +They say that the go-to way for fixing things is just to add another one of me. +gl hf +Have you considered multi-classing as a THIEF? +Don't call me Shirley +WHY are you buying CLOTHES at the SOUP STORE? +Believe it or not, this won't be the last time Link gets stranded on an island. +Is this the real life? Or is this just fantasy? +To the owner of the white sedan, your lights are on. +Now remade, in beautiful SD 2D! +Animal Village in my seed \nMarin and rabbits, loop de loop. +You seem totally entranced in Marin's appearance. +House hippoes are very timid creatures and are rarely seen, but they will defend their territory if provoked. +New goal! Close this seed, open the LADXR source code, and find the typo. +All your base are belong to us +Really? Another seed? +This seed brought to you by: the corners in the D2 boss room. +Hey, THIEF! Oh wait, you haven't done anything wrong... yet. +Hello World +With these hands, I give you life! +I heard we're a subcommunity of FFR now. +Try the Final Fantasy Randomizer! +How soon should we start calling you THIEF? +... Why do you keep doing this to yourself? +YOUR AD HERE +Did Matty give you this seed? Yeesh, good luck. +Yoooo I looked ahead into the spoiler log for this one...\n...\n...\n...good luck. +Lemme check the spoiler log...\nOkay, cool, only the normal amount of stupid. +Oh, you're alive. Dang. Guess I won't be needing THIS anymore. +Now you're gonna go talk to my dad. Gosh, boys are so predictable. +Shoot, I WAS going to steal your kidneys while you were asleep. Guess I'll have to find a moment when you don't expect me. +You caught me, mid-suavamente! +You'll be the bedwetting champion in no time. +Link, stop doing that, this is the fifth time this week I've had to change the sheets! +You mind napping in Not My Bed next time? +Why do they call it oven when you of in the cold food of out hot eat the food? +Marin sayings will never be generated by AI. Our community really is just that unfunny. +skibidi toilet\n...\nYes, that joke WILL age well +WHO DARES AWAKEN ME FROM MY THOUSAND-YEAR SLUMBER +The wind... it is... blowing... +Have I ever told you how much I hate sand? +explosion.gif +It is pronounced LADXR, not LADXR. +Stop pronouncing it lah-decks. +Someone once suggested to add all the nag messages all at once for me. +Accidentally playing Song 2? In front of the egg? It's more likely than you think. +Ladies and gentlemen? We got him. +Ladies and gentlemen? We got her. +Ladies and gentlemen? We got 'em. +What a wake up! I thought you'd never Marin! You were feeling a bit woozy and Zelda... What? Koholint? No, my name's relief! You must still be tossing. You are on turning Island! +...Zelda? Oh Marin is it? My apologies, thank you for saving me. So I'm on Koholint Island? Wait, where's my sword and shield?! +Koholint? More like kOWOlint. +What? The Wind Fish will grant my wish literally? I forsee nothing wrong happening with this. +Hey Marin! You woke me up from a fine nap! ... Thanks a lot! But now, I'll get my revenge! Are you ready?! +Why bother coming up with a funny quote? You're just gonna mash through it anyway. +something something whale something something dream something something adventure. +Some people won't be able to see this message! +If you're playing Archipelago and see this message, say hi to zig for me! +I think it may be time to stop playing LADXR seeds. +Rings do nothing unless worn! +Thank you Link, but our Instruments are in another Dungeon. +Are you sure you loaded the right seed? +Is this even randomized? +This seed brought to you by... Corners! +To this day I still don't know if we inconvenienced the Mad Batter or not. +Oh, hi ##### +People forgot I was playable in Hyrule Warriors +Join our Discord. Or else. +Also try Minecraft! +I see you're finally awake... +OwO +This is Todd Howard, and today I'm pleased to announce... The Elder Scrolls V: Skyrim for the Nintendo Game Boy Color! +Hey dummy! Need a hint? The power bracelet is... !! Whoops! There I go, talking too much again. +Thank you for visiting Toronbo Shores featuring Mabe Village. Don't forget your complimentary gift on the way out. +They say that sand can be found in Yarna Desert. +I got to see a previously unreleased cut yesterday. It only cost me 200 rupees. What a deal! +Just let him sleep +LADXR is going to be renamed X now. +Did you hear this chart-topping song yet? It's called Manbo's Mambo, it's so catchy! OH! +YOU DARE BRING LIGHT INTO MY LAIR?!?! You must DIE! +But enough talk! Have at you! +Please input your age for optimal meme-text delivery. +So the bear is just calling the walrus fat beecause he's projecting, right? +Please help, #####! The Nightmare has shuffled all the items around! +One does not simply Wake the Wind Fish. +Nothing unusual here, just a completely normal LADX game, Mister Nintendo. +Remember:\n1) Play Vanilla\n2) Play Solo Rando\n3) Play Multi +Is :) a good item? +What version do we have anyway? 0.6.9? +So, what &newgames are coming in the next AP version? +Is !remaining fixed yet? +Remember the APocalypse. Never forget the rooms we lost that day. +Have you heard of Berserker's Multiworld? +MILF. Man I love Fangames. +How big can the Big Async be anyway? A hundred worlds? +Have you heard of the After Dark server? +Try Adventure! +Try Aquaria! +Try Blasphemous! +Try Bomb Rush Cyberfunk! +Try Bumper Stickers! +Try Castlevania 64! +Try Celeste 64! +Try ChecksFinder! +Try Clique! +Try Dark Souls III! +Try DLCQuest! +Try Donkey Kong Country 3! +Try DOOM 1993! +Try DOOM II! +Try Factorio! +Try Final Fantasy! +Try Final Fantasy Mystic Quest! +Try A Hat in Time! +Try Heretic! +Try Hollow Knight! +Try Hylics 2! +Try Kingdom Hearts 2! +Try Kirby's Dream Land 3! +Try Landstalker - The Treasures of King Nole! +Try The Legend of Zelda! +Try Lingo! +Try A Link to the Past! +Try Links Awakening DX! +Try Lufia II Ancient Cave! +Try Mario & Luigi Superstar Saga! +Try MegaMan Battle Network 3! +Try Meritous! +Try The Messenger! +Try Minecraft! +Try Muse Dash! +Try Noita! +Try Ocarina of Time! +Try Overcooked! 2! +Try Pokemon Emerald! +Try Pokemon Red and Blue! +Try Raft! +Try Risk of Rain 2! +Try Rogue Legacy! +Try Secret of Evermore! +Try Shivers! +Try A Short Hike! +Try Slay the Spire! +Try SMZ3! +Try Sonic Adventure 2 Battle! +Try Starcraft 2! +Try Stardew Valley! +Try Subnautica! +Try Sudoku! +Try Super Mario 64! +Try Super Mario World! +Try Super Metroid! +Try Terraria! +Try Timespinner! +Try TUNIC! +Try Undertale! +Try VVVVVV! +Try Wargroove! +Try The Witness! +Try Yoshi's Island! +Try Yu-Gi-Oh! 2006! +Try Zillion! +Try Zork Grand Inquisitor! +Try Old School Runescape! +Try Kingdom Hearts! +Try Mega Man 2! +Try Yacht Dice! +VVVVVVVVVVVVVV this should be enough V right? +If you see this message, please open a #bug-report about it\n\n\nDon't actually though. +This YAML is going in the bucket, isn't it? +Oh, this is a terrible seed for a Sync +Oh, this is a terrible seed for an Async +What does BK stand for anyway? +Check out the #future-game-design forum +This is actually a Free trial of the critically acclaimed MMORPG Final Fantasy XIV, including the entirety of A Realm Reborn and the award winning Heavensward and Stormblood expansions up to level 70 with no restrictions on playtime! +Is it April yet? Can I play ArchipIDLE again? +https://archipelago.gg/datapackage +Hello, Link! (Disregard message if your player sprite is not Link.) +Go back to sleep, Outer Wilds isn't supported yet. +:)\nWelcome back! +Don't forget about Aginah! +Remind your Undertale player not to warp before Mad Dummy. +You need\n9 instruments\nor maybe not. I wouldn't know. +Try !\n\nIt makes the game easier. +Have you tried The Witness? If you're a fan of games about waking up on an unfamiliar island, give it a shot! +Have you tried turning it off and on again? +Its about time. Now go and check +This dream is a lie. Or is it a cake? +Don't live your dream. Dream your live. +Only 5 more minutes. zzzZ +Tell me, for whom do you fight?\nHmmph. How very glib. And do you believe in Koholint? +I wonder when Undertale will be merged?\nOh wait it already has. +Hit me up if you get stuck -\nwe could go to Burger King together. +Post this message to delay Silksong. +Sorry #####, but your princess is in another castle! +You've been met with a terrible fate, haven't you? +Hey!\nListen!\nHey! Hey!\nListen! +I bet there's a progression item at the 980 Rupee shop check. +Lamp oil? Rope? Bombs? You want it? It's yours, my friend. As long as you have enough rubies. +One day I happened to be occupied with the subject of generation of waves by wind. +(nuzzles you) uwu +why do they call it links awakening when links awake and IN links asleep OUT the wind fish +For many years I have been looking, searching for, but never finding, the builder of this house... +What the heck is a Quatro? +Have you tried The Binding of Isaac yet? +Have you played Pong? \n I hear it's still popular nowadays. +Five Nights at Freddy's... \n That's where I wanna be +Setting Coinsanity to -1... +Your Feather can be found at Mask-Shard_Grey_Mourner +Your Sword can be found in Ganon's Tower +Your Rooster can be found in HylemXylem +Your Bracelet can be found at Giant Floor Puzzle +Your Flippers can be found in Valley of Bowser +Your Magic Rod can be found in Victory Road +Your Hookshot can be found in Bowser in the Sky +Have they added Among Us to AP yet? +Every copy of LADX is personalized, David. +Looks like you're going on A Short Hike. Bring back feathers please? +Functioning Brain is at...\nWait. This isn't Witness. Wrong game, sorry. +Don't forget to check your Clique!\nIf, y'know, you have one. No pressure... +:3 +Sorry ######, but your progression item is in another world. +&newgames\n&oldgames +Do arrows come with turners? I'm stuck in my Bumper Stickers world. +This seed has dexsanity enabled. Don't get stuck in Dewford! +Please purchase the Dialogue Pack for DLC Quest: Link's Adventure to read the rest of this text. +No hints here. Maybe ask BK Sudoku for some? +KILNS (Yellow Middle, 5) \n REVELATION (White Low, 9) +Push the button! When someone lets you... +You won't believe the WEIRD thing Tarin found at the beach! Go on, ask him about it! +When's door randomizer getting added to AP? +Can you get my Morph Ball? +Shoutouts to Simpleflips +Remember, Sword goes on C!\n...you have a C button, right? +Ask Berserker for your Progressive Power Bracelets! +I will be taking your Burger King order now to save you some time when you inevitably need it. +Welcome to KOHOLINT ISLAND.\nNo, we do not have a BURGER KING. +Welcome to Burger King, may I take your order? +Rise and shine, #####. Rise and shine. +Well, this is\nLITTLEROOT TOWN.\nHow do you like it? +My boy, this peace is what all true warriors strive for! +#####, you can do it!\nSave the Princess...\nZelda is your... ... ... +Dear Mario:\nPlease come to the castle, I've baked a cake for you. Yours truly--\nPrincess Toadstool\nPeach +Grass-sanity mode activated. Have fun! +Don't forget to bring rupees to the signpost maze this time. +UP UP DOWN DOWN LEFT RIGHT LEFT RIGHT B A START +Try LADX!\nWait a minute... +ERROR! Unable to verify player. Please drink a verification can. +We have been trying to reach you about your raft's extended warranty +Are you ready for the easiest BK of your life? +Hello, welcome to the world of Pokemon!\nMy name is Marin, and I'm-- +Alright, this is very important, I need you to listen to what I'm about to tell you--\nHey, wait, where are you going?! +Cheques?\nSorry we don't accept cheques here +Hi! \nMarin. \nWho...? \nHow...? \nWait... \nWhy??? \nSorry... \n...\nThanks. \nBye! +AHHH WHY IS THERE SO MUCH GRASS? \nHOLY SH*T GRASS SNAKE AHHHH +Could you buy some strawberries on your way home? \nHuh it's out of logic??? What?? +I heard you sleeptalking about skeletons and genocide... Your past must have been full of misery (mire) +It's time to let go... \nIt wasn't your fault... \nYou couldn't have known your first check was going to be hardmode... +They say that your progression is in another castle... +A minute of silence for the failed generations due to the Fitness Gram Pacer test. +Save an Ice Trap for me, please? +maren +ERROR DETECTED IN YAML\nOHKO MODE FORCED ON +she awaken my link (extremely loud incorrect buzzer) +Is deathlink on? If so, be careful! +Sorry, but you're about to be BK'd. +Did you set up cheesetracker yet? +I've got a hint I need you to get... +You aren't planning to destroy this island and kill everyone on it are you? +Have you ever had a dream, that, that you um you had you'd you would you could you'd do you wi you wants you you could do so you you'd do you could you you want you want him to do you so much you could do anything? +R R R U L L U L U R U R D R D R U U +I'm not sure how, but I am pretty sure this is Phar's fault. +Oh, look at that. Link's Awakened.\nYou did it, you beat the game. +Excellent armaments, #####. Please return - \nCOVERED IN BLOOD -\n...safe and sound. +Pray return to the Link's Awakening Sands. +This Marin dialogue was inspired by The Witness's audiologs. +You're awake!\n....\nYou were warned.\nI'm now going to say every word beginning with Z!\nZA\nZABAGLIONE\nZABAGLIONES\nZABAIONE\nZABAIONES\nZABAJONE\nZABAJONES\nZABETA\nZABETAS\nZABRA\nZABRAS\nZABTIEH\nZABTIEHS\nZACATON\nZACATONS\nZACK\nZACKS\nZADDICK\nZADDIK\nZADDIKIM\nZADDIKS\nZAFFAR\nzAFFARS\nZAFFER\nZAFFERS\nZAFFIR\n....\n....\n....\nI'll let you off easy.\nThis time. +Leave me alone, I'm Marinating. +praise be to the tungsten cube +If you play multiple seeds in a row, you can pretend that each run is the dream you awaken from in the next. +If this is a competitive race,\n\nyour time has already started. +If anything goes wrong, remember.\n Blame Phar. +Better hope your Hookshot didn't land on the Sick Kid. +One time, I accidentally said Konoliht instead of Koholint... +Sometimes, you must become best girl yourself... +You just woke up! My name's #####!\nYou must be Marin, right? +I just had the strangest dream, I was a seagull!\nI sung many songs for everybody to hear!\nHave you ever had a strange dream before? +If you think about it, Koholint sounds suspiciously similar to Coherent... +All I kin remember is biting into a juicy toadstool. Then I had the strangest dream... I was a Marin! Yeah, it sounds strange, but it sure was fun! +Prepare for a 100% run! +Prediction: 1 hour +Prediction: 4 hours +Prediction: 6 hours +Prediction: 12 hours +Prediction: Impossible seed +Oak's parcel has arrived. +Don't forget to like and subscribe! +Don't BK, eat healthy! +No omega symbols broke this seed gen? Good! +#####...\nYou're lucky.\nLooks like my summer vacation is...\nover. +Are you ready to send nukes to someone's Factorio game? +You're late... Is this a Cmario game? +At least you don't have to fight Ganon... What? +PRAISE THE SUN! +I'd recommend more sleep before heading out there. +You Must Construct Additional Pylons +#####, you lazy bum. I knew that I'd find you snoozing down here. +This is it, #####.\nJust breathe.\nWhy are you so nervous? +Hey, you. You're finally awake.\nYou were trying to cross the border, huh? +Hey, you. You're finally awake.\nYou were trying to leave the island, huh?\nSwam straight into that whirlpool, same as us, and that thief over there. +Is my Triforce locked behind your Wind Fish? From 2f0b81e12c67b5a5d8d2d0643a71dc7cf88d1e32 Mon Sep 17 00:00:00 2001 From: threeandthreee Date: Fri, 7 Mar 2025 19:24:58 -0500 Subject: [PATCH 066/227] LADX: tarins gift improvement (#3970) * add groups and a preset * formatting * pull zig's tarin's gift improvements * typing * alias groups for progressive items * change tarins gift option a bit * add bush breakers item group * fix typo * bush_breaker option, respect non_local_items * review suggestions * cleaner thx exempt * Update worlds/ladx/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * fix gen failures for dungeon shuffle * exclude shovel based on entrance mapping --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/ladx/LADXR/locations/startItem.py | 11 --- worlds/ladx/Options.py | 16 +++++ worlds/ladx/__init__.py | 88 ++++++++++++++++-------- 3 files changed, 77 insertions(+), 38 deletions(-) diff --git a/worlds/ladx/LADXR/locations/startItem.py b/worlds/ladx/LADXR/locations/startItem.py index 0421c1d6d8..6cd9651671 100644 --- a/worlds/ladx/LADXR/locations/startItem.py +++ b/worlds/ladx/LADXR/locations/startItem.py @@ -7,23 +7,12 @@ from ..roomEditor import RoomEditor class StartItem(DroppedKey): - # We need to give something here that we can use to progress. - # FEATHER - OPTIONS = [SWORD, SHIELD, POWER_BRACELET, OCARINA, BOOMERANG, MAGIC_ROD, TAIL_KEY, SHOVEL, HOOKSHOT, PEGASUS_BOOTS, MAGIC_POWDER, BOMB] MULTIWORLD = False def __init__(self): super().__init__(0x2A3) self.give_bowwow = False - def configure(self, options): - if options.bowwow != 'normal': - # When we have bowwow mode, we pretend to be a sword for logic reasons - self.OPTIONS = [SWORD] - self.give_bowwow = True - if options.randomstartlocation and options.entranceshuffle != 'none': - self.OPTIONS.append(FLIPPERS) - def patch(self, rom, option, *, multiworld=None): assert multiworld is None diff --git a/worlds/ladx/Options.py b/worlds/ladx/Options.py index a35bb870fd..7ea7df3659 100644 --- a/worlds/ladx/Options.py +++ b/worlds/ladx/Options.py @@ -527,6 +527,20 @@ class InGameHints(DefaultOnToggle): display_name = "In-game Hints" +class TarinsGift(Choice): + """ + [Local Progression] Forces Tarin's gift to be an item that immediately opens up local checks. + Has little effect in single player games, and isn't always necessary with randomized entrances. + [Bush Breaker] Forces Tarin's gift to be an item that can destroy bushes. + [Any Item] Tarin's gift can be any item for any world + """ + display_name = "Tarin's Gift" + option_local_progression = 0 + option_bush_breaker = 1 + option_any_item = 2 + default = option_local_progression + + class StabilizeItemPool(DefaultOffToggle): """ By default, rupees in the item pool may be randomly swapped with bombs, arrows, powders, or capacity upgrades. This option disables that swapping, which is useful for plando. @@ -565,6 +579,7 @@ ladx_option_groups = [ OptionGroup("Miscellaneous", [ TradeQuest, Rooster, + TarinsGift, Overworld, TrendyGame, InGameHints, @@ -638,6 +653,7 @@ class LinksAwakeningOptions(PerGameCommonOptions): text_mode: TextMode no_flash: NoFlash in_game_hints: InGameHints + tarins_gift: TarinsGift overworld: Overworld stabilize_item_pool: StabilizeItemPool diff --git a/worlds/ladx/__init__.py b/worlds/ladx/__init__.py index a887638e37..4c22693c8f 100644 --- a/worlds/ladx/__init__.py +++ b/worlds/ladx/__init__.py @@ -4,6 +4,7 @@ import os import pkgutil import tempfile import typing +import logging import re import bsdiff4 @@ -178,10 +179,10 @@ class LinksAwakeningWorld(World): assert(start) - menu_region = LinksAwakeningRegion("Menu", None, "Menu", self.player, self.multiworld) + menu_region = LinksAwakeningRegion("Menu", None, "Menu", self.player, self.multiworld) menu_region.exits = [Entrance(self.player, "Start Game", menu_region)] menu_region.exits[0].connect(start) - + self.multiworld.regions.append(menu_region) # Place RAFT, other access events @@ -189,14 +190,14 @@ class LinksAwakeningWorld(World): for loc in region.locations: if loc.address is None: loc.place_locked_item(self.create_event(loc.ladxr_item.event)) - + # Connect Windfish -> Victory windfish = self.multiworld.get_region("Windfish", self.player) l = Location(self.player, "Windfish", parent=windfish) windfish.locations = [l] - + l.place_locked_item(self.create_event("An Alarm Clock")) - + self.multiworld.completion_condition[self.player] = lambda state: state.has("An Alarm Clock", player=self.player) def create_item(self, item_name: str): @@ -206,6 +207,8 @@ class LinksAwakeningWorld(World): return Item(event, ItemClassification.progression, None, self.player) def create_items(self) -> None: + itempool = [] + exclude = [item.name for item in self.multiworld.precollected_items[self.player]] self.prefill_original_dungeon = [ [], [], [], [], [], [], [], [], [] ] @@ -265,9 +268,9 @@ class LinksAwakeningWorld(World): self.prefill_own_dungeons.append(item) self.pre_fill_items.append(item) else: - self.multiworld.itempool.append(item) + itempool.append(item) else: - self.multiworld.itempool.append(item) + itempool.append(item) self.multi_key = self.generate_multi_key() @@ -276,8 +279,8 @@ class LinksAwakeningWorld(World): event_location = Location(self.player, "Can Play Trendy Game", parent=trendy_region) trendy_region.locations.insert(0, event_location) event_location.place_locked_item(self.create_event("Can Play Trendy Game")) - - self.dungeon_locations_by_dungeon = [[], [], [], [], [], [], [], [], []] + + self.dungeon_locations_by_dungeon = [[], [], [], [], [], [], [], [], []] for r in self.multiworld.get_regions(self.player): # Set aside dungeon locations if r.dungeon_index: @@ -290,21 +293,52 @@ class LinksAwakeningWorld(World): # Properly fill locations within dungeon location.dungeon = r.dungeon_index - # For now, special case first item - FORCE_START_ITEM = True - if FORCE_START_ITEM: - self.force_start_item() + if self.options.tarins_gift != "any_item": + self.force_start_item(itempool) - def force_start_item(self): + + self.multiworld.itempool += itempool + + def force_start_item(self, itempool): start_loc = self.multiworld.get_location("Tarin's Gift (Mabe Village)", self.player) if not start_loc.item: - possible_start_items = [index for index, item in enumerate(self.multiworld.itempool) - if item.player == self.player - and item.item_data.ladxr_id in start_loc.ladxr_item.OPTIONS and not item.location] - if possible_start_items: - index = self.random.choice(possible_start_items) - start_item = self.multiworld.itempool.pop(index) + """ + Find an item that forces progression or a bush breaker for the player, depending on settings. + """ + def is_possible_start_item(item): + return item.advancement and item.name not in self.options.non_local_items + + def opens_new_regions(item): + collection_state = base_collection_state.copy() + collection_state.collect(item) + return len(collection_state.reachable_regions[self.player]) > reachable_count + + start_items = [item for item in itempool if is_possible_start_item(item)] + self.random.shuffle(start_items) + + if self.options.tarins_gift == "bush_breaker": + start_item = next((item for item in start_items if item.name in links_awakening_item_name_groups["Bush Breakers"]), None) + + else: # local_progression + entrance_mapping = self.ladxr_logic.world_setup.entrance_mapping + # Tail key opens a region but not a location if d1 entrance is not mapped to d1 or d4 + # exclude it in these cases to avoid fill errors + if entrance_mapping['d1'] not in ['d1', 'd4']: + start_items = [item for item in start_items if item.name != 'Tail Key'] + # Exclude shovel unless starting in Mabe Village + if entrance_mapping['start_house'] not in ['start_house', 'shop']: + start_items = [item for item in start_items if item.name != 'Shovel'] + base_collection_state = CollectionState(self.multiworld) + base_collection_state.update_reachable_regions(self.player) + reachable_count = len(base_collection_state.reachable_regions[self.player]) + start_item = next((item for item in start_items if opens_new_regions(item)), None) + + if start_item: + itempool.remove(start_item) start_loc.place_locked_item(start_item) + else: + logging.getLogger("Link's Awakening Logger").warning(f"No {self.options.tarins_gift.current_option_name} available for Tarin's Gift.") + def get_pre_fill_items(self): return self.pre_fill_items @@ -317,7 +351,7 @@ class LinksAwakeningWorld(World): # set containing the list of all possible dungeon locations for the player all_dungeon_locs = set() - + # Do dungeon specific things for dungeon_index in range(0, 9): # set up allow-list for dungeon specific items @@ -330,7 +364,7 @@ class LinksAwakeningWorld(World): # ...also set the rules for the dungeon for location in locs: orig_rule = location.item_rule - # If an item is about to be placed on a dungeon location, it can go there iff + # If an item is about to be placed on a dungeon location, it can go there iff # 1. it fits the general rules for that location (probably 'return True' for most places) # 2. Either # 2a. it's not a restricted dungeon item @@ -382,7 +416,7 @@ class LinksAwakeningWorld(World): # Sweep to pick up already placed items that are reachable with everything but the dungeon items. partial_all_state.sweep_for_advancements() - + fill_restrictive(self.multiworld, partial_all_state, all_dungeon_locs_to_fill, all_dungeon_items_to_fill, lock=True, single_player_placement=True, allow_partial=False) @@ -421,7 +455,7 @@ class LinksAwakeningWorld(World): for name in possibles: if name in self.name_cache: return self.name_cache[name] - + return "TRADING_ITEM_LETTER" @classmethod @@ -436,7 +470,7 @@ class LinksAwakeningWorld(World): for loc in r.locations: if isinstance(loc, LinksAwakeningLocation): assert(loc.item) - + # If we're a links awakening item, just use the item if isinstance(loc.item, LinksAwakeningItem): loc.ladxr_item.item = loc.item.item_data.ladxr_id @@ -470,7 +504,7 @@ class LinksAwakeningWorld(World): args = parser.parse_args([rom_name, "-o", out_name, "--dump"]) rom = generator.generateRom(args, self) - + with open(out_path, "wb") as handle: rom.save(handle, name="LADXR") @@ -478,7 +512,7 @@ class LinksAwakeningWorld(World): if self.options.ap_title_screen: with tempfile.NamedTemporaryFile(delete=False) as title_patch: title_patch.write(pkgutil.get_data(__name__, "LADXR/patches/title_screen.bdiff4")) - + bsdiff4.file_patch_inplace(out_path, title_patch.name) os.unlink(title_patch.name) From bc61221ec60ab1b3b31ef5d3b412a70f9d4f3c85 Mon Sep 17 00:00:00 2001 From: Silent <110704408+silent-destroyer@users.noreply.github.com> Date: Fri, 7 Mar 2025 19:43:02 -0500 Subject: [PATCH 067/227] TUNIC: Expanded hexagon quest options (#4076) * More hex quest updates - Implement page ability shuffle for hex quest - Fix keys behind bosses if hex goal is less than 3 - Added check to fix conflicting hex quest options - Add option to slot data * Change option comparison * Change option checking and fix some stuff - also keep prayer first on low hex counts * Update option defaulting * Update option checking * Fix option assignment again * Show player name in option warning * Add new option to universal tracker stuff * Update __init__.py * Make helper method for getting total hexagons in itempool * Update options.py * Update option value passthrough * Change ability shuffle to default on * Check for hexagons option when writing spoiler --- worlds/tunic/__init__.py | 44 +++++++++++++++++++--------- worlds/tunic/options.py | 63 ++++++++++++++++++++++++++++++++++++---- worlds/tunic/rules.py | 21 +++++++++----- 3 files changed, 103 insertions(+), 25 deletions(-) diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index e86f731381..2ee58d42d1 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -11,7 +11,8 @@ from .er_scripts import create_er_regions from .grass import grass_location_table, grass_location_name_to_id, grass_location_name_groups, excluded_grass_locations from .er_data import portal_mapping, RegionInfo, tunic_er_regions from .options import (TunicOptions, EntranceRando, tunic_option_groups, tunic_option_presets, TunicPlandoConnections, - LaurelsLocation, LogicRules, LaurelsZips, IceGrappling, LadderStorage) + LaurelsLocation, LogicRules, LaurelsZips, IceGrappling, LadderStorage, check_options, + get_hexagons_in_pool, HexagonQuestAbilityUnlockType) from .combat_logic import area_data, CombatState from worlds.AutoWorld import WebWorld, World from Options import PlandoConnection, OptionError @@ -109,6 +110,8 @@ class TunicWorld(World): ut_can_gen_without_yaml = True # class var that tells it to ignore the player yaml def generate_early(self) -> None: + check_options(self) + if self.options.logic_rules >= LogicRules.option_no_major_glitches: self.options.laurels_zips.value = LaurelsZips.option_true self.options.ice_grappling.value = IceGrappling.option_medium @@ -144,6 +147,7 @@ class TunicWorld(World): self.options.lanternless.value = self.passthrough["lanternless"] self.options.maskless.value = self.passthrough["maskless"] self.options.hexagon_quest.value = self.passthrough["hexagon_quest"] + self.options.hexagon_quest_ability_type.value = self.passthrough.get("hexagon_quest_ability_type", 0) self.options.entrance_rando.value = self.passthrough["entrance_rando"] self.options.shuffle_ladders.value = self.passthrough["shuffle_ladders"] self.options.grass_randomizer.value = self.passthrough.get("grass_randomizer", 0) @@ -261,6 +265,10 @@ class TunicWorld(World): items_to_create: Dict[str, int] = {item: data.quantity_in_item_pool for item, data in item_table.items()} + # Calculate number of hexagons in item pool + if self.options.hexagon_quest: + items_to_create[gold_hexagon] = get_hexagons_in_pool(self) + for money_fool in fool_tiers[self.options.fool_traps]: items_to_create["Fool Trap"] += items_to_create[money_fool] items_to_create[money_fool] = 0 @@ -291,11 +299,21 @@ class TunicWorld(World): items_to_create["Grass"] -= len(excluded_grass_locations) if self.options.keys_behind_bosses: - for rgb_hexagon, location in hexagon_locations.items(): - hex_item = self.create_item(gold_hexagon if self.options.hexagon_quest else rgb_hexagon) - self.get_location(location).place_locked_item(hex_item) - items_to_create[rgb_hexagon] = 0 - items_to_create[gold_hexagon] -= 3 + rgb_hexagons = list(hexagon_locations.keys()) + # shuffle these in case not all are placed in hex quest + self.random.shuffle(rgb_hexagons) + for rgb_hexagon in rgb_hexagons: + location = hexagon_locations[rgb_hexagon] + if self.options.hexagon_quest: + if items_to_create[gold_hexagon] > 0: + hex_item = self.create_item(gold_hexagon) + items_to_create[gold_hexagon] -= 1 + items_to_create[rgb_hexagon] = 0 + self.get_location(location).place_locked_item(hex_item) + else: + hex_item = self.create_item(rgb_hexagon) + self.get_location(location).place_locked_item(hex_item) + items_to_create[rgb_hexagon] = 0 # Filler items in the item pool available_filler: List[str] = [filler for filler in items_to_create if items_to_create[filler] > 0 and @@ -323,13 +341,11 @@ class TunicWorld(World): remove_filler(ladder_count) if self.options.hexagon_quest: - # Calculate number of hexagons in item pool - hexagon_goal = self.options.hexagon_goal - extra_hexagons = self.options.extra_hexagon_percentage - items_to_create[gold_hexagon] += int((Decimal(100 + extra_hexagons) / 100 * hexagon_goal).to_integral_value(rounding=ROUND_HALF_UP)) - # Replace pages and normal hexagons with filler for replaced_item in list(filter(lambda item: "Pages" in item or item in hexagon_locations, items_to_create)): + if replaced_item in item_name_groups["Abilities"] and self.options.ability_shuffling \ + and self.options.hexagon_quest_ability_type == "pages": + continue filler_name = self.get_filler_item_name() items_to_create[filler_name] += items_to_create[replaced_item] if items_to_create[filler_name] >= 1 and filler_name not in available_filler: @@ -441,7 +457,7 @@ class TunicWorld(World): def create_regions(self) -> None: self.tunic_portal_pairs = {} self.er_portal_hints = {} - self.ability_unlocks = randomize_ability_unlocks(self.random, self.options) + self.ability_unlocks = randomize_ability_unlocks(self) # stuff for universal tracker support, can be ignored for standard gen if self.using_ut: @@ -504,7 +520,8 @@ class TunicWorld(World): return change def write_spoiler_header(self, spoiler_handle: TextIO): - if self.options.hexagon_quest and self.options.ability_shuffling: + if self.options.hexagon_quest and self.options.ability_shuffling\ + and self.options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: spoiler_handle.write("\nAbility Unlocks (Hexagon Quest):\n") for ability in self.ability_unlocks: # Remove parentheses for better readability @@ -567,6 +584,7 @@ class TunicWorld(World): "sword_progression": self.options.sword_progression.value, "ability_shuffling": self.options.ability_shuffling.value, "hexagon_quest": self.options.hexagon_quest.value, + "hexagon_quest_ability_type": self.options.hexagon_quest_ability_type.value, "fool_traps": self.options.fool_traps.value, "laurels_zips": self.options.laurels_zips.value, "ice_grappling": self.options.ice_grappling.value, diff --git a/worlds/tunic/options.py b/worlds/tunic/options.py index d2ea828037..3ace28cffa 100644 --- a/worlds/tunic/options.py +++ b/worlds/tunic/options.py @@ -1,8 +1,14 @@ +import logging from dataclasses import dataclass -from typing import Dict, Any +from typing import Dict, Any, TYPE_CHECKING + +from decimal import Decimal, ROUND_HALF_UP + from Options import (DefaultOnToggle, Toggle, StartInventoryPool, Choice, Range, TextChoice, PlandoConnections, PerGameCommonOptions, OptionGroup, Visibility, NamedRange) from .er_data import portal_mapping +if TYPE_CHECKING: + from . import TunicWorld class SwordProgression(DefaultOnToggle): @@ -24,6 +30,7 @@ class StartWithSword(Toggle): class KeysBehindBosses(Toggle): """ Places the three hexagon keys behind their respective boss fight in your world. + If playing Hexagon Quest, it will place three gold hexagons at the boss locations. """ internal_name = "keys_behind_bosses" display_name = "Keys Behind Bosses" @@ -32,7 +39,8 @@ class KeysBehindBosses(Toggle): class AbilityShuffling(DefaultOnToggle): """ Locks the usage of Prayer, Holy Cross*, and the Icebolt combo until the relevant pages of the manual have been found. - If playing Hexagon Quest, abilities are instead randomly unlocked after obtaining 25%, 50%, and 75% of the required Hexagon goal amount. + If playing Hexagon Quest, abilities are instead randomly unlocked after obtaining 25%, 50%, and 75% of the required + Hexagon goal amount, unless the option is set to have them unlock via pages instead. * Certain Holy Cross usages are still allowed, such as the free bomb codes, the seeking spell, and other player-facing codes. """ internal_name = "ability_shuffling" @@ -84,14 +92,16 @@ class HexagonGoal(Range): """ internal_name = "hexagon_goal" display_name = "Gold Hexagons Required" - range_start = 15 - range_end = 50 + range_start = 1 + range_end = 100 default = 20 class ExtraHexagonPercentage(Range): """ How many extra Gold Questagons are shuffled into the item pool, taken as a percentage of the goal amount. + The max number of Gold Questagons that can be in the item pool is 100, so this option may be overridden and/or + reduced if the Hexagon Goal amount is greater than 50. """ internal_name = "extra_hexagon_percentage" display_name = "Percentage of Extra Gold Hexagons" @@ -100,11 +110,27 @@ class ExtraHexagonPercentage(Range): default = 50 +class HexagonQuestAbilityUnlockType(Choice): + """ + Determines how abilities are unlocked when playing Hexagon Quest with Shuffled Abilities enabled. + + Hexagons: A new ability is randomly unlocked after obtaining 25%, 50%, and 75% of the required Hexagon goal amount. Requires at least 3 Gold Hexagons in the item pool, or 15 if Keys Behind Bosses is enabled. + Pages: Abilities are unlocked by finding specific pages in the manual. + + This option does nothing if Shuffled Abilities is not enabled. + """ + internal_name = "hexagon_quest_ability_type" + display_name = "Hexagon Quest Ability Unlocks" + option_hexagons = 0 + option_pages = 1 + default = 0 + + class EntranceRando(TextChoice): """ Randomize the connections between scenes. A small, very lost fox on a big adventure. - + If you set this option's value to a string, it will be used as a custom seed. Every player who uses the same custom seed will have the same entrances, choosing the most restrictive settings among these players for the purpose of pairing entrances. """ @@ -301,6 +327,7 @@ class TunicOptions(PerGameCommonOptions): hexagon_quest: HexagonQuest hexagon_goal: HexagonGoal extra_hexagon_percentage: ExtraHexagonPercentage + hexagon_quest_ability_type: HexagonQuestAbilityUnlockType shuffle_ladders: ShuffleLadders grass_randomizer: GrassRandomizer @@ -323,6 +350,12 @@ class TunicOptions(PerGameCommonOptions): tunic_option_groups = [ + OptionGroup("Hexagon Quest Options", [ + HexagonQuest, + HexagonGoal, + ExtraHexagonPercentage, + HexagonQuestAbilityUnlockType + ]), OptionGroup("Logic Options", [ CombatLogic, Lanternless, @@ -357,3 +390,23 @@ tunic_option_presets: Dict[str, Dict[str, Any]] = { "lanternless": True, }, } + + +def check_options(world: "TunicWorld"): + options = world.options + if options.hexagon_quest and options.ability_shuffling and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: + total_hexes = get_hexagons_in_pool(world) + min_hexes = 3 + + if options.keys_behind_bosses: + min_hexes = 15 + if total_hexes < min_hexes: + logging.warning(f"TUNIC: Not enough Gold Hexagons in {world.player_name}'s item pool for Hexagon Ability Shuffle with the selected options. Ability Shuffle mode will be switched to Pages.") + options.hexagon_quest_ability_type.value = HexagonQuestAbilityUnlockType.option_pages + + +def get_hexagons_in_pool(world: "TunicWorld"): + # Calculate number of hexagons in item pool + options = world.options + return min(int((Decimal(100 + options.extra_hexagon_percentage) / 100 * options.hexagon_goal) + .to_integral_value(rounding=ROUND_HALF_UP)), 100) diff --git a/worlds/tunic/rules.py b/worlds/tunic/rules.py index b58ad73072..c7b4ad0d40 100644 --- a/worlds/tunic/rules.py +++ b/worlds/tunic/rules.py @@ -1,9 +1,9 @@ -from random import Random from typing import Dict, TYPE_CHECKING +from decimal import Decimal, ROUND_HALF_UP from worlds.generic.Rules import set_rule, forbid_item, add_rule from BaseClasses import CollectionState -from .options import TunicOptions, LadderStorage, IceGrappling +from .options import LadderStorage, IceGrappling, HexagonQuestAbilityUnlockType if TYPE_CHECKING: from . import TunicWorld @@ -34,14 +34,21 @@ bomb_walls = ["East Forest - Bombable Wall", "Eastern Vault Fortress - [East Win "Quarry - [West] Upper Area Bombable Wall", "Ruined Atoll - [Northwest] Bombable Wall"] -def randomize_ability_unlocks(random: Random, options: TunicOptions) -> Dict[str, int]: +def randomize_ability_unlocks(world: "TunicWorld") -> Dict[str, int]: + random = world.random + options = world.options + + abilities = [prayer, holy_cross, icebolt] ability_requirement = [1, 1, 1] - if options.hexagon_quest.value: + random.shuffle(abilities) + + if options.hexagon_quest.value and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: hexagon_goal = options.hexagon_goal.value # Set ability unlocks to 25, 50, and 75% of goal amount ability_requirement = [hexagon_goal // 4, hexagon_goal // 2, hexagon_goal * 3 // 4] - abilities = [prayer, holy_cross, icebolt] - random.shuffle(abilities) + if any(req == 0 for req in ability_requirement): + ability_requirement = [1, 2, 3] + return dict(zip(abilities, ability_requirement)) @@ -50,7 +57,7 @@ def has_ability(ability: str, state: CollectionState, world: "TunicWorld") -> bo ability_unlocks = world.ability_unlocks if not options.ability_shuffling: return True - if options.hexagon_quest: + if options.hexagon_quest and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: return state.has(gold_hexagon, world.player, ability_unlocks[ability]) return state.has(ability, world.player) From 08b3b3ecf51b0a6fd3fa7c02ad10bf05e6892312 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 8 Mar 2025 01:44:06 +0100 Subject: [PATCH 068/227] The Witness: The Secret Feature (#4370) * Secret Feature * Fixes * Fixes and unit tests * renaming some variables * Fix the thing * unit test for elevator egg * Docstring * reword * Fix duplicate locations I think? * Remove debug thing * Add the tests back lol * Make it so that you can exclude an egg to disable it * Improve hint text for easter eggs * Update worlds/witness/options.py Co-authored-by: Scipio Wright * Update worlds/witness/player_logic.py Co-authored-by: Scipio Wright * Update worlds/witness/options.py Co-authored-by: Scipio Wright * Update worlds/witness/player_logic.py Co-authored-by: Scipio Wright * Update worlds/witness/rules.py Co-authored-by: Scipio Wright * Update test_easter_egg_shuffle.py * This was actually not necessary, since this is the Egg requirements, nothing to do with location names * Move one of them * Improve logic * Lol * Moar * Adjust unit tests * option docstring adjustment * Recommend door shuffle * Don't overlap IDs * Option description idk * Change the way the difficulties work to reward playing higher modes * Fix merge * add some stuff to generate_data_file (this file is not imported during gen, don't review it :D) * oop * space * This can be earlier than I thought, apparently. * buffer * Comment * Make sure the option is VERY visible * Some mypy stuff * apparently ruff wants this * . * durinig * Update options.py * Explain the additional effects of each difficulty * Fix logic of flood room secret * Add Southern Peninsula Area * oop --------- Co-authored-by: Scipio Wright --- worlds/witness/__init__.py | 35 ++-- worlds/witness/data/WitnessLogic.txt | 40 ++++- worlds/witness/data/WitnessLogicExpert.txt | 40 ++++- worlds/witness/data/WitnessLogicVanilla.txt | 40 ++++- worlds/witness/data/WitnessLogicVariety.txt | 40 ++++- worlds/witness/data/settings/easter_eggs.py | 75 +++++++++ worlds/witness/data/static_logic.py | 71 +++++++- worlds/witness/data/utils.py | 16 +- worlds/witness/generate_data_file.py | 9 + worlds/witness/hints.py | 12 +- worlds/witness/locations.py | 2 +- worlds/witness/options.py | 61 +++++++ worlds/witness/player_items.py | 7 + worlds/witness/player_logic.py | 89 ++++++++-- worlds/witness/regions.py | 15 +- worlds/witness/ruff.toml | 2 +- worlds/witness/rules.py | 15 +- .../witness/test/test_easter_egg_shuffle.py | 155 ++++++++++++++++++ 18 files changed, 651 insertions(+), 73 deletions(-) create mode 100644 worlds/witness/data/settings/easter_eggs.py create mode 100644 worlds/witness/test/test_easter_egg_shuffle.py diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 471d030d48..3bf3661bc1 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -5,7 +5,7 @@ import dataclasses from logging import error, warning from typing import Any, Dict, List, Optional, cast -from BaseClasses import CollectionState, Entrance, Location, Region, Tutorial +from BaseClasses import CollectionState, Entrance, Location, LocationProgressType, Region, Tutorial from Options import OptionError, PerGameCommonOptions, Toggle from worlds.AutoWorld import WebWorld, World @@ -380,6 +380,10 @@ class WitnessWorld(World): if isinstance(item_name, dict): item_name = next(iter(item_name)) + # Easter Egg events with arbitrary sizes + if item_name.startswith("+") and "Easter Egg" in item_name: + return WitnessItem.make_egg_event(item_name, self.player) + # this conditional is purely for unit tests, which need to be able to create an item before generate_early item_data: ItemData if hasattr(self, "player_items") and self.player_items and item_name in self.player_items.item_data: @@ -389,6 +393,18 @@ class WitnessWorld(World): return WitnessItem(item_name, item_data.classification, item_data.ap_code, player=self.player) + def collect(self, state: "CollectionState", item: WitnessItem) -> bool: + changed = super().collect(state, item) + if changed and item.eggs: + state.prog_items[self.player]["Egg"] += item.eggs + return changed + + def remove(self, state: "CollectionState", item: WitnessItem) -> bool: + changed = super().remove(state, item) + if changed and item.eggs: + state.prog_items[self.player]["Egg"] -= item.eggs + return changed + def get_filler_item_name(self) -> str: return "Speed Boost" @@ -398,11 +414,9 @@ class WitnessLocation(Location): Archipelago Location for The Witness """ game: str = "The Witness" - entity_hex: int = -1 - def __init__(self, player: int, name: str, address: Optional[int], parent: Region, ch_hex: int = -1) -> None: + def __init__(self, player: int, name: str, address: Optional[int], parent: Region) -> None: super().__init__(player, name, address, parent) - self.entity_hex = ch_hex def create_region(world: WitnessWorld, name: str, player_locations: WitnessPlayerLocations, @@ -416,14 +430,13 @@ def create_region(world: WitnessWorld, name: str, player_locations: WitnessPlaye for location in region_locations: loc_id = player_locations.CHECK_LOCATION_TABLE[location] - entity_hex = -1 + location_obj = WitnessLocation(world.player, location, loc_id, ret) + if location in static_witness_logic.ENTITIES_BY_NAME: - entity_hex = int( - static_witness_logic.ENTITIES_BY_NAME[location]["entity_hex"], 0 - ) - location_obj = WitnessLocation( - world.player, location, loc_id, ret, entity_hex - ) + entity_hex = static_witness_logic.ENTITIES_BY_NAME[location]["entity_hex"] + + if entity_hex in world.player_logic.EXCLUDED_ENTITIES: + location_obj.progress_type = LocationProgressType.EXCLUDED ret.locations.append(location_obj) if exits: diff --git a/worlds/witness/data/WitnessLogic.txt b/worlds/witness/data/WitnessLogic.txt index 0dbb88a107..edc45222b5 100644 --- a/worlds/witness/data/WitnessLogic.txt +++ b/worlds/witness/data/WitnessLogic.txt @@ -206,7 +206,7 @@ Door - 0x0A24B (Flood Room Entry) - 0x0A249 159043 - 0x0A14C (Pond Room Near Reflection EP) - True - True 159044 - 0x0A14D (Pond Room Far Reflection EP) - True - True -Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316: +Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316 - Desert Flood Room Underwater - 0x1C260: 158097 - 0x1C2DF (Reduce Water Level Far Left) - True - True 158098 - 0x1831E (Reduce Water Level Far Right) - True - True 158099 - 0x1C260 (Reduce Water Level Near Left) - True - True @@ -224,6 +224,8 @@ Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316: Door - 0x0C316 (Elevator Room Entry) - 0x18076 159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True +Desert Flood Room Underwater (Desert): + Desert Elevator Room (Desert) - Desert Behind Elevator - 0x01317: 158111 - 0x17C31 (Elevator Room Transparent) - True - True 158113 - 0x012D7 (Elevator Room Hexagonal) - 0x17C31 & 0x0A015 - True @@ -501,7 +503,7 @@ Laser - 0x17C65 (Laser) - 0x17CA4 159121 - 0x03BE3 (Garden Right EP) - True - True 159122 - 0x0A409 (Wall EP) - True - True -Inside Monastery (Monastery): +Inside Monastery (Monastery) - Monastery North Shutters - 0x09D9B: 158213 - 0x09D9B (Shutters Control) - True - Dots 158214 - 0x193A7 (Inside 1) - 0x00037 - True 158215 - 0x193AA (Inside 2) - 0x193A7 - True @@ -513,6 +515,8 @@ Inside Monastery (Monastery): Monastery Garden (Monastery): +Monastery North Shutters (Monastery): + ==Town== Town Obelisk (Town) - Entry - True: @@ -637,9 +641,13 @@ Door - 0x3CCDF (Exit Right) - 0x33AB2 159556 - 0x33A2A (Door EP) - 0x03553 - True 159558 - 0x33B06 (Church EP) - 0x0354E - True +==Southern Peninsula== + +Southern Peninsula (Southern Peninsula) - Main Island - True: + ==Jungle== -Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF: +Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF - Jungle Under Popup Wall - 0x1475B: 158251 - 0x17CDF (Shore Boat Spawn) - True - Boat 158609 - 0x17F9B (Discard) - True - Triangles 158252 - 0x002C4 (First Row 1) - True - True @@ -670,6 +678,8 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA 159350 - 0x035CB (Bamboo CCW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True +Jungle Under Popup Wall (Jungle): + Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - Jungle Vault - 0x15287: 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA @@ -712,9 +722,11 @@ Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D: 158285 - 0x17E67 (UV Room 2) - 0x17E63 & 0x34BC6 - Colored Squares & Black/White Squares Door - 0x0A08D (Elevator Room Entry) - 0x17E67 -Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay: +Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay - Bunker Under Elevator - 0x0A079 | Bunker Green Room | Bunker Cyan Room | Bunker Laser Platform: 159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True +Bunker Under Elevator (Bunker): + Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Cyan Room - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: 158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares @@ -1005,7 +1017,7 @@ Mountaintop (Mountaintop) - Mountain Floor 1 - 0x17C34: Mountain Floor 1 (Mountain Floor 1) - Mountain Floor 1 Bridge - 0x09E39: 158408 - 0x09E39 (Light Bridge Controller) - True - Black/White Squares & Colored Squares & Eraser -Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay: +Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay - Mountain Floor 1 Trash Pillar - TrueOneWay - Mountain Floor 1 Back Section - TrueOneWay: 158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots 158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots 158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Dots @@ -1018,11 +1030,15 @@ Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneW 158418 - 0x09E6C (Left Row 5) - 0x09E79 - Stars & Black/White Squares & Stars + Same Colored Symbol 158419 - 0x09E6F (Left Row 6) - 0x09E6C - Stars & Rotated Shapers & Shapers 158420 - 0x09E6B (Left Row 7) - 0x09E6F - Stars & Dots +158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers +158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Black/White Squares & Shaper + +Mountain Floor 1 Trash Pillar (Mountain Floor 1): + +Mountain Floor 1 Back Section (Mountain Floor 1): 158421 - 0x33AF5 (Back Row 1) - True - Black/White Squares & Symmetry 158422 - 0x33AF7 (Back Row 2) - 0x33AF5 - Black/White Squares & Stars 158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Dots -158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers -158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Black/White Squares & Shapers Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B @@ -1098,14 +1114,16 @@ Elevator (Mountain Bottom Floor): Mountain Pink Bridge EP (Mountain Floor 2): 159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True -Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D: +Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D - Caves Entry Door - TrueOneWay: 158447 - 0x00FF8 (Caves Entry Panel) - True - Triangles & Black/White Squares Door - 0x2D77D (Caves Entry) - 0x00FF8 158448 - 0x334E1 (Rock Control) - True - True ==Caves== -Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x019A5: +Caves Entry Door (Caves): + +Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x019A5 - Caves Entry Door - TrueOneWay: 158451 - 0x335AB (Elevator Inside Control) - True - Dots & Black/White Squares 158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares 158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots @@ -1219,3 +1237,7 @@ The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Tre 159521 - 0x33879 (Tutorial Reflection EP) - True - True 159522 - 0x03C19 (Tutorial Moss EP) - True - True 159531 - 0x035C9 (Cargo Box EP) - 0x0A0C9 - True + +==Easter Eggs== + +Easter Eggs (Easter Eggs) - Entry - True: diff --git a/worlds/witness/data/WitnessLogicExpert.txt b/worlds/witness/data/WitnessLogicExpert.txt index 0f601724ac..23521dddeb 100644 --- a/worlds/witness/data/WitnessLogicExpert.txt +++ b/worlds/witness/data/WitnessLogicExpert.txt @@ -206,7 +206,7 @@ Door - 0x0A24B (Flood Room Entry) - 0x0A249 159043 - 0x0A14C (Pond Room Near Reflection EP) - True - True 159044 - 0x0A14D (Pond Room Far Reflection EP) - True - True -Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316: +Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316 - Desert Flood Room Underwater - 0x1C260: 158097 - 0x1C2DF (Reduce Water Level Far Left) - True - True 158098 - 0x1831E (Reduce Water Level Far Right) - True - True 158099 - 0x1C260 (Reduce Water Level Near Left) - True - True @@ -224,6 +224,8 @@ Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316: Door - 0x0C316 (Elevator Room Entry) - 0x18076 159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True +Desert Flood Room Underwater (Desert): + Desert Elevator Room (Desert) - Desert Behind Elevator - 0x01317: 158111 - 0x17C31 (Elevator Room Transparent) - True - True 158113 - 0x012D7 (Elevator Room Hexagonal) - 0x17C31 & 0x0A015 - True @@ -501,7 +503,7 @@ Laser - 0x17C65 (Laser) - 0x17CA4 159121 - 0x03BE3 (Garden Right EP) - True - True 159122 - 0x0A409 (Wall EP) - True - True -Inside Monastery (Monastery): +Inside Monastery (Monastery) - Monastery North Shutters - 0x09D9B: 158213 - 0x09D9B (Shutters Control) - True - Dots 158214 - 0x193A7 (Inside 1) - 0x00037 - True 158215 - 0x193AA (Inside 2) - 0x193A7 - True @@ -513,6 +515,8 @@ Inside Monastery (Monastery): Monastery Garden (Monastery): +Monastery North Shutters (Monastery): + ==Town== Town Obelisk (Town) - Entry - True: @@ -637,9 +641,13 @@ Door - 0x3CCDF (Exit Right) - 0x33AB2 159556 - 0x33A2A (Door EP) - 0x03553 - True 159558 - 0x33B06 (Church EP) - 0x0354E - True +==Southern Peninsula== + +Southern Peninsula (Southern Peninsula) - Main Island - True: + ==Jungle== -Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF: +Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF - Jungle Under Popup Wall - 0x1475B: 158251 - 0x17CDF (Shore Boat Spawn) - True - Boat 158609 - 0x17F9B (Discard) - True - Arrows 158252 - 0x002C4 (First Row 1) - True - True @@ -670,6 +678,8 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA 159350 - 0x035CB (Bamboo CCW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True +Jungle Under Popup Wall (Jungle): + Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - Jungle Vault - 0x15287: 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA @@ -712,9 +722,11 @@ Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D: 158285 - 0x17E67 (UV Room 2) - 0x17E63 & 0x34BC6 - Squares & Colored Squares & Black/White Squares Door - 0x0A08D (Elevator Room Entry) - 0x17E67 -Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay: +Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay - Bunker Under Elevator - 0x0A079 | Bunker Green Room | Bunker Cyan Room | Bunker Laser Platform: 159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True +Bunker Under Elevator (Bunker): + Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Cyan Room - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: 158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares @@ -1005,7 +1017,7 @@ Mountaintop (Mountaintop) - Mountain Floor 1 - 0x17C34: Mountain Floor 1 (Mountain Floor 1) - Mountain Floor 1 Bridge - 0x09E39: 158408 - 0x09E39 (Light Bridge Controller) - True - Eraser & Triangles -Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay: +Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay - Mountain Floor 1 Trash Pillar - TrueOneWay - Mountain Floor 1 Back Section - TrueOneWay: 158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots & Stars & Stars + Same Colored Symbol 158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Triangles 158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars & Stars + Same Colored Symbol @@ -1018,11 +1030,15 @@ Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneW 158418 - 0x09E6C (Left Row 5) - 0x09E79 - Stars & Shapers & Negative Shapers & Stars + Same Colored Symbol 158419 - 0x09E6F (Left Row 6) - 0x09E6C - Symmetry & Stars & Colored Squares & Black/White Squares & Stars + Same Colored Symbol & Symmetry & Eraser 158420 - 0x09E6B (Left Row 7) - 0x09E6F - Symmetry & Dots & Full Dots & Triangles +158424 - 0x09EAD (Trash Pillar 1) - True - Rotated Shapers & Stars +158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Rotated Shapers & Triangles + +Mountain Floor 1 Trash Pillar (Mountain Floor 1): + +Mountain Floor 1 Back Section (Mountain Floor 1): 158421 - 0x33AF5 (Back Row 1) - True - Symmetry & Black/White Squares & Triangles 158422 - 0x33AF7 (Back Row 2) - 0x33AF5 - Symmetry & Stars & Triangles & Stars + Same Colored Symbol 158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Stars & Shapers & Stars + Same Colored Symbol -158424 - 0x09EAD (Trash Pillar 1) - True - Rotated Shapers & Stars -158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Rotated Shapers & Triangles Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B @@ -1098,14 +1114,16 @@ Elevator (Mountain Bottom Floor): Mountain Pink Bridge EP (Mountain Floor 2): 159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True -Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D: +Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D - Caves Entry Door - TrueOneWay: 158447 - 0x00FF8 (Caves Entry Panel) - True - Arrows & Black/White Squares Door - 0x2D77D (Caves Entry) - 0x00FF8 158448 - 0x334E1 (Rock Control) - True - True ==Caves== -Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x019A5: +Caves Entry Door (Caves): + +Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x019A5 - Caves Entry Door - TrueOneWay: 158451 - 0x335AB (Elevator Inside Control) - True - Dots & Squares & Black/White Squares 158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Squares & Black/White Squares 158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Squares & Black/White Squares & Dots @@ -1219,3 +1237,7 @@ The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Tre 159521 - 0x33879 (Tutorial Reflection EP) - True - True 159522 - 0x03C19 (Tutorial Moss EP) - True - True 159531 - 0x035C9 (Cargo Box EP) - 0x0A0C9 - True + +==Easter Eggs== + +Easter Eggs (Easter Eggs) - Entry - True: diff --git a/worlds/witness/data/WitnessLogicVanilla.txt b/worlds/witness/data/WitnessLogicVanilla.txt index f0c6a8690e..a967a12e28 100644 --- a/worlds/witness/data/WitnessLogicVanilla.txt +++ b/worlds/witness/data/WitnessLogicVanilla.txt @@ -206,7 +206,7 @@ Door - 0x0A24B (Flood Room Entry) - 0x0A249 159043 - 0x0A14C (Pond Room Near Reflection EP) - True - True 159044 - 0x0A14D (Pond Room Far Reflection EP) - True - True -Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316: +Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316 - Desert Flood Room Underwater - 0x1C260: 158097 - 0x1C2DF (Reduce Water Level Far Left) - True - True 158098 - 0x1831E (Reduce Water Level Far Right) - True - True 158099 - 0x1C260 (Reduce Water Level Near Left) - True - True @@ -224,6 +224,8 @@ Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316: Door - 0x0C316 (Elevator Room Entry) - 0x18076 159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True +Desert Flood Room Underwater (Desert): + Desert Elevator Room (Desert) - Desert Behind Elevator - 0x01317: 158111 - 0x17C31 (Elevator Room Transparent) - True - True 158113 - 0x012D7 (Elevator Room Hexagonal) - 0x17C31 & 0x0A015 - True @@ -501,7 +503,7 @@ Laser - 0x17C65 (Laser) - 0x17CA4 159121 - 0x03BE3 (Garden Right EP) - True - True 159122 - 0x0A409 (Wall EP) - True - True -Inside Monastery (Monastery): +Inside Monastery (Monastery) - Monastery North Shutters - 0x09D9B: 158213 - 0x09D9B (Shutters Control) - True - Dots 158214 - 0x193A7 (Inside 1) - 0x00037 - True 158215 - 0x193AA (Inside 2) - 0x193A7 - True @@ -513,6 +515,8 @@ Inside Monastery (Monastery): Monastery Garden (Monastery): +Monastery North Shutters (Monastery): + ==Town== Town Obelisk (Town) - Entry - True: @@ -637,9 +641,13 @@ Door - 0x3CCDF (Exit Right) - 0x33AB2 159556 - 0x33A2A (Door EP) - 0x03553 - True 159558 - 0x33B06 (Church EP) - 0x0354E - True +==Southern Peninsula== + +Southern Peninsula (Southern Peninsula) - Main Island - True: + ==Jungle== -Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF: +Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF - Jungle Under Popup Wall - 0x1475B: 158251 - 0x17CDF (Shore Boat Spawn) - True - Boat 158609 - 0x17F9B (Discard) - True - Triangles 158252 - 0x002C4 (First Row 1) - True - True @@ -670,6 +678,8 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA 159350 - 0x035CB (Bamboo CCW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True +Jungle Under Popup Wall (Jungle): + Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - Jungle Vault - 0x15287: 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA @@ -712,9 +722,11 @@ Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D: 158285 - 0x17E67 (UV Room 2) - 0x17E63 & 0x34BC6 - Colored Squares & Black/White Squares Door - 0x0A08D (Elevator Room Entry) - 0x17E67 -Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay: +Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay - Bunker Under Elevator - 0x0A079 | Bunker Green Room | Bunker Cyan Room | Bunker Laser Platform: 159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True +Bunker Under Elevator (Bunker): + Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Cyan Room - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: 158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares @@ -1005,7 +1017,7 @@ Mountaintop (Mountaintop) - Mountain Floor 1 - 0x17C34: Mountain Floor 1 (Mountain Floor 1) - Mountain Floor 1 Bridge - 0x09E39: 158408 - 0x09E39 (Light Bridge Controller) - True - Black/White Squares & Rotated Shapers -Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay: +Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay - Mountain Floor 1 Trash Pillar - TrueOneWay - Mountain Floor 1 Back Section - TrueOneWay: 158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots 158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots 158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers @@ -1018,11 +1030,15 @@ Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneW 158418 - 0x09E6C (Left Row 5) - 0x09E79 - Stars & Black/White Squares 158419 - 0x09E6F (Left Row 6) - 0x09E6C - Shapers & Dots 158420 - 0x09E6B (Left Row 7) - 0x09E6F - Dots +158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers +158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Black/White Squares & Shapers + +Mountain Floor 1 Trash Pillar (Mountain Floor 1): + +Mountain Floor 1 Back Section (Mountain Floor 1): 158421 - 0x33AF5 (Back Row 1) - True - Black/White Squares & Symmetry 158422 - 0x33AF7 (Back Row 2) - 0x33AF5 - Black/White Squares 158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Dots -158424 - 0x09EAD (Trash Pillar 1) - True - Black/White Squares & Shapers -158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Black/White Squares & Shapers Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B @@ -1098,14 +1114,16 @@ Elevator (Mountain Bottom Floor): Mountain Pink Bridge EP (Mountain Floor 2): 159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True -Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D: +Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D - Caves Entry Door - TrueOneWay: 158447 - 0x00FF8 (Caves Entry Panel) - True - Black/White Squares Door - 0x2D77D (Caves Entry) - 0x00FF8 158448 - 0x334E1 (Rock Control) - True - True ==Caves== -Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x019A5: +Caves Entry Door (Caves): + +Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x019A5 - Caves Entry Door - TrueOneWay: 158451 - 0x335AB (Elevator Inside Control) - True - Dots & Black/White Squares 158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares 158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots @@ -1219,3 +1237,7 @@ The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Tre 159521 - 0x33879 (Tutorial Reflection EP) - True - True 159522 - 0x03C19 (Tutorial Moss EP) - True - True 159531 - 0x035C9 (Cargo Box EP) - 0x0A0C9 - True + +==Easter Eggs== + +Easter Eggs (Easter Eggs) - Entry - True: diff --git a/worlds/witness/data/WitnessLogicVariety.txt b/worlds/witness/data/WitnessLogicVariety.txt index b7b705a6db..bc9a40f566 100644 --- a/worlds/witness/data/WitnessLogicVariety.txt +++ b/worlds/witness/data/WitnessLogicVariety.txt @@ -206,7 +206,7 @@ Door - 0x0A24B (Flood Room Entry) - 0x0A249 159043 - 0x0A14C (Pond Room Near Reflection EP) - True - True 159044 - 0x0A14D (Pond Room Far Reflection EP) - True - True -Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316: +Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316 - Desert Flood Room Underwater - 0x1C260: 158097 - 0x1C2DF (Reduce Water Level Far Left) - True - True 158098 - 0x1831E (Reduce Water Level Far Right) - True - True 158099 - 0x1C260 (Reduce Water Level Near Left) - True - True @@ -224,6 +224,8 @@ Desert Flood Room (Desert) - Desert Elevator Room - 0x0C316: Door - 0x0C316 (Elevator Room Entry) - 0x18076 159034 - 0x337F8 (Flood Room EP) - 0x1C2DF - True +Desert Flood Room Underwater (Desert): + Desert Elevator Room (Desert) - Desert Behind Elevator - 0x01317: 158111 - 0x17C31 (Elevator Room Transparent) - True - True 158113 - 0x012D7 (Elevator Room Hexagonal) - 0x17C31 & 0x0A015 - True @@ -501,7 +503,7 @@ Laser - 0x17C65 (Laser) - 0x17CA4 159121 - 0x03BE3 (Garden Right EP) - True - True 159122 - 0x0A409 (Wall EP) - True - True -Inside Monastery (Monastery): +Inside Monastery (Monastery) - Monastery North Shutters - 0x09D9B: 158213 - 0x09D9B (Shutters Control) - True - Dots 158214 - 0x193A7 (Inside 1) - 0x00037 - True 158215 - 0x193AA (Inside 2) - 0x193A7 - True @@ -513,6 +515,8 @@ Inside Monastery (Monastery): Monastery Garden (Monastery): +Monastery North Shutters (Monastery): + ==Town== Town Obelisk (Town) - Entry - True: @@ -637,9 +641,13 @@ Door - 0x3CCDF (Exit Right) - 0x33AB2 159556 - 0x33A2A (Door EP) - 0x03553 - True 159558 - 0x33B06 (Church EP) - 0x0354E - True +==Southern Peninsula== + +Southern Peninsula (Southern Peninsula) - Main Island - True: + ==Jungle== -Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF: +Jungle (Jungle) - Main Island - True - The Ocean - 0x17CDF - Jungle Under Popup Wall - 0x1475B: 158251 - 0x17CDF (Shore Boat Spawn) - True - Boat 158609 - 0x17F9B (Discard) - True - Arrows & Triangles 158252 - 0x002C4 (First Row 1) - True - True @@ -670,6 +678,8 @@ Door - 0x3873B (Laser Shortcut) - 0x337FA 159350 - 0x035CB (Bamboo CCW EP) - True - True 159351 - 0x035CF (Bamboo CW EP) - True - True +Jungle Under Popup Wall (Jungle): + Outside Jungle River (Jungle) - Main Island - True - Monastery Garden - 0x0CF2A - Jungle Vault - 0x15287: 158267 - 0x17CAA (Monastery Garden Shortcut Panel) - True - True Door - 0x0CF2A (Monastery Garden Shortcut) - 0x17CAA @@ -712,9 +722,11 @@ Bunker Ultraviolet Room (Bunker) - Bunker Elevator Section - 0x0A08D: 158285 - 0x17E67 (UV Room 2) - 0x17E63 & 0x34BC6 - Colored Squares & Black/White Squares Door - 0x0A08D (Elevator Room Entry) - 0x17E67 -Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay: +Bunker Elevator Section (Bunker) - Bunker Elevator - TrueOneWay - Bunker Under Elevator - 0x0A079 | Bunker Green Room | Bunker Cyan Room | Bunker Laser Platform: 159311 - 0x035F5 (Tinted Door EP) - 0x17C79 - True +Bunker Under Elevator (Bunker): + Bunker Elevator (Bunker) - Bunker Elevator Section - 0x0A079 - Bunker Cyan Room - 0x0A079 - Bunker Green Room - 0x0A079 - Bunker Laser Platform - 0x0A079 - Outside Bunker - 0x0A079: 158286 - 0x0A079 (Elevator Control) - True - Colored Squares & Black/White Squares @@ -1005,7 +1017,7 @@ Mountaintop (Mountaintop) - Mountain Floor 1 - 0x17C34: Mountain Floor 1 (Mountain Floor 1) - Mountain Floor 1 Bridge - 0x09E39: 158408 - 0x09E39 (Light Bridge Controller) - True - Black/White Squares & Colored Squares & Eraser -Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay: +Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneWay - Mountain Floor 1 Trash Pillar - TrueOneWay - Mountain Floor 1 Back Section - TrueOneWay: 158409 - 0x09E7A (Right Row 1) - True - Black/White Squares & Dots 158410 - 0x09E71 (Right Row 2) - 0x09E7A - Black/White Squares & Dots & Stars & Stars + Same Colored Symbol 158411 - 0x09E72 (Right Row 3) - 0x09E71 - Black/White Squares & Shapers & Stars & Stars + Same Colored Symbol @@ -1018,11 +1030,15 @@ Mountain Floor 1 Bridge (Mountain Floor 1) - Mountain Floor 1 At Door - TrueOneW 158418 - 0x09E6C (Left Row 5) - 0x09E79 - Arrows & Black/White Squares & Stars & Stars + Same Colored Symbol 158419 - 0x09E6F (Left Row 6) - 0x09E6C - Arrows & Dots & Full Dots 158420 - 0x09E6B (Left Row 7) - 0x09E6F - Arrows & Dots & Full Dots +158424 - 0x09EAD (Trash Pillar 1) - True - Triangles & Arrows +158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Triangles & Arrows + +Mountain Floor 1 Trash Pillar (Mountain Floor 1): + +Mountain Floor 1 Back Section (Mountain Floor 1): 158421 - 0x33AF5 (Back Row 1) - True - Symmetry & Triangles 158422 - 0x33AF7 (Back Row 2) - 0x33AF5 - Triangles 158423 - 0x09F6E (Back Row 3) - 0x33AF7 - Symmetry & Triangles -158424 - 0x09EAD (Trash Pillar 1) - True - Triangles & Arrows -158425 - 0x09EAF (Trash Pillar 2) - 0x09EAD - Triangles & Arrows Mountain Floor 1 At Door (Mountain Floor 1) - Mountain Floor 2 - 0x09E54: Door - 0x09E54 (Exit) - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B @@ -1098,14 +1114,16 @@ Elevator (Mountain Bottom Floor): Mountain Pink Bridge EP (Mountain Floor 2): 159312 - 0x09D63 (Pink Bridge EP) - 0x09E39 - True -Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D: +Mountain Path to Caves (Mountain Bottom Floor) - Caves - 0x2D77D - Caves Entry Door - TrueOneWay: 158447 - 0x00FF8 (Caves Entry Panel) - True - Black/White Squares & Arrows & Triangles Door - 0x2D77D (Caves Entry) - 0x00FF8 158448 - 0x334E1 (Rock Control) - True - True ==Caves== -Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x019A5: +Caves Entry Door (Caves): + +Caves (Caves) - Main Island - 0x2D73F | 0x2D859 - Caves Path to Challenge - 0x019A5 - Caves Entry Door - TrueOneWay: 158451 - 0x335AB (Elevator Inside Control) - True - Dots & Black/White Squares 158452 - 0x335AC (Elevator Upper Outside Control) - 0x335AB - Black/White Squares 158453 - 0x3369D (Elevator Lower Outside Control) - 0x335AB - Black/White Squares & Dots @@ -1219,3 +1237,7 @@ The Ocean (Boat) - Main Island - TrueOneWay - Swamp Near Boat - TrueOneWay - Tre 159521 - 0x33879 (Tutorial Reflection EP) - True - True 159522 - 0x03C19 (Tutorial Moss EP) - True - True 159531 - 0x035C9 (Cargo Box EP) - 0x0A0C9 - True + +==Easter Eggs== + +Easter Eggs (Easter Eggs) - Entry - True: diff --git a/worlds/witness/data/settings/easter_eggs.py b/worlds/witness/data/settings/easter_eggs.py new file mode 100644 index 0000000000..248e942731 --- /dev/null +++ b/worlds/witness/data/settings/easter_eggs.py @@ -0,0 +1,75 @@ +MAXIMUM_EASTER_EGG_CHECKS = 50 + +EASTER_EGGS = { + "Tutorial": 1, + "Outside Tutorial": 4, + "Outside Tutorial Path To Outpost": 1, + "Outside Tutorial Outpost": 1, + "Orchard Beyond First Gate": 1, + "Orchard End": 1, + "Inside Glass Factory": 2, + "Symmetry Island Lower": 2, + "Symmetry Island Upper": 1, + "Desert Outside": 6, + "Desert Vault": 1, + "Desert Pond Room": 2, + "Desert Flood Room Underwater": 1, + "Desert Elevator Room": 1, + "Outside Quarry": 2, + "Quarry": 5, + "Quarry Stoneworks Upper Floor": 2, + "Quarry Boathouse": 2, + "Shadows": 2, + "Shadows Ledge": 1, + "Shadows Laser Room": 1, + "Keep": 1, + "Keep 3rd Maze": 3, + "Keep 2nd Pressure Plate": 2, + "Keep 3rd Pressure Plate": 1, + "Keep 4th Pressure Plate": 1, + "Keep Tower": 2, + "Shipwreck": 5, + "Inside Monastery": 1, + "Monastery North Shutters": 1, + "Monastery Garden": 1, + "Town": 5, + "Town Wooden Rooftop": 1, + "Town RGB House": 2, + "Town Tower Top": 1, + "Windmill Interior": 2, + "Theater": 1, + "Southern Peninsula": 5, + "Jungle": 2, + "Jungle Under Popup Wall": 1, + "Jungle Vault": 1, + "Outside Bunker": 3, + "Bunker Glass Room": 1, + "Bunker Under Elevator": 1, + "Bunker Green Room": 1, + "Outside Swamp": 2, + "Swamp Entry Area": 1, + "Swamp Platform": 1, + "Swamp Cyan Underwater": 1, + "Swamp Near Boat": 1, + "Swamp Laser Area": 1, + "Treehouse Beach": 1, + "Treehouse Yellow Bridge": 1, + "Treehouse Junction": 2, + "Treehouse Second Purple Bridge": 1, + "Treehouse Green Bridge Left House": 1, + "Treehouse Laser Room Back Platform": 1, + "Treehouse Burned House": 1, + "Treehouse Drawbridge Platform": 1, + "Mountainside": 4, + "Mountaintop": 1, + "Mountain Floor 1 Trash Pillar": 1, + "Mountain Floor 1 Back Section": 1, + "Mountain Floor 2": 1, + "Mountain Bottom Floor Pillars Room": 1, + "Caves Entry Door": 1, + "Caves": 2, + "Caves Path to Challenge": 1, + "Challenge": 2, + "Tunnels": 2, + "The Ocean": 2, +} diff --git a/worlds/witness/data/static_logic.py b/worlds/witness/data/static_logic.py index 6cc4e1431d..4f4786a38b 100644 --- a/worlds/witness/data/static_logic.py +++ b/worlds/witness/data/static_logic.py @@ -1,4 +1,4 @@ -from collections import defaultdict +from collections import Counter, defaultdict from typing import Any, Dict, List, Optional, Set, Tuple from Utils import cache_argsless @@ -11,6 +11,7 @@ from .item_definition_classes import ( ProgressiveItemDefinition, WeightedItemDefinition, ) +from .settings.easter_eggs import EASTER_EGGS from .utils import ( WitnessRule, define_new_region, @@ -49,6 +50,70 @@ class StaticWitnessLogicObj: self.reverse_connections() self.combine_connections() + def add_easter_eggs(self) -> None: + egg_counter = 0 + area_counts: Dict[str, int] = Counter() + for region_name, entity_amount in EASTER_EGGS.items(): + region_object = self.ALL_REGIONS_BY_NAME[region_name] + correct_area = region_object["area"] + + for _ in range(entity_amount): + location_id = 160200 + egg_counter + entity_hex = hex(0xEE000 + egg_counter) + egg_counter += 1 + + area_counts[correct_area["name"]] += 1 + full_entity_name = f"{correct_area['name']} Easter Egg {area_counts[correct_area['name']]}" + + self.ENTITIES_BY_HEX[entity_hex] = { + "checkName": full_entity_name, + "entity_hex": entity_hex, + "region": region_object, + "id": int(location_id), + "entityType": "Easter Egg", + "locationType": "Easter Egg", + "area": correct_area, + "order": len(self.ENTITIES_BY_HEX), + } + + self.ENTITIES_BY_NAME[self.ENTITIES_BY_HEX[entity_hex]["checkName"]] = self.ENTITIES_BY_HEX[entity_hex] + + self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX[entity_hex] = { + "entities": frozenset({frozenset({})}) + } + region_object["entities"].append(entity_hex) + region_object["physical_entities"].append(entity_hex) + + easter_egg_region = self.ALL_REGIONS_BY_NAME["Easter Eggs"] + easter_egg_area = easter_egg_region["area"] + for i in range(sum(EASTER_EGGS.values())): + location_id = 160000 + i + entity_hex = hex(0xEE200 + i) + + if i == 0: + continue + + full_entity_name = f"{i + 1} Easter Eggs Collected" + + self.ENTITIES_BY_HEX[entity_hex] = { + "checkName": full_entity_name, + "entity_hex": entity_hex, + "region": easter_egg_region, + "id": int(location_id), + "entityType": "Easter Egg Total", + "locationType": "Easter Egg Total", + "area": easter_egg_area, + "order": len(self.ENTITIES_BY_HEX), + } + + self.ENTITIES_BY_NAME[self.ENTITIES_BY_HEX[entity_hex]["checkName"]] = self.ENTITIES_BY_HEX[entity_hex] + + self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX[entity_hex] = { + "entities": frozenset({frozenset({})}) + } + easter_egg_region["entities"].append(entity_hex) + easter_egg_region["physical_entities"].append(entity_hex) + def read_logic_file(self, lines: List[str]) -> None: """ Reads the logic file and does the initial population of data structures @@ -66,7 +131,7 @@ class StaticWitnessLogicObj: continue if line[-1] == ":": - new_region_and_connections = define_new_region(line) + new_region_and_connections = define_new_region(line, current_area) current_region = new_region_and_connections[0] region_name = current_region["name"] self.ALL_REGIONS_BY_NAME[region_name] = current_region @@ -198,6 +263,8 @@ class StaticWitnessLogicObj: current_region["entities"].append(entity_hex) current_region["physical_entities"].append(entity_hex) + self.add_easter_eggs() + def reverse_connection(self, source_region: str, connection: Tuple[str, Set[WitnessRule]]) -> None: target = connection[0] traversal_options = connection[1] diff --git a/worlds/witness/data/utils.py b/worlds/witness/data/utils.py index 190c00dc28..aca4573806 100644 --- a/worlds/witness/data/utils.py +++ b/worlds/witness/data/utils.py @@ -1,3 +1,4 @@ +from datetime import date from math import floor from pkgutil import get_data from random import Random @@ -61,7 +62,7 @@ def build_weighted_int_list(inputs: Collection[float], total: int) -> List[int]: return rounded_output -def define_new_region(region_string: str) -> Tuple[Dict[str, Any], Set[Tuple[str, WitnessRule]]]: +def define_new_region(region_string: str, area: dict[str, Any]) -> Tuple[Dict[str, Any], Set[Tuple[str, WitnessRule]]]: """ Returns a region object by parsing a line in the logic file """ @@ -91,6 +92,7 @@ def define_new_region(region_string: str) -> Tuple[Dict[str, Any], Set[Tuple[str "shortName": region_name_simple, "entities": [], "physical_entities": [], + "area": area, } return region_obj, options @@ -264,3 +266,15 @@ def logical_and_witness_rules(witness_rules: Iterable[WitnessRule]) -> WitnessRu def logical_or_witness_rules(witness_rules: Iterable[WitnessRule]) -> WitnessRule: return optimize_witness_rule(frozenset.union(*witness_rules)) + + +def is_easter_time() -> bool: + # dateutils would have been nice here, because it has an easter() function. + # But adding it as a requirement seems heavier than necessary. + # Thus, we just take a range from the earliest to latest possible easter dates. + + today = date.today() + earliest_easter_day = date(today.year, 3, 20) # Earliest possible is 3/22 + 2 day buffer for Good Friday + last_easter_day = date(today.year, 4, 26) # Latest possible is 4/25 + 1 day buffer for Easter Monday + + return earliest_easter_day <= today <= last_easter_day diff --git a/worlds/witness/generate_data_file.py b/worlds/witness/generate_data_file.py index 50a63a3746..cc05015cd8 100644 --- a/worlds/witness/generate_data_file.py +++ b/worlds/witness/generate_data_file.py @@ -43,3 +43,12 @@ if __name__ == "__main__": ) ) datafile.write("\n};\n\n") + + datafile.write("inline std::map entityToName = {") + datafile.write( + "\n".join( + "\t{ " + entity_hex + ', "' + entity_object["checkName"] + '" },' + for entity_hex, entity_object in static_witness_logic.ENTITIES_BY_HEX.items() + ) + ) + datafile.write("\n};\n\n") diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 82837aed06..6f274f5e2c 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -241,7 +241,10 @@ def word_direct_hint(world: "WitnessWorld", hint: WitnessLocationHint) -> Witnes area = chosen_group # local locations should only ever return a location group, as Witness defines groups for every location. - hint_text = f"{item_name} can be found in the {area} area." + if area == "Easter Eggs": + hint_text = f"{item_name} can be found by collecting Easter Eggs." + else: + hint_text = f"{item_name} can be found in the {area} area." else: player_name = world.multiworld.get_player_name(hint.location.player) @@ -505,10 +508,13 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, area_items: List[Ite area_progression_word = "Both" if total_progression == 2 else "All" - hint_string = f"In the {hinted_area} area, you will find " + if hinted_area == "Easter Eggs": + hint_string = "Through collecting Easter Eggs, you will find " + else: + hint_string = f"In the {hinted_area} area, you will find " hunt_panels = None - if world.options.victory_condition == "panel_hunt": + if world.options.victory_condition == "panel_hunt" and hinted_area != "Easter Eggs": hunt_panels = sum( static_witness_logic.ENTITIES_BY_HEX[hunt_entity]["area"]["name"] == hinted_area for hunt_entity in world.player_logic.HUNT_ENTITIES diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py index 49a4437c5a..e7f6f94d65 100644 --- a/worlds/witness/locations.py +++ b/worlds/witness/locations.py @@ -19,7 +19,7 @@ class WitnessPlayerLocations: def __init__(self, world: "WitnessWorld", player_logic: WitnessPlayerLogic) -> None: """Defines locations AFTER logic changes due to options""" - self.PANEL_TYPES_TO_SHUFFLE = {"General", "Good Boi"} + self.PANEL_TYPES_TO_SHUFFLE = {"General", "Good Boi", "Easter Egg Total"} self.CHECK_LOCATIONS = static_witness_locations.GENERAL_LOCATIONS.copy() if world.options.shuffle_discarded_panels: diff --git a/worlds/witness/options.py b/worlds/witness/options.py index d739517870..c56209b226 100644 --- a/worlds/witness/options.py +++ b/worlds/witness/options.py @@ -1,4 +1,6 @@ from dataclasses import dataclass +from datetime import datetime +from typing import Tuple from schema import And, Schema @@ -18,6 +20,7 @@ from Options import ( from .data import static_logic as static_witness_logic from .data.item_definition_classes import ItemCategory, WeightedItemDefinition +from .data.utils import is_easter_time from .entity_hunt import ALL_HUNTABLE_PANELS @@ -142,6 +145,53 @@ class ShuffleEnvironmentalPuzzles(Choice): option_obelisk_sides = 2 +class EasterEggHunt(Choice): + """ + Adds up to 120 Easter Eggs to the game, placed by NewSoupVi, Exempt-Medic, hatkirby, Scipio, and Rever. + These can be collected by simply clicking on them. + + The difficulty options differ by how many Eggs you need to collect for each check and how many are logically required for each check. + + - "Easy": 3 / 8 + - "Normal": 3 / 6 + - "Hard": 4 / 6 + - "Very Hard": 4 / 5 + - "Extreme": 4 / 4 (You are expected to collect every Easter Egg) + + Checks that require more Eggs than logically available still exist, but are excluded. + For example, on "Easy", the "63 Eggs Collected" check can physically be obtained, but would logically require 125 Easter Eggs, which is impossible. Thus, it is excluded. + + On "Easy", "Normal", and "Hard", you will start with an "Egg Radar" that you can activate using the Puzzle Skip key. + On every difficulty except "Extreme", there will be a message when you've collected all Easter Eggs in an area. + On "Easy", there will be an additional message after every Easter Egg telling you how many Easter Eggs are remaining in the area. + + It is recommended that you play this mode together with Door Shuffle. Without it, more than half of the Easter Eggs will be in sphere 1. + """ + + visibility = Visibility.all if is_easter_time() else Visibility.none + + display_name = "Easter Egg Hunt" + option_off = 0 + # Number represents the amount of eggs needed per check + option_easy = 1 + option_normal = 2 + option_hard = 3 + option_very_hard = 4 + option_extreme = 5 + default = 2 if is_easter_time() else 0 + + def get_step_and_logical_step(self) -> Tuple[int, int]: + if self == "easy": + return 3, 8 + if self == "normal": + return 3, 6 + if self == "hard": + return 4, 6 + if self == "very_hard": + return 4, 5 + return 4, 4 + + class ShuffleDog(Choice): """ Adds petting the dog statue in Town into the location pool. @@ -504,6 +554,7 @@ class TheWitnessOptions(PerGameCommonOptions): death_link_amnesty: DeathLinkAmnesty puzzle_randomization_seed: PuzzleRandomizationSeed shuffle_dog: ShuffleDog + easter_egg_hunt: EasterEggHunt witness_option_groups = [ @@ -561,3 +612,13 @@ witness_option_groups = [ ShuffleDog, ]) ] + +# Make sure that Easter Egg Hunt is VERY visible during easter time (when it's enabled by default) +if is_easter_time(): + easter_special_option_group = OptionGroup("EASTER SPECIAL", [ + EasterEggHunt, + ]) + witness_option_groups = [easter_special_option_group, *witness_option_groups] +else: + silly_options_group = next(group for group in witness_option_groups if group.name == "Silly Options") + silly_options_group.options.append(EasterEggHunt) diff --git a/worlds/witness/player_items.py b/worlds/witness/player_items.py index e40d261d8a..b98c59e9a6 100644 --- a/worlds/witness/player_items.py +++ b/worlds/witness/player_items.py @@ -31,6 +31,13 @@ class WitnessItem(Item): Item from the game The Witness """ game: str = "The Witness" + eggs: int = 0 + + @classmethod + def make_egg_event(cls, item_name: str, player: int): + ret = cls(item_name, ItemClassification.progression, None, player) + ret.eggs = int(item_name[1:].split(" ", 1)[0]) + return ret class WitnessPlayerItems: diff --git a/worlds/witness/player_logic.py b/worlds/witness/player_logic.py index aea2953abb..1276d55dce 100644 --- a/worlds/witness/player_logic.py +++ b/worlds/witness/player_logic.py @@ -24,7 +24,6 @@ from .data.item_definition_classes import DoorItemDefinition, ItemCategory, Prog from .data.static_logic import StaticWitnessLogicObj from .data.utils import ( WitnessRule, - define_new_region, get_boat, get_caves_except_path_to_challenge_exclusion_list, get_complex_additional_panels, @@ -119,6 +118,8 @@ class WitnessPlayerLogic: self.PRE_PICKED_HUNT_ENTITIES: Set[str] = set() self.HUNT_ENTITIES: Set[str] = set() + self.AVAILABLE_EASTER_EGGS: Set[str] = set() + self.AVAILABLE_EASTER_EGGS_PER_REGION: Dict[str, int] = {} self.ALWAYS_EVENT_NAMES_BY_HEX = { "0x00509": "+1 Laser", "0x012FB": "+1 Laser (Unredirected)", @@ -154,6 +155,9 @@ class WitnessPlayerLogic: picker = EntityHuntPicker(self, world, self.PRE_PICKED_HUNT_ENTITIES) self.HUNT_ENTITIES = picker.pick_panel_hunt_panels(world.options.panel_hunt_total.value) + if world.options.easter_egg_hunt: + self.finalize_easter_eggs(world) + # Finalize which items actually exist in the MultiWorld and which get grouped into progressive items. self.finalize_items() @@ -241,6 +245,8 @@ class WitnessPlayerLogic: if option_entity in {"7 Lasers", "11 Lasers", "7 Lasers + Redirect", "11 Lasers + Redirect", "PP2 Weirdness", "Theater to Tunnels", "Entity Hunt"}: new_items = frozenset({frozenset([option_entity])}) + elif "Eggs" in option_entity: + new_items = frozenset({frozenset([option_entity])}) elif option_entity in self.DISABLE_EVERYTHING_BEHIND: new_items = frozenset() else: @@ -387,13 +393,6 @@ class WitnessPlayerLogic: return - if adj_type == "Region Changes": - new_region_and_options = define_new_region(line + ":") - - self.CONNECTIONS_BY_REGION_NAME_THEORETICAL[new_region_and_options[0]["name"]] = new_region_and_options[1] - - return - if adj_type == "New Connections": line_split = line.split(" - ") source_region = line_split[0] @@ -533,6 +532,55 @@ class WitnessPlayerLogic: return postgame_adjustments + def set_easter_egg_requirements(self, world: "WitnessWorld") -> None: + eggs_per_check, logically_required_eggs_per_check = world.options.easter_egg_hunt.get_step_and_logical_step() + + for entity_hex, entity_obj in static_witness_logic.ENTITIES_BY_HEX.items(): + if entity_obj["entityType"] != "Easter Egg Total": + continue + + direct_egg_count = int(entity_obj["checkName"].split(" ")[0]) + + if direct_egg_count % eggs_per_check: + self.COMPLETELY_DISABLED_ENTITIES.add(entity_hex) + + requirement = direct_egg_count // eggs_per_check * logically_required_eggs_per_check + self.DEPENDENT_REQUIREMENTS_BY_HEX[entity_hex] = { + "entities": frozenset({frozenset({f"{requirement} Eggs"})}) + } + + def finalize_easter_eggs(self, world: "WitnessWorld") -> None: + self.AVAILABLE_EASTER_EGGS = { + entity_hex for entity_hex, entity_obj in static_witness_logic.ENTITIES_BY_HEX.items() + if entity_obj["entityType"] == "Easter Egg" and self.solvability_guaranteed(entity_hex) + } + max_eggs = len(self.AVAILABLE_EASTER_EGGS) + + self.AVAILABLE_EASTER_EGGS_PER_REGION = defaultdict(int) + for entity_hex in self.AVAILABLE_EASTER_EGGS: + region_name = static_witness_logic.ENTITIES_BY_HEX[entity_hex]["region"]["name"] + self.AVAILABLE_EASTER_EGGS_PER_REGION[region_name] += 1 + + eggs_per_check, logically_required_eggs_per_check = world.options.easter_egg_hunt.get_step_and_logical_step() + + for entity_hex, entity_obj in static_witness_logic.ENTITIES_BY_HEX.items(): + if entity_obj["entityType"] != "Easter Egg Total": + continue + if entity_hex in self.COMPLETELY_DISABLED_ENTITIES: + continue + + direct_egg_count = int(entity_obj["checkName"].split(" ", 1)[0]) + logically_required_egg_count = direct_egg_count // eggs_per_check * logically_required_eggs_per_check + if direct_egg_count > max_eggs: + self.COMPLETELY_DISABLED_ENTITIES.add(entity_hex) + continue + + self.ADDED_CHECKS.add(entity_obj["checkName"]) + if logically_required_egg_count > max_eggs: + # Exclude and set logic to require every egg + self.EXCLUDED_ENTITIES.add(entity_hex) + self.REQUIREMENTS_BY_HEX[entity_hex] = frozenset({frozenset({f"{max_eggs} Eggs"})}) + def make_options_adjustments(self, world: "WitnessWorld") -> None: """Makes logic adjustments based on options""" adjustment_linesets_in_order = [] @@ -641,6 +689,8 @@ class WitnessPlayerLogic: adjustment_linesets_in_order.append([ "New Connections:", "Outside Bunker - Bunker Elevator - TrueOneWay", + "Bunker Elevator Section - Bunker Under Elevator - " + "0x0A079 | Bunker Green Room | Bunker Cyan Room | Bunker Laser Platform | Outside Bunker", ]) if "Swamp Long Bridge" in world.options.elevators_come_to_you: adjustment_linesets_in_order.append([ @@ -655,6 +705,14 @@ class WitnessPlayerLogic: # "New Connections:" # "Town Red Rooftop - Town Maze Rooftop - TrueOneWay" + if world.options.easter_egg_hunt: + self.set_easter_egg_requirements(world) + else: + self.COMPLETELY_DISABLED_ENTITIES.update({ + entity_hex for entity_hex, entity_obj in static_witness_logic.ENTITIES_BY_HEX.items() + if "Easter Egg" in entity_obj["entityType"] + }) + if world.options.victory_condition == "panel_hunt": adjustment_linesets_in_order.append(get_entity_hunt()) @@ -691,6 +749,9 @@ class WitnessPlayerLogic: if loc_obj["entityType"] == "EP": self.COMPLETELY_DISABLED_ENTITIES.add(loc_obj["entity_hex"]) + if loc_obj["entityType"] == "Easter Egg": + self.COMPLETELY_DISABLED_ENTITIES.add(loc_obj["entity_hex"]) + elif loc_obj["entityType"] == "Panel": self.EXCLUDED_ENTITIES.add(loc_obj["entity_hex"]) @@ -937,6 +998,7 @@ class WitnessPlayerLogic: doors = world.options.shuffle_doors shortbox_req = world.options.mountain_lasers longbox_req = world.options.challenge_lasers + eggs_exist = world.options.easter_egg_hunt swamp_bridge_comes_to_you = "Swamp Long Bridge" in world.options.elevators_come_to_you quarry_elevator_comes_to_you = "Quarry Elevator" in world.options.elevators_come_to_you @@ -953,17 +1015,17 @@ class WitnessPlayerLogic: # It is easier to think about when these items *are* required, so we make that dict first # If the entity is disabled anyway, we don't need to consider that case is_item_required_dict = { - "0x03750": eps_shuffled, # Monastery Garden Entry Door + "0x03750": eps_shuffled or eggs_exist, # Monastery Garden Entry Door "0x275FA": eps_shuffled, # Boathouse Hook Control "0x17D02": eps_shuffled, # Windmill Turn Control "0x0368A": symbols_shuffled or door_panels, # Quarry Stoneworks Stairs Door "0x3865F": symbols_shuffled or door_panels or eps_shuffled, # Quarry Boathouse 2nd Barrier "0x17CC4": quarry_elevator_comes_to_you or eps_shuffled, # Quarry Elevator Panel "0x17E2B": swamp_bridge_comes_to_you and boat_shuffled or eps_shuffled, # Swamp Long Bridge - "0x0CF2A": False, # Jungle Monastery Garden Shortcut + "0x0CF2A": eggs_exist, # Jungle Monastery Garden Shortcut "0x0364E": False, # Monastery Laser Shortcut Door "0x03713": remote_doors, # Monastery Laser Shortcut Panel - "0x03313": False, # Orchard Second Gate + "0x03313": eggs_exist, # Orchard Second Gate "0x337FA": remote_doors, # Jungle Bamboo Laser Shortcut Panel "0x3873B": False, # Jungle Bamboo Laser Shortcut Door "0x335AB": False, # Caves Elevator Controls @@ -1026,4 +1088,9 @@ class WitnessPlayerLogic: entity_name = entity_obj["checkName"] self.EVENT_ITEM_PAIRS[entity_name + " (Panel Hunt)"] = ("+1 Panel Hunt", entity_hex) + for region_name, easter_egg_count in self.AVAILABLE_EASTER_EGGS_PER_REGION.items(): + plural = "s" if easter_egg_count != 1 else "" + event_name = f"+{easter_egg_count} Easter Egg{plural}" + self.EVENT_ITEM_PAIRS[f"{region_name} Easter Egg{plural}"] = (event_name, region_name) + return diff --git a/worlds/witness/regions.py b/worlds/witness/regions.py index a1f7df8a31..8cb3678ab6 100644 --- a/worlds/witness/regions.py +++ b/worlds/witness/regions.py @@ -117,12 +117,17 @@ class WitnessPlayerRegions: event_locations_per_region = defaultdict(dict) for event_location, event_item_and_entity in player_logic.EVENT_ITEM_PAIRS.items(): - region = static_witness_logic.ENTITIES_BY_HEX[event_item_and_entity[1]]["region"] - if region is None: - region_name = "Entry" + entity_or_region = event_item_and_entity[1] + if entity_or_region in static_witness_logic.ALL_REGIONS_BY_NAME: + region_name = entity_or_region + order = -1 else: - region_name = region["name"] - order = self.reference_logic.ENTITIES_BY_HEX[event_item_and_entity[1]]["order"] + region = static_witness_logic.ENTITIES_BY_HEX[event_item_and_entity[1]]["region"] + if region is None: + region_name = "Entry" + else: + region_name = region["name"] + order = self.reference_logic.ENTITIES_BY_HEX[entity_or_region]["order"] event_locations_per_region[region_name][event_location] = order for region_name, region in regions_to_create.items(): diff --git a/worlds/witness/ruff.toml b/worlds/witness/ruff.toml index a35711cce6..6deccd1343 100644 --- a/worlds/witness/ruff.toml +++ b/worlds/witness/ruff.toml @@ -2,7 +2,7 @@ line-length = 120 [lint] select = ["C", "E", "F", "R", "W", "I", "N", "Q", "UP", "RUF", "ISC", "T20"] -ignore = ["C9", "RUF012", "RUF100"] +ignore = ["C9", "RUF012", "RUF021", "RUF100", "UP006", "UP035"] [lint.per-file-ignores] # The way options definitions work right now, I am forced to break line length requirements. diff --git a/worlds/witness/rules.py b/worlds/witness/rules.py index dac1556e46..866f4690f5 100644 --- a/worlds/witness/rules.py +++ b/worlds/witness/rules.py @@ -196,6 +196,8 @@ def _has_item(item: str, world: "WitnessWorld", if item == "Entity Hunt": # Right now, panel hunt is the only type of entity hunt. This may need to be changed later return _can_do_panel_hunt(world) + if "Eggs" in item: + return SimpleItemRepresentation("Egg", int(item.split(" ")[0])) if item == "PP2 Weirdness": return lambda state: _can_do_expert_pp2(state, world) if item == "Theater to Tunnels": @@ -303,6 +305,11 @@ def make_lambda(entity_hex: str, world: "WitnessWorld") -> Optional[CollectionRu return _meets_item_requirements(entity_req, world) +def make_region_lambda(region_name: str, world: "WitnessWorld") -> CollectionRule: + region = world.get_region(region_name) + return lambda state: region.can_reach(state) + + def set_rules(world: "WitnessWorld") -> None: """ Sets all rules for all locations @@ -312,8 +319,12 @@ def set_rules(world: "WitnessWorld") -> None: real_location = location if location in world.player_locations.EVENT_LOCATION_TABLE: - entity_hex = world.player_logic.EVENT_ITEM_PAIRS[location][1] - real_location = static_witness_logic.ENTITIES_BY_HEX[entity_hex]["checkName"] + entity_hex_or_region_name = world.player_logic.EVENT_ITEM_PAIRS[location][1] + if entity_hex_or_region_name in static_witness_logic.ALL_REGIONS_BY_NAME: + set_rule(world.get_location(location), make_region_lambda(entity_hex_or_region_name, world)) + continue + + real_location = static_witness_logic.ENTITIES_BY_HEX[entity_hex_or_region_name]["checkName"] associated_entity = world.player_logic.REFERENCE_LOGIC.ENTITIES_BY_NAME[real_location] entity_hex = associated_entity["entity_hex"] diff --git a/worlds/witness/test/test_easter_egg_shuffle.py b/worlds/witness/test/test_easter_egg_shuffle.py new file mode 100644 index 0000000000..300d32f97f --- /dev/null +++ b/worlds/witness/test/test_easter_egg_shuffle.py @@ -0,0 +1,155 @@ +from typing import cast + +from BaseClasses import LocationProgressType + +from .. import WitnessWorld +from ..test import WitnessMultiworldTestBase + + +class TestEasterEggShuffle(WitnessMultiworldTestBase): + options_per_world = [ + { + "easter_egg_hunt": "off", + }, + { + "easter_egg_hunt": "easy", + }, + { + "easter_egg_hunt": "normal", + }, + { + "easter_egg_hunt": "hard", + }, + { + "easter_egg_hunt": "very_hard", + }, + { + "easter_egg_hunt": "extreme", + }, + ] + + def test_easter_egg_hunt(self) -> None: + with self.subTest("Test that player without Easter Egg Hunt has no easter egg related locations"): + egg_locations = {location for location in self.multiworld.get_locations(1) if "Egg" in location.name} + self.assertFalse(egg_locations) + + for player, eggs_per_check, logical_eggs_per_check in zip([2, 3, 4, 5, 6], [3, 3, 4, 4, 4], [8, 6, 6, 5, 4]): + world = cast(WitnessWorld, self.multiworld.worlds[player]) + option_name = world.options.easter_egg_hunt + + with self.subTest(f"Test that {option_name} Egg Hunt player starts with 0 eggs"): + self.assertEqual(self.multiworld.state.count("Egg", player), 0) + + with self.subTest(f"Test that the correct Egg Collection locations exist for {option_name} player"): + first_egg_location = f"{eggs_per_check} Easter Eggs Collected" + one_less_location = f"{eggs_per_check - 1} Easter Eggs Collected" + one_more_location = f"{eggs_per_check + 1} Easter Eggs Collected" + self.assert_location_exists(first_egg_location, player) + self.assert_location_does_not_exist(one_less_location, player, strict_check=False) + self.assert_location_does_not_exist(one_more_location, player, strict_check=False) + + one_too_few = logical_eggs_per_check - 1 + with self.subTest(f'Test that "+{one_too_few} Easter Eggs" item adds 4 easter eggs'): + item = world.create_item(f"+{one_too_few} Easter Eggs") + self.multiworld.state.collect(item, prevent_sweep=True) + self.assertEqual(self.multiworld.state.count("Egg", player), one_too_few) + + with self.subTest( + f"Test that {one_too_few} Easter Eggs are not enough for {option_name} player's first location" + ): + self.assertFalse(self.multiworld.state.can_reach_location(first_egg_location, player)) + + with self.subTest( + f"Test that {logical_eggs_per_check} Easter Eggs are enough for {option_name} player's first location" + ): + item = world.create_item("+1 Easter Egg") + self.multiworld.state.collect(item, prevent_sweep=True) + self.assertTrue(self.multiworld.state.can_reach_location(first_egg_location, player)) + + +class TestEggRestrictions(WitnessMultiworldTestBase): + options_per_world = [ + { + "shuffle_postgame": False, + }, + { + "shuffle_postgame": True, + }, + { + "shuffle_postgame": True, + "exclude_locations": frozenset({"Bunker Easter Egg 3"}), + } + ] + + common_options = { + "victory_condition": "mountain_box_short", + "shuffle_doors": "off", + "easter_egg_hunt": "very_hard", + "shuffle_vault_boxes": True, + } + + def test_egg_restrictions(self) -> None: + with self.subTest("Test that locations beyond 108 Easter Eggs don't exist for a seed without Mountain"): + self.assert_location_exists("108 Easter Eggs Collected", 1) + self.assert_location_does_not_exist("112 Easter Eggs Collected", 1) + + with self.subTest( + "Test that locations beyond 86 Easter Eggs, which would logically require more than 108 Eggs, are excluded" + ): + egg_84_location = self.multiworld.get_location("84 Easter Eggs Collected", 1) + egg_88_location = self.multiworld.get_location("88 Easter Eggs Collected", 1) + + self.assertNotEqual(egg_84_location.progress_type, LocationProgressType.EXCLUDED) + self.assertEqual(egg_88_location.progress_type, LocationProgressType.EXCLUDED) + + with self.subTest("Test that in a seed with the whole game included, the 120 egg location exists"): + self.assert_location_exists("120 Easter Eggs Collected", 2) + + with self.subTest( + "Test that locations beyond 96 Easter Eggs, which would logically require more than 120 Eggs, are excluded" + ): + egg_96_location = self.multiworld.get_location("96 Easter Eggs Collected", 2) + egg_100_location = self.multiworld.get_location("100 Easter Eggs Collected", 2) + + self.assertNotEqual(egg_96_location.progress_type, LocationProgressType.EXCLUDED) + self.assertEqual(egg_100_location.progress_type, LocationProgressType.EXCLUDED) + + with self.subTest("Test that you can exclude and egg to disable it"): + self.assert_location_exists("116 Easter Eggs Collected", 3) + self.assert_location_does_not_exist("120 Easter Eggs Collected", 3) + + +class TestBunkerElevatorEgg(WitnessMultiworldTestBase): + options_per_world = [ + { + "elevators_come_to_you": frozenset() + }, + { + "elevators_come_to_you": frozenset({"Bunker Elevator"}) + }, + ] + + common_options = { + "easter_egg_hunt": "normal", + "shuffle_doors": "panels", + "shuffle_symbols": False, + } + + def test_bunker_elevator_egg(self) -> None: + items_to_reach_bunker_elevator = [ + "Bunker Entry (Panel)", + "Bunker Tinted Glass Door (Panel)", + "Bunker Drop-Down Door Controls (Panel)" + ] + + with self.subTest("Test that normally, the egg behind the elevator needs Elevator Control"): + self.assertFalse(self.multiworld.state.can_reach_location("Bunker Under Elevator Easter Egg", 1)) + self.collect_by_name(items_to_reach_bunker_elevator, 1) + self.assertFalse(self.multiworld.state.can_reach_location("Bunker Under Elevator Easter Egg", 1)) + self.collect_by_name(["Bunker Elevator Control (Panel)"], 1) + self.assertTrue(self.multiworld.state.can_reach_location("Bunker Under Elevator Easter Egg", 1)) + + with self.subTest("Test that with auto-elevators, the egg behind the elevator doesn't need Elevator Control"): + self.assertFalse(self.multiworld.state.can_reach_location("Bunker Under Elevator Easter Egg", 2)) + self.collect_by_name(items_to_reach_bunker_elevator, 2) + self.assertTrue(self.multiworld.state.can_reach_location("Bunker Under Elevator Easter Egg", 2)) From 61afe76eae7419cdab096dad642fd55ef80b0cd1 Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Sat, 8 Mar 2025 00:45:52 +0000 Subject: [PATCH 069/227] DS3: Remove the outdated French translation of the setup docs (#4700) This was causing confusion and Discord support requests because the instructions there are no longer compatible with the latest version of Archipelago. This also lists me as the primary author of the new setup guide. --- worlds/dark_souls_3/__init__.py | 13 ++--------- worlds/dark_souls_3/docs/setup_fr.md | 33 ---------------------------- 2 files changed, 2 insertions(+), 44 deletions(-) delete mode 100644 worlds/dark_souls_3/docs/setup_fr.md diff --git a/worlds/dark_souls_3/__init__.py b/worlds/dark_souls_3/__init__.py index e1787a9a44..b9f32a8d40 100644 --- a/worlds/dark_souls_3/__init__.py +++ b/worlds/dark_souls_3/__init__.py @@ -25,19 +25,10 @@ class DarkSouls3Web(WebWorld): "English", "setup_en.md", "setup/en", - ["Marech"] + ["Natalie", "Marech"] ) - setup_fr = Tutorial( - setup_en.tutorial_name, - setup_en.description, - "Français", - "setup_fr.md", - "setup/fr", - ["Marech"] - ) - - tutorials = [setup_en, setup_fr] + tutorials = [setup_en] option_groups = option_groups item_descriptions = item_descriptions rich_text_options_doc = True diff --git a/worlds/dark_souls_3/docs/setup_fr.md b/worlds/dark_souls_3/docs/setup_fr.md deleted file mode 100644 index ea4d8f8186..0000000000 --- a/worlds/dark_souls_3/docs/setup_fr.md +++ /dev/null @@ -1,33 +0,0 @@ -# Guide d'installation de Dark Souls III Randomizer - -## Logiciels requis - -- [Dark Souls III](https://store.steampowered.com/app/374320/DARK_SOULS_III/) -- [Client AP de Dark Souls III](https://github.com/Marechal-L/Dark-Souls-III-Archipelago-client/releases) - -## Concept général - -Le client Archipelago de Dark Souls III est un fichier dinput8.dll. Cette .dll va lancer une invite de commande Windows -permettant de lire des informations de la partie et écrire des commandes pour intéragir avec le serveur Archipelago. - -## Procédures d'installation - - -**Il y a des risques de bannissement permanent des serveurs FromSoftware si ce mod est utilisé en ligne.** - -Ce client a été testé sur la version Steam officielle du jeu (v1.15/1.35), peu importe les DLCs actuellement installés. - -Télécharger le fichier dinput8.dll disponible dans le [Client AP de Dark Souls III](https://github.com/Marechal-L/Dark-Souls-III-Archipelago-client/releases) et -placez-le à la racine du jeu (ex: "SteamLibrary\steamapps\common\DARK SOULS III\Game") - -## Rejoindre une partie Multiworld - -1. Lancer DarkSoulsIII.exe ou lancer le jeu depuis Steam -2. Ecrire "/connect {SERVER_IP}:{SERVER_PORT} {SLOT_NAME}" dans l'invite de commande Windows ouverte au lancement du jeu -3. Une fois connecté, créez une nouvelle partie, choisissez une classe et attendez que les autres soient prêts avant de lancer -4. Vous pouvez quitter et lancer le jeu n'importe quand pendant une partie - -## Où trouver le fichier de configuration ? - -La [Page de configuration](/games/Dark%20Souls%20III/player-options) sur le site vous permez de configurer vos -paramètres et de les exporter sous la forme d'un fichier. From 113259bc1546ec648b4d1780ec79e6c7b53f11f8 Mon Sep 17 00:00:00 2001 From: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Date: Fri, 7 Mar 2025 20:17:45 -0500 Subject: [PATCH 070/227] Update links (#4690) * Update links * Update two more --- docs/tests.md | 4 ++-- docs/world api.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/tests.md b/docs/tests.md index c8655ccf3f..e7f4004236 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -73,11 +73,11 @@ When tests are run, this class will create a multiworld with a single player hav generic tests, as well as the new custom test. Each test method definition will create its own separate solo multiworld that will be cleaned up after. If you don't want to run the generic tests on a base, `run_default_tests` can be overridden. For more information on what methods are available to your class, check the -[WorldTestBase definition](/test/bases.py#L104). +[WorldTestBase definition](/test/bases.py#L106). #### Alternatives to WorldTestBase -Unit tests can also be created using [TestBase](/test/bases.py#L14) or +Unit tests can also be created using [TestBase](/test/bases.py#L16) or [unittest.TestCase](https://docs.python.org/3/library/unittest.html#unittest.TestCase) depending on your use case. These may be useful for generating a multiworld under very specific constraints without using the generic world setup, or for testing portions of your code that can be tested without relying on a multiworld to be created first. diff --git a/docs/world api.md b/docs/world api.md index 6a45ccbf99..9e3fe67b4f 100644 --- a/docs/world api.md +++ b/docs/world api.md @@ -291,7 +291,7 @@ like entrance randomization in logic. Regions have a list called `exits`, containing `Entrance` objects representing transitions to other regions. -There must be one special region (Called "Menu" by default, but configurable using [origin_region_name](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L295-L296)), +There must be one special region (Called "Menu" by default, but configurable using [origin_region_name](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L298-L299)), from which the logic unfolds. AP assumes that a player will always be able to return to this starting region by resetting the game ("Save and quit"). ### Entrances @@ -331,7 +331,7 @@ Even doing `state.can_reach_location` or `state.can_reach_entrance` is problemat You can use `multiworld.register_indirect_condition(region, entrance)` to explicitly tell the generator that, when a given region becomes accessible, it is necessary to re-check a specific entrance. You **must** use `multiworld.register_indirect_condition` if you perform this kind of `can_reach` from an entrance access rule, unless you have a **very** good technical understanding of the relevant code and can reason why it will never lead to problems in your case. -Alternatively, you can set [world.explicit_indirect_conditions = False](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L298-L301), +Alternatively, you can set [world.explicit_indirect_conditions = False](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L301-L304), avoiding the need for indirect conditions at the expense of performance. ### Item Rules From 3e08acf381f31c41e6cc45bca248758f272fd62e Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Sat, 8 Mar 2025 12:26:59 +0100 Subject: [PATCH 071/227] The Witness: Move local_items code earlier #4696 --- worlds/witness/__init__.py | 7 +++---- worlds/witness/player_items.py | 5 ++++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index 3bf3661bc1..80ef996a0e 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -156,8 +156,9 @@ class WitnessWorld(World): self.determine_sufficient_progression() - if self.options.shuffle_lasers == "local": - self.options.local_items.value |= self.item_name_groups["Lasers"] + for item_name, item_data in self.player_items.item_data.items(): + if item_data.local_only: + self.options.local_items.value.add(item_name) if self.options.victory_condition == "panel_hunt": total_panels = self.options.panel_hunt_total @@ -323,8 +324,6 @@ class WitnessWorld(World): self.own_itempool += new_items self.multiworld.itempool += new_items - if self.player_items.item_data[item_name].local_only: - self.options.local_items.value.add(item_name) def fill_slot_data(self) -> Dict[str, Any]: already_hinted_locations = set() diff --git a/worlds/witness/player_items.py b/worlds/witness/player_items.py index b98c59e9a6..7b71e3c1f9 100644 --- a/worlds/witness/player_items.py +++ b/worlds/witness/player_items.py @@ -65,7 +65,7 @@ class WitnessPlayerItems: or name in player_logic.PROGRESSION_ITEMS_ACTUALLY_IN_THE_GAME } - # Downgrade door items + # Downgrade door items and make lasers local if local lasers is on for item_name, item_data in self.item_data.items(): if not isinstance(item_data.definition, DoorItemDefinition): continue @@ -73,6 +73,9 @@ class WitnessPlayerItems: if all(not self._logic.solvability_guaranteed(e_hex) for e_hex in item_data.definition.panel_id_hexes): item_data.classification = ItemClassification.useful + if item_data.definition.category == ItemCategory.LASER and self._world.options.shuffle_lasers == "local": + item_data.local_only = True + # Build the mandatory item list. self._mandatory_items: Dict[str, int] = {} From 9c579762524ac121cb089d80a3bf90ab99b84814 Mon Sep 17 00:00:00 2001 From: kbranch Date: Sat, 8 Mar 2025 07:32:45 -0500 Subject: [PATCH 072/227] LADX: Autotracker improvements (#4445) * Expand and validate the RAM cache * Part way through location improvement * Fixed location tracking * Preliminary entrance tracking support * Actually send entrance messages * Store found entrances on the server * Bit of cleanup * Added rupee count, items linked to checks * Send Magpie a handshAck * Got my own version wrong * Remove the Beta name * Only send slot_data if there's something in it * Ask the server for entrance updates * Small fix to stabilize Link's location when changing rooms * Oops, server storage is shared between worlds * Deal with null responses from the server * Added UNUSED_KEY item --- LinksAwakeningClient.py | 136 +++++++++++++--- worlds/ladx/GpsTracker.py | 308 +++++++++++++++++++++++++++-------- worlds/ladx/ItemTracker.py | 46 ++++-- worlds/ladx/Tracker.py | 81 +++++++-- worlds/ladx/TrackerConsts.py | 291 +++++++++++++++++++++++++++++++++ 5 files changed, 752 insertions(+), 110 deletions(-) create mode 100644 worlds/ladx/TrackerConsts.py diff --git a/LinksAwakeningClient.py b/LinksAwakeningClient.py index e2e16922fa..ff932e7c76 100644 --- a/LinksAwakeningClient.py +++ b/LinksAwakeningClient.py @@ -28,6 +28,7 @@ from CommonClient import (CommonContext, get_base_parser, gui_enabled, logger, from NetUtils import ClientStatus from worlds.ladx.Common import BASE_ID as LABaseID from worlds.ladx.GpsTracker import GpsTracker +from worlds.ladx.TrackerConsts import storage_key from worlds.ladx.ItemTracker import ItemTracker from worlds.ladx.LADXR.checkMetadata import checkMetadataTable from worlds.ladx.Locations import get_locations_to_id, meta_to_name @@ -100,19 +101,23 @@ class LAClientConstants: WRamCheckSize = 0x4 WRamSafetyValue = bytearray([0]*WRamCheckSize) + wRamStart = 0xC000 + hRamStart = 0xFF80 + hRamSize = 0x80 + MinGameplayValue = 0x06 MaxGameplayValue = 0x1A VictoryGameplayAndSub = 0x0102 - class RAGameboy(): cache = [] - cache_start = 0 - cache_size = 0 last_cache_read = None socket = None def __init__(self, address, port) -> None: + self.cache_start = LAClientConstants.wRamStart + self.cache_size = LAClientConstants.hRamStart + LAClientConstants.hRamSize - LAClientConstants.wRamStart + self.address = address self.port = port self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) @@ -131,9 +136,14 @@ class RAGameboy(): async def get_retroarch_status(self): return await self.send_command("GET_STATUS") - def set_cache_limits(self, cache_start, cache_size): - self.cache_start = cache_start - self.cache_size = cache_size + def set_checks_range(self, checks_start, checks_size): + self.checks_start = checks_start + self.checks_size = checks_size + + def set_location_range(self, location_start, location_size, critical_addresses): + self.location_start = location_start + self.location_size = location_size + self.critical_location_addresses = critical_addresses def send(self, b): if type(b) is str: @@ -188,21 +198,57 @@ class RAGameboy(): if not await self.check_safe_gameplay(): return - cache = [] - remaining_size = self.cache_size - while remaining_size: - block = await self.async_read_memory(self.cache_start + len(cache), remaining_size) - remaining_size -= len(block) - cache += block + attempts = 0 + while True: + # RA doesn't let us do an atomic read of a large enough block of RAM + # Some bytes can't change in between reading location_block and hram_block + location_block = await self.read_memory_block(self.location_start, self.location_size) + hram_block = await self.read_memory_block(LAClientConstants.hRamStart, LAClientConstants.hRamSize) + verification_block = await self.read_memory_block(self.location_start, self.location_size) + + valid = True + for address in self.critical_location_addresses: + if location_block[address - self.location_start] != verification_block[address - self.location_start]: + valid = False + + if valid: + break + + attempts += 1 + + # Shouldn't really happen, but keep it from choking + if attempts > 5: + return + + checks_block = await self.read_memory_block(self.checks_start, self.checks_size) if not await self.check_safe_gameplay(): return - self.cache = cache + self.cache = bytearray(self.cache_size) + + start = self.checks_start - self.cache_start + self.cache[start:start + len(checks_block)] = checks_block + + start = self.location_start - self.cache_start + self.cache[start:start + len(location_block)] = location_block + + start = LAClientConstants.hRamStart - self.cache_start + self.cache[start:start + len(hram_block)] = hram_block + self.last_cache_read = time.time() + + async def read_memory_block(self, address: int, size: int): + block = bytearray() + remaining_size = size + while remaining_size: + chunk = await self.async_read_memory(address + len(block), remaining_size) + remaining_size -= len(chunk) + block += chunk + + return block async def read_memory_cache(self, addresses): - # TODO: can we just update once per frame? if not self.last_cache_read or self.last_cache_read + 0.1 < time.time(): await self.update_cache() if not self.cache: @@ -359,11 +405,12 @@ class LinksAwakeningClient(): auth = binascii.hexlify(await self.gameboy.async_read_memory(0x0134, 12)).decode() self.auth = auth - async def wait_and_init_tracker(self): + async def wait_and_init_tracker(self, magpie: MagpieBridge): await self.wait_for_game_ready() self.tracker = LocationTracker(self.gameboy) self.item_tracker = ItemTracker(self.gameboy) self.gps_tracker = GpsTracker(self.gameboy) + magpie.gps_tracker = self.gps_tracker async def recved_item_from_ap(self, item_id, from_player, next_index): # Don't allow getting an item until you've got your first check @@ -405,9 +452,11 @@ class LinksAwakeningClient(): return (await self.gameboy.read_memory_cache([LAClientConstants.wGameplayType]))[LAClientConstants.wGameplayType] == 1 async def main_tick(self, item_get_cb, win_cb, deathlink_cb): + await self.gameboy.update_cache() await self.tracker.readChecks(item_get_cb) await self.item_tracker.readItems() await self.gps_tracker.read_location() + await self.gps_tracker.read_entrances() current_health = (await self.gameboy.read_memory_cache([LAClientConstants.wLinkHealth]))[LAClientConstants.wLinkHealth] if self.deathlink_debounce and current_health != 0: @@ -465,6 +514,10 @@ class LinksAwakeningContext(CommonContext): magpie_task = None won = False + @property + def slot_storage_key(self): + return f"{self.slot_info[self.slot].name}_{storage_key}" + def __init__(self, server_address: typing.Optional[str], password: typing.Optional[str], magpie: typing.Optional[bool]) -> None: self.client = LinksAwakeningClient() self.slot_data = {} @@ -507,7 +560,19 @@ class LinksAwakeningContext(CommonContext): self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") async def send_checks(self): - message = [{"cmd": 'LocationChecks', "locations": self.found_checks}] + message = [{"cmd": "LocationChecks", "locations": self.found_checks}] + await self.send_msgs(message) + + async def send_new_entrances(self, entrances: typing.Dict[str, str]): + # Store the entrances we find on the server for future sessions + message = [{ + "cmd": "Set", + "key": self.slot_storage_key, + "default": {}, + "want_reply": False, + "operations": [{"operation": "update", "value": entrances}], + }] + await self.send_msgs(message) had_invalid_slot_data = None @@ -536,6 +601,12 @@ class LinksAwakeningContext(CommonContext): logger.info("victory!") await self.send_msgs(message) self.won = True + + async def request_found_entrances(self): + await self.send_msgs([{"cmd": "Get", "keys": [self.slot_storage_key]}]) + + # Ask for updates so that players can co-op entrances in a seed + await self.send_msgs([{"cmd": "SetNotify", "keys": [self.slot_storage_key]}]) async def on_deathlink(self, data: typing.Dict[str, typing.Any]) -> None: if self.ENABLE_DEATHLINK: @@ -576,6 +647,12 @@ class LinksAwakeningContext(CommonContext): if cmd == "ReceivedItems": for index, item in enumerate(args["items"], start=args["index"]): self.client.recvd_checks[index] = item + + if cmd == "Retrieved" and self.magpie_enabled and self.slot_storage_key in args["keys"]: + self.client.gps_tracker.receive_found_entrances(args["keys"][self.slot_storage_key]) + + if cmd == "SetReply" and self.magpie_enabled and args["key"] == self.slot_storage_key: + self.client.gps_tracker.receive_found_entrances(args["value"]) async def sync(self): sync_msg = [{'cmd': 'Sync'}] @@ -589,6 +666,12 @@ class LinksAwakeningContext(CommonContext): checkMetadataTable[check.id])] for check in ladxr_checks] self.new_checks(checks, [check.id for check in ladxr_checks]) + for check in ladxr_checks: + if check.value and check.linkedItem: + linkedItem = check.linkedItem + if 'condition' not in linkedItem or linkedItem['condition'](self.slot_data): + self.client.item_tracker.setExtraItem(check.linkedItem['item'], check.linkedItem['qty']) + async def victory(): await self.send_victory() @@ -622,12 +705,20 @@ class LinksAwakeningContext(CommonContext): if not self.client.recvd_checks: await self.sync() - await self.client.wait_and_init_tracker() + await self.client.wait_and_init_tracker(self.magpie) + min_tick_duration = 0.1 + last_tick = time.time() while True: await self.client.main_tick(on_item_get, victory, deathlink) - await asyncio.sleep(0.1) + now = time.time() + tick_duration = now - last_tick + sleep_duration = max(min_tick_duration - tick_duration, 0) + await asyncio.sleep(sleep_duration) + + last_tick = now + if self.last_resend + 5.0 < now: self.last_resend = now await self.send_checks() @@ -635,8 +726,15 @@ class LinksAwakeningContext(CommonContext): try: self.magpie.set_checks(self.client.tracker.all_checks) await self.magpie.set_item_tracker(self.client.item_tracker) - await self.magpie.send_gps(self.client.gps_tracker) self.magpie.slot_data = self.slot_data + + if self.client.gps_tracker.needs_found_entrances: + await self.request_found_entrances() + self.client.gps_tracker.needs_found_entrances = False + + new_entrances = await self.magpie.send_gps(self.client.gps_tracker) + if new_entrances: + await self.send_new_entrances(new_entrances) except Exception: # Don't let magpie errors take out the client pass diff --git a/worlds/ladx/GpsTracker.py b/worlds/ladx/GpsTracker.py index 1ea465eb16..d98acf71b4 100644 --- a/worlds/ladx/GpsTracker.py +++ b/worlds/ladx/GpsTracker.py @@ -1,92 +1,266 @@ import json -roomAddress = 0xFFF6 -mapIdAddress = 0xFFF7 -indoorFlagAddress = 0xDBA5 -entranceRoomOffset = 0xD800 -screenCoordAddress = 0xFFFA +import typing +from websockets import WebSocketServerProtocol -mapMap = { - 0x00: 0x01, - 0x01: 0x01, - 0x02: 0x01, - 0x03: 0x01, - 0x04: 0x01, - 0x05: 0x01, - 0x06: 0x02, - 0x07: 0x02, - 0x08: 0x02, - 0x09: 0x02, - 0x0A: 0x02, - 0x0B: 0x02, - 0x0C: 0x02, - 0x0D: 0x02, - 0x0E: 0x02, - 0x0F: 0x02, - 0x10: 0x02, - 0x11: 0x02, - 0x12: 0x02, - 0x13: 0x02, - 0x14: 0x02, - 0x15: 0x02, - 0x16: 0x02, - 0x17: 0x02, - 0x18: 0x02, - 0x19: 0x02, - 0x1D: 0x01, - 0x1E: 0x01, - 0x1F: 0x01, - 0xFF: 0x03, -} +from . import TrackerConsts as Consts +from .TrackerConsts import EntranceCoord +from .LADXR.entranceInfo import ENTRANCE_INFO + +class Entrance: + outdoor_room: int + indoor_map: int + indoor_address: int + name: str + other_side_name: str = None + changed: bool = False + known_to_server: bool = False + + def __init__(self, outdoor: int, indoor: int, name: str, indoor_address: int=None): + self.outdoor_room = outdoor + self.indoor_map = indoor + self.indoor_address = indoor_address + self.name = name + + def map(self, other_side: str, known_to_server: bool = False): + if other_side != self.other_side_name: + self.changed = True + self.known_to_server = known_to_server + + self.other_side_name = other_side class GpsTracker: - room = None - location_changed = False - screenX = 0 - screenY = 0 - indoors = None + room: int = None + last_room: int = None + last_different_room: int = None + room_same_for: int = 0 + room_changed: bool = False + screen_x: int = 0 + screen_y: int = 0 + spawn_x: int = 0 + spawn_y: int = 0 + indoors: int = None + indoors_changed: bool = False + spawn_map: int = None + spawn_room: int = None + spawn_changed: bool = False + spawn_same_for: int = 0 + entrance_mapping: typing.Dict[str, str] = None + entrances_by_name: typing.Dict[str, Entrance] = {} + needs_found_entrances: bool = False + needs_slot_data: bool = True def __init__(self, gameboy) -> None: self.gameboy = gameboy - async def read_byte(self, b): - return (await self.gameboy.async_read_memory(b))[0] + self.gameboy.set_location_range( + Consts.link_motion_state, + Consts.transition_sequence - Consts.link_motion_state + 1, + [Consts.transition_state] + ) + + async def read_byte(self, b: int): + return (await self.gameboy.read_memory_cache([b]))[b] + + def load_slot_data(self, slot_data: typing.Dict[str, typing.Any]): + if 'entrance_mapping' not in slot_data: + return + + # We need to know how entrances were mapped at generation before we can autotrack them + self.entrance_mapping = {} + + # Convert to upstream's newer format + for outside, inside in slot_data['entrance_mapping'].items(): + new_inside = f"{inside}:inside" + self.entrance_mapping[outside] = new_inside + self.entrance_mapping[new_inside] = outside + + self.entrances_by_name = {} + + for name, info in ENTRANCE_INFO.items(): + alternate_address = ( + Consts.entrance_address_overrides[info.target] + if info.target in Consts.entrance_address_overrides + else None + ) + + entrance = Entrance(info.room, info.target, name, alternate_address) + self.entrances_by_name[name] = entrance + + inside_entrance = Entrance(info.target, info.room, f"{name}:inside", alternate_address) + self.entrances_by_name[f"{name}:inside"] = inside_entrance + + self.needs_slot_data = False + self.needs_found_entrances = True async def read_location(self): - indoors = await self.read_byte(indoorFlagAddress) + # We need to wait for screen transitions to finish + transition_state = await self.read_byte(Consts.transition_state) + transition_target_x = await self.read_byte(Consts.transition_target_x) + transition_target_y = await self.read_byte(Consts.transition_target_y) + transition_scroll_x = await self.read_byte(Consts.transition_scroll_x) + transition_scroll_y = await self.read_byte(Consts.transition_scroll_y) + transition_sequence = await self.read_byte(Consts.transition_sequence) + motion_state = await self.read_byte(Consts.link_motion_state) + if (transition_state != 0 + or transition_target_x != transition_scroll_x + or transition_target_y != transition_scroll_y + or transition_sequence != 0x04): + return + + indoors = await self.read_byte(Consts.indoor_flag) if indoors != self.indoors and self.indoors != None: - self.indoorsChanged = True - + self.indoors_changed = True + self.indoors = indoors - mapId = await self.read_byte(mapIdAddress) - if mapId not in mapMap: - print(f'Unknown map ID {hex(mapId)}') + # We use the spawn point to know which entrance was most recently entered + spawn_map = await self.read_byte(Consts.spawn_map) + map_digit = Consts.map_map[spawn_map] << 8 if self.spawn_map else 0 + spawn_room = await self.read_byte(Consts.spawn_room) + map_digit + spawn_x = await self.read_byte(Consts.spawn_x) + spawn_y = await self.read_byte(Consts.spawn_y) + + # The spawn point needs to be settled before we can trust location data + if ((spawn_room != self.spawn_room and self.spawn_room != None) + or (spawn_map != self.spawn_map and self.spawn_map != None) + or (spawn_x != self.spawn_x and self.spawn_x != None) + or (spawn_y != self.spawn_y and self.spawn_y != None)): + self.spawn_changed = True + self.spawn_same_for = 0 + else: + self.spawn_same_for += 1 + + self.spawn_map = spawn_map + self.spawn_room = spawn_room + self.spawn_x = spawn_x + self.spawn_y = spawn_y + + # Spawn point is preferred, but doesn't work for the sidescroller entrances + # Those can be addressed by keeping track of which room we're in + # Also used to validate that we came from the right room for what the spawn point is mapped to + map_id = await self.read_byte(Consts.map_id) + if map_id not in Consts.map_map: + print(f'Unknown map ID {hex(map_id)}') return - mapDigit = mapMap[mapId] << 8 if indoors else 0 - last_room = self.room - self.room = await self.read_byte(roomAddress) + mapDigit + map_digit = Consts.map_map[map_id] << 8 if indoors else 0 + self.last_room = self.room + self.room = await self.read_byte(Consts.room) + map_digit - coords = await self.read_byte(screenCoordAddress) - self.screenX = coords & 0x0F - self.screenY = (coords & 0xF0) >> 4 + # Again, the room needs to settle before we can trust location data + if self.last_room != self.room: + self.room_same_for = 0 + self.room_changed = True + self.last_different_room = self.last_room + else: + self.room_same_for += 1 - if (self.room != last_room): - self.location_changed = True - - last_message = {} - async def send_location(self, socket, diff=False): - if self.room is None: + # Only update Link's location when he's not in the air to avoid weirdness + if motion_state in [0, 1]: + coords = await self.read_byte(Consts.screen_coord) + self.screen_x = coords & 0x0F + self.screen_y = (coords & 0xF0) >> 4 + + async def read_entrances(self): + if not self.last_different_room or not self.entrance_mapping: return + + if self.spawn_changed and self.spawn_same_for > 0 and self.room_same_for > 0: + # Use the spawn location, last room, and entrance mapping at generation to map the right entrance + # A bit overkill for simple ER, but necessary for upstream's advanced ER + spawn_coord = EntranceCoord(None, self.spawn_room, self.spawn_x, self.spawn_y) + if str(spawn_coord) in Consts.entrance_lookup: + valid_sources = {x.name for x in Consts.entrance_coords if x.room == self.last_different_room} + dest_entrance = Consts.entrance_lookup[str(spawn_coord)].name + source_entrance = [ + x for x in self.entrance_mapping + if self.entrance_mapping[x] == dest_entrance and x in valid_sources + ] + + if source_entrance: + self.entrances_by_name[source_entrance[0]].map(dest_entrance) + + self.spawn_changed = False + elif self.room_changed and self.room_same_for > 0: + # Check for the stupid sidescroller rooms that don't set your spawn point + if self.last_different_room in Consts.sidescroller_rooms: + source_entrance = Consts.sidescroller_rooms[self.last_different_room] + if source_entrance in self.entrance_mapping: + dest_entrance = self.entrance_mapping[source_entrance] + + expected_room = self.entrances_by_name[dest_entrance].outdoor_room + if dest_entrance.endswith(":indoor"): + expected_room = self.entrances_by_name[dest_entrance].indoor_map + + if expected_room == self.room: + self.entrances_by_name[source_entrance].map(dest_entrance) + + if self.room in Consts.sidescroller_rooms: + valid_sources = {x.name for x in Consts.entrance_coords if x.room == self.last_different_room} + dest_entrance = Consts.sidescroller_rooms[self.room] + source_entrance = [ + x for x in self.entrance_mapping + if self.entrance_mapping[x] == dest_entrance and x in valid_sources + ] + + if source_entrance: + self.entrances_by_name[source_entrance[0]].map(dest_entrance) + + self.room_changed = False + + last_location_message = {} + async def send_location(self, socket: WebSocketServerProtocol) -> None: + if self.room is None or self.room_same_for < 1: + return + message = { "type":"location", "refresh": True, - "version":"1.0", "room": f'0x{self.room:02X}', - "x": self.screenX, - "y": self.screenY, + "x": self.screen_x, + "y": self.screen_y, + "drawFine": True, } - if message != self.last_message: - self.last_message = message + + if message != self.last_location_message: + self.last_location_message = message await socket.send(json.dumps(message)) + + async def send_entrances(self, socket: WebSocketServerProtocol, diff: bool=True) -> typing.Dict[str, str]: + if not self.entrance_mapping: + return + + new_entrances = [x for x in self.entrances_by_name.values() if x.changed or (not diff and x.other_side_name)] + + if not new_entrances: + return + + message = { + "type":"entrance", + "refresh": True, + "diff": True, + "entranceMap": {}, + } + + for entrance in new_entrances: + message['entranceMap'][entrance.name] = entrance.other_side_name + entrance.changed = False + + await socket.send(json.dumps(message)) + + new_to_server = { + entrance.name: entrance.other_side_name + for entrance in new_entrances + if not entrance.known_to_server + } + + return new_to_server + + def receive_found_entrances(self, found_entrances: typing.Dict[str, str]): + if not found_entrances: + return + + for entrance, destination in found_entrances.items(): + if entrance in self.entrances_by_name: + self.entrances_by_name[entrance].map(destination, known_to_server=True) diff --git a/worlds/ladx/ItemTracker.py b/worlds/ladx/ItemTracker.py index 92ef71633e..b288bba843 100644 --- a/worlds/ladx/ItemTracker.py +++ b/worlds/ladx/ItemTracker.py @@ -1,12 +1,16 @@ import json -gameStateAddress = 0xDB95 -validGameStates = {0x0B, 0x0C} -gameStateResetThreshold = 0x06 inventorySlotCount = 16 inventoryStartAddress = 0xDB00 inventoryEndAddress = inventoryStartAddress + inventorySlotCount +rupeesHigh = 0xDB5D +rupeesLow = 0xDB5E +addRupeesHigh = 0xDB8F +addRupeesLow = 0xDB90 +removeRupeesHigh = 0xDB91 +removeRupeesLow = 0xDB92 + inventoryItemIds = { 0x02: 'BOMB', 0x05: 'BOW', @@ -98,10 +102,11 @@ dungeonItemOffsets = { 'STONE_BEAK{}': 2, 'NIGHTMARE_KEY{}': 3, 'KEY{}': 4, + 'UNUSED_KEY{}': 4, } class Item: - def __init__(self, id, address, threshold=0, mask=None, increaseOnly=False, count=False, max=None): + def __init__(self, id, address, threshold=0, mask=None, increaseOnly=False, count=False, max=None, encodedCount=True): self.id = id self.address = address self.threshold = threshold @@ -112,6 +117,7 @@ class Item: self.rawValue = 0 self.diff = 0 self.max = max + self.encodedCount = encodedCount def set(self, byte, extra): oldValue = self.value @@ -121,7 +127,7 @@ class Item: if not self.count: byte = int(byte > self.threshold) - else: + elif self.encodedCount: # LADX seems to store one decimal digit per nibble byte = byte - (byte // 16 * 6) @@ -165,6 +171,7 @@ class ItemTracker: Item('BOOMERANG', None), Item('TOADSTOOL', None), Item('ROOSTER', None), + Item('RUPEE_COUNT', None, count=True, encodedCount=False), Item('SWORD', 0xDB4E, count=True), Item('POWER_BRACELET', 0xDB43, count=True), Item('SHIELD', 0xDB44, count=True), @@ -219,9 +226,9 @@ class ItemTracker: self.itemDict = {item.id: item for item in self.items} - async def readItems(state): - extraItems = state.extraItems - missingItems = {x for x in state.items if x.address == None} + async def readItems(self): + extraItems = self.extraItems + missingItems = {x for x in self.items if x.address == None and x.id != 'RUPEE_COUNT'} # Add keys for opened key doors for i in range(len(dungeonKeyDoors)): @@ -230,16 +237,16 @@ class ItemTracker: for address, masks in dungeonKeyDoors[i].items(): for mask in masks: - value = await state.readRamByte(address) & mask + value = await self.readRamByte(address) & mask if value > 0: extraItems[item] += 1 # Main inventory items for i in range(inventoryStartAddress, inventoryEndAddress): - value = await state.readRamByte(i) + value = await self.readRamByte(i) if value in inventoryItemIds: - item = state.itemDict[inventoryItemIds[value]] + item = self.itemDict[inventoryItemIds[value]] extra = extraItems[item.id] if item.id in extraItems else 0 item.set(1, extra) missingItems.remove(item) @@ -249,9 +256,21 @@ class ItemTracker: item.set(0, extra) # All other items - for item in [x for x in state.items if x.address]: + for item in [x for x in self.items if x.address]: extra = extraItems[item.id] if item.id in extraItems else 0 - item.set(await state.readRamByte(item.address), extra) + item.set(await self.readRamByte(item.address), extra) + + # The current rupee count is BCD, but the add/remove values are not + currentRupees = self.calculateRupeeCount(await self.readRamByte(rupeesHigh), await self.readRamByte(rupeesLow)) + addingRupees = (await self.readRamByte(addRupeesHigh) << 8) + await self.readRamByte(addRupeesLow) + removingRupees = (await self.readRamByte(removeRupeesHigh) << 8) + await self.readRamByte(removeRupeesLow) + self.itemDict['RUPEE_COUNT'].set(currentRupees + addingRupees - removingRupees, 0) + + def calculateRupeeCount(self, high: int, low: int) -> int: + return (high - (high // 16 * 6)) * 100 + (low - (low // 16 * 6)) + + def setExtraItem(self, item: str, qty: int) -> None: + self.extraItems[item] = qty async def sendItems(self, socket, diff=False): if not self.items: @@ -259,7 +278,6 @@ class ItemTracker: message = { "type":"item", "refresh": True, - "version":"1.0", "diff": diff, "items": [], } diff --git a/worlds/ladx/Tracker.py b/worlds/ladx/Tracker.py index 5f48b64c4f..1842ceaec8 100644 --- a/worlds/ladx/Tracker.py +++ b/worlds/ladx/Tracker.py @@ -1,3 +1,6 @@ +import typing + +from worlds.ladx.GpsTracker import GpsTracker from .LADXR.checkMetadata import checkMetadataTable import json import logging @@ -10,13 +13,14 @@ logger = logging.getLogger("Tracker") # kbranch you're a hero # https://github.com/kbranch/Magpie/blob/master/autotracking/checks.py class Check: - def __init__(self, id, address, mask, alternateAddress=None): + def __init__(self, id, address, mask, alternateAddress=None, linkedItem=None): self.id = id self.address = address self.alternateAddress = alternateAddress self.mask = mask self.value = None self.diff = 0 + self.linkedItem = linkedItem def set(self, bytes): oldValue = self.value @@ -86,6 +90,27 @@ class LocationTracker: blacklist = {'None', '0x2A1-2'} + def seashellCondition(slot_data): + return 'goal' not in slot_data or slot_data['goal'] != 'seashells' + + linkedCheckItems = { + '0x2E9': {'item': 'SEASHELL', 'qty': 20, 'condition': seashellCondition}, + '0x2A2': {'item': 'TOADSTOOL', 'qty': 1}, + '0x2A6-Trade': {'item': 'TRADING_ITEM_YOSHI_DOLL', 'qty': 1}, + '0x2B2-Trade': {'item': 'TRADING_ITEM_RIBBON', 'qty': 1}, + '0x2FE-Trade': {'item': 'TRADING_ITEM_DOG_FOOD', 'qty': 1}, + '0x07B-Trade': {'item': 'TRADING_ITEM_BANANAS', 'qty': 1}, + '0x087-Trade': {'item': 'TRADING_ITEM_STICK', 'qty': 1}, + '0x2D7-Trade': {'item': 'TRADING_ITEM_HONEYCOMB', 'qty': 1}, + '0x019-Trade': {'item': 'TRADING_ITEM_PINEAPPLE', 'qty': 1}, + '0x2D9-Trade': {'item': 'TRADING_ITEM_HIBISCUS', 'qty': 1}, + '0x2A8-Trade': {'item': 'TRADING_ITEM_LETTER', 'qty': 1}, + '0x0CD-Trade': {'item': 'TRADING_ITEM_BROOM', 'qty': 1}, + '0x2F5-Trade': {'item': 'TRADING_ITEM_FISHING_HOOK', 'qty': 1}, + '0x0C9-Trade': {'item': 'TRADING_ITEM_NECKLACE', 'qty': 1}, + '0x297-Trade': {'item': 'TRADING_ITEM_SCALE', 'qty': 1}, + } + # in no dungeons boss shuffle, the d3 boss in d7 set 0x20 in fascade's room (0x1BC) # after beating evil eagile in D6, 0x1BC is now 0xAC (other things may have happened in between) # entered d3, slime eye flag had already been set (0x15A 0x20). after killing angler fish, bits 0x0C were set @@ -98,6 +123,8 @@ class LocationTracker: address = addressOverrides[check_id] if check_id in addressOverrides else 0xD800 + int( room, 16) + linkedItem = linkedCheckItems[check_id] if check_id in linkedCheckItems else None + if 'Trade' in check_id or 'Owl' in check_id: mask = 0x20 @@ -111,13 +138,19 @@ class LocationTracker: highest_check = max( highest_check, alternateAddresses[check_id]) - check = Check(check_id, address, mask, - alternateAddresses[check_id] if check_id in alternateAddresses else None) + check = Check( + check_id, + address, + mask, + (alternateAddresses[check_id] if check_id in alternateAddresses else None), + linkedItem, + ) + if check_id == '0x2A3': self.start_check = check self.all_checks.append(check) self.remaining_checks = [check for check in self.all_checks] - self.gameboy.set_cache_limits( + self.gameboy.set_checks_range( lowest_check, highest_check - lowest_check + 1) def has_start_item(self): @@ -147,10 +180,17 @@ class MagpieBridge: server = None checks = None item_tracker = None + gps_tracker: GpsTracker = None ws = None features = [] slot_data = {} + def use_entrance_tracker(self): + return "entrances" in self.features \ + and self.slot_data \ + and "entrance_mapping" in self.slot_data \ + and any([k != v for k, v in self.slot_data["entrance_mapping"].items()]) + async def handler(self, websocket): self.ws = websocket while True: @@ -159,14 +199,18 @@ class MagpieBridge: logger.info( f"Connected, supported features: {message['features']}") self.features = message["features"] + + await self.send_handshAck() - if message["type"] in ("handshake", "sendFull"): + if message["type"] == "sendFull": if "items" in self.features: await self.send_all_inventory() if "checks" in self.features: await self.send_all_checks() - if "slot_data" in self.features: + if "slot_data" in self.features and self.slot_data: await self.send_slot_data(self.slot_data) + if self.use_entrance_tracker(): + await self.send_gps(diff=False) # Translate renamed IDs back to LADXR IDs @staticmethod @@ -176,6 +220,18 @@ class MagpieBridge: if the_id == "0x2A7": return "0x2A1-1" return the_id + + async def send_handshAck(self): + if not self.ws: + return + + message = { + "type": "handshAck", + "version": "1.32", + "name": "archipelago-ladx-client", + } + + await self.ws.send(json.dumps(message)) async def send_all_checks(self): while self.checks == None: @@ -185,7 +241,6 @@ class MagpieBridge: message = { "type": "check", "refresh": True, - "version": "1.0", "diff": False, "checks": [{"id": self.fixup_id(check.id), "checked": check.value} for check in self.checks] } @@ -200,7 +255,6 @@ class MagpieBridge: message = { "type": "check", "refresh": True, - "version": "1.0", "diff": True, "checks": [{"id": self.fixup_id(check), "checked": True} for check in checks] } @@ -222,10 +276,17 @@ class MagpieBridge: return await self.item_tracker.sendItems(self.ws, diff=True) - async def send_gps(self, gps): + async def send_gps(self, diff: bool=True) -> typing.Dict[str, str]: if not self.ws: return - await gps.send_location(self.ws) + + await self.gps_tracker.send_location(self.ws) + + if self.use_entrance_tracker(): + if self.slot_data and self.gps_tracker.needs_slot_data: + self.gps_tracker.load_slot_data(self.slot_data) + + return await self.gps_tracker.send_entrances(self.ws, diff) async def send_slot_data(self, slot_data): if not self.ws: diff --git a/worlds/ladx/TrackerConsts.py b/worlds/ladx/TrackerConsts.py new file mode 100644 index 0000000000..99452608ec --- /dev/null +++ b/worlds/ladx/TrackerConsts.py @@ -0,0 +1,291 @@ +class EntranceCoord: + name: str + room: int + x: int + y: int + + def __init__(self, name: str, room: int, x: int, y: int): + self.name = name + self.room = room + self.x = x + self.y = y + + def __repr__(self): + return EntranceCoord.coordString(self.room, self.x, self.y) + + def coordString(room: int, x: int, y: int): + return f"{room:#05x}, {x}, {y}" + +storage_key = "found_entrances" + +room = 0xFFF6 +map_id = 0xFFF7 +indoor_flag = 0xDBA5 +spawn_map = 0xDB60 +spawn_room = 0xDB61 +spawn_x = 0xDB62 +spawn_y = 0xDB63 +entrance_room_offset = 0xD800 +transition_state = 0xC124 +transition_target_x = 0xC12C +transition_target_y = 0xC12D +transition_scroll_x = 0xFF96 +transition_scroll_y = 0xFF97 +link_motion_state = 0xC11C +transition_sequence = 0xC16B +screen_coord = 0xFFFA + +entrance_address_overrides = { + 0x312: 0xDDF2, +} + +map_map = { + 0x00: 0x01, + 0x01: 0x01, + 0x02: 0x01, + 0x03: 0x01, + 0x04: 0x01, + 0x05: 0x01, + 0x06: 0x02, + 0x07: 0x02, + 0x08: 0x02, + 0x09: 0x02, + 0x0A: 0x02, + 0x0B: 0x02, + 0x0C: 0x02, + 0x0D: 0x02, + 0x0E: 0x02, + 0x0F: 0x02, + 0x10: 0x02, + 0x11: 0x02, + 0x12: 0x02, + 0x13: 0x02, + 0x14: 0x02, + 0x15: 0x02, + 0x16: 0x02, + 0x17: 0x02, + 0x18: 0x02, + 0x19: 0x02, + 0x1D: 0x01, + 0x1E: 0x01, + 0x1F: 0x01, + 0xFF: 0x03, +} + +sidescroller_rooms = { + 0x2e9: "seashell_mansion:inside", + 0x08a: "seashell_mansion", + 0x2fd: "mambo:inside", + 0x02a: "mambo", + 0x1eb: "castle_secret_exit:inside", + 0x049: "castle_secret_exit", + 0x1ec: "castle_secret_entrance:inside", + 0x04a: "castle_secret_entrance", + 0x117: "d1:inside", # not a sidescroller, but acts weird +} + +entrance_coords = [ + EntranceCoord("writes_house:inside", 0x2a8, 80, 124), + EntranceCoord("rooster_grave", 0x92, 88, 82), + EntranceCoord("start_house:inside", 0x2a3, 80, 124), + EntranceCoord("dream_hut", 0x83, 40, 66), + EntranceCoord("papahl_house_right:inside", 0x2a6, 80, 124), + EntranceCoord("papahl_house_right", 0x82, 120, 82), + EntranceCoord("papahl_house_left:inside", 0x2a5, 80, 124), + EntranceCoord("papahl_house_left", 0x82, 88, 82), + EntranceCoord("d2:inside", 0x136, 80, 124), + EntranceCoord("shop", 0x93, 72, 98), + EntranceCoord("armos_maze_cave:inside", 0x2fc, 104, 96), + EntranceCoord("start_house", 0xa2, 88, 82), + EntranceCoord("animal_house3:inside", 0x2d9, 80, 124), + EntranceCoord("trendy_shop", 0xb3, 88, 82), + EntranceCoord("mabe_phone:inside", 0x2cb, 80, 124), + EntranceCoord("mabe_phone", 0xb2, 88, 82), + EntranceCoord("ulrira:inside", 0x2a9, 80, 124), + EntranceCoord("ulrira", 0xb1, 72, 98), + EntranceCoord("moblin_cave:inside", 0x2f0, 80, 124), + EntranceCoord("kennel", 0xa1, 88, 66), + EntranceCoord("madambowwow:inside", 0x2a7, 80, 124), + EntranceCoord("madambowwow", 0xa1, 56, 66), + EntranceCoord("library:inside", 0x1fa, 80, 124), + EntranceCoord("library", 0xb0, 56, 50), + EntranceCoord("d5:inside", 0x1a1, 80, 124), + EntranceCoord("d1", 0xd3, 104, 34), + EntranceCoord("d1:inside", 0x117, 80, 124), + EntranceCoord("d3:inside", 0x152, 80, 124), + EntranceCoord("d3", 0xb5, 104, 32), + EntranceCoord("banana_seller", 0xe3, 72, 48), + EntranceCoord("armos_temple:inside", 0x28f, 80, 124), + EntranceCoord("boomerang_cave", 0xf4, 24, 32), + EntranceCoord("forest_madbatter:inside", 0x1e1, 136, 80), + EntranceCoord("ghost_house", 0xf6, 88, 66), + EntranceCoord("prairie_low_phone:inside", 0x29d, 80, 124), + EntranceCoord("prairie_low_phone", 0xe8, 56, 98), + EntranceCoord("prairie_madbatter_connector_entrance:inside", 0x1f6, 136, 112), + EntranceCoord("prairie_madbatter_connector_entrance", 0xf9, 120, 80), + EntranceCoord("prairie_madbatter_connector_exit", 0xe7, 104, 32), + EntranceCoord("prairie_madbatter_connector_exit:inside", 0x1e5, 40, 48), + EntranceCoord("ghost_house:inside", 0x1e3, 80, 124), + EntranceCoord("prairie_madbatter", 0xe6, 72, 64), + EntranceCoord("d4:inside", 0x17a, 80, 124), + EntranceCoord("d5", 0xd9, 88, 64), + EntranceCoord("prairie_right_cave_bottom:inside", 0x293, 48, 124), + EntranceCoord("prairie_right_cave_bottom", 0xc8, 40, 80), + EntranceCoord("prairie_right_cave_high", 0xb8, 88, 48), + EntranceCoord("prairie_right_cave_high:inside", 0x295, 112, 124), + EntranceCoord("prairie_right_cave_top", 0xb8, 120, 96), + EntranceCoord("prairie_right_cave_top:inside", 0x292, 48, 124), + EntranceCoord("prairie_to_animal_connector:inside", 0x2d0, 40, 64), + EntranceCoord("prairie_to_animal_connector", 0xaa, 136, 64), + EntranceCoord("animal_to_prairie_connector", 0xab, 120, 80), + EntranceCoord("animal_to_prairie_connector:inside", 0x2d1, 120, 64), + EntranceCoord("animal_phone:inside", 0x2e3, 80, 124), + EntranceCoord("animal_phone", 0xdb, 120, 82), + EntranceCoord("animal_house1:inside", 0x2db, 80, 124), + EntranceCoord("animal_house1", 0xcc, 40, 80), + EntranceCoord("animal_house2:inside", 0x2dd, 80, 124), + EntranceCoord("animal_house2", 0xcc, 120, 80), + EntranceCoord("hookshot_cave:inside", 0x2b3, 80, 124), + EntranceCoord("animal_house3", 0xcd, 40, 80), + EntranceCoord("animal_house4:inside", 0x2da, 80, 124), + EntranceCoord("animal_house4", 0xcd, 88, 80), + EntranceCoord("banana_seller:inside", 0x2fe, 80, 124), + EntranceCoord("animal_house5", 0xdd, 88, 66), + EntranceCoord("animal_cave:inside", 0x2f7, 96, 124), + EntranceCoord("animal_cave", 0xcd, 136, 32), + EntranceCoord("d6", 0x8c, 56, 64), + EntranceCoord("madbatter_taltal:inside", 0x1e2, 136, 80), + EntranceCoord("desert_cave", 0xcf, 88, 16), + EntranceCoord("dream_hut:inside", 0x2aa, 80, 124), + EntranceCoord("armos_maze_cave", 0xae, 72, 112), + EntranceCoord("shop:inside", 0x2a1, 80, 124), + EntranceCoord("armos_temple", 0xac, 88, 64), + EntranceCoord("d6_connector_exit:inside", 0x1f0, 56, 16), + EntranceCoord("d6_connector_exit", 0x9c, 88, 16), + EntranceCoord("desert_cave:inside", 0x1f9, 120, 96), + EntranceCoord("d6_connector_entrance:inside", 0x1f1, 136, 96), + EntranceCoord("d6_connector_entrance", 0x9d, 56, 48), + EntranceCoord("armos_fairy:inside", 0x1ac, 80, 124), + EntranceCoord("armos_fairy", 0x8d, 56, 32), + EntranceCoord("raft_return_enter:inside", 0x1f7, 136, 96), + EntranceCoord("raft_return_enter", 0x8f, 8, 32), + EntranceCoord("raft_return_exit", 0x2f, 24, 112), + EntranceCoord("raft_return_exit:inside", 0x1e7, 72, 16), + EntranceCoord("raft_house:inside", 0x2b0, 80, 124), + EntranceCoord("raft_house", 0x3f, 40, 34), + EntranceCoord("heartpiece_swim_cave:inside", 0x1f2, 72, 124), + EntranceCoord("heartpiece_swim_cave", 0x2e, 88, 32), + EntranceCoord("rooster_grave:inside", 0x1f4, 88, 112), + EntranceCoord("d4", 0x2b, 72, 34), + EntranceCoord("castle_phone:inside", 0x2cc, 80, 124), + EntranceCoord("castle_phone", 0x4b, 72, 34), + EntranceCoord("castle_main_entrance:inside", 0x2d3, 80, 124), + EntranceCoord("castle_main_entrance", 0x69, 88, 64), + EntranceCoord("castle_upper_left", 0x59, 24, 48), + EntranceCoord("castle_upper_left:inside", 0x2d5, 80, 124), + EntranceCoord("witch:inside", 0x2a2, 80, 124), + EntranceCoord("castle_upper_right", 0x59, 88, 64), + EntranceCoord("prairie_left_cave2:inside", 0x2f4, 64, 124), + EntranceCoord("castle_jump_cave", 0x78, 40, 112), + EntranceCoord("prairie_left_cave1:inside", 0x2cd, 80, 124), + EntranceCoord("seashell_mansion", 0x8a, 88, 64), + EntranceCoord("prairie_right_phone:inside", 0x29c, 80, 124), + EntranceCoord("prairie_right_phone", 0x88, 88, 82), + EntranceCoord("prairie_left_fairy:inside", 0x1f3, 80, 124), + EntranceCoord("prairie_left_fairy", 0x87, 40, 16), + EntranceCoord("bird_cave:inside", 0x27e, 96, 124), + EntranceCoord("prairie_left_cave2", 0x86, 24, 64), + EntranceCoord("prairie_left_cave1", 0x84, 152, 98), + EntranceCoord("prairie_left_phone:inside", 0x2b4, 80, 124), + EntranceCoord("prairie_left_phone", 0xa4, 56, 66), + EntranceCoord("mamu:inside", 0x2fb, 136, 112), + EntranceCoord("mamu", 0xd4, 136, 48), + EntranceCoord("richard_house:inside", 0x2c7, 80, 124), + EntranceCoord("richard_house", 0xd6, 72, 80), + EntranceCoord("richard_maze:inside", 0x2c9, 128, 124), + EntranceCoord("richard_maze", 0xc6, 56, 80), + EntranceCoord("graveyard_cave_left:inside", 0x2de, 56, 64), + EntranceCoord("graveyard_cave_left", 0x75, 56, 64), + EntranceCoord("graveyard_cave_right:inside", 0x2df, 56, 48), + EntranceCoord("graveyard_cave_right", 0x76, 104, 80), + EntranceCoord("trendy_shop:inside", 0x2a0, 80, 124), + EntranceCoord("d0", 0x77, 120, 46), + EntranceCoord("boomerang_cave:inside", 0x1f5, 72, 124), + EntranceCoord("witch", 0x65, 72, 50), + EntranceCoord("toadstool_entrance:inside", 0x2bd, 80, 124), + EntranceCoord("toadstool_entrance", 0x62, 120, 66), + EntranceCoord("toadstool_exit", 0x50, 136, 50), + EntranceCoord("toadstool_exit:inside", 0x2ab, 80, 124), + EntranceCoord("prairie_madbatter:inside", 0x1e0, 136, 112), + EntranceCoord("hookshot_cave", 0x42, 56, 66), + EntranceCoord("castle_upper_right:inside", 0x2d6, 80, 124), + EntranceCoord("forest_madbatter", 0x52, 104, 48), + EntranceCoord("writes_phone:inside", 0x29b, 80, 124), + EntranceCoord("writes_phone", 0x31, 104, 82), + EntranceCoord("d0:inside", 0x312, 80, 92), + EntranceCoord("writes_house", 0x30, 120, 50), + EntranceCoord("writes_cave_left:inside", 0x2ae, 80, 124), + EntranceCoord("writes_cave_left", 0x20, 136, 50), + EntranceCoord("writes_cave_right:inside", 0x2af, 80, 124), + EntranceCoord("writes_cave_right", 0x21, 24, 50), + EntranceCoord("d6:inside", 0x1d4, 80, 124), + EntranceCoord("d2", 0x24, 56, 34), + EntranceCoord("animal_house5:inside", 0x2d7, 80, 124), + EntranceCoord("moblin_cave", 0x35, 104, 80), + EntranceCoord("crazy_tracy:inside", 0x2ad, 80, 124), + EntranceCoord("crazy_tracy", 0x45, 136, 66), + EntranceCoord("photo_house:inside", 0x2b5, 80, 124), + EntranceCoord("photo_house", 0x37, 72, 66), + EntranceCoord("obstacle_cave_entrance:inside", 0x2b6, 80, 124), + EntranceCoord("obstacle_cave_entrance", 0x17, 56, 50), + EntranceCoord("left_to_right_taltalentrance:inside", 0x2ee, 120, 48), + EntranceCoord("left_to_right_taltalentrance", 0x7, 56, 80), + EntranceCoord("obstacle_cave_outside_chest:inside", 0x2bb, 80, 124), + EntranceCoord("obstacle_cave_outside_chest", 0x18, 104, 18), + EntranceCoord("obstacle_cave_exit:inside", 0x2bc, 48, 124), + EntranceCoord("obstacle_cave_exit", 0x18, 136, 18), + EntranceCoord("papahl_entrance:inside", 0x289, 64, 124), + EntranceCoord("papahl_entrance", 0x19, 136, 64), + EntranceCoord("papahl_exit:inside", 0x28b, 80, 124), + EntranceCoord("papahl_exit", 0xa, 24, 112), + EntranceCoord("rooster_house:inside", 0x29f, 80, 124), + EntranceCoord("rooster_house", 0xa, 72, 34), + EntranceCoord("d7:inside", 0x20e, 80, 124), + EntranceCoord("bird_cave", 0xa, 120, 112), + EntranceCoord("multichest_top:inside", 0x2f2, 80, 124), + EntranceCoord("multichest_top", 0xd, 24, 112), + EntranceCoord("multichest_left:inside", 0x2f9, 32, 124), + EntranceCoord("multichest_left", 0x1d, 24, 48), + EntranceCoord("multichest_right:inside", 0x2fa, 112, 124), + EntranceCoord("multichest_right", 0x1d, 120, 80), + EntranceCoord("right_taltal_connector1:inside", 0x280, 32, 124), + EntranceCoord("right_taltal_connector1", 0x1e, 56, 16), + EntranceCoord("right_taltal_connector3:inside", 0x283, 128, 124), + EntranceCoord("right_taltal_connector3", 0x1e, 120, 16), + EntranceCoord("right_taltal_connector2:inside", 0x282, 112, 124), + EntranceCoord("right_taltal_connector2", 0x1f, 40, 16), + EntranceCoord("right_fairy:inside", 0x1fb, 80, 124), + EntranceCoord("right_fairy", 0x1f, 56, 80), + EntranceCoord("right_taltal_connector4:inside", 0x287, 96, 124), + EntranceCoord("right_taltal_connector4", 0x1f, 88, 64), + EntranceCoord("right_taltal_connector5:inside", 0x28c, 96, 124), + EntranceCoord("right_taltal_connector5", 0x1f, 120, 16), + EntranceCoord("right_taltal_connector6:inside", 0x28e, 112, 124), + EntranceCoord("right_taltal_connector6", 0xf, 72, 80), + EntranceCoord("d7", 0x0e, 88, 48), + EntranceCoord("left_taltal_entrance:inside", 0x2ea, 80, 124), + EntranceCoord("left_taltal_entrance", 0x15, 136, 64), + EntranceCoord("castle_jump_cave:inside", 0x1fd, 88, 80), + EntranceCoord("madbatter_taltal", 0x4, 120, 112), + EntranceCoord("fire_cave_exit:inside", 0x1ee, 24, 64), + EntranceCoord("fire_cave_exit", 0x3, 72, 80), + EntranceCoord("fire_cave_entrance:inside", 0x1fe, 112, 124), + EntranceCoord("fire_cave_entrance", 0x13, 88, 16), + EntranceCoord("phone_d8:inside", 0x299, 80, 124), + EntranceCoord("phone_d8", 0x11, 104, 50), + EntranceCoord("kennel:inside", 0x2b2, 80, 124), + EntranceCoord("d8", 0x10, 88, 16), + EntranceCoord("d8:inside", 0x25d, 80, 124), +] + +entrance_lookup = {str(coord): coord for coord in entrance_coords} From 0f738935ee4cfce6d54a471e4a393ac69812aad8 Mon Sep 17 00:00:00 2001 From: Justus Lind Date: Sat, 8 Mar 2025 23:58:26 +1000 Subject: [PATCH 073/227] Muse Dash: Update song list to Cosmic Radio. (#4554) * MSR Anthology Vol.2 update * Missing new line. * Update to Cosmic Radio 2024 --- worlds/musedash/MuseDashCollection.py | 3 ++- worlds/musedash/MuseDashData.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/worlds/musedash/MuseDashCollection.py b/worlds/musedash/MuseDashCollection.py index 64aa6ca49a..8bad02f2dc 100644 --- a/worlds/musedash/MuseDashCollection.py +++ b/worlds/musedash/MuseDashCollection.py @@ -24,9 +24,10 @@ class MuseDashCollections: MUSE_PLUS_DLC, "CHUNITHM COURSE MUSE", # Part of Muse Plus. Goes away 22nd May 2027. "maimai DX Limited-time Suite", # Part of Muse Plus. Goes away 31st Jan 2026. - "MSR Anthology", # Now no longer available. + "MSR Anthology", # Goes away January 26, 2026. "Miku in Museland", # Paid DLC not included in Muse Plus "Rin Len's Mirrorland", # Paid DLC not included in Muse Plus + "MSR Anthology_Vol.02", # Goes away January 26, 2026. ] REMOVED_SONGS = [ diff --git a/worlds/musedash/MuseDashData.py b/worlds/musedash/MuseDashData.py index 1700f956aa..d8efadd136 100644 --- a/worlds/musedash/MuseDashData.py +++ b/worlds/musedash/MuseDashData.py @@ -612,4 +612,19 @@ SONG_DATA: Dict[str, SongData] = { "Usagi Flap": SongData(2900736, "81-1", "MD-level Tactical Training Blu-ray", False, 3, 6, 8), "RE Aoharu": SongData(2900737, "81-2", "MD-level Tactical Training Blu-ray", False, 3, 5, 8), "Operation*DOTABATA!": SongData(2900738, "81-3", "MD-level Tactical Training Blu-ray", False, 5, 7, 10), + "Break Through the Dome": SongData(2900739, "82-0", "MSR Anthology_Vol.02", False, 5, 7, 9), + "Here in Vernal Terrene": SongData(2900740, "82-1", "MSR Anthology_Vol.02", False, 3, 5, 7), + "Everything's Alright": SongData(2900741, "82-2", "MSR Anthology_Vol.02", False, 3, 5, 8), + "Operation Ashring": SongData(2900742, "82-3", "MSR Anthology_Vol.02", False, 3, 5, 7), + "Misty Memory Day Version": SongData(2900743, "82-4", "MSR Anthology_Vol.02", False, 3, 5, 7), + "Misty Memory Night Version": SongData(2900744, "82-5", "MSR Anthology_Vol.02", False, 2, 6, 9), + "Arsonist": SongData(2900745, "82-6", "MSR Anthology_Vol.02", False, 3, 6, 8), + "Operation Deepness": SongData(2900746, "82-7", "MSR Anthology_Vol.02", False, 2, 4, 6), + "ALL!!!": SongData(2900747, "82-8", "MSR Anthology_Vol.02", False, 6, 8, 10), + "LUNATiC CiRCUiT": SongData(2900748, "83-0", "Cosmic Radio 2024", False, 7, 9, 11), + "Synthesis.": SongData(2900749, "83-1", "Cosmic Radio 2024", True, 6, 8, 10), + "COSMiC FANFARE!!!!": SongData(2900750, "83-2", "Cosmic Radio 2024", False, 7, 9, 11), + "Sharp Bubbles": SongData(2900751, "83-3", "Cosmic Radio 2024", True, 7, 9, 11), + "Replay": SongData(2900752, "83-4", "Cosmic Radio 2024", True, 5, 7, 9), + "Cosmic Dusty Girl": SongData(2900753, "83-5", "Cosmic Radio 2024", True, 5, 7, 9), } From 3f8e3082c0e0eba30d409d3c3b1f748d7e8762d3 Mon Sep 17 00:00:00 2001 From: JaredWeakStrike <96694163+JaredWeakStrike@users.noreply.github.com> Date: Sat, 8 Mar 2025 08:58:59 -0500 Subject: [PATCH 074/227] KH2: Client Optimizations and some QoL (#4547) * adding qwints suggestions * add stat increase protection and ingame yml stuff * idk how I forgot these * reword things * Update worlds/kh2/Client.py Co-authored-by: qwint * 3.12 compat * too long of a line * why didnt I do this before lol * reading is hard * missed one * forgot the self * fix crash if you get datapackage that isnt kh2 * update to main? * update to use 0.10 as base and fix violet's base 0 on hex values * reverting this because I'm bad at my job --------- Co-authored-by: qwint --- worlds/kh2/Client.py | 143 +++++++++++++++++++++++-------------------- worlds/kh2/OpenKH.py | 62 ++++++++++++++++++- 2 files changed, 136 insertions(+), 69 deletions(-) diff --git a/worlds/kh2/Client.py b/worlds/kh2/Client.py index a21c8c7c55..15a103c2a1 100644 --- a/worlds/kh2/Client.py +++ b/worlds/kh2/Client.py @@ -1,4 +1,5 @@ import ModuleUpdate +import Utils ModuleUpdate.update() @@ -23,6 +24,7 @@ class KH2Context(CommonContext): def __init__(self, server_address, password): super(KH2Context, self).__init__(server_address, password) + self.goofy_ability_to_slot = dict() self.donald_ability_to_slot = dict() self.all_weapon_location_id = None @@ -35,6 +37,7 @@ class KH2Context(CommonContext): self.serverconneced = False self.item_name_to_data = {name: data for name, data, in item_dictionary_table.items()} self.location_name_to_data = {name: data for name, data, in all_locations.items()} + self.kh2_data_package = {} self.kh2_loc_name_to_id = None self.kh2_item_name_to_id = None self.lookup_id_to_item = None @@ -83,6 +86,8 @@ class KH2Context(CommonContext): }, } self.kh2seedname = None + self.kh2_seed_save_path_join = None + self.kh2slotdata = None self.mem_json = None self.itemamount = {} @@ -114,26 +119,18 @@ class KH2Context(CommonContext): # 255: {}, # starting screen } self.last_world_int = -1 - # 0x2A09C00+0x40 is the sve anchor. +1 is the last saved room - # self.sveroom = 0x2A09C00 + 0x41 - # 0 not in battle 1 in yellow battle 2 red battle #short - # self.inBattle = 0x2A0EAC4 + 0x40 - # self.onDeath = 0xAB9078 # PC Address anchors - # self.Now = 0x0714DB8 old address - # epic addresses + # epic .10 addresses self.Now = 0x0716DF8 - self.Save = 0x09A92F0 + self.Save = 0x9A9330 self.Journal = 0x743260 self.Shop = 0x743350 - self.Slot1 = 0x2A22FD8 - # self.Sys3 = 0x2A59DF0 - # self.Bt10 = 0x2A74880 - # self.BtlEnd = 0x2A0D3E0 - # self.Slot1 = 0x2A20C98 old address + self.Slot1 = 0x2A23018 self.kh2_game_version = None # can be egs or steam + self.kh2_seed_save_path = None + self.chest_set = set(exclusion_table["Chests"]) self.keyblade_set = set(CheckDupingItems["Weapons"]["Keyblades"]) self.staff_set = set(CheckDupingItems["Weapons"]["Staffs"]) @@ -194,8 +191,7 @@ class KH2Context(CommonContext): self.kh2connected = False self.serverconneced = False if self.kh2seedname is not None and self.auth is not None: - with open(os.path.join(self.game_communication_path, f"kh2save2{self.kh2seedname}{self.auth}.json"), - 'w') as f: + with open(self.kh2_seed_save_path_join, 'w') as f: f.write(json.dumps(self.kh2_seed_save, indent=4)) await super(KH2Context, self).connection_closed() @@ -203,8 +199,7 @@ class KH2Context(CommonContext): self.kh2connected = False self.serverconneced = False if self.kh2seedname not in {None} and self.auth not in {None}: - with open(os.path.join(self.game_communication_path, f"kh2save2{self.kh2seedname}{self.auth}.json"), - 'w') as f: + with open(self.kh2_seed_save_path_join, 'w') as f: f.write(json.dumps(self.kh2_seed_save, indent=4)) await super(KH2Context, self).disconnect() @@ -217,8 +212,7 @@ class KH2Context(CommonContext): async def shutdown(self): if self.kh2seedname not in {None} and self.auth not in {None}: - with open(os.path.join(self.game_communication_path, f"kh2save2{self.kh2seedname}{self.auth}.json"), - 'w') as f: + with open(self.kh2_seed_save_path_join, 'w') as f: f.write(json.dumps(self.kh2_seed_save, indent=4)) await super(KH2Context, self).shutdown() @@ -232,7 +226,7 @@ class KH2Context(CommonContext): return self.kh2.write_bytes(self.kh2.base_address + address, value.to_bytes(1, 'big'), 1) def kh2_read_byte(self, address): - return int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + address, 1), "big") + return int.from_bytes(self.kh2.read_bytes(self.kh2.base_address + address, 1)) def kh2_read_int(self, address): return self.kh2.read_int(self.kh2.base_address + address) @@ -244,11 +238,14 @@ class KH2Context(CommonContext): return self.kh2.read_string(self.kh2.base_address + address, length) def on_package(self, cmd: str, args: dict): - if cmd in {"RoomInfo"}: + if cmd == "RoomInfo": self.kh2seedname = args['seed_name'] + self.kh2_seed_save_path = f"kh2save2{self.kh2seedname}{self.auth}.json" + self.kh2_seed_save_path_join = os.path.join(self.game_communication_path, self.kh2_seed_save_path) + if not os.path.exists(self.game_communication_path): os.makedirs(self.game_communication_path) - if not os.path.exists(self.game_communication_path + f"\kh2save2{self.kh2seedname}{self.auth}.json"): + if not os.path.exists(self.kh2_seed_save_path_join): self.kh2_seed_save = { "Levels": { "SoraLevel": 0, @@ -261,12 +258,11 @@ class KH2Context(CommonContext): }, "SoldEquipment": [], } - with open(os.path.join(self.game_communication_path, f"kh2save2{self.kh2seedname}{self.auth}.json"), - 'wt') as f: + with open(self.kh2_seed_save_path_join, 'wt') as f: pass # self.locations_checked = set() - elif os.path.exists(self.game_communication_path + f"\kh2save2{self.kh2seedname}{self.auth}.json"): - with open(self.game_communication_path + f"\kh2save2{self.kh2seedname}{self.auth}.json", 'r') as f: + elif os.path.exists(self.kh2_seed_save_path_join): + with open(self.kh2_seed_save_path_join) as f: self.kh2_seed_save = json.load(f) if self.kh2_seed_save is None: self.kh2_seed_save = { @@ -284,13 +280,22 @@ class KH2Context(CommonContext): # self.locations_checked = set(self.kh2_seed_save_cache["LocationsChecked"]) # self.serverconneced = True - if cmd in {"Connected"}: - asyncio.create_task(self.send_msgs([{"cmd": "GetDataPackage", "games": ["Kingdom Hearts 2"]}])) + if cmd == "Connected": self.kh2slotdata = args['slot_data'] - # self.kh2_local_items = {int(location): item for location, item in self.kh2slotdata["LocalItems"].items()} + + self.kh2_data_package = Utils.load_data_package_for_checksum( + "Kingdom Hearts 2", self.checksums["Kingdom Hearts 2"]) + + if "location_name_to_id" in self.kh2_data_package: + self.data_package_kh2_cache( + self.kh2_data_package["location_name_to_id"], self.kh2_data_package["item_name_to_id"]) + self.connect_to_game() + else: + asyncio.create_task(self.send_msgs([{"cmd": "GetDataPackage", "games": ["Kingdom Hearts 2"]}])) + self.locations_checked = set(args["checked_locations"]) - if cmd in {"ReceivedItems"}: + if cmd == "ReceivedItems": # 0x2546 # 0x2658 # 0x276A @@ -338,42 +343,44 @@ class KH2Context(CommonContext): for item in args['items']: asyncio.create_task(self.give_item(item.item, item.location)) - if cmd in {"RoomUpdate"}: + if cmd == "RoomUpdate": if "checked_locations" in args: new_locations = set(args["checked_locations"]) self.locations_checked |= new_locations - if cmd in {"DataPackage"}: + if cmd == "DataPackage": if "Kingdom Hearts 2" in args["data"]["games"]: - self.data_package_kh2_cache(args) - if "KeybladeAbilities" in self.kh2slotdata.keys(): - # sora ability to slot - self.AbilityQuantityDict.update(self.kh2slotdata["KeybladeAbilities"]) - # itemid:[slots that are available for that item] - self.AbilityQuantityDict.update(self.kh2slotdata["StaffAbilities"]) - self.AbilityQuantityDict.update(self.kh2slotdata["ShieldAbilities"]) + self.data_package_kh2_cache( + args["data"]["games"]["Kingdom Hearts 2"]["location_name_to_id"], + args["data"]["games"]["Kingdom Hearts 2"]["item_name_to_id"]) + self.connect_to_game() + asyncio.create_task(self.send_msgs([{'cmd': 'Sync'}])) - all_weapon_location_id = [] - for weapon_location in all_weapon_slot: - all_weapon_location_id.append(self.kh2_loc_name_to_id[weapon_location]) - self.all_weapon_location_id = set(all_weapon_location_id) + def connect_to_game(self): + if "KeybladeAbilities" in self.kh2slotdata.keys(): + # sora ability to slot + self.AbilityQuantityDict.update(self.kh2slotdata["KeybladeAbilities"]) + # itemid:[slots that are available for that item] + self.AbilityQuantityDict.update(self.kh2slotdata["StaffAbilities"]) + self.AbilityQuantityDict.update(self.kh2slotdata["ShieldAbilities"]) - try: - if not self.kh2: - self.kh2 = pymem.Pymem(process_name="KINGDOM HEARTS II FINAL MIX") - self.get_addresses() + self.all_weapon_location_id = {self.kh2_loc_name_to_id[loc] for loc in all_weapon_slot} - except Exception as e: - if self.kh2connected: - self.kh2connected = False - logger.info("Game is not open.") - self.serverconneced = True - asyncio.create_task(self.send_msgs([{'cmd': 'Sync'}])) + try: + if not self.kh2: + self.kh2 = pymem.Pymem(process_name="KINGDOM HEARTS II FINAL MIX") + self.get_addresses() - def data_package_kh2_cache(self, args): - self.kh2_loc_name_to_id = args["data"]["games"]["Kingdom Hearts 2"]["location_name_to_id"] + except Exception as e: + if self.kh2connected: + self.kh2connected = False + logger.info("Game is not open.") + self.serverconneced = True + + def data_package_kh2_cache(self, loc_to_id, item_to_id): + self.kh2_loc_name_to_id = loc_to_id self.lookup_id_to_location = {v: k for k, v in self.kh2_loc_name_to_id.items()} - self.kh2_item_name_to_id = args["data"]["games"]["Kingdom Hearts 2"]["item_name_to_id"] + self.kh2_item_name_to_id = item_to_id self.lookup_id_to_item = {v: k for k, v in self.kh2_item_name_to_id.items()} self.ability_code_list = [self.kh2_item_name_to_id[item] for item in exclusion_item_table["Ability"]] @@ -742,7 +749,8 @@ class KH2Context(CommonContext): for item_name in master_stat: amount_of_items = 0 amount_of_items += self.kh2_seed_save_cache["AmountInvo"]["StatIncrease"][item_name] - if self.kh2_read_byte(self.Slot1 + 0x1B2) >= 5: + # checking if they talked to the computer to give them these + if self.kh2_read_byte(self.Slot1 + 0x1B2) >= 5 and (self.kh2_read_byte(self.Save + 0x1D27) & 0x1 << 3) > 0: if item_name == ItemName.MaxHPUp: if self.kh2_read_byte(self.Save + 0x2498) < 3: # Non-Critical Bonus = 5 @@ -808,34 +816,33 @@ class KH2Context(CommonContext): def get_addresses(self): if not self.kh2connected and self.kh2 is not None: if self.kh2_game_version is None: - - if self.kh2_read_string(0x09A9830, 4) == "KH2J": + # current verions is .10 then runs the get from github stuff + if self.kh2_read_string(0x9A98B0, 4) == "KH2J": self.kh2_game_version = "STEAM" self.Now = 0x0717008 - self.Save = 0x09A9830 - self.Slot1 = 0x2A23518 + self.Save = 0x09A98B0 + self.Slot1 = 0x2A23598 self.Journal = 0x7434E0 self.Shop = 0x7435D0 - elif self.kh2_read_string(0x09A92F0, 4) == "KH2J": + elif self.kh2_read_string(0x9A9330, 4) == "KH2J": self.kh2_game_version = "EGS" else: if self.game_communication_path: - logger.info("Checking with most up to date addresses of github. If file is not found will be downloading datafiles. This might take a moment") + logger.info("Checking with most up to date addresses from the addresses json.") #if mem addresses file is found then check version and if old get new one - kh2memaddresses_path = os.path.join(self.game_communication_path, f"kh2memaddresses.json") + kh2memaddresses_path = os.path.join(self.game_communication_path, "kh2memaddresses.json") if not os.path.exists(kh2memaddresses_path): + logger.info("File is not found. Downloading json with memory addresses. This might take a moment") mem_resp = requests.get("https://raw.githubusercontent.com/JaredWeakStrike/KH2APMemoryValues/master/kh2memaddresses.json") if mem_resp.status_code == 200: self.mem_json = json.loads(mem_resp.content) - with open(kh2memaddresses_path, - 'w') as f: + with open(kh2memaddresses_path, 'w') as f: f.write(json.dumps(self.mem_json, indent=4)) else: - with open(kh2memaddresses_path, 'r') as f: + with open(kh2memaddresses_path) as f: self.mem_json = json.load(f) if self.mem_json: for key in self.mem_json.keys(): - if self.kh2_read_string(int(self.mem_json[key]["GameVersionCheck"], 0), 4) == "KH2J": self.Now = int(self.mem_json[key]["Now"], 0) self.Save = int(self.mem_json[key]["Save"], 0) diff --git a/worlds/kh2/OpenKH.py b/worlds/kh2/OpenKH.py index 17d7f84e8c..7226525d0c 100644 --- a/worlds/kh2/OpenKH.py +++ b/worlds/kh2/OpenKH.py @@ -368,6 +368,37 @@ def patch_kh2(self, output_directory): } ] }, + { + 'name': 'msg/us/he.bar', + 'multi': [ + { + 'name': 'msg/fr/he.bar' + }, + { + 'name': 'msg/gr/he.bar' + }, + { + 'name': 'msg/it/he.bar' + }, + { + 'name': 'msg/sp/he.bar' + } + ], + 'method': 'binarc', + 'source': [ + { + 'name': 'he', + 'type': 'list', + 'method': 'kh2msg', + 'source': [ + { + 'name': 'he.yml', + 'language': 'en' + } + ] + } + ] + }, ], 'title': 'Randomizer Seed' } @@ -411,6 +442,34 @@ def patch_kh2(self, output_directory): 'en': f"Your Level Depth is {self.options.LevelDepth.current_option_name}" } ] + self.fight_and_form_text = [ + { + 'id': 15121, # poster name + 'en': f"Game Options" + }, + { + 'id': 15122, + 'en': f"Fight Logic is {self.options.FightLogic.current_option_name}\n" + f"Auto Form Logic is {self.options.AutoFormLogic.current_option_name}\n" + f"Final Form Logic is {self.options.FinalFormLogic.current_option_name}" + } + + ] + self.cups_text = [ + { + 'id': 4043, + 'en': f"CupsToggle: {self.options.Cups.current_option_name}" + }, + { + 'id': 4044, + 'en': f"CupsToggle: {self.options.Cups.current_option_name}" + }, + { + 'id': 4045, + 'en': f"CupsToggle: {self.options.Cups.current_option_name}" + }, + ] + mod_dir = os.path.join(output_directory, mod_name + "_" + Utils.__version__) self.mod_yml["title"] = f"Randomizer Seed {mod_name}" @@ -423,7 +482,8 @@ def patch_kh2(self, output_directory): "FmlvList.yml": yaml.dump(self.formattedFmlv, line_break="\n"), "mod.yml": yaml.dump(self.mod_yml, line_break="\n"), "po.yml": yaml.dump(self.pooh_text, line_break="\n"), - "sys.yml": yaml.dump(self.level_depth_text, line_break="\n"), + "sys.yml": yaml.dump(self.level_depth_text + self.fight_and_form_text, line_break="\n"), + "he.yml": yaml.dump(self.cups_text, line_break="\n") } mod = KH2Container(openkhmod, mod_dir, output_directory, self.player, From d4e2698ae0d58ebb05fd041d9d21dbd2affaa978 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Sat, 8 Mar 2025 09:56:29 -0500 Subject: [PATCH 075/227] TUNIC: Add exception handling to deal with duplicate apworlds (#4634) * Add exception handling to deal with duplicate apworlds * Update worlds/tunic/__init__.py --- worlds/tunic/__init__.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index 2ee58d42d1..250f6706f1 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -110,6 +110,13 @@ class TunicWorld(World): ut_can_gen_without_yaml = True # class var that tells it to ignore the player yaml def generate_early(self) -> None: + try: + int(self.settings.disable_local_spoiler) + except AttributeError: + raise Exception("You have a TUNIC APWorld in your lib/worlds folder and custom_worlds folder.\n" + "This would cause an error at the end of generation.\n" + "Please remove one of them, most likely the one in lib/worlds.") + check_options(self) if self.options.logic_rules >= LogicRules.option_no_major_glitches: From 414ab8642251101f657cc389c42fd5a664b29ff5 Mon Sep 17 00:00:00 2001 From: CaitSith2 Date: Sat, 8 Mar 2025 07:13:32 -0800 Subject: [PATCH 076/227] LttP: Fix dungeon counter options. (#4704) --- worlds/alttp/Rom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py index 73a77b03f5..f658b930d0 100644 --- a/worlds/alttp/Rom.py +++ b/worlds/alttp/Rom.py @@ -1547,9 +1547,9 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x18003B, 0x01 if world.map_shuffle[player] else 0x00) # maps showing crystals on overworld # compasses showing dungeon count - if local_world.clock_mode or not world.dungeon_counters[player]: + if local_world.clock_mode or world.dungeon_counters[player] == 'off': rom.write_byte(0x18003C, 0x00) # Currently must be off if timer is on, because they use same HUD location - elif world.dungeon_counters[player] is True: + elif world.dungeon_counters[player] == 'on': rom.write_byte(0x18003C, 0x02) # always on elif world.compass_shuffle[player] or world.dungeon_counters[player] == 'pickup': rom.write_byte(0x18003C, 0x01) # show on pickup From ea8a14b00371a58196e0354453008cdb5238ffcd Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Sat, 8 Mar 2025 07:13:58 -0800 Subject: [PATCH 077/227] Pokemon Emerald: Some dexsanity locations contribute evolution items (#3187) * Pokemon Emerald: Change some dexsanity vanilla items to evo items If a species evolves via item use (Fire Stone, Metal Coat, etc.), use that as it's vanilla item instead of a ball * Pokemon Emerald: Remove accidentally added print * Pokemon Emerald: Update changelog * Pokemon Emerald: Adjust changelog * Pokemon Emerald: Remove unnecessary else * Pokemon Emerald: Fix changelog --- worlds/pokemon_emerald/data.py | 51 ++++++++++++---------------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/worlds/pokemon_emerald/data.py b/worlds/pokemon_emerald/data.py index cd1becf44b..1985726283 100644 --- a/worlds/pokemon_emerald/data.py +++ b/worlds/pokemon_emerald/data.py @@ -215,34 +215,9 @@ class EvolutionMethodEnum(IntEnum): FRIENDSHIP_NIGHT = 11 -def _str_to_evolution_method(string: str) -> EvolutionMethodEnum: - if string == "LEVEL": - return EvolutionMethodEnum.LEVEL - if string == "LEVEL_ATK_LT_DEF": - return EvolutionMethodEnum.LEVEL_ATK_LT_DEF - if string == "LEVEL_ATK_EQ_DEF": - return EvolutionMethodEnum.LEVEL_ATK_EQ_DEF - if string == "LEVEL_ATK_GT_DEF": - return EvolutionMethodEnum.LEVEL_ATK_GT_DEF - if string == "LEVEL_SILCOON": - return EvolutionMethodEnum.LEVEL_SILCOON - if string == "LEVEL_CASCOON": - return EvolutionMethodEnum.LEVEL_CASCOON - if string == "LEVEL_NINJASK": - return EvolutionMethodEnum.LEVEL_NINJASK - if string == "LEVEL_SHEDINJA": - return EvolutionMethodEnum.LEVEL_SHEDINJA - if string == "FRIENDSHIP": - return EvolutionMethodEnum.FRIENDSHIP - if string == "FRIENDSHIP_DAY": - return EvolutionMethodEnum.FRIENDSHIP_DAY - if string == "FRIENDSHIP_NIGHT": - return EvolutionMethodEnum.FRIENDSHIP_NIGHT - - class EvolutionData(NamedTuple): method: EvolutionMethodEnum - param: int + param: int # Level/item id/friendship/etc.; depends on method species_id: int @@ -959,7 +934,7 @@ def _init() -> None: (species_data["types"][0], species_data["types"][1]), (species_data["abilities"][0], species_data["abilities"][1]), [EvolutionData( - _str_to_evolution_method(evolution_json["method"]), + EvolutionMethodEnum[evolution_json["method"]], evolution_json["param"], evolution_json["species"], ) for evolution_json in species_data["evolutions"]], @@ -977,24 +952,34 @@ def _init() -> None: data.species[evolution.species_id].pre_evolution = species.species_id # Replace default item for dex entry locations based on evo stage of species - evo_stage_to_ball_map = { + evo_stage_to_ball_map: Dict[int, int] = { 0: data.constants["ITEM_POKE_BALL"], 1: data.constants["ITEM_GREAT_BALL"], 2: data.constants["ITEM_ULTRA_BALL"], } + for species in data.species.values(): - evo_stage = 0 + default_item: Optional[int] = None pre_evolution = species.pre_evolution - while pre_evolution is not None: - evo_stage += 1 - pre_evolution = data.species[pre_evolution].pre_evolution + + if pre_evolution is not None: + evo_data = next(evo for evo in data.species[pre_evolution].evolutions if evo.species_id == species.species_id) + if evo_data.method == EvolutionMethodEnum.ITEM: + default_item = evo_data.param + + evo_stage = 0 + if default_item is None: + while pre_evolution is not None: + evo_stage += 1 + pre_evolution = data.species[pre_evolution].pre_evolution + default_item = evo_stage_to_ball_map[evo_stage] dex_location_name = f"POKEDEX_REWARD_{str(species.national_dex_number).zfill(3)}" data.locations[dex_location_name] = LocationData( data.locations[dex_location_name].name, data.locations[dex_location_name].label, data.locations[dex_location_name].parent_region, - evo_stage_to_ball_map[evo_stage], + default_item, data.locations[dex_location_name].address, data.locations[dex_location_name].flag, data.locations[dex_location_name].category, From 00a6ac3a52188238133aae336bec4b3a0876b254 Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Sat, 8 Mar 2025 07:14:25 -0800 Subject: [PATCH 078/227] BizHawkClient: Store seed name sent by the server for clients to check (#4702) --- worlds/_bizhawk/context.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/worlds/_bizhawk/context.py b/worlds/_bizhawk/context.py index accb5f94c4..21c54d30c7 100644 --- a/worlds/_bizhawk/context.py +++ b/worlds/_bizhawk/context.py @@ -41,6 +41,7 @@ class BizHawkClientCommandProcessor(ClientCommandProcessor): class BizHawkClientContext(CommonContext): command_processor = BizHawkClientCommandProcessor + server_seed_name: str | None = None auth_status: AuthStatus password_requested: bool client_handler: BizHawkClient | None @@ -68,6 +69,8 @@ class BizHawkClientContext(CommonContext): if cmd == "Connected": self.slot_data = args.get("slot_data", None) self.auth_status = AuthStatus.AUTHENTICATED + elif cmd == "RoomInfo": + self.server_seed_name = args.get("seed_name", None) if self.client_handler is not None: self.client_handler.on_package(self, cmd, args) @@ -100,6 +103,7 @@ class BizHawkClientContext(CommonContext): async def disconnect(self, allow_autoreconnect: bool=False): self.auth_status = AuthStatus.NOT_AUTHENTICATED + self.server_seed_name = None await super().disconnect(allow_autoreconnect) From b5269e9aa4526b0e6b179f2ac62689f7b9a216bb Mon Sep 17 00:00:00 2001 From: Kaito Sinclaire Date: Sat, 8 Mar 2025 07:37:54 -0800 Subject: [PATCH 079/227] id Tech Games: Customizable ammo capacity (#3565) * Doom, Doom 2, Heretic: customizable ammo capacity * Do not progression balance capacity up items * Prog fill still doesn't agree, just go with our original idea * Clean up the new options a bit - Gave all options a consistent and easily readable naming scheme (`max_ammo_` and `added_ammo_`) - Don't show the new options in the spoiler log, as they do not affect logic - Fix the Doom games' Split Backpack option accidentally referring to Heretic's Bag of Holding The logging change across all three games is incidental, as at some point I did run into that condition by happenstance and it turns out that it throws an exception due to bad formatting if it's reached * Do the visibility change for Heretic as well * Update required client version * Remove spoiler log restriction on options * Remove Visibility import now made redundant --- worlds/doom_1993/Items.py | 28 +++++++- worlds/doom_1993/Options.py | 91 ++++++++++++++++++++++++- worlds/doom_1993/__init__.py | 23 ++++++- worlds/doom_ii/Items.py | 28 +++++++- worlds/doom_ii/Options.py | 91 ++++++++++++++++++++++++- worlds/doom_ii/__init__.py | 27 +++++++- worlds/heretic/Items.py | 40 ++++++++++- worlds/heretic/Options.py | 127 ++++++++++++++++++++++++++++++++++- worlds/heretic/Rules.py | 4 +- worlds/heretic/__init__.py | 29 +++++++- 10 files changed, 469 insertions(+), 19 deletions(-) diff --git a/worlds/doom_1993/Items.py b/worlds/doom_1993/Items.py index 3c5124d4d5..3dce3e01e1 100644 --- a/worlds/doom_1993/Items.py +++ b/worlds/doom_1993/Items.py @@ -650,8 +650,8 @@ item_table: Dict[int, ItemDict] = { 'doom_type': 2006, 'episode': -1, 'map': -1}, - 350106: {'classification': ItemClassification.progression, - 'count': 1, + 350106: {'classification': ItemClassification.useful, + 'count': 0, 'name': 'Backpack', 'doom_type': 8, 'episode': -1, @@ -1160,6 +1160,30 @@ item_table: Dict[int, ItemDict] = { 'doom_type': 2026, 'episode': 4, 'map': 9}, + 350191: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Bullet capacity', + 'doom_type': 65001, + 'episode': -1, + 'map': -1}, + 350192: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Shell capacity', + 'doom_type': 65002, + 'episode': -1, + 'map': -1}, + 350193: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Energy cell capacity', + 'doom_type': 65003, + 'episode': -1, + 'map': -1}, + 350194: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Rocket capacity', + 'doom_type': 65004, + 'episode': -1, + 'map': -1}, } diff --git a/worlds/doom_1993/Options.py b/worlds/doom_1993/Options.py index c9c6111032..c741df3820 100644 --- a/worlds/doom_1993/Options.py +++ b/worlds/doom_1993/Options.py @@ -1,4 +1,4 @@ -from Options import PerGameCommonOptions, Choice, Toggle, DeathLink, DefaultOnToggle, StartInventoryPool +from Options import PerGameCommonOptions, Range, Choice, Toggle, DeathLink, DefaultOnToggle, StartInventoryPool from dataclasses import dataclass @@ -144,6 +144,84 @@ class Episode4(Toggle): display_name = "Episode 4" +class SplitBackpack(Toggle): + """Split the Backpack into four individual items, each one increasing ammo capacity for one type of weapon only.""" + display_name = "Split Backpack" + + +class BackpackCount(Range): + """How many Backpacks will be available. + If Split Backpack is set, this will be the number of each capacity upgrade available.""" + display_name = "Backpack Count" + range_start = 0 + range_end = 10 + default = 1 + + +class MaxAmmoBullets(Range): + """Set the starting ammo capacity for bullets.""" + display_name = "Max Ammo - Bullets" + range_start = 200 + range_end = 999 + default = 200 + + +class MaxAmmoShells(Range): + """Set the starting ammo capacity for shotgun shells.""" + display_name = "Max Ammo - Shells" + range_start = 50 + range_end = 999 + default = 50 + + +class MaxAmmoRockets(Range): + """Set the starting ammo capacity for rockets.""" + display_name = "Max Ammo - Rockets" + range_start = 50 + range_end = 999 + default = 50 + + +class MaxAmmoEnergyCells(Range): + """Set the starting ammo capacity for energy cells.""" + display_name = "Max Ammo - Energy Cells" + range_start = 300 + range_end = 999 + default = 300 + + +class AddedAmmoBullets(Range): + """Set the amount of bullet capacity added when collecting a backpack or capacity upgrade.""" + display_name = "Added Ammo - Bullets" + range_start = 20 + range_end = 999 + default = 200 + + +class AddedAmmoShells(Range): + """Set the amount of shotgun shell capacity added when collecting a backpack or capacity upgrade.""" + display_name = "Added Ammo - Shells" + range_start = 5 + range_end = 999 + default = 50 + + +class AddedAmmoRockets(Range): + """Set the amount of rocket capacity added when collecting a backpack or capacity upgrade.""" + display_name = "Added Ammo - Rockets" + range_start = 5 + range_end = 999 + default = 50 + + +class AddedAmmoEnergyCells(Range): + """Set the amount of energy cell capacity added when collecting a backpack or capacity upgrade.""" + display_name = "Added Ammo - Energy Cells" + range_start = 30 + range_end = 999 + default = 300 + + @dataclass class DOOM1993Options(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool @@ -163,3 +241,14 @@ class DOOM1993Options(PerGameCommonOptions): episode3: Episode3 episode4: Episode4 + split_backpack: SplitBackpack + backpack_count: BackpackCount + max_ammo_bullets: MaxAmmoBullets + max_ammo_shells: MaxAmmoShells + max_ammo_rockets: MaxAmmoRockets + max_ammo_energy_cells: MaxAmmoEnergyCells + added_ammo_bullets: AddedAmmoBullets + added_ammo_shells: AddedAmmoShells + added_ammo_rockets: AddedAmmoRockets + added_ammo_energy_cells: AddedAmmoEnergyCells + diff --git a/worlds/doom_1993/__init__.py b/worlds/doom_1993/__init__.py index b6138ae071..d459290f92 100644 --- a/worlds/doom_1993/__init__.py +++ b/worlds/doom_1993/__init__.py @@ -42,7 +42,7 @@ class DOOM1993World(World): options: DOOM1993Options game = "DOOM 1993" web = DOOM1993Web() - required_client_version = (0, 3, 9) + required_client_version = (0, 5, 0) # 1.2.0-prerelease or higher item_name_to_id = {data["name"]: item_id for item_id, data in Items.item_table.items()} item_name_groups = Items.item_name_groups @@ -204,6 +204,15 @@ class DOOM1993World(World): count = item["count"] if item["name"] not in self.starting_level_for_episode else item["count"] - 1 itempool += [self.create_item(item["name"]) for _ in range(count)] + # Backpack(s) based on options + if self.options.split_backpack.value: + itempool += [self.create_item("Bullet capacity") for _ in range(self.options.backpack_count.value)] + itempool += [self.create_item("Shell capacity") for _ in range(self.options.backpack_count.value)] + itempool += [self.create_item("Energy cell capacity") for _ in range(self.options.backpack_count.value)] + itempool += [self.create_item("Rocket capacity") for _ in range(self.options.backpack_count.value)] + else: + itempool += [self.create_item("Backpack") for _ in range(self.options.backpack_count.value)] + # Place end level items in locked locations for map_name in Maps.map_names: loc_name = map_name + " - Exit" @@ -265,7 +274,7 @@ class DOOM1993World(World): # Was balanced for 3 episodes (We added 4th episode, but keep same ratio) count = min(remaining_loc, max(1, int(round(self.items_ratio[item_name] * ep_count / 3)))) if count == 0: - logger.warning("Warning, no ", item_name, " will be placed.") + logger.warning(f"Warning, no {item_name} will be placed.") return for i in range(count): @@ -281,4 +290,14 @@ class DOOM1993World(World): # an older version, the player would end up stuck. slot_data["two_ways_keydoors"] = True + # Send slot data for ammo capacity values; this must be generic because Heretic uses it too + slot_data["ammo1start"] = self.options.max_ammo_bullets.value + slot_data["ammo2start"] = self.options.max_ammo_shells.value + slot_data["ammo3start"] = self.options.max_ammo_energy_cells.value + slot_data["ammo4start"] = self.options.max_ammo_rockets.value + slot_data["ammo1add"] = self.options.added_ammo_bullets.value + slot_data["ammo2add"] = self.options.added_ammo_shells.value + slot_data["ammo3add"] = self.options.added_ammo_energy_cells.value + slot_data["ammo4add"] = self.options.added_ammo_rockets.value + return slot_data diff --git a/worlds/doom_ii/Items.py b/worlds/doom_ii/Items.py index fc426cc883..009e6034cd 100644 --- a/worlds/doom_ii/Items.py +++ b/worlds/doom_ii/Items.py @@ -56,8 +56,8 @@ item_table: Dict[int, ItemDict] = { 'doom_type': 82, 'episode': -1, 'map': -1}, - 360007: {'classification': ItemClassification.progression, - 'count': 1, + 360007: {'classification': ItemClassification.useful, + 'count': 0, 'name': 'Backpack', 'doom_type': 8, 'episode': -1, @@ -1058,6 +1058,30 @@ item_table: Dict[int, ItemDict] = { 'doom_type': 2026, 'episode': 4, 'map': 2}, + 360600: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Bullet capacity', + 'doom_type': 65001, + 'episode': -1, + 'map': -1}, + 360601: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Shell capacity', + 'doom_type': 65002, + 'episode': -1, + 'map': -1}, + 360602: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Energy cell capacity', + 'doom_type': 65003, + 'episode': -1, + 'map': -1}, + 360603: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Rocket capacity', + 'doom_type': 65004, + 'episode': -1, + 'map': -1}, } diff --git a/worlds/doom_ii/Options.py b/worlds/doom_ii/Options.py index 98c8ebc56e..c8b0c9fb08 100644 --- a/worlds/doom_ii/Options.py +++ b/worlds/doom_ii/Options.py @@ -1,6 +1,6 @@ import typing -from Options import PerGameCommonOptions, Choice, Toggle, DeathLink, DefaultOnToggle, StartInventoryPool +from Options import PerGameCommonOptions, Range, Choice, Toggle, DeathLink, DefaultOnToggle, StartInventoryPool from dataclasses import dataclass @@ -136,6 +136,84 @@ class SecretLevels(Toggle): display_name = "Secret Levels" +class SplitBackpack(Toggle): + """Split the Backpack into four individual items, each one increasing ammo capacity for one type of weapon only.""" + display_name = "Split Backpack" + + +class BackpackCount(Range): + """How many Backpacks will be available. + If Split Backpack is set, this will be the number of each capacity upgrade available.""" + display_name = "Backpack Count" + range_start = 0 + range_end = 10 + default = 1 + + +class MaxAmmoBullets(Range): + """Set the starting ammo capacity for bullets.""" + display_name = "Max Ammo - Bullets" + range_start = 200 + range_end = 999 + default = 200 + + +class MaxAmmoShells(Range): + """Set the starting ammo capacity for shotgun shells.""" + display_name = "Max Ammo - Shells" + range_start = 50 + range_end = 999 + default = 50 + + +class MaxAmmoRockets(Range): + """Set the starting ammo capacity for rockets.""" + display_name = "Max Ammo - Rockets" + range_start = 50 + range_end = 999 + default = 50 + + +class MaxAmmoEnergyCells(Range): + """Set the starting ammo capacity for energy cells.""" + display_name = "Max Ammo - Energy Cells" + range_start = 300 + range_end = 999 + default = 300 + + +class AddedAmmoBullets(Range): + """Set the amount of bullet capacity added when collecting a backpack or capacity upgrade.""" + display_name = "Added Ammo - Bullets" + range_start = 20 + range_end = 999 + default = 200 + + +class AddedAmmoShells(Range): + """Set the amount of shotgun shell capacity added when collecting a backpack or capacity upgrade.""" + display_name = "Added Ammo - Shells" + range_start = 5 + range_end = 999 + default = 50 + + +class AddedAmmoRockets(Range): + """Set the amount of rocket capacity added when collecting a backpack or capacity upgrade.""" + display_name = "Added Ammo - Rockets" + range_start = 5 + range_end = 999 + default = 50 + + +class AddedAmmoEnergyCells(Range): + """Set the amount of energy cell capacity added when collecting a backpack or capacity upgrade.""" + display_name = "Added Ammo - Energy Cells" + range_start = 30 + range_end = 999 + default = 300 + + @dataclass class DOOM2Options(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool @@ -153,3 +231,14 @@ class DOOM2Options(PerGameCommonOptions): episode2: Episode2 episode3: Episode3 episode4: SecretLevels + + split_backpack: SplitBackpack + backpack_count: BackpackCount + max_ammo_bullets: MaxAmmoBullets + max_ammo_shells: MaxAmmoShells + max_ammo_rockets: MaxAmmoRockets + max_ammo_energy_cells: MaxAmmoEnergyCells + added_ammo_bullets: AddedAmmoBullets + added_ammo_shells: AddedAmmoShells + added_ammo_rockets: AddedAmmoRockets + added_ammo_energy_cells: AddedAmmoEnergyCells diff --git a/worlds/doom_ii/__init__.py b/worlds/doom_ii/__init__.py index 32c3cbd5a2..815e21419a 100644 --- a/worlds/doom_ii/__init__.py +++ b/worlds/doom_ii/__init__.py @@ -43,7 +43,7 @@ class DOOM2World(World): options: DOOM2Options game = "DOOM II" web = DOOM2Web() - required_client_version = (0, 3, 9) + required_client_version = (0, 5, 0) # 1.2.0-prerelease or higher item_name_to_id = {data["name"]: item_id for item_id, data in Items.item_table.items()} item_name_groups = Items.item_name_groups @@ -196,6 +196,15 @@ class DOOM2World(World): count = item["count"] if item["name"] not in self.starting_level_for_episode else item["count"] - 1 itempool += [self.create_item(item["name"]) for _ in range(count)] + # Backpack(s) based on options + if self.options.split_backpack.value: + itempool += [self.create_item("Bullet capacity") for _ in range(self.options.backpack_count.value)] + itempool += [self.create_item("Shell capacity") for _ in range(self.options.backpack_count.value)] + itempool += [self.create_item("Energy cell capacity") for _ in range(self.options.backpack_count.value)] + itempool += [self.create_item("Rocket capacity") for _ in range(self.options.backpack_count.value)] + else: + itempool += [self.create_item("Backpack") for _ in range(self.options.backpack_count.value)] + # Place end level items in locked locations for map_name in Maps.map_names: loc_name = map_name + " - Exit" @@ -258,11 +267,23 @@ class DOOM2World(World): # Was balanced based on DOOM 1993's first 3 episodes count = min(remaining_loc, max(1, int(round(self.items_ratio[item_name] * ep_count / 3)))) if count == 0: - logger.warning("Warning, no ", item_name, " will be placed.") + logger.warning(f"Warning, no {item_name} will be placed.") return for i in range(count): itempool.append(self.create_item(item_name)) def fill_slot_data(self) -> Dict[str, Any]: - return self.options.as_dict("difficulty", "random_monsters", "random_pickups", "random_music", "flip_levels", "allow_death_logic", "pro", "death_link", "reset_level_on_death", "episode1", "episode2", "episode3", "episode4") + slot_data = self.options.as_dict("difficulty", "random_monsters", "random_pickups", "random_music", "flip_levels", "allow_death_logic", "pro", "death_link", "reset_level_on_death", "episode1", "episode2", "episode3", "episode4") + + # Send slot data for ammo capacity values; this must be generic because Heretic uses it too + slot_data["ammo1start"] = self.options.max_ammo_bullets.value + slot_data["ammo2start"] = self.options.max_ammo_shells.value + slot_data["ammo3start"] = self.options.max_ammo_energy_cells.value + slot_data["ammo4start"] = self.options.max_ammo_rockets.value + slot_data["ammo1add"] = self.options.added_ammo_bullets.value + slot_data["ammo2add"] = self.options.added_ammo_shells.value + slot_data["ammo3add"] = self.options.added_ammo_energy_cells.value + slot_data["ammo4add"] = self.options.added_ammo_rockets.value + + return slot_data diff --git a/worlds/heretic/Items.py b/worlds/heretic/Items.py index a0907a3a30..777bf06cda 100644 --- a/worlds/heretic/Items.py +++ b/worlds/heretic/Items.py @@ -50,8 +50,8 @@ item_table: Dict[int, ItemDict] = { 'doom_type': 2004, 'episode': -1, 'map': -1}, - 370006: {'classification': ItemClassification.progression, - 'count': 1, + 370006: {'classification': ItemClassification.useful, + 'count': 0, 'name': 'Bag of Holding', 'doom_type': 8, 'episode': -1, @@ -1592,6 +1592,42 @@ item_table: Dict[int, ItemDict] = { 'doom_type': 35, 'episode': 5, 'map': 9}, + 370600: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Crystal Capacity', + 'doom_type': 65001, + 'episode': -1, + 'map': -1}, + 370601: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Ethereal Arrow Capacity', + 'doom_type': 65002, + 'episode': -1, + 'map': -1}, + 370602: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Claw Orb Capacity', + 'doom_type': 65003, + 'episode': -1, + 'map': -1}, + 370603: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Rune Capacity', + 'doom_type': 65004, + 'episode': -1, + 'map': -1}, + 370604: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Flame Orb Capacity', + 'doom_type': 65005, + 'episode': -1, + 'map': -1}, + 370605: {'classification': ItemClassification.useful, + 'count': 0, + 'name': 'Mace Sphere Capacity', + 'doom_type': 65006, + 'episode': -1, + 'map': -1}, } diff --git a/worlds/heretic/Options.py b/worlds/heretic/Options.py index 7d98207b0f..fe64f58783 100644 --- a/worlds/heretic/Options.py +++ b/worlds/heretic/Options.py @@ -1,4 +1,4 @@ -from Options import PerGameCommonOptions, Choice, Toggle, DeathLink, DefaultOnToggle, StartInventoryPool +from Options import PerGameCommonOptions, Range, Choice, Toggle, DeathLink, DefaultOnToggle, StartInventoryPool from dataclasses import dataclass @@ -144,6 +144,116 @@ class Episode5(Toggle): display_name = "Episode 5" +class SplitBagOfHolding(Toggle): + """Split the Bag of Holding into six individual items, each one increasing ammo capacity for one type of weapon only.""" + display_name = "Split Bag of Holding" + + +class BagOfHoldingCount(Range): + """How many Bags of Holding will be available. + If Split Bag of Holding is set, this will be the number of each capacity upgrade available.""" + display_name = "Bag of Holding Count" + range_start = 0 + range_end = 10 + default = 1 + + +class MaxAmmoCrystals(Range): + """Set the starting ammo capacity for crystals (Elven Wand ammo).""" + display_name = "Max Ammo - Crystals" + range_start = 100 + range_end = 999 + default = 100 + + +class MaxAmmoArrows(Range): + """Set the starting ammo capacity for arrows (Ethereal Crossbow ammo).""" + display_name = "Max Ammo - Arrows" + range_start = 50 + range_end = 999 + default = 50 + + +class MaxAmmoClawOrbs(Range): + """Set the starting ammo capacity for claw orbs (Dragon Claw ammo).""" + display_name = "Max Ammo - Claw Orbs" + range_start = 200 + range_end = 999 + default = 200 + + +class MaxAmmoRunes(Range): + """Set the starting ammo capacity for runes (Hellstaff ammo).""" + display_name = "Max Ammo - Runes" + range_start = 200 + range_end = 999 + default = 200 + + +class MaxAmmoFlameOrbs(Range): + """Set the starting ammo capacity for flame orbs (Phoenix Rod ammo).""" + display_name = "Max Ammo - Flame Orbs" + range_start = 20 + range_end = 999 + default = 20 + + +class MaxAmmoSpheres(Range): + """Set the starting ammo capacity for spheres (Firemace ammo).""" + display_name = "Max Ammo - Spheres" + range_start = 150 + range_end = 999 + default = 150 + + +class AddedAmmoCrystals(Range): + """Set the amount of crystal capacity gained when collecting a bag of holding or a capacity upgrade.""" + display_name = "Added Ammo - Crystals" + range_start = 10 + range_end = 999 + default = 100 + + +class AddedAmmoArrows(Range): + """Set the amount of arrow capacity gained when collecting a bag of holding or a capacity upgrade.""" + display_name = "Added Ammo - Arrows" + range_start = 5 + range_end = 999 + default = 50 + + +class AddedAmmoClawOrbs(Range): + """Set the amount of claw orb capacity gained when collecting a bag of holding or a capacity upgrade.""" + display_name = "Added Ammo - Claw Orbs" + range_start = 20 + range_end = 999 + default = 200 + + +class AddedAmmoRunes(Range): + """Set the amount of rune capacity gained when collecting a bag of holding or a capacity upgrade.""" + display_name = "Added Ammo - Runes" + range_start = 20 + range_end = 999 + default = 200 + + +class AddedAmmoFlameOrbs(Range): + """Set the amount of flame orb capacity gained when collecting a bag of holding or a capacity upgrade.""" + display_name = "Added Ammo - Flame Orbs" + range_start = 2 + range_end = 999 + default = 20 + + +class AddedAmmoSpheres(Range): + """Set the amount of sphere capacity gained when collecting a bag of holding or a capacity upgrade.""" + display_name = "Added Ammo - Spheres" + range_start = 15 + range_end = 999 + default = 150 + + @dataclass class HereticOptions(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool @@ -163,3 +273,18 @@ class HereticOptions(PerGameCommonOptions): episode3: Episode3 episode4: Episode4 episode5: Episode5 + + split_bag_of_holding: SplitBagOfHolding + bag_of_holding_count: BagOfHoldingCount + max_ammo_crystals: MaxAmmoCrystals + max_ammo_arrows: MaxAmmoArrows + max_ammo_claw_orbs: MaxAmmoClawOrbs + max_ammo_runes: MaxAmmoRunes + max_ammo_flame_orbs: MaxAmmoFlameOrbs + max_ammo_spheres: MaxAmmoSpheres + added_ammo_crystals: AddedAmmoCrystals + added_ammo_arrows: AddedAmmoArrows + added_ammo_claw_orbs: AddedAmmoClawOrbs + added_ammo_runes: AddedAmmoRunes + added_ammo_flame_orbs: AddedAmmoFlameOrbs + added_ammo_spheres: AddedAmmoSpheres diff --git a/worlds/heretic/Rules.py b/worlds/heretic/Rules.py index 579fd8b771..492b8f38c6 100644 --- a/worlds/heretic/Rules.py +++ b/worlds/heretic/Rules.py @@ -695,13 +695,11 @@ def set_episode5_rules(player, multiworld, pro): state.has("Phoenix Rod", player, 1) and state.has("Firemace", player, 1) and state.has("Hellstaff", player, 1) and - state.has("Gauntlets of the Necromancer", player, 1) and - state.has("Bag of Holding", player, 1)) + state.has("Gauntlets of the Necromancer", player, 1)) # Skein of D'Sparil (E5M9) set_rule(multiworld.get_entrance("Hub -> Skein of D'Sparil (E5M9) Main", player), lambda state: state.has("Skein of D'Sparil (E5M9)", player, 1) and - state.has("Bag of Holding", player, 1) and state.has("Hellstaff", player, 1) and state.has("Phoenix Rod", player, 1) and state.has("Dragon Claw", player, 1) and diff --git a/worlds/heretic/__init__.py b/worlds/heretic/__init__.py index bc0a54698a..14b7ca49fe 100644 --- a/worlds/heretic/__init__.py +++ b/worlds/heretic/__init__.py @@ -41,7 +41,7 @@ class HereticWorld(World): options: HereticOptions game = "Heretic" web = HereticWeb() - required_client_version = (0, 3, 9) + required_client_version = (0, 5, 0) # 1.2.0-prerelease or higher item_name_to_id = {data["name"]: item_id for item_id, data in Items.item_table.items()} item_name_groups = Items.item_name_groups @@ -206,6 +206,17 @@ class HereticWorld(World): count = item["count"] if item["name"] not in self.starting_level_for_episode else item["count"] - 1 itempool += [self.create_item(item["name"]) for _ in range(count)] + # Bag(s) of Holding based on options + if self.options.split_bag_of_holding.value: + itempool += [self.create_item("Crystal Capacity") for _ in range(self.options.bag_of_holding_count.value)] + itempool += [self.create_item("Ethereal Arrow Capacity") for _ in range(self.options.bag_of_holding_count.value)] + itempool += [self.create_item("Claw Orb Capacity") for _ in range(self.options.bag_of_holding_count.value)] + itempool += [self.create_item("Rune Capacity") for _ in range(self.options.bag_of_holding_count.value)] + itempool += [self.create_item("Flame Orb Capacity") for _ in range(self.options.bag_of_holding_count.value)] + itempool += [self.create_item("Mace Sphere Capacity") for _ in range(self.options.bag_of_holding_count.value)] + else: + itempool += [self.create_item("Bag of Holding") for _ in range(self.options.bag_of_holding_count.value)] + # Place end level items in locked locations for map_name in Maps.map_names: loc_name = map_name + " - Exit" @@ -274,7 +285,7 @@ class HereticWorld(World): episode_count = self.get_episode_count() count = min(remaining_loc, max(1, self.items_ratio[item_name] * episode_count)) if count == 0: - logger.warning("Warning, no " + item_name + " will be placed.") + logger.warning(f"Warning, no {item_name} will be placed.") return for i in range(count): @@ -290,4 +301,18 @@ class HereticWorld(World): slot_data["episode4"] = self.included_episodes[3] slot_data["episode5"] = self.included_episodes[4] + # Send slot data for ammo capacity values; this must be generic because Doom uses it too + slot_data["ammo1start"] = self.options.max_ammo_crystals.value + slot_data["ammo2start"] = self.options.max_ammo_arrows.value + slot_data["ammo3start"] = self.options.max_ammo_claw_orbs.value + slot_data["ammo4start"] = self.options.max_ammo_runes.value + slot_data["ammo5start"] = self.options.max_ammo_flame_orbs.value + slot_data["ammo6start"] = self.options.max_ammo_spheres.value + slot_data["ammo1add"] = self.options.added_ammo_crystals.value + slot_data["ammo2add"] = self.options.added_ammo_arrows.value + slot_data["ammo3add"] = self.options.added_ammo_claw_orbs.value + slot_data["ammo4add"] = self.options.added_ammo_runes.value + slot_data["ammo5add"] = self.options.added_ammo_flame_orbs.value + slot_data["ammo6add"] = self.options.added_ammo_spheres.value + return slot_data From ee9bcb84b7fd5e642b667f9b715cf2520bc18c46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Sat, 8 Mar 2025 11:19:29 -0500 Subject: [PATCH 080/227] Stardew Valley: Move progressive tool options handling in features (#4374) * create tool progression feature and unwrap option * replace option usage with calling feature * add comment explaining why some logic is a weird place * replace item creation logic with feature * self review and add unit tests * rename test cuz I named them too long * add a test for the trash can useful stuff cuz I thought there was a bug but turns out it works * self review again * remove price_multiplier, turns out it's unused during generation * damn it 3.11 why are you like this * use blacksmith region when checking vanilla tools * fix rule * move can mine using in tool logic * remove changes to performance test * properly set the option I guess * properly set options 2 * that's what happen when you code too late --- worlds/stardew_valley/content/__init__.py | 18 ++++- .../content/feature/__init__.py | 1 + .../content/feature/tool_progression.py | 68 +++++++++++++++++ worlds/stardew_valley/content/game_content.py | 3 +- worlds/stardew_valley/early_items.py | 2 +- worlds/stardew_valley/items.py | 34 +++------ worlds/stardew_valley/locations.py | 4 +- worlds/stardew_valley/logic/mine_logic.py | 13 ++-- worlds/stardew_valley/logic/tool_logic.py | 27 +++++-- .../stardew_valley/mods/logic/item_logic.py | 3 +- worlds/stardew_valley/options/options.py | 8 ++ worlds/stardew_valley/rules.py | 25 +++---- .../stardew_valley/strings/entrance_names.py | 13 +++- worlds/stardew_valley/strings/region_names.py | 13 +++- worlds/stardew_valley/test/TestGeneration.py | 6 +- worlds/stardew_valley/test/TestOptionFlags.py | 12 +-- worlds/stardew_valley/test/TestOptions.py | 74 +++++++------------ .../stardew_valley/test/TestWalnutsanity.py | 6 +- .../stardew_valley/test/content/__init__.py | 1 + .../content/feature/TestToolProgression.py | 52 +++++++++++++ 20 files changed, 262 insertions(+), 121 deletions(-) create mode 100644 worlds/stardew_valley/content/feature/tool_progression.py create mode 100644 worlds/stardew_valley/test/content/feature/TestToolProgression.py diff --git a/worlds/stardew_valley/content/__init__.py b/worlds/stardew_valley/content/__init__.py index 54b4d75d5e..5308506437 100644 --- a/worlds/stardew_valley/content/__init__.py +++ b/worlds/stardew_valley/content/__init__.py @@ -1,5 +1,5 @@ from . import content_packs -from .feature import cropsanity, friendsanity, fishsanity, booksanity, skill_progression +from .feature import cropsanity, friendsanity, fishsanity, booksanity, skill_progression, tool_progression from .game_content import ContentPack, StardewContent, StardewFeatures from .unpacking import unpack_content from .. import options @@ -33,6 +33,7 @@ def choose_features(player_options: options.StardewValleyOptions) -> StardewFeat choose_fishsanity(player_options.fishsanity), choose_friendsanity(player_options.friendsanity, player_options.friendsanity_heart_size), choose_skill_progression(player_options.skill_progression), + choose_tool_progression(player_options.tool_progression, player_options.skill_progression), ) @@ -122,3 +123,18 @@ def choose_skill_progression(skill_progression_option: options.SkillProgression) raise ValueError(f"No skill progression feature mapped to {str(skill_progression_option.value)}") return skill_progression_feature + + +def choose_tool_progression(tool_option: options.ToolProgression, skill_option: options.SkillProgression) -> tool_progression.ToolProgressionFeature: + if tool_option.is_vanilla: + return tool_progression.ToolProgressionVanilla() + + tools_distribution = tool_progression.get_tools_distribution( + progressive_tools_enabled=True, + skill_masteries_enabled=skill_option == options.SkillProgression.option_progressive_with_masteries, + ) + + if tool_option.is_progressive: + return tool_progression.ToolProgressionProgressive(tools_distribution) + + raise ValueError(f"No tool progression feature mapped to {str(tool_option.value)}") diff --git a/worlds/stardew_valley/content/feature/__init__.py b/worlds/stardew_valley/content/feature/__init__.py index f3e5c6732e..eb23f8105b 100644 --- a/worlds/stardew_valley/content/feature/__init__.py +++ b/worlds/stardew_valley/content/feature/__init__.py @@ -3,3 +3,4 @@ from . import cropsanity from . import fishsanity from . import friendsanity from . import skill_progression +from . import tool_progression diff --git a/worlds/stardew_valley/content/feature/tool_progression.py b/worlds/stardew_valley/content/feature/tool_progression.py new file mode 100644 index 0000000000..d5fe5cef99 --- /dev/null +++ b/worlds/stardew_valley/content/feature/tool_progression.py @@ -0,0 +1,68 @@ +from abc import ABC +from collections import Counter +from collections.abc import Mapping +from dataclasses import dataclass, field +from functools import cache +from types import MappingProxyType +from typing import ClassVar + +from ...strings.tool_names import Tool + + +def to_progressive_item(tool: str) -> str: + """Return the name of the progressive item.""" + return f"Progressive {tool}" + + +# The golden scythe is always randomized +VANILLA_TOOL_DISTRIBUTION = MappingProxyType({ + Tool.scythe: 1, +}) + +PROGRESSIVE_TOOL_DISTRIBUTION = MappingProxyType({ + Tool.axe: 4, + Tool.hoe: 4, + Tool.pickaxe: 4, + Tool.pan: 4, + Tool.trash_can: 4, + Tool.watering_can: 4, + Tool.fishing_rod: 4, +}) + +# Masteries add another tier to the scythe and the fishing rod +SKILL_MASTERIES_TOOL_DISTRIBUTION = MappingProxyType({ + Tool.scythe: 1, + Tool.fishing_rod: 1, +}) + + +@cache +def get_tools_distribution(progressive_tools_enabled: bool, skill_masteries_enabled: bool) -> Mapping[str, int]: + distribution = Counter(VANILLA_TOOL_DISTRIBUTION) + + if progressive_tools_enabled: + distribution += PROGRESSIVE_TOOL_DISTRIBUTION + + if skill_masteries_enabled: + distribution += SKILL_MASTERIES_TOOL_DISTRIBUTION + + return MappingProxyType(distribution) + + +@dataclass(frozen=True) +class ToolProgressionFeature(ABC): + is_progressive: ClassVar[bool] + tool_distribution: Mapping[str, int] + + to_progressive_item = staticmethod(to_progressive_item) + + +@dataclass(frozen=True) +class ToolProgressionVanilla(ToolProgressionFeature): + is_progressive = False + # FIXME change the default_factory to a simple default when python 3.11 is no longer supported + tool_distribution: Mapping[str, int] = field(default_factory=lambda: VANILLA_TOOL_DISTRIBUTION) + + +class ToolProgressionProgressive(ToolProgressionFeature): + is_progressive = True diff --git a/worlds/stardew_valley/content/game_content.py b/worlds/stardew_valley/content/game_content.py index 7ff3217b04..3aa3350f47 100644 --- a/worlds/stardew_valley/content/game_content.py +++ b/worlds/stardew_valley/content/game_content.py @@ -3,7 +3,7 @@ from __future__ import annotations from dataclasses import dataclass, field from typing import Dict, Iterable, Set, Any, Mapping, Type, Tuple, Union -from .feature import booksanity, cropsanity, fishsanity, friendsanity, skill_progression +from .feature import booksanity, cropsanity, fishsanity, friendsanity, skill_progression, tool_progression from ..data.fish_data import FishItem from ..data.game_item import GameItem, ItemSource, ItemTag from ..data.skill import Skill @@ -54,6 +54,7 @@ class StardewFeatures: fishsanity: fishsanity.FishsanityFeature friendsanity: friendsanity.FriendsanityFeature skill_progression: skill_progression.SkillProgressionFeature + tool_progression: tool_progression.ToolProgressionFeature @dataclass(frozen=True) diff --git a/worlds/stardew_valley/early_items.py b/worlds/stardew_valley/early_items.py index 81e28956b3..5ad48912a2 100644 --- a/worlds/stardew_valley/early_items.py +++ b/worlds/stardew_valley/early_items.py @@ -32,7 +32,7 @@ def setup_early_items(multiworld, options: stardew_options.StardewValleyOptions, if options.backpack_progression == stardew_options.BackpackProgression.option_early_progressive: early_forced.append("Progressive Backpack") - if options.tool_progression & stardew_options.ToolProgression.option_progressive: + if content.features.tool_progression.is_progressive: if content.features.fishsanity.is_enabled: early_candidates.append("Progressive Fishing Rod") early_forced.append("Progressive Pickaxe") diff --git a/worlds/stardew_valley/items.py b/worlds/stardew_valley/items.py index 6ac827f869..056a4f6e39 100644 --- a/worlds/stardew_valley/items.py +++ b/worlds/stardew_valley/items.py @@ -15,7 +15,7 @@ from .data.game_item import ItemTag from .logic.logic_event import all_events from .mods.mod_data import ModNames from .options import StardewValleyOptions, TrapItems, FestivalLocations, ExcludeGingerIsland, SpecialOrderLocations, SeasonRandomization, Museumsanity, \ - BuildingProgression, ToolProgression, ElevatorProgression, BackpackProgression, ArcadeMachineLocations, Monstersanity, Goal, \ + BuildingProgression, ElevatorProgression, BackpackProgression, ArcadeMachineLocations, Monstersanity, Goal, \ Chefsanity, Craftsanity, BundleRandomization, EntranceRandomization, Shipsanity, Walnutsanity, EnabledFillerBuffs from .strings.ap_names.ap_option_names import BuffOptionName, WalnutsanityOptionName from .strings.ap_names.ap_weapon_names import APWeapon @@ -23,6 +23,7 @@ from .strings.ap_names.buff_names import Buff from .strings.ap_names.community_upgrade_names import CommunityUpgrade from .strings.ap_names.mods.mod_items import SVEQuestItem from .strings.currency_names import Currency +from .strings.tool_names import Tool from .strings.wallet_item_names import Wallet ITEM_CODE_OFFSET = 717000 @@ -119,11 +120,6 @@ class StardewItemFactory(Protocol): raise NotImplementedError -class StardewItemDeleter(Protocol): - def __call__(self, item: Item): - raise NotImplementedError - - def load_item_csv(): from importlib.resources import files @@ -226,7 +222,7 @@ def create_unique_items(item_factory: StardewItemFactory, options: StardewValley create_weapons(item_factory, options, items) items.append(item_factory("Skull Key")) create_elevators(item_factory, options, items) - create_tools(item_factory, options, content, items) + create_tools(item_factory, content, items) create_skills(item_factory, content, items) create_wizard_buildings(item_factory, options, items) create_carpenter_buildings(item_factory, options, items) @@ -316,23 +312,17 @@ def create_elevators(item_factory: StardewItemFactory, options: StardewValleyOpt items.extend([item_factory(item) for item in ["Progressive Skull Cavern Elevator"] * 8]) -def create_tools(item_factory: StardewItemFactory, options: StardewValleyOptions, content: StardewContent, items: List[Item]): - if options.tool_progression & ToolProgression.option_progressive: - for item_data in items_by_group[Group.PROGRESSIVE_TOOLS]: - name = item_data.name - if "Trash Can" in name: - items.extend([item_factory(item) for item in [item_data] * 3]) - items.append(item_factory(item_data, ItemClassification.useful)) - else: - items.extend([item_factory(item) for item in [item_data] * 4]) +def create_tools(item_factory: StardewItemFactory, content: StardewContent, items: List[Item]): + tool_progression = content.features.tool_progression + for tool, count in tool_progression.tool_distribution.items(): + item = item_table[tool_progression.to_progressive_item(tool)] - if content.features.skill_progression.are_masteries_shuffled: - # Masteries add another tier to the scythe and the fishing rod - items.append(item_factory("Progressive Scythe")) - items.append(item_factory("Progressive Fishing Rod")) + # Trash can is only used in tool upgrade logic, so the last trash can is not progression because it basically does not unlock anything. + if tool == Tool.trash_can: + count -= 1 + items.append(item_factory(item, ItemClassification.useful)) - # The golden scythe is always randomized - items.append(item_factory("Progressive Scythe")) + items.extend([item_factory(item) for _ in range(count)]) def create_skills(item_factory: StardewItemFactory, content: StardewContent, items: List[Item]): diff --git a/worlds/stardew_valley/locations.py b/worlds/stardew_valley/locations.py index 02c8a5441c..df86e08125 100644 --- a/worlds/stardew_valley/locations.py +++ b/worlds/stardew_valley/locations.py @@ -11,7 +11,7 @@ from .data.game_item import ItemTag from .data.museum_data import all_museum_items from .mods.mod_data import ModNames from .options import ExcludeGingerIsland, ArcadeMachineLocations, SpecialOrderLocations, Museumsanity, \ - FestivalLocations, BuildingProgression, ToolProgression, ElevatorProgression, BackpackProgression, FarmType + FestivalLocations, BuildingProgression, ElevatorProgression, BackpackProgression, FarmType from .options import StardewValleyOptions, Craftsanity, Chefsanity, Cooksanity, Shipsanity, Monstersanity from .strings.goal_names import Goal from .strings.quest_names import ModQuest, Quest @@ -473,7 +473,7 @@ def create_locations(location_collector: StardewLocationCollector, extend_bundle_locations(randomized_locations, bundle_rooms) extend_backpack_locations(randomized_locations, options) - if options.tool_progression & ToolProgression.option_progressive: + if content.features.tool_progression.is_progressive: randomized_locations.extend(locations_by_tag[LocationTags.TOOL_UPGRADE]) extend_elevator_locations(randomized_locations, options) diff --git a/worlds/stardew_valley/logic/mine_logic.py b/worlds/stardew_valley/logic/mine_logic.py index 350582ae0d..e332241c10 100644 --- a/worlds/stardew_valley/logic/mine_logic.py +++ b/worlds/stardew_valley/logic/mine_logic.py @@ -10,12 +10,11 @@ from .region_logic import RegionLogicMixin from .skill_logic import SkillLogicMixin from .tool_logic import ToolLogicMixin from .. import options -from ..options import ToolProgression from ..stardew_rule import StardewRule, True_ from ..strings.performance_names import Performance from ..strings.region_names import Region from ..strings.skill_names import Skill -from ..strings.tool_names import Tool, ToolMaterial +from ..strings.tool_names import ToolMaterial class MineLogicMixin(BaseLogicMixin): @@ -56,11 +55,12 @@ SkillLogicMixin, CookingLogicMixin]]): def can_progress_in_the_mines_from_floor(self, floor: int) -> StardewRule: tier = floor // 40 rules = [] + weapon_rule = self.logic.mine.get_weapon_rule_for_floor_tier(tier) rules.append(weapon_rule) - if self.options.tool_progression & ToolProgression.option_progressive: - rules.append(self.logic.tool.has_tool(Tool.pickaxe, ToolMaterial.tiers[tier])) + tool_rule = self.logic.tool.can_mine_using(ToolMaterial.tiers[tier]) + rules.append(tool_rule) # No alternative for vanilla because we assume that you will grind the levels in the mines. if self.content.features.skill_progression.is_progressive: @@ -85,11 +85,12 @@ SkillLogicMixin, CookingLogicMixin]]): def can_progress_in_the_skull_cavern_from_floor(self, floor: int) -> StardewRule: tier = floor // 50 rules = [] + weapon_rule = self.logic.combat.has_great_weapon rules.append(weapon_rule) - if self.options.tool_progression & ToolProgression.option_progressive: - rules.append(self.logic.received("Progressive Pickaxe", min(4, max(0, tier + 2)))) + tool_rule = self.logic.tool.can_mine_using(ToolMaterial.tiers[min(4, max(0, tier + 2))]) + rules.append(tool_rule) # No alternative for vanilla because we assume that you will grind the levels in the mines. if self.content.features.skill_progression.is_progressive: diff --git a/worlds/stardew_valley/logic/tool_logic.py b/worlds/stardew_valley/logic/tool_logic.py index ba593c085a..8292325af7 100644 --- a/worlds/stardew_valley/logic/tool_logic.py +++ b/worlds/stardew_valley/logic/tool_logic.py @@ -8,12 +8,11 @@ from .received_logic import ReceivedLogicMixin from .region_logic import RegionLogicMixin from .season_logic import SeasonLogicMixin from ..mods.logic.magic_logic import MagicLogicMixin -from ..options import ToolProgression from ..stardew_rule import StardewRule, True_, False_ from ..strings.ap_names.skill_level_names import ModSkillLevel -from ..strings.region_names import Region +from ..strings.region_names import Region, LogicRegion from ..strings.spells import MagicSpell -from ..strings.tool_names import ToolMaterial, Tool +from ..strings.tool_names import ToolMaterial, Tool, APTool fishing_rod_prices = { 3: 1800, @@ -57,10 +56,10 @@ class ToolLogic(BaseLogic[Union[ToolLogicMixin, HasLogicMixin, ReceivedLogicMixi if material == ToolMaterial.basic or tool == Tool.scythe: return True_() - if self.options.tool_progression & ToolProgression.option_progressive: + if self.content.features.tool_progression.is_progressive: return self.logic.received(f"Progressive {tool}", tool_materials[material]) - can_upgrade_rule = self.logic.has(f"{material} Bar") & self.logic.money.can_spend_at(Region.blacksmith, tool_upgrade_prices[material]) + can_upgrade_rule = self.logic.tool._can_purchase_upgrade(material) if tool == Tool.pan: has_base_pan = self.logic.received("Glittering Boulder Removed") & self.logic.region.can_reach(Region.mountain) if material == ToolMaterial.copper: @@ -69,6 +68,20 @@ class ToolLogic(BaseLogic[Union[ToolLogicMixin, HasLogicMixin, ReceivedLogicMixi return can_upgrade_rule + @cache_self1 + def can_mine_using(self, material: str) -> StardewRule: + if material == ToolMaterial.basic: + return self.logic.true_ + + if self.content.features.tool_progression.is_progressive: + return self.logic.received(APTool.pickaxe, tool_materials[material]) + else: + return self.logic.tool._can_purchase_upgrade(material) + + @cache_self1 + def _can_purchase_upgrade(self, material: str) -> StardewRule: + return self.logic.region.can_reach(LogicRegion.blacksmith_upgrade(material)) + def can_use_tool_at(self, tool: str, material: str, region: str) -> StardewRule: return self.has_tool(tool, material) & self.logic.region.can_reach(region) @@ -76,8 +89,8 @@ class ToolLogic(BaseLogic[Union[ToolLogicMixin, HasLogicMixin, ReceivedLogicMixi def has_fishing_rod(self, level: int) -> StardewRule: assert 1 <= level <= 4, "Fishing rod 0 isn't real, it can't hurt you. Training is 1, Bamboo is 2, Fiberglass is 3 and Iridium is 4." - if self.options.tool_progression & ToolProgression.option_progressive: - return self.logic.received(f"Progressive {Tool.fishing_rod}", level) + if self.content.features.tool_progression.is_progressive: + return self.logic.received(APTool.fishing_rod, level) if level <= 2: # We assume you always have access to the Bamboo pole, because mod side there is a builtin way to get it back. diff --git a/worlds/stardew_valley/mods/logic/item_logic.py b/worlds/stardew_valley/mods/logic/item_logic.py index 12e824d212..fd87a4a0ac 100644 --- a/worlds/stardew_valley/mods/logic/item_logic.py +++ b/worlds/stardew_valley/mods/logic/item_logic.py @@ -1,7 +1,6 @@ from typing import Dict, Union from ..mod_data import ModNames -from ... import options from ...logic.base_logic import BaseLogicMixin, BaseLogic from ...logic.combat_logic import CombatLogicMixin from ...logic.cooking_logic import CookingLogicMixin @@ -80,7 +79,7 @@ FarmingLogicMixin]]): # Gingerbread House } - if self.options.tool_progression & options.ToolProgression.option_progressive: + if self.content.features.tool_progression.is_progressive: options_to_update.update({ Ore.iridium: items[Ore.iridium] | self.logic.tool.can_use_tool_at(Tool.axe, ToolMaterial.iridium, DeepWoodsRegion.floor_50), # Iridium Tree }) diff --git a/worlds/stardew_valley/options/options.py b/worlds/stardew_valley/options/options.py index aaeeedd1b3..5cfdfcf9c7 100644 --- a/worlds/stardew_valley/options/options.py +++ b/worlds/stardew_valley/options/options.py @@ -247,6 +247,14 @@ class ToolProgression(Choice): option_progressive_cheap = 0b011 # 3 option_progressive_very_cheap = 0b101 # 5 + @property + def is_vanilla(self): + return not self.is_progressive + + @property + def is_progressive(self): + return bool(self.value & self.option_progressive) + class ElevatorProgression(Choice): """Shuffle the elevator? diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index 54afc31eb8..01acc7b822 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -19,9 +19,8 @@ from .logic.logic import StardewLogic from .logic.time_logic import MAX_MONTHS from .logic.tool_logic import tool_upgrade_prices from .mods.mod_data import ModNames -from .options import StardewValleyOptions, Walnutsanity -from .options import ToolProgression, BuildingProgression, ExcludeGingerIsland, SpecialOrderLocations, Museumsanity, BackpackProgression, Shipsanity, \ - Monstersanity, Chefsanity, Craftsanity, ArcadeMachineLocations, Cooksanity +from .options import BuildingProgression, ExcludeGingerIsland, SpecialOrderLocations, Museumsanity, BackpackProgression, Shipsanity, \ + Monstersanity, Chefsanity, Craftsanity, ArcadeMachineLocations, Cooksanity, StardewValleyOptions, Walnutsanity from .stardew_rule import And, StardewRule, true_ from .stardew_rule.indirect_connection import look_for_indirect_connection from .stardew_rule.rule_explain import explain @@ -69,7 +68,7 @@ def set_rules(world): set_entrance_rules(logic, multiworld, player, world_options) set_ginger_island_rules(logic, multiworld, player, world_options) - set_tool_rules(logic, multiworld, player, world_options) + set_tool_rules(logic, multiworld, player, world_content) set_skills_rules(logic, multiworld, player, world_content) set_bundle_rules(bundle_rooms, logic, multiworld, player, world_options) set_building_rules(logic, multiworld, player, world_options) @@ -111,8 +110,8 @@ def set_isolated_locations_rules(logic: StardewLogic, multiworld, player): logic.season.has(Season.spring)) -def set_tool_rules(logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): - if not world_options.tool_progression & ToolProgression.option_progressive: +def set_tool_rules(logic: StardewLogic, multiworld, player, content: StardewContent): + if not content.features.tool_progression.is_progressive: return MultiWorldRules.add_rule(multiworld.get_location("Purchase Fiberglass Rod", player), @@ -281,13 +280,6 @@ def set_skull_cavern_floor_entrance_rules(logic, multiworld, player): set_entrance_rule(multiworld, player, dig_to_skull_floor(floor), rule) -def set_blacksmith_entrance_rules(logic, multiworld, player): - set_blacksmith_upgrade_rule(logic, multiworld, player, LogicEntrance.blacksmith_copper, MetalBar.copper, ToolMaterial.copper) - set_blacksmith_upgrade_rule(logic, multiworld, player, LogicEntrance.blacksmith_iron, MetalBar.iron, ToolMaterial.iron) - set_blacksmith_upgrade_rule(logic, multiworld, player, LogicEntrance.blacksmith_gold, MetalBar.gold, ToolMaterial.gold) - set_blacksmith_upgrade_rule(logic, multiworld, player, LogicEntrance.blacksmith_iridium, MetalBar.iridium, ToolMaterial.iridium) - - def set_skill_entrance_rules(logic, multiworld, player, world_options: StardewValleyOptions): set_entrance_rule(multiworld, player, LogicEntrance.grow_spring_crops, logic.farming.has_farming_tools & logic.season.has_spring) set_entrance_rule(multiworld, player, LogicEntrance.grow_summer_crops, logic.farming.has_farming_tools & logic.season.has_summer) @@ -306,6 +298,13 @@ def set_skill_entrance_rules(logic, multiworld, player, world_options: StardewVa set_entrance_rule(multiworld, player, LogicEntrance.fishing, logic.skill.can_get_fishing_xp) +def set_blacksmith_entrance_rules(logic, multiworld, player): + set_blacksmith_upgrade_rule(logic, multiworld, player, LogicEntrance.blacksmith_copper, MetalBar.copper, ToolMaterial.copper) + set_blacksmith_upgrade_rule(logic, multiworld, player, LogicEntrance.blacksmith_iron, MetalBar.iron, ToolMaterial.iron) + set_blacksmith_upgrade_rule(logic, multiworld, player, LogicEntrance.blacksmith_gold, MetalBar.gold, ToolMaterial.gold) + set_blacksmith_upgrade_rule(logic, multiworld, player, LogicEntrance.blacksmith_iridium, MetalBar.iridium, ToolMaterial.iridium) + + def set_blacksmith_upgrade_rule(logic, multiworld, player, entrance_name: str, item_name: str, tool_material: str): upgrade_rule = logic.has(item_name) & logic.money.can_spend(tool_upgrade_prices[tool_material]) set_entrance_rule(multiworld, player, entrance_name, upgrade_rule) diff --git a/worlds/stardew_valley/strings/entrance_names.py b/worlds/stardew_valley/strings/entrance_names.py index b1c84004eb..bad46c4294 100644 --- a/worlds/stardew_valley/strings/entrance_names.py +++ b/worlds/stardew_valley/strings/entrance_names.py @@ -194,10 +194,15 @@ class LogicEntrance: island_cooking = "Island Cooking" shipping = "Use Shipping Bin" watch_queen_of_sauce = "Watch Queen of Sauce" - blacksmith_copper = "Upgrade Copper Tools" - blacksmith_iron = "Upgrade Iron Tools" - blacksmith_gold = "Upgrade Gold Tools" - blacksmith_iridium = "Upgrade Iridium Tools" + + @staticmethod + def blacksmith_upgrade(material: str) -> str: + return f"Upgrade {material} Tools" + + blacksmith_copper = blacksmith_upgrade("Copper") + blacksmith_iron = blacksmith_upgrade("Iron") + blacksmith_gold = blacksmith_upgrade("Gold") + blacksmith_iridium = blacksmith_upgrade("Iridium") grow_spring_crops = "Grow Spring Crops" grow_summer_crops = "Grow Summer Crops" diff --git a/worlds/stardew_valley/strings/region_names.py b/worlds/stardew_valley/strings/region_names.py index 2bbc6228ab..567f131581 100644 --- a/worlds/stardew_valley/strings/region_names.py +++ b/worlds/stardew_valley/strings/region_names.py @@ -159,10 +159,15 @@ class LogicRegion: kitchen = "Kitchen" shipping = "Shipping" queen_of_sauce = "The Queen of Sauce" - blacksmith_copper = "Blacksmith Copper Upgrades" - blacksmith_iron = "Blacksmith Iron Upgrades" - blacksmith_gold = "Blacksmith Gold Upgrades" - blacksmith_iridium = "Blacksmith Iridium Upgrades" + + @staticmethod + def blacksmith_upgrade(material: str) -> str: + return f"Blacksmith {material} Upgrades" + + blacksmith_copper = blacksmith_upgrade("Copper") + blacksmith_iron = blacksmith_upgrade("Iron") + blacksmith_gold = blacksmith_upgrade("Gold") + blacksmith_iridium = blacksmith_upgrade("Iridium") spring_farming = "Spring Farming" summer_farming = "Summer Farming" diff --git a/worlds/stardew_valley/test/TestGeneration.py b/worlds/stardew_valley/test/TestGeneration.py index 56f338fe8e..38882136ce 100644 --- a/worlds/stardew_valley/test/TestGeneration.py +++ b/worlds/stardew_valley/test/TestGeneration.py @@ -5,8 +5,8 @@ from . import SVTestBase from .. import items, location_table, options from ..items import Group from ..locations import LocationTags -from ..options import Friendsanity, SpecialOrderLocations, Shipsanity, Chefsanity, SeasonRandomization, Craftsanity, ExcludeGingerIsland, ToolProgression, \ - SkillProgression, Booksanity, Walnutsanity +from ..options import Friendsanity, SpecialOrderLocations, Shipsanity, Chefsanity, SeasonRandomization, Craftsanity, ExcludeGingerIsland, SkillProgression, \ + Booksanity, Walnutsanity from ..strings.region_names import Region @@ -320,7 +320,7 @@ class TestProgressiveElevator(SVTestBase): class TestSkullCavernLogic(SVTestBase): options = { options.ElevatorProgression.internal_name: options.ElevatorProgression.option_vanilla, - ToolProgression.internal_name: ToolProgression.option_progressive, + options.ToolProgression.internal_name: options.ToolProgression.option_progressive, options.SkillProgression.internal_name: options.SkillProgression.option_progressive, } diff --git a/worlds/stardew_valley/test/TestOptionFlags.py b/worlds/stardew_valley/test/TestOptionFlags.py index 05e52b40c4..88f2257cab 100644 --- a/worlds/stardew_valley/test/TestOptionFlags.py +++ b/worlds/stardew_valley/test/TestOptionFlags.py @@ -9,7 +9,7 @@ class TestBitFlagsVanilla(SVTestBase): def test_options_are_not_detected_as_progressive(self): world_options = self.world.options - tool_progressive = world_options.tool_progression & ToolProgression.option_progressive + tool_progressive = self.world.content.features.tool_progression.is_progressive building_progressive = world_options.building_progression & BuildingProgression.option_progressive self.assertFalse(tool_progressive) self.assertFalse(building_progressive) @@ -26,7 +26,7 @@ class TestBitFlagsVanillaCheap(SVTestBase): def test_options_are_not_detected_as_progressive(self): world_options = self.world.options - tool_progressive = world_options.tool_progression & ToolProgression.option_progressive + tool_progressive = self.world.content.features.tool_progression.is_progressive building_progressive = world_options.building_progression & BuildingProgression.option_progressive self.assertFalse(tool_progressive) self.assertFalse(building_progressive) @@ -43,7 +43,7 @@ class TestBitFlagsVanillaVeryCheap(SVTestBase): def test_options_are_not_detected_as_progressive(self): world_options = self.world.options - tool_progressive = world_options.tool_progression & ToolProgression.option_progressive + tool_progressive = self.world.content.features.tool_progression.is_progressive building_progressive = world_options.building_progression & BuildingProgression.option_progressive self.assertFalse(tool_progressive) self.assertFalse(building_progressive) @@ -60,7 +60,7 @@ class TestBitFlagsProgressive(SVTestBase): def test_options_are_detected_as_progressive(self): world_options = self.world.options - tool_progressive = world_options.tool_progression & ToolProgression.option_progressive + tool_progressive = self.world.content.features.tool_progression.is_progressive building_progressive = world_options.building_progression & BuildingProgression.option_progressive self.assertTrue(tool_progressive) self.assertTrue(building_progressive) @@ -77,7 +77,7 @@ class TestBitFlagsProgressiveCheap(SVTestBase): def test_options_are_detected_as_progressive(self): world_options = self.world.options - tool_progressive = world_options.tool_progression & ToolProgression.option_progressive + tool_progressive = self.world.content.features.tool_progression.is_progressive building_progressive = world_options.building_progression & BuildingProgression.option_progressive self.assertTrue(tool_progressive) self.assertTrue(building_progressive) @@ -94,7 +94,7 @@ class TestBitFlagsProgressiveVeryCheap(SVTestBase): def test_options_are_detected_as_progressive(self): world_options = self.world.options - tool_progressive = world_options.tool_progression & ToolProgression.option_progressive + tool_progressive = self.world.content.features.tool_progression.is_progressive building_progressive = world_options.building_progression & BuildingProgression.option_progressive self.assertTrue(tool_progressive) self.assertTrue(building_progressive) diff --git a/worlds/stardew_valley/test/TestOptions.py b/worlds/stardew_valley/test/TestOptions.py index 2cd83f013a..06bbfd457a 100644 --- a/worlds/stardew_valley/test/TestOptions.py +++ b/worlds/stardew_valley/test/TestOptions.py @@ -1,17 +1,17 @@ import itertools +from BaseClasses import ItemClassification from Options import NamedRange -from . import SVTestCase, allsanity_no_mods_6_x_x, allsanity_mods_6_x_x, solo_multiworld +from . import SVTestCase, allsanity_no_mods_6_x_x, allsanity_mods_6_x_x, solo_multiworld, SVTestBase from .assertion import WorldAssertMixin from .long.option_names import all_option_choices from .. import items_by_group, Group, StardewValleyWorld from ..locations import locations_by_tag, LocationTags, location_table -from ..options import ExcludeGingerIsland, ToolProgression, Goal, SeasonRandomization, TrapItems, SpecialOrderLocations, ArcadeMachineLocations, \ - SkillProgression +from ..options import ExcludeGingerIsland, ToolProgression, Goal, SeasonRandomization, TrapItems, SpecialOrderLocations, ArcadeMachineLocations from ..strings.goal_names import Goal as GoalName from ..strings.season_names import Season from ..strings.special_order_names import SpecialOrder -from ..strings.tool_names import ToolMaterial, Tool +from ..strings.tool_names import ToolMaterial, Tool, APTool SEASONS = {Season.spring, Season.summer, Season.fall, Season.winter} TOOLS = {"Hoe", "Pickaxe", "Axe", "Watering Can", "Trash Can", "Fishing Rod"} @@ -77,52 +77,30 @@ class TestSeasonRandomization(SVTestCase): self.assertEqual(items.count(Season.progressive), 3) -class TestToolProgression(SVTestCase): - def test_given_vanilla_when_generate_then_no_tool_in_pool(self): - world_options = {ToolProgression.internal_name: ToolProgression.option_vanilla} - with solo_multiworld(world_options) as (multi_world, _): - items = {item.name for item in multi_world.get_items()} - for tool in TOOLS: - self.assertNotIn(tool, items) - - def test_given_progressive_when_generate_then_each_tool_is_in_pool_4_times(self): - world_options = {ToolProgression.internal_name: ToolProgression.option_progressive, - SkillProgression.internal_name: SkillProgression.option_progressive} - with solo_multiworld(world_options) as (multi_world, _): - items = [item.name for item in multi_world.get_items()] - for tool in TOOLS: - count = items.count("Progressive " + tool) - self.assertEqual(count, 4, f"Progressive {tool} was there {count} times") - scythe_count = items.count("Progressive Scythe") - self.assertEqual(scythe_count, 1, f"Progressive Scythe was there {scythe_count} times") - self.assertEqual(items.count("Golden Scythe"), 0, f"Golden Scythe is deprecated") - - def test_given_progressive_with_masteries_when_generate_then_fishing_rod_is_in_the_pool_5_times(self): - world_options = {ToolProgression.internal_name: ToolProgression.option_progressive, - SkillProgression.internal_name: SkillProgression.option_progressive_with_masteries} - with solo_multiworld(world_options) as (multi_world, _): - items = [item.name for item in multi_world.get_items()] - for tool in TOOLS: - count = items.count("Progressive " + tool) - expected_count = 5 if tool == "Fishing Rod" else 4 - self.assertEqual(count, expected_count, f"Progressive {tool} was there {count} times") - scythe_count = items.count("Progressive Scythe") - self.assertEqual(scythe_count, 2, f"Progressive Scythe was there {scythe_count} times") - self.assertEqual(items.count("Golden Scythe"), 0, f"Golden Scythe is deprecated") +class TestToolProgression(SVTestBase): + options = { + ToolProgression.internal_name: ToolProgression.option_progressive, + } def test_given_progressive_when_generate_then_tool_upgrades_are_locations(self): - world_options = {ToolProgression.internal_name: ToolProgression.option_progressive} - with solo_multiworld(world_options) as (multi_world, _): - locations = {locations.name for locations in multi_world.get_locations(1)} - for material, tool in itertools.product(ToolMaterial.tiers.values(), - [Tool.hoe, Tool.pickaxe, Tool.axe, Tool.watering_can, Tool.trash_can]): - if material == ToolMaterial.basic: - continue - self.assertIn(f"{material} {tool} Upgrade", locations) - self.assertIn("Purchase Training Rod", locations) - self.assertIn("Bamboo Pole Cutscene", locations) - self.assertIn("Purchase Fiberglass Rod", locations) - self.assertIn("Purchase Iridium Rod", locations) + locations = set(self.get_real_location_names()) + for material, tool in itertools.product(ToolMaterial.tiers.values(), + [Tool.hoe, Tool.pickaxe, Tool.axe, Tool.watering_can, Tool.trash_can]): + if material == ToolMaterial.basic: + continue + self.assertIn(f"{material} {tool} Upgrade", locations) + self.assertIn("Purchase Training Rod", locations) + self.assertIn("Bamboo Pole Cutscene", locations) + self.assertIn("Purchase Fiberglass Rod", locations) + self.assertIn("Purchase Iridium Rod", locations) + + def test_given_progressive_when_generate_then_only_3_trash_can_are_progressive(self): + trash_cans = self.get_items_by_name(APTool.trash_can) + progressive_count = sum([1 for item in trash_cans if item.classification == ItemClassification.progression]) + useful_count = sum([1 for item in trash_cans if item.classification == ItemClassification.useful]) + + self.assertEqual(progressive_count, 3) + self.assertEqual(useful_count, 1) class TestGenerateAllOptionsWithExcludeGingerIsland(WorldAssertMixin, SVTestCase): diff --git a/worlds/stardew_valley/test/TestWalnutsanity.py b/worlds/stardew_valley/test/TestWalnutsanity.py index 862553dee1..e3f06bf133 100644 --- a/worlds/stardew_valley/test/TestWalnutsanity.py +++ b/worlds/stardew_valley/test/TestWalnutsanity.py @@ -1,5 +1,5 @@ from . import SVTestBase -from ..options import ExcludeGingerIsland, Walnutsanity +from ..options import ExcludeGingerIsland, Walnutsanity, ToolProgression, SkillProgression from ..strings.ap_names.ap_option_names import WalnutsanityOptionName @@ -7,6 +7,8 @@ class TestWalnutsanityNone(SVTestBase): options = { ExcludeGingerIsland: ExcludeGingerIsland.option_false, Walnutsanity: Walnutsanity.preset_none, + SkillProgression: ToolProgression.option_progressive, + ToolProgression: ToolProgression.option_progressive, } def test_no_walnut_locations(self): @@ -50,6 +52,8 @@ class TestWalnutsanityPuzzles(SVTestBase): options = { ExcludeGingerIsland: ExcludeGingerIsland.option_false, Walnutsanity: frozenset({WalnutsanityOptionName.puzzles}), + SkillProgression: ToolProgression.option_progressive, + ToolProgression: ToolProgression.option_progressive, } def test_only_puzzle_walnut_locations(self): diff --git a/worlds/stardew_valley/test/content/__init__.py b/worlds/stardew_valley/test/content/__init__.py index c666a3aae1..0832c2e3c3 100644 --- a/worlds/stardew_valley/test/content/__init__.py +++ b/worlds/stardew_valley/test/content/__init__.py @@ -9,6 +9,7 @@ default_features = StardewFeatures( feature.fishsanity.FishsanityNone(), feature.friendsanity.FriendsanityNone(), feature.skill_progression.SkillProgressionVanilla(), + feature.tool_progression.ToolProgressionVanilla() ) diff --git a/worlds/stardew_valley/test/content/feature/TestToolProgression.py b/worlds/stardew_valley/test/content/feature/TestToolProgression.py new file mode 100644 index 0000000000..618c78dd7a --- /dev/null +++ b/worlds/stardew_valley/test/content/feature/TestToolProgression.py @@ -0,0 +1,52 @@ +import unittest + +from ....content import choose_tool_progression +from ....options import ToolProgression, SkillProgression +from ....strings.tool_names import Tool + + +class TestToolDistribution(unittest.TestCase): + + def test_given_vanilla_tool_progression_when_create_feature_then_only_one_scythe_is_randomized(self): + tool_progression = ToolProgression(ToolProgression.option_vanilla) + skill_progression = SkillProgression.from_text("random") + + feature = choose_tool_progression(tool_progression, skill_progression) + + self.assertEqual(feature.tool_distribution, { + Tool.scythe: 1, + }) + + def test_given_progressive_tool_when_create_feature_then_all_tool_upgrades_are_randomized(self): + tool_progression = ToolProgression(ToolProgression.option_progressive) + skill_progression = SkillProgression(SkillProgression.option_progressive) + + feature = choose_tool_progression(tool_progression, skill_progression) + + self.assertEqual(feature.tool_distribution, { + Tool.scythe: 1, + Tool.pickaxe: 4, + Tool.axe: 4, + Tool.hoe: 4, + Tool.watering_can: 4, + Tool.trash_can: 4, + Tool.pan: 4, + Tool.fishing_rod: 4, + }) + + def test_given_progressive_tool_and_skill_masteries_when_create_feature_then_additional_scythe_and_fishing_rod_are_randomized(self): + tool_progression = ToolProgression(ToolProgression.option_progressive) + skill_progression = SkillProgression(SkillProgression.option_progressive_with_masteries) + + feature = choose_tool_progression(tool_progression, skill_progression) + + self.assertEqual(feature.tool_distribution, { + Tool.scythe: 2, + Tool.pickaxe: 4, + Tool.axe: 4, + Tool.hoe: 4, + Tool.watering_can: 4, + Tool.trash_can: 4, + Tool.pan: 4, + Tool.fishing_rod: 5, + }) From 33a75fb2cbb0d51f3d52a3c453e15ed90be4b91f Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Sat, 8 Mar 2025 11:25:47 -0500 Subject: [PATCH 081/227] TUNIC: Breakable Shuffle (#4489) * Starting out * Rules for breakable regions * make the rest of it work, it's pr ready, boom * Make it work in not pot shuffle * Fix after merge * Fix item id overlap * Move breakable, grass, and local fill options in yaml * Fix groups getting overwritten * Rename, add new breakables * Rename more stuff * Time to rename them again * Make it actually default for breakable shuffle * Burn the signs down * Fix west courtyard pot regions * Fix fortress courtyard and beneath the fortress loc groups again * More missing loc group conversions * Replace instances of world.player with player, same for multiworld * Update worlds/tunic/__init__.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * Remove unused import --- worlds/tunic/__init__.py | 39 +++- worlds/tunic/breakables.py | 466 +++++++++++++++++++++++++++++++++++++ worlds/tunic/er_data.py | 13 +- worlds/tunic/er_rules.py | 15 +- worlds/tunic/er_scripts.py | 40 ++-- worlds/tunic/items.py | 4 + worlds/tunic/locations.py | 2 + worlds/tunic/options.py | 9 + 8 files changed, 554 insertions(+), 34 deletions(-) create mode 100644 worlds/tunic/breakables.py diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index 250f6706f1..ff1dc414c3 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -13,10 +13,10 @@ from .er_data import portal_mapping, RegionInfo, tunic_er_regions from .options import (TunicOptions, EntranceRando, tunic_option_groups, tunic_option_presets, TunicPlandoConnections, LaurelsLocation, LogicRules, LaurelsZips, IceGrappling, LadderStorage, check_options, get_hexagons_in_pool, HexagonQuestAbilityUnlockType) +from .breakables import breakable_location_name_to_id, breakable_location_groups, breakable_location_table from .combat_logic import area_data, CombatState from worlds.AutoWorld import WebWorld, World from Options import PlandoConnection, OptionError -from decimal import Decimal, ROUND_HALF_UP from settings import Group, Bool @@ -81,10 +81,13 @@ class TunicWorld(World): location_name_groups = location_name_groups for group_name, members in grass_location_name_groups.items(): location_name_groups.setdefault(group_name, set()).update(members) + for group_name, members in breakable_location_groups.items(): + location_name_groups.setdefault(group_name, set()).update(members) item_name_to_id = item_name_to_id location_name_to_id = standard_location_name_to_id.copy() location_name_to_id.update(grass_location_name_to_id) + location_name_to_id.update(breakable_location_name_to_id) player_location_table: Dict[str, int] ability_unlocks: Dict[str, int] @@ -158,6 +161,7 @@ class TunicWorld(World): self.options.entrance_rando.value = self.passthrough["entrance_rando"] self.options.shuffle_ladders.value = self.passthrough["shuffle_ladders"] self.options.grass_randomizer.value = self.passthrough.get("grass_randomizer", 0) + self.options.breakable_shuffle.value = self.passthrough.get("breakable_shuffle", 0) self.options.fixed_shop.value = self.options.fixed_shop.option_false self.options.laurels_location.value = self.options.laurels_location.option_anywhere self.options.combat_logic.value = self.passthrough["combat_logic"] @@ -170,7 +174,12 @@ class TunicWorld(World): if self.options.local_fill == -1: if self.options.grass_randomizer: - self.options.local_fill.value = 95 + if self.options.breakable_shuffle: + self.options.local_fill.value = 96 + else: + self.options.local_fill.value = 95 + elif self.options.breakable_shuffle: + self.options.local_fill.value = 40 else: self.options.local_fill.value = 0 @@ -182,6 +191,13 @@ class TunicWorld(World): self.player_location_table.update(grass_location_name_to_id) + if self.options.breakable_shuffle: + if self.options.entrance_rando: + self.player_location_table.update(breakable_location_name_to_id) + else: + self.player_location_table.update({name: num for name, num in breakable_location_name_to_id.items() + if not name.startswith("Purgatory")}) + @classmethod def stage_generate_early(cls, multiworld: MultiWorld) -> None: tunic_worlds: Tuple[TunicWorld] = multiworld.get_game_worlds("TUNIC") @@ -258,7 +274,8 @@ class TunicWorld(World): itemclass: ItemClassification = (classification or (item_data.combat_ic if self.options.combat_logic else None) or (ItemClassification.progression | ItemClassification.useful - if name == "Glass Cannon" and self.options.grass_randomizer + if name == "Glass Cannon" + and (self.options.grass_randomizer or self.options.breakable_shuffle) and not self.options.start_with_sword else None) or (ItemClassification.progression | ItemClassification.useful if name == "Shield" and self.options.ladder_storage @@ -280,6 +297,13 @@ class TunicWorld(World): items_to_create["Fool Trap"] += items_to_create[money_fool] items_to_create[money_fool] = 0 + # creating these after the fool traps are made mostly so we don't have to mess with it + if self.options.breakable_shuffle: + for loc_data in breakable_location_table.values(): + if not self.options.entrance_rando and loc_data.er_region == "Purgatory": + continue + items_to_create[f"Money x{self.random.randint(1, 5)}"] += 1 + if self.options.start_with_sword: self.multiworld.push_precollected(self.create_item("Sword")) @@ -472,9 +496,9 @@ class TunicWorld(World): self.ability_unlocks["Pages 42-43 (Holy Cross)"] = self.passthrough["Hexagon Quest Holy Cross"] self.ability_unlocks["Pages 52-53 (Icebolt)"] = self.passthrough["Hexagon Quest Icebolt"] - # Ladders and Combat Logic uses ER rules with vanilla connections for easier maintenance + # Most non-standard options use ER regions if (self.options.entrance_rando or self.options.shuffle_ladders or self.options.combat_logic - or self.options.grass_randomizer): + or self.options.grass_randomizer or self.options.breakable_shuffle): portal_pairs = create_er_regions(self) if self.options.entrance_rando: # these get interpreted by the game to tell it which entrances to connect @@ -502,9 +526,9 @@ class TunicWorld(World): victory_region.locations.append(victory_location) def set_rules(self) -> None: - # same reason as in create_regions, could probably be put into create_regions + # same reason as in create_regions if (self.options.entrance_rando or self.options.shuffle_ladders or self.options.combat_logic - or self.options.grass_randomizer): + or self.options.grass_randomizer or self.options.breakable_shuffle): set_er_location_rules(self) else: set_region_rules(self) @@ -609,6 +633,7 @@ class TunicWorld(World): "Hexagon Quest Goal": self.options.hexagon_goal.value, "Entrance Rando": self.tunic_portal_pairs, "disable_local_spoiler": int(self.settings.disable_local_spoiler or self.multiworld.is_race), + "breakable_shuffle": self.options.breakable_shuffle.value, } # this would be in a stage if there was an appropriate stage for it diff --git a/worlds/tunic/breakables.py b/worlds/tunic/breakables.py new file mode 100644 index 0000000000..156bece7ca --- /dev/null +++ b/worlds/tunic/breakables.py @@ -0,0 +1,466 @@ +from typing import TYPE_CHECKING, NamedTuple + +from enum import IntEnum +from BaseClasses import CollectionState, Region +from worlds.generic.Rules import set_rule +from .rules import has_sword, has_melee +from .er_rules import can_shop +if TYPE_CHECKING: + from . import TunicWorld + + +# just getting an id that is a decent chunk ahead of the grass ones +breakable_base_id = 509342400 + 8000 + + +class BreakableType(IntEnum): + pot = 1 + fire_pot = 2 + explosive_pot = 3 + sign = 4 + barrel = 5 + crate = 6 + table = 7 + glass = 8 + leaves = 9 + wall = 10 + + +class TunicLocationData(NamedTuple): + er_region: str + breakable: BreakableType + + +breakable_location_table: dict[str, TunicLocationData] = { + "Overworld - [Northwest] Sign by Quarry Gate": TunicLocationData("Overworld", BreakableType.sign), + "Overworld - [Central] Sign South of Checkpoint": TunicLocationData("Overworld", BreakableType.sign), + "Overworld - [Central] Sign by Ruined Passage": TunicLocationData("Overworld", BreakableType.sign), + "Overworld - [East] Pot near Slimes 1": TunicLocationData("East Overworld", BreakableType.pot), + "Overworld - [East] Pot near Slimes 2": TunicLocationData("East Overworld", BreakableType.pot), + "Overworld - [East] Pot near Slimes 3": TunicLocationData("East Overworld", BreakableType.pot), + "Overworld - [East] Pot near Slimes 4": TunicLocationData("East Overworld", BreakableType.pot), + "Overworld - [East] Pot near Slimes 5": TunicLocationData("East Overworld", BreakableType.pot), + "Overworld - [East] Forest Sign": TunicLocationData("East Overworld", BreakableType.sign), + "Overworld - [East] Fortress Sign": TunicLocationData("East Overworld", BreakableType.sign), + "Overworld - [North] Pot 1": TunicLocationData("Upper Overworld", BreakableType.pot), + "Overworld - [North] Pot 2": TunicLocationData("Upper Overworld", BreakableType.pot), + "Overworld - [North] Pot 3": TunicLocationData("Upper Overworld", BreakableType.pot), + "Overworld - [North] Pot 4": TunicLocationData("Upper Overworld", BreakableType.pot), + "Overworld - [West] Sign Near West Garden Entrance": TunicLocationData("Overworld to West Garden from Furnace", BreakableType.sign), + "Stick House - Pot 1": TunicLocationData("Stick House", BreakableType.pot), + "Stick House - Pot 2": TunicLocationData("Stick House", BreakableType.pot), + "Stick House - Pot 3": TunicLocationData("Stick House", BreakableType.pot), + "Stick House - Pot 4": TunicLocationData("Stick House", BreakableType.pot), + "Stick House - Pot 5": TunicLocationData("Stick House", BreakableType.pot), + "Stick House - Pot 6": TunicLocationData("Stick House", BreakableType.pot), + "Stick House - Pot 7": TunicLocationData("Stick House", BreakableType.pot), + "Ruined Shop - Pot 1": TunicLocationData("Ruined Shop", BreakableType.pot), + "Ruined Shop - Pot 2": TunicLocationData("Ruined Shop", BreakableType.pot), + "Ruined Shop - Pot 3": TunicLocationData("Ruined Shop", BreakableType.pot), + "Ruined Shop - Pot 4": TunicLocationData("Ruined Shop", BreakableType.pot), + "Ruined Shop - Pot 5": TunicLocationData("Ruined Shop", BreakableType.pot), + "Hourglass Cave - Sign": TunicLocationData("Hourglass Cave", BreakableType.sign), + "Forest Belltower - Pot by Slimes 1": TunicLocationData("Forest Belltower Main", BreakableType.pot), + "Forest Belltower - Pot by Slimes 2": TunicLocationData("Forest Belltower Main", BreakableType.pot), + "Forest Belltower - Pot by Slimes 3": TunicLocationData("Forest Belltower Main", BreakableType.pot), + "Forest Belltower - Pot by Slimes 4": TunicLocationData("Forest Belltower Main", BreakableType.pot), + "Forest Belltower - Pot by Slimes 5": TunicLocationData("Forest Belltower Main", BreakableType.pot), + "Forest Belltower - Pot by Slimes 6": TunicLocationData("Forest Belltower Main", BreakableType.pot), + "Forest Belltower - [Upper] Barrel 1": TunicLocationData("Forest Belltower Upper", BreakableType.barrel), + "Forest Belltower - [Upper] Barrel 2": TunicLocationData("Forest Belltower Upper", BreakableType.barrel), + "Forest Belltower - [Upper] Barrel 3": TunicLocationData("Forest Belltower Upper", BreakableType.barrel), + "Forest Belltower - Pot after Guard Captain 1": TunicLocationData("Forest Belltower Upper", BreakableType.pot), + "Forest Belltower - Pot after Guard Captain 2": TunicLocationData("Forest Belltower Upper", BreakableType.pot), + "Forest Belltower - Pot after Guard Captain 3": TunicLocationData("Forest Belltower Upper", BreakableType.pot), + "Forest Belltower - Pot after Guard Captain 4": TunicLocationData("Forest Belltower Upper", BreakableType.pot), + "Forest Belltower - Pot after Guard Captain 5": TunicLocationData("Forest Belltower Upper", BreakableType.pot), + "Forest Belltower - Pot after Guard Captain 6": TunicLocationData("Forest Belltower Upper", BreakableType.pot), + "Forest Belltower - Pot after Guard Captain 7": TunicLocationData("Forest Belltower Upper", BreakableType.pot), + "Forest Belltower - Pot after Guard Captain 8": TunicLocationData("Forest Belltower Upper", BreakableType.pot), + "Forest Belltower - Pot after Guard Captain 9": TunicLocationData("Forest Belltower Upper", BreakableType.pot), + "Guardhouse 1 - Pot 1": TunicLocationData("Guard House 1 East", BreakableType.pot), + "Guardhouse 1 - Pot 2": TunicLocationData("Guard House 1 East", BreakableType.pot), + "Guardhouse 1 - Pot 3": TunicLocationData("Guard House 1 East", BreakableType.pot), + "Guardhouse 1 - Pot 4": TunicLocationData("Guard House 1 East", BreakableType.pot), + "Guardhouse 1 - Pot 5": TunicLocationData("Guard House 1 East", BreakableType.pot), + "East Forest - Sign by Grave Path": TunicLocationData("East Forest", BreakableType.sign), + "East Forest - Sign by Guardhouse 1": TunicLocationData("East Forest", BreakableType.sign), + "East Forest - Pot by Grave Path 1": TunicLocationData("East Forest", BreakableType.pot), + "East Forest - Pot by Grave Path 2": TunicLocationData("East Forest", BreakableType.pot), + "East Forest - Pot by Grave Path 3": TunicLocationData("East Forest", BreakableType.pot), + "East Forest - Pot by Envoy 1": TunicLocationData("East Forest", BreakableType.pot), + "East Forest - Pot by Envoy 2": TunicLocationData("East Forest", BreakableType.pot), + "East Forest - Pot by Envoy 3": TunicLocationData("East Forest", BreakableType.pot), + "Guardhouse 2 - Bottom Floor Pot 1": TunicLocationData("Guard House 2 Lower", BreakableType.pot), + "Guardhouse 2 - Bottom Floor Pot 2": TunicLocationData("Guard House 2 Lower", BreakableType.pot), + "Guardhouse 2 - Bottom Floor Pot 3": TunicLocationData("Guard House 2 Lower", BreakableType.pot), + "Guardhouse 2 - Bottom Floor Pot 4": TunicLocationData("Guard House 2 Lower", BreakableType.pot), + "Guardhouse 2 - Bottom Floor Pot 5": TunicLocationData("Guard House 2 Lower", BreakableType.pot), + "Beneath the Well - [Side Room] Pot by Chest 1": TunicLocationData("Beneath the Well Back", BreakableType.pot), + "Beneath the Well - [Side Room] Pot by Chest 2": TunicLocationData("Beneath the Well Back", BreakableType.pot), + "Beneath the Well - [Side Room] Pot by Chest 3": TunicLocationData("Beneath the Well Back", BreakableType.pot), + "Beneath the Well - [Third Room] Barrel by Bridge 1": TunicLocationData("Beneath the Well Main", BreakableType.barrel), + "Beneath the Well - [Third Room] Barrel by Bridge 2": TunicLocationData("Beneath the Well Main", BreakableType.barrel), + "Beneath the Well - [Third Room] Barrel by Bridge 3": TunicLocationData("Beneath the Well Main", BreakableType.barrel), + "Beneath the Well - [Third Room] Barrel after Back Corridor 1": TunicLocationData("Beneath the Well Main", BreakableType.barrel), + "Beneath the Well - [Third Room] Barrel after Back Corridor 2": TunicLocationData("Beneath the Well Main", BreakableType.barrel), + "Beneath the Well - [Third Room] Barrel after Back Corridor 3": TunicLocationData("Beneath the Well Main", BreakableType.barrel), + "Beneath the Well - [Third Room] Barrel after Back Corridor 4": TunicLocationData("Beneath the Well Main", BreakableType.barrel), + "Beneath the Well - [Third Room] Barrel after Back Corridor 5": TunicLocationData("Beneath the Well Main", BreakableType.barrel), + "Beneath the Well - [Third Room] Barrel by West Turret 1": TunicLocationData("Beneath the Well Main", BreakableType.barrel), + "Beneath the Well - [Third Room] Barrel by West Turret 2": TunicLocationData("Beneath the Well Main", BreakableType.barrel), + "Beneath the Well - [Third Room] Barrel by West Turret 3": TunicLocationData("Beneath the Well Main", BreakableType.barrel), + "Beneath the Well - [Third Room] Pot by East Turret 1": TunicLocationData("Beneath the Well Main", BreakableType.pot), + "Beneath the Well - [Third Room] Pot by East Turret 2": TunicLocationData("Beneath the Well Main", BreakableType.pot), + "Beneath the Well - [Third Room] Pot by East Turret 3": TunicLocationData("Beneath the Well Main", BreakableType.pot), + "Beneath the Well - [Third Room] Pot by East Turret 4": TunicLocationData("Beneath the Well Main", BreakableType.pot), + "Beneath the Well - [Third Room] Pot by East Turret 5": TunicLocationData("Beneath the Well Main", BreakableType.pot), + "Beneath the Well - [Third Room] Pot by East Turret 6": TunicLocationData("Beneath the Well Main", BreakableType.pot), + "Beneath the Well - [Third Room] Pot by East Turret 7": TunicLocationData("Beneath the Well Main", BreakableType.pot), + "Well Boss - Barrel 1": TunicLocationData("Well Boss", BreakableType.barrel), + "Well Boss - Barrel 2": TunicLocationData("Well Boss", BreakableType.barrel), + "Dark Tomb - Pot Hallway Pot 1": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 2": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 3": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 4": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 5": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 6": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 7": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 8": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 9": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 10": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 11": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 12": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 13": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - Pot Hallway Pot 14": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - 2nd Laser Room Pot 1": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - 2nd Laser Room Pot 2": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - 2nd Laser Room Pot 3": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - 2nd Laser Room Pot 4": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "Dark Tomb - 2nd Laser Room Pot 5": TunicLocationData("Dark Tomb Main", BreakableType.pot), + "West Garden House - Pot 1": TunicLocationData("Magic Dagger House", BreakableType.pot), + "West Garden House - Pot 2": TunicLocationData("Magic Dagger House", BreakableType.pot), + "West Garden House - Pot 3": TunicLocationData("Magic Dagger House", BreakableType.pot), + "Fortress Courtyard - Fire Pot 1": TunicLocationData("Fortress Courtyard westmost pots", BreakableType.fire_pot), + "Fortress Courtyard - Fire Pot 2": TunicLocationData("Fortress Courtyard westmost pots", BreakableType.fire_pot), + "Fortress Courtyard - Fire Pot 3": TunicLocationData("Fortress Courtyard west pots", BreakableType.fire_pot), + "Fortress Courtyard - Fire Pot 4": TunicLocationData("Fortress Courtyard west pots", BreakableType.fire_pot), + "Fortress Courtyard - Fire Pot 5": TunicLocationData("Fortress Courtyard", BreakableType.fire_pot), + "Fortress Courtyard - Fire Pot 6": TunicLocationData("Fortress Courtyard", BreakableType.fire_pot), + "Fortress Courtyard - Fire Pot 7": TunicLocationData("Fortress Courtyard", BreakableType.fire_pot), + "Fortress Courtyard - Fire Pot 8": TunicLocationData("Fortress Courtyard", BreakableType.fire_pot), + "Fortress Courtyard - Upper Fire Pot": TunicLocationData("Fortress Courtyard Upper pot", BreakableType.fire_pot), + "Fortress Grave Path - [Entry] Pot 1": TunicLocationData("Fortress Grave Path Entry", BreakableType.pot), + "Fortress Grave Path - [Entry] Pot 2": TunicLocationData("Fortress Grave Path Entry", BreakableType.pot), + "Fortress Grave Path - [By Grave] Pot 1": TunicLocationData("Fortress Grave Path pots", BreakableType.pot), + "Fortress Grave Path - [By Grave] Pot 2": TunicLocationData("Fortress Grave Path pots", BreakableType.pot), + "Fortress Grave Path - [By Grave] Pot 3": TunicLocationData("Fortress Grave Path pots", BreakableType.pot), + "Fortress Grave Path - [By Grave] Pot 4": TunicLocationData("Fortress Grave Path pots", BreakableType.pot), + "Fortress Grave Path - [By Grave] Pot 5": TunicLocationData("Fortress Grave Path pots", BreakableType.pot), + "Fortress Grave Path - [By Grave] Pot 6": TunicLocationData("Fortress Grave Path pots", BreakableType.pot), + "Fortress Grave Path - [Central] Fire Pot 1": TunicLocationData("Fortress Grave Path westmost pot", BreakableType.fire_pot), + "Fortress Grave Path - [Central] Fire Pot 2": TunicLocationData("Fortress Grave Path Combat", BreakableType.fire_pot), + "Eastern Vault Fortress - [Central] Pot by Door 1": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [Central] Pot by Door 2": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [Central] Pot by Door 3": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [Central] Pot by Door 4": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [Central] Pot by Door 5": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [Central] Pot by Door 6": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [Central] Pot by Door 7": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [Central] Pot by Door 8": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [Central] Pot by Door 9": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [Central] Pot by Door 10": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [Central] Pot by Door 11": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [East Wing] Pot by Broken Checkpoint 1": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [East Wing] Pot by Broken Checkpoint 2": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [East Wing] Pot by Broken Checkpoint 3": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Pot by Checkpoint 1": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Pot by Checkpoint 2": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Pot by Checkpoint 3": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Pot by Overlook 1": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Pot by Overlook 2": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Slorm Room Pot 1": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Slorm Room Pot 2": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Slorm Room Pot 3": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Chest Room Pot 1": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Chest Room Pot 2": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Pot by Stairs to Basement 1": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Pot by Stairs to Basement 2": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Eastern Vault Fortress - [West Wing] Pot by Stairs to Basement 3": TunicLocationData("Eastern Vault Fortress", BreakableType.pot), + "Beneath the Fortress - Entry Spot Pot 1": TunicLocationData("Beneath the Vault Entry Spot", BreakableType.pot), + "Beneath the Fortress - Entry Spot Pot 2": TunicLocationData("Beneath the Vault Entry Spot", BreakableType.pot), + "Beneath the Fortress - Entry Spot Crate 1": TunicLocationData("Beneath the Vault Entry Spot", BreakableType.crate), + "Beneath the Fortress - Entry Spot Crate 2": TunicLocationData("Beneath the Vault Entry Spot", BreakableType.crate), + "Beneath the Fortress - Entry Spot Crate 3": TunicLocationData("Beneath the Vault Entry Spot", BreakableType.crate), + "Beneath the Fortress - Entry Spot Crate 4": TunicLocationData("Beneath the Vault Entry Spot", BreakableType.crate), + "Beneath the Fortress - Entry Spot Crate 5": TunicLocationData("Beneath the Vault Entry Spot", BreakableType.crate), + "Beneath the Fortress - Entry Spot Crate 6": TunicLocationData("Beneath the Vault Entry Spot", BreakableType.crate), + "Beneath the Fortress - Entry Spot Crate 7": TunicLocationData("Beneath the Vault Entry Spot", BreakableType.crate), + "Beneath the Fortress - Slorm Room Crate 1": TunicLocationData("Beneath the Vault Main", BreakableType.crate), + "Beneath the Fortress - Slorm Room Crate 2": TunicLocationData("Beneath the Vault Main", BreakableType.crate), + "Beneath the Fortress - Crate under Rope 1": TunicLocationData("Beneath the Vault Main", BreakableType.crate), + "Beneath the Fortress - Crate under Rope 2": TunicLocationData("Beneath the Vault Main", BreakableType.crate), + "Beneath the Fortress - Crate under Rope 3": TunicLocationData("Beneath the Vault Main", BreakableType.crate), + "Beneath the Fortress - Crate under Rope 4": TunicLocationData("Beneath the Vault Main", BreakableType.crate), + "Beneath the Fortress - Crate under Rope 5": TunicLocationData("Beneath the Vault Main", BreakableType.crate), + "Beneath the Fortress - Crate under Rope 6": TunicLocationData("Beneath the Vault Main", BreakableType.crate), + "Beneath the Fortress - Fuse Room Fire Pot 1": TunicLocationData("Beneath the Vault Back", BreakableType.fire_pot), + "Beneath the Fortress - Fuse Room Fire Pot 2": TunicLocationData("Beneath the Vault Back", BreakableType.fire_pot), + "Beneath the Fortress - Fuse Room Fire Pot 3": TunicLocationData("Beneath the Vault Back", BreakableType.fire_pot), + "Beneath the Fortress - Barrel by Back Room 1": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Barrel by Back Room 2": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Barrel by Back Room 3": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Barrel by Back Room 4": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Barrel by Back Room 5": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Barrel by Back Room 6": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Back Room Barrel 1": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Back Room Barrel 2": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Back Room Barrel 3": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Back Room Barrel 4": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Back Room Barrel 5": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Back Room Barrel 6": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Beneath the Fortress - Back Room Barrel 7": TunicLocationData("Beneath the Vault Back", BreakableType.barrel), + "Fortress Leaf Piles - Leaf Pile 1": TunicLocationData("Fortress Leaf Piles", BreakableType.leaves), + "Fortress Leaf Piles - Leaf Pile 2": TunicLocationData("Fortress Leaf Piles", BreakableType.leaves), + "Fortress Leaf Piles - Leaf Pile 3": TunicLocationData("Fortress Leaf Piles", BreakableType.leaves), + "Fortress Leaf Piles - Leaf Pile 4": TunicLocationData("Fortress Leaf Piles", BreakableType.leaves), + "Fortress Arena - Pot 1": TunicLocationData("Fortress Arena", BreakableType.pot), + "Fortress Arena - Pot 2": TunicLocationData("Fortress Arena", BreakableType.pot), + "Ruined Atoll - [West] Pot in Broken House 1": TunicLocationData("Ruined Atoll", BreakableType.pot), + "Ruined Atoll - [West] Pot in Broken House 2": TunicLocationData("Ruined Atoll", BreakableType.pot), + "Ruined Atoll - [West] Table in Broken House": TunicLocationData("Ruined Atoll", BreakableType.table), + "Ruined Atoll - [South] Explosive Pot near Birds": TunicLocationData("Ruined Atoll", BreakableType.explosive_pot), + "Frog Stairs - [Upper] Pot 1": TunicLocationData("Frog Stairs Upper", BreakableType.pot), + "Frog Stairs - [Upper] Pot 2": TunicLocationData("Frog Stairs Upper", BreakableType.pot), + "Frog Stairs - [Upper] Pot 3": TunicLocationData("Frog Stairs Upper", BreakableType.pot), + "Frog Stairs - [Upper] Pot 4": TunicLocationData("Frog Stairs Upper", BreakableType.pot), + "Frog Stairs - [Upper] Pot 5": TunicLocationData("Frog Stairs Upper", BreakableType.pot), + "Frog Stairs - [Upper] Pot 6": TunicLocationData("Frog Stairs Upper", BreakableType.pot), + "Frog's Domain - Pot above Orb Altar 1": TunicLocationData("Frog's Domain Front", BreakableType.pot), + "Frog's Domain - Pot above Orb Altar 2": TunicLocationData("Frog's Domain Front", BreakableType.pot), + "Frog's Domain - Side Room Pot 1": TunicLocationData("Frog's Domain Main", BreakableType.pot), + "Frog's Domain - Side Room Pot 2": TunicLocationData("Frog's Domain Main", BreakableType.pot), + "Frog's Domain - Side Room Pot 3": TunicLocationData("Frog's Domain Main", BreakableType.pot), + "Frog's Domain - Main Room Pot 1": TunicLocationData("Frog's Domain Main", BreakableType.pot), + "Frog's Domain - Main Room Pot 2": TunicLocationData("Frog's Domain Main", BreakableType.pot), + "Frog's Domain - Side Room Pot 4": TunicLocationData("Frog's Domain Main", BreakableType.pot), + "Frog's Domain - Pot after Gate 1": TunicLocationData("Frog's Domain Main", BreakableType.pot), + "Frog's Domain - Pot after Gate 2": TunicLocationData("Frog's Domain Main", BreakableType.pot), + "Frog's Domain - Orb Room Explosive Pot 1": TunicLocationData("Frog's Domain Main", BreakableType.explosive_pot), + "Frog's Domain - Orb Room Explosive Pot 2": TunicLocationData("Frog's Domain Main", BreakableType.explosive_pot), + "Library Lab - Display Case 1": TunicLocationData("Library Lab", BreakableType.glass), + "Library Lab - Display Case 2": TunicLocationData("Library Lab", BreakableType.glass), + "Library Lab - Display Case 3": TunicLocationData("Library Lab", BreakableType.glass), + "Quarry - [East] Explosive Pot 1": TunicLocationData("Quarry", BreakableType.explosive_pot), + "Quarry - [East] Explosive Pot 2": TunicLocationData("Quarry", BreakableType.explosive_pot), + "Quarry - [East] Explosive Pot 3": TunicLocationData("Quarry", BreakableType.explosive_pot), + "Quarry - [East] Explosive Pot beneath Scaffolding": TunicLocationData("Quarry", BreakableType.explosive_pot), + "Quarry - [Central] Explosive Pot near Monastery 1": TunicLocationData("Quarry Monastery Entry", BreakableType.explosive_pot), + "Quarry - [Central] Explosive Pot near Monastery 2": TunicLocationData("Quarry Monastery Entry", BreakableType.explosive_pot), + "Quarry - [Back Entrance] Pot 1": TunicLocationData("Quarry Back", BreakableType.pot), + "Quarry - [Back Entrance] Pot 2": TunicLocationData("Quarry Back", BreakableType.pot), + "Quarry - [Back Entrance] Pot 3": TunicLocationData("Quarry Back", BreakableType.pot), + "Quarry - [Back Entrance] Pot 4": TunicLocationData("Quarry Back", BreakableType.pot), + "Quarry - [Back Entrance] Pot 5": TunicLocationData("Quarry Back", BreakableType.pot), + "Quarry - [Central] Explosive Pot near Shortcut Ladder 1": TunicLocationData("Quarry Back", BreakableType.explosive_pot), + "Quarry - [Central] Explosive Pot near Shortcut Ladder 2": TunicLocationData("Quarry Back", BreakableType.explosive_pot), + "Quarry - [Central] Crate near Shortcut Ladder 1": TunicLocationData("Quarry Back", BreakableType.crate), + "Quarry - [Central] Crate near Shortcut Ladder 2": TunicLocationData("Quarry Back", BreakableType.crate), + "Quarry - [Central] Crate near Shortcut Ladder 3": TunicLocationData("Quarry Back", BreakableType.crate), + "Quarry - [Central] Crate near Shortcut Ladder 4": TunicLocationData("Quarry Back", BreakableType.crate), + "Quarry - [Central] Crate near Shortcut Ladder 5": TunicLocationData("Quarry Back", BreakableType.crate), + "Quarry - [West] Explosive Pot near Bombable Wall 1": TunicLocationData("Lower Quarry upper pots", BreakableType.explosive_pot), + "Quarry - [West] Explosive Pot near Bombable Wall 2": TunicLocationData("Lower Quarry upper pots", BreakableType.explosive_pot), + "Quarry - [West] Explosive Pot above Shooting Range": TunicLocationData("Lower Quarry", BreakableType.explosive_pot), + "Quarry - [West] Explosive Pot near Isolated Chest 1": TunicLocationData("Lower Quarry", BreakableType.explosive_pot), + "Quarry - [West] Explosive Pot near Isolated Chest 2": TunicLocationData("Lower Quarry", BreakableType.explosive_pot), + "Quarry - [West] Crate by Shooting Range 1": TunicLocationData("Lower Quarry", BreakableType.crate), + "Quarry - [West] Crate by Shooting Range 2": TunicLocationData("Lower Quarry", BreakableType.crate), + "Quarry - [West] Crate by Shooting Range 3": TunicLocationData("Lower Quarry", BreakableType.crate), + "Quarry - [West] Crate by Shooting Range 4": TunicLocationData("Lower Quarry", BreakableType.crate), + "Quarry - [West] Crate by Shooting Range 5": TunicLocationData("Lower Quarry", BreakableType.crate), + "Quarry - [West] Crate near Isolated Chest 1": TunicLocationData("Lower Quarry", BreakableType.crate), + "Quarry - [West] Crate near Isolated Chest 2": TunicLocationData("Lower Quarry", BreakableType.crate), + "Quarry - [West] Crate near Isolated Chest 3": TunicLocationData("Lower Quarry", BreakableType.crate), + "Quarry - [West] Crate near Isolated Chest 4": TunicLocationData("Lower Quarry", BreakableType.crate), + "Quarry - [West] Crate near Isolated Chest 5": TunicLocationData("Lower Quarry", BreakableType.crate), + "Quarry - [Lowlands] Crate 1": TunicLocationData("Even Lower Quarry", BreakableType.crate), + "Quarry - [Lowlands] Crate 2": TunicLocationData("Even Lower Quarry", BreakableType.crate), + "Monastery - Crate 1": TunicLocationData("Monastery Back", BreakableType.crate), + "Monastery - Crate 2": TunicLocationData("Monastery Back", BreakableType.crate), + "Monastery - Crate 3": TunicLocationData("Monastery Back", BreakableType.crate), + "Monastery - Crate 4": TunicLocationData("Monastery Back", BreakableType.crate), + "Monastery - Crate 5": TunicLocationData("Monastery Back", BreakableType.crate), + "Monastery - Crate 6": TunicLocationData("Monastery Back", BreakableType.crate), + "Monastery - Crate 7": TunicLocationData("Monastery Back", BreakableType.crate), + "Monastery - Crate 8": TunicLocationData("Monastery Back", BreakableType.crate), + "Monastery - Crate 9": TunicLocationData("Monastery Back", BreakableType.crate), + "Cathedral - [1F] Pot by Stairs 1": TunicLocationData("Cathedral Main", BreakableType.pot), + "Cathedral - [1F] Pot by Stairs 2": TunicLocationData("Cathedral Main", BreakableType.pot), + "Purgatory - Pot 1": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 2": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 3": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 4": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 5": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 6": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 7": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 8": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 9": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 10": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 11": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 12": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 13": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 14": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 15": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 16": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 17": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 18": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 19": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 20": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 21": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 22": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 23": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 24": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 25": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 26": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 27": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 28": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 29": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 30": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 31": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 32": TunicLocationData("Purgatory", BreakableType.pot), + "Purgatory - Pot 33": TunicLocationData("Purgatory", BreakableType.pot), + "Overworld - [Central] Break Bombable Wall": TunicLocationData("Overworld", BreakableType.wall), + "Overworld - [Southwest] Break Cube Cave Bombable Wall": TunicLocationData("Overworld", BreakableType.wall), + "Overworld - [Southwest] Break Bombable Wall near Fountain": TunicLocationData("Overworld", BreakableType.wall), + "Ruined Atoll - [Northwest] Break Bombable Wall": TunicLocationData("Ruined Atoll", BreakableType.wall), + "East Forest - Break Bombable Wall": TunicLocationData("East Forest", BreakableType.wall), + "Eastern Vault Fortress - [East Wing] Break Bombable Wall": TunicLocationData("Eastern Vault Fortress", BreakableType.wall), + "Quarry - [West] Break Upper Area Bombable Wall": TunicLocationData("Quarry Back", BreakableType.wall), + "Quarry - [East] Break Bombable Wall": TunicLocationData("Quarry", BreakableType.wall), +} + + +breakable_location_name_to_id: dict[str, int] = {name: breakable_base_id + index + for index, name in enumerate(breakable_location_table)} + + +# key is the name in the table above, value is the loc group name for the area +loc_group_convert: dict[str, str] = { + "East Overworld": "Overworld", + "Upper Overworld": "Overworld", + "Overworld to West Garden from Furnace": "Overworld", + "Forest Belltower Upper": "Forest Belltower", + "Forest Belltower Main": "Forest Belltower", + "Guard House 1 East": "Guardhouse 1", + "Guard House 2 Lower": "Guardhouse 2", + "Beneath the Well Back": "Beneath the Well", + "Beneath the Well Main": "Beneath the Well", + "Well Boss": "Dark Tomb Checkpoint", + "Dark Tomb Main": "Dark Tomb", + "Fortress Courtyard Upper": "Fortress Courtyard", + "Fortress Courtyard Upper pot": "Fortress Courtyard", + "Fortress Courtyard west pots": "Fortress Courtyard", + "Fortress Courtyard westmost pots": "Fortress Courtyard", + "Beneath the Vault Entry Spot": "Beneath the Fortress", + "Beneath the Vault Main": "Beneath the Fortress", + "Beneath the Vault Back": "Beneath the Fortress", + "Fortress Grave Path Entry": "Fortress Grave Path", + "Fortress Grave Path Combat": "Fortress Grave Path", + "Fortress Grave Path westmost pot": "Fortress Grave Path", + "Fortress Grave Path pots": "Fortress Grave Path", + "Dusty": "Fortress Leaf Piles", + "Frog Stairs Upper": "Frog Stairs", + "Quarry Monastery Entry": "Quarry", + "Quarry Back": "Quarry", + "Lower Quarry": "Quarry", + "Lower Quarry upper pots": "Quarry", + "Even Lower Quarry": "Quarry", + "Monastery Back": "Monastery", +} + + +breakable_location_groups: dict[str, set[str]] = {} +for location_name, location_data in breakable_location_table.items(): + group_name = loc_group_convert.get(location_data.er_region, location_data.er_region) + breakable_location_groups.setdefault(group_name, set()).add(location_name) + + +def can_break_breakables(state: CollectionState, world: "TunicWorld") -> bool: + return has_melee(state, world.player) or state.has_any(("Magic Wand", "Gun"), world.player) + + +# and also the table +def can_break_signs(state: CollectionState, world: "TunicWorld") -> bool: + return (has_sword(state, world.player) or state.has_any(("Magic Wand", "Gun"), world.player) + or (has_melee(state, world.player) and state.has("Glass Cannon", world.player))) + + +def can_break_leaf_piles(state: CollectionState, world: "TunicWorld") -> bool: + return has_melee(state, world.player) or state.has_any(("Magic Dagger", "Gun"), world.player) + + +def can_break_bomb_walls(state: CollectionState, world: "TunicWorld") -> bool: + return state.has("Gun", world.player) or can_shop(state, world) + + +def create_breakable_exclusive_regions(world: "TunicWorld") -> list[Region]: + player = world.player + multiworld = world.multiworld + new_regions: list[Region] = [] + + region = Region("Fortress Courtyard westmost pots", player, multiworld) + new_regions.append(region) + world.get_region("Fortress Courtyard").connect(region) + world.get_region("Fortress Exterior near cave").connect( + region, rule=lambda state: state.has_any(("Magic Wand", "Gun"), player)) + + region = Region("Fortress Courtyard west pots", player, multiworld) + new_regions.append(region) + world.get_region("Fortress Courtyard").connect(region) + world.get_region("Fortress Exterior near cave").connect( + region, rule=lambda state: state.has("Magic Wand", player)) + + region = Region("Fortress Courtyard Upper pot", player, multiworld) + new_regions.append(region) + world.get_region("Fortress Courtyard Upper").connect(region) + world.get_region("Fortress Courtyard").connect( + region, rule=lambda state: state.has("Magic Wand", player)) + + region = Region("Fortress Grave Path westmost pot", player, multiworld) + new_regions.append(region) + world.get_region("Fortress Grave Path Entry").connect(region) + world.get_region("Fortress Grave Path Upper").connect( + region, rule=lambda state: state.has_any(("Magic Wand", "Gun"), player)) + + region = Region("Fortress Grave Path pots", player, multiworld) + new_regions.append(region) + world.get_region("Fortress Grave Path by Grave").connect(region) + world.get_region("Fortress Grave Path Dusty Entrance Region").connect( + region, rule=lambda state: state.has("Magic Wand", player)) + + region = Region("Lower Quarry upper pots", player, multiworld) + new_regions.append(region) + world.get_region("Lower Quarry").connect(region) + world.get_region("Quarry Back").connect( + region, rule=lambda state: state.has_any(("Magic Wand", "Gun"), player)) + + for region in new_regions: + multiworld.regions.append(region) + + return new_regions + + +def set_breakable_location_rules(world: "TunicWorld") -> None: + for loc_name, loc_data in breakable_location_table.items(): + if not world.options.entrance_rando and loc_data.er_region == "Purgatory": + continue + location = world.get_location(loc_name) + if loc_data.breakable == BreakableType.leaves: + set_rule(location, lambda state: can_break_leaf_piles(state, world)) + elif loc_data.breakable in (BreakableType.sign, BreakableType.table): + set_rule(location, lambda state: can_break_signs(state, world)) + elif loc_data.breakable == BreakableType.wall: + set_rule(location, lambda state: can_break_bomb_walls(state, world)) + else: + set_rule(location, lambda state: can_break_breakables(state, world)) diff --git a/worlds/tunic/er_data.py b/worlds/tunic/er_data.py index f1a428cce1..0b3a16167a 100644 --- a/worlds/tunic/er_data.py +++ b/worlds/tunic/er_data.py @@ -679,8 +679,9 @@ tunic_er_regions: Dict[str, RegionInfo] = { "Fortress Courtyard": RegionInfo("Fortress Courtyard"), "Fortress Courtyard Upper": RegionInfo("Fortress Courtyard"), "Beneath the Vault Ladder Exit": RegionInfo("Fortress Basement"), - "Beneath the Vault Main": RegionInfo("Fortress Basement"), # the vanilla entry point - "Beneath the Vault Back": RegionInfo("Fortress Basement"), # the vanilla exit point + "Beneath the Vault Entry Spot": RegionInfo("Fortress Basement"), # where the boxes are + "Beneath the Vault Main": RegionInfo("Fortress Basement"), + "Beneath the Vault Back": RegionInfo("Fortress Basement"), "Eastern Vault Fortress": RegionInfo("Fortress Main"), "Eastern Vault Fortress Gold Door": RegionInfo("Fortress Main"), "Fortress East Shortcut Upper": RegionInfo("Fortress East"), @@ -1421,11 +1422,17 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { }, "Beneath the Vault Ladder Exit": { + "Beneath the Vault Entry Spot": + [], + }, + "Beneath the Vault Entry Spot": { "Beneath the Vault Main": [], + "Beneath the Vault Ladder Exit": + [], }, "Beneath the Vault Main": { - "Beneath the Vault Ladder Exit": + "Beneath the Vault Entry Spot": [], "Beneath the Vault Back": [], diff --git a/worlds/tunic/er_rules.py b/worlds/tunic/er_rules.py index fe01337c64..7a3264b6c4 100644 --- a/worlds/tunic/er_rules.py +++ b/worlds/tunic/er_rules.py @@ -855,16 +855,21 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Fortress Courtyard Upper"].connect( connecting_region=regions["Fortress Exterior from Overworld"]) - btv_front_to_main = regions["Beneath the Vault Ladder Exit"].connect( + regions["Beneath the Vault Ladder Exit"].connect( + connecting_region=regions["Beneath the Vault Entry Spot"], + rule=lambda state: has_ladder("Ladder to Beneath the Vault", state, world)) + regions["Beneath the Vault Entry Spot"].connect( + connecting_region=regions["Beneath the Vault Ladder Exit"], + rule=lambda state: has_ladder("Ladder to Beneath the Vault", state, world)) + + btv_front_to_main = regions["Beneath the Vault Entry Spot"].connect( connecting_region=regions["Beneath the Vault Main"], - rule=lambda state: has_ladder("Ladder to Beneath the Vault", state, world) - and has_lantern(state, world) + rule=lambda state: has_lantern(state, world) # there's some boxes in the way and (has_melee(state, player) or state.has_any((gun, grapple, fire_wand, laurels), player))) # on the reverse trip, you can lure an enemy over to break the boxes if needed regions["Beneath the Vault Main"].connect( - connecting_region=regions["Beneath the Vault Ladder Exit"], - rule=lambda state: has_ladder("Ladder to Beneath the Vault", state, world)) + connecting_region=regions["Beneath the Vault Entry Spot"]) regions["Beneath the Vault Main"].connect( connecting_region=regions["Beneath the Vault Back"]) diff --git a/worlds/tunic/er_scripts.py b/worlds/tunic/er_scripts.py index 4cd0f49ddf..ddb4ec6c58 100644 --- a/worlds/tunic/er_scripts.py +++ b/worlds/tunic/er_scripts.py @@ -3,6 +3,7 @@ from BaseClasses import Region, ItemClassification, Item, Location from .locations import all_locations from .er_data import Portal, portal_mapping, traversal_requirements, DeadEnd, RegionInfo from .er_rules import set_er_region_rules +from .breakables import create_breakable_exclusive_regions, set_breakable_location_rules from Options import PlandoConnection from .options import EntranceRando from random import Random @@ -22,19 +23,26 @@ class TunicERLocation(Location): def create_er_regions(world: "TunicWorld") -> Dict[Portal, Portal]: regions: Dict[str, Region] = {} + for region_name, region_data in world.er_regions.items(): + if world.options.entrance_rando and region_name == "Zig Skip Exit": + # need to check if there's a seed group for this first + if world.options.entrance_rando.value not in EntranceRando.options.values(): + if not world.seed_groups[world.options.entrance_rando.value]["fixed_shop"]: + continue + elif not world.options.fixed_shop: + continue + if not world.options.entrance_rando and region_name in ("Zig Skip Exit", "Purgatory"): + continue + + region = Region(region_name, world.player, world.multiworld) + regions[region_name] = region + world.multiworld.regions.append(region) + + if world.options.breakable_shuffle: + breakable_regions = create_breakable_exclusive_regions(world) + regions.update({region.name: region for region in breakable_regions}) if world.options.entrance_rando: - for region_name, region_data in world.er_regions.items(): - # if fewer shops is off, zig skip is not made - if region_name == "Zig Skip Exit": - # need to check if there's a seed group for this first - if world.options.entrance_rando.value not in EntranceRando.options.values(): - if not world.seed_groups[world.options.entrance_rando.value]["fixed_shop"]: - continue - elif not world.options.fixed_shop: - continue - regions[region_name] = Region(region_name, world.player, world.multiworld) - portal_pairs = pair_portals(world, regions) # output the entrances to the spoiler log here for convenience @@ -42,11 +50,6 @@ def create_er_regions(world: "TunicWorld") -> Dict[Portal, Portal]: for portal1, portal2 in sorted_portal_pairs.items(): world.multiworld.spoiler.set_entrance(portal1, portal2, "both", world.player) else: - for region_name, region_data in world.er_regions.items(): - # filter out regions that are inaccessible in non-er - if region_name not in ["Zig Skip Exit", "Purgatory"]: - regions[region_name] = Region(region_name, world.player, world.multiworld) - portal_pairs = vanilla_portals(world, regions) create_randomized_entrances(portal_pairs, regions) @@ -58,8 +61,8 @@ def create_er_regions(world: "TunicWorld") -> Dict[Portal, Portal]: location = TunicERLocation(world.player, location_name, location_id, region) region.locations.append(location) - for region in regions.values(): - world.multiworld.regions.append(region) + if world.options.breakable_shuffle: + set_breakable_location_rules(world) place_event_items(world, regions) @@ -557,4 +560,3 @@ def sort_portals(portal_pairs: Dict[Portal, Portal]) -> Dict[str, str]: sorted_pairs[portal1.name] = portal2.name break return sorted_pairs - diff --git a/worlds/tunic/items.py b/worlds/tunic/items.py index 20696eb511..1898534c1b 100644 --- a/worlds/tunic/items.py +++ b/worlds/tunic/items.py @@ -103,6 +103,10 @@ item_table: Dict[str, TunicItemData] = { "Forever Friend": TunicItemData(IC.useful, 1, 84, "Golden Treasures", combat_ic=IC.progression), "Fool Trap": TunicItemData(IC.trap, 0, 85), "Money x1": TunicItemData(IC.filler, 3, 86, "Money"), + "Money x2": TunicItemData(IC.filler, 0, 152, "Money"), + "Money x3": TunicItemData(IC.filler, 0, 153, "Money"), + "Money x4": TunicItemData(IC.filler, 0, 154, "Money"), + "Money x5": TunicItemData(IC.filler, 0, 155, "Money"), "Money x10": TunicItemData(IC.filler, 1, 87, "Money"), "Money x15": TunicItemData(IC.filler, 10, 88, "Money"), "Money x16": TunicItemData(IC.filler, 1, 89, "Money"), diff --git a/worlds/tunic/locations.py b/worlds/tunic/locations.py index d3c23406ed..18c0fb3c13 100644 --- a/worlds/tunic/locations.py +++ b/worlds/tunic/locations.py @@ -1,5 +1,6 @@ from typing import Dict, NamedTuple, Set, Optional, List from .grass import grass_location_table +from .breakables import breakable_location_table class TunicLocationData(NamedTuple): @@ -342,6 +343,7 @@ standard_location_name_to_id: Dict[str, int] = {name: location_base_id + index f all_locations = location_table.copy() all_locations.update(grass_location_table) +all_locations.update(breakable_location_table) location_name_groups: Dict[str, Set[str]] = {} for loc_name, loc_data in location_table.items(): diff --git a/worlds/tunic/options.py b/worlds/tunic/options.py index 3ace28cffa..c17b085b11 100644 --- a/worlds/tunic/options.py +++ b/worlds/tunic/options.py @@ -313,6 +313,14 @@ class LogicRules(Choice): default = 0 +class BreakableShuffle(Toggle): + """ + Turns approximately 250 breakable objects in the game into checks. + """ + internal_name = "breakable_shuffle" + display_name = "Breakable Shuffle" + + @dataclass class TunicOptions(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool @@ -331,6 +339,7 @@ class TunicOptions(PerGameCommonOptions): shuffle_ladders: ShuffleLadders grass_randomizer: GrassRandomizer + breakable_shuffle: BreakableShuffle local_fill: LocalFill entrance_rando: EntranceRando From 5662da6f7d2e9d498ea3fd536bc27981aae10774 Mon Sep 17 00:00:00 2001 From: sgrunt Date: Sat, 8 Mar 2025 09:54:23 -0700 Subject: [PATCH 082/227] Timespinner: Support new flags and settings from the randomizer (#4559) * Timespinner: Add "no hell spiders" enemy rando option that is present in upstream settings * Timespinner: Prism Break support tweaks (including tracker support) * Timespinner: Add support for upstream Lock Key Amadeus flag * Timespinner: Add support for upstream Risky Warps flag * Timespinner: Add support for upstream Pyramid Start flag * Timespinner: fix error in lab connectivity logic * Timespinner: use has_all to simplify one check Per PR suggestion. Co-authored-by: Scipio Wright * Timespinner: fix apparent logic error inherited from in-rando logic * Timespinner: adjust "Origins" location logic slightly further to account for a Risky Warps case * Timespinner: remove the backward compat options for the recent flag additions * Timespinner: add newly added Gate Keep option from rando * Timespinner: adjust the laser access colours in the tracker * Timespinner: fix an item description in the tracker * Timespinner: based on testing feedback, put Laser Access items in their own category * Timespinner: add support for new upstream flag Royal Roadblock * Timespinner: also ensure the new flag gets put in slot data * Timespinner: fix bug in universal tracker support indicating castle basement is accessible at the lower Rising Tides flooding level * Timespinner: exclude Talaria Attachment and Timespinner Wheel from pyramid start starter progression items * Timespinner: fix region logic for the left pyramid warp * Timespinner: fix main Gyre access logic when Risky Warps warps you behind the lasers * Timespinner: apply suggested spacing fix Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --------- Co-authored-by: sgrunt Co-authored-by: Scipio Wright --- .../static/styles/timespinnerTracker.css | 21 +++++++++ .../templates/tracker__Timespinner.html | 46 +++++++++++++++++++ WebHostLib/tracker.py | 8 ++++ worlds/timespinner/Items.py | 26 +++++++++-- worlds/timespinner/Locations.py | 28 +++++++---- worlds/timespinner/LogicExtensions.py | 1 + worlds/timespinner/Options.py | 26 +++++++++++ worlds/timespinner/PreCalculatedWeights.py | 16 +++++-- worlds/timespinner/Regions.py | 26 +++++++---- worlds/timespinner/__init__.py | 32 +++++++++++-- 10 files changed, 196 insertions(+), 34 deletions(-) diff --git a/WebHostLib/static/styles/timespinnerTracker.css b/WebHostLib/static/styles/timespinnerTracker.css index 007c6a19ba..640b584684 100644 --- a/WebHostLib/static/styles/timespinnerTracker.css +++ b/WebHostLib/static/styles/timespinnerTracker.css @@ -75,6 +75,27 @@ #inventory-table img.acquired.green{ /*32CD32*/ filter: hue-rotate(84deg) saturate(10) brightness(0.7); } +#inventory-table img.acquired.hotpink{ /*FF69B4*/ + filter: sepia(100%) hue-rotate(300deg) saturate(10); +} +#inventory-table img.acquired.lightsalmon{ /*FFA07A*/ + filter: sepia(100%) hue-rotate(347deg) saturate(10); +} +#inventory-table img.acquired.crimson{ /*DB143B*/ + filter: sepia(100%) hue-rotate(318deg) saturate(10) brightness(0.86); +} + +#inventory-table span{ + color: #B4B4A0; + font-size: 40px; + max-width: 40px; + max-height: 40px; + filter: grayscale(100%) contrast(75%) brightness(30%); +} + +#inventory-table span.acquired{ + filter: none; +} #inventory-table div.image-stack{ display: grid; diff --git a/WebHostLib/templates/tracker__Timespinner.html b/WebHostLib/templates/tracker__Timespinner.html index b118c33833..aa8567659c 100644 --- a/WebHostLib/templates/tracker__Timespinner.html +++ b/WebHostLib/templates/tracker__Timespinner.html @@ -99,6 +99,52 @@ {% endif %} + {% if 'PrismBreak' in options or 'LockKeyAmadeus' in options or 'GateKeep' in options %} +
+ {% if 'PrismBreak' in options %} +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ {% endif %} + {% if 'LockKeyAmadeus' in options %} +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ {% endif %} + {% if 'GateKeep' in options %} +
+ +
+ {% endif %} +
+ {% endif %} diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py index 043764a53b..3748de97a4 100644 --- a/WebHostLib/tracker.py +++ b/WebHostLib/tracker.py @@ -1071,6 +1071,11 @@ if "Timespinner" in network_data_package["games"]: "Plasma Orb": "https://timespinnerwiki.com/mediawiki/images/4/44/Plasma_Orb.png", "Kobo": "https://timespinnerwiki.com/mediawiki/images/c/c6/Familiar_Kobo.png", "Merchant Crow": "https://timespinnerwiki.com/mediawiki/images/4/4e/Familiar_Crow.png", + "Laser Access": "https://timespinnerwiki.com/mediawiki/images/9/99/Historical_Documents.png", + "Lab Glasses": "https://timespinnerwiki.com/mediawiki/images/4/4a/Lab_Glasses.png", + "Eye Orb": "https://timespinnerwiki.com/mediawiki/images/a/a4/Eye_Orb.png", + "Lab Coat": "https://timespinnerwiki.com/mediawiki/images/5/51/Lab_Coat.png", + "Demon": "https://timespinnerwiki.com/mediawiki/images/f/f8/Familiar_Demon.png", } timespinner_location_ids = { @@ -1118,6 +1123,9 @@ if "Timespinner" in network_data_package["games"]: timespinner_location_ids["Ancient Pyramid"] += [ 1337237, 1337238, 1337239, 1337240, 1337241, 1337242, 1337243, 1337244, 1337245] + if (slot_data["PyramidStart"]): + timespinner_location_ids["Ancient Pyramid"] += [ + 1337233, 1337234, 1337235] display_data = {} diff --git a/worlds/timespinner/Items.py b/worlds/timespinner/Items.py index 3beead9515..a00fca7ee5 100644 --- a/worlds/timespinner/Items.py +++ b/worlds/timespinner/Items.py @@ -199,11 +199,16 @@ item_table: Dict[str, ItemData] = { 'Chaos Trap': ItemData('Trap', 1337186, 0, trap=True), 'Neurotoxin Trap': ItemData('Trap', 1337187, 0, trap=True), 'Bee Trap': ItemData('Trap', 1337188, 0, trap=True), - 'Laser Access A': ItemData('Relic', 1337189, progression=True), - 'Laser Access I': ItemData('Relic', 1337191, progression=True), - 'Laser Access M': ItemData('Relic', 1337192, progression=True), + 'Laser Access A': ItemData('Laser Access', 1337189, progression=True), + 'Laser Access I': ItemData('Laser Access', 1337191, progression=True), + 'Laser Access M': ItemData('Laser Access', 1337192, progression=True), 'Throw Stun Trap': ItemData('Trap', 1337193, 0, trap=True), - # 1337194 - 1337248 Reserved + 'Lab Access Genza': ItemData('Lab Access', 1337194, progression=True), + 'Lab Access Experiment': ItemData('Lab Access', 1337195, progression=True), + 'Lab Access Research': ItemData('Lab Access', 1337196, progression=True), + 'Lab Access Dynamo': ItemData('Lab Access', 1337197, progression=True), + 'Drawbridge Key': ItemData('Key', 1337198, progression=True), + # 1337199 - 1337248 Reserved 'Max Sand': ItemData('Stat', 1337249, 14) } @@ -259,6 +264,17 @@ starter_progression_items: Tuple[str, ...] = ( 'Mysterious Warp Beacon' ) +pyramid_start_starter_progression_items: Tuple[str, ...] = ( + 'Succubus Hairpin', + 'Succubus Hairpin', + 'Twin Pyramid Key', + 'Celestial Sash', + 'Lightwall', + 'Modern Warp Beacon', + 'Timeworn Warp Beacon', + 'Mysterious Warp Beacon' +) + filler_items: Tuple[str, ...] = ( 'Potion', 'Ether', @@ -280,4 +296,4 @@ def get_item_names_per_category() -> Dict[str, Set[str]]: for name, data in item_table.items(): categories.setdefault(data.category, set()).add(name) - return categories \ No newline at end of file + return categories diff --git a/worlds/timespinner/Locations.py b/worlds/timespinner/Locations.py index 93ac6ccb98..644304733a 100644 --- a/worlds/timespinner/Locations.py +++ b/worlds/timespinner/Locations.py @@ -92,15 +92,15 @@ def get_location_datas(player: Optional[int], options: Optional[TimespinnerOptio LocationData('Military Fortress (hangar)', 'Military Fortress: Pedestal', 1337065, lambda state: state.has('Water Mask', player) if flooded.flood_lab else (logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state))), LocationData('The lab', 'Lab: Coffee break', 1337066), LocationData('The lab', 'Lab: Lower trash right', 1337067, logic.has_doublejump), - LocationData('The lab', 'Lab: Lower trash left', 1337068, logic.has_upwarddash), + LocationData('The lab', 'Lab: Lower trash left', 1337068, lambda state: logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash ), LocationData('The lab', 'Lab: Below lab entrance', 1337069, logic.has_doublejump), - LocationData('The lab (power off)', 'Lab: Trash jump room', 1337070), - LocationData('The lab (power off)', 'Lab: Dynamo Works', 1337071), + LocationData('The lab (power off)', 'Lab: Trash jump room', 1337070, lambda state: not options.lock_key_amadeus or logic.has_doublejump_of_npc(state) ), + LocationData('The lab (power off)', 'Lab: Dynamo Works', 1337071, lambda state: not options.lock_key_amadeus or (state.has_all(('Lab Access Research', 'Lab Access Dynamo'), player)) ), LocationData('The lab (upper)', 'Lab: Genza (Blob Mom)', 1337072), - LocationData('The lab (power off)', 'Lab: Experiment #13', 1337073), + LocationData('The lab (power off)', 'Lab: Experiment #13', 1337073, lambda state: not options.lock_key_amadeus or state.has('Lab Access Experiment', player) ), LocationData('The lab (upper)', 'Lab: Download and chest room chest', 1337074), LocationData('The lab (upper)', 'Lab: Lab secret', 1337075, logic.can_break_walls), - LocationData('The lab (power off)', 'Lab: Spider Hell', 1337076, logic.has_keycard_A), + LocationData('The lab (power off)', 'Lab: Spider Hell', 1337076, lambda state: logic.has_keycard_A and not options.lock_key_amadeus or state.has('Lab Access Research', player)), LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard bottom chest', 1337077), LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard floor secret', 1337078, lambda state: logic.has_upwarddash(state) and logic.can_break_walls(state)), LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard upper chest', 1337079, lambda state: logic.has_upwarddash(state)), @@ -214,11 +214,11 @@ def get_location_datas(player: Optional[int], options: Optional[TimespinnerOptio LocationData('Library top', 'Library: Backer room terminal (Vandagray Metropolis Map)', 1337163, lambda state: state.has('Tablet', player)), LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Medbay terminal (Bleakness Research)', 1337164, lambda state: state.has('Tablet', player) and logic.has_keycard_B(state)), LocationData('The lab (upper)', 'Lab: Download and chest room terminal (Experiment #13)', 1337165, lambda state: state.has('Tablet', player)), - LocationData('The lab (power off)', 'Lab: Middle terminal (Amadeus Laboratory Map)', 1337166, lambda state: state.has('Tablet', player)), - LocationData('The lab (power off)', 'Lab: Sentry platform terminal (Origins)', 1337167, lambda state: state.has('Tablet', player)), + LocationData('The lab (power off)', 'Lab: Middle terminal (Amadeus Laboratory Map)', 1337166, lambda state: state.has('Tablet', player) and (not options.lock_key_amadeus or state.has('Lab Access Research', player))), + LocationData('The lab (power off)', 'Lab: Sentry platform terminal (Origins)', 1337167, lambda state: state.has('Tablet', player) and (not options.lock_key_amadeus or state.has('Lab Access Genza', player) or logic.can_teleport_to(state, "Time", "GateDadsTower"))), LocationData('The lab', 'Lab: Experiment 13 terminal (W.R.E.C Farewell)', 1337168, lambda state: state.has('Tablet', player)), LocationData('The lab', 'Lab: Left terminal (Biotechnology)', 1337169, lambda state: state.has('Tablet', player)), - LocationData('The lab (power off)', 'Lab: Right terminal (Experiment #11)', 1337170, lambda state: state.has('Tablet', player)) + LocationData('The lab (power off)', 'Lab: Right terminal (Experiment #11)', 1337170, lambda state: state.has('Tablet', player) and (not options.lock_key_amadeus or state.has('Lab Access Research', player))) ) # 1337176 - 1337176 Cantoran @@ -254,7 +254,17 @@ def get_location_datas(player: Optional[int], options: Optional[TimespinnerOptio LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Journal - Lower Left Caves (Naivety)', 1337198, lambda state: not flooded.flood_maw or state.has('Water Mask', player)) ) - # 1337199 - 1337236 Reserved for future use + # 1337199 - 1337232 Reserved for future use + + # 1337233 - 1337235 Pyramid Start checks + if not options or options.pyramid_start: + location_table += ( + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Training Dummy', 1337233), + LocationData('Ancient Pyramid (entrance)', 'Temporal Gyre: Forest Entrance', 1337234, lambda state: logic.has_upwarddash(state) or logic.can_teleport_to(state, "Time", "GateGyre")), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Rubble', 1337235), + ) + + # 1337236 Nightmare door # 1337237 - 1337245 GyreArchives if not options or options.gyre_archives: diff --git a/worlds/timespinner/LogicExtensions.py b/worlds/timespinner/LogicExtensions.py index 2a0a358737..878b69ae9c 100644 --- a/worlds/timespinner/LogicExtensions.py +++ b/worlds/timespinner/LogicExtensions.py @@ -10,6 +10,7 @@ class TimespinnerLogic: flag_unchained_keys: bool flag_eye_spy: bool flag_specific_keycards: bool + flag_prism_break: bool pyramid_keys_unlock: Optional[str] present_keys_unlock: Optional[str] past_keys_unlock: Optional[str] diff --git a/worlds/timespinner/Options.py b/worlds/timespinner/Options.py index 72f2d8b35a..4cb7fbbce1 100644 --- a/worlds/timespinner/Options.py +++ b/worlds/timespinner/Options.py @@ -60,6 +60,7 @@ class EnemyRando(Choice): option_scaled = 1 option_unscaled = 2 option_ryshia = 3 + option_no_hell_spiders = 4 alias_true = 1 class DamageRando(Choice): @@ -377,6 +378,26 @@ class PrismBreak(Toggle): """Adds 3 Laser Access items to the item pool to remove the lasers blocking the military hangar area instead of needing to beat the Golden Idol, Aelana, and The Maw.""" display_name = "Prism Break" + +class LockKeyAmadeus(Toggle): + """Lasers in Amadeus' Laboratory are disabled via items, rather than by de-powering the lab. Experiments will spawn in the lab.""" + display_name = "Lock Key Amadeus" + +class RiskyWarps(Toggle): + """Expanded free-warp eligible locations, including Azure Queen, Xarion, Amadeus' Laboratory, and Emperor's Tower.""" + display_name = "Risky Warps" + +class PyramidStart(Toggle): + """Start in ???. Takes priority over Inverted. Additional chests in Dark Forest and Pyramid. Sandman door behaves as it does in Enter Sandman.""" + display_name = "Pyramid Start" + +class GateKeep(Toggle): + """The castle drawbridge starts raised, and can be lowered via item.""" + display_name = "Gate Keep" + +class RoyalRoadblock(Toggle): + """The Royal Towers entrance door requires a royal orb (Plasma Orb, Plasma Geyser, or Royal Ring) to enter.""" + display_name = "Royal Roadblock" @dataclass class TimespinnerOptions(PerGameCommonOptions, DeathLinkMixin): @@ -415,6 +436,11 @@ class TimespinnerOptions(PerGameCommonOptions, DeathLinkMixin): unchained_keys: UnchainedKeys back_to_the_future: PresentAccessWithWheelAndSpindle prism_break: PrismBreak + lock_key_amadeus: LockKeyAmadeus + risky_warps: RiskyWarps + pyramid_start: PyramidStart + gate_keep: GateKeep + royal_roadblock: RoyalRoadblock trap_chance: TrapChance traps: Traps diff --git a/worlds/timespinner/PreCalculatedWeights.py b/worlds/timespinner/PreCalculatedWeights.py index c9d80d7a70..3ad7c2c78a 100644 --- a/worlds/timespinner/PreCalculatedWeights.py +++ b/worlds/timespinner/PreCalculatedWeights.py @@ -52,11 +52,12 @@ class PreCalculatedWeights: self.flood_lab = False self.pyramid_keys_unlock, self.present_key_unlock, self.past_key_unlock, self.time_key_unlock = \ - self.get_pyramid_keys_unlocks(options, random, self.flood_maw, self.flood_xarion) + self.get_pyramid_keys_unlocks(options, random, self.flood_maw, self.flood_xarion, self.flood_lab) @staticmethod def get_pyramid_keys_unlocks(options: TimespinnerOptions, random: Random, - is_maw_flooded: bool, is_xarion_flooded: bool) -> Tuple[str, str, str, str]: + is_maw_flooded: bool, is_xarion_flooded: bool, + is_lab_flooded: bool) -> Tuple[str, str, str, str]: present_teleportation_gates: List[str] = [ "GateKittyBoss", @@ -85,10 +86,15 @@ class PreCalculatedWeights: if not is_maw_flooded: past_teleportation_gates.append("GateMaw") - if not is_xarion_flooded: - present_teleportation_gates.append("GateXarion") + if options.risky_warps: + past_teleportation_gates.append("GateLakeSereneLeft") + present_teleportation_gates.append("GateDadsTower") + if not is_xarion_flooded: + present_teleportation_gates.append("GateXarion") + if not is_lab_flooded: + present_teleportation_gates.append("GateLabEntrance") - if options.inverted: + if options.inverted or (options.pyramid_start and not options.back_to_the_future): all_gates: Tuple[str, ...] = present_teleportation_gates else: all_gates: Tuple[str, ...] = past_teleportation_gates + present_teleportation_gates diff --git a/worlds/timespinner/Regions.py b/worlds/timespinner/Regions.py index f737b461d0..51b1688f1a 100644 --- a/worlds/timespinner/Regions.py +++ b/worlds/timespinner/Regions.py @@ -106,15 +106,15 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp connect(world, player, 'Sealed Caves (Sirens)', 'Varndagroth tower right (lower)', lambda state: state.has('Elevator Keycard', player)) connect(world, player, 'Sealed Caves (Sirens)', 'Space time continuum', logic.has_teleport) connect(world, player, 'Military Fortress', 'Varndagroth tower right (lower)', logic.can_kill_all_3_bosses) - connect(world, player, 'Military Fortress', 'Temporal Gyre', lambda state: state.has('Timespinner Wheel', player)) + connect(world, player, 'Military Fortress', 'Temporal Gyre', lambda state: state.has('Timespinner Wheel', player) and logic.can_kill_all_3_bosses(state)) connect(world, player, 'Military Fortress', 'Military Fortress (hangar)', logic.has_doublejump) connect(world, player, 'Military Fortress (hangar)', 'Military Fortress') connect(world, player, 'Military Fortress (hangar)', 'The lab', lambda state: logic.has_keycard_B(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))) connect(world, player, 'Temporal Gyre', 'Military Fortress') connect(world, player, 'The lab', 'Military Fortress') - connect(world, player, 'The lab', 'The lab (power off)', logic.has_doublejump_of_npc) + connect(world, player, 'The lab', 'The lab (power off)', lambda state: options.lock_key_amadeus or logic.has_doublejump_of_npc(state)) connect(world, player, 'The lab (power off)', 'The lab', lambda state: not flooded.flood_lab or state.has('Water Mask', player)) - connect(world, player, 'The lab (power off)', 'The lab (upper)', logic.has_forwarddash_doublejump) + connect(world, player, 'The lab (power off)', 'The lab (upper)', lambda state: logic.has_forwarddash_doublejump(state) and ((not options.lock_key_amadeus) or state.has('Lab Access Genza', player))) connect(world, player, 'The lab (upper)', 'The lab (power off)') connect(world, player, 'The lab (upper)', 'Emperors tower', logic.has_forwarddash_doublejump) connect(world, player, 'The lab (upper)', 'Ancient Pyramid (entrance)', lambda state: state.has_all({'Timespinner Wheel', 'Timespinner Spindle', 'Timespinner Gear 1', 'Timespinner Gear 2', 'Timespinner Gear 3'}, player)) @@ -125,12 +125,12 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp connect(world, player, 'Sealed Caves (Xarion)', 'Skeleton Shaft') connect(world, player, 'Sealed Caves (Xarion)', 'Space time continuum', logic.has_teleport) connect(world, player, 'Refugee Camp', 'Forest') - connect(world, player, 'Refugee Camp', 'Library', lambda state: options.inverted and options.back_to_the_future and state.has_all({'Timespinner Wheel', 'Timespinner Spindle'}, player)) + connect(world, player, 'Refugee Camp', 'Library', lambda state: (options.pyramid_start or options.inverted) and options.back_to_the_future and state.has_all({'Timespinner Wheel', 'Timespinner Spindle'}, player)) connect(world, player, 'Refugee Camp', 'Space time continuum', logic.has_teleport) connect(world, player, 'Forest', 'Refugee Camp') connect(world, player, 'Forest', 'Left Side forest Caves', lambda state: flooded.flood_lake_serene_bridge or state.has('Talaria Attachment', player) or logic.has_timestop(state)) connect(world, player, 'Forest', 'Caves of Banishment (Sirens)') - connect(world, player, 'Forest', 'Castle Ramparts') + connect(world, player, 'Forest', 'Castle Ramparts', lambda state: not options.gate_keep or state.has('Drawbridge Key', player) or logic.has_upwarddash(state)) connect(world, player, 'Left Side forest Caves', 'Forest') connect(world, player, 'Left Side forest Caves', 'Upper Lake Serene', logic.has_timestop) connect(world, player, 'Left Side forest Caves', 'Lower Lake Serene', lambda state: not flooded.flood_lake_serene or state.has('Water Mask', player)) @@ -152,7 +152,7 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp connect(world, player, 'Castle Ramparts', 'Space time continuum', logic.has_teleport) connect(world, player, 'Castle Keep', 'Castle Ramparts') connect(world, player, 'Castle Keep', 'Castle Basement', lambda state: not flooded.flood_basement or state.has('Water Mask', player)) - connect(world, player, 'Castle Keep', 'Royal towers (lower)', logic.has_doublejump) + connect(world, player, 'Castle Keep', 'Royal towers (lower)', lambda state: logic.has_doublejump(state) and (not options.royal_roadblock or logic.has_pink(state))) connect(world, player, 'Castle Keep', 'Space time continuum', logic.has_teleport) connect(world, player, 'Royal towers (lower)', 'Castle Keep') connect(world, player, 'Royal towers (lower)', 'Royal towers', lambda state: state.has('Timespinner Wheel', player) or logic.has_forwarddash_doublejump(state)) @@ -162,9 +162,12 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp connect(world, player, 'Royal towers (upper)', 'Royal towers') #connect(world, player, 'Ancient Pyramid (entrance)', 'The lab (upper)', lambda state: not is_option_enabled(world, player, "EnterSandman")) connect(world, player, 'Ancient Pyramid (entrance)', 'Ancient Pyramid (left)', logic.has_doublejump) + connect(world, player, 'Ancient Pyramid (entrance)', 'Space time continuum', logic.has_teleport) connect(world, player, 'Ancient Pyramid (left)', 'Ancient Pyramid (entrance)') connect(world, player, 'Ancient Pyramid (left)', 'Ancient Pyramid (right)', lambda state: flooded.flood_pyramid_shaft or logic.has_upwarddash(state)) + connect(world, player, 'Ancient Pyramid (left)', 'Space time continuum', logic.has_teleport) connect(world, player, 'Ancient Pyramid (right)', 'Ancient Pyramid (left)', lambda state: flooded.flood_pyramid_shaft or logic.has_upwarddash(state)) + connect(world, player, 'Ancient Pyramid (right)', 'Space time continuum', logic.has_teleport) connect(world, player, 'Space time continuum', 'Lake desolation', lambda state: logic.can_teleport_to(state, "Present", "GateLakeDesolation")) connect(world, player, 'Space time continuum', 'Lower lake desolation', lambda state: logic.can_teleport_to(state, "Present", "GateKittyBoss")) connect(world, player, 'Space time continuum', 'Library', lambda state: logic.can_teleport_to(state, "Present", "GateLeftLibrary")) @@ -180,8 +183,9 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp connect(world, player, 'Space time continuum', 'Royal towers (lower)', lambda state: logic.can_teleport_to(state, "Past", "GateRoyalTowers")) connect(world, player, 'Space time continuum', 'Caves of Banishment (Maw)', lambda state: logic.can_teleport_to(state, "Past", "GateMaw")) connect(world, player, 'Space time continuum', 'Caves of Banishment (upper)', lambda state: logic.can_teleport_to(state, "Past", "GateCavesOfBanishment")) - connect(world, player, 'Space time continuum', 'Ancient Pyramid (entrance)', lambda state: logic.can_teleport_to(state, "Time", "GateGyre") or (not options.unchained_keys and options.enter_sandman)) - connect(world, player, 'Space time continuum', 'Ancient Pyramid (left)', lambda state: logic.can_teleport_to(state, "Time", "GateLeftPyramid")) + connect(world, player, 'Space time continuum', 'Military Fortress (hangar)', lambda state: logic.can_teleport_to(state, "Present", "GateLabEntrance")) + connect(world, player, 'Space time continuum', 'The lab (upper)', lambda state: logic.can_teleport_to(state, "Present", "GateDadsTower")) + connect(world, player, 'Space time continuum', 'Ancient Pyramid (entrance)', lambda state: logic.can_teleport_to(state, "Time", "GateGyre") or logic.can_teleport_to(state, "Time", "GateLeftPyramid") or (not options.unchained_keys and options.enter_sandman)) connect(world, player, 'Space time continuum', 'Ancient Pyramid (right)', lambda state: logic.can_teleport_to(state, "Time", "GateRightPyramid")) if options.gyre_archives: @@ -227,7 +231,9 @@ def connectStartingRegion(world: MultiWorld, player: int, options: TimespinnerOp tutorial = world.get_region('Tutorial', player) space_time_continuum = world.get_region('Space time continuum', player) - if options.inverted: + if options.pyramid_start: + starting_region = world.get_region('Ancient Pyramid (entrance)', player) + elif options.inverted: starting_region = world.get_region('Refugee Camp', player) else: starting_region = world.get_region('Lake desolation', player) @@ -264,4 +270,4 @@ def split_location_datas_per_region(locations: List[LocationData]) -> Dict[str, for location in locations: per_region.setdefault(location.region, []).append(location) - return per_region \ No newline at end of file + return per_region diff --git a/worlds/timespinner/__init__.py b/worlds/timespinner/__init__.py index ca31d08326..4d1efc41e5 100644 --- a/worlds/timespinner/__init__.py +++ b/worlds/timespinner/__init__.py @@ -1,7 +1,7 @@ from typing import Dict, List, Set, Tuple, TextIO, Any, Optional from BaseClasses import Item, Tutorial, ItemClassification from .Items import get_item_names_per_category -from .Items import item_table, starter_melee_weapons, starter_spells, filler_items, starter_progression_items +from .Items import item_table, starter_melee_weapons, starter_spells, filler_items, starter_progression_items, pyramid_start_starter_progression_items from .Locations import get_location_datas, EventId from .Options import BackwardsCompatiableTimespinnerOptions, Toggle from .PreCalculatedWeights import PreCalculatedWeights @@ -126,6 +126,11 @@ class TimespinnerWorld(World): "UnchainedKeys": self.options.unchained_keys.value, "PresentAccessWithWheelAndSpindle": self.options.back_to_the_future.value, "PrismBreak": self.options.prism_break.value, + "LockKeyAmadeus": self.options.lock_key_amadeus.value, + "RiskyWarps": self.options.risky_warps.value, + "PyramidStart": self.options.pyramid_start.value, + "GateKeep": self.options.gate_keep.value, + "RoyalRoadblock": self.options.royal_roadblock.value, "Traps": self.options.traps.value, "DeathLink": self.options.death_link.value, "StinkyMaw": True, @@ -203,7 +208,7 @@ class TimespinnerWorld(World): self.precalculated_weights.past_key_unlock = slot_data["PastGate"] self.precalculated_weights.time_key_unlock = slot_data["TimeGate"] # rising tides - if (slot_data["Basement"] > 1): + if (slot_data["Basement"] > 0): self.precalculated_weights.flood_basement = True if (slot_data["Basement"] == 2): self.precalculated_weights.flood_basement_high = True @@ -304,6 +309,11 @@ class TimespinnerWorld(World): elif name in {"Laser Access A", "Laser Access I", "Laser Access M"} \ and not self.options.prism_break: item.classification = ItemClassification.filler + elif name in {"Lab Access Genza", "Lab Access Experiment", "Lab Access Research", "Lab Access Dynamo"} \ + and not self.options.lock_key_amadeus: + item.classification = ItemClassification.filler + elif name == "Drawbridge Key" and not self.options.gate_keep: + item.classification = ItemClassification.filler return item @@ -341,6 +351,15 @@ class TimespinnerWorld(World): excluded_items.add('Laser Access I') excluded_items.add('Laser Access M') + if not self.options.lock_key_amadeus: + excluded_items.add('Lab Access Genza') + excluded_items.add('Lab Access Experiment') + excluded_items.add('Lab Access Research') + excluded_items.add('Lab Access Dynamo') + + if not self.options.gate_keep: + excluded_items.add('Drawbridge Key') + for item in self.multiworld.precollected_items[self.player]: if item.name not in self.item_name_groups['UseItem']: excluded_items.add(item.name) @@ -376,15 +395,18 @@ class TimespinnerWorld(World): self.place_locked_item(excluded_items, location, item_name) def place_first_progression_item(self, excluded_items: Set[str]) -> None: - if self.options.quick_seed or self.options.inverted or self.precalculated_weights.flood_lake_desolation: + if (self.options.quick_seed or self.options.inverted or self.precalculated_weights.flood_lake_desolation) \ + and not self.options.pyramid_start: return + enabled_starter_progression_items = pyramid_start_starter_progression_items if self.options.pyramid_start else starter_progression_items + for item_name in self.options.start_inventory.value.keys(): - if item_name in starter_progression_items: + if item_name in enabled_starter_progression_items: return local_starter_progression_items = tuple( - item for item in starter_progression_items + item for item in enabled_starter_progression_items if item not in excluded_items and item not in self.options.non_local_items.value) if not local_starter_progression_items: From 3986f6f11ae82e312eb3d7605d831ffc35a7275b Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Sat, 8 Mar 2025 08:57:16 -0800 Subject: [PATCH 083/227] Pokemon Emerald: Randomize rock smash encounters (#3912) * Pokemon Emerald: WIP add rock smash encounter randomization * Pokemon Emerald: Refactor encounter data on maps * Pokemon Emerald: Remove unused import * Pokemon Emerald: Swap StrEnum for regular Enum and use .value --- worlds/pokemon_emerald/__init__.py | 59 +---- worlds/pokemon_emerald/data.py | 34 +-- .../pokemon_emerald/data/extracted_data.json | 2 +- worlds/pokemon_emerald/pokemon.py | 211 ++++++++++-------- worlds/pokemon_emerald/regions.py | 20 +- worlds/pokemon_emerald/rom.py | 10 +- worlds/pokemon_emerald/util.py | 24 +- 7 files changed, 179 insertions(+), 181 deletions(-) diff --git a/worlds/pokemon_emerald/__init__.py b/worlds/pokemon_emerald/__init__.py index 50d6279179..9996bfc6b7 100644 --- a/worlds/pokemon_emerald/__init__.py +++ b/worlds/pokemon_emerald/__init__.py @@ -27,6 +27,7 @@ from .pokemon import (get_random_move, get_species_id_by_label, randomize_abilit randomize_legendary_encounters, randomize_misc_pokemon, randomize_starters, randomize_tm_hm_compatibility,randomize_types, randomize_wild_encounters) from .rom import PokemonEmeraldProcedurePatch, write_tokens +from .util import get_encounter_type_label class PokemonEmeraldWebWorld(WebWorld): @@ -636,32 +637,11 @@ class PokemonEmeraldWorld(World): spoiler_handle.write(f"\n\nWild Pokemon ({self.player_name}):\n\n") - slot_to_rod_suffix = { - 0: " (Old Rod)", - 1: " (Old Rod)", - 2: " (Good Rod)", - 3: " (Good Rod)", - 4: " (Good Rod)", - 5: " (Super Rod)", - 6: " (Super Rod)", - 7: " (Super Rod)", - 8: " (Super Rod)", - 9: " (Super Rod)", - } - species_maps = defaultdict(set) - for map in self.modified_maps.values(): - if map.land_encounters is not None: - for encounter in map.land_encounters.slots: - species_maps[encounter].add(map.label + " (Land)") - - if map.water_encounters is not None: - for encounter in map.water_encounters.slots: - species_maps[encounter].add(map.label + " (Water)") - - if map.fishing_encounters is not None: - for slot, encounter in enumerate(map.fishing_encounters.slots): - species_maps[encounter].add(map.label + slot_to_rod_suffix[slot]) + for map_data in self.modified_maps.values(): + for encounter_type, encounter_data in map_data.encounters.items(): + for i, encounter in enumerate(encounter_data.slots): + species_maps[encounter].add(f"{map_data.label} ({get_encounter_type_label(encounter_type, i)})") lines = [f"{emerald_data.species[species].label}: {', '.join(sorted(maps))}\n" for species, maps in species_maps.items()] @@ -675,32 +655,11 @@ class PokemonEmeraldWorld(World): if self.options.dexsanity: from collections import defaultdict - slot_to_rod_suffix = { - 0: " (Old Rod)", - 1: " (Old Rod)", - 2: " (Good Rod)", - 3: " (Good Rod)", - 4: " (Good Rod)", - 5: " (Super Rod)", - 6: " (Super Rod)", - 7: " (Super Rod)", - 8: " (Super Rod)", - 9: " (Super Rod)", - } - species_maps = defaultdict(set) - for map in self.modified_maps.values(): - if map.land_encounters is not None: - for encounter in map.land_encounters.slots: - species_maps[encounter].add(map.label + " (Land)") - - if map.water_encounters is not None: - for encounter in map.water_encounters.slots: - species_maps[encounter].add(map.label + " (Water)") - - if map.fishing_encounters is not None: - for slot, encounter in enumerate(map.fishing_encounters.slots): - species_maps[encounter].add(map.label + slot_to_rod_suffix[slot]) + for map_data in self.modified_maps.values(): + for encounter_type, encounter_data in map_data.encounters.items(): + for i, encounter in enumerate(encounter_data.slots): + species_maps[encounter].add(f"{map_data.label} ({get_encounter_type_label(encounter_type, i)})") hint_data[self.player] = { self.location_name_to_id[f"Pokedex - {emerald_data.species[species].label}"]: ", ".join(sorted(maps)) diff --git a/worlds/pokemon_emerald/data.py b/worlds/pokemon_emerald/data.py index 1985726283..5b5d65369c 100644 --- a/worlds/pokemon_emerald/data.py +++ b/worlds/pokemon_emerald/data.py @@ -5,7 +5,7 @@ defined data (like location labels or usable pokemon species), some cleanup and sorting, and Warp methods. """ from dataclasses import dataclass -from enum import IntEnum +from enum import IntEnum, Enum import orjson from typing import Dict, List, NamedTuple, Optional, Set, FrozenSet, Tuple, Any, Union import pkgutil @@ -148,14 +148,20 @@ class EncounterTableData(NamedTuple): address: int +# class EncounterType(StrEnum): # StrEnum introduced in python 3.11 +class EncounterType(Enum): + LAND = "LAND" + WATER = "WATER" + FISHING = "FISHING" + ROCK_SMASH = "ROCK_SMASH" + + @dataclass class MapData: name: str label: str header_address: int - land_encounters: Optional[EncounterTableData] - water_encounters: Optional[EncounterTableData] - fishing_encounters: Optional[EncounterTableData] + encounters: Dict[EncounterType, EncounterTableData] class EventData(NamedTuple): @@ -348,25 +354,27 @@ def _init() -> None: if map_name in IGNORABLE_MAPS: continue - land_encounters = None - water_encounters = None - fishing_encounters = None - + encounter_tables: Dict[EncounterType, EncounterTableData] = {} if "land_encounters" in map_json: - land_encounters = EncounterTableData( + encounter_tables[EncounterType.LAND] = EncounterTableData( map_json["land_encounters"]["slots"], map_json["land_encounters"]["address"] ) if "water_encounters" in map_json: - water_encounters = EncounterTableData( + encounter_tables[EncounterType.WATER] = EncounterTableData( map_json["water_encounters"]["slots"], map_json["water_encounters"]["address"] ) if "fishing_encounters" in map_json: - fishing_encounters = EncounterTableData( + encounter_tables[EncounterType.FISHING] = EncounterTableData( map_json["fishing_encounters"]["slots"], map_json["fishing_encounters"]["address"] ) + if "rock_smash_encounters" in map_json: + encounter_tables[EncounterType.ROCK_SMASH] = EncounterTableData( + map_json["rock_smash_encounters"]["slots"], + map_json["rock_smash_encounters"]["address"] + ) # Derive a user-facing label label = [] @@ -398,9 +406,7 @@ def _init() -> None: map_name, " ".join(label), map_json["header_address"], - land_encounters, - water_encounters, - fishing_encounters + encounter_tables ) # Load/merge region json files diff --git a/worlds/pokemon_emerald/data/extracted_data.json b/worlds/pokemon_emerald/data/extracted_data.json index fcc2cf24e7..f270637481 100644 --- a/worlds/pokemon_emerald/data/extracted_data.json +++ b/worlds/pokemon_emerald/data/extracted_data.json @@ -1 +1 @@ -{"_comment":"DO NOT MODIFY. This file was auto-generated. Your changes will likely be overwritten.","_rom_name":"pokemon emerald version / AP 5","constants":{"ABILITIES_COUNT":78,"ABILITY_AIR_LOCK":77,"ABILITY_ARENA_TRAP":71,"ABILITY_BATTLE_ARMOR":4,"ABILITY_BLAZE":66,"ABILITY_CACOPHONY":76,"ABILITY_CHLOROPHYLL":34,"ABILITY_CLEAR_BODY":29,"ABILITY_CLOUD_NINE":13,"ABILITY_COLOR_CHANGE":16,"ABILITY_COMPOUND_EYES":14,"ABILITY_CUTE_CHARM":56,"ABILITY_DAMP":6,"ABILITY_DRIZZLE":2,"ABILITY_DROUGHT":70,"ABILITY_EARLY_BIRD":48,"ABILITY_EFFECT_SPORE":27,"ABILITY_FLAME_BODY":49,"ABILITY_FLASH_FIRE":18,"ABILITY_FORECAST":59,"ABILITY_GUTS":62,"ABILITY_HUGE_POWER":37,"ABILITY_HUSTLE":55,"ABILITY_HYPER_CUTTER":52,"ABILITY_ILLUMINATE":35,"ABILITY_IMMUNITY":17,"ABILITY_INNER_FOCUS":39,"ABILITY_INSOMNIA":15,"ABILITY_INTIMIDATE":22,"ABILITY_KEEN_EYE":51,"ABILITY_LEVITATE":26,"ABILITY_LIGHTNING_ROD":31,"ABILITY_LIMBER":7,"ABILITY_LIQUID_OOZE":64,"ABILITY_MAGMA_ARMOR":40,"ABILITY_MAGNET_PULL":42,"ABILITY_MARVEL_SCALE":63,"ABILITY_MINUS":58,"ABILITY_NATURAL_CURE":30,"ABILITY_NONE":0,"ABILITY_OBLIVIOUS":12,"ABILITY_OVERGROW":65,"ABILITY_OWN_TEMPO":20,"ABILITY_PICKUP":53,"ABILITY_PLUS":57,"ABILITY_POISON_POINT":38,"ABILITY_PRESSURE":46,"ABILITY_PURE_POWER":74,"ABILITY_RAIN_DISH":44,"ABILITY_ROCK_HEAD":69,"ABILITY_ROUGH_SKIN":24,"ABILITY_RUN_AWAY":50,"ABILITY_SAND_STREAM":45,"ABILITY_SAND_VEIL":8,"ABILITY_SERENE_GRACE":32,"ABILITY_SHADOW_TAG":23,"ABILITY_SHED_SKIN":61,"ABILITY_SHELL_ARMOR":75,"ABILITY_SHIELD_DUST":19,"ABILITY_SOUNDPROOF":43,"ABILITY_SPEED_BOOST":3,"ABILITY_STATIC":9,"ABILITY_STENCH":1,"ABILITY_STICKY_HOLD":60,"ABILITY_STURDY":5,"ABILITY_SUCTION_CUPS":21,"ABILITY_SWARM":68,"ABILITY_SWIFT_SWIM":33,"ABILITY_SYNCHRONIZE":28,"ABILITY_THICK_FAT":47,"ABILITY_TORRENT":67,"ABILITY_TRACE":36,"ABILITY_TRUANT":54,"ABILITY_VITAL_SPIRIT":72,"ABILITY_VOLT_ABSORB":10,"ABILITY_WATER_ABSORB":11,"ABILITY_WATER_VEIL":41,"ABILITY_WHITE_SMOKE":73,"ABILITY_WONDER_GUARD":25,"ACRO_BIKE":1,"BAG_ITEM_CAPACITY_DIGITS":2,"BERRY_CAPACITY_DIGITS":3,"BERRY_FIRMNESS_HARD":3,"BERRY_FIRMNESS_SOFT":2,"BERRY_FIRMNESS_SUPER_HARD":5,"BERRY_FIRMNESS_UNKNOWN":0,"BERRY_FIRMNESS_VERY_HARD":4,"BERRY_FIRMNESS_VERY_SOFT":1,"BERRY_NONE":0,"BERRY_STAGE_BERRIES":5,"BERRY_STAGE_FLOWERING":4,"BERRY_STAGE_NO_BERRY":0,"BERRY_STAGE_PLANTED":1,"BERRY_STAGE_SPARKLING":255,"BERRY_STAGE_SPROUTED":2,"BERRY_STAGE_TALLER":3,"BERRY_TREES_COUNT":128,"BERRY_TREE_ROUTE_102_ORAN":2,"BERRY_TREE_ROUTE_102_PECHA":1,"BERRY_TREE_ROUTE_103_CHERI_1":5,"BERRY_TREE_ROUTE_103_CHERI_2":7,"BERRY_TREE_ROUTE_103_LEPPA":6,"BERRY_TREE_ROUTE_104_CHERI_1":8,"BERRY_TREE_ROUTE_104_CHERI_2":76,"BERRY_TREE_ROUTE_104_LEPPA":10,"BERRY_TREE_ROUTE_104_ORAN_1":4,"BERRY_TREE_ROUTE_104_ORAN_2":11,"BERRY_TREE_ROUTE_104_PECHA":13,"BERRY_TREE_ROUTE_104_SOIL_1":3,"BERRY_TREE_ROUTE_104_SOIL_2":9,"BERRY_TREE_ROUTE_104_SOIL_3":12,"BERRY_TREE_ROUTE_104_SOIL_4":75,"BERRY_TREE_ROUTE_110_NANAB_1":16,"BERRY_TREE_ROUTE_110_NANAB_2":17,"BERRY_TREE_ROUTE_110_NANAB_3":18,"BERRY_TREE_ROUTE_111_ORAN_1":80,"BERRY_TREE_ROUTE_111_ORAN_2":81,"BERRY_TREE_ROUTE_111_RAZZ_1":19,"BERRY_TREE_ROUTE_111_RAZZ_2":20,"BERRY_TREE_ROUTE_112_PECHA_1":22,"BERRY_TREE_ROUTE_112_PECHA_2":23,"BERRY_TREE_ROUTE_112_RAWST_1":21,"BERRY_TREE_ROUTE_112_RAWST_2":24,"BERRY_TREE_ROUTE_114_PERSIM_1":68,"BERRY_TREE_ROUTE_114_PERSIM_2":77,"BERRY_TREE_ROUTE_114_PERSIM_3":78,"BERRY_TREE_ROUTE_115_BLUK_1":55,"BERRY_TREE_ROUTE_115_BLUK_2":56,"BERRY_TREE_ROUTE_115_KELPSY_1":69,"BERRY_TREE_ROUTE_115_KELPSY_2":70,"BERRY_TREE_ROUTE_115_KELPSY_3":71,"BERRY_TREE_ROUTE_116_CHESTO_1":26,"BERRY_TREE_ROUTE_116_CHESTO_2":66,"BERRY_TREE_ROUTE_116_PINAP_1":25,"BERRY_TREE_ROUTE_116_PINAP_2":67,"BERRY_TREE_ROUTE_117_WEPEAR_1":27,"BERRY_TREE_ROUTE_117_WEPEAR_2":28,"BERRY_TREE_ROUTE_117_WEPEAR_3":29,"BERRY_TREE_ROUTE_118_SITRUS_1":31,"BERRY_TREE_ROUTE_118_SITRUS_2":33,"BERRY_TREE_ROUTE_118_SOIL":32,"BERRY_TREE_ROUTE_119_HONDEW_1":83,"BERRY_TREE_ROUTE_119_HONDEW_2":84,"BERRY_TREE_ROUTE_119_LEPPA":86,"BERRY_TREE_ROUTE_119_POMEG_1":34,"BERRY_TREE_ROUTE_119_POMEG_2":35,"BERRY_TREE_ROUTE_119_POMEG_3":36,"BERRY_TREE_ROUTE_119_SITRUS":85,"BERRY_TREE_ROUTE_120_ASPEAR_1":37,"BERRY_TREE_ROUTE_120_ASPEAR_2":38,"BERRY_TREE_ROUTE_120_ASPEAR_3":39,"BERRY_TREE_ROUTE_120_NANAB":44,"BERRY_TREE_ROUTE_120_PECHA_1":40,"BERRY_TREE_ROUTE_120_PECHA_2":41,"BERRY_TREE_ROUTE_120_PECHA_3":42,"BERRY_TREE_ROUTE_120_PINAP":45,"BERRY_TREE_ROUTE_120_RAZZ":43,"BERRY_TREE_ROUTE_120_WEPEAR":46,"BERRY_TREE_ROUTE_121_ASPEAR":48,"BERRY_TREE_ROUTE_121_CHESTO":50,"BERRY_TREE_ROUTE_121_NANAB_1":52,"BERRY_TREE_ROUTE_121_NANAB_2":53,"BERRY_TREE_ROUTE_121_PERSIM":47,"BERRY_TREE_ROUTE_121_RAWST":49,"BERRY_TREE_ROUTE_121_SOIL_1":51,"BERRY_TREE_ROUTE_121_SOIL_2":54,"BERRY_TREE_ROUTE_123_GREPA_1":60,"BERRY_TREE_ROUTE_123_GREPA_2":61,"BERRY_TREE_ROUTE_123_GREPA_3":65,"BERRY_TREE_ROUTE_123_GREPA_4":72,"BERRY_TREE_ROUTE_123_LEPPA_1":62,"BERRY_TREE_ROUTE_123_LEPPA_2":64,"BERRY_TREE_ROUTE_123_PECHA":87,"BERRY_TREE_ROUTE_123_POMEG_1":15,"BERRY_TREE_ROUTE_123_POMEG_2":30,"BERRY_TREE_ROUTE_123_POMEG_3":58,"BERRY_TREE_ROUTE_123_POMEG_4":59,"BERRY_TREE_ROUTE_123_QUALOT_1":14,"BERRY_TREE_ROUTE_123_QUALOT_2":73,"BERRY_TREE_ROUTE_123_QUALOT_3":74,"BERRY_TREE_ROUTE_123_QUALOT_4":79,"BERRY_TREE_ROUTE_123_RAWST":57,"BERRY_TREE_ROUTE_123_SITRUS":88,"BERRY_TREE_ROUTE_123_SOIL":63,"BERRY_TREE_ROUTE_130_LIECHI":82,"DAILY_FLAGS_END":2399,"DAILY_FLAGS_START":2336,"FIRST_BALL":1,"FIRST_BERRY_INDEX":133,"FIRST_BERRY_MASTER_BERRY":153,"FIRST_BERRY_MASTER_WIFE_BERRY":133,"FIRST_KIRI_BERRY":153,"FIRST_MAIL_INDEX":121,"FIRST_ROUTE_114_MAN_BERRY":148,"FLAGS_COUNT":2400,"FLAG_ADDED_MATCH_CALL_TO_POKENAV":304,"FLAG_ADVENTURE_STARTED":116,"FLAG_ARRIVED_AT_MARINE_CAVE_EMERGE_SPOT":2265,"FLAG_ARRIVED_AT_NAVEL_ROCK":2273,"FLAG_ARRIVED_AT_TERRA_CAVE_ENTRANCE":2266,"FLAG_ARRIVED_ON_FARAWAY_ISLAND":2264,"FLAG_BADGE01_GET":2151,"FLAG_BADGE02_GET":2152,"FLAG_BADGE03_GET":2153,"FLAG_BADGE04_GET":2154,"FLAG_BADGE05_GET":2155,"FLAG_BADGE06_GET":2156,"FLAG_BADGE07_GET":2157,"FLAG_BADGE08_GET":2158,"FLAG_BATTLE_FRONTIER_TRADE_DONE":156,"FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS":313,"FLAG_BEAUTY_PAINTING_MADE":161,"FLAG_BERRY_MASTERS_WIFE":1197,"FLAG_BERRY_MASTER_RECEIVED_BERRY_1":1195,"FLAG_BERRY_MASTER_RECEIVED_BERRY_2":1196,"FLAG_BERRY_TREES_START":612,"FLAG_BERRY_TREE_01":612,"FLAG_BERRY_TREE_02":613,"FLAG_BERRY_TREE_03":614,"FLAG_BERRY_TREE_04":615,"FLAG_BERRY_TREE_05":616,"FLAG_BERRY_TREE_06":617,"FLAG_BERRY_TREE_07":618,"FLAG_BERRY_TREE_08":619,"FLAG_BERRY_TREE_09":620,"FLAG_BERRY_TREE_10":621,"FLAG_BERRY_TREE_11":622,"FLAG_BERRY_TREE_12":623,"FLAG_BERRY_TREE_13":624,"FLAG_BERRY_TREE_14":625,"FLAG_BERRY_TREE_15":626,"FLAG_BERRY_TREE_16":627,"FLAG_BERRY_TREE_17":628,"FLAG_BERRY_TREE_18":629,"FLAG_BERRY_TREE_19":630,"FLAG_BERRY_TREE_20":631,"FLAG_BERRY_TREE_21":632,"FLAG_BERRY_TREE_22":633,"FLAG_BERRY_TREE_23":634,"FLAG_BERRY_TREE_24":635,"FLAG_BERRY_TREE_25":636,"FLAG_BERRY_TREE_26":637,"FLAG_BERRY_TREE_27":638,"FLAG_BERRY_TREE_28":639,"FLAG_BERRY_TREE_29":640,"FLAG_BERRY_TREE_30":641,"FLAG_BERRY_TREE_31":642,"FLAG_BERRY_TREE_32":643,"FLAG_BERRY_TREE_33":644,"FLAG_BERRY_TREE_34":645,"FLAG_BERRY_TREE_35":646,"FLAG_BERRY_TREE_36":647,"FLAG_BERRY_TREE_37":648,"FLAG_BERRY_TREE_38":649,"FLAG_BERRY_TREE_39":650,"FLAG_BERRY_TREE_40":651,"FLAG_BERRY_TREE_41":652,"FLAG_BERRY_TREE_42":653,"FLAG_BERRY_TREE_43":654,"FLAG_BERRY_TREE_44":655,"FLAG_BERRY_TREE_45":656,"FLAG_BERRY_TREE_46":657,"FLAG_BERRY_TREE_47":658,"FLAG_BERRY_TREE_48":659,"FLAG_BERRY_TREE_49":660,"FLAG_BERRY_TREE_50":661,"FLAG_BERRY_TREE_51":662,"FLAG_BERRY_TREE_52":663,"FLAG_BERRY_TREE_53":664,"FLAG_BERRY_TREE_54":665,"FLAG_BERRY_TREE_55":666,"FLAG_BERRY_TREE_56":667,"FLAG_BERRY_TREE_57":668,"FLAG_BERRY_TREE_58":669,"FLAG_BERRY_TREE_59":670,"FLAG_BERRY_TREE_60":671,"FLAG_BERRY_TREE_61":672,"FLAG_BERRY_TREE_62":673,"FLAG_BERRY_TREE_63":674,"FLAG_BERRY_TREE_64":675,"FLAG_BERRY_TREE_65":676,"FLAG_BERRY_TREE_66":677,"FLAG_BERRY_TREE_67":678,"FLAG_BERRY_TREE_68":679,"FLAG_BERRY_TREE_69":680,"FLAG_BERRY_TREE_70":681,"FLAG_BERRY_TREE_71":682,"FLAG_BERRY_TREE_72":683,"FLAG_BERRY_TREE_73":684,"FLAG_BERRY_TREE_74":685,"FLAG_BERRY_TREE_75":686,"FLAG_BERRY_TREE_76":687,"FLAG_BERRY_TREE_77":688,"FLAG_BERRY_TREE_78":689,"FLAG_BERRY_TREE_79":690,"FLAG_BERRY_TREE_80":691,"FLAG_BERRY_TREE_81":692,"FLAG_BERRY_TREE_82":693,"FLAG_BERRY_TREE_83":694,"FLAG_BERRY_TREE_84":695,"FLAG_BERRY_TREE_85":696,"FLAG_BERRY_TREE_86":697,"FLAG_BERRY_TREE_87":698,"FLAG_BERRY_TREE_88":699,"FLAG_BETTER_SHOPS_ENABLED":206,"FLAG_BIRCH_AIDE_MET":88,"FLAG_CANCEL_BATTLE_ROOM_CHALLENGE":119,"FLAG_CAUGHT_DEOXYS":429,"FLAG_CAUGHT_GROUDON":480,"FLAG_CAUGHT_HO_OH":146,"FLAG_CAUGHT_KYOGRE":479,"FLAG_CAUGHT_LATIAS":457,"FLAG_CAUGHT_LATIOS":482,"FLAG_CAUGHT_LUGIA":145,"FLAG_CAUGHT_MEW":458,"FLAG_CAUGHT_RAYQUAZA":478,"FLAG_CAUGHT_REGICE":427,"FLAG_CAUGHT_REGIROCK":426,"FLAG_CAUGHT_REGISTEEL":483,"FLAG_CHOSEN_MULTI_BATTLE_NPC_PARTNER":338,"FLAG_CHOSE_CLAW_FOSSIL":336,"FLAG_CHOSE_ROOT_FOSSIL":335,"FLAG_COLLECTED_ALL_GOLD_SYMBOLS":466,"FLAG_COLLECTED_ALL_SILVER_SYMBOLS":92,"FLAG_CONTEST_SKETCH_CREATED":270,"FLAG_COOL_PAINTING_MADE":160,"FLAG_CUTE_PAINTING_MADE":162,"FLAG_DAILY_APPRENTICE_LEAVES":2356,"FLAG_DAILY_BERRY_MASTERS_WIFE":2353,"FLAG_DAILY_BERRY_MASTER_RECEIVED_BERRY":2349,"FLAG_DAILY_CONTEST_LOBBY_RECEIVED_BERRY":2337,"FLAG_DAILY_FLOWER_SHOP_RECEIVED_BERRY":2352,"FLAG_DAILY_LILYCOVE_RECEIVED_BERRY":2351,"FLAG_DAILY_PICKED_LOTO_TICKET":2346,"FLAG_DAILY_ROUTE_111_RECEIVED_BERRY":2348,"FLAG_DAILY_ROUTE_114_RECEIVED_BERRY":2347,"FLAG_DAILY_ROUTE_120_RECEIVED_BERRY":2350,"FLAG_DAILY_SECRET_BASE":2338,"FLAG_DAILY_SOOTOPOLIS_RECEIVED_BERRY":2354,"FLAG_DECLINED_BIKE":89,"FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE":286,"FLAG_DECLINED_WALLY_BATTLE_MAUVILLE":284,"FLAG_DECORATION_1":174,"FLAG_DECORATION_10":183,"FLAG_DECORATION_11":184,"FLAG_DECORATION_12":185,"FLAG_DECORATION_13":186,"FLAG_DECORATION_14":187,"FLAG_DECORATION_2":175,"FLAG_DECORATION_3":176,"FLAG_DECORATION_4":177,"FLAG_DECORATION_5":178,"FLAG_DECORATION_6":179,"FLAG_DECORATION_7":180,"FLAG_DECORATION_8":181,"FLAG_DECORATION_9":182,"FLAG_DEFEATED_DEOXYS":428,"FLAG_DEFEATED_DEWFORD_GYM":1265,"FLAG_DEFEATED_ELECTRODE_1_AQUA_HIDEOUT":452,"FLAG_DEFEATED_ELECTRODE_2_AQUA_HIDEOUT":453,"FLAG_DEFEATED_ELITE_4_DRAKE":1278,"FLAG_DEFEATED_ELITE_4_GLACIA":1277,"FLAG_DEFEATED_ELITE_4_PHOEBE":1276,"FLAG_DEFEATED_ELITE_4_SIDNEY":1275,"FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY":139,"FLAG_DEFEATED_FORTREE_GYM":1269,"FLAG_DEFEATED_GROUDON":447,"FLAG_DEFEATED_GRUNT_SPACE_CENTER_1F":191,"FLAG_DEFEATED_HO_OH":476,"FLAG_DEFEATED_KECLEON_1_ROUTE_119":989,"FLAG_DEFEATED_KECLEON_1_ROUTE_120":982,"FLAG_DEFEATED_KECLEON_2_ROUTE_119":990,"FLAG_DEFEATED_KECLEON_2_ROUTE_120":985,"FLAG_DEFEATED_KECLEON_3_ROUTE_120":986,"FLAG_DEFEATED_KECLEON_4_ROUTE_120":987,"FLAG_DEFEATED_KECLEON_5_ROUTE_120":988,"FLAG_DEFEATED_KEKLEON_ROUTE_120_BRIDGE":970,"FLAG_DEFEATED_KYOGRE":446,"FLAG_DEFEATED_LATIAS":456,"FLAG_DEFEATED_LATIOS":481,"FLAG_DEFEATED_LAVARIDGE_GYM":1267,"FLAG_DEFEATED_LUGIA":477,"FLAG_DEFEATED_MAGMA_SPACE_CENTER":117,"FLAG_DEFEATED_MAUVILLE_GYM":1266,"FLAG_DEFEATED_METEOR_FALLS_STEVEN":1272,"FLAG_DEFEATED_MEW":455,"FLAG_DEFEATED_MOSSDEEP_GYM":1270,"FLAG_DEFEATED_PETALBURG_GYM":1268,"FLAG_DEFEATED_RAYQUAZA":448,"FLAG_DEFEATED_REGICE":444,"FLAG_DEFEATED_REGIROCK":443,"FLAG_DEFEATED_REGISTEEL":445,"FLAG_DEFEATED_RIVAL_ROUTE103":130,"FLAG_DEFEATED_RIVAL_ROUTE_104":125,"FLAG_DEFEATED_RIVAL_RUSTBORO":211,"FLAG_DEFEATED_RUSTBORO_GYM":1264,"FLAG_DEFEATED_SEASHORE_HOUSE":141,"FLAG_DEFEATED_SOOTOPOLIS_GYM":1271,"FLAG_DEFEATED_SS_TIDAL_TRAINERS":247,"FLAG_DEFEATED_SUDOWOODO":454,"FLAG_DEFEATED_VOLTORB_1_NEW_MAUVILLE":449,"FLAG_DEFEATED_VOLTORB_2_NEW_MAUVILLE":450,"FLAG_DEFEATED_VOLTORB_3_NEW_MAUVILLE":451,"FLAG_DEFEATED_WALLY_MAUVILLE":190,"FLAG_DEFEATED_WALLY_VICTORY_ROAD":126,"FLAG_DELIVERED_DEVON_GOODS":149,"FLAG_DELIVERED_STEVEN_LETTER":189,"FLAG_DEOXYS_IS_RECOVERING":1258,"FLAG_DEOXYS_ROCK_COMPLETE":2260,"FLAG_DEVON_GOODS_STOLEN":142,"FLAG_DOCK_REJECTED_DEVON_GOODS":148,"FLAG_DONT_TRANSITION_MUSIC":16385,"FLAG_ENABLE_BRAWLY_MATCH_CALL":468,"FLAG_ENABLE_FIRST_WALLY_POKENAV_CALL":136,"FLAG_ENABLE_FLANNERY_MATCH_CALL":470,"FLAG_ENABLE_JUAN_MATCH_CALL":473,"FLAG_ENABLE_MOM_MATCH_CALL":216,"FLAG_ENABLE_MR_STONE_POKENAV":344,"FLAG_ENABLE_MULTI_CORRIDOR_DOOR":16386,"FLAG_ENABLE_NORMAN_MATCH_CALL":306,"FLAG_ENABLE_PROF_BIRCH_MATCH_CALL":281,"FLAG_ENABLE_RIVAL_MATCH_CALL":253,"FLAG_ENABLE_ROXANNE_FIRST_CALL":128,"FLAG_ENABLE_ROXANNE_MATCH_CALL":467,"FLAG_ENABLE_SCOTT_MATCH_CALL":215,"FLAG_ENABLE_SHIP_BIRTH_ISLAND":2261,"FLAG_ENABLE_SHIP_FARAWAY_ISLAND":2262,"FLAG_ENABLE_SHIP_NAVEL_ROCK":2272,"FLAG_ENABLE_SHIP_SOUTHERN_ISLAND":2227,"FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL":472,"FLAG_ENABLE_WALLY_MATCH_CALL":214,"FLAG_ENABLE_WATTSON_MATCH_CALL":469,"FLAG_ENABLE_WINONA_MATCH_CALL":471,"FLAG_ENTERED_CONTEST":341,"FLAG_ENTERED_ELITE_FOUR":263,"FLAG_ENTERED_MIRAGE_TOWER":2268,"FLAG_EVIL_LEADER_PLEASE_STOP":219,"FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE":271,"FLAG_EXCHANGED_SCANNER":294,"FLAG_FAN_CLUB_STRENGTH_SHARED":210,"FLAG_FLOWER_SHOP_RECEIVED_BERRY":1207,"FLAG_FORCE_MIRAGE_TOWER_VISIBLE":157,"FLAG_FORTREE_NPC_TRADE_COMPLETED":155,"FLAG_GOOD_LUCK_SAFARI_ZONE":93,"FLAG_GOT_BASEMENT_KEY_FROM_WATTSON":208,"FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON":209,"FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT":111,"FLAG_GROUDON_IS_RECOVERING":1274,"FLAG_HAS_MATCH_CALL":303,"FLAG_HIDDEN_ITEMS_START":500,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":531,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":532,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":533,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":534,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":601,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":604,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":603,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":602,"FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":528,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":548,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":549,"FLAG_HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":577,"FLAG_HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":576,"FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":500,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":527,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":575,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":543,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":578,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":529,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":580,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":579,"FLAG_HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":609,"FLAG_HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":595,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":561,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POTION":558,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":559,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":560,"FLAG_HIDDEN_ITEM_ROUTE_104_ANTIDOTE":585,"FLAG_HIDDEN_ITEM_ROUTE_104_HEART_SCALE":588,"FLAG_HIDDEN_ITEM_ROUTE_104_POKE_BALL":562,"FLAG_HIDDEN_ITEM_ROUTE_104_POTION":537,"FLAG_HIDDEN_ITEM_ROUTE_104_SUPER_POTION":544,"FLAG_HIDDEN_ITEM_ROUTE_105_BIG_PEARL":611,"FLAG_HIDDEN_ITEM_ROUTE_105_HEART_SCALE":589,"FLAG_HIDDEN_ITEM_ROUTE_106_HEART_SCALE":547,"FLAG_HIDDEN_ITEM_ROUTE_106_POKE_BALL":563,"FLAG_HIDDEN_ITEM_ROUTE_106_STARDUST":546,"FLAG_HIDDEN_ITEM_ROUTE_108_RARE_CANDY":586,"FLAG_HIDDEN_ITEM_ROUTE_109_ETHER":564,"FLAG_HIDDEN_ITEM_ROUTE_109_GREAT_BALL":551,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":552,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":590,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":591,"FLAG_HIDDEN_ITEM_ROUTE_109_REVIVE":550,"FLAG_HIDDEN_ITEM_ROUTE_110_FULL_HEAL":555,"FLAG_HIDDEN_ITEM_ROUTE_110_GREAT_BALL":553,"FLAG_HIDDEN_ITEM_ROUTE_110_POKE_BALL":565,"FLAG_HIDDEN_ITEM_ROUTE_110_REVIVE":554,"FLAG_HIDDEN_ITEM_ROUTE_111_PROTEIN":556,"FLAG_HIDDEN_ITEM_ROUTE_111_RARE_CANDY":557,"FLAG_HIDDEN_ITEM_ROUTE_111_STARDUST":502,"FLAG_HIDDEN_ITEM_ROUTE_113_ETHER":503,"FLAG_HIDDEN_ITEM_ROUTE_113_NUGGET":598,"FLAG_HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":530,"FLAG_HIDDEN_ITEM_ROUTE_114_CARBOS":504,"FLAG_HIDDEN_ITEM_ROUTE_114_REVIVE":542,"FLAG_HIDDEN_ITEM_ROUTE_115_HEART_SCALE":597,"FLAG_HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":596,"FLAG_HIDDEN_ITEM_ROUTE_116_SUPER_POTION":545,"FLAG_HIDDEN_ITEM_ROUTE_117_REPEL":572,"FLAG_HIDDEN_ITEM_ROUTE_118_HEART_SCALE":566,"FLAG_HIDDEN_ITEM_ROUTE_118_IRON":567,"FLAG_HIDDEN_ITEM_ROUTE_119_CALCIUM":505,"FLAG_HIDDEN_ITEM_ROUTE_119_FULL_HEAL":568,"FLAG_HIDDEN_ITEM_ROUTE_119_MAX_ETHER":587,"FLAG_HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":506,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":571,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":569,"FLAG_HIDDEN_ITEM_ROUTE_120_REVIVE":584,"FLAG_HIDDEN_ITEM_ROUTE_120_ZINC":570,"FLAG_HIDDEN_ITEM_ROUTE_121_FULL_HEAL":573,"FLAG_HIDDEN_ITEM_ROUTE_121_HP_UP":539,"FLAG_HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":600,"FLAG_HIDDEN_ITEM_ROUTE_121_NUGGET":540,"FLAG_HIDDEN_ITEM_ROUTE_123_HYPER_POTION":574,"FLAG_HIDDEN_ITEM_ROUTE_123_PP_UP":599,"FLAG_HIDDEN_ITEM_ROUTE_123_RARE_CANDY":610,"FLAG_HIDDEN_ITEM_ROUTE_123_REVIVE":541,"FLAG_HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":507,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":592,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":593,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":594,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":606,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":607,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":605,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":608,"FLAG_HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":535,"FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET":501,"FLAG_HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":511,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CALCIUM":536,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CARBOS":508,"FLAG_HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":509,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":513,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":538,"FLAG_HIDDEN_ITEM_UNDERWATER_124_PEARL":510,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":520,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":512,"FLAG_HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":514,"FLAG_HIDDEN_ITEM_UNDERWATER_126_IRON":519,"FLAG_HIDDEN_ITEM_UNDERWATER_126_PEARL":517,"FLAG_HIDDEN_ITEM_UNDERWATER_126_STARDUST":516,"FLAG_HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":515,"FLAG_HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":518,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":523,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HP_UP":522,"FLAG_HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":524,"FLAG_HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":521,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PEARL":526,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PROTEIN":525,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":581,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":582,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":583,"FLAG_HIDE_APPRENTICE":701,"FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNTS_BLOCKING_ENTRANCE":821,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_1":977,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_2":978,"FLAG_HIDE_AQUA_HIDEOUT_B2F_SUBMARINE_SHADOW":943,"FLAG_HIDE_AQUA_HIDEOUT_GRUNTS":924,"FLAG_HIDE_BATTLE_FRONTIER_RECEPTION_GATE_SCOTT":836,"FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO":842,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_1":711,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_2":712,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_3":713,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_4":714,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_5":715,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_6":716,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_1":864,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_2":865,"FLAG_HIDE_BATTLE_TOWER_OPPONENT":888,"FLAG_HIDE_BATTLE_TOWER_REPORTER":918,"FLAG_HIDE_BIRTH_ISLAND_DEOXYS_TRIANGLE":764,"FLAG_HIDE_BRINEYS_HOUSE_MR_BRINEY":739,"FLAG_HIDE_BRINEYS_HOUSE_PEEKO":881,"FLAG_HIDE_CAVE_OF_ORIGIN_B1F_WALLACE":820,"FLAG_HIDE_CHAMPIONS_ROOM_BIRCH":921,"FLAG_HIDE_CHAMPIONS_ROOM_RIVAL":920,"FLAG_HIDE_CONTEST_POKE_BALL":86,"FLAG_HIDE_DEOXYS":763,"FLAG_HIDE_DESERT_UNDERPASS_FOSSIL":874,"FLAG_HIDE_DEWFORD_HALL_SLUDGE_BOMB_MAN":940,"FLAG_HIDE_EVER_GRANDE_POKEMON_CENTER_1F_SCOTT":793,"FLAG_HIDE_FALLARBOR_AZURILL":907,"FLAG_HIDE_FALLARBOR_HOUSE_PROF_COZMO":928,"FLAG_HIDE_FALLARBOR_TOWN_BATTLE_TENT_SCOTT":767,"FLAG_HIDE_FALLORBOR_POKEMON_CENTER_LANETTE":871,"FLAG_HIDE_FANCLUB_BOY":790,"FLAG_HIDE_FANCLUB_LADY":792,"FLAG_HIDE_FANCLUB_LITTLE_BOY":791,"FLAG_HIDE_FANCLUB_OLD_LADY":789,"FLAG_HIDE_FORTREE_CITY_HOUSE_4_WINGULL":933,"FLAG_HIDE_FORTREE_CITY_KECLEON":969,"FLAG_HIDE_GRANITE_CAVE_STEVEN":833,"FLAG_HIDE_HO_OH":801,"FLAG_HIDE_JAGGED_PASS_MAGMA_GUARD":847,"FLAG_HIDE_LANETTES_HOUSE_LANETTE":870,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL":929,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL_ON_BIKE":930,"FLAG_HIDE_LILYCOVE_CITY_AQUA_GRUNTS":852,"FLAG_HIDE_LILYCOVE_CITY_RIVAL":971,"FLAG_HIDE_LILYCOVE_CITY_WAILMER":729,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER":832,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER_REPLACEMENT":873,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_1":774,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_2":895,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_REPORTER":802,"FLAG_HIDE_LILYCOVE_DEPARTMENT_STORE_ROOFTOP_SALE_WOMAN":962,"FLAG_HIDE_LILYCOVE_FAN_CLUB_INTERVIEWER":730,"FLAG_HIDE_LILYCOVE_HARBOR_EVENT_TICKET_TAKER":748,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_ATTENDANT":908,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_SAILOR":909,"FLAG_HIDE_LILYCOVE_HARBOR_SSTIDAL":861,"FLAG_HIDE_LILYCOVE_MOTEL_GAME_DESIGNERS":925,"FLAG_HIDE_LILYCOVE_MOTEL_SCOTT":787,"FLAG_HIDE_LILYCOVE_MUSEUM_CURATOR":775,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_1":776,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_2":777,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_3":778,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_4":779,"FLAG_HIDE_LILYCOVE_MUSEUM_TOURISTS":780,"FLAG_HIDE_LILYCOVE_POKEMON_CENTER_CONTEST_LADY_MON":993,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCH":795,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_BIRCH":721,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CHIKORITA":838,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CYNDAQUIL":811,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_TOTODILE":812,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_RIVAL":889,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_UNKNOWN_0x380":896,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_POKE_BALL":817,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_SWABLU_DOLL":815,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_BRENDAN":745,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_MOM":758,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_BEDROOM":760,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_MOM":784,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_SIBLING":735,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_TRUCK":761,"FLAG_HIDE_LITTLEROOT_TOWN_FAT_MAN":868,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_PICHU_DOLL":849,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_POKE_BALL":818,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MAY":746,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MOM":759,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_BEDROOM":722,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_MOM":785,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_SIBLING":736,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_TRUCK":762,"FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE":752,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_BEDROOM_MOM":757,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_1":754,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_2":755,"FLAG_HIDE_LITTLEROOT_TOWN_RIVAL":794,"FLAG_HIDE_LUGIA":800,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON":853,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON_ASLEEP":850,"FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS":857,"FLAG_HIDE_MAGMA_HIDEOUT_MAXIE":867,"FLAG_HIDE_MAP_NAME_POPUP":16384,"FLAG_HIDE_MARINE_CAVE_KYOGRE":782,"FLAG_HIDE_MAUVILLE_CITY_SCOTT":765,"FLAG_HIDE_MAUVILLE_CITY_WALLY":804,"FLAG_HIDE_MAUVILLE_CITY_WALLYS_UNCLE":805,"FLAG_HIDE_MAUVILLE_CITY_WATTSON":912,"FLAG_HIDE_MAUVILLE_GYM_WATTSON":913,"FLAG_HIDE_METEOR_FALLS_1F_1R_COZMO":942,"FLAG_HIDE_METEOR_FALLS_TEAM_AQUA":938,"FLAG_HIDE_METEOR_FALLS_TEAM_MAGMA":939,"FLAG_HIDE_MEW":718,"FLAG_HIDE_MIRAGE_TOWER_CLAW_FOSSIL":964,"FLAG_HIDE_MIRAGE_TOWER_ROOT_FOSSIL":963,"FLAG_HIDE_MOSSDEEP_CITY_HOUSE_2_WINGULL":934,"FLAG_HIDE_MOSSDEEP_CITY_SCOTT":788,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_STEVEN":753,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_TEAM_MAGMA":756,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_STEVEN":863,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA":862,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_MAGMA_NOTE":737,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_BELDUM_POKEBALL":968,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_INVISIBLE_NINJA_BOY":727,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN":967,"FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA":823,"FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN":743,"FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN":740,"FLAG_HIDE_MT_CHIMNEY_LAVA_COOKIE_LADY":994,"FLAG_HIDE_MT_CHIMNEY_TEAM_AQUA":926,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA":927,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA_BATTLEABLE":981,"FLAG_HIDE_MT_CHIMNEY_TRAINERS":877,"FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE":916,"FLAG_HIDE_MT_PYRE_SUMMIT_MAXIE":856,"FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA":917,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_1":974,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_2":975,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_3":976,"FLAG_HIDE_OLDALE_TOWN_RIVAL":979,"FLAG_HIDE_PETALBURG_CITY_SCOTT":995,"FLAG_HIDE_PETALBURG_CITY_WALLY":726,"FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD":830,"FLAG_HIDE_PETALBURG_CITY_WALLYS_MOM":728,"FLAG_HIDE_PETALBURG_GYM_GREETER":781,"FLAG_HIDE_PETALBURG_GYM_NORMAN":772,"FLAG_HIDE_PETALBURG_GYM_WALLY":866,"FLAG_HIDE_PETALBURG_GYM_WALLYS_DAD":824,"FLAG_HIDE_PETALBURG_WOODS_AQUA_GRUNT":725,"FLAG_HIDE_PETALBURG_WOODS_DEVON_EMPLOYEE":724,"FLAG_HIDE_PLAYERS_HOUSE_DAD":734,"FLAG_HIDE_POKEMON_CENTER_2F_MYSTERY_GIFT_MAN":702,"FLAG_HIDE_REGICE":936,"FLAG_HIDE_REGIROCK":935,"FLAG_HIDE_REGISTEEL":937,"FLAG_HIDE_ROUTE_101_BIRCH":897,"FLAG_HIDE_ROUTE_101_BIRCH_STARTERS_BAG":700,"FLAG_HIDE_ROUTE_101_BIRCH_ZIGZAGOON_BATTLE":720,"FLAG_HIDE_ROUTE_101_BOY":991,"FLAG_HIDE_ROUTE_101_ZIGZAGOON":750,"FLAG_HIDE_ROUTE_103_BIRCH":898,"FLAG_HIDE_ROUTE_103_RIVAL":723,"FLAG_HIDE_ROUTE_104_MR_BRINEY":738,"FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT":742,"FLAG_HIDE_ROUTE_104_RIVAL":719,"FLAG_HIDE_ROUTE_104_WHITE_HERB_FLORIST":906,"FLAG_HIDE_ROUTE_109_MR_BRINEY":741,"FLAG_HIDE_ROUTE_109_MR_BRINEY_BOAT":744,"FLAG_HIDE_ROUTE_110_BIRCH":837,"FLAG_HIDE_ROUTE_110_RIVAL":919,"FLAG_HIDE_ROUTE_110_RIVAL_ON_BIKE":922,"FLAG_HIDE_ROUTE_110_TEAM_AQUA":900,"FLAG_HIDE_ROUTE_111_DESERT_FOSSIL":876,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_1":796,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2":903,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3":799,"FLAG_HIDE_ROUTE_111_PLAYER_DESCENT":875,"FLAG_HIDE_ROUTE_111_ROCK_SMASH_TIP_GUY":843,"FLAG_HIDE_ROUTE_111_SECRET_POWER_MAN":960,"FLAG_HIDE_ROUTE_111_VICKY_WINSTRATE":771,"FLAG_HIDE_ROUTE_111_VICTORIA_WINSTRATE":769,"FLAG_HIDE_ROUTE_111_VICTOR_WINSTRATE":768,"FLAG_HIDE_ROUTE_111_VIVI_WINSTRATE":770,"FLAG_HIDE_ROUTE_112_TEAM_MAGMA":819,"FLAG_HIDE_ROUTE_115_BOULDERS":825,"FLAG_HIDE_ROUTE_116_DEVON_EMPLOYEE":947,"FLAG_HIDE_ROUTE_116_DROPPED_GLASSES_MAN":813,"FLAG_HIDE_ROUTE_116_MR_BRINEY":891,"FLAG_HIDE_ROUTE_116_WANDAS_BOYFRIEND":894,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_1":797,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2":901,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_3":904,"FLAG_HIDE_ROUTE_118_STEVEN":966,"FLAG_HIDE_ROUTE_119_RIVAL":851,"FLAG_HIDE_ROUTE_119_RIVAL_ON_BIKE":923,"FLAG_HIDE_ROUTE_119_SCOTT":786,"FLAG_HIDE_ROUTE_119_TEAM_AQUA":890,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_BRIDGE":822,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_SHELLY":915,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1":798,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2":902,"FLAG_HIDE_ROUTE_120_STEVEN":972,"FLAG_HIDE_ROUTE_121_TEAM_AQUA_GRUNTS":914,"FLAG_HIDE_ROUTE_128_ARCHIE":944,"FLAG_HIDE_ROUTE_128_MAXIE":945,"FLAG_HIDE_ROUTE_128_STEVEN":834,"FLAG_HIDE_RUSTBORO_CITY_AQUA_GRUNT":731,"FLAG_HIDE_RUSTBORO_CITY_DEVON_CORP_3F_EMPLOYEE":949,"FLAG_HIDE_RUSTBORO_CITY_DEVON_EMPLOYEE_1":732,"FLAG_HIDE_RUSTBORO_CITY_POKEMON_SCHOOL_SCOTT":999,"FLAG_HIDE_RUSTBORO_CITY_RIVAL":814,"FLAG_HIDE_RUSTBORO_CITY_SCIENTIST":844,"FLAG_HIDE_RUSTURF_TUNNEL_AQUA_GRUNT":878,"FLAG_HIDE_RUSTURF_TUNNEL_BRINEY":879,"FLAG_HIDE_RUSTURF_TUNNEL_PEEKO":880,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1":931,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2":932,"FLAG_HIDE_RUSTURF_TUNNEL_WANDA":983,"FLAG_HIDE_RUSTURF_TUNNEL_WANDAS_BOYFRIEND":807,"FLAG_HIDE_SAFARI_ZONE_SOUTH_CONSTRUCTION_WORKERS":717,"FLAG_HIDE_SAFARI_ZONE_SOUTH_EAST_EXPANSION":747,"FLAG_HIDE_SEAFLOOR_CAVERN_AQUA_GRUNTS":946,"FLAG_HIDE_SEAFLOOR_CAVERN_ENTRANCE_AQUA_GRUNT":941,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_ARCHIE":828,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE":859,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE_ASLEEP":733,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAGMA_GRUNTS":831,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAXIE":829,"FLAG_HIDE_SECRET_BASE_TRAINER":173,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA":773,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA_STILL":80,"FLAG_HIDE_SKY_PILLAR_WALLACE":855,"FLAG_HIDE_SLATEPORT_CITY_CAPTAIN_STERN":840,"FLAG_HIDE_SLATEPORT_CITY_CONTEST_REPORTER":803,"FLAG_HIDE_SLATEPORT_CITY_GABBY_AND_TY":835,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_AQUA_GRUNT":845,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_ARCHIE":846,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_CAPTAIN_STERN":841,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_PATRONS":905,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SS_TIDAL":860,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SUBMARINE_SHADOW":848,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_1":884,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_2":885,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_ARCHIE":886,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_CAPTAIN_STERN":887,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_AQUA_GRUNTS":883,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_FAMILIAR_AQUA_GRUNT":965,"FLAG_HIDE_SLATEPORT_CITY_SCOTT":749,"FLAG_HIDE_SLATEPORT_CITY_STERNS_SHIPYARD_MR_BRINEY":869,"FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA":882,"FLAG_HIDE_SLATEPORT_CITY_TM_SALESMAN":948,"FLAG_HIDE_SLATEPORT_MUSEUM_POPULATION":961,"FLAG_HIDE_SOOTOPOLIS_CITY_ARCHIE":826,"FLAG_HIDE_SOOTOPOLIS_CITY_GROUDON":998,"FLAG_HIDE_SOOTOPOLIS_CITY_KYOGRE":997,"FLAG_HIDE_SOOTOPOLIS_CITY_MAN_1":839,"FLAG_HIDE_SOOTOPOLIS_CITY_MAXIE":827,"FLAG_HIDE_SOOTOPOLIS_CITY_RAYQUAZA":996,"FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS":854,"FLAG_HIDE_SOOTOPOLIS_CITY_STEVEN":973,"FLAG_HIDE_SOOTOPOLIS_CITY_WALLACE":816,"FLAG_HIDE_SOUTHERN_ISLAND_EON_STONE":910,"FLAG_HIDE_SOUTHERN_ISLAND_UNCHOSEN_EON_DUO_MON":911,"FLAG_HIDE_SS_TIDAL_CORRIDOR_MR_BRINEY":950,"FLAG_HIDE_SS_TIDAL_CORRIDOR_SCOTT":810,"FLAG_HIDE_SS_TIDAL_ROOMS_SNATCH_GIVER":951,"FLAG_HIDE_TERRA_CAVE_GROUDON":783,"FLAG_HIDE_TRICK_HOUSE_END_MAN":899,"FLAG_HIDE_TRICK_HOUSE_ENTRANCE_MAN":872,"FLAG_HIDE_UNDERWATER_SEA_FLOOR_CAVERN_STOLEN_SUBMARINE":980,"FLAG_HIDE_UNION_ROOM_PLAYER_1":703,"FLAG_HIDE_UNION_ROOM_PLAYER_2":704,"FLAG_HIDE_UNION_ROOM_PLAYER_3":705,"FLAG_HIDE_UNION_ROOM_PLAYER_4":706,"FLAG_HIDE_UNION_ROOM_PLAYER_5":707,"FLAG_HIDE_UNION_ROOM_PLAYER_6":708,"FLAG_HIDE_UNION_ROOM_PLAYER_7":709,"FLAG_HIDE_UNION_ROOM_PLAYER_8":710,"FLAG_HIDE_VERDANTURF_TOWN_SCOTT":766,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLY":806,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLYS_UNCLE":809,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDA":984,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDAS_BOYFRIEND":808,"FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY":858,"FLAG_HIDE_VICTORY_ROAD_EXIT_WALLY":751,"FLAG_HIDE_WEATHER_INSTITUTE_1F_WORKERS":892,"FLAG_HIDE_WEATHER_INSTITUTE_2F_AQUA_GRUNT_M":992,"FLAG_HIDE_WEATHER_INSTITUTE_2F_WORKERS":893,"FLAG_HO_OH_IS_RECOVERING":1256,"FLAG_INTERACTED_WITH_DEVON_EMPLOYEE_GOODS_STOLEN":159,"FLAG_INTERACTED_WITH_STEVEN_SPACE_CENTER":205,"FLAG_IS_CHAMPION":2175,"FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":1100,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":1102,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":1078,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":1101,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":1077,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":1095,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":1099,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":1097,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":1096,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":1098,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":1124,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":1071,"FLAG_ITEM_AQUA_HIDEOUT_B1F_NUGGET":1132,"FLAG_ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":1072,"FLAG_ITEM_ARTISAN_CAVE_1F_CARBOS":1163,"FLAG_ITEM_ARTISAN_CAVE_B1F_HP_UP":1162,"FLAG_ITEM_FIERY_PATH_FIRE_STONE":1111,"FLAG_ITEM_FIERY_PATH_TM_TOXIC":1091,"FLAG_ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":1050,"FLAG_ITEM_GRANITE_CAVE_B1F_POKE_BALL":1051,"FLAG_ITEM_GRANITE_CAVE_B2F_RARE_CANDY":1054,"FLAG_ITEM_GRANITE_CAVE_B2F_REPEL":1053,"FLAG_ITEM_JAGGED_PASS_BURN_HEAL":1070,"FLAG_ITEM_LILYCOVE_CITY_MAX_REPEL":1042,"FLAG_ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":1151,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":1165,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":1164,"FLAG_ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":1166,"FLAG_ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":1167,"FLAG_ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":1059,"FLAG_ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":1168,"FLAG_ITEM_MAUVILLE_CITY_X_SPEED":1116,"FLAG_ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":1045,"FLAG_ITEM_METEOR_FALLS_1F_1R_MOON_STONE":1046,"FLAG_ITEM_METEOR_FALLS_1F_1R_PP_UP":1047,"FLAG_ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":1044,"FLAG_ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":1080,"FLAG_ITEM_MOSSDEEP_CITY_NET_BALL":1043,"FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_HM08":1133,"FLAG_ITEM_MT_PYRE_2F_ULTRA_BALL":1129,"FLAG_ITEM_MT_PYRE_3F_SUPER_REPEL":1120,"FLAG_ITEM_MT_PYRE_4F_SEA_INCENSE":1130,"FLAG_ITEM_MT_PYRE_5F_LAX_INCENSE":1052,"FLAG_ITEM_MT_PYRE_6F_TM_SHADOW_BALL":1089,"FLAG_ITEM_MT_PYRE_EXTERIOR_MAX_POTION":1073,"FLAG_ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":1074,"FLAG_ITEM_NEW_MAUVILLE_ESCAPE_ROPE":1076,"FLAG_ITEM_NEW_MAUVILLE_FULL_HEAL":1122,"FLAG_ITEM_NEW_MAUVILLE_PARALYZE_HEAL":1123,"FLAG_ITEM_NEW_MAUVILLE_THUNDER_STONE":1110,"FLAG_ITEM_NEW_MAUVILLE_ULTRA_BALL":1075,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MASTER_BALL":1125,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MAX_ELIXIR":1126,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B2F_NEST_BALL":1127,"FLAG_ITEM_PETALBURG_CITY_ETHER":1040,"FLAG_ITEM_PETALBURG_CITY_MAX_REVIVE":1039,"FLAG_ITEM_PETALBURG_WOODS_ETHER":1058,"FLAG_ITEM_PETALBURG_WOODS_GREAT_BALL":1056,"FLAG_ITEM_PETALBURG_WOODS_PARALYZE_HEAL":1117,"FLAG_ITEM_PETALBURG_WOODS_X_ATTACK":1055,"FLAG_ITEM_ROUTE_102_POTION":1000,"FLAG_ITEM_ROUTE_103_GUARD_SPEC":1114,"FLAG_ITEM_ROUTE_103_PP_UP":1137,"FLAG_ITEM_ROUTE_104_POKE_BALL":1057,"FLAG_ITEM_ROUTE_104_POTION":1135,"FLAG_ITEM_ROUTE_104_PP_UP":1002,"FLAG_ITEM_ROUTE_104_X_ACCURACY":1115,"FLAG_ITEM_ROUTE_105_IRON":1003,"FLAG_ITEM_ROUTE_106_PROTEIN":1004,"FLAG_ITEM_ROUTE_108_STAR_PIECE":1139,"FLAG_ITEM_ROUTE_109_POTION":1140,"FLAG_ITEM_ROUTE_109_PP_UP":1005,"FLAG_ITEM_ROUTE_110_DIRE_HIT":1007,"FLAG_ITEM_ROUTE_110_ELIXIR":1141,"FLAG_ITEM_ROUTE_110_RARE_CANDY":1006,"FLAG_ITEM_ROUTE_111_ELIXIR":1142,"FLAG_ITEM_ROUTE_111_HP_UP":1010,"FLAG_ITEM_ROUTE_111_STARDUST":1009,"FLAG_ITEM_ROUTE_111_TM_SANDSTORM":1008,"FLAG_ITEM_ROUTE_112_NUGGET":1011,"FLAG_ITEM_ROUTE_113_HYPER_POTION":1143,"FLAG_ITEM_ROUTE_113_MAX_ETHER":1012,"FLAG_ITEM_ROUTE_113_SUPER_REPEL":1013,"FLAG_ITEM_ROUTE_114_ENERGY_POWDER":1160,"FLAG_ITEM_ROUTE_114_PROTEIN":1015,"FLAG_ITEM_ROUTE_114_RARE_CANDY":1014,"FLAG_ITEM_ROUTE_115_GREAT_BALL":1118,"FLAG_ITEM_ROUTE_115_HEAL_POWDER":1144,"FLAG_ITEM_ROUTE_115_IRON":1018,"FLAG_ITEM_ROUTE_115_PP_UP":1161,"FLAG_ITEM_ROUTE_115_SUPER_POTION":1016,"FLAG_ITEM_ROUTE_115_TM_FOCUS_PUNCH":1017,"FLAG_ITEM_ROUTE_116_ETHER":1019,"FLAG_ITEM_ROUTE_116_HP_UP":1021,"FLAG_ITEM_ROUTE_116_POTION":1146,"FLAG_ITEM_ROUTE_116_REPEL":1020,"FLAG_ITEM_ROUTE_116_X_SPECIAL":1001,"FLAG_ITEM_ROUTE_117_GREAT_BALL":1022,"FLAG_ITEM_ROUTE_117_REVIVE":1023,"FLAG_ITEM_ROUTE_118_HYPER_POTION":1121,"FLAG_ITEM_ROUTE_119_ELIXIR_1":1026,"FLAG_ITEM_ROUTE_119_ELIXIR_2":1147,"FLAG_ITEM_ROUTE_119_HYPER_POTION_1":1029,"FLAG_ITEM_ROUTE_119_HYPER_POTION_2":1106,"FLAG_ITEM_ROUTE_119_LEAF_STONE":1027,"FLAG_ITEM_ROUTE_119_NUGGET":1134,"FLAG_ITEM_ROUTE_119_RARE_CANDY":1028,"FLAG_ITEM_ROUTE_119_SUPER_REPEL":1024,"FLAG_ITEM_ROUTE_119_ZINC":1025,"FLAG_ITEM_ROUTE_120_FULL_HEAL":1031,"FLAG_ITEM_ROUTE_120_HYPER_POTION":1107,"FLAG_ITEM_ROUTE_120_NEST_BALL":1108,"FLAG_ITEM_ROUTE_120_NUGGET":1030,"FLAG_ITEM_ROUTE_120_REVIVE":1148,"FLAG_ITEM_ROUTE_121_CARBOS":1103,"FLAG_ITEM_ROUTE_121_REVIVE":1149,"FLAG_ITEM_ROUTE_121_ZINC":1150,"FLAG_ITEM_ROUTE_123_CALCIUM":1032,"FLAG_ITEM_ROUTE_123_ELIXIR":1109,"FLAG_ITEM_ROUTE_123_PP_UP":1152,"FLAG_ITEM_ROUTE_123_REVIVAL_HERB":1153,"FLAG_ITEM_ROUTE_123_ULTRA_BALL":1104,"FLAG_ITEM_ROUTE_124_BLUE_SHARD":1093,"FLAG_ITEM_ROUTE_124_RED_SHARD":1092,"FLAG_ITEM_ROUTE_124_YELLOW_SHARD":1066,"FLAG_ITEM_ROUTE_125_BIG_PEARL":1154,"FLAG_ITEM_ROUTE_126_GREEN_SHARD":1105,"FLAG_ITEM_ROUTE_127_CARBOS":1035,"FLAG_ITEM_ROUTE_127_RARE_CANDY":1155,"FLAG_ITEM_ROUTE_127_ZINC":1034,"FLAG_ITEM_ROUTE_132_PROTEIN":1156,"FLAG_ITEM_ROUTE_132_RARE_CANDY":1036,"FLAG_ITEM_ROUTE_133_BIG_PEARL":1037,"FLAG_ITEM_ROUTE_133_MAX_REVIVE":1157,"FLAG_ITEM_ROUTE_133_STAR_PIECE":1038,"FLAG_ITEM_ROUTE_134_CARBOS":1158,"FLAG_ITEM_ROUTE_134_STAR_PIECE":1159,"FLAG_ITEM_RUSTBORO_CITY_X_DEFEND":1041,"FLAG_ITEM_RUSTURF_TUNNEL_MAX_ETHER":1049,"FLAG_ITEM_RUSTURF_TUNNEL_POKE_BALL":1048,"FLAG_ITEM_SAFARI_ZONE_NORTH_CALCIUM":1119,"FLAG_ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":1169,"FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":1094,"FLAG_ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":1170,"FLAG_ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":1131,"FLAG_ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":1079,"FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":1090,"FLAG_ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":1081,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":1113,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":1112,"FLAG_ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":1082,"FLAG_ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":1083,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":1060,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":1061,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":1062,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":1063,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":1064,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":1065,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":1067,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":1068,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":1069,"FLAG_ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":1084,"FLAG_ITEM_VICTORY_ROAD_1F_PP_UP":1085,"FLAG_ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":1087,"FLAG_ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":1086,"FLAG_ITEM_VICTORY_ROAD_B2F_FULL_HEAL":1088,"FLAG_KECLEON_FLED_FORTREE":295,"FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN":129,"FLAG_KYOGRE_IS_RECOVERING":1273,"FLAG_LANDMARK_ABANDONED_SHIP":2206,"FLAG_LANDMARK_ALTERING_CAVE":2269,"FLAG_LANDMARK_ANCIENT_TOMB":2233,"FLAG_LANDMARK_ARTISAN_CAVE":2271,"FLAG_LANDMARK_BATTLE_FRONTIER":2216,"FLAG_LANDMARK_BERRY_MASTERS_HOUSE":2243,"FLAG_LANDMARK_DESERT_RUINS":2230,"FLAG_LANDMARK_DESERT_UNDERPASS":2270,"FLAG_LANDMARK_FIERY_PATH":2218,"FLAG_LANDMARK_FLOWER_SHOP":2204,"FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE":2231,"FLAG_LANDMARK_GLASS_WORKSHOP":2212,"FLAG_LANDMARK_HUNTERS_HOUSE":2235,"FLAG_LANDMARK_ISLAND_CAVE":2229,"FLAG_LANDMARK_LANETTES_HOUSE":2213,"FLAG_LANDMARK_MIRAGE_TOWER":120,"FLAG_LANDMARK_MR_BRINEY_HOUSE":2205,"FLAG_LANDMARK_NEW_MAUVILLE":2208,"FLAG_LANDMARK_OLD_LADY_REST_SHOP":2209,"FLAG_LANDMARK_POKEMON_DAYCARE":2214,"FLAG_LANDMARK_POKEMON_LEAGUE":2228,"FLAG_LANDMARK_SCORCHED_SLAB":2232,"FLAG_LANDMARK_SEAFLOOR_CAVERN":2215,"FLAG_LANDMARK_SEALED_CHAMBER":2236,"FLAG_LANDMARK_SEASHORE_HOUSE":2207,"FLAG_LANDMARK_SKY_PILLAR":2238,"FLAG_LANDMARK_SOUTHERN_ISLAND":2217,"FLAG_LANDMARK_TRAINER_HILL":2274,"FLAG_LANDMARK_TRICK_HOUSE":2210,"FLAG_LANDMARK_TUNNELERS_REST_HOUSE":2234,"FLAG_LANDMARK_WINSTRATE_FAMILY":2211,"FLAG_LATIAS_IS_RECOVERING":1263,"FLAG_LATIOS_IS_RECOVERING":1255,"FLAG_LATIOS_OR_LATIAS_ROAMING":255,"FLAG_LEGENDARIES_IN_SOOTOPOLIS":83,"FLAG_LILYCOVE_RECEIVED_BERRY":1208,"FLAG_LUGIA_IS_RECOVERING":1257,"FLAG_MAP_SCRIPT_CHECKED_DEOXYS":2259,"FLAG_MATCH_CALL_REGISTERED":348,"FLAG_MAUVILLE_GYM_BARRIERS_STATE":99,"FLAG_MET_ARCHIE_METEOR_FALLS":207,"FLAG_MET_ARCHIE_SOOTOPOLIS":308,"FLAG_MET_BATTLE_FRONTIER_BREEDER":339,"FLAG_MET_BATTLE_FRONTIER_GAMBLER":343,"FLAG_MET_BATTLE_FRONTIER_MANIAC":340,"FLAG_MET_DEVON_EMPLOYEE":287,"FLAG_MET_DIVING_TREASURE_HUNTER":217,"FLAG_MET_FANCLUB_YOUNGER_BROTHER":300,"FLAG_MET_FRONTIER_BEAUTY_MOVE_TUTOR":346,"FLAG_MET_FRONTIER_SWIMMER_MOVE_TUTOR":347,"FLAG_MET_HIDDEN_POWER_GIVER":118,"FLAG_MET_MAXIE_SOOTOPOLIS":309,"FLAG_MET_PRETTY_PETAL_SHOP_OWNER":127,"FLAG_MET_PROF_COZMO":244,"FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE":293,"FLAG_MET_RIVAL_LILYCOVE":292,"FLAG_MET_RIVAL_MOM":87,"FLAG_MET_RIVAL_RUSTBORO":288,"FLAG_MET_SCOTT_AFTER_OBTAINING_STONE_BADGE":459,"FLAG_MET_SCOTT_IN_EVERGRANDE":463,"FLAG_MET_SCOTT_IN_FALLARBOR":461,"FLAG_MET_SCOTT_IN_LILYCOVE":462,"FLAG_MET_SCOTT_IN_VERDANTURF":460,"FLAG_MET_SCOTT_ON_SS_TIDAL":464,"FLAG_MET_SCOTT_RUSTBORO":310,"FLAG_MET_SLATEPORT_FANCLUB_CHAIRMAN":342,"FLAG_MET_TEAM_AQUA_HARBOR":97,"FLAG_MET_WAILMER_TRAINER":218,"FLAG_MEW_IS_RECOVERING":1259,"FLAG_MIRAGE_TOWER_VISIBLE":334,"FLAG_MOSSDEEP_GYM_SWITCH_1":100,"FLAG_MOSSDEEP_GYM_SWITCH_2":101,"FLAG_MOSSDEEP_GYM_SWITCH_3":102,"FLAG_MOSSDEEP_GYM_SWITCH_4":103,"FLAG_MOVE_TUTOR_TAUGHT_DOUBLE_EDGE":441,"FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH":440,"FLAG_MOVE_TUTOR_TAUGHT_EXPLOSION":442,"FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER":435,"FLAG_MOVE_TUTOR_TAUGHT_METRONOME":437,"FLAG_MOVE_TUTOR_TAUGHT_MIMIC":436,"FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT":434,"FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK":438,"FLAG_MOVE_TUTOR_TAUGHT_SUBSTITUTE":439,"FLAG_MOVE_TUTOR_TAUGHT_SWAGGER":433,"FLAG_MR_BRINEY_SAILING_INTRO":147,"FLAG_MYSTERY_GIFT_1":485,"FLAG_MYSTERY_GIFT_10":494,"FLAG_MYSTERY_GIFT_11":495,"FLAG_MYSTERY_GIFT_12":496,"FLAG_MYSTERY_GIFT_13":497,"FLAG_MYSTERY_GIFT_14":498,"FLAG_MYSTERY_GIFT_15":499,"FLAG_MYSTERY_GIFT_2":486,"FLAG_MYSTERY_GIFT_3":487,"FLAG_MYSTERY_GIFT_4":488,"FLAG_MYSTERY_GIFT_5":489,"FLAG_MYSTERY_GIFT_6":490,"FLAG_MYSTERY_GIFT_7":491,"FLAG_MYSTERY_GIFT_8":492,"FLAG_MYSTERY_GIFT_9":493,"FLAG_MYSTERY_GIFT_DONE":484,"FLAG_NEVER_SET_0x0DC":220,"FLAG_NOT_READY_FOR_BATTLE_ROUTE_120":290,"FLAG_NURSE_MENTIONS_GOLD_CARD":345,"FLAG_NURSE_UNION_ROOM_REMINDER":2176,"FLAG_OCEANIC_MUSEUM_MET_REPORTER":105,"FLAG_OMIT_DIVE_FROM_STEVEN_LETTER":302,"FLAG_PACIFIDLOG_NPC_TRADE_COMPLETED":154,"FLAG_PENDING_DAYCARE_EGG":134,"FLAG_PETALBURG_MART_EXPANDED_ITEMS":296,"FLAG_POKERUS_EXPLAINED":273,"FLAG_PURCHASED_HARBOR_MAIL":104,"FLAG_RAYQUAZA_IS_RECOVERING":1279,"FLAG_RECEIVED_20_COINS":225,"FLAG_RECEIVED_6_SODA_POP":140,"FLAG_RECEIVED_ACRO_BIKE":1181,"FLAG_RECEIVED_AMULET_COIN":133,"FLAG_RECEIVED_AURORA_TICKET":314,"FLAG_RECEIVED_BADGE_1":1182,"FLAG_RECEIVED_BADGE_2":1183,"FLAG_RECEIVED_BADGE_3":1184,"FLAG_RECEIVED_BADGE_4":1185,"FLAG_RECEIVED_BADGE_5":1186,"FLAG_RECEIVED_BADGE_6":1187,"FLAG_RECEIVED_BADGE_7":1188,"FLAG_RECEIVED_BADGE_8":1189,"FLAG_RECEIVED_BELDUM":298,"FLAG_RECEIVED_BELUE_BERRY":252,"FLAG_RECEIVED_BIKE":90,"FLAG_RECEIVED_BLUE_SCARF":201,"FLAG_RECEIVED_CASTFORM":151,"FLAG_RECEIVED_CHARCOAL":254,"FLAG_RECEIVED_CHESTO_BERRY_ROUTE_104":246,"FLAG_RECEIVED_CLEANSE_TAG":282,"FLAG_RECEIVED_COIN_CASE":258,"FLAG_RECEIVED_CONTEST_PASS":150,"FLAG_RECEIVED_DEEP_SEA_SCALE":1190,"FLAG_RECEIVED_DEEP_SEA_TOOTH":1191,"FLAG_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":1172,"FLAG_RECEIVED_DEVON_SCOPE":285,"FLAG_RECEIVED_DOLL_LANETTE":131,"FLAG_RECEIVED_DURIN_BERRY":251,"FLAG_RECEIVED_EON_TICKET":474,"FLAG_RECEIVED_EXP_SHARE":272,"FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK":299,"FLAG_RECEIVED_FIRST_POKEBALLS":233,"FLAG_RECEIVED_FOCUS_BAND":283,"FLAG_RECEIVED_GLASS_ORNAMENT":236,"FLAG_RECEIVED_GOLD_SHIELD":238,"FLAG_RECEIVED_GOOD_ROD":227,"FLAG_RECEIVED_GO_GOGGLES":221,"FLAG_RECEIVED_GREAT_BALL_PETALBURG_WOODS":1171,"FLAG_RECEIVED_GREAT_BALL_RUSTBORO_CITY":1173,"FLAG_RECEIVED_GREEN_SCARF":203,"FLAG_RECEIVED_HM_CUT":137,"FLAG_RECEIVED_HM_DIVE":123,"FLAG_RECEIVED_HM_FLASH":109,"FLAG_RECEIVED_HM_FLY":110,"FLAG_RECEIVED_HM_ROCK_SMASH":107,"FLAG_RECEIVED_HM_STRENGTH":106,"FLAG_RECEIVED_HM_SURF":122,"FLAG_RECEIVED_HM_WATERFALL":312,"FLAG_RECEIVED_ITEMFINDER":1176,"FLAG_RECEIVED_KINGS_ROCK":276,"FLAG_RECEIVED_LAVARIDGE_EGG":266,"FLAG_RECEIVED_LETTER":1174,"FLAG_RECEIVED_MACHO_BRACE":277,"FLAG_RECEIVED_MACH_BIKE":1180,"FLAG_RECEIVED_MAGMA_EMBLEM":1177,"FLAG_RECEIVED_MENTAL_HERB":223,"FLAG_RECEIVED_METEORITE":115,"FLAG_RECEIVED_MIRACLE_SEED":297,"FLAG_RECEIVED_MYSTIC_TICKET":315,"FLAG_RECEIVED_OLD_ROD":257,"FLAG_RECEIVED_OLD_SEA_MAP":316,"FLAG_RECEIVED_PAMTRE_BERRY":249,"FLAG_RECEIVED_PINK_SCARF":202,"FLAG_RECEIVED_POKEBLOCK_CASE":95,"FLAG_RECEIVED_POKEDEX_FROM_BIRCH":2276,"FLAG_RECEIVED_POKENAV":188,"FLAG_RECEIVED_POTION_OLDALE":132,"FLAG_RECEIVED_POWDER_JAR":337,"FLAG_RECEIVED_PREMIER_BALL_RUSTBORO":213,"FLAG_RECEIVED_QUICK_CLAW":275,"FLAG_RECEIVED_RED_OR_BLUE_ORB":212,"FLAG_RECEIVED_RED_SCARF":200,"FLAG_RECEIVED_REPEAT_BALL":256,"FLAG_RECEIVED_REVIVED_FOSSIL_MON":267,"FLAG_RECEIVED_RUNNING_SHOES":274,"FLAG_RECEIVED_SECRET_POWER":96,"FLAG_RECEIVED_SHOAL_SALT_1":952,"FLAG_RECEIVED_SHOAL_SALT_2":953,"FLAG_RECEIVED_SHOAL_SALT_3":954,"FLAG_RECEIVED_SHOAL_SALT_4":955,"FLAG_RECEIVED_SHOAL_SHELL_1":956,"FLAG_RECEIVED_SHOAL_SHELL_2":957,"FLAG_RECEIVED_SHOAL_SHELL_3":958,"FLAG_RECEIVED_SHOAL_SHELL_4":959,"FLAG_RECEIVED_SILK_SCARF":289,"FLAG_RECEIVED_SILVER_SHIELD":237,"FLAG_RECEIVED_SOFT_SAND":280,"FLAG_RECEIVED_SOOTHE_BELL":278,"FLAG_RECEIVED_SOOT_SACK":1033,"FLAG_RECEIVED_SPECIAL_PHRASE_HINT":85,"FLAG_RECEIVED_SPELON_BERRY":248,"FLAG_RECEIVED_SS_TICKET":291,"FLAG_RECEIVED_STARTER_DOLL":226,"FLAG_RECEIVED_SUN_STONE_MOSSDEEP":192,"FLAG_RECEIVED_SUPER_ROD":152,"FLAG_RECEIVED_TM_AERIAL_ACE":170,"FLAG_RECEIVED_TM_ATTRACT":235,"FLAG_RECEIVED_TM_BRICK_BREAK":121,"FLAG_RECEIVED_TM_BULK_UP":166,"FLAG_RECEIVED_TM_BULLET_SEED":262,"FLAG_RECEIVED_TM_CALM_MIND":171,"FLAG_RECEIVED_TM_DIG":261,"FLAG_RECEIVED_TM_FACADE":169,"FLAG_RECEIVED_TM_FRUSTRATION":1179,"FLAG_RECEIVED_TM_GIGA_DRAIN":232,"FLAG_RECEIVED_TM_HIDDEN_POWER":264,"FLAG_RECEIVED_TM_OVERHEAT":168,"FLAG_RECEIVED_TM_REST":234,"FLAG_RECEIVED_TM_RETURN":229,"FLAG_RECEIVED_TM_RETURN_2":1178,"FLAG_RECEIVED_TM_ROAR":231,"FLAG_RECEIVED_TM_ROCK_TOMB":165,"FLAG_RECEIVED_TM_SHOCK_WAVE":167,"FLAG_RECEIVED_TM_SLUDGE_BOMB":230,"FLAG_RECEIVED_TM_SNATCH":260,"FLAG_RECEIVED_TM_STEEL_WING":1175,"FLAG_RECEIVED_TM_THIEF":269,"FLAG_RECEIVED_TM_TORMENT":265,"FLAG_RECEIVED_TM_WATER_PULSE":172,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_1":1200,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_2":1201,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_3":1202,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_4":1203,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_5":1204,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_6":1205,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_7":1206,"FLAG_RECEIVED_WAILMER_DOLL":245,"FLAG_RECEIVED_WAILMER_PAIL":94,"FLAG_RECEIVED_WATMEL_BERRY":250,"FLAG_RECEIVED_WHITE_HERB":279,"FLAG_RECEIVED_YELLOW_SCARF":204,"FLAG_RECOVERED_DEVON_GOODS":143,"FLAG_REGICE_IS_RECOVERING":1260,"FLAG_REGIROCK_IS_RECOVERING":1261,"FLAG_REGISTEEL_IS_RECOVERING":1262,"FLAG_REGISTERED_STEVEN_POKENAV":305,"FLAG_REGISTER_RIVAL_POKENAV":124,"FLAG_REGI_DOORS_OPENED":228,"FLAG_REMATCH_ABIGAIL":387,"FLAG_REMATCH_AMY_AND_LIV":399,"FLAG_REMATCH_ANDRES":350,"FLAG_REMATCH_ANNA_AND_MEG":378,"FLAG_REMATCH_BENJAMIN":390,"FLAG_REMATCH_BERNIE":369,"FLAG_REMATCH_BRAWLY":415,"FLAG_REMATCH_BROOKE":356,"FLAG_REMATCH_CALVIN":383,"FLAG_REMATCH_CAMERON":373,"FLAG_REMATCH_CATHERINE":406,"FLAG_REMATCH_CINDY":359,"FLAG_REMATCH_CORY":401,"FLAG_REMATCH_CRISTIN":355,"FLAG_REMATCH_CYNDY":395,"FLAG_REMATCH_DALTON":368,"FLAG_REMATCH_DIANA":398,"FLAG_REMATCH_DRAKE":424,"FLAG_REMATCH_DUSTY":351,"FLAG_REMATCH_DYLAN":388,"FLAG_REMATCH_EDWIN":402,"FLAG_REMATCH_ELLIOT":384,"FLAG_REMATCH_ERNEST":400,"FLAG_REMATCH_ETHAN":370,"FLAG_REMATCH_FERNANDO":367,"FLAG_REMATCH_FLANNERY":417,"FLAG_REMATCH_GABRIELLE":405,"FLAG_REMATCH_GLACIA":423,"FLAG_REMATCH_HALEY":408,"FLAG_REMATCH_ISAAC":404,"FLAG_REMATCH_ISABEL":379,"FLAG_REMATCH_ISAIAH":385,"FLAG_REMATCH_JACKI":374,"FLAG_REMATCH_JACKSON":407,"FLAG_REMATCH_JAMES":409,"FLAG_REMATCH_JEFFREY":372,"FLAG_REMATCH_JENNY":397,"FLAG_REMATCH_JERRY":377,"FLAG_REMATCH_JESSICA":361,"FLAG_REMATCH_JOHN_AND_JAY":371,"FLAG_REMATCH_KAREN":376,"FLAG_REMATCH_KATELYN":389,"FLAG_REMATCH_KIRA_AND_DAN":412,"FLAG_REMATCH_KOJI":366,"FLAG_REMATCH_LAO":394,"FLAG_REMATCH_LILA_AND_ROY":354,"FLAG_REMATCH_LOLA":352,"FLAG_REMATCH_LYDIA":403,"FLAG_REMATCH_MADELINE":396,"FLAG_REMATCH_MARIA":386,"FLAG_REMATCH_MIGUEL":380,"FLAG_REMATCH_NICOLAS":392,"FLAG_REMATCH_NOB":365,"FLAG_REMATCH_NORMAN":418,"FLAG_REMATCH_PABLO":391,"FLAG_REMATCH_PHOEBE":422,"FLAG_REMATCH_RICKY":353,"FLAG_REMATCH_ROBERT":393,"FLAG_REMATCH_ROSE":349,"FLAG_REMATCH_ROXANNE":414,"FLAG_REMATCH_SAWYER":411,"FLAG_REMATCH_SHELBY":382,"FLAG_REMATCH_SIDNEY":421,"FLAG_REMATCH_STEVE":363,"FLAG_REMATCH_TATE_AND_LIZA":420,"FLAG_REMATCH_THALIA":360,"FLAG_REMATCH_TIMOTHY":381,"FLAG_REMATCH_TONY":364,"FLAG_REMATCH_TRENT":410,"FLAG_REMATCH_VALERIE":358,"FLAG_REMATCH_WALLACE":425,"FLAG_REMATCH_WALLY":413,"FLAG_REMATCH_WALTER":375,"FLAG_REMATCH_WATTSON":416,"FLAG_REMATCH_WILTON":357,"FLAG_REMATCH_WINONA":419,"FLAG_REMATCH_WINSTON":362,"FLAG_RESCUED_BIRCH":82,"FLAG_RETURNED_DEVON_GOODS":144,"FLAG_RETURNED_RED_OR_BLUE_ORB":259,"FLAG_RIVAL_LEFT_FOR_ROUTE103":301,"FLAG_ROUTE_111_RECEIVED_BERRY":1192,"FLAG_ROUTE_114_RECEIVED_BERRY":1193,"FLAG_ROUTE_120_RECEIVED_BERRY":1194,"FLAG_RUSTBORO_NPC_TRADE_COMPLETED":153,"FLAG_RUSTURF_TUNNEL_OPENED":199,"FLAG_SCOTT_CALL_BATTLE_FRONTIER":114,"FLAG_SCOTT_CALL_FORTREE_GYM":138,"FLAG_SCOTT_GIVES_BATTLE_POINTS":465,"FLAG_SECRET_BASE_REGISTRY_ENABLED":268,"FLAG_SET_WALL_CLOCK":81,"FLAG_SHOWN_AURORA_TICKET":431,"FLAG_SHOWN_BOX_WAS_FULL_MESSAGE":2263,"FLAG_SHOWN_EON_TICKET":430,"FLAG_SHOWN_MYSTIC_TICKET":475,"FLAG_SHOWN_OLD_SEA_MAP":432,"FLAG_SMART_PAINTING_MADE":163,"FLAG_SOOTOPOLIS_ARCHIE_MAXIE_LEAVE":158,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_1":1198,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_2":1199,"FLAG_SPECIAL_FLAG_UNUSED_0x4003":16387,"FLAG_SS_TIDAL_DISABLED":84,"FLAG_STEVEN_GUIDES_TO_CAVE_OF_ORIGIN":307,"FLAG_STORING_ITEMS_IN_PYRAMID_BAG":16388,"FLAG_SYS_ARENA_GOLD":2251,"FLAG_SYS_ARENA_SILVER":2250,"FLAG_SYS_BRAILLE_DIG":2223,"FLAG_SYS_BRAILLE_REGICE_COMPLETED":2225,"FLAG_SYS_B_DASH":2240,"FLAG_SYS_CAVE_BATTLE":2201,"FLAG_SYS_CAVE_SHIP":2199,"FLAG_SYS_CAVE_WONDER":2200,"FLAG_SYS_CHANGED_DEWFORD_TREND":2195,"FLAG_SYS_CHAT_USED":2149,"FLAG_SYS_CLOCK_SET":2197,"FLAG_SYS_CRUISE_MODE":2189,"FLAG_SYS_CTRL_OBJ_DELETE":2241,"FLAG_SYS_CYCLING_ROAD":2187,"FLAG_SYS_DOME_GOLD":2247,"FLAG_SYS_DOME_SILVER":2246,"FLAG_SYS_ENC_DOWN_ITEM":2222,"FLAG_SYS_ENC_UP_ITEM":2221,"FLAG_SYS_FACTORY_GOLD":2253,"FLAG_SYS_FACTORY_SILVER":2252,"FLAG_SYS_FRONTIER_PASS":2258,"FLAG_SYS_GAME_CLEAR":2148,"FLAG_SYS_MIX_RECORD":2196,"FLAG_SYS_MYSTERY_EVENT_ENABLE":2220,"FLAG_SYS_MYSTERY_GIFT_ENABLE":2267,"FLAG_SYS_NATIONAL_DEX":2198,"FLAG_SYS_PALACE_GOLD":2249,"FLAG_SYS_PALACE_SILVER":2248,"FLAG_SYS_PC_LANETTE":2219,"FLAG_SYS_PIKE_GOLD":2255,"FLAG_SYS_PIKE_SILVER":2254,"FLAG_SYS_POKEDEX_GET":2145,"FLAG_SYS_POKEMON_GET":2144,"FLAG_SYS_POKENAV_GET":2146,"FLAG_SYS_PYRAMID_GOLD":2257,"FLAG_SYS_PYRAMID_SILVER":2256,"FLAG_SYS_REGIROCK_PUZZLE_COMPLETED":2224,"FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED":2226,"FLAG_SYS_RESET_RTC_ENABLE":2242,"FLAG_SYS_RIBBON_GET":2203,"FLAG_SYS_SAFARI_MODE":2188,"FLAG_SYS_SHOAL_ITEM":2239,"FLAG_SYS_SHOAL_TIDE":2202,"FLAG_SYS_TOWER_GOLD":2245,"FLAG_SYS_TOWER_SILVER":2244,"FLAG_SYS_TV_HOME":2192,"FLAG_SYS_TV_LATIAS_LATIOS":2237,"FLAG_SYS_TV_START":2194,"FLAG_SYS_TV_WATCH":2193,"FLAG_SYS_USE_FLASH":2184,"FLAG_SYS_USE_STRENGTH":2185,"FLAG_SYS_WEATHER_CTRL":2186,"FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE":112,"FLAG_TEMP_1":1,"FLAG_TEMP_10":16,"FLAG_TEMP_11":17,"FLAG_TEMP_12":18,"FLAG_TEMP_13":19,"FLAG_TEMP_14":20,"FLAG_TEMP_15":21,"FLAG_TEMP_16":22,"FLAG_TEMP_17":23,"FLAG_TEMP_18":24,"FLAG_TEMP_19":25,"FLAG_TEMP_1A":26,"FLAG_TEMP_1B":27,"FLAG_TEMP_1C":28,"FLAG_TEMP_1D":29,"FLAG_TEMP_1E":30,"FLAG_TEMP_1F":31,"FLAG_TEMP_2":2,"FLAG_TEMP_3":3,"FLAG_TEMP_4":4,"FLAG_TEMP_5":5,"FLAG_TEMP_6":6,"FLAG_TEMP_7":7,"FLAG_TEMP_8":8,"FLAG_TEMP_9":9,"FLAG_TEMP_A":10,"FLAG_TEMP_B":11,"FLAG_TEMP_C":12,"FLAG_TEMP_D":13,"FLAG_TEMP_E":14,"FLAG_TEMP_F":15,"FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE":17,"FLAG_TEMP_REGICE_PUZZLE_FAILED":3,"FLAG_TEMP_REGICE_PUZZLE_STARTED":2,"FLAG_TEMP_SKIP_GABBY_INTERVIEW":1,"FLAG_THANKED_FOR_PLAYING_WITH_WALLY":135,"FLAG_TOUGH_PAINTING_MADE":164,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1":194,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2":195,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3":196,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4":197,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5":198,"FLAG_TV_EXPLAINED":98,"FLAG_UNLOCKED_TRENDY_SAYINGS":2150,"FLAG_USED_ROOM_1_KEY":240,"FLAG_USED_ROOM_2_KEY":241,"FLAG_USED_ROOM_4_KEY":242,"FLAG_USED_ROOM_6_KEY":243,"FLAG_USED_STORAGE_KEY":239,"FLAG_VISITED_DEWFORD_TOWN":2161,"FLAG_VISITED_EVER_GRANDE_CITY":2174,"FLAG_VISITED_FALLARBOR_TOWN":2163,"FLAG_VISITED_FORTREE_CITY":2170,"FLAG_VISITED_LAVARIDGE_TOWN":2162,"FLAG_VISITED_LILYCOVE_CITY":2171,"FLAG_VISITED_LITTLEROOT_TOWN":2159,"FLAG_VISITED_MAUVILLE_CITY":2168,"FLAG_VISITED_MOSSDEEP_CITY":2172,"FLAG_VISITED_OLDALE_TOWN":2160,"FLAG_VISITED_PACIFIDLOG_TOWN":2165,"FLAG_VISITED_PETALBURG_CITY":2166,"FLAG_VISITED_RUSTBORO_CITY":2169,"FLAG_VISITED_SLATEPORT_CITY":2167,"FLAG_VISITED_SOOTOPOLIS_CITY":2173,"FLAG_VISITED_VERDANTURF_TOWN":2164,"FLAG_WALLACE_GOES_TO_SKY_PILLAR":311,"FLAG_WALLY_SPEECH":193,"FLAG_WATTSON_REMATCH_AVAILABLE":91,"FLAG_WHITEOUT_TO_LAVARIDGE":108,"FLAG_WINGULL_DELIVERED_MAIL":224,"FLAG_WINGULL_SENT_ON_ERRAND":222,"FLAG_WONDER_CARD_UNUSED_1":317,"FLAG_WONDER_CARD_UNUSED_10":326,"FLAG_WONDER_CARD_UNUSED_11":327,"FLAG_WONDER_CARD_UNUSED_12":328,"FLAG_WONDER_CARD_UNUSED_13":329,"FLAG_WONDER_CARD_UNUSED_14":330,"FLAG_WONDER_CARD_UNUSED_15":331,"FLAG_WONDER_CARD_UNUSED_16":332,"FLAG_WONDER_CARD_UNUSED_17":333,"FLAG_WONDER_CARD_UNUSED_2":318,"FLAG_WONDER_CARD_UNUSED_3":319,"FLAG_WONDER_CARD_UNUSED_4":320,"FLAG_WONDER_CARD_UNUSED_5":321,"FLAG_WONDER_CARD_UNUSED_6":322,"FLAG_WONDER_CARD_UNUSED_7":323,"FLAG_WONDER_CARD_UNUSED_8":324,"FLAG_WONDER_CARD_UNUSED_9":325,"FLAVOR_BITTER":3,"FLAVOR_COUNT":5,"FLAVOR_DRY":1,"FLAVOR_SOUR":4,"FLAVOR_SPICY":0,"FLAVOR_SWEET":2,"GOOD_ROD":1,"ITEMS_COUNT":377,"ITEM_034":52,"ITEM_035":53,"ITEM_036":54,"ITEM_037":55,"ITEM_038":56,"ITEM_039":57,"ITEM_03A":58,"ITEM_03B":59,"ITEM_03C":60,"ITEM_03D":61,"ITEM_03E":62,"ITEM_048":72,"ITEM_052":82,"ITEM_057":87,"ITEM_058":88,"ITEM_059":89,"ITEM_05A":90,"ITEM_05B":91,"ITEM_05C":92,"ITEM_063":99,"ITEM_064":100,"ITEM_065":101,"ITEM_066":102,"ITEM_069":105,"ITEM_071":113,"ITEM_072":114,"ITEM_073":115,"ITEM_074":116,"ITEM_075":117,"ITEM_076":118,"ITEM_077":119,"ITEM_078":120,"ITEM_0EA":234,"ITEM_0EB":235,"ITEM_0EC":236,"ITEM_0ED":237,"ITEM_0EE":238,"ITEM_0EF":239,"ITEM_0F0":240,"ITEM_0F1":241,"ITEM_0F2":242,"ITEM_0F3":243,"ITEM_0F4":244,"ITEM_0F5":245,"ITEM_0F6":246,"ITEM_0F7":247,"ITEM_0F8":248,"ITEM_0F9":249,"ITEM_0FA":250,"ITEM_0FB":251,"ITEM_0FC":252,"ITEM_0FD":253,"ITEM_10B":267,"ITEM_15B":347,"ITEM_15C":348,"ITEM_ACRO_BIKE":272,"ITEM_AGUAV_BERRY":146,"ITEM_AMULET_COIN":189,"ITEM_ANTIDOTE":14,"ITEM_APICOT_BERRY":172,"ITEM_ARCHIPELAGO_PROGRESSION":112,"ITEM_ASPEAR_BERRY":137,"ITEM_AURORA_TICKET":371,"ITEM_AWAKENING":17,"ITEM_BADGE_1":226,"ITEM_BADGE_2":227,"ITEM_BADGE_3":228,"ITEM_BADGE_4":229,"ITEM_BADGE_5":230,"ITEM_BADGE_6":231,"ITEM_BADGE_7":232,"ITEM_BADGE_8":233,"ITEM_BASEMENT_KEY":271,"ITEM_BEAD_MAIL":127,"ITEM_BELUE_BERRY":167,"ITEM_BERRY_JUICE":44,"ITEM_BERRY_POUCH":365,"ITEM_BICYCLE":360,"ITEM_BIG_MUSHROOM":104,"ITEM_BIG_PEARL":107,"ITEM_BIKE_VOUCHER":352,"ITEM_BLACK_BELT":207,"ITEM_BLACK_FLUTE":42,"ITEM_BLACK_GLASSES":206,"ITEM_BLUE_FLUTE":39,"ITEM_BLUE_ORB":277,"ITEM_BLUE_SCARF":255,"ITEM_BLUE_SHARD":49,"ITEM_BLUK_BERRY":149,"ITEM_BRIGHT_POWDER":179,"ITEM_BURN_HEAL":15,"ITEM_B_USE_MEDICINE":1,"ITEM_B_USE_OTHER":2,"ITEM_CALCIUM":67,"ITEM_CARBOS":66,"ITEM_CARD_KEY":355,"ITEM_CHARCOAL":215,"ITEM_CHERI_BERRY":133,"ITEM_CHESTO_BERRY":134,"ITEM_CHOICE_BAND":186,"ITEM_CLAW_FOSSIL":287,"ITEM_CLEANSE_TAG":190,"ITEM_COIN_CASE":260,"ITEM_CONTEST_PASS":266,"ITEM_CORNN_BERRY":159,"ITEM_DEEP_SEA_SCALE":193,"ITEM_DEEP_SEA_TOOTH":192,"ITEM_DEVON_GOODS":269,"ITEM_DEVON_SCOPE":288,"ITEM_DIRE_HIT":74,"ITEM_DIVE_BALL":7,"ITEM_DOME_FOSSIL":358,"ITEM_DRAGON_FANG":216,"ITEM_DRAGON_SCALE":201,"ITEM_DREAM_MAIL":130,"ITEM_DURIN_BERRY":166,"ITEM_ELIXIR":36,"ITEM_ENERGY_POWDER":30,"ITEM_ENERGY_ROOT":31,"ITEM_ENIGMA_BERRY":175,"ITEM_EON_TICKET":275,"ITEM_ESCAPE_ROPE":85,"ITEM_ETHER":34,"ITEM_EVERSTONE":195,"ITEM_EXP_SHARE":182,"ITEM_FAB_MAIL":131,"ITEM_FAME_CHECKER":363,"ITEM_FIGY_BERRY":143,"ITEM_FIRE_STONE":95,"ITEM_FLUFFY_TAIL":81,"ITEM_FOCUS_BAND":196,"ITEM_FRESH_WATER":26,"ITEM_FULL_HEAL":23,"ITEM_FULL_RESTORE":19,"ITEM_GANLON_BERRY":169,"ITEM_GLITTER_MAIL":123,"ITEM_GOLD_TEETH":353,"ITEM_GOOD_ROD":263,"ITEM_GO_GOGGLES":279,"ITEM_GREAT_BALL":3,"ITEM_GREEN_SCARF":257,"ITEM_GREEN_SHARD":51,"ITEM_GREPA_BERRY":157,"ITEM_GUARD_SPEC":73,"ITEM_HARBOR_MAIL":122,"ITEM_HARD_STONE":204,"ITEM_HEAL_POWDER":32,"ITEM_HEART_SCALE":111,"ITEM_HELIX_FOSSIL":357,"ITEM_HM01":339,"ITEM_HM02":340,"ITEM_HM03":341,"ITEM_HM04":342,"ITEM_HM05":343,"ITEM_HM06":344,"ITEM_HM07":345,"ITEM_HM08":346,"ITEM_HM_CUT":339,"ITEM_HM_DIVE":346,"ITEM_HM_FLASH":343,"ITEM_HM_FLY":340,"ITEM_HM_ROCK_SMASH":344,"ITEM_HM_STRENGTH":342,"ITEM_HM_SURF":341,"ITEM_HM_WATERFALL":345,"ITEM_HONDEW_BERRY":156,"ITEM_HP_UP":63,"ITEM_HYPER_POTION":21,"ITEM_IAPAPA_BERRY":147,"ITEM_ICE_HEAL":16,"ITEM_IRON":65,"ITEM_ITEMFINDER":261,"ITEM_KELPSY_BERRY":154,"ITEM_KINGS_ROCK":187,"ITEM_LANSAT_BERRY":173,"ITEM_LAVA_COOKIE":38,"ITEM_LAX_INCENSE":221,"ITEM_LEAF_STONE":98,"ITEM_LEFTOVERS":200,"ITEM_LEMONADE":28,"ITEM_LEPPA_BERRY":138,"ITEM_LETTER":274,"ITEM_LIECHI_BERRY":168,"ITEM_LIFT_KEY":356,"ITEM_LIGHT_BALL":202,"ITEM_LIST_END":65535,"ITEM_LUCKY_EGG":197,"ITEM_LUCKY_PUNCH":222,"ITEM_LUM_BERRY":141,"ITEM_LUXURY_BALL":11,"ITEM_MACHO_BRACE":181,"ITEM_MACH_BIKE":259,"ITEM_MAGMA_EMBLEM":375,"ITEM_MAGNET":208,"ITEM_MAGOST_BERRY":160,"ITEM_MAGO_BERRY":145,"ITEM_MASTER_BALL":1,"ITEM_MAX_ELIXIR":37,"ITEM_MAX_ETHER":35,"ITEM_MAX_POTION":20,"ITEM_MAX_REPEL":84,"ITEM_MAX_REVIVE":25,"ITEM_MECH_MAIL":124,"ITEM_MENTAL_HERB":185,"ITEM_METAL_COAT":199,"ITEM_METAL_POWDER":223,"ITEM_METEORITE":280,"ITEM_MIRACLE_SEED":205,"ITEM_MOOMOO_MILK":29,"ITEM_MOON_STONE":94,"ITEM_MYSTIC_TICKET":370,"ITEM_MYSTIC_WATER":209,"ITEM_NANAB_BERRY":150,"ITEM_NEST_BALL":8,"ITEM_NET_BALL":6,"ITEM_NEVER_MELT_ICE":212,"ITEM_NOMEL_BERRY":162,"ITEM_NONE":0,"ITEM_NUGGET":110,"ITEM_OAKS_PARCEL":349,"ITEM_OLD_AMBER":354,"ITEM_OLD_ROD":262,"ITEM_OLD_SEA_MAP":376,"ITEM_ORANGE_MAIL":121,"ITEM_ORAN_BERRY":139,"ITEM_PAMTRE_BERRY":164,"ITEM_PARALYZE_HEAL":18,"ITEM_PEARL":106,"ITEM_PECHA_BERRY":135,"ITEM_PERSIM_BERRY":140,"ITEM_PETAYA_BERRY":171,"ITEM_PINAP_BERRY":152,"ITEM_PINK_SCARF":256,"ITEM_POISON_BARB":211,"ITEM_POKEBLOCK_CASE":273,"ITEM_POKE_BALL":4,"ITEM_POKE_DOLL":80,"ITEM_POKE_FLUTE":350,"ITEM_POMEG_BERRY":153,"ITEM_POTION":13,"ITEM_POWDER_JAR":372,"ITEM_PP_MAX":71,"ITEM_PP_UP":69,"ITEM_PREMIER_BALL":12,"ITEM_PROTEIN":64,"ITEM_QUALOT_BERRY":155,"ITEM_QUICK_CLAW":183,"ITEM_RABUTA_BERRY":161,"ITEM_RAINBOW_PASS":368,"ITEM_RARE_CANDY":68,"ITEM_RAWST_BERRY":136,"ITEM_RAZZ_BERRY":148,"ITEM_RED_FLUTE":41,"ITEM_RED_ORB":276,"ITEM_RED_SCARF":254,"ITEM_RED_SHARD":48,"ITEM_REPEAT_BALL":9,"ITEM_REPEL":86,"ITEM_RETRO_MAIL":132,"ITEM_REVIVAL_HERB":33,"ITEM_REVIVE":24,"ITEM_ROOM_1_KEY":281,"ITEM_ROOM_2_KEY":282,"ITEM_ROOM_4_KEY":283,"ITEM_ROOM_6_KEY":284,"ITEM_ROOT_FOSSIL":286,"ITEM_RUBY":373,"ITEM_SACRED_ASH":45,"ITEM_SAFARI_BALL":5,"ITEM_SALAC_BERRY":170,"ITEM_SAPPHIRE":374,"ITEM_SCANNER":278,"ITEM_SCOPE_LENS":198,"ITEM_SEA_INCENSE":220,"ITEM_SECRET_KEY":351,"ITEM_SHADOW_MAIL":128,"ITEM_SHARP_BEAK":210,"ITEM_SHELL_BELL":219,"ITEM_SHOAL_SALT":46,"ITEM_SHOAL_SHELL":47,"ITEM_SILK_SCARF":217,"ITEM_SILPH_SCOPE":359,"ITEM_SILVER_POWDER":188,"ITEM_SITRUS_BERRY":142,"ITEM_SMOKE_BALL":194,"ITEM_SODA_POP":27,"ITEM_SOFT_SAND":203,"ITEM_SOOTHE_BELL":184,"ITEM_SOOT_SACK":270,"ITEM_SOUL_DEW":191,"ITEM_SPELL_TAG":213,"ITEM_SPELON_BERRY":163,"ITEM_SS_TICKET":265,"ITEM_STARDUST":108,"ITEM_STARF_BERRY":174,"ITEM_STAR_PIECE":109,"ITEM_STICK":225,"ITEM_STORAGE_KEY":285,"ITEM_SUN_STONE":93,"ITEM_SUPER_POTION":22,"ITEM_SUPER_REPEL":83,"ITEM_SUPER_ROD":264,"ITEM_TAMATO_BERRY":158,"ITEM_TEA":369,"ITEM_TEACHY_TV":366,"ITEM_THICK_CLUB":224,"ITEM_THUNDER_STONE":96,"ITEM_TIMER_BALL":10,"ITEM_TINY_MUSHROOM":103,"ITEM_TM01":289,"ITEM_TM02":290,"ITEM_TM03":291,"ITEM_TM04":292,"ITEM_TM05":293,"ITEM_TM06":294,"ITEM_TM07":295,"ITEM_TM08":296,"ITEM_TM09":297,"ITEM_TM10":298,"ITEM_TM11":299,"ITEM_TM12":300,"ITEM_TM13":301,"ITEM_TM14":302,"ITEM_TM15":303,"ITEM_TM16":304,"ITEM_TM17":305,"ITEM_TM18":306,"ITEM_TM19":307,"ITEM_TM20":308,"ITEM_TM21":309,"ITEM_TM22":310,"ITEM_TM23":311,"ITEM_TM24":312,"ITEM_TM25":313,"ITEM_TM26":314,"ITEM_TM27":315,"ITEM_TM28":316,"ITEM_TM29":317,"ITEM_TM30":318,"ITEM_TM31":319,"ITEM_TM32":320,"ITEM_TM33":321,"ITEM_TM34":322,"ITEM_TM35":323,"ITEM_TM36":324,"ITEM_TM37":325,"ITEM_TM38":326,"ITEM_TM39":327,"ITEM_TM40":328,"ITEM_TM41":329,"ITEM_TM42":330,"ITEM_TM43":331,"ITEM_TM44":332,"ITEM_TM45":333,"ITEM_TM46":334,"ITEM_TM47":335,"ITEM_TM48":336,"ITEM_TM49":337,"ITEM_TM50":338,"ITEM_TM_AERIAL_ACE":328,"ITEM_TM_ATTRACT":333,"ITEM_TM_BLIZZARD":302,"ITEM_TM_BRICK_BREAK":319,"ITEM_TM_BULK_UP":296,"ITEM_TM_BULLET_SEED":297,"ITEM_TM_CALM_MIND":292,"ITEM_TM_CASE":364,"ITEM_TM_DIG":316,"ITEM_TM_DOUBLE_TEAM":320,"ITEM_TM_DRAGON_CLAW":290,"ITEM_TM_EARTHQUAKE":314,"ITEM_TM_FACADE":330,"ITEM_TM_FIRE_BLAST":326,"ITEM_TM_FLAMETHROWER":323,"ITEM_TM_FOCUS_PUNCH":289,"ITEM_TM_FRUSTRATION":309,"ITEM_TM_GIGA_DRAIN":307,"ITEM_TM_HAIL":295,"ITEM_TM_HIDDEN_POWER":298,"ITEM_TM_HYPER_BEAM":303,"ITEM_TM_ICE_BEAM":301,"ITEM_TM_IRON_TAIL":311,"ITEM_TM_LIGHT_SCREEN":304,"ITEM_TM_OVERHEAT":338,"ITEM_TM_PROTECT":305,"ITEM_TM_PSYCHIC":317,"ITEM_TM_RAIN_DANCE":306,"ITEM_TM_REFLECT":321,"ITEM_TM_REST":332,"ITEM_TM_RETURN":315,"ITEM_TM_ROAR":293,"ITEM_TM_ROCK_TOMB":327,"ITEM_TM_SAFEGUARD":308,"ITEM_TM_SANDSTORM":325,"ITEM_TM_SECRET_POWER":331,"ITEM_TM_SHADOW_BALL":318,"ITEM_TM_SHOCK_WAVE":322,"ITEM_TM_SKILL_SWAP":336,"ITEM_TM_SLUDGE_BOMB":324,"ITEM_TM_SNATCH":337,"ITEM_TM_SOLAR_BEAM":310,"ITEM_TM_STEEL_WING":335,"ITEM_TM_SUNNY_DAY":299,"ITEM_TM_TAUNT":300,"ITEM_TM_THIEF":334,"ITEM_TM_THUNDER":313,"ITEM_TM_THUNDERBOLT":312,"ITEM_TM_TORMENT":329,"ITEM_TM_TOXIC":294,"ITEM_TM_WATER_PULSE":291,"ITEM_TOWN_MAP":361,"ITEM_TRI_PASS":367,"ITEM_TROPIC_MAIL":129,"ITEM_TWISTED_SPOON":214,"ITEM_ULTRA_BALL":2,"ITEM_UNUSED_BERRY_1":176,"ITEM_UNUSED_BERRY_2":177,"ITEM_UNUSED_BERRY_3":178,"ITEM_UP_GRADE":218,"ITEM_USE_BAG_MENU":4,"ITEM_USE_FIELD":2,"ITEM_USE_MAIL":0,"ITEM_USE_PARTY_MENU":1,"ITEM_USE_PBLOCK_CASE":3,"ITEM_VS_SEEKER":362,"ITEM_WAILMER_PAIL":268,"ITEM_WATER_STONE":97,"ITEM_WATMEL_BERRY":165,"ITEM_WAVE_MAIL":126,"ITEM_WEPEAR_BERRY":151,"ITEM_WHITE_FLUTE":43,"ITEM_WHITE_HERB":180,"ITEM_WIKI_BERRY":144,"ITEM_WOOD_MAIL":125,"ITEM_X_ACCURACY":78,"ITEM_X_ATTACK":75,"ITEM_X_DEFEND":76,"ITEM_X_SPECIAL":79,"ITEM_X_SPEED":77,"ITEM_YELLOW_FLUTE":40,"ITEM_YELLOW_SCARF":258,"ITEM_YELLOW_SHARD":50,"ITEM_ZINC":70,"LAST_BALL":12,"LAST_BERRY_INDEX":175,"LAST_BERRY_MASTER_BERRY":162,"LAST_BERRY_MASTER_WIFE_BERRY":142,"LAST_KIRI_BERRY":162,"LAST_ROUTE_114_MAN_BERRY":152,"MACH_BIKE":0,"MAIL_NONE":255,"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":6207,"MAP_ABANDONED_SHIP_CORRIDORS_1F":6199,"MAP_ABANDONED_SHIP_CORRIDORS_B1F":6201,"MAP_ABANDONED_SHIP_DECK":6198,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":6209,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":6210,"MAP_ABANDONED_SHIP_ROOMS2_1F":6206,"MAP_ABANDONED_SHIP_ROOMS2_B1F":6203,"MAP_ABANDONED_SHIP_ROOMS_1F":6200,"MAP_ABANDONED_SHIP_ROOMS_B1F":6202,"MAP_ABANDONED_SHIP_ROOM_B1F":6205,"MAP_ABANDONED_SHIP_UNDERWATER1":6204,"MAP_ABANDONED_SHIP_UNDERWATER2":6208,"MAP_ALTERING_CAVE":6250,"MAP_ANCIENT_TOMB":6212,"MAP_AQUA_HIDEOUT_1F":6167,"MAP_AQUA_HIDEOUT_B1F":6168,"MAP_AQUA_HIDEOUT_B2F":6169,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":6218,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":6219,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":6220,"MAP_ARTISAN_CAVE_1F":6244,"MAP_ARTISAN_CAVE_B1F":6243,"MAP_BATTLE_COLOSSEUM_2P":6424,"MAP_BATTLE_COLOSSEUM_4P":6427,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":6686,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":6685,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":6684,"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":6677,"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":6675,"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":6674,"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":6676,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":6689,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":6687,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":6688,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":6680,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":6679,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":6678,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":6691,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":6690,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":6694,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":6693,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":6695,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":6692,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":6682,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":6681,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":6683,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":6664,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":6663,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":6662,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":6661,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":6673,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":6672,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":6671,"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":6698,"MAP_BATTLE_FRONTIER_LOUNGE1":6697,"MAP_BATTLE_FRONTIER_LOUNGE2":6699,"MAP_BATTLE_FRONTIER_LOUNGE3":6700,"MAP_BATTLE_FRONTIER_LOUNGE4":6701,"MAP_BATTLE_FRONTIER_LOUNGE5":6703,"MAP_BATTLE_FRONTIER_LOUNGE6":6704,"MAP_BATTLE_FRONTIER_LOUNGE7":6705,"MAP_BATTLE_FRONTIER_LOUNGE8":6707,"MAP_BATTLE_FRONTIER_LOUNGE9":6708,"MAP_BATTLE_FRONTIER_MART":6711,"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":6670,"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":6660,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":6709,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":6710,"MAP_BATTLE_FRONTIER_RANKING_HALL":6696,"MAP_BATTLE_FRONTIER_RECEPTION_GATE":6706,"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":6702,"MAP_BATTLE_PYRAMID_SQUARE01":6444,"MAP_BATTLE_PYRAMID_SQUARE02":6445,"MAP_BATTLE_PYRAMID_SQUARE03":6446,"MAP_BATTLE_PYRAMID_SQUARE04":6447,"MAP_BATTLE_PYRAMID_SQUARE05":6448,"MAP_BATTLE_PYRAMID_SQUARE06":6449,"MAP_BATTLE_PYRAMID_SQUARE07":6450,"MAP_BATTLE_PYRAMID_SQUARE08":6451,"MAP_BATTLE_PYRAMID_SQUARE09":6452,"MAP_BATTLE_PYRAMID_SQUARE10":6453,"MAP_BATTLE_PYRAMID_SQUARE11":6454,"MAP_BATTLE_PYRAMID_SQUARE12":6455,"MAP_BATTLE_PYRAMID_SQUARE13":6456,"MAP_BATTLE_PYRAMID_SQUARE14":6457,"MAP_BATTLE_PYRAMID_SQUARE15":6458,"MAP_BATTLE_PYRAMID_SQUARE16":6459,"MAP_BIRTH_ISLAND_EXTERIOR":6714,"MAP_BIRTH_ISLAND_HARBOR":6715,"MAP_CAVE_OF_ORIGIN_1F":6182,"MAP_CAVE_OF_ORIGIN_B1F":6186,"MAP_CAVE_OF_ORIGIN_ENTRANCE":6181,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":6183,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":6184,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":6185,"MAP_CONTEST_HALL":6428,"MAP_CONTEST_HALL_BEAUTY":6435,"MAP_CONTEST_HALL_COOL":6437,"MAP_CONTEST_HALL_CUTE":6439,"MAP_CONTEST_HALL_SMART":6438,"MAP_CONTEST_HALL_TOUGH":6436,"MAP_DESERT_RUINS":6150,"MAP_DESERT_UNDERPASS":6242,"MAP_DEWFORD_TOWN":11,"MAP_DEWFORD_TOWN_GYM":771,"MAP_DEWFORD_TOWN_HALL":772,"MAP_DEWFORD_TOWN_HOUSE1":768,"MAP_DEWFORD_TOWN_HOUSE2":773,"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":769,"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":770,"MAP_EVER_GRANDE_CITY":8,"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":4100,"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":4099,"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":4098,"MAP_EVER_GRANDE_CITY_HALL1":4101,"MAP_EVER_GRANDE_CITY_HALL2":4102,"MAP_EVER_GRANDE_CITY_HALL3":4103,"MAP_EVER_GRANDE_CITY_HALL4":4104,"MAP_EVER_GRANDE_CITY_HALL5":4105,"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":4107,"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":4097,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":4108,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":4109,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":4106,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":4110,"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":4096,"MAP_FALLARBOR_TOWN":13,"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":1283,"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":1282,"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":1281,"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":1286,"MAP_FALLARBOR_TOWN_MART":1280,"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":1287,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":1284,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":1285,"MAP_FARAWAY_ISLAND_ENTRANCE":6712,"MAP_FARAWAY_ISLAND_INTERIOR":6713,"MAP_FIERY_PATH":6158,"MAP_FORTREE_CITY":4,"MAP_FORTREE_CITY_DECORATION_SHOP":3081,"MAP_FORTREE_CITY_GYM":3073,"MAP_FORTREE_CITY_HOUSE1":3072,"MAP_FORTREE_CITY_HOUSE2":3077,"MAP_FORTREE_CITY_HOUSE3":3078,"MAP_FORTREE_CITY_HOUSE4":3079,"MAP_FORTREE_CITY_HOUSE5":3080,"MAP_FORTREE_CITY_MART":3076,"MAP_FORTREE_CITY_POKEMON_CENTER_1F":3074,"MAP_FORTREE_CITY_POKEMON_CENTER_2F":3075,"MAP_GRANITE_CAVE_1F":6151,"MAP_GRANITE_CAVE_B1F":6152,"MAP_GRANITE_CAVE_B2F":6153,"MAP_GRANITE_CAVE_STEVENS_ROOM":6154,"MAP_GROUPS_COUNT":34,"MAP_INSIDE_OF_TRUCK":6440,"MAP_ISLAND_CAVE":6211,"MAP_JAGGED_PASS":6157,"MAP_LAVARIDGE_TOWN":12,"MAP_LAVARIDGE_TOWN_GYM_1F":1025,"MAP_LAVARIDGE_TOWN_GYM_B1F":1026,"MAP_LAVARIDGE_TOWN_HERB_SHOP":1024,"MAP_LAVARIDGE_TOWN_HOUSE":1027,"MAP_LAVARIDGE_TOWN_MART":1028,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":1029,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":1030,"MAP_LILYCOVE_CITY":5,"MAP_LILYCOVE_CITY_CONTEST_HALL":3333,"MAP_LILYCOVE_CITY_CONTEST_LOBBY":3332,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":3328,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":3329,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":3344,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":3345,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":3346,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":3347,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":3348,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":3350,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":3349,"MAP_LILYCOVE_CITY_HARBOR":3338,"MAP_LILYCOVE_CITY_HOUSE1":3340,"MAP_LILYCOVE_CITY_HOUSE2":3341,"MAP_LILYCOVE_CITY_HOUSE3":3342,"MAP_LILYCOVE_CITY_HOUSE4":3343,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":3330,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":3331,"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":3339,"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":3334,"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":3335,"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":3337,"MAP_LILYCOVE_CITY_UNUSED_MART":3336,"MAP_LITTLEROOT_TOWN":9,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":256,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":257,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":258,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":259,"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":260,"MAP_MAGMA_HIDEOUT_1F":6230,"MAP_MAGMA_HIDEOUT_2F_1R":6231,"MAP_MAGMA_HIDEOUT_2F_2R":6232,"MAP_MAGMA_HIDEOUT_2F_3R":6237,"MAP_MAGMA_HIDEOUT_3F_1R":6233,"MAP_MAGMA_HIDEOUT_3F_2R":6234,"MAP_MAGMA_HIDEOUT_3F_3R":6236,"MAP_MAGMA_HIDEOUT_4F":6235,"MAP_MARINE_CAVE_END":6247,"MAP_MARINE_CAVE_ENTRANCE":6246,"MAP_MAUVILLE_CITY":2,"MAP_MAUVILLE_CITY_BIKE_SHOP":2561,"MAP_MAUVILLE_CITY_GAME_CORNER":2563,"MAP_MAUVILLE_CITY_GYM":2560,"MAP_MAUVILLE_CITY_HOUSE1":2562,"MAP_MAUVILLE_CITY_HOUSE2":2564,"MAP_MAUVILLE_CITY_MART":2567,"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":2565,"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":2566,"MAP_METEOR_FALLS_1F_1R":6144,"MAP_METEOR_FALLS_1F_2R":6145,"MAP_METEOR_FALLS_B1F_1R":6146,"MAP_METEOR_FALLS_B1F_2R":6147,"MAP_METEOR_FALLS_STEVENS_CAVE":6251,"MAP_MIRAGE_TOWER_1F":6238,"MAP_MIRAGE_TOWER_2F":6239,"MAP_MIRAGE_TOWER_3F":6240,"MAP_MIRAGE_TOWER_4F":6241,"MAP_MOSSDEEP_CITY":6,"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":3595,"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":3596,"MAP_MOSSDEEP_CITY_GYM":3584,"MAP_MOSSDEEP_CITY_HOUSE1":3585,"MAP_MOSSDEEP_CITY_HOUSE2":3586,"MAP_MOSSDEEP_CITY_HOUSE3":3590,"MAP_MOSSDEEP_CITY_HOUSE4":3592,"MAP_MOSSDEEP_CITY_MART":3589,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":3587,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":3588,"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":3593,"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":3594,"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":3591,"MAP_MT_CHIMNEY":6156,"MAP_MT_CHIMNEY_CABLE_CAR_STATION":4865,"MAP_MT_PYRE_1F":6159,"MAP_MT_PYRE_2F":6160,"MAP_MT_PYRE_3F":6161,"MAP_MT_PYRE_4F":6162,"MAP_MT_PYRE_5F":6163,"MAP_MT_PYRE_6F":6164,"MAP_MT_PYRE_EXTERIOR":6165,"MAP_MT_PYRE_SUMMIT":6166,"MAP_NAVEL_ROCK_B1F":6725,"MAP_NAVEL_ROCK_BOTTOM":6743,"MAP_NAVEL_ROCK_DOWN01":6732,"MAP_NAVEL_ROCK_DOWN02":6733,"MAP_NAVEL_ROCK_DOWN03":6734,"MAP_NAVEL_ROCK_DOWN04":6735,"MAP_NAVEL_ROCK_DOWN05":6736,"MAP_NAVEL_ROCK_DOWN06":6737,"MAP_NAVEL_ROCK_DOWN07":6738,"MAP_NAVEL_ROCK_DOWN08":6739,"MAP_NAVEL_ROCK_DOWN09":6740,"MAP_NAVEL_ROCK_DOWN10":6741,"MAP_NAVEL_ROCK_DOWN11":6742,"MAP_NAVEL_ROCK_ENTRANCE":6724,"MAP_NAVEL_ROCK_EXTERIOR":6722,"MAP_NAVEL_ROCK_FORK":6726,"MAP_NAVEL_ROCK_HARBOR":6723,"MAP_NAVEL_ROCK_TOP":6731,"MAP_NAVEL_ROCK_UP1":6727,"MAP_NAVEL_ROCK_UP2":6728,"MAP_NAVEL_ROCK_UP3":6729,"MAP_NAVEL_ROCK_UP4":6730,"MAP_NEW_MAUVILLE_ENTRANCE":6196,"MAP_NEW_MAUVILLE_INSIDE":6197,"MAP_OLDALE_TOWN":10,"MAP_OLDALE_TOWN_HOUSE1":512,"MAP_OLDALE_TOWN_HOUSE2":513,"MAP_OLDALE_TOWN_MART":516,"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":514,"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":515,"MAP_PACIFIDLOG_TOWN":15,"MAP_PACIFIDLOG_TOWN_HOUSE1":1794,"MAP_PACIFIDLOG_TOWN_HOUSE2":1795,"MAP_PACIFIDLOG_TOWN_HOUSE3":1796,"MAP_PACIFIDLOG_TOWN_HOUSE4":1797,"MAP_PACIFIDLOG_TOWN_HOUSE5":1798,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":1792,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":1793,"MAP_PETALBURG_CITY":0,"MAP_PETALBURG_CITY_GYM":2049,"MAP_PETALBURG_CITY_HOUSE1":2050,"MAP_PETALBURG_CITY_HOUSE2":2051,"MAP_PETALBURG_CITY_MART":2054,"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":2052,"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":2053,"MAP_PETALBURG_CITY_WALLYS_HOUSE":2048,"MAP_PETALBURG_WOODS":6155,"MAP_RECORD_CORNER":6426,"MAP_ROUTE101":16,"MAP_ROUTE102":17,"MAP_ROUTE103":18,"MAP_ROUTE104":19,"MAP_ROUTE104_MR_BRINEYS_HOUSE":4352,"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":4353,"MAP_ROUTE104_PROTOTYPE":6912,"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":6913,"MAP_ROUTE105":20,"MAP_ROUTE106":21,"MAP_ROUTE107":22,"MAP_ROUTE108":23,"MAP_ROUTE109":24,"MAP_ROUTE109_SEASHORE_HOUSE":7168,"MAP_ROUTE110":25,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":7435,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":7436,"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":7426,"MAP_ROUTE110_TRICK_HOUSE_END":7425,"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":7424,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":7427,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":7428,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":7429,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":7430,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":7431,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":7432,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":7433,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":7434,"MAP_ROUTE111":26,"MAP_ROUTE111_OLD_LADYS_REST_STOP":4609,"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":4608,"MAP_ROUTE112":27,"MAP_ROUTE112_CABLE_CAR_STATION":4864,"MAP_ROUTE113":28,"MAP_ROUTE113_GLASS_WORKSHOP":7680,"MAP_ROUTE114":29,"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":5120,"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":5121,"MAP_ROUTE114_LANETTES_HOUSE":5122,"MAP_ROUTE115":30,"MAP_ROUTE116":31,"MAP_ROUTE116_TUNNELERS_REST_HOUSE":5376,"MAP_ROUTE117":32,"MAP_ROUTE117_POKEMON_DAY_CARE":5632,"MAP_ROUTE118":33,"MAP_ROUTE119":34,"MAP_ROUTE119_HOUSE":8194,"MAP_ROUTE119_WEATHER_INSTITUTE_1F":8192,"MAP_ROUTE119_WEATHER_INSTITUTE_2F":8193,"MAP_ROUTE120":35,"MAP_ROUTE121":36,"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":5888,"MAP_ROUTE122":37,"MAP_ROUTE123":38,"MAP_ROUTE123_BERRY_MASTERS_HOUSE":7936,"MAP_ROUTE124":39,"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":8448,"MAP_ROUTE125":40,"MAP_ROUTE126":41,"MAP_ROUTE127":42,"MAP_ROUTE128":43,"MAP_ROUTE129":44,"MAP_ROUTE130":45,"MAP_ROUTE131":46,"MAP_ROUTE132":47,"MAP_ROUTE133":48,"MAP_ROUTE134":49,"MAP_RUSTBORO_CITY":3,"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":2827,"MAP_RUSTBORO_CITY_DEVON_CORP_1F":2816,"MAP_RUSTBORO_CITY_DEVON_CORP_2F":2817,"MAP_RUSTBORO_CITY_DEVON_CORP_3F":2818,"MAP_RUSTBORO_CITY_FLAT1_1F":2824,"MAP_RUSTBORO_CITY_FLAT1_2F":2825,"MAP_RUSTBORO_CITY_FLAT2_1F":2829,"MAP_RUSTBORO_CITY_FLAT2_2F":2830,"MAP_RUSTBORO_CITY_FLAT2_3F":2831,"MAP_RUSTBORO_CITY_GYM":2819,"MAP_RUSTBORO_CITY_HOUSE1":2826,"MAP_RUSTBORO_CITY_HOUSE2":2828,"MAP_RUSTBORO_CITY_HOUSE3":2832,"MAP_RUSTBORO_CITY_MART":2823,"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":2821,"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":2822,"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":2820,"MAP_RUSTURF_TUNNEL":6148,"MAP_SAFARI_ZONE_NORTH":6657,"MAP_SAFARI_ZONE_NORTHEAST":6668,"MAP_SAFARI_ZONE_NORTHWEST":6656,"MAP_SAFARI_ZONE_REST_HOUSE":6667,"MAP_SAFARI_ZONE_SOUTH":6659,"MAP_SAFARI_ZONE_SOUTHEAST":6669,"MAP_SAFARI_ZONE_SOUTHWEST":6658,"MAP_SCORCHED_SLAB":6217,"MAP_SEAFLOOR_CAVERN_ENTRANCE":6171,"MAP_SEAFLOOR_CAVERN_ROOM1":6172,"MAP_SEAFLOOR_CAVERN_ROOM2":6173,"MAP_SEAFLOOR_CAVERN_ROOM3":6174,"MAP_SEAFLOOR_CAVERN_ROOM4":6175,"MAP_SEAFLOOR_CAVERN_ROOM5":6176,"MAP_SEAFLOOR_CAVERN_ROOM6":6177,"MAP_SEAFLOOR_CAVERN_ROOM7":6178,"MAP_SEAFLOOR_CAVERN_ROOM8":6179,"MAP_SEAFLOOR_CAVERN_ROOM9":6180,"MAP_SEALED_CHAMBER_INNER_ROOM":6216,"MAP_SEALED_CHAMBER_OUTER_ROOM":6215,"MAP_SECRET_BASE_BLUE_CAVE1":6402,"MAP_SECRET_BASE_BLUE_CAVE2":6408,"MAP_SECRET_BASE_BLUE_CAVE3":6414,"MAP_SECRET_BASE_BLUE_CAVE4":6420,"MAP_SECRET_BASE_BROWN_CAVE1":6401,"MAP_SECRET_BASE_BROWN_CAVE2":6407,"MAP_SECRET_BASE_BROWN_CAVE3":6413,"MAP_SECRET_BASE_BROWN_CAVE4":6419,"MAP_SECRET_BASE_RED_CAVE1":6400,"MAP_SECRET_BASE_RED_CAVE2":6406,"MAP_SECRET_BASE_RED_CAVE3":6412,"MAP_SECRET_BASE_RED_CAVE4":6418,"MAP_SECRET_BASE_SHRUB1":6405,"MAP_SECRET_BASE_SHRUB2":6411,"MAP_SECRET_BASE_SHRUB3":6417,"MAP_SECRET_BASE_SHRUB4":6423,"MAP_SECRET_BASE_TREE1":6404,"MAP_SECRET_BASE_TREE2":6410,"MAP_SECRET_BASE_TREE3":6416,"MAP_SECRET_BASE_TREE4":6422,"MAP_SECRET_BASE_YELLOW_CAVE1":6403,"MAP_SECRET_BASE_YELLOW_CAVE2":6409,"MAP_SECRET_BASE_YELLOW_CAVE3":6415,"MAP_SECRET_BASE_YELLOW_CAVE4":6421,"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":6194,"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":6195,"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":6190,"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":6227,"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":6191,"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":6193,"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":6192,"MAP_SKY_PILLAR_1F":6223,"MAP_SKY_PILLAR_2F":6224,"MAP_SKY_PILLAR_3F":6225,"MAP_SKY_PILLAR_4F":6226,"MAP_SKY_PILLAR_5F":6228,"MAP_SKY_PILLAR_ENTRANCE":6221,"MAP_SKY_PILLAR_OUTSIDE":6222,"MAP_SKY_PILLAR_TOP":6229,"MAP_SLATEPORT_CITY":1,"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":2308,"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":2307,"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":2306,"MAP_SLATEPORT_CITY_HARBOR":2313,"MAP_SLATEPORT_CITY_HOUSE":2314,"MAP_SLATEPORT_CITY_MART":2317,"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":2309,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":2311,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":2312,"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":2315,"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":2316,"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":2310,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":2304,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":2305,"MAP_SOOTOPOLIS_CITY":7,"MAP_SOOTOPOLIS_CITY_GYM_1F":3840,"MAP_SOOTOPOLIS_CITY_GYM_B1F":3841,"MAP_SOOTOPOLIS_CITY_HOUSE1":3845,"MAP_SOOTOPOLIS_CITY_HOUSE2":3846,"MAP_SOOTOPOLIS_CITY_HOUSE3":3847,"MAP_SOOTOPOLIS_CITY_HOUSE4":3848,"MAP_SOOTOPOLIS_CITY_HOUSE5":3849,"MAP_SOOTOPOLIS_CITY_HOUSE6":3850,"MAP_SOOTOPOLIS_CITY_HOUSE7":3851,"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":3852,"MAP_SOOTOPOLIS_CITY_MART":3844,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":3853,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":3854,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":3842,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":3843,"MAP_SOUTHERN_ISLAND_EXTERIOR":6665,"MAP_SOUTHERN_ISLAND_INTERIOR":6666,"MAP_SS_TIDAL_CORRIDOR":6441,"MAP_SS_TIDAL_LOWER_DECK":6442,"MAP_SS_TIDAL_ROOMS":6443,"MAP_TERRA_CAVE_END":6249,"MAP_TERRA_CAVE_ENTRANCE":6248,"MAP_TRADE_CENTER":6425,"MAP_TRAINER_HILL_1F":6717,"MAP_TRAINER_HILL_2F":6718,"MAP_TRAINER_HILL_3F":6719,"MAP_TRAINER_HILL_4F":6720,"MAP_TRAINER_HILL_ELEVATOR":6744,"MAP_TRAINER_HILL_ENTRANCE":6716,"MAP_TRAINER_HILL_ROOF":6721,"MAP_UNDERWATER_MARINE_CAVE":6245,"MAP_UNDERWATER_ROUTE105":55,"MAP_UNDERWATER_ROUTE124":50,"MAP_UNDERWATER_ROUTE125":56,"MAP_UNDERWATER_ROUTE126":51,"MAP_UNDERWATER_ROUTE127":52,"MAP_UNDERWATER_ROUTE128":53,"MAP_UNDERWATER_ROUTE129":54,"MAP_UNDERWATER_ROUTE134":6213,"MAP_UNDERWATER_SEAFLOOR_CAVERN":6170,"MAP_UNDERWATER_SEALED_CHAMBER":6214,"MAP_UNDERWATER_SOOTOPOLIS_CITY":6149,"MAP_UNION_ROOM":6460,"MAP_UNUSED_CONTEST_HALL1":6429,"MAP_UNUSED_CONTEST_HALL2":6430,"MAP_UNUSED_CONTEST_HALL3":6431,"MAP_UNUSED_CONTEST_HALL4":6432,"MAP_UNUSED_CONTEST_HALL5":6433,"MAP_UNUSED_CONTEST_HALL6":6434,"MAP_VERDANTURF_TOWN":14,"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":1538,"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":1537,"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":1536,"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":1543,"MAP_VERDANTURF_TOWN_HOUSE":1544,"MAP_VERDANTURF_TOWN_MART":1539,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":1540,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":1541,"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":1542,"MAP_VICTORY_ROAD_1F":6187,"MAP_VICTORY_ROAD_B1F":6188,"MAP_VICTORY_ROAD_B2F":6189,"MAX_BAG_ITEM_CAPACITY":99,"MAX_BERRY_CAPACITY":999,"MAX_BERRY_INDEX":178,"MAX_ITEM_DIGITS":3,"MAX_PC_ITEM_CAPACITY":999,"MAX_TRAINERS_COUNT":864,"MOVES_COUNT":355,"MOVE_ABSORB":71,"MOVE_ACID":51,"MOVE_ACID_ARMOR":151,"MOVE_AERIAL_ACE":332,"MOVE_AEROBLAST":177,"MOVE_AGILITY":97,"MOVE_AIR_CUTTER":314,"MOVE_AMNESIA":133,"MOVE_ANCIENT_POWER":246,"MOVE_ARM_THRUST":292,"MOVE_AROMATHERAPY":312,"MOVE_ASSIST":274,"MOVE_ASTONISH":310,"MOVE_ATTRACT":213,"MOVE_AURORA_BEAM":62,"MOVE_BARRAGE":140,"MOVE_BARRIER":112,"MOVE_BATON_PASS":226,"MOVE_BEAT_UP":251,"MOVE_BELLY_DRUM":187,"MOVE_BIDE":117,"MOVE_BIND":20,"MOVE_BITE":44,"MOVE_BLAST_BURN":307,"MOVE_BLAZE_KICK":299,"MOVE_BLIZZARD":59,"MOVE_BLOCK":335,"MOVE_BODY_SLAM":34,"MOVE_BONEMERANG":155,"MOVE_BONE_CLUB":125,"MOVE_BONE_RUSH":198,"MOVE_BOUNCE":340,"MOVE_BRICK_BREAK":280,"MOVE_BUBBLE":145,"MOVE_BUBBLE_BEAM":61,"MOVE_BULK_UP":339,"MOVE_BULLET_SEED":331,"MOVE_CALM_MIND":347,"MOVE_CAMOUFLAGE":293,"MOVE_CHARGE":268,"MOVE_CHARM":204,"MOVE_CLAMP":128,"MOVE_COMET_PUNCH":4,"MOVE_CONFUSE_RAY":109,"MOVE_CONFUSION":93,"MOVE_CONSTRICT":132,"MOVE_CONVERSION":160,"MOVE_CONVERSION_2":176,"MOVE_COSMIC_POWER":322,"MOVE_COTTON_SPORE":178,"MOVE_COUNTER":68,"MOVE_COVET":343,"MOVE_CRABHAMMER":152,"MOVE_CROSS_CHOP":238,"MOVE_CRUNCH":242,"MOVE_CRUSH_CLAW":306,"MOVE_CURSE":174,"MOVE_CUT":15,"MOVE_DEFENSE_CURL":111,"MOVE_DESTINY_BOND":194,"MOVE_DETECT":197,"MOVE_DIG":91,"MOVE_DISABLE":50,"MOVE_DIVE":291,"MOVE_DIZZY_PUNCH":146,"MOVE_DOOM_DESIRE":353,"MOVE_DOUBLE_EDGE":38,"MOVE_DOUBLE_KICK":24,"MOVE_DOUBLE_SLAP":3,"MOVE_DOUBLE_TEAM":104,"MOVE_DRAGON_BREATH":225,"MOVE_DRAGON_CLAW":337,"MOVE_DRAGON_DANCE":349,"MOVE_DRAGON_RAGE":82,"MOVE_DREAM_EATER":138,"MOVE_DRILL_PECK":65,"MOVE_DYNAMIC_PUNCH":223,"MOVE_EARTHQUAKE":89,"MOVE_EGG_BOMB":121,"MOVE_EMBER":52,"MOVE_ENCORE":227,"MOVE_ENDEAVOR":283,"MOVE_ENDURE":203,"MOVE_ERUPTION":284,"MOVE_EXPLOSION":153,"MOVE_EXTRASENSORY":326,"MOVE_EXTREME_SPEED":245,"MOVE_FACADE":263,"MOVE_FAINT_ATTACK":185,"MOVE_FAKE_OUT":252,"MOVE_FAKE_TEARS":313,"MOVE_FALSE_SWIPE":206,"MOVE_FEATHER_DANCE":297,"MOVE_FIRE_BLAST":126,"MOVE_FIRE_PUNCH":7,"MOVE_FIRE_SPIN":83,"MOVE_FISSURE":90,"MOVE_FLAIL":175,"MOVE_FLAMETHROWER":53,"MOVE_FLAME_WHEEL":172,"MOVE_FLASH":148,"MOVE_FLATTER":260,"MOVE_FLY":19,"MOVE_FOCUS_ENERGY":116,"MOVE_FOCUS_PUNCH":264,"MOVE_FOLLOW_ME":266,"MOVE_FORESIGHT":193,"MOVE_FRENZY_PLANT":338,"MOVE_FRUSTRATION":218,"MOVE_FURY_ATTACK":31,"MOVE_FURY_CUTTER":210,"MOVE_FURY_SWIPES":154,"MOVE_FUTURE_SIGHT":248,"MOVE_GIGA_DRAIN":202,"MOVE_GLARE":137,"MOVE_GRASS_WHISTLE":320,"MOVE_GROWL":45,"MOVE_GROWTH":74,"MOVE_GRUDGE":288,"MOVE_GUILLOTINE":12,"MOVE_GUST":16,"MOVE_HAIL":258,"MOVE_HARDEN":106,"MOVE_HAZE":114,"MOVE_HEADBUTT":29,"MOVE_HEAL_BELL":215,"MOVE_HEAT_WAVE":257,"MOVE_HELPING_HAND":270,"MOVE_HIDDEN_POWER":237,"MOVE_HI_JUMP_KICK":136,"MOVE_HORN_ATTACK":30,"MOVE_HORN_DRILL":32,"MOVE_HOWL":336,"MOVE_HYDRO_CANNON":308,"MOVE_HYDRO_PUMP":56,"MOVE_HYPER_BEAM":63,"MOVE_HYPER_FANG":158,"MOVE_HYPER_VOICE":304,"MOVE_HYPNOSIS":95,"MOVE_ICE_BALL":301,"MOVE_ICE_BEAM":58,"MOVE_ICE_PUNCH":8,"MOVE_ICICLE_SPEAR":333,"MOVE_ICY_WIND":196,"MOVE_IMPRISON":286,"MOVE_INGRAIN":275,"MOVE_IRON_DEFENSE":334,"MOVE_IRON_TAIL":231,"MOVE_JUMP_KICK":26,"MOVE_KARATE_CHOP":2,"MOVE_KINESIS":134,"MOVE_KNOCK_OFF":282,"MOVE_LEAF_BLADE":348,"MOVE_LEECH_LIFE":141,"MOVE_LEECH_SEED":73,"MOVE_LEER":43,"MOVE_LICK":122,"MOVE_LIGHT_SCREEN":113,"MOVE_LOCK_ON":199,"MOVE_LOVELY_KISS":142,"MOVE_LOW_KICK":67,"MOVE_LUSTER_PURGE":295,"MOVE_MACH_PUNCH":183,"MOVE_MAGICAL_LEAF":345,"MOVE_MAGIC_COAT":277,"MOVE_MAGNITUDE":222,"MOVE_MEAN_LOOK":212,"MOVE_MEDITATE":96,"MOVE_MEGAHORN":224,"MOVE_MEGA_DRAIN":72,"MOVE_MEGA_KICK":25,"MOVE_MEGA_PUNCH":5,"MOVE_MEMENTO":262,"MOVE_METAL_CLAW":232,"MOVE_METAL_SOUND":319,"MOVE_METEOR_MASH":309,"MOVE_METRONOME":118,"MOVE_MILK_DRINK":208,"MOVE_MIMIC":102,"MOVE_MIND_READER":170,"MOVE_MINIMIZE":107,"MOVE_MIRROR_COAT":243,"MOVE_MIRROR_MOVE":119,"MOVE_MIST":54,"MOVE_MIST_BALL":296,"MOVE_MOONLIGHT":236,"MOVE_MORNING_SUN":234,"MOVE_MUDDY_WATER":330,"MOVE_MUD_SHOT":341,"MOVE_MUD_SLAP":189,"MOVE_MUD_SPORT":300,"MOVE_NATURE_POWER":267,"MOVE_NEEDLE_ARM":302,"MOVE_NIGHTMARE":171,"MOVE_NIGHT_SHADE":101,"MOVE_NONE":0,"MOVE_OCTAZOOKA":190,"MOVE_ODOR_SLEUTH":316,"MOVE_OUTRAGE":200,"MOVE_OVERHEAT":315,"MOVE_PAIN_SPLIT":220,"MOVE_PAY_DAY":6,"MOVE_PECK":64,"MOVE_PERISH_SONG":195,"MOVE_PETAL_DANCE":80,"MOVE_PIN_MISSILE":42,"MOVE_POISON_FANG":305,"MOVE_POISON_GAS":139,"MOVE_POISON_POWDER":77,"MOVE_POISON_STING":40,"MOVE_POISON_TAIL":342,"MOVE_POUND":1,"MOVE_POWDER_SNOW":181,"MOVE_PRESENT":217,"MOVE_PROTECT":182,"MOVE_PSYBEAM":60,"MOVE_PSYCHIC":94,"MOVE_PSYCHO_BOOST":354,"MOVE_PSYCH_UP":244,"MOVE_PSYWAVE":149,"MOVE_PURSUIT":228,"MOVE_QUICK_ATTACK":98,"MOVE_RAGE":99,"MOVE_RAIN_DANCE":240,"MOVE_RAPID_SPIN":229,"MOVE_RAZOR_LEAF":75,"MOVE_RAZOR_WIND":13,"MOVE_RECOVER":105,"MOVE_RECYCLE":278,"MOVE_REFLECT":115,"MOVE_REFRESH":287,"MOVE_REST":156,"MOVE_RETURN":216,"MOVE_REVENGE":279,"MOVE_REVERSAL":179,"MOVE_ROAR":46,"MOVE_ROCK_BLAST":350,"MOVE_ROCK_SLIDE":157,"MOVE_ROCK_SMASH":249,"MOVE_ROCK_THROW":88,"MOVE_ROCK_TOMB":317,"MOVE_ROLE_PLAY":272,"MOVE_ROLLING_KICK":27,"MOVE_ROLLOUT":205,"MOVE_SACRED_FIRE":221,"MOVE_SAFEGUARD":219,"MOVE_SANDSTORM":201,"MOVE_SAND_ATTACK":28,"MOVE_SAND_TOMB":328,"MOVE_SCARY_FACE":184,"MOVE_SCRATCH":10,"MOVE_SCREECH":103,"MOVE_SECRET_POWER":290,"MOVE_SEISMIC_TOSS":69,"MOVE_SELF_DESTRUCT":120,"MOVE_SHADOW_BALL":247,"MOVE_SHADOW_PUNCH":325,"MOVE_SHARPEN":159,"MOVE_SHEER_COLD":329,"MOVE_SHOCK_WAVE":351,"MOVE_SIGNAL_BEAM":324,"MOVE_SILVER_WIND":318,"MOVE_SING":47,"MOVE_SKETCH":166,"MOVE_SKILL_SWAP":285,"MOVE_SKULL_BASH":130,"MOVE_SKY_ATTACK":143,"MOVE_SKY_UPPERCUT":327,"MOVE_SLACK_OFF":303,"MOVE_SLAM":21,"MOVE_SLASH":163,"MOVE_SLEEP_POWDER":79,"MOVE_SLEEP_TALK":214,"MOVE_SLUDGE":124,"MOVE_SLUDGE_BOMB":188,"MOVE_SMELLING_SALT":265,"MOVE_SMOG":123,"MOVE_SMOKESCREEN":108,"MOVE_SNATCH":289,"MOVE_SNORE":173,"MOVE_SOFT_BOILED":135,"MOVE_SOLAR_BEAM":76,"MOVE_SONIC_BOOM":49,"MOVE_SPARK":209,"MOVE_SPIDER_WEB":169,"MOVE_SPIKES":191,"MOVE_SPIKE_CANNON":131,"MOVE_SPITE":180,"MOVE_SPIT_UP":255,"MOVE_SPLASH":150,"MOVE_SPORE":147,"MOVE_STEEL_WING":211,"MOVE_STOCKPILE":254,"MOVE_STOMP":23,"MOVE_STRENGTH":70,"MOVE_STRING_SHOT":81,"MOVE_STRUGGLE":165,"MOVE_STUN_SPORE":78,"MOVE_SUBMISSION":66,"MOVE_SUBSTITUTE":164,"MOVE_SUNNY_DAY":241,"MOVE_SUPERPOWER":276,"MOVE_SUPERSONIC":48,"MOVE_SUPER_FANG":162,"MOVE_SURF":57,"MOVE_SWAGGER":207,"MOVE_SWALLOW":256,"MOVE_SWEET_KISS":186,"MOVE_SWEET_SCENT":230,"MOVE_SWIFT":129,"MOVE_SWORDS_DANCE":14,"MOVE_SYNTHESIS":235,"MOVE_TACKLE":33,"MOVE_TAIL_GLOW":294,"MOVE_TAIL_WHIP":39,"MOVE_TAKE_DOWN":36,"MOVE_TAUNT":269,"MOVE_TEETER_DANCE":298,"MOVE_TELEPORT":100,"MOVE_THIEF":168,"MOVE_THRASH":37,"MOVE_THUNDER":87,"MOVE_THUNDERBOLT":85,"MOVE_THUNDER_PUNCH":9,"MOVE_THUNDER_SHOCK":84,"MOVE_THUNDER_WAVE":86,"MOVE_TICKLE":321,"MOVE_TORMENT":259,"MOVE_TOXIC":92,"MOVE_TRANSFORM":144,"MOVE_TRICK":271,"MOVE_TRIPLE_KICK":167,"MOVE_TRI_ATTACK":161,"MOVE_TWINEEDLE":41,"MOVE_TWISTER":239,"MOVE_UNAVAILABLE":65535,"MOVE_UPROAR":253,"MOVE_VICE_GRIP":11,"MOVE_VINE_WHIP":22,"MOVE_VITAL_THROW":233,"MOVE_VOLT_TACKLE":344,"MOVE_WATERFALL":127,"MOVE_WATER_GUN":55,"MOVE_WATER_PULSE":352,"MOVE_WATER_SPORT":346,"MOVE_WATER_SPOUT":323,"MOVE_WEATHER_BALL":311,"MOVE_WHIRLPOOL":250,"MOVE_WHIRLWIND":18,"MOVE_WILL_O_WISP":261,"MOVE_WING_ATTACK":17,"MOVE_WISH":273,"MOVE_WITHDRAW":110,"MOVE_WRAP":35,"MOVE_YAWN":281,"MOVE_ZAP_CANNON":192,"MUS_ABANDONED_SHIP":381,"MUS_ABNORMAL_WEATHER":443,"MUS_AQUA_MAGMA_HIDEOUT":430,"MUS_AWAKEN_LEGEND":388,"MUS_BIRCH_LAB":383,"MUS_B_ARENA":458,"MUS_B_DOME":467,"MUS_B_DOME_LOBBY":473,"MUS_B_FACTORY":469,"MUS_B_FRONTIER":457,"MUS_B_PALACE":463,"MUS_B_PIKE":468,"MUS_B_PYRAMID":461,"MUS_B_PYRAMID_TOP":462,"MUS_B_TOWER":465,"MUS_B_TOWER_RS":384,"MUS_CABLE_CAR":425,"MUS_CAUGHT":352,"MUS_CAVE_OF_ORIGIN":386,"MUS_CONTEST":440,"MUS_CONTEST_LOBBY":452,"MUS_CONTEST_RESULTS":446,"MUS_CONTEST_WINNER":439,"MUS_CREDITS":455,"MUS_CYCLING":403,"MUS_C_COMM_CENTER":356,"MUS_C_VS_LEGEND_BEAST":358,"MUS_DESERT":409,"MUS_DEWFORD":427,"MUS_DUMMY":0,"MUS_ENCOUNTER_AQUA":419,"MUS_ENCOUNTER_BRENDAN":421,"MUS_ENCOUNTER_CHAMPION":454,"MUS_ENCOUNTER_COOL":417,"MUS_ENCOUNTER_ELITE_FOUR":450,"MUS_ENCOUNTER_FEMALE":407,"MUS_ENCOUNTER_GIRL":379,"MUS_ENCOUNTER_HIKER":451,"MUS_ENCOUNTER_INTENSE":416,"MUS_ENCOUNTER_INTERVIEWER":453,"MUS_ENCOUNTER_MAGMA":441,"MUS_ENCOUNTER_MALE":380,"MUS_ENCOUNTER_MAY":415,"MUS_ENCOUNTER_RICH":397,"MUS_ENCOUNTER_SUSPICIOUS":423,"MUS_ENCOUNTER_SWIMMER":385,"MUS_ENCOUNTER_TWINS":449,"MUS_END":456,"MUS_EVER_GRANDE":422,"MUS_EVOLUTION":377,"MUS_EVOLUTION_INTRO":376,"MUS_EVOLVED":371,"MUS_FALLARBOR":437,"MUS_FOLLOW_ME":420,"MUS_FORTREE":382,"MUS_GAME_CORNER":426,"MUS_GSC_PEWTER":357,"MUS_GSC_ROUTE38":351,"MUS_GYM":364,"MUS_HALL_OF_FAME":436,"MUS_HALL_OF_FAME_ROOM":447,"MUS_HEAL":368,"MUS_HELP":410,"MUS_INTRO":414,"MUS_INTRO_BATTLE":442,"MUS_LEVEL_UP":367,"MUS_LILYCOVE":408,"MUS_LILYCOVE_MUSEUM":373,"MUS_LINK_CONTEST_P1":393,"MUS_LINK_CONTEST_P2":394,"MUS_LINK_CONTEST_P3":395,"MUS_LINK_CONTEST_P4":396,"MUS_LITTLEROOT":405,"MUS_LITTLEROOT_TEST":350,"MUS_MOVE_DELETED":378,"MUS_MT_CHIMNEY":406,"MUS_MT_PYRE":432,"MUS_MT_PYRE_EXTERIOR":434,"MUS_NONE":65535,"MUS_OBTAIN_BADGE":369,"MUS_OBTAIN_BERRY":387,"MUS_OBTAIN_B_POINTS":459,"MUS_OBTAIN_ITEM":370,"MUS_OBTAIN_SYMBOL":466,"MUS_OBTAIN_TMHM":372,"MUS_OCEANIC_MUSEUM":375,"MUS_OLDALE":363,"MUS_PETALBURG":362,"MUS_PETALBURG_WOODS":366,"MUS_POKE_CENTER":400,"MUS_POKE_MART":404,"MUS_RAYQUAZA_APPEARS":464,"MUS_REGISTER_MATCH_CALL":460,"MUS_RG_BERRY_PICK":542,"MUS_RG_CAUGHT":534,"MUS_RG_CAUGHT_INTRO":531,"MUS_RG_CELADON":521,"MUS_RG_CINNABAR":491,"MUS_RG_CREDITS":502,"MUS_RG_CYCLING":494,"MUS_RG_DEX_RATING":529,"MUS_RG_ENCOUNTER_BOY":497,"MUS_RG_ENCOUNTER_DEOXYS":555,"MUS_RG_ENCOUNTER_GIRL":496,"MUS_RG_ENCOUNTER_GYM_LEADER":554,"MUS_RG_ENCOUNTER_RIVAL":527,"MUS_RG_ENCOUNTER_ROCKET":495,"MUS_RG_FOLLOW_ME":484,"MUS_RG_FUCHSIA":520,"MUS_RG_GAME_CORNER":485,"MUS_RG_GAME_FREAK":533,"MUS_RG_GYM":487,"MUS_RG_HALL_OF_FAME":498,"MUS_RG_HEAL":493,"MUS_RG_INTRO_FIGHT":489,"MUS_RG_JIGGLYPUFF":488,"MUS_RG_LAVENDER":492,"MUS_RG_MT_MOON":500,"MUS_RG_MYSTERY_GIFT":541,"MUS_RG_NET_CENTER":540,"MUS_RG_NEW_GAME_EXIT":537,"MUS_RG_NEW_GAME_INSTRUCT":535,"MUS_RG_NEW_GAME_INTRO":536,"MUS_RG_OAK":514,"MUS_RG_OAK_LAB":513,"MUS_RG_OBTAIN_KEY_ITEM":530,"MUS_RG_PALLET":512,"MUS_RG_PEWTER":526,"MUS_RG_PHOTO":532,"MUS_RG_POKE_CENTER":515,"MUS_RG_POKE_FLUTE":550,"MUS_RG_POKE_JUMP":538,"MUS_RG_POKE_MANSION":501,"MUS_RG_POKE_TOWER":518,"MUS_RG_RIVAL_EXIT":528,"MUS_RG_ROCKET_HIDEOUT":486,"MUS_RG_ROUTE1":503,"MUS_RG_ROUTE11":506,"MUS_RG_ROUTE24":504,"MUS_RG_ROUTE3":505,"MUS_RG_SEVII_123":547,"MUS_RG_SEVII_45":548,"MUS_RG_SEVII_67":549,"MUS_RG_SEVII_CAVE":543,"MUS_RG_SEVII_DUNGEON":546,"MUS_RG_SEVII_ROUTE":545,"MUS_RG_SILPH":519,"MUS_RG_SLOW_PALLET":557,"MUS_RG_SS_ANNE":516,"MUS_RG_SURF":517,"MUS_RG_TEACHY_TV_MENU":558,"MUS_RG_TEACHY_TV_SHOW":544,"MUS_RG_TITLE":490,"MUS_RG_TRAINER_TOWER":556,"MUS_RG_UNION_ROOM":539,"MUS_RG_VERMILLION":525,"MUS_RG_VICTORY_GYM_LEADER":524,"MUS_RG_VICTORY_ROAD":507,"MUS_RG_VICTORY_TRAINER":522,"MUS_RG_VICTORY_WILD":523,"MUS_RG_VIRIDIAN_FOREST":499,"MUS_RG_VS_CHAMPION":511,"MUS_RG_VS_DEOXYS":551,"MUS_RG_VS_GYM_LEADER":508,"MUS_RG_VS_LEGEND":553,"MUS_RG_VS_MEWTWO":552,"MUS_RG_VS_TRAINER":509,"MUS_RG_VS_WILD":510,"MUS_ROULETTE":392,"MUS_ROUTE101":359,"MUS_ROUTE104":401,"MUS_ROUTE110":360,"MUS_ROUTE113":418,"MUS_ROUTE118":32767,"MUS_ROUTE119":402,"MUS_ROUTE120":361,"MUS_ROUTE122":374,"MUS_RUSTBORO":399,"MUS_SAFARI_ZONE":428,"MUS_SAILING":431,"MUS_SCHOOL":435,"MUS_SEALED_CHAMBER":438,"MUS_SLATEPORT":433,"MUS_SLOTS_JACKPOT":389,"MUS_SLOTS_WIN":390,"MUS_SOOTOPOLIS":445,"MUS_SURF":365,"MUS_TITLE":413,"MUS_TOO_BAD":391,"MUS_TRICK_HOUSE":448,"MUS_UNDERWATER":411,"MUS_VERDANTURF":398,"MUS_VICTORY_AQUA_MAGMA":424,"MUS_VICTORY_GYM_LEADER":354,"MUS_VICTORY_LEAGUE":355,"MUS_VICTORY_ROAD":429,"MUS_VICTORY_TRAINER":412,"MUS_VICTORY_WILD":353,"MUS_VS_AQUA_MAGMA":475,"MUS_VS_AQUA_MAGMA_LEADER":483,"MUS_VS_CHAMPION":478,"MUS_VS_ELITE_FOUR":482,"MUS_VS_FRONTIER_BRAIN":471,"MUS_VS_GYM_LEADER":477,"MUS_VS_KYOGRE_GROUDON":480,"MUS_VS_MEW":472,"MUS_VS_RAYQUAZA":470,"MUS_VS_REGI":479,"MUS_VS_RIVAL":481,"MUS_VS_TRAINER":476,"MUS_VS_WILD":474,"MUS_WEATHER_GROUDON":444,"NUM_BADGES":8,"NUM_BERRY_MASTER_BERRIES":10,"NUM_BERRY_MASTER_BERRIES_SKIPPED":20,"NUM_BERRY_MASTER_WIFE_BERRIES":10,"NUM_DAILY_FLAGS":64,"NUM_HIDDEN_MACHINES":8,"NUM_KIRI_BERRIES":10,"NUM_KIRI_BERRIES_SKIPPED":20,"NUM_ROUTE_114_MAN_BERRIES":5,"NUM_ROUTE_114_MAN_BERRIES_SKIPPED":15,"NUM_SPECIAL_FLAGS":128,"NUM_SPECIES":412,"NUM_TECHNICAL_MACHINES":50,"NUM_TEMP_FLAGS":32,"NUM_WATER_STAGES":4,"NUM_WONDER_CARD_FLAGS":20,"OLD_ROD":0,"PH_CHOICE_BLEND":589,"PH_CHOICE_HELD":590,"PH_CHOICE_SOLO":591,"PH_CLOTH_BLEND":565,"PH_CLOTH_HELD":566,"PH_CLOTH_SOLO":567,"PH_CURE_BLEND":604,"PH_CURE_HELD":605,"PH_CURE_SOLO":606,"PH_DRESS_BLEND":568,"PH_DRESS_HELD":569,"PH_DRESS_SOLO":570,"PH_FACE_BLEND":562,"PH_FACE_HELD":563,"PH_FACE_SOLO":564,"PH_FLEECE_BLEND":571,"PH_FLEECE_HELD":572,"PH_FLEECE_SOLO":573,"PH_FOOT_BLEND":595,"PH_FOOT_HELD":596,"PH_FOOT_SOLO":597,"PH_GOAT_BLEND":583,"PH_GOAT_HELD":584,"PH_GOAT_SOLO":585,"PH_GOOSE_BLEND":598,"PH_GOOSE_HELD":599,"PH_GOOSE_SOLO":600,"PH_KIT_BLEND":574,"PH_KIT_HELD":575,"PH_KIT_SOLO":576,"PH_LOT_BLEND":580,"PH_LOT_HELD":581,"PH_LOT_SOLO":582,"PH_MOUTH_BLEND":592,"PH_MOUTH_HELD":593,"PH_MOUTH_SOLO":594,"PH_NURSE_BLEND":607,"PH_NURSE_HELD":608,"PH_NURSE_SOLO":609,"PH_PRICE_BLEND":577,"PH_PRICE_HELD":578,"PH_PRICE_SOLO":579,"PH_STRUT_BLEND":601,"PH_STRUT_HELD":602,"PH_STRUT_SOLO":603,"PH_THOUGHT_BLEND":586,"PH_THOUGHT_HELD":587,"PH_THOUGHT_SOLO":588,"PH_TRAP_BLEND":559,"PH_TRAP_HELD":560,"PH_TRAP_SOLO":561,"SE_A":25,"SE_APPLAUSE":105,"SE_ARENA_TIMEUP1":265,"SE_ARENA_TIMEUP2":266,"SE_BALL":23,"SE_BALLOON_BLUE":75,"SE_BALLOON_RED":74,"SE_BALLOON_YELLOW":76,"SE_BALL_BOUNCE_1":56,"SE_BALL_BOUNCE_2":57,"SE_BALL_BOUNCE_3":58,"SE_BALL_BOUNCE_4":59,"SE_BALL_OPEN":15,"SE_BALL_THROW":61,"SE_BALL_TRADE":60,"SE_BALL_TRAY_BALL":115,"SE_BALL_TRAY_ENTER":114,"SE_BALL_TRAY_EXIT":116,"SE_BANG":20,"SE_BERRY_BLENDER":53,"SE_BIKE_BELL":11,"SE_BIKE_HOP":34,"SE_BOO":22,"SE_BREAKABLE_DOOR":77,"SE_BRIDGE_WALK":71,"SE_CARD":54,"SE_CLICK":36,"SE_CONTEST_CONDITION_LOSE":38,"SE_CONTEST_CURTAIN_FALL":98,"SE_CONTEST_CURTAIN_RISE":97,"SE_CONTEST_HEART":96,"SE_CONTEST_ICON_CHANGE":99,"SE_CONTEST_ICON_CLEAR":100,"SE_CONTEST_MONS_TURN":101,"SE_CONTEST_PLACE":24,"SE_DEX_PAGE":109,"SE_DEX_SCROLL":108,"SE_DEX_SEARCH":112,"SE_DING_DONG":73,"SE_DOOR":8,"SE_DOWNPOUR":83,"SE_DOWNPOUR_STOP":84,"SE_E":28,"SE_EFFECTIVE":13,"SE_EGG_HATCH":113,"SE_ELEVATOR":89,"SE_ESCALATOR":80,"SE_EXIT":9,"SE_EXP":33,"SE_EXP_MAX":91,"SE_FAILURE":32,"SE_FAINT":16,"SE_FALL":43,"SE_FIELD_POISON":79,"SE_FLEE":17,"SE_FU_ZAKU":37,"SE_GLASS_FLUTE":117,"SE_I":26,"SE_ICE_BREAK":41,"SE_ICE_CRACK":42,"SE_ICE_STAIRS":40,"SE_INTRO_BLAST":103,"SE_ITEMFINDER":72,"SE_LAVARIDGE_FALL_WARP":39,"SE_LEDGE":10,"SE_LOW_HEALTH":90,"SE_MUD_BALL":78,"SE_MUGSHOT":104,"SE_M_ABSORB":180,"SE_M_ABSORB_2":179,"SE_M_ACID_ARMOR":218,"SE_M_ATTRACT":226,"SE_M_ATTRACT2":227,"SE_M_BARRIER":208,"SE_M_BATON_PASS":224,"SE_M_BELLY_DRUM":185,"SE_M_BIND":170,"SE_M_BITE":161,"SE_M_BLIZZARD":153,"SE_M_BLIZZARD2":154,"SE_M_BONEMERANG":187,"SE_M_BRICK_BREAK":198,"SE_M_BUBBLE":124,"SE_M_BUBBLE2":125,"SE_M_BUBBLE3":126,"SE_M_BUBBLE_BEAM":182,"SE_M_BUBBLE_BEAM2":183,"SE_M_CHARGE":213,"SE_M_CHARM":212,"SE_M_COMET_PUNCH":139,"SE_M_CONFUSE_RAY":196,"SE_M_COSMIC_POWER":243,"SE_M_CRABHAMMER":142,"SE_M_CUT":128,"SE_M_DETECT":209,"SE_M_DIG":175,"SE_M_DIVE":233,"SE_M_DIZZY_PUNCH":176,"SE_M_DOUBLE_SLAP":134,"SE_M_DOUBLE_TEAM":135,"SE_M_DRAGON_RAGE":171,"SE_M_EARTHQUAKE":234,"SE_M_EMBER":151,"SE_M_ENCORE":222,"SE_M_ENCORE2":223,"SE_M_EXPLOSION":178,"SE_M_FAINT_ATTACK":190,"SE_M_FIRE_PUNCH":147,"SE_M_FLAMETHROWER":146,"SE_M_FLAME_WHEEL":144,"SE_M_FLAME_WHEEL2":145,"SE_M_FLATTER":229,"SE_M_FLY":158,"SE_M_GIGA_DRAIN":199,"SE_M_GRASSWHISTLE":231,"SE_M_GUST":132,"SE_M_GUST2":133,"SE_M_HAIL":242,"SE_M_HARDEN":120,"SE_M_HAZE":246,"SE_M_HEADBUTT":162,"SE_M_HEAL_BELL":195,"SE_M_HEAT_WAVE":240,"SE_M_HORN_ATTACK":166,"SE_M_HYDRO_PUMP":164,"SE_M_HYPER_BEAM":215,"SE_M_HYPER_BEAM2":247,"SE_M_ICY_WIND":137,"SE_M_JUMP_KICK":143,"SE_M_LEER":192,"SE_M_LICK":188,"SE_M_LOCK_ON":210,"SE_M_MEGA_KICK":140,"SE_M_MEGA_KICK2":141,"SE_M_METRONOME":186,"SE_M_MILK_DRINK":225,"SE_M_MINIMIZE":204,"SE_M_MIST":168,"SE_M_MOONLIGHT":211,"SE_M_MORNING_SUN":228,"SE_M_NIGHTMARE":121,"SE_M_PAY_DAY":174,"SE_M_PERISH_SONG":173,"SE_M_PETAL_DANCE":202,"SE_M_POISON_POWDER":169,"SE_M_PSYBEAM":189,"SE_M_PSYBEAM2":200,"SE_M_RAIN_DANCE":127,"SE_M_RAZOR_WIND":136,"SE_M_RAZOR_WIND2":160,"SE_M_REFLECT":207,"SE_M_REVERSAL":217,"SE_M_ROCK_THROW":131,"SE_M_SACRED_FIRE":149,"SE_M_SACRED_FIRE2":150,"SE_M_SANDSTORM":219,"SE_M_SAND_ATTACK":159,"SE_M_SAND_TOMB":230,"SE_M_SCRATCH":155,"SE_M_SCREECH":181,"SE_M_SELF_DESTRUCT":177,"SE_M_SING":172,"SE_M_SKETCH":205,"SE_M_SKY_UPPERCUT":238,"SE_M_SNORE":197,"SE_M_SOLAR_BEAM":201,"SE_M_SPIT_UP":232,"SE_M_STAT_DECREASE":245,"SE_M_STAT_INCREASE":239,"SE_M_STRENGTH":214,"SE_M_STRING_SHOT":129,"SE_M_STRING_SHOT2":130,"SE_M_SUPERSONIC":184,"SE_M_SURF":163,"SE_M_SWAGGER":193,"SE_M_SWAGGER2":194,"SE_M_SWEET_SCENT":236,"SE_M_SWIFT":206,"SE_M_SWORDS_DANCE":191,"SE_M_TAIL_WHIP":167,"SE_M_TAKE_DOWN":152,"SE_M_TEETER_DANCE":244,"SE_M_TELEPORT":203,"SE_M_THUNDERBOLT":118,"SE_M_THUNDERBOLT2":119,"SE_M_THUNDER_WAVE":138,"SE_M_TOXIC":148,"SE_M_TRI_ATTACK":220,"SE_M_TRI_ATTACK2":221,"SE_M_TWISTER":235,"SE_M_UPROAR":241,"SE_M_VICEGRIP":156,"SE_M_VITAL_THROW":122,"SE_M_VITAL_THROW2":123,"SE_M_WATERFALL":216,"SE_M_WHIRLPOOL":165,"SE_M_WING_ATTACK":157,"SE_M_YAWN":237,"SE_N":30,"SE_NOTE_A":67,"SE_NOTE_B":68,"SE_NOTE_C":62,"SE_NOTE_C_HIGH":69,"SE_NOTE_D":63,"SE_NOTE_E":64,"SE_NOTE_F":65,"SE_NOTE_G":66,"SE_NOT_EFFECTIVE":12,"SE_O":29,"SE_ORB":107,"SE_PC_LOGIN":2,"SE_PC_OFF":3,"SE_PC_ON":4,"SE_PIKE_CURTAIN_CLOSE":267,"SE_PIKE_CURTAIN_OPEN":268,"SE_PIN":21,"SE_POKENAV_CALL":263,"SE_POKENAV_HANG_UP":264,"SE_POKENAV_OFF":111,"SE_POKENAV_ON":110,"SE_PUDDLE":70,"SE_RAIN":85,"SE_RAIN_STOP":86,"SE_REPEL":47,"SE_RG_BAG_CURSOR":252,"SE_RG_BAG_POCKET":253,"SE_RG_BALL_CLICK":254,"SE_RG_CARD_FLIP":249,"SE_RG_CARD_FLIPPING":250,"SE_RG_CARD_OPEN":251,"SE_RG_DEOXYS_MOVE":260,"SE_RG_DOOR":248,"SE_RG_HELP_CLOSE":258,"SE_RG_HELP_ERROR":259,"SE_RG_HELP_OPEN":257,"SE_RG_POKE_JUMP_FAILURE":262,"SE_RG_POKE_JUMP_SUCCESS":261,"SE_RG_SHOP":255,"SE_RG_SS_ANNE_HORN":256,"SE_ROTATING_GATE":48,"SE_ROULETTE_BALL":92,"SE_ROULETTE_BALL2":93,"SE_SAVE":55,"SE_SELECT":5,"SE_SHINY":102,"SE_SHIP":19,"SE_SHOP":95,"SE_SLIDING_DOOR":18,"SE_SUCCESS":31,"SE_SUDOWOODO_SHAKE":269,"SE_SUPER_EFFECTIVE":14,"SE_SWITCH":35,"SE_TAILLOW_WING_FLAP":94,"SE_THUNDER":87,"SE_THUNDER2":88,"SE_THUNDERSTORM":81,"SE_THUNDERSTORM_STOP":82,"SE_TRUCK_DOOR":52,"SE_TRUCK_MOVE":49,"SE_TRUCK_STOP":50,"SE_TRUCK_UNLOAD":51,"SE_U":27,"SE_UNLOCK":44,"SE_USE_ITEM":1,"SE_VEND":106,"SE_WALL_HIT":7,"SE_WARP_IN":45,"SE_WARP_OUT":46,"SE_WIN_OPEN":6,"SPECIAL_FLAGS_END":16511,"SPECIAL_FLAGS_START":16384,"SPECIES_ABRA":63,"SPECIES_ABSOL":376,"SPECIES_AERODACTYL":142,"SPECIES_AGGRON":384,"SPECIES_AIPOM":190,"SPECIES_ALAKAZAM":65,"SPECIES_ALTARIA":359,"SPECIES_AMPHAROS":181,"SPECIES_ANORITH":390,"SPECIES_ARBOK":24,"SPECIES_ARCANINE":59,"SPECIES_ARIADOS":168,"SPECIES_ARMALDO":391,"SPECIES_ARON":382,"SPECIES_ARTICUNO":144,"SPECIES_AZUMARILL":184,"SPECIES_AZURILL":350,"SPECIES_BAGON":395,"SPECIES_BALTOY":318,"SPECIES_BANETTE":378,"SPECIES_BARBOACH":323,"SPECIES_BAYLEEF":153,"SPECIES_BEAUTIFLY":292,"SPECIES_BEEDRILL":15,"SPECIES_BELDUM":398,"SPECIES_BELLOSSOM":182,"SPECIES_BELLSPROUT":69,"SPECIES_BLASTOISE":9,"SPECIES_BLAZIKEN":282,"SPECIES_BLISSEY":242,"SPECIES_BRELOOM":307,"SPECIES_BULBASAUR":1,"SPECIES_BUTTERFREE":12,"SPECIES_CACNEA":344,"SPECIES_CACTURNE":345,"SPECIES_CAMERUPT":340,"SPECIES_CARVANHA":330,"SPECIES_CASCOON":293,"SPECIES_CASTFORM":385,"SPECIES_CATERPIE":10,"SPECIES_CELEBI":251,"SPECIES_CHANSEY":113,"SPECIES_CHARIZARD":6,"SPECIES_CHARMANDER":4,"SPECIES_CHARMELEON":5,"SPECIES_CHIKORITA":152,"SPECIES_CHIMECHO":411,"SPECIES_CHINCHOU":170,"SPECIES_CLAMPERL":373,"SPECIES_CLAYDOL":319,"SPECIES_CLEFABLE":36,"SPECIES_CLEFAIRY":35,"SPECIES_CLEFFA":173,"SPECIES_CLOYSTER":91,"SPECIES_COMBUSKEN":281,"SPECIES_CORPHISH":326,"SPECIES_CORSOLA":222,"SPECIES_CRADILY":389,"SPECIES_CRAWDAUNT":327,"SPECIES_CROBAT":169,"SPECIES_CROCONAW":159,"SPECIES_CUBONE":104,"SPECIES_CYNDAQUIL":155,"SPECIES_DELCATTY":316,"SPECIES_DELIBIRD":225,"SPECIES_DEOXYS":410,"SPECIES_DEWGONG":87,"SPECIES_DIGLETT":50,"SPECIES_DITTO":132,"SPECIES_DODRIO":85,"SPECIES_DODUO":84,"SPECIES_DONPHAN":232,"SPECIES_DRAGONAIR":148,"SPECIES_DRAGONITE":149,"SPECIES_DRATINI":147,"SPECIES_DROWZEE":96,"SPECIES_DUGTRIO":51,"SPECIES_DUNSPARCE":206,"SPECIES_DUSCLOPS":362,"SPECIES_DUSKULL":361,"SPECIES_DUSTOX":294,"SPECIES_EEVEE":133,"SPECIES_EGG":412,"SPECIES_EKANS":23,"SPECIES_ELECTABUZZ":125,"SPECIES_ELECTRIKE":337,"SPECIES_ELECTRODE":101,"SPECIES_ELEKID":239,"SPECIES_ENTEI":244,"SPECIES_ESPEON":196,"SPECIES_EXEGGCUTE":102,"SPECIES_EXEGGUTOR":103,"SPECIES_EXPLOUD":372,"SPECIES_FARFETCHD":83,"SPECIES_FEAROW":22,"SPECIES_FEEBAS":328,"SPECIES_FERALIGATR":160,"SPECIES_FLAAFFY":180,"SPECIES_FLAREON":136,"SPECIES_FLYGON":334,"SPECIES_FORRETRESS":205,"SPECIES_FURRET":162,"SPECIES_GARDEVOIR":394,"SPECIES_GASTLY":92,"SPECIES_GENGAR":94,"SPECIES_GEODUDE":74,"SPECIES_GIRAFARIG":203,"SPECIES_GLALIE":347,"SPECIES_GLIGAR":207,"SPECIES_GLOOM":44,"SPECIES_GOLBAT":42,"SPECIES_GOLDEEN":118,"SPECIES_GOLDUCK":55,"SPECIES_GOLEM":76,"SPECIES_GOREBYSS":375,"SPECIES_GRANBULL":210,"SPECIES_GRAVELER":75,"SPECIES_GRIMER":88,"SPECIES_GROUDON":405,"SPECIES_GROVYLE":278,"SPECIES_GROWLITHE":58,"SPECIES_GRUMPIG":352,"SPECIES_GULPIN":367,"SPECIES_GYARADOS":130,"SPECIES_HARIYAMA":336,"SPECIES_HAUNTER":93,"SPECIES_HERACROSS":214,"SPECIES_HITMONCHAN":107,"SPECIES_HITMONLEE":106,"SPECIES_HITMONTOP":237,"SPECIES_HOOTHOOT":163,"SPECIES_HOPPIP":187,"SPECIES_HORSEA":116,"SPECIES_HOUNDOOM":229,"SPECIES_HOUNDOUR":228,"SPECIES_HO_OH":250,"SPECIES_HUNTAIL":374,"SPECIES_HYPNO":97,"SPECIES_IGGLYBUFF":174,"SPECIES_ILLUMISE":387,"SPECIES_IVYSAUR":2,"SPECIES_JIGGLYPUFF":39,"SPECIES_JIRACHI":409,"SPECIES_JOLTEON":135,"SPECIES_JUMPLUFF":189,"SPECIES_JYNX":124,"SPECIES_KABUTO":140,"SPECIES_KABUTOPS":141,"SPECIES_KADABRA":64,"SPECIES_KAKUNA":14,"SPECIES_KANGASKHAN":115,"SPECIES_KECLEON":317,"SPECIES_KINGDRA":230,"SPECIES_KINGLER":99,"SPECIES_KIRLIA":393,"SPECIES_KOFFING":109,"SPECIES_KRABBY":98,"SPECIES_KYOGRE":404,"SPECIES_LAIRON":383,"SPECIES_LANTURN":171,"SPECIES_LAPRAS":131,"SPECIES_LARVITAR":246,"SPECIES_LATIAS":407,"SPECIES_LATIOS":408,"SPECIES_LEDIAN":166,"SPECIES_LEDYBA":165,"SPECIES_LICKITUNG":108,"SPECIES_LILEEP":388,"SPECIES_LINOONE":289,"SPECIES_LOMBRE":296,"SPECIES_LOTAD":295,"SPECIES_LOUDRED":371,"SPECIES_LUDICOLO":297,"SPECIES_LUGIA":249,"SPECIES_LUNATONE":348,"SPECIES_LUVDISC":325,"SPECIES_MACHAMP":68,"SPECIES_MACHOKE":67,"SPECIES_MACHOP":66,"SPECIES_MAGBY":240,"SPECIES_MAGCARGO":219,"SPECIES_MAGIKARP":129,"SPECIES_MAGMAR":126,"SPECIES_MAGNEMITE":81,"SPECIES_MAGNETON":82,"SPECIES_MAKUHITA":335,"SPECIES_MANECTRIC":338,"SPECIES_MANKEY":56,"SPECIES_MANTINE":226,"SPECIES_MAREEP":179,"SPECIES_MARILL":183,"SPECIES_MAROWAK":105,"SPECIES_MARSHTOMP":284,"SPECIES_MASQUERAIN":312,"SPECIES_MAWILE":355,"SPECIES_MEDICHAM":357,"SPECIES_MEDITITE":356,"SPECIES_MEGANIUM":154,"SPECIES_MEOWTH":52,"SPECIES_METAGROSS":400,"SPECIES_METANG":399,"SPECIES_METAPOD":11,"SPECIES_MEW":151,"SPECIES_MEWTWO":150,"SPECIES_MIGHTYENA":287,"SPECIES_MILOTIC":329,"SPECIES_MILTANK":241,"SPECIES_MINUN":354,"SPECIES_MISDREAVUS":200,"SPECIES_MOLTRES":146,"SPECIES_MR_MIME":122,"SPECIES_MUDKIP":283,"SPECIES_MUK":89,"SPECIES_MURKROW":198,"SPECIES_NATU":177,"SPECIES_NIDOKING":34,"SPECIES_NIDOQUEEN":31,"SPECIES_NIDORAN_F":29,"SPECIES_NIDORAN_M":32,"SPECIES_NIDORINA":30,"SPECIES_NIDORINO":33,"SPECIES_NINCADA":301,"SPECIES_NINETALES":38,"SPECIES_NINJASK":302,"SPECIES_NOCTOWL":164,"SPECIES_NONE":0,"SPECIES_NOSEPASS":320,"SPECIES_NUMEL":339,"SPECIES_NUZLEAF":299,"SPECIES_OCTILLERY":224,"SPECIES_ODDISH":43,"SPECIES_OLD_UNOWN_B":252,"SPECIES_OLD_UNOWN_C":253,"SPECIES_OLD_UNOWN_D":254,"SPECIES_OLD_UNOWN_E":255,"SPECIES_OLD_UNOWN_F":256,"SPECIES_OLD_UNOWN_G":257,"SPECIES_OLD_UNOWN_H":258,"SPECIES_OLD_UNOWN_I":259,"SPECIES_OLD_UNOWN_J":260,"SPECIES_OLD_UNOWN_K":261,"SPECIES_OLD_UNOWN_L":262,"SPECIES_OLD_UNOWN_M":263,"SPECIES_OLD_UNOWN_N":264,"SPECIES_OLD_UNOWN_O":265,"SPECIES_OLD_UNOWN_P":266,"SPECIES_OLD_UNOWN_Q":267,"SPECIES_OLD_UNOWN_R":268,"SPECIES_OLD_UNOWN_S":269,"SPECIES_OLD_UNOWN_T":270,"SPECIES_OLD_UNOWN_U":271,"SPECIES_OLD_UNOWN_V":272,"SPECIES_OLD_UNOWN_W":273,"SPECIES_OLD_UNOWN_X":274,"SPECIES_OLD_UNOWN_Y":275,"SPECIES_OLD_UNOWN_Z":276,"SPECIES_OMANYTE":138,"SPECIES_OMASTAR":139,"SPECIES_ONIX":95,"SPECIES_PARAS":46,"SPECIES_PARASECT":47,"SPECIES_PELIPPER":310,"SPECIES_PERSIAN":53,"SPECIES_PHANPY":231,"SPECIES_PICHU":172,"SPECIES_PIDGEOT":18,"SPECIES_PIDGEOTTO":17,"SPECIES_PIDGEY":16,"SPECIES_PIKACHU":25,"SPECIES_PILOSWINE":221,"SPECIES_PINECO":204,"SPECIES_PINSIR":127,"SPECIES_PLUSLE":353,"SPECIES_POLITOED":186,"SPECIES_POLIWAG":60,"SPECIES_POLIWHIRL":61,"SPECIES_POLIWRATH":62,"SPECIES_PONYTA":77,"SPECIES_POOCHYENA":286,"SPECIES_PORYGON":137,"SPECIES_PORYGON2":233,"SPECIES_PRIMEAPE":57,"SPECIES_PSYDUCK":54,"SPECIES_PUPITAR":247,"SPECIES_QUAGSIRE":195,"SPECIES_QUILAVA":156,"SPECIES_QWILFISH":211,"SPECIES_RAICHU":26,"SPECIES_RAIKOU":243,"SPECIES_RALTS":392,"SPECIES_RAPIDASH":78,"SPECIES_RATICATE":20,"SPECIES_RATTATA":19,"SPECIES_RAYQUAZA":406,"SPECIES_REGICE":402,"SPECIES_REGIROCK":401,"SPECIES_REGISTEEL":403,"SPECIES_RELICANTH":381,"SPECIES_REMORAID":223,"SPECIES_RHYDON":112,"SPECIES_RHYHORN":111,"SPECIES_ROSELIA":363,"SPECIES_SABLEYE":322,"SPECIES_SALAMENCE":397,"SPECIES_SANDSHREW":27,"SPECIES_SANDSLASH":28,"SPECIES_SCEPTILE":279,"SPECIES_SCIZOR":212,"SPECIES_SCYTHER":123,"SPECIES_SEADRA":117,"SPECIES_SEAKING":119,"SPECIES_SEALEO":342,"SPECIES_SEEDOT":298,"SPECIES_SEEL":86,"SPECIES_SENTRET":161,"SPECIES_SEVIPER":379,"SPECIES_SHARPEDO":331,"SPECIES_SHEDINJA":303,"SPECIES_SHELGON":396,"SPECIES_SHELLDER":90,"SPECIES_SHIFTRY":300,"SPECIES_SHROOMISH":306,"SPECIES_SHUCKLE":213,"SPECIES_SHUPPET":377,"SPECIES_SILCOON":291,"SPECIES_SKARMORY":227,"SPECIES_SKIPLOOM":188,"SPECIES_SKITTY":315,"SPECIES_SLAKING":366,"SPECIES_SLAKOTH":364,"SPECIES_SLOWBRO":80,"SPECIES_SLOWKING":199,"SPECIES_SLOWPOKE":79,"SPECIES_SLUGMA":218,"SPECIES_SMEARGLE":235,"SPECIES_SMOOCHUM":238,"SPECIES_SNEASEL":215,"SPECIES_SNORLAX":143,"SPECIES_SNORUNT":346,"SPECIES_SNUBBULL":209,"SPECIES_SOLROCK":349,"SPECIES_SPEAROW":21,"SPECIES_SPHEAL":341,"SPECIES_SPINARAK":167,"SPECIES_SPINDA":308,"SPECIES_SPOINK":351,"SPECIES_SQUIRTLE":7,"SPECIES_STANTLER":234,"SPECIES_STARMIE":121,"SPECIES_STARYU":120,"SPECIES_STEELIX":208,"SPECIES_SUDOWOODO":185,"SPECIES_SUICUNE":245,"SPECIES_SUNFLORA":192,"SPECIES_SUNKERN":191,"SPECIES_SURSKIT":311,"SPECIES_SWABLU":358,"SPECIES_SWALOT":368,"SPECIES_SWAMPERT":285,"SPECIES_SWELLOW":305,"SPECIES_SWINUB":220,"SPECIES_TAILLOW":304,"SPECIES_TANGELA":114,"SPECIES_TAUROS":128,"SPECIES_TEDDIURSA":216,"SPECIES_TENTACOOL":72,"SPECIES_TENTACRUEL":73,"SPECIES_TOGEPI":175,"SPECIES_TOGETIC":176,"SPECIES_TORCHIC":280,"SPECIES_TORKOAL":321,"SPECIES_TOTODILE":158,"SPECIES_TRAPINCH":332,"SPECIES_TREECKO":277,"SPECIES_TROPIUS":369,"SPECIES_TYPHLOSION":157,"SPECIES_TYRANITAR":248,"SPECIES_TYROGUE":236,"SPECIES_UMBREON":197,"SPECIES_UNOWN":201,"SPECIES_UNOWN_B":413,"SPECIES_UNOWN_C":414,"SPECIES_UNOWN_D":415,"SPECIES_UNOWN_E":416,"SPECIES_UNOWN_EMARK":438,"SPECIES_UNOWN_F":417,"SPECIES_UNOWN_G":418,"SPECIES_UNOWN_H":419,"SPECIES_UNOWN_I":420,"SPECIES_UNOWN_J":421,"SPECIES_UNOWN_K":422,"SPECIES_UNOWN_L":423,"SPECIES_UNOWN_M":424,"SPECIES_UNOWN_N":425,"SPECIES_UNOWN_O":426,"SPECIES_UNOWN_P":427,"SPECIES_UNOWN_Q":428,"SPECIES_UNOWN_QMARK":439,"SPECIES_UNOWN_R":429,"SPECIES_UNOWN_S":430,"SPECIES_UNOWN_T":431,"SPECIES_UNOWN_U":432,"SPECIES_UNOWN_V":433,"SPECIES_UNOWN_W":434,"SPECIES_UNOWN_X":435,"SPECIES_UNOWN_Y":436,"SPECIES_UNOWN_Z":437,"SPECIES_URSARING":217,"SPECIES_VAPOREON":134,"SPECIES_VENOMOTH":49,"SPECIES_VENONAT":48,"SPECIES_VENUSAUR":3,"SPECIES_VIBRAVA":333,"SPECIES_VICTREEBEL":71,"SPECIES_VIGOROTH":365,"SPECIES_VILEPLUME":45,"SPECIES_VOLBEAT":386,"SPECIES_VOLTORB":100,"SPECIES_VULPIX":37,"SPECIES_WAILMER":313,"SPECIES_WAILORD":314,"SPECIES_WALREIN":343,"SPECIES_WARTORTLE":8,"SPECIES_WEEDLE":13,"SPECIES_WEEPINBELL":70,"SPECIES_WEEZING":110,"SPECIES_WHISCASH":324,"SPECIES_WHISMUR":370,"SPECIES_WIGGLYTUFF":40,"SPECIES_WINGULL":309,"SPECIES_WOBBUFFET":202,"SPECIES_WOOPER":194,"SPECIES_WURMPLE":290,"SPECIES_WYNAUT":360,"SPECIES_XATU":178,"SPECIES_YANMA":193,"SPECIES_ZANGOOSE":380,"SPECIES_ZAPDOS":145,"SPECIES_ZIGZAGOON":288,"SPECIES_ZUBAT":41,"SUPER_ROD":2,"SYSTEM_FLAGS":2144,"TEMP_FLAGS_END":31,"TEMP_FLAGS_START":0,"TRAINERS_COUNT":855,"TRAINER_AARON":397,"TRAINER_ABIGAIL_1":358,"TRAINER_ABIGAIL_2":360,"TRAINER_ABIGAIL_3":361,"TRAINER_ABIGAIL_4":362,"TRAINER_ABIGAIL_5":363,"TRAINER_AIDAN":674,"TRAINER_AISHA":757,"TRAINER_ALAN":630,"TRAINER_ALBERT":80,"TRAINER_ALBERTO":12,"TRAINER_ALEX":413,"TRAINER_ALEXA":670,"TRAINER_ALEXIA":90,"TRAINER_ALEXIS":248,"TRAINER_ALICE":448,"TRAINER_ALIX":750,"TRAINER_ALLEN":333,"TRAINER_ALLISON":387,"TRAINER_ALVARO":849,"TRAINER_ALYSSA":701,"TRAINER_AMY_AND_LIV_1":481,"TRAINER_AMY_AND_LIV_2":482,"TRAINER_AMY_AND_LIV_3":485,"TRAINER_AMY_AND_LIV_4":487,"TRAINER_AMY_AND_LIV_5":488,"TRAINER_AMY_AND_LIV_6":489,"TRAINER_ANABEL":805,"TRAINER_ANDREA":613,"TRAINER_ANDRES_1":737,"TRAINER_ANDRES_2":812,"TRAINER_ANDRES_3":813,"TRAINER_ANDRES_4":814,"TRAINER_ANDRES_5":815,"TRAINER_ANDREW":336,"TRAINER_ANGELICA":436,"TRAINER_ANGELINA":712,"TRAINER_ANGELO":802,"TRAINER_ANNA_AND_MEG_1":287,"TRAINER_ANNA_AND_MEG_2":288,"TRAINER_ANNA_AND_MEG_3":289,"TRAINER_ANNA_AND_MEG_4":290,"TRAINER_ANNA_AND_MEG_5":291,"TRAINER_ANNIKA":502,"TRAINER_ANTHONY":352,"TRAINER_ARCHIE":34,"TRAINER_ASHLEY":655,"TRAINER_ATHENA":577,"TRAINER_ATSUSHI":190,"TRAINER_AURON":506,"TRAINER_AUSTINA":58,"TRAINER_AUTUMN":217,"TRAINER_AXLE":203,"TRAINER_BARNY":343,"TRAINER_BARRY":163,"TRAINER_BEAU":212,"TRAINER_BECK":414,"TRAINER_BECKY":470,"TRAINER_BEN":323,"TRAINER_BENJAMIN_1":353,"TRAINER_BENJAMIN_2":354,"TRAINER_BENJAMIN_3":355,"TRAINER_BENJAMIN_4":356,"TRAINER_BENJAMIN_5":357,"TRAINER_BENNY":407,"TRAINER_BERKE":74,"TRAINER_BERNIE_1":206,"TRAINER_BERNIE_2":207,"TRAINER_BERNIE_3":208,"TRAINER_BERNIE_4":209,"TRAINER_BERNIE_5":210,"TRAINER_BETH":445,"TRAINER_BETHANY":301,"TRAINER_BEVERLY":441,"TRAINER_BIANCA":706,"TRAINER_BILLY":319,"TRAINER_BLAKE":235,"TRAINER_BRANDEN":745,"TRAINER_BRANDI":756,"TRAINER_BRANDON":811,"TRAINER_BRAWLY_1":266,"TRAINER_BRAWLY_2":774,"TRAINER_BRAWLY_3":775,"TRAINER_BRAWLY_4":776,"TRAINER_BRAWLY_5":777,"TRAINER_BRAXTON":75,"TRAINER_BRENDA":454,"TRAINER_BRENDAN_LILYCOVE_MUDKIP":661,"TRAINER_BRENDAN_LILYCOVE_TORCHIC":663,"TRAINER_BRENDAN_LILYCOVE_TREECKO":662,"TRAINER_BRENDAN_PLACEHOLDER":853,"TRAINER_BRENDAN_ROUTE_103_MUDKIP":520,"TRAINER_BRENDAN_ROUTE_103_TORCHIC":526,"TRAINER_BRENDAN_ROUTE_103_TREECKO":523,"TRAINER_BRENDAN_ROUTE_110_MUDKIP":521,"TRAINER_BRENDAN_ROUTE_110_TORCHIC":527,"TRAINER_BRENDAN_ROUTE_110_TREECKO":524,"TRAINER_BRENDAN_ROUTE_119_MUDKIP":522,"TRAINER_BRENDAN_ROUTE_119_TORCHIC":528,"TRAINER_BRENDAN_ROUTE_119_TREECKO":525,"TRAINER_BRENDAN_RUSTBORO_MUDKIP":593,"TRAINER_BRENDAN_RUSTBORO_TORCHIC":599,"TRAINER_BRENDAN_RUSTBORO_TREECKO":592,"TRAINER_BRENDEN":572,"TRAINER_BRENT":223,"TRAINER_BRIANNA":118,"TRAINER_BRICE":626,"TRAINER_BRIDGET":129,"TRAINER_BROOKE_1":94,"TRAINER_BROOKE_2":101,"TRAINER_BROOKE_3":102,"TRAINER_BROOKE_4":103,"TRAINER_BROOKE_5":104,"TRAINER_BRYAN":744,"TRAINER_BRYANT":746,"TRAINER_CALE":764,"TRAINER_CALLIE":763,"TRAINER_CALVIN_1":318,"TRAINER_CALVIN_2":328,"TRAINER_CALVIN_3":329,"TRAINER_CALVIN_4":330,"TRAINER_CALVIN_5":331,"TRAINER_CAMDEN":374,"TRAINER_CAMERON_1":238,"TRAINER_CAMERON_2":239,"TRAINER_CAMERON_3":240,"TRAINER_CAMERON_4":241,"TRAINER_CAMERON_5":242,"TRAINER_CAMRON":739,"TRAINER_CARLEE":464,"TRAINER_CAROL":471,"TRAINER_CAROLINA":741,"TRAINER_CAROLINE":99,"TRAINER_CARTER":345,"TRAINER_CATHERINE_1":559,"TRAINER_CATHERINE_2":562,"TRAINER_CATHERINE_3":563,"TRAINER_CATHERINE_4":564,"TRAINER_CATHERINE_5":565,"TRAINER_CEDRIC":475,"TRAINER_CELIA":743,"TRAINER_CELINA":705,"TRAINER_CHAD":174,"TRAINER_CHANDLER":698,"TRAINER_CHARLIE":66,"TRAINER_CHARLOTTE":714,"TRAINER_CHASE":378,"TRAINER_CHESTER":408,"TRAINER_CHIP":45,"TRAINER_CHRIS":693,"TRAINER_CINDY_1":114,"TRAINER_CINDY_2":117,"TRAINER_CINDY_3":120,"TRAINER_CINDY_4":121,"TRAINER_CINDY_5":122,"TRAINER_CINDY_6":123,"TRAINER_CLARENCE":580,"TRAINER_CLARISSA":435,"TRAINER_CLARK":631,"TRAINER_CLAUDE":338,"TRAINER_CLIFFORD":584,"TRAINER_COBY":709,"TRAINER_COLE":201,"TRAINER_COLIN":405,"TRAINER_COLTON":294,"TRAINER_CONNIE":128,"TRAINER_CONOR":511,"TRAINER_CORA":428,"TRAINER_CORY_1":740,"TRAINER_CORY_2":816,"TRAINER_CORY_3":817,"TRAINER_CORY_4":818,"TRAINER_CORY_5":819,"TRAINER_CRISSY":614,"TRAINER_CRISTIAN":574,"TRAINER_CRISTIN_1":767,"TRAINER_CRISTIN_2":828,"TRAINER_CRISTIN_3":829,"TRAINER_CRISTIN_4":830,"TRAINER_CRISTIN_5":831,"TRAINER_CYNDY_1":427,"TRAINER_CYNDY_2":430,"TRAINER_CYNDY_3":431,"TRAINER_CYNDY_4":432,"TRAINER_CYNDY_5":433,"TRAINER_DAISUKE":189,"TRAINER_DAISY":36,"TRAINER_DALE":341,"TRAINER_DALTON_1":196,"TRAINER_DALTON_2":197,"TRAINER_DALTON_3":198,"TRAINER_DALTON_4":199,"TRAINER_DALTON_5":200,"TRAINER_DANA":458,"TRAINER_DANIELLE":650,"TRAINER_DAPHNE":115,"TRAINER_DARCY":733,"TRAINER_DARIAN":696,"TRAINER_DARIUS":803,"TRAINER_DARRIN":154,"TRAINER_DAVID":158,"TRAINER_DAVIS":539,"TRAINER_DAWSON":694,"TRAINER_DAYTON":760,"TRAINER_DEAN":164,"TRAINER_DEANDRE":715,"TRAINER_DEBRA":460,"TRAINER_DECLAN":15,"TRAINER_DEMETRIUS":375,"TRAINER_DENISE":444,"TRAINER_DEREK":227,"TRAINER_DEVAN":753,"TRAINER_DEZ_AND_LUKE":640,"TRAINER_DIANA_1":474,"TRAINER_DIANA_2":477,"TRAINER_DIANA_3":478,"TRAINER_DIANA_4":479,"TRAINER_DIANA_5":480,"TRAINER_DIANNE":417,"TRAINER_DILLON":327,"TRAINER_DOMINIK":152,"TRAINER_DONALD":224,"TRAINER_DONNY":384,"TRAINER_DOUG":618,"TRAINER_DOUGLAS":153,"TRAINER_DRAKE":264,"TRAINER_DREW":211,"TRAINER_DUDLEY":173,"TRAINER_DUNCAN":496,"TRAINER_DUSTY_1":44,"TRAINER_DUSTY_2":47,"TRAINER_DUSTY_3":48,"TRAINER_DUSTY_4":49,"TRAINER_DUSTY_5":50,"TRAINER_DWAYNE":493,"TRAINER_DYLAN_1":364,"TRAINER_DYLAN_2":365,"TRAINER_DYLAN_3":366,"TRAINER_DYLAN_4":367,"TRAINER_DYLAN_5":368,"TRAINER_ED":13,"TRAINER_EDDIE":332,"TRAINER_EDGAR":79,"TRAINER_EDMOND":491,"TRAINER_EDWARD":232,"TRAINER_EDWARDO":404,"TRAINER_EDWIN_1":512,"TRAINER_EDWIN_2":515,"TRAINER_EDWIN_3":516,"TRAINER_EDWIN_4":517,"TRAINER_EDWIN_5":518,"TRAINER_ELI":501,"TRAINER_ELIJAH":742,"TRAINER_ELLIOT_1":339,"TRAINER_ELLIOT_2":346,"TRAINER_ELLIOT_3":347,"TRAINER_ELLIOT_4":348,"TRAINER_ELLIOT_5":349,"TRAINER_ERIC":632,"TRAINER_ERNEST_1":492,"TRAINER_ERNEST_2":497,"TRAINER_ERNEST_3":498,"TRAINER_ERNEST_4":499,"TRAINER_ERNEST_5":500,"TRAINER_ETHAN_1":216,"TRAINER_ETHAN_2":219,"TRAINER_ETHAN_3":220,"TRAINER_ETHAN_4":221,"TRAINER_ETHAN_5":222,"TRAINER_EVERETT":850,"TRAINER_FABIAN":759,"TRAINER_FELIX":38,"TRAINER_FERNANDO_1":195,"TRAINER_FERNANDO_2":832,"TRAINER_FERNANDO_3":833,"TRAINER_FERNANDO_4":834,"TRAINER_FERNANDO_5":835,"TRAINER_FLAGS_END":2143,"TRAINER_FLAGS_START":1280,"TRAINER_FLANNERY_1":268,"TRAINER_FLANNERY_2":782,"TRAINER_FLANNERY_3":783,"TRAINER_FLANNERY_4":784,"TRAINER_FLANNERY_5":785,"TRAINER_FLINT":654,"TRAINER_FOSTER":46,"TRAINER_FRANKLIN":170,"TRAINER_FREDRICK":29,"TRAINER_GABBY_AND_TY_1":51,"TRAINER_GABBY_AND_TY_2":52,"TRAINER_GABBY_AND_TY_3":53,"TRAINER_GABBY_AND_TY_4":54,"TRAINER_GABBY_AND_TY_5":55,"TRAINER_GABBY_AND_TY_6":56,"TRAINER_GABRIELLE_1":9,"TRAINER_GABRIELLE_2":840,"TRAINER_GABRIELLE_3":841,"TRAINER_GABRIELLE_4":842,"TRAINER_GABRIELLE_5":843,"TRAINER_GARRET":138,"TRAINER_GARRISON":547,"TRAINER_GEORGE":73,"TRAINER_GEORGIA":281,"TRAINER_GERALD":648,"TRAINER_GILBERT":169,"TRAINER_GINA_AND_MIA_1":483,"TRAINER_GINA_AND_MIA_2":486,"TRAINER_GLACIA":263,"TRAINER_GRACE":450,"TRAINER_GREG":619,"TRAINER_GRETA":808,"TRAINER_GRUNT_AQUA_HIDEOUT_1":2,"TRAINER_GRUNT_AQUA_HIDEOUT_2":3,"TRAINER_GRUNT_AQUA_HIDEOUT_3":4,"TRAINER_GRUNT_AQUA_HIDEOUT_4":5,"TRAINER_GRUNT_AQUA_HIDEOUT_5":27,"TRAINER_GRUNT_AQUA_HIDEOUT_6":28,"TRAINER_GRUNT_AQUA_HIDEOUT_7":192,"TRAINER_GRUNT_AQUA_HIDEOUT_8":193,"TRAINER_GRUNT_JAGGED_PASS":570,"TRAINER_GRUNT_MAGMA_HIDEOUT_1":716,"TRAINER_GRUNT_MAGMA_HIDEOUT_10":725,"TRAINER_GRUNT_MAGMA_HIDEOUT_11":726,"TRAINER_GRUNT_MAGMA_HIDEOUT_12":727,"TRAINER_GRUNT_MAGMA_HIDEOUT_13":728,"TRAINER_GRUNT_MAGMA_HIDEOUT_14":729,"TRAINER_GRUNT_MAGMA_HIDEOUT_15":730,"TRAINER_GRUNT_MAGMA_HIDEOUT_16":731,"TRAINER_GRUNT_MAGMA_HIDEOUT_2":717,"TRAINER_GRUNT_MAGMA_HIDEOUT_3":718,"TRAINER_GRUNT_MAGMA_HIDEOUT_4":719,"TRAINER_GRUNT_MAGMA_HIDEOUT_5":720,"TRAINER_GRUNT_MAGMA_HIDEOUT_6":721,"TRAINER_GRUNT_MAGMA_HIDEOUT_7":722,"TRAINER_GRUNT_MAGMA_HIDEOUT_8":723,"TRAINER_GRUNT_MAGMA_HIDEOUT_9":724,"TRAINER_GRUNT_MT_CHIMNEY_1":146,"TRAINER_GRUNT_MT_CHIMNEY_2":579,"TRAINER_GRUNT_MT_PYRE_1":23,"TRAINER_GRUNT_MT_PYRE_2":24,"TRAINER_GRUNT_MT_PYRE_3":25,"TRAINER_GRUNT_MT_PYRE_4":569,"TRAINER_GRUNT_MUSEUM_1":20,"TRAINER_GRUNT_MUSEUM_2":21,"TRAINER_GRUNT_PETALBURG_WOODS":10,"TRAINER_GRUNT_RUSTURF_TUNNEL":16,"TRAINER_GRUNT_SEAFLOOR_CAVERN_1":6,"TRAINER_GRUNT_SEAFLOOR_CAVERN_2":7,"TRAINER_GRUNT_SEAFLOOR_CAVERN_3":8,"TRAINER_GRUNT_SEAFLOOR_CAVERN_4":14,"TRAINER_GRUNT_SEAFLOOR_CAVERN_5":567,"TRAINER_GRUNT_SPACE_CENTER_1":22,"TRAINER_GRUNT_SPACE_CENTER_2":116,"TRAINER_GRUNT_SPACE_CENTER_3":586,"TRAINER_GRUNT_SPACE_CENTER_4":587,"TRAINER_GRUNT_SPACE_CENTER_5":588,"TRAINER_GRUNT_SPACE_CENTER_6":589,"TRAINER_GRUNT_SPACE_CENTER_7":590,"TRAINER_GRUNT_UNUSED":568,"TRAINER_GRUNT_WEATHER_INST_1":17,"TRAINER_GRUNT_WEATHER_INST_2":18,"TRAINER_GRUNT_WEATHER_INST_3":19,"TRAINER_GRUNT_WEATHER_INST_4":26,"TRAINER_GRUNT_WEATHER_INST_5":596,"TRAINER_GWEN":59,"TRAINER_HAILEY":697,"TRAINER_HALEY_1":604,"TRAINER_HALEY_2":607,"TRAINER_HALEY_3":608,"TRAINER_HALEY_4":609,"TRAINER_HALEY_5":610,"TRAINER_HALLE":546,"TRAINER_HANNAH":244,"TRAINER_HARRISON":578,"TRAINER_HAYDEN":707,"TRAINER_HECTOR":513,"TRAINER_HEIDI":469,"TRAINER_HELENE":751,"TRAINER_HENRY":668,"TRAINER_HERMAN":167,"TRAINER_HIDEO":651,"TRAINER_HITOSHI":180,"TRAINER_HOPE":96,"TRAINER_HUDSON":510,"TRAINER_HUEY":490,"TRAINER_HUGH":399,"TRAINER_HUMBERTO":402,"TRAINER_IMANI":442,"TRAINER_IRENE":476,"TRAINER_ISAAC_1":538,"TRAINER_ISAAC_2":541,"TRAINER_ISAAC_3":542,"TRAINER_ISAAC_4":543,"TRAINER_ISAAC_5":544,"TRAINER_ISABELLA":595,"TRAINER_ISABELLE":736,"TRAINER_ISABEL_1":302,"TRAINER_ISABEL_2":303,"TRAINER_ISABEL_3":304,"TRAINER_ISABEL_4":305,"TRAINER_ISABEL_5":306,"TRAINER_ISAIAH_1":376,"TRAINER_ISAIAH_2":379,"TRAINER_ISAIAH_3":380,"TRAINER_ISAIAH_4":381,"TRAINER_ISAIAH_5":382,"TRAINER_ISOBEL":383,"TRAINER_IVAN":337,"TRAINER_JACE":204,"TRAINER_JACK":172,"TRAINER_JACKI_1":249,"TRAINER_JACKI_2":250,"TRAINER_JACKI_3":251,"TRAINER_JACKI_4":252,"TRAINER_JACKI_5":253,"TRAINER_JACKSON_1":552,"TRAINER_JACKSON_2":555,"TRAINER_JACKSON_3":556,"TRAINER_JACKSON_4":557,"TRAINER_JACKSON_5":558,"TRAINER_JACLYN":243,"TRAINER_JACOB":351,"TRAINER_JAIDEN":749,"TRAINER_JAMES_1":621,"TRAINER_JAMES_2":622,"TRAINER_JAMES_3":623,"TRAINER_JAMES_4":624,"TRAINER_JAMES_5":625,"TRAINER_JANI":418,"TRAINER_JANICE":605,"TRAINER_JARED":401,"TRAINER_JASMINE":359,"TRAINER_JAYLEN":326,"TRAINER_JAZMYN":503,"TRAINER_JEFF":202,"TRAINER_JEFFREY_1":226,"TRAINER_JEFFREY_2":228,"TRAINER_JEFFREY_3":229,"TRAINER_JEFFREY_4":230,"TRAINER_JEFFREY_5":231,"TRAINER_JENNA":560,"TRAINER_JENNIFER":95,"TRAINER_JENNY_1":449,"TRAINER_JENNY_2":465,"TRAINER_JENNY_3":466,"TRAINER_JENNY_4":467,"TRAINER_JENNY_5":468,"TRAINER_JEROME":156,"TRAINER_JERRY_1":273,"TRAINER_JERRY_2":276,"TRAINER_JERRY_3":277,"TRAINER_JERRY_4":278,"TRAINER_JERRY_5":279,"TRAINER_JESSICA_1":127,"TRAINER_JESSICA_2":132,"TRAINER_JESSICA_3":133,"TRAINER_JESSICA_4":134,"TRAINER_JESSICA_5":135,"TRAINER_JOCELYN":425,"TRAINER_JODY":91,"TRAINER_JOEY":322,"TRAINER_JOHANNA":647,"TRAINER_JOHNSON":754,"TRAINER_JOHN_AND_JAY_1":681,"TRAINER_JOHN_AND_JAY_2":682,"TRAINER_JOHN_AND_JAY_3":683,"TRAINER_JOHN_AND_JAY_4":684,"TRAINER_JOHN_AND_JAY_5":685,"TRAINER_JONAH":667,"TRAINER_JONAS":504,"TRAINER_JONATHAN":598,"TRAINER_JOSE":617,"TRAINER_JOSEPH":700,"TRAINER_JOSH":320,"TRAINER_JOSHUA":237,"TRAINER_JOSUE":738,"TRAINER_JUAN_1":272,"TRAINER_JUAN_2":798,"TRAINER_JUAN_3":799,"TRAINER_JUAN_4":800,"TRAINER_JUAN_5":801,"TRAINER_JULIE":100,"TRAINER_JULIO":566,"TRAINER_JUSTIN":215,"TRAINER_KAI":713,"TRAINER_KALEB":699,"TRAINER_KARA":457,"TRAINER_KAREN_1":280,"TRAINER_KAREN_2":282,"TRAINER_KAREN_3":283,"TRAINER_KAREN_4":284,"TRAINER_KAREN_5":285,"TRAINER_KATELYNN":325,"TRAINER_KATELYN_1":386,"TRAINER_KATELYN_2":388,"TRAINER_KATELYN_3":389,"TRAINER_KATELYN_4":390,"TRAINER_KATELYN_5":391,"TRAINER_KATE_AND_JOY":286,"TRAINER_KATHLEEN":583,"TRAINER_KATIE":455,"TRAINER_KAYLA":247,"TRAINER_KAYLEE":462,"TRAINER_KAYLEY":505,"TRAINER_KEEGAN":205,"TRAINER_KEIGO":652,"TRAINER_KEIRA":93,"TRAINER_KELVIN":507,"TRAINER_KENT":620,"TRAINER_KEVIN":171,"TRAINER_KIM_AND_IRIS":678,"TRAINER_KINDRA":106,"TRAINER_KIRA_AND_DAN_1":642,"TRAINER_KIRA_AND_DAN_2":643,"TRAINER_KIRA_AND_DAN_3":644,"TRAINER_KIRA_AND_DAN_4":645,"TRAINER_KIRA_AND_DAN_5":646,"TRAINER_KIRK":191,"TRAINER_KIYO":181,"TRAINER_KOICHI":182,"TRAINER_KOJI_1":672,"TRAINER_KOJI_2":824,"TRAINER_KOJI_3":825,"TRAINER_KOJI_4":826,"TRAINER_KOJI_5":827,"TRAINER_KYLA":443,"TRAINER_KYRA":748,"TRAINER_LAO_1":419,"TRAINER_LAO_2":421,"TRAINER_LAO_3":422,"TRAINER_LAO_4":423,"TRAINER_LAO_5":424,"TRAINER_LARRY":213,"TRAINER_LAURA":426,"TRAINER_LAUREL":463,"TRAINER_LAWRENCE":710,"TRAINER_LEAF":852,"TRAINER_LEAH":35,"TRAINER_LEA_AND_JED":641,"TRAINER_LENNY":628,"TRAINER_LEONARD":495,"TRAINER_LEONARDO":576,"TRAINER_LEONEL":762,"TRAINER_LEROY":77,"TRAINER_LILA_AND_ROY_1":687,"TRAINER_LILA_AND_ROY_2":688,"TRAINER_LILA_AND_ROY_3":689,"TRAINER_LILA_AND_ROY_4":690,"TRAINER_LILA_AND_ROY_5":691,"TRAINER_LILITH":573,"TRAINER_LINDA":461,"TRAINER_LISA_AND_RAY":692,"TRAINER_LOLA_1":57,"TRAINER_LOLA_2":60,"TRAINER_LOLA_3":61,"TRAINER_LOLA_4":62,"TRAINER_LOLA_5":63,"TRAINER_LORENZO":553,"TRAINER_LUCAS_1":629,"TRAINER_LUCAS_2":633,"TRAINER_LUCY":810,"TRAINER_LUIS":151,"TRAINER_LUNG":420,"TRAINER_LYDIA_1":545,"TRAINER_LYDIA_2":548,"TRAINER_LYDIA_3":549,"TRAINER_LYDIA_4":550,"TRAINER_LYDIA_5":551,"TRAINER_LYLE":616,"TRAINER_MACEY":591,"TRAINER_MADELINE_1":434,"TRAINER_MADELINE_2":437,"TRAINER_MADELINE_3":438,"TRAINER_MADELINE_4":439,"TRAINER_MADELINE_5":440,"TRAINER_MAKAYLA":758,"TRAINER_MARC":571,"TRAINER_MARCEL":11,"TRAINER_MARCOS":702,"TRAINER_MARIA_1":369,"TRAINER_MARIA_2":370,"TRAINER_MARIA_3":371,"TRAINER_MARIA_4":372,"TRAINER_MARIA_5":373,"TRAINER_MARIELA":848,"TRAINER_MARK":145,"TRAINER_MARLENE":752,"TRAINER_MARLEY":508,"TRAINER_MARTHA":473,"TRAINER_MARY":89,"TRAINER_MATT":30,"TRAINER_MATTHEW":157,"TRAINER_MAURA":246,"TRAINER_MAXIE_MAGMA_HIDEOUT":601,"TRAINER_MAXIE_MOSSDEEP":734,"TRAINER_MAXIE_MT_CHIMNEY":602,"TRAINER_MAY_LILYCOVE_MUDKIP":664,"TRAINER_MAY_LILYCOVE_TORCHIC":666,"TRAINER_MAY_LILYCOVE_TREECKO":665,"TRAINER_MAY_PLACEHOLDER":854,"TRAINER_MAY_ROUTE_103_MUDKIP":529,"TRAINER_MAY_ROUTE_103_TORCHIC":535,"TRAINER_MAY_ROUTE_103_TREECKO":532,"TRAINER_MAY_ROUTE_110_MUDKIP":530,"TRAINER_MAY_ROUTE_110_TORCHIC":536,"TRAINER_MAY_ROUTE_110_TREECKO":533,"TRAINER_MAY_ROUTE_119_MUDKIP":531,"TRAINER_MAY_ROUTE_119_TORCHIC":537,"TRAINER_MAY_ROUTE_119_TREECKO":534,"TRAINER_MAY_RUSTBORO_MUDKIP":600,"TRAINER_MAY_RUSTBORO_TORCHIC":769,"TRAINER_MAY_RUSTBORO_TREECKO":768,"TRAINER_MELINA":755,"TRAINER_MELISSA":124,"TRAINER_MEL_AND_PAUL":680,"TRAINER_MICAH":255,"TRAINER_MICHELLE":98,"TRAINER_MIGUEL_1":293,"TRAINER_MIGUEL_2":295,"TRAINER_MIGUEL_3":296,"TRAINER_MIGUEL_4":297,"TRAINER_MIGUEL_5":298,"TRAINER_MIKE_1":634,"TRAINER_MIKE_2":635,"TRAINER_MISSY":447,"TRAINER_MITCHELL":540,"TRAINER_MIU_AND_YUKI":484,"TRAINER_MOLLIE":137,"TRAINER_MYLES":765,"TRAINER_NANCY":472,"TRAINER_NAOMI":119,"TRAINER_NATE":582,"TRAINER_NED":340,"TRAINER_NICHOLAS":585,"TRAINER_NICOLAS_1":392,"TRAINER_NICOLAS_2":393,"TRAINER_NICOLAS_3":394,"TRAINER_NICOLAS_4":395,"TRAINER_NICOLAS_5":396,"TRAINER_NIKKI":453,"TRAINER_NOB_1":183,"TRAINER_NOB_2":184,"TRAINER_NOB_3":185,"TRAINER_NOB_4":186,"TRAINER_NOB_5":187,"TRAINER_NOLAN":342,"TRAINER_NOLAND":809,"TRAINER_NOLEN":161,"TRAINER_NONE":0,"TRAINER_NORMAN_1":269,"TRAINER_NORMAN_2":786,"TRAINER_NORMAN_3":787,"TRAINER_NORMAN_4":788,"TRAINER_NORMAN_5":789,"TRAINER_OLIVIA":130,"TRAINER_OWEN":83,"TRAINER_PABLO_1":377,"TRAINER_PABLO_2":820,"TRAINER_PABLO_3":821,"TRAINER_PABLO_4":822,"TRAINER_PABLO_5":823,"TRAINER_PARKER":72,"TRAINER_PAT":766,"TRAINER_PATRICIA":105,"TRAINER_PAUL":275,"TRAINER_PAULA":429,"TRAINER_PAXTON":594,"TRAINER_PERRY":398,"TRAINER_PETE":735,"TRAINER_PHIL":400,"TRAINER_PHILLIP":494,"TRAINER_PHOEBE":262,"TRAINER_PRESLEY":403,"TRAINER_PRESTON":233,"TRAINER_QUINCY":324,"TRAINER_RACHEL":761,"TRAINER_RANDALL":71,"TRAINER_RED":851,"TRAINER_REED":675,"TRAINER_RELI_AND_IAN":686,"TRAINER_REYNA":509,"TRAINER_RHETT":703,"TRAINER_RICHARD":166,"TRAINER_RICK":615,"TRAINER_RICKY_1":64,"TRAINER_RICKY_2":67,"TRAINER_RICKY_3":68,"TRAINER_RICKY_4":69,"TRAINER_RICKY_5":70,"TRAINER_RILEY":653,"TRAINER_ROBERT_1":406,"TRAINER_ROBERT_2":409,"TRAINER_ROBERT_3":410,"TRAINER_ROBERT_4":411,"TRAINER_ROBERT_5":412,"TRAINER_ROBIN":612,"TRAINER_RODNEY":165,"TRAINER_ROGER":669,"TRAINER_ROLAND":160,"TRAINER_RONALD":350,"TRAINER_ROSE_1":37,"TRAINER_ROSE_2":40,"TRAINER_ROSE_3":41,"TRAINER_ROSE_4":42,"TRAINER_ROSE_5":43,"TRAINER_ROXANNE_1":265,"TRAINER_ROXANNE_2":770,"TRAINER_ROXANNE_3":771,"TRAINER_ROXANNE_4":772,"TRAINER_ROXANNE_5":773,"TRAINER_RUBEN":671,"TRAINER_SALLY":611,"TRAINER_SAMANTHA":245,"TRAINER_SAMUEL":81,"TRAINER_SANTIAGO":168,"TRAINER_SARAH":695,"TRAINER_SAWYER_1":1,"TRAINER_SAWYER_2":836,"TRAINER_SAWYER_3":837,"TRAINER_SAWYER_4":838,"TRAINER_SAWYER_5":839,"TRAINER_SEBASTIAN":554,"TRAINER_SHANE":214,"TRAINER_SHANNON":97,"TRAINER_SHARON":452,"TRAINER_SHAWN":194,"TRAINER_SHAYLA":747,"TRAINER_SHEILA":125,"TRAINER_SHELBY_1":313,"TRAINER_SHELBY_2":314,"TRAINER_SHELBY_3":315,"TRAINER_SHELBY_4":316,"TRAINER_SHELBY_5":317,"TRAINER_SHELLY_SEAFLOOR_CAVERN":33,"TRAINER_SHELLY_WEATHER_INSTITUTE":32,"TRAINER_SHIRLEY":126,"TRAINER_SIDNEY":261,"TRAINER_SIENNA":459,"TRAINER_SIMON":65,"TRAINER_SOPHIA":561,"TRAINER_SOPHIE":708,"TRAINER_SPENCER":159,"TRAINER_SPENSER":807,"TRAINER_STAN":162,"TRAINER_STEVEN":804,"TRAINER_STEVE_1":143,"TRAINER_STEVE_2":147,"TRAINER_STEVE_3":148,"TRAINER_STEVE_4":149,"TRAINER_STEVE_5":150,"TRAINER_SUSIE":456,"TRAINER_SYLVIA":575,"TRAINER_TABITHA_MAGMA_HIDEOUT":732,"TRAINER_TABITHA_MOSSDEEP":514,"TRAINER_TABITHA_MT_CHIMNEY":597,"TRAINER_TAKAO":179,"TRAINER_TAKASHI":416,"TRAINER_TALIA":385,"TRAINER_TAMMY":107,"TRAINER_TANYA":451,"TRAINER_TARA":446,"TRAINER_TASHA":109,"TRAINER_TATE_AND_LIZA_1":271,"TRAINER_TATE_AND_LIZA_2":794,"TRAINER_TATE_AND_LIZA_3":795,"TRAINER_TATE_AND_LIZA_4":796,"TRAINER_TATE_AND_LIZA_5":797,"TRAINER_TAYLOR":225,"TRAINER_TED":274,"TRAINER_TERRY":581,"TRAINER_THALIA_1":144,"TRAINER_THALIA_2":844,"TRAINER_THALIA_3":845,"TRAINER_THALIA_4":846,"TRAINER_THALIA_5":847,"TRAINER_THOMAS":256,"TRAINER_TIANA":603,"TRAINER_TIFFANY":131,"TRAINER_TIMMY":334,"TRAINER_TIMOTHY_1":307,"TRAINER_TIMOTHY_2":308,"TRAINER_TIMOTHY_3":309,"TRAINER_TIMOTHY_4":310,"TRAINER_TIMOTHY_5":311,"TRAINER_TISHA":676,"TRAINER_TOMMY":321,"TRAINER_TONY_1":155,"TRAINER_TONY_2":175,"TRAINER_TONY_3":176,"TRAINER_TONY_4":177,"TRAINER_TONY_5":178,"TRAINER_TORI_AND_TIA":677,"TRAINER_TRAVIS":218,"TRAINER_TRENT_1":627,"TRAINER_TRENT_2":636,"TRAINER_TRENT_3":637,"TRAINER_TRENT_4":638,"TRAINER_TRENT_5":639,"TRAINER_TUCKER":806,"TRAINER_TYRA_AND_IVY":679,"TRAINER_TYRON":704,"TRAINER_VALERIE_1":108,"TRAINER_VALERIE_2":110,"TRAINER_VALERIE_3":111,"TRAINER_VALERIE_4":112,"TRAINER_VALERIE_5":113,"TRAINER_VANESSA":300,"TRAINER_VICKY":312,"TRAINER_VICTOR":292,"TRAINER_VICTORIA":299,"TRAINER_VINCENT":76,"TRAINER_VIOLET":39,"TRAINER_VIRGIL":234,"TRAINER_VITO":82,"TRAINER_VIVI":606,"TRAINER_VIVIAN":649,"TRAINER_WADE":344,"TRAINER_WALLACE":335,"TRAINER_WALLY_MAUVILLE":656,"TRAINER_WALLY_VR_1":519,"TRAINER_WALLY_VR_2":657,"TRAINER_WALLY_VR_3":658,"TRAINER_WALLY_VR_4":659,"TRAINER_WALLY_VR_5":660,"TRAINER_WALTER_1":254,"TRAINER_WALTER_2":257,"TRAINER_WALTER_3":258,"TRAINER_WALTER_4":259,"TRAINER_WALTER_5":260,"TRAINER_WARREN":88,"TRAINER_WATTSON_1":267,"TRAINER_WATTSON_2":778,"TRAINER_WATTSON_3":779,"TRAINER_WATTSON_4":780,"TRAINER_WATTSON_5":781,"TRAINER_WAYNE":673,"TRAINER_WENDY":92,"TRAINER_WILLIAM":236,"TRAINER_WILTON_1":78,"TRAINER_WILTON_2":84,"TRAINER_WILTON_3":85,"TRAINER_WILTON_4":86,"TRAINER_WILTON_5":87,"TRAINER_WINONA_1":270,"TRAINER_WINONA_2":790,"TRAINER_WINONA_3":791,"TRAINER_WINONA_4":792,"TRAINER_WINONA_5":793,"TRAINER_WINSTON_1":136,"TRAINER_WINSTON_2":139,"TRAINER_WINSTON_3":140,"TRAINER_WINSTON_4":141,"TRAINER_WINSTON_5":142,"TRAINER_WYATT":711,"TRAINER_YASU":415,"TRAINER_YUJI":188,"TRAINER_ZANDER":31},"legendary_encounters":[{"address":2538600,"catch_flag":429,"defeat_flag":428,"level":30,"species":410},{"address":2354334,"catch_flag":480,"defeat_flag":447,"level":70,"species":405},{"address":2543160,"catch_flag":146,"defeat_flag":476,"level":70,"species":250},{"address":2354112,"catch_flag":479,"defeat_flag":446,"level":70,"species":404},{"address":2385623,"catch_flag":457,"defeat_flag":456,"level":50,"species":407},{"address":2385687,"catch_flag":482,"defeat_flag":481,"level":50,"species":408},{"address":2543443,"catch_flag":145,"defeat_flag":477,"level":70,"species":249},{"address":2538177,"catch_flag":458,"defeat_flag":455,"level":30,"species":151},{"address":2347488,"catch_flag":478,"defeat_flag":448,"level":70,"species":406},{"address":2345460,"catch_flag":427,"defeat_flag":444,"level":40,"species":402},{"address":2298183,"catch_flag":426,"defeat_flag":443,"level":40,"species":401},{"address":2345731,"catch_flag":483,"defeat_flag":445,"level":40,"species":403}],"locations":{"BADGE_1":{"address":2188036,"default_item":226,"flag":1182},"BADGE_2":{"address":2095131,"default_item":227,"flag":1183},"BADGE_3":{"address":2167252,"default_item":228,"flag":1184},"BADGE_4":{"address":2103246,"default_item":229,"flag":1185},"BADGE_5":{"address":2129781,"default_item":230,"flag":1186},"BADGE_6":{"address":2202122,"default_item":231,"flag":1187},"BADGE_7":{"address":2243964,"default_item":232,"flag":1188},"BADGE_8":{"address":2262314,"default_item":233,"flag":1189},"BERRY_TREE_01":{"address":5843562,"default_item":135,"flag":612},"BERRY_TREE_02":{"address":5843564,"default_item":139,"flag":613},"BERRY_TREE_03":{"address":5843566,"default_item":142,"flag":614},"BERRY_TREE_04":{"address":5843568,"default_item":139,"flag":615},"BERRY_TREE_05":{"address":5843570,"default_item":133,"flag":616},"BERRY_TREE_06":{"address":5843572,"default_item":138,"flag":617},"BERRY_TREE_07":{"address":5843574,"default_item":133,"flag":618},"BERRY_TREE_08":{"address":5843576,"default_item":133,"flag":619},"BERRY_TREE_09":{"address":5843578,"default_item":142,"flag":620},"BERRY_TREE_10":{"address":5843580,"default_item":138,"flag":621},"BERRY_TREE_11":{"address":5843582,"default_item":139,"flag":622},"BERRY_TREE_12":{"address":5843584,"default_item":142,"flag":623},"BERRY_TREE_13":{"address":5843586,"default_item":135,"flag":624},"BERRY_TREE_14":{"address":5843588,"default_item":155,"flag":625},"BERRY_TREE_15":{"address":5843590,"default_item":153,"flag":626},"BERRY_TREE_16":{"address":5843592,"default_item":150,"flag":627},"BERRY_TREE_17":{"address":5843594,"default_item":150,"flag":628},"BERRY_TREE_18":{"address":5843596,"default_item":150,"flag":629},"BERRY_TREE_19":{"address":5843598,"default_item":148,"flag":630},"BERRY_TREE_20":{"address":5843600,"default_item":148,"flag":631},"BERRY_TREE_21":{"address":5843602,"default_item":136,"flag":632},"BERRY_TREE_22":{"address":5843604,"default_item":135,"flag":633},"BERRY_TREE_23":{"address":5843606,"default_item":135,"flag":634},"BERRY_TREE_24":{"address":5843608,"default_item":136,"flag":635},"BERRY_TREE_25":{"address":5843610,"default_item":152,"flag":636},"BERRY_TREE_26":{"address":5843612,"default_item":134,"flag":637},"BERRY_TREE_27":{"address":5843614,"default_item":151,"flag":638},"BERRY_TREE_28":{"address":5843616,"default_item":151,"flag":639},"BERRY_TREE_29":{"address":5843618,"default_item":151,"flag":640},"BERRY_TREE_30":{"address":5843620,"default_item":153,"flag":641},"BERRY_TREE_31":{"address":5843622,"default_item":142,"flag":642},"BERRY_TREE_32":{"address":5843624,"default_item":142,"flag":643},"BERRY_TREE_33":{"address":5843626,"default_item":142,"flag":644},"BERRY_TREE_34":{"address":5843628,"default_item":153,"flag":645},"BERRY_TREE_35":{"address":5843630,"default_item":153,"flag":646},"BERRY_TREE_36":{"address":5843632,"default_item":153,"flag":647},"BERRY_TREE_37":{"address":5843634,"default_item":137,"flag":648},"BERRY_TREE_38":{"address":5843636,"default_item":137,"flag":649},"BERRY_TREE_39":{"address":5843638,"default_item":137,"flag":650},"BERRY_TREE_40":{"address":5843640,"default_item":135,"flag":651},"BERRY_TREE_41":{"address":5843642,"default_item":135,"flag":652},"BERRY_TREE_42":{"address":5843644,"default_item":135,"flag":653},"BERRY_TREE_43":{"address":5843646,"default_item":148,"flag":654},"BERRY_TREE_44":{"address":5843648,"default_item":150,"flag":655},"BERRY_TREE_45":{"address":5843650,"default_item":152,"flag":656},"BERRY_TREE_46":{"address":5843652,"default_item":151,"flag":657},"BERRY_TREE_47":{"address":5843654,"default_item":140,"flag":658},"BERRY_TREE_48":{"address":5843656,"default_item":137,"flag":659},"BERRY_TREE_49":{"address":5843658,"default_item":136,"flag":660},"BERRY_TREE_50":{"address":5843660,"default_item":134,"flag":661},"BERRY_TREE_51":{"address":5843662,"default_item":142,"flag":662},"BERRY_TREE_52":{"address":5843664,"default_item":150,"flag":663},"BERRY_TREE_53":{"address":5843666,"default_item":150,"flag":664},"BERRY_TREE_54":{"address":5843668,"default_item":142,"flag":665},"BERRY_TREE_55":{"address":5843670,"default_item":149,"flag":666},"BERRY_TREE_56":{"address":5843672,"default_item":149,"flag":667},"BERRY_TREE_57":{"address":5843674,"default_item":136,"flag":668},"BERRY_TREE_58":{"address":5843676,"default_item":153,"flag":669},"BERRY_TREE_59":{"address":5843678,"default_item":153,"flag":670},"BERRY_TREE_60":{"address":5843680,"default_item":157,"flag":671},"BERRY_TREE_61":{"address":5843682,"default_item":157,"flag":672},"BERRY_TREE_62":{"address":5843684,"default_item":138,"flag":673},"BERRY_TREE_63":{"address":5843686,"default_item":142,"flag":674},"BERRY_TREE_64":{"address":5843688,"default_item":138,"flag":675},"BERRY_TREE_65":{"address":5843690,"default_item":157,"flag":676},"BERRY_TREE_66":{"address":5843692,"default_item":134,"flag":677},"BERRY_TREE_67":{"address":5843694,"default_item":152,"flag":678},"BERRY_TREE_68":{"address":5843696,"default_item":140,"flag":679},"BERRY_TREE_69":{"address":5843698,"default_item":154,"flag":680},"BERRY_TREE_70":{"address":5843700,"default_item":154,"flag":681},"BERRY_TREE_71":{"address":5843702,"default_item":154,"flag":682},"BERRY_TREE_72":{"address":5843704,"default_item":157,"flag":683},"BERRY_TREE_73":{"address":5843706,"default_item":155,"flag":684},"BERRY_TREE_74":{"address":5843708,"default_item":155,"flag":685},"BERRY_TREE_75":{"address":5843710,"default_item":142,"flag":686},"BERRY_TREE_76":{"address":5843712,"default_item":133,"flag":687},"BERRY_TREE_77":{"address":5843714,"default_item":140,"flag":688},"BERRY_TREE_78":{"address":5843716,"default_item":140,"flag":689},"BERRY_TREE_79":{"address":5843718,"default_item":155,"flag":690},"BERRY_TREE_80":{"address":5843720,"default_item":139,"flag":691},"BERRY_TREE_81":{"address":5843722,"default_item":139,"flag":692},"BERRY_TREE_82":{"address":5843724,"default_item":168,"flag":693},"BERRY_TREE_83":{"address":5843726,"default_item":156,"flag":694},"BERRY_TREE_84":{"address":5843728,"default_item":156,"flag":695},"BERRY_TREE_85":{"address":5843730,"default_item":142,"flag":696},"BERRY_TREE_86":{"address":5843732,"default_item":138,"flag":697},"BERRY_TREE_87":{"address":5843734,"default_item":135,"flag":698},"BERRY_TREE_88":{"address":5843736,"default_item":142,"flag":699},"HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":{"address":5497200,"default_item":281,"flag":531},"HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":{"address":5497212,"default_item":282,"flag":532},"HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":{"address":5497224,"default_item":283,"flag":533},"HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":{"address":5497236,"default_item":284,"flag":534},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":{"address":5500100,"default_item":67,"flag":601},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":{"address":5500124,"default_item":65,"flag":604},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":{"address":5500112,"default_item":64,"flag":603},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":{"address":5500088,"default_item":70,"flag":602},"HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":{"address":5435924,"default_item":110,"flag":528},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":{"address":5487372,"default_item":195,"flag":548},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":{"address":5487384,"default_item":195,"flag":549},"HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":{"address":5489116,"default_item":23,"flag":577},"HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":{"address":5489128,"default_item":3,"flag":576},"HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":{"address":5435672,"default_item":16,"flag":500},"HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":{"address":5432608,"default_item":111,"flag":527},"HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":{"address":5432632,"default_item":4,"flag":575},"HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":{"address":5432620,"default_item":69,"flag":543},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":{"address":5490440,"default_item":35,"flag":578},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":{"address":5490428,"default_item":2,"flag":529},"HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":{"address":5490796,"default_item":68,"flag":580},"HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":{"address":5490784,"default_item":70,"flag":579},"HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":{"address":5525804,"default_item":45,"flag":609},"HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":{"address":5428972,"default_item":68,"flag":595},"HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":{"address":5487908,"default_item":4,"flag":561},"HIDDEN_ITEM_PETALBURG_WOODS_POTION":{"address":5487872,"default_item":13,"flag":558},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":{"address":5487884,"default_item":103,"flag":559},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":{"address":5487896,"default_item":103,"flag":560},"HIDDEN_ITEM_ROUTE_104_ANTIDOTE":{"address":5438492,"default_item":14,"flag":585},"HIDDEN_ITEM_ROUTE_104_HEART_SCALE":{"address":5438504,"default_item":111,"flag":588},"HIDDEN_ITEM_ROUTE_104_POKE_BALL":{"address":5438468,"default_item":4,"flag":562},"HIDDEN_ITEM_ROUTE_104_POTION":{"address":5438480,"default_item":13,"flag":537},"HIDDEN_ITEM_ROUTE_104_SUPER_POTION":{"address":5438456,"default_item":22,"flag":544},"HIDDEN_ITEM_ROUTE_105_BIG_PEARL":{"address":5438748,"default_item":107,"flag":611},"HIDDEN_ITEM_ROUTE_105_HEART_SCALE":{"address":5438736,"default_item":111,"flag":589},"HIDDEN_ITEM_ROUTE_106_HEART_SCALE":{"address":5438932,"default_item":111,"flag":547},"HIDDEN_ITEM_ROUTE_106_POKE_BALL":{"address":5438908,"default_item":4,"flag":563},"HIDDEN_ITEM_ROUTE_106_STARDUST":{"address":5438920,"default_item":108,"flag":546},"HIDDEN_ITEM_ROUTE_108_RARE_CANDY":{"address":5439340,"default_item":68,"flag":586},"HIDDEN_ITEM_ROUTE_109_ETHER":{"address":5440016,"default_item":34,"flag":564},"HIDDEN_ITEM_ROUTE_109_GREAT_BALL":{"address":5440004,"default_item":3,"flag":551},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":{"address":5439992,"default_item":111,"flag":552},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":{"address":5440028,"default_item":111,"flag":590},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":{"address":5440040,"default_item":111,"flag":591},"HIDDEN_ITEM_ROUTE_109_REVIVE":{"address":5439980,"default_item":24,"flag":550},"HIDDEN_ITEM_ROUTE_110_FULL_HEAL":{"address":5441308,"default_item":23,"flag":555},"HIDDEN_ITEM_ROUTE_110_GREAT_BALL":{"address":5441284,"default_item":3,"flag":553},"HIDDEN_ITEM_ROUTE_110_POKE_BALL":{"address":5441296,"default_item":4,"flag":565},"HIDDEN_ITEM_ROUTE_110_REVIVE":{"address":5441272,"default_item":24,"flag":554},"HIDDEN_ITEM_ROUTE_111_PROTEIN":{"address":5443220,"default_item":64,"flag":556},"HIDDEN_ITEM_ROUTE_111_RARE_CANDY":{"address":5443232,"default_item":68,"flag":557},"HIDDEN_ITEM_ROUTE_111_STARDUST":{"address":5443160,"default_item":108,"flag":502},"HIDDEN_ITEM_ROUTE_113_ETHER":{"address":5444488,"default_item":34,"flag":503},"HIDDEN_ITEM_ROUTE_113_NUGGET":{"address":5444512,"default_item":110,"flag":598},"HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":{"address":5444500,"default_item":320,"flag":530},"HIDDEN_ITEM_ROUTE_114_CARBOS":{"address":5445340,"default_item":66,"flag":504},"HIDDEN_ITEM_ROUTE_114_REVIVE":{"address":5445364,"default_item":24,"flag":542},"HIDDEN_ITEM_ROUTE_115_HEART_SCALE":{"address":5446176,"default_item":111,"flag":597},"HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":{"address":5447056,"default_item":206,"flag":596},"HIDDEN_ITEM_ROUTE_116_SUPER_POTION":{"address":5447044,"default_item":22,"flag":545},"HIDDEN_ITEM_ROUTE_117_REPEL":{"address":5447708,"default_item":86,"flag":572},"HIDDEN_ITEM_ROUTE_118_HEART_SCALE":{"address":5448404,"default_item":111,"flag":566},"HIDDEN_ITEM_ROUTE_118_IRON":{"address":5448392,"default_item":65,"flag":567},"HIDDEN_ITEM_ROUTE_119_CALCIUM":{"address":5449972,"default_item":67,"flag":505},"HIDDEN_ITEM_ROUTE_119_FULL_HEAL":{"address":5450056,"default_item":23,"flag":568},"HIDDEN_ITEM_ROUTE_119_MAX_ETHER":{"address":5450068,"default_item":35,"flag":587},"HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":{"address":5449984,"default_item":2,"flag":506},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":{"address":5451596,"default_item":68,"flag":571},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":{"address":5451620,"default_item":68,"flag":569},"HIDDEN_ITEM_ROUTE_120_REVIVE":{"address":5451608,"default_item":24,"flag":584},"HIDDEN_ITEM_ROUTE_120_ZINC":{"address":5451632,"default_item":70,"flag":570},"HIDDEN_ITEM_ROUTE_121_FULL_HEAL":{"address":5452540,"default_item":23,"flag":573},"HIDDEN_ITEM_ROUTE_121_HP_UP":{"address":5452516,"default_item":63,"flag":539},"HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":{"address":5452552,"default_item":25,"flag":600},"HIDDEN_ITEM_ROUTE_121_NUGGET":{"address":5452528,"default_item":110,"flag":540},"HIDDEN_ITEM_ROUTE_123_HYPER_POTION":{"address":5454100,"default_item":21,"flag":574},"HIDDEN_ITEM_ROUTE_123_PP_UP":{"address":5454112,"default_item":69,"flag":599},"HIDDEN_ITEM_ROUTE_123_RARE_CANDY":{"address":5454124,"default_item":68,"flag":610},"HIDDEN_ITEM_ROUTE_123_REVIVE":{"address":5454088,"default_item":24,"flag":541},"HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":{"address":5454052,"default_item":83,"flag":507},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":{"address":5455620,"default_item":111,"flag":592},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":{"address":5455632,"default_item":111,"flag":593},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":{"address":5455644,"default_item":111,"flag":594},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":{"address":5517256,"default_item":68,"flag":606},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":{"address":5517268,"default_item":70,"flag":607},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":{"address":5517432,"default_item":19,"flag":605},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":{"address":5517420,"default_item":69,"flag":608},"HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":{"address":5511292,"default_item":200,"flag":535},"HIDDEN_ITEM_TRICK_HOUSE_NUGGET":{"address":5526716,"default_item":110,"flag":501},"HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":{"address":5456992,"default_item":107,"flag":511},"HIDDEN_ITEM_UNDERWATER_124_CALCIUM":{"address":5457016,"default_item":67,"flag":536},"HIDDEN_ITEM_UNDERWATER_124_CARBOS":{"address":5456956,"default_item":66,"flag":508},"HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":{"address":5456968,"default_item":51,"flag":509},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":{"address":5457004,"default_item":111,"flag":513},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":{"address":5457028,"default_item":111,"flag":538},"HIDDEN_ITEM_UNDERWATER_124_PEARL":{"address":5456980,"default_item":106,"flag":510},"HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":{"address":5457140,"default_item":107,"flag":520},"HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":{"address":5457152,"default_item":49,"flag":512},"HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":{"address":5457068,"default_item":111,"flag":514},"HIDDEN_ITEM_UNDERWATER_126_IRON":{"address":5457116,"default_item":65,"flag":519},"HIDDEN_ITEM_UNDERWATER_126_PEARL":{"address":5457104,"default_item":106,"flag":517},"HIDDEN_ITEM_UNDERWATER_126_STARDUST":{"address":5457092,"default_item":108,"flag":516},"HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":{"address":5457080,"default_item":2,"flag":515},"HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":{"address":5457128,"default_item":50,"flag":518},"HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":{"address":5457224,"default_item":111,"flag":523},"HIDDEN_ITEM_UNDERWATER_127_HP_UP":{"address":5457212,"default_item":63,"flag":522},"HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":{"address":5457236,"default_item":48,"flag":524},"HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":{"address":5457200,"default_item":109,"flag":521},"HIDDEN_ITEM_UNDERWATER_128_PEARL":{"address":5457288,"default_item":106,"flag":526},"HIDDEN_ITEM_UNDERWATER_128_PROTEIN":{"address":5457276,"default_item":64,"flag":525},"HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":{"address":5493932,"default_item":2,"flag":581},"HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":{"address":5494744,"default_item":36,"flag":582},"HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":{"address":5494756,"default_item":84,"flag":583},"ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":{"address":2709805,"default_item":285,"flag":1100},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":{"address":2709857,"default_item":306,"flag":1102},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":{"address":2709831,"default_item":278,"flag":1078},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":{"address":2709844,"default_item":97,"flag":1101},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":{"address":2709818,"default_item":11,"flag":1077},"ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":{"address":2709740,"default_item":122,"flag":1095},"ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":{"address":2709792,"default_item":24,"flag":1099},"ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":{"address":2709766,"default_item":7,"flag":1097},"ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":{"address":2709753,"default_item":85,"flag":1096},"ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":{"address":2709779,"default_item":301,"flag":1098},"ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":{"address":2710039,"default_item":1,"flag":1124},"ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":{"address":2710065,"default_item":37,"flag":1071},"ITEM_AQUA_HIDEOUT_B1F_NUGGET":{"address":2710052,"default_item":110,"flag":1132},"ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":{"address":2710078,"default_item":8,"flag":1072},"ITEM_ARTISAN_CAVE_1F_CARBOS":{"address":2710416,"default_item":66,"flag":1163},"ITEM_ARTISAN_CAVE_B1F_HP_UP":{"address":2710403,"default_item":63,"flag":1162},"ITEM_FIERY_PATH_FIRE_STONE":{"address":2709584,"default_item":95,"flag":1111},"ITEM_FIERY_PATH_TM_TOXIC":{"address":2709597,"default_item":294,"flag":1091},"ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":{"address":2709519,"default_item":85,"flag":1050},"ITEM_GRANITE_CAVE_B1F_POKE_BALL":{"address":2709532,"default_item":4,"flag":1051},"ITEM_GRANITE_CAVE_B2F_RARE_CANDY":{"address":2709558,"default_item":68,"flag":1054},"ITEM_GRANITE_CAVE_B2F_REPEL":{"address":2709545,"default_item":86,"flag":1053},"ITEM_JAGGED_PASS_BURN_HEAL":{"address":2709571,"default_item":15,"flag":1070},"ITEM_LILYCOVE_CITY_MAX_REPEL":{"address":2709415,"default_item":84,"flag":1042},"ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":{"address":2710429,"default_item":68,"flag":1151},"ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":{"address":2710455,"default_item":19,"flag":1165},"ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":{"address":2710442,"default_item":37,"flag":1164},"ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":{"address":2710468,"default_item":110,"flag":1166},"ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":{"address":2710481,"default_item":71,"flag":1167},"ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":{"address":2710507,"default_item":85,"flag":1059},"ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":{"address":2710494,"default_item":25,"flag":1168},"ITEM_MAUVILLE_CITY_X_SPEED":{"address":2709389,"default_item":77,"flag":1116},"ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":{"address":2709623,"default_item":23,"flag":1045},"ITEM_METEOR_FALLS_1F_1R_MOON_STONE":{"address":2709636,"default_item":94,"flag":1046},"ITEM_METEOR_FALLS_1F_1R_PP_UP":{"address":2709649,"default_item":69,"flag":1047},"ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":{"address":2709610,"default_item":311,"flag":1044},"ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":{"address":2709662,"default_item":290,"flag":1080},"ITEM_MOSSDEEP_CITY_NET_BALL":{"address":2709428,"default_item":6,"flag":1043},"ITEM_MT_PYRE_2F_ULTRA_BALL":{"address":2709948,"default_item":2,"flag":1129},"ITEM_MT_PYRE_3F_SUPER_REPEL":{"address":2709961,"default_item":83,"flag":1120},"ITEM_MT_PYRE_4F_SEA_INCENSE":{"address":2709974,"default_item":220,"flag":1130},"ITEM_MT_PYRE_5F_LAX_INCENSE":{"address":2709987,"default_item":221,"flag":1052},"ITEM_MT_PYRE_6F_TM_SHADOW_BALL":{"address":2710000,"default_item":318,"flag":1089},"ITEM_MT_PYRE_EXTERIOR_MAX_POTION":{"address":2710013,"default_item":20,"flag":1073},"ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":{"address":2710026,"default_item":336,"flag":1074},"ITEM_NEW_MAUVILLE_ESCAPE_ROPE":{"address":2709688,"default_item":85,"flag":1076},"ITEM_NEW_MAUVILLE_FULL_HEAL":{"address":2709714,"default_item":23,"flag":1122},"ITEM_NEW_MAUVILLE_PARALYZE_HEAL":{"address":2709727,"default_item":18,"flag":1123},"ITEM_NEW_MAUVILLE_THUNDER_STONE":{"address":2709701,"default_item":96,"flag":1110},"ITEM_NEW_MAUVILLE_ULTRA_BALL":{"address":2709675,"default_item":2,"flag":1075},"ITEM_PETALBURG_CITY_ETHER":{"address":2709376,"default_item":34,"flag":1040},"ITEM_PETALBURG_CITY_MAX_REVIVE":{"address":2709363,"default_item":25,"flag":1039},"ITEM_PETALBURG_WOODS_ETHER":{"address":2709467,"default_item":34,"flag":1058},"ITEM_PETALBURG_WOODS_GREAT_BALL":{"address":2709454,"default_item":3,"flag":1056},"ITEM_PETALBURG_WOODS_PARALYZE_HEAL":{"address":2709480,"default_item":18,"flag":1117},"ITEM_PETALBURG_WOODS_X_ATTACK":{"address":2709441,"default_item":75,"flag":1055},"ITEM_ROUTE_102_POTION":{"address":2708375,"default_item":13,"flag":1000},"ITEM_ROUTE_103_GUARD_SPEC":{"address":2708388,"default_item":73,"flag":1114},"ITEM_ROUTE_103_PP_UP":{"address":2708401,"default_item":69,"flag":1137},"ITEM_ROUTE_104_POKE_BALL":{"address":2708427,"default_item":4,"flag":1057},"ITEM_ROUTE_104_POTION":{"address":2708453,"default_item":13,"flag":1135},"ITEM_ROUTE_104_PP_UP":{"address":2708414,"default_item":69,"flag":1002},"ITEM_ROUTE_104_X_ACCURACY":{"address":2708440,"default_item":78,"flag":1115},"ITEM_ROUTE_105_IRON":{"address":2708466,"default_item":65,"flag":1003},"ITEM_ROUTE_106_PROTEIN":{"address":2708479,"default_item":64,"flag":1004},"ITEM_ROUTE_108_STAR_PIECE":{"address":2708492,"default_item":109,"flag":1139},"ITEM_ROUTE_109_POTION":{"address":2708518,"default_item":13,"flag":1140},"ITEM_ROUTE_109_PP_UP":{"address":2708505,"default_item":69,"flag":1005},"ITEM_ROUTE_110_DIRE_HIT":{"address":2708544,"default_item":74,"flag":1007},"ITEM_ROUTE_110_ELIXIR":{"address":2708557,"default_item":36,"flag":1141},"ITEM_ROUTE_110_RARE_CANDY":{"address":2708531,"default_item":68,"flag":1006},"ITEM_ROUTE_111_ELIXIR":{"address":2708609,"default_item":36,"flag":1142},"ITEM_ROUTE_111_HP_UP":{"address":2708596,"default_item":63,"flag":1010},"ITEM_ROUTE_111_STARDUST":{"address":2708583,"default_item":108,"flag":1009},"ITEM_ROUTE_111_TM_SANDSTORM":{"address":2708570,"default_item":325,"flag":1008},"ITEM_ROUTE_112_NUGGET":{"address":2708622,"default_item":110,"flag":1011},"ITEM_ROUTE_113_HYPER_POTION":{"address":2708661,"default_item":21,"flag":1143},"ITEM_ROUTE_113_MAX_ETHER":{"address":2708635,"default_item":35,"flag":1012},"ITEM_ROUTE_113_SUPER_REPEL":{"address":2708648,"default_item":83,"flag":1013},"ITEM_ROUTE_114_ENERGY_POWDER":{"address":2708700,"default_item":30,"flag":1160},"ITEM_ROUTE_114_PROTEIN":{"address":2708687,"default_item":64,"flag":1015},"ITEM_ROUTE_114_RARE_CANDY":{"address":2708674,"default_item":68,"flag":1014},"ITEM_ROUTE_115_GREAT_BALL":{"address":2708752,"default_item":3,"flag":1118},"ITEM_ROUTE_115_HEAL_POWDER":{"address":2708765,"default_item":32,"flag":1144},"ITEM_ROUTE_115_IRON":{"address":2708739,"default_item":65,"flag":1018},"ITEM_ROUTE_115_PP_UP":{"address":2708778,"default_item":69,"flag":1161},"ITEM_ROUTE_115_SUPER_POTION":{"address":2708713,"default_item":22,"flag":1016},"ITEM_ROUTE_115_TM_FOCUS_PUNCH":{"address":2708726,"default_item":289,"flag":1017},"ITEM_ROUTE_116_ETHER":{"address":2708804,"default_item":34,"flag":1019},"ITEM_ROUTE_116_HP_UP":{"address":2708830,"default_item":63,"flag":1021},"ITEM_ROUTE_116_POTION":{"address":2708843,"default_item":13,"flag":1146},"ITEM_ROUTE_116_REPEL":{"address":2708817,"default_item":86,"flag":1020},"ITEM_ROUTE_116_X_SPECIAL":{"address":2708791,"default_item":79,"flag":1001},"ITEM_ROUTE_117_GREAT_BALL":{"address":2708856,"default_item":3,"flag":1022},"ITEM_ROUTE_117_REVIVE":{"address":2708869,"default_item":24,"flag":1023},"ITEM_ROUTE_118_HYPER_POTION":{"address":2708882,"default_item":21,"flag":1121},"ITEM_ROUTE_119_ELIXIR_1":{"address":2708921,"default_item":36,"flag":1026},"ITEM_ROUTE_119_ELIXIR_2":{"address":2708986,"default_item":36,"flag":1147},"ITEM_ROUTE_119_HYPER_POTION_1":{"address":2708960,"default_item":21,"flag":1029},"ITEM_ROUTE_119_HYPER_POTION_2":{"address":2708973,"default_item":21,"flag":1106},"ITEM_ROUTE_119_LEAF_STONE":{"address":2708934,"default_item":98,"flag":1027},"ITEM_ROUTE_119_NUGGET":{"address":2710104,"default_item":110,"flag":1134},"ITEM_ROUTE_119_RARE_CANDY":{"address":2708947,"default_item":68,"flag":1028},"ITEM_ROUTE_119_SUPER_REPEL":{"address":2708895,"default_item":83,"flag":1024},"ITEM_ROUTE_119_ZINC":{"address":2708908,"default_item":70,"flag":1025},"ITEM_ROUTE_120_FULL_HEAL":{"address":2709012,"default_item":23,"flag":1031},"ITEM_ROUTE_120_HYPER_POTION":{"address":2709025,"default_item":21,"flag":1107},"ITEM_ROUTE_120_NEST_BALL":{"address":2709038,"default_item":8,"flag":1108},"ITEM_ROUTE_120_NUGGET":{"address":2708999,"default_item":110,"flag":1030},"ITEM_ROUTE_120_REVIVE":{"address":2709051,"default_item":24,"flag":1148},"ITEM_ROUTE_121_CARBOS":{"address":2709064,"default_item":66,"flag":1103},"ITEM_ROUTE_121_REVIVE":{"address":2709077,"default_item":24,"flag":1149},"ITEM_ROUTE_121_ZINC":{"address":2709090,"default_item":70,"flag":1150},"ITEM_ROUTE_123_CALCIUM":{"address":2709103,"default_item":67,"flag":1032},"ITEM_ROUTE_123_ELIXIR":{"address":2709129,"default_item":36,"flag":1109},"ITEM_ROUTE_123_PP_UP":{"address":2709142,"default_item":69,"flag":1152},"ITEM_ROUTE_123_REVIVAL_HERB":{"address":2709155,"default_item":33,"flag":1153},"ITEM_ROUTE_123_ULTRA_BALL":{"address":2709116,"default_item":2,"flag":1104},"ITEM_ROUTE_124_BLUE_SHARD":{"address":2709181,"default_item":49,"flag":1093},"ITEM_ROUTE_124_RED_SHARD":{"address":2709168,"default_item":48,"flag":1092},"ITEM_ROUTE_124_YELLOW_SHARD":{"address":2709194,"default_item":50,"flag":1066},"ITEM_ROUTE_125_BIG_PEARL":{"address":2709207,"default_item":107,"flag":1154},"ITEM_ROUTE_126_GREEN_SHARD":{"address":2709220,"default_item":51,"flag":1105},"ITEM_ROUTE_127_CARBOS":{"address":2709246,"default_item":66,"flag":1035},"ITEM_ROUTE_127_RARE_CANDY":{"address":2709259,"default_item":68,"flag":1155},"ITEM_ROUTE_127_ZINC":{"address":2709233,"default_item":70,"flag":1034},"ITEM_ROUTE_132_PROTEIN":{"address":2709285,"default_item":64,"flag":1156},"ITEM_ROUTE_132_RARE_CANDY":{"address":2709272,"default_item":68,"flag":1036},"ITEM_ROUTE_133_BIG_PEARL":{"address":2709298,"default_item":107,"flag":1037},"ITEM_ROUTE_133_MAX_REVIVE":{"address":2709324,"default_item":25,"flag":1157},"ITEM_ROUTE_133_STAR_PIECE":{"address":2709311,"default_item":109,"flag":1038},"ITEM_ROUTE_134_CARBOS":{"address":2709337,"default_item":66,"flag":1158},"ITEM_ROUTE_134_STAR_PIECE":{"address":2709350,"default_item":109,"flag":1159},"ITEM_RUSTBORO_CITY_X_DEFEND":{"address":2709402,"default_item":76,"flag":1041},"ITEM_RUSTURF_TUNNEL_MAX_ETHER":{"address":2709506,"default_item":35,"flag":1049},"ITEM_RUSTURF_TUNNEL_POKE_BALL":{"address":2709493,"default_item":4,"flag":1048},"ITEM_SAFARI_ZONE_NORTH_CALCIUM":{"address":2709896,"default_item":67,"flag":1119},"ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":{"address":2709922,"default_item":110,"flag":1169},"ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":{"address":2709883,"default_item":310,"flag":1094},"ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":{"address":2709935,"default_item":107,"flag":1170},"ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":{"address":2709909,"default_item":25,"flag":1131},"ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":{"address":2709870,"default_item":299,"flag":1079},"ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":{"address":2710208,"default_item":314,"flag":1090},"ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":{"address":2710143,"default_item":107,"flag":1081},"ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":{"address":2710195,"default_item":212,"flag":1113},"ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":{"address":2710182,"default_item":295,"flag":1112},"ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":{"address":2710156,"default_item":68,"flag":1082},"ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":{"address":2710169,"default_item":16,"flag":1083},"ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":{"address":[2710221,2551006],"default_item":121,"flag":1060},"ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":{"address":[2710234,2551032],"default_item":122,"flag":1061},"ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":{"address":[2710247,2551058],"default_item":126,"flag":1062},"ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":{"address":[2710260,2551084],"default_item":128,"flag":1063},"ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":{"address":[2710273,2551110],"default_item":125,"flag":1064},"ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":{"address":[2710286,2551136],"default_item":124,"flag":1065},"ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":{"address":[2710299,2551162],"default_item":123,"flag":1067},"ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":{"address":[2710312,2551188],"default_item":129,"flag":1068},"ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":{"address":[2710325,2551214],"default_item":127,"flag":1069},"ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":{"address":2710338,"default_item":37,"flag":1084},"ITEM_VICTORY_ROAD_1F_PP_UP":{"address":2710351,"default_item":69,"flag":1085},"ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":{"address":2710377,"default_item":19,"flag":1087},"ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":{"address":2710364,"default_item":317,"flag":1086},"ITEM_VICTORY_ROAD_B2F_FULL_HEAL":{"address":2710390,"default_item":23,"flag":1088},"NPC_GIFT_BERRY_MASTERS_WIFE":{"address":2570453,"default_item":133,"flag":1197},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_1":{"address":2570263,"default_item":153,"flag":1195},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_2":{"address":2570315,"default_item":154,"flag":1196},"NPC_GIFT_FLOWER_SHOP_RECEIVED_BERRY":{"address":2284375,"default_item":133,"flag":1207},"NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON":{"address":1971718,"default_item":271,"flag":208},"NPC_GIFT_GOT_TM_THUNDERBOLT_FROM_WATTSON":{"address":1971754,"default_item":312,"flag":209},"NPC_GIFT_LILYCOVE_RECEIVED_BERRY":{"address":1985277,"default_item":141,"flag":1208},"NPC_GIFT_RECEIVED_6_SODA_POP":{"address":2543767,"default_item":27,"flag":140},"NPC_GIFT_RECEIVED_ACRO_BIKE":{"address":2170570,"default_item":272,"flag":1181},"NPC_GIFT_RECEIVED_AMULET_COIN":{"address":2716248,"default_item":189,"flag":133},"NPC_GIFT_RECEIVED_AURORA_TICKET":{"address":2716523,"default_item":371,"flag":314},"NPC_GIFT_RECEIVED_CHARCOAL":{"address":2102559,"default_item":215,"flag":254},"NPC_GIFT_RECEIVED_CHESTO_BERRY_ROUTE_104":{"address":2028703,"default_item":134,"flag":246},"NPC_GIFT_RECEIVED_CLEANSE_TAG":{"address":2312109,"default_item":190,"flag":282},"NPC_GIFT_RECEIVED_COIN_CASE":{"address":2179054,"default_item":260,"flag":258},"NPC_GIFT_RECEIVED_DEEP_SEA_SCALE":{"address":2162572,"default_item":193,"flag":1190},"NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH":{"address":2162555,"default_item":192,"flag":1191},"NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":{"address":2295814,"default_item":269,"flag":1172},"NPC_GIFT_RECEIVED_DEVON_SCOPE":{"address":2065146,"default_item":288,"flag":285},"NPC_GIFT_RECEIVED_EON_TICKET":{"address":2716574,"default_item":275,"flag":474},"NPC_GIFT_RECEIVED_EXP_SHARE":{"address":2185525,"default_item":182,"flag":272},"NPC_GIFT_RECEIVED_FIRST_POKEBALLS":{"address":2085751,"default_item":4,"flag":233},"NPC_GIFT_RECEIVED_FOCUS_BAND":{"address":2337807,"default_item":196,"flag":283},"NPC_GIFT_RECEIVED_GOOD_ROD":{"address":2058408,"default_item":263,"flag":227},"NPC_GIFT_RECEIVED_GO_GOGGLES":{"address":2017746,"default_item":279,"flag":221},"NPC_GIFT_RECEIVED_GREAT_BALL_PETALBURG_WOODS":{"address":2300119,"default_item":3,"flag":1171},"NPC_GIFT_RECEIVED_GREAT_BALL_RUSTBORO_CITY":{"address":1977146,"default_item":3,"flag":1173},"NPC_GIFT_RECEIVED_HM_CUT":{"address":2199532,"default_item":339,"flag":137},"NPC_GIFT_RECEIVED_HM_DIVE":{"address":2252095,"default_item":346,"flag":123},"NPC_GIFT_RECEIVED_HM_FLASH":{"address":2298287,"default_item":343,"flag":109},"NPC_GIFT_RECEIVED_HM_FLY":{"address":2060636,"default_item":340,"flag":110},"NPC_GIFT_RECEIVED_HM_ROCK_SMASH":{"address":2174128,"default_item":344,"flag":107},"NPC_GIFT_RECEIVED_HM_STRENGTH":{"address":2295305,"default_item":342,"flag":106},"NPC_GIFT_RECEIVED_HM_SURF":{"address":2126671,"default_item":341,"flag":122},"NPC_GIFT_RECEIVED_HM_WATERFALL":{"address":1999854,"default_item":345,"flag":312},"NPC_GIFT_RECEIVED_ITEMFINDER":{"address":2039874,"default_item":261,"flag":1176},"NPC_GIFT_RECEIVED_KINGS_ROCK":{"address":1993670,"default_item":187,"flag":276},"NPC_GIFT_RECEIVED_LETTER":{"address":2185301,"default_item":274,"flag":1174},"NPC_GIFT_RECEIVED_MACHO_BRACE":{"address":2284472,"default_item":181,"flag":277},"NPC_GIFT_RECEIVED_MACH_BIKE":{"address":2170553,"default_item":259,"flag":1180},"NPC_GIFT_RECEIVED_MAGMA_EMBLEM":{"address":2316671,"default_item":375,"flag":1177},"NPC_GIFT_RECEIVED_MENTAL_HERB":{"address":2208103,"default_item":185,"flag":223},"NPC_GIFT_RECEIVED_METEORITE":{"address":2304222,"default_item":280,"flag":115},"NPC_GIFT_RECEIVED_MIRACLE_SEED":{"address":2300337,"default_item":205,"flag":297},"NPC_GIFT_RECEIVED_MYSTIC_TICKET":{"address":2716540,"default_item":370,"flag":315},"NPC_GIFT_RECEIVED_OLD_ROD":{"address":2012541,"default_item":262,"flag":257},"NPC_GIFT_RECEIVED_OLD_SEA_MAP":{"address":2716557,"default_item":376,"flag":316},"NPC_GIFT_RECEIVED_POKEBLOCK_CASE":{"address":2614193,"default_item":273,"flag":95},"NPC_GIFT_RECEIVED_POTION_OLDALE":{"address":2010888,"default_item":13,"flag":132},"NPC_GIFT_RECEIVED_POWDER_JAR":{"address":1962504,"default_item":372,"flag":337},"NPC_GIFT_RECEIVED_PREMIER_BALL_RUSTBORO":{"address":2200571,"default_item":12,"flag":213},"NPC_GIFT_RECEIVED_QUICK_CLAW":{"address":2192227,"default_item":183,"flag":275},"NPC_GIFT_RECEIVED_REPEAT_BALL":{"address":2053722,"default_item":9,"flag":256},"NPC_GIFT_RECEIVED_SECRET_POWER":{"address":2598914,"default_item":331,"flag":96},"NPC_GIFT_RECEIVED_SILK_SCARF":{"address":2101830,"default_item":217,"flag":289},"NPC_GIFT_RECEIVED_SOFT_SAND":{"address":2035664,"default_item":203,"flag":280},"NPC_GIFT_RECEIVED_SOOTHE_BELL":{"address":2151278,"default_item":184,"flag":278},"NPC_GIFT_RECEIVED_SOOT_SACK":{"address":2567245,"default_item":270,"flag":1033},"NPC_GIFT_RECEIVED_SS_TICKET":{"address":2716506,"default_item":265,"flag":291},"NPC_GIFT_RECEIVED_SUN_STONE_MOSSDEEP":{"address":2254406,"default_item":93,"flag":192},"NPC_GIFT_RECEIVED_SUPER_ROD":{"address":2251560,"default_item":264,"flag":152},"NPC_GIFT_RECEIVED_TM_AERIAL_ACE":{"address":2202201,"default_item":328,"flag":170},"NPC_GIFT_RECEIVED_TM_ATTRACT":{"address":2116413,"default_item":333,"flag":235},"NPC_GIFT_RECEIVED_TM_BRICK_BREAK":{"address":2269085,"default_item":319,"flag":121},"NPC_GIFT_RECEIVED_TM_BULK_UP":{"address":2095210,"default_item":296,"flag":166},"NPC_GIFT_RECEIVED_TM_BULLET_SEED":{"address":2028910,"default_item":297,"flag":262},"NPC_GIFT_RECEIVED_TM_CALM_MIND":{"address":2244066,"default_item":292,"flag":171},"NPC_GIFT_RECEIVED_TM_DIG":{"address":2286669,"default_item":316,"flag":261},"NPC_GIFT_RECEIVED_TM_FACADE":{"address":2129909,"default_item":330,"flag":169},"NPC_GIFT_RECEIVED_TM_FRUSTRATION":{"address":2124110,"default_item":309,"flag":1179},"NPC_GIFT_RECEIVED_TM_GIGA_DRAIN":{"address":2068012,"default_item":307,"flag":232},"NPC_GIFT_RECEIVED_TM_HIDDEN_POWER":{"address":2206905,"default_item":298,"flag":264},"NPC_GIFT_RECEIVED_TM_OVERHEAT":{"address":2103328,"default_item":338,"flag":168},"NPC_GIFT_RECEIVED_TM_REST":{"address":2236966,"default_item":332,"flag":234},"NPC_GIFT_RECEIVED_TM_RETURN":{"address":2113546,"default_item":315,"flag":229},"NPC_GIFT_RECEIVED_TM_RETURN_2":{"address":2124055,"default_item":315,"flag":1178},"NPC_GIFT_RECEIVED_TM_ROAR":{"address":2051750,"default_item":293,"flag":231},"NPC_GIFT_RECEIVED_TM_ROCK_TOMB":{"address":2188088,"default_item":327,"flag":165},"NPC_GIFT_RECEIVED_TM_SHOCK_WAVE":{"address":2167340,"default_item":322,"flag":167},"NPC_GIFT_RECEIVED_TM_SLUDGE_BOMB":{"address":2099189,"default_item":324,"flag":230},"NPC_GIFT_RECEIVED_TM_SNATCH":{"address":2360766,"default_item":337,"flag":260},"NPC_GIFT_RECEIVED_TM_STEEL_WING":{"address":2298866,"default_item":335,"flag":1175},"NPC_GIFT_RECEIVED_TM_THIEF":{"address":2154698,"default_item":334,"flag":269},"NPC_GIFT_RECEIVED_TM_TORMENT":{"address":2145260,"default_item":329,"flag":265},"NPC_GIFT_RECEIVED_TM_WATER_PULSE":{"address":2262402,"default_item":291,"flag":172},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_1":{"address":2550316,"default_item":68,"flag":1200},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_2":{"address":2550390,"default_item":10,"flag":1201},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_3":{"address":2550473,"default_item":204,"flag":1202},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_4":{"address":2550556,"default_item":194,"flag":1203},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_5":{"address":2550630,"default_item":300,"flag":1204},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_6":{"address":2550695,"default_item":208,"flag":1205},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_7":{"address":2550769,"default_item":71,"flag":1206},"NPC_GIFT_RECEIVED_WAILMER_PAIL":{"address":2284320,"default_item":268,"flag":94},"NPC_GIFT_RECEIVED_WHITE_HERB":{"address":2028770,"default_item":180,"flag":279},"NPC_GIFT_ROUTE_111_RECEIVED_BERRY":{"address":2045493,"default_item":148,"flag":1192},"NPC_GIFT_ROUTE_114_RECEIVED_BERRY":{"address":2051680,"default_item":149,"flag":1193},"NPC_GIFT_ROUTE_120_RECEIVED_BERRY":{"address":2064727,"default_item":143,"flag":1194},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_1":{"address":1998521,"default_item":153,"flag":1198},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_2":{"address":1998566,"default_item":143,"flag":1199},"POKEDEX_REWARD_001":{"address":5729368,"default_item":3,"flag":0},"POKEDEX_REWARD_002":{"address":5729370,"default_item":3,"flag":0},"POKEDEX_REWARD_003":{"address":5729372,"default_item":3,"flag":0},"POKEDEX_REWARD_004":{"address":5729374,"default_item":3,"flag":0},"POKEDEX_REWARD_005":{"address":5729376,"default_item":3,"flag":0},"POKEDEX_REWARD_006":{"address":5729378,"default_item":3,"flag":0},"POKEDEX_REWARD_007":{"address":5729380,"default_item":3,"flag":0},"POKEDEX_REWARD_008":{"address":5729382,"default_item":3,"flag":0},"POKEDEX_REWARD_009":{"address":5729384,"default_item":3,"flag":0},"POKEDEX_REWARD_010":{"address":5729386,"default_item":3,"flag":0},"POKEDEX_REWARD_011":{"address":5729388,"default_item":3,"flag":0},"POKEDEX_REWARD_012":{"address":5729390,"default_item":3,"flag":0},"POKEDEX_REWARD_013":{"address":5729392,"default_item":3,"flag":0},"POKEDEX_REWARD_014":{"address":5729394,"default_item":3,"flag":0},"POKEDEX_REWARD_015":{"address":5729396,"default_item":3,"flag":0},"POKEDEX_REWARD_016":{"address":5729398,"default_item":3,"flag":0},"POKEDEX_REWARD_017":{"address":5729400,"default_item":3,"flag":0},"POKEDEX_REWARD_018":{"address":5729402,"default_item":3,"flag":0},"POKEDEX_REWARD_019":{"address":5729404,"default_item":3,"flag":0},"POKEDEX_REWARD_020":{"address":5729406,"default_item":3,"flag":0},"POKEDEX_REWARD_021":{"address":5729408,"default_item":3,"flag":0},"POKEDEX_REWARD_022":{"address":5729410,"default_item":3,"flag":0},"POKEDEX_REWARD_023":{"address":5729412,"default_item":3,"flag":0},"POKEDEX_REWARD_024":{"address":5729414,"default_item":3,"flag":0},"POKEDEX_REWARD_025":{"address":5729416,"default_item":3,"flag":0},"POKEDEX_REWARD_026":{"address":5729418,"default_item":3,"flag":0},"POKEDEX_REWARD_027":{"address":5729420,"default_item":3,"flag":0},"POKEDEX_REWARD_028":{"address":5729422,"default_item":3,"flag":0},"POKEDEX_REWARD_029":{"address":5729424,"default_item":3,"flag":0},"POKEDEX_REWARD_030":{"address":5729426,"default_item":3,"flag":0},"POKEDEX_REWARD_031":{"address":5729428,"default_item":3,"flag":0},"POKEDEX_REWARD_032":{"address":5729430,"default_item":3,"flag":0},"POKEDEX_REWARD_033":{"address":5729432,"default_item":3,"flag":0},"POKEDEX_REWARD_034":{"address":5729434,"default_item":3,"flag":0},"POKEDEX_REWARD_035":{"address":5729436,"default_item":3,"flag":0},"POKEDEX_REWARD_036":{"address":5729438,"default_item":3,"flag":0},"POKEDEX_REWARD_037":{"address":5729440,"default_item":3,"flag":0},"POKEDEX_REWARD_038":{"address":5729442,"default_item":3,"flag":0},"POKEDEX_REWARD_039":{"address":5729444,"default_item":3,"flag":0},"POKEDEX_REWARD_040":{"address":5729446,"default_item":3,"flag":0},"POKEDEX_REWARD_041":{"address":5729448,"default_item":3,"flag":0},"POKEDEX_REWARD_042":{"address":5729450,"default_item":3,"flag":0},"POKEDEX_REWARD_043":{"address":5729452,"default_item":3,"flag":0},"POKEDEX_REWARD_044":{"address":5729454,"default_item":3,"flag":0},"POKEDEX_REWARD_045":{"address":5729456,"default_item":3,"flag":0},"POKEDEX_REWARD_046":{"address":5729458,"default_item":3,"flag":0},"POKEDEX_REWARD_047":{"address":5729460,"default_item":3,"flag":0},"POKEDEX_REWARD_048":{"address":5729462,"default_item":3,"flag":0},"POKEDEX_REWARD_049":{"address":5729464,"default_item":3,"flag":0},"POKEDEX_REWARD_050":{"address":5729466,"default_item":3,"flag":0},"POKEDEX_REWARD_051":{"address":5729468,"default_item":3,"flag":0},"POKEDEX_REWARD_052":{"address":5729470,"default_item":3,"flag":0},"POKEDEX_REWARD_053":{"address":5729472,"default_item":3,"flag":0},"POKEDEX_REWARD_054":{"address":5729474,"default_item":3,"flag":0},"POKEDEX_REWARD_055":{"address":5729476,"default_item":3,"flag":0},"POKEDEX_REWARD_056":{"address":5729478,"default_item":3,"flag":0},"POKEDEX_REWARD_057":{"address":5729480,"default_item":3,"flag":0},"POKEDEX_REWARD_058":{"address":5729482,"default_item":3,"flag":0},"POKEDEX_REWARD_059":{"address":5729484,"default_item":3,"flag":0},"POKEDEX_REWARD_060":{"address":5729486,"default_item":3,"flag":0},"POKEDEX_REWARD_061":{"address":5729488,"default_item":3,"flag":0},"POKEDEX_REWARD_062":{"address":5729490,"default_item":3,"flag":0},"POKEDEX_REWARD_063":{"address":5729492,"default_item":3,"flag":0},"POKEDEX_REWARD_064":{"address":5729494,"default_item":3,"flag":0},"POKEDEX_REWARD_065":{"address":5729496,"default_item":3,"flag":0},"POKEDEX_REWARD_066":{"address":5729498,"default_item":3,"flag":0},"POKEDEX_REWARD_067":{"address":5729500,"default_item":3,"flag":0},"POKEDEX_REWARD_068":{"address":5729502,"default_item":3,"flag":0},"POKEDEX_REWARD_069":{"address":5729504,"default_item":3,"flag":0},"POKEDEX_REWARD_070":{"address":5729506,"default_item":3,"flag":0},"POKEDEX_REWARD_071":{"address":5729508,"default_item":3,"flag":0},"POKEDEX_REWARD_072":{"address":5729510,"default_item":3,"flag":0},"POKEDEX_REWARD_073":{"address":5729512,"default_item":3,"flag":0},"POKEDEX_REWARD_074":{"address":5729514,"default_item":3,"flag":0},"POKEDEX_REWARD_075":{"address":5729516,"default_item":3,"flag":0},"POKEDEX_REWARD_076":{"address":5729518,"default_item":3,"flag":0},"POKEDEX_REWARD_077":{"address":5729520,"default_item":3,"flag":0},"POKEDEX_REWARD_078":{"address":5729522,"default_item":3,"flag":0},"POKEDEX_REWARD_079":{"address":5729524,"default_item":3,"flag":0},"POKEDEX_REWARD_080":{"address":5729526,"default_item":3,"flag":0},"POKEDEX_REWARD_081":{"address":5729528,"default_item":3,"flag":0},"POKEDEX_REWARD_082":{"address":5729530,"default_item":3,"flag":0},"POKEDEX_REWARD_083":{"address":5729532,"default_item":3,"flag":0},"POKEDEX_REWARD_084":{"address":5729534,"default_item":3,"flag":0},"POKEDEX_REWARD_085":{"address":5729536,"default_item":3,"flag":0},"POKEDEX_REWARD_086":{"address":5729538,"default_item":3,"flag":0},"POKEDEX_REWARD_087":{"address":5729540,"default_item":3,"flag":0},"POKEDEX_REWARD_088":{"address":5729542,"default_item":3,"flag":0},"POKEDEX_REWARD_089":{"address":5729544,"default_item":3,"flag":0},"POKEDEX_REWARD_090":{"address":5729546,"default_item":3,"flag":0},"POKEDEX_REWARD_091":{"address":5729548,"default_item":3,"flag":0},"POKEDEX_REWARD_092":{"address":5729550,"default_item":3,"flag":0},"POKEDEX_REWARD_093":{"address":5729552,"default_item":3,"flag":0},"POKEDEX_REWARD_094":{"address":5729554,"default_item":3,"flag":0},"POKEDEX_REWARD_095":{"address":5729556,"default_item":3,"flag":0},"POKEDEX_REWARD_096":{"address":5729558,"default_item":3,"flag":0},"POKEDEX_REWARD_097":{"address":5729560,"default_item":3,"flag":0},"POKEDEX_REWARD_098":{"address":5729562,"default_item":3,"flag":0},"POKEDEX_REWARD_099":{"address":5729564,"default_item":3,"flag":0},"POKEDEX_REWARD_100":{"address":5729566,"default_item":3,"flag":0},"POKEDEX_REWARD_101":{"address":5729568,"default_item":3,"flag":0},"POKEDEX_REWARD_102":{"address":5729570,"default_item":3,"flag":0},"POKEDEX_REWARD_103":{"address":5729572,"default_item":3,"flag":0},"POKEDEX_REWARD_104":{"address":5729574,"default_item":3,"flag":0},"POKEDEX_REWARD_105":{"address":5729576,"default_item":3,"flag":0},"POKEDEX_REWARD_106":{"address":5729578,"default_item":3,"flag":0},"POKEDEX_REWARD_107":{"address":5729580,"default_item":3,"flag":0},"POKEDEX_REWARD_108":{"address":5729582,"default_item":3,"flag":0},"POKEDEX_REWARD_109":{"address":5729584,"default_item":3,"flag":0},"POKEDEX_REWARD_110":{"address":5729586,"default_item":3,"flag":0},"POKEDEX_REWARD_111":{"address":5729588,"default_item":3,"flag":0},"POKEDEX_REWARD_112":{"address":5729590,"default_item":3,"flag":0},"POKEDEX_REWARD_113":{"address":5729592,"default_item":3,"flag":0},"POKEDEX_REWARD_114":{"address":5729594,"default_item":3,"flag":0},"POKEDEX_REWARD_115":{"address":5729596,"default_item":3,"flag":0},"POKEDEX_REWARD_116":{"address":5729598,"default_item":3,"flag":0},"POKEDEX_REWARD_117":{"address":5729600,"default_item":3,"flag":0},"POKEDEX_REWARD_118":{"address":5729602,"default_item":3,"flag":0},"POKEDEX_REWARD_119":{"address":5729604,"default_item":3,"flag":0},"POKEDEX_REWARD_120":{"address":5729606,"default_item":3,"flag":0},"POKEDEX_REWARD_121":{"address":5729608,"default_item":3,"flag":0},"POKEDEX_REWARD_122":{"address":5729610,"default_item":3,"flag":0},"POKEDEX_REWARD_123":{"address":5729612,"default_item":3,"flag":0},"POKEDEX_REWARD_124":{"address":5729614,"default_item":3,"flag":0},"POKEDEX_REWARD_125":{"address":5729616,"default_item":3,"flag":0},"POKEDEX_REWARD_126":{"address":5729618,"default_item":3,"flag":0},"POKEDEX_REWARD_127":{"address":5729620,"default_item":3,"flag":0},"POKEDEX_REWARD_128":{"address":5729622,"default_item":3,"flag":0},"POKEDEX_REWARD_129":{"address":5729624,"default_item":3,"flag":0},"POKEDEX_REWARD_130":{"address":5729626,"default_item":3,"flag":0},"POKEDEX_REWARD_131":{"address":5729628,"default_item":3,"flag":0},"POKEDEX_REWARD_132":{"address":5729630,"default_item":3,"flag":0},"POKEDEX_REWARD_133":{"address":5729632,"default_item":3,"flag":0},"POKEDEX_REWARD_134":{"address":5729634,"default_item":3,"flag":0},"POKEDEX_REWARD_135":{"address":5729636,"default_item":3,"flag":0},"POKEDEX_REWARD_136":{"address":5729638,"default_item":3,"flag":0},"POKEDEX_REWARD_137":{"address":5729640,"default_item":3,"flag":0},"POKEDEX_REWARD_138":{"address":5729642,"default_item":3,"flag":0},"POKEDEX_REWARD_139":{"address":5729644,"default_item":3,"flag":0},"POKEDEX_REWARD_140":{"address":5729646,"default_item":3,"flag":0},"POKEDEX_REWARD_141":{"address":5729648,"default_item":3,"flag":0},"POKEDEX_REWARD_142":{"address":5729650,"default_item":3,"flag":0},"POKEDEX_REWARD_143":{"address":5729652,"default_item":3,"flag":0},"POKEDEX_REWARD_144":{"address":5729654,"default_item":3,"flag":0},"POKEDEX_REWARD_145":{"address":5729656,"default_item":3,"flag":0},"POKEDEX_REWARD_146":{"address":5729658,"default_item":3,"flag":0},"POKEDEX_REWARD_147":{"address":5729660,"default_item":3,"flag":0},"POKEDEX_REWARD_148":{"address":5729662,"default_item":3,"flag":0},"POKEDEX_REWARD_149":{"address":5729664,"default_item":3,"flag":0},"POKEDEX_REWARD_150":{"address":5729666,"default_item":3,"flag":0},"POKEDEX_REWARD_151":{"address":5729668,"default_item":3,"flag":0},"POKEDEX_REWARD_152":{"address":5729670,"default_item":3,"flag":0},"POKEDEX_REWARD_153":{"address":5729672,"default_item":3,"flag":0},"POKEDEX_REWARD_154":{"address":5729674,"default_item":3,"flag":0},"POKEDEX_REWARD_155":{"address":5729676,"default_item":3,"flag":0},"POKEDEX_REWARD_156":{"address":5729678,"default_item":3,"flag":0},"POKEDEX_REWARD_157":{"address":5729680,"default_item":3,"flag":0},"POKEDEX_REWARD_158":{"address":5729682,"default_item":3,"flag":0},"POKEDEX_REWARD_159":{"address":5729684,"default_item":3,"flag":0},"POKEDEX_REWARD_160":{"address":5729686,"default_item":3,"flag":0},"POKEDEX_REWARD_161":{"address":5729688,"default_item":3,"flag":0},"POKEDEX_REWARD_162":{"address":5729690,"default_item":3,"flag":0},"POKEDEX_REWARD_163":{"address":5729692,"default_item":3,"flag":0},"POKEDEX_REWARD_164":{"address":5729694,"default_item":3,"flag":0},"POKEDEX_REWARD_165":{"address":5729696,"default_item":3,"flag":0},"POKEDEX_REWARD_166":{"address":5729698,"default_item":3,"flag":0},"POKEDEX_REWARD_167":{"address":5729700,"default_item":3,"flag":0},"POKEDEX_REWARD_168":{"address":5729702,"default_item":3,"flag":0},"POKEDEX_REWARD_169":{"address":5729704,"default_item":3,"flag":0},"POKEDEX_REWARD_170":{"address":5729706,"default_item":3,"flag":0},"POKEDEX_REWARD_171":{"address":5729708,"default_item":3,"flag":0},"POKEDEX_REWARD_172":{"address":5729710,"default_item":3,"flag":0},"POKEDEX_REWARD_173":{"address":5729712,"default_item":3,"flag":0},"POKEDEX_REWARD_174":{"address":5729714,"default_item":3,"flag":0},"POKEDEX_REWARD_175":{"address":5729716,"default_item":3,"flag":0},"POKEDEX_REWARD_176":{"address":5729718,"default_item":3,"flag":0},"POKEDEX_REWARD_177":{"address":5729720,"default_item":3,"flag":0},"POKEDEX_REWARD_178":{"address":5729722,"default_item":3,"flag":0},"POKEDEX_REWARD_179":{"address":5729724,"default_item":3,"flag":0},"POKEDEX_REWARD_180":{"address":5729726,"default_item":3,"flag":0},"POKEDEX_REWARD_181":{"address":5729728,"default_item":3,"flag":0},"POKEDEX_REWARD_182":{"address":5729730,"default_item":3,"flag":0},"POKEDEX_REWARD_183":{"address":5729732,"default_item":3,"flag":0},"POKEDEX_REWARD_184":{"address":5729734,"default_item":3,"flag":0},"POKEDEX_REWARD_185":{"address":5729736,"default_item":3,"flag":0},"POKEDEX_REWARD_186":{"address":5729738,"default_item":3,"flag":0},"POKEDEX_REWARD_187":{"address":5729740,"default_item":3,"flag":0},"POKEDEX_REWARD_188":{"address":5729742,"default_item":3,"flag":0},"POKEDEX_REWARD_189":{"address":5729744,"default_item":3,"flag":0},"POKEDEX_REWARD_190":{"address":5729746,"default_item":3,"flag":0},"POKEDEX_REWARD_191":{"address":5729748,"default_item":3,"flag":0},"POKEDEX_REWARD_192":{"address":5729750,"default_item":3,"flag":0},"POKEDEX_REWARD_193":{"address":5729752,"default_item":3,"flag":0},"POKEDEX_REWARD_194":{"address":5729754,"default_item":3,"flag":0},"POKEDEX_REWARD_195":{"address":5729756,"default_item":3,"flag":0},"POKEDEX_REWARD_196":{"address":5729758,"default_item":3,"flag":0},"POKEDEX_REWARD_197":{"address":5729760,"default_item":3,"flag":0},"POKEDEX_REWARD_198":{"address":5729762,"default_item":3,"flag":0},"POKEDEX_REWARD_199":{"address":5729764,"default_item":3,"flag":0},"POKEDEX_REWARD_200":{"address":5729766,"default_item":3,"flag":0},"POKEDEX_REWARD_201":{"address":5729768,"default_item":3,"flag":0},"POKEDEX_REWARD_202":{"address":5729770,"default_item":3,"flag":0},"POKEDEX_REWARD_203":{"address":5729772,"default_item":3,"flag":0},"POKEDEX_REWARD_204":{"address":5729774,"default_item":3,"flag":0},"POKEDEX_REWARD_205":{"address":5729776,"default_item":3,"flag":0},"POKEDEX_REWARD_206":{"address":5729778,"default_item":3,"flag":0},"POKEDEX_REWARD_207":{"address":5729780,"default_item":3,"flag":0},"POKEDEX_REWARD_208":{"address":5729782,"default_item":3,"flag":0},"POKEDEX_REWARD_209":{"address":5729784,"default_item":3,"flag":0},"POKEDEX_REWARD_210":{"address":5729786,"default_item":3,"flag":0},"POKEDEX_REWARD_211":{"address":5729788,"default_item":3,"flag":0},"POKEDEX_REWARD_212":{"address":5729790,"default_item":3,"flag":0},"POKEDEX_REWARD_213":{"address":5729792,"default_item":3,"flag":0},"POKEDEX_REWARD_214":{"address":5729794,"default_item":3,"flag":0},"POKEDEX_REWARD_215":{"address":5729796,"default_item":3,"flag":0},"POKEDEX_REWARD_216":{"address":5729798,"default_item":3,"flag":0},"POKEDEX_REWARD_217":{"address":5729800,"default_item":3,"flag":0},"POKEDEX_REWARD_218":{"address":5729802,"default_item":3,"flag":0},"POKEDEX_REWARD_219":{"address":5729804,"default_item":3,"flag":0},"POKEDEX_REWARD_220":{"address":5729806,"default_item":3,"flag":0},"POKEDEX_REWARD_221":{"address":5729808,"default_item":3,"flag":0},"POKEDEX_REWARD_222":{"address":5729810,"default_item":3,"flag":0},"POKEDEX_REWARD_223":{"address":5729812,"default_item":3,"flag":0},"POKEDEX_REWARD_224":{"address":5729814,"default_item":3,"flag":0},"POKEDEX_REWARD_225":{"address":5729816,"default_item":3,"flag":0},"POKEDEX_REWARD_226":{"address":5729818,"default_item":3,"flag":0},"POKEDEX_REWARD_227":{"address":5729820,"default_item":3,"flag":0},"POKEDEX_REWARD_228":{"address":5729822,"default_item":3,"flag":0},"POKEDEX_REWARD_229":{"address":5729824,"default_item":3,"flag":0},"POKEDEX_REWARD_230":{"address":5729826,"default_item":3,"flag":0},"POKEDEX_REWARD_231":{"address":5729828,"default_item":3,"flag":0},"POKEDEX_REWARD_232":{"address":5729830,"default_item":3,"flag":0},"POKEDEX_REWARD_233":{"address":5729832,"default_item":3,"flag":0},"POKEDEX_REWARD_234":{"address":5729834,"default_item":3,"flag":0},"POKEDEX_REWARD_235":{"address":5729836,"default_item":3,"flag":0},"POKEDEX_REWARD_236":{"address":5729838,"default_item":3,"flag":0},"POKEDEX_REWARD_237":{"address":5729840,"default_item":3,"flag":0},"POKEDEX_REWARD_238":{"address":5729842,"default_item":3,"flag":0},"POKEDEX_REWARD_239":{"address":5729844,"default_item":3,"flag":0},"POKEDEX_REWARD_240":{"address":5729846,"default_item":3,"flag":0},"POKEDEX_REWARD_241":{"address":5729848,"default_item":3,"flag":0},"POKEDEX_REWARD_242":{"address":5729850,"default_item":3,"flag":0},"POKEDEX_REWARD_243":{"address":5729852,"default_item":3,"flag":0},"POKEDEX_REWARD_244":{"address":5729854,"default_item":3,"flag":0},"POKEDEX_REWARD_245":{"address":5729856,"default_item":3,"flag":0},"POKEDEX_REWARD_246":{"address":5729858,"default_item":3,"flag":0},"POKEDEX_REWARD_247":{"address":5729860,"default_item":3,"flag":0},"POKEDEX_REWARD_248":{"address":5729862,"default_item":3,"flag":0},"POKEDEX_REWARD_249":{"address":5729864,"default_item":3,"flag":0},"POKEDEX_REWARD_250":{"address":5729866,"default_item":3,"flag":0},"POKEDEX_REWARD_251":{"address":5729868,"default_item":3,"flag":0},"POKEDEX_REWARD_252":{"address":5729870,"default_item":3,"flag":0},"POKEDEX_REWARD_253":{"address":5729872,"default_item":3,"flag":0},"POKEDEX_REWARD_254":{"address":5729874,"default_item":3,"flag":0},"POKEDEX_REWARD_255":{"address":5729876,"default_item":3,"flag":0},"POKEDEX_REWARD_256":{"address":5729878,"default_item":3,"flag":0},"POKEDEX_REWARD_257":{"address":5729880,"default_item":3,"flag":0},"POKEDEX_REWARD_258":{"address":5729882,"default_item":3,"flag":0},"POKEDEX_REWARD_259":{"address":5729884,"default_item":3,"flag":0},"POKEDEX_REWARD_260":{"address":5729886,"default_item":3,"flag":0},"POKEDEX_REWARD_261":{"address":5729888,"default_item":3,"flag":0},"POKEDEX_REWARD_262":{"address":5729890,"default_item":3,"flag":0},"POKEDEX_REWARD_263":{"address":5729892,"default_item":3,"flag":0},"POKEDEX_REWARD_264":{"address":5729894,"default_item":3,"flag":0},"POKEDEX_REWARD_265":{"address":5729896,"default_item":3,"flag":0},"POKEDEX_REWARD_266":{"address":5729898,"default_item":3,"flag":0},"POKEDEX_REWARD_267":{"address":5729900,"default_item":3,"flag":0},"POKEDEX_REWARD_268":{"address":5729902,"default_item":3,"flag":0},"POKEDEX_REWARD_269":{"address":5729904,"default_item":3,"flag":0},"POKEDEX_REWARD_270":{"address":5729906,"default_item":3,"flag":0},"POKEDEX_REWARD_271":{"address":5729908,"default_item":3,"flag":0},"POKEDEX_REWARD_272":{"address":5729910,"default_item":3,"flag":0},"POKEDEX_REWARD_273":{"address":5729912,"default_item":3,"flag":0},"POKEDEX_REWARD_274":{"address":5729914,"default_item":3,"flag":0},"POKEDEX_REWARD_275":{"address":5729916,"default_item":3,"flag":0},"POKEDEX_REWARD_276":{"address":5729918,"default_item":3,"flag":0},"POKEDEX_REWARD_277":{"address":5729920,"default_item":3,"flag":0},"POKEDEX_REWARD_278":{"address":5729922,"default_item":3,"flag":0},"POKEDEX_REWARD_279":{"address":5729924,"default_item":3,"flag":0},"POKEDEX_REWARD_280":{"address":5729926,"default_item":3,"flag":0},"POKEDEX_REWARD_281":{"address":5729928,"default_item":3,"flag":0},"POKEDEX_REWARD_282":{"address":5729930,"default_item":3,"flag":0},"POKEDEX_REWARD_283":{"address":5729932,"default_item":3,"flag":0},"POKEDEX_REWARD_284":{"address":5729934,"default_item":3,"flag":0},"POKEDEX_REWARD_285":{"address":5729936,"default_item":3,"flag":0},"POKEDEX_REWARD_286":{"address":5729938,"default_item":3,"flag":0},"POKEDEX_REWARD_287":{"address":5729940,"default_item":3,"flag":0},"POKEDEX_REWARD_288":{"address":5729942,"default_item":3,"flag":0},"POKEDEX_REWARD_289":{"address":5729944,"default_item":3,"flag":0},"POKEDEX_REWARD_290":{"address":5729946,"default_item":3,"flag":0},"POKEDEX_REWARD_291":{"address":5729948,"default_item":3,"flag":0},"POKEDEX_REWARD_292":{"address":5729950,"default_item":3,"flag":0},"POKEDEX_REWARD_293":{"address":5729952,"default_item":3,"flag":0},"POKEDEX_REWARD_294":{"address":5729954,"default_item":3,"flag":0},"POKEDEX_REWARD_295":{"address":5729956,"default_item":3,"flag":0},"POKEDEX_REWARD_296":{"address":5729958,"default_item":3,"flag":0},"POKEDEX_REWARD_297":{"address":5729960,"default_item":3,"flag":0},"POKEDEX_REWARD_298":{"address":5729962,"default_item":3,"flag":0},"POKEDEX_REWARD_299":{"address":5729964,"default_item":3,"flag":0},"POKEDEX_REWARD_300":{"address":5729966,"default_item":3,"flag":0},"POKEDEX_REWARD_301":{"address":5729968,"default_item":3,"flag":0},"POKEDEX_REWARD_302":{"address":5729970,"default_item":3,"flag":0},"POKEDEX_REWARD_303":{"address":5729972,"default_item":3,"flag":0},"POKEDEX_REWARD_304":{"address":5729974,"default_item":3,"flag":0},"POKEDEX_REWARD_305":{"address":5729976,"default_item":3,"flag":0},"POKEDEX_REWARD_306":{"address":5729978,"default_item":3,"flag":0},"POKEDEX_REWARD_307":{"address":5729980,"default_item":3,"flag":0},"POKEDEX_REWARD_308":{"address":5729982,"default_item":3,"flag":0},"POKEDEX_REWARD_309":{"address":5729984,"default_item":3,"flag":0},"POKEDEX_REWARD_310":{"address":5729986,"default_item":3,"flag":0},"POKEDEX_REWARD_311":{"address":5729988,"default_item":3,"flag":0},"POKEDEX_REWARD_312":{"address":5729990,"default_item":3,"flag":0},"POKEDEX_REWARD_313":{"address":5729992,"default_item":3,"flag":0},"POKEDEX_REWARD_314":{"address":5729994,"default_item":3,"flag":0},"POKEDEX_REWARD_315":{"address":5729996,"default_item":3,"flag":0},"POKEDEX_REWARD_316":{"address":5729998,"default_item":3,"flag":0},"POKEDEX_REWARD_317":{"address":5730000,"default_item":3,"flag":0},"POKEDEX_REWARD_318":{"address":5730002,"default_item":3,"flag":0},"POKEDEX_REWARD_319":{"address":5730004,"default_item":3,"flag":0},"POKEDEX_REWARD_320":{"address":5730006,"default_item":3,"flag":0},"POKEDEX_REWARD_321":{"address":5730008,"default_item":3,"flag":0},"POKEDEX_REWARD_322":{"address":5730010,"default_item":3,"flag":0},"POKEDEX_REWARD_323":{"address":5730012,"default_item":3,"flag":0},"POKEDEX_REWARD_324":{"address":5730014,"default_item":3,"flag":0},"POKEDEX_REWARD_325":{"address":5730016,"default_item":3,"flag":0},"POKEDEX_REWARD_326":{"address":5730018,"default_item":3,"flag":0},"POKEDEX_REWARD_327":{"address":5730020,"default_item":3,"flag":0},"POKEDEX_REWARD_328":{"address":5730022,"default_item":3,"flag":0},"POKEDEX_REWARD_329":{"address":5730024,"default_item":3,"flag":0},"POKEDEX_REWARD_330":{"address":5730026,"default_item":3,"flag":0},"POKEDEX_REWARD_331":{"address":5730028,"default_item":3,"flag":0},"POKEDEX_REWARD_332":{"address":5730030,"default_item":3,"flag":0},"POKEDEX_REWARD_333":{"address":5730032,"default_item":3,"flag":0},"POKEDEX_REWARD_334":{"address":5730034,"default_item":3,"flag":0},"POKEDEX_REWARD_335":{"address":5730036,"default_item":3,"flag":0},"POKEDEX_REWARD_336":{"address":5730038,"default_item":3,"flag":0},"POKEDEX_REWARD_337":{"address":5730040,"default_item":3,"flag":0},"POKEDEX_REWARD_338":{"address":5730042,"default_item":3,"flag":0},"POKEDEX_REWARD_339":{"address":5730044,"default_item":3,"flag":0},"POKEDEX_REWARD_340":{"address":5730046,"default_item":3,"flag":0},"POKEDEX_REWARD_341":{"address":5730048,"default_item":3,"flag":0},"POKEDEX_REWARD_342":{"address":5730050,"default_item":3,"flag":0},"POKEDEX_REWARD_343":{"address":5730052,"default_item":3,"flag":0},"POKEDEX_REWARD_344":{"address":5730054,"default_item":3,"flag":0},"POKEDEX_REWARD_345":{"address":5730056,"default_item":3,"flag":0},"POKEDEX_REWARD_346":{"address":5730058,"default_item":3,"flag":0},"POKEDEX_REWARD_347":{"address":5730060,"default_item":3,"flag":0},"POKEDEX_REWARD_348":{"address":5730062,"default_item":3,"flag":0},"POKEDEX_REWARD_349":{"address":5730064,"default_item":3,"flag":0},"POKEDEX_REWARD_350":{"address":5730066,"default_item":3,"flag":0},"POKEDEX_REWARD_351":{"address":5730068,"default_item":3,"flag":0},"POKEDEX_REWARD_352":{"address":5730070,"default_item":3,"flag":0},"POKEDEX_REWARD_353":{"address":5730072,"default_item":3,"flag":0},"POKEDEX_REWARD_354":{"address":5730074,"default_item":3,"flag":0},"POKEDEX_REWARD_355":{"address":5730076,"default_item":3,"flag":0},"POKEDEX_REWARD_356":{"address":5730078,"default_item":3,"flag":0},"POKEDEX_REWARD_357":{"address":5730080,"default_item":3,"flag":0},"POKEDEX_REWARD_358":{"address":5730082,"default_item":3,"flag":0},"POKEDEX_REWARD_359":{"address":5730084,"default_item":3,"flag":0},"POKEDEX_REWARD_360":{"address":5730086,"default_item":3,"flag":0},"POKEDEX_REWARD_361":{"address":5730088,"default_item":3,"flag":0},"POKEDEX_REWARD_362":{"address":5730090,"default_item":3,"flag":0},"POKEDEX_REWARD_363":{"address":5730092,"default_item":3,"flag":0},"POKEDEX_REWARD_364":{"address":5730094,"default_item":3,"flag":0},"POKEDEX_REWARD_365":{"address":5730096,"default_item":3,"flag":0},"POKEDEX_REWARD_366":{"address":5730098,"default_item":3,"flag":0},"POKEDEX_REWARD_367":{"address":5730100,"default_item":3,"flag":0},"POKEDEX_REWARD_368":{"address":5730102,"default_item":3,"flag":0},"POKEDEX_REWARD_369":{"address":5730104,"default_item":3,"flag":0},"POKEDEX_REWARD_370":{"address":5730106,"default_item":3,"flag":0},"POKEDEX_REWARD_371":{"address":5730108,"default_item":3,"flag":0},"POKEDEX_REWARD_372":{"address":5730110,"default_item":3,"flag":0},"POKEDEX_REWARD_373":{"address":5730112,"default_item":3,"flag":0},"POKEDEX_REWARD_374":{"address":5730114,"default_item":3,"flag":0},"POKEDEX_REWARD_375":{"address":5730116,"default_item":3,"flag":0},"POKEDEX_REWARD_376":{"address":5730118,"default_item":3,"flag":0},"POKEDEX_REWARD_377":{"address":5730120,"default_item":3,"flag":0},"POKEDEX_REWARD_378":{"address":5730122,"default_item":3,"flag":0},"POKEDEX_REWARD_379":{"address":5730124,"default_item":3,"flag":0},"POKEDEX_REWARD_380":{"address":5730126,"default_item":3,"flag":0},"POKEDEX_REWARD_381":{"address":5730128,"default_item":3,"flag":0},"POKEDEX_REWARD_382":{"address":5730130,"default_item":3,"flag":0},"POKEDEX_REWARD_383":{"address":5730132,"default_item":3,"flag":0},"POKEDEX_REWARD_384":{"address":5730134,"default_item":3,"flag":0},"POKEDEX_REWARD_385":{"address":5730136,"default_item":3,"flag":0},"POKEDEX_REWARD_386":{"address":5730138,"default_item":3,"flag":0},"TRAINER_AARON_REWARD":{"address":5602878,"default_item":104,"flag":1677},"TRAINER_ABIGAIL_1_REWARD":{"address":5602800,"default_item":106,"flag":1638},"TRAINER_AIDAN_REWARD":{"address":5603432,"default_item":104,"flag":1954},"TRAINER_AISHA_REWARD":{"address":5603598,"default_item":106,"flag":2037},"TRAINER_ALBERTO_REWARD":{"address":5602108,"default_item":108,"flag":1292},"TRAINER_ALBERT_REWARD":{"address":5602244,"default_item":104,"flag":1360},"TRAINER_ALEXA_REWARD":{"address":5603424,"default_item":104,"flag":1950},"TRAINER_ALEXIA_REWARD":{"address":5602264,"default_item":104,"flag":1370},"TRAINER_ALEX_REWARD":{"address":5602910,"default_item":104,"flag":1693},"TRAINER_ALICE_REWARD":{"address":5602980,"default_item":103,"flag":1728},"TRAINER_ALIX_REWARD":{"address":5603584,"default_item":106,"flag":2030},"TRAINER_ALLEN_REWARD":{"address":5602750,"default_item":103,"flag":1613},"TRAINER_ALLISON_REWARD":{"address":5602858,"default_item":104,"flag":1667},"TRAINER_ALYSSA_REWARD":{"address":5603486,"default_item":106,"flag":1981},"TRAINER_AMY_AND_LIV_1_REWARD":{"address":5603046,"default_item":103,"flag":1761},"TRAINER_ANDREA_REWARD":{"address":5603310,"default_item":106,"flag":1893},"TRAINER_ANDRES_1_REWARD":{"address":5603558,"default_item":104,"flag":2017},"TRAINER_ANDREW_REWARD":{"address":5602756,"default_item":106,"flag":1616},"TRAINER_ANGELICA_REWARD":{"address":5602956,"default_item":104,"flag":1716},"TRAINER_ANGELINA_REWARD":{"address":5603508,"default_item":106,"flag":1992},"TRAINER_ANGELO_REWARD":{"address":5603688,"default_item":104,"flag":2082},"TRAINER_ANNA_AND_MEG_1_REWARD":{"address":5602658,"default_item":106,"flag":1567},"TRAINER_ANNIKA_REWARD":{"address":5603088,"default_item":107,"flag":1782},"TRAINER_ANTHONY_REWARD":{"address":5602788,"default_item":106,"flag":1632},"TRAINER_ARCHIE_REWARD":{"address":5602152,"default_item":107,"flag":1314},"TRAINER_ASHLEY_REWARD":{"address":5603394,"default_item":106,"flag":1935},"TRAINER_ATHENA_REWARD":{"address":5603238,"default_item":104,"flag":1857},"TRAINER_ATSUSHI_REWARD":{"address":5602464,"default_item":104,"flag":1470},"TRAINER_AURON_REWARD":{"address":5603096,"default_item":104,"flag":1786},"TRAINER_AUSTINA_REWARD":{"address":5602200,"default_item":103,"flag":1338},"TRAINER_AUTUMN_REWARD":{"address":5602518,"default_item":106,"flag":1497},"TRAINER_AXLE_REWARD":{"address":5602490,"default_item":108,"flag":1483},"TRAINER_BARNY_REWARD":{"address":5602770,"default_item":104,"flag":1623},"TRAINER_BARRY_REWARD":{"address":5602410,"default_item":106,"flag":1443},"TRAINER_BEAU_REWARD":{"address":5602508,"default_item":106,"flag":1492},"TRAINER_BECKY_REWARD":{"address":5603024,"default_item":106,"flag":1750},"TRAINER_BECK_REWARD":{"address":5602912,"default_item":104,"flag":1694},"TRAINER_BENJAMIN_1_REWARD":{"address":5602790,"default_item":106,"flag":1633},"TRAINER_BEN_REWARD":{"address":5602730,"default_item":106,"flag":1603},"TRAINER_BERKE_REWARD":{"address":5602232,"default_item":104,"flag":1354},"TRAINER_BERNIE_1_REWARD":{"address":5602496,"default_item":106,"flag":1486},"TRAINER_BETHANY_REWARD":{"address":5602686,"default_item":107,"flag":1581},"TRAINER_BETH_REWARD":{"address":5602974,"default_item":103,"flag":1725},"TRAINER_BEVERLY_REWARD":{"address":5602966,"default_item":103,"flag":1721},"TRAINER_BIANCA_REWARD":{"address":5603496,"default_item":106,"flag":1986},"TRAINER_BILLY_REWARD":{"address":5602722,"default_item":103,"flag":1599},"TRAINER_BLAKE_REWARD":{"address":5602554,"default_item":108,"flag":1515},"TRAINER_BRANDEN_REWARD":{"address":5603574,"default_item":106,"flag":2025},"TRAINER_BRANDI_REWARD":{"address":5603596,"default_item":106,"flag":2036},"TRAINER_BRAWLY_1_REWARD":{"address":5602616,"default_item":104,"flag":1546},"TRAINER_BRAXTON_REWARD":{"address":5602234,"default_item":104,"flag":1355},"TRAINER_BRENDAN_LILYCOVE_MUDKIP_REWARD":{"address":5603406,"default_item":104,"flag":1941},"TRAINER_BRENDAN_LILYCOVE_TORCHIC_REWARD":{"address":5603410,"default_item":104,"flag":1943},"TRAINER_BRENDAN_LILYCOVE_TREECKO_REWARD":{"address":5603408,"default_item":104,"flag":1942},"TRAINER_BRENDAN_ROUTE_103_MUDKIP_REWARD":{"address":5603124,"default_item":106,"flag":1800},"TRAINER_BRENDAN_ROUTE_103_TORCHIC_REWARD":{"address":5603136,"default_item":106,"flag":1806},"TRAINER_BRENDAN_ROUTE_103_TREECKO_REWARD":{"address":5603130,"default_item":106,"flag":1803},"TRAINER_BRENDAN_ROUTE_110_MUDKIP_REWARD":{"address":5603126,"default_item":104,"flag":1801},"TRAINER_BRENDAN_ROUTE_110_TORCHIC_REWARD":{"address":5603138,"default_item":104,"flag":1807},"TRAINER_BRENDAN_ROUTE_110_TREECKO_REWARD":{"address":5603132,"default_item":104,"flag":1804},"TRAINER_BRENDAN_ROUTE_119_MUDKIP_REWARD":{"address":5603128,"default_item":104,"flag":1802},"TRAINER_BRENDAN_ROUTE_119_TORCHIC_REWARD":{"address":5603140,"default_item":104,"flag":1808},"TRAINER_BRENDAN_ROUTE_119_TREECKO_REWARD":{"address":5603134,"default_item":104,"flag":1805},"TRAINER_BRENDAN_RUSTBORO_MUDKIP_REWARD":{"address":5603270,"default_item":108,"flag":1873},"TRAINER_BRENDAN_RUSTBORO_TORCHIC_REWARD":{"address":5603282,"default_item":108,"flag":1879},"TRAINER_BRENDAN_RUSTBORO_TREECKO_REWARD":{"address":5603268,"default_item":108,"flag":1872},"TRAINER_BRENDA_REWARD":{"address":5602992,"default_item":106,"flag":1734},"TRAINER_BRENDEN_REWARD":{"address":5603228,"default_item":106,"flag":1852},"TRAINER_BRENT_REWARD":{"address":5602530,"default_item":104,"flag":1503},"TRAINER_BRIANNA_REWARD":{"address":5602320,"default_item":110,"flag":1398},"TRAINER_BRICE_REWARD":{"address":5603336,"default_item":106,"flag":1906},"TRAINER_BRIDGET_REWARD":{"address":5602342,"default_item":107,"flag":1409},"TRAINER_BROOKE_1_REWARD":{"address":5602272,"default_item":108,"flag":1374},"TRAINER_BRYANT_REWARD":{"address":5603576,"default_item":106,"flag":2026},"TRAINER_BRYAN_REWARD":{"address":5603572,"default_item":104,"flag":2024},"TRAINER_CALE_REWARD":{"address":5603612,"default_item":104,"flag":2044},"TRAINER_CALLIE_REWARD":{"address":5603610,"default_item":106,"flag":2043},"TRAINER_CALVIN_1_REWARD":{"address":5602720,"default_item":103,"flag":1598},"TRAINER_CAMDEN_REWARD":{"address":5602832,"default_item":104,"flag":1654},"TRAINER_CAMERON_1_REWARD":{"address":5602560,"default_item":108,"flag":1518},"TRAINER_CAMRON_REWARD":{"address":5603562,"default_item":104,"flag":2019},"TRAINER_CARLEE_REWARD":{"address":5603012,"default_item":106,"flag":1744},"TRAINER_CAROLINA_REWARD":{"address":5603566,"default_item":104,"flag":2021},"TRAINER_CAROLINE_REWARD":{"address":5602282,"default_item":104,"flag":1379},"TRAINER_CAROL_REWARD":{"address":5603026,"default_item":106,"flag":1751},"TRAINER_CARTER_REWARD":{"address":5602774,"default_item":104,"flag":1625},"TRAINER_CATHERINE_1_REWARD":{"address":5603202,"default_item":104,"flag":1839},"TRAINER_CEDRIC_REWARD":{"address":5603034,"default_item":108,"flag":1755},"TRAINER_CELIA_REWARD":{"address":5603570,"default_item":106,"flag":2023},"TRAINER_CELINA_REWARD":{"address":5603494,"default_item":108,"flag":1985},"TRAINER_CHAD_REWARD":{"address":5602432,"default_item":106,"flag":1454},"TRAINER_CHANDLER_REWARD":{"address":5603480,"default_item":103,"flag":1978},"TRAINER_CHARLIE_REWARD":{"address":5602216,"default_item":103,"flag":1346},"TRAINER_CHARLOTTE_REWARD":{"address":5603512,"default_item":106,"flag":1994},"TRAINER_CHASE_REWARD":{"address":5602840,"default_item":104,"flag":1658},"TRAINER_CHESTER_REWARD":{"address":5602900,"default_item":108,"flag":1688},"TRAINER_CHIP_REWARD":{"address":5602174,"default_item":104,"flag":1325},"TRAINER_CHRIS_REWARD":{"address":5603470,"default_item":108,"flag":1973},"TRAINER_CINDY_1_REWARD":{"address":5602312,"default_item":104,"flag":1394},"TRAINER_CLARENCE_REWARD":{"address":5603244,"default_item":106,"flag":1860},"TRAINER_CLARISSA_REWARD":{"address":5602954,"default_item":104,"flag":1715},"TRAINER_CLARK_REWARD":{"address":5603346,"default_item":106,"flag":1911},"TRAINER_CLAUDE_REWARD":{"address":5602760,"default_item":108,"flag":1618},"TRAINER_CLIFFORD_REWARD":{"address":5603252,"default_item":107,"flag":1864},"TRAINER_COBY_REWARD":{"address":5603502,"default_item":106,"flag":1989},"TRAINER_COLE_REWARD":{"address":5602486,"default_item":108,"flag":1481},"TRAINER_COLIN_REWARD":{"address":5602894,"default_item":108,"flag":1685},"TRAINER_COLTON_REWARD":{"address":5602672,"default_item":107,"flag":1574},"TRAINER_CONNIE_REWARD":{"address":5602340,"default_item":107,"flag":1408},"TRAINER_CONOR_REWARD":{"address":5603106,"default_item":104,"flag":1791},"TRAINER_CORY_1_REWARD":{"address":5603564,"default_item":108,"flag":2020},"TRAINER_CRISSY_REWARD":{"address":5603312,"default_item":106,"flag":1894},"TRAINER_CRISTIAN_REWARD":{"address":5603232,"default_item":106,"flag":1854},"TRAINER_CRISTIN_1_REWARD":{"address":5603618,"default_item":104,"flag":2047},"TRAINER_CYNDY_1_REWARD":{"address":5602938,"default_item":106,"flag":1707},"TRAINER_DAISUKE_REWARD":{"address":5602462,"default_item":106,"flag":1469},"TRAINER_DAISY_REWARD":{"address":5602156,"default_item":106,"flag":1316},"TRAINER_DALE_REWARD":{"address":5602766,"default_item":106,"flag":1621},"TRAINER_DALTON_1_REWARD":{"address":5602476,"default_item":106,"flag":1476},"TRAINER_DANA_REWARD":{"address":5603000,"default_item":106,"flag":1738},"TRAINER_DANIELLE_REWARD":{"address":5603384,"default_item":106,"flag":1930},"TRAINER_DAPHNE_REWARD":{"address":5602314,"default_item":110,"flag":1395},"TRAINER_DARCY_REWARD":{"address":5603550,"default_item":104,"flag":2013},"TRAINER_DARIAN_REWARD":{"address":5603476,"default_item":106,"flag":1976},"TRAINER_DARIUS_REWARD":{"address":5603690,"default_item":108,"flag":2083},"TRAINER_DARRIN_REWARD":{"address":5602392,"default_item":103,"flag":1434},"TRAINER_DAVID_REWARD":{"address":5602400,"default_item":103,"flag":1438},"TRAINER_DAVIS_REWARD":{"address":5603162,"default_item":106,"flag":1819},"TRAINER_DAWSON_REWARD":{"address":5603472,"default_item":104,"flag":1974},"TRAINER_DAYTON_REWARD":{"address":5603604,"default_item":108,"flag":2040},"TRAINER_DEANDRE_REWARD":{"address":5603514,"default_item":103,"flag":1995},"TRAINER_DEAN_REWARD":{"address":5602412,"default_item":103,"flag":1444},"TRAINER_DEBRA_REWARD":{"address":5603004,"default_item":106,"flag":1740},"TRAINER_DECLAN_REWARD":{"address":5602114,"default_item":106,"flag":1295},"TRAINER_DEMETRIUS_REWARD":{"address":5602834,"default_item":106,"flag":1655},"TRAINER_DENISE_REWARD":{"address":5602972,"default_item":103,"flag":1724},"TRAINER_DEREK_REWARD":{"address":5602538,"default_item":108,"flag":1507},"TRAINER_DEVAN_REWARD":{"address":5603590,"default_item":106,"flag":2033},"TRAINER_DEZ_AND_LUKE_REWARD":{"address":5603364,"default_item":108,"flag":1920},"TRAINER_DIANA_1_REWARD":{"address":5603032,"default_item":106,"flag":1754},"TRAINER_DIANNE_REWARD":{"address":5602918,"default_item":104,"flag":1697},"TRAINER_DILLON_REWARD":{"address":5602738,"default_item":106,"flag":1607},"TRAINER_DOMINIK_REWARD":{"address":5602388,"default_item":103,"flag":1432},"TRAINER_DONALD_REWARD":{"address":5602532,"default_item":104,"flag":1504},"TRAINER_DONNY_REWARD":{"address":5602852,"default_item":104,"flag":1664},"TRAINER_DOUGLAS_REWARD":{"address":5602390,"default_item":103,"flag":1433},"TRAINER_DOUG_REWARD":{"address":5603320,"default_item":106,"flag":1898},"TRAINER_DRAKE_REWARD":{"address":5602612,"default_item":110,"flag":1544},"TRAINER_DREW_REWARD":{"address":5602506,"default_item":106,"flag":1491},"TRAINER_DUNCAN_REWARD":{"address":5603076,"default_item":108,"flag":1776},"TRAINER_DUSTY_1_REWARD":{"address":5602172,"default_item":104,"flag":1324},"TRAINER_DWAYNE_REWARD":{"address":5603070,"default_item":106,"flag":1773},"TRAINER_DYLAN_1_REWARD":{"address":5602812,"default_item":106,"flag":1644},"TRAINER_EDGAR_REWARD":{"address":5602242,"default_item":104,"flag":1359},"TRAINER_EDMOND_REWARD":{"address":5603066,"default_item":106,"flag":1771},"TRAINER_EDWARDO_REWARD":{"address":5602892,"default_item":108,"flag":1684},"TRAINER_EDWARD_REWARD":{"address":5602548,"default_item":106,"flag":1512},"TRAINER_EDWIN_1_REWARD":{"address":5603108,"default_item":108,"flag":1792},"TRAINER_ED_REWARD":{"address":5602110,"default_item":104,"flag":1293},"TRAINER_ELIJAH_REWARD":{"address":5603568,"default_item":108,"flag":2022},"TRAINER_ELI_REWARD":{"address":5603086,"default_item":108,"flag":1781},"TRAINER_ELLIOT_1_REWARD":{"address":5602762,"default_item":106,"flag":1619},"TRAINER_ERIC_REWARD":{"address":5603348,"default_item":108,"flag":1912},"TRAINER_ERNEST_1_REWARD":{"address":5603068,"default_item":104,"flag":1772},"TRAINER_ETHAN_1_REWARD":{"address":5602516,"default_item":106,"flag":1496},"TRAINER_FABIAN_REWARD":{"address":5603602,"default_item":108,"flag":2039},"TRAINER_FELIX_REWARD":{"address":5602160,"default_item":104,"flag":1318},"TRAINER_FERNANDO_1_REWARD":{"address":5602474,"default_item":108,"flag":1475},"TRAINER_FLANNERY_1_REWARD":{"address":5602620,"default_item":107,"flag":1548},"TRAINER_FLINT_REWARD":{"address":5603392,"default_item":106,"flag":1934},"TRAINER_FOSTER_REWARD":{"address":5602176,"default_item":104,"flag":1326},"TRAINER_FRANKLIN_REWARD":{"address":5602424,"default_item":106,"flag":1450},"TRAINER_FREDRICK_REWARD":{"address":5602142,"default_item":104,"flag":1309},"TRAINER_GABRIELLE_1_REWARD":{"address":5602102,"default_item":104,"flag":1289},"TRAINER_GARRET_REWARD":{"address":5602360,"default_item":110,"flag":1418},"TRAINER_GARRISON_REWARD":{"address":5603178,"default_item":104,"flag":1827},"TRAINER_GEORGE_REWARD":{"address":5602230,"default_item":104,"flag":1353},"TRAINER_GERALD_REWARD":{"address":5603380,"default_item":104,"flag":1928},"TRAINER_GILBERT_REWARD":{"address":5602422,"default_item":106,"flag":1449},"TRAINER_GINA_AND_MIA_1_REWARD":{"address":5603050,"default_item":103,"flag":1763},"TRAINER_GLACIA_REWARD":{"address":5602610,"default_item":110,"flag":1543},"TRAINER_GRACE_REWARD":{"address":5602984,"default_item":106,"flag":1730},"TRAINER_GREG_REWARD":{"address":5603322,"default_item":106,"flag":1899},"TRAINER_GRUNT_AQUA_HIDEOUT_1_REWARD":{"address":5602088,"default_item":106,"flag":1282},"TRAINER_GRUNT_AQUA_HIDEOUT_2_REWARD":{"address":5602090,"default_item":106,"flag":1283},"TRAINER_GRUNT_AQUA_HIDEOUT_3_REWARD":{"address":5602092,"default_item":106,"flag":1284},"TRAINER_GRUNT_AQUA_HIDEOUT_4_REWARD":{"address":5602094,"default_item":106,"flag":1285},"TRAINER_GRUNT_AQUA_HIDEOUT_5_REWARD":{"address":5602138,"default_item":106,"flag":1307},"TRAINER_GRUNT_AQUA_HIDEOUT_6_REWARD":{"address":5602140,"default_item":106,"flag":1308},"TRAINER_GRUNT_AQUA_HIDEOUT_7_REWARD":{"address":5602468,"default_item":106,"flag":1472},"TRAINER_GRUNT_AQUA_HIDEOUT_8_REWARD":{"address":5602470,"default_item":106,"flag":1473},"TRAINER_GRUNT_MAGMA_HIDEOUT_10_REWARD":{"address":5603534,"default_item":106,"flag":2005},"TRAINER_GRUNT_MAGMA_HIDEOUT_11_REWARD":{"address":5603536,"default_item":106,"flag":2006},"TRAINER_GRUNT_MAGMA_HIDEOUT_12_REWARD":{"address":5603538,"default_item":106,"flag":2007},"TRAINER_GRUNT_MAGMA_HIDEOUT_13_REWARD":{"address":5603540,"default_item":106,"flag":2008},"TRAINER_GRUNT_MAGMA_HIDEOUT_14_REWARD":{"address":5603542,"default_item":106,"flag":2009},"TRAINER_GRUNT_MAGMA_HIDEOUT_15_REWARD":{"address":5603544,"default_item":106,"flag":2010},"TRAINER_GRUNT_MAGMA_HIDEOUT_16_REWARD":{"address":5603546,"default_item":106,"flag":2011},"TRAINER_GRUNT_MAGMA_HIDEOUT_1_REWARD":{"address":5603516,"default_item":106,"flag":1996},"TRAINER_GRUNT_MAGMA_HIDEOUT_2_REWARD":{"address":5603518,"default_item":106,"flag":1997},"TRAINER_GRUNT_MAGMA_HIDEOUT_3_REWARD":{"address":5603520,"default_item":106,"flag":1998},"TRAINER_GRUNT_MAGMA_HIDEOUT_4_REWARD":{"address":5603522,"default_item":106,"flag":1999},"TRAINER_GRUNT_MAGMA_HIDEOUT_5_REWARD":{"address":5603524,"default_item":106,"flag":2000},"TRAINER_GRUNT_MAGMA_HIDEOUT_6_REWARD":{"address":5603526,"default_item":106,"flag":2001},"TRAINER_GRUNT_MAGMA_HIDEOUT_7_REWARD":{"address":5603528,"default_item":106,"flag":2002},"TRAINER_GRUNT_MAGMA_HIDEOUT_8_REWARD":{"address":5603530,"default_item":106,"flag":2003},"TRAINER_GRUNT_MAGMA_HIDEOUT_9_REWARD":{"address":5603532,"default_item":106,"flag":2004},"TRAINER_GRUNT_MT_CHIMNEY_1_REWARD":{"address":5602376,"default_item":106,"flag":1426},"TRAINER_GRUNT_MT_CHIMNEY_2_REWARD":{"address":5603242,"default_item":106,"flag":1859},"TRAINER_GRUNT_MT_PYRE_1_REWARD":{"address":5602130,"default_item":106,"flag":1303},"TRAINER_GRUNT_MT_PYRE_2_REWARD":{"address":5602132,"default_item":106,"flag":1304},"TRAINER_GRUNT_MT_PYRE_3_REWARD":{"address":5602134,"default_item":106,"flag":1305},"TRAINER_GRUNT_MT_PYRE_4_REWARD":{"address":5603222,"default_item":106,"flag":1849},"TRAINER_GRUNT_MUSEUM_1_REWARD":{"address":5602124,"default_item":106,"flag":1300},"TRAINER_GRUNT_MUSEUM_2_REWARD":{"address":5602126,"default_item":106,"flag":1301},"TRAINER_GRUNT_PETALBURG_WOODS_REWARD":{"address":5602104,"default_item":103,"flag":1290},"TRAINER_GRUNT_RUSTURF_TUNNEL_REWARD":{"address":5602116,"default_item":103,"flag":1296},"TRAINER_GRUNT_SEAFLOOR_CAVERN_1_REWARD":{"address":5602096,"default_item":108,"flag":1286},"TRAINER_GRUNT_SEAFLOOR_CAVERN_2_REWARD":{"address":5602098,"default_item":108,"flag":1287},"TRAINER_GRUNT_SEAFLOOR_CAVERN_3_REWARD":{"address":5602100,"default_item":108,"flag":1288},"TRAINER_GRUNT_SEAFLOOR_CAVERN_4_REWARD":{"address":5602112,"default_item":108,"flag":1294},"TRAINER_GRUNT_SEAFLOOR_CAVERN_5_REWARD":{"address":5603218,"default_item":108,"flag":1847},"TRAINER_GRUNT_SPACE_CENTER_1_REWARD":{"address":5602128,"default_item":106,"flag":1302},"TRAINER_GRUNT_SPACE_CENTER_2_REWARD":{"address":5602316,"default_item":106,"flag":1396},"TRAINER_GRUNT_SPACE_CENTER_3_REWARD":{"address":5603256,"default_item":106,"flag":1866},"TRAINER_GRUNT_SPACE_CENTER_4_REWARD":{"address":5603258,"default_item":106,"flag":1867},"TRAINER_GRUNT_SPACE_CENTER_5_REWARD":{"address":5603260,"default_item":106,"flag":1868},"TRAINER_GRUNT_SPACE_CENTER_6_REWARD":{"address":5603262,"default_item":106,"flag":1869},"TRAINER_GRUNT_SPACE_CENTER_7_REWARD":{"address":5603264,"default_item":106,"flag":1870},"TRAINER_GRUNT_WEATHER_INST_1_REWARD":{"address":5602118,"default_item":106,"flag":1297},"TRAINER_GRUNT_WEATHER_INST_2_REWARD":{"address":5602120,"default_item":106,"flag":1298},"TRAINER_GRUNT_WEATHER_INST_3_REWARD":{"address":5602122,"default_item":106,"flag":1299},"TRAINER_GRUNT_WEATHER_INST_4_REWARD":{"address":5602136,"default_item":106,"flag":1306},"TRAINER_GRUNT_WEATHER_INST_5_REWARD":{"address":5603276,"default_item":106,"flag":1876},"TRAINER_GWEN_REWARD":{"address":5602202,"default_item":103,"flag":1339},"TRAINER_HAILEY_REWARD":{"address":5603478,"default_item":103,"flag":1977},"TRAINER_HALEY_1_REWARD":{"address":5603292,"default_item":103,"flag":1884},"TRAINER_HALLE_REWARD":{"address":5603176,"default_item":104,"flag":1826},"TRAINER_HANNAH_REWARD":{"address":5602572,"default_item":108,"flag":1524},"TRAINER_HARRISON_REWARD":{"address":5603240,"default_item":106,"flag":1858},"TRAINER_HAYDEN_REWARD":{"address":5603498,"default_item":106,"flag":1987},"TRAINER_HECTOR_REWARD":{"address":5603110,"default_item":104,"flag":1793},"TRAINER_HEIDI_REWARD":{"address":5603022,"default_item":106,"flag":1749},"TRAINER_HELENE_REWARD":{"address":5603586,"default_item":106,"flag":2031},"TRAINER_HENRY_REWARD":{"address":5603420,"default_item":104,"flag":1948},"TRAINER_HERMAN_REWARD":{"address":5602418,"default_item":106,"flag":1447},"TRAINER_HIDEO_REWARD":{"address":5603386,"default_item":106,"flag":1931},"TRAINER_HITOSHI_REWARD":{"address":5602444,"default_item":104,"flag":1460},"TRAINER_HOPE_REWARD":{"address":5602276,"default_item":104,"flag":1376},"TRAINER_HUDSON_REWARD":{"address":5603104,"default_item":104,"flag":1790},"TRAINER_HUEY_REWARD":{"address":5603064,"default_item":106,"flag":1770},"TRAINER_HUGH_REWARD":{"address":5602882,"default_item":108,"flag":1679},"TRAINER_HUMBERTO_REWARD":{"address":5602888,"default_item":108,"flag":1682},"TRAINER_IMANI_REWARD":{"address":5602968,"default_item":103,"flag":1722},"TRAINER_IRENE_REWARD":{"address":5603036,"default_item":106,"flag":1756},"TRAINER_ISAAC_1_REWARD":{"address":5603160,"default_item":106,"flag":1818},"TRAINER_ISABELLA_REWARD":{"address":5603274,"default_item":104,"flag":1875},"TRAINER_ISABELLE_REWARD":{"address":5603556,"default_item":103,"flag":2016},"TRAINER_ISABEL_1_REWARD":{"address":5602688,"default_item":104,"flag":1582},"TRAINER_ISAIAH_1_REWARD":{"address":5602836,"default_item":104,"flag":1656},"TRAINER_ISOBEL_REWARD":{"address":5602850,"default_item":104,"flag":1663},"TRAINER_IVAN_REWARD":{"address":5602758,"default_item":106,"flag":1617},"TRAINER_JACE_REWARD":{"address":5602492,"default_item":108,"flag":1484},"TRAINER_JACKI_1_REWARD":{"address":5602582,"default_item":108,"flag":1529},"TRAINER_JACKSON_1_REWARD":{"address":5603188,"default_item":104,"flag":1832},"TRAINER_JACK_REWARD":{"address":5602428,"default_item":106,"flag":1452},"TRAINER_JACLYN_REWARD":{"address":5602570,"default_item":106,"flag":1523},"TRAINER_JACOB_REWARD":{"address":5602786,"default_item":106,"flag":1631},"TRAINER_JAIDEN_REWARD":{"address":5603582,"default_item":106,"flag":2029},"TRAINER_JAMES_1_REWARD":{"address":5603326,"default_item":103,"flag":1901},"TRAINER_JANICE_REWARD":{"address":5603294,"default_item":103,"flag":1885},"TRAINER_JANI_REWARD":{"address":5602920,"default_item":103,"flag":1698},"TRAINER_JARED_REWARD":{"address":5602886,"default_item":108,"flag":1681},"TRAINER_JASMINE_REWARD":{"address":5602802,"default_item":103,"flag":1639},"TRAINER_JAYLEN_REWARD":{"address":5602736,"default_item":106,"flag":1606},"TRAINER_JAZMYN_REWARD":{"address":5603090,"default_item":106,"flag":1783},"TRAINER_JEFFREY_1_REWARD":{"address":5602536,"default_item":104,"flag":1506},"TRAINER_JEFF_REWARD":{"address":5602488,"default_item":108,"flag":1482},"TRAINER_JENNA_REWARD":{"address":5603204,"default_item":104,"flag":1840},"TRAINER_JENNIFER_REWARD":{"address":5602274,"default_item":104,"flag":1375},"TRAINER_JENNY_1_REWARD":{"address":5602982,"default_item":106,"flag":1729},"TRAINER_JEROME_REWARD":{"address":5602396,"default_item":103,"flag":1436},"TRAINER_JERRY_1_REWARD":{"address":5602630,"default_item":103,"flag":1553},"TRAINER_JESSICA_1_REWARD":{"address":5602338,"default_item":104,"flag":1407},"TRAINER_JOCELYN_REWARD":{"address":5602934,"default_item":106,"flag":1705},"TRAINER_JODY_REWARD":{"address":5602266,"default_item":104,"flag":1371},"TRAINER_JOEY_REWARD":{"address":5602728,"default_item":103,"flag":1602},"TRAINER_JOHANNA_REWARD":{"address":5603378,"default_item":104,"flag":1927},"TRAINER_JOHNSON_REWARD":{"address":5603592,"default_item":103,"flag":2034},"TRAINER_JOHN_AND_JAY_1_REWARD":{"address":5603446,"default_item":104,"flag":1961},"TRAINER_JONAH_REWARD":{"address":5603418,"default_item":104,"flag":1947},"TRAINER_JONAS_REWARD":{"address":5603092,"default_item":106,"flag":1784},"TRAINER_JONATHAN_REWARD":{"address":5603280,"default_item":104,"flag":1878},"TRAINER_JOSEPH_REWARD":{"address":5603484,"default_item":106,"flag":1980},"TRAINER_JOSE_REWARD":{"address":5603318,"default_item":103,"flag":1897},"TRAINER_JOSH_REWARD":{"address":5602724,"default_item":103,"flag":1600},"TRAINER_JOSUE_REWARD":{"address":5603560,"default_item":108,"flag":2018},"TRAINER_JUAN_1_REWARD":{"address":5602628,"default_item":109,"flag":1552},"TRAINER_JULIE_REWARD":{"address":5602284,"default_item":104,"flag":1380},"TRAINER_JULIO_REWARD":{"address":5603216,"default_item":108,"flag":1846},"TRAINER_KAI_REWARD":{"address":5603510,"default_item":108,"flag":1993},"TRAINER_KALEB_REWARD":{"address":5603482,"default_item":104,"flag":1979},"TRAINER_KARA_REWARD":{"address":5602998,"default_item":106,"flag":1737},"TRAINER_KAREN_1_REWARD":{"address":5602644,"default_item":103,"flag":1560},"TRAINER_KATELYNN_REWARD":{"address":5602734,"default_item":104,"flag":1605},"TRAINER_KATELYN_1_REWARD":{"address":5602856,"default_item":104,"flag":1666},"TRAINER_KATE_AND_JOY_REWARD":{"address":5602656,"default_item":106,"flag":1566},"TRAINER_KATHLEEN_REWARD":{"address":5603250,"default_item":108,"flag":1863},"TRAINER_KATIE_REWARD":{"address":5602994,"default_item":106,"flag":1735},"TRAINER_KAYLA_REWARD":{"address":5602578,"default_item":106,"flag":1527},"TRAINER_KAYLEY_REWARD":{"address":5603094,"default_item":104,"flag":1785},"TRAINER_KEEGAN_REWARD":{"address":5602494,"default_item":108,"flag":1485},"TRAINER_KEIGO_REWARD":{"address":5603388,"default_item":106,"flag":1932},"TRAINER_KELVIN_REWARD":{"address":5603098,"default_item":104,"flag":1787},"TRAINER_KENT_REWARD":{"address":5603324,"default_item":106,"flag":1900},"TRAINER_KEVIN_REWARD":{"address":5602426,"default_item":106,"flag":1451},"TRAINER_KIM_AND_IRIS_REWARD":{"address":5603440,"default_item":106,"flag":1958},"TRAINER_KINDRA_REWARD":{"address":5602296,"default_item":108,"flag":1386},"TRAINER_KIRA_AND_DAN_1_REWARD":{"address":5603368,"default_item":108,"flag":1922},"TRAINER_KIRK_REWARD":{"address":5602466,"default_item":106,"flag":1471},"TRAINER_KIYO_REWARD":{"address":5602446,"default_item":104,"flag":1461},"TRAINER_KOICHI_REWARD":{"address":5602448,"default_item":108,"flag":1462},"TRAINER_KOJI_1_REWARD":{"address":5603428,"default_item":104,"flag":1952},"TRAINER_KYLA_REWARD":{"address":5602970,"default_item":103,"flag":1723},"TRAINER_KYRA_REWARD":{"address":5603580,"default_item":104,"flag":2028},"TRAINER_LAO_1_REWARD":{"address":5602922,"default_item":103,"flag":1699},"TRAINER_LARRY_REWARD":{"address":5602510,"default_item":106,"flag":1493},"TRAINER_LAURA_REWARD":{"address":5602936,"default_item":106,"flag":1706},"TRAINER_LAUREL_REWARD":{"address":5603010,"default_item":106,"flag":1743},"TRAINER_LAWRENCE_REWARD":{"address":5603504,"default_item":106,"flag":1990},"TRAINER_LEAH_REWARD":{"address":5602154,"default_item":108,"flag":1315},"TRAINER_LEA_AND_JED_REWARD":{"address":5603366,"default_item":104,"flag":1921},"TRAINER_LENNY_REWARD":{"address":5603340,"default_item":108,"flag":1908},"TRAINER_LEONARDO_REWARD":{"address":5603236,"default_item":106,"flag":1856},"TRAINER_LEONARD_REWARD":{"address":5603074,"default_item":104,"flag":1775},"TRAINER_LEONEL_REWARD":{"address":5603608,"default_item":104,"flag":2042},"TRAINER_LILA_AND_ROY_1_REWARD":{"address":5603458,"default_item":106,"flag":1967},"TRAINER_LILITH_REWARD":{"address":5603230,"default_item":106,"flag":1853},"TRAINER_LINDA_REWARD":{"address":5603006,"default_item":106,"flag":1741},"TRAINER_LISA_AND_RAY_REWARD":{"address":5603468,"default_item":106,"flag":1972},"TRAINER_LOLA_1_REWARD":{"address":5602198,"default_item":103,"flag":1337},"TRAINER_LORENZO_REWARD":{"address":5603190,"default_item":104,"flag":1833},"TRAINER_LUCAS_1_REWARD":{"address":5603342,"default_item":108,"flag":1909},"TRAINER_LUIS_REWARD":{"address":5602386,"default_item":103,"flag":1431},"TRAINER_LUNG_REWARD":{"address":5602924,"default_item":103,"flag":1700},"TRAINER_LYDIA_1_REWARD":{"address":5603174,"default_item":106,"flag":1825},"TRAINER_LYLE_REWARD":{"address":5603316,"default_item":103,"flag":1896},"TRAINER_MACEY_REWARD":{"address":5603266,"default_item":108,"flag":1871},"TRAINER_MADELINE_1_REWARD":{"address":5602952,"default_item":108,"flag":1714},"TRAINER_MAKAYLA_REWARD":{"address":5603600,"default_item":104,"flag":2038},"TRAINER_MARCEL_REWARD":{"address":5602106,"default_item":104,"flag":1291},"TRAINER_MARCOS_REWARD":{"address":5603488,"default_item":106,"flag":1982},"TRAINER_MARC_REWARD":{"address":5603226,"default_item":106,"flag":1851},"TRAINER_MARIA_1_REWARD":{"address":5602822,"default_item":106,"flag":1649},"TRAINER_MARK_REWARD":{"address":5602374,"default_item":104,"flag":1425},"TRAINER_MARLENE_REWARD":{"address":5603588,"default_item":106,"flag":2032},"TRAINER_MARLEY_REWARD":{"address":5603100,"default_item":104,"flag":1788},"TRAINER_MARY_REWARD":{"address":5602262,"default_item":104,"flag":1369},"TRAINER_MATTHEW_REWARD":{"address":5602398,"default_item":103,"flag":1437},"TRAINER_MATT_REWARD":{"address":5602144,"default_item":104,"flag":1310},"TRAINER_MAURA_REWARD":{"address":5602576,"default_item":108,"flag":1526},"TRAINER_MAXIE_MAGMA_HIDEOUT_REWARD":{"address":5603286,"default_item":107,"flag":1881},"TRAINER_MAXIE_MT_CHIMNEY_REWARD":{"address":5603288,"default_item":104,"flag":1882},"TRAINER_MAY_LILYCOVE_MUDKIP_REWARD":{"address":5603412,"default_item":104,"flag":1944},"TRAINER_MAY_LILYCOVE_TORCHIC_REWARD":{"address":5603416,"default_item":104,"flag":1946},"TRAINER_MAY_LILYCOVE_TREECKO_REWARD":{"address":5603414,"default_item":104,"flag":1945},"TRAINER_MAY_ROUTE_103_MUDKIP_REWARD":{"address":5603142,"default_item":106,"flag":1809},"TRAINER_MAY_ROUTE_103_TORCHIC_REWARD":{"address":5603154,"default_item":106,"flag":1815},"TRAINER_MAY_ROUTE_103_TREECKO_REWARD":{"address":5603148,"default_item":106,"flag":1812},"TRAINER_MAY_ROUTE_110_MUDKIP_REWARD":{"address":5603144,"default_item":104,"flag":1810},"TRAINER_MAY_ROUTE_110_TORCHIC_REWARD":{"address":5603156,"default_item":104,"flag":1816},"TRAINER_MAY_ROUTE_110_TREECKO_REWARD":{"address":5603150,"default_item":104,"flag":1813},"TRAINER_MAY_ROUTE_119_MUDKIP_REWARD":{"address":5603146,"default_item":104,"flag":1811},"TRAINER_MAY_ROUTE_119_TORCHIC_REWARD":{"address":5603158,"default_item":104,"flag":1817},"TRAINER_MAY_ROUTE_119_TREECKO_REWARD":{"address":5603152,"default_item":104,"flag":1814},"TRAINER_MAY_RUSTBORO_MUDKIP_REWARD":{"address":5603284,"default_item":108,"flag":1880},"TRAINER_MAY_RUSTBORO_TORCHIC_REWARD":{"address":5603622,"default_item":108,"flag":2049},"TRAINER_MAY_RUSTBORO_TREECKO_REWARD":{"address":5603620,"default_item":108,"flag":2048},"TRAINER_MELINA_REWARD":{"address":5603594,"default_item":106,"flag":2035},"TRAINER_MELISSA_REWARD":{"address":5602332,"default_item":104,"flag":1404},"TRAINER_MEL_AND_PAUL_REWARD":{"address":5603444,"default_item":108,"flag":1960},"TRAINER_MICAH_REWARD":{"address":5602594,"default_item":107,"flag":1535},"TRAINER_MICHELLE_REWARD":{"address":5602280,"default_item":104,"flag":1378},"TRAINER_MIGUEL_1_REWARD":{"address":5602670,"default_item":104,"flag":1573},"TRAINER_MIKE_2_REWARD":{"address":5603354,"default_item":106,"flag":1915},"TRAINER_MISSY_REWARD":{"address":5602978,"default_item":103,"flag":1727},"TRAINER_MITCHELL_REWARD":{"address":5603164,"default_item":104,"flag":1820},"TRAINER_MIU_AND_YUKI_REWARD":{"address":5603052,"default_item":106,"flag":1764},"TRAINER_MOLLIE_REWARD":{"address":5602358,"default_item":104,"flag":1417},"TRAINER_MYLES_REWARD":{"address":5603614,"default_item":104,"flag":2045},"TRAINER_NANCY_REWARD":{"address":5603028,"default_item":106,"flag":1752},"TRAINER_NAOMI_REWARD":{"address":5602322,"default_item":110,"flag":1399},"TRAINER_NATE_REWARD":{"address":5603248,"default_item":107,"flag":1862},"TRAINER_NED_REWARD":{"address":5602764,"default_item":106,"flag":1620},"TRAINER_NICHOLAS_REWARD":{"address":5603254,"default_item":108,"flag":1865},"TRAINER_NICOLAS_1_REWARD":{"address":5602868,"default_item":104,"flag":1672},"TRAINER_NIKKI_REWARD":{"address":5602990,"default_item":106,"flag":1733},"TRAINER_NOB_1_REWARD":{"address":5602450,"default_item":106,"flag":1463},"TRAINER_NOLAN_REWARD":{"address":5602768,"default_item":108,"flag":1622},"TRAINER_NOLEN_REWARD":{"address":5602406,"default_item":106,"flag":1441},"TRAINER_NORMAN_1_REWARD":{"address":5602622,"default_item":107,"flag":1549},"TRAINER_OLIVIA_REWARD":{"address":5602344,"default_item":107,"flag":1410},"TRAINER_OWEN_REWARD":{"address":5602250,"default_item":104,"flag":1363},"TRAINER_PABLO_1_REWARD":{"address":5602838,"default_item":104,"flag":1657},"TRAINER_PARKER_REWARD":{"address":5602228,"default_item":104,"flag":1352},"TRAINER_PAT_REWARD":{"address":5603616,"default_item":104,"flag":2046},"TRAINER_PAXTON_REWARD":{"address":5603272,"default_item":104,"flag":1874},"TRAINER_PERRY_REWARD":{"address":5602880,"default_item":108,"flag":1678},"TRAINER_PETE_REWARD":{"address":5603554,"default_item":103,"flag":2015},"TRAINER_PHILLIP_REWARD":{"address":5603072,"default_item":104,"flag":1774},"TRAINER_PHIL_REWARD":{"address":5602884,"default_item":108,"flag":1680},"TRAINER_PHOEBE_REWARD":{"address":5602608,"default_item":110,"flag":1542},"TRAINER_PRESLEY_REWARD":{"address":5602890,"default_item":104,"flag":1683},"TRAINER_PRESTON_REWARD":{"address":5602550,"default_item":108,"flag":1513},"TRAINER_QUINCY_REWARD":{"address":5602732,"default_item":104,"flag":1604},"TRAINER_RACHEL_REWARD":{"address":5603606,"default_item":104,"flag":2041},"TRAINER_RANDALL_REWARD":{"address":5602226,"default_item":104,"flag":1351},"TRAINER_REED_REWARD":{"address":5603434,"default_item":106,"flag":1955},"TRAINER_RELI_AND_IAN_REWARD":{"address":5603456,"default_item":106,"flag":1966},"TRAINER_REYNA_REWARD":{"address":5603102,"default_item":108,"flag":1789},"TRAINER_RHETT_REWARD":{"address":5603490,"default_item":106,"flag":1983},"TRAINER_RICHARD_REWARD":{"address":5602416,"default_item":106,"flag":1446},"TRAINER_RICKY_1_REWARD":{"address":5602212,"default_item":103,"flag":1344},"TRAINER_RICK_REWARD":{"address":5603314,"default_item":103,"flag":1895},"TRAINER_RILEY_REWARD":{"address":5603390,"default_item":106,"flag":1933},"TRAINER_ROBERT_1_REWARD":{"address":5602896,"default_item":108,"flag":1686},"TRAINER_RODNEY_REWARD":{"address":5602414,"default_item":106,"flag":1445},"TRAINER_ROGER_REWARD":{"address":5603422,"default_item":104,"flag":1949},"TRAINER_ROLAND_REWARD":{"address":5602404,"default_item":106,"flag":1440},"TRAINER_RONALD_REWARD":{"address":5602784,"default_item":104,"flag":1630},"TRAINER_ROSE_1_REWARD":{"address":5602158,"default_item":106,"flag":1317},"TRAINER_ROXANNE_1_REWARD":{"address":5602614,"default_item":104,"flag":1545},"TRAINER_RUBEN_REWARD":{"address":5603426,"default_item":104,"flag":1951},"TRAINER_SAMANTHA_REWARD":{"address":5602574,"default_item":108,"flag":1525},"TRAINER_SAMUEL_REWARD":{"address":5602246,"default_item":104,"flag":1361},"TRAINER_SANTIAGO_REWARD":{"address":5602420,"default_item":106,"flag":1448},"TRAINER_SARAH_REWARD":{"address":5603474,"default_item":104,"flag":1975},"TRAINER_SAWYER_1_REWARD":{"address":5602086,"default_item":108,"flag":1281},"TRAINER_SHANE_REWARD":{"address":5602512,"default_item":106,"flag":1494},"TRAINER_SHANNON_REWARD":{"address":5602278,"default_item":104,"flag":1377},"TRAINER_SHARON_REWARD":{"address":5602988,"default_item":106,"flag":1732},"TRAINER_SHAWN_REWARD":{"address":5602472,"default_item":106,"flag":1474},"TRAINER_SHAYLA_REWARD":{"address":5603578,"default_item":108,"flag":2027},"TRAINER_SHEILA_REWARD":{"address":5602334,"default_item":104,"flag":1405},"TRAINER_SHELBY_1_REWARD":{"address":5602710,"default_item":108,"flag":1593},"TRAINER_SHELLY_SEAFLOOR_CAVERN_REWARD":{"address":5602150,"default_item":104,"flag":1313},"TRAINER_SHELLY_WEATHER_INSTITUTE_REWARD":{"address":5602148,"default_item":104,"flag":1312},"TRAINER_SHIRLEY_REWARD":{"address":5602336,"default_item":104,"flag":1406},"TRAINER_SIDNEY_REWARD":{"address":5602606,"default_item":110,"flag":1541},"TRAINER_SIENNA_REWARD":{"address":5603002,"default_item":106,"flag":1739},"TRAINER_SIMON_REWARD":{"address":5602214,"default_item":103,"flag":1345},"TRAINER_SOPHIE_REWARD":{"address":5603500,"default_item":106,"flag":1988},"TRAINER_SPENCER_REWARD":{"address":5602402,"default_item":106,"flag":1439},"TRAINER_STAN_REWARD":{"address":5602408,"default_item":106,"flag":1442},"TRAINER_STEVEN_REWARD":{"address":5603692,"default_item":109,"flag":2084},"TRAINER_STEVE_1_REWARD":{"address":5602370,"default_item":104,"flag":1423},"TRAINER_SUSIE_REWARD":{"address":5602996,"default_item":106,"flag":1736},"TRAINER_SYLVIA_REWARD":{"address":5603234,"default_item":108,"flag":1855},"TRAINER_TABITHA_MAGMA_HIDEOUT_REWARD":{"address":5603548,"default_item":104,"flag":2012},"TRAINER_TABITHA_MT_CHIMNEY_REWARD":{"address":5603278,"default_item":108,"flag":1877},"TRAINER_TAKAO_REWARD":{"address":5602442,"default_item":106,"flag":1459},"TRAINER_TAKASHI_REWARD":{"address":5602916,"default_item":106,"flag":1696},"TRAINER_TALIA_REWARD":{"address":5602854,"default_item":104,"flag":1665},"TRAINER_TAMMY_REWARD":{"address":5602298,"default_item":106,"flag":1387},"TRAINER_TANYA_REWARD":{"address":5602986,"default_item":106,"flag":1731},"TRAINER_TARA_REWARD":{"address":5602976,"default_item":103,"flag":1726},"TRAINER_TASHA_REWARD":{"address":5602302,"default_item":108,"flag":1389},"TRAINER_TATE_AND_LIZA_1_REWARD":{"address":5602626,"default_item":109,"flag":1551},"TRAINER_TAYLOR_REWARD":{"address":5602534,"default_item":104,"flag":1505},"TRAINER_THALIA_1_REWARD":{"address":5602372,"default_item":104,"flag":1424},"TRAINER_THOMAS_REWARD":{"address":5602596,"default_item":107,"flag":1536},"TRAINER_TIANA_REWARD":{"address":5603290,"default_item":103,"flag":1883},"TRAINER_TIFFANY_REWARD":{"address":5602346,"default_item":107,"flag":1411},"TRAINER_TIMMY_REWARD":{"address":5602752,"default_item":103,"flag":1614},"TRAINER_TIMOTHY_1_REWARD":{"address":5602698,"default_item":104,"flag":1587},"TRAINER_TISHA_REWARD":{"address":5603436,"default_item":106,"flag":1956},"TRAINER_TOMMY_REWARD":{"address":5602726,"default_item":103,"flag":1601},"TRAINER_TONY_1_REWARD":{"address":5602394,"default_item":103,"flag":1435},"TRAINER_TORI_AND_TIA_REWARD":{"address":5603438,"default_item":103,"flag":1957},"TRAINER_TRAVIS_REWARD":{"address":5602520,"default_item":106,"flag":1498},"TRAINER_TRENT_1_REWARD":{"address":5603338,"default_item":106,"flag":1907},"TRAINER_TYRA_AND_IVY_REWARD":{"address":5603442,"default_item":106,"flag":1959},"TRAINER_TYRON_REWARD":{"address":5603492,"default_item":106,"flag":1984},"TRAINER_VALERIE_1_REWARD":{"address":5602300,"default_item":108,"flag":1388},"TRAINER_VANESSA_REWARD":{"address":5602684,"default_item":104,"flag":1580},"TRAINER_VICKY_REWARD":{"address":5602708,"default_item":108,"flag":1592},"TRAINER_VICTORIA_REWARD":{"address":5602682,"default_item":106,"flag":1579},"TRAINER_VICTOR_REWARD":{"address":5602668,"default_item":106,"flag":1572},"TRAINER_VIOLET_REWARD":{"address":5602162,"default_item":104,"flag":1319},"TRAINER_VIRGIL_REWARD":{"address":5602552,"default_item":108,"flag":1514},"TRAINER_VITO_REWARD":{"address":5602248,"default_item":104,"flag":1362},"TRAINER_VIVIAN_REWARD":{"address":5603382,"default_item":106,"flag":1929},"TRAINER_VIVI_REWARD":{"address":5603296,"default_item":106,"flag":1886},"TRAINER_WADE_REWARD":{"address":5602772,"default_item":106,"flag":1624},"TRAINER_WALLACE_REWARD":{"address":5602754,"default_item":110,"flag":1615},"TRAINER_WALLY_MAUVILLE_REWARD":{"address":5603396,"default_item":108,"flag":1936},"TRAINER_WALLY_VR_1_REWARD":{"address":5603122,"default_item":107,"flag":1799},"TRAINER_WALTER_1_REWARD":{"address":5602592,"default_item":104,"flag":1534},"TRAINER_WARREN_REWARD":{"address":5602260,"default_item":104,"flag":1368},"TRAINER_WATTSON_1_REWARD":{"address":5602618,"default_item":104,"flag":1547},"TRAINER_WAYNE_REWARD":{"address":5603430,"default_item":104,"flag":1953},"TRAINER_WENDY_REWARD":{"address":5602268,"default_item":104,"flag":1372},"TRAINER_WILLIAM_REWARD":{"address":5602556,"default_item":106,"flag":1516},"TRAINER_WILTON_1_REWARD":{"address":5602240,"default_item":108,"flag":1358},"TRAINER_WINONA_1_REWARD":{"address":5602624,"default_item":107,"flag":1550},"TRAINER_WINSTON_1_REWARD":{"address":5602356,"default_item":104,"flag":1416},"TRAINER_WYATT_REWARD":{"address":5603506,"default_item":104,"flag":1991},"TRAINER_YASU_REWARD":{"address":5602914,"default_item":106,"flag":1695},"TRAINER_ZANDER_REWARD":{"address":5602146,"default_item":108,"flag":1311}},"maps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":{"header_address":4766420,"warp_table_address":5496844},"MAP_ABANDONED_SHIP_CORRIDORS_1F":{"header_address":4766196,"warp_table_address":5495920},"MAP_ABANDONED_SHIP_CORRIDORS_B1F":{"header_address":4766252,"warp_table_address":5496248},"MAP_ABANDONED_SHIP_DECK":{"header_address":4766168,"warp_table_address":5495812},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":{"fishing_encounters":{"address":5609088,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766476,"warp_table_address":5496908,"water_encounters":{"address":5609060,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":{"header_address":4766504,"warp_table_address":5497120},"MAP_ABANDONED_SHIP_ROOMS2_1F":{"header_address":4766392,"warp_table_address":5496752},"MAP_ABANDONED_SHIP_ROOMS2_B1F":{"header_address":4766308,"warp_table_address":5496484},"MAP_ABANDONED_SHIP_ROOMS_1F":{"header_address":4766224,"warp_table_address":5496132},"MAP_ABANDONED_SHIP_ROOMS_B1F":{"fishing_encounters":{"address":5606324,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766280,"warp_table_address":5496392,"water_encounters":{"address":5606296,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_ROOM_B1F":{"header_address":4766364,"warp_table_address":5496596},"MAP_ABANDONED_SHIP_UNDERWATER1":{"header_address":4766336,"warp_table_address":5496536},"MAP_ABANDONED_SHIP_UNDERWATER2":{"header_address":4766448,"warp_table_address":5496880},"MAP_ALTERING_CAVE":{"header_address":4767624,"land_encounters":{"address":5613400,"slots":[41,41,41,41,41,41,41,41,41,41,41,41]},"warp_table_address":5500436},"MAP_ANCIENT_TOMB":{"header_address":4766560,"warp_table_address":5497460},"MAP_AQUA_HIDEOUT_1F":{"header_address":4765300,"warp_table_address":5490892},"MAP_AQUA_HIDEOUT_B1F":{"header_address":4765328,"warp_table_address":5491152},"MAP_AQUA_HIDEOUT_B2F":{"header_address":4765356,"warp_table_address":5491516},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":{"header_address":4766728,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":{"header_address":4766756,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":{"header_address":4766784,"warp_table_address":4160749568},"MAP_ARTISAN_CAVE_1F":{"header_address":4767456,"land_encounters":{"address":5613344,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500172},"MAP_ARTISAN_CAVE_B1F":{"header_address":4767428,"land_encounters":{"address":5613288,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500064},"MAP_BATTLE_COLOSSEUM_2P":{"header_address":4768352,"warp_table_address":5509852},"MAP_BATTLE_COLOSSEUM_4P":{"header_address":4768436,"warp_table_address":5510152},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":{"header_address":4770228,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":{"header_address":4770200,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":{"header_address":4770172,"warp_table_address":5520908},"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":{"header_address":4769976,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":{"header_address":4769920,"warp_table_address":5519076},"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":{"header_address":4769892,"warp_table_address":5518968},"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":{"header_address":4769948,"warp_table_address":5519136},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":{"header_address":4770312,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":{"header_address":4770256,"warp_table_address":5521384},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":{"header_address":4770284,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":{"header_address":4770060,"warp_table_address":5520116},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":{"header_address":4770032,"warp_table_address":5519944},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":{"header_address":4770004,"warp_table_address":5519696},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":{"header_address":4770368,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":{"header_address":4770340,"warp_table_address":5521808},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":{"header_address":4770452,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":{"header_address":4770424,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":{"header_address":4770480,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":{"header_address":4770396,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":{"header_address":4770116,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":{"header_address":4770088,"warp_table_address":5520248},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":{"header_address":4770144,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":{"header_address":4769612,"warp_table_address":5516696},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":{"header_address":4769584,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":{"header_address":4769556,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":{"header_address":4769528,"warp_table_address":5516432},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":{"header_address":4769864,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":{"header_address":4769836,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":{"header_address":4769808,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":{"header_address":4770564,"warp_table_address":5523056},"MAP_BATTLE_FRONTIER_LOUNGE1":{"header_address":4770536,"warp_table_address":5522812},"MAP_BATTLE_FRONTIER_LOUNGE2":{"header_address":4770592,"warp_table_address":5523220},"MAP_BATTLE_FRONTIER_LOUNGE3":{"header_address":4770620,"warp_table_address":5523376},"MAP_BATTLE_FRONTIER_LOUNGE4":{"header_address":4770648,"warp_table_address":5523476},"MAP_BATTLE_FRONTIER_LOUNGE5":{"header_address":4770704,"warp_table_address":5523660},"MAP_BATTLE_FRONTIER_LOUNGE6":{"header_address":4770732,"warp_table_address":5523720},"MAP_BATTLE_FRONTIER_LOUNGE7":{"header_address":4770760,"warp_table_address":5523844},"MAP_BATTLE_FRONTIER_LOUNGE8":{"header_address":4770816,"warp_table_address":5524100},"MAP_BATTLE_FRONTIER_LOUNGE9":{"header_address":4770844,"warp_table_address":5524152},"MAP_BATTLE_FRONTIER_MART":{"header_address":4770928,"warp_table_address":5524588},"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":{"header_address":4769780,"warp_table_address":5518080},"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":{"header_address":4769500,"warp_table_address":5516048},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":{"header_address":4770872,"warp_table_address":5524308},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":{"header_address":4770900,"warp_table_address":5524448},"MAP_BATTLE_FRONTIER_RANKING_HALL":{"header_address":4770508,"warp_table_address":5522560},"MAP_BATTLE_FRONTIER_RECEPTION_GATE":{"header_address":4770788,"warp_table_address":5523992},"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":{"header_address":4770676,"warp_table_address":5523528},"MAP_BATTLE_PYRAMID_SQUARE01":{"header_address":4768912,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE02":{"header_address":4768940,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE03":{"header_address":4768968,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE04":{"header_address":4768996,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE05":{"header_address":4769024,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE06":{"header_address":4769052,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE07":{"header_address":4769080,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE08":{"header_address":4769108,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE09":{"header_address":4769136,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE10":{"header_address":4769164,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE11":{"header_address":4769192,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE12":{"header_address":4769220,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE13":{"header_address":4769248,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE14":{"header_address":4769276,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE15":{"header_address":4769304,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE16":{"header_address":4769332,"warp_table_address":4160749568},"MAP_BIRTH_ISLAND_EXTERIOR":{"header_address":4771012,"warp_table_address":5524876},"MAP_BIRTH_ISLAND_HARBOR":{"header_address":4771040,"warp_table_address":5524952},"MAP_CAVE_OF_ORIGIN_1F":{"header_address":4765720,"land_encounters":{"address":5609868,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493440},"MAP_CAVE_OF_ORIGIN_B1F":{"header_address":4765832,"warp_table_address":5493608},"MAP_CAVE_OF_ORIGIN_ENTRANCE":{"header_address":4765692,"land_encounters":{"address":5609812,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493404},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":{"header_address":4765748,"land_encounters":{"address":5609924,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493476},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":{"header_address":4765776,"land_encounters":{"address":5609980,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493512},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":{"header_address":4765804,"land_encounters":{"address":5610036,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493548},"MAP_CONTEST_HALL":{"header_address":4768464,"warp_table_address":4160749568},"MAP_CONTEST_HALL_BEAUTY":{"header_address":4768660,"warp_table_address":4160749568},"MAP_CONTEST_HALL_COOL":{"header_address":4768716,"warp_table_address":4160749568},"MAP_CONTEST_HALL_CUTE":{"header_address":4768772,"warp_table_address":4160749568},"MAP_CONTEST_HALL_SMART":{"header_address":4768744,"warp_table_address":4160749568},"MAP_CONTEST_HALL_TOUGH":{"header_address":4768688,"warp_table_address":4160749568},"MAP_DESERT_RUINS":{"header_address":4764824,"warp_table_address":5486828},"MAP_DESERT_UNDERPASS":{"header_address":4767400,"land_encounters":{"address":5613232,"slots":[132,370,132,371,132,370,371,132,370,132,371,132]},"warp_table_address":5500012},"MAP_DEWFORD_TOWN":{"fishing_encounters":{"address":5611588,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758300,"warp_table_address":5435180,"water_encounters":{"address":5611560,"slots":[72,309,309,310,310]}},"MAP_DEWFORD_TOWN_GYM":{"header_address":4759952,"warp_table_address":5460340},"MAP_DEWFORD_TOWN_HALL":{"header_address":4759980,"warp_table_address":5460640},"MAP_DEWFORD_TOWN_HOUSE1":{"header_address":4759868,"warp_table_address":5459856},"MAP_DEWFORD_TOWN_HOUSE2":{"header_address":4760008,"warp_table_address":5460748},"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":{"header_address":4759896,"warp_table_address":5459964},"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":{"header_address":4759924,"warp_table_address":5460104},"MAP_EVER_GRANDE_CITY":{"fishing_encounters":{"address":5611892,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4758216,"warp_table_address":5434048,"water_encounters":{"address":5611864,"slots":[72,309,309,310,310]}},"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":{"header_address":4764012,"warp_table_address":5483720},"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":{"header_address":4763984,"warp_table_address":5483612},"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":{"header_address":4763956,"warp_table_address":5483552},"MAP_EVER_GRANDE_CITY_HALL1":{"header_address":4764040,"warp_table_address":5483756},"MAP_EVER_GRANDE_CITY_HALL2":{"header_address":4764068,"warp_table_address":5483808},"MAP_EVER_GRANDE_CITY_HALL3":{"header_address":4764096,"warp_table_address":5483860},"MAP_EVER_GRANDE_CITY_HALL4":{"header_address":4764124,"warp_table_address":5483912},"MAP_EVER_GRANDE_CITY_HALL5":{"header_address":4764152,"warp_table_address":5483948},"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":{"header_address":4764208,"warp_table_address":5484180},"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":{"header_address":4763928,"warp_table_address":5483492},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":{"header_address":4764236,"warp_table_address":5484304},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":{"header_address":4764264,"warp_table_address":5484444},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":{"header_address":4764180,"warp_table_address":5484096},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":{"header_address":4764292,"warp_table_address":5484584},"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":{"header_address":4763900,"warp_table_address":5483432},"MAP_FALLARBOR_TOWN":{"header_address":4758356,"warp_table_address":5435792},"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760316,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760288,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760260,"warp_table_address":5462376},"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":{"header_address":4760400,"warp_table_address":5462888},"MAP_FALLARBOR_TOWN_MART":{"header_address":4760232,"warp_table_address":5462220},"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":{"header_address":4760428,"warp_table_address":5462948},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":{"header_address":4760344,"warp_table_address":5462656},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":{"header_address":4760372,"warp_table_address":5462796},"MAP_FARAWAY_ISLAND_ENTRANCE":{"header_address":4770956,"warp_table_address":5524672},"MAP_FARAWAY_ISLAND_INTERIOR":{"header_address":4770984,"warp_table_address":5524792},"MAP_FIERY_PATH":{"header_address":4765048,"land_encounters":{"address":5606456,"slots":[339,109,339,66,321,218,109,66,321,321,88,88]},"warp_table_address":5489344},"MAP_FORTREE_CITY":{"header_address":4758104,"warp_table_address":5431676},"MAP_FORTREE_CITY_DECORATION_SHOP":{"header_address":4762444,"warp_table_address":5473936},"MAP_FORTREE_CITY_GYM":{"header_address":4762220,"warp_table_address":5472984},"MAP_FORTREE_CITY_HOUSE1":{"header_address":4762192,"warp_table_address":5472756},"MAP_FORTREE_CITY_HOUSE2":{"header_address":4762332,"warp_table_address":5473504},"MAP_FORTREE_CITY_HOUSE3":{"header_address":4762360,"warp_table_address":5473588},"MAP_FORTREE_CITY_HOUSE4":{"header_address":4762388,"warp_table_address":5473696},"MAP_FORTREE_CITY_HOUSE5":{"header_address":4762416,"warp_table_address":5473804},"MAP_FORTREE_CITY_MART":{"header_address":4762304,"warp_table_address":5473420},"MAP_FORTREE_CITY_POKEMON_CENTER_1F":{"header_address":4762248,"warp_table_address":5473140},"MAP_FORTREE_CITY_POKEMON_CENTER_2F":{"header_address":4762276,"warp_table_address":5473280},"MAP_GRANITE_CAVE_1F":{"header_address":4764852,"land_encounters":{"address":5605988,"slots":[41,335,335,41,335,63,335,335,74,74,74,74]},"warp_table_address":5486956},"MAP_GRANITE_CAVE_B1F":{"header_address":4764880,"land_encounters":{"address":5606044,"slots":[41,382,382,382,41,63,335,335,322,322,322,322]},"warp_table_address":5487032},"MAP_GRANITE_CAVE_B2F":{"header_address":4764908,"land_encounters":{"address":5606372,"slots":[41,382,382,41,382,63,322,322,322,322,322,322]},"warp_table_address":5487324},"MAP_GRANITE_CAVE_STEVENS_ROOM":{"header_address":4764936,"land_encounters":{"address":5608188,"slots":[41,335,335,41,335,63,335,335,382,382,382,382]},"warp_table_address":5487432},"MAP_INSIDE_OF_TRUCK":{"header_address":4768800,"warp_table_address":5510720},"MAP_ISLAND_CAVE":{"header_address":4766532,"warp_table_address":5497356},"MAP_JAGGED_PASS":{"header_address":4765020,"land_encounters":{"address":5606644,"slots":[339,339,66,339,351,66,351,66,339,351,339,351]},"warp_table_address":5488908},"MAP_LAVARIDGE_TOWN":{"header_address":4758328,"warp_table_address":5435516},"MAP_LAVARIDGE_TOWN_GYM_1F":{"header_address":4760064,"warp_table_address":5461036},"MAP_LAVARIDGE_TOWN_GYM_B1F":{"header_address":4760092,"warp_table_address":5461384},"MAP_LAVARIDGE_TOWN_HERB_SHOP":{"header_address":4760036,"warp_table_address":5460856},"MAP_LAVARIDGE_TOWN_HOUSE":{"header_address":4760120,"warp_table_address":5461668},"MAP_LAVARIDGE_TOWN_MART":{"header_address":4760148,"warp_table_address":5461776},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":{"header_address":4760176,"warp_table_address":5461908},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":{"header_address":4760204,"warp_table_address":5462056},"MAP_LILYCOVE_CITY":{"fishing_encounters":{"address":5611512,"slots":[129,72,129,72,313,313,313,120,313,313]},"header_address":4758132,"warp_table_address":5432368,"water_encounters":{"address":5611484,"slots":[72,309,309,310,310]}},"MAP_LILYCOVE_CITY_CONTEST_HALL":{"header_address":4762612,"warp_table_address":5476560},"MAP_LILYCOVE_CITY_CONTEST_LOBBY":{"header_address":4762584,"warp_table_address":5475596},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":{"header_address":4762472,"warp_table_address":5473996},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":{"header_address":4762500,"warp_table_address":5474224},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":{"header_address":4762920,"warp_table_address":5478044},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":{"header_address":4762948,"warp_table_address":5478228},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":{"header_address":4762976,"warp_table_address":5478392},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":{"header_address":4763004,"warp_table_address":5478556},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":{"header_address":4763032,"warp_table_address":5478768},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":{"header_address":4763088,"warp_table_address":5478984},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":{"header_address":4763060,"warp_table_address":5478908},"MAP_LILYCOVE_CITY_HARBOR":{"header_address":4762752,"warp_table_address":5477396},"MAP_LILYCOVE_CITY_HOUSE1":{"header_address":4762808,"warp_table_address":5477540},"MAP_LILYCOVE_CITY_HOUSE2":{"header_address":4762836,"warp_table_address":5477600},"MAP_LILYCOVE_CITY_HOUSE3":{"header_address":4762864,"warp_table_address":5477780},"MAP_LILYCOVE_CITY_HOUSE4":{"header_address":4762892,"warp_table_address":5477864},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":{"header_address":4762528,"warp_table_address":5474492},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":{"header_address":4762556,"warp_table_address":5474824},"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":{"header_address":4762780,"warp_table_address":5477456},"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":{"header_address":4762640,"warp_table_address":5476804},"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":{"header_address":4762668,"warp_table_address":5476944},"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":{"header_address":4762724,"warp_table_address":5477240},"MAP_LILYCOVE_CITY_UNUSED_MART":{"header_address":4762696,"warp_table_address":5476988},"MAP_LITTLEROOT_TOWN":{"header_address":4758244,"warp_table_address":5434528},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":{"header_address":4759588,"warp_table_address":5457588},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":{"header_address":4759616,"warp_table_address":5458080},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":{"header_address":4759644,"warp_table_address":5458324},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":{"header_address":4759672,"warp_table_address":5458816},"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":{"header_address":4759700,"warp_table_address":5459036},"MAP_MAGMA_HIDEOUT_1F":{"header_address":4767064,"land_encounters":{"address":5612560,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498844},"MAP_MAGMA_HIDEOUT_2F_1R":{"header_address":4767092,"land_encounters":{"address":5612616,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498992},"MAP_MAGMA_HIDEOUT_2F_2R":{"header_address":4767120,"land_encounters":{"address":5612672,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499180},"MAP_MAGMA_HIDEOUT_2F_3R":{"header_address":4767260,"land_encounters":{"address":5612952,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499696},"MAP_MAGMA_HIDEOUT_3F_1R":{"header_address":4767148,"land_encounters":{"address":5612728,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499288},"MAP_MAGMA_HIDEOUT_3F_2R":{"header_address":4767176,"land_encounters":{"address":5612784,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499380},"MAP_MAGMA_HIDEOUT_3F_3R":{"header_address":4767232,"land_encounters":{"address":5612896,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499660},"MAP_MAGMA_HIDEOUT_4F":{"header_address":4767204,"land_encounters":{"address":5612840,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499600},"MAP_MARINE_CAVE_END":{"header_address":4767540,"warp_table_address":5500288},"MAP_MARINE_CAVE_ENTRANCE":{"header_address":4767512,"warp_table_address":5500236},"MAP_MAUVILLE_CITY":{"header_address":4758048,"warp_table_address":5430380},"MAP_MAUVILLE_CITY_BIKE_SHOP":{"header_address":4761520,"warp_table_address":5469232},"MAP_MAUVILLE_CITY_GAME_CORNER":{"header_address":4761576,"warp_table_address":5469640},"MAP_MAUVILLE_CITY_GYM":{"header_address":4761492,"warp_table_address":5469060},"MAP_MAUVILLE_CITY_HOUSE1":{"header_address":4761548,"warp_table_address":5469316},"MAP_MAUVILLE_CITY_HOUSE2":{"header_address":4761604,"warp_table_address":5469988},"MAP_MAUVILLE_CITY_MART":{"header_address":4761688,"warp_table_address":5470424},"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":{"header_address":4761632,"warp_table_address":5470144},"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":{"header_address":4761660,"warp_table_address":5470308},"MAP_METEOR_FALLS_1F_1R":{"fishing_encounters":{"address":5610796,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4764656,"land_encounters":{"address":5610712,"slots":[41,41,41,41,41,349,349,349,41,41,41,41]},"warp_table_address":5486052,"water_encounters":{"address":5610768,"slots":[41,41,349,349,349]}},"MAP_METEOR_FALLS_1F_2R":{"fishing_encounters":{"address":5610928,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764684,"land_encounters":{"address":5610844,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486220,"water_encounters":{"address":5610900,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_1R":{"fishing_encounters":{"address":5611060,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764712,"land_encounters":{"address":5610976,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486284,"water_encounters":{"address":5611032,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_2R":{"fishing_encounters":{"address":5606596,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764740,"land_encounters":{"address":5606512,"slots":[42,42,395,349,395,349,395,349,42,42,42,42]},"warp_table_address":5486376,"water_encounters":{"address":5606568,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_STEVENS_CAVE":{"header_address":4767652,"land_encounters":{"address":5613904,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5500488},"MAP_MIRAGE_TOWER_1F":{"header_address":4767288,"land_encounters":{"address":5613008,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499732},"MAP_MIRAGE_TOWER_2F":{"header_address":4767316,"land_encounters":{"address":5613064,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499768},"MAP_MIRAGE_TOWER_3F":{"header_address":4767344,"land_encounters":{"address":5613120,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499852},"MAP_MIRAGE_TOWER_4F":{"header_address":4767372,"land_encounters":{"address":5613176,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499960},"MAP_MOSSDEEP_CITY":{"fishing_encounters":{"address":5611740,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758160,"warp_table_address":5433064,"water_encounters":{"address":5611712,"slots":[72,309,309,310,310]}},"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":{"header_address":4763424,"warp_table_address":5481712},"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":{"header_address":4763452,"warp_table_address":5481816},"MAP_MOSSDEEP_CITY_GYM":{"header_address":4763116,"warp_table_address":5479884},"MAP_MOSSDEEP_CITY_HOUSE1":{"header_address":4763144,"warp_table_address":5480232},"MAP_MOSSDEEP_CITY_HOUSE2":{"header_address":4763172,"warp_table_address":5480340},"MAP_MOSSDEEP_CITY_HOUSE3":{"header_address":4763284,"warp_table_address":5480812},"MAP_MOSSDEEP_CITY_HOUSE4":{"header_address":4763340,"warp_table_address":5481076},"MAP_MOSSDEEP_CITY_MART":{"header_address":4763256,"warp_table_address":5480752},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":{"header_address":4763200,"warp_table_address":5480448},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":{"header_address":4763228,"warp_table_address":5480612},"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":{"header_address":4763368,"warp_table_address":5481376},"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":{"header_address":4763396,"warp_table_address":5481636},"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":{"header_address":4763312,"warp_table_address":5480920},"MAP_MT_CHIMNEY":{"header_address":4764992,"warp_table_address":5488664},"MAP_MT_CHIMNEY_CABLE_CAR_STATION":{"header_address":4764460,"warp_table_address":5485144},"MAP_MT_PYRE_1F":{"header_address":4765076,"land_encounters":{"address":5606100,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489452},"MAP_MT_PYRE_2F":{"header_address":4765104,"land_encounters":{"address":5607796,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489712},"MAP_MT_PYRE_3F":{"header_address":4765132,"land_encounters":{"address":5607852,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489868},"MAP_MT_PYRE_4F":{"header_address":4765160,"land_encounters":{"address":5607908,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5489984},"MAP_MT_PYRE_5F":{"header_address":4765188,"land_encounters":{"address":5607964,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490100},"MAP_MT_PYRE_6F":{"header_address":4765216,"land_encounters":{"address":5608020,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490232},"MAP_MT_PYRE_EXTERIOR":{"header_address":4765244,"land_encounters":{"address":5608076,"slots":[377,377,377,377,37,37,37,37,309,309,309,309]},"warp_table_address":5490316},"MAP_MT_PYRE_SUMMIT":{"header_address":4765272,"land_encounters":{"address":5608132,"slots":[377,377,377,377,377,377,377,361,361,361,411,411]},"warp_table_address":5490656},"MAP_NAVEL_ROCK_B1F":{"header_address":4771320,"warp_table_address":5525524},"MAP_NAVEL_ROCK_BOTTOM":{"header_address":4771824,"warp_table_address":5526248},"MAP_NAVEL_ROCK_DOWN01":{"header_address":4771516,"warp_table_address":5525828},"MAP_NAVEL_ROCK_DOWN02":{"header_address":4771544,"warp_table_address":5525864},"MAP_NAVEL_ROCK_DOWN03":{"header_address":4771572,"warp_table_address":5525900},"MAP_NAVEL_ROCK_DOWN04":{"header_address":4771600,"warp_table_address":5525936},"MAP_NAVEL_ROCK_DOWN05":{"header_address":4771628,"warp_table_address":5525972},"MAP_NAVEL_ROCK_DOWN06":{"header_address":4771656,"warp_table_address":5526008},"MAP_NAVEL_ROCK_DOWN07":{"header_address":4771684,"warp_table_address":5526044},"MAP_NAVEL_ROCK_DOWN08":{"header_address":4771712,"warp_table_address":5526080},"MAP_NAVEL_ROCK_DOWN09":{"header_address":4771740,"warp_table_address":5526116},"MAP_NAVEL_ROCK_DOWN10":{"header_address":4771768,"warp_table_address":5526152},"MAP_NAVEL_ROCK_DOWN11":{"header_address":4771796,"warp_table_address":5526188},"MAP_NAVEL_ROCK_ENTRANCE":{"header_address":4771292,"warp_table_address":5525488},"MAP_NAVEL_ROCK_EXTERIOR":{"header_address":4771236,"warp_table_address":5525376},"MAP_NAVEL_ROCK_FORK":{"header_address":4771348,"warp_table_address":5525560},"MAP_NAVEL_ROCK_HARBOR":{"header_address":4771264,"warp_table_address":5525460},"MAP_NAVEL_ROCK_TOP":{"header_address":4771488,"warp_table_address":5525772},"MAP_NAVEL_ROCK_UP1":{"header_address":4771376,"warp_table_address":5525604},"MAP_NAVEL_ROCK_UP2":{"header_address":4771404,"warp_table_address":5525640},"MAP_NAVEL_ROCK_UP3":{"header_address":4771432,"warp_table_address":5525676},"MAP_NAVEL_ROCK_UP4":{"header_address":4771460,"warp_table_address":5525712},"MAP_NEW_MAUVILLE_ENTRANCE":{"header_address":4766112,"land_encounters":{"address":5610092,"slots":[100,81,100,81,100,81,100,81,100,81,100,81]},"warp_table_address":5495284},"MAP_NEW_MAUVILLE_INSIDE":{"header_address":4766140,"land_encounters":{"address":5607136,"slots":[100,81,100,81,100,81,100,81,100,81,101,82]},"warp_table_address":5495528},"MAP_OLDALE_TOWN":{"header_address":4758272,"warp_table_address":5434860},"MAP_OLDALE_TOWN_HOUSE1":{"header_address":4759728,"warp_table_address":5459276},"MAP_OLDALE_TOWN_HOUSE2":{"header_address":4759756,"warp_table_address":5459360},"MAP_OLDALE_TOWN_MART":{"header_address":4759840,"warp_table_address":5459748},"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":{"header_address":4759784,"warp_table_address":5459492},"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":{"header_address":4759812,"warp_table_address":5459632},"MAP_PACIFIDLOG_TOWN":{"fishing_encounters":{"address":5611816,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758412,"warp_table_address":5436288,"water_encounters":{"address":5611788,"slots":[72,309,309,310,310]}},"MAP_PACIFIDLOG_TOWN_HOUSE1":{"header_address":4760764,"warp_table_address":5464400},"MAP_PACIFIDLOG_TOWN_HOUSE2":{"header_address":4760792,"warp_table_address":5464508},"MAP_PACIFIDLOG_TOWN_HOUSE3":{"header_address":4760820,"warp_table_address":5464592},"MAP_PACIFIDLOG_TOWN_HOUSE4":{"header_address":4760848,"warp_table_address":5464700},"MAP_PACIFIDLOG_TOWN_HOUSE5":{"header_address":4760876,"warp_table_address":5464784},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":{"header_address":4760708,"warp_table_address":5464168},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":{"header_address":4760736,"warp_table_address":5464308},"MAP_PETALBURG_CITY":{"fishing_encounters":{"address":5611968,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4757992,"warp_table_address":5428704,"water_encounters":{"address":5611940,"slots":[183,183,183,183,183]}},"MAP_PETALBURG_CITY_GYM":{"header_address":4760932,"warp_table_address":5465168},"MAP_PETALBURG_CITY_HOUSE1":{"header_address":4760960,"warp_table_address":5465708},"MAP_PETALBURG_CITY_HOUSE2":{"header_address":4760988,"warp_table_address":5465792},"MAP_PETALBURG_CITY_MART":{"header_address":4761072,"warp_table_address":5466228},"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":{"header_address":4761016,"warp_table_address":5465948},"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":{"header_address":4761044,"warp_table_address":5466088},"MAP_PETALBURG_CITY_WALLYS_HOUSE":{"header_address":4760904,"warp_table_address":5464868},"MAP_PETALBURG_WOODS":{"header_address":4764964,"land_encounters":{"address":5605876,"slots":[286,290,306,286,291,293,290,306,304,364,304,364]},"warp_table_address":5487772},"MAP_RECORD_CORNER":{"header_address":4768408,"warp_table_address":5510036},"MAP_ROUTE101":{"header_address":4758440,"land_encounters":{"address":5604388,"slots":[290,286,290,290,286,286,290,286,288,288,288,288]},"warp_table_address":4160749568},"MAP_ROUTE102":{"fishing_encounters":{"address":5604528,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758468,"land_encounters":{"address":5604444,"slots":[286,290,286,290,295,295,288,288,288,392,288,298]},"warp_table_address":4160749568,"water_encounters":{"address":5604500,"slots":[183,183,183,183,118]}},"MAP_ROUTE103":{"fishing_encounters":{"address":5604660,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758496,"land_encounters":{"address":5604576,"slots":[286,286,286,286,309,288,288,288,309,309,309,309]},"warp_table_address":5437452,"water_encounters":{"address":5604632,"slots":[72,309,309,310,310]}},"MAP_ROUTE104":{"fishing_encounters":{"address":5604792,"slots":[129,129,129,129,129,129,129,129,129,129]},"header_address":4758524,"land_encounters":{"address":5604708,"slots":[286,290,286,183,183,286,304,304,309,309,309,309]},"warp_table_address":5438308,"water_encounters":{"address":5604764,"slots":[309,309,309,310,310]}},"MAP_ROUTE104_MR_BRINEYS_HOUSE":{"header_address":4764320,"warp_table_address":5484676},"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4764348,"warp_table_address":5484784},"MAP_ROUTE104_PROTOTYPE":{"header_address":4771880,"warp_table_address":4160749568},"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4771908,"warp_table_address":4160749568},"MAP_ROUTE105":{"fishing_encounters":{"address":5604868,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758552,"warp_table_address":5438720,"water_encounters":{"address":5604840,"slots":[72,309,309,310,310]}},"MAP_ROUTE106":{"fishing_encounters":{"address":5606728,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758580,"warp_table_address":5438892,"water_encounters":{"address":5606700,"slots":[72,309,309,310,310]}},"MAP_ROUTE107":{"fishing_encounters":{"address":5606804,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758608,"warp_table_address":4160749568,"water_encounters":{"address":5606776,"slots":[72,309,309,310,310]}},"MAP_ROUTE108":{"fishing_encounters":{"address":5606880,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758636,"warp_table_address":5439324,"water_encounters":{"address":5606852,"slots":[72,309,309,310,310]}},"MAP_ROUTE109":{"fishing_encounters":{"address":5606956,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758664,"warp_table_address":5439940,"water_encounters":{"address":5606928,"slots":[72,309,309,310,310]}},"MAP_ROUTE109_SEASHORE_HOUSE":{"header_address":4771936,"warp_table_address":5526472},"MAP_ROUTE110":{"fishing_encounters":{"address":5605000,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758692,"land_encounters":{"address":5604916,"slots":[286,337,367,337,354,43,354,367,309,309,353,353]},"warp_table_address":5440928,"water_encounters":{"address":5604972,"slots":[72,309,309,310,310]}},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":{"header_address":4772272,"warp_table_address":5529400},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":{"header_address":4772300,"warp_table_address":5529508},"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":{"header_address":4772020,"warp_table_address":5526740},"MAP_ROUTE110_TRICK_HOUSE_END":{"header_address":4771992,"warp_table_address":5526676},"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":{"header_address":4771964,"warp_table_address":5526532},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":{"header_address":4772048,"warp_table_address":5527152},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":{"header_address":4772076,"warp_table_address":5527328},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":{"header_address":4772104,"warp_table_address":5527616},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":{"header_address":4772132,"warp_table_address":5528072},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":{"header_address":4772160,"warp_table_address":5528248},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":{"header_address":4772188,"warp_table_address":5528752},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":{"header_address":4772216,"warp_table_address":5529024},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":{"header_address":4772244,"warp_table_address":5529320},"MAP_ROUTE111":{"fishing_encounters":{"address":5605160,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758720,"land_encounters":{"address":5605048,"slots":[27,332,27,332,318,318,27,332,318,344,344,344]},"warp_table_address":5442448,"water_encounters":{"address":5605104,"slots":[183,183,183,183,118]}},"MAP_ROUTE111_OLD_LADYS_REST_STOP":{"header_address":4764404,"warp_table_address":5484976},"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":{"header_address":4764376,"warp_table_address":5484916},"MAP_ROUTE112":{"header_address":4758748,"land_encounters":{"address":5605208,"slots":[339,339,183,339,339,183,339,183,339,339,339,339]},"warp_table_address":5443604},"MAP_ROUTE112_CABLE_CAR_STATION":{"header_address":4764432,"warp_table_address":5485060},"MAP_ROUTE113":{"header_address":4758776,"land_encounters":{"address":5605264,"slots":[308,308,218,308,308,218,308,218,308,227,308,227]},"warp_table_address":5444092},"MAP_ROUTE113_GLASS_WORKSHOP":{"header_address":4772328,"warp_table_address":5529640},"MAP_ROUTE114":{"fishing_encounters":{"address":5605432,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758804,"land_encounters":{"address":5605320,"slots":[358,295,358,358,295,296,296,296,379,379,379,299]},"warp_table_address":5445184,"water_encounters":{"address":5605376,"slots":[183,183,183,183,118]}},"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":{"header_address":4764488,"warp_table_address":5485204},"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":{"header_address":4764516,"warp_table_address":5485320},"MAP_ROUTE114_LANETTES_HOUSE":{"header_address":4764544,"warp_table_address":5485420},"MAP_ROUTE115":{"fishing_encounters":{"address":5607088,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758832,"land_encounters":{"address":5607004,"slots":[358,304,358,304,304,305,39,39,309,309,309,309]},"warp_table_address":5445988,"water_encounters":{"address":5607060,"slots":[72,309,309,310,310]}},"MAP_ROUTE116":{"header_address":4758860,"land_encounters":{"address":5605480,"slots":[286,370,301,63,301,304,304,304,286,286,315,315]},"warp_table_address":5446872},"MAP_ROUTE116_TUNNELERS_REST_HOUSE":{"header_address":4764572,"warp_table_address":5485564},"MAP_ROUTE117":{"fishing_encounters":{"address":5605620,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758888,"land_encounters":{"address":5605536,"slots":[286,43,286,43,183,43,387,387,387,387,386,298]},"warp_table_address":5447656,"water_encounters":{"address":5605592,"slots":[183,183,183,183,118]}},"MAP_ROUTE117_POKEMON_DAY_CARE":{"header_address":4764600,"warp_table_address":5485624},"MAP_ROUTE118":{"fishing_encounters":{"address":5605752,"slots":[129,72,129,72,330,331,330,330,330,330]},"header_address":4758916,"land_encounters":{"address":5605668,"slots":[288,337,288,337,289,338,309,309,309,309,309,317]},"warp_table_address":5448236,"water_encounters":{"address":5605724,"slots":[72,309,309,310,310]}},"MAP_ROUTE119":{"fishing_encounters":{"address":5607276,"slots":[129,72,129,72,330,330,330,330,330,330]},"header_address":4758944,"land_encounters":{"address":5607192,"slots":[288,289,288,43,289,43,43,43,369,369,369,317]},"warp_table_address":5449460,"water_encounters":{"address":5607248,"slots":[72,309,309,310,310]}},"MAP_ROUTE119_HOUSE":{"header_address":4772440,"warp_table_address":5530360},"MAP_ROUTE119_WEATHER_INSTITUTE_1F":{"header_address":4772384,"warp_table_address":5529880},"MAP_ROUTE119_WEATHER_INSTITUTE_2F":{"header_address":4772412,"warp_table_address":5530164},"MAP_ROUTE120":{"fishing_encounters":{"address":5607408,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758972,"land_encounters":{"address":5607324,"slots":[286,287,287,43,183,43,43,183,376,376,317,298]},"warp_table_address":5451160,"water_encounters":{"address":5607380,"slots":[183,183,183,183,118]}},"MAP_ROUTE121":{"fishing_encounters":{"address":5607540,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759000,"land_encounters":{"address":5607456,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5452364,"water_encounters":{"address":5607512,"slots":[72,309,309,310,310]}},"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":{"header_address":4764628,"warp_table_address":5485732},"MAP_ROUTE122":{"fishing_encounters":{"address":5607616,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759028,"warp_table_address":5452576,"water_encounters":{"address":5607588,"slots":[72,309,309,310,310]}},"MAP_ROUTE123":{"fishing_encounters":{"address":5607748,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759056,"land_encounters":{"address":5607664,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5453636,"water_encounters":{"address":5607720,"slots":[72,309,309,310,310]}},"MAP_ROUTE123_BERRY_MASTERS_HOUSE":{"header_address":4772356,"warp_table_address":5529724},"MAP_ROUTE124":{"fishing_encounters":{"address":5605828,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759084,"warp_table_address":5454436,"water_encounters":{"address":5605800,"slots":[72,309,309,310,310]}},"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":{"header_address":4772468,"warp_table_address":5530420},"MAP_ROUTE125":{"fishing_encounters":{"address":5608272,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759112,"warp_table_address":5454716,"water_encounters":{"address":5608244,"slots":[72,309,309,310,310]}},"MAP_ROUTE126":{"fishing_encounters":{"address":5608348,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759140,"warp_table_address":4160749568,"water_encounters":{"address":5608320,"slots":[72,309,309,310,310]}},"MAP_ROUTE127":{"fishing_encounters":{"address":5608424,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759168,"warp_table_address":4160749568,"water_encounters":{"address":5608396,"slots":[72,309,309,310,310]}},"MAP_ROUTE128":{"fishing_encounters":{"address":5608500,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4759196,"warp_table_address":4160749568,"water_encounters":{"address":5608472,"slots":[72,309,309,310,310]}},"MAP_ROUTE129":{"fishing_encounters":{"address":5608576,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759224,"warp_table_address":4160749568,"water_encounters":{"address":5608548,"slots":[72,309,309,310,314]}},"MAP_ROUTE130":{"fishing_encounters":{"address":5608708,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759252,"land_encounters":{"address":5608624,"slots":[360,360,360,360,360,360,360,360,360,360,360,360]},"warp_table_address":4160749568,"water_encounters":{"address":5608680,"slots":[72,309,309,310,310]}},"MAP_ROUTE131":{"fishing_encounters":{"address":5608784,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759280,"warp_table_address":5456116,"water_encounters":{"address":5608756,"slots":[72,309,309,310,310]}},"MAP_ROUTE132":{"fishing_encounters":{"address":5608860,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759308,"warp_table_address":4160749568,"water_encounters":{"address":5608832,"slots":[72,309,309,310,310]}},"MAP_ROUTE133":{"fishing_encounters":{"address":5608936,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759336,"warp_table_address":4160749568,"water_encounters":{"address":5608908,"slots":[72,309,309,310,310]}},"MAP_ROUTE134":{"fishing_encounters":{"address":5609012,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759364,"warp_table_address":4160749568,"water_encounters":{"address":5608984,"slots":[72,309,309,310,310]}},"MAP_RUSTBORO_CITY":{"header_address":4758076,"warp_table_address":5430936},"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":{"header_address":4762024,"warp_table_address":5472204},"MAP_RUSTBORO_CITY_DEVON_CORP_1F":{"header_address":4761716,"warp_table_address":5470532},"MAP_RUSTBORO_CITY_DEVON_CORP_2F":{"header_address":4761744,"warp_table_address":5470744},"MAP_RUSTBORO_CITY_DEVON_CORP_3F":{"header_address":4761772,"warp_table_address":5470852},"MAP_RUSTBORO_CITY_FLAT1_1F":{"header_address":4761940,"warp_table_address":5471808},"MAP_RUSTBORO_CITY_FLAT1_2F":{"header_address":4761968,"warp_table_address":5472044},"MAP_RUSTBORO_CITY_FLAT2_1F":{"header_address":4762080,"warp_table_address":5472372},"MAP_RUSTBORO_CITY_FLAT2_2F":{"header_address":4762108,"warp_table_address":5472464},"MAP_RUSTBORO_CITY_FLAT2_3F":{"header_address":4762136,"warp_table_address":5472548},"MAP_RUSTBORO_CITY_GYM":{"header_address":4761800,"warp_table_address":5471024},"MAP_RUSTBORO_CITY_HOUSE1":{"header_address":4761996,"warp_table_address":5472120},"MAP_RUSTBORO_CITY_HOUSE2":{"header_address":4762052,"warp_table_address":5472288},"MAP_RUSTBORO_CITY_HOUSE3":{"header_address":4762164,"warp_table_address":5472648},"MAP_RUSTBORO_CITY_MART":{"header_address":4761912,"warp_table_address":5471724},"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":{"header_address":4761856,"warp_table_address":5471444},"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":{"header_address":4761884,"warp_table_address":5471584},"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":{"header_address":4761828,"warp_table_address":5471252},"MAP_RUSTURF_TUNNEL":{"header_address":4764768,"land_encounters":{"address":5605932,"slots":[370,370,370,370,370,370,370,370,370,370,370,370]},"warp_table_address":5486644},"MAP_SAFARI_ZONE_NORTH":{"header_address":4769416,"land_encounters":{"address":5610280,"slots":[231,43,231,43,177,44,44,177,178,214,178,214]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHEAST":{"header_address":4769724,"land_encounters":{"address":5612476,"slots":[190,216,190,216,191,165,163,204,228,241,228,241]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHWEST":{"fishing_encounters":{"address":5610448,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769388,"land_encounters":{"address":5610364,"slots":[111,43,111,43,84,44,44,84,85,127,85,127]},"warp_table_address":4160749568,"water_encounters":{"address":5610420,"slots":[54,54,54,55,55]}},"MAP_SAFARI_ZONE_REST_HOUSE":{"header_address":4769696,"warp_table_address":5516996},"MAP_SAFARI_ZONE_SOUTH":{"header_address":4769472,"land_encounters":{"address":5606212,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515444},"MAP_SAFARI_ZONE_SOUTHEAST":{"fishing_encounters":{"address":5612428,"slots":[129,118,129,118,223,118,223,223,223,224]},"header_address":4769752,"land_encounters":{"address":5612344,"slots":[191,179,191,179,190,167,163,209,234,207,234,207]},"warp_table_address":4160749568,"water_encounters":{"address":5612400,"slots":[194,183,183,183,195]}},"MAP_SAFARI_ZONE_SOUTHWEST":{"fishing_encounters":{"address":5610232,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769444,"land_encounters":{"address":5610148,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515260,"water_encounters":{"address":5610204,"slots":[54,54,54,54,54]}},"MAP_SCORCHED_SLAB":{"header_address":4766700,"warp_table_address":5498144},"MAP_SEAFLOOR_CAVERN_ENTRANCE":{"fishing_encounters":{"address":5609764,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765412,"warp_table_address":5491796,"water_encounters":{"address":5609736,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM1":{"header_address":4765440,"land_encounters":{"address":5609136,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5491952},"MAP_SEAFLOOR_CAVERN_ROOM2":{"header_address":4765468,"land_encounters":{"address":5609192,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492188},"MAP_SEAFLOOR_CAVERN_ROOM3":{"header_address":4765496,"land_encounters":{"address":5609248,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492456},"MAP_SEAFLOOR_CAVERN_ROOM4":{"header_address":4765524,"land_encounters":{"address":5609304,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492548},"MAP_SEAFLOOR_CAVERN_ROOM5":{"header_address":4765552,"land_encounters":{"address":5609360,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492744},"MAP_SEAFLOOR_CAVERN_ROOM6":{"fishing_encounters":{"address":5609500,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765580,"land_encounters":{"address":5609416,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492788,"water_encounters":{"address":5609472,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM7":{"fishing_encounters":{"address":5609632,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765608,"land_encounters":{"address":5609548,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492832,"water_encounters":{"address":5609604,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM8":{"header_address":4765636,"land_encounters":{"address":5609680,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493156},"MAP_SEAFLOOR_CAVERN_ROOM9":{"header_address":4765664,"warp_table_address":5493360},"MAP_SEALED_CHAMBER_INNER_ROOM":{"header_address":4766672,"warp_table_address":5497984},"MAP_SEALED_CHAMBER_OUTER_ROOM":{"header_address":4766644,"warp_table_address":5497608},"MAP_SECRET_BASE_BLUE_CAVE1":{"header_address":4767736,"warp_table_address":5501652},"MAP_SECRET_BASE_BLUE_CAVE2":{"header_address":4767904,"warp_table_address":5503980},"MAP_SECRET_BASE_BLUE_CAVE3":{"header_address":4768072,"warp_table_address":5506308},"MAP_SECRET_BASE_BLUE_CAVE4":{"header_address":4768240,"warp_table_address":5508636},"MAP_SECRET_BASE_BROWN_CAVE1":{"header_address":4767708,"warp_table_address":5501264},"MAP_SECRET_BASE_BROWN_CAVE2":{"header_address":4767876,"warp_table_address":5503592},"MAP_SECRET_BASE_BROWN_CAVE3":{"header_address":4768044,"warp_table_address":5505920},"MAP_SECRET_BASE_BROWN_CAVE4":{"header_address":4768212,"warp_table_address":5508248},"MAP_SECRET_BASE_RED_CAVE1":{"header_address":4767680,"warp_table_address":5500876},"MAP_SECRET_BASE_RED_CAVE2":{"header_address":4767848,"warp_table_address":5503204},"MAP_SECRET_BASE_RED_CAVE3":{"header_address":4768016,"warp_table_address":5505532},"MAP_SECRET_BASE_RED_CAVE4":{"header_address":4768184,"warp_table_address":5507860},"MAP_SECRET_BASE_SHRUB1":{"header_address":4767820,"warp_table_address":5502816},"MAP_SECRET_BASE_SHRUB2":{"header_address":4767988,"warp_table_address":5505144},"MAP_SECRET_BASE_SHRUB3":{"header_address":4768156,"warp_table_address":5507472},"MAP_SECRET_BASE_SHRUB4":{"header_address":4768324,"warp_table_address":5509800},"MAP_SECRET_BASE_TREE1":{"header_address":4767792,"warp_table_address":5502428},"MAP_SECRET_BASE_TREE2":{"header_address":4767960,"warp_table_address":5504756},"MAP_SECRET_BASE_TREE3":{"header_address":4768128,"warp_table_address":5507084},"MAP_SECRET_BASE_TREE4":{"header_address":4768296,"warp_table_address":5509412},"MAP_SECRET_BASE_YELLOW_CAVE1":{"header_address":4767764,"warp_table_address":5502040},"MAP_SECRET_BASE_YELLOW_CAVE2":{"header_address":4767932,"warp_table_address":5504368},"MAP_SECRET_BASE_YELLOW_CAVE3":{"header_address":4768100,"warp_table_address":5506696},"MAP_SECRET_BASE_YELLOW_CAVE4":{"header_address":4768268,"warp_table_address":5509024},"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":{"header_address":4766056,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":{"header_address":4766084,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":{"fishing_encounters":{"address":5611436,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765944,"land_encounters":{"address":5611352,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494828,"water_encounters":{"address":5611408,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":{"header_address":4766980,"land_encounters":{"address":5612044,"slots":[41,341,41,341,41,341,346,341,42,346,42,346]},"warp_table_address":5498544},"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":{"fishing_encounters":{"address":5611304,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765972,"land_encounters":{"address":5611220,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494904,"water_encounters":{"address":5611276,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":{"header_address":4766028,"land_encounters":{"address":5611164,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495180},"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":{"header_address":4766000,"land_encounters":{"address":5611108,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495084},"MAP_SKY_PILLAR_1F":{"header_address":4766868,"land_encounters":{"address":5612100,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498328},"MAP_SKY_PILLAR_2F":{"header_address":4766896,"warp_table_address":5498372},"MAP_SKY_PILLAR_3F":{"header_address":4766924,"land_encounters":{"address":5612232,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498408},"MAP_SKY_PILLAR_4F":{"header_address":4766952,"warp_table_address":5498452},"MAP_SKY_PILLAR_5F":{"header_address":4767008,"land_encounters":{"address":5612288,"slots":[322,42,42,322,319,378,378,319,319,359,359,359]},"warp_table_address":5498572},"MAP_SKY_PILLAR_ENTRANCE":{"header_address":4766812,"warp_table_address":5498232},"MAP_SKY_PILLAR_OUTSIDE":{"header_address":4766840,"warp_table_address":5498292},"MAP_SKY_PILLAR_TOP":{"header_address":4767036,"warp_table_address":5498656},"MAP_SLATEPORT_CITY":{"fishing_encounters":{"address":5611664,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758020,"warp_table_address":5429836,"water_encounters":{"address":5611636,"slots":[72,309,309,310,310]}},"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":{"header_address":4761212,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":{"header_address":4761184,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":{"header_address":4761156,"warp_table_address":5466624},"MAP_SLATEPORT_CITY_HARBOR":{"header_address":4761352,"warp_table_address":5468328},"MAP_SLATEPORT_CITY_HOUSE":{"header_address":4761380,"warp_table_address":5468492},"MAP_SLATEPORT_CITY_MART":{"header_address":4761464,"warp_table_address":5468856},"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":{"header_address":4761240,"warp_table_address":5466832},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":{"header_address":4761296,"warp_table_address":5467456},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":{"header_address":4761324,"warp_table_address":5467856},"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":{"header_address":4761408,"warp_table_address":5468600},"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":{"header_address":4761436,"warp_table_address":5468740},"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":{"header_address":4761268,"warp_table_address":5467084},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":{"header_address":4761100,"warp_table_address":5466360},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":{"header_address":4761128,"warp_table_address":5466476},"MAP_SOOTOPOLIS_CITY":{"fishing_encounters":{"address":5612184,"slots":[129,72,129,129,129,129,129,130,130,130]},"header_address":4758188,"warp_table_address":5433852,"water_encounters":{"address":5612156,"slots":[129,129,129,129,129]}},"MAP_SOOTOPOLIS_CITY_GYM_1F":{"header_address":4763480,"warp_table_address":5481892},"MAP_SOOTOPOLIS_CITY_GYM_B1F":{"header_address":4763508,"warp_table_address":5482200},"MAP_SOOTOPOLIS_CITY_HOUSE1":{"header_address":4763620,"warp_table_address":5482664},"MAP_SOOTOPOLIS_CITY_HOUSE2":{"header_address":4763648,"warp_table_address":5482724},"MAP_SOOTOPOLIS_CITY_HOUSE3":{"header_address":4763676,"warp_table_address":5482808},"MAP_SOOTOPOLIS_CITY_HOUSE4":{"header_address":4763704,"warp_table_address":5482916},"MAP_SOOTOPOLIS_CITY_HOUSE5":{"header_address":4763732,"warp_table_address":5483000},"MAP_SOOTOPOLIS_CITY_HOUSE6":{"header_address":4763760,"warp_table_address":5483060},"MAP_SOOTOPOLIS_CITY_HOUSE7":{"header_address":4763788,"warp_table_address":5483144},"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":{"header_address":4763816,"warp_table_address":5483228},"MAP_SOOTOPOLIS_CITY_MART":{"header_address":4763592,"warp_table_address":5482580},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":{"header_address":4763844,"warp_table_address":5483312},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":{"header_address":4763872,"warp_table_address":5483380},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":{"header_address":4763536,"warp_table_address":5482324},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":{"header_address":4763564,"warp_table_address":5482464},"MAP_SOUTHERN_ISLAND_EXTERIOR":{"header_address":4769640,"warp_table_address":5516780},"MAP_SOUTHERN_ISLAND_INTERIOR":{"header_address":4769668,"warp_table_address":5516876},"MAP_SS_TIDAL_CORRIDOR":{"header_address":4768828,"warp_table_address":5510992},"MAP_SS_TIDAL_LOWER_DECK":{"header_address":4768856,"warp_table_address":5511276},"MAP_SS_TIDAL_ROOMS":{"header_address":4768884,"warp_table_address":5511508},"MAP_TERRA_CAVE_END":{"header_address":4767596,"warp_table_address":5500392},"MAP_TERRA_CAVE_ENTRANCE":{"header_address":4767568,"warp_table_address":5500332},"MAP_TRADE_CENTER":{"header_address":4768380,"warp_table_address":5509944},"MAP_TRAINER_HILL_1F":{"header_address":4771096,"warp_table_address":5525172},"MAP_TRAINER_HILL_2F":{"header_address":4771124,"warp_table_address":5525208},"MAP_TRAINER_HILL_3F":{"header_address":4771152,"warp_table_address":5525244},"MAP_TRAINER_HILL_4F":{"header_address":4771180,"warp_table_address":5525280},"MAP_TRAINER_HILL_ELEVATOR":{"header_address":4771852,"warp_table_address":5526300},"MAP_TRAINER_HILL_ENTRANCE":{"header_address":4771068,"warp_table_address":5525100},"MAP_TRAINER_HILL_ROOF":{"header_address":4771208,"warp_table_address":5525340},"MAP_UNDERWATER_MARINE_CAVE":{"header_address":4767484,"warp_table_address":5500208},"MAP_UNDERWATER_ROUTE105":{"header_address":4759532,"warp_table_address":5457348},"MAP_UNDERWATER_ROUTE124":{"header_address":4759392,"warp_table_address":4160749568,"water_encounters":{"address":5612016,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE125":{"header_address":4759560,"warp_table_address":5457384},"MAP_UNDERWATER_ROUTE126":{"header_address":4759420,"warp_table_address":5457052,"water_encounters":{"address":5606268,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE127":{"header_address":4759448,"warp_table_address":5457176},"MAP_UNDERWATER_ROUTE128":{"header_address":4759476,"warp_table_address":5457260},"MAP_UNDERWATER_ROUTE129":{"header_address":4759504,"warp_table_address":5457312},"MAP_UNDERWATER_ROUTE134":{"header_address":4766588,"warp_table_address":5497540},"MAP_UNDERWATER_SEAFLOOR_CAVERN":{"header_address":4765384,"warp_table_address":5491744},"MAP_UNDERWATER_SEALED_CHAMBER":{"header_address":4766616,"warp_table_address":5497568},"MAP_UNDERWATER_SOOTOPOLIS_CITY":{"header_address":4764796,"warp_table_address":5486768},"MAP_UNION_ROOM":{"header_address":4769360,"warp_table_address":5514872},"MAP_UNUSED_CONTEST_HALL1":{"header_address":4768492,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL2":{"header_address":4768520,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL3":{"header_address":4768548,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL4":{"header_address":4768576,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL5":{"header_address":4768604,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL6":{"header_address":4768632,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN":{"header_address":4758384,"warp_table_address":5436044},"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760512,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760484,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760456,"warp_table_address":5463128},"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":{"header_address":4760652,"warp_table_address":5463928},"MAP_VERDANTURF_TOWN_HOUSE":{"header_address":4760680,"warp_table_address":5464012},"MAP_VERDANTURF_TOWN_MART":{"header_address":4760540,"warp_table_address":5463408},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":{"header_address":4760568,"warp_table_address":5463540},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":{"header_address":4760596,"warp_table_address":5463680},"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":{"header_address":4760624,"warp_table_address":5463844},"MAP_VICTORY_ROAD_1F":{"header_address":4765860,"land_encounters":{"address":5606156,"slots":[42,336,383,371,41,335,42,336,382,370,382,370]},"warp_table_address":5493852},"MAP_VICTORY_ROAD_B1F":{"header_address":4765888,"land_encounters":{"address":5610496,"slots":[42,336,383,383,42,336,42,336,383,355,383,355]},"warp_table_address":5494460},"MAP_VICTORY_ROAD_B2F":{"fishing_encounters":{"address":5610664,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4765916,"land_encounters":{"address":5610580,"slots":[42,322,383,383,42,322,42,322,383,355,383,355]},"warp_table_address":5494704,"water_encounters":{"address":5610636,"slots":[42,42,42,42,42]}}},"misc_pokemon":[{"address":2572358,"species":385},{"address":2018148,"species":360},{"address":2323175,"species":101},{"address":2323252,"species":101},{"address":2581669,"species":317},{"address":2581574,"species":317},{"address":2581688,"species":317},{"address":2581593,"species":317},{"address":2581612,"species":317},{"address":2581631,"species":317},{"address":2581650,"species":317},{"address":2065036,"species":317},{"address":2386223,"species":185},{"address":2339323,"species":100},{"address":2339400,"species":100},{"address":2339477,"species":100}],"misc_ram_addresses":{"CB2_Overworld":134768624,"gArchipelagoDeathLinkQueued":33804824,"gArchipelagoReceivedItem":33804776,"gMain":50340544,"gPlayerParty":33703196,"gSaveBlock1Ptr":50355596,"gSaveBlock2Ptr":50355600},"misc_rom_addresses":{"gArchipelagoInfo":5912960,"gArchipelagoItemNames":5896457,"gArchipelagoNameTable":5905457,"gArchipelagoOptions":5895556,"gArchipelagoPlayerNames":5895607,"gBattleMoves":3281380,"gEvolutionTable":3318404,"gLevelUpLearnsets":3334884,"gRandomizedBerryTreeItems":5843560,"gRandomizedSoundTable":10155508,"gSpeciesInfo":3296744,"gTMHMLearnsets":3289780,"gTrainers":3230072,"gTutorMoves":6428060,"sFanfares":5422580,"sNewGamePCItems":6210444,"sStarterMon":6021752,"sTMHMMoves":6432208,"sTutorLearnsets":6428120},"species":[{"abilities":[0,0],"address":3296744,"base_stats":[0,0,0,0,0,0],"catch_rate":0,"evolutions":[],"friendship":0,"id":0,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3296772,"base_stats":[45,49,49,45,65,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":2}],"friendship":70,"id":1,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296800,"base_stats":[60,62,63,60,80,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":3}],"friendship":70,"id":2,"learnset":{"address":3308308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":38,"move_id":74},{"level":47,"move_id":235},{"level":56,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296828,"base_stats":[80,82,83,80,100,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":3,"learnset":{"address":3308338,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":1,"move_id":22},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":41,"move_id":74},{"level":53,"move_id":235},{"level":65,"move_id":76}]},"tmhm_learnset":"00E41E0886354730","types":[12,3]},{"abilities":[66,0],"address":3296856,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":5}],"friendship":70,"id":4,"learnset":{"address":3308368,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":19,"move_id":99},{"level":25,"move_id":184},{"level":31,"move_id":53},{"level":37,"move_id":163},{"level":43,"move_id":82},{"level":49,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296884,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":6}],"friendship":70,"id":5,"learnset":{"address":3308394,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":41,"move_id":163},{"level":48,"move_id":82},{"level":55,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296912,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":6,"learnset":{"address":3308420,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":1,"move_id":108},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":36,"move_id":17},{"level":44,"move_id":163},{"level":54,"move_id":82},{"level":64,"move_id":83}]},"tmhm_learnset":"00AE5EA4CE514633","types":[10,2]},{"abilities":[67,0],"address":3296940,"base_stats":[44,48,65,43,50,64],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":8}],"friendship":70,"id":7,"learnset":{"address":3308448,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":18,"move_id":44},{"level":23,"move_id":229},{"level":28,"move_id":182},{"level":33,"move_id":240},{"level":40,"move_id":130},{"level":47,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296968,"base_stats":[59,63,80,58,65,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":9}],"friendship":70,"id":8,"learnset":{"address":3308478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":37,"move_id":240},{"level":45,"move_id":130},{"level":53,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296996,"base_stats":[79,83,100,78,85,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":9,"learnset":{"address":3308508,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":1,"move_id":110},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":42,"move_id":240},{"level":55,"move_id":130},{"level":68,"move_id":56}]},"tmhm_learnset":"03B01E00CE537275","types":[11,11]},{"abilities":[19,0],"address":3297024,"base_stats":[45,30,35,45,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":11}],"friendship":70,"id":10,"learnset":{"address":3308538,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3297052,"base_stats":[50,20,55,30,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":12}],"friendship":70,"id":11,"learnset":{"address":3308548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[14,0],"address":3297080,"base_stats":[60,45,50,70,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":12,"learnset":{"address":3308560,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":77},{"level":14,"move_id":78},{"level":15,"move_id":79},{"level":18,"move_id":48},{"level":23,"move_id":18},{"level":28,"move_id":16},{"level":34,"move_id":60},{"level":40,"move_id":219},{"level":47,"move_id":318}]},"tmhm_learnset":"0040BE80B43F4620","types":[6,2]},{"abilities":[19,0],"address":3297108,"base_stats":[40,35,30,50,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":14}],"friendship":70,"id":13,"learnset":{"address":3308590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[61,0],"address":3297136,"base_stats":[45,25,50,35,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":15}],"friendship":70,"id":14,"learnset":{"address":3308600,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[68,0],"address":3297164,"base_stats":[65,80,40,75,45,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":15,"learnset":{"address":3308612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":31},{"level":10,"move_id":31},{"level":15,"move_id":116},{"level":20,"move_id":41},{"level":25,"move_id":99},{"level":30,"move_id":228},{"level":35,"move_id":42},{"level":40,"move_id":97},{"level":45,"move_id":283}]},"tmhm_learnset":"00843E88C4354620","types":[6,3]},{"abilities":[51,0],"address":3297192,"base_stats":[40,45,40,56,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":17}],"friendship":70,"id":16,"learnset":{"address":3308638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":19,"move_id":18},{"level":25,"move_id":17},{"level":31,"move_id":297},{"level":39,"move_id":97},{"level":47,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297220,"base_stats":[63,60,55,71,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":18}],"friendship":70,"id":17,"learnset":{"address":3308664,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":43,"move_id":97},{"level":52,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297248,"base_stats":[83,80,75,91,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":18,"learnset":{"address":3308690,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":1,"move_id":98},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":48,"move_id":97},{"level":62,"move_id":119}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[50,62],"address":3297276,"base_stats":[30,56,35,72,25,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":20}],"friendship":70,"id":19,"learnset":{"address":3308716,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":116},{"level":27,"move_id":228},{"level":34,"move_id":162},{"level":41,"move_id":283}]},"tmhm_learnset":"00843E02ADD33E20","types":[0,0]},{"abilities":[50,62],"address":3297304,"base_stats":[55,81,60,97,50,70],"catch_rate":127,"evolutions":[],"friendship":70,"id":20,"learnset":{"address":3308738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":184},{"level":30,"move_id":228},{"level":40,"move_id":162},{"level":50,"move_id":283}]},"tmhm_learnset":"00A43E02ADD37E30","types":[0,0]},{"abilities":[51,0],"address":3297332,"base_stats":[40,60,30,70,31,31],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":22}],"friendship":70,"id":21,"learnset":{"address":3308760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":19,"move_id":228},{"level":25,"move_id":332},{"level":31,"move_id":119},{"level":37,"move_id":65},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297360,"base_stats":[65,90,65,100,61,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":22,"learnset":{"address":3308784,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":43},{"level":1,"move_id":31},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":26,"move_id":228},{"level":32,"move_id":119},{"level":40,"move_id":65},{"level":47,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[22,61],"address":3297388,"base_stats":[35,60,44,55,40,54],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":24}],"friendship":70,"id":23,"learnset":{"address":3308806,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":25,"move_id":103},{"level":32,"move_id":51},{"level":37,"move_id":254},{"level":37,"move_id":256},{"level":37,"move_id":255},{"level":44,"move_id":114}]},"tmhm_learnset":"00213F088E570620","types":[3,3]},{"abilities":[22,61],"address":3297416,"base_stats":[60,85,69,80,65,79],"catch_rate":90,"evolutions":[],"friendship":70,"id":24,"learnset":{"address":3308834,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":40},{"level":1,"move_id":44},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":28,"move_id":103},{"level":38,"move_id":51},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255},{"level":56,"move_id":114}]},"tmhm_learnset":"00213F088E574620","types":[3,3]},{"abilities":[9,0],"address":3297444,"base_stats":[35,55,30,90,50,40],"catch_rate":190,"evolutions":[{"method":"ITEM","param":96,"species":26}],"friendship":70,"id":25,"learnset":{"address":3308862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":45},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":98},{"level":15,"move_id":104},{"level":20,"move_id":21},{"level":26,"move_id":85},{"level":33,"move_id":97},{"level":41,"move_id":87},{"level":50,"move_id":113}]},"tmhm_learnset":"00E01E02CDD38221","types":[13,13]},{"abilities":[9,0],"address":3297472,"base_stats":[60,90,55,100,90,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":26,"learnset":{"address":3308890,"moves":[{"level":1,"move_id":84},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":1,"move_id":85}]},"tmhm_learnset":"00E03E02CDD3C221","types":[13,13]},{"abilities":[8,0],"address":3297500,"base_stats":[50,75,85,40,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":28}],"friendship":70,"id":27,"learnset":{"address":3308900,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":23,"move_id":163},{"level":30,"move_id":129},{"level":37,"move_id":154},{"level":45,"move_id":328},{"level":53,"move_id":201}]},"tmhm_learnset":"00A43ED0CE510621","types":[4,4]},{"abilities":[8,0],"address":3297528,"base_stats":[75,100,110,65,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":28,"learnset":{"address":3308926,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":28},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":24,"move_id":163},{"level":33,"move_id":129},{"level":42,"move_id":154},{"level":52,"move_id":328},{"level":62,"move_id":201}]},"tmhm_learnset":"00A43ED0CE514621","types":[4,4]},{"abilities":[38,0],"address":3297556,"base_stats":[55,47,52,41,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":30}],"friendship":70,"id":29,"learnset":{"address":3308952,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":44},{"level":23,"move_id":270},{"level":30,"move_id":154},{"level":38,"move_id":260},{"level":47,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297584,"base_stats":[70,62,67,56,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":31}],"friendship":70,"id":30,"learnset":{"address":3308978,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":44},{"level":26,"move_id":270},{"level":34,"move_id":154},{"level":43,"move_id":260},{"level":53,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297612,"base_stats":[90,82,87,76,75,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":31,"learnset":{"address":3309004,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":34}]},"tmhm_learnset":"00B43FFEEFD37E35","types":[3,4]},{"abilities":[38,0],"address":3297640,"base_stats":[46,57,40,50,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":33}],"friendship":70,"id":32,"learnset":{"address":3309016,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":30},{"level":23,"move_id":270},{"level":30,"move_id":31},{"level":38,"move_id":260},{"level":47,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297668,"base_stats":[61,72,57,65,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":34}],"friendship":70,"id":33,"learnset":{"address":3309042,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":30},{"level":26,"move_id":270},{"level":34,"move_id":31},{"level":43,"move_id":260},{"level":53,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297696,"base_stats":[81,92,77,85,85,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":34,"learnset":{"address":3309068,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":116},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":37}]},"tmhm_learnset":"00B43F7EEFD37E35","types":[3,4]},{"abilities":[56,0],"address":3297724,"base_stats":[70,45,48,35,60,65],"catch_rate":150,"evolutions":[{"method":"ITEM","param":94,"species":36}],"friendship":140,"id":35,"learnset":{"address":3309080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":227},{"level":9,"move_id":47},{"level":13,"move_id":3},{"level":17,"move_id":266},{"level":21,"move_id":107},{"level":25,"move_id":111},{"level":29,"move_id":118},{"level":33,"move_id":322},{"level":37,"move_id":236},{"level":41,"move_id":113},{"level":45,"move_id":309}]},"tmhm_learnset":"00611E27FDFBB62D","types":[0,0]},{"abilities":[56,0],"address":3297752,"base_stats":[95,70,73,60,85,90],"catch_rate":25,"evolutions":[],"friendship":140,"id":36,"learnset":{"address":3309112,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":3},{"level":1,"move_id":107},{"level":1,"move_id":118}]},"tmhm_learnset":"00611E27FDFBF62D","types":[0,0]},{"abilities":[18,0],"address":3297780,"base_stats":[38,41,40,65,50,65],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":38}],"friendship":70,"id":37,"learnset":{"address":3309122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":5,"move_id":39},{"level":9,"move_id":46},{"level":13,"move_id":98},{"level":17,"move_id":261},{"level":21,"move_id":109},{"level":25,"move_id":286},{"level":29,"move_id":53},{"level":33,"move_id":219},{"level":37,"move_id":288},{"level":41,"move_id":83}]},"tmhm_learnset":"00021E248C590630","types":[10,10]},{"abilities":[18,0],"address":3297808,"base_stats":[73,76,75,100,81,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":38,"learnset":{"address":3309152,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":98},{"level":1,"move_id":109},{"level":1,"move_id":219},{"level":45,"move_id":83}]},"tmhm_learnset":"00021E248C594630","types":[10,10]},{"abilities":[56,0],"address":3297836,"base_stats":[115,45,20,20,45,25],"catch_rate":170,"evolutions":[{"method":"ITEM","param":94,"species":40}],"friendship":70,"id":39,"learnset":{"address":3309164,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":50},{"level":19,"move_id":205},{"level":24,"move_id":3},{"level":29,"move_id":156},{"level":34,"move_id":34},{"level":39,"move_id":102},{"level":44,"move_id":304},{"level":49,"move_id":38}]},"tmhm_learnset":"00611E27FDBBB625","types":[0,0]},{"abilities":[56,0],"address":3297864,"base_stats":[140,70,45,45,75,50],"catch_rate":50,"evolutions":[],"friendship":70,"id":40,"learnset":{"address":3309194,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":50},{"level":1,"move_id":111},{"level":1,"move_id":3}]},"tmhm_learnset":"00611E27FDBBF625","types":[0,0]},{"abilities":[39,0],"address":3297892,"base_stats":[40,45,35,55,30,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":42}],"friendship":70,"id":41,"learnset":{"address":3309204,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":141},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":26,"move_id":109},{"level":31,"move_id":314},{"level":36,"move_id":212},{"level":41,"move_id":305},{"level":46,"move_id":114}]},"tmhm_learnset":"00017F88A4170E20","types":[3,2]},{"abilities":[39,0],"address":3297920,"base_stats":[75,80,70,90,65,75],"catch_rate":90,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":169}],"friendship":70,"id":42,"learnset":{"address":3309232,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00017F88A4174E20","types":[3,2]},{"abilities":[34,0],"address":3297948,"base_stats":[45,50,55,30,75,65],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":44}],"friendship":70,"id":43,"learnset":{"address":3309260,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":23,"move_id":51},{"level":32,"move_id":236},{"level":39,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3297976,"base_stats":[60,65,70,40,85,75],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":45},{"method":"ITEM","param":93,"species":182}],"friendship":70,"id":44,"learnset":{"address":3309284,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":77},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":24,"move_id":51},{"level":35,"move_id":236},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298004,"base_stats":[75,80,85,50,100,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":45,"learnset":{"address":3309308,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":312},{"level":1,"move_id":78},{"level":1,"move_id":72},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884354720","types":[12,3]},{"abilities":[27,0],"address":3298032,"base_stats":[35,70,55,25,45,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":24,"species":47}],"friendship":70,"id":46,"learnset":{"address":3309320,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":25,"move_id":147},{"level":31,"move_id":163},{"level":37,"move_id":74},{"level":43,"move_id":202},{"level":49,"move_id":312}]},"tmhm_learnset":"00C43E888C350720","types":[6,12]},{"abilities":[27,0],"address":3298060,"base_stats":[60,95,80,30,60,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":47,"learnset":{"address":3309346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":78},{"level":1,"move_id":77},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":27,"move_id":147},{"level":35,"move_id":163},{"level":43,"move_id":74},{"level":51,"move_id":202},{"level":59,"move_id":312}]},"tmhm_learnset":"00C43E888C354720","types":[6,12]},{"abilities":[14,0],"address":3298088,"base_stats":[60,55,50,45,40,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":49}],"friendship":70,"id":48,"learnset":{"address":3309372,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":33,"move_id":60},{"level":36,"move_id":79},{"level":41,"move_id":94}]},"tmhm_learnset":"0040BE0894350620","types":[6,3]},{"abilities":[19,0],"address":3298116,"base_stats":[70,65,60,90,90,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":49,"learnset":{"address":3309398,"moves":[{"level":1,"move_id":318},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":1,"move_id":48},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":31,"move_id":16},{"level":36,"move_id":60},{"level":42,"move_id":79},{"level":52,"move_id":94}]},"tmhm_learnset":"0040BE8894354620","types":[6,3]},{"abilities":[8,71],"address":3298144,"base_stats":[10,55,25,95,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":26,"species":51}],"friendship":70,"id":50,"learnset":{"address":3309428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":33,"move_id":163},{"level":41,"move_id":89},{"level":49,"move_id":90}]},"tmhm_learnset":"00843EC88E110620","types":[4,4]},{"abilities":[8,71],"address":3298172,"base_stats":[35,80,50,120,50,70],"catch_rate":50,"evolutions":[],"friendship":70,"id":51,"learnset":{"address":3309452,"moves":[{"level":1,"move_id":161},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":1,"move_id":45},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":26,"move_id":328},{"level":38,"move_id":163},{"level":51,"move_id":89},{"level":64,"move_id":90}]},"tmhm_learnset":"00843EC88E114620","types":[4,4]},{"abilities":[53,0],"address":3298200,"base_stats":[40,45,35,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":28,"species":53}],"friendship":70,"id":52,"learnset":{"address":3309478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":28,"move_id":185},{"level":35,"move_id":103},{"level":41,"move_id":154},{"level":46,"move_id":163},{"level":50,"move_id":252}]},"tmhm_learnset":"00453F82ADD30E24","types":[0,0]},{"abilities":[7,0],"address":3298228,"base_stats":[65,70,60,115,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":53,"learnset":{"address":3309502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":44},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":29,"move_id":185},{"level":38,"move_id":103},{"level":46,"move_id":154},{"level":53,"move_id":163},{"level":59,"move_id":252}]},"tmhm_learnset":"00453F82ADD34E34","types":[0,0]},{"abilities":[6,13],"address":3298256,"base_stats":[50,52,48,55,65,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":33,"species":55}],"friendship":70,"id":54,"learnset":{"address":3309526,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":40,"move_id":154},{"level":50,"move_id":56}]},"tmhm_learnset":"03F01E80CC53326D","types":[11,11]},{"abilities":[6,13],"address":3298284,"base_stats":[80,82,78,85,95,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":55,"learnset":{"address":3309550,"moves":[{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":50},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":44,"move_id":154},{"level":58,"move_id":56}]},"tmhm_learnset":"03F01E80CC53726D","types":[11,11]},{"abilities":[72,0],"address":3298312,"base_stats":[40,80,35,70,35,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":57}],"friendship":70,"id":56,"learnset":{"address":3309574,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":33,"move_id":69},{"level":39,"move_id":238},{"level":45,"move_id":103},{"level":51,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD30EA1","types":[1,1]},{"abilities":[72,0],"address":3298340,"base_stats":[65,105,60,95,60,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":57,"learnset":{"address":3309600,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":67},{"level":1,"move_id":99},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":28,"move_id":99},{"level":36,"move_id":69},{"level":45,"move_id":238},{"level":54,"move_id":103},{"level":63,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD34EA1","types":[1,1]},{"abilities":[22,18],"address":3298368,"base_stats":[55,70,45,60,70,50],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":59}],"friendship":70,"id":58,"learnset":{"address":3309628,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":7,"move_id":52},{"level":13,"move_id":43},{"level":19,"move_id":316},{"level":25,"move_id":36},{"level":31,"move_id":172},{"level":37,"move_id":270},{"level":43,"move_id":97},{"level":49,"move_id":53}]},"tmhm_learnset":"00A23EA48C510630","types":[10,10]},{"abilities":[22,18],"address":3298396,"base_stats":[90,110,80,95,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":59,"learnset":{"address":3309654,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":1,"move_id":52},{"level":1,"move_id":316},{"level":49,"move_id":245}]},"tmhm_learnset":"00A23EA48C514630","types":[10,10]},{"abilities":[11,6],"address":3298424,"base_stats":[40,50,40,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":61}],"friendship":70,"id":60,"learnset":{"address":3309666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":25,"move_id":240},{"level":31,"move_id":34},{"level":37,"move_id":187},{"level":43,"move_id":56}]},"tmhm_learnset":"03103E009C133264","types":[11,11]},{"abilities":[11,6],"address":3298452,"base_stats":[65,65,65,90,50,50],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":62},{"method":"ITEM","param":187,"species":186}],"friendship":70,"id":61,"learnset":{"address":3309690,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":95},{"level":1,"move_id":55},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":27,"move_id":240},{"level":35,"move_id":34},{"level":43,"move_id":187},{"level":51,"move_id":56}]},"tmhm_learnset":"03B03E00DE133265","types":[11,11]},{"abilities":[11,6],"address":3298480,"base_stats":[90,85,95,70,70,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":62,"learnset":{"address":3309714,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":66},{"level":35,"move_id":66},{"level":51,"move_id":170}]},"tmhm_learnset":"03B03E40DE1372E5","types":[11,1]},{"abilities":[28,39],"address":3298508,"base_stats":[25,20,15,90,105,55],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":16,"species":64}],"friendship":70,"id":63,"learnset":{"address":3309728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":100}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298536,"base_stats":[40,35,30,105,120,70],"catch_rate":100,"evolutions":[{"method":"LEVEL","param":37,"species":65}],"friendship":70,"id":64,"learnset":{"address":3309738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":272},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298564,"base_stats":[55,50,45,120,135,85],"catch_rate":50,"evolutions":[],"friendship":70,"id":65,"learnset":{"address":3309766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":347},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45BCE29","types":[14,14]},{"abilities":[62,0],"address":3298592,"base_stats":[70,80,50,35,35,35],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":28,"species":67}],"friendship":70,"id":66,"learnset":{"address":3309794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":31,"move_id":233},{"level":37,"move_id":66},{"level":40,"move_id":238},{"level":43,"move_id":184},{"level":49,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298620,"base_stats":[80,100,70,45,50,60],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":68}],"friendship":70,"id":67,"learnset":{"address":3309824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298648,"base_stats":[90,130,80,55,65,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":68,"learnset":{"address":3309854,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1346A1","types":[1,1]},{"abilities":[34,0],"address":3298676,"base_stats":[50,75,35,40,70,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":70}],"friendship":70,"id":69,"learnset":{"address":3309884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":23,"move_id":51},{"level":30,"move_id":230},{"level":37,"move_id":75},{"level":45,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298704,"base_stats":[65,90,50,55,85,45],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":71}],"friendship":70,"id":70,"learnset":{"address":3309912,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":1,"move_id":74},{"level":1,"move_id":35},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":24,"move_id":51},{"level":33,"move_id":230},{"level":42,"move_id":75},{"level":54,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298732,"base_stats":[80,105,65,70,100,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":71,"learnset":{"address":3309940,"moves":[{"level":1,"move_id":22},{"level":1,"move_id":79},{"level":1,"move_id":230},{"level":1,"move_id":75}]},"tmhm_learnset":"00443E0884354720","types":[12,3]},{"abilities":[29,64],"address":3298760,"base_stats":[40,40,35,70,50,100],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":73}],"friendship":70,"id":72,"learnset":{"address":3309950,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":36,"move_id":112},{"level":43,"move_id":103},{"level":49,"move_id":56}]},"tmhm_learnset":"03143E0884173264","types":[11,3]},{"abilities":[29,64],"address":3298788,"base_stats":[80,70,65,100,80,120],"catch_rate":60,"evolutions":[],"friendship":70,"id":73,"learnset":{"address":3309976,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":48},{"level":1,"move_id":132},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":38,"move_id":112},{"level":47,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03143E0884177264","types":[11,3]},{"abilities":[69,5],"address":3298816,"base_stats":[40,80,100,20,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":75}],"friendship":70,"id":74,"learnset":{"address":3310002,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":26,"move_id":205},{"level":31,"move_id":350},{"level":36,"move_id":89},{"level":41,"move_id":153},{"level":46,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298844,"base_stats":[55,95,115,35,45,45],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":37,"species":76}],"friendship":70,"id":75,"learnset":{"address":3310030,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298872,"base_stats":[80,110,130,45,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":76,"learnset":{"address":3310058,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE114631","types":[5,4]},{"abilities":[50,18],"address":3298900,"base_stats":[50,85,55,90,65,65],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":40,"species":78}],"friendship":70,"id":77,"learnset":{"address":3310086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":45,"move_id":340},{"level":53,"move_id":126}]},"tmhm_learnset":"00221E2484710620","types":[10,10]},{"abilities":[50,18],"address":3298928,"base_stats":[65,100,70,105,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":78,"learnset":{"address":3310114,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":52},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":40,"move_id":31},{"level":50,"move_id":340},{"level":63,"move_id":126}]},"tmhm_learnset":"00221E2484714620","types":[10,10]},{"abilities":[12,20],"address":3298956,"base_stats":[90,65,65,15,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":80},{"method":"ITEM","param":187,"species":199}],"friendship":70,"id":79,"learnset":{"address":3310144,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":133},{"level":48,"move_id":94}]},"tmhm_learnset":"02709E24BE5B366C","types":[11,14]},{"abilities":[12,20],"address":3298984,"base_stats":[95,75,110,30,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":80,"learnset":{"address":3310168,"moves":[{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":37,"move_id":110},{"level":46,"move_id":133},{"level":54,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[42,5],"address":3299012,"base_stats":[25,35,70,45,95,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":82}],"friendship":70,"id":81,"learnset":{"address":3310194,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":32,"move_id":199},{"level":38,"move_id":129},{"level":44,"move_id":103},{"level":50,"move_id":192}]},"tmhm_learnset":"00400E0385930620","types":[13,8]},{"abilities":[42,5],"address":3299040,"base_stats":[50,60,95,70,120,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":82,"learnset":{"address":3310222,"moves":[{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":1,"move_id":84},{"level":1,"move_id":48},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":35,"move_id":199},{"level":44,"move_id":161},{"level":53,"move_id":103},{"level":62,"move_id":192}]},"tmhm_learnset":"00400E0385934620","types":[13,8]},{"abilities":[51,39],"address":3299068,"base_stats":[52,65,55,60,58,62],"catch_rate":45,"evolutions":[],"friendship":70,"id":83,"learnset":{"address":3310250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":6,"move_id":28},{"level":11,"move_id":43},{"level":16,"move_id":31},{"level":21,"move_id":282},{"level":26,"move_id":210},{"level":31,"move_id":14},{"level":36,"move_id":97},{"level":41,"move_id":163},{"level":46,"move_id":206}]},"tmhm_learnset":"000C7E8084510620","types":[0,2]},{"abilities":[50,48],"address":3299096,"base_stats":[35,85,45,75,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":85}],"friendship":70,"id":84,"learnset":{"address":3310278,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":33,"move_id":253},{"level":37,"move_id":65},{"level":45,"move_id":97}]},"tmhm_learnset":"00087E8084110620","types":[0,2]},{"abilities":[50,48],"address":3299124,"base_stats":[60,110,70,100,60,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":85,"learnset":{"address":3310302,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":228},{"level":1,"move_id":31},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":38,"move_id":253},{"level":47,"move_id":65},{"level":60,"move_id":97}]},"tmhm_learnset":"00087F8084114E20","types":[0,2]},{"abilities":[47,0],"address":3299152,"base_stats":[65,45,55,45,45,70],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":34,"species":87}],"friendship":70,"id":86,"learnset":{"address":3310326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":29},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":37,"move_id":36},{"level":41,"move_id":58},{"level":49,"move_id":219}]},"tmhm_learnset":"03103E00841B3264","types":[11,11]},{"abilities":[47,0],"address":3299180,"base_stats":[90,70,80,70,70,95],"catch_rate":75,"evolutions":[],"friendship":70,"id":87,"learnset":{"address":3310350,"moves":[{"level":1,"move_id":29},{"level":1,"move_id":45},{"level":1,"move_id":196},{"level":1,"move_id":62},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":34,"move_id":329},{"level":42,"move_id":36},{"level":51,"move_id":58},{"level":64,"move_id":219}]},"tmhm_learnset":"03103E00841B7264","types":[11,15]},{"abilities":[1,60],"address":3299208,"base_stats":[80,80,50,25,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":89}],"friendship":70,"id":88,"learnset":{"address":3310376,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":43,"move_id":188},{"level":53,"move_id":262}]},"tmhm_learnset":"00003F6E8D970E20","types":[3,3]},{"abilities":[1,60],"address":3299236,"base_stats":[105,105,75,50,65,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":89,"learnset":{"address":3310402,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":47,"move_id":188},{"level":61,"move_id":262}]},"tmhm_learnset":"00A03F6ECD974E21","types":[3,3]},{"abilities":[75,0],"address":3299264,"base_stats":[30,65,100,40,45,25],"catch_rate":190,"evolutions":[{"method":"ITEM","param":97,"species":91}],"friendship":70,"id":90,"learnset":{"address":3310428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":110},{"level":9,"move_id":48},{"level":17,"move_id":62},{"level":25,"move_id":182},{"level":33,"move_id":43},{"level":41,"move_id":128},{"level":49,"move_id":58}]},"tmhm_learnset":"02101E0084133264","types":[11,11]},{"abilities":[75,0],"address":3299292,"base_stats":[50,95,180,70,85,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":91,"learnset":{"address":3310450,"moves":[{"level":1,"move_id":110},{"level":1,"move_id":48},{"level":1,"move_id":62},{"level":1,"move_id":182},{"level":33,"move_id":191},{"level":41,"move_id":131}]},"tmhm_learnset":"02101F0084137264","types":[11,15]},{"abilities":[26,0],"address":3299320,"base_stats":[30,35,30,80,100,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":93}],"friendship":70,"id":92,"learnset":{"address":3310464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":28,"move_id":109},{"level":33,"move_id":138},{"level":36,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299348,"base_stats":[45,50,45,95,115,55],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":94}],"friendship":70,"id":93,"learnset":{"address":3310488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299376,"base_stats":[60,65,60,110,130,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":94,"learnset":{"address":3310514,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"00A1BF08F5974E21","types":[7,3]},{"abilities":[69,5],"address":3299404,"base_stats":[35,45,160,70,30,45],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":208}],"friendship":70,"id":95,"learnset":{"address":3310540,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":328},{"level":57,"move_id":38}]},"tmhm_learnset":"00A01F508E510E30","types":[5,4]},{"abilities":[15,0],"address":3299432,"base_stats":[60,48,45,42,43,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":26,"species":97}],"friendship":70,"id":96,"learnset":{"address":3310568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":31,"move_id":139},{"level":36,"move_id":96},{"level":40,"move_id":94},{"level":43,"move_id":244},{"level":45,"move_id":248}]},"tmhm_learnset":"0041BF01F41B8E29","types":[14,14]},{"abilities":[15,0],"address":3299460,"base_stats":[85,73,70,67,73,115],"catch_rate":75,"evolutions":[],"friendship":70,"id":97,"learnset":{"address":3310594,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":1,"move_id":50},{"level":1,"move_id":93},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":33,"move_id":139},{"level":40,"move_id":96},{"level":49,"move_id":94},{"level":55,"move_id":244},{"level":60,"move_id":248}]},"tmhm_learnset":"0041BF01F41BCE29","types":[14,14]},{"abilities":[52,75],"address":3299488,"base_stats":[30,105,90,50,25,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":28,"species":99}],"friendship":70,"id":98,"learnset":{"address":3310620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":34,"move_id":12},{"level":41,"move_id":182},{"level":45,"move_id":152}]},"tmhm_learnset":"02B43E408C133264","types":[11,11]},{"abilities":[52,75],"address":3299516,"base_stats":[55,130,115,75,50,50],"catch_rate":60,"evolutions":[],"friendship":70,"id":99,"learnset":{"address":3310646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":43},{"level":1,"move_id":11},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":38,"move_id":12},{"level":49,"move_id":182},{"level":57,"move_id":152}]},"tmhm_learnset":"02B43E408C137264","types":[11,11]},{"abilities":[43,9],"address":3299544,"base_stats":[40,30,50,100,55,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":101}],"friendship":70,"id":100,"learnset":{"address":3310672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":32,"move_id":205},{"level":37,"move_id":113},{"level":42,"move_id":129},{"level":46,"move_id":153},{"level":49,"move_id":243}]},"tmhm_learnset":"00402F0285938A20","types":[13,13]},{"abilities":[43,9],"address":3299572,"base_stats":[60,50,70,140,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":101,"learnset":{"address":3310700,"moves":[{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":1,"move_id":49},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":34,"move_id":205},{"level":41,"move_id":113},{"level":48,"move_id":129},{"level":54,"move_id":153},{"level":59,"move_id":243}]},"tmhm_learnset":"00402F028593CA20","types":[13,13]},{"abilities":[34,0],"address":3299600,"base_stats":[60,40,80,40,60,45],"catch_rate":90,"evolutions":[{"method":"ITEM","param":98,"species":103}],"friendship":70,"id":102,"learnset":{"address":3310728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":253},{"level":1,"move_id":95},{"level":7,"move_id":115},{"level":13,"move_id":73},{"level":19,"move_id":93},{"level":25,"move_id":78},{"level":31,"move_id":77},{"level":37,"move_id":79},{"level":43,"move_id":76}]},"tmhm_learnset":"0060BE0994358720","types":[12,14]},{"abilities":[34,0],"address":3299628,"base_stats":[95,95,85,55,125,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":103,"learnset":{"address":3310752,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":95},{"level":1,"move_id":93},{"level":19,"move_id":23},{"level":31,"move_id":121}]},"tmhm_learnset":"0060BE099435C720","types":[12,14]},{"abilities":[69,31],"address":3299656,"base_stats":[50,50,95,35,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":105}],"friendship":70,"id":104,"learnset":{"address":3310766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":125},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":29,"move_id":99},{"level":33,"move_id":206},{"level":37,"move_id":37},{"level":41,"move_id":198},{"level":45,"move_id":38}]},"tmhm_learnset":"00A03EF4CE513621","types":[4,4]},{"abilities":[69,31],"address":3299684,"base_stats":[60,80,110,45,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":105,"learnset":{"address":3310798,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":125},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":32,"move_id":99},{"level":39,"move_id":206},{"level":46,"move_id":37},{"level":53,"move_id":198},{"level":61,"move_id":38}]},"tmhm_learnset":"00A03EF4CE517621","types":[4,4]},{"abilities":[7,0],"address":3299712,"base_stats":[50,120,53,87,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":106,"learnset":{"address":3310830,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":24},{"level":6,"move_id":96},{"level":11,"move_id":27},{"level":16,"move_id":26},{"level":20,"move_id":280},{"level":21,"move_id":116},{"level":26,"move_id":136},{"level":31,"move_id":170},{"level":36,"move_id":193},{"level":41,"move_id":203},{"level":46,"move_id":25},{"level":51,"move_id":179}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[51,0],"address":3299740,"base_stats":[50,105,79,76,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":107,"learnset":{"address":3310862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":4},{"level":7,"move_id":97},{"level":13,"move_id":228},{"level":20,"move_id":183},{"level":26,"move_id":9},{"level":26,"move_id":8},{"level":26,"move_id":7},{"level":32,"move_id":327},{"level":38,"move_id":5},{"level":44,"move_id":197},{"level":50,"move_id":68}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[20,12],"address":3299768,"base_stats":[90,55,75,30,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":108,"learnset":{"address":3310892,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":122},{"level":7,"move_id":48},{"level":12,"move_id":111},{"level":18,"move_id":282},{"level":23,"move_id":23},{"level":29,"move_id":35},{"level":34,"move_id":50},{"level":40,"move_id":21},{"level":45,"move_id":103},{"level":51,"move_id":287}]},"tmhm_learnset":"00B43E76EFF37625","types":[0,0]},{"abilities":[26,0],"address":3299796,"base_stats":[40,65,95,35,60,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":35,"species":110}],"friendship":70,"id":109,"learnset":{"address":3310920,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":41,"move_id":153},{"level":45,"move_id":194},{"level":49,"move_id":262}]},"tmhm_learnset":"00403F2EA5930E20","types":[3,3]},{"abilities":[26,0],"address":3299824,"base_stats":[65,90,120,60,85,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":110,"learnset":{"address":3310946,"moves":[{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":1,"move_id":123},{"level":1,"move_id":120},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":44,"move_id":153},{"level":51,"move_id":194},{"level":58,"move_id":262}]},"tmhm_learnset":"00403F2EA5934E20","types":[3,3]},{"abilities":[31,69],"address":3299852,"base_stats":[80,85,95,25,30,30],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":42,"species":112}],"friendship":70,"id":111,"learnset":{"address":3310972,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":43,"move_id":36},{"level":52,"move_id":89},{"level":57,"move_id":224}]},"tmhm_learnset":"00A03E768FD33630","types":[4,5]},{"abilities":[31,69],"address":3299880,"base_stats":[105,130,120,40,45,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":112,"learnset":{"address":3310998,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":1,"move_id":23},{"level":1,"move_id":31},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":46,"move_id":36},{"level":58,"move_id":89},{"level":66,"move_id":224}]},"tmhm_learnset":"00B43E76CFD37631","types":[4,5]},{"abilities":[30,32],"address":3299908,"base_stats":[250,5,5,50,35,105],"catch_rate":30,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":242}],"friendship":140,"id":113,"learnset":{"address":3311024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":287},{"level":13,"move_id":135},{"level":17,"move_id":3},{"level":23,"move_id":107},{"level":29,"move_id":47},{"level":35,"move_id":121},{"level":41,"move_id":111},{"level":49,"move_id":113},{"level":57,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[34,0],"address":3299936,"base_stats":[65,55,115,60,100,40],"catch_rate":45,"evolutions":[],"friendship":70,"id":114,"learnset":{"address":3311054,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":275},{"level":1,"move_id":132},{"level":4,"move_id":79},{"level":10,"move_id":71},{"level":13,"move_id":74},{"level":19,"move_id":77},{"level":22,"move_id":22},{"level":28,"move_id":20},{"level":31,"move_id":72},{"level":37,"move_id":78},{"level":40,"move_id":21},{"level":46,"move_id":321}]},"tmhm_learnset":"00C43E0884354720","types":[12,12]},{"abilities":[48,0],"address":3299964,"base_stats":[105,95,80,90,40,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":115,"learnset":{"address":3311084,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":4},{"level":1,"move_id":43},{"level":7,"move_id":44},{"level":13,"move_id":39},{"level":19,"move_id":252},{"level":25,"move_id":5},{"level":31,"move_id":99},{"level":37,"move_id":203},{"level":43,"move_id":146},{"level":49,"move_id":179}]},"tmhm_learnset":"00B43EF6EFF37675","types":[0,0]},{"abilities":[33,0],"address":3299992,"base_stats":[30,40,70,60,70,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":32,"species":117}],"friendship":70,"id":116,"learnset":{"address":3311110,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":36,"move_id":97},{"level":43,"move_id":56},{"level":50,"move_id":349}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[38,0],"address":3300020,"base_stats":[55,65,95,85,95,45],"catch_rate":75,"evolutions":[{"method":"ITEM","param":201,"species":230}],"friendship":70,"id":117,"learnset":{"address":3311134,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[33,41],"address":3300048,"base_stats":[45,67,60,63,35,50],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":119}],"friendship":70,"id":118,"learnset":{"address":3311158,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":38,"move_id":127},{"level":43,"move_id":32},{"level":52,"move_id":97}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,41],"address":3300076,"base_stats":[80,92,65,68,65,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":119,"learnset":{"address":3311182,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":1,"move_id":48},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":41,"move_id":127},{"level":49,"move_id":32},{"level":61,"move_id":97}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[35,30],"address":3300104,"base_stats":[30,45,55,85,70,55],"catch_rate":225,"evolutions":[{"method":"ITEM","param":97,"species":121}],"friendship":70,"id":120,"learnset":{"address":3311206,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":6,"move_id":55},{"level":10,"move_id":229},{"level":15,"move_id":105},{"level":19,"move_id":293},{"level":24,"move_id":129},{"level":28,"move_id":61},{"level":33,"move_id":107},{"level":37,"move_id":113},{"level":42,"move_id":322},{"level":46,"move_id":56}]},"tmhm_learnset":"03500E019593B264","types":[11,11]},{"abilities":[35,30],"address":3300132,"base_stats":[60,75,85,115,100,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":121,"learnset":{"address":3311236,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":229},{"level":1,"move_id":105},{"level":1,"move_id":129},{"level":33,"move_id":109}]},"tmhm_learnset":"03508E019593F264","types":[11,14]},{"abilities":[43,0],"address":3300160,"base_stats":[40,45,65,90,100,120],"catch_rate":45,"evolutions":[],"friendship":70,"id":122,"learnset":{"address":3311248,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":112},{"level":5,"move_id":93},{"level":9,"move_id":164},{"level":13,"move_id":96},{"level":17,"move_id":3},{"level":21,"move_id":113},{"level":21,"move_id":115},{"level":25,"move_id":227},{"level":29,"move_id":60},{"level":33,"move_id":278},{"level":37,"move_id":271},{"level":41,"move_id":272},{"level":45,"move_id":94},{"level":49,"move_id":226},{"level":53,"move_id":219}]},"tmhm_learnset":"0041BF03F5BBCE29","types":[14,14]},{"abilities":[68,0],"address":3300188,"base_stats":[70,110,80,105,55,80],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":212}],"friendship":70,"id":123,"learnset":{"address":3311286,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":17},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00847E8084134620","types":[6,2]},{"abilities":[12,0],"address":3300216,"base_stats":[65,50,35,95,115,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":124,"learnset":{"address":3311314,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":1,"move_id":142},{"level":1,"move_id":181},{"level":9,"move_id":142},{"level":13,"move_id":181},{"level":21,"move_id":3},{"level":25,"move_id":8},{"level":35,"move_id":212},{"level":41,"move_id":313},{"level":51,"move_id":34},{"level":57,"move_id":195},{"level":67,"move_id":59}]},"tmhm_learnset":"0040BF01F413FA6D","types":[15,14]},{"abilities":[9,0],"address":3300244,"base_stats":[65,83,57,105,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":125,"learnset":{"address":3311342,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":1,"move_id":9},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":36,"move_id":103},{"level":47,"move_id":85},{"level":58,"move_id":87}]},"tmhm_learnset":"00E03E02D5D3C221","types":[13,13]},{"abilities":[49,0],"address":3300272,"base_stats":[65,95,57,93,100,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":126,"learnset":{"address":3311364,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":43},{"level":1,"move_id":123},{"level":1,"move_id":7},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":33,"move_id":241},{"level":41,"move_id":53},{"level":49,"move_id":109},{"level":57,"move_id":126}]},"tmhm_learnset":"00A03E24D4514621","types":[10,10]},{"abilities":[52,0],"address":3300300,"base_stats":[65,125,100,85,55,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":127,"learnset":{"address":3311390,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":11},{"level":1,"move_id":116},{"level":7,"move_id":20},{"level":13,"move_id":69},{"level":19,"move_id":106},{"level":25,"move_id":279},{"level":31,"move_id":280},{"level":37,"move_id":12},{"level":43,"move_id":66},{"level":49,"move_id":14}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,6]},{"abilities":[22,0],"address":3300328,"base_stats":[75,100,95,110,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":128,"learnset":{"address":3311416,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":8,"move_id":99},{"level":13,"move_id":30},{"level":19,"move_id":184},{"level":26,"move_id":228},{"level":34,"move_id":156},{"level":43,"move_id":37},{"level":53,"move_id":36}]},"tmhm_learnset":"00B01E7687F37624","types":[0,0]},{"abilities":[33,0],"address":3300356,"base_stats":[20,10,55,80,15,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":130}],"friendship":70,"id":129,"learnset":{"address":3311442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"0000000000000000","types":[11,11]},{"abilities":[22,0],"address":3300384,"base_stats":[95,125,79,81,60,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":130,"learnset":{"address":3311456,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":37},{"level":20,"move_id":44},{"level":25,"move_id":82},{"level":30,"move_id":43},{"level":35,"move_id":239},{"level":40,"move_id":56},{"level":45,"move_id":240},{"level":50,"move_id":349},{"level":55,"move_id":63}]},"tmhm_learnset":"03B01F3487937A74","types":[11,2]},{"abilities":[11,75],"address":3300412,"base_stats":[130,85,80,60,85,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":131,"learnset":{"address":3311482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":45},{"level":1,"move_id":47},{"level":7,"move_id":54},{"level":13,"move_id":34},{"level":19,"move_id":109},{"level":25,"move_id":195},{"level":31,"move_id":58},{"level":37,"move_id":240},{"level":43,"move_id":219},{"level":49,"move_id":56},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E0295DB7274","types":[11,15]},{"abilities":[7,0],"address":3300440,"base_stats":[48,48,48,48,48,48],"catch_rate":35,"evolutions":[],"friendship":70,"id":132,"learnset":{"address":3311510,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":144}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[50,0],"address":3300468,"base_stats":[55,55,50,55,45,65],"catch_rate":45,"evolutions":[{"method":"ITEM","param":96,"species":135},{"method":"ITEM","param":97,"species":134},{"method":"ITEM","param":95,"species":136},{"method":"FRIENDSHIP_DAY","param":0,"species":196},{"method":"FRIENDSHIP_NIGHT","param":0,"species":197}],"friendship":70,"id":133,"learnset":{"address":3311520,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":45},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":226},{"level":42,"move_id":36}]},"tmhm_learnset":"00001E00AC530620","types":[0,0]},{"abilities":[11,0],"address":3300496,"base_stats":[130,65,60,65,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":134,"learnset":{"address":3311542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":55},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":62},{"level":42,"move_id":114},{"level":47,"move_id":151},{"level":52,"move_id":56}]},"tmhm_learnset":"03101E00AC537674","types":[11,11]},{"abilities":[10,0],"address":3300524,"base_stats":[65,65,60,130,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":135,"learnset":{"address":3311568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":84},{"level":23,"move_id":98},{"level":30,"move_id":24},{"level":36,"move_id":42},{"level":42,"move_id":86},{"level":47,"move_id":97},{"level":52,"move_id":87}]},"tmhm_learnset":"00401E02ADD34630","types":[13,13]},{"abilities":[18,0],"address":3300552,"base_stats":[65,130,60,65,95,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":136,"learnset":{"address":3311594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":52},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":83},{"level":42,"move_id":123},{"level":47,"move_id":43},{"level":52,"move_id":53}]},"tmhm_learnset":"00021E24AC534630","types":[10,10]},{"abilities":[36,0],"address":3300580,"base_stats":[65,60,70,40,85,75],"catch_rate":45,"evolutions":[{"method":"ITEM","param":218,"species":233}],"friendship":70,"id":137,"learnset":{"address":3311620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":159},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[33,75],"address":3300608,"base_stats":[35,40,100,35,90,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":139}],"friendship":70,"id":138,"learnset":{"address":3311646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":43,"move_id":321},{"level":49,"move_id":246},{"level":55,"move_id":56}]},"tmhm_learnset":"03903E5084133264","types":[5,11]},{"abilities":[33,75],"address":3300636,"base_stats":[70,60,125,55,115,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":139,"learnset":{"address":3311672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":1,"move_id":44},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":40,"move_id":131},{"level":46,"move_id":321},{"level":55,"move_id":246},{"level":65,"move_id":56}]},"tmhm_learnset":"03903E5084137264","types":[5,11]},{"abilities":[33,4],"address":3300664,"base_stats":[30,80,90,55,55,45],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":141}],"friendship":70,"id":140,"learnset":{"address":3311700,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":43,"move_id":319},{"level":49,"move_id":72},{"level":55,"move_id":246}]},"tmhm_learnset":"01903ED08C173264","types":[5,11]},{"abilities":[33,4],"address":3300692,"base_stats":[60,115,105,80,65,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":141,"learnset":{"address":3311726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":71},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":40,"move_id":163},{"level":46,"move_id":319},{"level":55,"move_id":72},{"level":65,"move_id":246}]},"tmhm_learnset":"03943ED0CC177264","types":[5,11]},{"abilities":[69,46],"address":3300720,"base_stats":[80,105,65,130,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":142,"learnset":{"address":3311754,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":8,"move_id":97},{"level":15,"move_id":44},{"level":22,"move_id":48},{"level":29,"move_id":246},{"level":36,"move_id":184},{"level":43,"move_id":36},{"level":50,"move_id":63}]},"tmhm_learnset":"00A87FF486534E32","types":[5,2]},{"abilities":[17,47],"address":3300748,"base_stats":[160,110,65,30,65,110],"catch_rate":25,"evolutions":[],"friendship":70,"id":143,"learnset":{"address":3311778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":133},{"level":10,"move_id":111},{"level":15,"move_id":187},{"level":19,"move_id":29},{"level":24,"move_id":281},{"level":28,"move_id":156},{"level":28,"move_id":173},{"level":33,"move_id":34},{"level":37,"move_id":335},{"level":42,"move_id":343},{"level":46,"move_id":205},{"level":51,"move_id":63}]},"tmhm_learnset":"00301E76F7B37625","types":[0,0]},{"abilities":[46,0],"address":3300776,"base_stats":[90,85,100,85,95,125],"catch_rate":3,"evolutions":[],"friendship":35,"id":144,"learnset":{"address":3311812,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":181},{"level":13,"move_id":54},{"level":25,"move_id":97},{"level":37,"move_id":170},{"level":49,"move_id":58},{"level":61,"move_id":115},{"level":73,"move_id":59},{"level":85,"move_id":329}]},"tmhm_learnset":"00884E9184137674","types":[15,2]},{"abilities":[46,0],"address":3300804,"base_stats":[90,90,85,100,125,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":145,"learnset":{"address":3311836,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":84},{"level":13,"move_id":86},{"level":25,"move_id":97},{"level":37,"move_id":197},{"level":49,"move_id":65},{"level":61,"move_id":268},{"level":73,"move_id":113},{"level":85,"move_id":87}]},"tmhm_learnset":"00C84E928593C630","types":[13,2]},{"abilities":[46,0],"address":3300832,"base_stats":[90,100,90,90,125,85],"catch_rate":3,"evolutions":[],"friendship":35,"id":146,"learnset":{"address":3311860,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":1,"move_id":52},{"level":13,"move_id":83},{"level":25,"move_id":97},{"level":37,"move_id":203},{"level":49,"move_id":53},{"level":61,"move_id":219},{"level":73,"move_id":257},{"level":85,"move_id":143}]},"tmhm_learnset":"008A4EB4841B4630","types":[10,2]},{"abilities":[61,0],"address":3300860,"base_stats":[41,64,45,50,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":148}],"friendship":35,"id":147,"learnset":{"address":3311884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":36,"move_id":97},{"level":43,"move_id":219},{"level":50,"move_id":200},{"level":57,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[61,0],"address":3300888,"base_stats":[61,84,65,70,70,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":149}],"friendship":35,"id":148,"learnset":{"address":3311910,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":56,"move_id":200},{"level":65,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[39,0],"address":3300916,"base_stats":[91,134,95,80,100,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":149,"learnset":{"address":3311936,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":55,"move_id":17},{"level":61,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BC5EF6C7DB7677","types":[16,2]},{"abilities":[46,0],"address":3300944,"base_stats":[106,110,90,130,154,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":150,"learnset":{"address":3311964,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":50},{"level":11,"move_id":112},{"level":22,"move_id":129},{"level":33,"move_id":244},{"level":44,"move_id":248},{"level":55,"move_id":54},{"level":66,"move_id":94},{"level":77,"move_id":133},{"level":88,"move_id":105},{"level":99,"move_id":219}]},"tmhm_learnset":"00E18FF7F7FBFEED","types":[14,14]},{"abilities":[28,0],"address":3300972,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":151,"learnset":{"address":3311992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":10,"move_id":144},{"level":20,"move_id":5},{"level":30,"move_id":118},{"level":40,"move_id":94},{"level":50,"move_id":246}]},"tmhm_learnset":"03FFFFFFFFFFFFFF","types":[14,14]},{"abilities":[65,0],"address":3301000,"base_stats":[45,49,65,45,49,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":153}],"friendship":70,"id":152,"learnset":{"address":3312012,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":22,"move_id":235},{"level":29,"move_id":34},{"level":36,"move_id":113},{"level":43,"move_id":219},{"level":50,"move_id":76}]},"tmhm_learnset":"00441E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301028,"base_stats":[60,62,80,60,63,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":154}],"friendship":70,"id":153,"learnset":{"address":3312038,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":39,"move_id":113},{"level":47,"move_id":219},{"level":55,"move_id":76}]},"tmhm_learnset":"00E41E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301056,"base_stats":[80,82,100,80,83,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":154,"learnset":{"address":3312064,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":41,"move_id":113},{"level":51,"move_id":219},{"level":61,"move_id":76}]},"tmhm_learnset":"00E41E01867DC720","types":[12,12]},{"abilities":[66,0],"address":3301084,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":14,"species":156}],"friendship":70,"id":155,"learnset":{"address":3312090,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":19,"move_id":98},{"level":27,"move_id":172},{"level":36,"move_id":129},{"level":46,"move_id":53}]},"tmhm_learnset":"00061EA48C110620","types":[10,10]},{"abilities":[66,0],"address":3301112,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":157}],"friendship":70,"id":156,"learnset":{"address":3312112,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":42,"move_id":129},{"level":54,"move_id":53}]},"tmhm_learnset":"00A61EA4CC110631","types":[10,10]},{"abilities":[66,0],"address":3301140,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":157,"learnset":{"address":3312134,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":1,"move_id":52},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":45,"move_id":129},{"level":60,"move_id":53}]},"tmhm_learnset":"00A61EA4CE114631","types":[10,10]},{"abilities":[67,0],"address":3301168,"base_stats":[50,65,64,43,44,48],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":18,"species":159}],"friendship":70,"id":158,"learnset":{"address":3312156,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":20,"move_id":44},{"level":27,"move_id":184},{"level":35,"move_id":163},{"level":43,"move_id":103},{"level":52,"move_id":56}]},"tmhm_learnset":"03141E80CC533265","types":[11,11]},{"abilities":[67,0],"address":3301196,"base_stats":[65,80,80,58,59,63],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":160}],"friendship":70,"id":159,"learnset":{"address":3312180,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":37,"move_id":163},{"level":45,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03B41E80CC533275","types":[11,11]},{"abilities":[67,0],"address":3301224,"base_stats":[85,105,100,78,79,83],"catch_rate":45,"evolutions":[],"friendship":70,"id":160,"learnset":{"address":3312204,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":1,"move_id":55},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":38,"move_id":163},{"level":47,"move_id":103},{"level":58,"move_id":56}]},"tmhm_learnset":"03B41E80CE537277","types":[11,11]},{"abilities":[50,51],"address":3301252,"base_stats":[35,46,34,20,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":15,"species":162}],"friendship":70,"id":161,"learnset":{"address":3312228,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":17,"move_id":270},{"level":24,"move_id":21},{"level":31,"move_id":266},{"level":40,"move_id":156},{"level":49,"move_id":133}]},"tmhm_learnset":"00143E06ECF31625","types":[0,0]},{"abilities":[50,51],"address":3301280,"base_stats":[85,76,64,90,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":162,"learnset":{"address":3312254,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":98},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":19,"move_id":270},{"level":28,"move_id":21},{"level":37,"move_id":266},{"level":48,"move_id":156},{"level":59,"move_id":133}]},"tmhm_learnset":"00B43E06EDF37625","types":[0,0]},{"abilities":[15,51],"address":3301308,"base_stats":[60,30,30,50,36,56],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":164}],"friendship":70,"id":163,"learnset":{"address":3312280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":22,"move_id":115},{"level":28,"move_id":36},{"level":34,"move_id":93},{"level":48,"move_id":138}]},"tmhm_learnset":"00487E81B4130620","types":[0,2]},{"abilities":[15,51],"address":3301336,"base_stats":[100,50,50,70,76,96],"catch_rate":90,"evolutions":[],"friendship":70,"id":164,"learnset":{"address":3312304,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":193},{"level":1,"move_id":64},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":25,"move_id":115},{"level":33,"move_id":36},{"level":41,"move_id":93},{"level":57,"move_id":138}]},"tmhm_learnset":"00487E81B4134620","types":[0,2]},{"abilities":[68,48],"address":3301364,"base_stats":[40,20,30,55,40,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":166}],"friendship":70,"id":165,"learnset":{"address":3312328,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":22,"move_id":113},{"level":22,"move_id":115},{"level":22,"move_id":219},{"level":29,"move_id":226},{"level":36,"move_id":129},{"level":43,"move_id":97},{"level":50,"move_id":38}]},"tmhm_learnset":"00403E81CC3D8621","types":[6,2]},{"abilities":[68,48],"address":3301392,"base_stats":[55,35,50,85,55,110],"catch_rate":90,"evolutions":[],"friendship":70,"id":166,"learnset":{"address":3312356,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":48},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":24,"move_id":113},{"level":24,"move_id":115},{"level":24,"move_id":219},{"level":33,"move_id":226},{"level":42,"move_id":129},{"level":51,"move_id":97},{"level":60,"move_id":38}]},"tmhm_learnset":"00403E81CC3DC621","types":[6,2]},{"abilities":[68,15],"address":3301420,"base_stats":[40,60,40,30,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":168}],"friendship":70,"id":167,"learnset":{"address":3312384,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":23,"move_id":141},{"level":30,"move_id":154},{"level":37,"move_id":169},{"level":45,"move_id":97},{"level":53,"move_id":94}]},"tmhm_learnset":"00403E089C350620","types":[6,3]},{"abilities":[68,15],"address":3301448,"base_stats":[70,90,70,40,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":168,"learnset":{"address":3312410,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":1,"move_id":184},{"level":1,"move_id":132},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":25,"move_id":141},{"level":34,"move_id":154},{"level":43,"move_id":169},{"level":53,"move_id":97},{"level":63,"move_id":94}]},"tmhm_learnset":"00403E089C354620","types":[6,3]},{"abilities":[39,0],"address":3301476,"base_stats":[85,90,80,130,70,80],"catch_rate":90,"evolutions":[],"friendship":70,"id":169,"learnset":{"address":3312436,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00097F88A4174E20","types":[3,2]},{"abilities":[10,35],"address":3301504,"base_stats":[75,38,38,67,56,56],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":27,"species":171}],"friendship":70,"id":170,"learnset":{"address":3312464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":29,"move_id":109},{"level":37,"move_id":36},{"level":41,"move_id":56},{"level":49,"move_id":268}]},"tmhm_learnset":"03501E0285933264","types":[11,13]},{"abilities":[10,35],"address":3301532,"base_stats":[125,58,58,67,76,76],"catch_rate":75,"evolutions":[],"friendship":70,"id":171,"learnset":{"address":3312490,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":1,"move_id":48},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":32,"move_id":109},{"level":43,"move_id":36},{"level":50,"move_id":56},{"level":61,"move_id":268}]},"tmhm_learnset":"03501E0285937264","types":[11,13]},{"abilities":[9,0],"address":3301560,"base_stats":[20,40,15,60,35,35],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":25}],"friendship":70,"id":172,"learnset":{"address":3312516,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":204},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":186}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[56,0],"address":3301588,"base_stats":[50,25,28,15,45,55],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":35}],"friendship":140,"id":173,"learnset":{"address":3312532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":204},{"level":4,"move_id":227},{"level":8,"move_id":47},{"level":13,"move_id":186}]},"tmhm_learnset":"00401E27BC7B8624","types":[0,0]},{"abilities":[56,0],"address":3301616,"base_stats":[90,30,15,15,40,20],"catch_rate":170,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":39}],"friendship":70,"id":174,"learnset":{"address":3312548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":1,"move_id":204},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":186}]},"tmhm_learnset":"00401E27BC3B8624","types":[0,0]},{"abilities":[55,32],"address":3301644,"base_stats":[35,20,65,20,40,65],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":176}],"friendship":70,"id":175,"learnset":{"address":3312564,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C01E27B43B8624","types":[0,0]},{"abilities":[55,32],"address":3301672,"base_stats":[55,40,85,40,80,105],"catch_rate":75,"evolutions":[],"friendship":70,"id":176,"learnset":{"address":3312590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C85EA7F43BC625","types":[0,2]},{"abilities":[28,48],"address":3301700,"base_stats":[40,50,45,70,70,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":178}],"friendship":70,"id":177,"learnset":{"address":3312616,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":30,"move_id":273},{"level":30,"move_id":248},{"level":40,"move_id":109},{"level":50,"move_id":94}]},"tmhm_learnset":"0040FE81B4378628","types":[14,2]},{"abilities":[28,48],"address":3301728,"base_stats":[65,75,70,95,95,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":178,"learnset":{"address":3312638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":35,"move_id":273},{"level":35,"move_id":248},{"level":50,"move_id":109},{"level":65,"move_id":94}]},"tmhm_learnset":"0048FE81B437C628","types":[14,2]},{"abilities":[9,0],"address":3301756,"base_stats":[55,40,40,35,65,45],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":15,"species":180}],"friendship":70,"id":179,"learnset":{"address":3312660,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":84},{"level":16,"move_id":86},{"level":23,"move_id":178},{"level":30,"move_id":113},{"level":37,"move_id":87}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[9,0],"address":3301784,"base_stats":[70,55,55,45,80,60],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":181}],"friendship":70,"id":180,"learnset":{"address":3312680,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":36,"move_id":113},{"level":45,"move_id":87}]},"tmhm_learnset":"00E01E02C5D38221","types":[13,13]},{"abilities":[9,0],"address":3301812,"base_stats":[90,75,75,55,115,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":181,"learnset":{"address":3312700,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":1,"move_id":86},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":30,"move_id":9},{"level":42,"move_id":113},{"level":57,"move_id":87}]},"tmhm_learnset":"00E01E02C5D3C221","types":[13,13]},{"abilities":[34,0],"address":3301840,"base_stats":[75,80,85,50,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":182,"learnset":{"address":3312722,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":78},{"level":1,"move_id":345},{"level":44,"move_id":80},{"level":55,"move_id":76}]},"tmhm_learnset":"00441E08843D4720","types":[12,12]},{"abilities":[47,37],"address":3301868,"base_stats":[70,20,50,40,20,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":18,"species":184}],"friendship":70,"id":183,"learnset":{"address":3312736,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":21,"move_id":61},{"level":28,"move_id":38},{"level":36,"move_id":240},{"level":45,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[47,37],"address":3301896,"base_stats":[100,50,80,50,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":184,"learnset":{"address":3312762,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":39},{"level":1,"move_id":55},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":24,"move_id":61},{"level":34,"move_id":38},{"level":45,"move_id":240},{"level":57,"move_id":56}]},"tmhm_learnset":"03B01E00CC537265","types":[11,11]},{"abilities":[5,69],"address":3301924,"base_stats":[70,100,115,30,30,65],"catch_rate":65,"evolutions":[],"friendship":70,"id":185,"learnset":{"address":3312788,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":102},{"level":9,"move_id":175},{"level":17,"move_id":67},{"level":25,"move_id":157},{"level":33,"move_id":335},{"level":41,"move_id":185},{"level":49,"move_id":21},{"level":57,"move_id":38}]},"tmhm_learnset":"00A03E50CE110E29","types":[5,5]},{"abilities":[11,6],"address":3301952,"base_stats":[90,75,75,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":186,"learnset":{"address":3312812,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":195},{"level":35,"move_id":195},{"level":51,"move_id":207}]},"tmhm_learnset":"03B03E00DE137265","types":[11,11]},{"abilities":[34,0],"address":3301980,"base_stats":[35,35,40,50,35,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":188}],"friendship":70,"id":187,"learnset":{"address":3312826,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":20,"move_id":73},{"level":25,"move_id":178},{"level":30,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302008,"base_stats":[55,45,50,80,45,65],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":27,"species":189}],"friendship":70,"id":188,"learnset":{"address":3312854,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":29,"move_id":178},{"level":36,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302036,"base_stats":[75,55,70,110,55,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":189,"learnset":{"address":3312882,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":33,"move_id":178},{"level":44,"move_id":72}]},"tmhm_learnset":"00401E8084354720","types":[12,2]},{"abilities":[50,53],"address":3302064,"base_stats":[55,70,55,85,40,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":190,"learnset":{"address":3312910,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":6,"move_id":28},{"level":13,"move_id":310},{"level":18,"move_id":226},{"level":25,"move_id":321},{"level":31,"move_id":154},{"level":38,"move_id":129},{"level":43,"move_id":103},{"level":50,"move_id":97}]},"tmhm_learnset":"00A53E82EDF30E25","types":[0,0]},{"abilities":[34,0],"address":3302092,"base_stats":[30,30,30,30,30,30],"catch_rate":235,"evolutions":[{"method":"ITEM","param":93,"species":192}],"friendship":70,"id":191,"learnset":{"address":3312936,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":6,"move_id":74},{"level":13,"move_id":72},{"level":18,"move_id":275},{"level":25,"move_id":283},{"level":30,"move_id":241},{"level":37,"move_id":235},{"level":42,"move_id":202}]},"tmhm_learnset":"00441E08843D8720","types":[12,12]},{"abilities":[34,0],"address":3302120,"base_stats":[75,75,55,30,105,85],"catch_rate":120,"evolutions":[],"friendship":70,"id":192,"learnset":{"address":3312960,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":1},{"level":6,"move_id":74},{"level":13,"move_id":75},{"level":18,"move_id":275},{"level":25,"move_id":331},{"level":30,"move_id":241},{"level":37,"move_id":80},{"level":42,"move_id":76}]},"tmhm_learnset":"00441E08843DC720","types":[12,12]},{"abilities":[3,14],"address":3302148,"base_stats":[65,65,45,95,75,45],"catch_rate":75,"evolutions":[],"friendship":70,"id":193,"learnset":{"address":3312984,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":193},{"level":7,"move_id":98},{"level":13,"move_id":104},{"level":19,"move_id":49},{"level":25,"move_id":197},{"level":31,"move_id":48},{"level":37,"move_id":253},{"level":43,"move_id":17},{"level":49,"move_id":103}]},"tmhm_learnset":"00407E80B4350620","types":[6,2]},{"abilities":[6,11],"address":3302176,"base_stats":[55,45,45,15,25,25],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":195}],"friendship":70,"id":194,"learnset":{"address":3313010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":21,"move_id":133},{"level":31,"move_id":281},{"level":36,"move_id":89},{"level":41,"move_id":240},{"level":51,"move_id":54},{"level":51,"move_id":114}]},"tmhm_learnset":"03D01E188E533264","types":[11,4]},{"abilities":[6,11],"address":3302204,"base_stats":[95,85,85,35,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":195,"learnset":{"address":3313036,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":23,"move_id":133},{"level":35,"move_id":281},{"level":42,"move_id":89},{"level":49,"move_id":240},{"level":61,"move_id":54},{"level":61,"move_id":114}]},"tmhm_learnset":"03F01E58CE537265","types":[11,4]},{"abilities":[28,0],"address":3302232,"base_stats":[65,65,60,110,130,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":196,"learnset":{"address":3313062,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":93},{"level":23,"move_id":98},{"level":30,"move_id":129},{"level":36,"move_id":60},{"level":42,"move_id":244},{"level":47,"move_id":94},{"level":52,"move_id":234}]},"tmhm_learnset":"00449E01BC53C628","types":[14,14]},{"abilities":[28,0],"address":3302260,"base_stats":[95,65,110,65,60,130],"catch_rate":45,"evolutions":[],"friendship":35,"id":197,"learnset":{"address":3313088,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":228},{"level":23,"move_id":98},{"level":30,"move_id":109},{"level":36,"move_id":185},{"level":42,"move_id":212},{"level":47,"move_id":103},{"level":52,"move_id":236}]},"tmhm_learnset":"00451F00BC534E20","types":[17,17]},{"abilities":[15,0],"address":3302288,"base_stats":[60,85,42,91,85,42],"catch_rate":30,"evolutions":[],"friendship":35,"id":198,"learnset":{"address":3313114,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":9,"move_id":310},{"level":14,"move_id":228},{"level":22,"move_id":114},{"level":27,"move_id":101},{"level":35,"move_id":185},{"level":40,"move_id":269},{"level":48,"move_id":212}]},"tmhm_learnset":"00097F80A4130E28","types":[17,2]},{"abilities":[12,20],"address":3302316,"base_stats":[95,75,80,30,100,110],"catch_rate":70,"evolutions":[],"friendship":70,"id":199,"learnset":{"address":3313138,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":207},{"level":48,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[26,0],"address":3302344,"base_stats":[60,60,60,85,85,85],"catch_rate":45,"evolutions":[],"friendship":35,"id":200,"learnset":{"address":3313162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":149},{"level":6,"move_id":180},{"level":11,"move_id":310},{"level":17,"move_id":109},{"level":23,"move_id":212},{"level":30,"move_id":60},{"level":37,"move_id":220},{"level":45,"move_id":195},{"level":53,"move_id":288}]},"tmhm_learnset":"0041BF82B5930E28","types":[7,7]},{"abilities":[26,0],"address":3302372,"base_stats":[48,72,48,48,72,48],"catch_rate":225,"evolutions":[],"friendship":70,"id":201,"learnset":{"address":3313188,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":237}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[23,0],"address":3302400,"base_stats":[190,33,58,33,33,58],"catch_rate":45,"evolutions":[],"friendship":70,"id":202,"learnset":{"address":3313198,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":243},{"level":1,"move_id":219},{"level":1,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[39,48],"address":3302428,"base_stats":[70,80,65,85,90,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":203,"learnset":{"address":3313208,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":7,"move_id":310},{"level":13,"move_id":93},{"level":19,"move_id":23},{"level":25,"move_id":316},{"level":31,"move_id":97},{"level":37,"move_id":226},{"level":43,"move_id":60},{"level":49,"move_id":242}]},"tmhm_learnset":"00E0BE03B7D38628","types":[0,14]},{"abilities":[5,0],"address":3302456,"base_stats":[50,65,90,15,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":205}],"friendship":70,"id":204,"learnset":{"address":3313234,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":36,"move_id":153},{"level":43,"move_id":191},{"level":50,"move_id":38}]},"tmhm_learnset":"00A01E118E358620","types":[6,6]},{"abilities":[5,0],"address":3302484,"base_stats":[75,90,140,40,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":205,"learnset":{"address":3313258,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":1,"move_id":120},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":39,"move_id":153},{"level":49,"move_id":191},{"level":59,"move_id":38}]},"tmhm_learnset":"00A01E118E35C620","types":[6,8]},{"abilities":[32,50],"address":3302512,"base_stats":[100,70,70,45,65,65],"catch_rate":190,"evolutions":[],"friendship":70,"id":206,"learnset":{"address":3313282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":4,"move_id":111},{"level":11,"move_id":281},{"level":14,"move_id":137},{"level":21,"move_id":180},{"level":24,"move_id":228},{"level":31,"move_id":103},{"level":34,"move_id":36},{"level":41,"move_id":283}]},"tmhm_learnset":"00A03E66AFF3362C","types":[0,0]},{"abilities":[52,8],"address":3302540,"base_stats":[65,75,105,85,35,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":207,"learnset":{"address":3313308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":28},{"level":13,"move_id":106},{"level":20,"move_id":98},{"level":28,"move_id":185},{"level":36,"move_id":163},{"level":44,"move_id":103},{"level":52,"move_id":12}]},"tmhm_learnset":"00A47ED88E530620","types":[4,2]},{"abilities":[69,5],"address":3302568,"base_stats":[75,85,200,30,55,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":208,"learnset":{"address":3313332,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":242},{"level":57,"move_id":38}]},"tmhm_learnset":"00A41F508E514E30","types":[8,4]},{"abilities":[22,50],"address":3302596,"base_stats":[60,80,50,30,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":23,"species":210}],"friendship":70,"id":209,"learnset":{"address":3313360,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":26,"move_id":46},{"level":34,"move_id":99},{"level":43,"move_id":36},{"level":53,"move_id":242}]},"tmhm_learnset":"00A23F2EEFB30EB5","types":[0,0]},{"abilities":[22,22],"address":3302624,"base_stats":[90,120,75,45,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":210,"learnset":{"address":3313386,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":28,"move_id":46},{"level":38,"move_id":99},{"level":49,"move_id":36},{"level":61,"move_id":242}]},"tmhm_learnset":"00A23F6EEFF34EB5","types":[0,0]},{"abilities":[38,33],"address":3302652,"base_stats":[65,95,75,85,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":211,"learnset":{"address":3313412,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":191},{"level":1,"move_id":33},{"level":1,"move_id":40},{"level":10,"move_id":106},{"level":10,"move_id":107},{"level":19,"move_id":55},{"level":28,"move_id":42},{"level":37,"move_id":36},{"level":46,"move_id":56}]},"tmhm_learnset":"03101E0AA4133264","types":[11,3]},{"abilities":[68,0],"address":3302680,"base_stats":[70,130,100,65,55,80],"catch_rate":25,"evolutions":[],"friendship":70,"id":212,"learnset":{"address":3313434,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":232},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00A47E9084134620","types":[6,8]},{"abilities":[5,0],"address":3302708,"base_stats":[20,10,230,5,10,230],"catch_rate":190,"evolutions":[],"friendship":70,"id":213,"learnset":{"address":3313462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":9,"move_id":35},{"level":14,"move_id":227},{"level":23,"move_id":219},{"level":28,"move_id":117},{"level":37,"move_id":156}]},"tmhm_learnset":"00E01E588E190620","types":[6,5]},{"abilities":[68,62],"address":3302736,"base_stats":[80,125,75,85,40,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":214,"learnset":{"address":3313482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":30},{"level":11,"move_id":203},{"level":17,"move_id":31},{"level":23,"move_id":280},{"level":30,"move_id":68},{"level":37,"move_id":36},{"level":45,"move_id":179},{"level":53,"move_id":224}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,1]},{"abilities":[39,51],"address":3302764,"base_stats":[55,95,55,115,35,75],"catch_rate":60,"evolutions":[],"friendship":35,"id":215,"learnset":{"address":3313508,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":269},{"level":8,"move_id":98},{"level":15,"move_id":103},{"level":22,"move_id":185},{"level":29,"move_id":154},{"level":36,"move_id":97},{"level":43,"move_id":196},{"level":50,"move_id":163},{"level":57,"move_id":251},{"level":64,"move_id":232}]},"tmhm_learnset":"00B53F80EC533E69","types":[17,15]},{"abilities":[53,0],"address":3302792,"base_stats":[60,80,50,40,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":217}],"friendship":70,"id":216,"learnset":{"address":3313536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43F80CE130EB1","types":[0,0]},{"abilities":[62,0],"address":3302820,"base_stats":[90,130,75,55,75,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":217,"learnset":{"address":3313562,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":122},{"level":1,"move_id":154},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43FC0CE134EB1","types":[0,0]},{"abilities":[40,49],"address":3302848,"base_stats":[40,40,40,20,70,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":219}],"friendship":70,"id":218,"learnset":{"address":3313588,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":43,"move_id":157},{"level":50,"move_id":34}]},"tmhm_learnset":"00821E2584118620","types":[10,10]},{"abilities":[40,49],"address":3302876,"base_stats":[50,50,120,30,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":219,"learnset":{"address":3313612,"moves":[{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":1,"move_id":52},{"level":1,"move_id":88},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":48,"move_id":157},{"level":60,"move_id":34}]},"tmhm_learnset":"00A21E758611C620","types":[10,5]},{"abilities":[12,0],"address":3302904,"base_stats":[50,50,40,50,30,30],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":221}],"friendship":70,"id":220,"learnset":{"address":3313636,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":316},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":37,"move_id":54},{"level":46,"move_id":59},{"level":55,"move_id":133}]},"tmhm_learnset":"00A01E518E13B270","types":[15,4]},{"abilities":[12,0],"address":3302932,"base_stats":[100,100,80,50,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":221,"learnset":{"address":3313658,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":316},{"level":1,"move_id":181},{"level":1,"move_id":203},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":33,"move_id":31},{"level":42,"move_id":54},{"level":56,"move_id":59},{"level":70,"move_id":133}]},"tmhm_learnset":"00A01E518E13F270","types":[15,4]},{"abilities":[55,30],"address":3302960,"base_stats":[55,55,85,35,65,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":222,"learnset":{"address":3313682,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":106},{"level":12,"move_id":145},{"level":17,"move_id":105},{"level":17,"move_id":287},{"level":23,"move_id":61},{"level":28,"move_id":131},{"level":34,"move_id":350},{"level":39,"move_id":243},{"level":45,"move_id":246}]},"tmhm_learnset":"00B01E51BE1BB66C","types":[11,5]},{"abilities":[55,0],"address":3302988,"base_stats":[35,65,35,65,65,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":224}],"friendship":70,"id":223,"learnset":{"address":3313710,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":199},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":33,"move_id":116},{"level":44,"move_id":58},{"level":55,"move_id":63}]},"tmhm_learnset":"03103E2494137624","types":[11,11]},{"abilities":[21,0],"address":3303016,"base_stats":[75,105,75,45,105,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":224,"learnset":{"address":3313734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":132},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":25,"move_id":190},{"level":38,"move_id":116},{"level":54,"move_id":58},{"level":70,"move_id":63}]},"tmhm_learnset":"03103E2C94137724","types":[11,11]},{"abilities":[72,55],"address":3303044,"base_stats":[45,55,45,75,65,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":225,"learnset":{"address":3313760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":217}]},"tmhm_learnset":"00083E8084133265","types":[15,2]},{"abilities":[33,11],"address":3303072,"base_stats":[65,40,70,70,80,140],"catch_rate":25,"evolutions":[],"friendship":70,"id":226,"learnset":{"address":3313770,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":145},{"level":8,"move_id":48},{"level":15,"move_id":61},{"level":22,"move_id":36},{"level":29,"move_id":97},{"level":36,"move_id":17},{"level":43,"move_id":352},{"level":50,"move_id":109}]},"tmhm_learnset":"03101E8086133264","types":[11,2]},{"abilities":[51,5],"address":3303100,"base_stats":[65,80,140,70,40,70],"catch_rate":25,"evolutions":[],"friendship":70,"id":227,"learnset":{"address":3313794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":10,"move_id":28},{"level":13,"move_id":129},{"level":16,"move_id":97},{"level":26,"move_id":31},{"level":29,"move_id":314},{"level":32,"move_id":211},{"level":42,"move_id":191},{"level":45,"move_id":319}]},"tmhm_learnset":"008C7F9084110E30","types":[8,2]},{"abilities":[48,18],"address":3303128,"base_stats":[45,60,30,65,80,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":24,"species":229}],"friendship":35,"id":228,"learnset":{"address":3313820,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":25,"move_id":44},{"level":31,"move_id":316},{"level":37,"move_id":185},{"level":43,"move_id":53},{"level":49,"move_id":242}]},"tmhm_learnset":"00833F2CA4710E30","types":[17,10]},{"abilities":[48,18],"address":3303156,"base_stats":[75,90,50,95,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":229,"learnset":{"address":3313846,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":1,"move_id":336},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":27,"move_id":44},{"level":35,"move_id":316},{"level":43,"move_id":185},{"level":51,"move_id":53},{"level":59,"move_id":242}]},"tmhm_learnset":"00A33F2CA4714E30","types":[17,10]},{"abilities":[33,0],"address":3303184,"base_stats":[75,95,95,85,95,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":230,"learnset":{"address":3313872,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,16]},{"abilities":[53,0],"address":3303212,"base_stats":[90,60,60,40,40,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":25,"species":232}],"friendship":70,"id":231,"learnset":{"address":3313896,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":36},{"level":33,"move_id":205},{"level":41,"move_id":203},{"level":49,"move_id":38}]},"tmhm_learnset":"00A01E5086510630","types":[4,4]},{"abilities":[5,0],"address":3303240,"base_stats":[90,120,120,50,60,60],"catch_rate":60,"evolutions":[],"friendship":70,"id":232,"learnset":{"address":3313918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":30},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":31},{"level":33,"move_id":205},{"level":41,"move_id":229},{"level":49,"move_id":89}]},"tmhm_learnset":"00A01E5086514630","types":[4,4]},{"abilities":[36,0],"address":3303268,"base_stats":[85,80,90,60,105,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":233,"learnset":{"address":3313940,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":111},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[22,0],"address":3303296,"base_stats":[73,95,62,85,85,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":234,"learnset":{"address":3313966,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":43},{"level":13,"move_id":310},{"level":19,"move_id":95},{"level":25,"move_id":23},{"level":31,"move_id":28},{"level":37,"move_id":36},{"level":43,"move_id":109},{"level":49,"move_id":347}]},"tmhm_learnset":"0040BE03B7F38638","types":[0,0]},{"abilities":[20,0],"address":3303324,"base_stats":[55,20,35,75,20,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":235,"learnset":{"address":3313992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":166},{"level":11,"move_id":166},{"level":21,"move_id":166},{"level":31,"move_id":166},{"level":41,"move_id":166},{"level":51,"move_id":166},{"level":61,"move_id":166},{"level":71,"move_id":166},{"level":81,"move_id":166},{"level":91,"move_id":166}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[62,0],"address":3303352,"base_stats":[35,35,35,35,35,35],"catch_rate":75,"evolutions":[{"method":"LEVEL_ATK_LT_DEF","param":20,"species":107},{"method":"LEVEL_ATK_GT_DEF","param":20,"species":106},{"method":"LEVEL_ATK_EQ_DEF","param":20,"species":237}],"friendship":70,"id":236,"learnset":{"address":3314020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"00A03E00C61306A0","types":[1,1]},{"abilities":[22,0],"address":3303380,"base_stats":[50,95,95,70,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":237,"learnset":{"address":3314030,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":27},{"level":7,"move_id":116},{"level":13,"move_id":228},{"level":19,"move_id":98},{"level":20,"move_id":167},{"level":25,"move_id":229},{"level":31,"move_id":68},{"level":37,"move_id":97},{"level":43,"move_id":197},{"level":49,"move_id":283}]},"tmhm_learnset":"00A03E10CE1306A0","types":[1,1]},{"abilities":[12,0],"address":3303408,"base_stats":[45,30,15,65,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":124}],"friendship":70,"id":238,"learnset":{"address":3314058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":9,"move_id":186},{"level":13,"move_id":181},{"level":21,"move_id":93},{"level":25,"move_id":47},{"level":33,"move_id":212},{"level":37,"move_id":313},{"level":45,"move_id":94},{"level":49,"move_id":195},{"level":57,"move_id":59}]},"tmhm_learnset":"0040BE01B413B26C","types":[15,14]},{"abilities":[9,0],"address":3303436,"base_stats":[45,63,37,95,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":125}],"friendship":70,"id":239,"learnset":{"address":3314086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":33,"move_id":103},{"level":41,"move_id":85},{"level":49,"move_id":87}]},"tmhm_learnset":"00C03E02D5938221","types":[13,13]},{"abilities":[49,0],"address":3303464,"base_stats":[45,75,37,83,70,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":126}],"friendship":70,"id":240,"learnset":{"address":3314108,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":31,"move_id":241},{"level":37,"move_id":53},{"level":43,"move_id":109},{"level":49,"move_id":126}]},"tmhm_learnset":"00803E24D4510621","types":[10,10]},{"abilities":[47,0],"address":3303492,"base_stats":[95,80,105,100,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":241,"learnset":{"address":3314134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":8,"move_id":111},{"level":13,"move_id":23},{"level":19,"move_id":208},{"level":26,"move_id":117},{"level":34,"move_id":205},{"level":43,"move_id":34},{"level":53,"move_id":215}]},"tmhm_learnset":"00B01E52E7F37625","types":[0,0]},{"abilities":[30,32],"address":3303520,"base_stats":[255,10,10,55,75,135],"catch_rate":30,"evolutions":[],"friendship":140,"id":242,"learnset":{"address":3314160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":4,"move_id":39},{"level":7,"move_id":287},{"level":10,"move_id":135},{"level":13,"move_id":3},{"level":18,"move_id":107},{"level":23,"move_id":47},{"level":28,"move_id":121},{"level":33,"move_id":111},{"level":40,"move_id":113},{"level":47,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[46,0],"address":3303548,"base_stats":[90,85,75,115,115,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":243,"learnset":{"address":3314190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":84},{"level":21,"move_id":46},{"level":31,"move_id":98},{"level":41,"move_id":209},{"level":51,"move_id":115},{"level":61,"move_id":242},{"level":71,"move_id":87},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E138DD34638","types":[13,13]},{"abilities":[46,0],"address":3303576,"base_stats":[115,115,85,100,90,75],"catch_rate":3,"evolutions":[],"friendship":35,"id":244,"learnset":{"address":3314216,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":52},{"level":21,"move_id":46},{"level":31,"move_id":83},{"level":41,"move_id":23},{"level":51,"move_id":53},{"level":61,"move_id":207},{"level":71,"move_id":126},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E358C734638","types":[10,10]},{"abilities":[46,0],"address":3303604,"base_stats":[100,75,115,85,90,115],"catch_rate":3,"evolutions":[],"friendship":35,"id":245,"learnset":{"address":3314242,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":61},{"level":21,"move_id":240},{"level":31,"move_id":16},{"level":41,"move_id":62},{"level":51,"move_id":54},{"level":61,"move_id":243},{"level":71,"move_id":56},{"level":81,"move_id":347}]},"tmhm_learnset":"03940E118C53767C","types":[11,11]},{"abilities":[62,0],"address":3303632,"base_stats":[50,64,50,41,45,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":247}],"friendship":35,"id":246,"learnset":{"address":3314268,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":36,"move_id":184},{"level":43,"move_id":242},{"level":50,"move_id":89},{"level":57,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[61,0],"address":3303660,"base_stats":[70,84,70,51,65,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":248}],"friendship":35,"id":247,"learnset":{"address":3314294,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":56,"move_id":89},{"level":65,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[45,0],"address":3303688,"base_stats":[100,134,110,61,95,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":248,"learnset":{"address":3314320,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":61,"move_id":89},{"level":75,"move_id":63}]},"tmhm_learnset":"00B41FF6CFD37E37","types":[5,17]},{"abilities":[46,0],"address":3303716,"base_stats":[106,90,130,110,90,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":249,"learnset":{"address":3314346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":56},{"level":55,"move_id":240},{"level":66,"move_id":129},{"level":77,"move_id":177},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"03B8CE93B7DFF67C","types":[14,2]},{"abilities":[46,0],"address":3303744,"base_stats":[106,130,90,90,110,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":250,"learnset":{"address":3314374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":126},{"level":55,"move_id":241},{"level":66,"move_id":129},{"level":77,"move_id":221},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"00EA4EB7B7BFC638","types":[10,2]},{"abilities":[30,0],"address":3303772,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":251,"learnset":{"address":3314402,"moves":[{"level":1,"move_id":73},{"level":1,"move_id":93},{"level":1,"move_id":105},{"level":1,"move_id":215},{"level":10,"move_id":219},{"level":20,"move_id":246},{"level":30,"move_id":248},{"level":40,"move_id":226},{"level":50,"move_id":195}]},"tmhm_learnset":"00448E93B43FC62C","types":[14,12]},{"abilities":[0,0],"address":3303800,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":252,"learnset":{"address":3314422,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303828,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":253,"learnset":{"address":3314432,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303856,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":254,"learnset":{"address":3314442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303884,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":255,"learnset":{"address":3314452,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303912,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":256,"learnset":{"address":3314462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303940,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":257,"learnset":{"address":3314472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303968,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":258,"learnset":{"address":3314482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303996,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":259,"learnset":{"address":3314492,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304024,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":260,"learnset":{"address":3314502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304052,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":261,"learnset":{"address":3314512,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304080,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":262,"learnset":{"address":3314522,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304108,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":263,"learnset":{"address":3314532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304136,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":264,"learnset":{"address":3314542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304164,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":265,"learnset":{"address":3314552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304192,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":266,"learnset":{"address":3314562,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304220,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":267,"learnset":{"address":3314572,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304248,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":268,"learnset":{"address":3314582,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304276,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":269,"learnset":{"address":3314592,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304304,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":270,"learnset":{"address":3314602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304332,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":271,"learnset":{"address":3314612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304360,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":272,"learnset":{"address":3314622,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304388,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":273,"learnset":{"address":3314632,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304416,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":274,"learnset":{"address":3314642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304444,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":275,"learnset":{"address":3314652,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304472,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":276,"learnset":{"address":3314662,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3304500,"base_stats":[40,45,35,70,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":278}],"friendship":70,"id":277,"learnset":{"address":3314672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":228},{"level":21,"move_id":103},{"level":26,"move_id":72},{"level":31,"move_id":97},{"level":36,"move_id":21},{"level":41,"move_id":197},{"level":46,"move_id":202}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304528,"base_stats":[50,65,45,95,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":279}],"friendship":70,"id":278,"learnset":{"address":3314700,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":41,"move_id":21},{"level":47,"move_id":197},{"level":53,"move_id":206}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304556,"base_stats":[70,85,65,120,105,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":279,"learnset":{"address":3314730,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":43,"move_id":21},{"level":51,"move_id":197},{"level":59,"move_id":206}]},"tmhm_learnset":"00E41EC0CE7D4733","types":[12,12]},{"abilities":[66,0],"address":3304584,"base_stats":[45,60,40,45,70,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":281}],"friendship":70,"id":280,"learnset":{"address":3314760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":116},{"level":10,"move_id":52},{"level":16,"move_id":64},{"level":19,"move_id":28},{"level":25,"move_id":83},{"level":28,"move_id":98},{"level":34,"move_id":163},{"level":37,"move_id":119},{"level":43,"move_id":53}]},"tmhm_learnset":"00A61EE48C110620","types":[10,10]},{"abilities":[66,0],"address":3304612,"base_stats":[60,85,60,55,85,60],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":282}],"friendship":70,"id":281,"learnset":{"address":3314788,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":39,"move_id":163},{"level":43,"move_id":119},{"level":50,"move_id":327}]},"tmhm_learnset":"00A61EE4CC1106A1","types":[10,1]},{"abilities":[66,0],"address":3304640,"base_stats":[80,120,70,80,110,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":282,"learnset":{"address":3314818,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":36,"move_id":299},{"level":42,"move_id":163},{"level":49,"move_id":119},{"level":59,"move_id":327}]},"tmhm_learnset":"00A61EE4CE1146B1","types":[10,1]},{"abilities":[67,0],"address":3304668,"base_stats":[50,70,50,40,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":284}],"friendship":70,"id":283,"learnset":{"address":3314852,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":19,"move_id":193},{"level":24,"move_id":300},{"level":28,"move_id":36},{"level":33,"move_id":250},{"level":37,"move_id":182},{"level":42,"move_id":56},{"level":46,"move_id":283}]},"tmhm_learnset":"03B01E408C533264","types":[11,11]},{"abilities":[67,0],"address":3304696,"base_stats":[70,85,70,50,60,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":285}],"friendship":70,"id":284,"learnset":{"address":3314882,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":37,"move_id":330},{"level":42,"move_id":182},{"level":46,"move_id":89},{"level":53,"move_id":283}]},"tmhm_learnset":"03B01E408E533264","types":[11,4]},{"abilities":[67,0],"address":3304724,"base_stats":[100,110,90,60,85,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":285,"learnset":{"address":3314914,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":39,"move_id":330},{"level":46,"move_id":182},{"level":52,"move_id":89},{"level":61,"move_id":283}]},"tmhm_learnset":"03B01E40CE537275","types":[11,4]},{"abilities":[50,0],"address":3304752,"base_stats":[35,55,35,35,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":287}],"friendship":70,"id":286,"learnset":{"address":3314946,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":21,"move_id":46},{"level":25,"move_id":207},{"level":29,"move_id":184},{"level":33,"move_id":36},{"level":37,"move_id":269},{"level":41,"move_id":242},{"level":45,"move_id":168}]},"tmhm_learnset":"00813F00AC530E30","types":[17,17]},{"abilities":[22,0],"address":3304780,"base_stats":[70,90,70,70,60,60],"catch_rate":127,"evolutions":[],"friendship":70,"id":287,"learnset":{"address":3314978,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":336},{"level":1,"move_id":28},{"level":1,"move_id":44},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":22,"move_id":46},{"level":27,"move_id":207},{"level":32,"move_id":184},{"level":37,"move_id":36},{"level":42,"move_id":269},{"level":47,"move_id":242},{"level":52,"move_id":168}]},"tmhm_learnset":"00A13F00AC534E30","types":[17,17]},{"abilities":[53,0],"address":3304808,"base_stats":[38,30,41,60,30,41],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":289}],"friendship":70,"id":288,"learnset":{"address":3315010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":21,"move_id":300},{"level":25,"move_id":42},{"level":29,"move_id":343},{"level":33,"move_id":175},{"level":37,"move_id":156},{"level":41,"move_id":187}]},"tmhm_learnset":"00943E02ADD33624","types":[0,0]},{"abilities":[53,0],"address":3304836,"base_stats":[78,70,61,100,50,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":289,"learnset":{"address":3315040,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":23,"move_id":300},{"level":29,"move_id":154},{"level":35,"move_id":343},{"level":41,"move_id":163},{"level":47,"move_id":156},{"level":53,"move_id":187}]},"tmhm_learnset":"00B43E02ADD37634","types":[0,0]},{"abilities":[19,0],"address":3304864,"base_stats":[45,45,35,20,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_SILCOON","param":7,"species":291},{"method":"LEVEL_CASCOON","param":7,"species":293}],"friendship":70,"id":290,"learnset":{"address":3315070,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81},{"level":5,"move_id":40}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3304892,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":292}],"friendship":70,"id":291,"learnset":{"address":3315082,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[68,0],"address":3304920,"base_stats":[60,70,50,65,90,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":292,"learnset":{"address":3315094,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":10,"move_id":71},{"level":13,"move_id":16},{"level":17,"move_id":78},{"level":20,"move_id":234},{"level":24,"move_id":72},{"level":27,"move_id":18},{"level":31,"move_id":213},{"level":34,"move_id":318},{"level":38,"move_id":202}]},"tmhm_learnset":"00403E80B43D4620","types":[6,2]},{"abilities":[61,0],"address":3304948,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":294}],"friendship":70,"id":293,"learnset":{"address":3315122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[19,0],"address":3304976,"base_stats":[60,50,70,65,50,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":294,"learnset":{"address":3315134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":16},{"level":17,"move_id":182},{"level":20,"move_id":236},{"level":24,"move_id":60},{"level":27,"move_id":18},{"level":31,"move_id":113},{"level":34,"move_id":318},{"level":38,"move_id":92}]},"tmhm_learnset":"00403E88B435C620","types":[6,3]},{"abilities":[33,44],"address":3305004,"base_stats":[40,30,30,30,40,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":296}],"friendship":70,"id":295,"learnset":{"address":3315162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":21,"move_id":54},{"level":31,"move_id":240},{"level":43,"move_id":72}]},"tmhm_learnset":"00503E0084373764","types":[11,12]},{"abilities":[33,44],"address":3305032,"base_stats":[60,50,50,50,60,70],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":297}],"friendship":70,"id":296,"learnset":{"address":3315184,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":154},{"level":31,"move_id":346},{"level":37,"move_id":168},{"level":43,"move_id":253},{"level":49,"move_id":56}]},"tmhm_learnset":"03F03E00C4373764","types":[11,12]},{"abilities":[33,44],"address":3305060,"base_stats":[80,70,70,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":297,"learnset":{"address":3315212,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":45},{"level":1,"move_id":71},{"level":1,"move_id":267}]},"tmhm_learnset":"03F03E00C4377765","types":[11,12]},{"abilities":[34,48],"address":3305088,"base_stats":[40,40,50,30,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":299}],"friendship":70,"id":298,"learnset":{"address":3315222,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":21,"move_id":235},{"level":31,"move_id":241},{"level":43,"move_id":153}]},"tmhm_learnset":"00C01E00AC350720","types":[12,12]},{"abilities":[34,48],"address":3305116,"base_stats":[70,70,40,60,60,40],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":300}],"friendship":70,"id":299,"learnset":{"address":3315244,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":259},{"level":31,"move_id":185},{"level":37,"move_id":13},{"level":43,"move_id":207},{"level":49,"move_id":326}]},"tmhm_learnset":"00E43F40EC354720","types":[12,17]},{"abilities":[34,48],"address":3305144,"base_stats":[90,100,60,80,90,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":300,"learnset":{"address":3315272,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":1,"move_id":74},{"level":1,"move_id":267}]},"tmhm_learnset":"00E43FC0EC354720","types":[12,17]},{"abilities":[14,0],"address":3305172,"base_stats":[31,45,90,40,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_NINJASK","param":20,"species":302},{"method":"LEVEL_SHEDINJA","param":20,"species":303}],"friendship":70,"id":301,"learnset":{"address":3315282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":206},{"level":31,"move_id":189},{"level":38,"move_id":232},{"level":45,"move_id":91}]},"tmhm_learnset":"00440E90AC350620","types":[6,4]},{"abilities":[3,0],"address":3305200,"base_stats":[61,90,45,160,50,50],"catch_rate":120,"evolutions":[],"friendship":70,"id":302,"learnset":{"address":3315308,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":141},{"level":1,"move_id":28},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":20,"move_id":104},{"level":20,"move_id":210},{"level":20,"move_id":103},{"level":25,"move_id":14},{"level":31,"move_id":163},{"level":38,"move_id":97},{"level":45,"move_id":226}]},"tmhm_learnset":"00443E90AC354620","types":[6,2]},{"abilities":[25,0],"address":3305228,"base_stats":[1,90,45,40,30,30],"catch_rate":45,"evolutions":[],"friendship":70,"id":303,"learnset":{"address":3315340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":180},{"level":31,"move_id":109},{"level":38,"move_id":247},{"level":45,"move_id":288}]},"tmhm_learnset":"00442E90AC354620","types":[6,7]},{"abilities":[62,0],"address":3305256,"base_stats":[40,55,30,85,30,30],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":305}],"friendship":70,"id":304,"learnset":{"address":3315366,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":26,"move_id":283},{"level":34,"move_id":332},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[62,0],"address":3305284,"base_stats":[60,85,60,125,50,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":305,"learnset":{"address":3315390,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":98},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":28,"move_id":283},{"level":38,"move_id":332},{"level":49,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[27,0],"address":3305312,"base_stats":[60,40,60,35,40,60],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":23,"species":307}],"friendship":70,"id":306,"learnset":{"address":3315414,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":28,"move_id":77},{"level":36,"move_id":74},{"level":45,"move_id":202},{"level":54,"move_id":147}]},"tmhm_learnset":"00411E08843D0720","types":[12,12]},{"abilities":[27,0],"address":3305340,"base_stats":[60,130,80,70,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":307,"learnset":{"address":3315442,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":33},{"level":1,"move_id":78},{"level":1,"move_id":73},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":23,"move_id":183},{"level":28,"move_id":68},{"level":36,"move_id":327},{"level":45,"move_id":170},{"level":54,"move_id":223}]},"tmhm_learnset":"00E51E08C47D47A1","types":[12,1]},{"abilities":[20,0],"address":3305368,"base_stats":[60,60,60,60,60,60],"catch_rate":255,"evolutions":[],"friendship":70,"id":308,"learnset":{"address":3315472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":253},{"level":12,"move_id":185},{"level":16,"move_id":60},{"level":23,"move_id":95},{"level":27,"move_id":146},{"level":34,"move_id":298},{"level":38,"move_id":244},{"level":45,"move_id":38},{"level":49,"move_id":175},{"level":56,"move_id":37}]},"tmhm_learnset":"00E1BE42FC1B062D","types":[0,0]},{"abilities":[51,0],"address":3305396,"base_stats":[40,30,30,85,55,30],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":310}],"friendship":70,"id":309,"learnset":{"address":3315502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":31,"move_id":98},{"level":43,"move_id":228},{"level":55,"move_id":97}]},"tmhm_learnset":"00087E8284133264","types":[11,2]},{"abilities":[51,0],"address":3305424,"base_stats":[60,50,100,65,85,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":310,"learnset":{"address":3315524,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":346},{"level":1,"move_id":17},{"level":3,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":25,"move_id":182},{"level":33,"move_id":254},{"level":33,"move_id":256},{"level":47,"move_id":255},{"level":61,"move_id":56}]},"tmhm_learnset":"00187E8284137264","types":[11,2]},{"abilities":[33,0],"address":3305452,"base_stats":[40,30,32,65,50,52],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":312}],"friendship":70,"id":311,"learnset":{"address":3315552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":25,"move_id":61},{"level":31,"move_id":97},{"level":37,"move_id":54},{"level":37,"move_id":114}]},"tmhm_learnset":"00403E00A4373624","types":[6,11]},{"abilities":[22,0],"address":3305480,"base_stats":[70,60,62,60,80,82],"catch_rate":75,"evolutions":[],"friendship":70,"id":312,"learnset":{"address":3315576,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":98},{"level":1,"move_id":230},{"level":1,"move_id":346},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":26,"move_id":16},{"level":33,"move_id":184},{"level":40,"move_id":78},{"level":47,"move_id":318},{"level":53,"move_id":18}]},"tmhm_learnset":"00403E80A4377624","types":[6,2]},{"abilities":[41,12],"address":3305508,"base_stats":[130,70,35,60,70,35],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":40,"species":314}],"friendship":70,"id":313,"learnset":{"address":3315602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":150},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":41,"move_id":323},{"level":46,"move_id":133},{"level":50,"move_id":56}]},"tmhm_learnset":"03B01E4086133274","types":[11,11]},{"abilities":[41,12],"address":3305536,"base_stats":[170,90,45,60,90,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":314,"learnset":{"address":3315634,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":205},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":44,"move_id":323},{"level":52,"move_id":133},{"level":59,"move_id":56}]},"tmhm_learnset":"03B01E4086137274","types":[11,11]},{"abilities":[56,0],"address":3305564,"base_stats":[50,45,45,50,35,35],"catch_rate":255,"evolutions":[{"method":"ITEM","param":94,"species":316}],"friendship":70,"id":315,"learnset":{"address":3315666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":3,"move_id":39},{"level":7,"move_id":213},{"level":13,"move_id":47},{"level":15,"move_id":3},{"level":19,"move_id":274},{"level":25,"move_id":204},{"level":27,"move_id":185},{"level":31,"move_id":343},{"level":37,"move_id":215},{"level":39,"move_id":38}]},"tmhm_learnset":"00401E02ADFB362C","types":[0,0]},{"abilities":[56,0],"address":3305592,"base_stats":[70,65,65,70,55,55],"catch_rate":60,"evolutions":[],"friendship":70,"id":316,"learnset":{"address":3315696,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":213},{"level":1,"move_id":47},{"level":1,"move_id":3}]},"tmhm_learnset":"00E01E02ADFB762C","types":[0,0]},{"abilities":[16,0],"address":3305620,"base_stats":[60,90,70,40,60,120],"catch_rate":200,"evolutions":[],"friendship":70,"id":317,"learnset":{"address":3315706,"moves":[{"level":1,"move_id":168},{"level":1,"move_id":39},{"level":1,"move_id":310},{"level":1,"move_id":122},{"level":1,"move_id":10},{"level":4,"move_id":20},{"level":7,"move_id":185},{"level":12,"move_id":154},{"level":17,"move_id":60},{"level":24,"move_id":103},{"level":31,"move_id":163},{"level":40,"move_id":164},{"level":49,"move_id":246}]},"tmhm_learnset":"00E5BEE6EDF33625","types":[0,0]},{"abilities":[26,0],"address":3305648,"base_stats":[40,40,55,55,40,70],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":36,"species":319}],"friendship":70,"id":318,"learnset":{"address":3315734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":37,"move_id":322},{"level":45,"move_id":153}]},"tmhm_learnset":"00408E51BE339620","types":[4,14]},{"abilities":[26,0],"address":3305676,"base_stats":[60,70,105,75,70,120],"catch_rate":90,"evolutions":[],"friendship":70,"id":319,"learnset":{"address":3315764,"moves":[{"level":1,"move_id":100},{"level":1,"move_id":93},{"level":1,"move_id":106},{"level":1,"move_id":229},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":36,"move_id":63},{"level":42,"move_id":322},{"level":55,"move_id":153}]},"tmhm_learnset":"00E08E51BE33D620","types":[4,14]},{"abilities":[5,42],"address":3305704,"base_stats":[30,45,135,30,45,90],"catch_rate":255,"evolutions":[],"friendship":70,"id":320,"learnset":{"address":3315796,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":106},{"level":13,"move_id":88},{"level":16,"move_id":335},{"level":22,"move_id":86},{"level":28,"move_id":157},{"level":31,"move_id":201},{"level":37,"move_id":156},{"level":43,"move_id":192},{"level":46,"move_id":199}]},"tmhm_learnset":"00A01F5287910E20","types":[5,5]},{"abilities":[73,0],"address":3305732,"base_stats":[70,85,140,20,85,70],"catch_rate":90,"evolutions":[],"friendship":70,"id":321,"learnset":{"address":3315824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":4,"move_id":123},{"level":7,"move_id":174},{"level":14,"move_id":108},{"level":17,"move_id":83},{"level":20,"move_id":34},{"level":27,"move_id":182},{"level":30,"move_id":53},{"level":33,"move_id":334},{"level":40,"move_id":133},{"level":43,"move_id":175},{"level":46,"move_id":257}]},"tmhm_learnset":"00A21E2C84510620","types":[10,10]},{"abilities":[51,0],"address":3305760,"base_stats":[50,75,75,50,65,65],"catch_rate":45,"evolutions":[],"friendship":35,"id":322,"learnset":{"address":3315856,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":10},{"level":5,"move_id":193},{"level":9,"move_id":101},{"level":13,"move_id":310},{"level":17,"move_id":154},{"level":21,"move_id":252},{"level":25,"move_id":197},{"level":29,"move_id":185},{"level":33,"move_id":282},{"level":37,"move_id":109},{"level":41,"move_id":247},{"level":45,"move_id":212}]},"tmhm_learnset":"00C53FC2FC130E2D","types":[17,7]},{"abilities":[12,0],"address":3305788,"base_stats":[50,48,43,60,46,41],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":324}],"friendship":70,"id":323,"learnset":{"address":3315888,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":189},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":31,"move_id":89},{"level":36,"move_id":248},{"level":41,"move_id":90}]},"tmhm_learnset":"03101E5086133264","types":[11,4]},{"abilities":[12,0],"address":3305816,"base_stats":[110,78,73,60,76,71],"catch_rate":75,"evolutions":[],"friendship":70,"id":324,"learnset":{"address":3315918,"moves":[{"level":1,"move_id":321},{"level":1,"move_id":189},{"level":1,"move_id":300},{"level":1,"move_id":346},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":36,"move_id":89},{"level":46,"move_id":248},{"level":56,"move_id":90}]},"tmhm_learnset":"03B01E5086137264","types":[11,4]},{"abilities":[33,0],"address":3305844,"base_stats":[43,30,55,97,40,65],"catch_rate":225,"evolutions":[],"friendship":70,"id":325,"learnset":{"address":3315948,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":204},{"level":12,"move_id":55},{"level":16,"move_id":97},{"level":24,"move_id":36},{"level":28,"move_id":213},{"level":36,"move_id":186},{"level":40,"move_id":175},{"level":48,"move_id":219}]},"tmhm_learnset":"03101E00841B3264","types":[11,11]},{"abilities":[52,75],"address":3305872,"base_stats":[43,80,65,35,50,35],"catch_rate":205,"evolutions":[{"method":"LEVEL","param":30,"species":327}],"friendship":70,"id":326,"learnset":{"address":3315974,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":32,"move_id":269},{"level":35,"move_id":152},{"level":38,"move_id":14},{"level":44,"move_id":12}]},"tmhm_learnset":"01B41EC8CC133A64","types":[11,11]},{"abilities":[52,75],"address":3305900,"base_stats":[63,120,85,55,90,55],"catch_rate":155,"evolutions":[],"friendship":70,"id":327,"learnset":{"address":3316004,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":106},{"level":1,"move_id":11},{"level":1,"move_id":43},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":34,"move_id":269},{"level":39,"move_id":152},{"level":44,"move_id":14},{"level":52,"move_id":12}]},"tmhm_learnset":"03B41EC8CC137A64","types":[11,17]},{"abilities":[33,0],"address":3305928,"base_stats":[20,15,20,80,10,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":30,"species":329}],"friendship":70,"id":328,"learnset":{"address":3316034,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[63,0],"address":3305956,"base_stats":[95,60,79,81,100,125],"catch_rate":60,"evolutions":[],"friendship":70,"id":329,"learnset":{"address":3316048,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":5,"move_id":35},{"level":10,"move_id":346},{"level":15,"move_id":287},{"level":20,"move_id":352},{"level":25,"move_id":239},{"level":30,"move_id":105},{"level":35,"move_id":240},{"level":40,"move_id":56},{"level":45,"move_id":213},{"level":50,"move_id":219}]},"tmhm_learnset":"03101E00845B7264","types":[11,11]},{"abilities":[24,0],"address":3305984,"base_stats":[45,90,20,65,65,20],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":30,"species":331}],"friendship":35,"id":330,"learnset":{"address":3316078,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":31,"move_id":36},{"level":37,"move_id":207},{"level":43,"move_id":97}]},"tmhm_learnset":"03103F0084133A64","types":[11,17]},{"abilities":[24,0],"address":3306012,"base_stats":[70,120,40,95,95,40],"catch_rate":60,"evolutions":[],"friendship":35,"id":331,"learnset":{"address":3316104,"moves":[{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":1,"move_id":99},{"level":1,"move_id":116},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":33,"move_id":163},{"level":38,"move_id":269},{"level":43,"move_id":207},{"level":48,"move_id":130},{"level":53,"move_id":97}]},"tmhm_learnset":"03B03F4086137A74","types":[11,17]},{"abilities":[52,71],"address":3306040,"base_stats":[45,100,45,10,45,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":333}],"friendship":70,"id":332,"learnset":{"address":3316134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":41,"move_id":91},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A01E508E354620","types":[4,4]},{"abilities":[26,26],"address":3306068,"base_stats":[50,70,50,70,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":45,"species":334}],"friendship":70,"id":333,"learnset":{"address":3316158,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A85E508E354620","types":[4,16]},{"abilities":[26,26],"address":3306096,"base_stats":[80,100,80,100,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":334,"learnset":{"address":3316184,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":53,"move_id":201},{"level":65,"move_id":63}]},"tmhm_learnset":"00A85E748E754622","types":[4,16]},{"abilities":[47,62],"address":3306124,"base_stats":[72,60,30,25,20,30],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":24,"species":336}],"friendship":70,"id":335,"learnset":{"address":3316210,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":28,"move_id":282},{"level":31,"move_id":265},{"level":37,"move_id":187},{"level":40,"move_id":203},{"level":46,"move_id":69},{"level":49,"move_id":179}]},"tmhm_learnset":"00B01E40CE1306A1","types":[1,1]},{"abilities":[47,62],"address":3306152,"base_stats":[144,120,60,50,40,60],"catch_rate":200,"evolutions":[],"friendship":70,"id":336,"learnset":{"address":3316242,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":1,"move_id":28},{"level":1,"move_id":292},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":29,"move_id":282},{"level":33,"move_id":265},{"level":40,"move_id":187},{"level":44,"move_id":203},{"level":51,"move_id":69},{"level":55,"move_id":179}]},"tmhm_learnset":"00B01E40CE1346A1","types":[1,1]},{"abilities":[9,31],"address":3306180,"base_stats":[40,45,40,65,65,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":26,"species":338}],"friendship":70,"id":337,"learnset":{"address":3316274,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":28,"move_id":46},{"level":33,"move_id":44},{"level":36,"move_id":87},{"level":41,"move_id":268}]},"tmhm_learnset":"00603E0285D30230","types":[13,13]},{"abilities":[9,31],"address":3306208,"base_stats":[70,75,60,105,105,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":338,"learnset":{"address":3316304,"moves":[{"level":1,"move_id":86},{"level":1,"move_id":43},{"level":1,"move_id":336},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":31,"move_id":46},{"level":39,"move_id":44},{"level":45,"move_id":87},{"level":53,"move_id":268}]},"tmhm_learnset":"00603E0285D34230","types":[13,13]},{"abilities":[12,0],"address":3306236,"base_stats":[60,60,40,35,65,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":33,"species":340}],"friendship":70,"id":339,"learnset":{"address":3316334,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":35,"move_id":89},{"level":41,"move_id":53},{"level":49,"move_id":38}]},"tmhm_learnset":"00A21E748E110620","types":[10,4]},{"abilities":[40,0],"address":3306264,"base_stats":[70,100,70,40,105,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":340,"learnset":{"address":3316360,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":1,"move_id":52},{"level":1,"move_id":222},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":33,"move_id":157},{"level":37,"move_id":89},{"level":45,"move_id":284},{"level":55,"move_id":90}]},"tmhm_learnset":"00A21E748E114630","types":[10,4]},{"abilities":[47,0],"address":3306292,"base_stats":[70,40,50,25,55,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":342}],"friendship":70,"id":341,"learnset":{"address":3316388,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":59},{"level":49,"move_id":329}]},"tmhm_learnset":"03B01E4086533264","types":[15,11]},{"abilities":[47,0],"address":3306320,"base_stats":[90,60,70,45,75,70],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":44,"species":343}],"friendship":70,"id":342,"learnset":{"address":3316416,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":47,"move_id":59},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E4086533274","types":[15,11]},{"abilities":[47,0],"address":3306348,"base_stats":[110,80,90,65,95,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":343,"learnset":{"address":3316444,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":50,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"03B01E4086537274","types":[15,11]},{"abilities":[8,0],"address":3306376,"base_stats":[50,85,40,35,85,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":32,"species":345}],"friendship":35,"id":344,"learnset":{"address":3316472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":33,"move_id":191},{"level":37,"move_id":302},{"level":41,"move_id":178},{"level":45,"move_id":201}]},"tmhm_learnset":"00441E1084350721","types":[12,12]},{"abilities":[8,0],"address":3306404,"base_stats":[70,115,60,55,115,60],"catch_rate":60,"evolutions":[],"friendship":35,"id":345,"learnset":{"address":3316504,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":74},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":35,"move_id":191},{"level":41,"move_id":302},{"level":47,"move_id":178},{"level":53,"move_id":201}]},"tmhm_learnset":"00641E1084354721","types":[12,17]},{"abilities":[39,0],"address":3306432,"base_stats":[50,50,50,50,50,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":42,"species":347}],"friendship":70,"id":346,"learnset":{"address":3316536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":37,"move_id":258},{"level":43,"move_id":59}]},"tmhm_learnset":"00401E00A41BB264","types":[15,15]},{"abilities":[39,0],"address":3306460,"base_stats":[80,80,80,80,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":347,"learnset":{"address":3316564,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":1,"move_id":104},{"level":1,"move_id":44},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":42,"move_id":258},{"level":53,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"00401F00A61BFA64","types":[15,15]},{"abilities":[26,0],"address":3306488,"base_stats":[70,55,65,70,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":348,"learnset":{"address":3316594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":95},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":94},{"level":43,"move_id":248},{"level":49,"move_id":153}]},"tmhm_learnset":"00408E51B61BD228","types":[5,14]},{"abilities":[26,0],"address":3306516,"base_stats":[70,95,85,70,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":349,"learnset":{"address":3316620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":83},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":157},{"level":43,"move_id":76},{"level":49,"move_id":153}]},"tmhm_learnset":"00428E75B639C628","types":[5,14]},{"abilities":[47,37],"address":3306544,"base_stats":[50,20,40,20,20,40],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":183}],"friendship":70,"id":350,"learnset":{"address":3316646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":150},{"level":3,"move_id":204},{"level":6,"move_id":39},{"level":10,"move_id":145},{"level":15,"move_id":21},{"level":21,"move_id":55}]},"tmhm_learnset":"01101E0084533264","types":[0,0]},{"abilities":[47,20],"address":3306572,"base_stats":[60,25,35,60,70,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":352}],"friendship":70,"id":351,"learnset":{"address":3316666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":1,"move_id":150},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":34,"move_id":94},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":340}]},"tmhm_learnset":"0041BF03B4538E28","types":[14,14]},{"abilities":[47,20],"address":3306600,"base_stats":[80,45,65,80,90,110],"catch_rate":60,"evolutions":[],"friendship":70,"id":352,"learnset":{"address":3316696,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":149},{"level":1,"move_id":316},{"level":1,"move_id":60},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":37,"move_id":94},{"level":43,"move_id":156},{"level":43,"move_id":173},{"level":55,"move_id":340}]},"tmhm_learnset":"0041BF03B453CE29","types":[14,14]},{"abilities":[57,0],"address":3306628,"base_stats":[60,50,40,95,85,75],"catch_rate":200,"evolutions":[],"friendship":70,"id":353,"learnset":{"address":3316726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":313},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[58,0],"address":3306656,"base_stats":[60,40,50,95,75,85],"catch_rate":200,"evolutions":[],"friendship":70,"id":354,"learnset":{"address":3316756,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":204},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[52,22],"address":3306684,"base_stats":[50,85,85,50,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":355,"learnset":{"address":3316786,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":6,"move_id":313},{"level":11,"move_id":44},{"level":16,"move_id":230},{"level":21,"move_id":11},{"level":26,"move_id":185},{"level":31,"move_id":226},{"level":36,"move_id":242},{"level":41,"move_id":334},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255}]},"tmhm_learnset":"00A01F7CC4335E21","types":[8,8]},{"abilities":[74,0],"address":3306712,"base_stats":[30,40,55,60,40,55],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":37,"species":357}],"friendship":70,"id":356,"learnset":{"address":3316818,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":38,"move_id":244},{"level":42,"move_id":179},{"level":48,"move_id":105}]},"tmhm_learnset":"00E01E41F41386A9","types":[1,14]},{"abilities":[74,0],"address":3306740,"base_stats":[60,60,75,80,60,75],"catch_rate":90,"evolutions":[],"friendship":70,"id":357,"learnset":{"address":3316848,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":9},{"level":1,"move_id":8},{"level":1,"move_id":117},{"level":1,"move_id":96},{"level":1,"move_id":93},{"level":1,"move_id":197},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":40,"move_id":244},{"level":46,"move_id":179},{"level":54,"move_id":105}]},"tmhm_learnset":"00E01E41F413C6A9","types":[1,14]},{"abilities":[30,0],"address":3306768,"base_stats":[45,40,60,50,40,75],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":359}],"friendship":70,"id":358,"learnset":{"address":3316884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":38,"move_id":119},{"level":41,"move_id":287},{"level":48,"move_id":195}]},"tmhm_learnset":"00087E80843B1620","types":[0,2]},{"abilities":[30,0],"address":3306796,"base_stats":[75,70,90,80,70,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":359,"learnset":{"address":3316912,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":310},{"level":1,"move_id":47},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":35,"move_id":225},{"level":40,"move_id":349},{"level":45,"move_id":287},{"level":54,"move_id":195},{"level":59,"move_id":143}]},"tmhm_learnset":"00887EA4867B5632","types":[16,2]},{"abilities":[23,0],"address":3306824,"base_stats":[95,23,48,23,23,48],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":15,"species":202}],"friendship":70,"id":360,"learnset":{"address":3316944,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":150},{"level":1,"move_id":204},{"level":1,"move_id":227},{"level":15,"move_id":68},{"level":15,"move_id":243},{"level":15,"move_id":219},{"level":15,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[26,0],"address":3306852,"base_stats":[20,40,90,25,30,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":362}],"friendship":35,"id":361,"learnset":{"address":3316962,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":38,"move_id":261},{"level":45,"move_id":212},{"level":49,"move_id":248}]},"tmhm_learnset":"0041BF00B4133E28","types":[7,7]},{"abilities":[46,0],"address":3306880,"base_stats":[40,70,130,25,60,130],"catch_rate":90,"evolutions":[],"friendship":35,"id":362,"learnset":{"address":3316990,"moves":[{"level":1,"move_id":20},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":1,"move_id":50},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":37,"move_id":325},{"level":41,"move_id":261},{"level":51,"move_id":212},{"level":58,"move_id":248}]},"tmhm_learnset":"00E1BF40B6137E29","types":[7,7]},{"abilities":[30,38],"address":3306908,"base_stats":[50,60,45,65,100,80],"catch_rate":150,"evolutions":[],"friendship":70,"id":363,"learnset":{"address":3317020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":5,"move_id":74},{"level":9,"move_id":40},{"level":13,"move_id":78},{"level":17,"move_id":72},{"level":21,"move_id":73},{"level":25,"move_id":345},{"level":29,"move_id":320},{"level":33,"move_id":202},{"level":37,"move_id":230},{"level":41,"move_id":275},{"level":45,"move_id":92},{"level":49,"move_id":80},{"level":53,"move_id":312},{"level":57,"move_id":235}]},"tmhm_learnset":"00441E08A4350720","types":[12,3]},{"abilities":[54,0],"address":3306936,"base_stats":[60,60,60,30,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":365}],"friendship":70,"id":364,"learnset":{"address":3317058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E5B336A5","types":[0,0]},{"abilities":[72,0],"address":3306964,"base_stats":[80,80,80,90,55,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":366}],"friendship":70,"id":365,"learnset":{"address":3317082,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":116},{"level":1,"move_id":227},{"level":1,"move_id":253},{"level":7,"move_id":227},{"level":13,"move_id":253},{"level":19,"move_id":154},{"level":25,"move_id":203},{"level":31,"move_id":163},{"level":37,"move_id":68},{"level":43,"move_id":264},{"level":49,"move_id":179}]},"tmhm_learnset":"00A41EA6E7B33EB5","types":[0,0]},{"abilities":[54,0],"address":3306992,"base_stats":[150,160,100,100,95,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":366,"learnset":{"address":3317108,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":1,"move_id":227},{"level":1,"move_id":303},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":36,"move_id":207},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E7B37EB5","types":[0,0]},{"abilities":[64,60],"address":3307020,"base_stats":[70,43,53,40,43,53],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":26,"species":368}],"friendship":70,"id":367,"learnset":{"address":3317134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":28,"move_id":92},{"level":34,"move_id":254},{"level":34,"move_id":255},{"level":34,"move_id":256},{"level":39,"move_id":188}]},"tmhm_learnset":"00A11E0AA4371724","types":[3,3]},{"abilities":[64,60],"address":3307048,"base_stats":[100,73,83,55,73,83],"catch_rate":75,"evolutions":[],"friendship":70,"id":368,"learnset":{"address":3317164,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":281},{"level":1,"move_id":139},{"level":1,"move_id":124},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":26,"move_id":34},{"level":31,"move_id":92},{"level":40,"move_id":254},{"level":40,"move_id":255},{"level":40,"move_id":256},{"level":48,"move_id":188}]},"tmhm_learnset":"00A11E0AA4375724","types":[3,3]},{"abilities":[34,0],"address":3307076,"base_stats":[99,68,83,51,72,87],"catch_rate":200,"evolutions":[],"friendship":70,"id":369,"learnset":{"address":3317196,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":16},{"level":7,"move_id":74},{"level":11,"move_id":75},{"level":17,"move_id":23},{"level":21,"move_id":230},{"level":27,"move_id":18},{"level":31,"move_id":345},{"level":37,"move_id":34},{"level":41,"move_id":76},{"level":47,"move_id":235}]},"tmhm_learnset":"00EC5E80863D4730","types":[12,2]},{"abilities":[43,0],"address":3307104,"base_stats":[64,51,23,28,51,23],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":20,"species":371}],"friendship":70,"id":370,"learnset":{"address":3317224,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":21,"move_id":48},{"level":25,"move_id":23},{"level":31,"move_id":103},{"level":35,"move_id":46},{"level":41,"move_id":156},{"level":41,"move_id":214},{"level":45,"move_id":304}]},"tmhm_learnset":"00001E26A4333634","types":[0,0]},{"abilities":[43,0],"address":3307132,"base_stats":[84,71,43,48,71,43],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":40,"species":372}],"friendship":70,"id":371,"learnset":{"address":3317254,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":43,"move_id":46},{"level":51,"move_id":156},{"level":51,"move_id":214},{"level":57,"move_id":304}]},"tmhm_learnset":"00A21F26E6333E34","types":[0,0]},{"abilities":[43,0],"address":3307160,"base_stats":[104,91,63,68,91,63],"catch_rate":45,"evolutions":[],"friendship":70,"id":372,"learnset":{"address":3317284,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":40,"move_id":63},{"level":45,"move_id":46},{"level":55,"move_id":156},{"level":55,"move_id":214},{"level":63,"move_id":304}]},"tmhm_learnset":"00A21F26E6337E34","types":[0,0]},{"abilities":[75,0],"address":3307188,"base_stats":[35,64,85,32,74,55],"catch_rate":255,"evolutions":[{"method":"ITEM","param":192,"species":374},{"method":"ITEM","param":193,"species":375}],"friendship":70,"id":373,"learnset":{"address":3317316,"moves":[{"level":1,"move_id":128},{"level":1,"move_id":55},{"level":1,"move_id":250},{"level":1,"move_id":334}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,0],"address":3307216,"base_stats":[55,104,105,52,94,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":374,"learnset":{"address":3317326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":44},{"level":15,"move_id":103},{"level":22,"move_id":352},{"level":29,"move_id":184},{"level":36,"move_id":242},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03111E4084137264","types":[11,11]},{"abilities":[33,0],"address":3307244,"base_stats":[55,84,105,52,114,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":375,"learnset":{"address":3317350,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":93},{"level":15,"move_id":97},{"level":22,"move_id":352},{"level":29,"move_id":133},{"level":36,"move_id":94},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03101E00B41B7264","types":[11,11]},{"abilities":[46,0],"address":3307272,"base_stats":[65,130,60,75,75,60],"catch_rate":30,"evolutions":[],"friendship":35,"id":376,"learnset":{"address":3317374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":5,"move_id":43},{"level":9,"move_id":269},{"level":13,"move_id":98},{"level":17,"move_id":13},{"level":21,"move_id":44},{"level":26,"move_id":14},{"level":31,"move_id":104},{"level":36,"move_id":163},{"level":41,"move_id":248},{"level":46,"move_id":195}]},"tmhm_learnset":"00E53FB6A5D37E6C","types":[17,17]},{"abilities":[15,0],"address":3307300,"base_stats":[44,75,35,45,63,33],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":37,"species":378}],"friendship":35,"id":377,"learnset":{"address":3317404,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":282},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":37,"move_id":185},{"level":44,"move_id":247},{"level":49,"move_id":289},{"level":56,"move_id":288}]},"tmhm_learnset":"0041BF02B5930E28","types":[7,7]},{"abilities":[15,0],"address":3307328,"base_stats":[64,115,65,65,83,63],"catch_rate":45,"evolutions":[],"friendship":35,"id":378,"learnset":{"address":3317432,"moves":[{"level":1,"move_id":282},{"level":1,"move_id":103},{"level":1,"move_id":101},{"level":1,"move_id":174},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":39,"move_id":185},{"level":48,"move_id":247},{"level":55,"move_id":289},{"level":64,"move_id":288}]},"tmhm_learnset":"0041BF02B5934E28","types":[7,7]},{"abilities":[61,0],"address":3307356,"base_stats":[73,100,60,65,100,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":379,"learnset":{"address":3317460,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":7,"move_id":122},{"level":10,"move_id":44},{"level":16,"move_id":342},{"level":19,"move_id":103},{"level":25,"move_id":137},{"level":28,"move_id":242},{"level":34,"move_id":305},{"level":37,"move_id":207},{"level":43,"move_id":114}]},"tmhm_learnset":"00A13E0C8E570E20","types":[3,3]},{"abilities":[17,0],"address":3307384,"base_stats":[73,115,60,90,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":380,"learnset":{"address":3317488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":43},{"level":7,"move_id":98},{"level":10,"move_id":14},{"level":13,"move_id":210},{"level":19,"move_id":163},{"level":25,"move_id":228},{"level":31,"move_id":306},{"level":37,"move_id":269},{"level":46,"move_id":197},{"level":55,"move_id":206}]},"tmhm_learnset":"00A03EA6EDF73E35","types":[0,0]},{"abilities":[33,69],"address":3307412,"base_stats":[100,90,130,55,45,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":381,"learnset":{"address":3317518,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":8,"move_id":55},{"level":15,"move_id":317},{"level":22,"move_id":281},{"level":29,"move_id":36},{"level":36,"move_id":300},{"level":43,"move_id":246},{"level":50,"move_id":156},{"level":57,"move_id":38},{"level":64,"move_id":56}]},"tmhm_learnset":"03901E50861B726C","types":[11,5]},{"abilities":[5,69],"address":3307440,"base_stats":[50,70,100,30,40,40],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":32,"species":383}],"friendship":35,"id":382,"learnset":{"address":3317546,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":34,"move_id":182},{"level":39,"move_id":319},{"level":44,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307468,"base_stats":[60,90,140,40,50,50],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":42,"species":384}],"friendship":35,"id":383,"learnset":{"address":3317578,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":45,"move_id":319},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307496,"base_stats":[70,110,180,50,60,60],"catch_rate":45,"evolutions":[],"friendship":35,"id":384,"learnset":{"address":3317610,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":50,"move_id":319},{"level":63,"move_id":38}]},"tmhm_learnset":"00B41EF6CFF37E37","types":[8,5]},{"abilities":[59,0],"address":3307524,"base_stats":[70,70,70,70,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":385,"learnset":{"address":3317642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":10,"move_id":55},{"level":10,"move_id":52},{"level":10,"move_id":181},{"level":20,"move_id":240},{"level":20,"move_id":241},{"level":20,"move_id":258},{"level":30,"move_id":311}]},"tmhm_learnset":"00403E36A5B33664","types":[0,0]},{"abilities":[35,68],"address":3307552,"base_stats":[65,73,55,85,47,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":386,"learnset":{"address":3317666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":109},{"level":9,"move_id":104},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":294},{"level":25,"move_id":324},{"level":29,"move_id":182},{"level":33,"move_id":270},{"level":37,"move_id":38}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[12,0],"address":3307580,"base_stats":[65,47,55,85,73,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":387,"learnset":{"address":3317694,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":230},{"level":9,"move_id":204},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":273},{"level":25,"move_id":227},{"level":29,"move_id":260},{"level":33,"move_id":270},{"level":37,"move_id":343}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[21,0],"address":3307608,"base_stats":[66,41,77,23,61,87],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":389}],"friendship":70,"id":388,"learnset":{"address":3317722,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":43,"move_id":246},{"level":50,"move_id":254},{"level":50,"move_id":255},{"level":50,"move_id":256}]},"tmhm_learnset":"00001E1884350720","types":[5,12]},{"abilities":[21,0],"address":3307636,"base_stats":[86,81,97,43,81,107],"catch_rate":45,"evolutions":[],"friendship":70,"id":389,"learnset":{"address":3317750,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":132},{"level":1,"move_id":51},{"level":1,"move_id":275},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":48,"move_id":246},{"level":60,"move_id":254},{"level":60,"move_id":255},{"level":60,"move_id":256}]},"tmhm_learnset":"00A01E5886354720","types":[5,12]},{"abilities":[4,0],"address":3307664,"base_stats":[45,95,50,75,40,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":391}],"friendship":70,"id":390,"learnset":{"address":3317778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":43,"move_id":210},{"level":49,"move_id":163},{"level":55,"move_id":350}]},"tmhm_learnset":"00841ED0CC110624","types":[5,6]},{"abilities":[4,0],"address":3307692,"base_stats":[75,125,100,45,70,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":391,"learnset":{"address":3317806,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":300},{"level":1,"move_id":55},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":46,"move_id":210},{"level":55,"move_id":163},{"level":64,"move_id":350}]},"tmhm_learnset":"00A41ED0CE514624","types":[5,6]},{"abilities":[28,36],"address":3307720,"base_stats":[28,25,25,40,45,35],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":20,"species":393}],"friendship":35,"id":392,"learnset":{"address":3317834,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":45},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":31,"move_id":286},{"level":36,"move_id":248},{"level":41,"move_id":95},{"level":46,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307748,"base_stats":[38,35,35,50,65,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":394}],"friendship":35,"id":393,"learnset":{"address":3317862,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":40,"move_id":248},{"level":47,"move_id":95},{"level":54,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307776,"base_stats":[68,65,65,80,125,115],"catch_rate":45,"evolutions":[],"friendship":35,"id":394,"learnset":{"address":3317890,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":42,"move_id":248},{"level":51,"move_id":95},{"level":60,"move_id":138}]},"tmhm_learnset":"0041BF03B49BCE28","types":[14,14]},{"abilities":[69,0],"address":3307804,"base_stats":[45,75,60,50,40,30],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":396}],"friendship":35,"id":395,"learnset":{"address":3317918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":33,"move_id":225},{"level":37,"move_id":184},{"level":41,"move_id":242},{"level":49,"move_id":337},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[69,0],"address":3307832,"base_stats":[65,95,100,50,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":50,"species":397}],"friendship":35,"id":396,"learnset":{"address":3317948,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":56,"move_id":242},{"level":69,"move_id":337},{"level":78,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[22,0],"address":3307860,"base_stats":[95,135,80,100,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":397,"learnset":{"address":3317980,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":50,"move_id":19},{"level":61,"move_id":242},{"level":79,"move_id":337},{"level":93,"move_id":38}]},"tmhm_learnset":"00AC5EE4C6534632","types":[16,2]},{"abilities":[29,0],"address":3307888,"base_stats":[40,55,80,30,35,60],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":20,"species":399}],"friendship":35,"id":398,"learnset":{"address":3318014,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36}]},"tmhm_learnset":"0000000000000000","types":[8,14]},{"abilities":[29,0],"address":3307916,"base_stats":[60,75,100,50,55,80],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":45,"species":400}],"friendship":35,"id":399,"learnset":{"address":3318024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":50,"move_id":309},{"level":56,"move_id":97},{"level":62,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307944,"base_stats":[80,135,130,70,95,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":400,"learnset":{"address":3318052,"moves":[{"level":1,"move_id":36},{"level":1,"move_id":93},{"level":1,"move_id":232},{"level":1,"move_id":184},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":55,"move_id":309},{"level":66,"move_id":97},{"level":77,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307972,"base_stats":[80,100,200,50,50,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":401,"learnset":{"address":3318080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":153},{"level":9,"move_id":88},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E52CF994621","types":[5,5]},{"abilities":[29,0],"address":3308000,"base_stats":[80,50,100,50,100,200],"catch_rate":3,"evolutions":[],"friendship":35,"id":402,"learnset":{"address":3318106,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":196},{"level":1,"move_id":153},{"level":9,"move_id":196},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E02C79B7261","types":[15,15]},{"abilities":[29,0],"address":3308028,"base_stats":[80,75,150,50,75,150],"catch_rate":3,"evolutions":[],"friendship":35,"id":403,"learnset":{"address":3318132,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":232},{"level":1,"move_id":153},{"level":9,"move_id":232},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00ED2C79B4621","types":[8,8]},{"abilities":[2,0],"address":3308056,"base_stats":[100,100,90,90,150,140],"catch_rate":5,"evolutions":[],"friendship":0,"id":404,"learnset":{"address":3318160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":352},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":34},{"level":30,"move_id":347},{"level":35,"move_id":58},{"level":45,"move_id":56},{"level":50,"move_id":156},{"level":60,"move_id":329},{"level":65,"move_id":38},{"level":75,"move_id":323}]},"tmhm_learnset":"03B00E42C79B727C","types":[11,11]},{"abilities":[70,0],"address":3308084,"base_stats":[100,150,140,90,100,90],"catch_rate":5,"evolutions":[],"friendship":0,"id":405,"learnset":{"address":3318190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":341},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":163},{"level":30,"move_id":339},{"level":35,"move_id":89},{"level":45,"move_id":126},{"level":50,"move_id":156},{"level":60,"move_id":90},{"level":65,"move_id":76},{"level":75,"move_id":284}]},"tmhm_learnset":"00A60EF6CFF946B2","types":[4,4]},{"abilities":[77,0],"address":3308112,"base_stats":[105,150,90,95,150,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":406,"learnset":{"address":3318220,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":239},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":337},{"level":30,"move_id":349},{"level":35,"move_id":242},{"level":45,"move_id":19},{"level":50,"move_id":156},{"level":60,"move_id":245},{"level":65,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BA0EB6C7F376B6","types":[16,2]},{"abilities":[26,0],"address":3308140,"base_stats":[80,80,90,110,110,130],"catch_rate":3,"evolutions":[],"friendship":90,"id":407,"learnset":{"address":3318250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":273},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":346},{"level":30,"move_id":287},{"level":35,"move_id":296},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":204}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[26,0],"address":3308168,"base_stats":[80,90,80,110,130,110],"catch_rate":3,"evolutions":[],"friendship":90,"id":408,"learnset":{"address":3318280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":262},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":182},{"level":30,"move_id":287},{"level":35,"move_id":295},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":349}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[32,0],"address":3308196,"base_stats":[100,100,100,100,100,100],"catch_rate":3,"evolutions":[],"friendship":100,"id":409,"learnset":{"address":3318310,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":273},{"level":1,"move_id":93},{"level":5,"move_id":156},{"level":10,"move_id":129},{"level":15,"move_id":270},{"level":20,"move_id":94},{"level":25,"move_id":287},{"level":30,"move_id":156},{"level":35,"move_id":38},{"level":40,"move_id":248},{"level":45,"move_id":322},{"level":50,"move_id":353}]},"tmhm_learnset":"00408E93B59BC62C","types":[8,14]},{"abilities":[46,0],"address":3308224,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":410,"learnset":{"address":3318340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":35},{"level":5,"move_id":101},{"level":10,"move_id":104},{"level":15,"move_id":282},{"level":20,"move_id":228},{"level":25,"move_id":94},{"level":30,"move_id":129},{"level":35,"move_id":97},{"level":40,"move_id":105},{"level":45,"move_id":354},{"level":50,"move_id":245}]},"tmhm_learnset":"00E58FC3F5BBDE2D","types":[14,14]},{"abilities":[26,0],"address":3308252,"base_stats":[65,50,70,65,95,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":411,"learnset":{"address":3318370,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":6,"move_id":45},{"level":9,"move_id":310},{"level":14,"move_id":93},{"level":17,"move_id":36},{"level":22,"move_id":253},{"level":25,"move_id":281},{"level":30,"move_id":149},{"level":33,"move_id":38},{"level":38,"move_id":215},{"level":41,"move_id":219},{"level":46,"move_id":94}]},"tmhm_learnset":"00419F03B41B8E28","types":[14,14]}],"tmhm_moves":[264,337,352,347,46,92,258,339,331,237,241,269,58,59,63,113,182,240,202,219,218,76,231,85,87,89,216,91,94,247,280,104,115,351,53,188,201,126,317,332,259,263,290,156,213,168,211,285,289,315,15,19,57,70,148,249,127,291],"trainers":[{"address":3230072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[],"party_address":4160749568,"script_address":0},{"address":3230112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":74}],"party_address":3211124,"script_address":2304511},{"address":3230152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":286}],"party_address":3211132,"script_address":2321901},{"address":3230192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":330}],"party_address":3211140,"script_address":2323326},{"address":3230232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211156,"script_address":2323373},{"address":3230272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211164,"script_address":2324386},{"address":3230312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":286}],"party_address":3211172,"script_address":2326808},{"address":3230352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211180,"script_address":2326839},{"address":3230392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":41}],"party_address":3211188,"script_address":2328040},{"address":3230432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":315},{"level":26,"species":286},{"level":26,"species":288},{"level":26,"species":295},{"level":26,"species":298},{"level":26,"species":304}],"party_address":3211196,"script_address":2314251},{"address":3230472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":286}],"party_address":3211244,"script_address":0},{"address":3230512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":300}],"party_address":3211252,"script_address":2067580},{"address":3230552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":310},{"level":30,"species":178}],"party_address":3211268,"script_address":2068523},{"address":3230592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":380},{"level":30,"species":379}],"party_address":3211284,"script_address":2068554},{"address":3230632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211300,"script_address":2328071},{"address":3230672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3211308,"script_address":2069620},{"address":3230712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":286}],"party_address":3211316,"script_address":0},{"address":3230752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3211324,"script_address":2570959},{"address":3230792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":286},{"level":27,"species":330}],"party_address":3211340,"script_address":2572093},{"address":3230832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":286},{"level":26,"species":41},{"level":26,"species":330}],"party_address":3211356,"script_address":2572124},{"address":3230872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":330}],"party_address":3211380,"script_address":2157889},{"address":3230912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":41},{"level":14,"species":330}],"party_address":3211388,"script_address":2157948},{"address":3230952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":339}],"party_address":3211404,"script_address":2254636},{"address":3230992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211412,"script_address":2317522},{"address":3231032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211420,"script_address":2317553},{"address":3231072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":286},{"level":30,"species":330}],"party_address":3211428,"script_address":2317584},{"address":3231112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330}],"party_address":3211444,"script_address":2570990},{"address":3231152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211452,"script_address":2323414},{"address":3231192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211460,"script_address":2324427},{"address":3231232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":335},{"level":30,"species":67}],"party_address":3211468,"script_address":2068492},{"address":3231272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":287},{"level":34,"species":42}],"party_address":3211484,"script_address":2324250},{"address":3231312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":336}],"party_address":3211500,"script_address":2312702},{"address":3231352,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330},{"level":28,"species":287}],"party_address":3211508,"script_address":2572155},{"address":3231392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":331},{"level":37,"species":287}],"party_address":3211524,"script_address":2327156},{"address":3231432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":287},{"level":41,"species":169},{"level":43,"species":331}],"party_address":3211540,"script_address":2328478},{"address":3231472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":351}],"party_address":3211564,"script_address":2312671},{"address":3231512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211572,"script_address":2026085},{"address":3231552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":363},{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211588,"script_address":2058784},{"address":3231592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,0,0,0],"species":357},{"level":43,"moves":[29,89,0,0],"species":319}],"party_address":3211612,"script_address":2335547},{"address":3231632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":363},{"level":26,"species":44}],"party_address":3211644,"script_address":2068148},{"address":3231672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":363}],"party_address":3211660,"script_address":0},{"address":3231712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":306},{"level":28,"species":44},{"level":28,"species":363}],"party_address":3211676,"script_address":0},{"address":3231752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":306},{"level":31,"species":44},{"level":31,"species":363}],"party_address":3211700,"script_address":0},{"address":3231792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307},{"level":34,"species":44},{"level":34,"species":363}],"party_address":3211724,"script_address":0},{"address":3231832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,163,28,40],"species":28}],"party_address":3211748,"script_address":2046490},{"address":3231872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[60,120,201,246],"species":318},{"level":27,"moves":[91,163,28,40],"species":27},{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211764,"script_address":2065682},{"address":3231912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[91,163,28,40],"species":27},{"level":25,"moves":[91,163,28,40],"species":28}],"party_address":3211812,"script_address":2033540},{"address":3231952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211844,"script_address":0},{"address":3231992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[91,163,28,40],"species":28}],"party_address":3211860,"script_address":0},{"address":3232032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[91,163,28,40],"species":28}],"party_address":3211876,"script_address":0},{"address":3232072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[91,163,28,40],"species":28}],"party_address":3211892,"script_address":0},{"address":3232112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":81},{"level":17,"species":370}],"party_address":3211908,"script_address":0},{"address":3232152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":81},{"level":27,"species":371}],"party_address":3211924,"script_address":0},{"address":3232192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":82},{"level":30,"species":371}],"party_address":3211940,"script_address":0},{"address":3232232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":82},{"level":33,"species":371}],"party_address":3211956,"script_address":0},{"address":3232272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82},{"level":36,"species":371}],"party_address":3211972,"script_address":0},{"address":3232312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[49,86,63,85],"species":82},{"level":39,"moves":[54,23,48,48],"species":372}],"party_address":3211988,"script_address":0},{"address":3232352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":350}],"party_address":3212020,"script_address":2036011},{"address":3232392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212036,"script_address":2036121},{"address":3232432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212044,"script_address":2036152},{"address":3232472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183},{"level":26,"species":183}],"party_address":3212052,"script_address":0},{"address":3232512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":183},{"level":29,"species":183}],"party_address":3212068,"script_address":0},{"address":3232552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":183},{"level":32,"species":183}],"party_address":3212084,"script_address":0},{"address":3232592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":35,"species":184}],"party_address":3212100,"script_address":0},{"address":3232632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":13,"moves":[28,29,39,57],"species":288}],"party_address":3212116,"script_address":2035901},{"address":3232672,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":183}],"party_address":3212132,"script_address":2544001},{"address":3232712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212148,"script_address":2339831},{"address":3232752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[28,42,39,57],"species":289}],"party_address":3212156,"script_address":0},{"address":3232792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[28,42,39,57],"species":289}],"party_address":3212172,"script_address":0},{"address":3232832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[28,42,39,57],"species":289}],"party_address":3212188,"script_address":0},{"address":3232872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[28,42,39,57],"species":289}],"party_address":3212204,"script_address":0},{"address":3232912,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[98,97,17,0],"species":305}],"party_address":3212220,"script_address":2131164},{"address":3232952,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[42,146,8,0],"species":308}],"party_address":3212236,"script_address":2131228},{"address":3232992,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[47,68,247,0],"species":364}],"party_address":3212252,"script_address":2131292},{"address":3233032,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[116,163,0,0],"species":365}],"party_address":3212268,"script_address":2131356},{"address":3233072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[116,98,17,27],"species":305},{"level":28,"moves":[44,91,185,72],"species":332},{"level":28,"moves":[205,250,54,96],"species":313},{"level":28,"moves":[85,48,86,49],"species":82},{"level":28,"moves":[202,185,104,207],"species":300}],"party_address":3212284,"script_address":2068117},{"address":3233112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":322},{"level":44,"species":357},{"level":44,"species":331}],"party_address":3212364,"script_address":2565920},{"address":3233152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":355},{"level":46,"species":121}],"party_address":3212388,"script_address":2565982},{"address":3233192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":337},{"level":17,"species":313},{"level":17,"species":335}],"party_address":3212404,"script_address":2046693},{"address":3233232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":345},{"level":43,"species":310}],"party_address":3212428,"script_address":2332685},{"address":3233272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":82},{"level":43,"species":89}],"party_address":3212444,"script_address":2332716},{"address":3233312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":305},{"level":42,"species":355},{"level":42,"species":64}],"party_address":3212460,"script_address":2334375},{"address":3233352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":85},{"level":42,"species":64},{"level":42,"species":101},{"level":42,"species":300}],"party_address":3212484,"script_address":2335423},{"address":3233392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":317},{"level":42,"species":75},{"level":42,"species":314}],"party_address":3212516,"script_address":2335454},{"address":3233432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":337},{"level":26,"species":313},{"level":26,"species":335}],"party_address":3212540,"script_address":0},{"address":3233472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":313},{"level":29,"species":335}],"party_address":3212564,"script_address":0},{"address":3233512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":338},{"level":32,"species":313},{"level":32,"species":335}],"party_address":3212588,"script_address":0},{"address":3233552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":338},{"level":35,"species":313},{"level":35,"species":336}],"party_address":3212612,"script_address":0},{"address":3233592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":297}],"party_address":3212636,"script_address":2073950},{"address":3233632,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[185,95,0,0],"species":316}],"party_address":3212652,"script_address":2131420},{"address":3233672,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[111,38,247,0],"species":40}],"party_address":3212668,"script_address":2131484},{"address":3233712,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[14,163,0,0],"species":380}],"party_address":3212684,"script_address":2131548},{"address":3233752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[226,185,57,44],"species":355},{"level":29,"moves":[72,89,64,73],"species":363},{"level":29,"moves":[19,55,54,182],"species":310}],"party_address":3212700,"script_address":2068086},{"address":3233792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":383},{"level":45,"species":338}],"party_address":3212748,"script_address":2565951},{"address":3233832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":309},{"level":17,"species":339},{"level":17,"species":363}],"party_address":3212764,"script_address":2046803},{"address":3233872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":322}],"party_address":3212788,"script_address":2065651},{"address":3233912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3212796,"script_address":2332747},{"address":3233952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":319}],"party_address":3212804,"script_address":2334406},{"address":3233992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":321},{"level":42,"species":357},{"level":42,"species":297}],"party_address":3212812,"script_address":2334437},{"address":3234032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":227},{"level":43,"species":322}],"party_address":3212836,"script_address":2335485},{"address":3234072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":28},{"level":42,"species":38},{"level":42,"species":369}],"party_address":3212852,"script_address":2335516},{"address":3234112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":26,"species":339},{"level":26,"species":363}],"party_address":3212876,"script_address":0},{"address":3234152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":339},{"level":29,"species":363}],"party_address":3212900,"script_address":0},{"address":3234192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":339},{"level":32,"species":363}],"party_address":3212924,"script_address":0},{"address":3234232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":340},{"level":34,"species":363}],"party_address":3212948,"script_address":0},{"address":3234272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":348}],"party_address":3212972,"script_address":2564729},{"address":3234312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":361},{"level":30,"species":377}],"party_address":3212988,"script_address":2068461},{"address":3234352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":361},{"level":29,"species":377}],"party_address":3213004,"script_address":2067284},{"address":3234392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":322}],"party_address":3213020,"script_address":2315745},{"address":3234432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":377}],"party_address":3213028,"script_address":2315532},{"address":3234472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":322},{"level":31,"species":351}],"party_address":3213036,"script_address":0},{"address":3234512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":351},{"level":35,"species":322}],"party_address":3213052,"script_address":0},{"address":3234552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":351},{"level":40,"species":322}],"party_address":3213068,"script_address":0},{"address":3234592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":361},{"level":42,"species":322},{"level":42,"species":352}],"party_address":3213084,"script_address":0},{"address":3234632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213108,"script_address":2030087},{"address":3234672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[213,186,175,96],"species":325},{"level":39,"moves":[213,219,36,96],"species":325}],"party_address":3213116,"script_address":2265894},{"address":3234712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":287},{"level":28,"species":287},{"level":30,"species":339}],"party_address":3213148,"script_address":2254717},{"address":3234752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":11,"moves":[33,39,0,0],"species":288}],"party_address":3213172,"script_address":0},{"address":3234792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":40,"species":119}],"party_address":3213188,"script_address":2265677},{"address":3234832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3213196,"script_address":2361019},{"address":3234872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213204,"script_address":0},{"address":3234912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213212,"script_address":0},{"address":3234952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213220,"script_address":0},{"address":3234992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213228,"script_address":0},{"address":3235032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":183}],"party_address":3213244,"script_address":2304387},{"address":3235072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3213252,"script_address":2304418},{"address":3235112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":339}],"party_address":3213260,"script_address":2304449},{"address":3235152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[20,122,154,185],"species":317},{"level":29,"moves":[86,103,137,242],"species":379}],"party_address":3213268,"script_address":2067377},{"address":3235192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":118}],"party_address":3213300,"script_address":2265708},{"address":3235232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":184}],"party_address":3213308,"script_address":2265739},{"address":3235272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[78,250,240,96],"species":373},{"level":37,"moves":[13,152,96,0],"species":326},{"level":39,"moves":[253,154,252,96],"species":296}],"party_address":3213316,"script_address":2265770},{"address":3235312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":330},{"level":39,"species":331}],"party_address":3213364,"script_address":2265801},{"address":3235352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[20,122,154,185],"species":317},{"level":35,"moves":[86,103,137,242],"species":379}],"party_address":3213380,"script_address":0},{"address":3235392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[20,122,154,185],"species":317},{"level":38,"moves":[86,103,137,242],"species":379}],"party_address":3213412,"script_address":0},{"address":3235432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[20,122,154,185],"species":317},{"level":41,"moves":[86,103,137,242],"species":379}],"party_address":3213444,"script_address":0},{"address":3235472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[20,122,154,185],"species":317},{"level":44,"moves":[86,103,137,242],"species":379}],"party_address":3213476,"script_address":0},{"address":3235512,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213508,"script_address":2029901},{"address":3235552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":324},{"level":33,"species":356}],"party_address":3213516,"script_address":2074012},{"address":3235592,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":184}],"party_address":3213532,"script_address":2360988},{"address":3235632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213540,"script_address":0},{"address":3235672,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213548,"script_address":0},{"address":3235712,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213556,"script_address":0},{"address":3235752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213564,"script_address":0},{"address":3235792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3213580,"script_address":2051965},{"address":3235832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":116}],"party_address":3213588,"script_address":2340108},{"address":3235872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":111}],"party_address":3213604,"script_address":2312578},{"address":3235912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":339}],"party_address":3213612,"script_address":2304480},{"address":3235952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":383}],"party_address":3213620,"script_address":0},{"address":3235992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":383},{"level":29,"species":111}],"party_address":3213628,"script_address":0},{"address":3236032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":383},{"level":32,"species":111}],"party_address":3213644,"script_address":0},{"address":3236072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":384},{"level":35,"species":112}],"party_address":3213660,"script_address":0},{"address":3236112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213676,"script_address":2033571},{"address":3236152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":72}],"party_address":3213684,"script_address":2033602},{"address":3236192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":72}],"party_address":3213692,"script_address":2034185},{"address":3236232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":309},{"level":24,"species":72}],"party_address":3213708,"script_address":2034479},{"address":3236272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213732,"script_address":2034510},{"address":3236312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":73}],"party_address":3213740,"script_address":2034776},{"address":3236352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213748,"script_address":2034807},{"address":3236392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3213756,"script_address":2035777},{"address":3236432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309}],"party_address":3213772,"script_address":2069178},{"address":3236472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3213788,"script_address":2069209},{"address":3236512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":73}],"party_address":3213796,"script_address":2069789},{"address":3236552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":116}],"party_address":3213804,"script_address":2069820},{"address":3236592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213812,"script_address":2070163},{"address":3236632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":31,"species":309},{"level":31,"species":330}],"party_address":3213820,"script_address":2070194},{"address":3236672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213844,"script_address":2073229},{"address":3236712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310}],"party_address":3213852,"script_address":2073359},{"address":3236752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213860,"script_address":2073390},{"address":3236792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":73},{"level":33,"species":313}],"party_address":3213876,"script_address":2073291},{"address":3236832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3213892,"script_address":2073608},{"address":3236872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":342}],"party_address":3213900,"script_address":2073857},{"address":3236912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":341}],"party_address":3213908,"script_address":2073576},{"address":3236952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213916,"script_address":2074089},{"address":3236992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213924,"script_address":0},{"address":3237032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":313}],"party_address":3213948,"script_address":2069381},{"address":3237072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":331}],"party_address":3213964,"script_address":0},{"address":3237112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":331}],"party_address":3213972,"script_address":0},{"address":3237152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120},{"level":36,"species":331}],"party_address":3213980,"script_address":0},{"address":3237192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":121},{"level":39,"species":331}],"party_address":3213996,"script_address":0},{"address":3237232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3214012,"script_address":2095275},{"address":3237272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":66},{"level":32,"species":67}],"party_address":3214020,"script_address":2074213},{"address":3237312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":336}],"party_address":3214036,"script_address":2073701},{"address":3237352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":66},{"level":28,"species":67}],"party_address":3214044,"script_address":2052921},{"address":3237392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214060,"script_address":2052952},{"address":3237432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":67}],"party_address":3214068,"script_address":0},{"address":3237472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":66},{"level":29,"species":67}],"party_address":3214076,"script_address":0},{"address":3237512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":66},{"level":31,"species":67},{"level":31,"species":67}],"party_address":3214092,"script_address":0},{"address":3237552,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":66},{"level":33,"species":67},{"level":33,"species":67},{"level":33,"species":68}],"party_address":3214116,"script_address":0},{"address":3237592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":335},{"level":26,"species":67}],"party_address":3214148,"script_address":2557758},{"address":3237632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214164,"script_address":2046662},{"address":3237672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":336}],"party_address":3214172,"script_address":2315359},{"address":3237712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[98,86,209,43],"species":337},{"level":17,"moves":[12,95,103,0],"species":100}],"party_address":3214180,"script_address":2167608},{"address":3237752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":286},{"level":31,"species":41}],"party_address":3214212,"script_address":2323445},{"address":3237792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3214228,"script_address":2324458},{"address":3237832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":100},{"level":17,"species":81}],"party_address":3214236,"script_address":2167639},{"address":3237872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":337},{"level":30,"species":371}],"party_address":3214252,"script_address":2068709},{"address":3237912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81},{"level":15,"species":370}],"party_address":3214268,"script_address":2058956},{"address":3237952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":81},{"level":25,"species":370},{"level":25,"species":81}],"party_address":3214284,"script_address":0},{"address":3237992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81},{"level":28,"species":371},{"level":28,"species":81}],"party_address":3214308,"script_address":0},{"address":3238032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":82},{"level":31,"species":371},{"level":31,"species":82}],"party_address":3214332,"script_address":0},{"address":3238072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82},{"level":34,"species":372},{"level":34,"species":82}],"party_address":3214356,"script_address":0},{"address":3238112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214380,"script_address":2103394},{"address":3238152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":218},{"level":22,"species":218}],"party_address":3214388,"script_address":2103601},{"address":3238192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214404,"script_address":2103446},{"address":3238232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214412,"script_address":2103570},{"address":3238272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214420,"script_address":2103477},{"address":3238312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309}],"party_address":3214428,"script_address":2052075},{"address":3238352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":218},{"level":26,"species":309}],"party_address":3214444,"script_address":0},{"address":3238392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310}],"party_address":3214460,"script_address":0},{"address":3238432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":218},{"level":32,"species":310}],"party_address":3214476,"script_address":0},{"address":3238472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":219},{"level":35,"species":310}],"party_address":3214492,"script_address":0},{"address":3238512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,28,40,163],"species":27}],"party_address":3214508,"script_address":2046366},{"address":3238552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":21,"moves":[229,189,60,61],"species":318},{"level":21,"moves":[40,28,10,91],"species":27},{"level":21,"moves":[229,189,60,61],"species":318}],"party_address":3214524,"script_address":2046428},{"address":3238592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":299}],"party_address":3214572,"script_address":2049829},{"address":3238632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27},{"level":18,"species":299}],"party_address":3214580,"script_address":2051903},{"address":3238672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":317}],"party_address":3214596,"script_address":2557005},{"address":3238712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":288},{"level":20,"species":304}],"party_address":3214604,"script_address":2310199},{"address":3238752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3214620,"script_address":2310337},{"address":3238792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27}],"party_address":3214628,"script_address":2046600},{"address":3238832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":288},{"level":26,"species":304}],"party_address":3214636,"script_address":0},{"address":3238872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":289},{"level":29,"species":305}],"party_address":3214652,"script_address":0},{"address":3238912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":305},{"level":31,"species":289}],"party_address":3214668,"script_address":0},{"address":3238952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":28},{"level":34,"species":289}],"party_address":3214692,"script_address":0},{"address":3238992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":311}],"party_address":3214716,"script_address":2061044},{"address":3239032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":290},{"level":24,"species":291},{"level":24,"species":292}],"party_address":3214724,"script_address":2061075},{"address":3239072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":290},{"level":27,"species":293},{"level":27,"species":294}],"party_address":3214748,"script_address":2061106},{"address":3239112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":311},{"level":27,"species":311},{"level":27,"species":311}],"party_address":3214772,"script_address":2065541},{"address":3239152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":294},{"level":16,"species":292}],"party_address":3214796,"script_address":2057595},{"address":3239192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":311},{"level":31,"species":311}],"party_address":3214812,"script_address":0},{"address":3239232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":311},{"level":34,"species":311},{"level":34,"species":312}],"party_address":3214836,"script_address":0},{"address":3239272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":311},{"level":36,"species":290},{"level":36,"species":311},{"level":36,"species":312}],"party_address":3214860,"script_address":0},{"address":3239312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":311},{"level":38,"species":294},{"level":38,"species":311},{"level":38,"species":312},{"level":38,"species":292}],"party_address":3214892,"script_address":0},{"address":3239352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[237,0,0,0],"species":63}],"party_address":3214932,"script_address":2038374},{"address":3239392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3214948,"script_address":2244488},{"address":3239432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":392}],"party_address":3214956,"script_address":2244519},{"address":3239472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3214964,"script_address":2244550},{"address":3239512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":392},{"level":26,"species":393}],"party_address":3214972,"script_address":2314189},{"address":3239552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3214996,"script_address":2564698},{"address":3239592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":349}],"party_address":3215012,"script_address":2068179},{"address":3239632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":64},{"level":33,"species":349}],"party_address":3215020,"script_address":0},{"address":3239672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":64},{"level":38,"species":349}],"party_address":3215036,"script_address":0},{"address":3239712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3215052,"script_address":0},{"address":3239752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":349},{"level":45,"species":65}],"party_address":3215068,"script_address":0},{"address":3239792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[237,0,0,0],"species":63}],"party_address":3215084,"script_address":2038405},{"address":3239832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3215100,"script_address":2244581},{"address":3239872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":178}],"party_address":3215108,"script_address":2244612},{"address":3239912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3215116,"script_address":2244643},{"address":3239952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":202},{"level":26,"species":177},{"level":26,"species":64}],"party_address":3215124,"script_address":2314220},{"address":3239992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":393},{"level":41,"species":178}],"party_address":3215148,"script_address":2564760},{"address":3240032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":64},{"level":30,"species":348}],"party_address":3215164,"script_address":2068289},{"address":3240072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":64},{"level":34,"species":348}],"party_address":3215180,"script_address":0},{"address":3240112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":64},{"level":37,"species":348}],"party_address":3215196,"script_address":0},{"address":3240152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":64},{"level":40,"species":348}],"party_address":3215212,"script_address":0},{"address":3240192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":348},{"level":43,"species":65}],"party_address":3215228,"script_address":0},{"address":3240232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338}],"party_address":3215244,"script_address":2067174},{"address":3240272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":338},{"level":44,"species":338}],"party_address":3215252,"script_address":2360864},{"address":3240312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":380}],"party_address":3215268,"script_address":2360895},{"address":3240352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":338}],"party_address":3215276,"script_address":0},{"address":3240392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[29,28,60,154],"species":289},{"level":36,"moves":[98,209,60,46],"species":338}],"party_address":3215284,"script_address":0},{"address":3240432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[29,28,60,154],"species":289},{"level":39,"moves":[98,209,60,0],"species":338}],"party_address":3215316,"script_address":0},{"address":3240472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[29,28,60,154],"species":289},{"level":41,"moves":[154,50,93,244],"species":55},{"level":41,"moves":[98,209,60,46],"species":338}],"party_address":3215348,"script_address":0},{"address":3240512,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,38,28,242],"species":287},{"level":48,"moves":[3,104,207,70],"species":300},{"level":46,"moves":[73,185,46,178],"species":345},{"level":48,"moves":[57,14,70,7],"species":327},{"level":49,"moves":[76,157,14,163],"species":376}],"party_address":3215396,"script_address":2274753},{"address":3240552,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[69,109,174,182],"species":362},{"level":49,"moves":[247,32,5,185],"species":378},{"level":50,"moves":[247,104,101,185],"species":322},{"level":49,"moves":[247,94,85,7],"species":378},{"level":51,"moves":[247,58,157,89],"species":362}],"party_address":3215476,"script_address":2275380},{"address":3240592,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[227,34,2,45],"species":342},{"level":50,"moves":[113,242,196,58],"species":347},{"level":52,"moves":[213,38,2,59],"species":342},{"level":52,"moves":[247,153,2,58],"species":347},{"level":53,"moves":[57,34,58,73],"species":343}],"party_address":3215556,"script_address":2276062},{"address":3240632,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[61,81,182,38],"species":396},{"level":54,"moves":[38,225,93,76],"species":359},{"level":53,"moves":[108,93,57,34],"species":230},{"level":53,"moves":[53,242,225,89],"species":334},{"level":55,"moves":[53,81,157,242],"species":397}],"party_address":3215636,"script_address":2276724},{"address":3240672,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":12,"moves":[33,111,88,61],"species":74},{"level":12,"moves":[33,111,88,61],"species":74},{"level":15,"moves":[79,106,33,61],"species":320}],"party_address":3215716,"script_address":2187976},{"address":3240712,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[2,67,69,83],"species":66},{"level":16,"moves":[8,113,115,83],"species":356},{"level":19,"moves":[36,233,179,83],"species":335}],"party_address":3215764,"script_address":2095066},{"address":3240752,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":20,"moves":[205,209,120,95],"species":100},{"level":20,"moves":[95,43,98,80],"species":337},{"level":22,"moves":[48,95,86,49],"species":82},{"level":24,"moves":[98,86,95,80],"species":338}],"party_address":3215812,"script_address":2167181},{"address":3240792,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[59,36,222,241],"species":339},{"level":24,"moves":[59,123,113,241],"species":218},{"level":26,"moves":[59,33,241,213],"species":340},{"level":29,"moves":[59,241,34,213],"species":321}],"party_address":3215876,"script_address":2103186},{"address":3240832,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[42,60,7,227],"species":308},{"level":27,"moves":[163,7,227,185],"species":365},{"level":29,"moves":[163,187,7,29],"species":289},{"level":31,"moves":[68,25,7,185],"species":366}],"party_address":3215940,"script_address":2129756},{"address":3240872,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[195,119,219,76],"species":358},{"level":29,"moves":[241,76,76,235],"species":369},{"level":30,"moves":[55,48,182,76],"species":310},{"level":31,"moves":[28,31,211,76],"species":227},{"level":33,"moves":[89,225,93,76],"species":359}],"party_address":3216004,"script_address":2202062},{"address":3240912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[89,246,94,113],"species":319},{"level":41,"moves":[94,241,109,91],"species":178},{"level":42,"moves":[113,94,95,91],"species":348},{"level":42,"moves":[241,76,94,53],"species":349}],"party_address":3216084,"script_address":0},{"address":3240952,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[96,213,186,175],"species":325},{"level":41,"moves":[240,96,133,89],"species":324},{"level":43,"moves":[227,34,62,96],"species":342},{"level":43,"moves":[96,152,13,43],"species":327},{"level":46,"moves":[96,104,58,156],"species":230}],"party_address":3216148,"script_address":2262245},{"address":3240992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":392}],"party_address":3216228,"script_address":2054242},{"address":3241032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3216236,"script_address":2554598},{"address":3241072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":339},{"level":15,"species":43},{"level":15,"species":309}],"party_address":3216244,"script_address":2554629},{"address":3241112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":356}],"party_address":3216268,"script_address":0},{"address":3241152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":393},{"level":29,"species":356}],"party_address":3216284,"script_address":0},{"address":3241192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":393},{"level":32,"species":357}],"party_address":3216300,"script_address":0},{"address":3241232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":393},{"level":34,"species":378},{"level":34,"species":357}],"party_address":3216316,"script_address":0},{"address":3241272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":306}],"party_address":3216340,"script_address":2054490},{"address":3241312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":306},{"level":16,"species":292}],"party_address":3216348,"script_address":2554660},{"address":3241352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":370}],"party_address":3216364,"script_address":0},{"address":3241392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":306},{"level":29,"species":371}],"party_address":3216380,"script_address":0},{"address":3241432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":307},{"level":32,"species":371}],"party_address":3216396,"script_address":0},{"address":3241472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":307},{"level":35,"species":372}],"party_address":3216412,"script_address":0},{"address":3241512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[95,60,146,42],"species":308},{"level":32,"moves":[8,25,47,185],"species":366}],"party_address":3216428,"script_address":0},{"address":3241552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[45,39,29,60],"species":288},{"level":17,"moves":[33,116,36,0],"species":335}],"party_address":3216460,"script_address":0},{"address":3241592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[45,39,29,60],"species":288},{"level":30,"moves":[33,116,36,0],"species":335}],"party_address":3216492,"script_address":0},{"address":3241632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[45,39,29,60],"species":288},{"level":33,"moves":[33,116,36,0],"species":335}],"party_address":3216524,"script_address":0},{"address":3241672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[45,39,29,60],"species":289},{"level":36,"moves":[33,116,36,0],"species":335}],"party_address":3216556,"script_address":0},{"address":3241712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[45,39,29,60],"species":289},{"level":38,"moves":[33,116,36,0],"species":336}],"party_address":3216588,"script_address":0},{"address":3241752,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":16,"species":304},{"level":16,"species":288}],"party_address":3216620,"script_address":2045785},{"address":3241792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":15,"species":315}],"party_address":3216636,"script_address":2026353},{"address":3241832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[18,204,185,215],"species":315},{"level":36,"moves":[18,204,185,215],"species":315},{"level":40,"moves":[18,204,185,215],"species":315},{"level":12,"moves":[18,204,185,215],"species":315},{"level":30,"moves":[18,204,185,215],"species":315},{"level":42,"moves":[18,204,185,215],"species":316}],"party_address":3216644,"script_address":2360833},{"address":3241872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":315}],"party_address":3216740,"script_address":0},{"address":3241912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":315}],"party_address":3216748,"script_address":0},{"address":3241952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316}],"party_address":3216756,"script_address":0},{"address":3241992,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":316}],"party_address":3216764,"script_address":0},{"address":3242032,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":17,"species":363}],"party_address":3216772,"script_address":2045890},{"address":3242072,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":25}],"party_address":3216780,"script_address":2067143},{"address":3242112,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":350},{"level":37,"species":183},{"level":39,"species":184}],"party_address":3216788,"script_address":2265832},{"address":3242152,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":353},{"level":14,"species":354}],"party_address":3216812,"script_address":2038890},{"address":3242192,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":26,"species":353},{"level":26,"species":354}],"party_address":3216828,"script_address":0},{"address":3242232,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":353},{"level":29,"species":354}],"party_address":3216844,"script_address":0},{"address":3242272,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":353},{"level":32,"species":354}],"party_address":3216860,"script_address":0},{"address":3242312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":353},{"level":35,"species":354}],"party_address":3216876,"script_address":0},{"address":3242352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":336}],"party_address":3216892,"script_address":2052811},{"address":3242392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[36,26,28,91],"species":336}],"party_address":3216900,"script_address":0},{"address":3242432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[36,26,28,91],"species":336}],"party_address":3216916,"script_address":0},{"address":3242472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[36,187,28,91],"species":336}],"party_address":3216932,"script_address":0},{"address":3242512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[36,187,28,91],"species":336}],"party_address":3216948,"script_address":0},{"address":3242552,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[136,96,93,197],"species":356}],"party_address":3216964,"script_address":2046100},{"address":3242592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":356},{"level":21,"species":335}],"party_address":3216980,"script_address":2304277},{"address":3242632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":356},{"level":30,"species":335}],"party_address":3216996,"script_address":0},{"address":3242672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":357},{"level":33,"species":336}],"party_address":3217012,"script_address":0},{"address":3242712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":357},{"level":36,"species":336}],"party_address":3217028,"script_address":0},{"address":3242752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":357},{"level":39,"species":336}],"party_address":3217044,"script_address":0},{"address":3242792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":286}],"party_address":3217060,"script_address":2024678},{"address":3242832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":288},{"level":7,"species":298}],"party_address":3217068,"script_address":2029684},{"address":3242872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[33,0,0,0],"species":74}],"party_address":3217084,"script_address":2188154},{"address":3242912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3217100,"script_address":2188185},{"address":3242952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":66}],"party_address":3217116,"script_address":2054180},{"address":3242992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[29,28,45,85],"species":288},{"level":17,"moves":[133,124,25,1],"species":367}],"party_address":3217124,"script_address":2167670},{"address":3243032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[213,58,85,53],"species":366},{"level":43,"moves":[29,182,5,92],"species":362}],"party_address":3217156,"script_address":2332778},{"address":3243072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,94,85,91],"species":394},{"level":43,"moves":[89,247,76,24],"species":366}],"party_address":3217188,"script_address":2332809},{"address":3243112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":332}],"party_address":3217220,"script_address":2050594},{"address":3243152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3217228,"script_address":2050625},{"address":3243192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":287}],"party_address":3217236,"script_address":0},{"address":3243232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":305},{"level":30,"species":287}],"party_address":3217244,"script_address":0},{"address":3243272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":305},{"level":29,"species":289},{"level":33,"species":287}],"party_address":3217260,"script_address":0},{"address":3243312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":32,"species":289},{"level":36,"species":287}],"party_address":3217284,"script_address":0},{"address":3243352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":16,"species":288}],"party_address":3217308,"script_address":2553792},{"address":3243392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":3,"species":304}],"party_address":3217324,"script_address":2024926},{"address":3243432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":382},{"level":13,"species":337}],"party_address":3217340,"script_address":2039000},{"address":3243472,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[240,67,38,59],"species":314},{"level":55,"moves":[92,56,188,58],"species":73},{"level":56,"moves":[202,57,73,104],"species":297},{"level":56,"moves":[89,57,133,63],"species":324},{"level":56,"moves":[93,89,63,57],"species":130},{"level":58,"moves":[105,57,58,92],"species":329}],"party_address":3217356,"script_address":2277575},{"address":3243512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":10,"species":72},{"level":15,"species":129}],"party_address":3217452,"script_address":2026322},{"address":3243552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":6,"species":129},{"level":7,"species":129}],"party_address":3217476,"script_address":2029653},{"address":3243592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":129},{"level":17,"species":118},{"level":18,"species":323}],"party_address":3217500,"script_address":2052185},{"address":3243632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":10,"species":129},{"level":7,"species":72},{"level":10,"species":129}],"party_address":3217524,"script_address":2034247},{"address":3243672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72}],"party_address":3217548,"script_address":2034357},{"address":3243712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72},{"level":14,"species":313},{"level":11,"species":72},{"level":14,"species":313}],"party_address":3217556,"script_address":2038546},{"address":3243752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3217588,"script_address":2052216},{"address":3243792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3217596,"script_address":2058894},{"address":3243832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":72}],"party_address":3217612,"script_address":2058925},{"address":3243872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":73}],"party_address":3217620,"script_address":2036183},{"address":3243912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":27,"species":130},{"level":27,"species":130}],"party_address":3217636,"script_address":0},{"address":3243952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":130},{"level":26,"species":330},{"level":26,"species":72},{"level":29,"species":130}],"party_address":3217660,"script_address":0},{"address":3243992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":130},{"level":30,"species":330},{"level":30,"species":73},{"level":31,"species":130}],"party_address":3217692,"script_address":0},{"address":3244032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":130},{"level":33,"species":331},{"level":33,"species":130},{"level":35,"species":73}],"party_address":3217724,"script_address":0},{"address":3244072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":129},{"level":21,"species":130},{"level":23,"species":130},{"level":26,"species":130},{"level":30,"species":130},{"level":35,"species":130}],"party_address":3217756,"script_address":2073670},{"address":3244112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":100},{"level":6,"species":100},{"level":14,"species":81}],"party_address":3217804,"script_address":2038577},{"address":3244152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81}],"party_address":3217828,"script_address":2038608},{"address":3244192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217844,"script_address":2038639},{"address":3244232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":81}],"party_address":3217852,"script_address":0},{"address":3244272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":81}],"party_address":3217860,"script_address":0},{"address":3244312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82}],"party_address":3217868,"script_address":0},{"address":3244352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":82}],"party_address":3217876,"script_address":0},{"address":3244392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217884,"script_address":2038780},{"address":3244432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81},{"level":6,"species":100}],"party_address":3217892,"script_address":2038749},{"address":3244472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81}],"party_address":3217916,"script_address":0},{"address":3244512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":81}],"party_address":3217924,"script_address":0},{"address":3244552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82}],"party_address":3217932,"script_address":0},{"address":3244592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":82}],"party_address":3217940,"script_address":0},{"address":3244632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217948,"script_address":2057375},{"address":3244672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217956,"script_address":0},{"address":3244712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3217964,"script_address":0},{"address":3244752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3217972,"script_address":0},{"address":3244792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3217980,"script_address":0},{"address":3244832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217988,"script_address":2057485},{"address":3244872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217996,"script_address":0},{"address":3244912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3218004,"script_address":0},{"address":3244952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3218012,"script_address":0},{"address":3244992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3218020,"script_address":0},{"address":3245032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218028,"script_address":2070582},{"address":3245072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":288},{"level":25,"species":337}],"party_address":3218044,"script_address":2340077},{"address":3245112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218060,"script_address":2071332},{"address":3245152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218068,"script_address":2070380},{"address":3245192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218084,"script_address":2072978},{"address":3245232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218100,"script_address":0},{"address":3245272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218108,"script_address":0},{"address":3245312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218116,"script_address":0},{"address":3245352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218124,"script_address":0},{"address":3245392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218132,"script_address":2070318},{"address":3245432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218140,"script_address":2070613},{"address":3245472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218156,"script_address":2073545},{"address":3245512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218164,"script_address":2071442},{"address":3245552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":309},{"level":33,"species":120}],"party_address":3218172,"script_address":2073009},{"address":3245592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218188,"script_address":0},{"address":3245632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218196,"script_address":0},{"address":3245672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218204,"script_address":0},{"address":3245712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218212,"script_address":0},{"address":3245752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":359},{"level":37,"species":359}],"party_address":3218220,"script_address":2292701},{"address":3245792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":359}],"party_address":3218236,"script_address":0},{"address":3245832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":359},{"level":44,"species":359}],"party_address":3218252,"script_address":0},{"address":3245872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":395},{"level":46,"species":359},{"level":46,"species":359}],"party_address":3218268,"script_address":0},{"address":3245912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":49,"species":359},{"level":49,"species":359},{"level":49,"species":396}],"party_address":3218292,"script_address":0},{"address":3245952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[225,29,116,52],"species":395}],"party_address":3218316,"script_address":2074182},{"address":3245992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309}],"party_address":3218332,"script_address":2059066},{"address":3246032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":369}],"party_address":3218340,"script_address":2061450},{"address":3246072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":305}],"party_address":3218356,"script_address":2061481},{"address":3246112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":84},{"level":27,"species":227},{"level":27,"species":369}],"party_address":3218364,"script_address":2202267},{"address":3246152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":227}],"party_address":3218388,"script_address":2202391},{"address":3246192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":369},{"level":33,"species":178}],"party_address":3218396,"script_address":2070085},{"address":3246232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":84},{"level":29,"species":310}],"party_address":3218412,"script_address":2202298},{"address":3246272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":309},{"level":28,"species":177}],"party_address":3218428,"script_address":2065338},{"address":3246312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":358}],"party_address":3218444,"script_address":2065369},{"address":3246352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":305},{"level":36,"species":310},{"level":36,"species":178}],"party_address":3218452,"script_address":2563257},{"address":3246392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":305}],"party_address":3218476,"script_address":2059097},{"address":3246432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":177},{"level":32,"species":358}],"party_address":3218492,"script_address":0},{"address":3246472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":177},{"level":35,"species":359}],"party_address":3218508,"script_address":0},{"address":3246512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":177},{"level":38,"species":359}],"party_address":3218524,"script_address":0},{"address":3246552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":178}],"party_address":3218540,"script_address":0},{"address":3246592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":177},{"level":33,"species":305}],"party_address":3218556,"script_address":2074151},{"address":3246632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":369}],"party_address":3218572,"script_address":2073981},{"address":3246672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302}],"party_address":3218580,"script_address":2061512},{"address":3246712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302},{"level":25,"species":109}],"party_address":3218588,"script_address":2061543},{"address":3246752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,89,0,0],"species":319},{"level":43,"moves":[85,89,0,0],"species":171}],"party_address":3218604,"script_address":2335578},{"address":3246792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3218636,"script_address":2341860},{"address":3246832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,124,120],"species":109}],"party_address":3218644,"script_address":2050766},{"address":3246872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":109},{"level":18,"species":302}],"party_address":3218692,"script_address":2050876},{"address":3246912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[139,33,124,120],"species":109},{"level":24,"moves":[139,33,124,0],"species":109},{"level":24,"moves":[139,33,124,120],"species":109},{"level":26,"moves":[33,124,0,0],"species":109}],"party_address":3218708,"script_address":0},{"address":3246952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,0],"species":109},{"level":29,"moves":[33,124,0,0],"species":109}],"party_address":3218772,"script_address":0},{"address":3246992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":32,"moves":[33,124,0,0],"species":109}],"party_address":3218836,"script_address":0},{"address":3247032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[139,33,124,0],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":35,"moves":[33,124,0,0],"species":110}],"party_address":3218900,"script_address":0},{"address":3247072,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218964,"script_address":2095313},{"address":3247112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218972,"script_address":2095351},{"address":3247152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":335}],"party_address":3218980,"script_address":2053062},{"address":3247192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":356}],"party_address":3218996,"script_address":2557727},{"address":3247232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3219004,"script_address":2557789},{"address":3247272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3219012,"script_address":0},{"address":3247312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":356},{"level":29,"species":335}],"party_address":3219028,"script_address":0},{"address":3247352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":357},{"level":32,"species":336}],"party_address":3219044,"script_address":0},{"address":3247392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":357},{"level":35,"species":336}],"party_address":3219060,"script_address":0},{"address":3247432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":19,"moves":[52,33,222,241],"species":339}],"party_address":3219076,"script_address":2050656},{"address":3247472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":363},{"level":28,"species":313}],"party_address":3219092,"script_address":2065713},{"address":3247512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[240,55,87,96],"species":385}],"party_address":3219108,"script_address":2065744},{"address":3247552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[52,33,222,241],"species":339}],"party_address":3219124,"script_address":0},{"address":3247592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[52,36,222,241],"species":339}],"party_address":3219140,"script_address":0},{"address":3247632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[73,72,64,241],"species":363},{"level":34,"moves":[53,36,222,241],"species":339}],"party_address":3219156,"script_address":0},{"address":3247672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[73,202,76,241],"species":363},{"level":37,"moves":[53,36,89,241],"species":340}],"party_address":3219188,"script_address":0},{"address":3247712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":313}],"party_address":3219220,"script_address":2033633},{"address":3247752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3219236,"script_address":2033664},{"address":3247792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":313}],"party_address":3219244,"script_address":2034216},{"address":3247832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":118}],"party_address":3219252,"script_address":2034620},{"address":3247872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219268,"script_address":2034651},{"address":3247912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":116},{"level":25,"species":183}],"party_address":3219276,"script_address":2034838},{"address":3247952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219292,"script_address":2034869},{"address":3247992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":118},{"level":24,"species":309},{"level":24,"species":118}],"party_address":3219300,"script_address":2035808},{"address":3248032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3219324,"script_address":2069240},{"address":3248072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":183}],"party_address":3219332,"script_address":2069350},{"address":3248112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219340,"script_address":2069851},{"address":3248152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219348,"script_address":2069882},{"address":3248192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":183},{"level":33,"species":341}],"party_address":3219356,"script_address":2070225},{"address":3248232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":118}],"party_address":3219372,"script_address":2070256},{"address":3248272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":118},{"level":33,"species":341}],"party_address":3219380,"script_address":2073260},{"address":3248312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219396,"script_address":2073421},{"address":3248352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219404,"script_address":2073452},{"address":3248392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":184}],"party_address":3219412,"script_address":2073639},{"address":3248432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219420,"script_address":2070349},{"address":3248472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219436,"script_address":2073888},{"address":3248512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":116},{"level":33,"species":117}],"party_address":3219444,"script_address":2073919},{"address":3248552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":171},{"level":34,"species":310}],"party_address":3219460,"script_address":0},{"address":3248592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219476,"script_address":2074120},{"address":3248632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":119}],"party_address":3219492,"script_address":2071676},{"address":3248672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":313}],"party_address":3219500,"script_address":0},{"address":3248712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":313}],"party_address":3219508,"script_address":0},{"address":3248752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":120},{"level":43,"species":313}],"party_address":3219516,"script_address":0},{"address":3248792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":313},{"level":45,"species":121}],"party_address":3219532,"script_address":0},{"address":3248832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[91,28,40,163],"species":27},{"level":22,"moves":[229,189,60,61],"species":318}],"party_address":3219556,"script_address":2046397},{"address":3248872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[28,40,163,91],"species":27},{"level":22,"moves":[205,61,39,111],"species":183}],"party_address":3219588,"script_address":2046459},{"address":3248912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":304},{"level":17,"species":296}],"party_address":3219620,"script_address":2049860},{"address":3248952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":183},{"level":18,"species":296}],"party_address":3219636,"script_address":2051934},{"address":3248992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":315},{"level":23,"species":358}],"party_address":3219652,"script_address":2557036},{"address":3249032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":306},{"level":19,"species":43},{"level":19,"species":358}],"party_address":3219668,"script_address":2310092},{"address":3249072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[194,219,68,243],"species":202}],"party_address":3219692,"script_address":2315855},{"address":3249112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":306},{"level":17,"species":183}],"party_address":3219708,"script_address":2046631},{"address":3249152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":306},{"level":25,"species":44},{"level":25,"species":358}],"party_address":3219724,"script_address":0},{"address":3249192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":307},{"level":28,"species":44},{"level":28,"species":358}],"party_address":3219748,"script_address":0},{"address":3249232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307},{"level":31,"species":44},{"level":31,"species":358}],"party_address":3219772,"script_address":0},{"address":3249272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":307},{"level":40,"species":45},{"level":40,"species":359}],"party_address":3219796,"script_address":0},{"address":3249312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":353},{"level":15,"species":354}],"party_address":3219820,"script_address":0},{"address":3249352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":353},{"level":27,"species":354}],"party_address":3219836,"script_address":0},{"address":3249392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":298},{"level":6,"species":295}],"party_address":3219852,"script_address":0},{"address":3249432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":292},{"level":26,"species":294}],"party_address":3219868,"script_address":0},{"address":3249472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":353},{"level":9,"species":354}],"party_address":3219884,"script_address":0},{"address":3249512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[101,50,0,0],"species":361},{"level":10,"moves":[71,73,0,0],"species":306}],"party_address":3219900,"script_address":0},{"address":3249552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":353},{"level":30,"species":354}],"party_address":3219932,"script_address":0},{"address":3249592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[209,12,57,14],"species":353},{"level":33,"moves":[209,12,204,14],"species":354}],"party_address":3219948,"script_address":0},{"address":3249632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,12,57,14],"species":353},{"level":36,"moves":[87,12,204,14],"species":354}],"party_address":3219980,"script_address":0},{"address":3249672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":309},{"level":12,"species":66}],"party_address":3220012,"script_address":2035839},{"address":3249712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309}],"party_address":3220028,"script_address":2035870},{"address":3249752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":67}],"party_address":3220036,"script_address":2069913},{"address":3249792,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":66},{"level":11,"species":72}],"party_address":3220052,"script_address":2543939},{"address":3249832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":73},{"level":44,"species":67}],"party_address":3220076,"script_address":2360255},{"address":3249872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":66},{"level":43,"species":310},{"level":43,"species":67}],"party_address":3220092,"script_address":2360286},{"address":3249912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":341},{"level":25,"species":67}],"party_address":3220116,"script_address":2340984},{"address":3249952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":309},{"level":36,"species":72},{"level":36,"species":67}],"party_address":3220132,"script_address":0},{"address":3249992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":310},{"level":39,"species":72},{"level":39,"species":67}],"party_address":3220156,"script_address":0},{"address":3250032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":310},{"level":42,"species":72},{"level":42,"species":67}],"party_address":3220180,"script_address":0},{"address":3250072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":310},{"level":45,"species":67},{"level":45,"species":73}],"party_address":3220204,"script_address":0},{"address":3250112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3220228,"script_address":2103632},{"address":3250152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[175,96,216,213],"species":328},{"level":39,"moves":[175,96,216,213],"species":328}],"party_address":3220236,"script_address":2265863},{"address":3250192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":376}],"party_address":3220268,"script_address":2068647},{"address":3250232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[92,87,120,188],"species":109}],"party_address":3220276,"script_address":2068616},{"address":3250272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[241,55,53,76],"species":385}],"party_address":3220292,"script_address":2068585},{"address":3250312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":338},{"level":33,"species":68}],"party_address":3220308,"script_address":2070116},{"address":3250352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":341}],"party_address":3220324,"script_address":2074337},{"address":3250392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[44,46,86,85],"species":338}],"party_address":3220340,"script_address":2074306},{"address":3250432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":356},{"level":33,"species":336}],"party_address":3220356,"script_address":2074275},{"address":3250472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3220372,"script_address":2074244},{"address":3250512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":170},{"level":33,"species":336}],"party_address":3220380,"script_address":2074043},{"address":3250552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":296},{"level":14,"species":299}],"party_address":3220396,"script_address":2038436},{"address":3250592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":380},{"level":18,"species":379}],"party_address":3220412,"script_address":2053172},{"address":3250632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":340},{"level":38,"species":287},{"level":40,"species":42}],"party_address":3220428,"script_address":0},{"address":3250672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":299}],"party_address":3220452,"script_address":0},{"address":3250712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":299}],"party_address":3220468,"script_address":0},{"address":3250752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":299}],"party_address":3220484,"script_address":0},{"address":3250792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":297},{"level":35,"species":300}],"party_address":3220500,"script_address":0},{"address":3250832,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[76,219,225,93],"species":359},{"level":43,"moves":[47,18,204,185],"species":316},{"level":44,"moves":[89,73,202,92],"species":363},{"level":41,"moves":[48,85,161,103],"species":82},{"level":45,"moves":[104,91,94,248],"species":394}],"party_address":3220516,"script_address":2332529},{"address":3250872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220596,"script_address":2025759},{"address":3250912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309},{"level":20,"species":278}],"party_address":3220604,"script_address":2039798},{"address":3250952,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310},{"level":31,"species":278}],"party_address":3220628,"script_address":2060578},{"address":3250992,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220652,"script_address":2025703},{"address":3251032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220660,"script_address":2039742},{"address":3251072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220684,"script_address":2060522},{"address":3251112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220708,"script_address":2025731},{"address":3251152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220716,"script_address":2039770},{"address":3251192,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220740,"script_address":2060550},{"address":3251232,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220764,"script_address":2025675},{"address":3251272,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":218},{"level":20,"species":278}],"party_address":3220772,"script_address":2039622},{"address":3251312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":296},{"level":31,"species":278}],"party_address":3220796,"script_address":2060420},{"address":3251352,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220820,"script_address":2025619},{"address":3251392,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220828,"script_address":2039566},{"address":3251432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220852,"script_address":2060364},{"address":3251472,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220876,"script_address":2025647},{"address":3251512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220884,"script_address":2039594},{"address":3251552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220908,"script_address":2060392},{"address":3251592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":370},{"level":11,"species":288},{"level":11,"species":382},{"level":11,"species":286},{"level":11,"species":304},{"level":11,"species":335}],"party_address":3220932,"script_address":2057155},{"address":3251632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":127}],"party_address":3220980,"script_address":2068678},{"address":3251672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[153,115,113,94],"species":348},{"level":43,"moves":[153,115,113,247],"species":349}],"party_address":3220988,"script_address":2334468},{"address":3251712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":371},{"level":22,"species":289},{"level":22,"species":382},{"level":22,"species":287},{"level":22,"species":305},{"level":22,"species":335}],"party_address":3221020,"script_address":0},{"address":3251752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":371},{"level":25,"species":289},{"level":25,"species":382},{"level":25,"species":287},{"level":25,"species":305},{"level":25,"species":336}],"party_address":3221068,"script_address":0},{"address":3251792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":371},{"level":28,"species":289},{"level":28,"species":382},{"level":28,"species":287},{"level":28,"species":305},{"level":28,"species":336}],"party_address":3221116,"script_address":0},{"address":3251832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":371},{"level":31,"species":289},{"level":31,"species":383},{"level":31,"species":287},{"level":31,"species":305},{"level":31,"species":336}],"party_address":3221164,"script_address":0},{"address":3251872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":306},{"level":11,"species":183},{"level":11,"species":363},{"level":11,"species":315},{"level":11,"species":118}],"party_address":3221212,"script_address":2057265},{"address":3251912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":322},{"level":43,"species":376}],"party_address":3221260,"script_address":2334499},{"address":3251952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":28}],"party_address":3221276,"script_address":2341891},{"address":3251992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":309},{"level":22,"species":306},{"level":22,"species":183},{"level":22,"species":363},{"level":22,"species":315},{"level":22,"species":118}],"party_address":3221284,"script_address":0},{"address":3252032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":310},{"level":25,"species":307},{"level":25,"species":183},{"level":25,"species":363},{"level":25,"species":316},{"level":25,"species":118}],"party_address":3221332,"script_address":0},{"address":3252072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":310},{"level":28,"species":307},{"level":28,"species":183},{"level":28,"species":363},{"level":28,"species":316},{"level":28,"species":118}],"party_address":3221380,"script_address":0},{"address":3252112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":310},{"level":31,"species":307},{"level":31,"species":184},{"level":31,"species":363},{"level":31,"species":316},{"level":31,"species":119}],"party_address":3221428,"script_address":0},{"address":3252152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3221476,"script_address":2061230},{"address":3252192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":298},{"level":28,"species":299},{"level":28,"species":296}],"party_address":3221484,"script_address":2065479},{"address":3252232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":345}],"party_address":3221508,"script_address":2563288},{"address":3252272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307}],"party_address":3221516,"script_address":0},{"address":3252312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307}],"party_address":3221524,"script_address":0},{"address":3252352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":307}],"party_address":3221532,"script_address":0},{"address":3252392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":317},{"level":39,"species":307}],"party_address":3221540,"script_address":0},{"address":3252432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":44},{"level":26,"species":363}],"party_address":3221556,"script_address":2061340},{"address":3252472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":295},{"level":28,"species":296},{"level":28,"species":299}],"party_address":3221572,"script_address":2065510},{"address":3252512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":358},{"level":38,"species":363}],"party_address":3221596,"script_address":2563226},{"address":3252552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":44},{"level":30,"species":363}],"party_address":3221612,"script_address":0},{"address":3252592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":44},{"level":33,"species":363}],"party_address":3221628,"script_address":0},{"address":3252632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":44},{"level":36,"species":363}],"party_address":3221644,"script_address":0},{"address":3252672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":182},{"level":39,"species":363}],"party_address":3221660,"script_address":0},{"address":3252712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":81}],"party_address":3221676,"script_address":2310306},{"address":3252752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":287},{"level":35,"species":42}],"party_address":3221684,"script_address":2327187},{"address":3252792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":313},{"level":31,"species":41}],"party_address":3221700,"script_address":0},{"address":3252832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":30,"species":41}],"party_address":3221716,"script_address":2317615},{"address":3252872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":286},{"level":22,"species":339}],"party_address":3221732,"script_address":2309993},{"address":3252912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3221748,"script_address":2188216},{"address":3252952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3221764,"script_address":2095389},{"address":3252992,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3221772,"script_address":2095465},{"address":3253032,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":335}],"party_address":3221780,"script_address":2095427},{"address":3253072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":356}],"party_address":3221788,"script_address":2244674},{"address":3253112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3221796,"script_address":2070287},{"address":3253152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[87,86,98,0],"species":338},{"level":32,"moves":[57,168,0,0],"species":289}],"party_address":3221804,"script_address":2070768},{"address":3253192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":73}],"party_address":3221836,"script_address":2071645},{"address":3253232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":41}],"party_address":3221844,"script_address":2304070},{"address":3253272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3221852,"script_address":2073102},{"address":3253312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":203}],"party_address":3221860,"script_address":0},{"address":3253352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":351}],"party_address":3221868,"script_address":2244705},{"address":3253392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3221876,"script_address":2244829},{"address":3253432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3221884,"script_address":2244767},{"address":3253472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":202}],"party_address":3221892,"script_address":2244798},{"address":3253512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":286}],"party_address":3221900,"script_address":2254605},{"address":3253552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221916,"script_address":2254667},{"address":3253592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3221924,"script_address":2257768},{"address":3253632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":287}],"party_address":3221932,"script_address":2257818},{"address":3253672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221940,"script_address":2257868},{"address":3253712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":177}],"party_address":3221948,"script_address":2244736},{"address":3253752,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3221956,"script_address":1978559},{"address":3253792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3221972,"script_address":1978621},{"address":3253832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":305},{"level":33,"species":307}],"party_address":3221988,"script_address":2073732},{"address":3253872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3222004,"script_address":2069651},{"address":3253912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3222012,"script_address":2572062},{"address":3253952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":20,"species":286},{"level":22,"species":339},{"level":22,"species":41}],"party_address":3222028,"script_address":2304039},{"address":3253992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":317},{"level":33,"species":371}],"party_address":3222060,"script_address":2073794},{"address":3254032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":218},{"level":15,"species":283}],"party_address":3222076,"script_address":1978590},{"address":3254072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3222092,"script_address":1978317},{"address":3254112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":287},{"level":38,"species":169},{"level":39,"species":340}],"party_address":3222108,"script_address":2351441},{"address":3254152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":287},{"level":24,"species":41},{"level":25,"species":340}],"party_address":3222132,"script_address":2303440},{"address":3254192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":4,"species":306}],"party_address":3222156,"script_address":2024895},{"address":3254232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":295},{"level":6,"species":306}],"party_address":3222172,"script_address":2029715},{"address":3254272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":183}],"party_address":3222188,"script_address":2054459},{"address":3254312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183},{"level":15,"species":306},{"level":15,"species":339}],"party_address":3222196,"script_address":2045995},{"address":3254352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":306}],"party_address":3222220,"script_address":0},{"address":3254392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":307}],"party_address":3222236,"script_address":0},{"address":3254432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":307}],"party_address":3222252,"script_address":0},{"address":3254472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":296},{"level":34,"species":307}],"party_address":3222268,"script_address":0},{"address":3254512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":43}],"party_address":3222292,"script_address":2553761},{"address":3254552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":315},{"level":14,"species":306},{"level":14,"species":183}],"party_address":3222300,"script_address":2553823},{"address":3254592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325}],"party_address":3222324,"script_address":2265615},{"address":3254632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":118},{"level":39,"species":313}],"party_address":3222332,"script_address":2265646},{"address":3254672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":290},{"level":4,"species":290}],"party_address":3222348,"script_address":2024864},{"address":3254712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290}],"party_address":3222364,"script_address":2300392},{"address":3254752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":290},{"level":8,"species":301}],"party_address":3222396,"script_address":2054211},{"address":3254792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":301},{"level":28,"species":302}],"party_address":3222412,"script_address":2061137},{"address":3254832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222428,"script_address":2061168},{"address":3254872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302}],"party_address":3222444,"script_address":2061199},{"address":3254912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":301},{"level":6,"species":301}],"party_address":3222452,"script_address":2300423},{"address":3254952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":302}],"party_address":3222468,"script_address":0},{"address":3254992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":302}],"party_address":3222476,"script_address":0},{"address":3255032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":294},{"level":31,"species":302}],"party_address":3222492,"script_address":0},{"address":3255072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":311},{"level":33,"species":302},{"level":33,"species":294},{"level":33,"species":302}],"party_address":3222516,"script_address":0},{"address":3255112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":339},{"level":17,"species":66}],"party_address":3222548,"script_address":2049688},{"address":3255152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":17,"species":74},{"level":16,"species":74}],"party_address":3222564,"script_address":2049719},{"address":3255192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":66}],"party_address":3222588,"script_address":2051841},{"address":3255232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":339}],"party_address":3222604,"script_address":2051872},{"address":3255272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":74},{"level":22,"species":320},{"level":22,"species":75}],"party_address":3222620,"script_address":2557067},{"address":3255312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74}],"party_address":3222644,"script_address":2054428},{"address":3255352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":74},{"level":20,"species":318}],"party_address":3222652,"script_address":2310061},{"address":3255392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":9,"moves":[150,55,0,0],"species":313}],"party_address":3222668,"script_address":0},{"address":3255432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[16,45,0,0],"species":310},{"level":10,"moves":[44,184,0,0],"species":286}],"party_address":3222684,"script_address":0},{"address":3255472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":16,"species":74},{"level":16,"species":66}],"party_address":3222716,"script_address":2296023},{"address":3255512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":75}],"party_address":3222740,"script_address":0},{"address":3255552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":74},{"level":27,"species":74},{"level":27,"species":75},{"level":27,"species":75}],"party_address":3222772,"script_address":0},{"address":3255592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":74},{"level":30,"species":75},{"level":30,"species":75},{"level":30,"species":75}],"party_address":3222804,"script_address":0},{"address":3255632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":76}],"party_address":3222836,"script_address":0},{"address":3255672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":316},{"level":31,"species":338}],"party_address":3222868,"script_address":0},{"address":3255712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":325}],"party_address":3222884,"script_address":0},{"address":3255752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222900,"script_address":0},{"address":3255792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":386},{"level":30,"species":387}],"party_address":3222916,"script_address":0},{"address":3255832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":386},{"level":33,"species":387}],"party_address":3222932,"script_address":0},{"address":3255872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":386},{"level":36,"species":387}],"party_address":3222948,"script_address":0},{"address":3255912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":386},{"level":39,"species":387}],"party_address":3222964,"script_address":0},{"address":3255952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":118}],"party_address":3222980,"script_address":2543970},{"address":3255992,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[53,154,185,20],"species":317}],"party_address":3222988,"script_address":2103539},{"address":3256032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[117,197,93,9],"species":356},{"level":17,"moves":[9,197,93,96],"species":356}],"party_address":3223004,"script_address":2167701},{"address":3256072,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[117,197,93,7],"species":356}],"party_address":3223036,"script_address":2103508},{"address":3256112,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[33,120,124,108],"species":109},{"level":25,"moves":[33,139,124,108],"species":109}],"party_address":3223052,"script_address":2061574},{"address":3256152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[139,120,124,108],"species":109},{"level":28,"moves":[28,104,210,14],"species":302}],"party_address":3223084,"script_address":2065775},{"address":3256192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[141,154,170,91],"species":301},{"level":28,"moves":[33,120,124,108],"species":109}],"party_address":3223116,"script_address":2065806},{"address":3256232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":305},{"level":29,"species":178}],"party_address":3223148,"script_address":2202329},{"address":3256272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":358},{"level":27,"species":358},{"level":27,"species":358}],"party_address":3223164,"script_address":2202360},{"address":3256312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":392}],"party_address":3223188,"script_address":1971405},{"address":3256352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[76,219,225,93],"species":359},{"level":46,"moves":[47,18,204,185],"species":316},{"level":47,"moves":[89,73,202,92],"species":363},{"level":44,"moves":[48,85,161,103],"species":82},{"level":48,"moves":[104,91,94,248],"species":394}],"party_address":3223196,"script_address":2332607},{"address":3256392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[76,219,225,93],"species":359},{"level":49,"moves":[47,18,204,185],"species":316},{"level":50,"moves":[89,73,202,92],"species":363},{"level":47,"moves":[48,85,161,103],"species":82},{"level":51,"moves":[104,91,94,248],"species":394}],"party_address":3223276,"script_address":0},{"address":3256432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[76,219,225,93],"species":359},{"level":52,"moves":[47,18,204,185],"species":316},{"level":53,"moves":[89,73,202,92],"species":363},{"level":50,"moves":[48,85,161,103],"species":82},{"level":54,"moves":[104,91,94,248],"species":394}],"party_address":3223356,"script_address":0},{"address":3256472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[76,219,225,93],"species":359},{"level":55,"moves":[47,18,204,185],"species":316},{"level":56,"moves":[89,73,202,92],"species":363},{"level":53,"moves":[48,85,161,103],"species":82},{"level":57,"moves":[104,91,94,248],"species":394}],"party_address":3223436,"script_address":0},{"address":3256512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223516,"script_address":1986165},{"address":3256552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223548,"script_address":1986109},{"address":3256592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223580,"script_address":1986137},{"address":3256632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223612,"script_address":1986081},{"address":3256672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223644,"script_address":1986025},{"address":3256712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223676,"script_address":1986053},{"address":3256752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":31,"species":72},{"level":32,"species":331}],"party_address":3223708,"script_address":2070644},{"address":3256792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":34,"species":73}],"party_address":3223732,"script_address":2070675},{"address":3256832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":129},{"level":25,"species":129},{"level":35,"species":130}],"party_address":3223748,"script_address":2070706},{"address":3256872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":44},{"level":34,"species":184}],"party_address":3223772,"script_address":2071552},{"address":3256912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":300},{"level":34,"species":320}],"party_address":3223788,"script_address":2071583},{"address":3256952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":67}],"party_address":3223804,"script_address":2070799},{"address":3256992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":72},{"level":31,"species":72},{"level":36,"species":313}],"party_address":3223812,"script_address":2071614},{"address":3257032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":305},{"level":32,"species":227}],"party_address":3223836,"script_address":2070737},{"address":3257072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":341},{"level":33,"species":331}],"party_address":3223852,"script_address":2073040},{"address":3257112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170}],"party_address":3223868,"script_address":2073071},{"address":3257152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":308},{"level":19,"species":308}],"party_address":3223876,"script_address":0},{"address":3257192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[47,31,219,76],"species":358},{"level":35,"moves":[53,36,156,89],"species":339}],"party_address":3223892,"script_address":0},{"address":3257232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[74,78,72,73],"species":363},{"level":20,"moves":[111,205,44,88],"species":75}],"party_address":3223924,"script_address":0},{"address":3257272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[16,60,92,182],"species":294},{"level":27,"moves":[16,72,213,78],"species":292}],"party_address":3223956,"script_address":0},{"address":3257312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[94,7,244,182],"species":357},{"level":39,"moves":[8,61,156,187],"species":336}],"party_address":3223988,"script_address":0},{"address":3257352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,7,244,182],"species":357},{"level":43,"moves":[8,61,156,187],"species":336}],"party_address":3224020,"script_address":0},{"address":3257392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[94,7,244,182],"species":357},{"level":46,"moves":[8,61,156,187],"species":336}],"party_address":3224052,"script_address":0},{"address":3257432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":49,"moves":[94,7,244,182],"species":357},{"level":49,"moves":[8,61,156,187],"species":336}],"party_address":3224084,"script_address":0},{"address":3257472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[94,7,244,182],"species":357},{"level":52,"moves":[8,61,156,187],"species":336}],"party_address":3224116,"script_address":0},{"address":3257512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":33,"species":309}],"party_address":3224148,"script_address":0},{"address":3257552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170},{"level":33,"species":330}],"party_address":3224164,"script_address":0},{"address":3257592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":170},{"level":40,"species":330}],"party_address":3224180,"script_address":0},{"address":3257632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":171},{"level":43,"species":330}],"party_address":3224196,"script_address":0},{"address":3257672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":171},{"level":46,"species":331}],"party_address":3224212,"script_address":0},{"address":3257712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":51,"species":171},{"level":49,"species":331}],"party_address":3224228,"script_address":0},{"address":3257752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":118},{"level":25,"species":72}],"party_address":3224244,"script_address":0},{"address":3257792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":129},{"level":20,"species":72},{"level":26,"species":328},{"level":23,"species":330}],"party_address":3224260,"script_address":2061605},{"address":3257832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":288},{"level":8,"species":286}],"party_address":3224292,"script_address":2054707},{"address":3257872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":295},{"level":8,"species":288}],"party_address":3224308,"script_address":2054676},{"address":3257912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":129}],"party_address":3224324,"script_address":2030343},{"address":3257952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":183}],"party_address":3224332,"script_address":2036307},{"address":3257992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":72},{"level":12,"species":72}],"party_address":3224340,"script_address":2036276},{"address":3258032,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":354},{"level":14,"species":353}],"party_address":3224356,"script_address":2039032},{"address":3258072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":337},{"level":14,"species":100}],"party_address":3224372,"script_address":2039063},{"address":3258112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81}],"party_address":3224388,"script_address":2039094},{"address":3258152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":100}],"party_address":3224396,"script_address":2026463},{"address":3258192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":335}],"party_address":3224404,"script_address":2026494},{"address":3258232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":27}],"party_address":3224412,"script_address":2046975},{"address":3258272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":363}],"party_address":3224420,"script_address":2047006},{"address":3258312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306}],"party_address":3224428,"script_address":2046944},{"address":3258352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339}],"party_address":3224436,"script_address":2046913},{"address":3258392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":183},{"level":19,"species":296}],"party_address":3224444,"script_address":2050969},{"address":3258432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":227},{"level":19,"species":305}],"party_address":3224460,"script_address":2051000},{"address":3258472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":318},{"level":18,"species":27}],"party_address":3224476,"script_address":2051031},{"address":3258512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":382},{"level":18,"species":382}],"party_address":3224492,"script_address":2051062},{"address":3258552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":183}],"party_address":3224508,"script_address":2052309},{"address":3258592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3224524,"script_address":2052371},{"address":3258632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":299}],"party_address":3224532,"script_address":2052340},{"address":3258672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":14,"species":382},{"level":14,"species":337}],"party_address":3224540,"script_address":2059128},{"address":3258712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224564,"script_address":2347841},{"address":3258752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224572,"script_address":2347872},{"address":3258792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224580,"script_address":2348597},{"address":3258832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":41}],"party_address":3224588,"script_address":2348628},{"address":3258872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":339}],"party_address":3224604,"script_address":2348659},{"address":3258912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224620,"script_address":2349324},{"address":3258952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224628,"script_address":2349355},{"address":3258992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224636,"script_address":2349386},{"address":3259032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224644,"script_address":2350264},{"address":3259072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224652,"script_address":2350826},{"address":3259112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224660,"script_address":2351566},{"address":3259152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224668,"script_address":2351597},{"address":3259192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224676,"script_address":2351628},{"address":3259232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224684,"script_address":2348566},{"address":3259272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224692,"script_address":2349293},{"address":3259312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224700,"script_address":2350295},{"address":3259352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":339},{"level":28,"species":287},{"level":30,"species":41},{"level":33,"species":340}],"party_address":3224708,"script_address":2351659},{"address":3259392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":310},{"level":33,"species":340}],"party_address":3224740,"script_address":2073763},{"address":3259432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":287},{"level":43,"species":169},{"level":44,"species":340}],"party_address":3224756,"script_address":0},{"address":3259472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":72}],"party_address":3224780,"script_address":2026525},{"address":3259512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183}],"party_address":3224788,"script_address":2026556},{"address":3259552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":27},{"level":25,"species":27}],"party_address":3224796,"script_address":2033726},{"address":3259592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":309}],"party_address":3224812,"script_address":2033695},{"address":3259632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":120}],"party_address":3224828,"script_address":2034744},{"address":3259672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":309},{"level":24,"species":66},{"level":24,"species":72}],"party_address":3224836,"script_address":2034931},{"address":3259712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":338},{"level":24,"species":305},{"level":24,"species":338}],"party_address":3224860,"script_address":2034900},{"address":3259752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":227},{"level":25,"species":227}],"party_address":3224884,"script_address":2036338},{"address":3259792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":183},{"level":22,"species":296}],"party_address":3224900,"script_address":2047037},{"address":3259832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":27},{"level":22,"species":28}],"party_address":3224916,"script_address":2047068},{"address":3259872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":304},{"level":22,"species":299}],"party_address":3224932,"script_address":2047099},{"address":3259912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":18,"species":218}],"party_address":3224948,"script_address":2049891},{"address":3259952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306},{"level":18,"species":363}],"party_address":3224964,"script_address":2049922},{"address":3259992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":84},{"level":26,"species":85}],"party_address":3224980,"script_address":2053203},{"address":3260032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302},{"level":26,"species":367}],"party_address":3224996,"script_address":2053234},{"address":3260072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":64},{"level":26,"species":393}],"party_address":3225012,"script_address":2053265},{"address":3260112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3225028,"script_address":2053296},{"address":3260152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":351}],"party_address":3225044,"script_address":2053327},{"address":3260192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3225060,"script_address":2054738},{"address":3260232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":306},{"level":8,"species":295}],"party_address":3225076,"script_address":2054769},{"address":3260272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3225092,"script_address":2057834},{"address":3260312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3225100,"script_address":2057865},{"address":3260352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":356}],"party_address":3225108,"script_address":2057896},{"address":3260392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":363},{"level":33,"species":357}],"party_address":3225116,"script_address":2073825},{"address":3260432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":338}],"party_address":3225132,"script_address":2061636},{"address":3260472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":218},{"level":25,"species":339}],"party_address":3225140,"script_address":2061667},{"address":3260512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3225156,"script_address":2061698},{"address":3260552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[87,98,86,0],"species":338}],"party_address":3225164,"script_address":2065837},{"address":3260592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":356},{"level":28,"species":335}],"party_address":3225180,"script_address":2065868},{"address":3260632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":292}],"party_address":3225196,"script_address":2067487},{"address":3260672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":335},{"level":25,"species":309},{"level":25,"species":369},{"level":25,"species":288},{"level":25,"species":337},{"level":25,"species":339}],"party_address":3225212,"script_address":2067518},{"address":3260712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":286},{"level":25,"species":306},{"level":25,"species":337},{"level":25,"species":183},{"level":25,"species":27},{"level":25,"species":367}],"party_address":3225260,"script_address":2067549},{"address":3260752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":371},{"level":29,"species":365}],"party_address":3225308,"script_address":2067611},{"address":3260792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3225324,"script_address":1978255},{"address":3260832,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":321},{"level":15,"species":283}],"party_address":3225340,"script_address":1978286},{"address":3260872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[182,205,222,153],"species":76},{"level":35,"moves":[14,58,57,157],"species":140},{"level":35,"moves":[231,153,46,157],"species":95},{"level":37,"moves":[104,153,182,157],"species":320}],"party_address":3225356,"script_address":0},{"address":3260912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[182,58,157,57],"species":138},{"level":37,"moves":[182,205,222,153],"species":76},{"level":40,"moves":[14,58,57,157],"species":141},{"level":40,"moves":[231,153,46,157],"species":95},{"level":42,"moves":[104,153,182,157],"species":320}],"party_address":3225420,"script_address":0},{"address":3260952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[182,58,157,57],"species":139},{"level":42,"moves":[182,205,89,153],"species":76},{"level":45,"moves":[14,58,57,157],"species":141},{"level":45,"moves":[231,153,46,157],"species":95},{"level":47,"moves":[104,153,182,157],"species":320}],"party_address":3225500,"script_address":0},{"address":3260992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[157,63,48,182],"species":142},{"level":47,"moves":[8,205,89,153],"species":76},{"level":47,"moves":[182,58,157,57],"species":139},{"level":50,"moves":[14,58,57,157],"species":141},{"level":50,"moves":[231,153,46,157],"species":208},{"level":52,"moves":[104,153,182,157],"species":320}],"party_address":3225580,"script_address":0},{"address":3261032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[2,157,8,83],"species":68},{"level":33,"moves":[94,113,115,8],"species":356},{"level":35,"moves":[228,68,182,167],"species":237},{"level":37,"moves":[252,8,187,89],"species":336}],"party_address":3225676,"script_address":0},{"address":3261072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[2,157,8,83],"species":68},{"level":38,"moves":[94,113,115,8],"species":357},{"level":40,"moves":[228,68,182,167],"species":237},{"level":42,"moves":[252,8,187,89],"species":336}],"party_address":3225740,"script_address":0},{"address":3261112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[71,182,7,8],"species":107},{"level":43,"moves":[2,157,8,83],"species":68},{"level":43,"moves":[8,113,115,94],"species":357},{"level":45,"moves":[228,68,182,167],"species":237},{"level":47,"moves":[252,8,187,89],"species":336}],"party_address":3225804,"script_address":0},{"address":3261152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[25,8,89,83],"species":106},{"level":46,"moves":[71,182,7,8],"species":107},{"level":48,"moves":[238,157,8,83],"species":68},{"level":48,"moves":[8,113,115,94],"species":357},{"level":50,"moves":[228,68,182,167],"species":237},{"level":52,"moves":[252,8,187,89],"species":336}],"party_address":3225884,"script_address":0},{"address":3261192,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,182,86,113],"species":179},{"level":36,"moves":[205,87,153,240],"species":101},{"level":38,"moves":[48,182,87,240],"species":82},{"level":40,"moves":[44,86,87,182],"species":338}],"party_address":3225980,"script_address":0},{"address":3261232,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[87,21,240,95],"species":25},{"level":41,"moves":[87,182,86,113],"species":180},{"level":41,"moves":[205,87,153,240],"species":101},{"level":43,"moves":[48,182,87,240],"species":82},{"level":45,"moves":[44,86,87,182],"species":338}],"party_address":3226044,"script_address":0},{"address":3261272,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[87,21,240,182],"species":26},{"level":46,"moves":[87,182,86,113],"species":181},{"level":46,"moves":[205,87,153,240],"species":101},{"level":48,"moves":[48,182,87,240],"species":82},{"level":50,"moves":[44,86,87,182],"species":338}],"party_address":3226124,"script_address":0},{"address":3261312,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[129,8,9,113],"species":125},{"level":51,"moves":[87,21,240,182],"species":26},{"level":51,"moves":[87,182,86,113],"species":181},{"level":53,"moves":[205,87,153,240],"species":101},{"level":53,"moves":[48,182,87,240],"species":82},{"level":55,"moves":[44,86,87,182],"species":338}],"party_address":3226204,"script_address":0},{"address":3261352,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[59,213,113,157],"species":219},{"level":36,"moves":[53,213,76,84],"species":77},{"level":38,"moves":[59,241,89,213],"species":340},{"level":40,"moves":[59,241,153,213],"species":321}],"party_address":3226300,"script_address":0},{"address":3261392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[14,53,46,241],"species":58},{"level":43,"moves":[59,213,113,157],"species":219},{"level":41,"moves":[53,213,76,84],"species":77},{"level":43,"moves":[59,241,89,213],"species":340},{"level":45,"moves":[59,241,153,213],"species":321}],"party_address":3226364,"script_address":0},{"address":3261432,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,76,13,241],"species":228},{"level":46,"moves":[14,53,241,46],"species":58},{"level":48,"moves":[59,213,113,157],"species":219},{"level":46,"moves":[53,213,76,84],"species":78},{"level":48,"moves":[59,241,89,213],"species":340},{"level":50,"moves":[59,241,153,213],"species":321}],"party_address":3226444,"script_address":0},{"address":3261472,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":51,"moves":[14,53,241,46],"species":59},{"level":53,"moves":[59,213,113,157],"species":219},{"level":51,"moves":[46,76,13,241],"species":229},{"level":51,"moves":[53,213,76,84],"species":78},{"level":53,"moves":[59,241,89,213],"species":340},{"level":55,"moves":[59,241,153,213],"species":321}],"party_address":3226540,"script_address":0},{"address":3261512,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[113,47,29,8],"species":113},{"level":42,"moves":[59,247,38,126],"species":366},{"level":43,"moves":[42,29,7,95],"species":308},{"level":45,"moves":[63,53,85,247],"species":366}],"party_address":3226636,"script_address":0},{"address":3261552,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[59,247,38,126],"species":366},{"level":47,"moves":[113,47,29,8],"species":113},{"level":45,"moves":[252,146,203,179],"species":115},{"level":48,"moves":[42,29,7,95],"species":308},{"level":50,"moves":[63,53,85,247],"species":366}],"party_address":3226700,"script_address":0},{"address":3261592,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[59,247,38,126],"species":366},{"level":52,"moves":[113,47,29,8],"species":242},{"level":50,"moves":[252,146,203,179],"species":115},{"level":53,"moves":[42,29,7,95],"species":308},{"level":55,"moves":[63,53,85,247],"species":366}],"party_address":3226780,"script_address":0},{"address":3261632,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[59,247,38,126],"species":366},{"level":57,"moves":[182,47,29,8],"species":242},{"level":55,"moves":[252,146,203,179],"species":115},{"level":57,"moves":[36,182,126,89],"species":128},{"level":58,"moves":[42,29,7,95],"species":308},{"level":60,"moves":[63,53,85,247],"species":366}],"party_address":3226860,"script_address":0},{"address":3261672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[86,85,182,58],"species":147},{"level":38,"moves":[241,76,76,89],"species":369},{"level":41,"moves":[57,48,182,76],"species":310},{"level":43,"moves":[18,191,211,76],"species":227},{"level":45,"moves":[76,156,93,89],"species":359}],"party_address":3226956,"script_address":0},{"address":3261712,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[95,94,115,138],"species":163},{"level":43,"moves":[241,76,76,89],"species":369},{"level":45,"moves":[86,85,182,58],"species":148},{"level":46,"moves":[57,48,182,76],"species":310},{"level":48,"moves":[18,191,211,76],"species":227},{"level":50,"moves":[76,156,93,89],"species":359}],"party_address":3227036,"script_address":0},{"address":3261752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[95,94,115,138],"species":164},{"level":49,"moves":[241,76,76,89],"species":369},{"level":50,"moves":[86,85,182,58],"species":148},{"level":51,"moves":[57,48,182,76],"species":310},{"level":53,"moves":[18,191,211,76],"species":227},{"level":55,"moves":[76,156,93,89],"species":359}],"party_address":3227132,"script_address":0},{"address":3261792,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,94,115,138],"species":164},{"level":54,"moves":[241,76,76,89],"species":369},{"level":55,"moves":[57,48,182,76],"species":310},{"level":55,"moves":[63,85,89,58],"species":149},{"level":58,"moves":[18,191,211,76],"species":227},{"level":60,"moves":[143,156,93,89],"species":359}],"party_address":3227228,"script_address":0},{"address":3261832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[25,94,91,182],"species":79},{"level":49,"moves":[89,246,94,113],"species":319},{"level":49,"moves":[94,156,109,91],"species":178},{"level":50,"moves":[89,94,156,91],"species":348},{"level":50,"moves":[241,76,94,53],"species":349}],"party_address":3227324,"script_address":0},{"address":3261872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,138,29,182],"species":96},{"level":53,"moves":[25,94,91,182],"species":79},{"level":54,"moves":[89,153,94,113],"species":319},{"level":54,"moves":[94,156,109,91],"species":178},{"level":55,"moves":[89,94,156,91],"species":348},{"level":55,"moves":[241,76,94,53],"species":349}],"party_address":3227404,"script_address":0},{"address":3261912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":58,"moves":[95,138,29,182],"species":97},{"level":59,"moves":[89,153,94,113],"species":319},{"level":58,"moves":[25,94,91,182],"species":79},{"level":59,"moves":[94,156,109,91],"species":178},{"level":60,"moves":[89,94,156,91],"species":348},{"level":60,"moves":[241,76,94,53],"species":349}],"party_address":3227500,"script_address":0},{"address":3261952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":63,"moves":[95,138,29,182],"species":97},{"level":64,"moves":[89,153,94,113],"species":319},{"level":63,"moves":[25,94,91,182],"species":199},{"level":64,"moves":[94,156,109,91],"species":178},{"level":65,"moves":[89,94,156,91],"species":348},{"level":65,"moves":[241,76,94,53],"species":349}],"party_address":3227596,"script_address":0},{"address":3261992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[95,240,182,56],"species":60},{"level":46,"moves":[240,96,104,90],"species":324},{"level":48,"moves":[96,34,182,58],"species":343},{"level":48,"moves":[156,152,13,104],"species":327},{"level":51,"moves":[96,104,58,156],"species":230}],"party_address":3227692,"script_address":0},{"address":3262032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[95,240,182,56],"species":61},{"level":51,"moves":[240,96,104,90],"species":324},{"level":53,"moves":[96,34,182,58],"species":343},{"level":53,"moves":[156,12,13,104],"species":327},{"level":56,"moves":[96,104,58,156],"species":230}],"party_address":3227772,"script_address":0},{"address":3262072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[56,195,58,109],"species":131},{"level":58,"moves":[240,96,104,90],"species":324},{"level":56,"moves":[95,240,182,56],"species":61},{"level":58,"moves":[96,34,182,58],"species":343},{"level":58,"moves":[156,12,13,104],"species":327},{"level":61,"moves":[96,104,58,156],"species":230}],"party_address":3227852,"script_address":0},{"address":3262112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":61,"moves":[56,195,58,109],"species":131},{"level":63,"moves":[240,96,104,90],"species":324},{"level":61,"moves":[95,240,56,195],"species":186},{"level":63,"moves":[96,34,182,73],"species":343},{"level":63,"moves":[156,12,13,104],"species":327},{"level":66,"moves":[96,104,58,156],"species":230}],"party_address":3227948,"script_address":0},{"address":3262152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[95,98,204,0],"species":387},{"level":17,"moves":[95,98,109,0],"species":386}],"party_address":3228044,"script_address":2167732},{"address":3262192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":369}],"party_address":3228076,"script_address":2202422},{"address":3262232,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":77,"moves":[92,76,191,211],"species":227},{"level":75,"moves":[115,113,246,89],"species":319},{"level":76,"moves":[87,89,76,81],"species":384},{"level":76,"moves":[202,246,19,109],"species":389},{"level":76,"moves":[96,246,76,163],"species":391},{"level":78,"moves":[89,94,53,247],"species":400}],"party_address":3228084,"script_address":2354502},{"address":3262272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228180,"script_address":0},{"address":3262312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228188,"script_address":0},{"address":3262352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228196,"script_address":0},{"address":3262392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228204,"script_address":0},{"address":3262432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228212,"script_address":0},{"address":3262472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228220,"script_address":0},{"address":3262512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228228,"script_address":0},{"address":3262552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":27}],"party_address":3228236,"script_address":0},{"address":3262592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":320},{"level":33,"species":27},{"level":33,"species":27}],"party_address":3228252,"script_address":0},{"address":3262632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":320},{"level":35,"species":27},{"level":35,"species":27}],"party_address":3228276,"script_address":0},{"address":3262672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":320},{"level":37,"species":28},{"level":37,"species":28}],"party_address":3228300,"script_address":0},{"address":3262712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":309},{"level":30,"species":66},{"level":30,"species":72}],"party_address":3228324,"script_address":0},{"address":3262752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":66},{"level":32,"species":72}],"party_address":3228348,"script_address":0},{"address":3262792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":66},{"level":34,"species":73}],"party_address":3228372,"script_address":0},{"address":3262832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":310},{"level":36,"species":67},{"level":36,"species":73}],"party_address":3228396,"script_address":0},{"address":3262872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":120},{"level":37,"species":120}],"party_address":3228420,"script_address":0},{"address":3262912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":309},{"level":39,"species":120},{"level":39,"species":120}],"party_address":3228436,"script_address":0},{"address":3262952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":310},{"level":41,"species":120},{"level":41,"species":120}],"party_address":3228460,"script_address":0},{"address":3262992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":310},{"level":43,"species":121},{"level":43,"species":121}],"party_address":3228484,"script_address":0},{"address":3263032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":67},{"level":37,"species":67}],"party_address":3228508,"script_address":0},{"address":3263072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":335},{"level":39,"species":67},{"level":39,"species":67}],"party_address":3228524,"script_address":0},{"address":3263112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":336},{"level":41,"species":67},{"level":41,"species":67}],"party_address":3228548,"script_address":0},{"address":3263152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":336},{"level":43,"species":68},{"level":43,"species":68}],"party_address":3228572,"script_address":0},{"address":3263192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":371},{"level":35,"species":365}],"party_address":3228596,"script_address":0},{"address":3263232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":308},{"level":37,"species":371},{"level":37,"species":365}],"party_address":3228612,"script_address":0},{"address":3263272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":308},{"level":39,"species":371},{"level":39,"species":365}],"party_address":3228636,"script_address":0},{"address":3263312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":308},{"level":41,"species":372},{"level":41,"species":366}],"party_address":3228660,"script_address":0},{"address":3263352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":337},{"level":35,"species":337},{"level":35,"species":371}],"party_address":3228684,"script_address":0},{"address":3263392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":337},{"level":37,"species":338},{"level":37,"species":371}],"party_address":3228708,"script_address":0},{"address":3263432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":338},{"level":39,"species":338},{"level":39,"species":371}],"party_address":3228732,"script_address":0},{"address":3263472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":338},{"level":41,"species":338},{"level":41,"species":372}],"party_address":3228756,"script_address":0},{"address":3263512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":74},{"level":26,"species":339}],"party_address":3228780,"script_address":0},{"address":3263552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":66},{"level":28,"species":339},{"level":28,"species":75}],"party_address":3228796,"script_address":0},{"address":3263592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":66},{"level":30,"species":339},{"level":30,"species":75}],"party_address":3228820,"script_address":0},{"address":3263632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":340},{"level":33,"species":76}],"party_address":3228844,"script_address":0},{"address":3263672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":315},{"level":31,"species":287},{"level":31,"species":288},{"level":31,"species":295},{"level":31,"species":298},{"level":31,"species":304}],"party_address":3228868,"script_address":0},{"address":3263712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":315},{"level":33,"species":287},{"level":33,"species":289},{"level":33,"species":296},{"level":33,"species":299},{"level":33,"species":304}],"party_address":3228916,"script_address":0},{"address":3263752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316},{"level":35,"species":287},{"level":35,"species":289},{"level":35,"species":296},{"level":35,"species":299},{"level":35,"species":305}],"party_address":3228964,"script_address":0},{"address":3263792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":316},{"level":37,"species":287},{"level":37,"species":289},{"level":37,"species":297},{"level":37,"species":300},{"level":37,"species":305}],"party_address":3229012,"script_address":0},{"address":3263832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313},{"level":34,"species":116}],"party_address":3229060,"script_address":0},{"address":3263872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":325},{"level":36,"species":313},{"level":36,"species":117}],"party_address":3229076,"script_address":0},{"address":3263912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":325},{"level":38,"species":313},{"level":38,"species":117}],"party_address":3229100,"script_address":0},{"address":3263952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325},{"level":40,"species":314},{"level":40,"species":230}],"party_address":3229124,"script_address":0},{"address":3263992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":411}],"party_address":3229148,"script_address":2564791},{"address":3264032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":64}],"party_address":3229156,"script_address":2564822},{"address":3264072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":202}],"party_address":3229172,"script_address":0},{"address":3264112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":4}],"party_address":3229180,"script_address":0},{"address":3264152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":1}],"party_address":3229188,"script_address":0},{"address":3264192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":405}],"party_address":3229196,"script_address":0},{"address":3264232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":404}],"party_address":3229204,"script_address":0}],"warps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4":"MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0","MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2":"MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1","MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10","MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2":"MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11","MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3":"MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2","MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0":"MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4","MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3":"MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5","MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2":"MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6","MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4":"MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7","MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0":"MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8","MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9","MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2":"MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0","MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0":"MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1","MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0":"MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2","MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1":"MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3","MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2":"MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4","MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0":"MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5","MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10":"MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6","MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9":"MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7","MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0":"MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0","MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2","MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3","MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0":"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8","MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8":"MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0","MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11":"MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2","MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0","MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0","MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3","MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4","MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0","MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1","MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2","MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0","MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0":"MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0","MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0":"MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0","MAP_ALTERING_CAVE:0/MAP_ROUTE103:0":"MAP_ROUTE103:0/MAP_ALTERING_CAVE:0","MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0":"MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0","MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2":"MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1","MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1":"MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2","MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6":"MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0","MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0":"MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2","MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2":"MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0","MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0":"MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1","MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6":"MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10","MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22":"MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11","MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9":"MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12","MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18":"MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13","MAP_AQUA_HIDEOUT_B1F:14/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16":"MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15","MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15":"MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16","MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20":"MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17","MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13":"MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18","MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24":"MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19","MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1":"MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2","MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:21/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11":"MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22","MAP_AQUA_HIDEOUT_B1F:23/MAP_AQUA_HIDEOUT_B1F:17!":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19":"MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24","MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2":"MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3","MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7":"MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4","MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8":"MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5","MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10":"MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6","MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5":"MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8","MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1":"MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0","MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2":"MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1","MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3":"MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2","MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5":"MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3","MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8":"MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4","MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3":"MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5","MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7":"MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6","MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6":"MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7","MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4":"MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8","MAP_AQUA_HIDEOUT_B2F:9/MAP_AQUA_HIDEOUT_B1F:4!":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0","MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1":"MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1","MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0","MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1":"MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1","MAP_BATTLE_COLOSSEUM_2P:0,1/MAP_DYNAMIC:-1!":"","MAP_BATTLE_COLOSSEUM_4P:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:3/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0!":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2","MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2","MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0","MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0","MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0","MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0","MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0","MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0","MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0","MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0","MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0","MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0","MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0":"MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0":"MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0":"MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0":"MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0":"MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0":"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0":"MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0":"MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0":"MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0":"MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0":"MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0":"MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0":"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0":"MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0":"MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1","MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0","MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0":"MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0","MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0":"MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0","MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1":"MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0","MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3":"MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0":"MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:0/MAP_CAVE_OF_ORIGIN_1F:1!":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:1/MAP_CAVE_OF_ORIGIN_B1F:0!":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_DESERT_RUINS:0/MAP_ROUTE111:1":"MAP_ROUTE111:1/MAP_DESERT_RUINS:0","MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2":"MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1","MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1":"MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2","MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0","MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0":"MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0","MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1","MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0":"MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2","MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0":"MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3","MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0":"MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4","MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2":"MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0","MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0":"MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0","MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3":"MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0","MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4":"MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1":"MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0","MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1","MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0":"MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2","MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1":"MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1":"MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0":"MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1":"MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0":"MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1":"MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0":"MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1","MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0","MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1","MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0","MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1","MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0","MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1","MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0","MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1","MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0","MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1","MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1":"MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0":"MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1":"MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0":"MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0":"MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1":"MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0":"MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1","MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0":"MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0","MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0":"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1","MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2","MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0":"MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3","MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0":"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4","MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1":"MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0","MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3":"MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0","MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0":"MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0","MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4":"MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2":"MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1":"MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1","MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1":"MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1","MAP_FIERY_PATH:0/MAP_ROUTE112:4":"MAP_ROUTE112:4/MAP_FIERY_PATH:0","MAP_FIERY_PATH:1/MAP_ROUTE112:5":"MAP_ROUTE112:5/MAP_FIERY_PATH:1","MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0","MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0":"MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1","MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0":"MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2","MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0":"MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3","MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0":"MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4","MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0":"MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5","MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0":"MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6","MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0":"MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7","MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0":"MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8","MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8":"MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0","MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2":"MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0","MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1":"MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0","MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4":"MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0","MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5":"MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0","MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6":"MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0","MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7":"MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0","MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3":"MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0":"MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2","MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0","MAP_FORTREE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FORTREE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0":"MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0","MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0":"MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1","MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1":"MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2","MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0":"MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3","MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1":"MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0","MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2":"MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1","MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0":"MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2","MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1":"MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3","MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2":"MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4","MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3":"MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5","MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4":"MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6","MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2":"MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0","MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3":"MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1","MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4":"MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2","MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5":"MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3","MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6":"MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4","MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3":"MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0","MAP_INSIDE_OF_TRUCK:0,1,2/MAP_DYNAMIC:-1!":"","MAP_ISLAND_CAVE:0/MAP_ROUTE105:0":"MAP_ROUTE105:0/MAP_ISLAND_CAVE:0","MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2":"MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1","MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1":"MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2","MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3":"MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1","MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3":"MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3","MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0":"MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4","MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0":"MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0","MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0":"MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1","MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0":"MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2","MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3","MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0":"MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4","MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5","MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1":"MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0","MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8":"MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10","MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9":"MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11","MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10":"MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12","MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11":"MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13","MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12":"MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14","MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13":"MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15","MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14":"MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16","MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15":"MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17","MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16":"MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18","MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17":"MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19","MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0":"MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2","MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18":"MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20","MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20":"MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21","MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19":"MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22","MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21":"MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23","MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22":"MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24","MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23":"MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25","MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2":"MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3","MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4":"MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4","MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3":"MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5","MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1":"MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6","MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5":"MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7","MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6":"MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8","MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7":"MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9","MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2":"MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0","MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6":"MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1","MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12":"MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10","MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13":"MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11","MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14":"MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12","MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15":"MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13","MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16":"MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14","MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17":"MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15","MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18":"MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16","MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19":"MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17","MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20":"MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18","MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22":"MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19","MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3":"MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2","MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21":"MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20","MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23":"MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21","MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24":"MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22","MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25":"MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23","MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5":"MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3","MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4":"MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4","MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7":"MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5","MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8":"MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6","MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9":"MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7","MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10":"MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8","MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11":"MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9","MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0":"MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0","MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4":"MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0","MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2":"MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3":"MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5":"MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0","MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1","MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0":"MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10","MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0":"MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11","MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0":"MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12","MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2","MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13","MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4","MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1":"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5","MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0":"MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6","MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0":"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7","MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0":"MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8","MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0":"MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9","MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0","MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1","MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4":"MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0","MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0":"MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2","MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1":"MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1":"MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:3/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!":"","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0","MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12":"MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0","MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8":"MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0","MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9":"MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0","MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10":"MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0","MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11":"MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13":"MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0","MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7":"MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2":"MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5":"MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1","MAP_LILYCOVE_CITY_UNUSED_MART:0,1/MAP_LILYCOVE_CITY:0!":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0","MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1","MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0":"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1":"MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0":"MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2":"MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0","MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4":"MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0","MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1":"MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1","MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1":"MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2","MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0":"MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3","MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0":"MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0","MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1":"MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1","MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2":"MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2","MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0":"MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0","MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2":"MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1","MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3":"MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0","MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0":"MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1","MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0":"MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0","MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0":"MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1","MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2":"MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2","MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1":"MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0","MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1":"MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0","MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1":"MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1","MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0":"MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0","MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1":"MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1","MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0":"MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0","MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0":"MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0","MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0":"MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0","MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1","MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0":"MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2","MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0":"MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3","MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0":"MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4","MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0":"MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5","MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0":"MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6","MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2":"MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0","MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5":"MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0","MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0":"MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0","MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4":"MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0","MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6":"MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0","MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3":"MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1":"MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0":"MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0","MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0":"MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1","MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0":"MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2","MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4":"MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3","MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5":"MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4","MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0":"MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5","MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2":"MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0","MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0":"MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1","MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1":"MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2","MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2":"MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3","MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1":"MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0","MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2":"MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1","MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3":"MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2","MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0":"MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3","MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3":"MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4","MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4":"MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5","MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3":"MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0","MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5":"MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0","MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3":"MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0","MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1":"MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1","MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0":"MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0","MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1":"MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1","MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0":"MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0","MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0":"MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1","MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1":"MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0","MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0":"MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0","MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0":"MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1","MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2","MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0":"MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3","MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0":"MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4","MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0":"MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5","MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0":"MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6","MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1":"MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7","MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8","MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9":"MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2","MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0","MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1":"MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0","MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11":"MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10","MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10":"MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11","MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13":"MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12","MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12":"MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13","MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3":"MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2","MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2":"MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3","MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5":"MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4","MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4":"MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5","MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7":"MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6","MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6":"MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7","MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9":"MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8","MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8":"MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9","MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0":"MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0","MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3":"MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0","MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5":"MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0","MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7":"MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1","MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4":"MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2":"MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8":"MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2","MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0","MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6":"MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0","MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1":"MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1","MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3":"MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3","MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1":"MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1","MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0":"MAP_ROUTE122:0/MAP_MT_PYRE_1F:0","MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0":"MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1","MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0":"MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4","MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4":"MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5","MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4":"MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0","MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0":"MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1","MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4":"MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2","MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5":"MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3","MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5":"MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4","MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1":"MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0","MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1":"MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1","MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4":"MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2","MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5":"MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3","MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2":"MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4","MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3":"MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5","MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1":"MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0","MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1":"MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1","MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3":"MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2","MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4":"MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3","MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2":"MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4","MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3":"MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5","MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0":"MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0","MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0":"MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1","MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1":"MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2","MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2":"MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3","MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3":"MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4","MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0":"MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0","MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2":"MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1","MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1":"MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0","MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1":"MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1","MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1":"MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1","MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0":"MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0","MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1":"MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1","MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0":"MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0","MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2":"MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0","MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0":"MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1","MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1":"MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0","MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0":"MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1","MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1":"MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0","MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0":"MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1","MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1":"MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0","MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0":"MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1","MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1":"MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0","MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0":"MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1","MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1":"MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0","MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0":"MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1","MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1":"MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0","MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0":"MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1","MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1":"MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0","MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0":"MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1","MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1":"MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0","MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0":"MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1","MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1":"MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0","MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1":"MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1","MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0":"MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0","MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1":"MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1","MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0":"MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0","MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1":"MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1","MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0":"MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0","MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1":"MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1","MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0":"MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0","MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1":"MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1","MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0":"MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2","MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0":"MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0","MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1":"MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0","MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0":"MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0","MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0":"MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1","MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1":"MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0","MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0":"MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1","MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1":"MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0","MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0":"MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1","MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1":"MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0","MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0":"MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1","MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0":"MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0","MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0":"MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1","MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1":"MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0","MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0":"MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0","MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0":"MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1","MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2","MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0":"MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3","MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0":"MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0","MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1":"MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0","MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3":"MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2":"MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0","MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0":"MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1","MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0":"MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2","MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0":"MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3","MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0":"MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4","MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0":"MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5","MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1":"MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0","MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2":"MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0","MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3":"MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0","MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4":"MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0","MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5":"MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0":"MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0":"MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0","MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0":"MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1","MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0":"MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2","MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3","MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0":"MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4","MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0":"MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5","MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2":"MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0","MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8":"MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10","MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9":"MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12","MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16":"MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14","MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18":"MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15","MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14":"MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16","MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15":"MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18","MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3":"MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2","MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24":"MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20","MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26":"MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21","MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28":"MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22","MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30":"MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23","MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20":"MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24","MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21":"MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26","MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22":"MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28","MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2":"MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3","MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23":"MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30","MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34":"MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32","MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36":"MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33","MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32":"MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34","MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33":"MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36","MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6":"MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5","MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5":"MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6","MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10":"MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8","MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12":"MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9","MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0":"MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0","MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4":"MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0","MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5":"MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3":"MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1":"MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0","MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3":"MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1","MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5":"MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3","MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7":"MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5","MAP_RECORD_CORNER:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_ROUTE103:0/MAP_ALTERING_CAVE:0":"MAP_ALTERING_CAVE:0/MAP_ROUTE103:0","MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0":"MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0","MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0":"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1","MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1":"MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3","MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3":"MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5","MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5":"MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7","MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0":"MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0","MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1":"MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0","MAP_ROUTE105:0/MAP_ISLAND_CAVE:0":"MAP_ISLAND_CAVE:0/MAP_ROUTE105:0","MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0":"MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0","MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0":"MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0","MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0":"MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0","MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0":"MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0","MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0":"MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0","MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1","MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2","MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3","MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4","MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4":"MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5":"MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2":"MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3":"MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1":"MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:2,3/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0","MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0":"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1":"MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0":"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0","MAP_ROUTE111:1/MAP_DESERT_RUINS:0":"MAP_DESERT_RUINS:0/MAP_ROUTE111:1","MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0":"MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2","MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0":"MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3","MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0":"MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4","MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2":"MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0","MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0":"MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0","MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1":"MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1","MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1":"MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3","MAP_ROUTE112:4/MAP_FIERY_PATH:0":"MAP_FIERY_PATH:0/MAP_ROUTE112:4","MAP_ROUTE112:5/MAP_FIERY_PATH:1":"MAP_FIERY_PATH:1/MAP_ROUTE112:5","MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1":"MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1","MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0":"MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0","MAP_ROUTE113:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0":"MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0","MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0":"MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0","MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1","MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0":"MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2","MAP_ROUTE114:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1":"MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0":"MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2","MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2":"MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0","MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1":"MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0","MAP_ROUTE115:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE115:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0":"MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0","MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0":"MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1","MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2":"MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2","MAP_ROUTE116:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1":"MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0","MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0":"MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0","MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0":"MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0","MAP_ROUTE118:0/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE118:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0","MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0":"MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1","MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1":"MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0":"MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2","MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0","MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0":"MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0","MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0":"MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1","MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0":"MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0":"MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2","MAP_ROUTE122:0/MAP_MT_PYRE_1F:0":"MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0","MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0":"MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0","MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0":"MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0","MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0":"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0","MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0":"MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0","MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0","MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0":"MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0","MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0":"MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0","MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0":"MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1","MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0":"MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10","MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0":"MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11","MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0":"MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2","MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3","MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0":"MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4","MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6","MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0":"MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7","MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0":"MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8","MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0":"MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9","MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8":"MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0","MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6":"MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1","MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2","MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0","MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1","MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0","MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1":"MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0","MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0":"MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2","MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2":"MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0","MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10":"MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0","MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0":"MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2","MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2":"MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0","MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0":"MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1","MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1":"MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0","MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0":"MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0","MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7":"MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0","MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9":"MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0","MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11":"MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0","MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2":"MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3":"MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4":"MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0","MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0":"MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0","MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4":"MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1","MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2":"MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2","MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0":"MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0","MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0","MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0":"MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0","MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1":"MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:0/MAP_UNDERWATER_ROUTE128:0!":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0":"MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1","MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0":"MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1","MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0":"MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2","MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2":"MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0","MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0":"MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1","MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0":"MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2","MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0":"MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3","MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1":"MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0","MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1":"MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1","MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1":"MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2","MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1":"MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0","MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1":"MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1","MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2":"MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2","MAP_SEAFLOOR_CAVERN_ROOM4:3/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1":"MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0","MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1":"MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1","MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2":"MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2","MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2":"MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0","MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2":"MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1","MAP_SEAFLOOR_CAVERN_ROOM6:2/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3":"MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0","MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1":"MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1","MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0":"MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0","MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0":"MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1","MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0":"MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0","MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0":"MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0","MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0":"MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0","MAP_SECRET_BASE_BLUE_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0":"MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1","MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1":"MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0","MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0":"MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2","MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2":"MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0","MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0":"MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1","MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1":"MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0","MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0":"MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1","MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1":"MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2","MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1":"MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0","MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2":"MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1","MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0":"MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2","MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2":"MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0","MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0":"MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1","MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0":"MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0","MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0":"MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1","MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1":"MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0","MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0":"MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1","MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1":"MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0","MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0","MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0":"MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1","MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0":"MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10","MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2","MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0":"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3","MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0":"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4","MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7","MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0":"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6","MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0":"MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8","MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2":"MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9","MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3":"MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0","MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8":"MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0","MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9":"MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2","MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10":"MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0","MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1":"MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0","MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6":"MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7":"MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0":"MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4":"MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2":"MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0","MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0","MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0":"MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1","MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0":"MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10","MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0":"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11","MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12","MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0":"MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2","MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0":"MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3","MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0":"MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4","MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0":"MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5","MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0":"MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6","MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0":"MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7","MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0":"MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8","MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0":"MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9","MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2":"MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0","MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0":"MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2","MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2":"MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0","MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4":"MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0","MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5":"MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0","MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6":"MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0","MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7":"MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0","MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8":"MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0","MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9":"MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0","MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10":"MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0","MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11":"MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0","MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1":"MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12":"MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0":"MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1":"MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1","MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1":"MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1","MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0":"MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0","MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2":"MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1","MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4":"MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2","MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6":"MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3","MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8":"MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4","MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9":"MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5","MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10":"MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6","MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11":"MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7","MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0":"MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8","MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8":"MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0","MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0":"MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0","MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6":"MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10","MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7":"MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11","MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1":"MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2","MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2":"MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4","MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3":"MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6","MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4":"MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8","MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5":"MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9","MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1":"MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0","MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!":"","MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0":"MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1","MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!":"","MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2":"MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0","MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0":"MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1","MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1":"MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0","MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0":"MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1","MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1":"MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0","MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0":"MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1","MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1":"MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0","MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0":"MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1","MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1":"MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1","MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4":"MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0","MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0":"MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2","MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1":"MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0","MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1":"MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1","MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!":"","MAP_UNDERWATER_ROUTE105:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE105:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0":"MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0","MAP_UNDERWATER_ROUTE127:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE127:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0":"MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0","MAP_UNDERWATER_ROUTE129:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE129:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0":"MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0","MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0":"MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0","MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0":"MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0","MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!":"","MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0":"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0","MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0":"MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1","MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2","MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0":"MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3","MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1":"MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4","MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0":"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5","MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0":"MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6","MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0":"MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0","MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5":"MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0","MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6":"MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0","MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1":"MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2":"MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3":"MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0","MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2":"MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0","MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3":"MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1","MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5":"MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2","MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2":"MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3","MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4":"MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4","MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0":"MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0","MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2":"MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1","MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3":"MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2","MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1":"MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3","MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4":"MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4","MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2":"MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5","MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3":"MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6","MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0":"MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0","MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3":"MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1","MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1":"MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2","MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6":"MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3"}} +{"_comment":"DO NOT MODIFY. This file was auto-generated. Your changes will likely be overwritten.","_rom_name":"pokemon emerald version / AP 5","constants":{"ABILITIES_COUNT":78,"ABILITY_AIR_LOCK":77,"ABILITY_ARENA_TRAP":71,"ABILITY_BATTLE_ARMOR":4,"ABILITY_BLAZE":66,"ABILITY_CACOPHONY":76,"ABILITY_CHLOROPHYLL":34,"ABILITY_CLEAR_BODY":29,"ABILITY_CLOUD_NINE":13,"ABILITY_COLOR_CHANGE":16,"ABILITY_COMPOUND_EYES":14,"ABILITY_CUTE_CHARM":56,"ABILITY_DAMP":6,"ABILITY_DRIZZLE":2,"ABILITY_DROUGHT":70,"ABILITY_EARLY_BIRD":48,"ABILITY_EFFECT_SPORE":27,"ABILITY_FLAME_BODY":49,"ABILITY_FLASH_FIRE":18,"ABILITY_FORECAST":59,"ABILITY_GUTS":62,"ABILITY_HUGE_POWER":37,"ABILITY_HUSTLE":55,"ABILITY_HYPER_CUTTER":52,"ABILITY_ILLUMINATE":35,"ABILITY_IMMUNITY":17,"ABILITY_INNER_FOCUS":39,"ABILITY_INSOMNIA":15,"ABILITY_INTIMIDATE":22,"ABILITY_KEEN_EYE":51,"ABILITY_LEVITATE":26,"ABILITY_LIGHTNING_ROD":31,"ABILITY_LIMBER":7,"ABILITY_LIQUID_OOZE":64,"ABILITY_MAGMA_ARMOR":40,"ABILITY_MAGNET_PULL":42,"ABILITY_MARVEL_SCALE":63,"ABILITY_MINUS":58,"ABILITY_NATURAL_CURE":30,"ABILITY_NONE":0,"ABILITY_OBLIVIOUS":12,"ABILITY_OVERGROW":65,"ABILITY_OWN_TEMPO":20,"ABILITY_PICKUP":53,"ABILITY_PLUS":57,"ABILITY_POISON_POINT":38,"ABILITY_PRESSURE":46,"ABILITY_PURE_POWER":74,"ABILITY_RAIN_DISH":44,"ABILITY_ROCK_HEAD":69,"ABILITY_ROUGH_SKIN":24,"ABILITY_RUN_AWAY":50,"ABILITY_SAND_STREAM":45,"ABILITY_SAND_VEIL":8,"ABILITY_SERENE_GRACE":32,"ABILITY_SHADOW_TAG":23,"ABILITY_SHED_SKIN":61,"ABILITY_SHELL_ARMOR":75,"ABILITY_SHIELD_DUST":19,"ABILITY_SOUNDPROOF":43,"ABILITY_SPEED_BOOST":3,"ABILITY_STATIC":9,"ABILITY_STENCH":1,"ABILITY_STICKY_HOLD":60,"ABILITY_STURDY":5,"ABILITY_SUCTION_CUPS":21,"ABILITY_SWARM":68,"ABILITY_SWIFT_SWIM":33,"ABILITY_SYNCHRONIZE":28,"ABILITY_THICK_FAT":47,"ABILITY_TORRENT":67,"ABILITY_TRACE":36,"ABILITY_TRUANT":54,"ABILITY_VITAL_SPIRIT":72,"ABILITY_VOLT_ABSORB":10,"ABILITY_WATER_ABSORB":11,"ABILITY_WATER_VEIL":41,"ABILITY_WHITE_SMOKE":73,"ABILITY_WONDER_GUARD":25,"ACRO_BIKE":1,"BAG_ITEM_CAPACITY_DIGITS":2,"BERRY_CAPACITY_DIGITS":3,"BERRY_FIRMNESS_HARD":3,"BERRY_FIRMNESS_SOFT":2,"BERRY_FIRMNESS_SUPER_HARD":5,"BERRY_FIRMNESS_UNKNOWN":0,"BERRY_FIRMNESS_VERY_HARD":4,"BERRY_FIRMNESS_VERY_SOFT":1,"BERRY_NONE":0,"BERRY_STAGE_BERRIES":5,"BERRY_STAGE_FLOWERING":4,"BERRY_STAGE_NO_BERRY":0,"BERRY_STAGE_PLANTED":1,"BERRY_STAGE_SPARKLING":255,"BERRY_STAGE_SPROUTED":2,"BERRY_STAGE_TALLER":3,"BERRY_TREES_COUNT":128,"BERRY_TREE_ROUTE_102_ORAN":2,"BERRY_TREE_ROUTE_102_PECHA":1,"BERRY_TREE_ROUTE_103_CHERI_1":5,"BERRY_TREE_ROUTE_103_CHERI_2":7,"BERRY_TREE_ROUTE_103_LEPPA":6,"BERRY_TREE_ROUTE_104_CHERI_1":8,"BERRY_TREE_ROUTE_104_CHERI_2":76,"BERRY_TREE_ROUTE_104_LEPPA":10,"BERRY_TREE_ROUTE_104_ORAN_1":4,"BERRY_TREE_ROUTE_104_ORAN_2":11,"BERRY_TREE_ROUTE_104_PECHA":13,"BERRY_TREE_ROUTE_104_SOIL_1":3,"BERRY_TREE_ROUTE_104_SOIL_2":9,"BERRY_TREE_ROUTE_104_SOIL_3":12,"BERRY_TREE_ROUTE_104_SOIL_4":75,"BERRY_TREE_ROUTE_110_NANAB_1":16,"BERRY_TREE_ROUTE_110_NANAB_2":17,"BERRY_TREE_ROUTE_110_NANAB_3":18,"BERRY_TREE_ROUTE_111_ORAN_1":80,"BERRY_TREE_ROUTE_111_ORAN_2":81,"BERRY_TREE_ROUTE_111_RAZZ_1":19,"BERRY_TREE_ROUTE_111_RAZZ_2":20,"BERRY_TREE_ROUTE_112_PECHA_1":22,"BERRY_TREE_ROUTE_112_PECHA_2":23,"BERRY_TREE_ROUTE_112_RAWST_1":21,"BERRY_TREE_ROUTE_112_RAWST_2":24,"BERRY_TREE_ROUTE_114_PERSIM_1":68,"BERRY_TREE_ROUTE_114_PERSIM_2":77,"BERRY_TREE_ROUTE_114_PERSIM_3":78,"BERRY_TREE_ROUTE_115_BLUK_1":55,"BERRY_TREE_ROUTE_115_BLUK_2":56,"BERRY_TREE_ROUTE_115_KELPSY_1":69,"BERRY_TREE_ROUTE_115_KELPSY_2":70,"BERRY_TREE_ROUTE_115_KELPSY_3":71,"BERRY_TREE_ROUTE_116_CHESTO_1":26,"BERRY_TREE_ROUTE_116_CHESTO_2":66,"BERRY_TREE_ROUTE_116_PINAP_1":25,"BERRY_TREE_ROUTE_116_PINAP_2":67,"BERRY_TREE_ROUTE_117_WEPEAR_1":27,"BERRY_TREE_ROUTE_117_WEPEAR_2":28,"BERRY_TREE_ROUTE_117_WEPEAR_3":29,"BERRY_TREE_ROUTE_118_SITRUS_1":31,"BERRY_TREE_ROUTE_118_SITRUS_2":33,"BERRY_TREE_ROUTE_118_SOIL":32,"BERRY_TREE_ROUTE_119_HONDEW_1":83,"BERRY_TREE_ROUTE_119_HONDEW_2":84,"BERRY_TREE_ROUTE_119_LEPPA":86,"BERRY_TREE_ROUTE_119_POMEG_1":34,"BERRY_TREE_ROUTE_119_POMEG_2":35,"BERRY_TREE_ROUTE_119_POMEG_3":36,"BERRY_TREE_ROUTE_119_SITRUS":85,"BERRY_TREE_ROUTE_120_ASPEAR_1":37,"BERRY_TREE_ROUTE_120_ASPEAR_2":38,"BERRY_TREE_ROUTE_120_ASPEAR_3":39,"BERRY_TREE_ROUTE_120_NANAB":44,"BERRY_TREE_ROUTE_120_PECHA_1":40,"BERRY_TREE_ROUTE_120_PECHA_2":41,"BERRY_TREE_ROUTE_120_PECHA_3":42,"BERRY_TREE_ROUTE_120_PINAP":45,"BERRY_TREE_ROUTE_120_RAZZ":43,"BERRY_TREE_ROUTE_120_WEPEAR":46,"BERRY_TREE_ROUTE_121_ASPEAR":48,"BERRY_TREE_ROUTE_121_CHESTO":50,"BERRY_TREE_ROUTE_121_NANAB_1":52,"BERRY_TREE_ROUTE_121_NANAB_2":53,"BERRY_TREE_ROUTE_121_PERSIM":47,"BERRY_TREE_ROUTE_121_RAWST":49,"BERRY_TREE_ROUTE_121_SOIL_1":51,"BERRY_TREE_ROUTE_121_SOIL_2":54,"BERRY_TREE_ROUTE_123_GREPA_1":60,"BERRY_TREE_ROUTE_123_GREPA_2":61,"BERRY_TREE_ROUTE_123_GREPA_3":65,"BERRY_TREE_ROUTE_123_GREPA_4":72,"BERRY_TREE_ROUTE_123_LEPPA_1":62,"BERRY_TREE_ROUTE_123_LEPPA_2":64,"BERRY_TREE_ROUTE_123_PECHA":87,"BERRY_TREE_ROUTE_123_POMEG_1":15,"BERRY_TREE_ROUTE_123_POMEG_2":30,"BERRY_TREE_ROUTE_123_POMEG_3":58,"BERRY_TREE_ROUTE_123_POMEG_4":59,"BERRY_TREE_ROUTE_123_QUALOT_1":14,"BERRY_TREE_ROUTE_123_QUALOT_2":73,"BERRY_TREE_ROUTE_123_QUALOT_3":74,"BERRY_TREE_ROUTE_123_QUALOT_4":79,"BERRY_TREE_ROUTE_123_RAWST":57,"BERRY_TREE_ROUTE_123_SITRUS":88,"BERRY_TREE_ROUTE_123_SOIL":63,"BERRY_TREE_ROUTE_130_LIECHI":82,"DAILY_FLAGS_END":2399,"DAILY_FLAGS_START":2336,"FIRST_BALL":1,"FIRST_BERRY_INDEX":133,"FIRST_BERRY_MASTER_BERRY":153,"FIRST_BERRY_MASTER_WIFE_BERRY":133,"FIRST_KIRI_BERRY":153,"FIRST_MAIL_INDEX":121,"FIRST_ROUTE_114_MAN_BERRY":148,"FLAGS_COUNT":2400,"FLAG_ADDED_MATCH_CALL_TO_POKENAV":304,"FLAG_ADVENTURE_STARTED":116,"FLAG_ARRIVED_AT_MARINE_CAVE_EMERGE_SPOT":2265,"FLAG_ARRIVED_AT_NAVEL_ROCK":2273,"FLAG_ARRIVED_AT_TERRA_CAVE_ENTRANCE":2266,"FLAG_ARRIVED_ON_FARAWAY_ISLAND":2264,"FLAG_BADGE01_GET":2151,"FLAG_BADGE02_GET":2152,"FLAG_BADGE03_GET":2153,"FLAG_BADGE04_GET":2154,"FLAG_BADGE05_GET":2155,"FLAG_BADGE06_GET":2156,"FLAG_BADGE07_GET":2157,"FLAG_BADGE08_GET":2158,"FLAG_BATTLE_FRONTIER_TRADE_DONE":156,"FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS":313,"FLAG_BEAUTY_PAINTING_MADE":161,"FLAG_BERRY_MASTERS_WIFE":1197,"FLAG_BERRY_MASTER_RECEIVED_BERRY_1":1195,"FLAG_BERRY_MASTER_RECEIVED_BERRY_2":1196,"FLAG_BERRY_TREES_START":612,"FLAG_BERRY_TREE_01":612,"FLAG_BERRY_TREE_02":613,"FLAG_BERRY_TREE_03":614,"FLAG_BERRY_TREE_04":615,"FLAG_BERRY_TREE_05":616,"FLAG_BERRY_TREE_06":617,"FLAG_BERRY_TREE_07":618,"FLAG_BERRY_TREE_08":619,"FLAG_BERRY_TREE_09":620,"FLAG_BERRY_TREE_10":621,"FLAG_BERRY_TREE_11":622,"FLAG_BERRY_TREE_12":623,"FLAG_BERRY_TREE_13":624,"FLAG_BERRY_TREE_14":625,"FLAG_BERRY_TREE_15":626,"FLAG_BERRY_TREE_16":627,"FLAG_BERRY_TREE_17":628,"FLAG_BERRY_TREE_18":629,"FLAG_BERRY_TREE_19":630,"FLAG_BERRY_TREE_20":631,"FLAG_BERRY_TREE_21":632,"FLAG_BERRY_TREE_22":633,"FLAG_BERRY_TREE_23":634,"FLAG_BERRY_TREE_24":635,"FLAG_BERRY_TREE_25":636,"FLAG_BERRY_TREE_26":637,"FLAG_BERRY_TREE_27":638,"FLAG_BERRY_TREE_28":639,"FLAG_BERRY_TREE_29":640,"FLAG_BERRY_TREE_30":641,"FLAG_BERRY_TREE_31":642,"FLAG_BERRY_TREE_32":643,"FLAG_BERRY_TREE_33":644,"FLAG_BERRY_TREE_34":645,"FLAG_BERRY_TREE_35":646,"FLAG_BERRY_TREE_36":647,"FLAG_BERRY_TREE_37":648,"FLAG_BERRY_TREE_38":649,"FLAG_BERRY_TREE_39":650,"FLAG_BERRY_TREE_40":651,"FLAG_BERRY_TREE_41":652,"FLAG_BERRY_TREE_42":653,"FLAG_BERRY_TREE_43":654,"FLAG_BERRY_TREE_44":655,"FLAG_BERRY_TREE_45":656,"FLAG_BERRY_TREE_46":657,"FLAG_BERRY_TREE_47":658,"FLAG_BERRY_TREE_48":659,"FLAG_BERRY_TREE_49":660,"FLAG_BERRY_TREE_50":661,"FLAG_BERRY_TREE_51":662,"FLAG_BERRY_TREE_52":663,"FLAG_BERRY_TREE_53":664,"FLAG_BERRY_TREE_54":665,"FLAG_BERRY_TREE_55":666,"FLAG_BERRY_TREE_56":667,"FLAG_BERRY_TREE_57":668,"FLAG_BERRY_TREE_58":669,"FLAG_BERRY_TREE_59":670,"FLAG_BERRY_TREE_60":671,"FLAG_BERRY_TREE_61":672,"FLAG_BERRY_TREE_62":673,"FLAG_BERRY_TREE_63":674,"FLAG_BERRY_TREE_64":675,"FLAG_BERRY_TREE_65":676,"FLAG_BERRY_TREE_66":677,"FLAG_BERRY_TREE_67":678,"FLAG_BERRY_TREE_68":679,"FLAG_BERRY_TREE_69":680,"FLAG_BERRY_TREE_70":681,"FLAG_BERRY_TREE_71":682,"FLAG_BERRY_TREE_72":683,"FLAG_BERRY_TREE_73":684,"FLAG_BERRY_TREE_74":685,"FLAG_BERRY_TREE_75":686,"FLAG_BERRY_TREE_76":687,"FLAG_BERRY_TREE_77":688,"FLAG_BERRY_TREE_78":689,"FLAG_BERRY_TREE_79":690,"FLAG_BERRY_TREE_80":691,"FLAG_BERRY_TREE_81":692,"FLAG_BERRY_TREE_82":693,"FLAG_BERRY_TREE_83":694,"FLAG_BERRY_TREE_84":695,"FLAG_BERRY_TREE_85":696,"FLAG_BERRY_TREE_86":697,"FLAG_BERRY_TREE_87":698,"FLAG_BERRY_TREE_88":699,"FLAG_BETTER_SHOPS_ENABLED":206,"FLAG_BIRCH_AIDE_MET":88,"FLAG_CANCEL_BATTLE_ROOM_CHALLENGE":119,"FLAG_CAUGHT_DEOXYS":429,"FLAG_CAUGHT_GROUDON":480,"FLAG_CAUGHT_HO_OH":146,"FLAG_CAUGHT_KYOGRE":479,"FLAG_CAUGHT_LATIAS":457,"FLAG_CAUGHT_LATIOS":482,"FLAG_CAUGHT_LUGIA":145,"FLAG_CAUGHT_MEW":458,"FLAG_CAUGHT_RAYQUAZA":478,"FLAG_CAUGHT_REGICE":427,"FLAG_CAUGHT_REGIROCK":426,"FLAG_CAUGHT_REGISTEEL":483,"FLAG_CHOSEN_MULTI_BATTLE_NPC_PARTNER":338,"FLAG_CHOSE_CLAW_FOSSIL":336,"FLAG_CHOSE_ROOT_FOSSIL":335,"FLAG_COLLECTED_ALL_GOLD_SYMBOLS":466,"FLAG_COLLECTED_ALL_SILVER_SYMBOLS":92,"FLAG_CONTEST_SKETCH_CREATED":270,"FLAG_COOL_PAINTING_MADE":160,"FLAG_CUTE_PAINTING_MADE":162,"FLAG_DAILY_APPRENTICE_LEAVES":2356,"FLAG_DAILY_BERRY_MASTERS_WIFE":2353,"FLAG_DAILY_BERRY_MASTER_RECEIVED_BERRY":2349,"FLAG_DAILY_CONTEST_LOBBY_RECEIVED_BERRY":2337,"FLAG_DAILY_FLOWER_SHOP_RECEIVED_BERRY":2352,"FLAG_DAILY_LILYCOVE_RECEIVED_BERRY":2351,"FLAG_DAILY_PICKED_LOTO_TICKET":2346,"FLAG_DAILY_ROUTE_111_RECEIVED_BERRY":2348,"FLAG_DAILY_ROUTE_114_RECEIVED_BERRY":2347,"FLAG_DAILY_ROUTE_120_RECEIVED_BERRY":2350,"FLAG_DAILY_SECRET_BASE":2338,"FLAG_DAILY_SOOTOPOLIS_RECEIVED_BERRY":2354,"FLAG_DECLINED_BIKE":89,"FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE":286,"FLAG_DECLINED_WALLY_BATTLE_MAUVILLE":284,"FLAG_DECORATION_1":174,"FLAG_DECORATION_10":183,"FLAG_DECORATION_11":184,"FLAG_DECORATION_12":185,"FLAG_DECORATION_13":186,"FLAG_DECORATION_14":187,"FLAG_DECORATION_2":175,"FLAG_DECORATION_3":176,"FLAG_DECORATION_4":177,"FLAG_DECORATION_5":178,"FLAG_DECORATION_6":179,"FLAG_DECORATION_7":180,"FLAG_DECORATION_8":181,"FLAG_DECORATION_9":182,"FLAG_DEFEATED_DEOXYS":428,"FLAG_DEFEATED_DEWFORD_GYM":1265,"FLAG_DEFEATED_ELECTRODE_1_AQUA_HIDEOUT":452,"FLAG_DEFEATED_ELECTRODE_2_AQUA_HIDEOUT":453,"FLAG_DEFEATED_ELITE_4_DRAKE":1278,"FLAG_DEFEATED_ELITE_4_GLACIA":1277,"FLAG_DEFEATED_ELITE_4_PHOEBE":1276,"FLAG_DEFEATED_ELITE_4_SIDNEY":1275,"FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY":139,"FLAG_DEFEATED_FORTREE_GYM":1269,"FLAG_DEFEATED_GROUDON":447,"FLAG_DEFEATED_GRUNT_SPACE_CENTER_1F":191,"FLAG_DEFEATED_HO_OH":476,"FLAG_DEFEATED_KECLEON_1_ROUTE_119":989,"FLAG_DEFEATED_KECLEON_1_ROUTE_120":982,"FLAG_DEFEATED_KECLEON_2_ROUTE_119":990,"FLAG_DEFEATED_KECLEON_2_ROUTE_120":985,"FLAG_DEFEATED_KECLEON_3_ROUTE_120":986,"FLAG_DEFEATED_KECLEON_4_ROUTE_120":987,"FLAG_DEFEATED_KECLEON_5_ROUTE_120":988,"FLAG_DEFEATED_KEKLEON_ROUTE_120_BRIDGE":970,"FLAG_DEFEATED_KYOGRE":446,"FLAG_DEFEATED_LATIAS":456,"FLAG_DEFEATED_LATIOS":481,"FLAG_DEFEATED_LAVARIDGE_GYM":1267,"FLAG_DEFEATED_LUGIA":477,"FLAG_DEFEATED_MAGMA_SPACE_CENTER":117,"FLAG_DEFEATED_MAUVILLE_GYM":1266,"FLAG_DEFEATED_METEOR_FALLS_STEVEN":1272,"FLAG_DEFEATED_MEW":455,"FLAG_DEFEATED_MOSSDEEP_GYM":1270,"FLAG_DEFEATED_PETALBURG_GYM":1268,"FLAG_DEFEATED_RAYQUAZA":448,"FLAG_DEFEATED_REGICE":444,"FLAG_DEFEATED_REGIROCK":443,"FLAG_DEFEATED_REGISTEEL":445,"FLAG_DEFEATED_RIVAL_ROUTE103":130,"FLAG_DEFEATED_RIVAL_ROUTE_104":125,"FLAG_DEFEATED_RIVAL_RUSTBORO":211,"FLAG_DEFEATED_RUSTBORO_GYM":1264,"FLAG_DEFEATED_SEASHORE_HOUSE":141,"FLAG_DEFEATED_SOOTOPOLIS_GYM":1271,"FLAG_DEFEATED_SS_TIDAL_TRAINERS":247,"FLAG_DEFEATED_SUDOWOODO":454,"FLAG_DEFEATED_VOLTORB_1_NEW_MAUVILLE":449,"FLAG_DEFEATED_VOLTORB_2_NEW_MAUVILLE":450,"FLAG_DEFEATED_VOLTORB_3_NEW_MAUVILLE":451,"FLAG_DEFEATED_WALLY_MAUVILLE":190,"FLAG_DEFEATED_WALLY_VICTORY_ROAD":126,"FLAG_DELIVERED_DEVON_GOODS":149,"FLAG_DELIVERED_STEVEN_LETTER":189,"FLAG_DEOXYS_IS_RECOVERING":1258,"FLAG_DEOXYS_ROCK_COMPLETE":2260,"FLAG_DEVON_GOODS_STOLEN":142,"FLAG_DOCK_REJECTED_DEVON_GOODS":148,"FLAG_DONT_TRANSITION_MUSIC":16385,"FLAG_ENABLE_BRAWLY_MATCH_CALL":468,"FLAG_ENABLE_FIRST_WALLY_POKENAV_CALL":136,"FLAG_ENABLE_FLANNERY_MATCH_CALL":470,"FLAG_ENABLE_JUAN_MATCH_CALL":473,"FLAG_ENABLE_MOM_MATCH_CALL":216,"FLAG_ENABLE_MR_STONE_POKENAV":344,"FLAG_ENABLE_MULTI_CORRIDOR_DOOR":16386,"FLAG_ENABLE_NORMAN_MATCH_CALL":306,"FLAG_ENABLE_PROF_BIRCH_MATCH_CALL":281,"FLAG_ENABLE_RIVAL_MATCH_CALL":253,"FLAG_ENABLE_ROXANNE_FIRST_CALL":128,"FLAG_ENABLE_ROXANNE_MATCH_CALL":467,"FLAG_ENABLE_SCOTT_MATCH_CALL":215,"FLAG_ENABLE_SHIP_BIRTH_ISLAND":2261,"FLAG_ENABLE_SHIP_FARAWAY_ISLAND":2262,"FLAG_ENABLE_SHIP_NAVEL_ROCK":2272,"FLAG_ENABLE_SHIP_SOUTHERN_ISLAND":2227,"FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL":472,"FLAG_ENABLE_WALLY_MATCH_CALL":214,"FLAG_ENABLE_WATTSON_MATCH_CALL":469,"FLAG_ENABLE_WINONA_MATCH_CALL":471,"FLAG_ENTERED_CONTEST":341,"FLAG_ENTERED_ELITE_FOUR":263,"FLAG_ENTERED_MIRAGE_TOWER":2268,"FLAG_EVIL_LEADER_PLEASE_STOP":219,"FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE":271,"FLAG_EXCHANGED_SCANNER":294,"FLAG_FAN_CLUB_STRENGTH_SHARED":210,"FLAG_FLOWER_SHOP_RECEIVED_BERRY":1207,"FLAG_FORCE_MIRAGE_TOWER_VISIBLE":157,"FLAG_FORTREE_NPC_TRADE_COMPLETED":155,"FLAG_GOOD_LUCK_SAFARI_ZONE":93,"FLAG_GOT_BASEMENT_KEY_FROM_WATTSON":208,"FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON":209,"FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT":111,"FLAG_GROUDON_IS_RECOVERING":1274,"FLAG_HAS_MATCH_CALL":303,"FLAG_HIDDEN_ITEMS_START":500,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":531,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":532,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":533,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":534,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":601,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":604,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":603,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":602,"FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":528,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":548,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":549,"FLAG_HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":577,"FLAG_HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":576,"FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":500,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":527,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":575,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":543,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":578,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":529,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":580,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":579,"FLAG_HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":609,"FLAG_HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":595,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":561,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POTION":558,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":559,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":560,"FLAG_HIDDEN_ITEM_ROUTE_104_ANTIDOTE":585,"FLAG_HIDDEN_ITEM_ROUTE_104_HEART_SCALE":588,"FLAG_HIDDEN_ITEM_ROUTE_104_POKE_BALL":562,"FLAG_HIDDEN_ITEM_ROUTE_104_POTION":537,"FLAG_HIDDEN_ITEM_ROUTE_104_SUPER_POTION":544,"FLAG_HIDDEN_ITEM_ROUTE_105_BIG_PEARL":611,"FLAG_HIDDEN_ITEM_ROUTE_105_HEART_SCALE":589,"FLAG_HIDDEN_ITEM_ROUTE_106_HEART_SCALE":547,"FLAG_HIDDEN_ITEM_ROUTE_106_POKE_BALL":563,"FLAG_HIDDEN_ITEM_ROUTE_106_STARDUST":546,"FLAG_HIDDEN_ITEM_ROUTE_108_RARE_CANDY":586,"FLAG_HIDDEN_ITEM_ROUTE_109_ETHER":564,"FLAG_HIDDEN_ITEM_ROUTE_109_GREAT_BALL":551,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":552,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":590,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":591,"FLAG_HIDDEN_ITEM_ROUTE_109_REVIVE":550,"FLAG_HIDDEN_ITEM_ROUTE_110_FULL_HEAL":555,"FLAG_HIDDEN_ITEM_ROUTE_110_GREAT_BALL":553,"FLAG_HIDDEN_ITEM_ROUTE_110_POKE_BALL":565,"FLAG_HIDDEN_ITEM_ROUTE_110_REVIVE":554,"FLAG_HIDDEN_ITEM_ROUTE_111_PROTEIN":556,"FLAG_HIDDEN_ITEM_ROUTE_111_RARE_CANDY":557,"FLAG_HIDDEN_ITEM_ROUTE_111_STARDUST":502,"FLAG_HIDDEN_ITEM_ROUTE_113_ETHER":503,"FLAG_HIDDEN_ITEM_ROUTE_113_NUGGET":598,"FLAG_HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":530,"FLAG_HIDDEN_ITEM_ROUTE_114_CARBOS":504,"FLAG_HIDDEN_ITEM_ROUTE_114_REVIVE":542,"FLAG_HIDDEN_ITEM_ROUTE_115_HEART_SCALE":597,"FLAG_HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":596,"FLAG_HIDDEN_ITEM_ROUTE_116_SUPER_POTION":545,"FLAG_HIDDEN_ITEM_ROUTE_117_REPEL":572,"FLAG_HIDDEN_ITEM_ROUTE_118_HEART_SCALE":566,"FLAG_HIDDEN_ITEM_ROUTE_118_IRON":567,"FLAG_HIDDEN_ITEM_ROUTE_119_CALCIUM":505,"FLAG_HIDDEN_ITEM_ROUTE_119_FULL_HEAL":568,"FLAG_HIDDEN_ITEM_ROUTE_119_MAX_ETHER":587,"FLAG_HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":506,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":571,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":569,"FLAG_HIDDEN_ITEM_ROUTE_120_REVIVE":584,"FLAG_HIDDEN_ITEM_ROUTE_120_ZINC":570,"FLAG_HIDDEN_ITEM_ROUTE_121_FULL_HEAL":573,"FLAG_HIDDEN_ITEM_ROUTE_121_HP_UP":539,"FLAG_HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":600,"FLAG_HIDDEN_ITEM_ROUTE_121_NUGGET":540,"FLAG_HIDDEN_ITEM_ROUTE_123_HYPER_POTION":574,"FLAG_HIDDEN_ITEM_ROUTE_123_PP_UP":599,"FLAG_HIDDEN_ITEM_ROUTE_123_RARE_CANDY":610,"FLAG_HIDDEN_ITEM_ROUTE_123_REVIVE":541,"FLAG_HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":507,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":592,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":593,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":594,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":606,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":607,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":605,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":608,"FLAG_HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":535,"FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET":501,"FLAG_HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":511,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CALCIUM":536,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CARBOS":508,"FLAG_HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":509,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":513,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":538,"FLAG_HIDDEN_ITEM_UNDERWATER_124_PEARL":510,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":520,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":512,"FLAG_HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":514,"FLAG_HIDDEN_ITEM_UNDERWATER_126_IRON":519,"FLAG_HIDDEN_ITEM_UNDERWATER_126_PEARL":517,"FLAG_HIDDEN_ITEM_UNDERWATER_126_STARDUST":516,"FLAG_HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":515,"FLAG_HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":518,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":523,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HP_UP":522,"FLAG_HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":524,"FLAG_HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":521,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PEARL":526,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PROTEIN":525,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":581,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":582,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":583,"FLAG_HIDE_APPRENTICE":701,"FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNTS_BLOCKING_ENTRANCE":821,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_1":977,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_2":978,"FLAG_HIDE_AQUA_HIDEOUT_B2F_SUBMARINE_SHADOW":943,"FLAG_HIDE_AQUA_HIDEOUT_GRUNTS":924,"FLAG_HIDE_BATTLE_FRONTIER_RECEPTION_GATE_SCOTT":836,"FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO":842,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_1":711,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_2":712,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_3":713,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_4":714,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_5":715,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_6":716,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_1":864,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_2":865,"FLAG_HIDE_BATTLE_TOWER_OPPONENT":888,"FLAG_HIDE_BATTLE_TOWER_REPORTER":918,"FLAG_HIDE_BIRTH_ISLAND_DEOXYS_TRIANGLE":764,"FLAG_HIDE_BRINEYS_HOUSE_MR_BRINEY":739,"FLAG_HIDE_BRINEYS_HOUSE_PEEKO":881,"FLAG_HIDE_CAVE_OF_ORIGIN_B1F_WALLACE":820,"FLAG_HIDE_CHAMPIONS_ROOM_BIRCH":921,"FLAG_HIDE_CHAMPIONS_ROOM_RIVAL":920,"FLAG_HIDE_CONTEST_POKE_BALL":86,"FLAG_HIDE_DEOXYS":763,"FLAG_HIDE_DESERT_UNDERPASS_FOSSIL":874,"FLAG_HIDE_DEWFORD_HALL_SLUDGE_BOMB_MAN":940,"FLAG_HIDE_EVER_GRANDE_POKEMON_CENTER_1F_SCOTT":793,"FLAG_HIDE_FALLARBOR_AZURILL":907,"FLAG_HIDE_FALLARBOR_HOUSE_PROF_COZMO":928,"FLAG_HIDE_FALLARBOR_TOWN_BATTLE_TENT_SCOTT":767,"FLAG_HIDE_FALLORBOR_POKEMON_CENTER_LANETTE":871,"FLAG_HIDE_FANCLUB_BOY":790,"FLAG_HIDE_FANCLUB_LADY":792,"FLAG_HIDE_FANCLUB_LITTLE_BOY":791,"FLAG_HIDE_FANCLUB_OLD_LADY":789,"FLAG_HIDE_FORTREE_CITY_HOUSE_4_WINGULL":933,"FLAG_HIDE_FORTREE_CITY_KECLEON":969,"FLAG_HIDE_GRANITE_CAVE_STEVEN":833,"FLAG_HIDE_HO_OH":801,"FLAG_HIDE_JAGGED_PASS_MAGMA_GUARD":847,"FLAG_HIDE_LANETTES_HOUSE_LANETTE":870,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL":929,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL_ON_BIKE":930,"FLAG_HIDE_LILYCOVE_CITY_AQUA_GRUNTS":852,"FLAG_HIDE_LILYCOVE_CITY_RIVAL":971,"FLAG_HIDE_LILYCOVE_CITY_WAILMER":729,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER":832,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER_REPLACEMENT":873,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_1":774,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_2":895,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_REPORTER":802,"FLAG_HIDE_LILYCOVE_DEPARTMENT_STORE_ROOFTOP_SALE_WOMAN":962,"FLAG_HIDE_LILYCOVE_FAN_CLUB_INTERVIEWER":730,"FLAG_HIDE_LILYCOVE_HARBOR_EVENT_TICKET_TAKER":748,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_ATTENDANT":908,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_SAILOR":909,"FLAG_HIDE_LILYCOVE_HARBOR_SSTIDAL":861,"FLAG_HIDE_LILYCOVE_MOTEL_GAME_DESIGNERS":925,"FLAG_HIDE_LILYCOVE_MOTEL_SCOTT":787,"FLAG_HIDE_LILYCOVE_MUSEUM_CURATOR":775,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_1":776,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_2":777,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_3":778,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_4":779,"FLAG_HIDE_LILYCOVE_MUSEUM_TOURISTS":780,"FLAG_HIDE_LILYCOVE_POKEMON_CENTER_CONTEST_LADY_MON":993,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCH":795,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_BIRCH":721,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CHIKORITA":838,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CYNDAQUIL":811,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_TOTODILE":812,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_RIVAL":889,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_UNKNOWN_0x380":896,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_POKE_BALL":817,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_SWABLU_DOLL":815,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_BRENDAN":745,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_MOM":758,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_BEDROOM":760,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_MOM":784,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_SIBLING":735,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_TRUCK":761,"FLAG_HIDE_LITTLEROOT_TOWN_FAT_MAN":868,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_PICHU_DOLL":849,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_POKE_BALL":818,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MAY":746,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MOM":759,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_BEDROOM":722,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_MOM":785,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_SIBLING":736,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_TRUCK":762,"FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE":752,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_BEDROOM_MOM":757,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_1":754,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_2":755,"FLAG_HIDE_LITTLEROOT_TOWN_RIVAL":794,"FLAG_HIDE_LUGIA":800,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON":853,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON_ASLEEP":850,"FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS":857,"FLAG_HIDE_MAGMA_HIDEOUT_MAXIE":867,"FLAG_HIDE_MAP_NAME_POPUP":16384,"FLAG_HIDE_MARINE_CAVE_KYOGRE":782,"FLAG_HIDE_MAUVILLE_CITY_SCOTT":765,"FLAG_HIDE_MAUVILLE_CITY_WALLY":804,"FLAG_HIDE_MAUVILLE_CITY_WALLYS_UNCLE":805,"FLAG_HIDE_MAUVILLE_CITY_WATTSON":912,"FLAG_HIDE_MAUVILLE_GYM_WATTSON":913,"FLAG_HIDE_METEOR_FALLS_1F_1R_COZMO":942,"FLAG_HIDE_METEOR_FALLS_TEAM_AQUA":938,"FLAG_HIDE_METEOR_FALLS_TEAM_MAGMA":939,"FLAG_HIDE_MEW":718,"FLAG_HIDE_MIRAGE_TOWER_CLAW_FOSSIL":964,"FLAG_HIDE_MIRAGE_TOWER_ROOT_FOSSIL":963,"FLAG_HIDE_MOSSDEEP_CITY_HOUSE_2_WINGULL":934,"FLAG_HIDE_MOSSDEEP_CITY_SCOTT":788,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_STEVEN":753,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_TEAM_MAGMA":756,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_STEVEN":863,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA":862,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_MAGMA_NOTE":737,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_BELDUM_POKEBALL":968,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_INVISIBLE_NINJA_BOY":727,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN":967,"FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA":823,"FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN":743,"FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN":740,"FLAG_HIDE_MT_CHIMNEY_LAVA_COOKIE_LADY":994,"FLAG_HIDE_MT_CHIMNEY_TEAM_AQUA":926,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA":927,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA_BATTLEABLE":981,"FLAG_HIDE_MT_CHIMNEY_TRAINERS":877,"FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE":916,"FLAG_HIDE_MT_PYRE_SUMMIT_MAXIE":856,"FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA":917,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_1":974,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_2":975,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_3":976,"FLAG_HIDE_OLDALE_TOWN_RIVAL":979,"FLAG_HIDE_PETALBURG_CITY_SCOTT":995,"FLAG_HIDE_PETALBURG_CITY_WALLY":726,"FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD":830,"FLAG_HIDE_PETALBURG_CITY_WALLYS_MOM":728,"FLAG_HIDE_PETALBURG_GYM_GREETER":781,"FLAG_HIDE_PETALBURG_GYM_NORMAN":772,"FLAG_HIDE_PETALBURG_GYM_WALLY":866,"FLAG_HIDE_PETALBURG_GYM_WALLYS_DAD":824,"FLAG_HIDE_PETALBURG_WOODS_AQUA_GRUNT":725,"FLAG_HIDE_PETALBURG_WOODS_DEVON_EMPLOYEE":724,"FLAG_HIDE_PLAYERS_HOUSE_DAD":734,"FLAG_HIDE_POKEMON_CENTER_2F_MYSTERY_GIFT_MAN":702,"FLAG_HIDE_REGICE":936,"FLAG_HIDE_REGIROCK":935,"FLAG_HIDE_REGISTEEL":937,"FLAG_HIDE_ROUTE_101_BIRCH":897,"FLAG_HIDE_ROUTE_101_BIRCH_STARTERS_BAG":700,"FLAG_HIDE_ROUTE_101_BIRCH_ZIGZAGOON_BATTLE":720,"FLAG_HIDE_ROUTE_101_BOY":991,"FLAG_HIDE_ROUTE_101_ZIGZAGOON":750,"FLAG_HIDE_ROUTE_103_BIRCH":898,"FLAG_HIDE_ROUTE_103_RIVAL":723,"FLAG_HIDE_ROUTE_104_MR_BRINEY":738,"FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT":742,"FLAG_HIDE_ROUTE_104_RIVAL":719,"FLAG_HIDE_ROUTE_104_WHITE_HERB_FLORIST":906,"FLAG_HIDE_ROUTE_109_MR_BRINEY":741,"FLAG_HIDE_ROUTE_109_MR_BRINEY_BOAT":744,"FLAG_HIDE_ROUTE_110_BIRCH":837,"FLAG_HIDE_ROUTE_110_RIVAL":919,"FLAG_HIDE_ROUTE_110_RIVAL_ON_BIKE":922,"FLAG_HIDE_ROUTE_110_TEAM_AQUA":900,"FLAG_HIDE_ROUTE_111_DESERT_FOSSIL":876,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_1":796,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2":903,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3":799,"FLAG_HIDE_ROUTE_111_PLAYER_DESCENT":875,"FLAG_HIDE_ROUTE_111_ROCK_SMASH_TIP_GUY":843,"FLAG_HIDE_ROUTE_111_SECRET_POWER_MAN":960,"FLAG_HIDE_ROUTE_111_VICKY_WINSTRATE":771,"FLAG_HIDE_ROUTE_111_VICTORIA_WINSTRATE":769,"FLAG_HIDE_ROUTE_111_VICTOR_WINSTRATE":768,"FLAG_HIDE_ROUTE_111_VIVI_WINSTRATE":770,"FLAG_HIDE_ROUTE_112_TEAM_MAGMA":819,"FLAG_HIDE_ROUTE_115_BOULDERS":825,"FLAG_HIDE_ROUTE_116_DEVON_EMPLOYEE":947,"FLAG_HIDE_ROUTE_116_DROPPED_GLASSES_MAN":813,"FLAG_HIDE_ROUTE_116_MR_BRINEY":891,"FLAG_HIDE_ROUTE_116_WANDAS_BOYFRIEND":894,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_1":797,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2":901,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_3":904,"FLAG_HIDE_ROUTE_118_STEVEN":966,"FLAG_HIDE_ROUTE_119_RIVAL":851,"FLAG_HIDE_ROUTE_119_RIVAL_ON_BIKE":923,"FLAG_HIDE_ROUTE_119_SCOTT":786,"FLAG_HIDE_ROUTE_119_TEAM_AQUA":890,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_BRIDGE":822,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_SHELLY":915,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1":798,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2":902,"FLAG_HIDE_ROUTE_120_STEVEN":972,"FLAG_HIDE_ROUTE_121_TEAM_AQUA_GRUNTS":914,"FLAG_HIDE_ROUTE_128_ARCHIE":944,"FLAG_HIDE_ROUTE_128_MAXIE":945,"FLAG_HIDE_ROUTE_128_STEVEN":834,"FLAG_HIDE_RUSTBORO_CITY_AQUA_GRUNT":731,"FLAG_HIDE_RUSTBORO_CITY_DEVON_CORP_3F_EMPLOYEE":949,"FLAG_HIDE_RUSTBORO_CITY_DEVON_EMPLOYEE_1":732,"FLAG_HIDE_RUSTBORO_CITY_POKEMON_SCHOOL_SCOTT":999,"FLAG_HIDE_RUSTBORO_CITY_RIVAL":814,"FLAG_HIDE_RUSTBORO_CITY_SCIENTIST":844,"FLAG_HIDE_RUSTURF_TUNNEL_AQUA_GRUNT":878,"FLAG_HIDE_RUSTURF_TUNNEL_BRINEY":879,"FLAG_HIDE_RUSTURF_TUNNEL_PEEKO":880,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1":931,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2":932,"FLAG_HIDE_RUSTURF_TUNNEL_WANDA":983,"FLAG_HIDE_RUSTURF_TUNNEL_WANDAS_BOYFRIEND":807,"FLAG_HIDE_SAFARI_ZONE_SOUTH_CONSTRUCTION_WORKERS":717,"FLAG_HIDE_SAFARI_ZONE_SOUTH_EAST_EXPANSION":747,"FLAG_HIDE_SEAFLOOR_CAVERN_AQUA_GRUNTS":946,"FLAG_HIDE_SEAFLOOR_CAVERN_ENTRANCE_AQUA_GRUNT":941,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_ARCHIE":828,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE":859,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE_ASLEEP":733,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAGMA_GRUNTS":831,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAXIE":829,"FLAG_HIDE_SECRET_BASE_TRAINER":173,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA":773,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA_STILL":80,"FLAG_HIDE_SKY_PILLAR_WALLACE":855,"FLAG_HIDE_SLATEPORT_CITY_CAPTAIN_STERN":840,"FLAG_HIDE_SLATEPORT_CITY_CONTEST_REPORTER":803,"FLAG_HIDE_SLATEPORT_CITY_GABBY_AND_TY":835,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_AQUA_GRUNT":845,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_ARCHIE":846,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_CAPTAIN_STERN":841,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_PATRONS":905,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SS_TIDAL":860,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SUBMARINE_SHADOW":848,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_1":884,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_2":885,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_ARCHIE":886,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_CAPTAIN_STERN":887,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_AQUA_GRUNTS":883,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_FAMILIAR_AQUA_GRUNT":965,"FLAG_HIDE_SLATEPORT_CITY_SCOTT":749,"FLAG_HIDE_SLATEPORT_CITY_STERNS_SHIPYARD_MR_BRINEY":869,"FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA":882,"FLAG_HIDE_SLATEPORT_CITY_TM_SALESMAN":948,"FLAG_HIDE_SLATEPORT_MUSEUM_POPULATION":961,"FLAG_HIDE_SOOTOPOLIS_CITY_ARCHIE":826,"FLAG_HIDE_SOOTOPOLIS_CITY_GROUDON":998,"FLAG_HIDE_SOOTOPOLIS_CITY_KYOGRE":997,"FLAG_HIDE_SOOTOPOLIS_CITY_MAN_1":839,"FLAG_HIDE_SOOTOPOLIS_CITY_MAXIE":827,"FLAG_HIDE_SOOTOPOLIS_CITY_RAYQUAZA":996,"FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS":854,"FLAG_HIDE_SOOTOPOLIS_CITY_STEVEN":973,"FLAG_HIDE_SOOTOPOLIS_CITY_WALLACE":816,"FLAG_HIDE_SOUTHERN_ISLAND_EON_STONE":910,"FLAG_HIDE_SOUTHERN_ISLAND_UNCHOSEN_EON_DUO_MON":911,"FLAG_HIDE_SS_TIDAL_CORRIDOR_MR_BRINEY":950,"FLAG_HIDE_SS_TIDAL_CORRIDOR_SCOTT":810,"FLAG_HIDE_SS_TIDAL_ROOMS_SNATCH_GIVER":951,"FLAG_HIDE_TERRA_CAVE_GROUDON":783,"FLAG_HIDE_TRICK_HOUSE_END_MAN":899,"FLAG_HIDE_TRICK_HOUSE_ENTRANCE_MAN":872,"FLAG_HIDE_UNDERWATER_SEA_FLOOR_CAVERN_STOLEN_SUBMARINE":980,"FLAG_HIDE_UNION_ROOM_PLAYER_1":703,"FLAG_HIDE_UNION_ROOM_PLAYER_2":704,"FLAG_HIDE_UNION_ROOM_PLAYER_3":705,"FLAG_HIDE_UNION_ROOM_PLAYER_4":706,"FLAG_HIDE_UNION_ROOM_PLAYER_5":707,"FLAG_HIDE_UNION_ROOM_PLAYER_6":708,"FLAG_HIDE_UNION_ROOM_PLAYER_7":709,"FLAG_HIDE_UNION_ROOM_PLAYER_8":710,"FLAG_HIDE_VERDANTURF_TOWN_SCOTT":766,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLY":806,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLYS_UNCLE":809,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDA":984,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDAS_BOYFRIEND":808,"FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY":858,"FLAG_HIDE_VICTORY_ROAD_EXIT_WALLY":751,"FLAG_HIDE_WEATHER_INSTITUTE_1F_WORKERS":892,"FLAG_HIDE_WEATHER_INSTITUTE_2F_AQUA_GRUNT_M":992,"FLAG_HIDE_WEATHER_INSTITUTE_2F_WORKERS":893,"FLAG_HO_OH_IS_RECOVERING":1256,"FLAG_INTERACTED_WITH_DEVON_EMPLOYEE_GOODS_STOLEN":159,"FLAG_INTERACTED_WITH_STEVEN_SPACE_CENTER":205,"FLAG_IS_CHAMPION":2175,"FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":1100,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":1102,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":1078,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":1101,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":1077,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":1095,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":1099,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":1097,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":1096,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":1098,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":1124,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":1071,"FLAG_ITEM_AQUA_HIDEOUT_B1F_NUGGET":1132,"FLAG_ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":1072,"FLAG_ITEM_ARTISAN_CAVE_1F_CARBOS":1163,"FLAG_ITEM_ARTISAN_CAVE_B1F_HP_UP":1162,"FLAG_ITEM_FIERY_PATH_FIRE_STONE":1111,"FLAG_ITEM_FIERY_PATH_TM_TOXIC":1091,"FLAG_ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":1050,"FLAG_ITEM_GRANITE_CAVE_B1F_POKE_BALL":1051,"FLAG_ITEM_GRANITE_CAVE_B2F_RARE_CANDY":1054,"FLAG_ITEM_GRANITE_CAVE_B2F_REPEL":1053,"FLAG_ITEM_JAGGED_PASS_BURN_HEAL":1070,"FLAG_ITEM_LILYCOVE_CITY_MAX_REPEL":1042,"FLAG_ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":1151,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":1165,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":1164,"FLAG_ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":1166,"FLAG_ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":1167,"FLAG_ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":1059,"FLAG_ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":1168,"FLAG_ITEM_MAUVILLE_CITY_X_SPEED":1116,"FLAG_ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":1045,"FLAG_ITEM_METEOR_FALLS_1F_1R_MOON_STONE":1046,"FLAG_ITEM_METEOR_FALLS_1F_1R_PP_UP":1047,"FLAG_ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":1044,"FLAG_ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":1080,"FLAG_ITEM_MOSSDEEP_CITY_NET_BALL":1043,"FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_HM08":1133,"FLAG_ITEM_MT_PYRE_2F_ULTRA_BALL":1129,"FLAG_ITEM_MT_PYRE_3F_SUPER_REPEL":1120,"FLAG_ITEM_MT_PYRE_4F_SEA_INCENSE":1130,"FLAG_ITEM_MT_PYRE_5F_LAX_INCENSE":1052,"FLAG_ITEM_MT_PYRE_6F_TM_SHADOW_BALL":1089,"FLAG_ITEM_MT_PYRE_EXTERIOR_MAX_POTION":1073,"FLAG_ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":1074,"FLAG_ITEM_NEW_MAUVILLE_ESCAPE_ROPE":1076,"FLAG_ITEM_NEW_MAUVILLE_FULL_HEAL":1122,"FLAG_ITEM_NEW_MAUVILLE_PARALYZE_HEAL":1123,"FLAG_ITEM_NEW_MAUVILLE_THUNDER_STONE":1110,"FLAG_ITEM_NEW_MAUVILLE_ULTRA_BALL":1075,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MASTER_BALL":1125,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MAX_ELIXIR":1126,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B2F_NEST_BALL":1127,"FLAG_ITEM_PETALBURG_CITY_ETHER":1040,"FLAG_ITEM_PETALBURG_CITY_MAX_REVIVE":1039,"FLAG_ITEM_PETALBURG_WOODS_ETHER":1058,"FLAG_ITEM_PETALBURG_WOODS_GREAT_BALL":1056,"FLAG_ITEM_PETALBURG_WOODS_PARALYZE_HEAL":1117,"FLAG_ITEM_PETALBURG_WOODS_X_ATTACK":1055,"FLAG_ITEM_ROUTE_102_POTION":1000,"FLAG_ITEM_ROUTE_103_GUARD_SPEC":1114,"FLAG_ITEM_ROUTE_103_PP_UP":1137,"FLAG_ITEM_ROUTE_104_POKE_BALL":1057,"FLAG_ITEM_ROUTE_104_POTION":1135,"FLAG_ITEM_ROUTE_104_PP_UP":1002,"FLAG_ITEM_ROUTE_104_X_ACCURACY":1115,"FLAG_ITEM_ROUTE_105_IRON":1003,"FLAG_ITEM_ROUTE_106_PROTEIN":1004,"FLAG_ITEM_ROUTE_108_STAR_PIECE":1139,"FLAG_ITEM_ROUTE_109_POTION":1140,"FLAG_ITEM_ROUTE_109_PP_UP":1005,"FLAG_ITEM_ROUTE_110_DIRE_HIT":1007,"FLAG_ITEM_ROUTE_110_ELIXIR":1141,"FLAG_ITEM_ROUTE_110_RARE_CANDY":1006,"FLAG_ITEM_ROUTE_111_ELIXIR":1142,"FLAG_ITEM_ROUTE_111_HP_UP":1010,"FLAG_ITEM_ROUTE_111_STARDUST":1009,"FLAG_ITEM_ROUTE_111_TM_SANDSTORM":1008,"FLAG_ITEM_ROUTE_112_NUGGET":1011,"FLAG_ITEM_ROUTE_113_HYPER_POTION":1143,"FLAG_ITEM_ROUTE_113_MAX_ETHER":1012,"FLAG_ITEM_ROUTE_113_SUPER_REPEL":1013,"FLAG_ITEM_ROUTE_114_ENERGY_POWDER":1160,"FLAG_ITEM_ROUTE_114_PROTEIN":1015,"FLAG_ITEM_ROUTE_114_RARE_CANDY":1014,"FLAG_ITEM_ROUTE_115_GREAT_BALL":1118,"FLAG_ITEM_ROUTE_115_HEAL_POWDER":1144,"FLAG_ITEM_ROUTE_115_IRON":1018,"FLAG_ITEM_ROUTE_115_PP_UP":1161,"FLAG_ITEM_ROUTE_115_SUPER_POTION":1016,"FLAG_ITEM_ROUTE_115_TM_FOCUS_PUNCH":1017,"FLAG_ITEM_ROUTE_116_ETHER":1019,"FLAG_ITEM_ROUTE_116_HP_UP":1021,"FLAG_ITEM_ROUTE_116_POTION":1146,"FLAG_ITEM_ROUTE_116_REPEL":1020,"FLAG_ITEM_ROUTE_116_X_SPECIAL":1001,"FLAG_ITEM_ROUTE_117_GREAT_BALL":1022,"FLAG_ITEM_ROUTE_117_REVIVE":1023,"FLAG_ITEM_ROUTE_118_HYPER_POTION":1121,"FLAG_ITEM_ROUTE_119_ELIXIR_1":1026,"FLAG_ITEM_ROUTE_119_ELIXIR_2":1147,"FLAG_ITEM_ROUTE_119_HYPER_POTION_1":1029,"FLAG_ITEM_ROUTE_119_HYPER_POTION_2":1106,"FLAG_ITEM_ROUTE_119_LEAF_STONE":1027,"FLAG_ITEM_ROUTE_119_NUGGET":1134,"FLAG_ITEM_ROUTE_119_RARE_CANDY":1028,"FLAG_ITEM_ROUTE_119_SUPER_REPEL":1024,"FLAG_ITEM_ROUTE_119_ZINC":1025,"FLAG_ITEM_ROUTE_120_FULL_HEAL":1031,"FLAG_ITEM_ROUTE_120_HYPER_POTION":1107,"FLAG_ITEM_ROUTE_120_NEST_BALL":1108,"FLAG_ITEM_ROUTE_120_NUGGET":1030,"FLAG_ITEM_ROUTE_120_REVIVE":1148,"FLAG_ITEM_ROUTE_121_CARBOS":1103,"FLAG_ITEM_ROUTE_121_REVIVE":1149,"FLAG_ITEM_ROUTE_121_ZINC":1150,"FLAG_ITEM_ROUTE_123_CALCIUM":1032,"FLAG_ITEM_ROUTE_123_ELIXIR":1109,"FLAG_ITEM_ROUTE_123_PP_UP":1152,"FLAG_ITEM_ROUTE_123_REVIVAL_HERB":1153,"FLAG_ITEM_ROUTE_123_ULTRA_BALL":1104,"FLAG_ITEM_ROUTE_124_BLUE_SHARD":1093,"FLAG_ITEM_ROUTE_124_RED_SHARD":1092,"FLAG_ITEM_ROUTE_124_YELLOW_SHARD":1066,"FLAG_ITEM_ROUTE_125_BIG_PEARL":1154,"FLAG_ITEM_ROUTE_126_GREEN_SHARD":1105,"FLAG_ITEM_ROUTE_127_CARBOS":1035,"FLAG_ITEM_ROUTE_127_RARE_CANDY":1155,"FLAG_ITEM_ROUTE_127_ZINC":1034,"FLAG_ITEM_ROUTE_132_PROTEIN":1156,"FLAG_ITEM_ROUTE_132_RARE_CANDY":1036,"FLAG_ITEM_ROUTE_133_BIG_PEARL":1037,"FLAG_ITEM_ROUTE_133_MAX_REVIVE":1157,"FLAG_ITEM_ROUTE_133_STAR_PIECE":1038,"FLAG_ITEM_ROUTE_134_CARBOS":1158,"FLAG_ITEM_ROUTE_134_STAR_PIECE":1159,"FLAG_ITEM_RUSTBORO_CITY_X_DEFEND":1041,"FLAG_ITEM_RUSTURF_TUNNEL_MAX_ETHER":1049,"FLAG_ITEM_RUSTURF_TUNNEL_POKE_BALL":1048,"FLAG_ITEM_SAFARI_ZONE_NORTH_CALCIUM":1119,"FLAG_ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":1169,"FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":1094,"FLAG_ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":1170,"FLAG_ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":1131,"FLAG_ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":1079,"FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":1090,"FLAG_ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":1081,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":1113,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":1112,"FLAG_ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":1082,"FLAG_ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":1083,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":1060,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":1061,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":1062,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":1063,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":1064,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":1065,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":1067,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":1068,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":1069,"FLAG_ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":1084,"FLAG_ITEM_VICTORY_ROAD_1F_PP_UP":1085,"FLAG_ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":1087,"FLAG_ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":1086,"FLAG_ITEM_VICTORY_ROAD_B2F_FULL_HEAL":1088,"FLAG_KECLEON_FLED_FORTREE":295,"FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN":129,"FLAG_KYOGRE_IS_RECOVERING":1273,"FLAG_LANDMARK_ABANDONED_SHIP":2206,"FLAG_LANDMARK_ALTERING_CAVE":2269,"FLAG_LANDMARK_ANCIENT_TOMB":2233,"FLAG_LANDMARK_ARTISAN_CAVE":2271,"FLAG_LANDMARK_BATTLE_FRONTIER":2216,"FLAG_LANDMARK_BERRY_MASTERS_HOUSE":2243,"FLAG_LANDMARK_DESERT_RUINS":2230,"FLAG_LANDMARK_DESERT_UNDERPASS":2270,"FLAG_LANDMARK_FIERY_PATH":2218,"FLAG_LANDMARK_FLOWER_SHOP":2204,"FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE":2231,"FLAG_LANDMARK_GLASS_WORKSHOP":2212,"FLAG_LANDMARK_HUNTERS_HOUSE":2235,"FLAG_LANDMARK_ISLAND_CAVE":2229,"FLAG_LANDMARK_LANETTES_HOUSE":2213,"FLAG_LANDMARK_MIRAGE_TOWER":120,"FLAG_LANDMARK_MR_BRINEY_HOUSE":2205,"FLAG_LANDMARK_NEW_MAUVILLE":2208,"FLAG_LANDMARK_OLD_LADY_REST_SHOP":2209,"FLAG_LANDMARK_POKEMON_DAYCARE":2214,"FLAG_LANDMARK_POKEMON_LEAGUE":2228,"FLAG_LANDMARK_SCORCHED_SLAB":2232,"FLAG_LANDMARK_SEAFLOOR_CAVERN":2215,"FLAG_LANDMARK_SEALED_CHAMBER":2236,"FLAG_LANDMARK_SEASHORE_HOUSE":2207,"FLAG_LANDMARK_SKY_PILLAR":2238,"FLAG_LANDMARK_SOUTHERN_ISLAND":2217,"FLAG_LANDMARK_TRAINER_HILL":2274,"FLAG_LANDMARK_TRICK_HOUSE":2210,"FLAG_LANDMARK_TUNNELERS_REST_HOUSE":2234,"FLAG_LANDMARK_WINSTRATE_FAMILY":2211,"FLAG_LATIAS_IS_RECOVERING":1263,"FLAG_LATIOS_IS_RECOVERING":1255,"FLAG_LATIOS_OR_LATIAS_ROAMING":255,"FLAG_LEGENDARIES_IN_SOOTOPOLIS":83,"FLAG_LILYCOVE_RECEIVED_BERRY":1208,"FLAG_LUGIA_IS_RECOVERING":1257,"FLAG_MAP_SCRIPT_CHECKED_DEOXYS":2259,"FLAG_MATCH_CALL_REGISTERED":348,"FLAG_MAUVILLE_GYM_BARRIERS_STATE":99,"FLAG_MET_ARCHIE_METEOR_FALLS":207,"FLAG_MET_ARCHIE_SOOTOPOLIS":308,"FLAG_MET_BATTLE_FRONTIER_BREEDER":339,"FLAG_MET_BATTLE_FRONTIER_GAMBLER":343,"FLAG_MET_BATTLE_FRONTIER_MANIAC":340,"FLAG_MET_DEVON_EMPLOYEE":287,"FLAG_MET_DIVING_TREASURE_HUNTER":217,"FLAG_MET_FANCLUB_YOUNGER_BROTHER":300,"FLAG_MET_FRONTIER_BEAUTY_MOVE_TUTOR":346,"FLAG_MET_FRONTIER_SWIMMER_MOVE_TUTOR":347,"FLAG_MET_HIDDEN_POWER_GIVER":118,"FLAG_MET_MAXIE_SOOTOPOLIS":309,"FLAG_MET_PRETTY_PETAL_SHOP_OWNER":127,"FLAG_MET_PROF_COZMO":244,"FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE":293,"FLAG_MET_RIVAL_LILYCOVE":292,"FLAG_MET_RIVAL_MOM":87,"FLAG_MET_RIVAL_RUSTBORO":288,"FLAG_MET_SCOTT_AFTER_OBTAINING_STONE_BADGE":459,"FLAG_MET_SCOTT_IN_EVERGRANDE":463,"FLAG_MET_SCOTT_IN_FALLARBOR":461,"FLAG_MET_SCOTT_IN_LILYCOVE":462,"FLAG_MET_SCOTT_IN_VERDANTURF":460,"FLAG_MET_SCOTT_ON_SS_TIDAL":464,"FLAG_MET_SCOTT_RUSTBORO":310,"FLAG_MET_SLATEPORT_FANCLUB_CHAIRMAN":342,"FLAG_MET_TEAM_AQUA_HARBOR":97,"FLAG_MET_WAILMER_TRAINER":218,"FLAG_MEW_IS_RECOVERING":1259,"FLAG_MIRAGE_TOWER_VISIBLE":334,"FLAG_MOSSDEEP_GYM_SWITCH_1":100,"FLAG_MOSSDEEP_GYM_SWITCH_2":101,"FLAG_MOSSDEEP_GYM_SWITCH_3":102,"FLAG_MOSSDEEP_GYM_SWITCH_4":103,"FLAG_MOVE_TUTOR_TAUGHT_DOUBLE_EDGE":441,"FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH":440,"FLAG_MOVE_TUTOR_TAUGHT_EXPLOSION":442,"FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER":435,"FLAG_MOVE_TUTOR_TAUGHT_METRONOME":437,"FLAG_MOVE_TUTOR_TAUGHT_MIMIC":436,"FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT":434,"FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK":438,"FLAG_MOVE_TUTOR_TAUGHT_SUBSTITUTE":439,"FLAG_MOVE_TUTOR_TAUGHT_SWAGGER":433,"FLAG_MR_BRINEY_SAILING_INTRO":147,"FLAG_MYSTERY_GIFT_1":485,"FLAG_MYSTERY_GIFT_10":494,"FLAG_MYSTERY_GIFT_11":495,"FLAG_MYSTERY_GIFT_12":496,"FLAG_MYSTERY_GIFT_13":497,"FLAG_MYSTERY_GIFT_14":498,"FLAG_MYSTERY_GIFT_15":499,"FLAG_MYSTERY_GIFT_2":486,"FLAG_MYSTERY_GIFT_3":487,"FLAG_MYSTERY_GIFT_4":488,"FLAG_MYSTERY_GIFT_5":489,"FLAG_MYSTERY_GIFT_6":490,"FLAG_MYSTERY_GIFT_7":491,"FLAG_MYSTERY_GIFT_8":492,"FLAG_MYSTERY_GIFT_9":493,"FLAG_MYSTERY_GIFT_DONE":484,"FLAG_NEVER_SET_0x0DC":220,"FLAG_NOT_READY_FOR_BATTLE_ROUTE_120":290,"FLAG_NURSE_MENTIONS_GOLD_CARD":345,"FLAG_NURSE_UNION_ROOM_REMINDER":2176,"FLAG_OCEANIC_MUSEUM_MET_REPORTER":105,"FLAG_OMIT_DIVE_FROM_STEVEN_LETTER":302,"FLAG_PACIFIDLOG_NPC_TRADE_COMPLETED":154,"FLAG_PENDING_DAYCARE_EGG":134,"FLAG_PETALBURG_MART_EXPANDED_ITEMS":296,"FLAG_POKERUS_EXPLAINED":273,"FLAG_PURCHASED_HARBOR_MAIL":104,"FLAG_RAYQUAZA_IS_RECOVERING":1279,"FLAG_RECEIVED_20_COINS":225,"FLAG_RECEIVED_6_SODA_POP":140,"FLAG_RECEIVED_ACRO_BIKE":1181,"FLAG_RECEIVED_AMULET_COIN":133,"FLAG_RECEIVED_AURORA_TICKET":314,"FLAG_RECEIVED_BADGE_1":1182,"FLAG_RECEIVED_BADGE_2":1183,"FLAG_RECEIVED_BADGE_3":1184,"FLAG_RECEIVED_BADGE_4":1185,"FLAG_RECEIVED_BADGE_5":1186,"FLAG_RECEIVED_BADGE_6":1187,"FLAG_RECEIVED_BADGE_7":1188,"FLAG_RECEIVED_BADGE_8":1189,"FLAG_RECEIVED_BELDUM":298,"FLAG_RECEIVED_BELUE_BERRY":252,"FLAG_RECEIVED_BIKE":90,"FLAG_RECEIVED_BLUE_SCARF":201,"FLAG_RECEIVED_CASTFORM":151,"FLAG_RECEIVED_CHARCOAL":254,"FLAG_RECEIVED_CHESTO_BERRY_ROUTE_104":246,"FLAG_RECEIVED_CLEANSE_TAG":282,"FLAG_RECEIVED_COIN_CASE":258,"FLAG_RECEIVED_CONTEST_PASS":150,"FLAG_RECEIVED_DEEP_SEA_SCALE":1190,"FLAG_RECEIVED_DEEP_SEA_TOOTH":1191,"FLAG_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":1172,"FLAG_RECEIVED_DEVON_SCOPE":285,"FLAG_RECEIVED_DOLL_LANETTE":131,"FLAG_RECEIVED_DURIN_BERRY":251,"FLAG_RECEIVED_EON_TICKET":474,"FLAG_RECEIVED_EXP_SHARE":272,"FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK":299,"FLAG_RECEIVED_FIRST_POKEBALLS":233,"FLAG_RECEIVED_FOCUS_BAND":283,"FLAG_RECEIVED_GLASS_ORNAMENT":236,"FLAG_RECEIVED_GOLD_SHIELD":238,"FLAG_RECEIVED_GOOD_ROD":227,"FLAG_RECEIVED_GO_GOGGLES":221,"FLAG_RECEIVED_GREAT_BALL_PETALBURG_WOODS":1171,"FLAG_RECEIVED_GREAT_BALL_RUSTBORO_CITY":1173,"FLAG_RECEIVED_GREEN_SCARF":203,"FLAG_RECEIVED_HM_CUT":137,"FLAG_RECEIVED_HM_DIVE":123,"FLAG_RECEIVED_HM_FLASH":109,"FLAG_RECEIVED_HM_FLY":110,"FLAG_RECEIVED_HM_ROCK_SMASH":107,"FLAG_RECEIVED_HM_STRENGTH":106,"FLAG_RECEIVED_HM_SURF":122,"FLAG_RECEIVED_HM_WATERFALL":312,"FLAG_RECEIVED_ITEMFINDER":1176,"FLAG_RECEIVED_KINGS_ROCK":276,"FLAG_RECEIVED_LAVARIDGE_EGG":266,"FLAG_RECEIVED_LETTER":1174,"FLAG_RECEIVED_MACHO_BRACE":277,"FLAG_RECEIVED_MACH_BIKE":1180,"FLAG_RECEIVED_MAGMA_EMBLEM":1177,"FLAG_RECEIVED_MENTAL_HERB":223,"FLAG_RECEIVED_METEORITE":115,"FLAG_RECEIVED_MIRACLE_SEED":297,"FLAG_RECEIVED_MYSTIC_TICKET":315,"FLAG_RECEIVED_OLD_ROD":257,"FLAG_RECEIVED_OLD_SEA_MAP":316,"FLAG_RECEIVED_PAMTRE_BERRY":249,"FLAG_RECEIVED_PINK_SCARF":202,"FLAG_RECEIVED_POKEBLOCK_CASE":95,"FLAG_RECEIVED_POKEDEX_FROM_BIRCH":2276,"FLAG_RECEIVED_POKENAV":188,"FLAG_RECEIVED_POTION_OLDALE":132,"FLAG_RECEIVED_POWDER_JAR":337,"FLAG_RECEIVED_PREMIER_BALL_RUSTBORO":213,"FLAG_RECEIVED_QUICK_CLAW":275,"FLAG_RECEIVED_RED_OR_BLUE_ORB":212,"FLAG_RECEIVED_RED_SCARF":200,"FLAG_RECEIVED_REPEAT_BALL":256,"FLAG_RECEIVED_REVIVED_FOSSIL_MON":267,"FLAG_RECEIVED_RUNNING_SHOES":274,"FLAG_RECEIVED_SECRET_POWER":96,"FLAG_RECEIVED_SHOAL_SALT_1":952,"FLAG_RECEIVED_SHOAL_SALT_2":953,"FLAG_RECEIVED_SHOAL_SALT_3":954,"FLAG_RECEIVED_SHOAL_SALT_4":955,"FLAG_RECEIVED_SHOAL_SHELL_1":956,"FLAG_RECEIVED_SHOAL_SHELL_2":957,"FLAG_RECEIVED_SHOAL_SHELL_3":958,"FLAG_RECEIVED_SHOAL_SHELL_4":959,"FLAG_RECEIVED_SILK_SCARF":289,"FLAG_RECEIVED_SILVER_SHIELD":237,"FLAG_RECEIVED_SOFT_SAND":280,"FLAG_RECEIVED_SOOTHE_BELL":278,"FLAG_RECEIVED_SOOT_SACK":1033,"FLAG_RECEIVED_SPECIAL_PHRASE_HINT":85,"FLAG_RECEIVED_SPELON_BERRY":248,"FLAG_RECEIVED_SS_TICKET":291,"FLAG_RECEIVED_STARTER_DOLL":226,"FLAG_RECEIVED_SUN_STONE_MOSSDEEP":192,"FLAG_RECEIVED_SUPER_ROD":152,"FLAG_RECEIVED_TM_AERIAL_ACE":170,"FLAG_RECEIVED_TM_ATTRACT":235,"FLAG_RECEIVED_TM_BRICK_BREAK":121,"FLAG_RECEIVED_TM_BULK_UP":166,"FLAG_RECEIVED_TM_BULLET_SEED":262,"FLAG_RECEIVED_TM_CALM_MIND":171,"FLAG_RECEIVED_TM_DIG":261,"FLAG_RECEIVED_TM_FACADE":169,"FLAG_RECEIVED_TM_FRUSTRATION":1179,"FLAG_RECEIVED_TM_GIGA_DRAIN":232,"FLAG_RECEIVED_TM_HIDDEN_POWER":264,"FLAG_RECEIVED_TM_OVERHEAT":168,"FLAG_RECEIVED_TM_REST":234,"FLAG_RECEIVED_TM_RETURN":229,"FLAG_RECEIVED_TM_RETURN_2":1178,"FLAG_RECEIVED_TM_ROAR":231,"FLAG_RECEIVED_TM_ROCK_TOMB":165,"FLAG_RECEIVED_TM_SHOCK_WAVE":167,"FLAG_RECEIVED_TM_SLUDGE_BOMB":230,"FLAG_RECEIVED_TM_SNATCH":260,"FLAG_RECEIVED_TM_STEEL_WING":1175,"FLAG_RECEIVED_TM_THIEF":269,"FLAG_RECEIVED_TM_TORMENT":265,"FLAG_RECEIVED_TM_WATER_PULSE":172,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_1":1200,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_2":1201,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_3":1202,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_4":1203,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_5":1204,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_6":1205,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_7":1206,"FLAG_RECEIVED_WAILMER_DOLL":245,"FLAG_RECEIVED_WAILMER_PAIL":94,"FLAG_RECEIVED_WATMEL_BERRY":250,"FLAG_RECEIVED_WHITE_HERB":279,"FLAG_RECEIVED_YELLOW_SCARF":204,"FLAG_RECOVERED_DEVON_GOODS":143,"FLAG_REGICE_IS_RECOVERING":1260,"FLAG_REGIROCK_IS_RECOVERING":1261,"FLAG_REGISTEEL_IS_RECOVERING":1262,"FLAG_REGISTERED_STEVEN_POKENAV":305,"FLAG_REGISTER_RIVAL_POKENAV":124,"FLAG_REGI_DOORS_OPENED":228,"FLAG_REMATCH_ABIGAIL":387,"FLAG_REMATCH_AMY_AND_LIV":399,"FLAG_REMATCH_ANDRES":350,"FLAG_REMATCH_ANNA_AND_MEG":378,"FLAG_REMATCH_BENJAMIN":390,"FLAG_REMATCH_BERNIE":369,"FLAG_REMATCH_BRAWLY":415,"FLAG_REMATCH_BROOKE":356,"FLAG_REMATCH_CALVIN":383,"FLAG_REMATCH_CAMERON":373,"FLAG_REMATCH_CATHERINE":406,"FLAG_REMATCH_CINDY":359,"FLAG_REMATCH_CORY":401,"FLAG_REMATCH_CRISTIN":355,"FLAG_REMATCH_CYNDY":395,"FLAG_REMATCH_DALTON":368,"FLAG_REMATCH_DIANA":398,"FLAG_REMATCH_DRAKE":424,"FLAG_REMATCH_DUSTY":351,"FLAG_REMATCH_DYLAN":388,"FLAG_REMATCH_EDWIN":402,"FLAG_REMATCH_ELLIOT":384,"FLAG_REMATCH_ERNEST":400,"FLAG_REMATCH_ETHAN":370,"FLAG_REMATCH_FERNANDO":367,"FLAG_REMATCH_FLANNERY":417,"FLAG_REMATCH_GABRIELLE":405,"FLAG_REMATCH_GLACIA":423,"FLAG_REMATCH_HALEY":408,"FLAG_REMATCH_ISAAC":404,"FLAG_REMATCH_ISABEL":379,"FLAG_REMATCH_ISAIAH":385,"FLAG_REMATCH_JACKI":374,"FLAG_REMATCH_JACKSON":407,"FLAG_REMATCH_JAMES":409,"FLAG_REMATCH_JEFFREY":372,"FLAG_REMATCH_JENNY":397,"FLAG_REMATCH_JERRY":377,"FLAG_REMATCH_JESSICA":361,"FLAG_REMATCH_JOHN_AND_JAY":371,"FLAG_REMATCH_KAREN":376,"FLAG_REMATCH_KATELYN":389,"FLAG_REMATCH_KIRA_AND_DAN":412,"FLAG_REMATCH_KOJI":366,"FLAG_REMATCH_LAO":394,"FLAG_REMATCH_LILA_AND_ROY":354,"FLAG_REMATCH_LOLA":352,"FLAG_REMATCH_LYDIA":403,"FLAG_REMATCH_MADELINE":396,"FLAG_REMATCH_MARIA":386,"FLAG_REMATCH_MIGUEL":380,"FLAG_REMATCH_NICOLAS":392,"FLAG_REMATCH_NOB":365,"FLAG_REMATCH_NORMAN":418,"FLAG_REMATCH_PABLO":391,"FLAG_REMATCH_PHOEBE":422,"FLAG_REMATCH_RICKY":353,"FLAG_REMATCH_ROBERT":393,"FLAG_REMATCH_ROSE":349,"FLAG_REMATCH_ROXANNE":414,"FLAG_REMATCH_SAWYER":411,"FLAG_REMATCH_SHELBY":382,"FLAG_REMATCH_SIDNEY":421,"FLAG_REMATCH_STEVE":363,"FLAG_REMATCH_TATE_AND_LIZA":420,"FLAG_REMATCH_THALIA":360,"FLAG_REMATCH_TIMOTHY":381,"FLAG_REMATCH_TONY":364,"FLAG_REMATCH_TRENT":410,"FLAG_REMATCH_VALERIE":358,"FLAG_REMATCH_WALLACE":425,"FLAG_REMATCH_WALLY":413,"FLAG_REMATCH_WALTER":375,"FLAG_REMATCH_WATTSON":416,"FLAG_REMATCH_WILTON":357,"FLAG_REMATCH_WINONA":419,"FLAG_REMATCH_WINSTON":362,"FLAG_RESCUED_BIRCH":82,"FLAG_RETURNED_DEVON_GOODS":144,"FLAG_RETURNED_RED_OR_BLUE_ORB":259,"FLAG_RIVAL_LEFT_FOR_ROUTE103":301,"FLAG_ROUTE_111_RECEIVED_BERRY":1192,"FLAG_ROUTE_114_RECEIVED_BERRY":1193,"FLAG_ROUTE_120_RECEIVED_BERRY":1194,"FLAG_RUSTBORO_NPC_TRADE_COMPLETED":153,"FLAG_RUSTURF_TUNNEL_OPENED":199,"FLAG_SCOTT_CALL_BATTLE_FRONTIER":114,"FLAG_SCOTT_CALL_FORTREE_GYM":138,"FLAG_SCOTT_GIVES_BATTLE_POINTS":465,"FLAG_SECRET_BASE_REGISTRY_ENABLED":268,"FLAG_SET_WALL_CLOCK":81,"FLAG_SHOWN_AURORA_TICKET":431,"FLAG_SHOWN_BOX_WAS_FULL_MESSAGE":2263,"FLAG_SHOWN_EON_TICKET":430,"FLAG_SHOWN_MYSTIC_TICKET":475,"FLAG_SHOWN_OLD_SEA_MAP":432,"FLAG_SMART_PAINTING_MADE":163,"FLAG_SOOTOPOLIS_ARCHIE_MAXIE_LEAVE":158,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_1":1198,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_2":1199,"FLAG_SPECIAL_FLAG_UNUSED_0x4003":16387,"FLAG_SS_TIDAL_DISABLED":84,"FLAG_STEVEN_GUIDES_TO_CAVE_OF_ORIGIN":307,"FLAG_STORING_ITEMS_IN_PYRAMID_BAG":16388,"FLAG_SYS_ARENA_GOLD":2251,"FLAG_SYS_ARENA_SILVER":2250,"FLAG_SYS_BRAILLE_DIG":2223,"FLAG_SYS_BRAILLE_REGICE_COMPLETED":2225,"FLAG_SYS_B_DASH":2240,"FLAG_SYS_CAVE_BATTLE":2201,"FLAG_SYS_CAVE_SHIP":2199,"FLAG_SYS_CAVE_WONDER":2200,"FLAG_SYS_CHANGED_DEWFORD_TREND":2195,"FLAG_SYS_CHAT_USED":2149,"FLAG_SYS_CLOCK_SET":2197,"FLAG_SYS_CRUISE_MODE":2189,"FLAG_SYS_CTRL_OBJ_DELETE":2241,"FLAG_SYS_CYCLING_ROAD":2187,"FLAG_SYS_DOME_GOLD":2247,"FLAG_SYS_DOME_SILVER":2246,"FLAG_SYS_ENC_DOWN_ITEM":2222,"FLAG_SYS_ENC_UP_ITEM":2221,"FLAG_SYS_FACTORY_GOLD":2253,"FLAG_SYS_FACTORY_SILVER":2252,"FLAG_SYS_FRONTIER_PASS":2258,"FLAG_SYS_GAME_CLEAR":2148,"FLAG_SYS_MIX_RECORD":2196,"FLAG_SYS_MYSTERY_EVENT_ENABLE":2220,"FLAG_SYS_MYSTERY_GIFT_ENABLE":2267,"FLAG_SYS_NATIONAL_DEX":2198,"FLAG_SYS_PALACE_GOLD":2249,"FLAG_SYS_PALACE_SILVER":2248,"FLAG_SYS_PC_LANETTE":2219,"FLAG_SYS_PIKE_GOLD":2255,"FLAG_SYS_PIKE_SILVER":2254,"FLAG_SYS_POKEDEX_GET":2145,"FLAG_SYS_POKEMON_GET":2144,"FLAG_SYS_POKENAV_GET":2146,"FLAG_SYS_PYRAMID_GOLD":2257,"FLAG_SYS_PYRAMID_SILVER":2256,"FLAG_SYS_REGIROCK_PUZZLE_COMPLETED":2224,"FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED":2226,"FLAG_SYS_RESET_RTC_ENABLE":2242,"FLAG_SYS_RIBBON_GET":2203,"FLAG_SYS_SAFARI_MODE":2188,"FLAG_SYS_SHOAL_ITEM":2239,"FLAG_SYS_SHOAL_TIDE":2202,"FLAG_SYS_TOWER_GOLD":2245,"FLAG_SYS_TOWER_SILVER":2244,"FLAG_SYS_TV_HOME":2192,"FLAG_SYS_TV_LATIAS_LATIOS":2237,"FLAG_SYS_TV_START":2194,"FLAG_SYS_TV_WATCH":2193,"FLAG_SYS_USE_FLASH":2184,"FLAG_SYS_USE_STRENGTH":2185,"FLAG_SYS_WEATHER_CTRL":2186,"FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE":112,"FLAG_TEMP_1":1,"FLAG_TEMP_10":16,"FLAG_TEMP_11":17,"FLAG_TEMP_12":18,"FLAG_TEMP_13":19,"FLAG_TEMP_14":20,"FLAG_TEMP_15":21,"FLAG_TEMP_16":22,"FLAG_TEMP_17":23,"FLAG_TEMP_18":24,"FLAG_TEMP_19":25,"FLAG_TEMP_1A":26,"FLAG_TEMP_1B":27,"FLAG_TEMP_1C":28,"FLAG_TEMP_1D":29,"FLAG_TEMP_1E":30,"FLAG_TEMP_1F":31,"FLAG_TEMP_2":2,"FLAG_TEMP_3":3,"FLAG_TEMP_4":4,"FLAG_TEMP_5":5,"FLAG_TEMP_6":6,"FLAG_TEMP_7":7,"FLAG_TEMP_8":8,"FLAG_TEMP_9":9,"FLAG_TEMP_A":10,"FLAG_TEMP_B":11,"FLAG_TEMP_C":12,"FLAG_TEMP_D":13,"FLAG_TEMP_E":14,"FLAG_TEMP_F":15,"FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE":17,"FLAG_TEMP_REGICE_PUZZLE_FAILED":3,"FLAG_TEMP_REGICE_PUZZLE_STARTED":2,"FLAG_TEMP_SKIP_GABBY_INTERVIEW":1,"FLAG_THANKED_FOR_PLAYING_WITH_WALLY":135,"FLAG_TOUGH_PAINTING_MADE":164,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1":194,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2":195,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3":196,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4":197,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5":198,"FLAG_TV_EXPLAINED":98,"FLAG_UNLOCKED_TRENDY_SAYINGS":2150,"FLAG_USED_ROOM_1_KEY":240,"FLAG_USED_ROOM_2_KEY":241,"FLAG_USED_ROOM_4_KEY":242,"FLAG_USED_ROOM_6_KEY":243,"FLAG_USED_STORAGE_KEY":239,"FLAG_VISITED_DEWFORD_TOWN":2161,"FLAG_VISITED_EVER_GRANDE_CITY":2174,"FLAG_VISITED_FALLARBOR_TOWN":2163,"FLAG_VISITED_FORTREE_CITY":2170,"FLAG_VISITED_LAVARIDGE_TOWN":2162,"FLAG_VISITED_LILYCOVE_CITY":2171,"FLAG_VISITED_LITTLEROOT_TOWN":2159,"FLAG_VISITED_MAUVILLE_CITY":2168,"FLAG_VISITED_MOSSDEEP_CITY":2172,"FLAG_VISITED_OLDALE_TOWN":2160,"FLAG_VISITED_PACIFIDLOG_TOWN":2165,"FLAG_VISITED_PETALBURG_CITY":2166,"FLAG_VISITED_RUSTBORO_CITY":2169,"FLAG_VISITED_SLATEPORT_CITY":2167,"FLAG_VISITED_SOOTOPOLIS_CITY":2173,"FLAG_VISITED_VERDANTURF_TOWN":2164,"FLAG_WALLACE_GOES_TO_SKY_PILLAR":311,"FLAG_WALLY_SPEECH":193,"FLAG_WATTSON_REMATCH_AVAILABLE":91,"FLAG_WHITEOUT_TO_LAVARIDGE":108,"FLAG_WINGULL_DELIVERED_MAIL":224,"FLAG_WINGULL_SENT_ON_ERRAND":222,"FLAG_WONDER_CARD_UNUSED_1":317,"FLAG_WONDER_CARD_UNUSED_10":326,"FLAG_WONDER_CARD_UNUSED_11":327,"FLAG_WONDER_CARD_UNUSED_12":328,"FLAG_WONDER_CARD_UNUSED_13":329,"FLAG_WONDER_CARD_UNUSED_14":330,"FLAG_WONDER_CARD_UNUSED_15":331,"FLAG_WONDER_CARD_UNUSED_16":332,"FLAG_WONDER_CARD_UNUSED_17":333,"FLAG_WONDER_CARD_UNUSED_2":318,"FLAG_WONDER_CARD_UNUSED_3":319,"FLAG_WONDER_CARD_UNUSED_4":320,"FLAG_WONDER_CARD_UNUSED_5":321,"FLAG_WONDER_CARD_UNUSED_6":322,"FLAG_WONDER_CARD_UNUSED_7":323,"FLAG_WONDER_CARD_UNUSED_8":324,"FLAG_WONDER_CARD_UNUSED_9":325,"FLAVOR_BITTER":3,"FLAVOR_COUNT":5,"FLAVOR_DRY":1,"FLAVOR_SOUR":4,"FLAVOR_SPICY":0,"FLAVOR_SWEET":2,"GOOD_ROD":1,"ITEMS_COUNT":377,"ITEM_034":52,"ITEM_035":53,"ITEM_036":54,"ITEM_037":55,"ITEM_038":56,"ITEM_039":57,"ITEM_03A":58,"ITEM_03B":59,"ITEM_03C":60,"ITEM_03D":61,"ITEM_03E":62,"ITEM_048":72,"ITEM_052":82,"ITEM_057":87,"ITEM_058":88,"ITEM_059":89,"ITEM_05A":90,"ITEM_05B":91,"ITEM_05C":92,"ITEM_063":99,"ITEM_064":100,"ITEM_065":101,"ITEM_066":102,"ITEM_069":105,"ITEM_071":113,"ITEM_072":114,"ITEM_073":115,"ITEM_074":116,"ITEM_075":117,"ITEM_076":118,"ITEM_077":119,"ITEM_078":120,"ITEM_0EA":234,"ITEM_0EB":235,"ITEM_0EC":236,"ITEM_0ED":237,"ITEM_0EE":238,"ITEM_0EF":239,"ITEM_0F0":240,"ITEM_0F1":241,"ITEM_0F2":242,"ITEM_0F3":243,"ITEM_0F4":244,"ITEM_0F5":245,"ITEM_0F6":246,"ITEM_0F7":247,"ITEM_0F8":248,"ITEM_0F9":249,"ITEM_0FA":250,"ITEM_0FB":251,"ITEM_0FC":252,"ITEM_0FD":253,"ITEM_10B":267,"ITEM_15B":347,"ITEM_15C":348,"ITEM_ACRO_BIKE":272,"ITEM_AGUAV_BERRY":146,"ITEM_AMULET_COIN":189,"ITEM_ANTIDOTE":14,"ITEM_APICOT_BERRY":172,"ITEM_ARCHIPELAGO_PROGRESSION":112,"ITEM_ASPEAR_BERRY":137,"ITEM_AURORA_TICKET":371,"ITEM_AWAKENING":17,"ITEM_BADGE_1":226,"ITEM_BADGE_2":227,"ITEM_BADGE_3":228,"ITEM_BADGE_4":229,"ITEM_BADGE_5":230,"ITEM_BADGE_6":231,"ITEM_BADGE_7":232,"ITEM_BADGE_8":233,"ITEM_BASEMENT_KEY":271,"ITEM_BEAD_MAIL":127,"ITEM_BELUE_BERRY":167,"ITEM_BERRY_JUICE":44,"ITEM_BERRY_POUCH":365,"ITEM_BICYCLE":360,"ITEM_BIG_MUSHROOM":104,"ITEM_BIG_PEARL":107,"ITEM_BIKE_VOUCHER":352,"ITEM_BLACK_BELT":207,"ITEM_BLACK_FLUTE":42,"ITEM_BLACK_GLASSES":206,"ITEM_BLUE_FLUTE":39,"ITEM_BLUE_ORB":277,"ITEM_BLUE_SCARF":255,"ITEM_BLUE_SHARD":49,"ITEM_BLUK_BERRY":149,"ITEM_BRIGHT_POWDER":179,"ITEM_BURN_HEAL":15,"ITEM_B_USE_MEDICINE":1,"ITEM_B_USE_OTHER":2,"ITEM_CALCIUM":67,"ITEM_CARBOS":66,"ITEM_CARD_KEY":355,"ITEM_CHARCOAL":215,"ITEM_CHERI_BERRY":133,"ITEM_CHESTO_BERRY":134,"ITEM_CHOICE_BAND":186,"ITEM_CLAW_FOSSIL":287,"ITEM_CLEANSE_TAG":190,"ITEM_COIN_CASE":260,"ITEM_CONTEST_PASS":266,"ITEM_CORNN_BERRY":159,"ITEM_DEEP_SEA_SCALE":193,"ITEM_DEEP_SEA_TOOTH":192,"ITEM_DEVON_GOODS":269,"ITEM_DEVON_SCOPE":288,"ITEM_DIRE_HIT":74,"ITEM_DIVE_BALL":7,"ITEM_DOME_FOSSIL":358,"ITEM_DRAGON_FANG":216,"ITEM_DRAGON_SCALE":201,"ITEM_DREAM_MAIL":130,"ITEM_DURIN_BERRY":166,"ITEM_ELIXIR":36,"ITEM_ENERGY_POWDER":30,"ITEM_ENERGY_ROOT":31,"ITEM_ENIGMA_BERRY":175,"ITEM_EON_TICKET":275,"ITEM_ESCAPE_ROPE":85,"ITEM_ETHER":34,"ITEM_EVERSTONE":195,"ITEM_EXP_SHARE":182,"ITEM_FAB_MAIL":131,"ITEM_FAME_CHECKER":363,"ITEM_FIGY_BERRY":143,"ITEM_FIRE_STONE":95,"ITEM_FLUFFY_TAIL":81,"ITEM_FOCUS_BAND":196,"ITEM_FRESH_WATER":26,"ITEM_FULL_HEAL":23,"ITEM_FULL_RESTORE":19,"ITEM_GANLON_BERRY":169,"ITEM_GLITTER_MAIL":123,"ITEM_GOLD_TEETH":353,"ITEM_GOOD_ROD":263,"ITEM_GO_GOGGLES":279,"ITEM_GREAT_BALL":3,"ITEM_GREEN_SCARF":257,"ITEM_GREEN_SHARD":51,"ITEM_GREPA_BERRY":157,"ITEM_GUARD_SPEC":73,"ITEM_HARBOR_MAIL":122,"ITEM_HARD_STONE":204,"ITEM_HEAL_POWDER":32,"ITEM_HEART_SCALE":111,"ITEM_HELIX_FOSSIL":357,"ITEM_HM01":339,"ITEM_HM02":340,"ITEM_HM03":341,"ITEM_HM04":342,"ITEM_HM05":343,"ITEM_HM06":344,"ITEM_HM07":345,"ITEM_HM08":346,"ITEM_HM_CUT":339,"ITEM_HM_DIVE":346,"ITEM_HM_FLASH":343,"ITEM_HM_FLY":340,"ITEM_HM_ROCK_SMASH":344,"ITEM_HM_STRENGTH":342,"ITEM_HM_SURF":341,"ITEM_HM_WATERFALL":345,"ITEM_HONDEW_BERRY":156,"ITEM_HP_UP":63,"ITEM_HYPER_POTION":21,"ITEM_IAPAPA_BERRY":147,"ITEM_ICE_HEAL":16,"ITEM_IRON":65,"ITEM_ITEMFINDER":261,"ITEM_KELPSY_BERRY":154,"ITEM_KINGS_ROCK":187,"ITEM_LANSAT_BERRY":173,"ITEM_LAVA_COOKIE":38,"ITEM_LAX_INCENSE":221,"ITEM_LEAF_STONE":98,"ITEM_LEFTOVERS":200,"ITEM_LEMONADE":28,"ITEM_LEPPA_BERRY":138,"ITEM_LETTER":274,"ITEM_LIECHI_BERRY":168,"ITEM_LIFT_KEY":356,"ITEM_LIGHT_BALL":202,"ITEM_LIST_END":65535,"ITEM_LUCKY_EGG":197,"ITEM_LUCKY_PUNCH":222,"ITEM_LUM_BERRY":141,"ITEM_LUXURY_BALL":11,"ITEM_MACHO_BRACE":181,"ITEM_MACH_BIKE":259,"ITEM_MAGMA_EMBLEM":375,"ITEM_MAGNET":208,"ITEM_MAGOST_BERRY":160,"ITEM_MAGO_BERRY":145,"ITEM_MASTER_BALL":1,"ITEM_MAX_ELIXIR":37,"ITEM_MAX_ETHER":35,"ITEM_MAX_POTION":20,"ITEM_MAX_REPEL":84,"ITEM_MAX_REVIVE":25,"ITEM_MECH_MAIL":124,"ITEM_MENTAL_HERB":185,"ITEM_METAL_COAT":199,"ITEM_METAL_POWDER":223,"ITEM_METEORITE":280,"ITEM_MIRACLE_SEED":205,"ITEM_MOOMOO_MILK":29,"ITEM_MOON_STONE":94,"ITEM_MYSTIC_TICKET":370,"ITEM_MYSTIC_WATER":209,"ITEM_NANAB_BERRY":150,"ITEM_NEST_BALL":8,"ITEM_NET_BALL":6,"ITEM_NEVER_MELT_ICE":212,"ITEM_NOMEL_BERRY":162,"ITEM_NONE":0,"ITEM_NUGGET":110,"ITEM_OAKS_PARCEL":349,"ITEM_OLD_AMBER":354,"ITEM_OLD_ROD":262,"ITEM_OLD_SEA_MAP":376,"ITEM_ORANGE_MAIL":121,"ITEM_ORAN_BERRY":139,"ITEM_PAMTRE_BERRY":164,"ITEM_PARALYZE_HEAL":18,"ITEM_PEARL":106,"ITEM_PECHA_BERRY":135,"ITEM_PERSIM_BERRY":140,"ITEM_PETAYA_BERRY":171,"ITEM_PINAP_BERRY":152,"ITEM_PINK_SCARF":256,"ITEM_POISON_BARB":211,"ITEM_POKEBLOCK_CASE":273,"ITEM_POKE_BALL":4,"ITEM_POKE_DOLL":80,"ITEM_POKE_FLUTE":350,"ITEM_POMEG_BERRY":153,"ITEM_POTION":13,"ITEM_POWDER_JAR":372,"ITEM_PP_MAX":71,"ITEM_PP_UP":69,"ITEM_PREMIER_BALL":12,"ITEM_PROTEIN":64,"ITEM_QUALOT_BERRY":155,"ITEM_QUICK_CLAW":183,"ITEM_RABUTA_BERRY":161,"ITEM_RAINBOW_PASS":368,"ITEM_RARE_CANDY":68,"ITEM_RAWST_BERRY":136,"ITEM_RAZZ_BERRY":148,"ITEM_RED_FLUTE":41,"ITEM_RED_ORB":276,"ITEM_RED_SCARF":254,"ITEM_RED_SHARD":48,"ITEM_REPEAT_BALL":9,"ITEM_REPEL":86,"ITEM_RETRO_MAIL":132,"ITEM_REVIVAL_HERB":33,"ITEM_REVIVE":24,"ITEM_ROOM_1_KEY":281,"ITEM_ROOM_2_KEY":282,"ITEM_ROOM_4_KEY":283,"ITEM_ROOM_6_KEY":284,"ITEM_ROOT_FOSSIL":286,"ITEM_RUBY":373,"ITEM_SACRED_ASH":45,"ITEM_SAFARI_BALL":5,"ITEM_SALAC_BERRY":170,"ITEM_SAPPHIRE":374,"ITEM_SCANNER":278,"ITEM_SCOPE_LENS":198,"ITEM_SEA_INCENSE":220,"ITEM_SECRET_KEY":351,"ITEM_SHADOW_MAIL":128,"ITEM_SHARP_BEAK":210,"ITEM_SHELL_BELL":219,"ITEM_SHOAL_SALT":46,"ITEM_SHOAL_SHELL":47,"ITEM_SILK_SCARF":217,"ITEM_SILPH_SCOPE":359,"ITEM_SILVER_POWDER":188,"ITEM_SITRUS_BERRY":142,"ITEM_SMOKE_BALL":194,"ITEM_SODA_POP":27,"ITEM_SOFT_SAND":203,"ITEM_SOOTHE_BELL":184,"ITEM_SOOT_SACK":270,"ITEM_SOUL_DEW":191,"ITEM_SPELL_TAG":213,"ITEM_SPELON_BERRY":163,"ITEM_SS_TICKET":265,"ITEM_STARDUST":108,"ITEM_STARF_BERRY":174,"ITEM_STAR_PIECE":109,"ITEM_STICK":225,"ITEM_STORAGE_KEY":285,"ITEM_SUN_STONE":93,"ITEM_SUPER_POTION":22,"ITEM_SUPER_REPEL":83,"ITEM_SUPER_ROD":264,"ITEM_TAMATO_BERRY":158,"ITEM_TEA":369,"ITEM_TEACHY_TV":366,"ITEM_THICK_CLUB":224,"ITEM_THUNDER_STONE":96,"ITEM_TIMER_BALL":10,"ITEM_TINY_MUSHROOM":103,"ITEM_TM01":289,"ITEM_TM02":290,"ITEM_TM03":291,"ITEM_TM04":292,"ITEM_TM05":293,"ITEM_TM06":294,"ITEM_TM07":295,"ITEM_TM08":296,"ITEM_TM09":297,"ITEM_TM10":298,"ITEM_TM11":299,"ITEM_TM12":300,"ITEM_TM13":301,"ITEM_TM14":302,"ITEM_TM15":303,"ITEM_TM16":304,"ITEM_TM17":305,"ITEM_TM18":306,"ITEM_TM19":307,"ITEM_TM20":308,"ITEM_TM21":309,"ITEM_TM22":310,"ITEM_TM23":311,"ITEM_TM24":312,"ITEM_TM25":313,"ITEM_TM26":314,"ITEM_TM27":315,"ITEM_TM28":316,"ITEM_TM29":317,"ITEM_TM30":318,"ITEM_TM31":319,"ITEM_TM32":320,"ITEM_TM33":321,"ITEM_TM34":322,"ITEM_TM35":323,"ITEM_TM36":324,"ITEM_TM37":325,"ITEM_TM38":326,"ITEM_TM39":327,"ITEM_TM40":328,"ITEM_TM41":329,"ITEM_TM42":330,"ITEM_TM43":331,"ITEM_TM44":332,"ITEM_TM45":333,"ITEM_TM46":334,"ITEM_TM47":335,"ITEM_TM48":336,"ITEM_TM49":337,"ITEM_TM50":338,"ITEM_TM_AERIAL_ACE":328,"ITEM_TM_ATTRACT":333,"ITEM_TM_BLIZZARD":302,"ITEM_TM_BRICK_BREAK":319,"ITEM_TM_BULK_UP":296,"ITEM_TM_BULLET_SEED":297,"ITEM_TM_CALM_MIND":292,"ITEM_TM_CASE":364,"ITEM_TM_DIG":316,"ITEM_TM_DOUBLE_TEAM":320,"ITEM_TM_DRAGON_CLAW":290,"ITEM_TM_EARTHQUAKE":314,"ITEM_TM_FACADE":330,"ITEM_TM_FIRE_BLAST":326,"ITEM_TM_FLAMETHROWER":323,"ITEM_TM_FOCUS_PUNCH":289,"ITEM_TM_FRUSTRATION":309,"ITEM_TM_GIGA_DRAIN":307,"ITEM_TM_HAIL":295,"ITEM_TM_HIDDEN_POWER":298,"ITEM_TM_HYPER_BEAM":303,"ITEM_TM_ICE_BEAM":301,"ITEM_TM_IRON_TAIL":311,"ITEM_TM_LIGHT_SCREEN":304,"ITEM_TM_OVERHEAT":338,"ITEM_TM_PROTECT":305,"ITEM_TM_PSYCHIC":317,"ITEM_TM_RAIN_DANCE":306,"ITEM_TM_REFLECT":321,"ITEM_TM_REST":332,"ITEM_TM_RETURN":315,"ITEM_TM_ROAR":293,"ITEM_TM_ROCK_TOMB":327,"ITEM_TM_SAFEGUARD":308,"ITEM_TM_SANDSTORM":325,"ITEM_TM_SECRET_POWER":331,"ITEM_TM_SHADOW_BALL":318,"ITEM_TM_SHOCK_WAVE":322,"ITEM_TM_SKILL_SWAP":336,"ITEM_TM_SLUDGE_BOMB":324,"ITEM_TM_SNATCH":337,"ITEM_TM_SOLAR_BEAM":310,"ITEM_TM_STEEL_WING":335,"ITEM_TM_SUNNY_DAY":299,"ITEM_TM_TAUNT":300,"ITEM_TM_THIEF":334,"ITEM_TM_THUNDER":313,"ITEM_TM_THUNDERBOLT":312,"ITEM_TM_TORMENT":329,"ITEM_TM_TOXIC":294,"ITEM_TM_WATER_PULSE":291,"ITEM_TOWN_MAP":361,"ITEM_TRI_PASS":367,"ITEM_TROPIC_MAIL":129,"ITEM_TWISTED_SPOON":214,"ITEM_ULTRA_BALL":2,"ITEM_UNUSED_BERRY_1":176,"ITEM_UNUSED_BERRY_2":177,"ITEM_UNUSED_BERRY_3":178,"ITEM_UP_GRADE":218,"ITEM_USE_BAG_MENU":4,"ITEM_USE_FIELD":2,"ITEM_USE_MAIL":0,"ITEM_USE_PARTY_MENU":1,"ITEM_USE_PBLOCK_CASE":3,"ITEM_VS_SEEKER":362,"ITEM_WAILMER_PAIL":268,"ITEM_WATER_STONE":97,"ITEM_WATMEL_BERRY":165,"ITEM_WAVE_MAIL":126,"ITEM_WEPEAR_BERRY":151,"ITEM_WHITE_FLUTE":43,"ITEM_WHITE_HERB":180,"ITEM_WIKI_BERRY":144,"ITEM_WOOD_MAIL":125,"ITEM_X_ACCURACY":78,"ITEM_X_ATTACK":75,"ITEM_X_DEFEND":76,"ITEM_X_SPECIAL":79,"ITEM_X_SPEED":77,"ITEM_YELLOW_FLUTE":40,"ITEM_YELLOW_SCARF":258,"ITEM_YELLOW_SHARD":50,"ITEM_ZINC":70,"LAST_BALL":12,"LAST_BERRY_INDEX":175,"LAST_BERRY_MASTER_BERRY":162,"LAST_BERRY_MASTER_WIFE_BERRY":142,"LAST_KIRI_BERRY":162,"LAST_ROUTE_114_MAN_BERRY":152,"MACH_BIKE":0,"MAIL_NONE":255,"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":6207,"MAP_ABANDONED_SHIP_CORRIDORS_1F":6199,"MAP_ABANDONED_SHIP_CORRIDORS_B1F":6201,"MAP_ABANDONED_SHIP_DECK":6198,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":6209,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":6210,"MAP_ABANDONED_SHIP_ROOMS2_1F":6206,"MAP_ABANDONED_SHIP_ROOMS2_B1F":6203,"MAP_ABANDONED_SHIP_ROOMS_1F":6200,"MAP_ABANDONED_SHIP_ROOMS_B1F":6202,"MAP_ABANDONED_SHIP_ROOM_B1F":6205,"MAP_ABANDONED_SHIP_UNDERWATER1":6204,"MAP_ABANDONED_SHIP_UNDERWATER2":6208,"MAP_ALTERING_CAVE":6250,"MAP_ANCIENT_TOMB":6212,"MAP_AQUA_HIDEOUT_1F":6167,"MAP_AQUA_HIDEOUT_B1F":6168,"MAP_AQUA_HIDEOUT_B2F":6169,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":6218,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":6219,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":6220,"MAP_ARTISAN_CAVE_1F":6244,"MAP_ARTISAN_CAVE_B1F":6243,"MAP_BATTLE_COLOSSEUM_2P":6424,"MAP_BATTLE_COLOSSEUM_4P":6427,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":6686,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":6685,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":6684,"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":6677,"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":6675,"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":6674,"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":6676,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":6689,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":6687,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":6688,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":6680,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":6679,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":6678,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":6691,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":6690,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":6694,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":6693,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":6695,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":6692,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":6682,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":6681,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":6683,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":6664,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":6663,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":6662,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":6661,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":6673,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":6672,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":6671,"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":6698,"MAP_BATTLE_FRONTIER_LOUNGE1":6697,"MAP_BATTLE_FRONTIER_LOUNGE2":6699,"MAP_BATTLE_FRONTIER_LOUNGE3":6700,"MAP_BATTLE_FRONTIER_LOUNGE4":6701,"MAP_BATTLE_FRONTIER_LOUNGE5":6703,"MAP_BATTLE_FRONTIER_LOUNGE6":6704,"MAP_BATTLE_FRONTIER_LOUNGE7":6705,"MAP_BATTLE_FRONTIER_LOUNGE8":6707,"MAP_BATTLE_FRONTIER_LOUNGE9":6708,"MAP_BATTLE_FRONTIER_MART":6711,"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":6670,"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":6660,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":6709,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":6710,"MAP_BATTLE_FRONTIER_RANKING_HALL":6696,"MAP_BATTLE_FRONTIER_RECEPTION_GATE":6706,"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":6702,"MAP_BATTLE_PYRAMID_SQUARE01":6444,"MAP_BATTLE_PYRAMID_SQUARE02":6445,"MAP_BATTLE_PYRAMID_SQUARE03":6446,"MAP_BATTLE_PYRAMID_SQUARE04":6447,"MAP_BATTLE_PYRAMID_SQUARE05":6448,"MAP_BATTLE_PYRAMID_SQUARE06":6449,"MAP_BATTLE_PYRAMID_SQUARE07":6450,"MAP_BATTLE_PYRAMID_SQUARE08":6451,"MAP_BATTLE_PYRAMID_SQUARE09":6452,"MAP_BATTLE_PYRAMID_SQUARE10":6453,"MAP_BATTLE_PYRAMID_SQUARE11":6454,"MAP_BATTLE_PYRAMID_SQUARE12":6455,"MAP_BATTLE_PYRAMID_SQUARE13":6456,"MAP_BATTLE_PYRAMID_SQUARE14":6457,"MAP_BATTLE_PYRAMID_SQUARE15":6458,"MAP_BATTLE_PYRAMID_SQUARE16":6459,"MAP_BIRTH_ISLAND_EXTERIOR":6714,"MAP_BIRTH_ISLAND_HARBOR":6715,"MAP_CAVE_OF_ORIGIN_1F":6182,"MAP_CAVE_OF_ORIGIN_B1F":6186,"MAP_CAVE_OF_ORIGIN_ENTRANCE":6181,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":6183,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":6184,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":6185,"MAP_CONTEST_HALL":6428,"MAP_CONTEST_HALL_BEAUTY":6435,"MAP_CONTEST_HALL_COOL":6437,"MAP_CONTEST_HALL_CUTE":6439,"MAP_CONTEST_HALL_SMART":6438,"MAP_CONTEST_HALL_TOUGH":6436,"MAP_DESERT_RUINS":6150,"MAP_DESERT_UNDERPASS":6242,"MAP_DEWFORD_TOWN":11,"MAP_DEWFORD_TOWN_GYM":771,"MAP_DEWFORD_TOWN_HALL":772,"MAP_DEWFORD_TOWN_HOUSE1":768,"MAP_DEWFORD_TOWN_HOUSE2":773,"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":769,"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":770,"MAP_EVER_GRANDE_CITY":8,"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":4100,"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":4099,"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":4098,"MAP_EVER_GRANDE_CITY_HALL1":4101,"MAP_EVER_GRANDE_CITY_HALL2":4102,"MAP_EVER_GRANDE_CITY_HALL3":4103,"MAP_EVER_GRANDE_CITY_HALL4":4104,"MAP_EVER_GRANDE_CITY_HALL5":4105,"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":4107,"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":4097,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":4108,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":4109,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":4106,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":4110,"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":4096,"MAP_FALLARBOR_TOWN":13,"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":1283,"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":1282,"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":1281,"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":1286,"MAP_FALLARBOR_TOWN_MART":1280,"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":1287,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":1284,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":1285,"MAP_FARAWAY_ISLAND_ENTRANCE":6712,"MAP_FARAWAY_ISLAND_INTERIOR":6713,"MAP_FIERY_PATH":6158,"MAP_FORTREE_CITY":4,"MAP_FORTREE_CITY_DECORATION_SHOP":3081,"MAP_FORTREE_CITY_GYM":3073,"MAP_FORTREE_CITY_HOUSE1":3072,"MAP_FORTREE_CITY_HOUSE2":3077,"MAP_FORTREE_CITY_HOUSE3":3078,"MAP_FORTREE_CITY_HOUSE4":3079,"MAP_FORTREE_CITY_HOUSE5":3080,"MAP_FORTREE_CITY_MART":3076,"MAP_FORTREE_CITY_POKEMON_CENTER_1F":3074,"MAP_FORTREE_CITY_POKEMON_CENTER_2F":3075,"MAP_GRANITE_CAVE_1F":6151,"MAP_GRANITE_CAVE_B1F":6152,"MAP_GRANITE_CAVE_B2F":6153,"MAP_GRANITE_CAVE_STEVENS_ROOM":6154,"MAP_GROUPS_COUNT":34,"MAP_INSIDE_OF_TRUCK":6440,"MAP_ISLAND_CAVE":6211,"MAP_JAGGED_PASS":6157,"MAP_LAVARIDGE_TOWN":12,"MAP_LAVARIDGE_TOWN_GYM_1F":1025,"MAP_LAVARIDGE_TOWN_GYM_B1F":1026,"MAP_LAVARIDGE_TOWN_HERB_SHOP":1024,"MAP_LAVARIDGE_TOWN_HOUSE":1027,"MAP_LAVARIDGE_TOWN_MART":1028,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":1029,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":1030,"MAP_LILYCOVE_CITY":5,"MAP_LILYCOVE_CITY_CONTEST_HALL":3333,"MAP_LILYCOVE_CITY_CONTEST_LOBBY":3332,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":3328,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":3329,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":3344,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":3345,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":3346,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":3347,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":3348,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":3350,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":3349,"MAP_LILYCOVE_CITY_HARBOR":3338,"MAP_LILYCOVE_CITY_HOUSE1":3340,"MAP_LILYCOVE_CITY_HOUSE2":3341,"MAP_LILYCOVE_CITY_HOUSE3":3342,"MAP_LILYCOVE_CITY_HOUSE4":3343,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":3330,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":3331,"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":3339,"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":3334,"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":3335,"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":3337,"MAP_LILYCOVE_CITY_UNUSED_MART":3336,"MAP_LITTLEROOT_TOWN":9,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":256,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":257,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":258,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":259,"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":260,"MAP_MAGMA_HIDEOUT_1F":6230,"MAP_MAGMA_HIDEOUT_2F_1R":6231,"MAP_MAGMA_HIDEOUT_2F_2R":6232,"MAP_MAGMA_HIDEOUT_2F_3R":6237,"MAP_MAGMA_HIDEOUT_3F_1R":6233,"MAP_MAGMA_HIDEOUT_3F_2R":6234,"MAP_MAGMA_HIDEOUT_3F_3R":6236,"MAP_MAGMA_HIDEOUT_4F":6235,"MAP_MARINE_CAVE_END":6247,"MAP_MARINE_CAVE_ENTRANCE":6246,"MAP_MAUVILLE_CITY":2,"MAP_MAUVILLE_CITY_BIKE_SHOP":2561,"MAP_MAUVILLE_CITY_GAME_CORNER":2563,"MAP_MAUVILLE_CITY_GYM":2560,"MAP_MAUVILLE_CITY_HOUSE1":2562,"MAP_MAUVILLE_CITY_HOUSE2":2564,"MAP_MAUVILLE_CITY_MART":2567,"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":2565,"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":2566,"MAP_METEOR_FALLS_1F_1R":6144,"MAP_METEOR_FALLS_1F_2R":6145,"MAP_METEOR_FALLS_B1F_1R":6146,"MAP_METEOR_FALLS_B1F_2R":6147,"MAP_METEOR_FALLS_STEVENS_CAVE":6251,"MAP_MIRAGE_TOWER_1F":6238,"MAP_MIRAGE_TOWER_2F":6239,"MAP_MIRAGE_TOWER_3F":6240,"MAP_MIRAGE_TOWER_4F":6241,"MAP_MOSSDEEP_CITY":6,"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":3595,"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":3596,"MAP_MOSSDEEP_CITY_GYM":3584,"MAP_MOSSDEEP_CITY_HOUSE1":3585,"MAP_MOSSDEEP_CITY_HOUSE2":3586,"MAP_MOSSDEEP_CITY_HOUSE3":3590,"MAP_MOSSDEEP_CITY_HOUSE4":3592,"MAP_MOSSDEEP_CITY_MART":3589,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":3587,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":3588,"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":3593,"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":3594,"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":3591,"MAP_MT_CHIMNEY":6156,"MAP_MT_CHIMNEY_CABLE_CAR_STATION":4865,"MAP_MT_PYRE_1F":6159,"MAP_MT_PYRE_2F":6160,"MAP_MT_PYRE_3F":6161,"MAP_MT_PYRE_4F":6162,"MAP_MT_PYRE_5F":6163,"MAP_MT_PYRE_6F":6164,"MAP_MT_PYRE_EXTERIOR":6165,"MAP_MT_PYRE_SUMMIT":6166,"MAP_NAVEL_ROCK_B1F":6725,"MAP_NAVEL_ROCK_BOTTOM":6743,"MAP_NAVEL_ROCK_DOWN01":6732,"MAP_NAVEL_ROCK_DOWN02":6733,"MAP_NAVEL_ROCK_DOWN03":6734,"MAP_NAVEL_ROCK_DOWN04":6735,"MAP_NAVEL_ROCK_DOWN05":6736,"MAP_NAVEL_ROCK_DOWN06":6737,"MAP_NAVEL_ROCK_DOWN07":6738,"MAP_NAVEL_ROCK_DOWN08":6739,"MAP_NAVEL_ROCK_DOWN09":6740,"MAP_NAVEL_ROCK_DOWN10":6741,"MAP_NAVEL_ROCK_DOWN11":6742,"MAP_NAVEL_ROCK_ENTRANCE":6724,"MAP_NAVEL_ROCK_EXTERIOR":6722,"MAP_NAVEL_ROCK_FORK":6726,"MAP_NAVEL_ROCK_HARBOR":6723,"MAP_NAVEL_ROCK_TOP":6731,"MAP_NAVEL_ROCK_UP1":6727,"MAP_NAVEL_ROCK_UP2":6728,"MAP_NAVEL_ROCK_UP3":6729,"MAP_NAVEL_ROCK_UP4":6730,"MAP_NEW_MAUVILLE_ENTRANCE":6196,"MAP_NEW_MAUVILLE_INSIDE":6197,"MAP_OLDALE_TOWN":10,"MAP_OLDALE_TOWN_HOUSE1":512,"MAP_OLDALE_TOWN_HOUSE2":513,"MAP_OLDALE_TOWN_MART":516,"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":514,"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":515,"MAP_PACIFIDLOG_TOWN":15,"MAP_PACIFIDLOG_TOWN_HOUSE1":1794,"MAP_PACIFIDLOG_TOWN_HOUSE2":1795,"MAP_PACIFIDLOG_TOWN_HOUSE3":1796,"MAP_PACIFIDLOG_TOWN_HOUSE4":1797,"MAP_PACIFIDLOG_TOWN_HOUSE5":1798,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":1792,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":1793,"MAP_PETALBURG_CITY":0,"MAP_PETALBURG_CITY_GYM":2049,"MAP_PETALBURG_CITY_HOUSE1":2050,"MAP_PETALBURG_CITY_HOUSE2":2051,"MAP_PETALBURG_CITY_MART":2054,"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":2052,"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":2053,"MAP_PETALBURG_CITY_WALLYS_HOUSE":2048,"MAP_PETALBURG_WOODS":6155,"MAP_RECORD_CORNER":6426,"MAP_ROUTE101":16,"MAP_ROUTE102":17,"MAP_ROUTE103":18,"MAP_ROUTE104":19,"MAP_ROUTE104_MR_BRINEYS_HOUSE":4352,"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":4353,"MAP_ROUTE104_PROTOTYPE":6912,"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":6913,"MAP_ROUTE105":20,"MAP_ROUTE106":21,"MAP_ROUTE107":22,"MAP_ROUTE108":23,"MAP_ROUTE109":24,"MAP_ROUTE109_SEASHORE_HOUSE":7168,"MAP_ROUTE110":25,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":7435,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":7436,"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":7426,"MAP_ROUTE110_TRICK_HOUSE_END":7425,"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":7424,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":7427,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":7428,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":7429,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":7430,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":7431,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":7432,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":7433,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":7434,"MAP_ROUTE111":26,"MAP_ROUTE111_OLD_LADYS_REST_STOP":4609,"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":4608,"MAP_ROUTE112":27,"MAP_ROUTE112_CABLE_CAR_STATION":4864,"MAP_ROUTE113":28,"MAP_ROUTE113_GLASS_WORKSHOP":7680,"MAP_ROUTE114":29,"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":5120,"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":5121,"MAP_ROUTE114_LANETTES_HOUSE":5122,"MAP_ROUTE115":30,"MAP_ROUTE116":31,"MAP_ROUTE116_TUNNELERS_REST_HOUSE":5376,"MAP_ROUTE117":32,"MAP_ROUTE117_POKEMON_DAY_CARE":5632,"MAP_ROUTE118":33,"MAP_ROUTE119":34,"MAP_ROUTE119_HOUSE":8194,"MAP_ROUTE119_WEATHER_INSTITUTE_1F":8192,"MAP_ROUTE119_WEATHER_INSTITUTE_2F":8193,"MAP_ROUTE120":35,"MAP_ROUTE121":36,"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":5888,"MAP_ROUTE122":37,"MAP_ROUTE123":38,"MAP_ROUTE123_BERRY_MASTERS_HOUSE":7936,"MAP_ROUTE124":39,"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":8448,"MAP_ROUTE125":40,"MAP_ROUTE126":41,"MAP_ROUTE127":42,"MAP_ROUTE128":43,"MAP_ROUTE129":44,"MAP_ROUTE130":45,"MAP_ROUTE131":46,"MAP_ROUTE132":47,"MAP_ROUTE133":48,"MAP_ROUTE134":49,"MAP_RUSTBORO_CITY":3,"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":2827,"MAP_RUSTBORO_CITY_DEVON_CORP_1F":2816,"MAP_RUSTBORO_CITY_DEVON_CORP_2F":2817,"MAP_RUSTBORO_CITY_DEVON_CORP_3F":2818,"MAP_RUSTBORO_CITY_FLAT1_1F":2824,"MAP_RUSTBORO_CITY_FLAT1_2F":2825,"MAP_RUSTBORO_CITY_FLAT2_1F":2829,"MAP_RUSTBORO_CITY_FLAT2_2F":2830,"MAP_RUSTBORO_CITY_FLAT2_3F":2831,"MAP_RUSTBORO_CITY_GYM":2819,"MAP_RUSTBORO_CITY_HOUSE1":2826,"MAP_RUSTBORO_CITY_HOUSE2":2828,"MAP_RUSTBORO_CITY_HOUSE3":2832,"MAP_RUSTBORO_CITY_MART":2823,"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":2821,"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":2822,"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":2820,"MAP_RUSTURF_TUNNEL":6148,"MAP_SAFARI_ZONE_NORTH":6657,"MAP_SAFARI_ZONE_NORTHEAST":6668,"MAP_SAFARI_ZONE_NORTHWEST":6656,"MAP_SAFARI_ZONE_REST_HOUSE":6667,"MAP_SAFARI_ZONE_SOUTH":6659,"MAP_SAFARI_ZONE_SOUTHEAST":6669,"MAP_SAFARI_ZONE_SOUTHWEST":6658,"MAP_SCORCHED_SLAB":6217,"MAP_SEAFLOOR_CAVERN_ENTRANCE":6171,"MAP_SEAFLOOR_CAVERN_ROOM1":6172,"MAP_SEAFLOOR_CAVERN_ROOM2":6173,"MAP_SEAFLOOR_CAVERN_ROOM3":6174,"MAP_SEAFLOOR_CAVERN_ROOM4":6175,"MAP_SEAFLOOR_CAVERN_ROOM5":6176,"MAP_SEAFLOOR_CAVERN_ROOM6":6177,"MAP_SEAFLOOR_CAVERN_ROOM7":6178,"MAP_SEAFLOOR_CAVERN_ROOM8":6179,"MAP_SEAFLOOR_CAVERN_ROOM9":6180,"MAP_SEALED_CHAMBER_INNER_ROOM":6216,"MAP_SEALED_CHAMBER_OUTER_ROOM":6215,"MAP_SECRET_BASE_BLUE_CAVE1":6402,"MAP_SECRET_BASE_BLUE_CAVE2":6408,"MAP_SECRET_BASE_BLUE_CAVE3":6414,"MAP_SECRET_BASE_BLUE_CAVE4":6420,"MAP_SECRET_BASE_BROWN_CAVE1":6401,"MAP_SECRET_BASE_BROWN_CAVE2":6407,"MAP_SECRET_BASE_BROWN_CAVE3":6413,"MAP_SECRET_BASE_BROWN_CAVE4":6419,"MAP_SECRET_BASE_RED_CAVE1":6400,"MAP_SECRET_BASE_RED_CAVE2":6406,"MAP_SECRET_BASE_RED_CAVE3":6412,"MAP_SECRET_BASE_RED_CAVE4":6418,"MAP_SECRET_BASE_SHRUB1":6405,"MAP_SECRET_BASE_SHRUB2":6411,"MAP_SECRET_BASE_SHRUB3":6417,"MAP_SECRET_BASE_SHRUB4":6423,"MAP_SECRET_BASE_TREE1":6404,"MAP_SECRET_BASE_TREE2":6410,"MAP_SECRET_BASE_TREE3":6416,"MAP_SECRET_BASE_TREE4":6422,"MAP_SECRET_BASE_YELLOW_CAVE1":6403,"MAP_SECRET_BASE_YELLOW_CAVE2":6409,"MAP_SECRET_BASE_YELLOW_CAVE3":6415,"MAP_SECRET_BASE_YELLOW_CAVE4":6421,"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":6194,"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":6195,"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":6190,"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":6227,"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":6191,"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":6193,"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":6192,"MAP_SKY_PILLAR_1F":6223,"MAP_SKY_PILLAR_2F":6224,"MAP_SKY_PILLAR_3F":6225,"MAP_SKY_PILLAR_4F":6226,"MAP_SKY_PILLAR_5F":6228,"MAP_SKY_PILLAR_ENTRANCE":6221,"MAP_SKY_PILLAR_OUTSIDE":6222,"MAP_SKY_PILLAR_TOP":6229,"MAP_SLATEPORT_CITY":1,"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":2308,"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":2307,"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":2306,"MAP_SLATEPORT_CITY_HARBOR":2313,"MAP_SLATEPORT_CITY_HOUSE":2314,"MAP_SLATEPORT_CITY_MART":2317,"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":2309,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":2311,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":2312,"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":2315,"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":2316,"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":2310,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":2304,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":2305,"MAP_SOOTOPOLIS_CITY":7,"MAP_SOOTOPOLIS_CITY_GYM_1F":3840,"MAP_SOOTOPOLIS_CITY_GYM_B1F":3841,"MAP_SOOTOPOLIS_CITY_HOUSE1":3845,"MAP_SOOTOPOLIS_CITY_HOUSE2":3846,"MAP_SOOTOPOLIS_CITY_HOUSE3":3847,"MAP_SOOTOPOLIS_CITY_HOUSE4":3848,"MAP_SOOTOPOLIS_CITY_HOUSE5":3849,"MAP_SOOTOPOLIS_CITY_HOUSE6":3850,"MAP_SOOTOPOLIS_CITY_HOUSE7":3851,"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":3852,"MAP_SOOTOPOLIS_CITY_MART":3844,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":3853,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":3854,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":3842,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":3843,"MAP_SOUTHERN_ISLAND_EXTERIOR":6665,"MAP_SOUTHERN_ISLAND_INTERIOR":6666,"MAP_SS_TIDAL_CORRIDOR":6441,"MAP_SS_TIDAL_LOWER_DECK":6442,"MAP_SS_TIDAL_ROOMS":6443,"MAP_TERRA_CAVE_END":6249,"MAP_TERRA_CAVE_ENTRANCE":6248,"MAP_TRADE_CENTER":6425,"MAP_TRAINER_HILL_1F":6717,"MAP_TRAINER_HILL_2F":6718,"MAP_TRAINER_HILL_3F":6719,"MAP_TRAINER_HILL_4F":6720,"MAP_TRAINER_HILL_ELEVATOR":6744,"MAP_TRAINER_HILL_ENTRANCE":6716,"MAP_TRAINER_HILL_ROOF":6721,"MAP_UNDERWATER_MARINE_CAVE":6245,"MAP_UNDERWATER_ROUTE105":55,"MAP_UNDERWATER_ROUTE124":50,"MAP_UNDERWATER_ROUTE125":56,"MAP_UNDERWATER_ROUTE126":51,"MAP_UNDERWATER_ROUTE127":52,"MAP_UNDERWATER_ROUTE128":53,"MAP_UNDERWATER_ROUTE129":54,"MAP_UNDERWATER_ROUTE134":6213,"MAP_UNDERWATER_SEAFLOOR_CAVERN":6170,"MAP_UNDERWATER_SEALED_CHAMBER":6214,"MAP_UNDERWATER_SOOTOPOLIS_CITY":6149,"MAP_UNION_ROOM":6460,"MAP_UNUSED_CONTEST_HALL1":6429,"MAP_UNUSED_CONTEST_HALL2":6430,"MAP_UNUSED_CONTEST_HALL3":6431,"MAP_UNUSED_CONTEST_HALL4":6432,"MAP_UNUSED_CONTEST_HALL5":6433,"MAP_UNUSED_CONTEST_HALL6":6434,"MAP_VERDANTURF_TOWN":14,"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":1538,"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":1537,"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":1536,"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":1543,"MAP_VERDANTURF_TOWN_HOUSE":1544,"MAP_VERDANTURF_TOWN_MART":1539,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":1540,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":1541,"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":1542,"MAP_VICTORY_ROAD_1F":6187,"MAP_VICTORY_ROAD_B1F":6188,"MAP_VICTORY_ROAD_B2F":6189,"MAX_BAG_ITEM_CAPACITY":99,"MAX_BERRY_CAPACITY":999,"MAX_BERRY_INDEX":178,"MAX_ITEM_DIGITS":3,"MAX_PC_ITEM_CAPACITY":999,"MAX_TRAINERS_COUNT":864,"MOVES_COUNT":355,"MOVE_ABSORB":71,"MOVE_ACID":51,"MOVE_ACID_ARMOR":151,"MOVE_AERIAL_ACE":332,"MOVE_AEROBLAST":177,"MOVE_AGILITY":97,"MOVE_AIR_CUTTER":314,"MOVE_AMNESIA":133,"MOVE_ANCIENT_POWER":246,"MOVE_ARM_THRUST":292,"MOVE_AROMATHERAPY":312,"MOVE_ASSIST":274,"MOVE_ASTONISH":310,"MOVE_ATTRACT":213,"MOVE_AURORA_BEAM":62,"MOVE_BARRAGE":140,"MOVE_BARRIER":112,"MOVE_BATON_PASS":226,"MOVE_BEAT_UP":251,"MOVE_BELLY_DRUM":187,"MOVE_BIDE":117,"MOVE_BIND":20,"MOVE_BITE":44,"MOVE_BLAST_BURN":307,"MOVE_BLAZE_KICK":299,"MOVE_BLIZZARD":59,"MOVE_BLOCK":335,"MOVE_BODY_SLAM":34,"MOVE_BONEMERANG":155,"MOVE_BONE_CLUB":125,"MOVE_BONE_RUSH":198,"MOVE_BOUNCE":340,"MOVE_BRICK_BREAK":280,"MOVE_BUBBLE":145,"MOVE_BUBBLE_BEAM":61,"MOVE_BULK_UP":339,"MOVE_BULLET_SEED":331,"MOVE_CALM_MIND":347,"MOVE_CAMOUFLAGE":293,"MOVE_CHARGE":268,"MOVE_CHARM":204,"MOVE_CLAMP":128,"MOVE_COMET_PUNCH":4,"MOVE_CONFUSE_RAY":109,"MOVE_CONFUSION":93,"MOVE_CONSTRICT":132,"MOVE_CONVERSION":160,"MOVE_CONVERSION_2":176,"MOVE_COSMIC_POWER":322,"MOVE_COTTON_SPORE":178,"MOVE_COUNTER":68,"MOVE_COVET":343,"MOVE_CRABHAMMER":152,"MOVE_CROSS_CHOP":238,"MOVE_CRUNCH":242,"MOVE_CRUSH_CLAW":306,"MOVE_CURSE":174,"MOVE_CUT":15,"MOVE_DEFENSE_CURL":111,"MOVE_DESTINY_BOND":194,"MOVE_DETECT":197,"MOVE_DIG":91,"MOVE_DISABLE":50,"MOVE_DIVE":291,"MOVE_DIZZY_PUNCH":146,"MOVE_DOOM_DESIRE":353,"MOVE_DOUBLE_EDGE":38,"MOVE_DOUBLE_KICK":24,"MOVE_DOUBLE_SLAP":3,"MOVE_DOUBLE_TEAM":104,"MOVE_DRAGON_BREATH":225,"MOVE_DRAGON_CLAW":337,"MOVE_DRAGON_DANCE":349,"MOVE_DRAGON_RAGE":82,"MOVE_DREAM_EATER":138,"MOVE_DRILL_PECK":65,"MOVE_DYNAMIC_PUNCH":223,"MOVE_EARTHQUAKE":89,"MOVE_EGG_BOMB":121,"MOVE_EMBER":52,"MOVE_ENCORE":227,"MOVE_ENDEAVOR":283,"MOVE_ENDURE":203,"MOVE_ERUPTION":284,"MOVE_EXPLOSION":153,"MOVE_EXTRASENSORY":326,"MOVE_EXTREME_SPEED":245,"MOVE_FACADE":263,"MOVE_FAINT_ATTACK":185,"MOVE_FAKE_OUT":252,"MOVE_FAKE_TEARS":313,"MOVE_FALSE_SWIPE":206,"MOVE_FEATHER_DANCE":297,"MOVE_FIRE_BLAST":126,"MOVE_FIRE_PUNCH":7,"MOVE_FIRE_SPIN":83,"MOVE_FISSURE":90,"MOVE_FLAIL":175,"MOVE_FLAMETHROWER":53,"MOVE_FLAME_WHEEL":172,"MOVE_FLASH":148,"MOVE_FLATTER":260,"MOVE_FLY":19,"MOVE_FOCUS_ENERGY":116,"MOVE_FOCUS_PUNCH":264,"MOVE_FOLLOW_ME":266,"MOVE_FORESIGHT":193,"MOVE_FRENZY_PLANT":338,"MOVE_FRUSTRATION":218,"MOVE_FURY_ATTACK":31,"MOVE_FURY_CUTTER":210,"MOVE_FURY_SWIPES":154,"MOVE_FUTURE_SIGHT":248,"MOVE_GIGA_DRAIN":202,"MOVE_GLARE":137,"MOVE_GRASS_WHISTLE":320,"MOVE_GROWL":45,"MOVE_GROWTH":74,"MOVE_GRUDGE":288,"MOVE_GUILLOTINE":12,"MOVE_GUST":16,"MOVE_HAIL":258,"MOVE_HARDEN":106,"MOVE_HAZE":114,"MOVE_HEADBUTT":29,"MOVE_HEAL_BELL":215,"MOVE_HEAT_WAVE":257,"MOVE_HELPING_HAND":270,"MOVE_HIDDEN_POWER":237,"MOVE_HI_JUMP_KICK":136,"MOVE_HORN_ATTACK":30,"MOVE_HORN_DRILL":32,"MOVE_HOWL":336,"MOVE_HYDRO_CANNON":308,"MOVE_HYDRO_PUMP":56,"MOVE_HYPER_BEAM":63,"MOVE_HYPER_FANG":158,"MOVE_HYPER_VOICE":304,"MOVE_HYPNOSIS":95,"MOVE_ICE_BALL":301,"MOVE_ICE_BEAM":58,"MOVE_ICE_PUNCH":8,"MOVE_ICICLE_SPEAR":333,"MOVE_ICY_WIND":196,"MOVE_IMPRISON":286,"MOVE_INGRAIN":275,"MOVE_IRON_DEFENSE":334,"MOVE_IRON_TAIL":231,"MOVE_JUMP_KICK":26,"MOVE_KARATE_CHOP":2,"MOVE_KINESIS":134,"MOVE_KNOCK_OFF":282,"MOVE_LEAF_BLADE":348,"MOVE_LEECH_LIFE":141,"MOVE_LEECH_SEED":73,"MOVE_LEER":43,"MOVE_LICK":122,"MOVE_LIGHT_SCREEN":113,"MOVE_LOCK_ON":199,"MOVE_LOVELY_KISS":142,"MOVE_LOW_KICK":67,"MOVE_LUSTER_PURGE":295,"MOVE_MACH_PUNCH":183,"MOVE_MAGICAL_LEAF":345,"MOVE_MAGIC_COAT":277,"MOVE_MAGNITUDE":222,"MOVE_MEAN_LOOK":212,"MOVE_MEDITATE":96,"MOVE_MEGAHORN":224,"MOVE_MEGA_DRAIN":72,"MOVE_MEGA_KICK":25,"MOVE_MEGA_PUNCH":5,"MOVE_MEMENTO":262,"MOVE_METAL_CLAW":232,"MOVE_METAL_SOUND":319,"MOVE_METEOR_MASH":309,"MOVE_METRONOME":118,"MOVE_MILK_DRINK":208,"MOVE_MIMIC":102,"MOVE_MIND_READER":170,"MOVE_MINIMIZE":107,"MOVE_MIRROR_COAT":243,"MOVE_MIRROR_MOVE":119,"MOVE_MIST":54,"MOVE_MIST_BALL":296,"MOVE_MOONLIGHT":236,"MOVE_MORNING_SUN":234,"MOVE_MUDDY_WATER":330,"MOVE_MUD_SHOT":341,"MOVE_MUD_SLAP":189,"MOVE_MUD_SPORT":300,"MOVE_NATURE_POWER":267,"MOVE_NEEDLE_ARM":302,"MOVE_NIGHTMARE":171,"MOVE_NIGHT_SHADE":101,"MOVE_NONE":0,"MOVE_OCTAZOOKA":190,"MOVE_ODOR_SLEUTH":316,"MOVE_OUTRAGE":200,"MOVE_OVERHEAT":315,"MOVE_PAIN_SPLIT":220,"MOVE_PAY_DAY":6,"MOVE_PECK":64,"MOVE_PERISH_SONG":195,"MOVE_PETAL_DANCE":80,"MOVE_PIN_MISSILE":42,"MOVE_POISON_FANG":305,"MOVE_POISON_GAS":139,"MOVE_POISON_POWDER":77,"MOVE_POISON_STING":40,"MOVE_POISON_TAIL":342,"MOVE_POUND":1,"MOVE_POWDER_SNOW":181,"MOVE_PRESENT":217,"MOVE_PROTECT":182,"MOVE_PSYBEAM":60,"MOVE_PSYCHIC":94,"MOVE_PSYCHO_BOOST":354,"MOVE_PSYCH_UP":244,"MOVE_PSYWAVE":149,"MOVE_PURSUIT":228,"MOVE_QUICK_ATTACK":98,"MOVE_RAGE":99,"MOVE_RAIN_DANCE":240,"MOVE_RAPID_SPIN":229,"MOVE_RAZOR_LEAF":75,"MOVE_RAZOR_WIND":13,"MOVE_RECOVER":105,"MOVE_RECYCLE":278,"MOVE_REFLECT":115,"MOVE_REFRESH":287,"MOVE_REST":156,"MOVE_RETURN":216,"MOVE_REVENGE":279,"MOVE_REVERSAL":179,"MOVE_ROAR":46,"MOVE_ROCK_BLAST":350,"MOVE_ROCK_SLIDE":157,"MOVE_ROCK_SMASH":249,"MOVE_ROCK_THROW":88,"MOVE_ROCK_TOMB":317,"MOVE_ROLE_PLAY":272,"MOVE_ROLLING_KICK":27,"MOVE_ROLLOUT":205,"MOVE_SACRED_FIRE":221,"MOVE_SAFEGUARD":219,"MOVE_SANDSTORM":201,"MOVE_SAND_ATTACK":28,"MOVE_SAND_TOMB":328,"MOVE_SCARY_FACE":184,"MOVE_SCRATCH":10,"MOVE_SCREECH":103,"MOVE_SECRET_POWER":290,"MOVE_SEISMIC_TOSS":69,"MOVE_SELF_DESTRUCT":120,"MOVE_SHADOW_BALL":247,"MOVE_SHADOW_PUNCH":325,"MOVE_SHARPEN":159,"MOVE_SHEER_COLD":329,"MOVE_SHOCK_WAVE":351,"MOVE_SIGNAL_BEAM":324,"MOVE_SILVER_WIND":318,"MOVE_SING":47,"MOVE_SKETCH":166,"MOVE_SKILL_SWAP":285,"MOVE_SKULL_BASH":130,"MOVE_SKY_ATTACK":143,"MOVE_SKY_UPPERCUT":327,"MOVE_SLACK_OFF":303,"MOVE_SLAM":21,"MOVE_SLASH":163,"MOVE_SLEEP_POWDER":79,"MOVE_SLEEP_TALK":214,"MOVE_SLUDGE":124,"MOVE_SLUDGE_BOMB":188,"MOVE_SMELLING_SALT":265,"MOVE_SMOG":123,"MOVE_SMOKESCREEN":108,"MOVE_SNATCH":289,"MOVE_SNORE":173,"MOVE_SOFT_BOILED":135,"MOVE_SOLAR_BEAM":76,"MOVE_SONIC_BOOM":49,"MOVE_SPARK":209,"MOVE_SPIDER_WEB":169,"MOVE_SPIKES":191,"MOVE_SPIKE_CANNON":131,"MOVE_SPITE":180,"MOVE_SPIT_UP":255,"MOVE_SPLASH":150,"MOVE_SPORE":147,"MOVE_STEEL_WING":211,"MOVE_STOCKPILE":254,"MOVE_STOMP":23,"MOVE_STRENGTH":70,"MOVE_STRING_SHOT":81,"MOVE_STRUGGLE":165,"MOVE_STUN_SPORE":78,"MOVE_SUBMISSION":66,"MOVE_SUBSTITUTE":164,"MOVE_SUNNY_DAY":241,"MOVE_SUPERPOWER":276,"MOVE_SUPERSONIC":48,"MOVE_SUPER_FANG":162,"MOVE_SURF":57,"MOVE_SWAGGER":207,"MOVE_SWALLOW":256,"MOVE_SWEET_KISS":186,"MOVE_SWEET_SCENT":230,"MOVE_SWIFT":129,"MOVE_SWORDS_DANCE":14,"MOVE_SYNTHESIS":235,"MOVE_TACKLE":33,"MOVE_TAIL_GLOW":294,"MOVE_TAIL_WHIP":39,"MOVE_TAKE_DOWN":36,"MOVE_TAUNT":269,"MOVE_TEETER_DANCE":298,"MOVE_TELEPORT":100,"MOVE_THIEF":168,"MOVE_THRASH":37,"MOVE_THUNDER":87,"MOVE_THUNDERBOLT":85,"MOVE_THUNDER_PUNCH":9,"MOVE_THUNDER_SHOCK":84,"MOVE_THUNDER_WAVE":86,"MOVE_TICKLE":321,"MOVE_TORMENT":259,"MOVE_TOXIC":92,"MOVE_TRANSFORM":144,"MOVE_TRICK":271,"MOVE_TRIPLE_KICK":167,"MOVE_TRI_ATTACK":161,"MOVE_TWINEEDLE":41,"MOVE_TWISTER":239,"MOVE_UNAVAILABLE":65535,"MOVE_UPROAR":253,"MOVE_VICE_GRIP":11,"MOVE_VINE_WHIP":22,"MOVE_VITAL_THROW":233,"MOVE_VOLT_TACKLE":344,"MOVE_WATERFALL":127,"MOVE_WATER_GUN":55,"MOVE_WATER_PULSE":352,"MOVE_WATER_SPORT":346,"MOVE_WATER_SPOUT":323,"MOVE_WEATHER_BALL":311,"MOVE_WHIRLPOOL":250,"MOVE_WHIRLWIND":18,"MOVE_WILL_O_WISP":261,"MOVE_WING_ATTACK":17,"MOVE_WISH":273,"MOVE_WITHDRAW":110,"MOVE_WRAP":35,"MOVE_YAWN":281,"MOVE_ZAP_CANNON":192,"MUS_ABANDONED_SHIP":381,"MUS_ABNORMAL_WEATHER":443,"MUS_AQUA_MAGMA_HIDEOUT":430,"MUS_AWAKEN_LEGEND":388,"MUS_BIRCH_LAB":383,"MUS_B_ARENA":458,"MUS_B_DOME":467,"MUS_B_DOME_LOBBY":473,"MUS_B_FACTORY":469,"MUS_B_FRONTIER":457,"MUS_B_PALACE":463,"MUS_B_PIKE":468,"MUS_B_PYRAMID":461,"MUS_B_PYRAMID_TOP":462,"MUS_B_TOWER":465,"MUS_B_TOWER_RS":384,"MUS_CABLE_CAR":425,"MUS_CAUGHT":352,"MUS_CAVE_OF_ORIGIN":386,"MUS_CONTEST":440,"MUS_CONTEST_LOBBY":452,"MUS_CONTEST_RESULTS":446,"MUS_CONTEST_WINNER":439,"MUS_CREDITS":455,"MUS_CYCLING":403,"MUS_C_COMM_CENTER":356,"MUS_C_VS_LEGEND_BEAST":358,"MUS_DESERT":409,"MUS_DEWFORD":427,"MUS_DUMMY":0,"MUS_ENCOUNTER_AQUA":419,"MUS_ENCOUNTER_BRENDAN":421,"MUS_ENCOUNTER_CHAMPION":454,"MUS_ENCOUNTER_COOL":417,"MUS_ENCOUNTER_ELITE_FOUR":450,"MUS_ENCOUNTER_FEMALE":407,"MUS_ENCOUNTER_GIRL":379,"MUS_ENCOUNTER_HIKER":451,"MUS_ENCOUNTER_INTENSE":416,"MUS_ENCOUNTER_INTERVIEWER":453,"MUS_ENCOUNTER_MAGMA":441,"MUS_ENCOUNTER_MALE":380,"MUS_ENCOUNTER_MAY":415,"MUS_ENCOUNTER_RICH":397,"MUS_ENCOUNTER_SUSPICIOUS":423,"MUS_ENCOUNTER_SWIMMER":385,"MUS_ENCOUNTER_TWINS":449,"MUS_END":456,"MUS_EVER_GRANDE":422,"MUS_EVOLUTION":377,"MUS_EVOLUTION_INTRO":376,"MUS_EVOLVED":371,"MUS_FALLARBOR":437,"MUS_FOLLOW_ME":420,"MUS_FORTREE":382,"MUS_GAME_CORNER":426,"MUS_GSC_PEWTER":357,"MUS_GSC_ROUTE38":351,"MUS_GYM":364,"MUS_HALL_OF_FAME":436,"MUS_HALL_OF_FAME_ROOM":447,"MUS_HEAL":368,"MUS_HELP":410,"MUS_INTRO":414,"MUS_INTRO_BATTLE":442,"MUS_LEVEL_UP":367,"MUS_LILYCOVE":408,"MUS_LILYCOVE_MUSEUM":373,"MUS_LINK_CONTEST_P1":393,"MUS_LINK_CONTEST_P2":394,"MUS_LINK_CONTEST_P3":395,"MUS_LINK_CONTEST_P4":396,"MUS_LITTLEROOT":405,"MUS_LITTLEROOT_TEST":350,"MUS_MOVE_DELETED":378,"MUS_MT_CHIMNEY":406,"MUS_MT_PYRE":432,"MUS_MT_PYRE_EXTERIOR":434,"MUS_NONE":65535,"MUS_OBTAIN_BADGE":369,"MUS_OBTAIN_BERRY":387,"MUS_OBTAIN_B_POINTS":459,"MUS_OBTAIN_ITEM":370,"MUS_OBTAIN_SYMBOL":466,"MUS_OBTAIN_TMHM":372,"MUS_OCEANIC_MUSEUM":375,"MUS_OLDALE":363,"MUS_PETALBURG":362,"MUS_PETALBURG_WOODS":366,"MUS_POKE_CENTER":400,"MUS_POKE_MART":404,"MUS_RAYQUAZA_APPEARS":464,"MUS_REGISTER_MATCH_CALL":460,"MUS_RG_BERRY_PICK":542,"MUS_RG_CAUGHT":534,"MUS_RG_CAUGHT_INTRO":531,"MUS_RG_CELADON":521,"MUS_RG_CINNABAR":491,"MUS_RG_CREDITS":502,"MUS_RG_CYCLING":494,"MUS_RG_DEX_RATING":529,"MUS_RG_ENCOUNTER_BOY":497,"MUS_RG_ENCOUNTER_DEOXYS":555,"MUS_RG_ENCOUNTER_GIRL":496,"MUS_RG_ENCOUNTER_GYM_LEADER":554,"MUS_RG_ENCOUNTER_RIVAL":527,"MUS_RG_ENCOUNTER_ROCKET":495,"MUS_RG_FOLLOW_ME":484,"MUS_RG_FUCHSIA":520,"MUS_RG_GAME_CORNER":485,"MUS_RG_GAME_FREAK":533,"MUS_RG_GYM":487,"MUS_RG_HALL_OF_FAME":498,"MUS_RG_HEAL":493,"MUS_RG_INTRO_FIGHT":489,"MUS_RG_JIGGLYPUFF":488,"MUS_RG_LAVENDER":492,"MUS_RG_MT_MOON":500,"MUS_RG_MYSTERY_GIFT":541,"MUS_RG_NET_CENTER":540,"MUS_RG_NEW_GAME_EXIT":537,"MUS_RG_NEW_GAME_INSTRUCT":535,"MUS_RG_NEW_GAME_INTRO":536,"MUS_RG_OAK":514,"MUS_RG_OAK_LAB":513,"MUS_RG_OBTAIN_KEY_ITEM":530,"MUS_RG_PALLET":512,"MUS_RG_PEWTER":526,"MUS_RG_PHOTO":532,"MUS_RG_POKE_CENTER":515,"MUS_RG_POKE_FLUTE":550,"MUS_RG_POKE_JUMP":538,"MUS_RG_POKE_MANSION":501,"MUS_RG_POKE_TOWER":518,"MUS_RG_RIVAL_EXIT":528,"MUS_RG_ROCKET_HIDEOUT":486,"MUS_RG_ROUTE1":503,"MUS_RG_ROUTE11":506,"MUS_RG_ROUTE24":504,"MUS_RG_ROUTE3":505,"MUS_RG_SEVII_123":547,"MUS_RG_SEVII_45":548,"MUS_RG_SEVII_67":549,"MUS_RG_SEVII_CAVE":543,"MUS_RG_SEVII_DUNGEON":546,"MUS_RG_SEVII_ROUTE":545,"MUS_RG_SILPH":519,"MUS_RG_SLOW_PALLET":557,"MUS_RG_SS_ANNE":516,"MUS_RG_SURF":517,"MUS_RG_TEACHY_TV_MENU":558,"MUS_RG_TEACHY_TV_SHOW":544,"MUS_RG_TITLE":490,"MUS_RG_TRAINER_TOWER":556,"MUS_RG_UNION_ROOM":539,"MUS_RG_VERMILLION":525,"MUS_RG_VICTORY_GYM_LEADER":524,"MUS_RG_VICTORY_ROAD":507,"MUS_RG_VICTORY_TRAINER":522,"MUS_RG_VICTORY_WILD":523,"MUS_RG_VIRIDIAN_FOREST":499,"MUS_RG_VS_CHAMPION":511,"MUS_RG_VS_DEOXYS":551,"MUS_RG_VS_GYM_LEADER":508,"MUS_RG_VS_LEGEND":553,"MUS_RG_VS_MEWTWO":552,"MUS_RG_VS_TRAINER":509,"MUS_RG_VS_WILD":510,"MUS_ROULETTE":392,"MUS_ROUTE101":359,"MUS_ROUTE104":401,"MUS_ROUTE110":360,"MUS_ROUTE113":418,"MUS_ROUTE118":32767,"MUS_ROUTE119":402,"MUS_ROUTE120":361,"MUS_ROUTE122":374,"MUS_RUSTBORO":399,"MUS_SAFARI_ZONE":428,"MUS_SAILING":431,"MUS_SCHOOL":435,"MUS_SEALED_CHAMBER":438,"MUS_SLATEPORT":433,"MUS_SLOTS_JACKPOT":389,"MUS_SLOTS_WIN":390,"MUS_SOOTOPOLIS":445,"MUS_SURF":365,"MUS_TITLE":413,"MUS_TOO_BAD":391,"MUS_TRICK_HOUSE":448,"MUS_UNDERWATER":411,"MUS_VERDANTURF":398,"MUS_VICTORY_AQUA_MAGMA":424,"MUS_VICTORY_GYM_LEADER":354,"MUS_VICTORY_LEAGUE":355,"MUS_VICTORY_ROAD":429,"MUS_VICTORY_TRAINER":412,"MUS_VICTORY_WILD":353,"MUS_VS_AQUA_MAGMA":475,"MUS_VS_AQUA_MAGMA_LEADER":483,"MUS_VS_CHAMPION":478,"MUS_VS_ELITE_FOUR":482,"MUS_VS_FRONTIER_BRAIN":471,"MUS_VS_GYM_LEADER":477,"MUS_VS_KYOGRE_GROUDON":480,"MUS_VS_MEW":472,"MUS_VS_RAYQUAZA":470,"MUS_VS_REGI":479,"MUS_VS_RIVAL":481,"MUS_VS_TRAINER":476,"MUS_VS_WILD":474,"MUS_WEATHER_GROUDON":444,"NUM_BADGES":8,"NUM_BERRY_MASTER_BERRIES":10,"NUM_BERRY_MASTER_BERRIES_SKIPPED":20,"NUM_BERRY_MASTER_WIFE_BERRIES":10,"NUM_DAILY_FLAGS":64,"NUM_HIDDEN_MACHINES":8,"NUM_KIRI_BERRIES":10,"NUM_KIRI_BERRIES_SKIPPED":20,"NUM_ROUTE_114_MAN_BERRIES":5,"NUM_ROUTE_114_MAN_BERRIES_SKIPPED":15,"NUM_SPECIAL_FLAGS":128,"NUM_SPECIES":412,"NUM_TECHNICAL_MACHINES":50,"NUM_TEMP_FLAGS":32,"NUM_WATER_STAGES":4,"NUM_WONDER_CARD_FLAGS":20,"OLD_ROD":0,"PH_CHOICE_BLEND":589,"PH_CHOICE_HELD":590,"PH_CHOICE_SOLO":591,"PH_CLOTH_BLEND":565,"PH_CLOTH_HELD":566,"PH_CLOTH_SOLO":567,"PH_CURE_BLEND":604,"PH_CURE_HELD":605,"PH_CURE_SOLO":606,"PH_DRESS_BLEND":568,"PH_DRESS_HELD":569,"PH_DRESS_SOLO":570,"PH_FACE_BLEND":562,"PH_FACE_HELD":563,"PH_FACE_SOLO":564,"PH_FLEECE_BLEND":571,"PH_FLEECE_HELD":572,"PH_FLEECE_SOLO":573,"PH_FOOT_BLEND":595,"PH_FOOT_HELD":596,"PH_FOOT_SOLO":597,"PH_GOAT_BLEND":583,"PH_GOAT_HELD":584,"PH_GOAT_SOLO":585,"PH_GOOSE_BLEND":598,"PH_GOOSE_HELD":599,"PH_GOOSE_SOLO":600,"PH_KIT_BLEND":574,"PH_KIT_HELD":575,"PH_KIT_SOLO":576,"PH_LOT_BLEND":580,"PH_LOT_HELD":581,"PH_LOT_SOLO":582,"PH_MOUTH_BLEND":592,"PH_MOUTH_HELD":593,"PH_MOUTH_SOLO":594,"PH_NURSE_BLEND":607,"PH_NURSE_HELD":608,"PH_NURSE_SOLO":609,"PH_PRICE_BLEND":577,"PH_PRICE_HELD":578,"PH_PRICE_SOLO":579,"PH_STRUT_BLEND":601,"PH_STRUT_HELD":602,"PH_STRUT_SOLO":603,"PH_THOUGHT_BLEND":586,"PH_THOUGHT_HELD":587,"PH_THOUGHT_SOLO":588,"PH_TRAP_BLEND":559,"PH_TRAP_HELD":560,"PH_TRAP_SOLO":561,"SE_A":25,"SE_APPLAUSE":105,"SE_ARENA_TIMEUP1":265,"SE_ARENA_TIMEUP2":266,"SE_BALL":23,"SE_BALLOON_BLUE":75,"SE_BALLOON_RED":74,"SE_BALLOON_YELLOW":76,"SE_BALL_BOUNCE_1":56,"SE_BALL_BOUNCE_2":57,"SE_BALL_BOUNCE_3":58,"SE_BALL_BOUNCE_4":59,"SE_BALL_OPEN":15,"SE_BALL_THROW":61,"SE_BALL_TRADE":60,"SE_BALL_TRAY_BALL":115,"SE_BALL_TRAY_ENTER":114,"SE_BALL_TRAY_EXIT":116,"SE_BANG":20,"SE_BERRY_BLENDER":53,"SE_BIKE_BELL":11,"SE_BIKE_HOP":34,"SE_BOO":22,"SE_BREAKABLE_DOOR":77,"SE_BRIDGE_WALK":71,"SE_CARD":54,"SE_CLICK":36,"SE_CONTEST_CONDITION_LOSE":38,"SE_CONTEST_CURTAIN_FALL":98,"SE_CONTEST_CURTAIN_RISE":97,"SE_CONTEST_HEART":96,"SE_CONTEST_ICON_CHANGE":99,"SE_CONTEST_ICON_CLEAR":100,"SE_CONTEST_MONS_TURN":101,"SE_CONTEST_PLACE":24,"SE_DEX_PAGE":109,"SE_DEX_SCROLL":108,"SE_DEX_SEARCH":112,"SE_DING_DONG":73,"SE_DOOR":8,"SE_DOWNPOUR":83,"SE_DOWNPOUR_STOP":84,"SE_E":28,"SE_EFFECTIVE":13,"SE_EGG_HATCH":113,"SE_ELEVATOR":89,"SE_ESCALATOR":80,"SE_EXIT":9,"SE_EXP":33,"SE_EXP_MAX":91,"SE_FAILURE":32,"SE_FAINT":16,"SE_FALL":43,"SE_FIELD_POISON":79,"SE_FLEE":17,"SE_FU_ZAKU":37,"SE_GLASS_FLUTE":117,"SE_I":26,"SE_ICE_BREAK":41,"SE_ICE_CRACK":42,"SE_ICE_STAIRS":40,"SE_INTRO_BLAST":103,"SE_ITEMFINDER":72,"SE_LAVARIDGE_FALL_WARP":39,"SE_LEDGE":10,"SE_LOW_HEALTH":90,"SE_MUD_BALL":78,"SE_MUGSHOT":104,"SE_M_ABSORB":180,"SE_M_ABSORB_2":179,"SE_M_ACID_ARMOR":218,"SE_M_ATTRACT":226,"SE_M_ATTRACT2":227,"SE_M_BARRIER":208,"SE_M_BATON_PASS":224,"SE_M_BELLY_DRUM":185,"SE_M_BIND":170,"SE_M_BITE":161,"SE_M_BLIZZARD":153,"SE_M_BLIZZARD2":154,"SE_M_BONEMERANG":187,"SE_M_BRICK_BREAK":198,"SE_M_BUBBLE":124,"SE_M_BUBBLE2":125,"SE_M_BUBBLE3":126,"SE_M_BUBBLE_BEAM":182,"SE_M_BUBBLE_BEAM2":183,"SE_M_CHARGE":213,"SE_M_CHARM":212,"SE_M_COMET_PUNCH":139,"SE_M_CONFUSE_RAY":196,"SE_M_COSMIC_POWER":243,"SE_M_CRABHAMMER":142,"SE_M_CUT":128,"SE_M_DETECT":209,"SE_M_DIG":175,"SE_M_DIVE":233,"SE_M_DIZZY_PUNCH":176,"SE_M_DOUBLE_SLAP":134,"SE_M_DOUBLE_TEAM":135,"SE_M_DRAGON_RAGE":171,"SE_M_EARTHQUAKE":234,"SE_M_EMBER":151,"SE_M_ENCORE":222,"SE_M_ENCORE2":223,"SE_M_EXPLOSION":178,"SE_M_FAINT_ATTACK":190,"SE_M_FIRE_PUNCH":147,"SE_M_FLAMETHROWER":146,"SE_M_FLAME_WHEEL":144,"SE_M_FLAME_WHEEL2":145,"SE_M_FLATTER":229,"SE_M_FLY":158,"SE_M_GIGA_DRAIN":199,"SE_M_GRASSWHISTLE":231,"SE_M_GUST":132,"SE_M_GUST2":133,"SE_M_HAIL":242,"SE_M_HARDEN":120,"SE_M_HAZE":246,"SE_M_HEADBUTT":162,"SE_M_HEAL_BELL":195,"SE_M_HEAT_WAVE":240,"SE_M_HORN_ATTACK":166,"SE_M_HYDRO_PUMP":164,"SE_M_HYPER_BEAM":215,"SE_M_HYPER_BEAM2":247,"SE_M_ICY_WIND":137,"SE_M_JUMP_KICK":143,"SE_M_LEER":192,"SE_M_LICK":188,"SE_M_LOCK_ON":210,"SE_M_MEGA_KICK":140,"SE_M_MEGA_KICK2":141,"SE_M_METRONOME":186,"SE_M_MILK_DRINK":225,"SE_M_MINIMIZE":204,"SE_M_MIST":168,"SE_M_MOONLIGHT":211,"SE_M_MORNING_SUN":228,"SE_M_NIGHTMARE":121,"SE_M_PAY_DAY":174,"SE_M_PERISH_SONG":173,"SE_M_PETAL_DANCE":202,"SE_M_POISON_POWDER":169,"SE_M_PSYBEAM":189,"SE_M_PSYBEAM2":200,"SE_M_RAIN_DANCE":127,"SE_M_RAZOR_WIND":136,"SE_M_RAZOR_WIND2":160,"SE_M_REFLECT":207,"SE_M_REVERSAL":217,"SE_M_ROCK_THROW":131,"SE_M_SACRED_FIRE":149,"SE_M_SACRED_FIRE2":150,"SE_M_SANDSTORM":219,"SE_M_SAND_ATTACK":159,"SE_M_SAND_TOMB":230,"SE_M_SCRATCH":155,"SE_M_SCREECH":181,"SE_M_SELF_DESTRUCT":177,"SE_M_SING":172,"SE_M_SKETCH":205,"SE_M_SKY_UPPERCUT":238,"SE_M_SNORE":197,"SE_M_SOLAR_BEAM":201,"SE_M_SPIT_UP":232,"SE_M_STAT_DECREASE":245,"SE_M_STAT_INCREASE":239,"SE_M_STRENGTH":214,"SE_M_STRING_SHOT":129,"SE_M_STRING_SHOT2":130,"SE_M_SUPERSONIC":184,"SE_M_SURF":163,"SE_M_SWAGGER":193,"SE_M_SWAGGER2":194,"SE_M_SWEET_SCENT":236,"SE_M_SWIFT":206,"SE_M_SWORDS_DANCE":191,"SE_M_TAIL_WHIP":167,"SE_M_TAKE_DOWN":152,"SE_M_TEETER_DANCE":244,"SE_M_TELEPORT":203,"SE_M_THUNDERBOLT":118,"SE_M_THUNDERBOLT2":119,"SE_M_THUNDER_WAVE":138,"SE_M_TOXIC":148,"SE_M_TRI_ATTACK":220,"SE_M_TRI_ATTACK2":221,"SE_M_TWISTER":235,"SE_M_UPROAR":241,"SE_M_VICEGRIP":156,"SE_M_VITAL_THROW":122,"SE_M_VITAL_THROW2":123,"SE_M_WATERFALL":216,"SE_M_WHIRLPOOL":165,"SE_M_WING_ATTACK":157,"SE_M_YAWN":237,"SE_N":30,"SE_NOTE_A":67,"SE_NOTE_B":68,"SE_NOTE_C":62,"SE_NOTE_C_HIGH":69,"SE_NOTE_D":63,"SE_NOTE_E":64,"SE_NOTE_F":65,"SE_NOTE_G":66,"SE_NOT_EFFECTIVE":12,"SE_O":29,"SE_ORB":107,"SE_PC_LOGIN":2,"SE_PC_OFF":3,"SE_PC_ON":4,"SE_PIKE_CURTAIN_CLOSE":267,"SE_PIKE_CURTAIN_OPEN":268,"SE_PIN":21,"SE_POKENAV_CALL":263,"SE_POKENAV_HANG_UP":264,"SE_POKENAV_OFF":111,"SE_POKENAV_ON":110,"SE_PUDDLE":70,"SE_RAIN":85,"SE_RAIN_STOP":86,"SE_REPEL":47,"SE_RG_BAG_CURSOR":252,"SE_RG_BAG_POCKET":253,"SE_RG_BALL_CLICK":254,"SE_RG_CARD_FLIP":249,"SE_RG_CARD_FLIPPING":250,"SE_RG_CARD_OPEN":251,"SE_RG_DEOXYS_MOVE":260,"SE_RG_DOOR":248,"SE_RG_HELP_CLOSE":258,"SE_RG_HELP_ERROR":259,"SE_RG_HELP_OPEN":257,"SE_RG_POKE_JUMP_FAILURE":262,"SE_RG_POKE_JUMP_SUCCESS":261,"SE_RG_SHOP":255,"SE_RG_SS_ANNE_HORN":256,"SE_ROTATING_GATE":48,"SE_ROULETTE_BALL":92,"SE_ROULETTE_BALL2":93,"SE_SAVE":55,"SE_SELECT":5,"SE_SHINY":102,"SE_SHIP":19,"SE_SHOP":95,"SE_SLIDING_DOOR":18,"SE_SUCCESS":31,"SE_SUDOWOODO_SHAKE":269,"SE_SUPER_EFFECTIVE":14,"SE_SWITCH":35,"SE_TAILLOW_WING_FLAP":94,"SE_THUNDER":87,"SE_THUNDER2":88,"SE_THUNDERSTORM":81,"SE_THUNDERSTORM_STOP":82,"SE_TRUCK_DOOR":52,"SE_TRUCK_MOVE":49,"SE_TRUCK_STOP":50,"SE_TRUCK_UNLOAD":51,"SE_U":27,"SE_UNLOCK":44,"SE_USE_ITEM":1,"SE_VEND":106,"SE_WALL_HIT":7,"SE_WARP_IN":45,"SE_WARP_OUT":46,"SE_WIN_OPEN":6,"SPECIAL_FLAGS_END":16511,"SPECIAL_FLAGS_START":16384,"SPECIES_ABRA":63,"SPECIES_ABSOL":376,"SPECIES_AERODACTYL":142,"SPECIES_AGGRON":384,"SPECIES_AIPOM":190,"SPECIES_ALAKAZAM":65,"SPECIES_ALTARIA":359,"SPECIES_AMPHAROS":181,"SPECIES_ANORITH":390,"SPECIES_ARBOK":24,"SPECIES_ARCANINE":59,"SPECIES_ARIADOS":168,"SPECIES_ARMALDO":391,"SPECIES_ARON":382,"SPECIES_ARTICUNO":144,"SPECIES_AZUMARILL":184,"SPECIES_AZURILL":350,"SPECIES_BAGON":395,"SPECIES_BALTOY":318,"SPECIES_BANETTE":378,"SPECIES_BARBOACH":323,"SPECIES_BAYLEEF":153,"SPECIES_BEAUTIFLY":292,"SPECIES_BEEDRILL":15,"SPECIES_BELDUM":398,"SPECIES_BELLOSSOM":182,"SPECIES_BELLSPROUT":69,"SPECIES_BLASTOISE":9,"SPECIES_BLAZIKEN":282,"SPECIES_BLISSEY":242,"SPECIES_BRELOOM":307,"SPECIES_BULBASAUR":1,"SPECIES_BUTTERFREE":12,"SPECIES_CACNEA":344,"SPECIES_CACTURNE":345,"SPECIES_CAMERUPT":340,"SPECIES_CARVANHA":330,"SPECIES_CASCOON":293,"SPECIES_CASTFORM":385,"SPECIES_CATERPIE":10,"SPECIES_CELEBI":251,"SPECIES_CHANSEY":113,"SPECIES_CHARIZARD":6,"SPECIES_CHARMANDER":4,"SPECIES_CHARMELEON":5,"SPECIES_CHIKORITA":152,"SPECIES_CHIMECHO":411,"SPECIES_CHINCHOU":170,"SPECIES_CLAMPERL":373,"SPECIES_CLAYDOL":319,"SPECIES_CLEFABLE":36,"SPECIES_CLEFAIRY":35,"SPECIES_CLEFFA":173,"SPECIES_CLOYSTER":91,"SPECIES_COMBUSKEN":281,"SPECIES_CORPHISH":326,"SPECIES_CORSOLA":222,"SPECIES_CRADILY":389,"SPECIES_CRAWDAUNT":327,"SPECIES_CROBAT":169,"SPECIES_CROCONAW":159,"SPECIES_CUBONE":104,"SPECIES_CYNDAQUIL":155,"SPECIES_DELCATTY":316,"SPECIES_DELIBIRD":225,"SPECIES_DEOXYS":410,"SPECIES_DEWGONG":87,"SPECIES_DIGLETT":50,"SPECIES_DITTO":132,"SPECIES_DODRIO":85,"SPECIES_DODUO":84,"SPECIES_DONPHAN":232,"SPECIES_DRAGONAIR":148,"SPECIES_DRAGONITE":149,"SPECIES_DRATINI":147,"SPECIES_DROWZEE":96,"SPECIES_DUGTRIO":51,"SPECIES_DUNSPARCE":206,"SPECIES_DUSCLOPS":362,"SPECIES_DUSKULL":361,"SPECIES_DUSTOX":294,"SPECIES_EEVEE":133,"SPECIES_EGG":412,"SPECIES_EKANS":23,"SPECIES_ELECTABUZZ":125,"SPECIES_ELECTRIKE":337,"SPECIES_ELECTRODE":101,"SPECIES_ELEKID":239,"SPECIES_ENTEI":244,"SPECIES_ESPEON":196,"SPECIES_EXEGGCUTE":102,"SPECIES_EXEGGUTOR":103,"SPECIES_EXPLOUD":372,"SPECIES_FARFETCHD":83,"SPECIES_FEAROW":22,"SPECIES_FEEBAS":328,"SPECIES_FERALIGATR":160,"SPECIES_FLAAFFY":180,"SPECIES_FLAREON":136,"SPECIES_FLYGON":334,"SPECIES_FORRETRESS":205,"SPECIES_FURRET":162,"SPECIES_GARDEVOIR":394,"SPECIES_GASTLY":92,"SPECIES_GENGAR":94,"SPECIES_GEODUDE":74,"SPECIES_GIRAFARIG":203,"SPECIES_GLALIE":347,"SPECIES_GLIGAR":207,"SPECIES_GLOOM":44,"SPECIES_GOLBAT":42,"SPECIES_GOLDEEN":118,"SPECIES_GOLDUCK":55,"SPECIES_GOLEM":76,"SPECIES_GOREBYSS":375,"SPECIES_GRANBULL":210,"SPECIES_GRAVELER":75,"SPECIES_GRIMER":88,"SPECIES_GROUDON":405,"SPECIES_GROVYLE":278,"SPECIES_GROWLITHE":58,"SPECIES_GRUMPIG":352,"SPECIES_GULPIN":367,"SPECIES_GYARADOS":130,"SPECIES_HARIYAMA":336,"SPECIES_HAUNTER":93,"SPECIES_HERACROSS":214,"SPECIES_HITMONCHAN":107,"SPECIES_HITMONLEE":106,"SPECIES_HITMONTOP":237,"SPECIES_HOOTHOOT":163,"SPECIES_HOPPIP":187,"SPECIES_HORSEA":116,"SPECIES_HOUNDOOM":229,"SPECIES_HOUNDOUR":228,"SPECIES_HO_OH":250,"SPECIES_HUNTAIL":374,"SPECIES_HYPNO":97,"SPECIES_IGGLYBUFF":174,"SPECIES_ILLUMISE":387,"SPECIES_IVYSAUR":2,"SPECIES_JIGGLYPUFF":39,"SPECIES_JIRACHI":409,"SPECIES_JOLTEON":135,"SPECIES_JUMPLUFF":189,"SPECIES_JYNX":124,"SPECIES_KABUTO":140,"SPECIES_KABUTOPS":141,"SPECIES_KADABRA":64,"SPECIES_KAKUNA":14,"SPECIES_KANGASKHAN":115,"SPECIES_KECLEON":317,"SPECIES_KINGDRA":230,"SPECIES_KINGLER":99,"SPECIES_KIRLIA":393,"SPECIES_KOFFING":109,"SPECIES_KRABBY":98,"SPECIES_KYOGRE":404,"SPECIES_LAIRON":383,"SPECIES_LANTURN":171,"SPECIES_LAPRAS":131,"SPECIES_LARVITAR":246,"SPECIES_LATIAS":407,"SPECIES_LATIOS":408,"SPECIES_LEDIAN":166,"SPECIES_LEDYBA":165,"SPECIES_LICKITUNG":108,"SPECIES_LILEEP":388,"SPECIES_LINOONE":289,"SPECIES_LOMBRE":296,"SPECIES_LOTAD":295,"SPECIES_LOUDRED":371,"SPECIES_LUDICOLO":297,"SPECIES_LUGIA":249,"SPECIES_LUNATONE":348,"SPECIES_LUVDISC":325,"SPECIES_MACHAMP":68,"SPECIES_MACHOKE":67,"SPECIES_MACHOP":66,"SPECIES_MAGBY":240,"SPECIES_MAGCARGO":219,"SPECIES_MAGIKARP":129,"SPECIES_MAGMAR":126,"SPECIES_MAGNEMITE":81,"SPECIES_MAGNETON":82,"SPECIES_MAKUHITA":335,"SPECIES_MANECTRIC":338,"SPECIES_MANKEY":56,"SPECIES_MANTINE":226,"SPECIES_MAREEP":179,"SPECIES_MARILL":183,"SPECIES_MAROWAK":105,"SPECIES_MARSHTOMP":284,"SPECIES_MASQUERAIN":312,"SPECIES_MAWILE":355,"SPECIES_MEDICHAM":357,"SPECIES_MEDITITE":356,"SPECIES_MEGANIUM":154,"SPECIES_MEOWTH":52,"SPECIES_METAGROSS":400,"SPECIES_METANG":399,"SPECIES_METAPOD":11,"SPECIES_MEW":151,"SPECIES_MEWTWO":150,"SPECIES_MIGHTYENA":287,"SPECIES_MILOTIC":329,"SPECIES_MILTANK":241,"SPECIES_MINUN":354,"SPECIES_MISDREAVUS":200,"SPECIES_MOLTRES":146,"SPECIES_MR_MIME":122,"SPECIES_MUDKIP":283,"SPECIES_MUK":89,"SPECIES_MURKROW":198,"SPECIES_NATU":177,"SPECIES_NIDOKING":34,"SPECIES_NIDOQUEEN":31,"SPECIES_NIDORAN_F":29,"SPECIES_NIDORAN_M":32,"SPECIES_NIDORINA":30,"SPECIES_NIDORINO":33,"SPECIES_NINCADA":301,"SPECIES_NINETALES":38,"SPECIES_NINJASK":302,"SPECIES_NOCTOWL":164,"SPECIES_NONE":0,"SPECIES_NOSEPASS":320,"SPECIES_NUMEL":339,"SPECIES_NUZLEAF":299,"SPECIES_OCTILLERY":224,"SPECIES_ODDISH":43,"SPECIES_OLD_UNOWN_B":252,"SPECIES_OLD_UNOWN_C":253,"SPECIES_OLD_UNOWN_D":254,"SPECIES_OLD_UNOWN_E":255,"SPECIES_OLD_UNOWN_F":256,"SPECIES_OLD_UNOWN_G":257,"SPECIES_OLD_UNOWN_H":258,"SPECIES_OLD_UNOWN_I":259,"SPECIES_OLD_UNOWN_J":260,"SPECIES_OLD_UNOWN_K":261,"SPECIES_OLD_UNOWN_L":262,"SPECIES_OLD_UNOWN_M":263,"SPECIES_OLD_UNOWN_N":264,"SPECIES_OLD_UNOWN_O":265,"SPECIES_OLD_UNOWN_P":266,"SPECIES_OLD_UNOWN_Q":267,"SPECIES_OLD_UNOWN_R":268,"SPECIES_OLD_UNOWN_S":269,"SPECIES_OLD_UNOWN_T":270,"SPECIES_OLD_UNOWN_U":271,"SPECIES_OLD_UNOWN_V":272,"SPECIES_OLD_UNOWN_W":273,"SPECIES_OLD_UNOWN_X":274,"SPECIES_OLD_UNOWN_Y":275,"SPECIES_OLD_UNOWN_Z":276,"SPECIES_OMANYTE":138,"SPECIES_OMASTAR":139,"SPECIES_ONIX":95,"SPECIES_PARAS":46,"SPECIES_PARASECT":47,"SPECIES_PELIPPER":310,"SPECIES_PERSIAN":53,"SPECIES_PHANPY":231,"SPECIES_PICHU":172,"SPECIES_PIDGEOT":18,"SPECIES_PIDGEOTTO":17,"SPECIES_PIDGEY":16,"SPECIES_PIKACHU":25,"SPECIES_PILOSWINE":221,"SPECIES_PINECO":204,"SPECIES_PINSIR":127,"SPECIES_PLUSLE":353,"SPECIES_POLITOED":186,"SPECIES_POLIWAG":60,"SPECIES_POLIWHIRL":61,"SPECIES_POLIWRATH":62,"SPECIES_PONYTA":77,"SPECIES_POOCHYENA":286,"SPECIES_PORYGON":137,"SPECIES_PORYGON2":233,"SPECIES_PRIMEAPE":57,"SPECIES_PSYDUCK":54,"SPECIES_PUPITAR":247,"SPECIES_QUAGSIRE":195,"SPECIES_QUILAVA":156,"SPECIES_QWILFISH":211,"SPECIES_RAICHU":26,"SPECIES_RAIKOU":243,"SPECIES_RALTS":392,"SPECIES_RAPIDASH":78,"SPECIES_RATICATE":20,"SPECIES_RATTATA":19,"SPECIES_RAYQUAZA":406,"SPECIES_REGICE":402,"SPECIES_REGIROCK":401,"SPECIES_REGISTEEL":403,"SPECIES_RELICANTH":381,"SPECIES_REMORAID":223,"SPECIES_RHYDON":112,"SPECIES_RHYHORN":111,"SPECIES_ROSELIA":363,"SPECIES_SABLEYE":322,"SPECIES_SALAMENCE":397,"SPECIES_SANDSHREW":27,"SPECIES_SANDSLASH":28,"SPECIES_SCEPTILE":279,"SPECIES_SCIZOR":212,"SPECIES_SCYTHER":123,"SPECIES_SEADRA":117,"SPECIES_SEAKING":119,"SPECIES_SEALEO":342,"SPECIES_SEEDOT":298,"SPECIES_SEEL":86,"SPECIES_SENTRET":161,"SPECIES_SEVIPER":379,"SPECIES_SHARPEDO":331,"SPECIES_SHEDINJA":303,"SPECIES_SHELGON":396,"SPECIES_SHELLDER":90,"SPECIES_SHIFTRY":300,"SPECIES_SHROOMISH":306,"SPECIES_SHUCKLE":213,"SPECIES_SHUPPET":377,"SPECIES_SILCOON":291,"SPECIES_SKARMORY":227,"SPECIES_SKIPLOOM":188,"SPECIES_SKITTY":315,"SPECIES_SLAKING":366,"SPECIES_SLAKOTH":364,"SPECIES_SLOWBRO":80,"SPECIES_SLOWKING":199,"SPECIES_SLOWPOKE":79,"SPECIES_SLUGMA":218,"SPECIES_SMEARGLE":235,"SPECIES_SMOOCHUM":238,"SPECIES_SNEASEL":215,"SPECIES_SNORLAX":143,"SPECIES_SNORUNT":346,"SPECIES_SNUBBULL":209,"SPECIES_SOLROCK":349,"SPECIES_SPEAROW":21,"SPECIES_SPHEAL":341,"SPECIES_SPINARAK":167,"SPECIES_SPINDA":308,"SPECIES_SPOINK":351,"SPECIES_SQUIRTLE":7,"SPECIES_STANTLER":234,"SPECIES_STARMIE":121,"SPECIES_STARYU":120,"SPECIES_STEELIX":208,"SPECIES_SUDOWOODO":185,"SPECIES_SUICUNE":245,"SPECIES_SUNFLORA":192,"SPECIES_SUNKERN":191,"SPECIES_SURSKIT":311,"SPECIES_SWABLU":358,"SPECIES_SWALOT":368,"SPECIES_SWAMPERT":285,"SPECIES_SWELLOW":305,"SPECIES_SWINUB":220,"SPECIES_TAILLOW":304,"SPECIES_TANGELA":114,"SPECIES_TAUROS":128,"SPECIES_TEDDIURSA":216,"SPECIES_TENTACOOL":72,"SPECIES_TENTACRUEL":73,"SPECIES_TOGEPI":175,"SPECIES_TOGETIC":176,"SPECIES_TORCHIC":280,"SPECIES_TORKOAL":321,"SPECIES_TOTODILE":158,"SPECIES_TRAPINCH":332,"SPECIES_TREECKO":277,"SPECIES_TROPIUS":369,"SPECIES_TYPHLOSION":157,"SPECIES_TYRANITAR":248,"SPECIES_TYROGUE":236,"SPECIES_UMBREON":197,"SPECIES_UNOWN":201,"SPECIES_UNOWN_B":413,"SPECIES_UNOWN_C":414,"SPECIES_UNOWN_D":415,"SPECIES_UNOWN_E":416,"SPECIES_UNOWN_EMARK":438,"SPECIES_UNOWN_F":417,"SPECIES_UNOWN_G":418,"SPECIES_UNOWN_H":419,"SPECIES_UNOWN_I":420,"SPECIES_UNOWN_J":421,"SPECIES_UNOWN_K":422,"SPECIES_UNOWN_L":423,"SPECIES_UNOWN_M":424,"SPECIES_UNOWN_N":425,"SPECIES_UNOWN_O":426,"SPECIES_UNOWN_P":427,"SPECIES_UNOWN_Q":428,"SPECIES_UNOWN_QMARK":439,"SPECIES_UNOWN_R":429,"SPECIES_UNOWN_S":430,"SPECIES_UNOWN_T":431,"SPECIES_UNOWN_U":432,"SPECIES_UNOWN_V":433,"SPECIES_UNOWN_W":434,"SPECIES_UNOWN_X":435,"SPECIES_UNOWN_Y":436,"SPECIES_UNOWN_Z":437,"SPECIES_URSARING":217,"SPECIES_VAPOREON":134,"SPECIES_VENOMOTH":49,"SPECIES_VENONAT":48,"SPECIES_VENUSAUR":3,"SPECIES_VIBRAVA":333,"SPECIES_VICTREEBEL":71,"SPECIES_VIGOROTH":365,"SPECIES_VILEPLUME":45,"SPECIES_VOLBEAT":386,"SPECIES_VOLTORB":100,"SPECIES_VULPIX":37,"SPECIES_WAILMER":313,"SPECIES_WAILORD":314,"SPECIES_WALREIN":343,"SPECIES_WARTORTLE":8,"SPECIES_WEEDLE":13,"SPECIES_WEEPINBELL":70,"SPECIES_WEEZING":110,"SPECIES_WHISCASH":324,"SPECIES_WHISMUR":370,"SPECIES_WIGGLYTUFF":40,"SPECIES_WINGULL":309,"SPECIES_WOBBUFFET":202,"SPECIES_WOOPER":194,"SPECIES_WURMPLE":290,"SPECIES_WYNAUT":360,"SPECIES_XATU":178,"SPECIES_YANMA":193,"SPECIES_ZANGOOSE":380,"SPECIES_ZAPDOS":145,"SPECIES_ZIGZAGOON":288,"SPECIES_ZUBAT":41,"SUPER_ROD":2,"SYSTEM_FLAGS":2144,"TEMP_FLAGS_END":31,"TEMP_FLAGS_START":0,"TRAINERS_COUNT":855,"TRAINER_AARON":397,"TRAINER_ABIGAIL_1":358,"TRAINER_ABIGAIL_2":360,"TRAINER_ABIGAIL_3":361,"TRAINER_ABIGAIL_4":362,"TRAINER_ABIGAIL_5":363,"TRAINER_AIDAN":674,"TRAINER_AISHA":757,"TRAINER_ALAN":630,"TRAINER_ALBERT":80,"TRAINER_ALBERTO":12,"TRAINER_ALEX":413,"TRAINER_ALEXA":670,"TRAINER_ALEXIA":90,"TRAINER_ALEXIS":248,"TRAINER_ALICE":448,"TRAINER_ALIX":750,"TRAINER_ALLEN":333,"TRAINER_ALLISON":387,"TRAINER_ALVARO":849,"TRAINER_ALYSSA":701,"TRAINER_AMY_AND_LIV_1":481,"TRAINER_AMY_AND_LIV_2":482,"TRAINER_AMY_AND_LIV_3":485,"TRAINER_AMY_AND_LIV_4":487,"TRAINER_AMY_AND_LIV_5":488,"TRAINER_AMY_AND_LIV_6":489,"TRAINER_ANABEL":805,"TRAINER_ANDREA":613,"TRAINER_ANDRES_1":737,"TRAINER_ANDRES_2":812,"TRAINER_ANDRES_3":813,"TRAINER_ANDRES_4":814,"TRAINER_ANDRES_5":815,"TRAINER_ANDREW":336,"TRAINER_ANGELICA":436,"TRAINER_ANGELINA":712,"TRAINER_ANGELO":802,"TRAINER_ANNA_AND_MEG_1":287,"TRAINER_ANNA_AND_MEG_2":288,"TRAINER_ANNA_AND_MEG_3":289,"TRAINER_ANNA_AND_MEG_4":290,"TRAINER_ANNA_AND_MEG_5":291,"TRAINER_ANNIKA":502,"TRAINER_ANTHONY":352,"TRAINER_ARCHIE":34,"TRAINER_ASHLEY":655,"TRAINER_ATHENA":577,"TRAINER_ATSUSHI":190,"TRAINER_AURON":506,"TRAINER_AUSTINA":58,"TRAINER_AUTUMN":217,"TRAINER_AXLE":203,"TRAINER_BARNY":343,"TRAINER_BARRY":163,"TRAINER_BEAU":212,"TRAINER_BECK":414,"TRAINER_BECKY":470,"TRAINER_BEN":323,"TRAINER_BENJAMIN_1":353,"TRAINER_BENJAMIN_2":354,"TRAINER_BENJAMIN_3":355,"TRAINER_BENJAMIN_4":356,"TRAINER_BENJAMIN_5":357,"TRAINER_BENNY":407,"TRAINER_BERKE":74,"TRAINER_BERNIE_1":206,"TRAINER_BERNIE_2":207,"TRAINER_BERNIE_3":208,"TRAINER_BERNIE_4":209,"TRAINER_BERNIE_5":210,"TRAINER_BETH":445,"TRAINER_BETHANY":301,"TRAINER_BEVERLY":441,"TRAINER_BIANCA":706,"TRAINER_BILLY":319,"TRAINER_BLAKE":235,"TRAINER_BRANDEN":745,"TRAINER_BRANDI":756,"TRAINER_BRANDON":811,"TRAINER_BRAWLY_1":266,"TRAINER_BRAWLY_2":774,"TRAINER_BRAWLY_3":775,"TRAINER_BRAWLY_4":776,"TRAINER_BRAWLY_5":777,"TRAINER_BRAXTON":75,"TRAINER_BRENDA":454,"TRAINER_BRENDAN_LILYCOVE_MUDKIP":661,"TRAINER_BRENDAN_LILYCOVE_TORCHIC":663,"TRAINER_BRENDAN_LILYCOVE_TREECKO":662,"TRAINER_BRENDAN_PLACEHOLDER":853,"TRAINER_BRENDAN_ROUTE_103_MUDKIP":520,"TRAINER_BRENDAN_ROUTE_103_TORCHIC":526,"TRAINER_BRENDAN_ROUTE_103_TREECKO":523,"TRAINER_BRENDAN_ROUTE_110_MUDKIP":521,"TRAINER_BRENDAN_ROUTE_110_TORCHIC":527,"TRAINER_BRENDAN_ROUTE_110_TREECKO":524,"TRAINER_BRENDAN_ROUTE_119_MUDKIP":522,"TRAINER_BRENDAN_ROUTE_119_TORCHIC":528,"TRAINER_BRENDAN_ROUTE_119_TREECKO":525,"TRAINER_BRENDAN_RUSTBORO_MUDKIP":593,"TRAINER_BRENDAN_RUSTBORO_TORCHIC":599,"TRAINER_BRENDAN_RUSTBORO_TREECKO":592,"TRAINER_BRENDEN":572,"TRAINER_BRENT":223,"TRAINER_BRIANNA":118,"TRAINER_BRICE":626,"TRAINER_BRIDGET":129,"TRAINER_BROOKE_1":94,"TRAINER_BROOKE_2":101,"TRAINER_BROOKE_3":102,"TRAINER_BROOKE_4":103,"TRAINER_BROOKE_5":104,"TRAINER_BRYAN":744,"TRAINER_BRYANT":746,"TRAINER_CALE":764,"TRAINER_CALLIE":763,"TRAINER_CALVIN_1":318,"TRAINER_CALVIN_2":328,"TRAINER_CALVIN_3":329,"TRAINER_CALVIN_4":330,"TRAINER_CALVIN_5":331,"TRAINER_CAMDEN":374,"TRAINER_CAMERON_1":238,"TRAINER_CAMERON_2":239,"TRAINER_CAMERON_3":240,"TRAINER_CAMERON_4":241,"TRAINER_CAMERON_5":242,"TRAINER_CAMRON":739,"TRAINER_CARLEE":464,"TRAINER_CAROL":471,"TRAINER_CAROLINA":741,"TRAINER_CAROLINE":99,"TRAINER_CARTER":345,"TRAINER_CATHERINE_1":559,"TRAINER_CATHERINE_2":562,"TRAINER_CATHERINE_3":563,"TRAINER_CATHERINE_4":564,"TRAINER_CATHERINE_5":565,"TRAINER_CEDRIC":475,"TRAINER_CELIA":743,"TRAINER_CELINA":705,"TRAINER_CHAD":174,"TRAINER_CHANDLER":698,"TRAINER_CHARLIE":66,"TRAINER_CHARLOTTE":714,"TRAINER_CHASE":378,"TRAINER_CHESTER":408,"TRAINER_CHIP":45,"TRAINER_CHRIS":693,"TRAINER_CINDY_1":114,"TRAINER_CINDY_2":117,"TRAINER_CINDY_3":120,"TRAINER_CINDY_4":121,"TRAINER_CINDY_5":122,"TRAINER_CINDY_6":123,"TRAINER_CLARENCE":580,"TRAINER_CLARISSA":435,"TRAINER_CLARK":631,"TRAINER_CLAUDE":338,"TRAINER_CLIFFORD":584,"TRAINER_COBY":709,"TRAINER_COLE":201,"TRAINER_COLIN":405,"TRAINER_COLTON":294,"TRAINER_CONNIE":128,"TRAINER_CONOR":511,"TRAINER_CORA":428,"TRAINER_CORY_1":740,"TRAINER_CORY_2":816,"TRAINER_CORY_3":817,"TRAINER_CORY_4":818,"TRAINER_CORY_5":819,"TRAINER_CRISSY":614,"TRAINER_CRISTIAN":574,"TRAINER_CRISTIN_1":767,"TRAINER_CRISTIN_2":828,"TRAINER_CRISTIN_3":829,"TRAINER_CRISTIN_4":830,"TRAINER_CRISTIN_5":831,"TRAINER_CYNDY_1":427,"TRAINER_CYNDY_2":430,"TRAINER_CYNDY_3":431,"TRAINER_CYNDY_4":432,"TRAINER_CYNDY_5":433,"TRAINER_DAISUKE":189,"TRAINER_DAISY":36,"TRAINER_DALE":341,"TRAINER_DALTON_1":196,"TRAINER_DALTON_2":197,"TRAINER_DALTON_3":198,"TRAINER_DALTON_4":199,"TRAINER_DALTON_5":200,"TRAINER_DANA":458,"TRAINER_DANIELLE":650,"TRAINER_DAPHNE":115,"TRAINER_DARCY":733,"TRAINER_DARIAN":696,"TRAINER_DARIUS":803,"TRAINER_DARRIN":154,"TRAINER_DAVID":158,"TRAINER_DAVIS":539,"TRAINER_DAWSON":694,"TRAINER_DAYTON":760,"TRAINER_DEAN":164,"TRAINER_DEANDRE":715,"TRAINER_DEBRA":460,"TRAINER_DECLAN":15,"TRAINER_DEMETRIUS":375,"TRAINER_DENISE":444,"TRAINER_DEREK":227,"TRAINER_DEVAN":753,"TRAINER_DEZ_AND_LUKE":640,"TRAINER_DIANA_1":474,"TRAINER_DIANA_2":477,"TRAINER_DIANA_3":478,"TRAINER_DIANA_4":479,"TRAINER_DIANA_5":480,"TRAINER_DIANNE":417,"TRAINER_DILLON":327,"TRAINER_DOMINIK":152,"TRAINER_DONALD":224,"TRAINER_DONNY":384,"TRAINER_DOUG":618,"TRAINER_DOUGLAS":153,"TRAINER_DRAKE":264,"TRAINER_DREW":211,"TRAINER_DUDLEY":173,"TRAINER_DUNCAN":496,"TRAINER_DUSTY_1":44,"TRAINER_DUSTY_2":47,"TRAINER_DUSTY_3":48,"TRAINER_DUSTY_4":49,"TRAINER_DUSTY_5":50,"TRAINER_DWAYNE":493,"TRAINER_DYLAN_1":364,"TRAINER_DYLAN_2":365,"TRAINER_DYLAN_3":366,"TRAINER_DYLAN_4":367,"TRAINER_DYLAN_5":368,"TRAINER_ED":13,"TRAINER_EDDIE":332,"TRAINER_EDGAR":79,"TRAINER_EDMOND":491,"TRAINER_EDWARD":232,"TRAINER_EDWARDO":404,"TRAINER_EDWIN_1":512,"TRAINER_EDWIN_2":515,"TRAINER_EDWIN_3":516,"TRAINER_EDWIN_4":517,"TRAINER_EDWIN_5":518,"TRAINER_ELI":501,"TRAINER_ELIJAH":742,"TRAINER_ELLIOT_1":339,"TRAINER_ELLIOT_2":346,"TRAINER_ELLIOT_3":347,"TRAINER_ELLIOT_4":348,"TRAINER_ELLIOT_5":349,"TRAINER_ERIC":632,"TRAINER_ERNEST_1":492,"TRAINER_ERNEST_2":497,"TRAINER_ERNEST_3":498,"TRAINER_ERNEST_4":499,"TRAINER_ERNEST_5":500,"TRAINER_ETHAN_1":216,"TRAINER_ETHAN_2":219,"TRAINER_ETHAN_3":220,"TRAINER_ETHAN_4":221,"TRAINER_ETHAN_5":222,"TRAINER_EVERETT":850,"TRAINER_FABIAN":759,"TRAINER_FELIX":38,"TRAINER_FERNANDO_1":195,"TRAINER_FERNANDO_2":832,"TRAINER_FERNANDO_3":833,"TRAINER_FERNANDO_4":834,"TRAINER_FERNANDO_5":835,"TRAINER_FLAGS_END":2143,"TRAINER_FLAGS_START":1280,"TRAINER_FLANNERY_1":268,"TRAINER_FLANNERY_2":782,"TRAINER_FLANNERY_3":783,"TRAINER_FLANNERY_4":784,"TRAINER_FLANNERY_5":785,"TRAINER_FLINT":654,"TRAINER_FOSTER":46,"TRAINER_FRANKLIN":170,"TRAINER_FREDRICK":29,"TRAINER_GABBY_AND_TY_1":51,"TRAINER_GABBY_AND_TY_2":52,"TRAINER_GABBY_AND_TY_3":53,"TRAINER_GABBY_AND_TY_4":54,"TRAINER_GABBY_AND_TY_5":55,"TRAINER_GABBY_AND_TY_6":56,"TRAINER_GABRIELLE_1":9,"TRAINER_GABRIELLE_2":840,"TRAINER_GABRIELLE_3":841,"TRAINER_GABRIELLE_4":842,"TRAINER_GABRIELLE_5":843,"TRAINER_GARRET":138,"TRAINER_GARRISON":547,"TRAINER_GEORGE":73,"TRAINER_GEORGIA":281,"TRAINER_GERALD":648,"TRAINER_GILBERT":169,"TRAINER_GINA_AND_MIA_1":483,"TRAINER_GINA_AND_MIA_2":486,"TRAINER_GLACIA":263,"TRAINER_GRACE":450,"TRAINER_GREG":619,"TRAINER_GRETA":808,"TRAINER_GRUNT_AQUA_HIDEOUT_1":2,"TRAINER_GRUNT_AQUA_HIDEOUT_2":3,"TRAINER_GRUNT_AQUA_HIDEOUT_3":4,"TRAINER_GRUNT_AQUA_HIDEOUT_4":5,"TRAINER_GRUNT_AQUA_HIDEOUT_5":27,"TRAINER_GRUNT_AQUA_HIDEOUT_6":28,"TRAINER_GRUNT_AQUA_HIDEOUT_7":192,"TRAINER_GRUNT_AQUA_HIDEOUT_8":193,"TRAINER_GRUNT_JAGGED_PASS":570,"TRAINER_GRUNT_MAGMA_HIDEOUT_1":716,"TRAINER_GRUNT_MAGMA_HIDEOUT_10":725,"TRAINER_GRUNT_MAGMA_HIDEOUT_11":726,"TRAINER_GRUNT_MAGMA_HIDEOUT_12":727,"TRAINER_GRUNT_MAGMA_HIDEOUT_13":728,"TRAINER_GRUNT_MAGMA_HIDEOUT_14":729,"TRAINER_GRUNT_MAGMA_HIDEOUT_15":730,"TRAINER_GRUNT_MAGMA_HIDEOUT_16":731,"TRAINER_GRUNT_MAGMA_HIDEOUT_2":717,"TRAINER_GRUNT_MAGMA_HIDEOUT_3":718,"TRAINER_GRUNT_MAGMA_HIDEOUT_4":719,"TRAINER_GRUNT_MAGMA_HIDEOUT_5":720,"TRAINER_GRUNT_MAGMA_HIDEOUT_6":721,"TRAINER_GRUNT_MAGMA_HIDEOUT_7":722,"TRAINER_GRUNT_MAGMA_HIDEOUT_8":723,"TRAINER_GRUNT_MAGMA_HIDEOUT_9":724,"TRAINER_GRUNT_MT_CHIMNEY_1":146,"TRAINER_GRUNT_MT_CHIMNEY_2":579,"TRAINER_GRUNT_MT_PYRE_1":23,"TRAINER_GRUNT_MT_PYRE_2":24,"TRAINER_GRUNT_MT_PYRE_3":25,"TRAINER_GRUNT_MT_PYRE_4":569,"TRAINER_GRUNT_MUSEUM_1":20,"TRAINER_GRUNT_MUSEUM_2":21,"TRAINER_GRUNT_PETALBURG_WOODS":10,"TRAINER_GRUNT_RUSTURF_TUNNEL":16,"TRAINER_GRUNT_SEAFLOOR_CAVERN_1":6,"TRAINER_GRUNT_SEAFLOOR_CAVERN_2":7,"TRAINER_GRUNT_SEAFLOOR_CAVERN_3":8,"TRAINER_GRUNT_SEAFLOOR_CAVERN_4":14,"TRAINER_GRUNT_SEAFLOOR_CAVERN_5":567,"TRAINER_GRUNT_SPACE_CENTER_1":22,"TRAINER_GRUNT_SPACE_CENTER_2":116,"TRAINER_GRUNT_SPACE_CENTER_3":586,"TRAINER_GRUNT_SPACE_CENTER_4":587,"TRAINER_GRUNT_SPACE_CENTER_5":588,"TRAINER_GRUNT_SPACE_CENTER_6":589,"TRAINER_GRUNT_SPACE_CENTER_7":590,"TRAINER_GRUNT_UNUSED":568,"TRAINER_GRUNT_WEATHER_INST_1":17,"TRAINER_GRUNT_WEATHER_INST_2":18,"TRAINER_GRUNT_WEATHER_INST_3":19,"TRAINER_GRUNT_WEATHER_INST_4":26,"TRAINER_GRUNT_WEATHER_INST_5":596,"TRAINER_GWEN":59,"TRAINER_HAILEY":697,"TRAINER_HALEY_1":604,"TRAINER_HALEY_2":607,"TRAINER_HALEY_3":608,"TRAINER_HALEY_4":609,"TRAINER_HALEY_5":610,"TRAINER_HALLE":546,"TRAINER_HANNAH":244,"TRAINER_HARRISON":578,"TRAINER_HAYDEN":707,"TRAINER_HECTOR":513,"TRAINER_HEIDI":469,"TRAINER_HELENE":751,"TRAINER_HENRY":668,"TRAINER_HERMAN":167,"TRAINER_HIDEO":651,"TRAINER_HITOSHI":180,"TRAINER_HOPE":96,"TRAINER_HUDSON":510,"TRAINER_HUEY":490,"TRAINER_HUGH":399,"TRAINER_HUMBERTO":402,"TRAINER_IMANI":442,"TRAINER_IRENE":476,"TRAINER_ISAAC_1":538,"TRAINER_ISAAC_2":541,"TRAINER_ISAAC_3":542,"TRAINER_ISAAC_4":543,"TRAINER_ISAAC_5":544,"TRAINER_ISABELLA":595,"TRAINER_ISABELLE":736,"TRAINER_ISABEL_1":302,"TRAINER_ISABEL_2":303,"TRAINER_ISABEL_3":304,"TRAINER_ISABEL_4":305,"TRAINER_ISABEL_5":306,"TRAINER_ISAIAH_1":376,"TRAINER_ISAIAH_2":379,"TRAINER_ISAIAH_3":380,"TRAINER_ISAIAH_4":381,"TRAINER_ISAIAH_5":382,"TRAINER_ISOBEL":383,"TRAINER_IVAN":337,"TRAINER_JACE":204,"TRAINER_JACK":172,"TRAINER_JACKI_1":249,"TRAINER_JACKI_2":250,"TRAINER_JACKI_3":251,"TRAINER_JACKI_4":252,"TRAINER_JACKI_5":253,"TRAINER_JACKSON_1":552,"TRAINER_JACKSON_2":555,"TRAINER_JACKSON_3":556,"TRAINER_JACKSON_4":557,"TRAINER_JACKSON_5":558,"TRAINER_JACLYN":243,"TRAINER_JACOB":351,"TRAINER_JAIDEN":749,"TRAINER_JAMES_1":621,"TRAINER_JAMES_2":622,"TRAINER_JAMES_3":623,"TRAINER_JAMES_4":624,"TRAINER_JAMES_5":625,"TRAINER_JANI":418,"TRAINER_JANICE":605,"TRAINER_JARED":401,"TRAINER_JASMINE":359,"TRAINER_JAYLEN":326,"TRAINER_JAZMYN":503,"TRAINER_JEFF":202,"TRAINER_JEFFREY_1":226,"TRAINER_JEFFREY_2":228,"TRAINER_JEFFREY_3":229,"TRAINER_JEFFREY_4":230,"TRAINER_JEFFREY_5":231,"TRAINER_JENNA":560,"TRAINER_JENNIFER":95,"TRAINER_JENNY_1":449,"TRAINER_JENNY_2":465,"TRAINER_JENNY_3":466,"TRAINER_JENNY_4":467,"TRAINER_JENNY_5":468,"TRAINER_JEROME":156,"TRAINER_JERRY_1":273,"TRAINER_JERRY_2":276,"TRAINER_JERRY_3":277,"TRAINER_JERRY_4":278,"TRAINER_JERRY_5":279,"TRAINER_JESSICA_1":127,"TRAINER_JESSICA_2":132,"TRAINER_JESSICA_3":133,"TRAINER_JESSICA_4":134,"TRAINER_JESSICA_5":135,"TRAINER_JOCELYN":425,"TRAINER_JODY":91,"TRAINER_JOEY":322,"TRAINER_JOHANNA":647,"TRAINER_JOHNSON":754,"TRAINER_JOHN_AND_JAY_1":681,"TRAINER_JOHN_AND_JAY_2":682,"TRAINER_JOHN_AND_JAY_3":683,"TRAINER_JOHN_AND_JAY_4":684,"TRAINER_JOHN_AND_JAY_5":685,"TRAINER_JONAH":667,"TRAINER_JONAS":504,"TRAINER_JONATHAN":598,"TRAINER_JOSE":617,"TRAINER_JOSEPH":700,"TRAINER_JOSH":320,"TRAINER_JOSHUA":237,"TRAINER_JOSUE":738,"TRAINER_JUAN_1":272,"TRAINER_JUAN_2":798,"TRAINER_JUAN_3":799,"TRAINER_JUAN_4":800,"TRAINER_JUAN_5":801,"TRAINER_JULIE":100,"TRAINER_JULIO":566,"TRAINER_JUSTIN":215,"TRAINER_KAI":713,"TRAINER_KALEB":699,"TRAINER_KARA":457,"TRAINER_KAREN_1":280,"TRAINER_KAREN_2":282,"TRAINER_KAREN_3":283,"TRAINER_KAREN_4":284,"TRAINER_KAREN_5":285,"TRAINER_KATELYNN":325,"TRAINER_KATELYN_1":386,"TRAINER_KATELYN_2":388,"TRAINER_KATELYN_3":389,"TRAINER_KATELYN_4":390,"TRAINER_KATELYN_5":391,"TRAINER_KATE_AND_JOY":286,"TRAINER_KATHLEEN":583,"TRAINER_KATIE":455,"TRAINER_KAYLA":247,"TRAINER_KAYLEE":462,"TRAINER_KAYLEY":505,"TRAINER_KEEGAN":205,"TRAINER_KEIGO":652,"TRAINER_KEIRA":93,"TRAINER_KELVIN":507,"TRAINER_KENT":620,"TRAINER_KEVIN":171,"TRAINER_KIM_AND_IRIS":678,"TRAINER_KINDRA":106,"TRAINER_KIRA_AND_DAN_1":642,"TRAINER_KIRA_AND_DAN_2":643,"TRAINER_KIRA_AND_DAN_3":644,"TRAINER_KIRA_AND_DAN_4":645,"TRAINER_KIRA_AND_DAN_5":646,"TRAINER_KIRK":191,"TRAINER_KIYO":181,"TRAINER_KOICHI":182,"TRAINER_KOJI_1":672,"TRAINER_KOJI_2":824,"TRAINER_KOJI_3":825,"TRAINER_KOJI_4":826,"TRAINER_KOJI_5":827,"TRAINER_KYLA":443,"TRAINER_KYRA":748,"TRAINER_LAO_1":419,"TRAINER_LAO_2":421,"TRAINER_LAO_3":422,"TRAINER_LAO_4":423,"TRAINER_LAO_5":424,"TRAINER_LARRY":213,"TRAINER_LAURA":426,"TRAINER_LAUREL":463,"TRAINER_LAWRENCE":710,"TRAINER_LEAF":852,"TRAINER_LEAH":35,"TRAINER_LEA_AND_JED":641,"TRAINER_LENNY":628,"TRAINER_LEONARD":495,"TRAINER_LEONARDO":576,"TRAINER_LEONEL":762,"TRAINER_LEROY":77,"TRAINER_LILA_AND_ROY_1":687,"TRAINER_LILA_AND_ROY_2":688,"TRAINER_LILA_AND_ROY_3":689,"TRAINER_LILA_AND_ROY_4":690,"TRAINER_LILA_AND_ROY_5":691,"TRAINER_LILITH":573,"TRAINER_LINDA":461,"TRAINER_LISA_AND_RAY":692,"TRAINER_LOLA_1":57,"TRAINER_LOLA_2":60,"TRAINER_LOLA_3":61,"TRAINER_LOLA_4":62,"TRAINER_LOLA_5":63,"TRAINER_LORENZO":553,"TRAINER_LUCAS_1":629,"TRAINER_LUCAS_2":633,"TRAINER_LUCY":810,"TRAINER_LUIS":151,"TRAINER_LUNG":420,"TRAINER_LYDIA_1":545,"TRAINER_LYDIA_2":548,"TRAINER_LYDIA_3":549,"TRAINER_LYDIA_4":550,"TRAINER_LYDIA_5":551,"TRAINER_LYLE":616,"TRAINER_MACEY":591,"TRAINER_MADELINE_1":434,"TRAINER_MADELINE_2":437,"TRAINER_MADELINE_3":438,"TRAINER_MADELINE_4":439,"TRAINER_MADELINE_5":440,"TRAINER_MAKAYLA":758,"TRAINER_MARC":571,"TRAINER_MARCEL":11,"TRAINER_MARCOS":702,"TRAINER_MARIA_1":369,"TRAINER_MARIA_2":370,"TRAINER_MARIA_3":371,"TRAINER_MARIA_4":372,"TRAINER_MARIA_5":373,"TRAINER_MARIELA":848,"TRAINER_MARK":145,"TRAINER_MARLENE":752,"TRAINER_MARLEY":508,"TRAINER_MARTHA":473,"TRAINER_MARY":89,"TRAINER_MATT":30,"TRAINER_MATTHEW":157,"TRAINER_MAURA":246,"TRAINER_MAXIE_MAGMA_HIDEOUT":601,"TRAINER_MAXIE_MOSSDEEP":734,"TRAINER_MAXIE_MT_CHIMNEY":602,"TRAINER_MAY_LILYCOVE_MUDKIP":664,"TRAINER_MAY_LILYCOVE_TORCHIC":666,"TRAINER_MAY_LILYCOVE_TREECKO":665,"TRAINER_MAY_PLACEHOLDER":854,"TRAINER_MAY_ROUTE_103_MUDKIP":529,"TRAINER_MAY_ROUTE_103_TORCHIC":535,"TRAINER_MAY_ROUTE_103_TREECKO":532,"TRAINER_MAY_ROUTE_110_MUDKIP":530,"TRAINER_MAY_ROUTE_110_TORCHIC":536,"TRAINER_MAY_ROUTE_110_TREECKO":533,"TRAINER_MAY_ROUTE_119_MUDKIP":531,"TRAINER_MAY_ROUTE_119_TORCHIC":537,"TRAINER_MAY_ROUTE_119_TREECKO":534,"TRAINER_MAY_RUSTBORO_MUDKIP":600,"TRAINER_MAY_RUSTBORO_TORCHIC":769,"TRAINER_MAY_RUSTBORO_TREECKO":768,"TRAINER_MELINA":755,"TRAINER_MELISSA":124,"TRAINER_MEL_AND_PAUL":680,"TRAINER_MICAH":255,"TRAINER_MICHELLE":98,"TRAINER_MIGUEL_1":293,"TRAINER_MIGUEL_2":295,"TRAINER_MIGUEL_3":296,"TRAINER_MIGUEL_4":297,"TRAINER_MIGUEL_5":298,"TRAINER_MIKE_1":634,"TRAINER_MIKE_2":635,"TRAINER_MISSY":447,"TRAINER_MITCHELL":540,"TRAINER_MIU_AND_YUKI":484,"TRAINER_MOLLIE":137,"TRAINER_MYLES":765,"TRAINER_NANCY":472,"TRAINER_NAOMI":119,"TRAINER_NATE":582,"TRAINER_NED":340,"TRAINER_NICHOLAS":585,"TRAINER_NICOLAS_1":392,"TRAINER_NICOLAS_2":393,"TRAINER_NICOLAS_3":394,"TRAINER_NICOLAS_4":395,"TRAINER_NICOLAS_5":396,"TRAINER_NIKKI":453,"TRAINER_NOB_1":183,"TRAINER_NOB_2":184,"TRAINER_NOB_3":185,"TRAINER_NOB_4":186,"TRAINER_NOB_5":187,"TRAINER_NOLAN":342,"TRAINER_NOLAND":809,"TRAINER_NOLEN":161,"TRAINER_NONE":0,"TRAINER_NORMAN_1":269,"TRAINER_NORMAN_2":786,"TRAINER_NORMAN_3":787,"TRAINER_NORMAN_4":788,"TRAINER_NORMAN_5":789,"TRAINER_OLIVIA":130,"TRAINER_OWEN":83,"TRAINER_PABLO_1":377,"TRAINER_PABLO_2":820,"TRAINER_PABLO_3":821,"TRAINER_PABLO_4":822,"TRAINER_PABLO_5":823,"TRAINER_PARKER":72,"TRAINER_PAT":766,"TRAINER_PATRICIA":105,"TRAINER_PAUL":275,"TRAINER_PAULA":429,"TRAINER_PAXTON":594,"TRAINER_PERRY":398,"TRAINER_PETE":735,"TRAINER_PHIL":400,"TRAINER_PHILLIP":494,"TRAINER_PHOEBE":262,"TRAINER_PRESLEY":403,"TRAINER_PRESTON":233,"TRAINER_QUINCY":324,"TRAINER_RACHEL":761,"TRAINER_RANDALL":71,"TRAINER_RED":851,"TRAINER_REED":675,"TRAINER_RELI_AND_IAN":686,"TRAINER_REYNA":509,"TRAINER_RHETT":703,"TRAINER_RICHARD":166,"TRAINER_RICK":615,"TRAINER_RICKY_1":64,"TRAINER_RICKY_2":67,"TRAINER_RICKY_3":68,"TRAINER_RICKY_4":69,"TRAINER_RICKY_5":70,"TRAINER_RILEY":653,"TRAINER_ROBERT_1":406,"TRAINER_ROBERT_2":409,"TRAINER_ROBERT_3":410,"TRAINER_ROBERT_4":411,"TRAINER_ROBERT_5":412,"TRAINER_ROBIN":612,"TRAINER_RODNEY":165,"TRAINER_ROGER":669,"TRAINER_ROLAND":160,"TRAINER_RONALD":350,"TRAINER_ROSE_1":37,"TRAINER_ROSE_2":40,"TRAINER_ROSE_3":41,"TRAINER_ROSE_4":42,"TRAINER_ROSE_5":43,"TRAINER_ROXANNE_1":265,"TRAINER_ROXANNE_2":770,"TRAINER_ROXANNE_3":771,"TRAINER_ROXANNE_4":772,"TRAINER_ROXANNE_5":773,"TRAINER_RUBEN":671,"TRAINER_SALLY":611,"TRAINER_SAMANTHA":245,"TRAINER_SAMUEL":81,"TRAINER_SANTIAGO":168,"TRAINER_SARAH":695,"TRAINER_SAWYER_1":1,"TRAINER_SAWYER_2":836,"TRAINER_SAWYER_3":837,"TRAINER_SAWYER_4":838,"TRAINER_SAWYER_5":839,"TRAINER_SEBASTIAN":554,"TRAINER_SHANE":214,"TRAINER_SHANNON":97,"TRAINER_SHARON":452,"TRAINER_SHAWN":194,"TRAINER_SHAYLA":747,"TRAINER_SHEILA":125,"TRAINER_SHELBY_1":313,"TRAINER_SHELBY_2":314,"TRAINER_SHELBY_3":315,"TRAINER_SHELBY_4":316,"TRAINER_SHELBY_5":317,"TRAINER_SHELLY_SEAFLOOR_CAVERN":33,"TRAINER_SHELLY_WEATHER_INSTITUTE":32,"TRAINER_SHIRLEY":126,"TRAINER_SIDNEY":261,"TRAINER_SIENNA":459,"TRAINER_SIMON":65,"TRAINER_SOPHIA":561,"TRAINER_SOPHIE":708,"TRAINER_SPENCER":159,"TRAINER_SPENSER":807,"TRAINER_STAN":162,"TRAINER_STEVEN":804,"TRAINER_STEVE_1":143,"TRAINER_STEVE_2":147,"TRAINER_STEVE_3":148,"TRAINER_STEVE_4":149,"TRAINER_STEVE_5":150,"TRAINER_SUSIE":456,"TRAINER_SYLVIA":575,"TRAINER_TABITHA_MAGMA_HIDEOUT":732,"TRAINER_TABITHA_MOSSDEEP":514,"TRAINER_TABITHA_MT_CHIMNEY":597,"TRAINER_TAKAO":179,"TRAINER_TAKASHI":416,"TRAINER_TALIA":385,"TRAINER_TAMMY":107,"TRAINER_TANYA":451,"TRAINER_TARA":446,"TRAINER_TASHA":109,"TRAINER_TATE_AND_LIZA_1":271,"TRAINER_TATE_AND_LIZA_2":794,"TRAINER_TATE_AND_LIZA_3":795,"TRAINER_TATE_AND_LIZA_4":796,"TRAINER_TATE_AND_LIZA_5":797,"TRAINER_TAYLOR":225,"TRAINER_TED":274,"TRAINER_TERRY":581,"TRAINER_THALIA_1":144,"TRAINER_THALIA_2":844,"TRAINER_THALIA_3":845,"TRAINER_THALIA_4":846,"TRAINER_THALIA_5":847,"TRAINER_THOMAS":256,"TRAINER_TIANA":603,"TRAINER_TIFFANY":131,"TRAINER_TIMMY":334,"TRAINER_TIMOTHY_1":307,"TRAINER_TIMOTHY_2":308,"TRAINER_TIMOTHY_3":309,"TRAINER_TIMOTHY_4":310,"TRAINER_TIMOTHY_5":311,"TRAINER_TISHA":676,"TRAINER_TOMMY":321,"TRAINER_TONY_1":155,"TRAINER_TONY_2":175,"TRAINER_TONY_3":176,"TRAINER_TONY_4":177,"TRAINER_TONY_5":178,"TRAINER_TORI_AND_TIA":677,"TRAINER_TRAVIS":218,"TRAINER_TRENT_1":627,"TRAINER_TRENT_2":636,"TRAINER_TRENT_3":637,"TRAINER_TRENT_4":638,"TRAINER_TRENT_5":639,"TRAINER_TUCKER":806,"TRAINER_TYRA_AND_IVY":679,"TRAINER_TYRON":704,"TRAINER_VALERIE_1":108,"TRAINER_VALERIE_2":110,"TRAINER_VALERIE_3":111,"TRAINER_VALERIE_4":112,"TRAINER_VALERIE_5":113,"TRAINER_VANESSA":300,"TRAINER_VICKY":312,"TRAINER_VICTOR":292,"TRAINER_VICTORIA":299,"TRAINER_VINCENT":76,"TRAINER_VIOLET":39,"TRAINER_VIRGIL":234,"TRAINER_VITO":82,"TRAINER_VIVI":606,"TRAINER_VIVIAN":649,"TRAINER_WADE":344,"TRAINER_WALLACE":335,"TRAINER_WALLY_MAUVILLE":656,"TRAINER_WALLY_VR_1":519,"TRAINER_WALLY_VR_2":657,"TRAINER_WALLY_VR_3":658,"TRAINER_WALLY_VR_4":659,"TRAINER_WALLY_VR_5":660,"TRAINER_WALTER_1":254,"TRAINER_WALTER_2":257,"TRAINER_WALTER_3":258,"TRAINER_WALTER_4":259,"TRAINER_WALTER_5":260,"TRAINER_WARREN":88,"TRAINER_WATTSON_1":267,"TRAINER_WATTSON_2":778,"TRAINER_WATTSON_3":779,"TRAINER_WATTSON_4":780,"TRAINER_WATTSON_5":781,"TRAINER_WAYNE":673,"TRAINER_WENDY":92,"TRAINER_WILLIAM":236,"TRAINER_WILTON_1":78,"TRAINER_WILTON_2":84,"TRAINER_WILTON_3":85,"TRAINER_WILTON_4":86,"TRAINER_WILTON_5":87,"TRAINER_WINONA_1":270,"TRAINER_WINONA_2":790,"TRAINER_WINONA_3":791,"TRAINER_WINONA_4":792,"TRAINER_WINONA_5":793,"TRAINER_WINSTON_1":136,"TRAINER_WINSTON_2":139,"TRAINER_WINSTON_3":140,"TRAINER_WINSTON_4":141,"TRAINER_WINSTON_5":142,"TRAINER_WYATT":711,"TRAINER_YASU":415,"TRAINER_YUJI":188,"TRAINER_ZANDER":31},"legendary_encounters":[{"address":2538600,"catch_flag":429,"defeat_flag":428,"level":30,"species":410},{"address":2354334,"catch_flag":480,"defeat_flag":447,"level":70,"species":405},{"address":2543160,"catch_flag":146,"defeat_flag":476,"level":70,"species":250},{"address":2354112,"catch_flag":479,"defeat_flag":446,"level":70,"species":404},{"address":2385623,"catch_flag":457,"defeat_flag":456,"level":50,"species":407},{"address":2385687,"catch_flag":482,"defeat_flag":481,"level":50,"species":408},{"address":2543443,"catch_flag":145,"defeat_flag":477,"level":70,"species":249},{"address":2538177,"catch_flag":458,"defeat_flag":455,"level":30,"species":151},{"address":2347488,"catch_flag":478,"defeat_flag":448,"level":70,"species":406},{"address":2345460,"catch_flag":427,"defeat_flag":444,"level":40,"species":402},{"address":2298183,"catch_flag":426,"defeat_flag":443,"level":40,"species":401},{"address":2345731,"catch_flag":483,"defeat_flag":445,"level":40,"species":403}],"locations":{"BADGE_1":{"address":2188036,"default_item":226,"flag":1182},"BADGE_2":{"address":2095131,"default_item":227,"flag":1183},"BADGE_3":{"address":2167252,"default_item":228,"flag":1184},"BADGE_4":{"address":2103246,"default_item":229,"flag":1185},"BADGE_5":{"address":2129781,"default_item":230,"flag":1186},"BADGE_6":{"address":2202122,"default_item":231,"flag":1187},"BADGE_7":{"address":2243964,"default_item":232,"flag":1188},"BADGE_8":{"address":2262314,"default_item":233,"flag":1189},"BERRY_TREE_01":{"address":5843562,"default_item":135,"flag":612},"BERRY_TREE_02":{"address":5843564,"default_item":139,"flag":613},"BERRY_TREE_03":{"address":5843566,"default_item":142,"flag":614},"BERRY_TREE_04":{"address":5843568,"default_item":139,"flag":615},"BERRY_TREE_05":{"address":5843570,"default_item":133,"flag":616},"BERRY_TREE_06":{"address":5843572,"default_item":138,"flag":617},"BERRY_TREE_07":{"address":5843574,"default_item":133,"flag":618},"BERRY_TREE_08":{"address":5843576,"default_item":133,"flag":619},"BERRY_TREE_09":{"address":5843578,"default_item":142,"flag":620},"BERRY_TREE_10":{"address":5843580,"default_item":138,"flag":621},"BERRY_TREE_11":{"address":5843582,"default_item":139,"flag":622},"BERRY_TREE_12":{"address":5843584,"default_item":142,"flag":623},"BERRY_TREE_13":{"address":5843586,"default_item":135,"flag":624},"BERRY_TREE_14":{"address":5843588,"default_item":155,"flag":625},"BERRY_TREE_15":{"address":5843590,"default_item":153,"flag":626},"BERRY_TREE_16":{"address":5843592,"default_item":150,"flag":627},"BERRY_TREE_17":{"address":5843594,"default_item":150,"flag":628},"BERRY_TREE_18":{"address":5843596,"default_item":150,"flag":629},"BERRY_TREE_19":{"address":5843598,"default_item":148,"flag":630},"BERRY_TREE_20":{"address":5843600,"default_item":148,"flag":631},"BERRY_TREE_21":{"address":5843602,"default_item":136,"flag":632},"BERRY_TREE_22":{"address":5843604,"default_item":135,"flag":633},"BERRY_TREE_23":{"address":5843606,"default_item":135,"flag":634},"BERRY_TREE_24":{"address":5843608,"default_item":136,"flag":635},"BERRY_TREE_25":{"address":5843610,"default_item":152,"flag":636},"BERRY_TREE_26":{"address":5843612,"default_item":134,"flag":637},"BERRY_TREE_27":{"address":5843614,"default_item":151,"flag":638},"BERRY_TREE_28":{"address":5843616,"default_item":151,"flag":639},"BERRY_TREE_29":{"address":5843618,"default_item":151,"flag":640},"BERRY_TREE_30":{"address":5843620,"default_item":153,"flag":641},"BERRY_TREE_31":{"address":5843622,"default_item":142,"flag":642},"BERRY_TREE_32":{"address":5843624,"default_item":142,"flag":643},"BERRY_TREE_33":{"address":5843626,"default_item":142,"flag":644},"BERRY_TREE_34":{"address":5843628,"default_item":153,"flag":645},"BERRY_TREE_35":{"address":5843630,"default_item":153,"flag":646},"BERRY_TREE_36":{"address":5843632,"default_item":153,"flag":647},"BERRY_TREE_37":{"address":5843634,"default_item":137,"flag":648},"BERRY_TREE_38":{"address":5843636,"default_item":137,"flag":649},"BERRY_TREE_39":{"address":5843638,"default_item":137,"flag":650},"BERRY_TREE_40":{"address":5843640,"default_item":135,"flag":651},"BERRY_TREE_41":{"address":5843642,"default_item":135,"flag":652},"BERRY_TREE_42":{"address":5843644,"default_item":135,"flag":653},"BERRY_TREE_43":{"address":5843646,"default_item":148,"flag":654},"BERRY_TREE_44":{"address":5843648,"default_item":150,"flag":655},"BERRY_TREE_45":{"address":5843650,"default_item":152,"flag":656},"BERRY_TREE_46":{"address":5843652,"default_item":151,"flag":657},"BERRY_TREE_47":{"address":5843654,"default_item":140,"flag":658},"BERRY_TREE_48":{"address":5843656,"default_item":137,"flag":659},"BERRY_TREE_49":{"address":5843658,"default_item":136,"flag":660},"BERRY_TREE_50":{"address":5843660,"default_item":134,"flag":661},"BERRY_TREE_51":{"address":5843662,"default_item":142,"flag":662},"BERRY_TREE_52":{"address":5843664,"default_item":150,"flag":663},"BERRY_TREE_53":{"address":5843666,"default_item":150,"flag":664},"BERRY_TREE_54":{"address":5843668,"default_item":142,"flag":665},"BERRY_TREE_55":{"address":5843670,"default_item":149,"flag":666},"BERRY_TREE_56":{"address":5843672,"default_item":149,"flag":667},"BERRY_TREE_57":{"address":5843674,"default_item":136,"flag":668},"BERRY_TREE_58":{"address":5843676,"default_item":153,"flag":669},"BERRY_TREE_59":{"address":5843678,"default_item":153,"flag":670},"BERRY_TREE_60":{"address":5843680,"default_item":157,"flag":671},"BERRY_TREE_61":{"address":5843682,"default_item":157,"flag":672},"BERRY_TREE_62":{"address":5843684,"default_item":138,"flag":673},"BERRY_TREE_63":{"address":5843686,"default_item":142,"flag":674},"BERRY_TREE_64":{"address":5843688,"default_item":138,"flag":675},"BERRY_TREE_65":{"address":5843690,"default_item":157,"flag":676},"BERRY_TREE_66":{"address":5843692,"default_item":134,"flag":677},"BERRY_TREE_67":{"address":5843694,"default_item":152,"flag":678},"BERRY_TREE_68":{"address":5843696,"default_item":140,"flag":679},"BERRY_TREE_69":{"address":5843698,"default_item":154,"flag":680},"BERRY_TREE_70":{"address":5843700,"default_item":154,"flag":681},"BERRY_TREE_71":{"address":5843702,"default_item":154,"flag":682},"BERRY_TREE_72":{"address":5843704,"default_item":157,"flag":683},"BERRY_TREE_73":{"address":5843706,"default_item":155,"flag":684},"BERRY_TREE_74":{"address":5843708,"default_item":155,"flag":685},"BERRY_TREE_75":{"address":5843710,"default_item":142,"flag":686},"BERRY_TREE_76":{"address":5843712,"default_item":133,"flag":687},"BERRY_TREE_77":{"address":5843714,"default_item":140,"flag":688},"BERRY_TREE_78":{"address":5843716,"default_item":140,"flag":689},"BERRY_TREE_79":{"address":5843718,"default_item":155,"flag":690},"BERRY_TREE_80":{"address":5843720,"default_item":139,"flag":691},"BERRY_TREE_81":{"address":5843722,"default_item":139,"flag":692},"BERRY_TREE_82":{"address":5843724,"default_item":168,"flag":693},"BERRY_TREE_83":{"address":5843726,"default_item":156,"flag":694},"BERRY_TREE_84":{"address":5843728,"default_item":156,"flag":695},"BERRY_TREE_85":{"address":5843730,"default_item":142,"flag":696},"BERRY_TREE_86":{"address":5843732,"default_item":138,"flag":697},"BERRY_TREE_87":{"address":5843734,"default_item":135,"flag":698},"BERRY_TREE_88":{"address":5843736,"default_item":142,"flag":699},"HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":{"address":5497200,"default_item":281,"flag":531},"HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":{"address":5497212,"default_item":282,"flag":532},"HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":{"address":5497224,"default_item":283,"flag":533},"HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":{"address":5497236,"default_item":284,"flag":534},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":{"address":5500100,"default_item":67,"flag":601},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":{"address":5500124,"default_item":65,"flag":604},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":{"address":5500112,"default_item":64,"flag":603},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":{"address":5500088,"default_item":70,"flag":602},"HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":{"address":5435924,"default_item":110,"flag":528},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":{"address":5487372,"default_item":195,"flag":548},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":{"address":5487384,"default_item":195,"flag":549},"HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":{"address":5489116,"default_item":23,"flag":577},"HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":{"address":5489128,"default_item":3,"flag":576},"HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":{"address":5435672,"default_item":16,"flag":500},"HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":{"address":5432608,"default_item":111,"flag":527},"HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":{"address":5432632,"default_item":4,"flag":575},"HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":{"address":5432620,"default_item":69,"flag":543},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":{"address":5490440,"default_item":35,"flag":578},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":{"address":5490428,"default_item":2,"flag":529},"HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":{"address":5490796,"default_item":68,"flag":580},"HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":{"address":5490784,"default_item":70,"flag":579},"HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":{"address":5525804,"default_item":45,"flag":609},"HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":{"address":5428972,"default_item":68,"flag":595},"HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":{"address":5487908,"default_item":4,"flag":561},"HIDDEN_ITEM_PETALBURG_WOODS_POTION":{"address":5487872,"default_item":13,"flag":558},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":{"address":5487884,"default_item":103,"flag":559},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":{"address":5487896,"default_item":103,"flag":560},"HIDDEN_ITEM_ROUTE_104_ANTIDOTE":{"address":5438492,"default_item":14,"flag":585},"HIDDEN_ITEM_ROUTE_104_HEART_SCALE":{"address":5438504,"default_item":111,"flag":588},"HIDDEN_ITEM_ROUTE_104_POKE_BALL":{"address":5438468,"default_item":4,"flag":562},"HIDDEN_ITEM_ROUTE_104_POTION":{"address":5438480,"default_item":13,"flag":537},"HIDDEN_ITEM_ROUTE_104_SUPER_POTION":{"address":5438456,"default_item":22,"flag":544},"HIDDEN_ITEM_ROUTE_105_BIG_PEARL":{"address":5438748,"default_item":107,"flag":611},"HIDDEN_ITEM_ROUTE_105_HEART_SCALE":{"address":5438736,"default_item":111,"flag":589},"HIDDEN_ITEM_ROUTE_106_HEART_SCALE":{"address":5438932,"default_item":111,"flag":547},"HIDDEN_ITEM_ROUTE_106_POKE_BALL":{"address":5438908,"default_item":4,"flag":563},"HIDDEN_ITEM_ROUTE_106_STARDUST":{"address":5438920,"default_item":108,"flag":546},"HIDDEN_ITEM_ROUTE_108_RARE_CANDY":{"address":5439340,"default_item":68,"flag":586},"HIDDEN_ITEM_ROUTE_109_ETHER":{"address":5440016,"default_item":34,"flag":564},"HIDDEN_ITEM_ROUTE_109_GREAT_BALL":{"address":5440004,"default_item":3,"flag":551},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":{"address":5439992,"default_item":111,"flag":552},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":{"address":5440028,"default_item":111,"flag":590},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":{"address":5440040,"default_item":111,"flag":591},"HIDDEN_ITEM_ROUTE_109_REVIVE":{"address":5439980,"default_item":24,"flag":550},"HIDDEN_ITEM_ROUTE_110_FULL_HEAL":{"address":5441308,"default_item":23,"flag":555},"HIDDEN_ITEM_ROUTE_110_GREAT_BALL":{"address":5441284,"default_item":3,"flag":553},"HIDDEN_ITEM_ROUTE_110_POKE_BALL":{"address":5441296,"default_item":4,"flag":565},"HIDDEN_ITEM_ROUTE_110_REVIVE":{"address":5441272,"default_item":24,"flag":554},"HIDDEN_ITEM_ROUTE_111_PROTEIN":{"address":5443220,"default_item":64,"flag":556},"HIDDEN_ITEM_ROUTE_111_RARE_CANDY":{"address":5443232,"default_item":68,"flag":557},"HIDDEN_ITEM_ROUTE_111_STARDUST":{"address":5443160,"default_item":108,"flag":502},"HIDDEN_ITEM_ROUTE_113_ETHER":{"address":5444488,"default_item":34,"flag":503},"HIDDEN_ITEM_ROUTE_113_NUGGET":{"address":5444512,"default_item":110,"flag":598},"HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":{"address":5444500,"default_item":320,"flag":530},"HIDDEN_ITEM_ROUTE_114_CARBOS":{"address":5445340,"default_item":66,"flag":504},"HIDDEN_ITEM_ROUTE_114_REVIVE":{"address":5445364,"default_item":24,"flag":542},"HIDDEN_ITEM_ROUTE_115_HEART_SCALE":{"address":5446176,"default_item":111,"flag":597},"HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":{"address":5447056,"default_item":206,"flag":596},"HIDDEN_ITEM_ROUTE_116_SUPER_POTION":{"address":5447044,"default_item":22,"flag":545},"HIDDEN_ITEM_ROUTE_117_REPEL":{"address":5447708,"default_item":86,"flag":572},"HIDDEN_ITEM_ROUTE_118_HEART_SCALE":{"address":5448404,"default_item":111,"flag":566},"HIDDEN_ITEM_ROUTE_118_IRON":{"address":5448392,"default_item":65,"flag":567},"HIDDEN_ITEM_ROUTE_119_CALCIUM":{"address":5449972,"default_item":67,"flag":505},"HIDDEN_ITEM_ROUTE_119_FULL_HEAL":{"address":5450056,"default_item":23,"flag":568},"HIDDEN_ITEM_ROUTE_119_MAX_ETHER":{"address":5450068,"default_item":35,"flag":587},"HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":{"address":5449984,"default_item":2,"flag":506},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":{"address":5451596,"default_item":68,"flag":571},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":{"address":5451620,"default_item":68,"flag":569},"HIDDEN_ITEM_ROUTE_120_REVIVE":{"address":5451608,"default_item":24,"flag":584},"HIDDEN_ITEM_ROUTE_120_ZINC":{"address":5451632,"default_item":70,"flag":570},"HIDDEN_ITEM_ROUTE_121_FULL_HEAL":{"address":5452540,"default_item":23,"flag":573},"HIDDEN_ITEM_ROUTE_121_HP_UP":{"address":5452516,"default_item":63,"flag":539},"HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":{"address":5452552,"default_item":25,"flag":600},"HIDDEN_ITEM_ROUTE_121_NUGGET":{"address":5452528,"default_item":110,"flag":540},"HIDDEN_ITEM_ROUTE_123_HYPER_POTION":{"address":5454100,"default_item":21,"flag":574},"HIDDEN_ITEM_ROUTE_123_PP_UP":{"address":5454112,"default_item":69,"flag":599},"HIDDEN_ITEM_ROUTE_123_RARE_CANDY":{"address":5454124,"default_item":68,"flag":610},"HIDDEN_ITEM_ROUTE_123_REVIVE":{"address":5454088,"default_item":24,"flag":541},"HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":{"address":5454052,"default_item":83,"flag":507},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":{"address":5455620,"default_item":111,"flag":592},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":{"address":5455632,"default_item":111,"flag":593},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":{"address":5455644,"default_item":111,"flag":594},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":{"address":5517256,"default_item":68,"flag":606},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":{"address":5517268,"default_item":70,"flag":607},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":{"address":5517432,"default_item":19,"flag":605},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":{"address":5517420,"default_item":69,"flag":608},"HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":{"address":5511292,"default_item":200,"flag":535},"HIDDEN_ITEM_TRICK_HOUSE_NUGGET":{"address":5526716,"default_item":110,"flag":501},"HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":{"address":5456992,"default_item":107,"flag":511},"HIDDEN_ITEM_UNDERWATER_124_CALCIUM":{"address":5457016,"default_item":67,"flag":536},"HIDDEN_ITEM_UNDERWATER_124_CARBOS":{"address":5456956,"default_item":66,"flag":508},"HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":{"address":5456968,"default_item":51,"flag":509},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":{"address":5457004,"default_item":111,"flag":513},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":{"address":5457028,"default_item":111,"flag":538},"HIDDEN_ITEM_UNDERWATER_124_PEARL":{"address":5456980,"default_item":106,"flag":510},"HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":{"address":5457140,"default_item":107,"flag":520},"HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":{"address":5457152,"default_item":49,"flag":512},"HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":{"address":5457068,"default_item":111,"flag":514},"HIDDEN_ITEM_UNDERWATER_126_IRON":{"address":5457116,"default_item":65,"flag":519},"HIDDEN_ITEM_UNDERWATER_126_PEARL":{"address":5457104,"default_item":106,"flag":517},"HIDDEN_ITEM_UNDERWATER_126_STARDUST":{"address":5457092,"default_item":108,"flag":516},"HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":{"address":5457080,"default_item":2,"flag":515},"HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":{"address":5457128,"default_item":50,"flag":518},"HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":{"address":5457224,"default_item":111,"flag":523},"HIDDEN_ITEM_UNDERWATER_127_HP_UP":{"address":5457212,"default_item":63,"flag":522},"HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":{"address":5457236,"default_item":48,"flag":524},"HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":{"address":5457200,"default_item":109,"flag":521},"HIDDEN_ITEM_UNDERWATER_128_PEARL":{"address":5457288,"default_item":106,"flag":526},"HIDDEN_ITEM_UNDERWATER_128_PROTEIN":{"address":5457276,"default_item":64,"flag":525},"HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":{"address":5493932,"default_item":2,"flag":581},"HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":{"address":5494744,"default_item":36,"flag":582},"HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":{"address":5494756,"default_item":84,"flag":583},"ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":{"address":2709805,"default_item":285,"flag":1100},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":{"address":2709857,"default_item":306,"flag":1102},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":{"address":2709831,"default_item":278,"flag":1078},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":{"address":2709844,"default_item":97,"flag":1101},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":{"address":2709818,"default_item":11,"flag":1077},"ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":{"address":2709740,"default_item":122,"flag":1095},"ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":{"address":2709792,"default_item":24,"flag":1099},"ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":{"address":2709766,"default_item":7,"flag":1097},"ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":{"address":2709753,"default_item":85,"flag":1096},"ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":{"address":2709779,"default_item":301,"flag":1098},"ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":{"address":2710039,"default_item":1,"flag":1124},"ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":{"address":2710065,"default_item":37,"flag":1071},"ITEM_AQUA_HIDEOUT_B1F_NUGGET":{"address":2710052,"default_item":110,"flag":1132},"ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":{"address":2710078,"default_item":8,"flag":1072},"ITEM_ARTISAN_CAVE_1F_CARBOS":{"address":2710416,"default_item":66,"flag":1163},"ITEM_ARTISAN_CAVE_B1F_HP_UP":{"address":2710403,"default_item":63,"flag":1162},"ITEM_FIERY_PATH_FIRE_STONE":{"address":2709584,"default_item":95,"flag":1111},"ITEM_FIERY_PATH_TM_TOXIC":{"address":2709597,"default_item":294,"flag":1091},"ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":{"address":2709519,"default_item":85,"flag":1050},"ITEM_GRANITE_CAVE_B1F_POKE_BALL":{"address":2709532,"default_item":4,"flag":1051},"ITEM_GRANITE_CAVE_B2F_RARE_CANDY":{"address":2709558,"default_item":68,"flag":1054},"ITEM_GRANITE_CAVE_B2F_REPEL":{"address":2709545,"default_item":86,"flag":1053},"ITEM_JAGGED_PASS_BURN_HEAL":{"address":2709571,"default_item":15,"flag":1070},"ITEM_LILYCOVE_CITY_MAX_REPEL":{"address":2709415,"default_item":84,"flag":1042},"ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":{"address":2710429,"default_item":68,"flag":1151},"ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":{"address":2710455,"default_item":19,"flag":1165},"ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":{"address":2710442,"default_item":37,"flag":1164},"ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":{"address":2710468,"default_item":110,"flag":1166},"ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":{"address":2710481,"default_item":71,"flag":1167},"ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":{"address":2710507,"default_item":85,"flag":1059},"ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":{"address":2710494,"default_item":25,"flag":1168},"ITEM_MAUVILLE_CITY_X_SPEED":{"address":2709389,"default_item":77,"flag":1116},"ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":{"address":2709623,"default_item":23,"flag":1045},"ITEM_METEOR_FALLS_1F_1R_MOON_STONE":{"address":2709636,"default_item":94,"flag":1046},"ITEM_METEOR_FALLS_1F_1R_PP_UP":{"address":2709649,"default_item":69,"flag":1047},"ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":{"address":2709610,"default_item":311,"flag":1044},"ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":{"address":2709662,"default_item":290,"flag":1080},"ITEM_MOSSDEEP_CITY_NET_BALL":{"address":2709428,"default_item":6,"flag":1043},"ITEM_MT_PYRE_2F_ULTRA_BALL":{"address":2709948,"default_item":2,"flag":1129},"ITEM_MT_PYRE_3F_SUPER_REPEL":{"address":2709961,"default_item":83,"flag":1120},"ITEM_MT_PYRE_4F_SEA_INCENSE":{"address":2709974,"default_item":220,"flag":1130},"ITEM_MT_PYRE_5F_LAX_INCENSE":{"address":2709987,"default_item":221,"flag":1052},"ITEM_MT_PYRE_6F_TM_SHADOW_BALL":{"address":2710000,"default_item":318,"flag":1089},"ITEM_MT_PYRE_EXTERIOR_MAX_POTION":{"address":2710013,"default_item":20,"flag":1073},"ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":{"address":2710026,"default_item":336,"flag":1074},"ITEM_NEW_MAUVILLE_ESCAPE_ROPE":{"address":2709688,"default_item":85,"flag":1076},"ITEM_NEW_MAUVILLE_FULL_HEAL":{"address":2709714,"default_item":23,"flag":1122},"ITEM_NEW_MAUVILLE_PARALYZE_HEAL":{"address":2709727,"default_item":18,"flag":1123},"ITEM_NEW_MAUVILLE_THUNDER_STONE":{"address":2709701,"default_item":96,"flag":1110},"ITEM_NEW_MAUVILLE_ULTRA_BALL":{"address":2709675,"default_item":2,"flag":1075},"ITEM_PETALBURG_CITY_ETHER":{"address":2709376,"default_item":34,"flag":1040},"ITEM_PETALBURG_CITY_MAX_REVIVE":{"address":2709363,"default_item":25,"flag":1039},"ITEM_PETALBURG_WOODS_ETHER":{"address":2709467,"default_item":34,"flag":1058},"ITEM_PETALBURG_WOODS_GREAT_BALL":{"address":2709454,"default_item":3,"flag":1056},"ITEM_PETALBURG_WOODS_PARALYZE_HEAL":{"address":2709480,"default_item":18,"flag":1117},"ITEM_PETALBURG_WOODS_X_ATTACK":{"address":2709441,"default_item":75,"flag":1055},"ITEM_ROUTE_102_POTION":{"address":2708375,"default_item":13,"flag":1000},"ITEM_ROUTE_103_GUARD_SPEC":{"address":2708388,"default_item":73,"flag":1114},"ITEM_ROUTE_103_PP_UP":{"address":2708401,"default_item":69,"flag":1137},"ITEM_ROUTE_104_POKE_BALL":{"address":2708427,"default_item":4,"flag":1057},"ITEM_ROUTE_104_POTION":{"address":2708453,"default_item":13,"flag":1135},"ITEM_ROUTE_104_PP_UP":{"address":2708414,"default_item":69,"flag":1002},"ITEM_ROUTE_104_X_ACCURACY":{"address":2708440,"default_item":78,"flag":1115},"ITEM_ROUTE_105_IRON":{"address":2708466,"default_item":65,"flag":1003},"ITEM_ROUTE_106_PROTEIN":{"address":2708479,"default_item":64,"flag":1004},"ITEM_ROUTE_108_STAR_PIECE":{"address":2708492,"default_item":109,"flag":1139},"ITEM_ROUTE_109_POTION":{"address":2708518,"default_item":13,"flag":1140},"ITEM_ROUTE_109_PP_UP":{"address":2708505,"default_item":69,"flag":1005},"ITEM_ROUTE_110_DIRE_HIT":{"address":2708544,"default_item":74,"flag":1007},"ITEM_ROUTE_110_ELIXIR":{"address":2708557,"default_item":36,"flag":1141},"ITEM_ROUTE_110_RARE_CANDY":{"address":2708531,"default_item":68,"flag":1006},"ITEM_ROUTE_111_ELIXIR":{"address":2708609,"default_item":36,"flag":1142},"ITEM_ROUTE_111_HP_UP":{"address":2708596,"default_item":63,"flag":1010},"ITEM_ROUTE_111_STARDUST":{"address":2708583,"default_item":108,"flag":1009},"ITEM_ROUTE_111_TM_SANDSTORM":{"address":2708570,"default_item":325,"flag":1008},"ITEM_ROUTE_112_NUGGET":{"address":2708622,"default_item":110,"flag":1011},"ITEM_ROUTE_113_HYPER_POTION":{"address":2708661,"default_item":21,"flag":1143},"ITEM_ROUTE_113_MAX_ETHER":{"address":2708635,"default_item":35,"flag":1012},"ITEM_ROUTE_113_SUPER_REPEL":{"address":2708648,"default_item":83,"flag":1013},"ITEM_ROUTE_114_ENERGY_POWDER":{"address":2708700,"default_item":30,"flag":1160},"ITEM_ROUTE_114_PROTEIN":{"address":2708687,"default_item":64,"flag":1015},"ITEM_ROUTE_114_RARE_CANDY":{"address":2708674,"default_item":68,"flag":1014},"ITEM_ROUTE_115_GREAT_BALL":{"address":2708752,"default_item":3,"flag":1118},"ITEM_ROUTE_115_HEAL_POWDER":{"address":2708765,"default_item":32,"flag":1144},"ITEM_ROUTE_115_IRON":{"address":2708739,"default_item":65,"flag":1018},"ITEM_ROUTE_115_PP_UP":{"address":2708778,"default_item":69,"flag":1161},"ITEM_ROUTE_115_SUPER_POTION":{"address":2708713,"default_item":22,"flag":1016},"ITEM_ROUTE_115_TM_FOCUS_PUNCH":{"address":2708726,"default_item":289,"flag":1017},"ITEM_ROUTE_116_ETHER":{"address":2708804,"default_item":34,"flag":1019},"ITEM_ROUTE_116_HP_UP":{"address":2708830,"default_item":63,"flag":1021},"ITEM_ROUTE_116_POTION":{"address":2708843,"default_item":13,"flag":1146},"ITEM_ROUTE_116_REPEL":{"address":2708817,"default_item":86,"flag":1020},"ITEM_ROUTE_116_X_SPECIAL":{"address":2708791,"default_item":79,"flag":1001},"ITEM_ROUTE_117_GREAT_BALL":{"address":2708856,"default_item":3,"flag":1022},"ITEM_ROUTE_117_REVIVE":{"address":2708869,"default_item":24,"flag":1023},"ITEM_ROUTE_118_HYPER_POTION":{"address":2708882,"default_item":21,"flag":1121},"ITEM_ROUTE_119_ELIXIR_1":{"address":2708921,"default_item":36,"flag":1026},"ITEM_ROUTE_119_ELIXIR_2":{"address":2708986,"default_item":36,"flag":1147},"ITEM_ROUTE_119_HYPER_POTION_1":{"address":2708960,"default_item":21,"flag":1029},"ITEM_ROUTE_119_HYPER_POTION_2":{"address":2708973,"default_item":21,"flag":1106},"ITEM_ROUTE_119_LEAF_STONE":{"address":2708934,"default_item":98,"flag":1027},"ITEM_ROUTE_119_NUGGET":{"address":2710104,"default_item":110,"flag":1134},"ITEM_ROUTE_119_RARE_CANDY":{"address":2708947,"default_item":68,"flag":1028},"ITEM_ROUTE_119_SUPER_REPEL":{"address":2708895,"default_item":83,"flag":1024},"ITEM_ROUTE_119_ZINC":{"address":2708908,"default_item":70,"flag":1025},"ITEM_ROUTE_120_FULL_HEAL":{"address":2709012,"default_item":23,"flag":1031},"ITEM_ROUTE_120_HYPER_POTION":{"address":2709025,"default_item":21,"flag":1107},"ITEM_ROUTE_120_NEST_BALL":{"address":2709038,"default_item":8,"flag":1108},"ITEM_ROUTE_120_NUGGET":{"address":2708999,"default_item":110,"flag":1030},"ITEM_ROUTE_120_REVIVE":{"address":2709051,"default_item":24,"flag":1148},"ITEM_ROUTE_121_CARBOS":{"address":2709064,"default_item":66,"flag":1103},"ITEM_ROUTE_121_REVIVE":{"address":2709077,"default_item":24,"flag":1149},"ITEM_ROUTE_121_ZINC":{"address":2709090,"default_item":70,"flag":1150},"ITEM_ROUTE_123_CALCIUM":{"address":2709103,"default_item":67,"flag":1032},"ITEM_ROUTE_123_ELIXIR":{"address":2709129,"default_item":36,"flag":1109},"ITEM_ROUTE_123_PP_UP":{"address":2709142,"default_item":69,"flag":1152},"ITEM_ROUTE_123_REVIVAL_HERB":{"address":2709155,"default_item":33,"flag":1153},"ITEM_ROUTE_123_ULTRA_BALL":{"address":2709116,"default_item":2,"flag":1104},"ITEM_ROUTE_124_BLUE_SHARD":{"address":2709181,"default_item":49,"flag":1093},"ITEM_ROUTE_124_RED_SHARD":{"address":2709168,"default_item":48,"flag":1092},"ITEM_ROUTE_124_YELLOW_SHARD":{"address":2709194,"default_item":50,"flag":1066},"ITEM_ROUTE_125_BIG_PEARL":{"address":2709207,"default_item":107,"flag":1154},"ITEM_ROUTE_126_GREEN_SHARD":{"address":2709220,"default_item":51,"flag":1105},"ITEM_ROUTE_127_CARBOS":{"address":2709246,"default_item":66,"flag":1035},"ITEM_ROUTE_127_RARE_CANDY":{"address":2709259,"default_item":68,"flag":1155},"ITEM_ROUTE_127_ZINC":{"address":2709233,"default_item":70,"flag":1034},"ITEM_ROUTE_132_PROTEIN":{"address":2709285,"default_item":64,"flag":1156},"ITEM_ROUTE_132_RARE_CANDY":{"address":2709272,"default_item":68,"flag":1036},"ITEM_ROUTE_133_BIG_PEARL":{"address":2709298,"default_item":107,"flag":1037},"ITEM_ROUTE_133_MAX_REVIVE":{"address":2709324,"default_item":25,"flag":1157},"ITEM_ROUTE_133_STAR_PIECE":{"address":2709311,"default_item":109,"flag":1038},"ITEM_ROUTE_134_CARBOS":{"address":2709337,"default_item":66,"flag":1158},"ITEM_ROUTE_134_STAR_PIECE":{"address":2709350,"default_item":109,"flag":1159},"ITEM_RUSTBORO_CITY_X_DEFEND":{"address":2709402,"default_item":76,"flag":1041},"ITEM_RUSTURF_TUNNEL_MAX_ETHER":{"address":2709506,"default_item":35,"flag":1049},"ITEM_RUSTURF_TUNNEL_POKE_BALL":{"address":2709493,"default_item":4,"flag":1048},"ITEM_SAFARI_ZONE_NORTH_CALCIUM":{"address":2709896,"default_item":67,"flag":1119},"ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":{"address":2709922,"default_item":110,"flag":1169},"ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":{"address":2709883,"default_item":310,"flag":1094},"ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":{"address":2709935,"default_item":107,"flag":1170},"ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":{"address":2709909,"default_item":25,"flag":1131},"ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":{"address":2709870,"default_item":299,"flag":1079},"ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":{"address":2710208,"default_item":314,"flag":1090},"ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":{"address":2710143,"default_item":107,"flag":1081},"ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":{"address":2710195,"default_item":212,"flag":1113},"ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":{"address":2710182,"default_item":295,"flag":1112},"ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":{"address":2710156,"default_item":68,"flag":1082},"ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":{"address":2710169,"default_item":16,"flag":1083},"ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":{"address":[2710221,2551006],"default_item":121,"flag":1060},"ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":{"address":[2710234,2551032],"default_item":122,"flag":1061},"ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":{"address":[2710247,2551058],"default_item":126,"flag":1062},"ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":{"address":[2710260,2551084],"default_item":128,"flag":1063},"ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":{"address":[2710273,2551110],"default_item":125,"flag":1064},"ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":{"address":[2710286,2551136],"default_item":124,"flag":1065},"ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":{"address":[2710299,2551162],"default_item":123,"flag":1067},"ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":{"address":[2710312,2551188],"default_item":129,"flag":1068},"ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":{"address":[2710325,2551214],"default_item":127,"flag":1069},"ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":{"address":2710338,"default_item":37,"flag":1084},"ITEM_VICTORY_ROAD_1F_PP_UP":{"address":2710351,"default_item":69,"flag":1085},"ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":{"address":2710377,"default_item":19,"flag":1087},"ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":{"address":2710364,"default_item":317,"flag":1086},"ITEM_VICTORY_ROAD_B2F_FULL_HEAL":{"address":2710390,"default_item":23,"flag":1088},"NPC_GIFT_BERRY_MASTERS_WIFE":{"address":2570453,"default_item":133,"flag":1197},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_1":{"address":2570263,"default_item":153,"flag":1195},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_2":{"address":2570315,"default_item":154,"flag":1196},"NPC_GIFT_FLOWER_SHOP_RECEIVED_BERRY":{"address":2284375,"default_item":133,"flag":1207},"NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON":{"address":1971718,"default_item":271,"flag":208},"NPC_GIFT_GOT_TM_THUNDERBOLT_FROM_WATTSON":{"address":1971754,"default_item":312,"flag":209},"NPC_GIFT_LILYCOVE_RECEIVED_BERRY":{"address":1985277,"default_item":141,"flag":1208},"NPC_GIFT_RECEIVED_6_SODA_POP":{"address":2543767,"default_item":27,"flag":140},"NPC_GIFT_RECEIVED_ACRO_BIKE":{"address":2170570,"default_item":272,"flag":1181},"NPC_GIFT_RECEIVED_AMULET_COIN":{"address":2716248,"default_item":189,"flag":133},"NPC_GIFT_RECEIVED_AURORA_TICKET":{"address":2716523,"default_item":371,"flag":314},"NPC_GIFT_RECEIVED_CHARCOAL":{"address":2102559,"default_item":215,"flag":254},"NPC_GIFT_RECEIVED_CHESTO_BERRY_ROUTE_104":{"address":2028703,"default_item":134,"flag":246},"NPC_GIFT_RECEIVED_CLEANSE_TAG":{"address":2312109,"default_item":190,"flag":282},"NPC_GIFT_RECEIVED_COIN_CASE":{"address":2179054,"default_item":260,"flag":258},"NPC_GIFT_RECEIVED_DEEP_SEA_SCALE":{"address":2162572,"default_item":193,"flag":1190},"NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH":{"address":2162555,"default_item":192,"flag":1191},"NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":{"address":2295814,"default_item":269,"flag":1172},"NPC_GIFT_RECEIVED_DEVON_SCOPE":{"address":2065146,"default_item":288,"flag":285},"NPC_GIFT_RECEIVED_EON_TICKET":{"address":2716574,"default_item":275,"flag":474},"NPC_GIFT_RECEIVED_EXP_SHARE":{"address":2185525,"default_item":182,"flag":272},"NPC_GIFT_RECEIVED_FIRST_POKEBALLS":{"address":2085751,"default_item":4,"flag":233},"NPC_GIFT_RECEIVED_FOCUS_BAND":{"address":2337807,"default_item":196,"flag":283},"NPC_GIFT_RECEIVED_GOOD_ROD":{"address":2058408,"default_item":263,"flag":227},"NPC_GIFT_RECEIVED_GO_GOGGLES":{"address":2017746,"default_item":279,"flag":221},"NPC_GIFT_RECEIVED_GREAT_BALL_PETALBURG_WOODS":{"address":2300119,"default_item":3,"flag":1171},"NPC_GIFT_RECEIVED_GREAT_BALL_RUSTBORO_CITY":{"address":1977146,"default_item":3,"flag":1173},"NPC_GIFT_RECEIVED_HM_CUT":{"address":2199532,"default_item":339,"flag":137},"NPC_GIFT_RECEIVED_HM_DIVE":{"address":2252095,"default_item":346,"flag":123},"NPC_GIFT_RECEIVED_HM_FLASH":{"address":2298287,"default_item":343,"flag":109},"NPC_GIFT_RECEIVED_HM_FLY":{"address":2060636,"default_item":340,"flag":110},"NPC_GIFT_RECEIVED_HM_ROCK_SMASH":{"address":2174128,"default_item":344,"flag":107},"NPC_GIFT_RECEIVED_HM_STRENGTH":{"address":2295305,"default_item":342,"flag":106},"NPC_GIFT_RECEIVED_HM_SURF":{"address":2126671,"default_item":341,"flag":122},"NPC_GIFT_RECEIVED_HM_WATERFALL":{"address":1999854,"default_item":345,"flag":312},"NPC_GIFT_RECEIVED_ITEMFINDER":{"address":2039874,"default_item":261,"flag":1176},"NPC_GIFT_RECEIVED_KINGS_ROCK":{"address":1993670,"default_item":187,"flag":276},"NPC_GIFT_RECEIVED_LETTER":{"address":2185301,"default_item":274,"flag":1174},"NPC_GIFT_RECEIVED_MACHO_BRACE":{"address":2284472,"default_item":181,"flag":277},"NPC_GIFT_RECEIVED_MACH_BIKE":{"address":2170553,"default_item":259,"flag":1180},"NPC_GIFT_RECEIVED_MAGMA_EMBLEM":{"address":2316671,"default_item":375,"flag":1177},"NPC_GIFT_RECEIVED_MENTAL_HERB":{"address":2208103,"default_item":185,"flag":223},"NPC_GIFT_RECEIVED_METEORITE":{"address":2304222,"default_item":280,"flag":115},"NPC_GIFT_RECEIVED_MIRACLE_SEED":{"address":2300337,"default_item":205,"flag":297},"NPC_GIFT_RECEIVED_MYSTIC_TICKET":{"address":2716540,"default_item":370,"flag":315},"NPC_GIFT_RECEIVED_OLD_ROD":{"address":2012541,"default_item":262,"flag":257},"NPC_GIFT_RECEIVED_OLD_SEA_MAP":{"address":2716557,"default_item":376,"flag":316},"NPC_GIFT_RECEIVED_POKEBLOCK_CASE":{"address":2614193,"default_item":273,"flag":95},"NPC_GIFT_RECEIVED_POTION_OLDALE":{"address":2010888,"default_item":13,"flag":132},"NPC_GIFT_RECEIVED_POWDER_JAR":{"address":1962504,"default_item":372,"flag":337},"NPC_GIFT_RECEIVED_PREMIER_BALL_RUSTBORO":{"address":2200571,"default_item":12,"flag":213},"NPC_GIFT_RECEIVED_QUICK_CLAW":{"address":2192227,"default_item":183,"flag":275},"NPC_GIFT_RECEIVED_REPEAT_BALL":{"address":2053722,"default_item":9,"flag":256},"NPC_GIFT_RECEIVED_SECRET_POWER":{"address":2598914,"default_item":331,"flag":96},"NPC_GIFT_RECEIVED_SILK_SCARF":{"address":2101830,"default_item":217,"flag":289},"NPC_GIFT_RECEIVED_SOFT_SAND":{"address":2035664,"default_item":203,"flag":280},"NPC_GIFT_RECEIVED_SOOTHE_BELL":{"address":2151278,"default_item":184,"flag":278},"NPC_GIFT_RECEIVED_SOOT_SACK":{"address":2567245,"default_item":270,"flag":1033},"NPC_GIFT_RECEIVED_SS_TICKET":{"address":2716506,"default_item":265,"flag":291},"NPC_GIFT_RECEIVED_SUN_STONE_MOSSDEEP":{"address":2254406,"default_item":93,"flag":192},"NPC_GIFT_RECEIVED_SUPER_ROD":{"address":2251560,"default_item":264,"flag":152},"NPC_GIFT_RECEIVED_TM_AERIAL_ACE":{"address":2202201,"default_item":328,"flag":170},"NPC_GIFT_RECEIVED_TM_ATTRACT":{"address":2116413,"default_item":333,"flag":235},"NPC_GIFT_RECEIVED_TM_BRICK_BREAK":{"address":2269085,"default_item":319,"flag":121},"NPC_GIFT_RECEIVED_TM_BULK_UP":{"address":2095210,"default_item":296,"flag":166},"NPC_GIFT_RECEIVED_TM_BULLET_SEED":{"address":2028910,"default_item":297,"flag":262},"NPC_GIFT_RECEIVED_TM_CALM_MIND":{"address":2244066,"default_item":292,"flag":171},"NPC_GIFT_RECEIVED_TM_DIG":{"address":2286669,"default_item":316,"flag":261},"NPC_GIFT_RECEIVED_TM_FACADE":{"address":2129909,"default_item":330,"flag":169},"NPC_GIFT_RECEIVED_TM_FRUSTRATION":{"address":2124110,"default_item":309,"flag":1179},"NPC_GIFT_RECEIVED_TM_GIGA_DRAIN":{"address":2068012,"default_item":307,"flag":232},"NPC_GIFT_RECEIVED_TM_HIDDEN_POWER":{"address":2206905,"default_item":298,"flag":264},"NPC_GIFT_RECEIVED_TM_OVERHEAT":{"address":2103328,"default_item":338,"flag":168},"NPC_GIFT_RECEIVED_TM_REST":{"address":2236966,"default_item":332,"flag":234},"NPC_GIFT_RECEIVED_TM_RETURN":{"address":2113546,"default_item":315,"flag":229},"NPC_GIFT_RECEIVED_TM_RETURN_2":{"address":2124055,"default_item":315,"flag":1178},"NPC_GIFT_RECEIVED_TM_ROAR":{"address":2051750,"default_item":293,"flag":231},"NPC_GIFT_RECEIVED_TM_ROCK_TOMB":{"address":2188088,"default_item":327,"flag":165},"NPC_GIFT_RECEIVED_TM_SHOCK_WAVE":{"address":2167340,"default_item":322,"flag":167},"NPC_GIFT_RECEIVED_TM_SLUDGE_BOMB":{"address":2099189,"default_item":324,"flag":230},"NPC_GIFT_RECEIVED_TM_SNATCH":{"address":2360766,"default_item":337,"flag":260},"NPC_GIFT_RECEIVED_TM_STEEL_WING":{"address":2298866,"default_item":335,"flag":1175},"NPC_GIFT_RECEIVED_TM_THIEF":{"address":2154698,"default_item":334,"flag":269},"NPC_GIFT_RECEIVED_TM_TORMENT":{"address":2145260,"default_item":329,"flag":265},"NPC_GIFT_RECEIVED_TM_WATER_PULSE":{"address":2262402,"default_item":291,"flag":172},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_1":{"address":2550316,"default_item":68,"flag":1200},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_2":{"address":2550390,"default_item":10,"flag":1201},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_3":{"address":2550473,"default_item":204,"flag":1202},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_4":{"address":2550556,"default_item":194,"flag":1203},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_5":{"address":2550630,"default_item":300,"flag":1204},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_6":{"address":2550695,"default_item":208,"flag":1205},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_7":{"address":2550769,"default_item":71,"flag":1206},"NPC_GIFT_RECEIVED_WAILMER_PAIL":{"address":2284320,"default_item":268,"flag":94},"NPC_GIFT_RECEIVED_WHITE_HERB":{"address":2028770,"default_item":180,"flag":279},"NPC_GIFT_ROUTE_111_RECEIVED_BERRY":{"address":2045493,"default_item":148,"flag":1192},"NPC_GIFT_ROUTE_114_RECEIVED_BERRY":{"address":2051680,"default_item":149,"flag":1193},"NPC_GIFT_ROUTE_120_RECEIVED_BERRY":{"address":2064727,"default_item":143,"flag":1194},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_1":{"address":1998521,"default_item":153,"flag":1198},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_2":{"address":1998566,"default_item":143,"flag":1199},"POKEDEX_REWARD_001":{"address":5729368,"default_item":3,"flag":0},"POKEDEX_REWARD_002":{"address":5729370,"default_item":3,"flag":0},"POKEDEX_REWARD_003":{"address":5729372,"default_item":3,"flag":0},"POKEDEX_REWARD_004":{"address":5729374,"default_item":3,"flag":0},"POKEDEX_REWARD_005":{"address":5729376,"default_item":3,"flag":0},"POKEDEX_REWARD_006":{"address":5729378,"default_item":3,"flag":0},"POKEDEX_REWARD_007":{"address":5729380,"default_item":3,"flag":0},"POKEDEX_REWARD_008":{"address":5729382,"default_item":3,"flag":0},"POKEDEX_REWARD_009":{"address":5729384,"default_item":3,"flag":0},"POKEDEX_REWARD_010":{"address":5729386,"default_item":3,"flag":0},"POKEDEX_REWARD_011":{"address":5729388,"default_item":3,"flag":0},"POKEDEX_REWARD_012":{"address":5729390,"default_item":3,"flag":0},"POKEDEX_REWARD_013":{"address":5729392,"default_item":3,"flag":0},"POKEDEX_REWARD_014":{"address":5729394,"default_item":3,"flag":0},"POKEDEX_REWARD_015":{"address":5729396,"default_item":3,"flag":0},"POKEDEX_REWARD_016":{"address":5729398,"default_item":3,"flag":0},"POKEDEX_REWARD_017":{"address":5729400,"default_item":3,"flag":0},"POKEDEX_REWARD_018":{"address":5729402,"default_item":3,"flag":0},"POKEDEX_REWARD_019":{"address":5729404,"default_item":3,"flag":0},"POKEDEX_REWARD_020":{"address":5729406,"default_item":3,"flag":0},"POKEDEX_REWARD_021":{"address":5729408,"default_item":3,"flag":0},"POKEDEX_REWARD_022":{"address":5729410,"default_item":3,"flag":0},"POKEDEX_REWARD_023":{"address":5729412,"default_item":3,"flag":0},"POKEDEX_REWARD_024":{"address":5729414,"default_item":3,"flag":0},"POKEDEX_REWARD_025":{"address":5729416,"default_item":3,"flag":0},"POKEDEX_REWARD_026":{"address":5729418,"default_item":3,"flag":0},"POKEDEX_REWARD_027":{"address":5729420,"default_item":3,"flag":0},"POKEDEX_REWARD_028":{"address":5729422,"default_item":3,"flag":0},"POKEDEX_REWARD_029":{"address":5729424,"default_item":3,"flag":0},"POKEDEX_REWARD_030":{"address":5729426,"default_item":3,"flag":0},"POKEDEX_REWARD_031":{"address":5729428,"default_item":3,"flag":0},"POKEDEX_REWARD_032":{"address":5729430,"default_item":3,"flag":0},"POKEDEX_REWARD_033":{"address":5729432,"default_item":3,"flag":0},"POKEDEX_REWARD_034":{"address":5729434,"default_item":3,"flag":0},"POKEDEX_REWARD_035":{"address":5729436,"default_item":3,"flag":0},"POKEDEX_REWARD_036":{"address":5729438,"default_item":3,"flag":0},"POKEDEX_REWARD_037":{"address":5729440,"default_item":3,"flag":0},"POKEDEX_REWARD_038":{"address":5729442,"default_item":3,"flag":0},"POKEDEX_REWARD_039":{"address":5729444,"default_item":3,"flag":0},"POKEDEX_REWARD_040":{"address":5729446,"default_item":3,"flag":0},"POKEDEX_REWARD_041":{"address":5729448,"default_item":3,"flag":0},"POKEDEX_REWARD_042":{"address":5729450,"default_item":3,"flag":0},"POKEDEX_REWARD_043":{"address":5729452,"default_item":3,"flag":0},"POKEDEX_REWARD_044":{"address":5729454,"default_item":3,"flag":0},"POKEDEX_REWARD_045":{"address":5729456,"default_item":3,"flag":0},"POKEDEX_REWARD_046":{"address":5729458,"default_item":3,"flag":0},"POKEDEX_REWARD_047":{"address":5729460,"default_item":3,"flag":0},"POKEDEX_REWARD_048":{"address":5729462,"default_item":3,"flag":0},"POKEDEX_REWARD_049":{"address":5729464,"default_item":3,"flag":0},"POKEDEX_REWARD_050":{"address":5729466,"default_item":3,"flag":0},"POKEDEX_REWARD_051":{"address":5729468,"default_item":3,"flag":0},"POKEDEX_REWARD_052":{"address":5729470,"default_item":3,"flag":0},"POKEDEX_REWARD_053":{"address":5729472,"default_item":3,"flag":0},"POKEDEX_REWARD_054":{"address":5729474,"default_item":3,"flag":0},"POKEDEX_REWARD_055":{"address":5729476,"default_item":3,"flag":0},"POKEDEX_REWARD_056":{"address":5729478,"default_item":3,"flag":0},"POKEDEX_REWARD_057":{"address":5729480,"default_item":3,"flag":0},"POKEDEX_REWARD_058":{"address":5729482,"default_item":3,"flag":0},"POKEDEX_REWARD_059":{"address":5729484,"default_item":3,"flag":0},"POKEDEX_REWARD_060":{"address":5729486,"default_item":3,"flag":0},"POKEDEX_REWARD_061":{"address":5729488,"default_item":3,"flag":0},"POKEDEX_REWARD_062":{"address":5729490,"default_item":3,"flag":0},"POKEDEX_REWARD_063":{"address":5729492,"default_item":3,"flag":0},"POKEDEX_REWARD_064":{"address":5729494,"default_item":3,"flag":0},"POKEDEX_REWARD_065":{"address":5729496,"default_item":3,"flag":0},"POKEDEX_REWARD_066":{"address":5729498,"default_item":3,"flag":0},"POKEDEX_REWARD_067":{"address":5729500,"default_item":3,"flag":0},"POKEDEX_REWARD_068":{"address":5729502,"default_item":3,"flag":0},"POKEDEX_REWARD_069":{"address":5729504,"default_item":3,"flag":0},"POKEDEX_REWARD_070":{"address":5729506,"default_item":3,"flag":0},"POKEDEX_REWARD_071":{"address":5729508,"default_item":3,"flag":0},"POKEDEX_REWARD_072":{"address":5729510,"default_item":3,"flag":0},"POKEDEX_REWARD_073":{"address":5729512,"default_item":3,"flag":0},"POKEDEX_REWARD_074":{"address":5729514,"default_item":3,"flag":0},"POKEDEX_REWARD_075":{"address":5729516,"default_item":3,"flag":0},"POKEDEX_REWARD_076":{"address":5729518,"default_item":3,"flag":0},"POKEDEX_REWARD_077":{"address":5729520,"default_item":3,"flag":0},"POKEDEX_REWARD_078":{"address":5729522,"default_item":3,"flag":0},"POKEDEX_REWARD_079":{"address":5729524,"default_item":3,"flag":0},"POKEDEX_REWARD_080":{"address":5729526,"default_item":3,"flag":0},"POKEDEX_REWARD_081":{"address":5729528,"default_item":3,"flag":0},"POKEDEX_REWARD_082":{"address":5729530,"default_item":3,"flag":0},"POKEDEX_REWARD_083":{"address":5729532,"default_item":3,"flag":0},"POKEDEX_REWARD_084":{"address":5729534,"default_item":3,"flag":0},"POKEDEX_REWARD_085":{"address":5729536,"default_item":3,"flag":0},"POKEDEX_REWARD_086":{"address":5729538,"default_item":3,"flag":0},"POKEDEX_REWARD_087":{"address":5729540,"default_item":3,"flag":0},"POKEDEX_REWARD_088":{"address":5729542,"default_item":3,"flag":0},"POKEDEX_REWARD_089":{"address":5729544,"default_item":3,"flag":0},"POKEDEX_REWARD_090":{"address":5729546,"default_item":3,"flag":0},"POKEDEX_REWARD_091":{"address":5729548,"default_item":3,"flag":0},"POKEDEX_REWARD_092":{"address":5729550,"default_item":3,"flag":0},"POKEDEX_REWARD_093":{"address":5729552,"default_item":3,"flag":0},"POKEDEX_REWARD_094":{"address":5729554,"default_item":3,"flag":0},"POKEDEX_REWARD_095":{"address":5729556,"default_item":3,"flag":0},"POKEDEX_REWARD_096":{"address":5729558,"default_item":3,"flag":0},"POKEDEX_REWARD_097":{"address":5729560,"default_item":3,"flag":0},"POKEDEX_REWARD_098":{"address":5729562,"default_item":3,"flag":0},"POKEDEX_REWARD_099":{"address":5729564,"default_item":3,"flag":0},"POKEDEX_REWARD_100":{"address":5729566,"default_item":3,"flag":0},"POKEDEX_REWARD_101":{"address":5729568,"default_item":3,"flag":0},"POKEDEX_REWARD_102":{"address":5729570,"default_item":3,"flag":0},"POKEDEX_REWARD_103":{"address":5729572,"default_item":3,"flag":0},"POKEDEX_REWARD_104":{"address":5729574,"default_item":3,"flag":0},"POKEDEX_REWARD_105":{"address":5729576,"default_item":3,"flag":0},"POKEDEX_REWARD_106":{"address":5729578,"default_item":3,"flag":0},"POKEDEX_REWARD_107":{"address":5729580,"default_item":3,"flag":0},"POKEDEX_REWARD_108":{"address":5729582,"default_item":3,"flag":0},"POKEDEX_REWARD_109":{"address":5729584,"default_item":3,"flag":0},"POKEDEX_REWARD_110":{"address":5729586,"default_item":3,"flag":0},"POKEDEX_REWARD_111":{"address":5729588,"default_item":3,"flag":0},"POKEDEX_REWARD_112":{"address":5729590,"default_item":3,"flag":0},"POKEDEX_REWARD_113":{"address":5729592,"default_item":3,"flag":0},"POKEDEX_REWARD_114":{"address":5729594,"default_item":3,"flag":0},"POKEDEX_REWARD_115":{"address":5729596,"default_item":3,"flag":0},"POKEDEX_REWARD_116":{"address":5729598,"default_item":3,"flag":0},"POKEDEX_REWARD_117":{"address":5729600,"default_item":3,"flag":0},"POKEDEX_REWARD_118":{"address":5729602,"default_item":3,"flag":0},"POKEDEX_REWARD_119":{"address":5729604,"default_item":3,"flag":0},"POKEDEX_REWARD_120":{"address":5729606,"default_item":3,"flag":0},"POKEDEX_REWARD_121":{"address":5729608,"default_item":3,"flag":0},"POKEDEX_REWARD_122":{"address":5729610,"default_item":3,"flag":0},"POKEDEX_REWARD_123":{"address":5729612,"default_item":3,"flag":0},"POKEDEX_REWARD_124":{"address":5729614,"default_item":3,"flag":0},"POKEDEX_REWARD_125":{"address":5729616,"default_item":3,"flag":0},"POKEDEX_REWARD_126":{"address":5729618,"default_item":3,"flag":0},"POKEDEX_REWARD_127":{"address":5729620,"default_item":3,"flag":0},"POKEDEX_REWARD_128":{"address":5729622,"default_item":3,"flag":0},"POKEDEX_REWARD_129":{"address":5729624,"default_item":3,"flag":0},"POKEDEX_REWARD_130":{"address":5729626,"default_item":3,"flag":0},"POKEDEX_REWARD_131":{"address":5729628,"default_item":3,"flag":0},"POKEDEX_REWARD_132":{"address":5729630,"default_item":3,"flag":0},"POKEDEX_REWARD_133":{"address":5729632,"default_item":3,"flag":0},"POKEDEX_REWARD_134":{"address":5729634,"default_item":3,"flag":0},"POKEDEX_REWARD_135":{"address":5729636,"default_item":3,"flag":0},"POKEDEX_REWARD_136":{"address":5729638,"default_item":3,"flag":0},"POKEDEX_REWARD_137":{"address":5729640,"default_item":3,"flag":0},"POKEDEX_REWARD_138":{"address":5729642,"default_item":3,"flag":0},"POKEDEX_REWARD_139":{"address":5729644,"default_item":3,"flag":0},"POKEDEX_REWARD_140":{"address":5729646,"default_item":3,"flag":0},"POKEDEX_REWARD_141":{"address":5729648,"default_item":3,"flag":0},"POKEDEX_REWARD_142":{"address":5729650,"default_item":3,"flag":0},"POKEDEX_REWARD_143":{"address":5729652,"default_item":3,"flag":0},"POKEDEX_REWARD_144":{"address":5729654,"default_item":3,"flag":0},"POKEDEX_REWARD_145":{"address":5729656,"default_item":3,"flag":0},"POKEDEX_REWARD_146":{"address":5729658,"default_item":3,"flag":0},"POKEDEX_REWARD_147":{"address":5729660,"default_item":3,"flag":0},"POKEDEX_REWARD_148":{"address":5729662,"default_item":3,"flag":0},"POKEDEX_REWARD_149":{"address":5729664,"default_item":3,"flag":0},"POKEDEX_REWARD_150":{"address":5729666,"default_item":3,"flag":0},"POKEDEX_REWARD_151":{"address":5729668,"default_item":3,"flag":0},"POKEDEX_REWARD_152":{"address":5729670,"default_item":3,"flag":0},"POKEDEX_REWARD_153":{"address":5729672,"default_item":3,"flag":0},"POKEDEX_REWARD_154":{"address":5729674,"default_item":3,"flag":0},"POKEDEX_REWARD_155":{"address":5729676,"default_item":3,"flag":0},"POKEDEX_REWARD_156":{"address":5729678,"default_item":3,"flag":0},"POKEDEX_REWARD_157":{"address":5729680,"default_item":3,"flag":0},"POKEDEX_REWARD_158":{"address":5729682,"default_item":3,"flag":0},"POKEDEX_REWARD_159":{"address":5729684,"default_item":3,"flag":0},"POKEDEX_REWARD_160":{"address":5729686,"default_item":3,"flag":0},"POKEDEX_REWARD_161":{"address":5729688,"default_item":3,"flag":0},"POKEDEX_REWARD_162":{"address":5729690,"default_item":3,"flag":0},"POKEDEX_REWARD_163":{"address":5729692,"default_item":3,"flag":0},"POKEDEX_REWARD_164":{"address":5729694,"default_item":3,"flag":0},"POKEDEX_REWARD_165":{"address":5729696,"default_item":3,"flag":0},"POKEDEX_REWARD_166":{"address":5729698,"default_item":3,"flag":0},"POKEDEX_REWARD_167":{"address":5729700,"default_item":3,"flag":0},"POKEDEX_REWARD_168":{"address":5729702,"default_item":3,"flag":0},"POKEDEX_REWARD_169":{"address":5729704,"default_item":3,"flag":0},"POKEDEX_REWARD_170":{"address":5729706,"default_item":3,"flag":0},"POKEDEX_REWARD_171":{"address":5729708,"default_item":3,"flag":0},"POKEDEX_REWARD_172":{"address":5729710,"default_item":3,"flag":0},"POKEDEX_REWARD_173":{"address":5729712,"default_item":3,"flag":0},"POKEDEX_REWARD_174":{"address":5729714,"default_item":3,"flag":0},"POKEDEX_REWARD_175":{"address":5729716,"default_item":3,"flag":0},"POKEDEX_REWARD_176":{"address":5729718,"default_item":3,"flag":0},"POKEDEX_REWARD_177":{"address":5729720,"default_item":3,"flag":0},"POKEDEX_REWARD_178":{"address":5729722,"default_item":3,"flag":0},"POKEDEX_REWARD_179":{"address":5729724,"default_item":3,"flag":0},"POKEDEX_REWARD_180":{"address":5729726,"default_item":3,"flag":0},"POKEDEX_REWARD_181":{"address":5729728,"default_item":3,"flag":0},"POKEDEX_REWARD_182":{"address":5729730,"default_item":3,"flag":0},"POKEDEX_REWARD_183":{"address":5729732,"default_item":3,"flag":0},"POKEDEX_REWARD_184":{"address":5729734,"default_item":3,"flag":0},"POKEDEX_REWARD_185":{"address":5729736,"default_item":3,"flag":0},"POKEDEX_REWARD_186":{"address":5729738,"default_item":3,"flag":0},"POKEDEX_REWARD_187":{"address":5729740,"default_item":3,"flag":0},"POKEDEX_REWARD_188":{"address":5729742,"default_item":3,"flag":0},"POKEDEX_REWARD_189":{"address":5729744,"default_item":3,"flag":0},"POKEDEX_REWARD_190":{"address":5729746,"default_item":3,"flag":0},"POKEDEX_REWARD_191":{"address":5729748,"default_item":3,"flag":0},"POKEDEX_REWARD_192":{"address":5729750,"default_item":3,"flag":0},"POKEDEX_REWARD_193":{"address":5729752,"default_item":3,"flag":0},"POKEDEX_REWARD_194":{"address":5729754,"default_item":3,"flag":0},"POKEDEX_REWARD_195":{"address":5729756,"default_item":3,"flag":0},"POKEDEX_REWARD_196":{"address":5729758,"default_item":3,"flag":0},"POKEDEX_REWARD_197":{"address":5729760,"default_item":3,"flag":0},"POKEDEX_REWARD_198":{"address":5729762,"default_item":3,"flag":0},"POKEDEX_REWARD_199":{"address":5729764,"default_item":3,"flag":0},"POKEDEX_REWARD_200":{"address":5729766,"default_item":3,"flag":0},"POKEDEX_REWARD_201":{"address":5729768,"default_item":3,"flag":0},"POKEDEX_REWARD_202":{"address":5729770,"default_item":3,"flag":0},"POKEDEX_REWARD_203":{"address":5729772,"default_item":3,"flag":0},"POKEDEX_REWARD_204":{"address":5729774,"default_item":3,"flag":0},"POKEDEX_REWARD_205":{"address":5729776,"default_item":3,"flag":0},"POKEDEX_REWARD_206":{"address":5729778,"default_item":3,"flag":0},"POKEDEX_REWARD_207":{"address":5729780,"default_item":3,"flag":0},"POKEDEX_REWARD_208":{"address":5729782,"default_item":3,"flag":0},"POKEDEX_REWARD_209":{"address":5729784,"default_item":3,"flag":0},"POKEDEX_REWARD_210":{"address":5729786,"default_item":3,"flag":0},"POKEDEX_REWARD_211":{"address":5729788,"default_item":3,"flag":0},"POKEDEX_REWARD_212":{"address":5729790,"default_item":3,"flag":0},"POKEDEX_REWARD_213":{"address":5729792,"default_item":3,"flag":0},"POKEDEX_REWARD_214":{"address":5729794,"default_item":3,"flag":0},"POKEDEX_REWARD_215":{"address":5729796,"default_item":3,"flag":0},"POKEDEX_REWARD_216":{"address":5729798,"default_item":3,"flag":0},"POKEDEX_REWARD_217":{"address":5729800,"default_item":3,"flag":0},"POKEDEX_REWARD_218":{"address":5729802,"default_item":3,"flag":0},"POKEDEX_REWARD_219":{"address":5729804,"default_item":3,"flag":0},"POKEDEX_REWARD_220":{"address":5729806,"default_item":3,"flag":0},"POKEDEX_REWARD_221":{"address":5729808,"default_item":3,"flag":0},"POKEDEX_REWARD_222":{"address":5729810,"default_item":3,"flag":0},"POKEDEX_REWARD_223":{"address":5729812,"default_item":3,"flag":0},"POKEDEX_REWARD_224":{"address":5729814,"default_item":3,"flag":0},"POKEDEX_REWARD_225":{"address":5729816,"default_item":3,"flag":0},"POKEDEX_REWARD_226":{"address":5729818,"default_item":3,"flag":0},"POKEDEX_REWARD_227":{"address":5729820,"default_item":3,"flag":0},"POKEDEX_REWARD_228":{"address":5729822,"default_item":3,"flag":0},"POKEDEX_REWARD_229":{"address":5729824,"default_item":3,"flag":0},"POKEDEX_REWARD_230":{"address":5729826,"default_item":3,"flag":0},"POKEDEX_REWARD_231":{"address":5729828,"default_item":3,"flag":0},"POKEDEX_REWARD_232":{"address":5729830,"default_item":3,"flag":0},"POKEDEX_REWARD_233":{"address":5729832,"default_item":3,"flag":0},"POKEDEX_REWARD_234":{"address":5729834,"default_item":3,"flag":0},"POKEDEX_REWARD_235":{"address":5729836,"default_item":3,"flag":0},"POKEDEX_REWARD_236":{"address":5729838,"default_item":3,"flag":0},"POKEDEX_REWARD_237":{"address":5729840,"default_item":3,"flag":0},"POKEDEX_REWARD_238":{"address":5729842,"default_item":3,"flag":0},"POKEDEX_REWARD_239":{"address":5729844,"default_item":3,"flag":0},"POKEDEX_REWARD_240":{"address":5729846,"default_item":3,"flag":0},"POKEDEX_REWARD_241":{"address":5729848,"default_item":3,"flag":0},"POKEDEX_REWARD_242":{"address":5729850,"default_item":3,"flag":0},"POKEDEX_REWARD_243":{"address":5729852,"default_item":3,"flag":0},"POKEDEX_REWARD_244":{"address":5729854,"default_item":3,"flag":0},"POKEDEX_REWARD_245":{"address":5729856,"default_item":3,"flag":0},"POKEDEX_REWARD_246":{"address":5729858,"default_item":3,"flag":0},"POKEDEX_REWARD_247":{"address":5729860,"default_item":3,"flag":0},"POKEDEX_REWARD_248":{"address":5729862,"default_item":3,"flag":0},"POKEDEX_REWARD_249":{"address":5729864,"default_item":3,"flag":0},"POKEDEX_REWARD_250":{"address":5729866,"default_item":3,"flag":0},"POKEDEX_REWARD_251":{"address":5729868,"default_item":3,"flag":0},"POKEDEX_REWARD_252":{"address":5729870,"default_item":3,"flag":0},"POKEDEX_REWARD_253":{"address":5729872,"default_item":3,"flag":0},"POKEDEX_REWARD_254":{"address":5729874,"default_item":3,"flag":0},"POKEDEX_REWARD_255":{"address":5729876,"default_item":3,"flag":0},"POKEDEX_REWARD_256":{"address":5729878,"default_item":3,"flag":0},"POKEDEX_REWARD_257":{"address":5729880,"default_item":3,"flag":0},"POKEDEX_REWARD_258":{"address":5729882,"default_item":3,"flag":0},"POKEDEX_REWARD_259":{"address":5729884,"default_item":3,"flag":0},"POKEDEX_REWARD_260":{"address":5729886,"default_item":3,"flag":0},"POKEDEX_REWARD_261":{"address":5729888,"default_item":3,"flag":0},"POKEDEX_REWARD_262":{"address":5729890,"default_item":3,"flag":0},"POKEDEX_REWARD_263":{"address":5729892,"default_item":3,"flag":0},"POKEDEX_REWARD_264":{"address":5729894,"default_item":3,"flag":0},"POKEDEX_REWARD_265":{"address":5729896,"default_item":3,"flag":0},"POKEDEX_REWARD_266":{"address":5729898,"default_item":3,"flag":0},"POKEDEX_REWARD_267":{"address":5729900,"default_item":3,"flag":0},"POKEDEX_REWARD_268":{"address":5729902,"default_item":3,"flag":0},"POKEDEX_REWARD_269":{"address":5729904,"default_item":3,"flag":0},"POKEDEX_REWARD_270":{"address":5729906,"default_item":3,"flag":0},"POKEDEX_REWARD_271":{"address":5729908,"default_item":3,"flag":0},"POKEDEX_REWARD_272":{"address":5729910,"default_item":3,"flag":0},"POKEDEX_REWARD_273":{"address":5729912,"default_item":3,"flag":0},"POKEDEX_REWARD_274":{"address":5729914,"default_item":3,"flag":0},"POKEDEX_REWARD_275":{"address":5729916,"default_item":3,"flag":0},"POKEDEX_REWARD_276":{"address":5729918,"default_item":3,"flag":0},"POKEDEX_REWARD_277":{"address":5729920,"default_item":3,"flag":0},"POKEDEX_REWARD_278":{"address":5729922,"default_item":3,"flag":0},"POKEDEX_REWARD_279":{"address":5729924,"default_item":3,"flag":0},"POKEDEX_REWARD_280":{"address":5729926,"default_item":3,"flag":0},"POKEDEX_REWARD_281":{"address":5729928,"default_item":3,"flag":0},"POKEDEX_REWARD_282":{"address":5729930,"default_item":3,"flag":0},"POKEDEX_REWARD_283":{"address":5729932,"default_item":3,"flag":0},"POKEDEX_REWARD_284":{"address":5729934,"default_item":3,"flag":0},"POKEDEX_REWARD_285":{"address":5729936,"default_item":3,"flag":0},"POKEDEX_REWARD_286":{"address":5729938,"default_item":3,"flag":0},"POKEDEX_REWARD_287":{"address":5729940,"default_item":3,"flag":0},"POKEDEX_REWARD_288":{"address":5729942,"default_item":3,"flag":0},"POKEDEX_REWARD_289":{"address":5729944,"default_item":3,"flag":0},"POKEDEX_REWARD_290":{"address":5729946,"default_item":3,"flag":0},"POKEDEX_REWARD_291":{"address":5729948,"default_item":3,"flag":0},"POKEDEX_REWARD_292":{"address":5729950,"default_item":3,"flag":0},"POKEDEX_REWARD_293":{"address":5729952,"default_item":3,"flag":0},"POKEDEX_REWARD_294":{"address":5729954,"default_item":3,"flag":0},"POKEDEX_REWARD_295":{"address":5729956,"default_item":3,"flag":0},"POKEDEX_REWARD_296":{"address":5729958,"default_item":3,"flag":0},"POKEDEX_REWARD_297":{"address":5729960,"default_item":3,"flag":0},"POKEDEX_REWARD_298":{"address":5729962,"default_item":3,"flag":0},"POKEDEX_REWARD_299":{"address":5729964,"default_item":3,"flag":0},"POKEDEX_REWARD_300":{"address":5729966,"default_item":3,"flag":0},"POKEDEX_REWARD_301":{"address":5729968,"default_item":3,"flag":0},"POKEDEX_REWARD_302":{"address":5729970,"default_item":3,"flag":0},"POKEDEX_REWARD_303":{"address":5729972,"default_item":3,"flag":0},"POKEDEX_REWARD_304":{"address":5729974,"default_item":3,"flag":0},"POKEDEX_REWARD_305":{"address":5729976,"default_item":3,"flag":0},"POKEDEX_REWARD_306":{"address":5729978,"default_item":3,"flag":0},"POKEDEX_REWARD_307":{"address":5729980,"default_item":3,"flag":0},"POKEDEX_REWARD_308":{"address":5729982,"default_item":3,"flag":0},"POKEDEX_REWARD_309":{"address":5729984,"default_item":3,"flag":0},"POKEDEX_REWARD_310":{"address":5729986,"default_item":3,"flag":0},"POKEDEX_REWARD_311":{"address":5729988,"default_item":3,"flag":0},"POKEDEX_REWARD_312":{"address":5729990,"default_item":3,"flag":0},"POKEDEX_REWARD_313":{"address":5729992,"default_item":3,"flag":0},"POKEDEX_REWARD_314":{"address":5729994,"default_item":3,"flag":0},"POKEDEX_REWARD_315":{"address":5729996,"default_item":3,"flag":0},"POKEDEX_REWARD_316":{"address":5729998,"default_item":3,"flag":0},"POKEDEX_REWARD_317":{"address":5730000,"default_item":3,"flag":0},"POKEDEX_REWARD_318":{"address":5730002,"default_item":3,"flag":0},"POKEDEX_REWARD_319":{"address":5730004,"default_item":3,"flag":0},"POKEDEX_REWARD_320":{"address":5730006,"default_item":3,"flag":0},"POKEDEX_REWARD_321":{"address":5730008,"default_item":3,"flag":0},"POKEDEX_REWARD_322":{"address":5730010,"default_item":3,"flag":0},"POKEDEX_REWARD_323":{"address":5730012,"default_item":3,"flag":0},"POKEDEX_REWARD_324":{"address":5730014,"default_item":3,"flag":0},"POKEDEX_REWARD_325":{"address":5730016,"default_item":3,"flag":0},"POKEDEX_REWARD_326":{"address":5730018,"default_item":3,"flag":0},"POKEDEX_REWARD_327":{"address":5730020,"default_item":3,"flag":0},"POKEDEX_REWARD_328":{"address":5730022,"default_item":3,"flag":0},"POKEDEX_REWARD_329":{"address":5730024,"default_item":3,"flag":0},"POKEDEX_REWARD_330":{"address":5730026,"default_item":3,"flag":0},"POKEDEX_REWARD_331":{"address":5730028,"default_item":3,"flag":0},"POKEDEX_REWARD_332":{"address":5730030,"default_item":3,"flag":0},"POKEDEX_REWARD_333":{"address":5730032,"default_item":3,"flag":0},"POKEDEX_REWARD_334":{"address":5730034,"default_item":3,"flag":0},"POKEDEX_REWARD_335":{"address":5730036,"default_item":3,"flag":0},"POKEDEX_REWARD_336":{"address":5730038,"default_item":3,"flag":0},"POKEDEX_REWARD_337":{"address":5730040,"default_item":3,"flag":0},"POKEDEX_REWARD_338":{"address":5730042,"default_item":3,"flag":0},"POKEDEX_REWARD_339":{"address":5730044,"default_item":3,"flag":0},"POKEDEX_REWARD_340":{"address":5730046,"default_item":3,"flag":0},"POKEDEX_REWARD_341":{"address":5730048,"default_item":3,"flag":0},"POKEDEX_REWARD_342":{"address":5730050,"default_item":3,"flag":0},"POKEDEX_REWARD_343":{"address":5730052,"default_item":3,"flag":0},"POKEDEX_REWARD_344":{"address":5730054,"default_item":3,"flag":0},"POKEDEX_REWARD_345":{"address":5730056,"default_item":3,"flag":0},"POKEDEX_REWARD_346":{"address":5730058,"default_item":3,"flag":0},"POKEDEX_REWARD_347":{"address":5730060,"default_item":3,"flag":0},"POKEDEX_REWARD_348":{"address":5730062,"default_item":3,"flag":0},"POKEDEX_REWARD_349":{"address":5730064,"default_item":3,"flag":0},"POKEDEX_REWARD_350":{"address":5730066,"default_item":3,"flag":0},"POKEDEX_REWARD_351":{"address":5730068,"default_item":3,"flag":0},"POKEDEX_REWARD_352":{"address":5730070,"default_item":3,"flag":0},"POKEDEX_REWARD_353":{"address":5730072,"default_item":3,"flag":0},"POKEDEX_REWARD_354":{"address":5730074,"default_item":3,"flag":0},"POKEDEX_REWARD_355":{"address":5730076,"default_item":3,"flag":0},"POKEDEX_REWARD_356":{"address":5730078,"default_item":3,"flag":0},"POKEDEX_REWARD_357":{"address":5730080,"default_item":3,"flag":0},"POKEDEX_REWARD_358":{"address":5730082,"default_item":3,"flag":0},"POKEDEX_REWARD_359":{"address":5730084,"default_item":3,"flag":0},"POKEDEX_REWARD_360":{"address":5730086,"default_item":3,"flag":0},"POKEDEX_REWARD_361":{"address":5730088,"default_item":3,"flag":0},"POKEDEX_REWARD_362":{"address":5730090,"default_item":3,"flag":0},"POKEDEX_REWARD_363":{"address":5730092,"default_item":3,"flag":0},"POKEDEX_REWARD_364":{"address":5730094,"default_item":3,"flag":0},"POKEDEX_REWARD_365":{"address":5730096,"default_item":3,"flag":0},"POKEDEX_REWARD_366":{"address":5730098,"default_item":3,"flag":0},"POKEDEX_REWARD_367":{"address":5730100,"default_item":3,"flag":0},"POKEDEX_REWARD_368":{"address":5730102,"default_item":3,"flag":0},"POKEDEX_REWARD_369":{"address":5730104,"default_item":3,"flag":0},"POKEDEX_REWARD_370":{"address":5730106,"default_item":3,"flag":0},"POKEDEX_REWARD_371":{"address":5730108,"default_item":3,"flag":0},"POKEDEX_REWARD_372":{"address":5730110,"default_item":3,"flag":0},"POKEDEX_REWARD_373":{"address":5730112,"default_item":3,"flag":0},"POKEDEX_REWARD_374":{"address":5730114,"default_item":3,"flag":0},"POKEDEX_REWARD_375":{"address":5730116,"default_item":3,"flag":0},"POKEDEX_REWARD_376":{"address":5730118,"default_item":3,"flag":0},"POKEDEX_REWARD_377":{"address":5730120,"default_item":3,"flag":0},"POKEDEX_REWARD_378":{"address":5730122,"default_item":3,"flag":0},"POKEDEX_REWARD_379":{"address":5730124,"default_item":3,"flag":0},"POKEDEX_REWARD_380":{"address":5730126,"default_item":3,"flag":0},"POKEDEX_REWARD_381":{"address":5730128,"default_item":3,"flag":0},"POKEDEX_REWARD_382":{"address":5730130,"default_item":3,"flag":0},"POKEDEX_REWARD_383":{"address":5730132,"default_item":3,"flag":0},"POKEDEX_REWARD_384":{"address":5730134,"default_item":3,"flag":0},"POKEDEX_REWARD_385":{"address":5730136,"default_item":3,"flag":0},"POKEDEX_REWARD_386":{"address":5730138,"default_item":3,"flag":0},"TRAINER_AARON_REWARD":{"address":5602878,"default_item":104,"flag":1677},"TRAINER_ABIGAIL_1_REWARD":{"address":5602800,"default_item":106,"flag":1638},"TRAINER_AIDAN_REWARD":{"address":5603432,"default_item":104,"flag":1954},"TRAINER_AISHA_REWARD":{"address":5603598,"default_item":106,"flag":2037},"TRAINER_ALBERTO_REWARD":{"address":5602108,"default_item":108,"flag":1292},"TRAINER_ALBERT_REWARD":{"address":5602244,"default_item":104,"flag":1360},"TRAINER_ALEXA_REWARD":{"address":5603424,"default_item":104,"flag":1950},"TRAINER_ALEXIA_REWARD":{"address":5602264,"default_item":104,"flag":1370},"TRAINER_ALEX_REWARD":{"address":5602910,"default_item":104,"flag":1693},"TRAINER_ALICE_REWARD":{"address":5602980,"default_item":103,"flag":1728},"TRAINER_ALIX_REWARD":{"address":5603584,"default_item":106,"flag":2030},"TRAINER_ALLEN_REWARD":{"address":5602750,"default_item":103,"flag":1613},"TRAINER_ALLISON_REWARD":{"address":5602858,"default_item":104,"flag":1667},"TRAINER_ALYSSA_REWARD":{"address":5603486,"default_item":106,"flag":1981},"TRAINER_AMY_AND_LIV_1_REWARD":{"address":5603046,"default_item":103,"flag":1761},"TRAINER_ANDREA_REWARD":{"address":5603310,"default_item":106,"flag":1893},"TRAINER_ANDRES_1_REWARD":{"address":5603558,"default_item":104,"flag":2017},"TRAINER_ANDREW_REWARD":{"address":5602756,"default_item":106,"flag":1616},"TRAINER_ANGELICA_REWARD":{"address":5602956,"default_item":104,"flag":1716},"TRAINER_ANGELINA_REWARD":{"address":5603508,"default_item":106,"flag":1992},"TRAINER_ANGELO_REWARD":{"address":5603688,"default_item":104,"flag":2082},"TRAINER_ANNA_AND_MEG_1_REWARD":{"address":5602658,"default_item":106,"flag":1567},"TRAINER_ANNIKA_REWARD":{"address":5603088,"default_item":107,"flag":1782},"TRAINER_ANTHONY_REWARD":{"address":5602788,"default_item":106,"flag":1632},"TRAINER_ARCHIE_REWARD":{"address":5602152,"default_item":107,"flag":1314},"TRAINER_ASHLEY_REWARD":{"address":5603394,"default_item":106,"flag":1935},"TRAINER_ATHENA_REWARD":{"address":5603238,"default_item":104,"flag":1857},"TRAINER_ATSUSHI_REWARD":{"address":5602464,"default_item":104,"flag":1470},"TRAINER_AURON_REWARD":{"address":5603096,"default_item":104,"flag":1786},"TRAINER_AUSTINA_REWARD":{"address":5602200,"default_item":103,"flag":1338},"TRAINER_AUTUMN_REWARD":{"address":5602518,"default_item":106,"flag":1497},"TRAINER_AXLE_REWARD":{"address":5602490,"default_item":108,"flag":1483},"TRAINER_BARNY_REWARD":{"address":5602770,"default_item":104,"flag":1623},"TRAINER_BARRY_REWARD":{"address":5602410,"default_item":106,"flag":1443},"TRAINER_BEAU_REWARD":{"address":5602508,"default_item":106,"flag":1492},"TRAINER_BECKY_REWARD":{"address":5603024,"default_item":106,"flag":1750},"TRAINER_BECK_REWARD":{"address":5602912,"default_item":104,"flag":1694},"TRAINER_BENJAMIN_1_REWARD":{"address":5602790,"default_item":106,"flag":1633},"TRAINER_BEN_REWARD":{"address":5602730,"default_item":106,"flag":1603},"TRAINER_BERKE_REWARD":{"address":5602232,"default_item":104,"flag":1354},"TRAINER_BERNIE_1_REWARD":{"address":5602496,"default_item":106,"flag":1486},"TRAINER_BETHANY_REWARD":{"address":5602686,"default_item":107,"flag":1581},"TRAINER_BETH_REWARD":{"address":5602974,"default_item":103,"flag":1725},"TRAINER_BEVERLY_REWARD":{"address":5602966,"default_item":103,"flag":1721},"TRAINER_BIANCA_REWARD":{"address":5603496,"default_item":106,"flag":1986},"TRAINER_BILLY_REWARD":{"address":5602722,"default_item":103,"flag":1599},"TRAINER_BLAKE_REWARD":{"address":5602554,"default_item":108,"flag":1515},"TRAINER_BRANDEN_REWARD":{"address":5603574,"default_item":106,"flag":2025},"TRAINER_BRANDI_REWARD":{"address":5603596,"default_item":106,"flag":2036},"TRAINER_BRAWLY_1_REWARD":{"address":5602616,"default_item":104,"flag":1546},"TRAINER_BRAXTON_REWARD":{"address":5602234,"default_item":104,"flag":1355},"TRAINER_BRENDAN_LILYCOVE_MUDKIP_REWARD":{"address":5603406,"default_item":104,"flag":1941},"TRAINER_BRENDAN_LILYCOVE_TORCHIC_REWARD":{"address":5603410,"default_item":104,"flag":1943},"TRAINER_BRENDAN_LILYCOVE_TREECKO_REWARD":{"address":5603408,"default_item":104,"flag":1942},"TRAINER_BRENDAN_ROUTE_103_MUDKIP_REWARD":{"address":5603124,"default_item":106,"flag":1800},"TRAINER_BRENDAN_ROUTE_103_TORCHIC_REWARD":{"address":5603136,"default_item":106,"flag":1806},"TRAINER_BRENDAN_ROUTE_103_TREECKO_REWARD":{"address":5603130,"default_item":106,"flag":1803},"TRAINER_BRENDAN_ROUTE_110_MUDKIP_REWARD":{"address":5603126,"default_item":104,"flag":1801},"TRAINER_BRENDAN_ROUTE_110_TORCHIC_REWARD":{"address":5603138,"default_item":104,"flag":1807},"TRAINER_BRENDAN_ROUTE_110_TREECKO_REWARD":{"address":5603132,"default_item":104,"flag":1804},"TRAINER_BRENDAN_ROUTE_119_MUDKIP_REWARD":{"address":5603128,"default_item":104,"flag":1802},"TRAINER_BRENDAN_ROUTE_119_TORCHIC_REWARD":{"address":5603140,"default_item":104,"flag":1808},"TRAINER_BRENDAN_ROUTE_119_TREECKO_REWARD":{"address":5603134,"default_item":104,"flag":1805},"TRAINER_BRENDAN_RUSTBORO_MUDKIP_REWARD":{"address":5603270,"default_item":108,"flag":1873},"TRAINER_BRENDAN_RUSTBORO_TORCHIC_REWARD":{"address":5603282,"default_item":108,"flag":1879},"TRAINER_BRENDAN_RUSTBORO_TREECKO_REWARD":{"address":5603268,"default_item":108,"flag":1872},"TRAINER_BRENDA_REWARD":{"address":5602992,"default_item":106,"flag":1734},"TRAINER_BRENDEN_REWARD":{"address":5603228,"default_item":106,"flag":1852},"TRAINER_BRENT_REWARD":{"address":5602530,"default_item":104,"flag":1503},"TRAINER_BRIANNA_REWARD":{"address":5602320,"default_item":110,"flag":1398},"TRAINER_BRICE_REWARD":{"address":5603336,"default_item":106,"flag":1906},"TRAINER_BRIDGET_REWARD":{"address":5602342,"default_item":107,"flag":1409},"TRAINER_BROOKE_1_REWARD":{"address":5602272,"default_item":108,"flag":1374},"TRAINER_BRYANT_REWARD":{"address":5603576,"default_item":106,"flag":2026},"TRAINER_BRYAN_REWARD":{"address":5603572,"default_item":104,"flag":2024},"TRAINER_CALE_REWARD":{"address":5603612,"default_item":104,"flag":2044},"TRAINER_CALLIE_REWARD":{"address":5603610,"default_item":106,"flag":2043},"TRAINER_CALVIN_1_REWARD":{"address":5602720,"default_item":103,"flag":1598},"TRAINER_CAMDEN_REWARD":{"address":5602832,"default_item":104,"flag":1654},"TRAINER_CAMERON_1_REWARD":{"address":5602560,"default_item":108,"flag":1518},"TRAINER_CAMRON_REWARD":{"address":5603562,"default_item":104,"flag":2019},"TRAINER_CARLEE_REWARD":{"address":5603012,"default_item":106,"flag":1744},"TRAINER_CAROLINA_REWARD":{"address":5603566,"default_item":104,"flag":2021},"TRAINER_CAROLINE_REWARD":{"address":5602282,"default_item":104,"flag":1379},"TRAINER_CAROL_REWARD":{"address":5603026,"default_item":106,"flag":1751},"TRAINER_CARTER_REWARD":{"address":5602774,"default_item":104,"flag":1625},"TRAINER_CATHERINE_1_REWARD":{"address":5603202,"default_item":104,"flag":1839},"TRAINER_CEDRIC_REWARD":{"address":5603034,"default_item":108,"flag":1755},"TRAINER_CELIA_REWARD":{"address":5603570,"default_item":106,"flag":2023},"TRAINER_CELINA_REWARD":{"address":5603494,"default_item":108,"flag":1985},"TRAINER_CHAD_REWARD":{"address":5602432,"default_item":106,"flag":1454},"TRAINER_CHANDLER_REWARD":{"address":5603480,"default_item":103,"flag":1978},"TRAINER_CHARLIE_REWARD":{"address":5602216,"default_item":103,"flag":1346},"TRAINER_CHARLOTTE_REWARD":{"address":5603512,"default_item":106,"flag":1994},"TRAINER_CHASE_REWARD":{"address":5602840,"default_item":104,"flag":1658},"TRAINER_CHESTER_REWARD":{"address":5602900,"default_item":108,"flag":1688},"TRAINER_CHIP_REWARD":{"address":5602174,"default_item":104,"flag":1325},"TRAINER_CHRIS_REWARD":{"address":5603470,"default_item":108,"flag":1973},"TRAINER_CINDY_1_REWARD":{"address":5602312,"default_item":104,"flag":1394},"TRAINER_CLARENCE_REWARD":{"address":5603244,"default_item":106,"flag":1860},"TRAINER_CLARISSA_REWARD":{"address":5602954,"default_item":104,"flag":1715},"TRAINER_CLARK_REWARD":{"address":5603346,"default_item":106,"flag":1911},"TRAINER_CLAUDE_REWARD":{"address":5602760,"default_item":108,"flag":1618},"TRAINER_CLIFFORD_REWARD":{"address":5603252,"default_item":107,"flag":1864},"TRAINER_COBY_REWARD":{"address":5603502,"default_item":106,"flag":1989},"TRAINER_COLE_REWARD":{"address":5602486,"default_item":108,"flag":1481},"TRAINER_COLIN_REWARD":{"address":5602894,"default_item":108,"flag":1685},"TRAINER_COLTON_REWARD":{"address":5602672,"default_item":107,"flag":1574},"TRAINER_CONNIE_REWARD":{"address":5602340,"default_item":107,"flag":1408},"TRAINER_CONOR_REWARD":{"address":5603106,"default_item":104,"flag":1791},"TRAINER_CORY_1_REWARD":{"address":5603564,"default_item":108,"flag":2020},"TRAINER_CRISSY_REWARD":{"address":5603312,"default_item":106,"flag":1894},"TRAINER_CRISTIAN_REWARD":{"address":5603232,"default_item":106,"flag":1854},"TRAINER_CRISTIN_1_REWARD":{"address":5603618,"default_item":104,"flag":2047},"TRAINER_CYNDY_1_REWARD":{"address":5602938,"default_item":106,"flag":1707},"TRAINER_DAISUKE_REWARD":{"address":5602462,"default_item":106,"flag":1469},"TRAINER_DAISY_REWARD":{"address":5602156,"default_item":106,"flag":1316},"TRAINER_DALE_REWARD":{"address":5602766,"default_item":106,"flag":1621},"TRAINER_DALTON_1_REWARD":{"address":5602476,"default_item":106,"flag":1476},"TRAINER_DANA_REWARD":{"address":5603000,"default_item":106,"flag":1738},"TRAINER_DANIELLE_REWARD":{"address":5603384,"default_item":106,"flag":1930},"TRAINER_DAPHNE_REWARD":{"address":5602314,"default_item":110,"flag":1395},"TRAINER_DARCY_REWARD":{"address":5603550,"default_item":104,"flag":2013},"TRAINER_DARIAN_REWARD":{"address":5603476,"default_item":106,"flag":1976},"TRAINER_DARIUS_REWARD":{"address":5603690,"default_item":108,"flag":2083},"TRAINER_DARRIN_REWARD":{"address":5602392,"default_item":103,"flag":1434},"TRAINER_DAVID_REWARD":{"address":5602400,"default_item":103,"flag":1438},"TRAINER_DAVIS_REWARD":{"address":5603162,"default_item":106,"flag":1819},"TRAINER_DAWSON_REWARD":{"address":5603472,"default_item":104,"flag":1974},"TRAINER_DAYTON_REWARD":{"address":5603604,"default_item":108,"flag":2040},"TRAINER_DEANDRE_REWARD":{"address":5603514,"default_item":103,"flag":1995},"TRAINER_DEAN_REWARD":{"address":5602412,"default_item":103,"flag":1444},"TRAINER_DEBRA_REWARD":{"address":5603004,"default_item":106,"flag":1740},"TRAINER_DECLAN_REWARD":{"address":5602114,"default_item":106,"flag":1295},"TRAINER_DEMETRIUS_REWARD":{"address":5602834,"default_item":106,"flag":1655},"TRAINER_DENISE_REWARD":{"address":5602972,"default_item":103,"flag":1724},"TRAINER_DEREK_REWARD":{"address":5602538,"default_item":108,"flag":1507},"TRAINER_DEVAN_REWARD":{"address":5603590,"default_item":106,"flag":2033},"TRAINER_DEZ_AND_LUKE_REWARD":{"address":5603364,"default_item":108,"flag":1920},"TRAINER_DIANA_1_REWARD":{"address":5603032,"default_item":106,"flag":1754},"TRAINER_DIANNE_REWARD":{"address":5602918,"default_item":104,"flag":1697},"TRAINER_DILLON_REWARD":{"address":5602738,"default_item":106,"flag":1607},"TRAINER_DOMINIK_REWARD":{"address":5602388,"default_item":103,"flag":1432},"TRAINER_DONALD_REWARD":{"address":5602532,"default_item":104,"flag":1504},"TRAINER_DONNY_REWARD":{"address":5602852,"default_item":104,"flag":1664},"TRAINER_DOUGLAS_REWARD":{"address":5602390,"default_item":103,"flag":1433},"TRAINER_DOUG_REWARD":{"address":5603320,"default_item":106,"flag":1898},"TRAINER_DRAKE_REWARD":{"address":5602612,"default_item":110,"flag":1544},"TRAINER_DREW_REWARD":{"address":5602506,"default_item":106,"flag":1491},"TRAINER_DUNCAN_REWARD":{"address":5603076,"default_item":108,"flag":1776},"TRAINER_DUSTY_1_REWARD":{"address":5602172,"default_item":104,"flag":1324},"TRAINER_DWAYNE_REWARD":{"address":5603070,"default_item":106,"flag":1773},"TRAINER_DYLAN_1_REWARD":{"address":5602812,"default_item":106,"flag":1644},"TRAINER_EDGAR_REWARD":{"address":5602242,"default_item":104,"flag":1359},"TRAINER_EDMOND_REWARD":{"address":5603066,"default_item":106,"flag":1771},"TRAINER_EDWARDO_REWARD":{"address":5602892,"default_item":108,"flag":1684},"TRAINER_EDWARD_REWARD":{"address":5602548,"default_item":106,"flag":1512},"TRAINER_EDWIN_1_REWARD":{"address":5603108,"default_item":108,"flag":1792},"TRAINER_ED_REWARD":{"address":5602110,"default_item":104,"flag":1293},"TRAINER_ELIJAH_REWARD":{"address":5603568,"default_item":108,"flag":2022},"TRAINER_ELI_REWARD":{"address":5603086,"default_item":108,"flag":1781},"TRAINER_ELLIOT_1_REWARD":{"address":5602762,"default_item":106,"flag":1619},"TRAINER_ERIC_REWARD":{"address":5603348,"default_item":108,"flag":1912},"TRAINER_ERNEST_1_REWARD":{"address":5603068,"default_item":104,"flag":1772},"TRAINER_ETHAN_1_REWARD":{"address":5602516,"default_item":106,"flag":1496},"TRAINER_FABIAN_REWARD":{"address":5603602,"default_item":108,"flag":2039},"TRAINER_FELIX_REWARD":{"address":5602160,"default_item":104,"flag":1318},"TRAINER_FERNANDO_1_REWARD":{"address":5602474,"default_item":108,"flag":1475},"TRAINER_FLANNERY_1_REWARD":{"address":5602620,"default_item":107,"flag":1548},"TRAINER_FLINT_REWARD":{"address":5603392,"default_item":106,"flag":1934},"TRAINER_FOSTER_REWARD":{"address":5602176,"default_item":104,"flag":1326},"TRAINER_FRANKLIN_REWARD":{"address":5602424,"default_item":106,"flag":1450},"TRAINER_FREDRICK_REWARD":{"address":5602142,"default_item":104,"flag":1309},"TRAINER_GABRIELLE_1_REWARD":{"address":5602102,"default_item":104,"flag":1289},"TRAINER_GARRET_REWARD":{"address":5602360,"default_item":110,"flag":1418},"TRAINER_GARRISON_REWARD":{"address":5603178,"default_item":104,"flag":1827},"TRAINER_GEORGE_REWARD":{"address":5602230,"default_item":104,"flag":1353},"TRAINER_GERALD_REWARD":{"address":5603380,"default_item":104,"flag":1928},"TRAINER_GILBERT_REWARD":{"address":5602422,"default_item":106,"flag":1449},"TRAINER_GINA_AND_MIA_1_REWARD":{"address":5603050,"default_item":103,"flag":1763},"TRAINER_GLACIA_REWARD":{"address":5602610,"default_item":110,"flag":1543},"TRAINER_GRACE_REWARD":{"address":5602984,"default_item":106,"flag":1730},"TRAINER_GREG_REWARD":{"address":5603322,"default_item":106,"flag":1899},"TRAINER_GRUNT_AQUA_HIDEOUT_1_REWARD":{"address":5602088,"default_item":106,"flag":1282},"TRAINER_GRUNT_AQUA_HIDEOUT_2_REWARD":{"address":5602090,"default_item":106,"flag":1283},"TRAINER_GRUNT_AQUA_HIDEOUT_3_REWARD":{"address":5602092,"default_item":106,"flag":1284},"TRAINER_GRUNT_AQUA_HIDEOUT_4_REWARD":{"address":5602094,"default_item":106,"flag":1285},"TRAINER_GRUNT_AQUA_HIDEOUT_5_REWARD":{"address":5602138,"default_item":106,"flag":1307},"TRAINER_GRUNT_AQUA_HIDEOUT_6_REWARD":{"address":5602140,"default_item":106,"flag":1308},"TRAINER_GRUNT_AQUA_HIDEOUT_7_REWARD":{"address":5602468,"default_item":106,"flag":1472},"TRAINER_GRUNT_AQUA_HIDEOUT_8_REWARD":{"address":5602470,"default_item":106,"flag":1473},"TRAINER_GRUNT_MAGMA_HIDEOUT_10_REWARD":{"address":5603534,"default_item":106,"flag":2005},"TRAINER_GRUNT_MAGMA_HIDEOUT_11_REWARD":{"address":5603536,"default_item":106,"flag":2006},"TRAINER_GRUNT_MAGMA_HIDEOUT_12_REWARD":{"address":5603538,"default_item":106,"flag":2007},"TRAINER_GRUNT_MAGMA_HIDEOUT_13_REWARD":{"address":5603540,"default_item":106,"flag":2008},"TRAINER_GRUNT_MAGMA_HIDEOUT_14_REWARD":{"address":5603542,"default_item":106,"flag":2009},"TRAINER_GRUNT_MAGMA_HIDEOUT_15_REWARD":{"address":5603544,"default_item":106,"flag":2010},"TRAINER_GRUNT_MAGMA_HIDEOUT_16_REWARD":{"address":5603546,"default_item":106,"flag":2011},"TRAINER_GRUNT_MAGMA_HIDEOUT_1_REWARD":{"address":5603516,"default_item":106,"flag":1996},"TRAINER_GRUNT_MAGMA_HIDEOUT_2_REWARD":{"address":5603518,"default_item":106,"flag":1997},"TRAINER_GRUNT_MAGMA_HIDEOUT_3_REWARD":{"address":5603520,"default_item":106,"flag":1998},"TRAINER_GRUNT_MAGMA_HIDEOUT_4_REWARD":{"address":5603522,"default_item":106,"flag":1999},"TRAINER_GRUNT_MAGMA_HIDEOUT_5_REWARD":{"address":5603524,"default_item":106,"flag":2000},"TRAINER_GRUNT_MAGMA_HIDEOUT_6_REWARD":{"address":5603526,"default_item":106,"flag":2001},"TRAINER_GRUNT_MAGMA_HIDEOUT_7_REWARD":{"address":5603528,"default_item":106,"flag":2002},"TRAINER_GRUNT_MAGMA_HIDEOUT_8_REWARD":{"address":5603530,"default_item":106,"flag":2003},"TRAINER_GRUNT_MAGMA_HIDEOUT_9_REWARD":{"address":5603532,"default_item":106,"flag":2004},"TRAINER_GRUNT_MT_CHIMNEY_1_REWARD":{"address":5602376,"default_item":106,"flag":1426},"TRAINER_GRUNT_MT_CHIMNEY_2_REWARD":{"address":5603242,"default_item":106,"flag":1859},"TRAINER_GRUNT_MT_PYRE_1_REWARD":{"address":5602130,"default_item":106,"flag":1303},"TRAINER_GRUNT_MT_PYRE_2_REWARD":{"address":5602132,"default_item":106,"flag":1304},"TRAINER_GRUNT_MT_PYRE_3_REWARD":{"address":5602134,"default_item":106,"flag":1305},"TRAINER_GRUNT_MT_PYRE_4_REWARD":{"address":5603222,"default_item":106,"flag":1849},"TRAINER_GRUNT_MUSEUM_1_REWARD":{"address":5602124,"default_item":106,"flag":1300},"TRAINER_GRUNT_MUSEUM_2_REWARD":{"address":5602126,"default_item":106,"flag":1301},"TRAINER_GRUNT_PETALBURG_WOODS_REWARD":{"address":5602104,"default_item":103,"flag":1290},"TRAINER_GRUNT_RUSTURF_TUNNEL_REWARD":{"address":5602116,"default_item":103,"flag":1296},"TRAINER_GRUNT_SEAFLOOR_CAVERN_1_REWARD":{"address":5602096,"default_item":108,"flag":1286},"TRAINER_GRUNT_SEAFLOOR_CAVERN_2_REWARD":{"address":5602098,"default_item":108,"flag":1287},"TRAINER_GRUNT_SEAFLOOR_CAVERN_3_REWARD":{"address":5602100,"default_item":108,"flag":1288},"TRAINER_GRUNT_SEAFLOOR_CAVERN_4_REWARD":{"address":5602112,"default_item":108,"flag":1294},"TRAINER_GRUNT_SEAFLOOR_CAVERN_5_REWARD":{"address":5603218,"default_item":108,"flag":1847},"TRAINER_GRUNT_SPACE_CENTER_1_REWARD":{"address":5602128,"default_item":106,"flag":1302},"TRAINER_GRUNT_SPACE_CENTER_2_REWARD":{"address":5602316,"default_item":106,"flag":1396},"TRAINER_GRUNT_SPACE_CENTER_3_REWARD":{"address":5603256,"default_item":106,"flag":1866},"TRAINER_GRUNT_SPACE_CENTER_4_REWARD":{"address":5603258,"default_item":106,"flag":1867},"TRAINER_GRUNT_SPACE_CENTER_5_REWARD":{"address":5603260,"default_item":106,"flag":1868},"TRAINER_GRUNT_SPACE_CENTER_6_REWARD":{"address":5603262,"default_item":106,"flag":1869},"TRAINER_GRUNT_SPACE_CENTER_7_REWARD":{"address":5603264,"default_item":106,"flag":1870},"TRAINER_GRUNT_WEATHER_INST_1_REWARD":{"address":5602118,"default_item":106,"flag":1297},"TRAINER_GRUNT_WEATHER_INST_2_REWARD":{"address":5602120,"default_item":106,"flag":1298},"TRAINER_GRUNT_WEATHER_INST_3_REWARD":{"address":5602122,"default_item":106,"flag":1299},"TRAINER_GRUNT_WEATHER_INST_4_REWARD":{"address":5602136,"default_item":106,"flag":1306},"TRAINER_GRUNT_WEATHER_INST_5_REWARD":{"address":5603276,"default_item":106,"flag":1876},"TRAINER_GWEN_REWARD":{"address":5602202,"default_item":103,"flag":1339},"TRAINER_HAILEY_REWARD":{"address":5603478,"default_item":103,"flag":1977},"TRAINER_HALEY_1_REWARD":{"address":5603292,"default_item":103,"flag":1884},"TRAINER_HALLE_REWARD":{"address":5603176,"default_item":104,"flag":1826},"TRAINER_HANNAH_REWARD":{"address":5602572,"default_item":108,"flag":1524},"TRAINER_HARRISON_REWARD":{"address":5603240,"default_item":106,"flag":1858},"TRAINER_HAYDEN_REWARD":{"address":5603498,"default_item":106,"flag":1987},"TRAINER_HECTOR_REWARD":{"address":5603110,"default_item":104,"flag":1793},"TRAINER_HEIDI_REWARD":{"address":5603022,"default_item":106,"flag":1749},"TRAINER_HELENE_REWARD":{"address":5603586,"default_item":106,"flag":2031},"TRAINER_HENRY_REWARD":{"address":5603420,"default_item":104,"flag":1948},"TRAINER_HERMAN_REWARD":{"address":5602418,"default_item":106,"flag":1447},"TRAINER_HIDEO_REWARD":{"address":5603386,"default_item":106,"flag":1931},"TRAINER_HITOSHI_REWARD":{"address":5602444,"default_item":104,"flag":1460},"TRAINER_HOPE_REWARD":{"address":5602276,"default_item":104,"flag":1376},"TRAINER_HUDSON_REWARD":{"address":5603104,"default_item":104,"flag":1790},"TRAINER_HUEY_REWARD":{"address":5603064,"default_item":106,"flag":1770},"TRAINER_HUGH_REWARD":{"address":5602882,"default_item":108,"flag":1679},"TRAINER_HUMBERTO_REWARD":{"address":5602888,"default_item":108,"flag":1682},"TRAINER_IMANI_REWARD":{"address":5602968,"default_item":103,"flag":1722},"TRAINER_IRENE_REWARD":{"address":5603036,"default_item":106,"flag":1756},"TRAINER_ISAAC_1_REWARD":{"address":5603160,"default_item":106,"flag":1818},"TRAINER_ISABELLA_REWARD":{"address":5603274,"default_item":104,"flag":1875},"TRAINER_ISABELLE_REWARD":{"address":5603556,"default_item":103,"flag":2016},"TRAINER_ISABEL_1_REWARD":{"address":5602688,"default_item":104,"flag":1582},"TRAINER_ISAIAH_1_REWARD":{"address":5602836,"default_item":104,"flag":1656},"TRAINER_ISOBEL_REWARD":{"address":5602850,"default_item":104,"flag":1663},"TRAINER_IVAN_REWARD":{"address":5602758,"default_item":106,"flag":1617},"TRAINER_JACE_REWARD":{"address":5602492,"default_item":108,"flag":1484},"TRAINER_JACKI_1_REWARD":{"address":5602582,"default_item":108,"flag":1529},"TRAINER_JACKSON_1_REWARD":{"address":5603188,"default_item":104,"flag":1832},"TRAINER_JACK_REWARD":{"address":5602428,"default_item":106,"flag":1452},"TRAINER_JACLYN_REWARD":{"address":5602570,"default_item":106,"flag":1523},"TRAINER_JACOB_REWARD":{"address":5602786,"default_item":106,"flag":1631},"TRAINER_JAIDEN_REWARD":{"address":5603582,"default_item":106,"flag":2029},"TRAINER_JAMES_1_REWARD":{"address":5603326,"default_item":103,"flag":1901},"TRAINER_JANICE_REWARD":{"address":5603294,"default_item":103,"flag":1885},"TRAINER_JANI_REWARD":{"address":5602920,"default_item":103,"flag":1698},"TRAINER_JARED_REWARD":{"address":5602886,"default_item":108,"flag":1681},"TRAINER_JASMINE_REWARD":{"address":5602802,"default_item":103,"flag":1639},"TRAINER_JAYLEN_REWARD":{"address":5602736,"default_item":106,"flag":1606},"TRAINER_JAZMYN_REWARD":{"address":5603090,"default_item":106,"flag":1783},"TRAINER_JEFFREY_1_REWARD":{"address":5602536,"default_item":104,"flag":1506},"TRAINER_JEFF_REWARD":{"address":5602488,"default_item":108,"flag":1482},"TRAINER_JENNA_REWARD":{"address":5603204,"default_item":104,"flag":1840},"TRAINER_JENNIFER_REWARD":{"address":5602274,"default_item":104,"flag":1375},"TRAINER_JENNY_1_REWARD":{"address":5602982,"default_item":106,"flag":1729},"TRAINER_JEROME_REWARD":{"address":5602396,"default_item":103,"flag":1436},"TRAINER_JERRY_1_REWARD":{"address":5602630,"default_item":103,"flag":1553},"TRAINER_JESSICA_1_REWARD":{"address":5602338,"default_item":104,"flag":1407},"TRAINER_JOCELYN_REWARD":{"address":5602934,"default_item":106,"flag":1705},"TRAINER_JODY_REWARD":{"address":5602266,"default_item":104,"flag":1371},"TRAINER_JOEY_REWARD":{"address":5602728,"default_item":103,"flag":1602},"TRAINER_JOHANNA_REWARD":{"address":5603378,"default_item":104,"flag":1927},"TRAINER_JOHNSON_REWARD":{"address":5603592,"default_item":103,"flag":2034},"TRAINER_JOHN_AND_JAY_1_REWARD":{"address":5603446,"default_item":104,"flag":1961},"TRAINER_JONAH_REWARD":{"address":5603418,"default_item":104,"flag":1947},"TRAINER_JONAS_REWARD":{"address":5603092,"default_item":106,"flag":1784},"TRAINER_JONATHAN_REWARD":{"address":5603280,"default_item":104,"flag":1878},"TRAINER_JOSEPH_REWARD":{"address":5603484,"default_item":106,"flag":1980},"TRAINER_JOSE_REWARD":{"address":5603318,"default_item":103,"flag":1897},"TRAINER_JOSH_REWARD":{"address":5602724,"default_item":103,"flag":1600},"TRAINER_JOSUE_REWARD":{"address":5603560,"default_item":108,"flag":2018},"TRAINER_JUAN_1_REWARD":{"address":5602628,"default_item":109,"flag":1552},"TRAINER_JULIE_REWARD":{"address":5602284,"default_item":104,"flag":1380},"TRAINER_JULIO_REWARD":{"address":5603216,"default_item":108,"flag":1846},"TRAINER_KAI_REWARD":{"address":5603510,"default_item":108,"flag":1993},"TRAINER_KALEB_REWARD":{"address":5603482,"default_item":104,"flag":1979},"TRAINER_KARA_REWARD":{"address":5602998,"default_item":106,"flag":1737},"TRAINER_KAREN_1_REWARD":{"address":5602644,"default_item":103,"flag":1560},"TRAINER_KATELYNN_REWARD":{"address":5602734,"default_item":104,"flag":1605},"TRAINER_KATELYN_1_REWARD":{"address":5602856,"default_item":104,"flag":1666},"TRAINER_KATE_AND_JOY_REWARD":{"address":5602656,"default_item":106,"flag":1566},"TRAINER_KATHLEEN_REWARD":{"address":5603250,"default_item":108,"flag":1863},"TRAINER_KATIE_REWARD":{"address":5602994,"default_item":106,"flag":1735},"TRAINER_KAYLA_REWARD":{"address":5602578,"default_item":106,"flag":1527},"TRAINER_KAYLEY_REWARD":{"address":5603094,"default_item":104,"flag":1785},"TRAINER_KEEGAN_REWARD":{"address":5602494,"default_item":108,"flag":1485},"TRAINER_KEIGO_REWARD":{"address":5603388,"default_item":106,"flag":1932},"TRAINER_KELVIN_REWARD":{"address":5603098,"default_item":104,"flag":1787},"TRAINER_KENT_REWARD":{"address":5603324,"default_item":106,"flag":1900},"TRAINER_KEVIN_REWARD":{"address":5602426,"default_item":106,"flag":1451},"TRAINER_KIM_AND_IRIS_REWARD":{"address":5603440,"default_item":106,"flag":1958},"TRAINER_KINDRA_REWARD":{"address":5602296,"default_item":108,"flag":1386},"TRAINER_KIRA_AND_DAN_1_REWARD":{"address":5603368,"default_item":108,"flag":1922},"TRAINER_KIRK_REWARD":{"address":5602466,"default_item":106,"flag":1471},"TRAINER_KIYO_REWARD":{"address":5602446,"default_item":104,"flag":1461},"TRAINER_KOICHI_REWARD":{"address":5602448,"default_item":108,"flag":1462},"TRAINER_KOJI_1_REWARD":{"address":5603428,"default_item":104,"flag":1952},"TRAINER_KYLA_REWARD":{"address":5602970,"default_item":103,"flag":1723},"TRAINER_KYRA_REWARD":{"address":5603580,"default_item":104,"flag":2028},"TRAINER_LAO_1_REWARD":{"address":5602922,"default_item":103,"flag":1699},"TRAINER_LARRY_REWARD":{"address":5602510,"default_item":106,"flag":1493},"TRAINER_LAURA_REWARD":{"address":5602936,"default_item":106,"flag":1706},"TRAINER_LAUREL_REWARD":{"address":5603010,"default_item":106,"flag":1743},"TRAINER_LAWRENCE_REWARD":{"address":5603504,"default_item":106,"flag":1990},"TRAINER_LEAH_REWARD":{"address":5602154,"default_item":108,"flag":1315},"TRAINER_LEA_AND_JED_REWARD":{"address":5603366,"default_item":104,"flag":1921},"TRAINER_LENNY_REWARD":{"address":5603340,"default_item":108,"flag":1908},"TRAINER_LEONARDO_REWARD":{"address":5603236,"default_item":106,"flag":1856},"TRAINER_LEONARD_REWARD":{"address":5603074,"default_item":104,"flag":1775},"TRAINER_LEONEL_REWARD":{"address":5603608,"default_item":104,"flag":2042},"TRAINER_LILA_AND_ROY_1_REWARD":{"address":5603458,"default_item":106,"flag":1967},"TRAINER_LILITH_REWARD":{"address":5603230,"default_item":106,"flag":1853},"TRAINER_LINDA_REWARD":{"address":5603006,"default_item":106,"flag":1741},"TRAINER_LISA_AND_RAY_REWARD":{"address":5603468,"default_item":106,"flag":1972},"TRAINER_LOLA_1_REWARD":{"address":5602198,"default_item":103,"flag":1337},"TRAINER_LORENZO_REWARD":{"address":5603190,"default_item":104,"flag":1833},"TRAINER_LUCAS_1_REWARD":{"address":5603342,"default_item":108,"flag":1909},"TRAINER_LUIS_REWARD":{"address":5602386,"default_item":103,"flag":1431},"TRAINER_LUNG_REWARD":{"address":5602924,"default_item":103,"flag":1700},"TRAINER_LYDIA_1_REWARD":{"address":5603174,"default_item":106,"flag":1825},"TRAINER_LYLE_REWARD":{"address":5603316,"default_item":103,"flag":1896},"TRAINER_MACEY_REWARD":{"address":5603266,"default_item":108,"flag":1871},"TRAINER_MADELINE_1_REWARD":{"address":5602952,"default_item":108,"flag":1714},"TRAINER_MAKAYLA_REWARD":{"address":5603600,"default_item":104,"flag":2038},"TRAINER_MARCEL_REWARD":{"address":5602106,"default_item":104,"flag":1291},"TRAINER_MARCOS_REWARD":{"address":5603488,"default_item":106,"flag":1982},"TRAINER_MARC_REWARD":{"address":5603226,"default_item":106,"flag":1851},"TRAINER_MARIA_1_REWARD":{"address":5602822,"default_item":106,"flag":1649},"TRAINER_MARK_REWARD":{"address":5602374,"default_item":104,"flag":1425},"TRAINER_MARLENE_REWARD":{"address":5603588,"default_item":106,"flag":2032},"TRAINER_MARLEY_REWARD":{"address":5603100,"default_item":104,"flag":1788},"TRAINER_MARY_REWARD":{"address":5602262,"default_item":104,"flag":1369},"TRAINER_MATTHEW_REWARD":{"address":5602398,"default_item":103,"flag":1437},"TRAINER_MATT_REWARD":{"address":5602144,"default_item":104,"flag":1310},"TRAINER_MAURA_REWARD":{"address":5602576,"default_item":108,"flag":1526},"TRAINER_MAXIE_MAGMA_HIDEOUT_REWARD":{"address":5603286,"default_item":107,"flag":1881},"TRAINER_MAXIE_MT_CHIMNEY_REWARD":{"address":5603288,"default_item":104,"flag":1882},"TRAINER_MAY_LILYCOVE_MUDKIP_REWARD":{"address":5603412,"default_item":104,"flag":1944},"TRAINER_MAY_LILYCOVE_TORCHIC_REWARD":{"address":5603416,"default_item":104,"flag":1946},"TRAINER_MAY_LILYCOVE_TREECKO_REWARD":{"address":5603414,"default_item":104,"flag":1945},"TRAINER_MAY_ROUTE_103_MUDKIP_REWARD":{"address":5603142,"default_item":106,"flag":1809},"TRAINER_MAY_ROUTE_103_TORCHIC_REWARD":{"address":5603154,"default_item":106,"flag":1815},"TRAINER_MAY_ROUTE_103_TREECKO_REWARD":{"address":5603148,"default_item":106,"flag":1812},"TRAINER_MAY_ROUTE_110_MUDKIP_REWARD":{"address":5603144,"default_item":104,"flag":1810},"TRAINER_MAY_ROUTE_110_TORCHIC_REWARD":{"address":5603156,"default_item":104,"flag":1816},"TRAINER_MAY_ROUTE_110_TREECKO_REWARD":{"address":5603150,"default_item":104,"flag":1813},"TRAINER_MAY_ROUTE_119_MUDKIP_REWARD":{"address":5603146,"default_item":104,"flag":1811},"TRAINER_MAY_ROUTE_119_TORCHIC_REWARD":{"address":5603158,"default_item":104,"flag":1817},"TRAINER_MAY_ROUTE_119_TREECKO_REWARD":{"address":5603152,"default_item":104,"flag":1814},"TRAINER_MAY_RUSTBORO_MUDKIP_REWARD":{"address":5603284,"default_item":108,"flag":1880},"TRAINER_MAY_RUSTBORO_TORCHIC_REWARD":{"address":5603622,"default_item":108,"flag":2049},"TRAINER_MAY_RUSTBORO_TREECKO_REWARD":{"address":5603620,"default_item":108,"flag":2048},"TRAINER_MELINA_REWARD":{"address":5603594,"default_item":106,"flag":2035},"TRAINER_MELISSA_REWARD":{"address":5602332,"default_item":104,"flag":1404},"TRAINER_MEL_AND_PAUL_REWARD":{"address":5603444,"default_item":108,"flag":1960},"TRAINER_MICAH_REWARD":{"address":5602594,"default_item":107,"flag":1535},"TRAINER_MICHELLE_REWARD":{"address":5602280,"default_item":104,"flag":1378},"TRAINER_MIGUEL_1_REWARD":{"address":5602670,"default_item":104,"flag":1573},"TRAINER_MIKE_2_REWARD":{"address":5603354,"default_item":106,"flag":1915},"TRAINER_MISSY_REWARD":{"address":5602978,"default_item":103,"flag":1727},"TRAINER_MITCHELL_REWARD":{"address":5603164,"default_item":104,"flag":1820},"TRAINER_MIU_AND_YUKI_REWARD":{"address":5603052,"default_item":106,"flag":1764},"TRAINER_MOLLIE_REWARD":{"address":5602358,"default_item":104,"flag":1417},"TRAINER_MYLES_REWARD":{"address":5603614,"default_item":104,"flag":2045},"TRAINER_NANCY_REWARD":{"address":5603028,"default_item":106,"flag":1752},"TRAINER_NAOMI_REWARD":{"address":5602322,"default_item":110,"flag":1399},"TRAINER_NATE_REWARD":{"address":5603248,"default_item":107,"flag":1862},"TRAINER_NED_REWARD":{"address":5602764,"default_item":106,"flag":1620},"TRAINER_NICHOLAS_REWARD":{"address":5603254,"default_item":108,"flag":1865},"TRAINER_NICOLAS_1_REWARD":{"address":5602868,"default_item":104,"flag":1672},"TRAINER_NIKKI_REWARD":{"address":5602990,"default_item":106,"flag":1733},"TRAINER_NOB_1_REWARD":{"address":5602450,"default_item":106,"flag":1463},"TRAINER_NOLAN_REWARD":{"address":5602768,"default_item":108,"flag":1622},"TRAINER_NOLEN_REWARD":{"address":5602406,"default_item":106,"flag":1441},"TRAINER_NORMAN_1_REWARD":{"address":5602622,"default_item":107,"flag":1549},"TRAINER_OLIVIA_REWARD":{"address":5602344,"default_item":107,"flag":1410},"TRAINER_OWEN_REWARD":{"address":5602250,"default_item":104,"flag":1363},"TRAINER_PABLO_1_REWARD":{"address":5602838,"default_item":104,"flag":1657},"TRAINER_PARKER_REWARD":{"address":5602228,"default_item":104,"flag":1352},"TRAINER_PAT_REWARD":{"address":5603616,"default_item":104,"flag":2046},"TRAINER_PAXTON_REWARD":{"address":5603272,"default_item":104,"flag":1874},"TRAINER_PERRY_REWARD":{"address":5602880,"default_item":108,"flag":1678},"TRAINER_PETE_REWARD":{"address":5603554,"default_item":103,"flag":2015},"TRAINER_PHILLIP_REWARD":{"address":5603072,"default_item":104,"flag":1774},"TRAINER_PHIL_REWARD":{"address":5602884,"default_item":108,"flag":1680},"TRAINER_PHOEBE_REWARD":{"address":5602608,"default_item":110,"flag":1542},"TRAINER_PRESLEY_REWARD":{"address":5602890,"default_item":104,"flag":1683},"TRAINER_PRESTON_REWARD":{"address":5602550,"default_item":108,"flag":1513},"TRAINER_QUINCY_REWARD":{"address":5602732,"default_item":104,"flag":1604},"TRAINER_RACHEL_REWARD":{"address":5603606,"default_item":104,"flag":2041},"TRAINER_RANDALL_REWARD":{"address":5602226,"default_item":104,"flag":1351},"TRAINER_REED_REWARD":{"address":5603434,"default_item":106,"flag":1955},"TRAINER_RELI_AND_IAN_REWARD":{"address":5603456,"default_item":106,"flag":1966},"TRAINER_REYNA_REWARD":{"address":5603102,"default_item":108,"flag":1789},"TRAINER_RHETT_REWARD":{"address":5603490,"default_item":106,"flag":1983},"TRAINER_RICHARD_REWARD":{"address":5602416,"default_item":106,"flag":1446},"TRAINER_RICKY_1_REWARD":{"address":5602212,"default_item":103,"flag":1344},"TRAINER_RICK_REWARD":{"address":5603314,"default_item":103,"flag":1895},"TRAINER_RILEY_REWARD":{"address":5603390,"default_item":106,"flag":1933},"TRAINER_ROBERT_1_REWARD":{"address":5602896,"default_item":108,"flag":1686},"TRAINER_RODNEY_REWARD":{"address":5602414,"default_item":106,"flag":1445},"TRAINER_ROGER_REWARD":{"address":5603422,"default_item":104,"flag":1949},"TRAINER_ROLAND_REWARD":{"address":5602404,"default_item":106,"flag":1440},"TRAINER_RONALD_REWARD":{"address":5602784,"default_item":104,"flag":1630},"TRAINER_ROSE_1_REWARD":{"address":5602158,"default_item":106,"flag":1317},"TRAINER_ROXANNE_1_REWARD":{"address":5602614,"default_item":104,"flag":1545},"TRAINER_RUBEN_REWARD":{"address":5603426,"default_item":104,"flag":1951},"TRAINER_SAMANTHA_REWARD":{"address":5602574,"default_item":108,"flag":1525},"TRAINER_SAMUEL_REWARD":{"address":5602246,"default_item":104,"flag":1361},"TRAINER_SANTIAGO_REWARD":{"address":5602420,"default_item":106,"flag":1448},"TRAINER_SARAH_REWARD":{"address":5603474,"default_item":104,"flag":1975},"TRAINER_SAWYER_1_REWARD":{"address":5602086,"default_item":108,"flag":1281},"TRAINER_SHANE_REWARD":{"address":5602512,"default_item":106,"flag":1494},"TRAINER_SHANNON_REWARD":{"address":5602278,"default_item":104,"flag":1377},"TRAINER_SHARON_REWARD":{"address":5602988,"default_item":106,"flag":1732},"TRAINER_SHAWN_REWARD":{"address":5602472,"default_item":106,"flag":1474},"TRAINER_SHAYLA_REWARD":{"address":5603578,"default_item":108,"flag":2027},"TRAINER_SHEILA_REWARD":{"address":5602334,"default_item":104,"flag":1405},"TRAINER_SHELBY_1_REWARD":{"address":5602710,"default_item":108,"flag":1593},"TRAINER_SHELLY_SEAFLOOR_CAVERN_REWARD":{"address":5602150,"default_item":104,"flag":1313},"TRAINER_SHELLY_WEATHER_INSTITUTE_REWARD":{"address":5602148,"default_item":104,"flag":1312},"TRAINER_SHIRLEY_REWARD":{"address":5602336,"default_item":104,"flag":1406},"TRAINER_SIDNEY_REWARD":{"address":5602606,"default_item":110,"flag":1541},"TRAINER_SIENNA_REWARD":{"address":5603002,"default_item":106,"flag":1739},"TRAINER_SIMON_REWARD":{"address":5602214,"default_item":103,"flag":1345},"TRAINER_SOPHIE_REWARD":{"address":5603500,"default_item":106,"flag":1988},"TRAINER_SPENCER_REWARD":{"address":5602402,"default_item":106,"flag":1439},"TRAINER_STAN_REWARD":{"address":5602408,"default_item":106,"flag":1442},"TRAINER_STEVEN_REWARD":{"address":5603692,"default_item":109,"flag":2084},"TRAINER_STEVE_1_REWARD":{"address":5602370,"default_item":104,"flag":1423},"TRAINER_SUSIE_REWARD":{"address":5602996,"default_item":106,"flag":1736},"TRAINER_SYLVIA_REWARD":{"address":5603234,"default_item":108,"flag":1855},"TRAINER_TABITHA_MAGMA_HIDEOUT_REWARD":{"address":5603548,"default_item":104,"flag":2012},"TRAINER_TABITHA_MT_CHIMNEY_REWARD":{"address":5603278,"default_item":108,"flag":1877},"TRAINER_TAKAO_REWARD":{"address":5602442,"default_item":106,"flag":1459},"TRAINER_TAKASHI_REWARD":{"address":5602916,"default_item":106,"flag":1696},"TRAINER_TALIA_REWARD":{"address":5602854,"default_item":104,"flag":1665},"TRAINER_TAMMY_REWARD":{"address":5602298,"default_item":106,"flag":1387},"TRAINER_TANYA_REWARD":{"address":5602986,"default_item":106,"flag":1731},"TRAINER_TARA_REWARD":{"address":5602976,"default_item":103,"flag":1726},"TRAINER_TASHA_REWARD":{"address":5602302,"default_item":108,"flag":1389},"TRAINER_TATE_AND_LIZA_1_REWARD":{"address":5602626,"default_item":109,"flag":1551},"TRAINER_TAYLOR_REWARD":{"address":5602534,"default_item":104,"flag":1505},"TRAINER_THALIA_1_REWARD":{"address":5602372,"default_item":104,"flag":1424},"TRAINER_THOMAS_REWARD":{"address":5602596,"default_item":107,"flag":1536},"TRAINER_TIANA_REWARD":{"address":5603290,"default_item":103,"flag":1883},"TRAINER_TIFFANY_REWARD":{"address":5602346,"default_item":107,"flag":1411},"TRAINER_TIMMY_REWARD":{"address":5602752,"default_item":103,"flag":1614},"TRAINER_TIMOTHY_1_REWARD":{"address":5602698,"default_item":104,"flag":1587},"TRAINER_TISHA_REWARD":{"address":5603436,"default_item":106,"flag":1956},"TRAINER_TOMMY_REWARD":{"address":5602726,"default_item":103,"flag":1601},"TRAINER_TONY_1_REWARD":{"address":5602394,"default_item":103,"flag":1435},"TRAINER_TORI_AND_TIA_REWARD":{"address":5603438,"default_item":103,"flag":1957},"TRAINER_TRAVIS_REWARD":{"address":5602520,"default_item":106,"flag":1498},"TRAINER_TRENT_1_REWARD":{"address":5603338,"default_item":106,"flag":1907},"TRAINER_TYRA_AND_IVY_REWARD":{"address":5603442,"default_item":106,"flag":1959},"TRAINER_TYRON_REWARD":{"address":5603492,"default_item":106,"flag":1984},"TRAINER_VALERIE_1_REWARD":{"address":5602300,"default_item":108,"flag":1388},"TRAINER_VANESSA_REWARD":{"address":5602684,"default_item":104,"flag":1580},"TRAINER_VICKY_REWARD":{"address":5602708,"default_item":108,"flag":1592},"TRAINER_VICTORIA_REWARD":{"address":5602682,"default_item":106,"flag":1579},"TRAINER_VICTOR_REWARD":{"address":5602668,"default_item":106,"flag":1572},"TRAINER_VIOLET_REWARD":{"address":5602162,"default_item":104,"flag":1319},"TRAINER_VIRGIL_REWARD":{"address":5602552,"default_item":108,"flag":1514},"TRAINER_VITO_REWARD":{"address":5602248,"default_item":104,"flag":1362},"TRAINER_VIVIAN_REWARD":{"address":5603382,"default_item":106,"flag":1929},"TRAINER_VIVI_REWARD":{"address":5603296,"default_item":106,"flag":1886},"TRAINER_WADE_REWARD":{"address":5602772,"default_item":106,"flag":1624},"TRAINER_WALLACE_REWARD":{"address":5602754,"default_item":110,"flag":1615},"TRAINER_WALLY_MAUVILLE_REWARD":{"address":5603396,"default_item":108,"flag":1936},"TRAINER_WALLY_VR_1_REWARD":{"address":5603122,"default_item":107,"flag":1799},"TRAINER_WALTER_1_REWARD":{"address":5602592,"default_item":104,"flag":1534},"TRAINER_WARREN_REWARD":{"address":5602260,"default_item":104,"flag":1368},"TRAINER_WATTSON_1_REWARD":{"address":5602618,"default_item":104,"flag":1547},"TRAINER_WAYNE_REWARD":{"address":5603430,"default_item":104,"flag":1953},"TRAINER_WENDY_REWARD":{"address":5602268,"default_item":104,"flag":1372},"TRAINER_WILLIAM_REWARD":{"address":5602556,"default_item":106,"flag":1516},"TRAINER_WILTON_1_REWARD":{"address":5602240,"default_item":108,"flag":1358},"TRAINER_WINONA_1_REWARD":{"address":5602624,"default_item":107,"flag":1550},"TRAINER_WINSTON_1_REWARD":{"address":5602356,"default_item":104,"flag":1416},"TRAINER_WYATT_REWARD":{"address":5603506,"default_item":104,"flag":1991},"TRAINER_YASU_REWARD":{"address":5602914,"default_item":106,"flag":1695},"TRAINER_ZANDER_REWARD":{"address":5602146,"default_item":108,"flag":1311}},"maps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":{"header_address":4766420,"warp_table_address":5496844},"MAP_ABANDONED_SHIP_CORRIDORS_1F":{"header_address":4766196,"warp_table_address":5495920},"MAP_ABANDONED_SHIP_CORRIDORS_B1F":{"header_address":4766252,"warp_table_address":5496248},"MAP_ABANDONED_SHIP_DECK":{"header_address":4766168,"warp_table_address":5495812},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":{"fishing_encounters":{"address":5609088,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766476,"warp_table_address":5496908,"water_encounters":{"address":5609060,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":{"header_address":4766504,"warp_table_address":5497120},"MAP_ABANDONED_SHIP_ROOMS2_1F":{"header_address":4766392,"warp_table_address":5496752},"MAP_ABANDONED_SHIP_ROOMS2_B1F":{"header_address":4766308,"warp_table_address":5496484},"MAP_ABANDONED_SHIP_ROOMS_1F":{"header_address":4766224,"warp_table_address":5496132},"MAP_ABANDONED_SHIP_ROOMS_B1F":{"fishing_encounters":{"address":5606324,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766280,"warp_table_address":5496392,"water_encounters":{"address":5606296,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_ROOM_B1F":{"header_address":4766364,"warp_table_address":5496596},"MAP_ABANDONED_SHIP_UNDERWATER1":{"header_address":4766336,"warp_table_address":5496536},"MAP_ABANDONED_SHIP_UNDERWATER2":{"header_address":4766448,"warp_table_address":5496880},"MAP_ALTERING_CAVE":{"header_address":4767624,"land_encounters":{"address":5613400,"slots":[41,41,41,41,41,41,41,41,41,41,41,41]},"warp_table_address":5500436},"MAP_ANCIENT_TOMB":{"header_address":4766560,"warp_table_address":5497460},"MAP_AQUA_HIDEOUT_1F":{"header_address":4765300,"warp_table_address":5490892},"MAP_AQUA_HIDEOUT_B1F":{"header_address":4765328,"warp_table_address":5491152},"MAP_AQUA_HIDEOUT_B2F":{"header_address":4765356,"warp_table_address":5491516},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":{"header_address":4766728,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":{"header_address":4766756,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":{"header_address":4766784,"warp_table_address":4160749568},"MAP_ARTISAN_CAVE_1F":{"header_address":4767456,"land_encounters":{"address":5613344,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500172},"MAP_ARTISAN_CAVE_B1F":{"header_address":4767428,"land_encounters":{"address":5613288,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500064},"MAP_BATTLE_COLOSSEUM_2P":{"header_address":4768352,"warp_table_address":5509852},"MAP_BATTLE_COLOSSEUM_4P":{"header_address":4768436,"warp_table_address":5510152},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":{"header_address":4770228,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":{"header_address":4770200,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":{"header_address":4770172,"warp_table_address":5520908},"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":{"header_address":4769976,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":{"header_address":4769920,"warp_table_address":5519076},"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":{"header_address":4769892,"warp_table_address":5518968},"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":{"header_address":4769948,"warp_table_address":5519136},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":{"header_address":4770312,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":{"header_address":4770256,"warp_table_address":5521384},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":{"header_address":4770284,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":{"header_address":4770060,"warp_table_address":5520116},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":{"header_address":4770032,"warp_table_address":5519944},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":{"header_address":4770004,"warp_table_address":5519696},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":{"header_address":4770368,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":{"header_address":4770340,"warp_table_address":5521808},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":{"header_address":4770452,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":{"header_address":4770424,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":{"header_address":4770480,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":{"header_address":4770396,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":{"header_address":4770116,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":{"header_address":4770088,"warp_table_address":5520248},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":{"header_address":4770144,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":{"header_address":4769612,"warp_table_address":5516696},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":{"header_address":4769584,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":{"header_address":4769556,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":{"header_address":4769528,"warp_table_address":5516432},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":{"header_address":4769864,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":{"header_address":4769836,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":{"header_address":4769808,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":{"header_address":4770564,"warp_table_address":5523056},"MAP_BATTLE_FRONTIER_LOUNGE1":{"header_address":4770536,"warp_table_address":5522812},"MAP_BATTLE_FRONTIER_LOUNGE2":{"header_address":4770592,"warp_table_address":5523220},"MAP_BATTLE_FRONTIER_LOUNGE3":{"header_address":4770620,"warp_table_address":5523376},"MAP_BATTLE_FRONTIER_LOUNGE4":{"header_address":4770648,"warp_table_address":5523476},"MAP_BATTLE_FRONTIER_LOUNGE5":{"header_address":4770704,"warp_table_address":5523660},"MAP_BATTLE_FRONTIER_LOUNGE6":{"header_address":4770732,"warp_table_address":5523720},"MAP_BATTLE_FRONTIER_LOUNGE7":{"header_address":4770760,"warp_table_address":5523844},"MAP_BATTLE_FRONTIER_LOUNGE8":{"header_address":4770816,"warp_table_address":5524100},"MAP_BATTLE_FRONTIER_LOUNGE9":{"header_address":4770844,"warp_table_address":5524152},"MAP_BATTLE_FRONTIER_MART":{"header_address":4770928,"warp_table_address":5524588},"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":{"header_address":4769780,"warp_table_address":5518080},"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":{"header_address":4769500,"warp_table_address":5516048},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":{"header_address":4770872,"warp_table_address":5524308},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":{"header_address":4770900,"warp_table_address":5524448},"MAP_BATTLE_FRONTIER_RANKING_HALL":{"header_address":4770508,"warp_table_address":5522560},"MAP_BATTLE_FRONTIER_RECEPTION_GATE":{"header_address":4770788,"warp_table_address":5523992},"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":{"header_address":4770676,"warp_table_address":5523528},"MAP_BATTLE_PYRAMID_SQUARE01":{"header_address":4768912,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE02":{"header_address":4768940,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE03":{"header_address":4768968,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE04":{"header_address":4768996,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE05":{"header_address":4769024,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE06":{"header_address":4769052,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE07":{"header_address":4769080,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE08":{"header_address":4769108,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE09":{"header_address":4769136,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE10":{"header_address":4769164,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE11":{"header_address":4769192,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE12":{"header_address":4769220,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE13":{"header_address":4769248,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE14":{"header_address":4769276,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE15":{"header_address":4769304,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE16":{"header_address":4769332,"warp_table_address":4160749568},"MAP_BIRTH_ISLAND_EXTERIOR":{"header_address":4771012,"warp_table_address":5524876},"MAP_BIRTH_ISLAND_HARBOR":{"header_address":4771040,"warp_table_address":5524952},"MAP_CAVE_OF_ORIGIN_1F":{"header_address":4765720,"land_encounters":{"address":5609868,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493440},"MAP_CAVE_OF_ORIGIN_B1F":{"header_address":4765832,"warp_table_address":5493608},"MAP_CAVE_OF_ORIGIN_ENTRANCE":{"header_address":4765692,"land_encounters":{"address":5609812,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493404},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":{"header_address":4765748,"land_encounters":{"address":5609924,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493476},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":{"header_address":4765776,"land_encounters":{"address":5609980,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493512},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":{"header_address":4765804,"land_encounters":{"address":5610036,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493548},"MAP_CONTEST_HALL":{"header_address":4768464,"warp_table_address":4160749568},"MAP_CONTEST_HALL_BEAUTY":{"header_address":4768660,"warp_table_address":4160749568},"MAP_CONTEST_HALL_COOL":{"header_address":4768716,"warp_table_address":4160749568},"MAP_CONTEST_HALL_CUTE":{"header_address":4768772,"warp_table_address":4160749568},"MAP_CONTEST_HALL_SMART":{"header_address":4768744,"warp_table_address":4160749568},"MAP_CONTEST_HALL_TOUGH":{"header_address":4768688,"warp_table_address":4160749568},"MAP_DESERT_RUINS":{"header_address":4764824,"warp_table_address":5486828},"MAP_DESERT_UNDERPASS":{"header_address":4767400,"land_encounters":{"address":5613232,"slots":[132,370,132,371,132,370,371,132,370,132,371,132]},"warp_table_address":5500012},"MAP_DEWFORD_TOWN":{"fishing_encounters":{"address":5611588,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758300,"warp_table_address":5435180,"water_encounters":{"address":5611560,"slots":[72,309,309,310,310]}},"MAP_DEWFORD_TOWN_GYM":{"header_address":4759952,"warp_table_address":5460340},"MAP_DEWFORD_TOWN_HALL":{"header_address":4759980,"warp_table_address":5460640},"MAP_DEWFORD_TOWN_HOUSE1":{"header_address":4759868,"warp_table_address":5459856},"MAP_DEWFORD_TOWN_HOUSE2":{"header_address":4760008,"warp_table_address":5460748},"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":{"header_address":4759896,"warp_table_address":5459964},"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":{"header_address":4759924,"warp_table_address":5460104},"MAP_EVER_GRANDE_CITY":{"fishing_encounters":{"address":5611892,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4758216,"warp_table_address":5434048,"water_encounters":{"address":5611864,"slots":[72,309,309,310,310]}},"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":{"header_address":4764012,"warp_table_address":5483720},"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":{"header_address":4763984,"warp_table_address":5483612},"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":{"header_address":4763956,"warp_table_address":5483552},"MAP_EVER_GRANDE_CITY_HALL1":{"header_address":4764040,"warp_table_address":5483756},"MAP_EVER_GRANDE_CITY_HALL2":{"header_address":4764068,"warp_table_address":5483808},"MAP_EVER_GRANDE_CITY_HALL3":{"header_address":4764096,"warp_table_address":5483860},"MAP_EVER_GRANDE_CITY_HALL4":{"header_address":4764124,"warp_table_address":5483912},"MAP_EVER_GRANDE_CITY_HALL5":{"header_address":4764152,"warp_table_address":5483948},"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":{"header_address":4764208,"warp_table_address":5484180},"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":{"header_address":4763928,"warp_table_address":5483492},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":{"header_address":4764236,"warp_table_address":5484304},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":{"header_address":4764264,"warp_table_address":5484444},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":{"header_address":4764180,"warp_table_address":5484096},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":{"header_address":4764292,"warp_table_address":5484584},"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":{"header_address":4763900,"warp_table_address":5483432},"MAP_FALLARBOR_TOWN":{"header_address":4758356,"warp_table_address":5435792},"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760316,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760288,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760260,"warp_table_address":5462376},"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":{"header_address":4760400,"warp_table_address":5462888},"MAP_FALLARBOR_TOWN_MART":{"header_address":4760232,"warp_table_address":5462220},"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":{"header_address":4760428,"warp_table_address":5462948},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":{"header_address":4760344,"warp_table_address":5462656},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":{"header_address":4760372,"warp_table_address":5462796},"MAP_FARAWAY_ISLAND_ENTRANCE":{"header_address":4770956,"warp_table_address":5524672},"MAP_FARAWAY_ISLAND_INTERIOR":{"header_address":4770984,"warp_table_address":5524792},"MAP_FIERY_PATH":{"header_address":4765048,"land_encounters":{"address":5606456,"slots":[339,109,339,66,321,218,109,66,321,321,88,88]},"warp_table_address":5489344},"MAP_FORTREE_CITY":{"header_address":4758104,"warp_table_address":5431676},"MAP_FORTREE_CITY_DECORATION_SHOP":{"header_address":4762444,"warp_table_address":5473936},"MAP_FORTREE_CITY_GYM":{"header_address":4762220,"warp_table_address":5472984},"MAP_FORTREE_CITY_HOUSE1":{"header_address":4762192,"warp_table_address":5472756},"MAP_FORTREE_CITY_HOUSE2":{"header_address":4762332,"warp_table_address":5473504},"MAP_FORTREE_CITY_HOUSE3":{"header_address":4762360,"warp_table_address":5473588},"MAP_FORTREE_CITY_HOUSE4":{"header_address":4762388,"warp_table_address":5473696},"MAP_FORTREE_CITY_HOUSE5":{"header_address":4762416,"warp_table_address":5473804},"MAP_FORTREE_CITY_MART":{"header_address":4762304,"warp_table_address":5473420},"MAP_FORTREE_CITY_POKEMON_CENTER_1F":{"header_address":4762248,"warp_table_address":5473140},"MAP_FORTREE_CITY_POKEMON_CENTER_2F":{"header_address":4762276,"warp_table_address":5473280},"MAP_GRANITE_CAVE_1F":{"header_address":4764852,"land_encounters":{"address":5605988,"slots":[41,335,335,41,335,63,335,335,74,74,74,74]},"warp_table_address":5486956},"MAP_GRANITE_CAVE_B1F":{"header_address":4764880,"land_encounters":{"address":5606044,"slots":[41,382,382,382,41,63,335,335,322,322,322,322]},"warp_table_address":5487032},"MAP_GRANITE_CAVE_B2F":{"header_address":4764908,"land_encounters":{"address":5606372,"slots":[41,382,382,41,382,63,322,322,322,322,322,322]},"rock_smash_encounters":{"address":5606428,"slots":[74,320,74,74,74]},"warp_table_address":5487324},"MAP_GRANITE_CAVE_STEVENS_ROOM":{"header_address":4764936,"land_encounters":{"address":5608188,"slots":[41,335,335,41,335,63,335,335,382,382,382,382]},"warp_table_address":5487432},"MAP_INSIDE_OF_TRUCK":{"header_address":4768800,"warp_table_address":5510720},"MAP_ISLAND_CAVE":{"header_address":4766532,"warp_table_address":5497356},"MAP_JAGGED_PASS":{"header_address":4765020,"land_encounters":{"address":5606644,"slots":[339,339,66,339,351,66,351,66,339,351,339,351]},"warp_table_address":5488908},"MAP_LAVARIDGE_TOWN":{"header_address":4758328,"warp_table_address":5435516},"MAP_LAVARIDGE_TOWN_GYM_1F":{"header_address":4760064,"warp_table_address":5461036},"MAP_LAVARIDGE_TOWN_GYM_B1F":{"header_address":4760092,"warp_table_address":5461384},"MAP_LAVARIDGE_TOWN_HERB_SHOP":{"header_address":4760036,"warp_table_address":5460856},"MAP_LAVARIDGE_TOWN_HOUSE":{"header_address":4760120,"warp_table_address":5461668},"MAP_LAVARIDGE_TOWN_MART":{"header_address":4760148,"warp_table_address":5461776},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":{"header_address":4760176,"warp_table_address":5461908},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":{"header_address":4760204,"warp_table_address":5462056},"MAP_LILYCOVE_CITY":{"fishing_encounters":{"address":5611512,"slots":[129,72,129,72,313,313,313,120,313,313]},"header_address":4758132,"warp_table_address":5432368,"water_encounters":{"address":5611484,"slots":[72,309,309,310,310]}},"MAP_LILYCOVE_CITY_CONTEST_HALL":{"header_address":4762612,"warp_table_address":5476560},"MAP_LILYCOVE_CITY_CONTEST_LOBBY":{"header_address":4762584,"warp_table_address":5475596},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":{"header_address":4762472,"warp_table_address":5473996},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":{"header_address":4762500,"warp_table_address":5474224},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":{"header_address":4762920,"warp_table_address":5478044},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":{"header_address":4762948,"warp_table_address":5478228},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":{"header_address":4762976,"warp_table_address":5478392},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":{"header_address":4763004,"warp_table_address":5478556},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":{"header_address":4763032,"warp_table_address":5478768},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":{"header_address":4763088,"warp_table_address":5478984},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":{"header_address":4763060,"warp_table_address":5478908},"MAP_LILYCOVE_CITY_HARBOR":{"header_address":4762752,"warp_table_address":5477396},"MAP_LILYCOVE_CITY_HOUSE1":{"header_address":4762808,"warp_table_address":5477540},"MAP_LILYCOVE_CITY_HOUSE2":{"header_address":4762836,"warp_table_address":5477600},"MAP_LILYCOVE_CITY_HOUSE3":{"header_address":4762864,"warp_table_address":5477780},"MAP_LILYCOVE_CITY_HOUSE4":{"header_address":4762892,"warp_table_address":5477864},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":{"header_address":4762528,"warp_table_address":5474492},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":{"header_address":4762556,"warp_table_address":5474824},"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":{"header_address":4762780,"warp_table_address":5477456},"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":{"header_address":4762640,"warp_table_address":5476804},"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":{"header_address":4762668,"warp_table_address":5476944},"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":{"header_address":4762724,"warp_table_address":5477240},"MAP_LILYCOVE_CITY_UNUSED_MART":{"header_address":4762696,"warp_table_address":5476988},"MAP_LITTLEROOT_TOWN":{"header_address":4758244,"warp_table_address":5434528},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":{"header_address":4759588,"warp_table_address":5457588},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":{"header_address":4759616,"warp_table_address":5458080},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":{"header_address":4759644,"warp_table_address":5458324},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":{"header_address":4759672,"warp_table_address":5458816},"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":{"header_address":4759700,"warp_table_address":5459036},"MAP_MAGMA_HIDEOUT_1F":{"header_address":4767064,"land_encounters":{"address":5612560,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498844},"MAP_MAGMA_HIDEOUT_2F_1R":{"header_address":4767092,"land_encounters":{"address":5612616,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498992},"MAP_MAGMA_HIDEOUT_2F_2R":{"header_address":4767120,"land_encounters":{"address":5612672,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499180},"MAP_MAGMA_HIDEOUT_2F_3R":{"header_address":4767260,"land_encounters":{"address":5612952,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499696},"MAP_MAGMA_HIDEOUT_3F_1R":{"header_address":4767148,"land_encounters":{"address":5612728,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499288},"MAP_MAGMA_HIDEOUT_3F_2R":{"header_address":4767176,"land_encounters":{"address":5612784,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499380},"MAP_MAGMA_HIDEOUT_3F_3R":{"header_address":4767232,"land_encounters":{"address":5612896,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499660},"MAP_MAGMA_HIDEOUT_4F":{"header_address":4767204,"land_encounters":{"address":5612840,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499600},"MAP_MARINE_CAVE_END":{"header_address":4767540,"warp_table_address":5500288},"MAP_MARINE_CAVE_ENTRANCE":{"header_address":4767512,"warp_table_address":5500236},"MAP_MAUVILLE_CITY":{"header_address":4758048,"warp_table_address":5430380},"MAP_MAUVILLE_CITY_BIKE_SHOP":{"header_address":4761520,"warp_table_address":5469232},"MAP_MAUVILLE_CITY_GAME_CORNER":{"header_address":4761576,"warp_table_address":5469640},"MAP_MAUVILLE_CITY_GYM":{"header_address":4761492,"warp_table_address":5469060},"MAP_MAUVILLE_CITY_HOUSE1":{"header_address":4761548,"warp_table_address":5469316},"MAP_MAUVILLE_CITY_HOUSE2":{"header_address":4761604,"warp_table_address":5469988},"MAP_MAUVILLE_CITY_MART":{"header_address":4761688,"warp_table_address":5470424},"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":{"header_address":4761632,"warp_table_address":5470144},"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":{"header_address":4761660,"warp_table_address":5470308},"MAP_METEOR_FALLS_1F_1R":{"fishing_encounters":{"address":5610796,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4764656,"land_encounters":{"address":5610712,"slots":[41,41,41,41,41,349,349,349,41,41,41,41]},"warp_table_address":5486052,"water_encounters":{"address":5610768,"slots":[41,41,349,349,349]}},"MAP_METEOR_FALLS_1F_2R":{"fishing_encounters":{"address":5610928,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764684,"land_encounters":{"address":5610844,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486220,"water_encounters":{"address":5610900,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_1R":{"fishing_encounters":{"address":5611060,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764712,"land_encounters":{"address":5610976,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486284,"water_encounters":{"address":5611032,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_2R":{"fishing_encounters":{"address":5606596,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764740,"land_encounters":{"address":5606512,"slots":[42,42,395,349,395,349,395,349,42,42,42,42]},"warp_table_address":5486376,"water_encounters":{"address":5606568,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_STEVENS_CAVE":{"header_address":4767652,"land_encounters":{"address":5613904,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5500488},"MAP_MIRAGE_TOWER_1F":{"header_address":4767288,"land_encounters":{"address":5613008,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499732},"MAP_MIRAGE_TOWER_2F":{"header_address":4767316,"land_encounters":{"address":5613064,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499768},"MAP_MIRAGE_TOWER_3F":{"header_address":4767344,"land_encounters":{"address":5613120,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499852},"MAP_MIRAGE_TOWER_4F":{"header_address":4767372,"land_encounters":{"address":5613176,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499960},"MAP_MOSSDEEP_CITY":{"fishing_encounters":{"address":5611740,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758160,"warp_table_address":5433064,"water_encounters":{"address":5611712,"slots":[72,309,309,310,310]}},"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":{"header_address":4763424,"warp_table_address":5481712},"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":{"header_address":4763452,"warp_table_address":5481816},"MAP_MOSSDEEP_CITY_GYM":{"header_address":4763116,"warp_table_address":5479884},"MAP_MOSSDEEP_CITY_HOUSE1":{"header_address":4763144,"warp_table_address":5480232},"MAP_MOSSDEEP_CITY_HOUSE2":{"header_address":4763172,"warp_table_address":5480340},"MAP_MOSSDEEP_CITY_HOUSE3":{"header_address":4763284,"warp_table_address":5480812},"MAP_MOSSDEEP_CITY_HOUSE4":{"header_address":4763340,"warp_table_address":5481076},"MAP_MOSSDEEP_CITY_MART":{"header_address":4763256,"warp_table_address":5480752},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":{"header_address":4763200,"warp_table_address":5480448},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":{"header_address":4763228,"warp_table_address":5480612},"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":{"header_address":4763368,"warp_table_address":5481376},"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":{"header_address":4763396,"warp_table_address":5481636},"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":{"header_address":4763312,"warp_table_address":5480920},"MAP_MT_CHIMNEY":{"header_address":4764992,"warp_table_address":5488664},"MAP_MT_CHIMNEY_CABLE_CAR_STATION":{"header_address":4764460,"warp_table_address":5485144},"MAP_MT_PYRE_1F":{"header_address":4765076,"land_encounters":{"address":5606100,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489452},"MAP_MT_PYRE_2F":{"header_address":4765104,"land_encounters":{"address":5607796,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489712},"MAP_MT_PYRE_3F":{"header_address":4765132,"land_encounters":{"address":5607852,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489868},"MAP_MT_PYRE_4F":{"header_address":4765160,"land_encounters":{"address":5607908,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5489984},"MAP_MT_PYRE_5F":{"header_address":4765188,"land_encounters":{"address":5607964,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490100},"MAP_MT_PYRE_6F":{"header_address":4765216,"land_encounters":{"address":5608020,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490232},"MAP_MT_PYRE_EXTERIOR":{"header_address":4765244,"land_encounters":{"address":5608076,"slots":[377,377,377,377,37,37,37,37,309,309,309,309]},"warp_table_address":5490316},"MAP_MT_PYRE_SUMMIT":{"header_address":4765272,"land_encounters":{"address":5608132,"slots":[377,377,377,377,377,377,377,361,361,361,411,411]},"warp_table_address":5490656},"MAP_NAVEL_ROCK_B1F":{"header_address":4771320,"warp_table_address":5525524},"MAP_NAVEL_ROCK_BOTTOM":{"header_address":4771824,"warp_table_address":5526248},"MAP_NAVEL_ROCK_DOWN01":{"header_address":4771516,"warp_table_address":5525828},"MAP_NAVEL_ROCK_DOWN02":{"header_address":4771544,"warp_table_address":5525864},"MAP_NAVEL_ROCK_DOWN03":{"header_address":4771572,"warp_table_address":5525900},"MAP_NAVEL_ROCK_DOWN04":{"header_address":4771600,"warp_table_address":5525936},"MAP_NAVEL_ROCK_DOWN05":{"header_address":4771628,"warp_table_address":5525972},"MAP_NAVEL_ROCK_DOWN06":{"header_address":4771656,"warp_table_address":5526008},"MAP_NAVEL_ROCK_DOWN07":{"header_address":4771684,"warp_table_address":5526044},"MAP_NAVEL_ROCK_DOWN08":{"header_address":4771712,"warp_table_address":5526080},"MAP_NAVEL_ROCK_DOWN09":{"header_address":4771740,"warp_table_address":5526116},"MAP_NAVEL_ROCK_DOWN10":{"header_address":4771768,"warp_table_address":5526152},"MAP_NAVEL_ROCK_DOWN11":{"header_address":4771796,"warp_table_address":5526188},"MAP_NAVEL_ROCK_ENTRANCE":{"header_address":4771292,"warp_table_address":5525488},"MAP_NAVEL_ROCK_EXTERIOR":{"header_address":4771236,"warp_table_address":5525376},"MAP_NAVEL_ROCK_FORK":{"header_address":4771348,"warp_table_address":5525560},"MAP_NAVEL_ROCK_HARBOR":{"header_address":4771264,"warp_table_address":5525460},"MAP_NAVEL_ROCK_TOP":{"header_address":4771488,"warp_table_address":5525772},"MAP_NAVEL_ROCK_UP1":{"header_address":4771376,"warp_table_address":5525604},"MAP_NAVEL_ROCK_UP2":{"header_address":4771404,"warp_table_address":5525640},"MAP_NAVEL_ROCK_UP3":{"header_address":4771432,"warp_table_address":5525676},"MAP_NAVEL_ROCK_UP4":{"header_address":4771460,"warp_table_address":5525712},"MAP_NEW_MAUVILLE_ENTRANCE":{"header_address":4766112,"land_encounters":{"address":5610092,"slots":[100,81,100,81,100,81,100,81,100,81,100,81]},"warp_table_address":5495284},"MAP_NEW_MAUVILLE_INSIDE":{"header_address":4766140,"land_encounters":{"address":5607136,"slots":[100,81,100,81,100,81,100,81,100,81,101,82]},"warp_table_address":5495528},"MAP_OLDALE_TOWN":{"header_address":4758272,"warp_table_address":5434860},"MAP_OLDALE_TOWN_HOUSE1":{"header_address":4759728,"warp_table_address":5459276},"MAP_OLDALE_TOWN_HOUSE2":{"header_address":4759756,"warp_table_address":5459360},"MAP_OLDALE_TOWN_MART":{"header_address":4759840,"warp_table_address":5459748},"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":{"header_address":4759784,"warp_table_address":5459492},"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":{"header_address":4759812,"warp_table_address":5459632},"MAP_PACIFIDLOG_TOWN":{"fishing_encounters":{"address":5611816,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758412,"warp_table_address":5436288,"water_encounters":{"address":5611788,"slots":[72,309,309,310,310]}},"MAP_PACIFIDLOG_TOWN_HOUSE1":{"header_address":4760764,"warp_table_address":5464400},"MAP_PACIFIDLOG_TOWN_HOUSE2":{"header_address":4760792,"warp_table_address":5464508},"MAP_PACIFIDLOG_TOWN_HOUSE3":{"header_address":4760820,"warp_table_address":5464592},"MAP_PACIFIDLOG_TOWN_HOUSE4":{"header_address":4760848,"warp_table_address":5464700},"MAP_PACIFIDLOG_TOWN_HOUSE5":{"header_address":4760876,"warp_table_address":5464784},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":{"header_address":4760708,"warp_table_address":5464168},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":{"header_address":4760736,"warp_table_address":5464308},"MAP_PETALBURG_CITY":{"fishing_encounters":{"address":5611968,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4757992,"warp_table_address":5428704,"water_encounters":{"address":5611940,"slots":[183,183,183,183,183]}},"MAP_PETALBURG_CITY_GYM":{"header_address":4760932,"warp_table_address":5465168},"MAP_PETALBURG_CITY_HOUSE1":{"header_address":4760960,"warp_table_address":5465708},"MAP_PETALBURG_CITY_HOUSE2":{"header_address":4760988,"warp_table_address":5465792},"MAP_PETALBURG_CITY_MART":{"header_address":4761072,"warp_table_address":5466228},"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":{"header_address":4761016,"warp_table_address":5465948},"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":{"header_address":4761044,"warp_table_address":5466088},"MAP_PETALBURG_CITY_WALLYS_HOUSE":{"header_address":4760904,"warp_table_address":5464868},"MAP_PETALBURG_WOODS":{"header_address":4764964,"land_encounters":{"address":5605876,"slots":[286,290,306,286,291,293,290,306,304,364,304,364]},"warp_table_address":5487772},"MAP_RECORD_CORNER":{"header_address":4768408,"warp_table_address":5510036},"MAP_ROUTE101":{"header_address":4758440,"land_encounters":{"address":5604388,"slots":[290,286,290,290,286,286,290,286,288,288,288,288]},"warp_table_address":4160749568},"MAP_ROUTE102":{"fishing_encounters":{"address":5604528,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758468,"land_encounters":{"address":5604444,"slots":[286,290,286,290,295,295,288,288,288,392,288,298]},"warp_table_address":4160749568,"water_encounters":{"address":5604500,"slots":[183,183,183,183,118]}},"MAP_ROUTE103":{"fishing_encounters":{"address":5604660,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758496,"land_encounters":{"address":5604576,"slots":[286,286,286,286,309,288,288,288,309,309,309,309]},"warp_table_address":5437452,"water_encounters":{"address":5604632,"slots":[72,309,309,310,310]}},"MAP_ROUTE104":{"fishing_encounters":{"address":5604792,"slots":[129,129,129,129,129,129,129,129,129,129]},"header_address":4758524,"land_encounters":{"address":5604708,"slots":[286,290,286,183,183,286,304,304,309,309,309,309]},"warp_table_address":5438308,"water_encounters":{"address":5604764,"slots":[309,309,309,310,310]}},"MAP_ROUTE104_MR_BRINEYS_HOUSE":{"header_address":4764320,"warp_table_address":5484676},"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4764348,"warp_table_address":5484784},"MAP_ROUTE104_PROTOTYPE":{"header_address":4771880,"warp_table_address":4160749568},"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4771908,"warp_table_address":4160749568},"MAP_ROUTE105":{"fishing_encounters":{"address":5604868,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758552,"warp_table_address":5438720,"water_encounters":{"address":5604840,"slots":[72,309,309,310,310]}},"MAP_ROUTE106":{"fishing_encounters":{"address":5606728,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758580,"warp_table_address":5438892,"water_encounters":{"address":5606700,"slots":[72,309,309,310,310]}},"MAP_ROUTE107":{"fishing_encounters":{"address":5606804,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758608,"warp_table_address":4160749568,"water_encounters":{"address":5606776,"slots":[72,309,309,310,310]}},"MAP_ROUTE108":{"fishing_encounters":{"address":5606880,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758636,"warp_table_address":5439324,"water_encounters":{"address":5606852,"slots":[72,309,309,310,310]}},"MAP_ROUTE109":{"fishing_encounters":{"address":5606956,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758664,"warp_table_address":5439940,"water_encounters":{"address":5606928,"slots":[72,309,309,310,310]}},"MAP_ROUTE109_SEASHORE_HOUSE":{"header_address":4771936,"warp_table_address":5526472},"MAP_ROUTE110":{"fishing_encounters":{"address":5605000,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758692,"land_encounters":{"address":5604916,"slots":[286,337,367,337,354,43,354,367,309,309,353,353]},"warp_table_address":5440928,"water_encounters":{"address":5604972,"slots":[72,309,309,310,310]}},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":{"header_address":4772272,"warp_table_address":5529400},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":{"header_address":4772300,"warp_table_address":5529508},"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":{"header_address":4772020,"warp_table_address":5526740},"MAP_ROUTE110_TRICK_HOUSE_END":{"header_address":4771992,"warp_table_address":5526676},"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":{"header_address":4771964,"warp_table_address":5526532},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":{"header_address":4772048,"warp_table_address":5527152},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":{"header_address":4772076,"warp_table_address":5527328},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":{"header_address":4772104,"warp_table_address":5527616},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":{"header_address":4772132,"warp_table_address":5528072},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":{"header_address":4772160,"warp_table_address":5528248},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":{"header_address":4772188,"warp_table_address":5528752},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":{"header_address":4772216,"warp_table_address":5529024},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":{"header_address":4772244,"warp_table_address":5529320},"MAP_ROUTE111":{"fishing_encounters":{"address":5605160,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758720,"land_encounters":{"address":5605048,"slots":[27,332,27,332,318,318,27,332,318,344,344,344]},"rock_smash_encounters":{"address":5605132,"slots":[74,74,74,74,74]},"warp_table_address":5442448,"water_encounters":{"address":5605104,"slots":[183,183,183,183,118]}},"MAP_ROUTE111_OLD_LADYS_REST_STOP":{"header_address":4764404,"warp_table_address":5484976},"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":{"header_address":4764376,"warp_table_address":5484916},"MAP_ROUTE112":{"header_address":4758748,"land_encounters":{"address":5605208,"slots":[339,339,183,339,339,183,339,183,339,339,339,339]},"warp_table_address":5443604},"MAP_ROUTE112_CABLE_CAR_STATION":{"header_address":4764432,"warp_table_address":5485060},"MAP_ROUTE113":{"header_address":4758776,"land_encounters":{"address":5605264,"slots":[308,308,218,308,308,218,308,218,308,227,308,227]},"warp_table_address":5444092},"MAP_ROUTE113_GLASS_WORKSHOP":{"header_address":4772328,"warp_table_address":5529640},"MAP_ROUTE114":{"fishing_encounters":{"address":5605432,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758804,"land_encounters":{"address":5605320,"slots":[358,295,358,358,295,296,296,296,379,379,379,299]},"rock_smash_encounters":{"address":5605404,"slots":[74,74,74,74,74]},"warp_table_address":5445184,"water_encounters":{"address":5605376,"slots":[183,183,183,183,118]}},"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":{"header_address":4764488,"warp_table_address":5485204},"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":{"header_address":4764516,"warp_table_address":5485320},"MAP_ROUTE114_LANETTES_HOUSE":{"header_address":4764544,"warp_table_address":5485420},"MAP_ROUTE115":{"fishing_encounters":{"address":5607088,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758832,"land_encounters":{"address":5607004,"slots":[358,304,358,304,304,305,39,39,309,309,309,309]},"warp_table_address":5445988,"water_encounters":{"address":5607060,"slots":[72,309,309,310,310]}},"MAP_ROUTE116":{"header_address":4758860,"land_encounters":{"address":5605480,"slots":[286,370,301,63,301,304,304,304,286,286,315,315]},"warp_table_address":5446872},"MAP_ROUTE116_TUNNELERS_REST_HOUSE":{"header_address":4764572,"warp_table_address":5485564},"MAP_ROUTE117":{"fishing_encounters":{"address":5605620,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758888,"land_encounters":{"address":5605536,"slots":[286,43,286,43,183,43,387,387,387,387,386,298]},"warp_table_address":5447656,"water_encounters":{"address":5605592,"slots":[183,183,183,183,118]}},"MAP_ROUTE117_POKEMON_DAY_CARE":{"header_address":4764600,"warp_table_address":5485624},"MAP_ROUTE118":{"fishing_encounters":{"address":5605752,"slots":[129,72,129,72,330,331,330,330,330,330]},"header_address":4758916,"land_encounters":{"address":5605668,"slots":[288,337,288,337,289,338,309,309,309,309,309,317]},"warp_table_address":5448236,"water_encounters":{"address":5605724,"slots":[72,309,309,310,310]}},"MAP_ROUTE119":{"fishing_encounters":{"address":5607276,"slots":[129,72,129,72,330,330,330,330,330,330]},"header_address":4758944,"land_encounters":{"address":5607192,"slots":[288,289,288,43,289,43,43,43,369,369,369,317]},"warp_table_address":5449460,"water_encounters":{"address":5607248,"slots":[72,309,309,310,310]}},"MAP_ROUTE119_HOUSE":{"header_address":4772440,"warp_table_address":5530360},"MAP_ROUTE119_WEATHER_INSTITUTE_1F":{"header_address":4772384,"warp_table_address":5529880},"MAP_ROUTE119_WEATHER_INSTITUTE_2F":{"header_address":4772412,"warp_table_address":5530164},"MAP_ROUTE120":{"fishing_encounters":{"address":5607408,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758972,"land_encounters":{"address":5607324,"slots":[286,287,287,43,183,43,43,183,376,376,317,298]},"warp_table_address":5451160,"water_encounters":{"address":5607380,"slots":[183,183,183,183,118]}},"MAP_ROUTE121":{"fishing_encounters":{"address":5607540,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759000,"land_encounters":{"address":5607456,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5452364,"water_encounters":{"address":5607512,"slots":[72,309,309,310,310]}},"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":{"header_address":4764628,"warp_table_address":5485732},"MAP_ROUTE122":{"fishing_encounters":{"address":5607616,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759028,"warp_table_address":5452576,"water_encounters":{"address":5607588,"slots":[72,309,309,310,310]}},"MAP_ROUTE123":{"fishing_encounters":{"address":5607748,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759056,"land_encounters":{"address":5607664,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5453636,"water_encounters":{"address":5607720,"slots":[72,309,309,310,310]}},"MAP_ROUTE123_BERRY_MASTERS_HOUSE":{"header_address":4772356,"warp_table_address":5529724},"MAP_ROUTE124":{"fishing_encounters":{"address":5605828,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759084,"warp_table_address":5454436,"water_encounters":{"address":5605800,"slots":[72,309,309,310,310]}},"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":{"header_address":4772468,"warp_table_address":5530420},"MAP_ROUTE125":{"fishing_encounters":{"address":5608272,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759112,"warp_table_address":5454716,"water_encounters":{"address":5608244,"slots":[72,309,309,310,310]}},"MAP_ROUTE126":{"fishing_encounters":{"address":5608348,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759140,"warp_table_address":4160749568,"water_encounters":{"address":5608320,"slots":[72,309,309,310,310]}},"MAP_ROUTE127":{"fishing_encounters":{"address":5608424,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759168,"warp_table_address":4160749568,"water_encounters":{"address":5608396,"slots":[72,309,309,310,310]}},"MAP_ROUTE128":{"fishing_encounters":{"address":5608500,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4759196,"warp_table_address":4160749568,"water_encounters":{"address":5608472,"slots":[72,309,309,310,310]}},"MAP_ROUTE129":{"fishing_encounters":{"address":5608576,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759224,"warp_table_address":4160749568,"water_encounters":{"address":5608548,"slots":[72,309,309,310,314]}},"MAP_ROUTE130":{"fishing_encounters":{"address":5608708,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759252,"land_encounters":{"address":5608624,"slots":[360,360,360,360,360,360,360,360,360,360,360,360]},"warp_table_address":4160749568,"water_encounters":{"address":5608680,"slots":[72,309,309,310,310]}},"MAP_ROUTE131":{"fishing_encounters":{"address":5608784,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759280,"warp_table_address":5456116,"water_encounters":{"address":5608756,"slots":[72,309,309,310,310]}},"MAP_ROUTE132":{"fishing_encounters":{"address":5608860,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759308,"warp_table_address":4160749568,"water_encounters":{"address":5608832,"slots":[72,309,309,310,310]}},"MAP_ROUTE133":{"fishing_encounters":{"address":5608936,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759336,"warp_table_address":4160749568,"water_encounters":{"address":5608908,"slots":[72,309,309,310,310]}},"MAP_ROUTE134":{"fishing_encounters":{"address":5609012,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759364,"warp_table_address":4160749568,"water_encounters":{"address":5608984,"slots":[72,309,309,310,310]}},"MAP_RUSTBORO_CITY":{"header_address":4758076,"warp_table_address":5430936},"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":{"header_address":4762024,"warp_table_address":5472204},"MAP_RUSTBORO_CITY_DEVON_CORP_1F":{"header_address":4761716,"warp_table_address":5470532},"MAP_RUSTBORO_CITY_DEVON_CORP_2F":{"header_address":4761744,"warp_table_address":5470744},"MAP_RUSTBORO_CITY_DEVON_CORP_3F":{"header_address":4761772,"warp_table_address":5470852},"MAP_RUSTBORO_CITY_FLAT1_1F":{"header_address":4761940,"warp_table_address":5471808},"MAP_RUSTBORO_CITY_FLAT1_2F":{"header_address":4761968,"warp_table_address":5472044},"MAP_RUSTBORO_CITY_FLAT2_1F":{"header_address":4762080,"warp_table_address":5472372},"MAP_RUSTBORO_CITY_FLAT2_2F":{"header_address":4762108,"warp_table_address":5472464},"MAP_RUSTBORO_CITY_FLAT2_3F":{"header_address":4762136,"warp_table_address":5472548},"MAP_RUSTBORO_CITY_GYM":{"header_address":4761800,"warp_table_address":5471024},"MAP_RUSTBORO_CITY_HOUSE1":{"header_address":4761996,"warp_table_address":5472120},"MAP_RUSTBORO_CITY_HOUSE2":{"header_address":4762052,"warp_table_address":5472288},"MAP_RUSTBORO_CITY_HOUSE3":{"header_address":4762164,"warp_table_address":5472648},"MAP_RUSTBORO_CITY_MART":{"header_address":4761912,"warp_table_address":5471724},"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":{"header_address":4761856,"warp_table_address":5471444},"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":{"header_address":4761884,"warp_table_address":5471584},"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":{"header_address":4761828,"warp_table_address":5471252},"MAP_RUSTURF_TUNNEL":{"header_address":4764768,"land_encounters":{"address":5605932,"slots":[370,370,370,370,370,370,370,370,370,370,370,370]},"warp_table_address":5486644},"MAP_SAFARI_ZONE_NORTH":{"header_address":4769416,"land_encounters":{"address":5610280,"slots":[231,43,231,43,177,44,44,177,178,214,178,214]},"rock_smash_encounters":{"address":5610336,"slots":[74,74,74,74,74]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHEAST":{"header_address":4769724,"land_encounters":{"address":5612476,"slots":[190,216,190,216,191,165,163,204,228,241,228,241]},"rock_smash_encounters":{"address":5612532,"slots":[213,213,213,213,213]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHWEST":{"fishing_encounters":{"address":5610448,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769388,"land_encounters":{"address":5610364,"slots":[111,43,111,43,84,44,44,84,85,127,85,127]},"warp_table_address":4160749568,"water_encounters":{"address":5610420,"slots":[54,54,54,55,55]}},"MAP_SAFARI_ZONE_REST_HOUSE":{"header_address":4769696,"warp_table_address":5516996},"MAP_SAFARI_ZONE_SOUTH":{"header_address":4769472,"land_encounters":{"address":5606212,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515444},"MAP_SAFARI_ZONE_SOUTHEAST":{"fishing_encounters":{"address":5612428,"slots":[129,118,129,118,223,118,223,223,223,224]},"header_address":4769752,"land_encounters":{"address":5612344,"slots":[191,179,191,179,190,167,163,209,234,207,234,207]},"warp_table_address":4160749568,"water_encounters":{"address":5612400,"slots":[194,183,183,183,195]}},"MAP_SAFARI_ZONE_SOUTHWEST":{"fishing_encounters":{"address":5610232,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769444,"land_encounters":{"address":5610148,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515260,"water_encounters":{"address":5610204,"slots":[54,54,54,54,54]}},"MAP_SCORCHED_SLAB":{"header_address":4766700,"warp_table_address":5498144},"MAP_SEAFLOOR_CAVERN_ENTRANCE":{"fishing_encounters":{"address":5609764,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765412,"warp_table_address":5491796,"water_encounters":{"address":5609736,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM1":{"header_address":4765440,"land_encounters":{"address":5609136,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5491952},"MAP_SEAFLOOR_CAVERN_ROOM2":{"header_address":4765468,"land_encounters":{"address":5609192,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492188},"MAP_SEAFLOOR_CAVERN_ROOM3":{"header_address":4765496,"land_encounters":{"address":5609248,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492456},"MAP_SEAFLOOR_CAVERN_ROOM4":{"header_address":4765524,"land_encounters":{"address":5609304,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492548},"MAP_SEAFLOOR_CAVERN_ROOM5":{"header_address":4765552,"land_encounters":{"address":5609360,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492744},"MAP_SEAFLOOR_CAVERN_ROOM6":{"fishing_encounters":{"address":5609500,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765580,"land_encounters":{"address":5609416,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492788,"water_encounters":{"address":5609472,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM7":{"fishing_encounters":{"address":5609632,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765608,"land_encounters":{"address":5609548,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492832,"water_encounters":{"address":5609604,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM8":{"header_address":4765636,"land_encounters":{"address":5609680,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493156},"MAP_SEAFLOOR_CAVERN_ROOM9":{"header_address":4765664,"warp_table_address":5493360},"MAP_SEALED_CHAMBER_INNER_ROOM":{"header_address":4766672,"warp_table_address":5497984},"MAP_SEALED_CHAMBER_OUTER_ROOM":{"header_address":4766644,"warp_table_address":5497608},"MAP_SECRET_BASE_BLUE_CAVE1":{"header_address":4767736,"warp_table_address":5501652},"MAP_SECRET_BASE_BLUE_CAVE2":{"header_address":4767904,"warp_table_address":5503980},"MAP_SECRET_BASE_BLUE_CAVE3":{"header_address":4768072,"warp_table_address":5506308},"MAP_SECRET_BASE_BLUE_CAVE4":{"header_address":4768240,"warp_table_address":5508636},"MAP_SECRET_BASE_BROWN_CAVE1":{"header_address":4767708,"warp_table_address":5501264},"MAP_SECRET_BASE_BROWN_CAVE2":{"header_address":4767876,"warp_table_address":5503592},"MAP_SECRET_BASE_BROWN_CAVE3":{"header_address":4768044,"warp_table_address":5505920},"MAP_SECRET_BASE_BROWN_CAVE4":{"header_address":4768212,"warp_table_address":5508248},"MAP_SECRET_BASE_RED_CAVE1":{"header_address":4767680,"warp_table_address":5500876},"MAP_SECRET_BASE_RED_CAVE2":{"header_address":4767848,"warp_table_address":5503204},"MAP_SECRET_BASE_RED_CAVE3":{"header_address":4768016,"warp_table_address":5505532},"MAP_SECRET_BASE_RED_CAVE4":{"header_address":4768184,"warp_table_address":5507860},"MAP_SECRET_BASE_SHRUB1":{"header_address":4767820,"warp_table_address":5502816},"MAP_SECRET_BASE_SHRUB2":{"header_address":4767988,"warp_table_address":5505144},"MAP_SECRET_BASE_SHRUB3":{"header_address":4768156,"warp_table_address":5507472},"MAP_SECRET_BASE_SHRUB4":{"header_address":4768324,"warp_table_address":5509800},"MAP_SECRET_BASE_TREE1":{"header_address":4767792,"warp_table_address":5502428},"MAP_SECRET_BASE_TREE2":{"header_address":4767960,"warp_table_address":5504756},"MAP_SECRET_BASE_TREE3":{"header_address":4768128,"warp_table_address":5507084},"MAP_SECRET_BASE_TREE4":{"header_address":4768296,"warp_table_address":5509412},"MAP_SECRET_BASE_YELLOW_CAVE1":{"header_address":4767764,"warp_table_address":5502040},"MAP_SECRET_BASE_YELLOW_CAVE2":{"header_address":4767932,"warp_table_address":5504368},"MAP_SECRET_BASE_YELLOW_CAVE3":{"header_address":4768100,"warp_table_address":5506696},"MAP_SECRET_BASE_YELLOW_CAVE4":{"header_address":4768268,"warp_table_address":5509024},"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":{"header_address":4766056,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":{"header_address":4766084,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":{"fishing_encounters":{"address":5611436,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765944,"land_encounters":{"address":5611352,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494828,"water_encounters":{"address":5611408,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":{"header_address":4766980,"land_encounters":{"address":5612044,"slots":[41,341,41,341,41,341,346,341,42,346,42,346]},"warp_table_address":5498544},"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":{"fishing_encounters":{"address":5611304,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765972,"land_encounters":{"address":5611220,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494904,"water_encounters":{"address":5611276,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":{"header_address":4766028,"land_encounters":{"address":5611164,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495180},"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":{"header_address":4766000,"land_encounters":{"address":5611108,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495084},"MAP_SKY_PILLAR_1F":{"header_address":4766868,"land_encounters":{"address":5612100,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498328},"MAP_SKY_PILLAR_2F":{"header_address":4766896,"warp_table_address":5498372},"MAP_SKY_PILLAR_3F":{"header_address":4766924,"land_encounters":{"address":5612232,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498408},"MAP_SKY_PILLAR_4F":{"header_address":4766952,"warp_table_address":5498452},"MAP_SKY_PILLAR_5F":{"header_address":4767008,"land_encounters":{"address":5612288,"slots":[322,42,42,322,319,378,378,319,319,359,359,359]},"warp_table_address":5498572},"MAP_SKY_PILLAR_ENTRANCE":{"header_address":4766812,"warp_table_address":5498232},"MAP_SKY_PILLAR_OUTSIDE":{"header_address":4766840,"warp_table_address":5498292},"MAP_SKY_PILLAR_TOP":{"header_address":4767036,"warp_table_address":5498656},"MAP_SLATEPORT_CITY":{"fishing_encounters":{"address":5611664,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758020,"warp_table_address":5429836,"water_encounters":{"address":5611636,"slots":[72,309,309,310,310]}},"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":{"header_address":4761212,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":{"header_address":4761184,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":{"header_address":4761156,"warp_table_address":5466624},"MAP_SLATEPORT_CITY_HARBOR":{"header_address":4761352,"warp_table_address":5468328},"MAP_SLATEPORT_CITY_HOUSE":{"header_address":4761380,"warp_table_address":5468492},"MAP_SLATEPORT_CITY_MART":{"header_address":4761464,"warp_table_address":5468856},"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":{"header_address":4761240,"warp_table_address":5466832},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":{"header_address":4761296,"warp_table_address":5467456},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":{"header_address":4761324,"warp_table_address":5467856},"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":{"header_address":4761408,"warp_table_address":5468600},"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":{"header_address":4761436,"warp_table_address":5468740},"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":{"header_address":4761268,"warp_table_address":5467084},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":{"header_address":4761100,"warp_table_address":5466360},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":{"header_address":4761128,"warp_table_address":5466476},"MAP_SOOTOPOLIS_CITY":{"fishing_encounters":{"address":5612184,"slots":[129,72,129,129,129,129,129,130,130,130]},"header_address":4758188,"warp_table_address":5433852,"water_encounters":{"address":5612156,"slots":[129,129,129,129,129]}},"MAP_SOOTOPOLIS_CITY_GYM_1F":{"header_address":4763480,"warp_table_address":5481892},"MAP_SOOTOPOLIS_CITY_GYM_B1F":{"header_address":4763508,"warp_table_address":5482200},"MAP_SOOTOPOLIS_CITY_HOUSE1":{"header_address":4763620,"warp_table_address":5482664},"MAP_SOOTOPOLIS_CITY_HOUSE2":{"header_address":4763648,"warp_table_address":5482724},"MAP_SOOTOPOLIS_CITY_HOUSE3":{"header_address":4763676,"warp_table_address":5482808},"MAP_SOOTOPOLIS_CITY_HOUSE4":{"header_address":4763704,"warp_table_address":5482916},"MAP_SOOTOPOLIS_CITY_HOUSE5":{"header_address":4763732,"warp_table_address":5483000},"MAP_SOOTOPOLIS_CITY_HOUSE6":{"header_address":4763760,"warp_table_address":5483060},"MAP_SOOTOPOLIS_CITY_HOUSE7":{"header_address":4763788,"warp_table_address":5483144},"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":{"header_address":4763816,"warp_table_address":5483228},"MAP_SOOTOPOLIS_CITY_MART":{"header_address":4763592,"warp_table_address":5482580},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":{"header_address":4763844,"warp_table_address":5483312},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":{"header_address":4763872,"warp_table_address":5483380},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":{"header_address":4763536,"warp_table_address":5482324},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":{"header_address":4763564,"warp_table_address":5482464},"MAP_SOUTHERN_ISLAND_EXTERIOR":{"header_address":4769640,"warp_table_address":5516780},"MAP_SOUTHERN_ISLAND_INTERIOR":{"header_address":4769668,"warp_table_address":5516876},"MAP_SS_TIDAL_CORRIDOR":{"header_address":4768828,"warp_table_address":5510992},"MAP_SS_TIDAL_LOWER_DECK":{"header_address":4768856,"warp_table_address":5511276},"MAP_SS_TIDAL_ROOMS":{"header_address":4768884,"warp_table_address":5511508},"MAP_TERRA_CAVE_END":{"header_address":4767596,"warp_table_address":5500392},"MAP_TERRA_CAVE_ENTRANCE":{"header_address":4767568,"warp_table_address":5500332},"MAP_TRADE_CENTER":{"header_address":4768380,"warp_table_address":5509944},"MAP_TRAINER_HILL_1F":{"header_address":4771096,"warp_table_address":5525172},"MAP_TRAINER_HILL_2F":{"header_address":4771124,"warp_table_address":5525208},"MAP_TRAINER_HILL_3F":{"header_address":4771152,"warp_table_address":5525244},"MAP_TRAINER_HILL_4F":{"header_address":4771180,"warp_table_address":5525280},"MAP_TRAINER_HILL_ELEVATOR":{"header_address":4771852,"warp_table_address":5526300},"MAP_TRAINER_HILL_ENTRANCE":{"header_address":4771068,"warp_table_address":5525100},"MAP_TRAINER_HILL_ROOF":{"header_address":4771208,"warp_table_address":5525340},"MAP_UNDERWATER_MARINE_CAVE":{"header_address":4767484,"warp_table_address":5500208},"MAP_UNDERWATER_ROUTE105":{"header_address":4759532,"warp_table_address":5457348},"MAP_UNDERWATER_ROUTE124":{"header_address":4759392,"warp_table_address":4160749568,"water_encounters":{"address":5612016,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE125":{"header_address":4759560,"warp_table_address":5457384},"MAP_UNDERWATER_ROUTE126":{"header_address":4759420,"warp_table_address":5457052,"water_encounters":{"address":5606268,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE127":{"header_address":4759448,"warp_table_address":5457176},"MAP_UNDERWATER_ROUTE128":{"header_address":4759476,"warp_table_address":5457260},"MAP_UNDERWATER_ROUTE129":{"header_address":4759504,"warp_table_address":5457312},"MAP_UNDERWATER_ROUTE134":{"header_address":4766588,"warp_table_address":5497540},"MAP_UNDERWATER_SEAFLOOR_CAVERN":{"header_address":4765384,"warp_table_address":5491744},"MAP_UNDERWATER_SEALED_CHAMBER":{"header_address":4766616,"warp_table_address":5497568},"MAP_UNDERWATER_SOOTOPOLIS_CITY":{"header_address":4764796,"warp_table_address":5486768},"MAP_UNION_ROOM":{"header_address":4769360,"warp_table_address":5514872},"MAP_UNUSED_CONTEST_HALL1":{"header_address":4768492,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL2":{"header_address":4768520,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL3":{"header_address":4768548,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL4":{"header_address":4768576,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL5":{"header_address":4768604,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL6":{"header_address":4768632,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN":{"header_address":4758384,"warp_table_address":5436044},"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760512,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760484,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760456,"warp_table_address":5463128},"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":{"header_address":4760652,"warp_table_address":5463928},"MAP_VERDANTURF_TOWN_HOUSE":{"header_address":4760680,"warp_table_address":5464012},"MAP_VERDANTURF_TOWN_MART":{"header_address":4760540,"warp_table_address":5463408},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":{"header_address":4760568,"warp_table_address":5463540},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":{"header_address":4760596,"warp_table_address":5463680},"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":{"header_address":4760624,"warp_table_address":5463844},"MAP_VICTORY_ROAD_1F":{"header_address":4765860,"land_encounters":{"address":5606156,"slots":[42,336,383,371,41,335,42,336,382,370,382,370]},"warp_table_address":5493852},"MAP_VICTORY_ROAD_B1F":{"header_address":4765888,"land_encounters":{"address":5610496,"slots":[42,336,383,383,42,336,42,336,383,355,383,355]},"rock_smash_encounters":{"address":5610552,"slots":[75,74,75,75,75]},"warp_table_address":5494460},"MAP_VICTORY_ROAD_B2F":{"fishing_encounters":{"address":5610664,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4765916,"land_encounters":{"address":5610580,"slots":[42,322,383,383,42,322,42,322,383,355,383,355]},"warp_table_address":5494704,"water_encounters":{"address":5610636,"slots":[42,42,42,42,42]}}},"misc_pokemon":[{"address":2572358,"species":385},{"address":2018148,"species":360},{"address":2323175,"species":101},{"address":2323252,"species":101},{"address":2581669,"species":317},{"address":2581574,"species":317},{"address":2581688,"species":317},{"address":2581593,"species":317},{"address":2581612,"species":317},{"address":2581631,"species":317},{"address":2581650,"species":317},{"address":2065036,"species":317},{"address":2386223,"species":185},{"address":2339323,"species":100},{"address":2339400,"species":100},{"address":2339477,"species":100}],"misc_ram_addresses":{"CB2_Overworld":134768624,"gArchipelagoDeathLinkQueued":33804824,"gArchipelagoReceivedItem":33804776,"gMain":50340544,"gPlayerParty":33703196,"gSaveBlock1Ptr":50355596,"gSaveBlock2Ptr":50355600},"misc_rom_addresses":{"gArchipelagoInfo":5912960,"gArchipelagoItemNames":5896457,"gArchipelagoNameTable":5905457,"gArchipelagoOptions":5895556,"gArchipelagoPlayerNames":5895607,"gBattleMoves":3281380,"gEvolutionTable":3318404,"gLevelUpLearnsets":3334884,"gRandomizedBerryTreeItems":5843560,"gRandomizedSoundTable":10155508,"gSpeciesInfo":3296744,"gTMHMLearnsets":3289780,"gTrainers":3230072,"gTutorMoves":6428060,"sFanfares":5422580,"sNewGamePCItems":6210444,"sStarterMon":6021752,"sTMHMMoves":6432208,"sTutorLearnsets":6428120},"species":[{"abilities":[0,0],"address":3296744,"base_stats":[0,0,0,0,0,0],"catch_rate":0,"evolutions":[],"friendship":0,"id":0,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3296772,"base_stats":[45,49,49,45,65,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":2}],"friendship":70,"id":1,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296800,"base_stats":[60,62,63,60,80,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":3}],"friendship":70,"id":2,"learnset":{"address":3308308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":38,"move_id":74},{"level":47,"move_id":235},{"level":56,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296828,"base_stats":[80,82,83,80,100,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":3,"learnset":{"address":3308338,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":1,"move_id":22},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":41,"move_id":74},{"level":53,"move_id":235},{"level":65,"move_id":76}]},"tmhm_learnset":"00E41E0886354730","types":[12,3]},{"abilities":[66,0],"address":3296856,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":5}],"friendship":70,"id":4,"learnset":{"address":3308368,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":19,"move_id":99},{"level":25,"move_id":184},{"level":31,"move_id":53},{"level":37,"move_id":163},{"level":43,"move_id":82},{"level":49,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296884,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":6}],"friendship":70,"id":5,"learnset":{"address":3308394,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":41,"move_id":163},{"level":48,"move_id":82},{"level":55,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296912,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":6,"learnset":{"address":3308420,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":1,"move_id":108},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":36,"move_id":17},{"level":44,"move_id":163},{"level":54,"move_id":82},{"level":64,"move_id":83}]},"tmhm_learnset":"00AE5EA4CE514633","types":[10,2]},{"abilities":[67,0],"address":3296940,"base_stats":[44,48,65,43,50,64],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":8}],"friendship":70,"id":7,"learnset":{"address":3308448,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":18,"move_id":44},{"level":23,"move_id":229},{"level":28,"move_id":182},{"level":33,"move_id":240},{"level":40,"move_id":130},{"level":47,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296968,"base_stats":[59,63,80,58,65,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":9}],"friendship":70,"id":8,"learnset":{"address":3308478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":37,"move_id":240},{"level":45,"move_id":130},{"level":53,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296996,"base_stats":[79,83,100,78,85,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":9,"learnset":{"address":3308508,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":1,"move_id":110},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":42,"move_id":240},{"level":55,"move_id":130},{"level":68,"move_id":56}]},"tmhm_learnset":"03B01E00CE537275","types":[11,11]},{"abilities":[19,0],"address":3297024,"base_stats":[45,30,35,45,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":11}],"friendship":70,"id":10,"learnset":{"address":3308538,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3297052,"base_stats":[50,20,55,30,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":12}],"friendship":70,"id":11,"learnset":{"address":3308548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[14,0],"address":3297080,"base_stats":[60,45,50,70,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":12,"learnset":{"address":3308560,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":77},{"level":14,"move_id":78},{"level":15,"move_id":79},{"level":18,"move_id":48},{"level":23,"move_id":18},{"level":28,"move_id":16},{"level":34,"move_id":60},{"level":40,"move_id":219},{"level":47,"move_id":318}]},"tmhm_learnset":"0040BE80B43F4620","types":[6,2]},{"abilities":[19,0],"address":3297108,"base_stats":[40,35,30,50,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":14}],"friendship":70,"id":13,"learnset":{"address":3308590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[61,0],"address":3297136,"base_stats":[45,25,50,35,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":15}],"friendship":70,"id":14,"learnset":{"address":3308600,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[68,0],"address":3297164,"base_stats":[65,80,40,75,45,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":15,"learnset":{"address":3308612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":31},{"level":10,"move_id":31},{"level":15,"move_id":116},{"level":20,"move_id":41},{"level":25,"move_id":99},{"level":30,"move_id":228},{"level":35,"move_id":42},{"level":40,"move_id":97},{"level":45,"move_id":283}]},"tmhm_learnset":"00843E88C4354620","types":[6,3]},{"abilities":[51,0],"address":3297192,"base_stats":[40,45,40,56,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":17}],"friendship":70,"id":16,"learnset":{"address":3308638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":19,"move_id":18},{"level":25,"move_id":17},{"level":31,"move_id":297},{"level":39,"move_id":97},{"level":47,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297220,"base_stats":[63,60,55,71,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":18}],"friendship":70,"id":17,"learnset":{"address":3308664,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":43,"move_id":97},{"level":52,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297248,"base_stats":[83,80,75,91,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":18,"learnset":{"address":3308690,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":1,"move_id":98},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":48,"move_id":97},{"level":62,"move_id":119}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[50,62],"address":3297276,"base_stats":[30,56,35,72,25,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":20}],"friendship":70,"id":19,"learnset":{"address":3308716,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":116},{"level":27,"move_id":228},{"level":34,"move_id":162},{"level":41,"move_id":283}]},"tmhm_learnset":"00843E02ADD33E20","types":[0,0]},{"abilities":[50,62],"address":3297304,"base_stats":[55,81,60,97,50,70],"catch_rate":127,"evolutions":[],"friendship":70,"id":20,"learnset":{"address":3308738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":184},{"level":30,"move_id":228},{"level":40,"move_id":162},{"level":50,"move_id":283}]},"tmhm_learnset":"00A43E02ADD37E30","types":[0,0]},{"abilities":[51,0],"address":3297332,"base_stats":[40,60,30,70,31,31],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":22}],"friendship":70,"id":21,"learnset":{"address":3308760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":19,"move_id":228},{"level":25,"move_id":332},{"level":31,"move_id":119},{"level":37,"move_id":65},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297360,"base_stats":[65,90,65,100,61,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":22,"learnset":{"address":3308784,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":43},{"level":1,"move_id":31},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":26,"move_id":228},{"level":32,"move_id":119},{"level":40,"move_id":65},{"level":47,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[22,61],"address":3297388,"base_stats":[35,60,44,55,40,54],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":24}],"friendship":70,"id":23,"learnset":{"address":3308806,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":25,"move_id":103},{"level":32,"move_id":51},{"level":37,"move_id":254},{"level":37,"move_id":256},{"level":37,"move_id":255},{"level":44,"move_id":114}]},"tmhm_learnset":"00213F088E570620","types":[3,3]},{"abilities":[22,61],"address":3297416,"base_stats":[60,85,69,80,65,79],"catch_rate":90,"evolutions":[],"friendship":70,"id":24,"learnset":{"address":3308834,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":40},{"level":1,"move_id":44},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":28,"move_id":103},{"level":38,"move_id":51},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255},{"level":56,"move_id":114}]},"tmhm_learnset":"00213F088E574620","types":[3,3]},{"abilities":[9,0],"address":3297444,"base_stats":[35,55,30,90,50,40],"catch_rate":190,"evolutions":[{"method":"ITEM","param":96,"species":26}],"friendship":70,"id":25,"learnset":{"address":3308862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":45},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":98},{"level":15,"move_id":104},{"level":20,"move_id":21},{"level":26,"move_id":85},{"level":33,"move_id":97},{"level":41,"move_id":87},{"level":50,"move_id":113}]},"tmhm_learnset":"00E01E02CDD38221","types":[13,13]},{"abilities":[9,0],"address":3297472,"base_stats":[60,90,55,100,90,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":26,"learnset":{"address":3308890,"moves":[{"level":1,"move_id":84},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":1,"move_id":85}]},"tmhm_learnset":"00E03E02CDD3C221","types":[13,13]},{"abilities":[8,0],"address":3297500,"base_stats":[50,75,85,40,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":28}],"friendship":70,"id":27,"learnset":{"address":3308900,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":23,"move_id":163},{"level":30,"move_id":129},{"level":37,"move_id":154},{"level":45,"move_id":328},{"level":53,"move_id":201}]},"tmhm_learnset":"00A43ED0CE510621","types":[4,4]},{"abilities":[8,0],"address":3297528,"base_stats":[75,100,110,65,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":28,"learnset":{"address":3308926,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":28},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":24,"move_id":163},{"level":33,"move_id":129},{"level":42,"move_id":154},{"level":52,"move_id":328},{"level":62,"move_id":201}]},"tmhm_learnset":"00A43ED0CE514621","types":[4,4]},{"abilities":[38,0],"address":3297556,"base_stats":[55,47,52,41,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":30}],"friendship":70,"id":29,"learnset":{"address":3308952,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":44},{"level":23,"move_id":270},{"level":30,"move_id":154},{"level":38,"move_id":260},{"level":47,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297584,"base_stats":[70,62,67,56,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":31}],"friendship":70,"id":30,"learnset":{"address":3308978,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":44},{"level":26,"move_id":270},{"level":34,"move_id":154},{"level":43,"move_id":260},{"level":53,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297612,"base_stats":[90,82,87,76,75,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":31,"learnset":{"address":3309004,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":34}]},"tmhm_learnset":"00B43FFEEFD37E35","types":[3,4]},{"abilities":[38,0],"address":3297640,"base_stats":[46,57,40,50,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":33}],"friendship":70,"id":32,"learnset":{"address":3309016,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":30},{"level":23,"move_id":270},{"level":30,"move_id":31},{"level":38,"move_id":260},{"level":47,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297668,"base_stats":[61,72,57,65,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":34}],"friendship":70,"id":33,"learnset":{"address":3309042,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":30},{"level":26,"move_id":270},{"level":34,"move_id":31},{"level":43,"move_id":260},{"level":53,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297696,"base_stats":[81,92,77,85,85,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":34,"learnset":{"address":3309068,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":116},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":37}]},"tmhm_learnset":"00B43F7EEFD37E35","types":[3,4]},{"abilities":[56,0],"address":3297724,"base_stats":[70,45,48,35,60,65],"catch_rate":150,"evolutions":[{"method":"ITEM","param":94,"species":36}],"friendship":140,"id":35,"learnset":{"address":3309080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":227},{"level":9,"move_id":47},{"level":13,"move_id":3},{"level":17,"move_id":266},{"level":21,"move_id":107},{"level":25,"move_id":111},{"level":29,"move_id":118},{"level":33,"move_id":322},{"level":37,"move_id":236},{"level":41,"move_id":113},{"level":45,"move_id":309}]},"tmhm_learnset":"00611E27FDFBB62D","types":[0,0]},{"abilities":[56,0],"address":3297752,"base_stats":[95,70,73,60,85,90],"catch_rate":25,"evolutions":[],"friendship":140,"id":36,"learnset":{"address":3309112,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":3},{"level":1,"move_id":107},{"level":1,"move_id":118}]},"tmhm_learnset":"00611E27FDFBF62D","types":[0,0]},{"abilities":[18,0],"address":3297780,"base_stats":[38,41,40,65,50,65],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":38}],"friendship":70,"id":37,"learnset":{"address":3309122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":5,"move_id":39},{"level":9,"move_id":46},{"level":13,"move_id":98},{"level":17,"move_id":261},{"level":21,"move_id":109},{"level":25,"move_id":286},{"level":29,"move_id":53},{"level":33,"move_id":219},{"level":37,"move_id":288},{"level":41,"move_id":83}]},"tmhm_learnset":"00021E248C590630","types":[10,10]},{"abilities":[18,0],"address":3297808,"base_stats":[73,76,75,100,81,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":38,"learnset":{"address":3309152,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":98},{"level":1,"move_id":109},{"level":1,"move_id":219},{"level":45,"move_id":83}]},"tmhm_learnset":"00021E248C594630","types":[10,10]},{"abilities":[56,0],"address":3297836,"base_stats":[115,45,20,20,45,25],"catch_rate":170,"evolutions":[{"method":"ITEM","param":94,"species":40}],"friendship":70,"id":39,"learnset":{"address":3309164,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":50},{"level":19,"move_id":205},{"level":24,"move_id":3},{"level":29,"move_id":156},{"level":34,"move_id":34},{"level":39,"move_id":102},{"level":44,"move_id":304},{"level":49,"move_id":38}]},"tmhm_learnset":"00611E27FDBBB625","types":[0,0]},{"abilities":[56,0],"address":3297864,"base_stats":[140,70,45,45,75,50],"catch_rate":50,"evolutions":[],"friendship":70,"id":40,"learnset":{"address":3309194,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":50},{"level":1,"move_id":111},{"level":1,"move_id":3}]},"tmhm_learnset":"00611E27FDBBF625","types":[0,0]},{"abilities":[39,0],"address":3297892,"base_stats":[40,45,35,55,30,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":42}],"friendship":70,"id":41,"learnset":{"address":3309204,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":141},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":26,"move_id":109},{"level":31,"move_id":314},{"level":36,"move_id":212},{"level":41,"move_id":305},{"level":46,"move_id":114}]},"tmhm_learnset":"00017F88A4170E20","types":[3,2]},{"abilities":[39,0],"address":3297920,"base_stats":[75,80,70,90,65,75],"catch_rate":90,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":169}],"friendship":70,"id":42,"learnset":{"address":3309232,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00017F88A4174E20","types":[3,2]},{"abilities":[34,0],"address":3297948,"base_stats":[45,50,55,30,75,65],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":44}],"friendship":70,"id":43,"learnset":{"address":3309260,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":23,"move_id":51},{"level":32,"move_id":236},{"level":39,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3297976,"base_stats":[60,65,70,40,85,75],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":45},{"method":"ITEM","param":93,"species":182}],"friendship":70,"id":44,"learnset":{"address":3309284,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":77},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":24,"move_id":51},{"level":35,"move_id":236},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298004,"base_stats":[75,80,85,50,100,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":45,"learnset":{"address":3309308,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":312},{"level":1,"move_id":78},{"level":1,"move_id":72},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884354720","types":[12,3]},{"abilities":[27,0],"address":3298032,"base_stats":[35,70,55,25,45,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":24,"species":47}],"friendship":70,"id":46,"learnset":{"address":3309320,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":25,"move_id":147},{"level":31,"move_id":163},{"level":37,"move_id":74},{"level":43,"move_id":202},{"level":49,"move_id":312}]},"tmhm_learnset":"00C43E888C350720","types":[6,12]},{"abilities":[27,0],"address":3298060,"base_stats":[60,95,80,30,60,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":47,"learnset":{"address":3309346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":78},{"level":1,"move_id":77},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":27,"move_id":147},{"level":35,"move_id":163},{"level":43,"move_id":74},{"level":51,"move_id":202},{"level":59,"move_id":312}]},"tmhm_learnset":"00C43E888C354720","types":[6,12]},{"abilities":[14,0],"address":3298088,"base_stats":[60,55,50,45,40,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":49}],"friendship":70,"id":48,"learnset":{"address":3309372,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":33,"move_id":60},{"level":36,"move_id":79},{"level":41,"move_id":94}]},"tmhm_learnset":"0040BE0894350620","types":[6,3]},{"abilities":[19,0],"address":3298116,"base_stats":[70,65,60,90,90,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":49,"learnset":{"address":3309398,"moves":[{"level":1,"move_id":318},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":1,"move_id":48},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":31,"move_id":16},{"level":36,"move_id":60},{"level":42,"move_id":79},{"level":52,"move_id":94}]},"tmhm_learnset":"0040BE8894354620","types":[6,3]},{"abilities":[8,71],"address":3298144,"base_stats":[10,55,25,95,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":26,"species":51}],"friendship":70,"id":50,"learnset":{"address":3309428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":33,"move_id":163},{"level":41,"move_id":89},{"level":49,"move_id":90}]},"tmhm_learnset":"00843EC88E110620","types":[4,4]},{"abilities":[8,71],"address":3298172,"base_stats":[35,80,50,120,50,70],"catch_rate":50,"evolutions":[],"friendship":70,"id":51,"learnset":{"address":3309452,"moves":[{"level":1,"move_id":161},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":1,"move_id":45},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":26,"move_id":328},{"level":38,"move_id":163},{"level":51,"move_id":89},{"level":64,"move_id":90}]},"tmhm_learnset":"00843EC88E114620","types":[4,4]},{"abilities":[53,0],"address":3298200,"base_stats":[40,45,35,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":28,"species":53}],"friendship":70,"id":52,"learnset":{"address":3309478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":28,"move_id":185},{"level":35,"move_id":103},{"level":41,"move_id":154},{"level":46,"move_id":163},{"level":50,"move_id":252}]},"tmhm_learnset":"00453F82ADD30E24","types":[0,0]},{"abilities":[7,0],"address":3298228,"base_stats":[65,70,60,115,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":53,"learnset":{"address":3309502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":44},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":29,"move_id":185},{"level":38,"move_id":103},{"level":46,"move_id":154},{"level":53,"move_id":163},{"level":59,"move_id":252}]},"tmhm_learnset":"00453F82ADD34E34","types":[0,0]},{"abilities":[6,13],"address":3298256,"base_stats":[50,52,48,55,65,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":33,"species":55}],"friendship":70,"id":54,"learnset":{"address":3309526,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":40,"move_id":154},{"level":50,"move_id":56}]},"tmhm_learnset":"03F01E80CC53326D","types":[11,11]},{"abilities":[6,13],"address":3298284,"base_stats":[80,82,78,85,95,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":55,"learnset":{"address":3309550,"moves":[{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":50},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":44,"move_id":154},{"level":58,"move_id":56}]},"tmhm_learnset":"03F01E80CC53726D","types":[11,11]},{"abilities":[72,0],"address":3298312,"base_stats":[40,80,35,70,35,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":57}],"friendship":70,"id":56,"learnset":{"address":3309574,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":33,"move_id":69},{"level":39,"move_id":238},{"level":45,"move_id":103},{"level":51,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD30EA1","types":[1,1]},{"abilities":[72,0],"address":3298340,"base_stats":[65,105,60,95,60,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":57,"learnset":{"address":3309600,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":67},{"level":1,"move_id":99},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":28,"move_id":99},{"level":36,"move_id":69},{"level":45,"move_id":238},{"level":54,"move_id":103},{"level":63,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD34EA1","types":[1,1]},{"abilities":[22,18],"address":3298368,"base_stats":[55,70,45,60,70,50],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":59}],"friendship":70,"id":58,"learnset":{"address":3309628,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":7,"move_id":52},{"level":13,"move_id":43},{"level":19,"move_id":316},{"level":25,"move_id":36},{"level":31,"move_id":172},{"level":37,"move_id":270},{"level":43,"move_id":97},{"level":49,"move_id":53}]},"tmhm_learnset":"00A23EA48C510630","types":[10,10]},{"abilities":[22,18],"address":3298396,"base_stats":[90,110,80,95,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":59,"learnset":{"address":3309654,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":1,"move_id":52},{"level":1,"move_id":316},{"level":49,"move_id":245}]},"tmhm_learnset":"00A23EA48C514630","types":[10,10]},{"abilities":[11,6],"address":3298424,"base_stats":[40,50,40,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":61}],"friendship":70,"id":60,"learnset":{"address":3309666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":25,"move_id":240},{"level":31,"move_id":34},{"level":37,"move_id":187},{"level":43,"move_id":56}]},"tmhm_learnset":"03103E009C133264","types":[11,11]},{"abilities":[11,6],"address":3298452,"base_stats":[65,65,65,90,50,50],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":62},{"method":"ITEM","param":187,"species":186}],"friendship":70,"id":61,"learnset":{"address":3309690,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":95},{"level":1,"move_id":55},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":27,"move_id":240},{"level":35,"move_id":34},{"level":43,"move_id":187},{"level":51,"move_id":56}]},"tmhm_learnset":"03B03E00DE133265","types":[11,11]},{"abilities":[11,6],"address":3298480,"base_stats":[90,85,95,70,70,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":62,"learnset":{"address":3309714,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":66},{"level":35,"move_id":66},{"level":51,"move_id":170}]},"tmhm_learnset":"03B03E40DE1372E5","types":[11,1]},{"abilities":[28,39],"address":3298508,"base_stats":[25,20,15,90,105,55],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":16,"species":64}],"friendship":70,"id":63,"learnset":{"address":3309728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":100}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298536,"base_stats":[40,35,30,105,120,70],"catch_rate":100,"evolutions":[{"method":"LEVEL","param":37,"species":65}],"friendship":70,"id":64,"learnset":{"address":3309738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":272},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298564,"base_stats":[55,50,45,120,135,85],"catch_rate":50,"evolutions":[],"friendship":70,"id":65,"learnset":{"address":3309766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":347},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45BCE29","types":[14,14]},{"abilities":[62,0],"address":3298592,"base_stats":[70,80,50,35,35,35],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":28,"species":67}],"friendship":70,"id":66,"learnset":{"address":3309794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":31,"move_id":233},{"level":37,"move_id":66},{"level":40,"move_id":238},{"level":43,"move_id":184},{"level":49,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298620,"base_stats":[80,100,70,45,50,60],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":68}],"friendship":70,"id":67,"learnset":{"address":3309824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298648,"base_stats":[90,130,80,55,65,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":68,"learnset":{"address":3309854,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1346A1","types":[1,1]},{"abilities":[34,0],"address":3298676,"base_stats":[50,75,35,40,70,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":70}],"friendship":70,"id":69,"learnset":{"address":3309884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":23,"move_id":51},{"level":30,"move_id":230},{"level":37,"move_id":75},{"level":45,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298704,"base_stats":[65,90,50,55,85,45],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":71}],"friendship":70,"id":70,"learnset":{"address":3309912,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":1,"move_id":74},{"level":1,"move_id":35},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":24,"move_id":51},{"level":33,"move_id":230},{"level":42,"move_id":75},{"level":54,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298732,"base_stats":[80,105,65,70,100,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":71,"learnset":{"address":3309940,"moves":[{"level":1,"move_id":22},{"level":1,"move_id":79},{"level":1,"move_id":230},{"level":1,"move_id":75}]},"tmhm_learnset":"00443E0884354720","types":[12,3]},{"abilities":[29,64],"address":3298760,"base_stats":[40,40,35,70,50,100],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":73}],"friendship":70,"id":72,"learnset":{"address":3309950,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":36,"move_id":112},{"level":43,"move_id":103},{"level":49,"move_id":56}]},"tmhm_learnset":"03143E0884173264","types":[11,3]},{"abilities":[29,64],"address":3298788,"base_stats":[80,70,65,100,80,120],"catch_rate":60,"evolutions":[],"friendship":70,"id":73,"learnset":{"address":3309976,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":48},{"level":1,"move_id":132},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":38,"move_id":112},{"level":47,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03143E0884177264","types":[11,3]},{"abilities":[69,5],"address":3298816,"base_stats":[40,80,100,20,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":75}],"friendship":70,"id":74,"learnset":{"address":3310002,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":26,"move_id":205},{"level":31,"move_id":350},{"level":36,"move_id":89},{"level":41,"move_id":153},{"level":46,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298844,"base_stats":[55,95,115,35,45,45],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":37,"species":76}],"friendship":70,"id":75,"learnset":{"address":3310030,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298872,"base_stats":[80,110,130,45,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":76,"learnset":{"address":3310058,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE114631","types":[5,4]},{"abilities":[50,18],"address":3298900,"base_stats":[50,85,55,90,65,65],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":40,"species":78}],"friendship":70,"id":77,"learnset":{"address":3310086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":45,"move_id":340},{"level":53,"move_id":126}]},"tmhm_learnset":"00221E2484710620","types":[10,10]},{"abilities":[50,18],"address":3298928,"base_stats":[65,100,70,105,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":78,"learnset":{"address":3310114,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":52},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":40,"move_id":31},{"level":50,"move_id":340},{"level":63,"move_id":126}]},"tmhm_learnset":"00221E2484714620","types":[10,10]},{"abilities":[12,20],"address":3298956,"base_stats":[90,65,65,15,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":80},{"method":"ITEM","param":187,"species":199}],"friendship":70,"id":79,"learnset":{"address":3310144,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":133},{"level":48,"move_id":94}]},"tmhm_learnset":"02709E24BE5B366C","types":[11,14]},{"abilities":[12,20],"address":3298984,"base_stats":[95,75,110,30,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":80,"learnset":{"address":3310168,"moves":[{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":37,"move_id":110},{"level":46,"move_id":133},{"level":54,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[42,5],"address":3299012,"base_stats":[25,35,70,45,95,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":82}],"friendship":70,"id":81,"learnset":{"address":3310194,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":32,"move_id":199},{"level":38,"move_id":129},{"level":44,"move_id":103},{"level":50,"move_id":192}]},"tmhm_learnset":"00400E0385930620","types":[13,8]},{"abilities":[42,5],"address":3299040,"base_stats":[50,60,95,70,120,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":82,"learnset":{"address":3310222,"moves":[{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":1,"move_id":84},{"level":1,"move_id":48},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":35,"move_id":199},{"level":44,"move_id":161},{"level":53,"move_id":103},{"level":62,"move_id":192}]},"tmhm_learnset":"00400E0385934620","types":[13,8]},{"abilities":[51,39],"address":3299068,"base_stats":[52,65,55,60,58,62],"catch_rate":45,"evolutions":[],"friendship":70,"id":83,"learnset":{"address":3310250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":6,"move_id":28},{"level":11,"move_id":43},{"level":16,"move_id":31},{"level":21,"move_id":282},{"level":26,"move_id":210},{"level":31,"move_id":14},{"level":36,"move_id":97},{"level":41,"move_id":163},{"level":46,"move_id":206}]},"tmhm_learnset":"000C7E8084510620","types":[0,2]},{"abilities":[50,48],"address":3299096,"base_stats":[35,85,45,75,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":85}],"friendship":70,"id":84,"learnset":{"address":3310278,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":33,"move_id":253},{"level":37,"move_id":65},{"level":45,"move_id":97}]},"tmhm_learnset":"00087E8084110620","types":[0,2]},{"abilities":[50,48],"address":3299124,"base_stats":[60,110,70,100,60,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":85,"learnset":{"address":3310302,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":228},{"level":1,"move_id":31},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":38,"move_id":253},{"level":47,"move_id":65},{"level":60,"move_id":97}]},"tmhm_learnset":"00087F8084114E20","types":[0,2]},{"abilities":[47,0],"address":3299152,"base_stats":[65,45,55,45,45,70],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":34,"species":87}],"friendship":70,"id":86,"learnset":{"address":3310326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":29},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":37,"move_id":36},{"level":41,"move_id":58},{"level":49,"move_id":219}]},"tmhm_learnset":"03103E00841B3264","types":[11,11]},{"abilities":[47,0],"address":3299180,"base_stats":[90,70,80,70,70,95],"catch_rate":75,"evolutions":[],"friendship":70,"id":87,"learnset":{"address":3310350,"moves":[{"level":1,"move_id":29},{"level":1,"move_id":45},{"level":1,"move_id":196},{"level":1,"move_id":62},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":34,"move_id":329},{"level":42,"move_id":36},{"level":51,"move_id":58},{"level":64,"move_id":219}]},"tmhm_learnset":"03103E00841B7264","types":[11,15]},{"abilities":[1,60],"address":3299208,"base_stats":[80,80,50,25,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":89}],"friendship":70,"id":88,"learnset":{"address":3310376,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":43,"move_id":188},{"level":53,"move_id":262}]},"tmhm_learnset":"00003F6E8D970E20","types":[3,3]},{"abilities":[1,60],"address":3299236,"base_stats":[105,105,75,50,65,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":89,"learnset":{"address":3310402,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":47,"move_id":188},{"level":61,"move_id":262}]},"tmhm_learnset":"00A03F6ECD974E21","types":[3,3]},{"abilities":[75,0],"address":3299264,"base_stats":[30,65,100,40,45,25],"catch_rate":190,"evolutions":[{"method":"ITEM","param":97,"species":91}],"friendship":70,"id":90,"learnset":{"address":3310428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":110},{"level":9,"move_id":48},{"level":17,"move_id":62},{"level":25,"move_id":182},{"level":33,"move_id":43},{"level":41,"move_id":128},{"level":49,"move_id":58}]},"tmhm_learnset":"02101E0084133264","types":[11,11]},{"abilities":[75,0],"address":3299292,"base_stats":[50,95,180,70,85,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":91,"learnset":{"address":3310450,"moves":[{"level":1,"move_id":110},{"level":1,"move_id":48},{"level":1,"move_id":62},{"level":1,"move_id":182},{"level":33,"move_id":191},{"level":41,"move_id":131}]},"tmhm_learnset":"02101F0084137264","types":[11,15]},{"abilities":[26,0],"address":3299320,"base_stats":[30,35,30,80,100,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":93}],"friendship":70,"id":92,"learnset":{"address":3310464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":28,"move_id":109},{"level":33,"move_id":138},{"level":36,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299348,"base_stats":[45,50,45,95,115,55],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":94}],"friendship":70,"id":93,"learnset":{"address":3310488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299376,"base_stats":[60,65,60,110,130,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":94,"learnset":{"address":3310514,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"00A1BF08F5974E21","types":[7,3]},{"abilities":[69,5],"address":3299404,"base_stats":[35,45,160,70,30,45],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":208}],"friendship":70,"id":95,"learnset":{"address":3310540,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":328},{"level":57,"move_id":38}]},"tmhm_learnset":"00A01F508E510E30","types":[5,4]},{"abilities":[15,0],"address":3299432,"base_stats":[60,48,45,42,43,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":26,"species":97}],"friendship":70,"id":96,"learnset":{"address":3310568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":31,"move_id":139},{"level":36,"move_id":96},{"level":40,"move_id":94},{"level":43,"move_id":244},{"level":45,"move_id":248}]},"tmhm_learnset":"0041BF01F41B8E29","types":[14,14]},{"abilities":[15,0],"address":3299460,"base_stats":[85,73,70,67,73,115],"catch_rate":75,"evolutions":[],"friendship":70,"id":97,"learnset":{"address":3310594,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":1,"move_id":50},{"level":1,"move_id":93},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":33,"move_id":139},{"level":40,"move_id":96},{"level":49,"move_id":94},{"level":55,"move_id":244},{"level":60,"move_id":248}]},"tmhm_learnset":"0041BF01F41BCE29","types":[14,14]},{"abilities":[52,75],"address":3299488,"base_stats":[30,105,90,50,25,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":28,"species":99}],"friendship":70,"id":98,"learnset":{"address":3310620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":34,"move_id":12},{"level":41,"move_id":182},{"level":45,"move_id":152}]},"tmhm_learnset":"02B43E408C133264","types":[11,11]},{"abilities":[52,75],"address":3299516,"base_stats":[55,130,115,75,50,50],"catch_rate":60,"evolutions":[],"friendship":70,"id":99,"learnset":{"address":3310646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":43},{"level":1,"move_id":11},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":38,"move_id":12},{"level":49,"move_id":182},{"level":57,"move_id":152}]},"tmhm_learnset":"02B43E408C137264","types":[11,11]},{"abilities":[43,9],"address":3299544,"base_stats":[40,30,50,100,55,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":101}],"friendship":70,"id":100,"learnset":{"address":3310672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":32,"move_id":205},{"level":37,"move_id":113},{"level":42,"move_id":129},{"level":46,"move_id":153},{"level":49,"move_id":243}]},"tmhm_learnset":"00402F0285938A20","types":[13,13]},{"abilities":[43,9],"address":3299572,"base_stats":[60,50,70,140,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":101,"learnset":{"address":3310700,"moves":[{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":1,"move_id":49},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":34,"move_id":205},{"level":41,"move_id":113},{"level":48,"move_id":129},{"level":54,"move_id":153},{"level":59,"move_id":243}]},"tmhm_learnset":"00402F028593CA20","types":[13,13]},{"abilities":[34,0],"address":3299600,"base_stats":[60,40,80,40,60,45],"catch_rate":90,"evolutions":[{"method":"ITEM","param":98,"species":103}],"friendship":70,"id":102,"learnset":{"address":3310728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":253},{"level":1,"move_id":95},{"level":7,"move_id":115},{"level":13,"move_id":73},{"level":19,"move_id":93},{"level":25,"move_id":78},{"level":31,"move_id":77},{"level":37,"move_id":79},{"level":43,"move_id":76}]},"tmhm_learnset":"0060BE0994358720","types":[12,14]},{"abilities":[34,0],"address":3299628,"base_stats":[95,95,85,55,125,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":103,"learnset":{"address":3310752,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":95},{"level":1,"move_id":93},{"level":19,"move_id":23},{"level":31,"move_id":121}]},"tmhm_learnset":"0060BE099435C720","types":[12,14]},{"abilities":[69,31],"address":3299656,"base_stats":[50,50,95,35,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":105}],"friendship":70,"id":104,"learnset":{"address":3310766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":125},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":29,"move_id":99},{"level":33,"move_id":206},{"level":37,"move_id":37},{"level":41,"move_id":198},{"level":45,"move_id":38}]},"tmhm_learnset":"00A03EF4CE513621","types":[4,4]},{"abilities":[69,31],"address":3299684,"base_stats":[60,80,110,45,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":105,"learnset":{"address":3310798,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":125},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":32,"move_id":99},{"level":39,"move_id":206},{"level":46,"move_id":37},{"level":53,"move_id":198},{"level":61,"move_id":38}]},"tmhm_learnset":"00A03EF4CE517621","types":[4,4]},{"abilities":[7,0],"address":3299712,"base_stats":[50,120,53,87,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":106,"learnset":{"address":3310830,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":24},{"level":6,"move_id":96},{"level":11,"move_id":27},{"level":16,"move_id":26},{"level":20,"move_id":280},{"level":21,"move_id":116},{"level":26,"move_id":136},{"level":31,"move_id":170},{"level":36,"move_id":193},{"level":41,"move_id":203},{"level":46,"move_id":25},{"level":51,"move_id":179}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[51,0],"address":3299740,"base_stats":[50,105,79,76,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":107,"learnset":{"address":3310862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":4},{"level":7,"move_id":97},{"level":13,"move_id":228},{"level":20,"move_id":183},{"level":26,"move_id":9},{"level":26,"move_id":8},{"level":26,"move_id":7},{"level":32,"move_id":327},{"level":38,"move_id":5},{"level":44,"move_id":197},{"level":50,"move_id":68}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[20,12],"address":3299768,"base_stats":[90,55,75,30,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":108,"learnset":{"address":3310892,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":122},{"level":7,"move_id":48},{"level":12,"move_id":111},{"level":18,"move_id":282},{"level":23,"move_id":23},{"level":29,"move_id":35},{"level":34,"move_id":50},{"level":40,"move_id":21},{"level":45,"move_id":103},{"level":51,"move_id":287}]},"tmhm_learnset":"00B43E76EFF37625","types":[0,0]},{"abilities":[26,0],"address":3299796,"base_stats":[40,65,95,35,60,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":35,"species":110}],"friendship":70,"id":109,"learnset":{"address":3310920,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":41,"move_id":153},{"level":45,"move_id":194},{"level":49,"move_id":262}]},"tmhm_learnset":"00403F2EA5930E20","types":[3,3]},{"abilities":[26,0],"address":3299824,"base_stats":[65,90,120,60,85,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":110,"learnset":{"address":3310946,"moves":[{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":1,"move_id":123},{"level":1,"move_id":120},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":44,"move_id":153},{"level":51,"move_id":194},{"level":58,"move_id":262}]},"tmhm_learnset":"00403F2EA5934E20","types":[3,3]},{"abilities":[31,69],"address":3299852,"base_stats":[80,85,95,25,30,30],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":42,"species":112}],"friendship":70,"id":111,"learnset":{"address":3310972,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":43,"move_id":36},{"level":52,"move_id":89},{"level":57,"move_id":224}]},"tmhm_learnset":"00A03E768FD33630","types":[4,5]},{"abilities":[31,69],"address":3299880,"base_stats":[105,130,120,40,45,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":112,"learnset":{"address":3310998,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":1,"move_id":23},{"level":1,"move_id":31},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":46,"move_id":36},{"level":58,"move_id":89},{"level":66,"move_id":224}]},"tmhm_learnset":"00B43E76CFD37631","types":[4,5]},{"abilities":[30,32],"address":3299908,"base_stats":[250,5,5,50,35,105],"catch_rate":30,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":242}],"friendship":140,"id":113,"learnset":{"address":3311024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":287},{"level":13,"move_id":135},{"level":17,"move_id":3},{"level":23,"move_id":107},{"level":29,"move_id":47},{"level":35,"move_id":121},{"level":41,"move_id":111},{"level":49,"move_id":113},{"level":57,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[34,0],"address":3299936,"base_stats":[65,55,115,60,100,40],"catch_rate":45,"evolutions":[],"friendship":70,"id":114,"learnset":{"address":3311054,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":275},{"level":1,"move_id":132},{"level":4,"move_id":79},{"level":10,"move_id":71},{"level":13,"move_id":74},{"level":19,"move_id":77},{"level":22,"move_id":22},{"level":28,"move_id":20},{"level":31,"move_id":72},{"level":37,"move_id":78},{"level":40,"move_id":21},{"level":46,"move_id":321}]},"tmhm_learnset":"00C43E0884354720","types":[12,12]},{"abilities":[48,0],"address":3299964,"base_stats":[105,95,80,90,40,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":115,"learnset":{"address":3311084,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":4},{"level":1,"move_id":43},{"level":7,"move_id":44},{"level":13,"move_id":39},{"level":19,"move_id":252},{"level":25,"move_id":5},{"level":31,"move_id":99},{"level":37,"move_id":203},{"level":43,"move_id":146},{"level":49,"move_id":179}]},"tmhm_learnset":"00B43EF6EFF37675","types":[0,0]},{"abilities":[33,0],"address":3299992,"base_stats":[30,40,70,60,70,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":32,"species":117}],"friendship":70,"id":116,"learnset":{"address":3311110,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":36,"move_id":97},{"level":43,"move_id":56},{"level":50,"move_id":349}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[38,0],"address":3300020,"base_stats":[55,65,95,85,95,45],"catch_rate":75,"evolutions":[{"method":"ITEM","param":201,"species":230}],"friendship":70,"id":117,"learnset":{"address":3311134,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[33,41],"address":3300048,"base_stats":[45,67,60,63,35,50],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":119}],"friendship":70,"id":118,"learnset":{"address":3311158,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":38,"move_id":127},{"level":43,"move_id":32},{"level":52,"move_id":97}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,41],"address":3300076,"base_stats":[80,92,65,68,65,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":119,"learnset":{"address":3311182,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":1,"move_id":48},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":41,"move_id":127},{"level":49,"move_id":32},{"level":61,"move_id":97}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[35,30],"address":3300104,"base_stats":[30,45,55,85,70,55],"catch_rate":225,"evolutions":[{"method":"ITEM","param":97,"species":121}],"friendship":70,"id":120,"learnset":{"address":3311206,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":6,"move_id":55},{"level":10,"move_id":229},{"level":15,"move_id":105},{"level":19,"move_id":293},{"level":24,"move_id":129},{"level":28,"move_id":61},{"level":33,"move_id":107},{"level":37,"move_id":113},{"level":42,"move_id":322},{"level":46,"move_id":56}]},"tmhm_learnset":"03500E019593B264","types":[11,11]},{"abilities":[35,30],"address":3300132,"base_stats":[60,75,85,115,100,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":121,"learnset":{"address":3311236,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":229},{"level":1,"move_id":105},{"level":1,"move_id":129},{"level":33,"move_id":109}]},"tmhm_learnset":"03508E019593F264","types":[11,14]},{"abilities":[43,0],"address":3300160,"base_stats":[40,45,65,90,100,120],"catch_rate":45,"evolutions":[],"friendship":70,"id":122,"learnset":{"address":3311248,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":112},{"level":5,"move_id":93},{"level":9,"move_id":164},{"level":13,"move_id":96},{"level":17,"move_id":3},{"level":21,"move_id":113},{"level":21,"move_id":115},{"level":25,"move_id":227},{"level":29,"move_id":60},{"level":33,"move_id":278},{"level":37,"move_id":271},{"level":41,"move_id":272},{"level":45,"move_id":94},{"level":49,"move_id":226},{"level":53,"move_id":219}]},"tmhm_learnset":"0041BF03F5BBCE29","types":[14,14]},{"abilities":[68,0],"address":3300188,"base_stats":[70,110,80,105,55,80],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":212}],"friendship":70,"id":123,"learnset":{"address":3311286,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":17},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00847E8084134620","types":[6,2]},{"abilities":[12,0],"address":3300216,"base_stats":[65,50,35,95,115,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":124,"learnset":{"address":3311314,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":1,"move_id":142},{"level":1,"move_id":181},{"level":9,"move_id":142},{"level":13,"move_id":181},{"level":21,"move_id":3},{"level":25,"move_id":8},{"level":35,"move_id":212},{"level":41,"move_id":313},{"level":51,"move_id":34},{"level":57,"move_id":195},{"level":67,"move_id":59}]},"tmhm_learnset":"0040BF01F413FA6D","types":[15,14]},{"abilities":[9,0],"address":3300244,"base_stats":[65,83,57,105,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":125,"learnset":{"address":3311342,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":1,"move_id":9},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":36,"move_id":103},{"level":47,"move_id":85},{"level":58,"move_id":87}]},"tmhm_learnset":"00E03E02D5D3C221","types":[13,13]},{"abilities":[49,0],"address":3300272,"base_stats":[65,95,57,93,100,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":126,"learnset":{"address":3311364,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":43},{"level":1,"move_id":123},{"level":1,"move_id":7},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":33,"move_id":241},{"level":41,"move_id":53},{"level":49,"move_id":109},{"level":57,"move_id":126}]},"tmhm_learnset":"00A03E24D4514621","types":[10,10]},{"abilities":[52,0],"address":3300300,"base_stats":[65,125,100,85,55,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":127,"learnset":{"address":3311390,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":11},{"level":1,"move_id":116},{"level":7,"move_id":20},{"level":13,"move_id":69},{"level":19,"move_id":106},{"level":25,"move_id":279},{"level":31,"move_id":280},{"level":37,"move_id":12},{"level":43,"move_id":66},{"level":49,"move_id":14}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,6]},{"abilities":[22,0],"address":3300328,"base_stats":[75,100,95,110,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":128,"learnset":{"address":3311416,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":8,"move_id":99},{"level":13,"move_id":30},{"level":19,"move_id":184},{"level":26,"move_id":228},{"level":34,"move_id":156},{"level":43,"move_id":37},{"level":53,"move_id":36}]},"tmhm_learnset":"00B01E7687F37624","types":[0,0]},{"abilities":[33,0],"address":3300356,"base_stats":[20,10,55,80,15,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":130}],"friendship":70,"id":129,"learnset":{"address":3311442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"0000000000000000","types":[11,11]},{"abilities":[22,0],"address":3300384,"base_stats":[95,125,79,81,60,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":130,"learnset":{"address":3311456,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":37},{"level":20,"move_id":44},{"level":25,"move_id":82},{"level":30,"move_id":43},{"level":35,"move_id":239},{"level":40,"move_id":56},{"level":45,"move_id":240},{"level":50,"move_id":349},{"level":55,"move_id":63}]},"tmhm_learnset":"03B01F3487937A74","types":[11,2]},{"abilities":[11,75],"address":3300412,"base_stats":[130,85,80,60,85,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":131,"learnset":{"address":3311482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":45},{"level":1,"move_id":47},{"level":7,"move_id":54},{"level":13,"move_id":34},{"level":19,"move_id":109},{"level":25,"move_id":195},{"level":31,"move_id":58},{"level":37,"move_id":240},{"level":43,"move_id":219},{"level":49,"move_id":56},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E0295DB7274","types":[11,15]},{"abilities":[7,0],"address":3300440,"base_stats":[48,48,48,48,48,48],"catch_rate":35,"evolutions":[],"friendship":70,"id":132,"learnset":{"address":3311510,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":144}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[50,0],"address":3300468,"base_stats":[55,55,50,55,45,65],"catch_rate":45,"evolutions":[{"method":"ITEM","param":96,"species":135},{"method":"ITEM","param":97,"species":134},{"method":"ITEM","param":95,"species":136},{"method":"FRIENDSHIP_DAY","param":0,"species":196},{"method":"FRIENDSHIP_NIGHT","param":0,"species":197}],"friendship":70,"id":133,"learnset":{"address":3311520,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":45},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":226},{"level":42,"move_id":36}]},"tmhm_learnset":"00001E00AC530620","types":[0,0]},{"abilities":[11,0],"address":3300496,"base_stats":[130,65,60,65,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":134,"learnset":{"address":3311542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":55},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":62},{"level":42,"move_id":114},{"level":47,"move_id":151},{"level":52,"move_id":56}]},"tmhm_learnset":"03101E00AC537674","types":[11,11]},{"abilities":[10,0],"address":3300524,"base_stats":[65,65,60,130,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":135,"learnset":{"address":3311568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":84},{"level":23,"move_id":98},{"level":30,"move_id":24},{"level":36,"move_id":42},{"level":42,"move_id":86},{"level":47,"move_id":97},{"level":52,"move_id":87}]},"tmhm_learnset":"00401E02ADD34630","types":[13,13]},{"abilities":[18,0],"address":3300552,"base_stats":[65,130,60,65,95,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":136,"learnset":{"address":3311594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":52},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":83},{"level":42,"move_id":123},{"level":47,"move_id":43},{"level":52,"move_id":53}]},"tmhm_learnset":"00021E24AC534630","types":[10,10]},{"abilities":[36,0],"address":3300580,"base_stats":[65,60,70,40,85,75],"catch_rate":45,"evolutions":[{"method":"ITEM","param":218,"species":233}],"friendship":70,"id":137,"learnset":{"address":3311620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":159},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[33,75],"address":3300608,"base_stats":[35,40,100,35,90,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":139}],"friendship":70,"id":138,"learnset":{"address":3311646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":43,"move_id":321},{"level":49,"move_id":246},{"level":55,"move_id":56}]},"tmhm_learnset":"03903E5084133264","types":[5,11]},{"abilities":[33,75],"address":3300636,"base_stats":[70,60,125,55,115,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":139,"learnset":{"address":3311672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":1,"move_id":44},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":40,"move_id":131},{"level":46,"move_id":321},{"level":55,"move_id":246},{"level":65,"move_id":56}]},"tmhm_learnset":"03903E5084137264","types":[5,11]},{"abilities":[33,4],"address":3300664,"base_stats":[30,80,90,55,55,45],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":141}],"friendship":70,"id":140,"learnset":{"address":3311700,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":43,"move_id":319},{"level":49,"move_id":72},{"level":55,"move_id":246}]},"tmhm_learnset":"01903ED08C173264","types":[5,11]},{"abilities":[33,4],"address":3300692,"base_stats":[60,115,105,80,65,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":141,"learnset":{"address":3311726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":71},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":40,"move_id":163},{"level":46,"move_id":319},{"level":55,"move_id":72},{"level":65,"move_id":246}]},"tmhm_learnset":"03943ED0CC177264","types":[5,11]},{"abilities":[69,46],"address":3300720,"base_stats":[80,105,65,130,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":142,"learnset":{"address":3311754,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":8,"move_id":97},{"level":15,"move_id":44},{"level":22,"move_id":48},{"level":29,"move_id":246},{"level":36,"move_id":184},{"level":43,"move_id":36},{"level":50,"move_id":63}]},"tmhm_learnset":"00A87FF486534E32","types":[5,2]},{"abilities":[17,47],"address":3300748,"base_stats":[160,110,65,30,65,110],"catch_rate":25,"evolutions":[],"friendship":70,"id":143,"learnset":{"address":3311778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":133},{"level":10,"move_id":111},{"level":15,"move_id":187},{"level":19,"move_id":29},{"level":24,"move_id":281},{"level":28,"move_id":156},{"level":28,"move_id":173},{"level":33,"move_id":34},{"level":37,"move_id":335},{"level":42,"move_id":343},{"level":46,"move_id":205},{"level":51,"move_id":63}]},"tmhm_learnset":"00301E76F7B37625","types":[0,0]},{"abilities":[46,0],"address":3300776,"base_stats":[90,85,100,85,95,125],"catch_rate":3,"evolutions":[],"friendship":35,"id":144,"learnset":{"address":3311812,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":181},{"level":13,"move_id":54},{"level":25,"move_id":97},{"level":37,"move_id":170},{"level":49,"move_id":58},{"level":61,"move_id":115},{"level":73,"move_id":59},{"level":85,"move_id":329}]},"tmhm_learnset":"00884E9184137674","types":[15,2]},{"abilities":[46,0],"address":3300804,"base_stats":[90,90,85,100,125,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":145,"learnset":{"address":3311836,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":84},{"level":13,"move_id":86},{"level":25,"move_id":97},{"level":37,"move_id":197},{"level":49,"move_id":65},{"level":61,"move_id":268},{"level":73,"move_id":113},{"level":85,"move_id":87}]},"tmhm_learnset":"00C84E928593C630","types":[13,2]},{"abilities":[46,0],"address":3300832,"base_stats":[90,100,90,90,125,85],"catch_rate":3,"evolutions":[],"friendship":35,"id":146,"learnset":{"address":3311860,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":1,"move_id":52},{"level":13,"move_id":83},{"level":25,"move_id":97},{"level":37,"move_id":203},{"level":49,"move_id":53},{"level":61,"move_id":219},{"level":73,"move_id":257},{"level":85,"move_id":143}]},"tmhm_learnset":"008A4EB4841B4630","types":[10,2]},{"abilities":[61,0],"address":3300860,"base_stats":[41,64,45,50,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":148}],"friendship":35,"id":147,"learnset":{"address":3311884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":36,"move_id":97},{"level":43,"move_id":219},{"level":50,"move_id":200},{"level":57,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[61,0],"address":3300888,"base_stats":[61,84,65,70,70,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":149}],"friendship":35,"id":148,"learnset":{"address":3311910,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":56,"move_id":200},{"level":65,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[39,0],"address":3300916,"base_stats":[91,134,95,80,100,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":149,"learnset":{"address":3311936,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":55,"move_id":17},{"level":61,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BC5EF6C7DB7677","types":[16,2]},{"abilities":[46,0],"address":3300944,"base_stats":[106,110,90,130,154,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":150,"learnset":{"address":3311964,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":50},{"level":11,"move_id":112},{"level":22,"move_id":129},{"level":33,"move_id":244},{"level":44,"move_id":248},{"level":55,"move_id":54},{"level":66,"move_id":94},{"level":77,"move_id":133},{"level":88,"move_id":105},{"level":99,"move_id":219}]},"tmhm_learnset":"00E18FF7F7FBFEED","types":[14,14]},{"abilities":[28,0],"address":3300972,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":151,"learnset":{"address":3311992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":10,"move_id":144},{"level":20,"move_id":5},{"level":30,"move_id":118},{"level":40,"move_id":94},{"level":50,"move_id":246}]},"tmhm_learnset":"03FFFFFFFFFFFFFF","types":[14,14]},{"abilities":[65,0],"address":3301000,"base_stats":[45,49,65,45,49,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":153}],"friendship":70,"id":152,"learnset":{"address":3312012,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":22,"move_id":235},{"level":29,"move_id":34},{"level":36,"move_id":113},{"level":43,"move_id":219},{"level":50,"move_id":76}]},"tmhm_learnset":"00441E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301028,"base_stats":[60,62,80,60,63,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":154}],"friendship":70,"id":153,"learnset":{"address":3312038,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":39,"move_id":113},{"level":47,"move_id":219},{"level":55,"move_id":76}]},"tmhm_learnset":"00E41E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301056,"base_stats":[80,82,100,80,83,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":154,"learnset":{"address":3312064,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":41,"move_id":113},{"level":51,"move_id":219},{"level":61,"move_id":76}]},"tmhm_learnset":"00E41E01867DC720","types":[12,12]},{"abilities":[66,0],"address":3301084,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":14,"species":156}],"friendship":70,"id":155,"learnset":{"address":3312090,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":19,"move_id":98},{"level":27,"move_id":172},{"level":36,"move_id":129},{"level":46,"move_id":53}]},"tmhm_learnset":"00061EA48C110620","types":[10,10]},{"abilities":[66,0],"address":3301112,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":157}],"friendship":70,"id":156,"learnset":{"address":3312112,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":42,"move_id":129},{"level":54,"move_id":53}]},"tmhm_learnset":"00A61EA4CC110631","types":[10,10]},{"abilities":[66,0],"address":3301140,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":157,"learnset":{"address":3312134,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":1,"move_id":52},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":45,"move_id":129},{"level":60,"move_id":53}]},"tmhm_learnset":"00A61EA4CE114631","types":[10,10]},{"abilities":[67,0],"address":3301168,"base_stats":[50,65,64,43,44,48],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":18,"species":159}],"friendship":70,"id":158,"learnset":{"address":3312156,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":20,"move_id":44},{"level":27,"move_id":184},{"level":35,"move_id":163},{"level":43,"move_id":103},{"level":52,"move_id":56}]},"tmhm_learnset":"03141E80CC533265","types":[11,11]},{"abilities":[67,0],"address":3301196,"base_stats":[65,80,80,58,59,63],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":160}],"friendship":70,"id":159,"learnset":{"address":3312180,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":37,"move_id":163},{"level":45,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03B41E80CC533275","types":[11,11]},{"abilities":[67,0],"address":3301224,"base_stats":[85,105,100,78,79,83],"catch_rate":45,"evolutions":[],"friendship":70,"id":160,"learnset":{"address":3312204,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":1,"move_id":55},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":38,"move_id":163},{"level":47,"move_id":103},{"level":58,"move_id":56}]},"tmhm_learnset":"03B41E80CE537277","types":[11,11]},{"abilities":[50,51],"address":3301252,"base_stats":[35,46,34,20,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":15,"species":162}],"friendship":70,"id":161,"learnset":{"address":3312228,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":17,"move_id":270},{"level":24,"move_id":21},{"level":31,"move_id":266},{"level":40,"move_id":156},{"level":49,"move_id":133}]},"tmhm_learnset":"00143E06ECF31625","types":[0,0]},{"abilities":[50,51],"address":3301280,"base_stats":[85,76,64,90,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":162,"learnset":{"address":3312254,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":98},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":19,"move_id":270},{"level":28,"move_id":21},{"level":37,"move_id":266},{"level":48,"move_id":156},{"level":59,"move_id":133}]},"tmhm_learnset":"00B43E06EDF37625","types":[0,0]},{"abilities":[15,51],"address":3301308,"base_stats":[60,30,30,50,36,56],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":164}],"friendship":70,"id":163,"learnset":{"address":3312280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":22,"move_id":115},{"level":28,"move_id":36},{"level":34,"move_id":93},{"level":48,"move_id":138}]},"tmhm_learnset":"00487E81B4130620","types":[0,2]},{"abilities":[15,51],"address":3301336,"base_stats":[100,50,50,70,76,96],"catch_rate":90,"evolutions":[],"friendship":70,"id":164,"learnset":{"address":3312304,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":193},{"level":1,"move_id":64},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":25,"move_id":115},{"level":33,"move_id":36},{"level":41,"move_id":93},{"level":57,"move_id":138}]},"tmhm_learnset":"00487E81B4134620","types":[0,2]},{"abilities":[68,48],"address":3301364,"base_stats":[40,20,30,55,40,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":166}],"friendship":70,"id":165,"learnset":{"address":3312328,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":22,"move_id":113},{"level":22,"move_id":115},{"level":22,"move_id":219},{"level":29,"move_id":226},{"level":36,"move_id":129},{"level":43,"move_id":97},{"level":50,"move_id":38}]},"tmhm_learnset":"00403E81CC3D8621","types":[6,2]},{"abilities":[68,48],"address":3301392,"base_stats":[55,35,50,85,55,110],"catch_rate":90,"evolutions":[],"friendship":70,"id":166,"learnset":{"address":3312356,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":48},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":24,"move_id":113},{"level":24,"move_id":115},{"level":24,"move_id":219},{"level":33,"move_id":226},{"level":42,"move_id":129},{"level":51,"move_id":97},{"level":60,"move_id":38}]},"tmhm_learnset":"00403E81CC3DC621","types":[6,2]},{"abilities":[68,15],"address":3301420,"base_stats":[40,60,40,30,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":168}],"friendship":70,"id":167,"learnset":{"address":3312384,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":23,"move_id":141},{"level":30,"move_id":154},{"level":37,"move_id":169},{"level":45,"move_id":97},{"level":53,"move_id":94}]},"tmhm_learnset":"00403E089C350620","types":[6,3]},{"abilities":[68,15],"address":3301448,"base_stats":[70,90,70,40,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":168,"learnset":{"address":3312410,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":1,"move_id":184},{"level":1,"move_id":132},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":25,"move_id":141},{"level":34,"move_id":154},{"level":43,"move_id":169},{"level":53,"move_id":97},{"level":63,"move_id":94}]},"tmhm_learnset":"00403E089C354620","types":[6,3]},{"abilities":[39,0],"address":3301476,"base_stats":[85,90,80,130,70,80],"catch_rate":90,"evolutions":[],"friendship":70,"id":169,"learnset":{"address":3312436,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00097F88A4174E20","types":[3,2]},{"abilities":[10,35],"address":3301504,"base_stats":[75,38,38,67,56,56],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":27,"species":171}],"friendship":70,"id":170,"learnset":{"address":3312464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":29,"move_id":109},{"level":37,"move_id":36},{"level":41,"move_id":56},{"level":49,"move_id":268}]},"tmhm_learnset":"03501E0285933264","types":[11,13]},{"abilities":[10,35],"address":3301532,"base_stats":[125,58,58,67,76,76],"catch_rate":75,"evolutions":[],"friendship":70,"id":171,"learnset":{"address":3312490,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":1,"move_id":48},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":32,"move_id":109},{"level":43,"move_id":36},{"level":50,"move_id":56},{"level":61,"move_id":268}]},"tmhm_learnset":"03501E0285937264","types":[11,13]},{"abilities":[9,0],"address":3301560,"base_stats":[20,40,15,60,35,35],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":25}],"friendship":70,"id":172,"learnset":{"address":3312516,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":204},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":186}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[56,0],"address":3301588,"base_stats":[50,25,28,15,45,55],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":35}],"friendship":140,"id":173,"learnset":{"address":3312532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":204},{"level":4,"move_id":227},{"level":8,"move_id":47},{"level":13,"move_id":186}]},"tmhm_learnset":"00401E27BC7B8624","types":[0,0]},{"abilities":[56,0],"address":3301616,"base_stats":[90,30,15,15,40,20],"catch_rate":170,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":39}],"friendship":70,"id":174,"learnset":{"address":3312548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":1,"move_id":204},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":186}]},"tmhm_learnset":"00401E27BC3B8624","types":[0,0]},{"abilities":[55,32],"address":3301644,"base_stats":[35,20,65,20,40,65],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":176}],"friendship":70,"id":175,"learnset":{"address":3312564,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C01E27B43B8624","types":[0,0]},{"abilities":[55,32],"address":3301672,"base_stats":[55,40,85,40,80,105],"catch_rate":75,"evolutions":[],"friendship":70,"id":176,"learnset":{"address":3312590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C85EA7F43BC625","types":[0,2]},{"abilities":[28,48],"address":3301700,"base_stats":[40,50,45,70,70,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":178}],"friendship":70,"id":177,"learnset":{"address":3312616,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":30,"move_id":273},{"level":30,"move_id":248},{"level":40,"move_id":109},{"level":50,"move_id":94}]},"tmhm_learnset":"0040FE81B4378628","types":[14,2]},{"abilities":[28,48],"address":3301728,"base_stats":[65,75,70,95,95,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":178,"learnset":{"address":3312638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":35,"move_id":273},{"level":35,"move_id":248},{"level":50,"move_id":109},{"level":65,"move_id":94}]},"tmhm_learnset":"0048FE81B437C628","types":[14,2]},{"abilities":[9,0],"address":3301756,"base_stats":[55,40,40,35,65,45],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":15,"species":180}],"friendship":70,"id":179,"learnset":{"address":3312660,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":84},{"level":16,"move_id":86},{"level":23,"move_id":178},{"level":30,"move_id":113},{"level":37,"move_id":87}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[9,0],"address":3301784,"base_stats":[70,55,55,45,80,60],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":181}],"friendship":70,"id":180,"learnset":{"address":3312680,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":36,"move_id":113},{"level":45,"move_id":87}]},"tmhm_learnset":"00E01E02C5D38221","types":[13,13]},{"abilities":[9,0],"address":3301812,"base_stats":[90,75,75,55,115,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":181,"learnset":{"address":3312700,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":1,"move_id":86},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":30,"move_id":9},{"level":42,"move_id":113},{"level":57,"move_id":87}]},"tmhm_learnset":"00E01E02C5D3C221","types":[13,13]},{"abilities":[34,0],"address":3301840,"base_stats":[75,80,85,50,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":182,"learnset":{"address":3312722,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":78},{"level":1,"move_id":345},{"level":44,"move_id":80},{"level":55,"move_id":76}]},"tmhm_learnset":"00441E08843D4720","types":[12,12]},{"abilities":[47,37],"address":3301868,"base_stats":[70,20,50,40,20,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":18,"species":184}],"friendship":70,"id":183,"learnset":{"address":3312736,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":21,"move_id":61},{"level":28,"move_id":38},{"level":36,"move_id":240},{"level":45,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[47,37],"address":3301896,"base_stats":[100,50,80,50,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":184,"learnset":{"address":3312762,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":39},{"level":1,"move_id":55},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":24,"move_id":61},{"level":34,"move_id":38},{"level":45,"move_id":240},{"level":57,"move_id":56}]},"tmhm_learnset":"03B01E00CC537265","types":[11,11]},{"abilities":[5,69],"address":3301924,"base_stats":[70,100,115,30,30,65],"catch_rate":65,"evolutions":[],"friendship":70,"id":185,"learnset":{"address":3312788,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":102},{"level":9,"move_id":175},{"level":17,"move_id":67},{"level":25,"move_id":157},{"level":33,"move_id":335},{"level":41,"move_id":185},{"level":49,"move_id":21},{"level":57,"move_id":38}]},"tmhm_learnset":"00A03E50CE110E29","types":[5,5]},{"abilities":[11,6],"address":3301952,"base_stats":[90,75,75,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":186,"learnset":{"address":3312812,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":195},{"level":35,"move_id":195},{"level":51,"move_id":207}]},"tmhm_learnset":"03B03E00DE137265","types":[11,11]},{"abilities":[34,0],"address":3301980,"base_stats":[35,35,40,50,35,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":188}],"friendship":70,"id":187,"learnset":{"address":3312826,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":20,"move_id":73},{"level":25,"move_id":178},{"level":30,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302008,"base_stats":[55,45,50,80,45,65],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":27,"species":189}],"friendship":70,"id":188,"learnset":{"address":3312854,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":29,"move_id":178},{"level":36,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302036,"base_stats":[75,55,70,110,55,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":189,"learnset":{"address":3312882,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":33,"move_id":178},{"level":44,"move_id":72}]},"tmhm_learnset":"00401E8084354720","types":[12,2]},{"abilities":[50,53],"address":3302064,"base_stats":[55,70,55,85,40,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":190,"learnset":{"address":3312910,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":6,"move_id":28},{"level":13,"move_id":310},{"level":18,"move_id":226},{"level":25,"move_id":321},{"level":31,"move_id":154},{"level":38,"move_id":129},{"level":43,"move_id":103},{"level":50,"move_id":97}]},"tmhm_learnset":"00A53E82EDF30E25","types":[0,0]},{"abilities":[34,0],"address":3302092,"base_stats":[30,30,30,30,30,30],"catch_rate":235,"evolutions":[{"method":"ITEM","param":93,"species":192}],"friendship":70,"id":191,"learnset":{"address":3312936,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":6,"move_id":74},{"level":13,"move_id":72},{"level":18,"move_id":275},{"level":25,"move_id":283},{"level":30,"move_id":241},{"level":37,"move_id":235},{"level":42,"move_id":202}]},"tmhm_learnset":"00441E08843D8720","types":[12,12]},{"abilities":[34,0],"address":3302120,"base_stats":[75,75,55,30,105,85],"catch_rate":120,"evolutions":[],"friendship":70,"id":192,"learnset":{"address":3312960,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":1},{"level":6,"move_id":74},{"level":13,"move_id":75},{"level":18,"move_id":275},{"level":25,"move_id":331},{"level":30,"move_id":241},{"level":37,"move_id":80},{"level":42,"move_id":76}]},"tmhm_learnset":"00441E08843DC720","types":[12,12]},{"abilities":[3,14],"address":3302148,"base_stats":[65,65,45,95,75,45],"catch_rate":75,"evolutions":[],"friendship":70,"id":193,"learnset":{"address":3312984,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":193},{"level":7,"move_id":98},{"level":13,"move_id":104},{"level":19,"move_id":49},{"level":25,"move_id":197},{"level":31,"move_id":48},{"level":37,"move_id":253},{"level":43,"move_id":17},{"level":49,"move_id":103}]},"tmhm_learnset":"00407E80B4350620","types":[6,2]},{"abilities":[6,11],"address":3302176,"base_stats":[55,45,45,15,25,25],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":195}],"friendship":70,"id":194,"learnset":{"address":3313010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":21,"move_id":133},{"level":31,"move_id":281},{"level":36,"move_id":89},{"level":41,"move_id":240},{"level":51,"move_id":54},{"level":51,"move_id":114}]},"tmhm_learnset":"03D01E188E533264","types":[11,4]},{"abilities":[6,11],"address":3302204,"base_stats":[95,85,85,35,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":195,"learnset":{"address":3313036,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":23,"move_id":133},{"level":35,"move_id":281},{"level":42,"move_id":89},{"level":49,"move_id":240},{"level":61,"move_id":54},{"level":61,"move_id":114}]},"tmhm_learnset":"03F01E58CE537265","types":[11,4]},{"abilities":[28,0],"address":3302232,"base_stats":[65,65,60,110,130,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":196,"learnset":{"address":3313062,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":93},{"level":23,"move_id":98},{"level":30,"move_id":129},{"level":36,"move_id":60},{"level":42,"move_id":244},{"level":47,"move_id":94},{"level":52,"move_id":234}]},"tmhm_learnset":"00449E01BC53C628","types":[14,14]},{"abilities":[28,0],"address":3302260,"base_stats":[95,65,110,65,60,130],"catch_rate":45,"evolutions":[],"friendship":35,"id":197,"learnset":{"address":3313088,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":228},{"level":23,"move_id":98},{"level":30,"move_id":109},{"level":36,"move_id":185},{"level":42,"move_id":212},{"level":47,"move_id":103},{"level":52,"move_id":236}]},"tmhm_learnset":"00451F00BC534E20","types":[17,17]},{"abilities":[15,0],"address":3302288,"base_stats":[60,85,42,91,85,42],"catch_rate":30,"evolutions":[],"friendship":35,"id":198,"learnset":{"address":3313114,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":9,"move_id":310},{"level":14,"move_id":228},{"level":22,"move_id":114},{"level":27,"move_id":101},{"level":35,"move_id":185},{"level":40,"move_id":269},{"level":48,"move_id":212}]},"tmhm_learnset":"00097F80A4130E28","types":[17,2]},{"abilities":[12,20],"address":3302316,"base_stats":[95,75,80,30,100,110],"catch_rate":70,"evolutions":[],"friendship":70,"id":199,"learnset":{"address":3313138,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":207},{"level":48,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[26,0],"address":3302344,"base_stats":[60,60,60,85,85,85],"catch_rate":45,"evolutions":[],"friendship":35,"id":200,"learnset":{"address":3313162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":149},{"level":6,"move_id":180},{"level":11,"move_id":310},{"level":17,"move_id":109},{"level":23,"move_id":212},{"level":30,"move_id":60},{"level":37,"move_id":220},{"level":45,"move_id":195},{"level":53,"move_id":288}]},"tmhm_learnset":"0041BF82B5930E28","types":[7,7]},{"abilities":[26,0],"address":3302372,"base_stats":[48,72,48,48,72,48],"catch_rate":225,"evolutions":[],"friendship":70,"id":201,"learnset":{"address":3313188,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":237}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[23,0],"address":3302400,"base_stats":[190,33,58,33,33,58],"catch_rate":45,"evolutions":[],"friendship":70,"id":202,"learnset":{"address":3313198,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":243},{"level":1,"move_id":219},{"level":1,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[39,48],"address":3302428,"base_stats":[70,80,65,85,90,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":203,"learnset":{"address":3313208,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":7,"move_id":310},{"level":13,"move_id":93},{"level":19,"move_id":23},{"level":25,"move_id":316},{"level":31,"move_id":97},{"level":37,"move_id":226},{"level":43,"move_id":60},{"level":49,"move_id":242}]},"tmhm_learnset":"00E0BE03B7D38628","types":[0,14]},{"abilities":[5,0],"address":3302456,"base_stats":[50,65,90,15,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":205}],"friendship":70,"id":204,"learnset":{"address":3313234,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":36,"move_id":153},{"level":43,"move_id":191},{"level":50,"move_id":38}]},"tmhm_learnset":"00A01E118E358620","types":[6,6]},{"abilities":[5,0],"address":3302484,"base_stats":[75,90,140,40,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":205,"learnset":{"address":3313258,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":1,"move_id":120},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":39,"move_id":153},{"level":49,"move_id":191},{"level":59,"move_id":38}]},"tmhm_learnset":"00A01E118E35C620","types":[6,8]},{"abilities":[32,50],"address":3302512,"base_stats":[100,70,70,45,65,65],"catch_rate":190,"evolutions":[],"friendship":70,"id":206,"learnset":{"address":3313282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":4,"move_id":111},{"level":11,"move_id":281},{"level":14,"move_id":137},{"level":21,"move_id":180},{"level":24,"move_id":228},{"level":31,"move_id":103},{"level":34,"move_id":36},{"level":41,"move_id":283}]},"tmhm_learnset":"00A03E66AFF3362C","types":[0,0]},{"abilities":[52,8],"address":3302540,"base_stats":[65,75,105,85,35,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":207,"learnset":{"address":3313308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":28},{"level":13,"move_id":106},{"level":20,"move_id":98},{"level":28,"move_id":185},{"level":36,"move_id":163},{"level":44,"move_id":103},{"level":52,"move_id":12}]},"tmhm_learnset":"00A47ED88E530620","types":[4,2]},{"abilities":[69,5],"address":3302568,"base_stats":[75,85,200,30,55,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":208,"learnset":{"address":3313332,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":242},{"level":57,"move_id":38}]},"tmhm_learnset":"00A41F508E514E30","types":[8,4]},{"abilities":[22,50],"address":3302596,"base_stats":[60,80,50,30,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":23,"species":210}],"friendship":70,"id":209,"learnset":{"address":3313360,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":26,"move_id":46},{"level":34,"move_id":99},{"level":43,"move_id":36},{"level":53,"move_id":242}]},"tmhm_learnset":"00A23F2EEFB30EB5","types":[0,0]},{"abilities":[22,22],"address":3302624,"base_stats":[90,120,75,45,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":210,"learnset":{"address":3313386,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":28,"move_id":46},{"level":38,"move_id":99},{"level":49,"move_id":36},{"level":61,"move_id":242}]},"tmhm_learnset":"00A23F6EEFF34EB5","types":[0,0]},{"abilities":[38,33],"address":3302652,"base_stats":[65,95,75,85,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":211,"learnset":{"address":3313412,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":191},{"level":1,"move_id":33},{"level":1,"move_id":40},{"level":10,"move_id":106},{"level":10,"move_id":107},{"level":19,"move_id":55},{"level":28,"move_id":42},{"level":37,"move_id":36},{"level":46,"move_id":56}]},"tmhm_learnset":"03101E0AA4133264","types":[11,3]},{"abilities":[68,0],"address":3302680,"base_stats":[70,130,100,65,55,80],"catch_rate":25,"evolutions":[],"friendship":70,"id":212,"learnset":{"address":3313434,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":232},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00A47E9084134620","types":[6,8]},{"abilities":[5,0],"address":3302708,"base_stats":[20,10,230,5,10,230],"catch_rate":190,"evolutions":[],"friendship":70,"id":213,"learnset":{"address":3313462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":9,"move_id":35},{"level":14,"move_id":227},{"level":23,"move_id":219},{"level":28,"move_id":117},{"level":37,"move_id":156}]},"tmhm_learnset":"00E01E588E190620","types":[6,5]},{"abilities":[68,62],"address":3302736,"base_stats":[80,125,75,85,40,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":214,"learnset":{"address":3313482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":30},{"level":11,"move_id":203},{"level":17,"move_id":31},{"level":23,"move_id":280},{"level":30,"move_id":68},{"level":37,"move_id":36},{"level":45,"move_id":179},{"level":53,"move_id":224}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,1]},{"abilities":[39,51],"address":3302764,"base_stats":[55,95,55,115,35,75],"catch_rate":60,"evolutions":[],"friendship":35,"id":215,"learnset":{"address":3313508,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":269},{"level":8,"move_id":98},{"level":15,"move_id":103},{"level":22,"move_id":185},{"level":29,"move_id":154},{"level":36,"move_id":97},{"level":43,"move_id":196},{"level":50,"move_id":163},{"level":57,"move_id":251},{"level":64,"move_id":232}]},"tmhm_learnset":"00B53F80EC533E69","types":[17,15]},{"abilities":[53,0],"address":3302792,"base_stats":[60,80,50,40,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":217}],"friendship":70,"id":216,"learnset":{"address":3313536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43F80CE130EB1","types":[0,0]},{"abilities":[62,0],"address":3302820,"base_stats":[90,130,75,55,75,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":217,"learnset":{"address":3313562,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":122},{"level":1,"move_id":154},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43FC0CE134EB1","types":[0,0]},{"abilities":[40,49],"address":3302848,"base_stats":[40,40,40,20,70,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":219}],"friendship":70,"id":218,"learnset":{"address":3313588,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":43,"move_id":157},{"level":50,"move_id":34}]},"tmhm_learnset":"00821E2584118620","types":[10,10]},{"abilities":[40,49],"address":3302876,"base_stats":[50,50,120,30,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":219,"learnset":{"address":3313612,"moves":[{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":1,"move_id":52},{"level":1,"move_id":88},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":48,"move_id":157},{"level":60,"move_id":34}]},"tmhm_learnset":"00A21E758611C620","types":[10,5]},{"abilities":[12,0],"address":3302904,"base_stats":[50,50,40,50,30,30],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":221}],"friendship":70,"id":220,"learnset":{"address":3313636,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":316},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":37,"move_id":54},{"level":46,"move_id":59},{"level":55,"move_id":133}]},"tmhm_learnset":"00A01E518E13B270","types":[15,4]},{"abilities":[12,0],"address":3302932,"base_stats":[100,100,80,50,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":221,"learnset":{"address":3313658,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":316},{"level":1,"move_id":181},{"level":1,"move_id":203},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":33,"move_id":31},{"level":42,"move_id":54},{"level":56,"move_id":59},{"level":70,"move_id":133}]},"tmhm_learnset":"00A01E518E13F270","types":[15,4]},{"abilities":[55,30],"address":3302960,"base_stats":[55,55,85,35,65,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":222,"learnset":{"address":3313682,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":106},{"level":12,"move_id":145},{"level":17,"move_id":105},{"level":17,"move_id":287},{"level":23,"move_id":61},{"level":28,"move_id":131},{"level":34,"move_id":350},{"level":39,"move_id":243},{"level":45,"move_id":246}]},"tmhm_learnset":"00B01E51BE1BB66C","types":[11,5]},{"abilities":[55,0],"address":3302988,"base_stats":[35,65,35,65,65,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":224}],"friendship":70,"id":223,"learnset":{"address":3313710,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":199},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":33,"move_id":116},{"level":44,"move_id":58},{"level":55,"move_id":63}]},"tmhm_learnset":"03103E2494137624","types":[11,11]},{"abilities":[21,0],"address":3303016,"base_stats":[75,105,75,45,105,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":224,"learnset":{"address":3313734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":132},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":25,"move_id":190},{"level":38,"move_id":116},{"level":54,"move_id":58},{"level":70,"move_id":63}]},"tmhm_learnset":"03103E2C94137724","types":[11,11]},{"abilities":[72,55],"address":3303044,"base_stats":[45,55,45,75,65,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":225,"learnset":{"address":3313760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":217}]},"tmhm_learnset":"00083E8084133265","types":[15,2]},{"abilities":[33,11],"address":3303072,"base_stats":[65,40,70,70,80,140],"catch_rate":25,"evolutions":[],"friendship":70,"id":226,"learnset":{"address":3313770,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":145},{"level":8,"move_id":48},{"level":15,"move_id":61},{"level":22,"move_id":36},{"level":29,"move_id":97},{"level":36,"move_id":17},{"level":43,"move_id":352},{"level":50,"move_id":109}]},"tmhm_learnset":"03101E8086133264","types":[11,2]},{"abilities":[51,5],"address":3303100,"base_stats":[65,80,140,70,40,70],"catch_rate":25,"evolutions":[],"friendship":70,"id":227,"learnset":{"address":3313794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":10,"move_id":28},{"level":13,"move_id":129},{"level":16,"move_id":97},{"level":26,"move_id":31},{"level":29,"move_id":314},{"level":32,"move_id":211},{"level":42,"move_id":191},{"level":45,"move_id":319}]},"tmhm_learnset":"008C7F9084110E30","types":[8,2]},{"abilities":[48,18],"address":3303128,"base_stats":[45,60,30,65,80,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":24,"species":229}],"friendship":35,"id":228,"learnset":{"address":3313820,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":25,"move_id":44},{"level":31,"move_id":316},{"level":37,"move_id":185},{"level":43,"move_id":53},{"level":49,"move_id":242}]},"tmhm_learnset":"00833F2CA4710E30","types":[17,10]},{"abilities":[48,18],"address":3303156,"base_stats":[75,90,50,95,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":229,"learnset":{"address":3313846,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":1,"move_id":336},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":27,"move_id":44},{"level":35,"move_id":316},{"level":43,"move_id":185},{"level":51,"move_id":53},{"level":59,"move_id":242}]},"tmhm_learnset":"00A33F2CA4714E30","types":[17,10]},{"abilities":[33,0],"address":3303184,"base_stats":[75,95,95,85,95,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":230,"learnset":{"address":3313872,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,16]},{"abilities":[53,0],"address":3303212,"base_stats":[90,60,60,40,40,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":25,"species":232}],"friendship":70,"id":231,"learnset":{"address":3313896,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":36},{"level":33,"move_id":205},{"level":41,"move_id":203},{"level":49,"move_id":38}]},"tmhm_learnset":"00A01E5086510630","types":[4,4]},{"abilities":[5,0],"address":3303240,"base_stats":[90,120,120,50,60,60],"catch_rate":60,"evolutions":[],"friendship":70,"id":232,"learnset":{"address":3313918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":30},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":31},{"level":33,"move_id":205},{"level":41,"move_id":229},{"level":49,"move_id":89}]},"tmhm_learnset":"00A01E5086514630","types":[4,4]},{"abilities":[36,0],"address":3303268,"base_stats":[85,80,90,60,105,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":233,"learnset":{"address":3313940,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":111},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[22,0],"address":3303296,"base_stats":[73,95,62,85,85,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":234,"learnset":{"address":3313966,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":43},{"level":13,"move_id":310},{"level":19,"move_id":95},{"level":25,"move_id":23},{"level":31,"move_id":28},{"level":37,"move_id":36},{"level":43,"move_id":109},{"level":49,"move_id":347}]},"tmhm_learnset":"0040BE03B7F38638","types":[0,0]},{"abilities":[20,0],"address":3303324,"base_stats":[55,20,35,75,20,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":235,"learnset":{"address":3313992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":166},{"level":11,"move_id":166},{"level":21,"move_id":166},{"level":31,"move_id":166},{"level":41,"move_id":166},{"level":51,"move_id":166},{"level":61,"move_id":166},{"level":71,"move_id":166},{"level":81,"move_id":166},{"level":91,"move_id":166}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[62,0],"address":3303352,"base_stats":[35,35,35,35,35,35],"catch_rate":75,"evolutions":[{"method":"LEVEL_ATK_LT_DEF","param":20,"species":107},{"method":"LEVEL_ATK_GT_DEF","param":20,"species":106},{"method":"LEVEL_ATK_EQ_DEF","param":20,"species":237}],"friendship":70,"id":236,"learnset":{"address":3314020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"00A03E00C61306A0","types":[1,1]},{"abilities":[22,0],"address":3303380,"base_stats":[50,95,95,70,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":237,"learnset":{"address":3314030,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":27},{"level":7,"move_id":116},{"level":13,"move_id":228},{"level":19,"move_id":98},{"level":20,"move_id":167},{"level":25,"move_id":229},{"level":31,"move_id":68},{"level":37,"move_id":97},{"level":43,"move_id":197},{"level":49,"move_id":283}]},"tmhm_learnset":"00A03E10CE1306A0","types":[1,1]},{"abilities":[12,0],"address":3303408,"base_stats":[45,30,15,65,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":124}],"friendship":70,"id":238,"learnset":{"address":3314058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":9,"move_id":186},{"level":13,"move_id":181},{"level":21,"move_id":93},{"level":25,"move_id":47},{"level":33,"move_id":212},{"level":37,"move_id":313},{"level":45,"move_id":94},{"level":49,"move_id":195},{"level":57,"move_id":59}]},"tmhm_learnset":"0040BE01B413B26C","types":[15,14]},{"abilities":[9,0],"address":3303436,"base_stats":[45,63,37,95,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":125}],"friendship":70,"id":239,"learnset":{"address":3314086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":33,"move_id":103},{"level":41,"move_id":85},{"level":49,"move_id":87}]},"tmhm_learnset":"00C03E02D5938221","types":[13,13]},{"abilities":[49,0],"address":3303464,"base_stats":[45,75,37,83,70,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":126}],"friendship":70,"id":240,"learnset":{"address":3314108,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":31,"move_id":241},{"level":37,"move_id":53},{"level":43,"move_id":109},{"level":49,"move_id":126}]},"tmhm_learnset":"00803E24D4510621","types":[10,10]},{"abilities":[47,0],"address":3303492,"base_stats":[95,80,105,100,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":241,"learnset":{"address":3314134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":8,"move_id":111},{"level":13,"move_id":23},{"level":19,"move_id":208},{"level":26,"move_id":117},{"level":34,"move_id":205},{"level":43,"move_id":34},{"level":53,"move_id":215}]},"tmhm_learnset":"00B01E52E7F37625","types":[0,0]},{"abilities":[30,32],"address":3303520,"base_stats":[255,10,10,55,75,135],"catch_rate":30,"evolutions":[],"friendship":140,"id":242,"learnset":{"address":3314160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":4,"move_id":39},{"level":7,"move_id":287},{"level":10,"move_id":135},{"level":13,"move_id":3},{"level":18,"move_id":107},{"level":23,"move_id":47},{"level":28,"move_id":121},{"level":33,"move_id":111},{"level":40,"move_id":113},{"level":47,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[46,0],"address":3303548,"base_stats":[90,85,75,115,115,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":243,"learnset":{"address":3314190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":84},{"level":21,"move_id":46},{"level":31,"move_id":98},{"level":41,"move_id":209},{"level":51,"move_id":115},{"level":61,"move_id":242},{"level":71,"move_id":87},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E138DD34638","types":[13,13]},{"abilities":[46,0],"address":3303576,"base_stats":[115,115,85,100,90,75],"catch_rate":3,"evolutions":[],"friendship":35,"id":244,"learnset":{"address":3314216,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":52},{"level":21,"move_id":46},{"level":31,"move_id":83},{"level":41,"move_id":23},{"level":51,"move_id":53},{"level":61,"move_id":207},{"level":71,"move_id":126},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E358C734638","types":[10,10]},{"abilities":[46,0],"address":3303604,"base_stats":[100,75,115,85,90,115],"catch_rate":3,"evolutions":[],"friendship":35,"id":245,"learnset":{"address":3314242,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":61},{"level":21,"move_id":240},{"level":31,"move_id":16},{"level":41,"move_id":62},{"level":51,"move_id":54},{"level":61,"move_id":243},{"level":71,"move_id":56},{"level":81,"move_id":347}]},"tmhm_learnset":"03940E118C53767C","types":[11,11]},{"abilities":[62,0],"address":3303632,"base_stats":[50,64,50,41,45,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":247}],"friendship":35,"id":246,"learnset":{"address":3314268,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":36,"move_id":184},{"level":43,"move_id":242},{"level":50,"move_id":89},{"level":57,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[61,0],"address":3303660,"base_stats":[70,84,70,51,65,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":248}],"friendship":35,"id":247,"learnset":{"address":3314294,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":56,"move_id":89},{"level":65,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[45,0],"address":3303688,"base_stats":[100,134,110,61,95,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":248,"learnset":{"address":3314320,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":61,"move_id":89},{"level":75,"move_id":63}]},"tmhm_learnset":"00B41FF6CFD37E37","types":[5,17]},{"abilities":[46,0],"address":3303716,"base_stats":[106,90,130,110,90,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":249,"learnset":{"address":3314346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":56},{"level":55,"move_id":240},{"level":66,"move_id":129},{"level":77,"move_id":177},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"03B8CE93B7DFF67C","types":[14,2]},{"abilities":[46,0],"address":3303744,"base_stats":[106,130,90,90,110,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":250,"learnset":{"address":3314374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":126},{"level":55,"move_id":241},{"level":66,"move_id":129},{"level":77,"move_id":221},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"00EA4EB7B7BFC638","types":[10,2]},{"abilities":[30,0],"address":3303772,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":251,"learnset":{"address":3314402,"moves":[{"level":1,"move_id":73},{"level":1,"move_id":93},{"level":1,"move_id":105},{"level":1,"move_id":215},{"level":10,"move_id":219},{"level":20,"move_id":246},{"level":30,"move_id":248},{"level":40,"move_id":226},{"level":50,"move_id":195}]},"tmhm_learnset":"00448E93B43FC62C","types":[14,12]},{"abilities":[0,0],"address":3303800,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":252,"learnset":{"address":3314422,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303828,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":253,"learnset":{"address":3314432,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303856,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":254,"learnset":{"address":3314442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303884,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":255,"learnset":{"address":3314452,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303912,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":256,"learnset":{"address":3314462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303940,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":257,"learnset":{"address":3314472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303968,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":258,"learnset":{"address":3314482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303996,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":259,"learnset":{"address":3314492,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304024,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":260,"learnset":{"address":3314502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304052,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":261,"learnset":{"address":3314512,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304080,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":262,"learnset":{"address":3314522,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304108,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":263,"learnset":{"address":3314532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304136,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":264,"learnset":{"address":3314542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304164,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":265,"learnset":{"address":3314552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304192,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":266,"learnset":{"address":3314562,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304220,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":267,"learnset":{"address":3314572,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304248,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":268,"learnset":{"address":3314582,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304276,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":269,"learnset":{"address":3314592,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304304,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":270,"learnset":{"address":3314602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304332,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":271,"learnset":{"address":3314612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304360,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":272,"learnset":{"address":3314622,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304388,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":273,"learnset":{"address":3314632,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304416,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":274,"learnset":{"address":3314642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304444,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":275,"learnset":{"address":3314652,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304472,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":276,"learnset":{"address":3314662,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3304500,"base_stats":[40,45,35,70,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":278}],"friendship":70,"id":277,"learnset":{"address":3314672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":228},{"level":21,"move_id":103},{"level":26,"move_id":72},{"level":31,"move_id":97},{"level":36,"move_id":21},{"level":41,"move_id":197},{"level":46,"move_id":202}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304528,"base_stats":[50,65,45,95,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":279}],"friendship":70,"id":278,"learnset":{"address":3314700,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":41,"move_id":21},{"level":47,"move_id":197},{"level":53,"move_id":206}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304556,"base_stats":[70,85,65,120,105,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":279,"learnset":{"address":3314730,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":43,"move_id":21},{"level":51,"move_id":197},{"level":59,"move_id":206}]},"tmhm_learnset":"00E41EC0CE7D4733","types":[12,12]},{"abilities":[66,0],"address":3304584,"base_stats":[45,60,40,45,70,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":281}],"friendship":70,"id":280,"learnset":{"address":3314760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":116},{"level":10,"move_id":52},{"level":16,"move_id":64},{"level":19,"move_id":28},{"level":25,"move_id":83},{"level":28,"move_id":98},{"level":34,"move_id":163},{"level":37,"move_id":119},{"level":43,"move_id":53}]},"tmhm_learnset":"00A61EE48C110620","types":[10,10]},{"abilities":[66,0],"address":3304612,"base_stats":[60,85,60,55,85,60],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":282}],"friendship":70,"id":281,"learnset":{"address":3314788,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":39,"move_id":163},{"level":43,"move_id":119},{"level":50,"move_id":327}]},"tmhm_learnset":"00A61EE4CC1106A1","types":[10,1]},{"abilities":[66,0],"address":3304640,"base_stats":[80,120,70,80,110,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":282,"learnset":{"address":3314818,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":36,"move_id":299},{"level":42,"move_id":163},{"level":49,"move_id":119},{"level":59,"move_id":327}]},"tmhm_learnset":"00A61EE4CE1146B1","types":[10,1]},{"abilities":[67,0],"address":3304668,"base_stats":[50,70,50,40,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":284}],"friendship":70,"id":283,"learnset":{"address":3314852,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":19,"move_id":193},{"level":24,"move_id":300},{"level":28,"move_id":36},{"level":33,"move_id":250},{"level":37,"move_id":182},{"level":42,"move_id":56},{"level":46,"move_id":283}]},"tmhm_learnset":"03B01E408C533264","types":[11,11]},{"abilities":[67,0],"address":3304696,"base_stats":[70,85,70,50,60,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":285}],"friendship":70,"id":284,"learnset":{"address":3314882,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":37,"move_id":330},{"level":42,"move_id":182},{"level":46,"move_id":89},{"level":53,"move_id":283}]},"tmhm_learnset":"03B01E408E533264","types":[11,4]},{"abilities":[67,0],"address":3304724,"base_stats":[100,110,90,60,85,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":285,"learnset":{"address":3314914,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":39,"move_id":330},{"level":46,"move_id":182},{"level":52,"move_id":89},{"level":61,"move_id":283}]},"tmhm_learnset":"03B01E40CE537275","types":[11,4]},{"abilities":[50,0],"address":3304752,"base_stats":[35,55,35,35,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":287}],"friendship":70,"id":286,"learnset":{"address":3314946,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":21,"move_id":46},{"level":25,"move_id":207},{"level":29,"move_id":184},{"level":33,"move_id":36},{"level":37,"move_id":269},{"level":41,"move_id":242},{"level":45,"move_id":168}]},"tmhm_learnset":"00813F00AC530E30","types":[17,17]},{"abilities":[22,0],"address":3304780,"base_stats":[70,90,70,70,60,60],"catch_rate":127,"evolutions":[],"friendship":70,"id":287,"learnset":{"address":3314978,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":336},{"level":1,"move_id":28},{"level":1,"move_id":44},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":22,"move_id":46},{"level":27,"move_id":207},{"level":32,"move_id":184},{"level":37,"move_id":36},{"level":42,"move_id":269},{"level":47,"move_id":242},{"level":52,"move_id":168}]},"tmhm_learnset":"00A13F00AC534E30","types":[17,17]},{"abilities":[53,0],"address":3304808,"base_stats":[38,30,41,60,30,41],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":289}],"friendship":70,"id":288,"learnset":{"address":3315010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":21,"move_id":300},{"level":25,"move_id":42},{"level":29,"move_id":343},{"level":33,"move_id":175},{"level":37,"move_id":156},{"level":41,"move_id":187}]},"tmhm_learnset":"00943E02ADD33624","types":[0,0]},{"abilities":[53,0],"address":3304836,"base_stats":[78,70,61,100,50,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":289,"learnset":{"address":3315040,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":23,"move_id":300},{"level":29,"move_id":154},{"level":35,"move_id":343},{"level":41,"move_id":163},{"level":47,"move_id":156},{"level":53,"move_id":187}]},"tmhm_learnset":"00B43E02ADD37634","types":[0,0]},{"abilities":[19,0],"address":3304864,"base_stats":[45,45,35,20,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_SILCOON","param":7,"species":291},{"method":"LEVEL_CASCOON","param":7,"species":293}],"friendship":70,"id":290,"learnset":{"address":3315070,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81},{"level":5,"move_id":40}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3304892,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":292}],"friendship":70,"id":291,"learnset":{"address":3315082,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[68,0],"address":3304920,"base_stats":[60,70,50,65,90,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":292,"learnset":{"address":3315094,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":10,"move_id":71},{"level":13,"move_id":16},{"level":17,"move_id":78},{"level":20,"move_id":234},{"level":24,"move_id":72},{"level":27,"move_id":18},{"level":31,"move_id":213},{"level":34,"move_id":318},{"level":38,"move_id":202}]},"tmhm_learnset":"00403E80B43D4620","types":[6,2]},{"abilities":[61,0],"address":3304948,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":294}],"friendship":70,"id":293,"learnset":{"address":3315122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[19,0],"address":3304976,"base_stats":[60,50,70,65,50,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":294,"learnset":{"address":3315134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":16},{"level":17,"move_id":182},{"level":20,"move_id":236},{"level":24,"move_id":60},{"level":27,"move_id":18},{"level":31,"move_id":113},{"level":34,"move_id":318},{"level":38,"move_id":92}]},"tmhm_learnset":"00403E88B435C620","types":[6,3]},{"abilities":[33,44],"address":3305004,"base_stats":[40,30,30,30,40,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":296}],"friendship":70,"id":295,"learnset":{"address":3315162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":21,"move_id":54},{"level":31,"move_id":240},{"level":43,"move_id":72}]},"tmhm_learnset":"00503E0084373764","types":[11,12]},{"abilities":[33,44],"address":3305032,"base_stats":[60,50,50,50,60,70],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":297}],"friendship":70,"id":296,"learnset":{"address":3315184,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":154},{"level":31,"move_id":346},{"level":37,"move_id":168},{"level":43,"move_id":253},{"level":49,"move_id":56}]},"tmhm_learnset":"03F03E00C4373764","types":[11,12]},{"abilities":[33,44],"address":3305060,"base_stats":[80,70,70,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":297,"learnset":{"address":3315212,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":45},{"level":1,"move_id":71},{"level":1,"move_id":267}]},"tmhm_learnset":"03F03E00C4377765","types":[11,12]},{"abilities":[34,48],"address":3305088,"base_stats":[40,40,50,30,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":299}],"friendship":70,"id":298,"learnset":{"address":3315222,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":21,"move_id":235},{"level":31,"move_id":241},{"level":43,"move_id":153}]},"tmhm_learnset":"00C01E00AC350720","types":[12,12]},{"abilities":[34,48],"address":3305116,"base_stats":[70,70,40,60,60,40],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":300}],"friendship":70,"id":299,"learnset":{"address":3315244,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":259},{"level":31,"move_id":185},{"level":37,"move_id":13},{"level":43,"move_id":207},{"level":49,"move_id":326}]},"tmhm_learnset":"00E43F40EC354720","types":[12,17]},{"abilities":[34,48],"address":3305144,"base_stats":[90,100,60,80,90,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":300,"learnset":{"address":3315272,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":1,"move_id":74},{"level":1,"move_id":267}]},"tmhm_learnset":"00E43FC0EC354720","types":[12,17]},{"abilities":[14,0],"address":3305172,"base_stats":[31,45,90,40,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_NINJASK","param":20,"species":302},{"method":"LEVEL_SHEDINJA","param":20,"species":303}],"friendship":70,"id":301,"learnset":{"address":3315282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":206},{"level":31,"move_id":189},{"level":38,"move_id":232},{"level":45,"move_id":91}]},"tmhm_learnset":"00440E90AC350620","types":[6,4]},{"abilities":[3,0],"address":3305200,"base_stats":[61,90,45,160,50,50],"catch_rate":120,"evolutions":[],"friendship":70,"id":302,"learnset":{"address":3315308,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":141},{"level":1,"move_id":28},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":20,"move_id":104},{"level":20,"move_id":210},{"level":20,"move_id":103},{"level":25,"move_id":14},{"level":31,"move_id":163},{"level":38,"move_id":97},{"level":45,"move_id":226}]},"tmhm_learnset":"00443E90AC354620","types":[6,2]},{"abilities":[25,0],"address":3305228,"base_stats":[1,90,45,40,30,30],"catch_rate":45,"evolutions":[],"friendship":70,"id":303,"learnset":{"address":3315340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":180},{"level":31,"move_id":109},{"level":38,"move_id":247},{"level":45,"move_id":288}]},"tmhm_learnset":"00442E90AC354620","types":[6,7]},{"abilities":[62,0],"address":3305256,"base_stats":[40,55,30,85,30,30],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":305}],"friendship":70,"id":304,"learnset":{"address":3315366,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":26,"move_id":283},{"level":34,"move_id":332},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[62,0],"address":3305284,"base_stats":[60,85,60,125,50,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":305,"learnset":{"address":3315390,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":98},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":28,"move_id":283},{"level":38,"move_id":332},{"level":49,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[27,0],"address":3305312,"base_stats":[60,40,60,35,40,60],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":23,"species":307}],"friendship":70,"id":306,"learnset":{"address":3315414,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":28,"move_id":77},{"level":36,"move_id":74},{"level":45,"move_id":202},{"level":54,"move_id":147}]},"tmhm_learnset":"00411E08843D0720","types":[12,12]},{"abilities":[27,0],"address":3305340,"base_stats":[60,130,80,70,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":307,"learnset":{"address":3315442,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":33},{"level":1,"move_id":78},{"level":1,"move_id":73},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":23,"move_id":183},{"level":28,"move_id":68},{"level":36,"move_id":327},{"level":45,"move_id":170},{"level":54,"move_id":223}]},"tmhm_learnset":"00E51E08C47D47A1","types":[12,1]},{"abilities":[20,0],"address":3305368,"base_stats":[60,60,60,60,60,60],"catch_rate":255,"evolutions":[],"friendship":70,"id":308,"learnset":{"address":3315472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":253},{"level":12,"move_id":185},{"level":16,"move_id":60},{"level":23,"move_id":95},{"level":27,"move_id":146},{"level":34,"move_id":298},{"level":38,"move_id":244},{"level":45,"move_id":38},{"level":49,"move_id":175},{"level":56,"move_id":37}]},"tmhm_learnset":"00E1BE42FC1B062D","types":[0,0]},{"abilities":[51,0],"address":3305396,"base_stats":[40,30,30,85,55,30],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":310}],"friendship":70,"id":309,"learnset":{"address":3315502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":31,"move_id":98},{"level":43,"move_id":228},{"level":55,"move_id":97}]},"tmhm_learnset":"00087E8284133264","types":[11,2]},{"abilities":[51,0],"address":3305424,"base_stats":[60,50,100,65,85,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":310,"learnset":{"address":3315524,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":346},{"level":1,"move_id":17},{"level":3,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":25,"move_id":182},{"level":33,"move_id":254},{"level":33,"move_id":256},{"level":47,"move_id":255},{"level":61,"move_id":56}]},"tmhm_learnset":"00187E8284137264","types":[11,2]},{"abilities":[33,0],"address":3305452,"base_stats":[40,30,32,65,50,52],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":312}],"friendship":70,"id":311,"learnset":{"address":3315552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":25,"move_id":61},{"level":31,"move_id":97},{"level":37,"move_id":54},{"level":37,"move_id":114}]},"tmhm_learnset":"00403E00A4373624","types":[6,11]},{"abilities":[22,0],"address":3305480,"base_stats":[70,60,62,60,80,82],"catch_rate":75,"evolutions":[],"friendship":70,"id":312,"learnset":{"address":3315576,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":98},{"level":1,"move_id":230},{"level":1,"move_id":346},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":26,"move_id":16},{"level":33,"move_id":184},{"level":40,"move_id":78},{"level":47,"move_id":318},{"level":53,"move_id":18}]},"tmhm_learnset":"00403E80A4377624","types":[6,2]},{"abilities":[41,12],"address":3305508,"base_stats":[130,70,35,60,70,35],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":40,"species":314}],"friendship":70,"id":313,"learnset":{"address":3315602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":150},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":41,"move_id":323},{"level":46,"move_id":133},{"level":50,"move_id":56}]},"tmhm_learnset":"03B01E4086133274","types":[11,11]},{"abilities":[41,12],"address":3305536,"base_stats":[170,90,45,60,90,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":314,"learnset":{"address":3315634,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":205},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":44,"move_id":323},{"level":52,"move_id":133},{"level":59,"move_id":56}]},"tmhm_learnset":"03B01E4086137274","types":[11,11]},{"abilities":[56,0],"address":3305564,"base_stats":[50,45,45,50,35,35],"catch_rate":255,"evolutions":[{"method":"ITEM","param":94,"species":316}],"friendship":70,"id":315,"learnset":{"address":3315666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":3,"move_id":39},{"level":7,"move_id":213},{"level":13,"move_id":47},{"level":15,"move_id":3},{"level":19,"move_id":274},{"level":25,"move_id":204},{"level":27,"move_id":185},{"level":31,"move_id":343},{"level":37,"move_id":215},{"level":39,"move_id":38}]},"tmhm_learnset":"00401E02ADFB362C","types":[0,0]},{"abilities":[56,0],"address":3305592,"base_stats":[70,65,65,70,55,55],"catch_rate":60,"evolutions":[],"friendship":70,"id":316,"learnset":{"address":3315696,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":213},{"level":1,"move_id":47},{"level":1,"move_id":3}]},"tmhm_learnset":"00E01E02ADFB762C","types":[0,0]},{"abilities":[16,0],"address":3305620,"base_stats":[60,90,70,40,60,120],"catch_rate":200,"evolutions":[],"friendship":70,"id":317,"learnset":{"address":3315706,"moves":[{"level":1,"move_id":168},{"level":1,"move_id":39},{"level":1,"move_id":310},{"level":1,"move_id":122},{"level":1,"move_id":10},{"level":4,"move_id":20},{"level":7,"move_id":185},{"level":12,"move_id":154},{"level":17,"move_id":60},{"level":24,"move_id":103},{"level":31,"move_id":163},{"level":40,"move_id":164},{"level":49,"move_id":246}]},"tmhm_learnset":"00E5BEE6EDF33625","types":[0,0]},{"abilities":[26,0],"address":3305648,"base_stats":[40,40,55,55,40,70],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":36,"species":319}],"friendship":70,"id":318,"learnset":{"address":3315734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":37,"move_id":322},{"level":45,"move_id":153}]},"tmhm_learnset":"00408E51BE339620","types":[4,14]},{"abilities":[26,0],"address":3305676,"base_stats":[60,70,105,75,70,120],"catch_rate":90,"evolutions":[],"friendship":70,"id":319,"learnset":{"address":3315764,"moves":[{"level":1,"move_id":100},{"level":1,"move_id":93},{"level":1,"move_id":106},{"level":1,"move_id":229},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":36,"move_id":63},{"level":42,"move_id":322},{"level":55,"move_id":153}]},"tmhm_learnset":"00E08E51BE33D620","types":[4,14]},{"abilities":[5,42],"address":3305704,"base_stats":[30,45,135,30,45,90],"catch_rate":255,"evolutions":[],"friendship":70,"id":320,"learnset":{"address":3315796,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":106},{"level":13,"move_id":88},{"level":16,"move_id":335},{"level":22,"move_id":86},{"level":28,"move_id":157},{"level":31,"move_id":201},{"level":37,"move_id":156},{"level":43,"move_id":192},{"level":46,"move_id":199}]},"tmhm_learnset":"00A01F5287910E20","types":[5,5]},{"abilities":[73,0],"address":3305732,"base_stats":[70,85,140,20,85,70],"catch_rate":90,"evolutions":[],"friendship":70,"id":321,"learnset":{"address":3315824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":4,"move_id":123},{"level":7,"move_id":174},{"level":14,"move_id":108},{"level":17,"move_id":83},{"level":20,"move_id":34},{"level":27,"move_id":182},{"level":30,"move_id":53},{"level":33,"move_id":334},{"level":40,"move_id":133},{"level":43,"move_id":175},{"level":46,"move_id":257}]},"tmhm_learnset":"00A21E2C84510620","types":[10,10]},{"abilities":[51,0],"address":3305760,"base_stats":[50,75,75,50,65,65],"catch_rate":45,"evolutions":[],"friendship":35,"id":322,"learnset":{"address":3315856,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":10},{"level":5,"move_id":193},{"level":9,"move_id":101},{"level":13,"move_id":310},{"level":17,"move_id":154},{"level":21,"move_id":252},{"level":25,"move_id":197},{"level":29,"move_id":185},{"level":33,"move_id":282},{"level":37,"move_id":109},{"level":41,"move_id":247},{"level":45,"move_id":212}]},"tmhm_learnset":"00C53FC2FC130E2D","types":[17,7]},{"abilities":[12,0],"address":3305788,"base_stats":[50,48,43,60,46,41],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":324}],"friendship":70,"id":323,"learnset":{"address":3315888,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":189},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":31,"move_id":89},{"level":36,"move_id":248},{"level":41,"move_id":90}]},"tmhm_learnset":"03101E5086133264","types":[11,4]},{"abilities":[12,0],"address":3305816,"base_stats":[110,78,73,60,76,71],"catch_rate":75,"evolutions":[],"friendship":70,"id":324,"learnset":{"address":3315918,"moves":[{"level":1,"move_id":321},{"level":1,"move_id":189},{"level":1,"move_id":300},{"level":1,"move_id":346},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":36,"move_id":89},{"level":46,"move_id":248},{"level":56,"move_id":90}]},"tmhm_learnset":"03B01E5086137264","types":[11,4]},{"abilities":[33,0],"address":3305844,"base_stats":[43,30,55,97,40,65],"catch_rate":225,"evolutions":[],"friendship":70,"id":325,"learnset":{"address":3315948,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":204},{"level":12,"move_id":55},{"level":16,"move_id":97},{"level":24,"move_id":36},{"level":28,"move_id":213},{"level":36,"move_id":186},{"level":40,"move_id":175},{"level":48,"move_id":219}]},"tmhm_learnset":"03101E00841B3264","types":[11,11]},{"abilities":[52,75],"address":3305872,"base_stats":[43,80,65,35,50,35],"catch_rate":205,"evolutions":[{"method":"LEVEL","param":30,"species":327}],"friendship":70,"id":326,"learnset":{"address":3315974,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":32,"move_id":269},{"level":35,"move_id":152},{"level":38,"move_id":14},{"level":44,"move_id":12}]},"tmhm_learnset":"01B41EC8CC133A64","types":[11,11]},{"abilities":[52,75],"address":3305900,"base_stats":[63,120,85,55,90,55],"catch_rate":155,"evolutions":[],"friendship":70,"id":327,"learnset":{"address":3316004,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":106},{"level":1,"move_id":11},{"level":1,"move_id":43},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":34,"move_id":269},{"level":39,"move_id":152},{"level":44,"move_id":14},{"level":52,"move_id":12}]},"tmhm_learnset":"03B41EC8CC137A64","types":[11,17]},{"abilities":[33,0],"address":3305928,"base_stats":[20,15,20,80,10,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":30,"species":329}],"friendship":70,"id":328,"learnset":{"address":3316034,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[63,0],"address":3305956,"base_stats":[95,60,79,81,100,125],"catch_rate":60,"evolutions":[],"friendship":70,"id":329,"learnset":{"address":3316048,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":5,"move_id":35},{"level":10,"move_id":346},{"level":15,"move_id":287},{"level":20,"move_id":352},{"level":25,"move_id":239},{"level":30,"move_id":105},{"level":35,"move_id":240},{"level":40,"move_id":56},{"level":45,"move_id":213},{"level":50,"move_id":219}]},"tmhm_learnset":"03101E00845B7264","types":[11,11]},{"abilities":[24,0],"address":3305984,"base_stats":[45,90,20,65,65,20],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":30,"species":331}],"friendship":35,"id":330,"learnset":{"address":3316078,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":31,"move_id":36},{"level":37,"move_id":207},{"level":43,"move_id":97}]},"tmhm_learnset":"03103F0084133A64","types":[11,17]},{"abilities":[24,0],"address":3306012,"base_stats":[70,120,40,95,95,40],"catch_rate":60,"evolutions":[],"friendship":35,"id":331,"learnset":{"address":3316104,"moves":[{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":1,"move_id":99},{"level":1,"move_id":116},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":33,"move_id":163},{"level":38,"move_id":269},{"level":43,"move_id":207},{"level":48,"move_id":130},{"level":53,"move_id":97}]},"tmhm_learnset":"03B03F4086137A74","types":[11,17]},{"abilities":[52,71],"address":3306040,"base_stats":[45,100,45,10,45,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":333}],"friendship":70,"id":332,"learnset":{"address":3316134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":41,"move_id":91},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A01E508E354620","types":[4,4]},{"abilities":[26,26],"address":3306068,"base_stats":[50,70,50,70,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":45,"species":334}],"friendship":70,"id":333,"learnset":{"address":3316158,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A85E508E354620","types":[4,16]},{"abilities":[26,26],"address":3306096,"base_stats":[80,100,80,100,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":334,"learnset":{"address":3316184,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":53,"move_id":201},{"level":65,"move_id":63}]},"tmhm_learnset":"00A85E748E754622","types":[4,16]},{"abilities":[47,62],"address":3306124,"base_stats":[72,60,30,25,20,30],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":24,"species":336}],"friendship":70,"id":335,"learnset":{"address":3316210,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":28,"move_id":282},{"level":31,"move_id":265},{"level":37,"move_id":187},{"level":40,"move_id":203},{"level":46,"move_id":69},{"level":49,"move_id":179}]},"tmhm_learnset":"00B01E40CE1306A1","types":[1,1]},{"abilities":[47,62],"address":3306152,"base_stats":[144,120,60,50,40,60],"catch_rate":200,"evolutions":[],"friendship":70,"id":336,"learnset":{"address":3316242,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":1,"move_id":28},{"level":1,"move_id":292},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":29,"move_id":282},{"level":33,"move_id":265},{"level":40,"move_id":187},{"level":44,"move_id":203},{"level":51,"move_id":69},{"level":55,"move_id":179}]},"tmhm_learnset":"00B01E40CE1346A1","types":[1,1]},{"abilities":[9,31],"address":3306180,"base_stats":[40,45,40,65,65,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":26,"species":338}],"friendship":70,"id":337,"learnset":{"address":3316274,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":28,"move_id":46},{"level":33,"move_id":44},{"level":36,"move_id":87},{"level":41,"move_id":268}]},"tmhm_learnset":"00603E0285D30230","types":[13,13]},{"abilities":[9,31],"address":3306208,"base_stats":[70,75,60,105,105,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":338,"learnset":{"address":3316304,"moves":[{"level":1,"move_id":86},{"level":1,"move_id":43},{"level":1,"move_id":336},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":31,"move_id":46},{"level":39,"move_id":44},{"level":45,"move_id":87},{"level":53,"move_id":268}]},"tmhm_learnset":"00603E0285D34230","types":[13,13]},{"abilities":[12,0],"address":3306236,"base_stats":[60,60,40,35,65,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":33,"species":340}],"friendship":70,"id":339,"learnset":{"address":3316334,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":35,"move_id":89},{"level":41,"move_id":53},{"level":49,"move_id":38}]},"tmhm_learnset":"00A21E748E110620","types":[10,4]},{"abilities":[40,0],"address":3306264,"base_stats":[70,100,70,40,105,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":340,"learnset":{"address":3316360,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":1,"move_id":52},{"level":1,"move_id":222},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":33,"move_id":157},{"level":37,"move_id":89},{"level":45,"move_id":284},{"level":55,"move_id":90}]},"tmhm_learnset":"00A21E748E114630","types":[10,4]},{"abilities":[47,0],"address":3306292,"base_stats":[70,40,50,25,55,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":342}],"friendship":70,"id":341,"learnset":{"address":3316388,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":59},{"level":49,"move_id":329}]},"tmhm_learnset":"03B01E4086533264","types":[15,11]},{"abilities":[47,0],"address":3306320,"base_stats":[90,60,70,45,75,70],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":44,"species":343}],"friendship":70,"id":342,"learnset":{"address":3316416,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":47,"move_id":59},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E4086533274","types":[15,11]},{"abilities":[47,0],"address":3306348,"base_stats":[110,80,90,65,95,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":343,"learnset":{"address":3316444,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":50,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"03B01E4086537274","types":[15,11]},{"abilities":[8,0],"address":3306376,"base_stats":[50,85,40,35,85,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":32,"species":345}],"friendship":35,"id":344,"learnset":{"address":3316472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":33,"move_id":191},{"level":37,"move_id":302},{"level":41,"move_id":178},{"level":45,"move_id":201}]},"tmhm_learnset":"00441E1084350721","types":[12,12]},{"abilities":[8,0],"address":3306404,"base_stats":[70,115,60,55,115,60],"catch_rate":60,"evolutions":[],"friendship":35,"id":345,"learnset":{"address":3316504,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":74},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":35,"move_id":191},{"level":41,"move_id":302},{"level":47,"move_id":178},{"level":53,"move_id":201}]},"tmhm_learnset":"00641E1084354721","types":[12,17]},{"abilities":[39,0],"address":3306432,"base_stats":[50,50,50,50,50,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":42,"species":347}],"friendship":70,"id":346,"learnset":{"address":3316536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":37,"move_id":258},{"level":43,"move_id":59}]},"tmhm_learnset":"00401E00A41BB264","types":[15,15]},{"abilities":[39,0],"address":3306460,"base_stats":[80,80,80,80,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":347,"learnset":{"address":3316564,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":1,"move_id":104},{"level":1,"move_id":44},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":42,"move_id":258},{"level":53,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"00401F00A61BFA64","types":[15,15]},{"abilities":[26,0],"address":3306488,"base_stats":[70,55,65,70,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":348,"learnset":{"address":3316594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":95},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":94},{"level":43,"move_id":248},{"level":49,"move_id":153}]},"tmhm_learnset":"00408E51B61BD228","types":[5,14]},{"abilities":[26,0],"address":3306516,"base_stats":[70,95,85,70,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":349,"learnset":{"address":3316620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":83},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":157},{"level":43,"move_id":76},{"level":49,"move_id":153}]},"tmhm_learnset":"00428E75B639C628","types":[5,14]},{"abilities":[47,37],"address":3306544,"base_stats":[50,20,40,20,20,40],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":183}],"friendship":70,"id":350,"learnset":{"address":3316646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":150},{"level":3,"move_id":204},{"level":6,"move_id":39},{"level":10,"move_id":145},{"level":15,"move_id":21},{"level":21,"move_id":55}]},"tmhm_learnset":"01101E0084533264","types":[0,0]},{"abilities":[47,20],"address":3306572,"base_stats":[60,25,35,60,70,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":352}],"friendship":70,"id":351,"learnset":{"address":3316666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":1,"move_id":150},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":34,"move_id":94},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":340}]},"tmhm_learnset":"0041BF03B4538E28","types":[14,14]},{"abilities":[47,20],"address":3306600,"base_stats":[80,45,65,80,90,110],"catch_rate":60,"evolutions":[],"friendship":70,"id":352,"learnset":{"address":3316696,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":149},{"level":1,"move_id":316},{"level":1,"move_id":60},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":37,"move_id":94},{"level":43,"move_id":156},{"level":43,"move_id":173},{"level":55,"move_id":340}]},"tmhm_learnset":"0041BF03B453CE29","types":[14,14]},{"abilities":[57,0],"address":3306628,"base_stats":[60,50,40,95,85,75],"catch_rate":200,"evolutions":[],"friendship":70,"id":353,"learnset":{"address":3316726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":313},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[58,0],"address":3306656,"base_stats":[60,40,50,95,75,85],"catch_rate":200,"evolutions":[],"friendship":70,"id":354,"learnset":{"address":3316756,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":204},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[52,22],"address":3306684,"base_stats":[50,85,85,50,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":355,"learnset":{"address":3316786,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":6,"move_id":313},{"level":11,"move_id":44},{"level":16,"move_id":230},{"level":21,"move_id":11},{"level":26,"move_id":185},{"level":31,"move_id":226},{"level":36,"move_id":242},{"level":41,"move_id":334},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255}]},"tmhm_learnset":"00A01F7CC4335E21","types":[8,8]},{"abilities":[74,0],"address":3306712,"base_stats":[30,40,55,60,40,55],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":37,"species":357}],"friendship":70,"id":356,"learnset":{"address":3316818,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":38,"move_id":244},{"level":42,"move_id":179},{"level":48,"move_id":105}]},"tmhm_learnset":"00E01E41F41386A9","types":[1,14]},{"abilities":[74,0],"address":3306740,"base_stats":[60,60,75,80,60,75],"catch_rate":90,"evolutions":[],"friendship":70,"id":357,"learnset":{"address":3316848,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":9},{"level":1,"move_id":8},{"level":1,"move_id":117},{"level":1,"move_id":96},{"level":1,"move_id":93},{"level":1,"move_id":197},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":40,"move_id":244},{"level":46,"move_id":179},{"level":54,"move_id":105}]},"tmhm_learnset":"00E01E41F413C6A9","types":[1,14]},{"abilities":[30,0],"address":3306768,"base_stats":[45,40,60,50,40,75],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":359}],"friendship":70,"id":358,"learnset":{"address":3316884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":38,"move_id":119},{"level":41,"move_id":287},{"level":48,"move_id":195}]},"tmhm_learnset":"00087E80843B1620","types":[0,2]},{"abilities":[30,0],"address":3306796,"base_stats":[75,70,90,80,70,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":359,"learnset":{"address":3316912,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":310},{"level":1,"move_id":47},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":35,"move_id":225},{"level":40,"move_id":349},{"level":45,"move_id":287},{"level":54,"move_id":195},{"level":59,"move_id":143}]},"tmhm_learnset":"00887EA4867B5632","types":[16,2]},{"abilities":[23,0],"address":3306824,"base_stats":[95,23,48,23,23,48],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":15,"species":202}],"friendship":70,"id":360,"learnset":{"address":3316944,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":150},{"level":1,"move_id":204},{"level":1,"move_id":227},{"level":15,"move_id":68},{"level":15,"move_id":243},{"level":15,"move_id":219},{"level":15,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[26,0],"address":3306852,"base_stats":[20,40,90,25,30,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":362}],"friendship":35,"id":361,"learnset":{"address":3316962,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":38,"move_id":261},{"level":45,"move_id":212},{"level":49,"move_id":248}]},"tmhm_learnset":"0041BF00B4133E28","types":[7,7]},{"abilities":[46,0],"address":3306880,"base_stats":[40,70,130,25,60,130],"catch_rate":90,"evolutions":[],"friendship":35,"id":362,"learnset":{"address":3316990,"moves":[{"level":1,"move_id":20},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":1,"move_id":50},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":37,"move_id":325},{"level":41,"move_id":261},{"level":51,"move_id":212},{"level":58,"move_id":248}]},"tmhm_learnset":"00E1BF40B6137E29","types":[7,7]},{"abilities":[30,38],"address":3306908,"base_stats":[50,60,45,65,100,80],"catch_rate":150,"evolutions":[],"friendship":70,"id":363,"learnset":{"address":3317020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":5,"move_id":74},{"level":9,"move_id":40},{"level":13,"move_id":78},{"level":17,"move_id":72},{"level":21,"move_id":73},{"level":25,"move_id":345},{"level":29,"move_id":320},{"level":33,"move_id":202},{"level":37,"move_id":230},{"level":41,"move_id":275},{"level":45,"move_id":92},{"level":49,"move_id":80},{"level":53,"move_id":312},{"level":57,"move_id":235}]},"tmhm_learnset":"00441E08A4350720","types":[12,3]},{"abilities":[54,0],"address":3306936,"base_stats":[60,60,60,30,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":365}],"friendship":70,"id":364,"learnset":{"address":3317058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E5B336A5","types":[0,0]},{"abilities":[72,0],"address":3306964,"base_stats":[80,80,80,90,55,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":366}],"friendship":70,"id":365,"learnset":{"address":3317082,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":116},{"level":1,"move_id":227},{"level":1,"move_id":253},{"level":7,"move_id":227},{"level":13,"move_id":253},{"level":19,"move_id":154},{"level":25,"move_id":203},{"level":31,"move_id":163},{"level":37,"move_id":68},{"level":43,"move_id":264},{"level":49,"move_id":179}]},"tmhm_learnset":"00A41EA6E7B33EB5","types":[0,0]},{"abilities":[54,0],"address":3306992,"base_stats":[150,160,100,100,95,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":366,"learnset":{"address":3317108,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":1,"move_id":227},{"level":1,"move_id":303},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":36,"move_id":207},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E7B37EB5","types":[0,0]},{"abilities":[64,60],"address":3307020,"base_stats":[70,43,53,40,43,53],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":26,"species":368}],"friendship":70,"id":367,"learnset":{"address":3317134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":28,"move_id":92},{"level":34,"move_id":254},{"level":34,"move_id":255},{"level":34,"move_id":256},{"level":39,"move_id":188}]},"tmhm_learnset":"00A11E0AA4371724","types":[3,3]},{"abilities":[64,60],"address":3307048,"base_stats":[100,73,83,55,73,83],"catch_rate":75,"evolutions":[],"friendship":70,"id":368,"learnset":{"address":3317164,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":281},{"level":1,"move_id":139},{"level":1,"move_id":124},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":26,"move_id":34},{"level":31,"move_id":92},{"level":40,"move_id":254},{"level":40,"move_id":255},{"level":40,"move_id":256},{"level":48,"move_id":188}]},"tmhm_learnset":"00A11E0AA4375724","types":[3,3]},{"abilities":[34,0],"address":3307076,"base_stats":[99,68,83,51,72,87],"catch_rate":200,"evolutions":[],"friendship":70,"id":369,"learnset":{"address":3317196,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":16},{"level":7,"move_id":74},{"level":11,"move_id":75},{"level":17,"move_id":23},{"level":21,"move_id":230},{"level":27,"move_id":18},{"level":31,"move_id":345},{"level":37,"move_id":34},{"level":41,"move_id":76},{"level":47,"move_id":235}]},"tmhm_learnset":"00EC5E80863D4730","types":[12,2]},{"abilities":[43,0],"address":3307104,"base_stats":[64,51,23,28,51,23],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":20,"species":371}],"friendship":70,"id":370,"learnset":{"address":3317224,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":21,"move_id":48},{"level":25,"move_id":23},{"level":31,"move_id":103},{"level":35,"move_id":46},{"level":41,"move_id":156},{"level":41,"move_id":214},{"level":45,"move_id":304}]},"tmhm_learnset":"00001E26A4333634","types":[0,0]},{"abilities":[43,0],"address":3307132,"base_stats":[84,71,43,48,71,43],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":40,"species":372}],"friendship":70,"id":371,"learnset":{"address":3317254,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":43,"move_id":46},{"level":51,"move_id":156},{"level":51,"move_id":214},{"level":57,"move_id":304}]},"tmhm_learnset":"00A21F26E6333E34","types":[0,0]},{"abilities":[43,0],"address":3307160,"base_stats":[104,91,63,68,91,63],"catch_rate":45,"evolutions":[],"friendship":70,"id":372,"learnset":{"address":3317284,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":40,"move_id":63},{"level":45,"move_id":46},{"level":55,"move_id":156},{"level":55,"move_id":214},{"level":63,"move_id":304}]},"tmhm_learnset":"00A21F26E6337E34","types":[0,0]},{"abilities":[75,0],"address":3307188,"base_stats":[35,64,85,32,74,55],"catch_rate":255,"evolutions":[{"method":"ITEM","param":192,"species":374},{"method":"ITEM","param":193,"species":375}],"friendship":70,"id":373,"learnset":{"address":3317316,"moves":[{"level":1,"move_id":128},{"level":1,"move_id":55},{"level":1,"move_id":250},{"level":1,"move_id":334}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,0],"address":3307216,"base_stats":[55,104,105,52,94,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":374,"learnset":{"address":3317326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":44},{"level":15,"move_id":103},{"level":22,"move_id":352},{"level":29,"move_id":184},{"level":36,"move_id":242},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03111E4084137264","types":[11,11]},{"abilities":[33,0],"address":3307244,"base_stats":[55,84,105,52,114,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":375,"learnset":{"address":3317350,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":93},{"level":15,"move_id":97},{"level":22,"move_id":352},{"level":29,"move_id":133},{"level":36,"move_id":94},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03101E00B41B7264","types":[11,11]},{"abilities":[46,0],"address":3307272,"base_stats":[65,130,60,75,75,60],"catch_rate":30,"evolutions":[],"friendship":35,"id":376,"learnset":{"address":3317374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":5,"move_id":43},{"level":9,"move_id":269},{"level":13,"move_id":98},{"level":17,"move_id":13},{"level":21,"move_id":44},{"level":26,"move_id":14},{"level":31,"move_id":104},{"level":36,"move_id":163},{"level":41,"move_id":248},{"level":46,"move_id":195}]},"tmhm_learnset":"00E53FB6A5D37E6C","types":[17,17]},{"abilities":[15,0],"address":3307300,"base_stats":[44,75,35,45,63,33],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":37,"species":378}],"friendship":35,"id":377,"learnset":{"address":3317404,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":282},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":37,"move_id":185},{"level":44,"move_id":247},{"level":49,"move_id":289},{"level":56,"move_id":288}]},"tmhm_learnset":"0041BF02B5930E28","types":[7,7]},{"abilities":[15,0],"address":3307328,"base_stats":[64,115,65,65,83,63],"catch_rate":45,"evolutions":[],"friendship":35,"id":378,"learnset":{"address":3317432,"moves":[{"level":1,"move_id":282},{"level":1,"move_id":103},{"level":1,"move_id":101},{"level":1,"move_id":174},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":39,"move_id":185},{"level":48,"move_id":247},{"level":55,"move_id":289},{"level":64,"move_id":288}]},"tmhm_learnset":"0041BF02B5934E28","types":[7,7]},{"abilities":[61,0],"address":3307356,"base_stats":[73,100,60,65,100,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":379,"learnset":{"address":3317460,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":7,"move_id":122},{"level":10,"move_id":44},{"level":16,"move_id":342},{"level":19,"move_id":103},{"level":25,"move_id":137},{"level":28,"move_id":242},{"level":34,"move_id":305},{"level":37,"move_id":207},{"level":43,"move_id":114}]},"tmhm_learnset":"00A13E0C8E570E20","types":[3,3]},{"abilities":[17,0],"address":3307384,"base_stats":[73,115,60,90,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":380,"learnset":{"address":3317488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":43},{"level":7,"move_id":98},{"level":10,"move_id":14},{"level":13,"move_id":210},{"level":19,"move_id":163},{"level":25,"move_id":228},{"level":31,"move_id":306},{"level":37,"move_id":269},{"level":46,"move_id":197},{"level":55,"move_id":206}]},"tmhm_learnset":"00A03EA6EDF73E35","types":[0,0]},{"abilities":[33,69],"address":3307412,"base_stats":[100,90,130,55,45,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":381,"learnset":{"address":3317518,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":8,"move_id":55},{"level":15,"move_id":317},{"level":22,"move_id":281},{"level":29,"move_id":36},{"level":36,"move_id":300},{"level":43,"move_id":246},{"level":50,"move_id":156},{"level":57,"move_id":38},{"level":64,"move_id":56}]},"tmhm_learnset":"03901E50861B726C","types":[11,5]},{"abilities":[5,69],"address":3307440,"base_stats":[50,70,100,30,40,40],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":32,"species":383}],"friendship":35,"id":382,"learnset":{"address":3317546,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":34,"move_id":182},{"level":39,"move_id":319},{"level":44,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307468,"base_stats":[60,90,140,40,50,50],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":42,"species":384}],"friendship":35,"id":383,"learnset":{"address":3317578,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":45,"move_id":319},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307496,"base_stats":[70,110,180,50,60,60],"catch_rate":45,"evolutions":[],"friendship":35,"id":384,"learnset":{"address":3317610,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":50,"move_id":319},{"level":63,"move_id":38}]},"tmhm_learnset":"00B41EF6CFF37E37","types":[8,5]},{"abilities":[59,0],"address":3307524,"base_stats":[70,70,70,70,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":385,"learnset":{"address":3317642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":10,"move_id":55},{"level":10,"move_id":52},{"level":10,"move_id":181},{"level":20,"move_id":240},{"level":20,"move_id":241},{"level":20,"move_id":258},{"level":30,"move_id":311}]},"tmhm_learnset":"00403E36A5B33664","types":[0,0]},{"abilities":[35,68],"address":3307552,"base_stats":[65,73,55,85,47,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":386,"learnset":{"address":3317666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":109},{"level":9,"move_id":104},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":294},{"level":25,"move_id":324},{"level":29,"move_id":182},{"level":33,"move_id":270},{"level":37,"move_id":38}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[12,0],"address":3307580,"base_stats":[65,47,55,85,73,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":387,"learnset":{"address":3317694,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":230},{"level":9,"move_id":204},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":273},{"level":25,"move_id":227},{"level":29,"move_id":260},{"level":33,"move_id":270},{"level":37,"move_id":343}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[21,0],"address":3307608,"base_stats":[66,41,77,23,61,87],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":389}],"friendship":70,"id":388,"learnset":{"address":3317722,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":43,"move_id":246},{"level":50,"move_id":254},{"level":50,"move_id":255},{"level":50,"move_id":256}]},"tmhm_learnset":"00001E1884350720","types":[5,12]},{"abilities":[21,0],"address":3307636,"base_stats":[86,81,97,43,81,107],"catch_rate":45,"evolutions":[],"friendship":70,"id":389,"learnset":{"address":3317750,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":132},{"level":1,"move_id":51},{"level":1,"move_id":275},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":48,"move_id":246},{"level":60,"move_id":254},{"level":60,"move_id":255},{"level":60,"move_id":256}]},"tmhm_learnset":"00A01E5886354720","types":[5,12]},{"abilities":[4,0],"address":3307664,"base_stats":[45,95,50,75,40,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":391}],"friendship":70,"id":390,"learnset":{"address":3317778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":43,"move_id":210},{"level":49,"move_id":163},{"level":55,"move_id":350}]},"tmhm_learnset":"00841ED0CC110624","types":[5,6]},{"abilities":[4,0],"address":3307692,"base_stats":[75,125,100,45,70,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":391,"learnset":{"address":3317806,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":300},{"level":1,"move_id":55},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":46,"move_id":210},{"level":55,"move_id":163},{"level":64,"move_id":350}]},"tmhm_learnset":"00A41ED0CE514624","types":[5,6]},{"abilities":[28,36],"address":3307720,"base_stats":[28,25,25,40,45,35],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":20,"species":393}],"friendship":35,"id":392,"learnset":{"address":3317834,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":45},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":31,"move_id":286},{"level":36,"move_id":248},{"level":41,"move_id":95},{"level":46,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307748,"base_stats":[38,35,35,50,65,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":394}],"friendship":35,"id":393,"learnset":{"address":3317862,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":40,"move_id":248},{"level":47,"move_id":95},{"level":54,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307776,"base_stats":[68,65,65,80,125,115],"catch_rate":45,"evolutions":[],"friendship":35,"id":394,"learnset":{"address":3317890,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":42,"move_id":248},{"level":51,"move_id":95},{"level":60,"move_id":138}]},"tmhm_learnset":"0041BF03B49BCE28","types":[14,14]},{"abilities":[69,0],"address":3307804,"base_stats":[45,75,60,50,40,30],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":396}],"friendship":35,"id":395,"learnset":{"address":3317918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":33,"move_id":225},{"level":37,"move_id":184},{"level":41,"move_id":242},{"level":49,"move_id":337},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[69,0],"address":3307832,"base_stats":[65,95,100,50,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":50,"species":397}],"friendship":35,"id":396,"learnset":{"address":3317948,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":56,"move_id":242},{"level":69,"move_id":337},{"level":78,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[22,0],"address":3307860,"base_stats":[95,135,80,100,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":397,"learnset":{"address":3317980,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":50,"move_id":19},{"level":61,"move_id":242},{"level":79,"move_id":337},{"level":93,"move_id":38}]},"tmhm_learnset":"00AC5EE4C6534632","types":[16,2]},{"abilities":[29,0],"address":3307888,"base_stats":[40,55,80,30,35,60],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":20,"species":399}],"friendship":35,"id":398,"learnset":{"address":3318014,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36}]},"tmhm_learnset":"0000000000000000","types":[8,14]},{"abilities":[29,0],"address":3307916,"base_stats":[60,75,100,50,55,80],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":45,"species":400}],"friendship":35,"id":399,"learnset":{"address":3318024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":50,"move_id":309},{"level":56,"move_id":97},{"level":62,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307944,"base_stats":[80,135,130,70,95,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":400,"learnset":{"address":3318052,"moves":[{"level":1,"move_id":36},{"level":1,"move_id":93},{"level":1,"move_id":232},{"level":1,"move_id":184},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":55,"move_id":309},{"level":66,"move_id":97},{"level":77,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307972,"base_stats":[80,100,200,50,50,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":401,"learnset":{"address":3318080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":153},{"level":9,"move_id":88},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E52CF994621","types":[5,5]},{"abilities":[29,0],"address":3308000,"base_stats":[80,50,100,50,100,200],"catch_rate":3,"evolutions":[],"friendship":35,"id":402,"learnset":{"address":3318106,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":196},{"level":1,"move_id":153},{"level":9,"move_id":196},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E02C79B7261","types":[15,15]},{"abilities":[29,0],"address":3308028,"base_stats":[80,75,150,50,75,150],"catch_rate":3,"evolutions":[],"friendship":35,"id":403,"learnset":{"address":3318132,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":232},{"level":1,"move_id":153},{"level":9,"move_id":232},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00ED2C79B4621","types":[8,8]},{"abilities":[2,0],"address":3308056,"base_stats":[100,100,90,90,150,140],"catch_rate":5,"evolutions":[],"friendship":0,"id":404,"learnset":{"address":3318160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":352},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":34},{"level":30,"move_id":347},{"level":35,"move_id":58},{"level":45,"move_id":56},{"level":50,"move_id":156},{"level":60,"move_id":329},{"level":65,"move_id":38},{"level":75,"move_id":323}]},"tmhm_learnset":"03B00E42C79B727C","types":[11,11]},{"abilities":[70,0],"address":3308084,"base_stats":[100,150,140,90,100,90],"catch_rate":5,"evolutions":[],"friendship":0,"id":405,"learnset":{"address":3318190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":341},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":163},{"level":30,"move_id":339},{"level":35,"move_id":89},{"level":45,"move_id":126},{"level":50,"move_id":156},{"level":60,"move_id":90},{"level":65,"move_id":76},{"level":75,"move_id":284}]},"tmhm_learnset":"00A60EF6CFF946B2","types":[4,4]},{"abilities":[77,0],"address":3308112,"base_stats":[105,150,90,95,150,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":406,"learnset":{"address":3318220,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":239},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":337},{"level":30,"move_id":349},{"level":35,"move_id":242},{"level":45,"move_id":19},{"level":50,"move_id":156},{"level":60,"move_id":245},{"level":65,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BA0EB6C7F376B6","types":[16,2]},{"abilities":[26,0],"address":3308140,"base_stats":[80,80,90,110,110,130],"catch_rate":3,"evolutions":[],"friendship":90,"id":407,"learnset":{"address":3318250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":273},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":346},{"level":30,"move_id":287},{"level":35,"move_id":296},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":204}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[26,0],"address":3308168,"base_stats":[80,90,80,110,130,110],"catch_rate":3,"evolutions":[],"friendship":90,"id":408,"learnset":{"address":3318280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":262},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":182},{"level":30,"move_id":287},{"level":35,"move_id":295},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":349}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[32,0],"address":3308196,"base_stats":[100,100,100,100,100,100],"catch_rate":3,"evolutions":[],"friendship":100,"id":409,"learnset":{"address":3318310,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":273},{"level":1,"move_id":93},{"level":5,"move_id":156},{"level":10,"move_id":129},{"level":15,"move_id":270},{"level":20,"move_id":94},{"level":25,"move_id":287},{"level":30,"move_id":156},{"level":35,"move_id":38},{"level":40,"move_id":248},{"level":45,"move_id":322},{"level":50,"move_id":353}]},"tmhm_learnset":"00408E93B59BC62C","types":[8,14]},{"abilities":[46,0],"address":3308224,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":410,"learnset":{"address":3318340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":35},{"level":5,"move_id":101},{"level":10,"move_id":104},{"level":15,"move_id":282},{"level":20,"move_id":228},{"level":25,"move_id":94},{"level":30,"move_id":129},{"level":35,"move_id":97},{"level":40,"move_id":105},{"level":45,"move_id":354},{"level":50,"move_id":245}]},"tmhm_learnset":"00E58FC3F5BBDE2D","types":[14,14]},{"abilities":[26,0],"address":3308252,"base_stats":[65,50,70,65,95,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":411,"learnset":{"address":3318370,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":6,"move_id":45},{"level":9,"move_id":310},{"level":14,"move_id":93},{"level":17,"move_id":36},{"level":22,"move_id":253},{"level":25,"move_id":281},{"level":30,"move_id":149},{"level":33,"move_id":38},{"level":38,"move_id":215},{"level":41,"move_id":219},{"level":46,"move_id":94}]},"tmhm_learnset":"00419F03B41B8E28","types":[14,14]}],"tmhm_moves":[264,337,352,347,46,92,258,339,331,237,241,269,58,59,63,113,182,240,202,219,218,76,231,85,87,89,216,91,94,247,280,104,115,351,53,188,201,126,317,332,259,263,290,156,213,168,211,285,289,315,15,19,57,70,148,249,127,291],"trainers":[{"address":3230072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[],"party_address":4160749568,"script_address":0},{"address":3230112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":74}],"party_address":3211124,"script_address":2304511},{"address":3230152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":286}],"party_address":3211132,"script_address":2321901},{"address":3230192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":330}],"party_address":3211140,"script_address":2323326},{"address":3230232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211156,"script_address":2323373},{"address":3230272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211164,"script_address":2324386},{"address":3230312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":286}],"party_address":3211172,"script_address":2326808},{"address":3230352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211180,"script_address":2326839},{"address":3230392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":41}],"party_address":3211188,"script_address":2328040},{"address":3230432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":315},{"level":26,"species":286},{"level":26,"species":288},{"level":26,"species":295},{"level":26,"species":298},{"level":26,"species":304}],"party_address":3211196,"script_address":2314251},{"address":3230472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":286}],"party_address":3211244,"script_address":0},{"address":3230512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":300}],"party_address":3211252,"script_address":2067580},{"address":3230552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":310},{"level":30,"species":178}],"party_address":3211268,"script_address":2068523},{"address":3230592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":380},{"level":30,"species":379}],"party_address":3211284,"script_address":2068554},{"address":3230632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211300,"script_address":2328071},{"address":3230672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3211308,"script_address":2069620},{"address":3230712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":286}],"party_address":3211316,"script_address":0},{"address":3230752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3211324,"script_address":2570959},{"address":3230792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":286},{"level":27,"species":330}],"party_address":3211340,"script_address":2572093},{"address":3230832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":286},{"level":26,"species":41},{"level":26,"species":330}],"party_address":3211356,"script_address":2572124},{"address":3230872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":330}],"party_address":3211380,"script_address":2157889},{"address":3230912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":41},{"level":14,"species":330}],"party_address":3211388,"script_address":2157948},{"address":3230952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":339}],"party_address":3211404,"script_address":2254636},{"address":3230992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211412,"script_address":2317522},{"address":3231032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211420,"script_address":2317553},{"address":3231072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":286},{"level":30,"species":330}],"party_address":3211428,"script_address":2317584},{"address":3231112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330}],"party_address":3211444,"script_address":2570990},{"address":3231152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211452,"script_address":2323414},{"address":3231192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211460,"script_address":2324427},{"address":3231232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":335},{"level":30,"species":67}],"party_address":3211468,"script_address":2068492},{"address":3231272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":287},{"level":34,"species":42}],"party_address":3211484,"script_address":2324250},{"address":3231312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":336}],"party_address":3211500,"script_address":2312702},{"address":3231352,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330},{"level":28,"species":287}],"party_address":3211508,"script_address":2572155},{"address":3231392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":331},{"level":37,"species":287}],"party_address":3211524,"script_address":2327156},{"address":3231432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":287},{"level":41,"species":169},{"level":43,"species":331}],"party_address":3211540,"script_address":2328478},{"address":3231472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":351}],"party_address":3211564,"script_address":2312671},{"address":3231512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211572,"script_address":2026085},{"address":3231552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":363},{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211588,"script_address":2058784},{"address":3231592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,0,0,0],"species":357},{"level":43,"moves":[29,89,0,0],"species":319}],"party_address":3211612,"script_address":2335547},{"address":3231632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":363},{"level":26,"species":44}],"party_address":3211644,"script_address":2068148},{"address":3231672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":363}],"party_address":3211660,"script_address":0},{"address":3231712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":306},{"level":28,"species":44},{"level":28,"species":363}],"party_address":3211676,"script_address":0},{"address":3231752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":306},{"level":31,"species":44},{"level":31,"species":363}],"party_address":3211700,"script_address":0},{"address":3231792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307},{"level":34,"species":44},{"level":34,"species":363}],"party_address":3211724,"script_address":0},{"address":3231832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,163,28,40],"species":28}],"party_address":3211748,"script_address":2046490},{"address":3231872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[60,120,201,246],"species":318},{"level":27,"moves":[91,163,28,40],"species":27},{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211764,"script_address":2065682},{"address":3231912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[91,163,28,40],"species":27},{"level":25,"moves":[91,163,28,40],"species":28}],"party_address":3211812,"script_address":2033540},{"address":3231952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211844,"script_address":0},{"address":3231992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[91,163,28,40],"species":28}],"party_address":3211860,"script_address":0},{"address":3232032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[91,163,28,40],"species":28}],"party_address":3211876,"script_address":0},{"address":3232072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[91,163,28,40],"species":28}],"party_address":3211892,"script_address":0},{"address":3232112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":81},{"level":17,"species":370}],"party_address":3211908,"script_address":0},{"address":3232152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":81},{"level":27,"species":371}],"party_address":3211924,"script_address":0},{"address":3232192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":82},{"level":30,"species":371}],"party_address":3211940,"script_address":0},{"address":3232232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":82},{"level":33,"species":371}],"party_address":3211956,"script_address":0},{"address":3232272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82},{"level":36,"species":371}],"party_address":3211972,"script_address":0},{"address":3232312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[49,86,63,85],"species":82},{"level":39,"moves":[54,23,48,48],"species":372}],"party_address":3211988,"script_address":0},{"address":3232352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":350}],"party_address":3212020,"script_address":2036011},{"address":3232392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212036,"script_address":2036121},{"address":3232432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212044,"script_address":2036152},{"address":3232472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183},{"level":26,"species":183}],"party_address":3212052,"script_address":0},{"address":3232512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":183},{"level":29,"species":183}],"party_address":3212068,"script_address":0},{"address":3232552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":183},{"level":32,"species":183}],"party_address":3212084,"script_address":0},{"address":3232592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":35,"species":184}],"party_address":3212100,"script_address":0},{"address":3232632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":13,"moves":[28,29,39,57],"species":288}],"party_address":3212116,"script_address":2035901},{"address":3232672,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":183}],"party_address":3212132,"script_address":2544001},{"address":3232712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212148,"script_address":2339831},{"address":3232752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[28,42,39,57],"species":289}],"party_address":3212156,"script_address":0},{"address":3232792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[28,42,39,57],"species":289}],"party_address":3212172,"script_address":0},{"address":3232832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[28,42,39,57],"species":289}],"party_address":3212188,"script_address":0},{"address":3232872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[28,42,39,57],"species":289}],"party_address":3212204,"script_address":0},{"address":3232912,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[98,97,17,0],"species":305}],"party_address":3212220,"script_address":2131164},{"address":3232952,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[42,146,8,0],"species":308}],"party_address":3212236,"script_address":2131228},{"address":3232992,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[47,68,247,0],"species":364}],"party_address":3212252,"script_address":2131292},{"address":3233032,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[116,163,0,0],"species":365}],"party_address":3212268,"script_address":2131356},{"address":3233072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[116,98,17,27],"species":305},{"level":28,"moves":[44,91,185,72],"species":332},{"level":28,"moves":[205,250,54,96],"species":313},{"level":28,"moves":[85,48,86,49],"species":82},{"level":28,"moves":[202,185,104,207],"species":300}],"party_address":3212284,"script_address":2068117},{"address":3233112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":322},{"level":44,"species":357},{"level":44,"species":331}],"party_address":3212364,"script_address":2565920},{"address":3233152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":355},{"level":46,"species":121}],"party_address":3212388,"script_address":2565982},{"address":3233192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":337},{"level":17,"species":313},{"level":17,"species":335}],"party_address":3212404,"script_address":2046693},{"address":3233232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":345},{"level":43,"species":310}],"party_address":3212428,"script_address":2332685},{"address":3233272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":82},{"level":43,"species":89}],"party_address":3212444,"script_address":2332716},{"address":3233312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":305},{"level":42,"species":355},{"level":42,"species":64}],"party_address":3212460,"script_address":2334375},{"address":3233352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":85},{"level":42,"species":64},{"level":42,"species":101},{"level":42,"species":300}],"party_address":3212484,"script_address":2335423},{"address":3233392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":317},{"level":42,"species":75},{"level":42,"species":314}],"party_address":3212516,"script_address":2335454},{"address":3233432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":337},{"level":26,"species":313},{"level":26,"species":335}],"party_address":3212540,"script_address":0},{"address":3233472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":313},{"level":29,"species":335}],"party_address":3212564,"script_address":0},{"address":3233512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":338},{"level":32,"species":313},{"level":32,"species":335}],"party_address":3212588,"script_address":0},{"address":3233552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":338},{"level":35,"species":313},{"level":35,"species":336}],"party_address":3212612,"script_address":0},{"address":3233592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":297}],"party_address":3212636,"script_address":2073950},{"address":3233632,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[185,95,0,0],"species":316}],"party_address":3212652,"script_address":2131420},{"address":3233672,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[111,38,247,0],"species":40}],"party_address":3212668,"script_address":2131484},{"address":3233712,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[14,163,0,0],"species":380}],"party_address":3212684,"script_address":2131548},{"address":3233752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[226,185,57,44],"species":355},{"level":29,"moves":[72,89,64,73],"species":363},{"level":29,"moves":[19,55,54,182],"species":310}],"party_address":3212700,"script_address":2068086},{"address":3233792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":383},{"level":45,"species":338}],"party_address":3212748,"script_address":2565951},{"address":3233832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":309},{"level":17,"species":339},{"level":17,"species":363}],"party_address":3212764,"script_address":2046803},{"address":3233872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":322}],"party_address":3212788,"script_address":2065651},{"address":3233912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3212796,"script_address":2332747},{"address":3233952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":319}],"party_address":3212804,"script_address":2334406},{"address":3233992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":321},{"level":42,"species":357},{"level":42,"species":297}],"party_address":3212812,"script_address":2334437},{"address":3234032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":227},{"level":43,"species":322}],"party_address":3212836,"script_address":2335485},{"address":3234072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":28},{"level":42,"species":38},{"level":42,"species":369}],"party_address":3212852,"script_address":2335516},{"address":3234112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":26,"species":339},{"level":26,"species":363}],"party_address":3212876,"script_address":0},{"address":3234152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":339},{"level":29,"species":363}],"party_address":3212900,"script_address":0},{"address":3234192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":339},{"level":32,"species":363}],"party_address":3212924,"script_address":0},{"address":3234232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":340},{"level":34,"species":363}],"party_address":3212948,"script_address":0},{"address":3234272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":348}],"party_address":3212972,"script_address":2564729},{"address":3234312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":361},{"level":30,"species":377}],"party_address":3212988,"script_address":2068461},{"address":3234352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":361},{"level":29,"species":377}],"party_address":3213004,"script_address":2067284},{"address":3234392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":322}],"party_address":3213020,"script_address":2315745},{"address":3234432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":377}],"party_address":3213028,"script_address":2315532},{"address":3234472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":322},{"level":31,"species":351}],"party_address":3213036,"script_address":0},{"address":3234512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":351},{"level":35,"species":322}],"party_address":3213052,"script_address":0},{"address":3234552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":351},{"level":40,"species":322}],"party_address":3213068,"script_address":0},{"address":3234592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":361},{"level":42,"species":322},{"level":42,"species":352}],"party_address":3213084,"script_address":0},{"address":3234632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213108,"script_address":2030087},{"address":3234672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[213,186,175,96],"species":325},{"level":39,"moves":[213,219,36,96],"species":325}],"party_address":3213116,"script_address":2265894},{"address":3234712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":287},{"level":28,"species":287},{"level":30,"species":339}],"party_address":3213148,"script_address":2254717},{"address":3234752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":11,"moves":[33,39,0,0],"species":288}],"party_address":3213172,"script_address":0},{"address":3234792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":40,"species":119}],"party_address":3213188,"script_address":2265677},{"address":3234832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3213196,"script_address":2361019},{"address":3234872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213204,"script_address":0},{"address":3234912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213212,"script_address":0},{"address":3234952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213220,"script_address":0},{"address":3234992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213228,"script_address":0},{"address":3235032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":183}],"party_address":3213244,"script_address":2304387},{"address":3235072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3213252,"script_address":2304418},{"address":3235112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":339}],"party_address":3213260,"script_address":2304449},{"address":3235152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[20,122,154,185],"species":317},{"level":29,"moves":[86,103,137,242],"species":379}],"party_address":3213268,"script_address":2067377},{"address":3235192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":118}],"party_address":3213300,"script_address":2265708},{"address":3235232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":184}],"party_address":3213308,"script_address":2265739},{"address":3235272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[78,250,240,96],"species":373},{"level":37,"moves":[13,152,96,0],"species":326},{"level":39,"moves":[253,154,252,96],"species":296}],"party_address":3213316,"script_address":2265770},{"address":3235312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":330},{"level":39,"species":331}],"party_address":3213364,"script_address":2265801},{"address":3235352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[20,122,154,185],"species":317},{"level":35,"moves":[86,103,137,242],"species":379}],"party_address":3213380,"script_address":0},{"address":3235392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[20,122,154,185],"species":317},{"level":38,"moves":[86,103,137,242],"species":379}],"party_address":3213412,"script_address":0},{"address":3235432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[20,122,154,185],"species":317},{"level":41,"moves":[86,103,137,242],"species":379}],"party_address":3213444,"script_address":0},{"address":3235472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[20,122,154,185],"species":317},{"level":44,"moves":[86,103,137,242],"species":379}],"party_address":3213476,"script_address":0},{"address":3235512,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213508,"script_address":2029901},{"address":3235552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":324},{"level":33,"species":356}],"party_address":3213516,"script_address":2074012},{"address":3235592,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":184}],"party_address":3213532,"script_address":2360988},{"address":3235632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213540,"script_address":0},{"address":3235672,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213548,"script_address":0},{"address":3235712,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213556,"script_address":0},{"address":3235752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213564,"script_address":0},{"address":3235792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3213580,"script_address":2051965},{"address":3235832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":116}],"party_address":3213588,"script_address":2340108},{"address":3235872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":111}],"party_address":3213604,"script_address":2312578},{"address":3235912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":339}],"party_address":3213612,"script_address":2304480},{"address":3235952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":383}],"party_address":3213620,"script_address":0},{"address":3235992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":383},{"level":29,"species":111}],"party_address":3213628,"script_address":0},{"address":3236032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":383},{"level":32,"species":111}],"party_address":3213644,"script_address":0},{"address":3236072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":384},{"level":35,"species":112}],"party_address":3213660,"script_address":0},{"address":3236112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213676,"script_address":2033571},{"address":3236152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":72}],"party_address":3213684,"script_address":2033602},{"address":3236192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":72}],"party_address":3213692,"script_address":2034185},{"address":3236232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":309},{"level":24,"species":72}],"party_address":3213708,"script_address":2034479},{"address":3236272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213732,"script_address":2034510},{"address":3236312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":73}],"party_address":3213740,"script_address":2034776},{"address":3236352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213748,"script_address":2034807},{"address":3236392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3213756,"script_address":2035777},{"address":3236432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309}],"party_address":3213772,"script_address":2069178},{"address":3236472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3213788,"script_address":2069209},{"address":3236512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":73}],"party_address":3213796,"script_address":2069789},{"address":3236552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":116}],"party_address":3213804,"script_address":2069820},{"address":3236592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213812,"script_address":2070163},{"address":3236632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":31,"species":309},{"level":31,"species":330}],"party_address":3213820,"script_address":2070194},{"address":3236672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213844,"script_address":2073229},{"address":3236712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310}],"party_address":3213852,"script_address":2073359},{"address":3236752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213860,"script_address":2073390},{"address":3236792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":73},{"level":33,"species":313}],"party_address":3213876,"script_address":2073291},{"address":3236832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3213892,"script_address":2073608},{"address":3236872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":342}],"party_address":3213900,"script_address":2073857},{"address":3236912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":341}],"party_address":3213908,"script_address":2073576},{"address":3236952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213916,"script_address":2074089},{"address":3236992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213924,"script_address":0},{"address":3237032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":313}],"party_address":3213948,"script_address":2069381},{"address":3237072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":331}],"party_address":3213964,"script_address":0},{"address":3237112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":331}],"party_address":3213972,"script_address":0},{"address":3237152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120},{"level":36,"species":331}],"party_address":3213980,"script_address":0},{"address":3237192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":121},{"level":39,"species":331}],"party_address":3213996,"script_address":0},{"address":3237232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3214012,"script_address":2095275},{"address":3237272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":66},{"level":32,"species":67}],"party_address":3214020,"script_address":2074213},{"address":3237312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":336}],"party_address":3214036,"script_address":2073701},{"address":3237352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":66},{"level":28,"species":67}],"party_address":3214044,"script_address":2052921},{"address":3237392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214060,"script_address":2052952},{"address":3237432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":67}],"party_address":3214068,"script_address":0},{"address":3237472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":66},{"level":29,"species":67}],"party_address":3214076,"script_address":0},{"address":3237512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":66},{"level":31,"species":67},{"level":31,"species":67}],"party_address":3214092,"script_address":0},{"address":3237552,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":66},{"level":33,"species":67},{"level":33,"species":67},{"level":33,"species":68}],"party_address":3214116,"script_address":0},{"address":3237592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":335},{"level":26,"species":67}],"party_address":3214148,"script_address":2557758},{"address":3237632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214164,"script_address":2046662},{"address":3237672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":336}],"party_address":3214172,"script_address":2315359},{"address":3237712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[98,86,209,43],"species":337},{"level":17,"moves":[12,95,103,0],"species":100}],"party_address":3214180,"script_address":2167608},{"address":3237752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":286},{"level":31,"species":41}],"party_address":3214212,"script_address":2323445},{"address":3237792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3214228,"script_address":2324458},{"address":3237832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":100},{"level":17,"species":81}],"party_address":3214236,"script_address":2167639},{"address":3237872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":337},{"level":30,"species":371}],"party_address":3214252,"script_address":2068709},{"address":3237912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81},{"level":15,"species":370}],"party_address":3214268,"script_address":2058956},{"address":3237952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":81},{"level":25,"species":370},{"level":25,"species":81}],"party_address":3214284,"script_address":0},{"address":3237992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81},{"level":28,"species":371},{"level":28,"species":81}],"party_address":3214308,"script_address":0},{"address":3238032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":82},{"level":31,"species":371},{"level":31,"species":82}],"party_address":3214332,"script_address":0},{"address":3238072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82},{"level":34,"species":372},{"level":34,"species":82}],"party_address":3214356,"script_address":0},{"address":3238112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214380,"script_address":2103394},{"address":3238152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":218},{"level":22,"species":218}],"party_address":3214388,"script_address":2103601},{"address":3238192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214404,"script_address":2103446},{"address":3238232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214412,"script_address":2103570},{"address":3238272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214420,"script_address":2103477},{"address":3238312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309}],"party_address":3214428,"script_address":2052075},{"address":3238352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":218},{"level":26,"species":309}],"party_address":3214444,"script_address":0},{"address":3238392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310}],"party_address":3214460,"script_address":0},{"address":3238432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":218},{"level":32,"species":310}],"party_address":3214476,"script_address":0},{"address":3238472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":219},{"level":35,"species":310}],"party_address":3214492,"script_address":0},{"address":3238512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,28,40,163],"species":27}],"party_address":3214508,"script_address":2046366},{"address":3238552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":21,"moves":[229,189,60,61],"species":318},{"level":21,"moves":[40,28,10,91],"species":27},{"level":21,"moves":[229,189,60,61],"species":318}],"party_address":3214524,"script_address":2046428},{"address":3238592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":299}],"party_address":3214572,"script_address":2049829},{"address":3238632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27},{"level":18,"species":299}],"party_address":3214580,"script_address":2051903},{"address":3238672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":317}],"party_address":3214596,"script_address":2557005},{"address":3238712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":288},{"level":20,"species":304}],"party_address":3214604,"script_address":2310199},{"address":3238752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3214620,"script_address":2310337},{"address":3238792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27}],"party_address":3214628,"script_address":2046600},{"address":3238832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":288},{"level":26,"species":304}],"party_address":3214636,"script_address":0},{"address":3238872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":289},{"level":29,"species":305}],"party_address":3214652,"script_address":0},{"address":3238912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":305},{"level":31,"species":289}],"party_address":3214668,"script_address":0},{"address":3238952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":28},{"level":34,"species":289}],"party_address":3214692,"script_address":0},{"address":3238992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":311}],"party_address":3214716,"script_address":2061044},{"address":3239032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":290},{"level":24,"species":291},{"level":24,"species":292}],"party_address":3214724,"script_address":2061075},{"address":3239072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":290},{"level":27,"species":293},{"level":27,"species":294}],"party_address":3214748,"script_address":2061106},{"address":3239112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":311},{"level":27,"species":311},{"level":27,"species":311}],"party_address":3214772,"script_address":2065541},{"address":3239152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":294},{"level":16,"species":292}],"party_address":3214796,"script_address":2057595},{"address":3239192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":311},{"level":31,"species":311}],"party_address":3214812,"script_address":0},{"address":3239232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":311},{"level":34,"species":311},{"level":34,"species":312}],"party_address":3214836,"script_address":0},{"address":3239272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":311},{"level":36,"species":290},{"level":36,"species":311},{"level":36,"species":312}],"party_address":3214860,"script_address":0},{"address":3239312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":311},{"level":38,"species":294},{"level":38,"species":311},{"level":38,"species":312},{"level":38,"species":292}],"party_address":3214892,"script_address":0},{"address":3239352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[237,0,0,0],"species":63}],"party_address":3214932,"script_address":2038374},{"address":3239392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3214948,"script_address":2244488},{"address":3239432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":392}],"party_address":3214956,"script_address":2244519},{"address":3239472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3214964,"script_address":2244550},{"address":3239512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":392},{"level":26,"species":393}],"party_address":3214972,"script_address":2314189},{"address":3239552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3214996,"script_address":2564698},{"address":3239592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":349}],"party_address":3215012,"script_address":2068179},{"address":3239632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":64},{"level":33,"species":349}],"party_address":3215020,"script_address":0},{"address":3239672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":64},{"level":38,"species":349}],"party_address":3215036,"script_address":0},{"address":3239712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3215052,"script_address":0},{"address":3239752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":349},{"level":45,"species":65}],"party_address":3215068,"script_address":0},{"address":3239792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[237,0,0,0],"species":63}],"party_address":3215084,"script_address":2038405},{"address":3239832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3215100,"script_address":2244581},{"address":3239872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":178}],"party_address":3215108,"script_address":2244612},{"address":3239912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3215116,"script_address":2244643},{"address":3239952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":202},{"level":26,"species":177},{"level":26,"species":64}],"party_address":3215124,"script_address":2314220},{"address":3239992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":393},{"level":41,"species":178}],"party_address":3215148,"script_address":2564760},{"address":3240032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":64},{"level":30,"species":348}],"party_address":3215164,"script_address":2068289},{"address":3240072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":64},{"level":34,"species":348}],"party_address":3215180,"script_address":0},{"address":3240112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":64},{"level":37,"species":348}],"party_address":3215196,"script_address":0},{"address":3240152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":64},{"level":40,"species":348}],"party_address":3215212,"script_address":0},{"address":3240192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":348},{"level":43,"species":65}],"party_address":3215228,"script_address":0},{"address":3240232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338}],"party_address":3215244,"script_address":2067174},{"address":3240272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":338},{"level":44,"species":338}],"party_address":3215252,"script_address":2360864},{"address":3240312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":380}],"party_address":3215268,"script_address":2360895},{"address":3240352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":338}],"party_address":3215276,"script_address":0},{"address":3240392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[29,28,60,154],"species":289},{"level":36,"moves":[98,209,60,46],"species":338}],"party_address":3215284,"script_address":0},{"address":3240432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[29,28,60,154],"species":289},{"level":39,"moves":[98,209,60,0],"species":338}],"party_address":3215316,"script_address":0},{"address":3240472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[29,28,60,154],"species":289},{"level":41,"moves":[154,50,93,244],"species":55},{"level":41,"moves":[98,209,60,46],"species":338}],"party_address":3215348,"script_address":0},{"address":3240512,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,38,28,242],"species":287},{"level":48,"moves":[3,104,207,70],"species":300},{"level":46,"moves":[73,185,46,178],"species":345},{"level":48,"moves":[57,14,70,7],"species":327},{"level":49,"moves":[76,157,14,163],"species":376}],"party_address":3215396,"script_address":2274753},{"address":3240552,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[69,109,174,182],"species":362},{"level":49,"moves":[247,32,5,185],"species":378},{"level":50,"moves":[247,104,101,185],"species":322},{"level":49,"moves":[247,94,85,7],"species":378},{"level":51,"moves":[247,58,157,89],"species":362}],"party_address":3215476,"script_address":2275380},{"address":3240592,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[227,34,2,45],"species":342},{"level":50,"moves":[113,242,196,58],"species":347},{"level":52,"moves":[213,38,2,59],"species":342},{"level":52,"moves":[247,153,2,58],"species":347},{"level":53,"moves":[57,34,58,73],"species":343}],"party_address":3215556,"script_address":2276062},{"address":3240632,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[61,81,182,38],"species":396},{"level":54,"moves":[38,225,93,76],"species":359},{"level":53,"moves":[108,93,57,34],"species":230},{"level":53,"moves":[53,242,225,89],"species":334},{"level":55,"moves":[53,81,157,242],"species":397}],"party_address":3215636,"script_address":2276724},{"address":3240672,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":12,"moves":[33,111,88,61],"species":74},{"level":12,"moves":[33,111,88,61],"species":74},{"level":15,"moves":[79,106,33,61],"species":320}],"party_address":3215716,"script_address":2187976},{"address":3240712,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[2,67,69,83],"species":66},{"level":16,"moves":[8,113,115,83],"species":356},{"level":19,"moves":[36,233,179,83],"species":335}],"party_address":3215764,"script_address":2095066},{"address":3240752,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":20,"moves":[205,209,120,95],"species":100},{"level":20,"moves":[95,43,98,80],"species":337},{"level":22,"moves":[48,95,86,49],"species":82},{"level":24,"moves":[98,86,95,80],"species":338}],"party_address":3215812,"script_address":2167181},{"address":3240792,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[59,36,222,241],"species":339},{"level":24,"moves":[59,123,113,241],"species":218},{"level":26,"moves":[59,33,241,213],"species":340},{"level":29,"moves":[59,241,34,213],"species":321}],"party_address":3215876,"script_address":2103186},{"address":3240832,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[42,60,7,227],"species":308},{"level":27,"moves":[163,7,227,185],"species":365},{"level":29,"moves":[163,187,7,29],"species":289},{"level":31,"moves":[68,25,7,185],"species":366}],"party_address":3215940,"script_address":2129756},{"address":3240872,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[195,119,219,76],"species":358},{"level":29,"moves":[241,76,76,235],"species":369},{"level":30,"moves":[55,48,182,76],"species":310},{"level":31,"moves":[28,31,211,76],"species":227},{"level":33,"moves":[89,225,93,76],"species":359}],"party_address":3216004,"script_address":2202062},{"address":3240912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[89,246,94,113],"species":319},{"level":41,"moves":[94,241,109,91],"species":178},{"level":42,"moves":[113,94,95,91],"species":348},{"level":42,"moves":[241,76,94,53],"species":349}],"party_address":3216084,"script_address":0},{"address":3240952,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[96,213,186,175],"species":325},{"level":41,"moves":[240,96,133,89],"species":324},{"level":43,"moves":[227,34,62,96],"species":342},{"level":43,"moves":[96,152,13,43],"species":327},{"level":46,"moves":[96,104,58,156],"species":230}],"party_address":3216148,"script_address":2262245},{"address":3240992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":392}],"party_address":3216228,"script_address":2054242},{"address":3241032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3216236,"script_address":2554598},{"address":3241072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":339},{"level":15,"species":43},{"level":15,"species":309}],"party_address":3216244,"script_address":2554629},{"address":3241112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":356}],"party_address":3216268,"script_address":0},{"address":3241152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":393},{"level":29,"species":356}],"party_address":3216284,"script_address":0},{"address":3241192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":393},{"level":32,"species":357}],"party_address":3216300,"script_address":0},{"address":3241232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":393},{"level":34,"species":378},{"level":34,"species":357}],"party_address":3216316,"script_address":0},{"address":3241272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":306}],"party_address":3216340,"script_address":2054490},{"address":3241312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":306},{"level":16,"species":292}],"party_address":3216348,"script_address":2554660},{"address":3241352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":370}],"party_address":3216364,"script_address":0},{"address":3241392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":306},{"level":29,"species":371}],"party_address":3216380,"script_address":0},{"address":3241432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":307},{"level":32,"species":371}],"party_address":3216396,"script_address":0},{"address":3241472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":307},{"level":35,"species":372}],"party_address":3216412,"script_address":0},{"address":3241512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[95,60,146,42],"species":308},{"level":32,"moves":[8,25,47,185],"species":366}],"party_address":3216428,"script_address":0},{"address":3241552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[45,39,29,60],"species":288},{"level":17,"moves":[33,116,36,0],"species":335}],"party_address":3216460,"script_address":0},{"address":3241592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[45,39,29,60],"species":288},{"level":30,"moves":[33,116,36,0],"species":335}],"party_address":3216492,"script_address":0},{"address":3241632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[45,39,29,60],"species":288},{"level":33,"moves":[33,116,36,0],"species":335}],"party_address":3216524,"script_address":0},{"address":3241672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[45,39,29,60],"species":289},{"level":36,"moves":[33,116,36,0],"species":335}],"party_address":3216556,"script_address":0},{"address":3241712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[45,39,29,60],"species":289},{"level":38,"moves":[33,116,36,0],"species":336}],"party_address":3216588,"script_address":0},{"address":3241752,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":16,"species":304},{"level":16,"species":288}],"party_address":3216620,"script_address":2045785},{"address":3241792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":15,"species":315}],"party_address":3216636,"script_address":2026353},{"address":3241832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[18,204,185,215],"species":315},{"level":36,"moves":[18,204,185,215],"species":315},{"level":40,"moves":[18,204,185,215],"species":315},{"level":12,"moves":[18,204,185,215],"species":315},{"level":30,"moves":[18,204,185,215],"species":315},{"level":42,"moves":[18,204,185,215],"species":316}],"party_address":3216644,"script_address":2360833},{"address":3241872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":315}],"party_address":3216740,"script_address":0},{"address":3241912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":315}],"party_address":3216748,"script_address":0},{"address":3241952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316}],"party_address":3216756,"script_address":0},{"address":3241992,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":316}],"party_address":3216764,"script_address":0},{"address":3242032,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":17,"species":363}],"party_address":3216772,"script_address":2045890},{"address":3242072,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":25}],"party_address":3216780,"script_address":2067143},{"address":3242112,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":350},{"level":37,"species":183},{"level":39,"species":184}],"party_address":3216788,"script_address":2265832},{"address":3242152,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":353},{"level":14,"species":354}],"party_address":3216812,"script_address":2038890},{"address":3242192,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":26,"species":353},{"level":26,"species":354}],"party_address":3216828,"script_address":0},{"address":3242232,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":353},{"level":29,"species":354}],"party_address":3216844,"script_address":0},{"address":3242272,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":353},{"level":32,"species":354}],"party_address":3216860,"script_address":0},{"address":3242312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":353},{"level":35,"species":354}],"party_address":3216876,"script_address":0},{"address":3242352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":336}],"party_address":3216892,"script_address":2052811},{"address":3242392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[36,26,28,91],"species":336}],"party_address":3216900,"script_address":0},{"address":3242432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[36,26,28,91],"species":336}],"party_address":3216916,"script_address":0},{"address":3242472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[36,187,28,91],"species":336}],"party_address":3216932,"script_address":0},{"address":3242512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[36,187,28,91],"species":336}],"party_address":3216948,"script_address":0},{"address":3242552,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[136,96,93,197],"species":356}],"party_address":3216964,"script_address":2046100},{"address":3242592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":356},{"level":21,"species":335}],"party_address":3216980,"script_address":2304277},{"address":3242632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":356},{"level":30,"species":335}],"party_address":3216996,"script_address":0},{"address":3242672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":357},{"level":33,"species":336}],"party_address":3217012,"script_address":0},{"address":3242712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":357},{"level":36,"species":336}],"party_address":3217028,"script_address":0},{"address":3242752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":357},{"level":39,"species":336}],"party_address":3217044,"script_address":0},{"address":3242792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":286}],"party_address":3217060,"script_address":2024678},{"address":3242832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":288},{"level":7,"species":298}],"party_address":3217068,"script_address":2029684},{"address":3242872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[33,0,0,0],"species":74}],"party_address":3217084,"script_address":2188154},{"address":3242912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3217100,"script_address":2188185},{"address":3242952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":66}],"party_address":3217116,"script_address":2054180},{"address":3242992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[29,28,45,85],"species":288},{"level":17,"moves":[133,124,25,1],"species":367}],"party_address":3217124,"script_address":2167670},{"address":3243032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[213,58,85,53],"species":366},{"level":43,"moves":[29,182,5,92],"species":362}],"party_address":3217156,"script_address":2332778},{"address":3243072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,94,85,91],"species":394},{"level":43,"moves":[89,247,76,24],"species":366}],"party_address":3217188,"script_address":2332809},{"address":3243112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":332}],"party_address":3217220,"script_address":2050594},{"address":3243152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3217228,"script_address":2050625},{"address":3243192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":287}],"party_address":3217236,"script_address":0},{"address":3243232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":305},{"level":30,"species":287}],"party_address":3217244,"script_address":0},{"address":3243272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":305},{"level":29,"species":289},{"level":33,"species":287}],"party_address":3217260,"script_address":0},{"address":3243312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":32,"species":289},{"level":36,"species":287}],"party_address":3217284,"script_address":0},{"address":3243352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":16,"species":288}],"party_address":3217308,"script_address":2553792},{"address":3243392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":3,"species":304}],"party_address":3217324,"script_address":2024926},{"address":3243432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":382},{"level":13,"species":337}],"party_address":3217340,"script_address":2039000},{"address":3243472,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[240,67,38,59],"species":314},{"level":55,"moves":[92,56,188,58],"species":73},{"level":56,"moves":[202,57,73,104],"species":297},{"level":56,"moves":[89,57,133,63],"species":324},{"level":56,"moves":[93,89,63,57],"species":130},{"level":58,"moves":[105,57,58,92],"species":329}],"party_address":3217356,"script_address":2277575},{"address":3243512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":10,"species":72},{"level":15,"species":129}],"party_address":3217452,"script_address":2026322},{"address":3243552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":6,"species":129},{"level":7,"species":129}],"party_address":3217476,"script_address":2029653},{"address":3243592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":129},{"level":17,"species":118},{"level":18,"species":323}],"party_address":3217500,"script_address":2052185},{"address":3243632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":10,"species":129},{"level":7,"species":72},{"level":10,"species":129}],"party_address":3217524,"script_address":2034247},{"address":3243672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72}],"party_address":3217548,"script_address":2034357},{"address":3243712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72},{"level":14,"species":313},{"level":11,"species":72},{"level":14,"species":313}],"party_address":3217556,"script_address":2038546},{"address":3243752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3217588,"script_address":2052216},{"address":3243792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3217596,"script_address":2058894},{"address":3243832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":72}],"party_address":3217612,"script_address":2058925},{"address":3243872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":73}],"party_address":3217620,"script_address":2036183},{"address":3243912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":27,"species":130},{"level":27,"species":130}],"party_address":3217636,"script_address":0},{"address":3243952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":130},{"level":26,"species":330},{"level":26,"species":72},{"level":29,"species":130}],"party_address":3217660,"script_address":0},{"address":3243992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":130},{"level":30,"species":330},{"level":30,"species":73},{"level":31,"species":130}],"party_address":3217692,"script_address":0},{"address":3244032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":130},{"level":33,"species":331},{"level":33,"species":130},{"level":35,"species":73}],"party_address":3217724,"script_address":0},{"address":3244072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":129},{"level":21,"species":130},{"level":23,"species":130},{"level":26,"species":130},{"level":30,"species":130},{"level":35,"species":130}],"party_address":3217756,"script_address":2073670},{"address":3244112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":100},{"level":6,"species":100},{"level":14,"species":81}],"party_address":3217804,"script_address":2038577},{"address":3244152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81}],"party_address":3217828,"script_address":2038608},{"address":3244192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217844,"script_address":2038639},{"address":3244232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":81}],"party_address":3217852,"script_address":0},{"address":3244272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":81}],"party_address":3217860,"script_address":0},{"address":3244312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82}],"party_address":3217868,"script_address":0},{"address":3244352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":82}],"party_address":3217876,"script_address":0},{"address":3244392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217884,"script_address":2038780},{"address":3244432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81},{"level":6,"species":100}],"party_address":3217892,"script_address":2038749},{"address":3244472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81}],"party_address":3217916,"script_address":0},{"address":3244512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":81}],"party_address":3217924,"script_address":0},{"address":3244552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82}],"party_address":3217932,"script_address":0},{"address":3244592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":82}],"party_address":3217940,"script_address":0},{"address":3244632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217948,"script_address":2057375},{"address":3244672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217956,"script_address":0},{"address":3244712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3217964,"script_address":0},{"address":3244752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3217972,"script_address":0},{"address":3244792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3217980,"script_address":0},{"address":3244832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217988,"script_address":2057485},{"address":3244872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217996,"script_address":0},{"address":3244912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3218004,"script_address":0},{"address":3244952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3218012,"script_address":0},{"address":3244992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3218020,"script_address":0},{"address":3245032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218028,"script_address":2070582},{"address":3245072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":288},{"level":25,"species":337}],"party_address":3218044,"script_address":2340077},{"address":3245112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218060,"script_address":2071332},{"address":3245152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218068,"script_address":2070380},{"address":3245192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218084,"script_address":2072978},{"address":3245232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218100,"script_address":0},{"address":3245272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218108,"script_address":0},{"address":3245312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218116,"script_address":0},{"address":3245352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218124,"script_address":0},{"address":3245392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218132,"script_address":2070318},{"address":3245432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218140,"script_address":2070613},{"address":3245472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218156,"script_address":2073545},{"address":3245512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218164,"script_address":2071442},{"address":3245552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":309},{"level":33,"species":120}],"party_address":3218172,"script_address":2073009},{"address":3245592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218188,"script_address":0},{"address":3245632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218196,"script_address":0},{"address":3245672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218204,"script_address":0},{"address":3245712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218212,"script_address":0},{"address":3245752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":359},{"level":37,"species":359}],"party_address":3218220,"script_address":2292701},{"address":3245792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":359}],"party_address":3218236,"script_address":0},{"address":3245832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":359},{"level":44,"species":359}],"party_address":3218252,"script_address":0},{"address":3245872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":395},{"level":46,"species":359},{"level":46,"species":359}],"party_address":3218268,"script_address":0},{"address":3245912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":49,"species":359},{"level":49,"species":359},{"level":49,"species":396}],"party_address":3218292,"script_address":0},{"address":3245952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[225,29,116,52],"species":395}],"party_address":3218316,"script_address":2074182},{"address":3245992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309}],"party_address":3218332,"script_address":2059066},{"address":3246032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":369}],"party_address":3218340,"script_address":2061450},{"address":3246072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":305}],"party_address":3218356,"script_address":2061481},{"address":3246112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":84},{"level":27,"species":227},{"level":27,"species":369}],"party_address":3218364,"script_address":2202267},{"address":3246152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":227}],"party_address":3218388,"script_address":2202391},{"address":3246192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":369},{"level":33,"species":178}],"party_address":3218396,"script_address":2070085},{"address":3246232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":84},{"level":29,"species":310}],"party_address":3218412,"script_address":2202298},{"address":3246272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":309},{"level":28,"species":177}],"party_address":3218428,"script_address":2065338},{"address":3246312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":358}],"party_address":3218444,"script_address":2065369},{"address":3246352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":305},{"level":36,"species":310},{"level":36,"species":178}],"party_address":3218452,"script_address":2563257},{"address":3246392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":305}],"party_address":3218476,"script_address":2059097},{"address":3246432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":177},{"level":32,"species":358}],"party_address":3218492,"script_address":0},{"address":3246472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":177},{"level":35,"species":359}],"party_address":3218508,"script_address":0},{"address":3246512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":177},{"level":38,"species":359}],"party_address":3218524,"script_address":0},{"address":3246552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":178}],"party_address":3218540,"script_address":0},{"address":3246592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":177},{"level":33,"species":305}],"party_address":3218556,"script_address":2074151},{"address":3246632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":369}],"party_address":3218572,"script_address":2073981},{"address":3246672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302}],"party_address":3218580,"script_address":2061512},{"address":3246712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302},{"level":25,"species":109}],"party_address":3218588,"script_address":2061543},{"address":3246752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,89,0,0],"species":319},{"level":43,"moves":[85,89,0,0],"species":171}],"party_address":3218604,"script_address":2335578},{"address":3246792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3218636,"script_address":2341860},{"address":3246832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,124,120],"species":109}],"party_address":3218644,"script_address":2050766},{"address":3246872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":109},{"level":18,"species":302}],"party_address":3218692,"script_address":2050876},{"address":3246912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[139,33,124,120],"species":109},{"level":24,"moves":[139,33,124,0],"species":109},{"level":24,"moves":[139,33,124,120],"species":109},{"level":26,"moves":[33,124,0,0],"species":109}],"party_address":3218708,"script_address":0},{"address":3246952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,0],"species":109},{"level":29,"moves":[33,124,0,0],"species":109}],"party_address":3218772,"script_address":0},{"address":3246992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":32,"moves":[33,124,0,0],"species":109}],"party_address":3218836,"script_address":0},{"address":3247032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[139,33,124,0],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":35,"moves":[33,124,0,0],"species":110}],"party_address":3218900,"script_address":0},{"address":3247072,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218964,"script_address":2095313},{"address":3247112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218972,"script_address":2095351},{"address":3247152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":335}],"party_address":3218980,"script_address":2053062},{"address":3247192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":356}],"party_address":3218996,"script_address":2557727},{"address":3247232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3219004,"script_address":2557789},{"address":3247272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3219012,"script_address":0},{"address":3247312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":356},{"level":29,"species":335}],"party_address":3219028,"script_address":0},{"address":3247352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":357},{"level":32,"species":336}],"party_address":3219044,"script_address":0},{"address":3247392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":357},{"level":35,"species":336}],"party_address":3219060,"script_address":0},{"address":3247432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":19,"moves":[52,33,222,241],"species":339}],"party_address":3219076,"script_address":2050656},{"address":3247472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":363},{"level":28,"species":313}],"party_address":3219092,"script_address":2065713},{"address":3247512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[240,55,87,96],"species":385}],"party_address":3219108,"script_address":2065744},{"address":3247552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[52,33,222,241],"species":339}],"party_address":3219124,"script_address":0},{"address":3247592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[52,36,222,241],"species":339}],"party_address":3219140,"script_address":0},{"address":3247632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[73,72,64,241],"species":363},{"level":34,"moves":[53,36,222,241],"species":339}],"party_address":3219156,"script_address":0},{"address":3247672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[73,202,76,241],"species":363},{"level":37,"moves":[53,36,89,241],"species":340}],"party_address":3219188,"script_address":0},{"address":3247712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":313}],"party_address":3219220,"script_address":2033633},{"address":3247752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3219236,"script_address":2033664},{"address":3247792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":313}],"party_address":3219244,"script_address":2034216},{"address":3247832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":118}],"party_address":3219252,"script_address":2034620},{"address":3247872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219268,"script_address":2034651},{"address":3247912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":116},{"level":25,"species":183}],"party_address":3219276,"script_address":2034838},{"address":3247952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219292,"script_address":2034869},{"address":3247992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":118},{"level":24,"species":309},{"level":24,"species":118}],"party_address":3219300,"script_address":2035808},{"address":3248032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3219324,"script_address":2069240},{"address":3248072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":183}],"party_address":3219332,"script_address":2069350},{"address":3248112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219340,"script_address":2069851},{"address":3248152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219348,"script_address":2069882},{"address":3248192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":183},{"level":33,"species":341}],"party_address":3219356,"script_address":2070225},{"address":3248232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":118}],"party_address":3219372,"script_address":2070256},{"address":3248272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":118},{"level":33,"species":341}],"party_address":3219380,"script_address":2073260},{"address":3248312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219396,"script_address":2073421},{"address":3248352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219404,"script_address":2073452},{"address":3248392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":184}],"party_address":3219412,"script_address":2073639},{"address":3248432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219420,"script_address":2070349},{"address":3248472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219436,"script_address":2073888},{"address":3248512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":116},{"level":33,"species":117}],"party_address":3219444,"script_address":2073919},{"address":3248552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":171},{"level":34,"species":310}],"party_address":3219460,"script_address":0},{"address":3248592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219476,"script_address":2074120},{"address":3248632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":119}],"party_address":3219492,"script_address":2071676},{"address":3248672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":313}],"party_address":3219500,"script_address":0},{"address":3248712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":313}],"party_address":3219508,"script_address":0},{"address":3248752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":120},{"level":43,"species":313}],"party_address":3219516,"script_address":0},{"address":3248792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":313},{"level":45,"species":121}],"party_address":3219532,"script_address":0},{"address":3248832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[91,28,40,163],"species":27},{"level":22,"moves":[229,189,60,61],"species":318}],"party_address":3219556,"script_address":2046397},{"address":3248872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[28,40,163,91],"species":27},{"level":22,"moves":[205,61,39,111],"species":183}],"party_address":3219588,"script_address":2046459},{"address":3248912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":304},{"level":17,"species":296}],"party_address":3219620,"script_address":2049860},{"address":3248952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":183},{"level":18,"species":296}],"party_address":3219636,"script_address":2051934},{"address":3248992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":315},{"level":23,"species":358}],"party_address":3219652,"script_address":2557036},{"address":3249032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":306},{"level":19,"species":43},{"level":19,"species":358}],"party_address":3219668,"script_address":2310092},{"address":3249072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[194,219,68,243],"species":202}],"party_address":3219692,"script_address":2315855},{"address":3249112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":306},{"level":17,"species":183}],"party_address":3219708,"script_address":2046631},{"address":3249152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":306},{"level":25,"species":44},{"level":25,"species":358}],"party_address":3219724,"script_address":0},{"address":3249192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":307},{"level":28,"species":44},{"level":28,"species":358}],"party_address":3219748,"script_address":0},{"address":3249232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307},{"level":31,"species":44},{"level":31,"species":358}],"party_address":3219772,"script_address":0},{"address":3249272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":307},{"level":40,"species":45},{"level":40,"species":359}],"party_address":3219796,"script_address":0},{"address":3249312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":353},{"level":15,"species":354}],"party_address":3219820,"script_address":0},{"address":3249352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":353},{"level":27,"species":354}],"party_address":3219836,"script_address":0},{"address":3249392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":298},{"level":6,"species":295}],"party_address":3219852,"script_address":0},{"address":3249432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":292},{"level":26,"species":294}],"party_address":3219868,"script_address":0},{"address":3249472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":353},{"level":9,"species":354}],"party_address":3219884,"script_address":0},{"address":3249512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[101,50,0,0],"species":361},{"level":10,"moves":[71,73,0,0],"species":306}],"party_address":3219900,"script_address":0},{"address":3249552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":353},{"level":30,"species":354}],"party_address":3219932,"script_address":0},{"address":3249592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[209,12,57,14],"species":353},{"level":33,"moves":[209,12,204,14],"species":354}],"party_address":3219948,"script_address":0},{"address":3249632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,12,57,14],"species":353},{"level":36,"moves":[87,12,204,14],"species":354}],"party_address":3219980,"script_address":0},{"address":3249672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":309},{"level":12,"species":66}],"party_address":3220012,"script_address":2035839},{"address":3249712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309}],"party_address":3220028,"script_address":2035870},{"address":3249752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":67}],"party_address":3220036,"script_address":2069913},{"address":3249792,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":66},{"level":11,"species":72}],"party_address":3220052,"script_address":2543939},{"address":3249832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":73},{"level":44,"species":67}],"party_address":3220076,"script_address":2360255},{"address":3249872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":66},{"level":43,"species":310},{"level":43,"species":67}],"party_address":3220092,"script_address":2360286},{"address":3249912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":341},{"level":25,"species":67}],"party_address":3220116,"script_address":2340984},{"address":3249952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":309},{"level":36,"species":72},{"level":36,"species":67}],"party_address":3220132,"script_address":0},{"address":3249992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":310},{"level":39,"species":72},{"level":39,"species":67}],"party_address":3220156,"script_address":0},{"address":3250032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":310},{"level":42,"species":72},{"level":42,"species":67}],"party_address":3220180,"script_address":0},{"address":3250072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":310},{"level":45,"species":67},{"level":45,"species":73}],"party_address":3220204,"script_address":0},{"address":3250112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3220228,"script_address":2103632},{"address":3250152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[175,96,216,213],"species":328},{"level":39,"moves":[175,96,216,213],"species":328}],"party_address":3220236,"script_address":2265863},{"address":3250192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":376}],"party_address":3220268,"script_address":2068647},{"address":3250232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[92,87,120,188],"species":109}],"party_address":3220276,"script_address":2068616},{"address":3250272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[241,55,53,76],"species":385}],"party_address":3220292,"script_address":2068585},{"address":3250312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":338},{"level":33,"species":68}],"party_address":3220308,"script_address":2070116},{"address":3250352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":341}],"party_address":3220324,"script_address":2074337},{"address":3250392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[44,46,86,85],"species":338}],"party_address":3220340,"script_address":2074306},{"address":3250432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":356},{"level":33,"species":336}],"party_address":3220356,"script_address":2074275},{"address":3250472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3220372,"script_address":2074244},{"address":3250512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":170},{"level":33,"species":336}],"party_address":3220380,"script_address":2074043},{"address":3250552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":296},{"level":14,"species":299}],"party_address":3220396,"script_address":2038436},{"address":3250592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":380},{"level":18,"species":379}],"party_address":3220412,"script_address":2053172},{"address":3250632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":340},{"level":38,"species":287},{"level":40,"species":42}],"party_address":3220428,"script_address":0},{"address":3250672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":299}],"party_address":3220452,"script_address":0},{"address":3250712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":299}],"party_address":3220468,"script_address":0},{"address":3250752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":299}],"party_address":3220484,"script_address":0},{"address":3250792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":297},{"level":35,"species":300}],"party_address":3220500,"script_address":0},{"address":3250832,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[76,219,225,93],"species":359},{"level":43,"moves":[47,18,204,185],"species":316},{"level":44,"moves":[89,73,202,92],"species":363},{"level":41,"moves":[48,85,161,103],"species":82},{"level":45,"moves":[104,91,94,248],"species":394}],"party_address":3220516,"script_address":2332529},{"address":3250872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220596,"script_address":2025759},{"address":3250912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309},{"level":20,"species":278}],"party_address":3220604,"script_address":2039798},{"address":3250952,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310},{"level":31,"species":278}],"party_address":3220628,"script_address":2060578},{"address":3250992,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220652,"script_address":2025703},{"address":3251032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220660,"script_address":2039742},{"address":3251072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220684,"script_address":2060522},{"address":3251112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220708,"script_address":2025731},{"address":3251152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220716,"script_address":2039770},{"address":3251192,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220740,"script_address":2060550},{"address":3251232,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220764,"script_address":2025675},{"address":3251272,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":218},{"level":20,"species":278}],"party_address":3220772,"script_address":2039622},{"address":3251312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":296},{"level":31,"species":278}],"party_address":3220796,"script_address":2060420},{"address":3251352,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220820,"script_address":2025619},{"address":3251392,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220828,"script_address":2039566},{"address":3251432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220852,"script_address":2060364},{"address":3251472,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220876,"script_address":2025647},{"address":3251512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220884,"script_address":2039594},{"address":3251552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220908,"script_address":2060392},{"address":3251592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":370},{"level":11,"species":288},{"level":11,"species":382},{"level":11,"species":286},{"level":11,"species":304},{"level":11,"species":335}],"party_address":3220932,"script_address":2057155},{"address":3251632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":127}],"party_address":3220980,"script_address":2068678},{"address":3251672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[153,115,113,94],"species":348},{"level":43,"moves":[153,115,113,247],"species":349}],"party_address":3220988,"script_address":2334468},{"address":3251712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":371},{"level":22,"species":289},{"level":22,"species":382},{"level":22,"species":287},{"level":22,"species":305},{"level":22,"species":335}],"party_address":3221020,"script_address":0},{"address":3251752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":371},{"level":25,"species":289},{"level":25,"species":382},{"level":25,"species":287},{"level":25,"species":305},{"level":25,"species":336}],"party_address":3221068,"script_address":0},{"address":3251792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":371},{"level":28,"species":289},{"level":28,"species":382},{"level":28,"species":287},{"level":28,"species":305},{"level":28,"species":336}],"party_address":3221116,"script_address":0},{"address":3251832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":371},{"level":31,"species":289},{"level":31,"species":383},{"level":31,"species":287},{"level":31,"species":305},{"level":31,"species":336}],"party_address":3221164,"script_address":0},{"address":3251872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":306},{"level":11,"species":183},{"level":11,"species":363},{"level":11,"species":315},{"level":11,"species":118}],"party_address":3221212,"script_address":2057265},{"address":3251912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":322},{"level":43,"species":376}],"party_address":3221260,"script_address":2334499},{"address":3251952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":28}],"party_address":3221276,"script_address":2341891},{"address":3251992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":309},{"level":22,"species":306},{"level":22,"species":183},{"level":22,"species":363},{"level":22,"species":315},{"level":22,"species":118}],"party_address":3221284,"script_address":0},{"address":3252032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":310},{"level":25,"species":307},{"level":25,"species":183},{"level":25,"species":363},{"level":25,"species":316},{"level":25,"species":118}],"party_address":3221332,"script_address":0},{"address":3252072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":310},{"level":28,"species":307},{"level":28,"species":183},{"level":28,"species":363},{"level":28,"species":316},{"level":28,"species":118}],"party_address":3221380,"script_address":0},{"address":3252112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":310},{"level":31,"species":307},{"level":31,"species":184},{"level":31,"species":363},{"level":31,"species":316},{"level":31,"species":119}],"party_address":3221428,"script_address":0},{"address":3252152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3221476,"script_address":2061230},{"address":3252192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":298},{"level":28,"species":299},{"level":28,"species":296}],"party_address":3221484,"script_address":2065479},{"address":3252232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":345}],"party_address":3221508,"script_address":2563288},{"address":3252272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307}],"party_address":3221516,"script_address":0},{"address":3252312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307}],"party_address":3221524,"script_address":0},{"address":3252352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":307}],"party_address":3221532,"script_address":0},{"address":3252392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":317},{"level":39,"species":307}],"party_address":3221540,"script_address":0},{"address":3252432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":44},{"level":26,"species":363}],"party_address":3221556,"script_address":2061340},{"address":3252472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":295},{"level":28,"species":296},{"level":28,"species":299}],"party_address":3221572,"script_address":2065510},{"address":3252512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":358},{"level":38,"species":363}],"party_address":3221596,"script_address":2563226},{"address":3252552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":44},{"level":30,"species":363}],"party_address":3221612,"script_address":0},{"address":3252592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":44},{"level":33,"species":363}],"party_address":3221628,"script_address":0},{"address":3252632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":44},{"level":36,"species":363}],"party_address":3221644,"script_address":0},{"address":3252672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":182},{"level":39,"species":363}],"party_address":3221660,"script_address":0},{"address":3252712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":81}],"party_address":3221676,"script_address":2310306},{"address":3252752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":287},{"level":35,"species":42}],"party_address":3221684,"script_address":2327187},{"address":3252792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":313},{"level":31,"species":41}],"party_address":3221700,"script_address":0},{"address":3252832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":30,"species":41}],"party_address":3221716,"script_address":2317615},{"address":3252872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":286},{"level":22,"species":339}],"party_address":3221732,"script_address":2309993},{"address":3252912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3221748,"script_address":2188216},{"address":3252952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3221764,"script_address":2095389},{"address":3252992,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3221772,"script_address":2095465},{"address":3253032,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":335}],"party_address":3221780,"script_address":2095427},{"address":3253072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":356}],"party_address":3221788,"script_address":2244674},{"address":3253112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3221796,"script_address":2070287},{"address":3253152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[87,86,98,0],"species":338},{"level":32,"moves":[57,168,0,0],"species":289}],"party_address":3221804,"script_address":2070768},{"address":3253192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":73}],"party_address":3221836,"script_address":2071645},{"address":3253232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":41}],"party_address":3221844,"script_address":2304070},{"address":3253272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3221852,"script_address":2073102},{"address":3253312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":203}],"party_address":3221860,"script_address":0},{"address":3253352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":351}],"party_address":3221868,"script_address":2244705},{"address":3253392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3221876,"script_address":2244829},{"address":3253432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3221884,"script_address":2244767},{"address":3253472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":202}],"party_address":3221892,"script_address":2244798},{"address":3253512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":286}],"party_address":3221900,"script_address":2254605},{"address":3253552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221916,"script_address":2254667},{"address":3253592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3221924,"script_address":2257768},{"address":3253632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":287}],"party_address":3221932,"script_address":2257818},{"address":3253672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221940,"script_address":2257868},{"address":3253712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":177}],"party_address":3221948,"script_address":2244736},{"address":3253752,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3221956,"script_address":1978559},{"address":3253792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3221972,"script_address":1978621},{"address":3253832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":305},{"level":33,"species":307}],"party_address":3221988,"script_address":2073732},{"address":3253872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3222004,"script_address":2069651},{"address":3253912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3222012,"script_address":2572062},{"address":3253952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":20,"species":286},{"level":22,"species":339},{"level":22,"species":41}],"party_address":3222028,"script_address":2304039},{"address":3253992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":317},{"level":33,"species":371}],"party_address":3222060,"script_address":2073794},{"address":3254032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":218},{"level":15,"species":283}],"party_address":3222076,"script_address":1978590},{"address":3254072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3222092,"script_address":1978317},{"address":3254112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":287},{"level":38,"species":169},{"level":39,"species":340}],"party_address":3222108,"script_address":2351441},{"address":3254152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":287},{"level":24,"species":41},{"level":25,"species":340}],"party_address":3222132,"script_address":2303440},{"address":3254192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":4,"species":306}],"party_address":3222156,"script_address":2024895},{"address":3254232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":295},{"level":6,"species":306}],"party_address":3222172,"script_address":2029715},{"address":3254272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":183}],"party_address":3222188,"script_address":2054459},{"address":3254312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183},{"level":15,"species":306},{"level":15,"species":339}],"party_address":3222196,"script_address":2045995},{"address":3254352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":306}],"party_address":3222220,"script_address":0},{"address":3254392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":307}],"party_address":3222236,"script_address":0},{"address":3254432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":307}],"party_address":3222252,"script_address":0},{"address":3254472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":296},{"level":34,"species":307}],"party_address":3222268,"script_address":0},{"address":3254512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":43}],"party_address":3222292,"script_address":2553761},{"address":3254552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":315},{"level":14,"species":306},{"level":14,"species":183}],"party_address":3222300,"script_address":2553823},{"address":3254592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325}],"party_address":3222324,"script_address":2265615},{"address":3254632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":118},{"level":39,"species":313}],"party_address":3222332,"script_address":2265646},{"address":3254672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":290},{"level":4,"species":290}],"party_address":3222348,"script_address":2024864},{"address":3254712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290}],"party_address":3222364,"script_address":2300392},{"address":3254752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":290},{"level":8,"species":301}],"party_address":3222396,"script_address":2054211},{"address":3254792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":301},{"level":28,"species":302}],"party_address":3222412,"script_address":2061137},{"address":3254832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222428,"script_address":2061168},{"address":3254872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302}],"party_address":3222444,"script_address":2061199},{"address":3254912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":301},{"level":6,"species":301}],"party_address":3222452,"script_address":2300423},{"address":3254952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":302}],"party_address":3222468,"script_address":0},{"address":3254992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":302}],"party_address":3222476,"script_address":0},{"address":3255032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":294},{"level":31,"species":302}],"party_address":3222492,"script_address":0},{"address":3255072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":311},{"level":33,"species":302},{"level":33,"species":294},{"level":33,"species":302}],"party_address":3222516,"script_address":0},{"address":3255112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":339},{"level":17,"species":66}],"party_address":3222548,"script_address":2049688},{"address":3255152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":17,"species":74},{"level":16,"species":74}],"party_address":3222564,"script_address":2049719},{"address":3255192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":66}],"party_address":3222588,"script_address":2051841},{"address":3255232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":339}],"party_address":3222604,"script_address":2051872},{"address":3255272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":74},{"level":22,"species":320},{"level":22,"species":75}],"party_address":3222620,"script_address":2557067},{"address":3255312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74}],"party_address":3222644,"script_address":2054428},{"address":3255352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":74},{"level":20,"species":318}],"party_address":3222652,"script_address":2310061},{"address":3255392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":9,"moves":[150,55,0,0],"species":313}],"party_address":3222668,"script_address":0},{"address":3255432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[16,45,0,0],"species":310},{"level":10,"moves":[44,184,0,0],"species":286}],"party_address":3222684,"script_address":0},{"address":3255472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":16,"species":74},{"level":16,"species":66}],"party_address":3222716,"script_address":2296023},{"address":3255512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":75}],"party_address":3222740,"script_address":0},{"address":3255552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":74},{"level":27,"species":74},{"level":27,"species":75},{"level":27,"species":75}],"party_address":3222772,"script_address":0},{"address":3255592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":74},{"level":30,"species":75},{"level":30,"species":75},{"level":30,"species":75}],"party_address":3222804,"script_address":0},{"address":3255632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":76}],"party_address":3222836,"script_address":0},{"address":3255672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":316},{"level":31,"species":338}],"party_address":3222868,"script_address":0},{"address":3255712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":325}],"party_address":3222884,"script_address":0},{"address":3255752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222900,"script_address":0},{"address":3255792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":386},{"level":30,"species":387}],"party_address":3222916,"script_address":0},{"address":3255832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":386},{"level":33,"species":387}],"party_address":3222932,"script_address":0},{"address":3255872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":386},{"level":36,"species":387}],"party_address":3222948,"script_address":0},{"address":3255912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":386},{"level":39,"species":387}],"party_address":3222964,"script_address":0},{"address":3255952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":118}],"party_address":3222980,"script_address":2543970},{"address":3255992,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[53,154,185,20],"species":317}],"party_address":3222988,"script_address":2103539},{"address":3256032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[117,197,93,9],"species":356},{"level":17,"moves":[9,197,93,96],"species":356}],"party_address":3223004,"script_address":2167701},{"address":3256072,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[117,197,93,7],"species":356}],"party_address":3223036,"script_address":2103508},{"address":3256112,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[33,120,124,108],"species":109},{"level":25,"moves":[33,139,124,108],"species":109}],"party_address":3223052,"script_address":2061574},{"address":3256152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[139,120,124,108],"species":109},{"level":28,"moves":[28,104,210,14],"species":302}],"party_address":3223084,"script_address":2065775},{"address":3256192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[141,154,170,91],"species":301},{"level":28,"moves":[33,120,124,108],"species":109}],"party_address":3223116,"script_address":2065806},{"address":3256232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":305},{"level":29,"species":178}],"party_address":3223148,"script_address":2202329},{"address":3256272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":358},{"level":27,"species":358},{"level":27,"species":358}],"party_address":3223164,"script_address":2202360},{"address":3256312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":392}],"party_address":3223188,"script_address":1971405},{"address":3256352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[76,219,225,93],"species":359},{"level":46,"moves":[47,18,204,185],"species":316},{"level":47,"moves":[89,73,202,92],"species":363},{"level":44,"moves":[48,85,161,103],"species":82},{"level":48,"moves":[104,91,94,248],"species":394}],"party_address":3223196,"script_address":2332607},{"address":3256392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[76,219,225,93],"species":359},{"level":49,"moves":[47,18,204,185],"species":316},{"level":50,"moves":[89,73,202,92],"species":363},{"level":47,"moves":[48,85,161,103],"species":82},{"level":51,"moves":[104,91,94,248],"species":394}],"party_address":3223276,"script_address":0},{"address":3256432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[76,219,225,93],"species":359},{"level":52,"moves":[47,18,204,185],"species":316},{"level":53,"moves":[89,73,202,92],"species":363},{"level":50,"moves":[48,85,161,103],"species":82},{"level":54,"moves":[104,91,94,248],"species":394}],"party_address":3223356,"script_address":0},{"address":3256472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[76,219,225,93],"species":359},{"level":55,"moves":[47,18,204,185],"species":316},{"level":56,"moves":[89,73,202,92],"species":363},{"level":53,"moves":[48,85,161,103],"species":82},{"level":57,"moves":[104,91,94,248],"species":394}],"party_address":3223436,"script_address":0},{"address":3256512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223516,"script_address":1986165},{"address":3256552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223548,"script_address":1986109},{"address":3256592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223580,"script_address":1986137},{"address":3256632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223612,"script_address":1986081},{"address":3256672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223644,"script_address":1986025},{"address":3256712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223676,"script_address":1986053},{"address":3256752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":31,"species":72},{"level":32,"species":331}],"party_address":3223708,"script_address":2070644},{"address":3256792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":34,"species":73}],"party_address":3223732,"script_address":2070675},{"address":3256832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":129},{"level":25,"species":129},{"level":35,"species":130}],"party_address":3223748,"script_address":2070706},{"address":3256872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":44},{"level":34,"species":184}],"party_address":3223772,"script_address":2071552},{"address":3256912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":300},{"level":34,"species":320}],"party_address":3223788,"script_address":2071583},{"address":3256952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":67}],"party_address":3223804,"script_address":2070799},{"address":3256992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":72},{"level":31,"species":72},{"level":36,"species":313}],"party_address":3223812,"script_address":2071614},{"address":3257032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":305},{"level":32,"species":227}],"party_address":3223836,"script_address":2070737},{"address":3257072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":341},{"level":33,"species":331}],"party_address":3223852,"script_address":2073040},{"address":3257112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170}],"party_address":3223868,"script_address":2073071},{"address":3257152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":308},{"level":19,"species":308}],"party_address":3223876,"script_address":0},{"address":3257192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[47,31,219,76],"species":358},{"level":35,"moves":[53,36,156,89],"species":339}],"party_address":3223892,"script_address":0},{"address":3257232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[74,78,72,73],"species":363},{"level":20,"moves":[111,205,44,88],"species":75}],"party_address":3223924,"script_address":0},{"address":3257272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[16,60,92,182],"species":294},{"level":27,"moves":[16,72,213,78],"species":292}],"party_address":3223956,"script_address":0},{"address":3257312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[94,7,244,182],"species":357},{"level":39,"moves":[8,61,156,187],"species":336}],"party_address":3223988,"script_address":0},{"address":3257352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,7,244,182],"species":357},{"level":43,"moves":[8,61,156,187],"species":336}],"party_address":3224020,"script_address":0},{"address":3257392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[94,7,244,182],"species":357},{"level":46,"moves":[8,61,156,187],"species":336}],"party_address":3224052,"script_address":0},{"address":3257432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":49,"moves":[94,7,244,182],"species":357},{"level":49,"moves":[8,61,156,187],"species":336}],"party_address":3224084,"script_address":0},{"address":3257472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[94,7,244,182],"species":357},{"level":52,"moves":[8,61,156,187],"species":336}],"party_address":3224116,"script_address":0},{"address":3257512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":33,"species":309}],"party_address":3224148,"script_address":0},{"address":3257552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170},{"level":33,"species":330}],"party_address":3224164,"script_address":0},{"address":3257592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":170},{"level":40,"species":330}],"party_address":3224180,"script_address":0},{"address":3257632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":171},{"level":43,"species":330}],"party_address":3224196,"script_address":0},{"address":3257672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":171},{"level":46,"species":331}],"party_address":3224212,"script_address":0},{"address":3257712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":51,"species":171},{"level":49,"species":331}],"party_address":3224228,"script_address":0},{"address":3257752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":118},{"level":25,"species":72}],"party_address":3224244,"script_address":0},{"address":3257792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":129},{"level":20,"species":72},{"level":26,"species":328},{"level":23,"species":330}],"party_address":3224260,"script_address":2061605},{"address":3257832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":288},{"level":8,"species":286}],"party_address":3224292,"script_address":2054707},{"address":3257872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":295},{"level":8,"species":288}],"party_address":3224308,"script_address":2054676},{"address":3257912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":129}],"party_address":3224324,"script_address":2030343},{"address":3257952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":183}],"party_address":3224332,"script_address":2036307},{"address":3257992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":72},{"level":12,"species":72}],"party_address":3224340,"script_address":2036276},{"address":3258032,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":354},{"level":14,"species":353}],"party_address":3224356,"script_address":2039032},{"address":3258072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":337},{"level":14,"species":100}],"party_address":3224372,"script_address":2039063},{"address":3258112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81}],"party_address":3224388,"script_address":2039094},{"address":3258152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":100}],"party_address":3224396,"script_address":2026463},{"address":3258192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":335}],"party_address":3224404,"script_address":2026494},{"address":3258232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":27}],"party_address":3224412,"script_address":2046975},{"address":3258272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":363}],"party_address":3224420,"script_address":2047006},{"address":3258312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306}],"party_address":3224428,"script_address":2046944},{"address":3258352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339}],"party_address":3224436,"script_address":2046913},{"address":3258392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":183},{"level":19,"species":296}],"party_address":3224444,"script_address":2050969},{"address":3258432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":227},{"level":19,"species":305}],"party_address":3224460,"script_address":2051000},{"address":3258472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":318},{"level":18,"species":27}],"party_address":3224476,"script_address":2051031},{"address":3258512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":382},{"level":18,"species":382}],"party_address":3224492,"script_address":2051062},{"address":3258552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":183}],"party_address":3224508,"script_address":2052309},{"address":3258592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3224524,"script_address":2052371},{"address":3258632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":299}],"party_address":3224532,"script_address":2052340},{"address":3258672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":14,"species":382},{"level":14,"species":337}],"party_address":3224540,"script_address":2059128},{"address":3258712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224564,"script_address":2347841},{"address":3258752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224572,"script_address":2347872},{"address":3258792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224580,"script_address":2348597},{"address":3258832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":41}],"party_address":3224588,"script_address":2348628},{"address":3258872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":339}],"party_address":3224604,"script_address":2348659},{"address":3258912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224620,"script_address":2349324},{"address":3258952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224628,"script_address":2349355},{"address":3258992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224636,"script_address":2349386},{"address":3259032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224644,"script_address":2350264},{"address":3259072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224652,"script_address":2350826},{"address":3259112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224660,"script_address":2351566},{"address":3259152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224668,"script_address":2351597},{"address":3259192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224676,"script_address":2351628},{"address":3259232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224684,"script_address":2348566},{"address":3259272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224692,"script_address":2349293},{"address":3259312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224700,"script_address":2350295},{"address":3259352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":339},{"level":28,"species":287},{"level":30,"species":41},{"level":33,"species":340}],"party_address":3224708,"script_address":2351659},{"address":3259392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":310},{"level":33,"species":340}],"party_address":3224740,"script_address":2073763},{"address":3259432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":287},{"level":43,"species":169},{"level":44,"species":340}],"party_address":3224756,"script_address":0},{"address":3259472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":72}],"party_address":3224780,"script_address":2026525},{"address":3259512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183}],"party_address":3224788,"script_address":2026556},{"address":3259552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":27},{"level":25,"species":27}],"party_address":3224796,"script_address":2033726},{"address":3259592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":309}],"party_address":3224812,"script_address":2033695},{"address":3259632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":120}],"party_address":3224828,"script_address":2034744},{"address":3259672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":309},{"level":24,"species":66},{"level":24,"species":72}],"party_address":3224836,"script_address":2034931},{"address":3259712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":338},{"level":24,"species":305},{"level":24,"species":338}],"party_address":3224860,"script_address":2034900},{"address":3259752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":227},{"level":25,"species":227}],"party_address":3224884,"script_address":2036338},{"address":3259792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":183},{"level":22,"species":296}],"party_address":3224900,"script_address":2047037},{"address":3259832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":27},{"level":22,"species":28}],"party_address":3224916,"script_address":2047068},{"address":3259872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":304},{"level":22,"species":299}],"party_address":3224932,"script_address":2047099},{"address":3259912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":18,"species":218}],"party_address":3224948,"script_address":2049891},{"address":3259952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306},{"level":18,"species":363}],"party_address":3224964,"script_address":2049922},{"address":3259992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":84},{"level":26,"species":85}],"party_address":3224980,"script_address":2053203},{"address":3260032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302},{"level":26,"species":367}],"party_address":3224996,"script_address":2053234},{"address":3260072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":64},{"level":26,"species":393}],"party_address":3225012,"script_address":2053265},{"address":3260112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3225028,"script_address":2053296},{"address":3260152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":351}],"party_address":3225044,"script_address":2053327},{"address":3260192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3225060,"script_address":2054738},{"address":3260232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":306},{"level":8,"species":295}],"party_address":3225076,"script_address":2054769},{"address":3260272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3225092,"script_address":2057834},{"address":3260312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3225100,"script_address":2057865},{"address":3260352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":356}],"party_address":3225108,"script_address":2057896},{"address":3260392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":363},{"level":33,"species":357}],"party_address":3225116,"script_address":2073825},{"address":3260432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":338}],"party_address":3225132,"script_address":2061636},{"address":3260472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":218},{"level":25,"species":339}],"party_address":3225140,"script_address":2061667},{"address":3260512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3225156,"script_address":2061698},{"address":3260552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[87,98,86,0],"species":338}],"party_address":3225164,"script_address":2065837},{"address":3260592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":356},{"level":28,"species":335}],"party_address":3225180,"script_address":2065868},{"address":3260632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":292}],"party_address":3225196,"script_address":2067487},{"address":3260672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":335},{"level":25,"species":309},{"level":25,"species":369},{"level":25,"species":288},{"level":25,"species":337},{"level":25,"species":339}],"party_address":3225212,"script_address":2067518},{"address":3260712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":286},{"level":25,"species":306},{"level":25,"species":337},{"level":25,"species":183},{"level":25,"species":27},{"level":25,"species":367}],"party_address":3225260,"script_address":2067549},{"address":3260752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":371},{"level":29,"species":365}],"party_address":3225308,"script_address":2067611},{"address":3260792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3225324,"script_address":1978255},{"address":3260832,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":321},{"level":15,"species":283}],"party_address":3225340,"script_address":1978286},{"address":3260872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[182,205,222,153],"species":76},{"level":35,"moves":[14,58,57,157],"species":140},{"level":35,"moves":[231,153,46,157],"species":95},{"level":37,"moves":[104,153,182,157],"species":320}],"party_address":3225356,"script_address":0},{"address":3260912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[182,58,157,57],"species":138},{"level":37,"moves":[182,205,222,153],"species":76},{"level":40,"moves":[14,58,57,157],"species":141},{"level":40,"moves":[231,153,46,157],"species":95},{"level":42,"moves":[104,153,182,157],"species":320}],"party_address":3225420,"script_address":0},{"address":3260952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[182,58,157,57],"species":139},{"level":42,"moves":[182,205,89,153],"species":76},{"level":45,"moves":[14,58,57,157],"species":141},{"level":45,"moves":[231,153,46,157],"species":95},{"level":47,"moves":[104,153,182,157],"species":320}],"party_address":3225500,"script_address":0},{"address":3260992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[157,63,48,182],"species":142},{"level":47,"moves":[8,205,89,153],"species":76},{"level":47,"moves":[182,58,157,57],"species":139},{"level":50,"moves":[14,58,57,157],"species":141},{"level":50,"moves":[231,153,46,157],"species":208},{"level":52,"moves":[104,153,182,157],"species":320}],"party_address":3225580,"script_address":0},{"address":3261032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[2,157,8,83],"species":68},{"level":33,"moves":[94,113,115,8],"species":356},{"level":35,"moves":[228,68,182,167],"species":237},{"level":37,"moves":[252,8,187,89],"species":336}],"party_address":3225676,"script_address":0},{"address":3261072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[2,157,8,83],"species":68},{"level":38,"moves":[94,113,115,8],"species":357},{"level":40,"moves":[228,68,182,167],"species":237},{"level":42,"moves":[252,8,187,89],"species":336}],"party_address":3225740,"script_address":0},{"address":3261112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[71,182,7,8],"species":107},{"level":43,"moves":[2,157,8,83],"species":68},{"level":43,"moves":[8,113,115,94],"species":357},{"level":45,"moves":[228,68,182,167],"species":237},{"level":47,"moves":[252,8,187,89],"species":336}],"party_address":3225804,"script_address":0},{"address":3261152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[25,8,89,83],"species":106},{"level":46,"moves":[71,182,7,8],"species":107},{"level":48,"moves":[238,157,8,83],"species":68},{"level":48,"moves":[8,113,115,94],"species":357},{"level":50,"moves":[228,68,182,167],"species":237},{"level":52,"moves":[252,8,187,89],"species":336}],"party_address":3225884,"script_address":0},{"address":3261192,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,182,86,113],"species":179},{"level":36,"moves":[205,87,153,240],"species":101},{"level":38,"moves":[48,182,87,240],"species":82},{"level":40,"moves":[44,86,87,182],"species":338}],"party_address":3225980,"script_address":0},{"address":3261232,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[87,21,240,95],"species":25},{"level":41,"moves":[87,182,86,113],"species":180},{"level":41,"moves":[205,87,153,240],"species":101},{"level":43,"moves":[48,182,87,240],"species":82},{"level":45,"moves":[44,86,87,182],"species":338}],"party_address":3226044,"script_address":0},{"address":3261272,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[87,21,240,182],"species":26},{"level":46,"moves":[87,182,86,113],"species":181},{"level":46,"moves":[205,87,153,240],"species":101},{"level":48,"moves":[48,182,87,240],"species":82},{"level":50,"moves":[44,86,87,182],"species":338}],"party_address":3226124,"script_address":0},{"address":3261312,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[129,8,9,113],"species":125},{"level":51,"moves":[87,21,240,182],"species":26},{"level":51,"moves":[87,182,86,113],"species":181},{"level":53,"moves":[205,87,153,240],"species":101},{"level":53,"moves":[48,182,87,240],"species":82},{"level":55,"moves":[44,86,87,182],"species":338}],"party_address":3226204,"script_address":0},{"address":3261352,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[59,213,113,157],"species":219},{"level":36,"moves":[53,213,76,84],"species":77},{"level":38,"moves":[59,241,89,213],"species":340},{"level":40,"moves":[59,241,153,213],"species":321}],"party_address":3226300,"script_address":0},{"address":3261392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[14,53,46,241],"species":58},{"level":43,"moves":[59,213,113,157],"species":219},{"level":41,"moves":[53,213,76,84],"species":77},{"level":43,"moves":[59,241,89,213],"species":340},{"level":45,"moves":[59,241,153,213],"species":321}],"party_address":3226364,"script_address":0},{"address":3261432,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,76,13,241],"species":228},{"level":46,"moves":[14,53,241,46],"species":58},{"level":48,"moves":[59,213,113,157],"species":219},{"level":46,"moves":[53,213,76,84],"species":78},{"level":48,"moves":[59,241,89,213],"species":340},{"level":50,"moves":[59,241,153,213],"species":321}],"party_address":3226444,"script_address":0},{"address":3261472,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":51,"moves":[14,53,241,46],"species":59},{"level":53,"moves":[59,213,113,157],"species":219},{"level":51,"moves":[46,76,13,241],"species":229},{"level":51,"moves":[53,213,76,84],"species":78},{"level":53,"moves":[59,241,89,213],"species":340},{"level":55,"moves":[59,241,153,213],"species":321}],"party_address":3226540,"script_address":0},{"address":3261512,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[113,47,29,8],"species":113},{"level":42,"moves":[59,247,38,126],"species":366},{"level":43,"moves":[42,29,7,95],"species":308},{"level":45,"moves":[63,53,85,247],"species":366}],"party_address":3226636,"script_address":0},{"address":3261552,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[59,247,38,126],"species":366},{"level":47,"moves":[113,47,29,8],"species":113},{"level":45,"moves":[252,146,203,179],"species":115},{"level":48,"moves":[42,29,7,95],"species":308},{"level":50,"moves":[63,53,85,247],"species":366}],"party_address":3226700,"script_address":0},{"address":3261592,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[59,247,38,126],"species":366},{"level":52,"moves":[113,47,29,8],"species":242},{"level":50,"moves":[252,146,203,179],"species":115},{"level":53,"moves":[42,29,7,95],"species":308},{"level":55,"moves":[63,53,85,247],"species":366}],"party_address":3226780,"script_address":0},{"address":3261632,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[59,247,38,126],"species":366},{"level":57,"moves":[182,47,29,8],"species":242},{"level":55,"moves":[252,146,203,179],"species":115},{"level":57,"moves":[36,182,126,89],"species":128},{"level":58,"moves":[42,29,7,95],"species":308},{"level":60,"moves":[63,53,85,247],"species":366}],"party_address":3226860,"script_address":0},{"address":3261672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[86,85,182,58],"species":147},{"level":38,"moves":[241,76,76,89],"species":369},{"level":41,"moves":[57,48,182,76],"species":310},{"level":43,"moves":[18,191,211,76],"species":227},{"level":45,"moves":[76,156,93,89],"species":359}],"party_address":3226956,"script_address":0},{"address":3261712,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[95,94,115,138],"species":163},{"level":43,"moves":[241,76,76,89],"species":369},{"level":45,"moves":[86,85,182,58],"species":148},{"level":46,"moves":[57,48,182,76],"species":310},{"level":48,"moves":[18,191,211,76],"species":227},{"level":50,"moves":[76,156,93,89],"species":359}],"party_address":3227036,"script_address":0},{"address":3261752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[95,94,115,138],"species":164},{"level":49,"moves":[241,76,76,89],"species":369},{"level":50,"moves":[86,85,182,58],"species":148},{"level":51,"moves":[57,48,182,76],"species":310},{"level":53,"moves":[18,191,211,76],"species":227},{"level":55,"moves":[76,156,93,89],"species":359}],"party_address":3227132,"script_address":0},{"address":3261792,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,94,115,138],"species":164},{"level":54,"moves":[241,76,76,89],"species":369},{"level":55,"moves":[57,48,182,76],"species":310},{"level":55,"moves":[63,85,89,58],"species":149},{"level":58,"moves":[18,191,211,76],"species":227},{"level":60,"moves":[143,156,93,89],"species":359}],"party_address":3227228,"script_address":0},{"address":3261832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[25,94,91,182],"species":79},{"level":49,"moves":[89,246,94,113],"species":319},{"level":49,"moves":[94,156,109,91],"species":178},{"level":50,"moves":[89,94,156,91],"species":348},{"level":50,"moves":[241,76,94,53],"species":349}],"party_address":3227324,"script_address":0},{"address":3261872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,138,29,182],"species":96},{"level":53,"moves":[25,94,91,182],"species":79},{"level":54,"moves":[89,153,94,113],"species":319},{"level":54,"moves":[94,156,109,91],"species":178},{"level":55,"moves":[89,94,156,91],"species":348},{"level":55,"moves":[241,76,94,53],"species":349}],"party_address":3227404,"script_address":0},{"address":3261912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":58,"moves":[95,138,29,182],"species":97},{"level":59,"moves":[89,153,94,113],"species":319},{"level":58,"moves":[25,94,91,182],"species":79},{"level":59,"moves":[94,156,109,91],"species":178},{"level":60,"moves":[89,94,156,91],"species":348},{"level":60,"moves":[241,76,94,53],"species":349}],"party_address":3227500,"script_address":0},{"address":3261952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":63,"moves":[95,138,29,182],"species":97},{"level":64,"moves":[89,153,94,113],"species":319},{"level":63,"moves":[25,94,91,182],"species":199},{"level":64,"moves":[94,156,109,91],"species":178},{"level":65,"moves":[89,94,156,91],"species":348},{"level":65,"moves":[241,76,94,53],"species":349}],"party_address":3227596,"script_address":0},{"address":3261992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[95,240,182,56],"species":60},{"level":46,"moves":[240,96,104,90],"species":324},{"level":48,"moves":[96,34,182,58],"species":343},{"level":48,"moves":[156,152,13,104],"species":327},{"level":51,"moves":[96,104,58,156],"species":230}],"party_address":3227692,"script_address":0},{"address":3262032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[95,240,182,56],"species":61},{"level":51,"moves":[240,96,104,90],"species":324},{"level":53,"moves":[96,34,182,58],"species":343},{"level":53,"moves":[156,12,13,104],"species":327},{"level":56,"moves":[96,104,58,156],"species":230}],"party_address":3227772,"script_address":0},{"address":3262072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[56,195,58,109],"species":131},{"level":58,"moves":[240,96,104,90],"species":324},{"level":56,"moves":[95,240,182,56],"species":61},{"level":58,"moves":[96,34,182,58],"species":343},{"level":58,"moves":[156,12,13,104],"species":327},{"level":61,"moves":[96,104,58,156],"species":230}],"party_address":3227852,"script_address":0},{"address":3262112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":61,"moves":[56,195,58,109],"species":131},{"level":63,"moves":[240,96,104,90],"species":324},{"level":61,"moves":[95,240,56,195],"species":186},{"level":63,"moves":[96,34,182,73],"species":343},{"level":63,"moves":[156,12,13,104],"species":327},{"level":66,"moves":[96,104,58,156],"species":230}],"party_address":3227948,"script_address":0},{"address":3262152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[95,98,204,0],"species":387},{"level":17,"moves":[95,98,109,0],"species":386}],"party_address":3228044,"script_address":2167732},{"address":3262192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":369}],"party_address":3228076,"script_address":2202422},{"address":3262232,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":77,"moves":[92,76,191,211],"species":227},{"level":75,"moves":[115,113,246,89],"species":319},{"level":76,"moves":[87,89,76,81],"species":384},{"level":76,"moves":[202,246,19,109],"species":389},{"level":76,"moves":[96,246,76,163],"species":391},{"level":78,"moves":[89,94,53,247],"species":400}],"party_address":3228084,"script_address":2354502},{"address":3262272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228180,"script_address":0},{"address":3262312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228188,"script_address":0},{"address":3262352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228196,"script_address":0},{"address":3262392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228204,"script_address":0},{"address":3262432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228212,"script_address":0},{"address":3262472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228220,"script_address":0},{"address":3262512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228228,"script_address":0},{"address":3262552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":27}],"party_address":3228236,"script_address":0},{"address":3262592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":320},{"level":33,"species":27},{"level":33,"species":27}],"party_address":3228252,"script_address":0},{"address":3262632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":320},{"level":35,"species":27},{"level":35,"species":27}],"party_address":3228276,"script_address":0},{"address":3262672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":320},{"level":37,"species":28},{"level":37,"species":28}],"party_address":3228300,"script_address":0},{"address":3262712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":309},{"level":30,"species":66},{"level":30,"species":72}],"party_address":3228324,"script_address":0},{"address":3262752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":66},{"level":32,"species":72}],"party_address":3228348,"script_address":0},{"address":3262792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":66},{"level":34,"species":73}],"party_address":3228372,"script_address":0},{"address":3262832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":310},{"level":36,"species":67},{"level":36,"species":73}],"party_address":3228396,"script_address":0},{"address":3262872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":120},{"level":37,"species":120}],"party_address":3228420,"script_address":0},{"address":3262912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":309},{"level":39,"species":120},{"level":39,"species":120}],"party_address":3228436,"script_address":0},{"address":3262952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":310},{"level":41,"species":120},{"level":41,"species":120}],"party_address":3228460,"script_address":0},{"address":3262992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":310},{"level":43,"species":121},{"level":43,"species":121}],"party_address":3228484,"script_address":0},{"address":3263032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":67},{"level":37,"species":67}],"party_address":3228508,"script_address":0},{"address":3263072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":335},{"level":39,"species":67},{"level":39,"species":67}],"party_address":3228524,"script_address":0},{"address":3263112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":336},{"level":41,"species":67},{"level":41,"species":67}],"party_address":3228548,"script_address":0},{"address":3263152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":336},{"level":43,"species":68},{"level":43,"species":68}],"party_address":3228572,"script_address":0},{"address":3263192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":371},{"level":35,"species":365}],"party_address":3228596,"script_address":0},{"address":3263232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":308},{"level":37,"species":371},{"level":37,"species":365}],"party_address":3228612,"script_address":0},{"address":3263272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":308},{"level":39,"species":371},{"level":39,"species":365}],"party_address":3228636,"script_address":0},{"address":3263312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":308},{"level":41,"species":372},{"level":41,"species":366}],"party_address":3228660,"script_address":0},{"address":3263352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":337},{"level":35,"species":337},{"level":35,"species":371}],"party_address":3228684,"script_address":0},{"address":3263392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":337},{"level":37,"species":338},{"level":37,"species":371}],"party_address":3228708,"script_address":0},{"address":3263432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":338},{"level":39,"species":338},{"level":39,"species":371}],"party_address":3228732,"script_address":0},{"address":3263472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":338},{"level":41,"species":338},{"level":41,"species":372}],"party_address":3228756,"script_address":0},{"address":3263512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":74},{"level":26,"species":339}],"party_address":3228780,"script_address":0},{"address":3263552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":66},{"level":28,"species":339},{"level":28,"species":75}],"party_address":3228796,"script_address":0},{"address":3263592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":66},{"level":30,"species":339},{"level":30,"species":75}],"party_address":3228820,"script_address":0},{"address":3263632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":340},{"level":33,"species":76}],"party_address":3228844,"script_address":0},{"address":3263672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":315},{"level":31,"species":287},{"level":31,"species":288},{"level":31,"species":295},{"level":31,"species":298},{"level":31,"species":304}],"party_address":3228868,"script_address":0},{"address":3263712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":315},{"level":33,"species":287},{"level":33,"species":289},{"level":33,"species":296},{"level":33,"species":299},{"level":33,"species":304}],"party_address":3228916,"script_address":0},{"address":3263752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316},{"level":35,"species":287},{"level":35,"species":289},{"level":35,"species":296},{"level":35,"species":299},{"level":35,"species":305}],"party_address":3228964,"script_address":0},{"address":3263792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":316},{"level":37,"species":287},{"level":37,"species":289},{"level":37,"species":297},{"level":37,"species":300},{"level":37,"species":305}],"party_address":3229012,"script_address":0},{"address":3263832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313},{"level":34,"species":116}],"party_address":3229060,"script_address":0},{"address":3263872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":325},{"level":36,"species":313},{"level":36,"species":117}],"party_address":3229076,"script_address":0},{"address":3263912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":325},{"level":38,"species":313},{"level":38,"species":117}],"party_address":3229100,"script_address":0},{"address":3263952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325},{"level":40,"species":314},{"level":40,"species":230}],"party_address":3229124,"script_address":0},{"address":3263992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":411}],"party_address":3229148,"script_address":2564791},{"address":3264032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":64}],"party_address":3229156,"script_address":2564822},{"address":3264072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":202}],"party_address":3229172,"script_address":0},{"address":3264112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":4}],"party_address":3229180,"script_address":0},{"address":3264152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":1}],"party_address":3229188,"script_address":0},{"address":3264192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":405}],"party_address":3229196,"script_address":0},{"address":3264232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":404}],"party_address":3229204,"script_address":0}],"warps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4":"MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0","MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2":"MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1","MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10","MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2":"MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11","MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3":"MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2","MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0":"MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4","MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3":"MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5","MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2":"MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6","MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4":"MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7","MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0":"MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8","MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9","MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2":"MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0","MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0":"MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1","MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0":"MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2","MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1":"MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3","MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2":"MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4","MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0":"MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5","MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10":"MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6","MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9":"MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7","MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0":"MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0","MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2","MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3","MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0":"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8","MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8":"MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0","MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11":"MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2","MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0","MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0","MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3","MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4","MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0","MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1","MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2","MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0","MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0":"MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0","MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0":"MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0","MAP_ALTERING_CAVE:0/MAP_ROUTE103:0":"MAP_ROUTE103:0/MAP_ALTERING_CAVE:0","MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0":"MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0","MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2":"MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1","MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1":"MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2","MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6":"MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0","MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0":"MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2","MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2":"MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0","MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0":"MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1","MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6":"MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10","MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22":"MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11","MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9":"MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12","MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18":"MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13","MAP_AQUA_HIDEOUT_B1F:14/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16":"MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15","MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15":"MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16","MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20":"MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17","MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13":"MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18","MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24":"MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19","MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1":"MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2","MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:21/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11":"MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22","MAP_AQUA_HIDEOUT_B1F:23/MAP_AQUA_HIDEOUT_B1F:17!":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19":"MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24","MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2":"MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3","MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7":"MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4","MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8":"MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5","MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10":"MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6","MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5":"MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8","MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1":"MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0","MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2":"MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1","MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3":"MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2","MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5":"MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3","MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8":"MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4","MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3":"MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5","MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7":"MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6","MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6":"MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7","MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4":"MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8","MAP_AQUA_HIDEOUT_B2F:9/MAP_AQUA_HIDEOUT_B1F:4!":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0","MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1":"MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1","MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0","MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1":"MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1","MAP_BATTLE_COLOSSEUM_2P:0,1/MAP_DYNAMIC:-1!":"","MAP_BATTLE_COLOSSEUM_4P:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:3/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0!":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2","MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2","MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0","MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0","MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0","MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0","MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0","MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0","MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0","MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0","MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0","MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0","MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0":"MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0":"MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0":"MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0":"MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0":"MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0":"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0":"MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0":"MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0":"MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0":"MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0":"MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0":"MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0":"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0":"MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0":"MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1","MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0","MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0":"MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0","MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0":"MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0","MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1":"MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0","MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3":"MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0":"MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:0/MAP_CAVE_OF_ORIGIN_1F:1!":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:1/MAP_CAVE_OF_ORIGIN_B1F:0!":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_DESERT_RUINS:0/MAP_ROUTE111:1":"MAP_ROUTE111:1/MAP_DESERT_RUINS:0","MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2":"MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1","MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1":"MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2","MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0","MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0":"MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0","MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1","MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0":"MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2","MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0":"MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3","MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0":"MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4","MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2":"MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0","MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0":"MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0","MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3":"MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0","MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4":"MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1":"MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0","MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1","MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0":"MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2","MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1":"MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1":"MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0":"MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1":"MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0":"MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1":"MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0":"MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1","MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0","MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1","MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0","MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1","MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0","MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1","MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0","MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1","MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0","MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1","MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1":"MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0":"MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1":"MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0":"MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0":"MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1":"MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0":"MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1","MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0":"MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0","MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0":"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1","MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2","MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0":"MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3","MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0":"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4","MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1":"MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0","MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3":"MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0","MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0":"MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0","MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4":"MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2":"MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1":"MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1","MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1":"MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1","MAP_FIERY_PATH:0/MAP_ROUTE112:4":"MAP_ROUTE112:4/MAP_FIERY_PATH:0","MAP_FIERY_PATH:1/MAP_ROUTE112:5":"MAP_ROUTE112:5/MAP_FIERY_PATH:1","MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0","MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0":"MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1","MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0":"MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2","MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0":"MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3","MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0":"MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4","MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0":"MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5","MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0":"MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6","MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0":"MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7","MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0":"MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8","MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8":"MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0","MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2":"MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0","MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1":"MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0","MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4":"MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0","MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5":"MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0","MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6":"MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0","MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7":"MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0","MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3":"MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0":"MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2","MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0","MAP_FORTREE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FORTREE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0":"MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0","MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0":"MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1","MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1":"MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2","MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0":"MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3","MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1":"MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0","MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2":"MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1","MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0":"MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2","MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1":"MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3","MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2":"MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4","MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3":"MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5","MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4":"MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6","MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2":"MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0","MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3":"MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1","MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4":"MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2","MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5":"MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3","MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6":"MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4","MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3":"MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0","MAP_INSIDE_OF_TRUCK:0,1,2/MAP_DYNAMIC:-1!":"","MAP_ISLAND_CAVE:0/MAP_ROUTE105:0":"MAP_ROUTE105:0/MAP_ISLAND_CAVE:0","MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2":"MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1","MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1":"MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2","MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3":"MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1","MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3":"MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3","MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0":"MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4","MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0":"MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0","MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0":"MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1","MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0":"MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2","MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3","MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0":"MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4","MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5","MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1":"MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0","MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8":"MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10","MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9":"MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11","MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10":"MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12","MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11":"MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13","MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12":"MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14","MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13":"MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15","MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14":"MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16","MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15":"MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17","MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16":"MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18","MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17":"MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19","MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0":"MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2","MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18":"MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20","MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20":"MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21","MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19":"MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22","MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21":"MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23","MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22":"MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24","MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23":"MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25","MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2":"MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3","MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4":"MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4","MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3":"MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5","MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1":"MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6","MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5":"MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7","MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6":"MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8","MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7":"MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9","MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2":"MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0","MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6":"MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1","MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12":"MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10","MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13":"MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11","MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14":"MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12","MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15":"MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13","MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16":"MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14","MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17":"MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15","MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18":"MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16","MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19":"MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17","MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20":"MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18","MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22":"MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19","MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3":"MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2","MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21":"MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20","MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23":"MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21","MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24":"MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22","MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25":"MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23","MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5":"MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3","MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4":"MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4","MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7":"MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5","MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8":"MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6","MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9":"MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7","MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10":"MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8","MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11":"MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9","MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0":"MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0","MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4":"MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0","MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2":"MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3":"MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5":"MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0","MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1","MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0":"MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10","MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0":"MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11","MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0":"MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12","MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2","MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13","MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4","MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1":"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5","MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0":"MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6","MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0":"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7","MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0":"MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8","MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0":"MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9","MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0","MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1","MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4":"MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0","MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0":"MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2","MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1":"MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1":"MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:3/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!":"","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0","MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12":"MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0","MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8":"MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0","MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9":"MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0","MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10":"MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0","MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11":"MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13":"MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0","MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7":"MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2":"MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5":"MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1","MAP_LILYCOVE_CITY_UNUSED_MART:0,1/MAP_LILYCOVE_CITY:0!":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0","MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1","MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0":"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1":"MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0":"MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2":"MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0","MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4":"MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0","MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1":"MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1","MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1":"MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2","MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0":"MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3","MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0":"MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0","MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1":"MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1","MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2":"MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2","MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0":"MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0","MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2":"MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1","MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3":"MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0","MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0":"MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1","MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0":"MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0","MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0":"MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1","MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2":"MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2","MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1":"MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0","MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1":"MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0","MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1":"MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1","MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0":"MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0","MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1":"MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1","MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0":"MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0","MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0":"MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0","MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0":"MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0","MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1","MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0":"MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2","MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0":"MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3","MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0":"MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4","MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0":"MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5","MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0":"MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6","MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2":"MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0","MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5":"MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0","MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0":"MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0","MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4":"MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0","MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6":"MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0","MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3":"MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1":"MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0":"MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0","MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0":"MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1","MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0":"MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2","MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4":"MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3","MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5":"MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4","MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0":"MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5","MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2":"MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0","MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0":"MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1","MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1":"MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2","MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2":"MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3","MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1":"MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0","MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2":"MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1","MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3":"MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2","MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0":"MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3","MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3":"MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4","MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4":"MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5","MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3":"MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0","MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5":"MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0","MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3":"MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0","MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1":"MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1","MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0":"MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0","MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1":"MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1","MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0":"MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0","MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0":"MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1","MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1":"MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0","MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0":"MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0","MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0":"MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1","MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2","MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0":"MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3","MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0":"MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4","MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0":"MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5","MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0":"MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6","MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1":"MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7","MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8","MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9":"MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2","MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0","MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1":"MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0","MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11":"MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10","MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10":"MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11","MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13":"MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12","MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12":"MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13","MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3":"MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2","MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2":"MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3","MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5":"MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4","MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4":"MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5","MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7":"MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6","MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6":"MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7","MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9":"MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8","MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8":"MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9","MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0":"MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0","MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3":"MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0","MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5":"MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0","MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7":"MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1","MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4":"MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2":"MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8":"MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2","MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0","MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6":"MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0","MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1":"MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1","MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3":"MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3","MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1":"MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1","MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0":"MAP_ROUTE122:0/MAP_MT_PYRE_1F:0","MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0":"MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1","MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0":"MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4","MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4":"MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5","MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4":"MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0","MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0":"MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1","MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4":"MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2","MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5":"MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3","MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5":"MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4","MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1":"MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0","MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1":"MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1","MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4":"MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2","MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5":"MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3","MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2":"MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4","MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3":"MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5","MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1":"MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0","MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1":"MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1","MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3":"MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2","MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4":"MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3","MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2":"MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4","MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3":"MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5","MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0":"MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0","MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0":"MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1","MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1":"MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2","MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2":"MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3","MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3":"MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4","MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0":"MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0","MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2":"MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1","MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1":"MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0","MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1":"MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1","MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1":"MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1","MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0":"MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0","MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1":"MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1","MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0":"MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0","MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2":"MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0","MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0":"MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1","MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1":"MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0","MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0":"MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1","MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1":"MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0","MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0":"MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1","MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1":"MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0","MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0":"MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1","MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1":"MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0","MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0":"MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1","MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1":"MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0","MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0":"MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1","MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1":"MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0","MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0":"MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1","MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1":"MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0","MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0":"MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1","MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1":"MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0","MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0":"MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1","MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1":"MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0","MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1":"MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1","MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0":"MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0","MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1":"MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1","MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0":"MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0","MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1":"MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1","MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0":"MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0","MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1":"MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1","MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0":"MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0","MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1":"MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1","MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0":"MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2","MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0":"MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0","MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1":"MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0","MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0":"MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0","MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0":"MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1","MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1":"MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0","MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0":"MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1","MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1":"MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0","MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0":"MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1","MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1":"MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0","MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0":"MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1","MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0":"MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0","MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0":"MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1","MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1":"MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0","MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0":"MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0","MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0":"MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1","MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2","MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0":"MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3","MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0":"MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0","MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1":"MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0","MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3":"MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2":"MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0","MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0":"MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1","MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0":"MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2","MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0":"MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3","MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0":"MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4","MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0":"MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5","MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1":"MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0","MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2":"MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0","MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3":"MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0","MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4":"MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0","MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5":"MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0":"MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0":"MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0","MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0":"MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1","MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0":"MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2","MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3","MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0":"MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4","MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0":"MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5","MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2":"MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0","MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8":"MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10","MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9":"MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12","MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16":"MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14","MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18":"MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15","MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14":"MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16","MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15":"MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18","MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3":"MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2","MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24":"MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20","MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26":"MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21","MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28":"MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22","MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30":"MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23","MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20":"MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24","MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21":"MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26","MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22":"MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28","MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2":"MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3","MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23":"MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30","MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34":"MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32","MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36":"MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33","MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32":"MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34","MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33":"MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36","MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6":"MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5","MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5":"MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6","MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10":"MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8","MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12":"MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9","MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0":"MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0","MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4":"MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0","MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5":"MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3":"MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1":"MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0","MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3":"MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1","MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5":"MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3","MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7":"MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5","MAP_RECORD_CORNER:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_ROUTE103:0/MAP_ALTERING_CAVE:0":"MAP_ALTERING_CAVE:0/MAP_ROUTE103:0","MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0":"MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0","MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0":"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1","MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1":"MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3","MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3":"MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5","MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5":"MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7","MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0":"MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0","MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1":"MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0","MAP_ROUTE105:0/MAP_ISLAND_CAVE:0":"MAP_ISLAND_CAVE:0/MAP_ROUTE105:0","MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0":"MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0","MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0":"MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0","MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0":"MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0","MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0":"MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0","MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0":"MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0","MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1","MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2","MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3","MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4","MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4":"MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5":"MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2":"MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3":"MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1":"MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:2,3/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0","MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0":"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1":"MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0":"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0","MAP_ROUTE111:1/MAP_DESERT_RUINS:0":"MAP_DESERT_RUINS:0/MAP_ROUTE111:1","MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0":"MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2","MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0":"MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3","MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0":"MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4","MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2":"MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0","MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0":"MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0","MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1":"MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1","MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1":"MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3","MAP_ROUTE112:4/MAP_FIERY_PATH:0":"MAP_FIERY_PATH:0/MAP_ROUTE112:4","MAP_ROUTE112:5/MAP_FIERY_PATH:1":"MAP_FIERY_PATH:1/MAP_ROUTE112:5","MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1":"MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1","MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0":"MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0","MAP_ROUTE113:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0":"MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0","MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0":"MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0","MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1","MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0":"MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2","MAP_ROUTE114:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1":"MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0":"MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2","MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2":"MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0","MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1":"MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0","MAP_ROUTE115:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE115:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0":"MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0","MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0":"MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1","MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2":"MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2","MAP_ROUTE116:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1":"MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0","MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0":"MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0","MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0":"MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0","MAP_ROUTE118:0/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE118:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0","MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0":"MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1","MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1":"MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0":"MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2","MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0","MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0":"MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0","MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0":"MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1","MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0":"MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0":"MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2","MAP_ROUTE122:0/MAP_MT_PYRE_1F:0":"MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0","MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0":"MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0","MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0":"MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0","MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0":"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0","MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0":"MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0","MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0","MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0":"MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0","MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0":"MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0","MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0":"MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1","MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0":"MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10","MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0":"MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11","MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0":"MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2","MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3","MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0":"MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4","MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6","MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0":"MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7","MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0":"MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8","MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0":"MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9","MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8":"MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0","MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6":"MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1","MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2","MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0","MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1","MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0","MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1":"MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0","MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0":"MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2","MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2":"MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0","MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10":"MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0","MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0":"MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2","MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2":"MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0","MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0":"MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1","MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1":"MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0","MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0":"MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0","MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7":"MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0","MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9":"MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0","MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11":"MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0","MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2":"MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3":"MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4":"MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0","MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0":"MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0","MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4":"MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1","MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2":"MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2","MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0":"MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0","MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0","MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0":"MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0","MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1":"MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:0/MAP_UNDERWATER_ROUTE128:0!":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0":"MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1","MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0":"MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1","MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0":"MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2","MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2":"MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0","MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0":"MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1","MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0":"MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2","MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0":"MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3","MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1":"MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0","MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1":"MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1","MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1":"MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2","MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1":"MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0","MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1":"MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1","MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2":"MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2","MAP_SEAFLOOR_CAVERN_ROOM4:3/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1":"MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0","MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1":"MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1","MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2":"MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2","MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2":"MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0","MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2":"MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1","MAP_SEAFLOOR_CAVERN_ROOM6:2/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3":"MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0","MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1":"MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1","MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0":"MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0","MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0":"MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1","MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0":"MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0","MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0":"MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0","MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0":"MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0","MAP_SECRET_BASE_BLUE_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0":"MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1","MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1":"MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0","MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0":"MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2","MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2":"MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0","MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0":"MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1","MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1":"MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0","MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0":"MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1","MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1":"MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2","MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1":"MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0","MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2":"MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1","MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0":"MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2","MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2":"MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0","MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0":"MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1","MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0":"MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0","MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0":"MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1","MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1":"MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0","MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0":"MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1","MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1":"MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0","MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0","MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0":"MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1","MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0":"MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10","MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2","MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0":"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3","MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0":"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4","MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7","MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0":"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6","MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0":"MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8","MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2":"MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9","MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3":"MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0","MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8":"MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0","MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9":"MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2","MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10":"MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0","MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1":"MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0","MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6":"MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7":"MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0":"MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4":"MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2":"MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0","MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0","MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0":"MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1","MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0":"MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10","MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0":"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11","MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12","MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0":"MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2","MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0":"MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3","MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0":"MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4","MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0":"MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5","MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0":"MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6","MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0":"MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7","MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0":"MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8","MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0":"MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9","MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2":"MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0","MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0":"MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2","MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2":"MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0","MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4":"MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0","MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5":"MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0","MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6":"MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0","MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7":"MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0","MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8":"MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0","MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9":"MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0","MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10":"MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0","MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11":"MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0","MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1":"MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12":"MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0":"MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1":"MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1","MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1":"MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1","MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0":"MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0","MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2":"MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1","MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4":"MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2","MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6":"MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3","MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8":"MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4","MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9":"MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5","MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10":"MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6","MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11":"MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7","MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0":"MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8","MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8":"MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0","MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0":"MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0","MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6":"MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10","MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7":"MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11","MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1":"MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2","MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2":"MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4","MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3":"MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6","MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4":"MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8","MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5":"MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9","MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1":"MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0","MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!":"","MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0":"MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1","MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!":"","MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2":"MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0","MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0":"MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1","MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1":"MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0","MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0":"MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1","MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1":"MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0","MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0":"MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1","MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1":"MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0","MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0":"MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1","MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1":"MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1","MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4":"MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0","MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0":"MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2","MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1":"MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0","MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1":"MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1","MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!":"","MAP_UNDERWATER_ROUTE105:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE105:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0":"MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0","MAP_UNDERWATER_ROUTE127:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE127:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0":"MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0","MAP_UNDERWATER_ROUTE129:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE129:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0":"MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0","MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0":"MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0","MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0":"MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0","MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!":"","MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0":"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0","MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0":"MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1","MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2","MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0":"MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3","MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1":"MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4","MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0":"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5","MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0":"MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6","MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0":"MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0","MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5":"MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0","MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6":"MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0","MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1":"MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2":"MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3":"MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0","MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2":"MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0","MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3":"MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1","MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5":"MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2","MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2":"MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3","MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4":"MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4","MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0":"MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0","MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2":"MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1","MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3":"MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2","MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1":"MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3","MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4":"MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4","MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2":"MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5","MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3":"MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6","MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0":"MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0","MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3":"MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1","MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1":"MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2","MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6":"MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3"}} diff --git a/worlds/pokemon_emerald/pokemon.py b/worlds/pokemon_emerald/pokemon.py index fec1101dab..6f2676500d 100644 --- a/worlds/pokemon_emerald/pokemon.py +++ b/worlds/pokemon_emerald/pokemon.py @@ -4,7 +4,8 @@ Functions related to pokemon species and moves import functools from typing import TYPE_CHECKING, Dict, List, Set, Optional, Tuple -from .data import (NUM_REAL_SPECIES, OUT_OF_LOGIC_MAPS, EncounterTableData, LearnsetMove, SpeciesData, data) +from .data import (NUM_REAL_SPECIES, OUT_OF_LOGIC_MAPS, EncounterType, EncounterTableData, LearnsetMove, SpeciesData, + MapData, data) from .options import (Goal, HmCompatibility, LevelUpMoves, RandomizeAbilities, RandomizeLegendaryEncounters, RandomizeMiscPokemon, RandomizeStarters, RandomizeTypes, RandomizeWildPokemon, TmTutorCompatibility) @@ -226,6 +227,42 @@ def randomize_types(world: "PokemonEmeraldWorld") -> None: evolutions += [world.modified_species[evo.species_id] for evo in evolution.evolutions] +_encounter_subcategory_ranges: Dict[EncounterType, Dict[range, Optional[str]]] = { + EncounterType.LAND: {range(0, 12): None}, + EncounterType.WATER: {range(0, 5): None}, + EncounterType.FISHING: {range(0, 2): "OLD_ROD", range(2, 5): "GOOD_ROD", range(5, 10): "SUPER_ROD"}, +} + + +def _rename_wild_events(world: "PokemonEmeraldWorld", map_data: MapData, new_slots: List[int], encounter_type: EncounterType): + """ + Renames the events that correspond to wild encounters to reflect the new species there after randomization + """ + for i, new_species_id in enumerate(new_slots): + # Get the subcategory for rods + subcategory_range, subcategory_name = next( + (r, sc) + for r, sc in _encounter_subcategory_ranges[encounter_type].items() + if i in r + ) + subcategory_species = [] + for k in subcategory_range: + if new_slots[k] not in subcategory_species: + subcategory_species.append(new_slots[k]) + + # Create the name of the location that corresponds to this encounter slot + # Fishing locations include the rod name + subcategory_str = "" if subcategory_name is None else "_" + subcategory_name + encounter_location_index = subcategory_species.index(new_species_id) + 1 + encounter_location_name = f"{map_data.name}_{encounter_type.value}_ENCOUNTERS{subcategory_str}_{encounter_location_index}" + try: + # Get the corresponding location and change the event name to reflect the new species + slot_location = world.multiworld.get_location(encounter_location_name, world.player) + slot_location.item.name = f"CATCH_{data.species[new_species_id].name}" + except KeyError: + pass # Map probably isn't included; should be careful here about bad encounter location names + + def randomize_wild_encounters(world: "PokemonEmeraldWorld") -> None: if world.options.wild_pokemon == RandomizeWildPokemon.option_vanilla: return @@ -253,120 +290,96 @@ def randomize_wild_encounters(world: "PokemonEmeraldWorld") -> None: placed_priority_species = False map_data = world.modified_maps[map_name] - new_encounters: List[Optional[EncounterTableData]] = [None, None, None] - old_encounters = [map_data.land_encounters, map_data.water_encounters, map_data.fishing_encounters] + new_encounters: Dict[EncounterType, EncounterTableData] = {} - for i, table in enumerate(old_encounters): - if table is not None: - # Create a map from the original species to new species - # instead of just randomizing every slot. - # Force area 1-to-1 mapping, in other words. - species_old_to_new_map: Dict[int, int] = {} - for species_id in table.slots: - if species_id not in species_old_to_new_map: - if not placed_priority_species and len(priority_species) > 0 \ - and map_name not in OUT_OF_LOGIC_MAPS: - new_species_id = priority_species.pop() - placed_priority_species = True - else: - original_species = data.species[species_id] + for encounter_type, table in map_data.encounters.items(): + # Create a map from the original species to new species + # instead of just randomizing every slot. + # Force area 1-to-1 mapping, in other words. + species_old_to_new_map: Dict[int, int] = {} + for species_id in table.slots: + if species_id not in species_old_to_new_map: + if not placed_priority_species and len(priority_species) > 0 \ + and encounter_type != EncounterType.ROCK_SMASH and map_name not in OUT_OF_LOGIC_MAPS: + new_species_id = priority_species.pop() + placed_priority_species = True + else: + original_species = data.species[species_id] - # Construct progressive tiers of blacklists that can be peeled back if they - # collectively cover too much of the pokedex. A lower index in `blacklists` - # indicates a more important set of species to avoid. Entries at `0` will - # always be blacklisted. - blacklists: Dict[int, List[Set[int]]] = defaultdict(list) + # Construct progressive tiers of blacklists that can be peeled back if they + # collectively cover too much of the pokedex. A lower index in `blacklists` + # indicates a more important set of species to avoid. Entries at `0` will + # always be blacklisted. + blacklists: Dict[int, List[Set[int]]] = defaultdict(list) - # Blacklist pokemon already on this table - blacklists[0].append(set(species_old_to_new_map.values())) + # Blacklist pokemon already on this table + blacklists[0].append(set(species_old_to_new_map.values())) - # If doing legendary hunt, blacklist Latios from wild encounters so - # it can be tracked as the roamer. Otherwise it may be impossible - # to tell whether a highlighted route is the roamer or a wild - # encounter. - if world.options.goal == Goal.option_legendary_hunt: - blacklists[0].append({data.constants["SPECIES_LATIOS"]}) + # If doing legendary hunt, blacklist Latios from wild encounters so + # it can be tracked as the roamer. Otherwise it may be impossible + # to tell whether a highlighted route is the roamer or a wild + # encounter. + if world.options.goal == Goal.option_legendary_hunt: + blacklists[0].append({data.constants["SPECIES_LATIOS"]}) - # If dexsanity/catch 'em all mode, blacklist already placed species - # until every species has been placed once - if world.options.dexsanity and len(already_placed) < num_placeable_species: - blacklists[1].append(already_placed) + # If dexsanity/catch 'em all mode, blacklist already placed species + # until every species has been placed once + if world.options.dexsanity and len(already_placed) < num_placeable_species: + blacklists[1].append(already_placed) - # Blacklist from player options - blacklists[2].append(world.blacklisted_wilds) + # Blacklist from player options + blacklists[2].append(world.blacklisted_wilds) - # Type matching blacklist - if should_match_type: - blacklists[3].append({ - species.species_id - for species in world.modified_species.values() - if not bool(set(species.types) & set(original_species.types)) - }) - - merged_blacklist: Set[int] = set() - for max_priority in reversed(sorted(blacklists.keys())): - merged_blacklist = set() - for priority in blacklists.keys(): - if priority <= max_priority: - for blacklist in blacklists[priority]: - merged_blacklist |= blacklist - - if len(merged_blacklist) < NUM_REAL_SPECIES: - break - else: - raise RuntimeError("This should never happen") - - candidates = [ - species + # Type matching blacklist + if should_match_type: + blacklists[3].append({ + species.species_id for species in world.modified_species.values() - if species.species_id not in merged_blacklist - ] + if not bool(set(species.types) & set(original_species.types)) + }) - if should_match_bst: - candidates = filter_species_by_nearby_bst(candidates, sum(original_species.base_stats)) + merged_blacklist: Set[int] = set() + for max_priority in reversed(sorted(blacklists.keys())): + merged_blacklist = set() + for priority in blacklists.keys(): + if priority <= max_priority: + for blacklist in blacklists[priority]: + merged_blacklist |= blacklist - new_species_id = world.random.choice(candidates).species_id - species_old_to_new_map[species_id] = new_species_id + if len(merged_blacklist) < NUM_REAL_SPECIES: + break + else: + raise RuntimeError("This should never happen") - if world.options.dexsanity and map_name not in OUT_OF_LOGIC_MAPS: - already_placed.add(new_species_id) + candidates = [ + species + for species in world.modified_species.values() + if species.species_id not in merged_blacklist + ] - # Actually create the new list of slots and encounter table - new_slots: List[int] = [] - for species_id in table.slots: - new_slots.append(species_old_to_new_map[species_id]) + if should_match_bst: + candidates = filter_species_by_nearby_bst(candidates, sum(original_species.base_stats)) - new_encounters[i] = EncounterTableData(new_slots, table.address) + new_species_id = world.random.choice(candidates).species_id - # Rename event items for the new wild pokemon species - slot_category: Tuple[str, List[Tuple[Optional[str], range]]] = [ - ("LAND", [(None, range(0, 12))]), - ("WATER", [(None, range(0, 5))]), - ("FISHING", [("OLD_ROD", range(0, 2)), ("GOOD_ROD", range(2, 5)), ("SUPER_ROD", range(5, 10))]), - ][i] - for j, new_species_id in enumerate(new_slots): - # Get the subcategory for rods - subcategory = next(sc for sc in slot_category[1] if j in sc[1]) - subcategory_species = [] - for k in subcategory[1]: - if new_slots[k] not in subcategory_species: - subcategory_species.append(new_slots[k]) + species_old_to_new_map[species_id] = new_species_id - # Create the name of the location that corresponds to this encounter slot - # Fishing locations include the rod name - subcategory_str = "" if subcategory[0] is None else "_" + subcategory[0] - encounter_location_index = subcategory_species.index(new_species_id) + 1 - encounter_location_name = f"{map_data.name}_{slot_category[0]}_ENCOUNTERS{subcategory_str}_{encounter_location_index}" - try: - # Get the corresponding location and change the event name to reflect the new species - slot_location = world.multiworld.get_location(encounter_location_name, world.player) - slot_location.item.name = f"CATCH_{data.species[new_species_id].name}" - except KeyError: - pass # Map probably isn't included; should be careful here about bad encounter location names + if world.options.dexsanity and encounter_type != EncounterType.ROCK_SMASH \ + and map_name not in OUT_OF_LOGIC_MAPS: + already_placed.add(new_species_id) - map_data.land_encounters = new_encounters[0] - map_data.water_encounters = new_encounters[1] - map_data.fishing_encounters = new_encounters[2] + # Actually create the new list of slots and encounter table + new_slots: List[int] = [] + for species_id in table.slots: + new_slots.append(species_old_to_new_map[species_id]) + + new_encounters[encounter_type] = EncounterTableData(new_slots, table.address) + + # Rock smash encounters not used in logic, so they have no events + if encounter_type != EncounterType.ROCK_SMASH: + _rename_wild_events(world, map_data, new_slots, encounter_type) + + map_data.encounters = new_encounters def randomize_abilities(world: "PokemonEmeraldWorld") -> None: diff --git a/worlds/pokemon_emerald/regions.py b/worlds/pokemon_emerald/regions.py index b74f5f5ebf..36f3cb7e19 100644 --- a/worlds/pokemon_emerald/regions.py +++ b/worlds/pokemon_emerald/regions.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Callable, Dict, List, Optional, Tuple from BaseClasses import CollectionState, ItemClassification, Region -from .data import data +from .data import EncounterType, data from .items import PokemonEmeraldItem from .locations import PokemonEmeraldLocation @@ -19,11 +19,11 @@ def create_regions(world: "PokemonEmeraldWorld") -> Dict[str, Region]: Also creates and places events and connects regions via warps and the exits defined in the JSON. """ # Used in connect_to_map_encounters. Splits encounter categories into "subcategories" and gives them names - # and rules so the rods can only access their specific slots. - encounter_categories: Dict[str, List[Tuple[Optional[str], range, Optional[Callable[[CollectionState], bool]]]]] = { - "LAND": [(None, range(0, 12), None)], - "WATER": [(None, range(0, 5), None)], - "FISHING": [ + # and rules so the rods can only access their specific slots. Rock smash encounters are not considered in logic. + encounter_categories: Dict[EncounterType, List[Tuple[Optional[str], range, Optional[Callable[[CollectionState], bool]]]]] = { + EncounterType.LAND: [(None, range(0, 12), None)], + EncounterType.WATER: [(None, range(0, 5), None)], + EncounterType.FISHING: [ ("OLD_ROD", range(0, 2), lambda state: state.has("Old Rod", world.player)), ("GOOD_ROD", range(2, 5), lambda state: state.has("Good Rod", world.player)), ("SUPER_ROD", range(5, 10), lambda state: state.has("Super Rod", world.player)), @@ -41,19 +41,19 @@ def create_regions(world: "PokemonEmeraldWorld") -> Dict[str, Region]: These regions are created lazily and dynamically so as not to bother with unused maps. """ # For each of land, water, and fishing, connect the region if indicated by include_slots - for i, encounter_category in enumerate(encounter_categories.items()): + for i, (encounter_type, subcategories) in enumerate(encounter_categories.items()): if include_slots[i]: - region_name = f"{map_name}_{encounter_category[0]}_ENCOUNTERS" + region_name = f"{map_name}_{encounter_type.value}_ENCOUNTERS" # If the region hasn't been created yet, create it now try: encounter_region = world.multiworld.get_region(region_name, world.player) except KeyError: encounter_region = Region(region_name, world.player, world.multiworld) - encounter_slots = getattr(data.maps[map_name], f"{encounter_category[0].lower()}_encounters").slots + encounter_slots = data.maps[map_name].encounters[encounter_type].slots # Subcategory is for splitting fishing rods; land and water only have one subcategory - for subcategory in encounter_category[1]: + for subcategory in subcategories: # Want to create locations per species, not per slot # encounter_categories includes info on which slots belong to which subcategory unique_species = [] diff --git a/worlds/pokemon_emerald/rom.py b/worlds/pokemon_emerald/rom.py index e2a7a4800b..ef87985a27 100644 --- a/worlds/pokemon_emerald/rom.py +++ b/worlds/pokemon_emerald/rom.py @@ -696,12 +696,10 @@ def _set_encounter_tables(world: "PokemonEmeraldWorld", patch: PokemonEmeraldPro } """ for map_data in world.modified_maps.values(): - tables = [map_data.land_encounters, map_data.water_encounters, map_data.fishing_encounters] - for table in tables: - if table is not None: - for i, species_id in enumerate(table.slots): - address = table.address + 2 + (4 * i) - patch.write_token(APTokenTypes.WRITE, address, struct.pack(" None: diff --git a/worlds/pokemon_emerald/util.py b/worlds/pokemon_emerald/util.py index f7f02edd95..3215113075 100644 --- a/worlds/pokemon_emerald/util.py +++ b/worlds/pokemon_emerald/util.py @@ -1,7 +1,7 @@ import orjson from typing import Any, Dict, List, Optional, Tuple, Iterable -from .data import NATIONAL_ID_TO_SPECIES_ID, data +from .data import NATIONAL_ID_TO_SPECIES_ID, EncounterType, data CHARACTER_DECODING_MAP = { @@ -86,6 +86,28 @@ def decode_string(string_data: Iterable[int]) -> str: return string +def get_encounter_type_label(encounter_type: EncounterType, slot: int) -> str: + if encounter_type == EncounterType.FISHING: + return { + 0: "Old Rod", + 1: "Old Rod", + 2: "Good Rod", + 3: "Good Rod", + 4: "Good Rod", + 5: "Super Rod", + 6: "Super Rod", + 7: "Super Rod", + 8: "Super Rod", + 9: "Super Rod", + }[slot] + + return { + EncounterType.LAND: 'Land', + EncounterType.WATER: 'Water', + EncounterType.ROCK_SMASH: 'Rock Smash', + }[encounter_type] + + def get_easter_egg(easter_egg: str) -> Tuple[int, int]: easter_egg = easter_egg.upper() result1 = 0 From 54094c633140daa90547e45985e7257fa5a7fb45 Mon Sep 17 00:00:00 2001 From: Trevor L <80716066+TRPG0@users.noreply.github.com> Date: Sat, 8 Mar 2025 09:59:35 -0700 Subject: [PATCH 084/227] Blasphemous: Restrict right half of map start locations to hard difficulty only (#4002) * Start locations, location name * Fix tests --- worlds/blasphemous/Locations.py | 2 +- worlds/blasphemous/__init__.py | 5 +++- .../test/test_starting_locations.py | 30 +------------------ 3 files changed, 6 insertions(+), 31 deletions(-) diff --git a/worlds/blasphemous/Locations.py b/worlds/blasphemous/Locations.py index 6c2f71cd37..fac84313b1 100644 --- a/worlds/blasphemous/Locations.py +++ b/worlds/blasphemous/Locations.py @@ -89,7 +89,7 @@ location_names: Dict[str, str] = { "RESCUED_CHERUB_15": "DC: Top of elevator Child of Moonlight", "Lady[D01Z05S22]": "DC: Lady of the Six Sorrows, from MD", "QI75": "DC: Chalice room", - "Sword[D01Z05S24]": "DC: Mea culpa altar", + "Sword[D01Z05S24]": "DC: Mea Culpa altar", "CO44": "DC: Elevator shaft ledge", "RESCUED_CHERUB_22": "DC: Elevator shaft Child of Moonlight", "Lady[D01Z05S26]": "DC: Lady of the Six Sorrows, elevator shaft", diff --git a/worlds/blasphemous/__init__.py b/worlds/blasphemous/__init__.py index 4b151f41f8..a643e91c9b 100644 --- a/worlds/blasphemous/__init__.py +++ b/worlds/blasphemous/__init__.py @@ -67,7 +67,8 @@ class BlasphemousWorld(World): def generate_early(self): if not self.options.starting_location.randomized: - if self.options.starting_location == "mourning_havoc" and self.options.difficulty < 2: + if (self.options.starting_location == "knot_of_words" or self.options.starting_location == "rooftops" \ + or self.options.starting_location == "mourning_havoc") and self.options.difficulty < 2: raise OptionError(f"[Blasphemous - '{self.player_name}'] " f"{self.options.starting_location} cannot be chosen if Difficulty is lower than Hard.") @@ -83,6 +84,8 @@ class BlasphemousWorld(World): locations: List[int] = [ 0, 1, 2, 3, 4, 5, 6 ] if self.options.difficulty < 2: + locations.remove(4) + locations.remove(5) locations.remove(6) if self.options.dash_shuffle: diff --git a/worlds/blasphemous/test/test_starting_locations.py b/worlds/blasphemous/test/test_starting_locations.py index 9e04d52ef3..1d541bc969 100644 --- a/worlds/blasphemous/test/test_starting_locations.py +++ b/worlds/blasphemous/test/test_starting_locations.py @@ -85,20 +85,7 @@ class TestGrievanceHard(BlasphemousTestBase): } -class TestKnotOfWordsEasy(BlasphemousTestBase): - options = { - "starting_location": "knot_of_words", - "difficulty": "easy" - } - - -class TestKnotOfWordsNormal(BlasphemousTestBase): - options = { - "starting_location": "knot_of_words", - "difficulty": "normal" - } - - +# knot of the three words, rooftops, and mourning and havoc can't be selected on easy or normal. hard only class TestKnotOfWordsHard(BlasphemousTestBase): options = { "starting_location": "knot_of_words", @@ -106,20 +93,6 @@ class TestKnotOfWordsHard(BlasphemousTestBase): } -class TestRooftopsEasy(BlasphemousTestBase): - options = { - "starting_location": "rooftops", - "difficulty": "easy" - } - - -class TestRooftopsNormal(BlasphemousTestBase): - options = { - "starting_location": "rooftops", - "difficulty": "normal" - } - - class TestRooftopsHard(BlasphemousTestBase): options = { "starting_location": "rooftops", @@ -127,7 +100,6 @@ class TestRooftopsHard(BlasphemousTestBase): } -# mourning and havoc can't be selected on easy or normal. hard only class TestMourningHavocHard(BlasphemousTestBase): options = { "starting_location": "mourning_havoc", From ce34b607124749ff2564eee79036f69224cc26ef Mon Sep 17 00:00:00 2001 From: josephwhite Date: Sat, 8 Mar 2025 12:07:50 -0500 Subject: [PATCH 085/227] Super Mario 64: ItemData class and tables (#4321) * sm64ex: use item data class * rearrange imports * Dict to dict * remove optional typing * bonus item descriptions since we can also add stuff for webworld easily * remove item descriptions (rip) and decrease verbosity for classifications * formatting --- worlds/sm64ex/Items.py | 81 ++++++++++++++++++++++----------------- worlds/sm64ex/Options.py | 4 +- worlds/sm64ex/Rules.py | 7 ++-- worlds/sm64ex/__init__.py | 22 +++++------ 4 files changed, 61 insertions(+), 53 deletions(-) diff --git a/worlds/sm64ex/Items.py b/worlds/sm64ex/Items.py index 546f1abd31..28fcd74484 100644 --- a/worlds/sm64ex/Items.py +++ b/worlds/sm64ex/Items.py @@ -1,47 +1,58 @@ -from BaseClasses import Item +from typing import NamedTuple +from BaseClasses import Item, ItemClassification + +sm64ex_base_id: int = 3626000 class SM64Item(Item): game: str = "Super Mario 64" +class SM64ItemData(NamedTuple): + code: int | None = None + classification: ItemClassification = ItemClassification.progression -generic_item_table = { - "Power Star": 3626000, - "Basement Key": 3626178, - "Second Floor Key": 3626179, - "Progressive Key": 3626180, - "Wing Cap": 3626181, - "Metal Cap": 3626182, - "Vanish Cap": 3626183, - "1Up Mushroom": 3626184 +generic_item_data_table: dict[str, SM64ItemData] = { + "Power Star": SM64ItemData(sm64ex_base_id + 0, ItemClassification.progression_skip_balancing), + "Basement Key": SM64ItemData(sm64ex_base_id + 178), + "Second Floor Key": SM64ItemData(sm64ex_base_id + 179), + "Progressive Key": SM64ItemData(sm64ex_base_id + 180), + "Wing Cap": SM64ItemData(sm64ex_base_id + 181), + "Metal Cap": SM64ItemData(sm64ex_base_id + 182), + "Vanish Cap": SM64ItemData(sm64ex_base_id + 183), + "1Up Mushroom": SM64ItemData(sm64ex_base_id + 184, ItemClassification.filler), } -action_item_table = { - "Double Jump": 3626185, - "Triple Jump": 3626186, - "Long Jump": 3626187, - "Backflip": 3626188, - "Side Flip": 3626189, - "Wall Kick": 3626190, - "Dive": 3626191, - "Ground Pound": 3626192, - "Kick": 3626193, - "Climb": 3626194, - "Ledge Grab": 3626195 +action_item_data_table: dict[str, SM64ItemData] = { + "Double Jump": SM64ItemData(sm64ex_base_id + 185), + "Triple Jump": SM64ItemData(sm64ex_base_id + 186), + "Long Jump": SM64ItemData(sm64ex_base_id + 187), + "Backflip": SM64ItemData(sm64ex_base_id + 188), + "Side Flip": SM64ItemData(sm64ex_base_id + 189), + "Wall Kick": SM64ItemData(sm64ex_base_id + 190), + "Dive": SM64ItemData(sm64ex_base_id + 191), + "Ground Pound": SM64ItemData(sm64ex_base_id + 192), + "Kick": SM64ItemData(sm64ex_base_id + 193), + "Climb": SM64ItemData(sm64ex_base_id + 194), + "Ledge Grab": SM64ItemData(sm64ex_base_id + 195), } - -cannon_item_table = { - "Cannon Unlock BoB": 3626200, - "Cannon Unlock WF": 3626201, - "Cannon Unlock JRB": 3626202, - "Cannon Unlock CCM": 3626203, - "Cannon Unlock SSL": 3626207, - "Cannon Unlock SL": 3626209, - "Cannon Unlock WDW": 3626210, - "Cannon Unlock TTM": 3626211, - "Cannon Unlock THI": 3626212, - "Cannon Unlock RR": 3626214 +cannon_item_data_table: dict[str, SM64ItemData] = { + "Cannon Unlock BoB": SM64ItemData(sm64ex_base_id + 200), + "Cannon Unlock WF": SM64ItemData(sm64ex_base_id + 201), + "Cannon Unlock JRB": SM64ItemData(sm64ex_base_id + 202), + "Cannon Unlock CCM": SM64ItemData(sm64ex_base_id + 203), + "Cannon Unlock SSL": SM64ItemData(sm64ex_base_id + 207), + "Cannon Unlock SL": SM64ItemData(sm64ex_base_id + 209), + "Cannon Unlock WDW": SM64ItemData(sm64ex_base_id + 210), + "Cannon Unlock TTM": SM64ItemData(sm64ex_base_id + 211), + "Cannon Unlock THI": SM64ItemData(sm64ex_base_id + 212), + "Cannon Unlock RR": SM64ItemData(sm64ex_base_id + 214), } -item_table = {**generic_item_table, **action_item_table, **cannon_item_table} \ No newline at end of file +item_data_table = { + **generic_item_data_table, + **action_item_data_table, + **cannon_item_data_table +} + +item_table = {name: data.code for name, data in item_data_table.items() if data.code is not None} diff --git a/worlds/sm64ex/Options.py b/worlds/sm64ex/Options.py index 9c428c9959..47cda7507d 100644 --- a/worlds/sm64ex/Options.py +++ b/worlds/sm64ex/Options.py @@ -1,7 +1,7 @@ import typing from dataclasses import dataclass from Options import DefaultOnToggle, Range, Toggle, DeathLink, Choice, PerGameCommonOptions, OptionSet, OptionGroup -from .Items import action_item_table +from .Items import action_item_data_table class EnableCoinStars(Choice): """ @@ -135,7 +135,7 @@ class MoveRandomizerActions(OptionSet): """Which actions to randomize when Move Randomizer is enabled""" display_name = "Randomized Moves" # HACK: Disable randomization for double jump - valid_keys = [action for action in action_item_table if action != 'Double Jump'] + valid_keys = [action for action in action_item_data_table if action != 'Double Jump'] default = valid_keys sm64_options_groups = [ diff --git a/worlds/sm64ex/Rules.py b/worlds/sm64ex/Rules.py index 1535f9ca1f..f5305dab6c 100644 --- a/worlds/sm64ex/Rules.py +++ b/worlds/sm64ex/Rules.py @@ -6,7 +6,7 @@ from .Locations import location_table from .Options import SM64Options from .Regions import connect_regions, SM64Levels, sm64_level_to_paintings, sm64_paintings_to_level,\ sm64_level_to_secrets, sm64_secrets_to_level, sm64_entrances_to_level, sm64_level_to_entrances -from .Items import action_item_table +from .Items import action_item_data_table def shuffle_dict_keys(world, dictionary: dict) -> dict: keys = list(dictionary.keys()) @@ -372,8 +372,9 @@ class RuleFactory: item = self.token_table.get(token, None) if not item: raise Exception(f"Invalid token: '{item}'") - if item in action_item_table: - if self.move_rando_bitvec & (1 << (action_item_table[item] - action_item_table['Double Jump'])) == 0: + if item in action_item_data_table: + double_jump_bitvec_offset = action_item_data_table['Double Jump'].code + if self.move_rando_bitvec & (1 << (action_item_data_table[item].code - double_jump_bitvec_offset)) == 0: # This action item is not randomized. return True return item diff --git a/worlds/sm64ex/__init__.py b/worlds/sm64ex/__init__.py index d54e0fc64d..33aaa003ad 100644 --- a/worlds/sm64ex/__init__.py +++ b/worlds/sm64ex/__init__.py @@ -1,7 +1,7 @@ import typing import os import json -from .Items import item_table, action_item_table, cannon_item_table, SM64Item +from .Items import item_data_table, action_item_data_table, cannon_item_data_table, item_table, SM64Item from .Locations import location_table, SM64Location from .Options import sm64_options_groups, SM64Options from .Rules import set_rules @@ -65,9 +65,10 @@ class SM64World(World): max_stars -= 15 self.move_rando_bitvec = 0 if self.options.enable_move_rando: + double_jump_bitvec_offset = action_item_data_table['Double Jump'].code for action in self.options.move_rando_actions.value: max_stars -= 1 - self.move_rando_bitvec |= (1 << (action_item_table[action] - action_item_table['Double Jump'])) + self.move_rando_bitvec |= (1 << (action_item_data_table[action].code - double_jump_bitvec_offset)) if self.options.exclamation_boxes: max_stars += 29 self.number_of_stars = min(self.options.amount_of_stars, max_stars) @@ -100,14 +101,8 @@ class SM64World(World): 'entrance', self.player) def create_item(self, name: str) -> Item: - item_id = item_table[name] - if name == "1Up Mushroom": - classification = ItemClassification.filler - elif name == "Power Star": - classification = ItemClassification.progression_skip_balancing - else: - classification = ItemClassification.progression - item = SM64Item(name, classification, item_id, self.player) + data = item_data_table[name] + item = SM64Item(name, data.classification, data.code, self.player) return item @@ -131,11 +126,12 @@ class SM64World(World): self.multiworld.itempool += [self.create_item(cap_name) for cap_name in ["Wing Cap", "Metal Cap", "Vanish Cap"]] # Cannons if (self.options.buddy_checks): - self.multiworld.itempool += [self.create_item(name) for name, id in cannon_item_table.items()] + self.multiworld.itempool += [self.create_item(cannon_name) for cannon_name in cannon_item_data_table.keys()] # Moves + double_jump_bitvec_offset = action_item_data_table['Double Jump'].code self.multiworld.itempool += [self.create_item(action) - for action, itemid in action_item_table.items() - if self.move_rando_bitvec & (1 << itemid - action_item_table['Double Jump'])] + for action, itemdata in action_item_data_table.items() + if self.move_rando_bitvec & (1 << itemdata.code - double_jump_bitvec_offset)] def generate_basic(self): if not (self.options.buddy_checks): From 4ebabc120802b43734791615a7ee82a7bddfb1f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Sat, 8 Mar 2025 12:13:33 -0500 Subject: [PATCH 086/227] Stardew Valley: Move filler pool generation out of the world class (#4372) * merge group options so specific handling is not needed when generating filler pool * fix * remove unneeded imports * self review * remove unneeded imports * looks like typing was missing woopsi --- worlds/stardew_valley/__init__.py | 41 +++++++------------ worlds/stardew_valley/items.py | 10 +++++ worlds/stardew_valley/options/worlds_group.py | 14 +++++++ .../test/assertion/goal_assert.py | 4 +- .../test/assertion/option_assert.py | 4 +- 5 files changed, 43 insertions(+), 30 deletions(-) create mode 100644 worlds/stardew_valley/options/worlds_group.py diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index e2d49e64ae..fe69030882 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -1,4 +1,5 @@ import logging +import typing from random import Random from typing import Dict, Any, Iterable, Optional, List, TextIO, cast @@ -9,14 +10,15 @@ from .bundles.bundle_room import BundleRoom from .bundles.bundles import get_all_bundles from .content import StardewContent, create_content from .early_items import setup_early_items -from .items import item_table, create_items, ItemData, Group, items_by_group, get_all_filler_items, remove_limited_amount_packs +from .items import item_table, create_items, ItemData, Group, items_by_group, generate_filler_choice_pool from .locations import location_table, create_locations, LocationData, locations_by_tag from .logic.logic import StardewLogic from .options import StardewValleyOptions, SeasonRandomization, Goal, BundleRandomization, EnabledFillerBuffs, NumberOfMovementBuffs, \ - BuildingProgression, ExcludeGingerIsland, TrapItems, EntranceRandomization, FarmType + BuildingProgression, EntranceRandomization, FarmType from .options.forced_options import force_change_options_if_incompatible from .options.option_groups import sv_option_groups from .options.presets import sv_options_presets +from .options.worlds_group import apply_most_restrictive_options from .regions import create_regions from .rules import set_rules from .stardew_rule import True_, StardewRule, HasProgressionPercent @@ -89,6 +91,16 @@ class StardewValleyWorld(World): total_progression_items: int + @classmethod + def create_group(cls, multiworld: MultiWorld, new_player_id: int, players: set[int]) -> World: + world_group = super().create_group(multiworld, new_player_id, players) + + group_options = typing.cast(StardewValleyOptions, world_group.options) + worlds_options = [typing.cast(StardewValleyOptions, multiworld.worlds[player].options) for player in players] + apply_most_restrictive_options(group_options, worlds_options) + + return world_group + def __init__(self, multiworld: MultiWorld, player: int): super().__init__(multiworld, player) self.filler_item_pool_names = [] @@ -299,32 +311,9 @@ class StardewValleyWorld(World): def get_filler_item_name(self) -> str: if not self.filler_item_pool_names: - self.generate_filler_item_pool_names() + self.filler_item_pool_names = generate_filler_choice_pool(self.options) return self.random.choice(self.filler_item_pool_names) - def generate_filler_item_pool_names(self): - include_traps, exclude_island = self.get_filler_item_rules() - available_filler = get_all_filler_items(include_traps, exclude_island) - available_filler = remove_limited_amount_packs(available_filler) - self.filler_item_pool_names = [item.name for item in available_filler] - - def get_filler_item_rules(self): - if self.player in self.multiworld.groups: - link_group = self.multiworld.groups[self.player] - include_traps = True - exclude_island = False - for player in link_group["players"]: - if self.multiworld.game[player] != self.game: - continue - player_options = cast(StardewValleyOptions, self.multiworld.worlds[player].options) - if player_options.trap_items == TrapItems.option_no_traps: - include_traps = False - if player_options.exclude_ginger_island == ExcludeGingerIsland.option_true: - exclude_island = True - return include_traps, exclude_island - else: - return self.options.trap_items != TrapItems.option_no_traps, self.options.exclude_ginger_island == ExcludeGingerIsland.option_true - def write_spoiler_header(self, spoiler_handle: TextIO) -> None: """Write to the spoiler header. If individual it's right at the end of that player's options, if as stage it's right under the common header before per-player options.""" diff --git a/worlds/stardew_valley/items.py b/worlds/stardew_valley/items.py index 056a4f6e39..1fbe012e27 100644 --- a/worlds/stardew_valley/items.py +++ b/worlds/stardew_valley/items.py @@ -808,6 +808,16 @@ def remove_excluded_items_island_mods(items, exclude_ginger_island: bool, mods: return mod_filter +def generate_filler_choice_pool(options: StardewValleyOptions) -> list[str]: + include_traps = options.trap_items != TrapItems.option_no_traps + exclude_island = options.exclude_ginger_island == ExcludeGingerIsland.option_true + + available_filler = get_all_filler_items(include_traps, exclude_island) + available_filler = remove_limited_amount_packs(available_filler) + + return [item.name for item in available_filler] + + def remove_limited_amount_packs(packs): return [pack for pack in packs if Group.MAXIMUM_ONE not in pack.groups and Group.EXACTLY_TWO not in pack.groups] diff --git a/worlds/stardew_valley/options/worlds_group.py b/worlds/stardew_valley/options/worlds_group.py new file mode 100644 index 0000000000..bbf508c61c --- /dev/null +++ b/worlds/stardew_valley/options/worlds_group.py @@ -0,0 +1,14 @@ +from typing import Iterable + +from .options import StardewValleyOptions + + +def apply_most_restrictive_options(group_option: StardewValleyOptions, world_options: Iterable[StardewValleyOptions]) -> None: + """Merge the options of the worlds member of the group that can impact fillers generation into the option class of the group. + """ + + # If at least one world disabled ginger island, disabling it for the whole group + group_option.exclude_ginger_island.value = max(o.exclude_ginger_island.value for o in world_options) + + # If at least one world disabled traps, disabling them for the whole group + group_option.trap_items.value = min(o.trap_items.value for o in world_options) diff --git a/worlds/stardew_valley/test/assertion/goal_assert.py b/worlds/stardew_valley/test/assertion/goal_assert.py index 2b2efbf2ec..3ba40d5a84 100644 --- a/worlds/stardew_valley/test/assertion/goal_assert.py +++ b/worlds/stardew_valley/test/assertion/goal_assert.py @@ -2,7 +2,7 @@ from unittest import TestCase from BaseClasses import MultiWorld from .option_assert import get_stardew_options -from ... import options, ExcludeGingerIsland +from ... import options def is_goal(multiworld: MultiWorld, goal: int) -> bool: @@ -36,7 +36,7 @@ def is_not_perfection(multiworld: MultiWorld) -> bool: class GoalAssertMixin(TestCase): def assert_ginger_island_is_included(self, multiworld: MultiWorld): - self.assertEqual(get_stardew_options(multiworld).exclude_ginger_island, ExcludeGingerIsland.option_false) + self.assertEqual(get_stardew_options(multiworld).exclude_ginger_island, options.ExcludeGingerIsland.option_false) def assert_walnut_hunter_world_is_valid(self, multiworld: MultiWorld): if is_not_walnut_hunter(multiworld): diff --git a/worlds/stardew_valley/test/assertion/option_assert.py b/worlds/stardew_valley/test/assertion/option_assert.py index a07831f73e..ed7842bf8d 100644 --- a/worlds/stardew_valley/test/assertion/option_assert.py +++ b/worlds/stardew_valley/test/assertion/option_assert.py @@ -2,7 +2,7 @@ from unittest import TestCase from BaseClasses import MultiWorld from .world_assert import get_all_item_names, get_all_location_names -from ... import StardewValleyWorld, options, item_table, Group, location_table, ExcludeGingerIsland +from ... import StardewValleyWorld, options, item_table, Group, location_table from ...locations import LocationTags from ...strings.ap_names.transport_names import Transportation @@ -49,7 +49,7 @@ class OptionAssertMixin(TestCase): def assert_can_reach_island_if_should(self, multiworld: MultiWorld): stardew_options = get_stardew_options(multiworld) - include_island = stardew_options.exclude_ginger_island.value == ExcludeGingerIsland.option_false + include_island = stardew_options.exclude_ginger_island.value == options.ExcludeGingerIsland.option_false if include_island: self.assert_can_reach_island(multiworld) else: From 2639796255d820d720e086e905e19226af2cbd4d Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Sun, 9 Mar 2025 11:37:15 -0400 Subject: [PATCH 087/227] MLSS: Add new goal + Update basepatch to standalone equivalent (#4409) * Item groups + small changes * Add alternate goal * New Locations and Logic Updates + Basepatch * Update basepatch.bsdiff * Update Basepatch * Update basepatch.bsdiff * Update bowsers castle logic with emblem hunt * Update Archipelago Unittests.run.xml * Update Archipelago Unittests.run.xml * Fix for overlapping ROM addresses * Update Rom.py * Update __init__.py * Update basepatch.bsdiff * Update Rom.py * Update client with new helper function * Update basepatch.bsdiff * Update worlds/mlss/__init__.py Co-authored-by: qwint * Update worlds/mlss/__init__.py Co-authored-by: qwint * Review Refactor * Review Refactor --------- Co-authored-by: qwint --- worlds/mlss/Client.py | 2 +- worlds/mlss/Data.py | 2 +- worlds/mlss/Items.py | 8 +++ worlds/mlss/Locations.py | 16 +++-- worlds/mlss/Names/LocationName.py | 8 +-- worlds/mlss/Options.py | 45 ++++++++++-- worlds/mlss/Regions.py | 24 +++++-- worlds/mlss/Rom.py | 16 +++-- worlds/mlss/Rules.py | 116 ++++++++++++++++++++++++++++-- worlds/mlss/StateLogic.py | 23 +++++- worlds/mlss/__init__.py | 13 +++- worlds/mlss/data/basepatch.bsdiff | Bin 18482 -> 21812 bytes 12 files changed, 234 insertions(+), 39 deletions(-) diff --git a/worlds/mlss/Client.py b/worlds/mlss/Client.py index 75f6ac6530..17d87197ca 100644 --- a/worlds/mlss/Client.py +++ b/worlds/mlss/Client.py @@ -269,7 +269,7 @@ class MLSSClient(BizHawkClient): self.local_checked_locations = locs_to_send if locs_to_send is not None: - await ctx.send_msgs([{"cmd": "LocationChecks", "locations": list(locs_to_send)}]) + await ctx.check_locations(locs_to_send) except bizhawk.RequestFailedError: # Exit handler and return to main loop to reconnect. diff --git a/worlds/mlss/Data.py b/worlds/mlss/Data.py index add14aa008..7e3605f138 100644 --- a/worlds/mlss/Data.py +++ b/worlds/mlss/Data.py @@ -153,7 +153,6 @@ enemies = [ 0x50458C, 0x5045AC, 0x50468C, - # 0x5046CC, 6 enemy formation 0x5046EC, 0x50470C ] @@ -166,6 +165,7 @@ bosses = [ 0x50360C, 0x5037AC, 0x5037CC, + 0x50396C, 0x503A8C, 0x503D6C, 0x503F0C, diff --git a/worlds/mlss/Items.py b/worlds/mlss/Items.py index 717443ddfc..5fca829b22 100644 --- a/worlds/mlss/Items.py +++ b/worlds/mlss/Items.py @@ -160,6 +160,7 @@ itemList: typing.List[ItemData] = [ ItemData(77771142, "Game Boy Horror SP", ItemClassification.useful, 0xFE), ItemData(77771143, "Woo Bean", ItemClassification.skip_balancing, 0x1C), ItemData(77771144, "Hee Bean", ItemClassification.skip_balancing, 0x1F), + ItemData(77771145, "Beanstar Emblem", ItemClassification.progression, 0x3E), ] item_frequencies: typing.Dict[str, int] = { @@ -186,5 +187,12 @@ item_frequencies: typing.Dict[str, int] = { "Hammers": 3, } +mlss_item_name_groups = { + "Beanstar Piece": { "Beanstar Piece 1", "Beanstar Piece 2", "Beanstar Piece 3", "Beanstar Piece 4"}, + "Beanfruit": { "Bean Fruit 1", "Bean Fruit 2", "Bean Fruit 3", "Bean Fruit 4", "Bean Fruit 5", "Bean Fruit 6", "Bean Fruit 7"}, + "Neon Egg": { "Blue Neon Egg", "Red Neon Egg", "Green Neon Egg", "Yellow Neon Egg", "Purple Neon Egg", "Orange Neon Egg", "Azure Neon Egg"}, + "Chuckola Fruit": { "Red Chuckola Fruit", "Purple Chuckola Fruit", "White Chuckola Fruit"} +} + item_table: typing.Dict[str, ItemData] = {item.itemName: item for item in itemList} items_by_id: typing.Dict[int, ItemData] = {item.code: item for item in itemList} diff --git a/worlds/mlss/Locations.py b/worlds/mlss/Locations.py index a2787ef9b1..9a114bc470 100644 --- a/worlds/mlss/Locations.py +++ b/worlds/mlss/Locations.py @@ -251,9 +251,9 @@ coins: typing.List[LocationData] = [ LocationData("Hoohoo Village North Cave Room 1 Coin Block", 0x39DAA0, 0), LocationData("Hoohoo Village South Cave Coin Block 1", 0x39DAC5, 0), LocationData("Hoohoo Village South Cave Coin Block 2", 0x39DAD5, 0), - LocationData("Hoohoo Mountain Base Boo Statue Cave Coin Block 1", 0x39DAE2, 0), - LocationData("Hoohoo Mountain Base Boo Statue Cave Coin Block 2", 0x39DAF2, 0), - LocationData("Hoohoo Mountain Base Boo Statue Cave Coin Block 3", 0x39DAFA, 0), + LocationData("Hoohoo Mountain Base Boostatue Cave Coin Block 1", 0x39DAE2, 0), + LocationData("Hoohoo Mountain Base Boostatue Cave Coin Block 2", 0x39DAF2, 0), + LocationData("Hoohoo Mountain Base Boostatue Cave Coin Block 3", 0x39DAFA, 0), LocationData("Beanbean Outskirts NW Coin Block", 0x39DB8F, 0), LocationData("Beanbean Outskirts S Room 1 Coin Block", 0x39DC18, 0), LocationData("Beanbean Outskirts S Room 2 Coin Block", 0x39DC3D, 0), @@ -262,6 +262,8 @@ coins: typing.List[LocationData] = [ LocationData("Chucklehuck Woods Cave Room 1 Coin Block", 0x39DD7A, 0), LocationData("Chucklehuck Woods Cave Room 2 Coin Block", 0x39DD97, 0), LocationData("Chucklehuck Woods Cave Room 3 Coin Block", 0x39DDB4, 0), + LocationData("Chucklehuck Woods Solo Luigi Cave Room 1 Coin Block 1", 0x39DB48, 0), + LocationData("Chucklehuck Woods Solo Luigi Cave Room 1 Coin Block 2", 0x39DB50, 0), LocationData("Chucklehuck Woods Pipe 5 Room Coin Block", 0x39DDE6, 0), LocationData("Chucklehuck Woods Room 7 Coin Block", 0x39DE31, 0), LocationData("Chucklehuck Woods Past Chuckleroot Coin Block", 0x39DF14, 0), @@ -289,6 +291,7 @@ baseUltraRocks: typing.List[LocationData] = [ LocationData("Teehee Valley Upper Maze Room 1 Block", 0x39E5E0, 0), LocationData("Teehee Valley Upper Maze Room 2 Digspot 1", 0x39E5C8, 0), LocationData("Teehee Valley Upper Maze Room 2 Digspot 2", 0x39E5D0, 0), + LocationData("Guffawha Ruins Block", 0x39E6A3, 0), LocationData("Hoohoo Mountain Base Guffawha Ruins Entrance Digspot", 0x39DA0B, 0), LocationData("Hoohoo Mountain Base Teehee Valley Entrance Digspot", 0x39DA20, 0), LocationData("Hoohoo Mountain Base Teehee Valley Entrance Block", 0x39DA18, 0), @@ -298,7 +301,7 @@ booStatue: typing.List[LocationData] = [ LocationData("Beanbean Outskirts Before Harhall Digspot 1", 0x39E951, 0), LocationData("Beanbean Outskirts Before Harhall Digspot 2", 0x39E959, 0), LocationData("Beanstar Piece Harhall", 0x1E9441, 2), - LocationData("Beanbean Outskirts Boo Statue Mole", 0x1E9434, 2), + LocationData("Beanbean Outskirts Boostatue Mole", 0x1E9434, 2), LocationData("Harhall's Pants", 0x1E9444, 2), LocationData("Beanbean Outskirts S Room 2 Digspot 1", 0x39DC65, 0), LocationData("Beanbean Outskirts S Room 2 Digspot 2", 0x39DC5D, 0), @@ -317,6 +320,9 @@ chucklehuck: typing.List[LocationData] = [ LocationData("Chucklehuck Woods Cave Room 1 Block 2", 0x39DD8A, 0), LocationData("Chucklehuck Woods Cave Room 2 Block", 0x39DD9F, 0), LocationData("Chucklehuck Woods Cave Room 3 Block", 0x39DDAC, 0), + LocationData("Chucklehuck Woods Solo Luigi Cave Room 2 Block", 0x39DB72, 0), + LocationData("Chucklehuck Woods Solo Luigi Cave Room 3 Block 1", 0x39DB5D, 0), + LocationData("Chucklehuck Woods Solo Luigi Cave Room 3 Block 2", 0x39DB65, 0), LocationData("Chucklehuck Woods Room 2 Block", 0x39DDC1, 0), LocationData("Chucklehuck Woods Room 2 Digspot", 0x39DDC9, 0), LocationData("Chucklehuck Woods Pipe Room Block 1", 0x39DDD6, 0), @@ -786,7 +792,7 @@ nonBlock = [ (0x4373, 0x10, 0x277A45), # Teehee Valley Mole (0x434D, 0x8, 0x1E9444), # Harhall's Pants (0x432E, 0x10, 0x1E9441), # Harhall Beanstar Piece - (0x434B, 0x8, 0x1E9434), # Outskirts Boo Statue Mole + (0x434B, 0x8, 0x1E9434), # Outskirts Boostatue Mole (0x42FE, 0x2, 0x1E943E), # Red Goblet (0x42FE, 0x4, 0x24E628), # Green Goblet (0x4301, 0x10, 0x250621), # Red Chuckola Fruit diff --git a/worlds/mlss/Names/LocationName.py b/worlds/mlss/Names/LocationName.py index 5b38b2a10f..43b75bf5d7 100644 --- a/worlds/mlss/Names/LocationName.py +++ b/worlds/mlss/Names/LocationName.py @@ -59,7 +59,7 @@ class LocationName: HoohooMountainBaseBoostatueRoomDigspot1 = "Hoohoo Mountain Base Boostatue Room Digspot 1" HoohooMountainBaseBoostatueRoomDigspot2 = "Hoohoo Mountain Base Boostatue Room Digspot 2" HoohooMountainBaseBoostatueRoomDigspot3 = "Hoohoo Mountain Base Boostatue Room Digspot 3" - BeanbeanOutskirtsBooStatueMole = "Beanbean Outskirts Boo Statue Mole" + BeanbeanOutskirtsBooStatueMole = "Beanbean Outskirts Boostatue Mole" HoohooMountainBaseGrassyAreaBlock1 = "Hoohoo Mountain Base Grassy Area Block 1" HoohooMountainBaseGrassyAreaBlock2 = "Hoohoo Mountain Base Grassy Area Block 2" HoohooMountainBaseGuffawhaRuinsEntranceDigspot = "Hoohoo Mountain Base Guffawha Ruins Entrance Digspot" @@ -533,9 +533,9 @@ class LocationName: BadgeShopMomPiranhaFlag2 = "Badge Shop Mom Piranha Flag 2" BadgeShopMomPiranhaFlag3 = "Badge Shop Mom Piranha Flag 3" HarhallsPants = "Harhall's Pants" - HoohooMountainBaseBooStatueCaveCoinBlock1 = "Hoohoo Mountain Base Boo Statue Cave Coin Block 1" - HoohooMountainBaseBooStatueCaveCoinBlock2 = "Hoohoo Mountain Base Boo Statue Cave Coin Block 2" - HoohooMountainBaseBooStatueCaveCoinBlock3 = "Hoohoo Mountain Base Boo Statue Cave Coin Block 3" + HoohooMountainBaseBooStatueCaveCoinBlock1 = "Hoohoo Mountain Base Boostatue Cave Coin Block 1" + HoohooMountainBaseBooStatueCaveCoinBlock2 = "Hoohoo Mountain Base Boostatue Cave Coin Block 2" + HoohooMountainBaseBooStatueCaveCoinBlock3 = "Hoohoo Mountain Base Boostatue Cave Coin Block 3" BeanbeanOutskirtsNWCoinBlock = "Beanbean Outskirts NW Coin Block" BeanbeanOutskirtsSRoom1CoinBlock = "Beanbean Outskirts S Room 1 Coin Block" BeanbeanOutskirtsSRoom2CoinBlock = "Beanbean Outskirts S Room 2 Coin Block" diff --git a/worlds/mlss/Options.py b/worlds/mlss/Options.py index 73e8ebd401..dbf581b232 100644 --- a/worlds/mlss/Options.py +++ b/worlds/mlss/Options.py @@ -2,13 +2,13 @@ from Options import Choice, Toggle, StartInventoryPool, PerGameCommonOptions, Ra from dataclasses import dataclass -class BowsersCastleSkip(Toggle): +class SkipBowsersCastle(Toggle): """ - Skip straight from the entrance hall to Bowletta in Bowser's Castle. + Skip straight from the Entrance Hall to Bowletta in Bowser's Castle. All Bowser's Castle locations will be removed from the location pool. """ - display_name = "Bowser's Castle Skip" + display_name = "Skip Bowser's Castle" class ExtraPipes(Toggle): @@ -272,13 +272,47 @@ class ChuckleBeans(Choice): option_all = 2 default = 2 +class Goal(Choice): + """ + Vanilla: Complete jokes end with the required items and defeat Birdo to unlock Bowser's Castle. + + Emblem Hunt: Find the required number of Beanstar Emblems to gain access to Bowser's Castle. + """ + display_name = "Goal" + option_vanilla = 0 + option_emblem_hunt = 1 + default = 0 + +class EmblemsRequired(Range): + """ + Number of Beanstar Emblems to collect to unlock Bowser's Castle. + + If Goal is not Emblem Hunt, this does nothing. + """ + display_name = "Emblems Required" + range_start = 1 + range_end = 100 + default = 50 + + +class EmblemsAmount(Range): + """ + Number of Beanstar Emblems that are in the pool. + + If Goal is not Emblem Hunt, this does nothing. + """ + display_name = "Emblems Available" + range_start = 1 + range_end = 150 + default = 75 + @dataclass class MLSSOptions(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool coins: Coins difficult_logic: DifficultLogic - castle_skip: BowsersCastleSkip + castle_skip: SkipBowsersCastle extra_pipes: ExtraPipes skip_minecart: SkipMinecart disable_surf: DisableSurf @@ -286,6 +320,9 @@ class MLSSOptions(PerGameCommonOptions): harhalls_pants: Removed block_visibility: HiddenVisible chuckle_beans: ChuckleBeans + goal: Goal + emblems_required: EmblemsRequired + emblems_amount: EmblemsAmount music_options: MusicOptions randomize_sounds: RandomSounds randomize_enemies: RandomizeEnemies diff --git a/worlds/mlss/Regions.py b/worlds/mlss/Regions.py index 7dd5e94511..e9008b86f1 100644 --- a/worlds/mlss/Regions.py +++ b/worlds/mlss/Regions.py @@ -91,6 +91,16 @@ def connect_regions(world: "MLSSWorld"): connect(world, names, "Main Area", "BaseUltraRocks", lambda state: StateLogic.ultra(state, world.player)) connect(world, names, "Main Area", "Chucklehuck Woods", lambda state: StateLogic.brooch(state, world.player)) connect(world, names, "Main Area", "BooStatue", lambda state: StateLogic.canCrash(state, world.player)) + if world.options.goal == "emblem_hunt": + if world.options.castle_skip: + connect(world, names, "Main Area", "Cackletta's Soul", + lambda state: state.has("Beanstar Emblem", world.player, world.options.emblems_required.value)) + else: + connect(world, names, "Main Area", "Bowser's Castle", lambda state: state.has("Beanstar Emblem", world.player, world.options.emblems_required.value)) + connect(world, names, "Bowser's Castle", "Bowser's Castle Mini", lambda state: + StateLogic.canMini(state, world.player) + and StateLogic.thunder(state,world.player)) + connect(world, names, "Bowser's Castle Mini", "Cackletta's Soul", lambda state: StateLogic.soul(state, world.player)) connect( world, names, @@ -213,8 +223,8 @@ def connect_regions(world: "MLSSWorld"): connect(world, names, "Surfable", "GwarharEntrance") connect(world, names, "Surfable", "Oasis") connect(world, names, "Surfable", "JokesEntrance", lambda state: StateLogic.fire(state, world.player)) - connect(world, names, "JokesMain", "PostJokes", lambda state: StateLogic.postJokes(state, world.player)) - if not world.options.castle_skip: + connect(world, names, "JokesMain", "PostJokes", lambda state: StateLogic.postJokes(state, world.player, world.options.goal.value)) + if not world.options.castle_skip and world.options.goal != "emblem_hunt": connect(world, names, "PostJokes", "Bowser's Castle") connect( world, @@ -224,7 +234,7 @@ def connect_regions(world: "MLSSWorld"): lambda state: StateLogic.canMini(state, world.player) and StateLogic.thunder(state, world.player), ) connect(world, names, "Bowser's Castle Mini", "Cackletta's Soul") - else: + elif world.options.goal != "emblem_hunt": connect(world, names, "PostJokes", "Cackletta's Soul") connect(world, names, "Chucklehuck Woods", "Winkle", lambda state: StateLogic.canDash(state, world.player)) connect( @@ -247,14 +257,14 @@ def connect_regions(world: "MLSSWorld"): names, "Shop Starting Flag", "Shop Birdo Flag", - lambda state: StateLogic.postJokes(state, world.player), + lambda state: StateLogic.postJokes(state, world.player, world.options.goal.value), ) connect( world, names, "Fungitown", "Fungitown Shop Birdo Flag", - lambda state: StateLogic.postJokes(state, world.player), + lambda state: StateLogic.postJokes(state, world.player, world.options.goal.value), ) else: connect( @@ -276,14 +286,14 @@ def connect_regions(world: "MLSSWorld"): names, "Shop Starting Flag", "Shop Birdo Flag", - lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player), + lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player, world.options.goal.value), ) connect( world, names, "Fungitown", "Fungitown Shop Birdo Flag", - lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player), + lambda state: StateLogic.canCrash(state, world.player) and StateLogic.postJokes(state, world.player, world.options.goal.value), ) diff --git a/worlds/mlss/Rom.py b/worlds/mlss/Rom.py index 03eac040ef..c83c012182 100644 --- a/worlds/mlss/Rom.py +++ b/worlds/mlss/Rom.py @@ -177,10 +177,10 @@ class MLSSPatchExtension(APPatchExtension): for pos in enemies: stream.seek(pos + 8) for _ in range(6): - enemy = int.from_bytes(stream.read(1)) + enemy = int.from_bytes(stream.read(1), "little") if enemy > 0: stream.seek(1, 1) - flag = int.from_bytes(stream.read(1)) + flag = int.from_bytes(stream.read(1), "little") if flag == 0x7: break if flag in [0x0, 0x2, 0x4]: @@ -196,12 +196,12 @@ class MLSSPatchExtension(APPatchExtension): stream.seek(pos + 8) for _ in range(6): - enemy = int.from_bytes(stream.read(1)) + enemy = int.from_bytes(stream.read(1), "little") if enemy > 0 and enemy not in Data.flying and enemy not in Data.pestnut: if enemy == 0x52: chomp = True stream.seek(1, 1) - flag = int.from_bytes(stream.read(1)) + flag = int.from_bytes(stream.read(1), "little") if flag not in [0x0, 0x2, 0x4]: stream.seek(1, 1) continue @@ -234,7 +234,7 @@ class MLSSPatchExtension(APPatchExtension): stream.seek(pos) temp = stream.read(1) stream.seek(pos) - stream.write(bytes([temp[0] | 0x8])) + stream.write(bytes([temp[0] | 0x80])) stream.seek(pos + 1) stream.write(groups.pop()) @@ -316,6 +316,10 @@ def write_tokens(world: "MLSSWorld", patch: MLSSProcedurePatch) -> None: patch.write_token(APTokenTypes.WRITE, 0xD00003, bytes([world.options.xp_multiplier.value])) + if world.options.goal == 1: + patch.write_token(APTokenTypes.WRITE, 0xD00008, bytes([world.options.goal.value])) + patch.write_token(APTokenTypes.WRITE, 0xD00009, bytes([world.options.emblems_required.value])) + if world.options.tattle_hp: patch.write_token(APTokenTypes.WRITE, 0xD00000, bytes([0x1])) @@ -427,4 +431,4 @@ def desc_inject(world: "MLSSWorld", patch: MLSSProcedurePatch, location: Locatio index = value.index(location.address) + 66 dstring = f"{world.multiworld.player_name[item.player]}: {item.name}" - patch.write_token(APTokenTypes.WRITE, 0xD11000 + (index * 0x40), dstring.encode("UTF8")) + patch.write_token(APTokenTypes.WRITE, 0xD12000 + (index * 0x40), dstring.encode("UTF8")) diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index b0b5a36465..6592a805d5 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -28,11 +28,14 @@ def set_rules(world: "MLSSWorld", excluded): lambda state: StateLogic.canDig(state, world.player), ) if "Shop" in location.name and "Coffee" not in location.name and location.name not in excluded: - forbid_item(world.get_location(location.name), "Hammers", world.player) if "Badge" in location.name or "Pants" in location.name: add_rule( world.get_location(location.name), - lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), + lambda state: (StateLogic.brooch(state, world.player) and StateLogic.fruits(state, world.player) + and (StateLogic.hammers(state, world.player) + or StateLogic.fire(state, world.player) + or StateLogic.thunder(state, world.player))) + or StateLogic.rose(state, world.player), ) if location.itemType != 0 and location.name not in excluded: if "Bowser" in location.name and world.options.castle_skip: @@ -99,9 +102,86 @@ def set_rules(world: "MLSSWorld", excluded): lambda state: StateLogic.ultra(state, world.player) and StateLogic.thunder(state, world.player), ) - forbid_item( - world.get_location(LocationName.SSChuckolaMembershipCard), "Nuts", world.player - ) # Bandaid Fix + if world.options.goal == 1 and not world.options.castle_skip: + add_rule( + world.get_location(LocationName.BowsersCastleRoyCorridorBlock1), + lambda state: StateLogic.canDig(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleRoyCorridorBlock2), + lambda state: StateLogic.canDig(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleMiniMarioSidescrollerBlock1), + lambda state: StateLogic.canDig(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleMiniMarioSidescrollerBlock2), + lambda state: StateLogic.canDig(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleMiniMarioMazeBlock1), + lambda state: StateLogic.canDig(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleMiniMarioMazeBlock2), + lambda state: StateLogic.canDig(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleBeforeWendyFightBlock1), + lambda state: StateLogic.canDig(state, world.player) + and StateLogic.ultra(state, world.player) + and StateLogic.fire(state, world.player) + and StateLogic.canCrash(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleBeforeWendyFightBlock2), + lambda state: StateLogic.canDig(state, world.player) + and StateLogic.ultra(state, world.player) + and StateLogic.fire(state, world.player) + and StateLogic.canCrash(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleLarryRoomBlock), + lambda state: StateLogic.canDig(state, world.player) + and StateLogic.ultra(state, world.player) + and StateLogic.canDash(state, world.player) + and StateLogic.canCrash(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleWendyLarryHallwayDigspot), + lambda state: StateLogic.ultra(state, world.player) + and StateLogic.fire(state, world.player) + and StateLogic.canCrash(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleBeforeFawfulFightBlock1), + lambda state: StateLogic.canDig(state, world.player) + and StateLogic.ultra(state, world.player) + and StateLogic.canDash(state, world.player) + and StateLogic.canCrash(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleBeforeFawfulFightBlock2), + lambda state: StateLogic.canDig(state, world.player) + and StateLogic.ultra(state, world.player) + and StateLogic.canDash(state, world.player) + and StateLogic.canCrash(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleGreatDoorBlock1), + lambda state: StateLogic.canDig(state, world.player) + and StateLogic.ultra(state, world.player) + and StateLogic.canDash(state, world.player) + and StateLogic.canCrash(state, world.player) + ) + add_rule( + world.get_location(LocationName.BowsersCastleGreatDoorBlock2), + lambda state: StateLogic.canDig(state, world.player) + and StateLogic.ultra(state, world.player) + and StateLogic.canDash(state, world.player) + and StateLogic.canCrash(state, world.player) + ) add_rule( world.get_location(LocationName.HoohooVillageHammerHouseBlock), @@ -398,6 +478,10 @@ def set_rules(world: "MLSSWorld", excluded): world.get_location(LocationName.BeanstarPieceWinkleArea), lambda state: StateLogic.winkle(state, world.player), ) + add_rule( + world.get_location("Guffawha Ruins Block"), + lambda state: StateLogic.thunder(state, world.player), + ) add_rule( world.get_location(LocationName.GwarharLagoonSpangleReward), lambda state: StateLogic.spangle(state, world.player), @@ -406,6 +490,18 @@ def set_rules(world: "MLSSWorld", excluded): world.get_location(LocationName.PantsShopMomPiranhaFlag1), lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), ) + add_rule( + world.get_location("Chucklehuck Woods Solo Luigi Cave Room 2 Block"), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDig(state, world.player), + ) + add_rule( + world.get_location("Chucklehuck Woods Solo Luigi Cave Room 3 Block 1"), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDig(state, world.player), + ) + add_rule( + world.get_location("Chucklehuck Woods Solo Luigi Cave Room 3 Block 2"), + lambda state: StateLogic.brooch(state, world.player) and StateLogic.canDig(state, world.player), + ) add_rule( world.get_location(LocationName.PantsShopMomPiranhaFlag2), lambda state: StateLogic.brooch(state, world.player) or StateLogic.rose(state, world.player), @@ -600,6 +696,14 @@ def set_rules(world: "MLSSWorld", excluded): world.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock1), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), ) + add_rule( + world.get_location("Chucklehuck Woods Solo Luigi Cave Room 1 Coin Block 1"), + lambda state: StateLogic.canDig(state, world.player) and StateLogic.brooch(state, world.player), + ) + add_rule( + world.get_location("Chucklehuck Woods Solo Luigi Cave Room 1 Coin Block 2"), + lambda state: StateLogic.canDig(state, world.player) and StateLogic.brooch(state, world.player), + ) add_rule( world.get_location(LocationName.HoohooMountainBaseBooStatueCaveCoinBlock2), lambda state: StateLogic.canCrash(state, world.player) or StateLogic.super(state, world.player), @@ -679,7 +783,7 @@ def set_rules(world: "MLSSWorld", excluded): add_rule( world.get_location(LocationName.GwarharLagoonFirstUnderwaterAreaRoom2CoinBlock), lambda state: StateLogic.canDash(state, world.player) - and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player)), + and (StateLogic.membership(state, world.player) or StateLogic.surfable(state, world.player)), ) add_rule( world.get_location(LocationName.JokesEndSecondFloorWestRoomCoinBlock), diff --git a/worlds/mlss/StateLogic.py b/worlds/mlss/StateLogic.py index 39f08e169e..74ad5aa3d7 100644 --- a/worlds/mlss/StateLogic.py +++ b/worlds/mlss/StateLogic.py @@ -1,3 +1,6 @@ +from .Options import Goal + + def canDig(state, player): return state.has("Green Goblet", player) and state.has("Hammers", player) @@ -105,8 +108,9 @@ def surfable(state, player): ) -def postJokes(state, player): - return ( +def postJokes(state, player, goal): + if goal == Goal.option_vanilla: # Logic for beating jokes end without beanstar emblems + return ( surfable(state, player) and canDig(state, player) and dressBeanstar(state, player) @@ -115,7 +119,13 @@ def postJokes(state, player): and brooch(state, player) and rose(state, player) and canDash(state, player) - ) + ) + else: # Logic for beating jokes end with beanstar emblems + return ( + surfable(state, player) + and canDig(state, player) + and canDash(state, player) + ) def teehee(state, player): @@ -153,3 +163,10 @@ def birdo_shop(state, player): def fungitown_birdo_shop(state, player): return state.can_reach("Fungitown Shop Birdo Flag", "Region", player) + +def soul(state, player): + return (ultra(state, player) + and canMini(state, player) + and canDig(state, player) + and canDash(state, player) + and canCrash(state, player)) diff --git a/worlds/mlss/__init__.py b/worlds/mlss/__init__.py index bb7ed05154..1035979585 100644 --- a/worlds/mlss/__init__.py +++ b/worlds/mlss/__init__.py @@ -1,3 +1,4 @@ +import logging import os import pkgutil import typing @@ -7,7 +8,7 @@ from worlds.AutoWorld import WebWorld, World from typing import Set, Dict, Any from .Locations import all_locations, location_table, bowsers, bowsersMini, hidden, coins from .Options import MLSSOptions -from .Items import MLSSItem, itemList, item_frequencies, item_table +from .Items import MLSSItem, itemList, item_frequencies, item_table, mlss_item_name_groups from .Names.LocationName import LocationName from .Client import MLSSClient from .Regions import create_regions, connect_regions @@ -53,6 +54,7 @@ class MLSSWorld(World): options_dataclass = MLSSOptions options: MLSSOptions settings: typing.ClassVar[MLSSSettings] + item_name_groups = mlss_item_name_groups item_name_to_id = {name: data.code for name, data in item_table.items()} location_name_to_id = {loc_data.name: loc_data.id for loc_data in all_locations} required_client_version = (0, 5, 0) @@ -61,6 +63,12 @@ class MLSSWorld(World): def generate_early(self) -> None: self.disabled_locations = set() + if self.options.goal == "emblem_hunt": + if self.options.emblems_amount < self.options.emblems_required: + self.options.emblems_amount.value = self.options.emblems_required.value + logging.warning( + f"{self.player_name}'s number of emblems required is greater than the number of emblems available. " + f"Changing to {self.options.emblems_required.value}.") if self.options.skip_minecart: self.disabled_locations.update([LocationName.HoohooMountainBaseMinecartCaveDigspot]) if self.options.disable_surf: @@ -111,6 +119,8 @@ class MLSSWorld(World): for item in itemList: if item.classification != ItemClassification.filler and item.classification != ItemClassification.skip_balancing: freq = item_frequencies.get(item.itemName, 1) + if item.itemName == "Beanstar Emblem": + freq = (0 if self.options.goal != "emblem_hunt" else self.options.emblems_amount.value) if item in precollected: freq = max(freq - precollected.count(item), 0) if self.options.disable_harhalls_pants and "Harhall's" in item.itemName: @@ -138,7 +148,6 @@ class MLSSWorld(World): # And finally take as many fillers as we need to have the same amount of items and locations. remaining = len(all_locations) - len(required_items) - len(self.disabled_locations) - 5 - self.multiworld.itempool += [ self.create_item(filler_item_name) for filler_item_name in self.random.sample(filler_items, remaining) ] diff --git a/worlds/mlss/data/basepatch.bsdiff b/worlds/mlss/data/basepatch.bsdiff index 7ed6c38ea9f432dfcf506156c77e4f56bdf3026a..18d6b56e59b746ecb6c7f3db8d297e2accc305c4 100644 GIT binary patch literal 21812 zcmZshbyOU|x90~N1{qw2f#7aI2A80NyK8U;4IU&UxVwAM!QC~uy9AfuP9P9Sh-`ju z&z^VQ?%wWGUAMZcPT%^gzV~xwbmWxaa2QWB9^k($2l~IC|5}v)^kj??0=&{j%sNJ) zuTPu-;NHLguXX>=p*k;~Ij8(C_t z3dkIm6uTS;D9k_02Bmbv0fD*~( z7U;+>KZqk~?`4-AkdYNjgoP4n09@Gz4XyKk5yH@zWu*Y~Xwsw_!~Jxy4SE+)qS6^O zQ3i^Jh=(DT;DkZYIA$p*l%^v7-=-k5!4PIRArjSQAqh5)Sd!uap%Ef;0HE?hq5^p| zN1G)E)!?FkF`ytLLZtvuFu+f`gcg8u4gdxr0DyT)O@Mz8VE(@@7b!vsQdP!{?DOFA z3O+EJ6l^0NOaX)b`xLN{1g0(=27qBu1WF+v0tP@SgdyhtEhnJ{1NalbfWh=iC?vmS z;SoBHHXGSc8!KQ$kV7HNW}y)3P$Fdml~4myYNDwD0ROy+RG*pGN*6>+q& zMAweA+Da4A8f~?d;LT&IKFG0;qL7ABpnWoNjFe)-RLmrRpd${m(gIO*#XB8yYVa8e zLZp~!rgR0lpfSiUE%{cn@r6`)cy^O$s@~!L7b6^`%y$k>_JU#(dbF_^^d}i9@TuAsFK3S??El6s14iDQnZ%6vev0q>CH=Moh zcT%fex&FLuXBBwsTZLg43K?BWe_>DK%sIa!ZUq@U?jJ>)Yb9i8m9 zlR&T>U4uqM3oACNNq+vYiZM z$|~F)5RJvsaJI9jv9WVAtd{U9P&T?|F;<3{fTQbImf_A)ob!OS-fZ)c_Gu}eABk2y zpEG{H5hd@0$q_!xxyrfc*Z0-IfmHS-CCS^(?KhMU+;EwC*7sLelEpiGC3vQfr@8M+ z94V)uJ)O=ee!LsEFA{$xFN%QDK8M7mIS##CF&z3PvuK^+i(U+2#1hgW4ke0pjiVK2v@%nniQ|YU#AwM6 zCd@EHjBVjN0^MT6VJrb(6N1u^{5NsMR5J?M3pTm5Aq4UYm;p^G94?wQ`o8CU#7l^~ zwKE<8Ni!V+Dv9^&Kh`_=X@4!#y(biMJ$9(Ez+eLr(aR0P@$;ny6P!)zx=nxLtuNsr z_H6j^n>NQ?b7fIs{;Nw^#?mGl`C@iAY8puK@^lI2_oMP!J^94EQ`c{Cl$(oh2r=ml zaP@rYoS`JH>j8ppSWh^Mq%o^Uw=2zz0Cot7pjY9*;RH<9m zPVN^QTyZrCEZIKa!nE8Ly=H;mu;F&-h6mT(CRgit`x3UZqFp2fty-}3c$c`_MK$Y8O$30U za4(#4F+&VZ2*GcMM zPQ7R3?R}LApa{C^U2Lk6@^8apByyd_jUjnL)m`_;_;_6tn3Pm6n@C}wSK+}ez}mX# zh@_oy#O9si%kSJsX2e?{Sj=Ih)z4s2*)?5^0qq(S{qo8`&afn9rla4IMlW2&(A4>e zQ-|aXe@q|CJ`AQ~g!(WtlKAIxbx*bqAAIw3I`gjmcGW62QJC@tkQ?Q$)=SM-{`IJ>#wH{?>@; zkVbfCIKtoAbV<~fpjFgO`dx9H|!T$N$y%D#c~x}{?$Vue>fD6HBT zJ=KD?{qW6?*W5L@4|=+lzYK8Oc|VBqvt-w|4(Jsrm&sD}Y|8jj!yY7}l-jnId_4FV z>Mpby%Jc~w_A=^E-M|T6r}-?j`WWLXQ-*}mRP@9xsrbmudn8+cZCahUKz+A@9dJCh zV*Ml8{<|Al=dRhyr~yqy2s()r1_3xf51AF*mSgSAxBN(0)X;0gXknb=C!IE~TgX@n z9(Sd6o|}XDs+LwVw;2W%&O!_D9Fe1JJk_Y0xi*FF;Lrk8LMd4(G)v|rf_^3Pp8V9t zVNEujaw57iLV^YGuyBNcdUlE>0M~_cA*b=P)pZw_g60shW<@TLZ)5$JvW#3#R2#q| zq2@=#=%v`yCX0HEVkb#T6hik1n>U_R38MH>lqHExP+hRi*|X{CoCydj9!GFggqM_D zT6OzN%X#L?vC;>ww@@TAcHkZt2WeFjY+B@^G({^NA0i=JLm&!!UA6QaH<ixlM4yn8uasRzCwjpCl~wR-zk=yLG4&DqOc*N7+*KHpAbHl8s{CX7DH*(mM5I z-Rnq3FEwws_g*-&=KcOX8XtZ-Q9dnMtdju#lerfYl#3=v8bZfgw}aT^Ztb1bx93z$ ze9K|Y=M~rYD&wPbH`kZ+vGtC^(An>T@#Bun#3X0xWo~_5#7`Z!nG)ZI&oBAYRagaH z>sXFYJO3@F$Gz+RIrqB!tvS{&TPn#n7ZsXlvc{doL|%qR8CU{MC!FNliZ+)SDU``y zI4x3QIc;A{5RqIubB#K4I~(Z_-L|DaR%CEGPz`D-h@5?|1+M8>5Qdy_5qY}bPc;?s zBNxp+J0>gWG#~rVzcC_FuFJ^W5F9`~qYkL`ey4~t#gK}fUWhCx;j6u8L3?%0F!!Kw z3vccml!AyXR-kJQ${_!~GQ})+nJ>{eJ!MPb`&O(nv?JjcYjb{~Uwf{|3h>?62}8ss zmljmCF3-LY5tsgQBCe~@=K21`W4!$fuQ967OibQApHn;{1tltDuOyx(BkpkS>|`NB ze=Y8U;|RdeQDIqCn$IN(dNe;+?$cORQ;IdN0!4M2AlsK#Ba@s@7|M9n59=F0ump#M zdQ40|5cPwtz0Uf_No(!B*bg||!TrIosaoLv?P5*|Vslo|O2hau#vqH# zEJ)_Oj4g#J88-}KHg4F4MKjOqw!;nNTm7ZBv5ClO+g3`Ax6zuU>f% zms0F=0z^8K_u0LSEO=`|h83YvTi7{k9ivId;+|8%q~)fnPP8eObLSgRoi zA*|Leh0ZR#ZGvmy(yU>@4N664MaY2Qc(4>7l&-=vFH4Xy6+soTr%r+DB5NZ>%&Sz? z3EQAc8pVweBqVxZ@lCnMp?6fb{iE;HtH3W7xw6^j9}`o7U^Y;9$AqY>3zJdg>w$ZjMHDR2Wm6 z57yXecx{__nB^vA`3)CrS1*O4cm#e*41Z#Fq;88JjcuU3i1Q?^x(ctqj=71(!N}7g zn9n*Xx3D3kHhlODI?SO`B~lz**rh@t>oollG|k_<${YetaFf4gPqGtW0kPV63|*E+ zzO7=rJUxDYRy^>lN8&E;h4k3v#N_Fdy5Ai}Uxjr}R+a8-W_!j^Nkx6i2dDSdJQG+x z6f3~kD|9?WxA!#ph$9(Q3G|+WD=uD)_t7rQ(yEs1{MAGi_U*cxEs?ai#BVe&|2Sul z!GX}`&BKMnW-}_YK<9}<+zztEsyonnS?TlgCzcgmqX(VmKC1YmZ56Js911<$tG?mA z%+uaaUrB+_ZxZGrQN1xd(CF!T=mB|KFX(m5=wd??%9NVI^Yp9w$wmxqg=9d_-D zDuS>2o-N1vh6>hK6?8lF>t+~1>RdYYZ8ScT&>TXnVBC1-g0S($k0AxBj=ZW90umaF z{IoiES-`Zf$OnzZk0neJEmAu76tE>`-3Mw1Wa>O(p~^p3L-#=(3I!!D7HH_mNC>7* zXt0%^W|ik4RwOFV{h3(>U~&_M4AQWTxNP1ehhn=NVpa5EYi-NQ)bXW72c#Nbft-zC zD&e^WRE<|cHJ&;Ou~1%_6OpJ?Xfuu&=Y>d(-%EjkAOtjr85tMBc9<)-q$=YtwIE)C z)hZqr-O8gz31`+pr;gen43&zA=TU>g=Ev7k)hKZ3N)#%_=Ph9lg}6DuI4M5de-bvC zUJh-bSCX9&ooHZ`IY_3a0|*y?`_3(5cf(Y8ae`kIfSR74i$5{ z4-&*`$in%h<-2UCGjjO>AR(Q6ngbhNTBa^p##e-b(UrA{=_)2d{Id{Q1%=eeAe2@x z-~j;j&x!~F0OR0rHGqT^b<#h{{7*FhYtf{Zq~`w#<7j1>k5vJ>Jn_`!74!G;)Hzrs z!~{!=Fa%=Z+~%J^1^||1{|Q_G009NU|E=^NtqlPDC#&I@B6(gK(Csz$sFfD~x7Y0Z zHa5o^`gxZLsjP}lBFH^&7Il$xP73F$`*|8u)Ssj-wfSR!3%BZA&D`ftzp1EAMSpZ3 zs$Bz=T2lj(@rif7m6K5mh6M4f6(8yGSmPF8iy1)i?aqK`6X^zQgH_L0b>abg#^A5T zN!jI>t$*ykObZQ724bXK&`o}i%jo3_-BoS|HjOWCR&`wY4@cgNY4x{kx^p#u8TrJx;m~C~>R4jbw%y zj#x7CTsI{UP?_eG^Dv@W+$C${xKtf3zILtRcMCErQRTv9eR1USh_#aN#v(>(VP@b9 zs|AeUc}enym@J|E)4UbVv-505xlUrpkK(d@^NH%uH62~i;$xQdw>SAwXX3;h6tq{I z>?g*L8iO3TbDeov-t{4?%u6_bt4}d(G;p}k4S`N`*b|=B#n%tmJc#dDzYGm?9a}yRf2j z|6WPGI=z{9yXZhK(raToG`?Jq0Xv()S>HA4l!t(K7{=wb&&VmTP}-vC-iI*70f@;_oM4Vj z`>13Mx{_Ikh3v2Qz+u4O7_vBo?IG{nF`-wIpoX~_d*og#nls(!O1=A%4M5cwpSscU|6Sdk;fTLJp zW5vpCMc<7J;N?NDMp4Vb-jbK4;&s zFO2Chj6z+NG9V|VJS0GA3}MB{Bc>xjS7ijKfUxQQ$jJeY_rT}0tmFvnVshVNRQtUu zZddw}gs5V&M){_giUe#xF~+bofdV0ko~|mV76y(mJx*LqlucowNCk*i;FiSnP)nCX z9sp<#3F2@k1ej83$x;52CP2dg=t;k=U|8G3C{yh3(i z29L)r41)QBs0$T1K#HSSd&m$TWU~i(vfcA@!ywgrjeP>YQz8fpMkUbc35mFUNdRz9 zl4HY=X#ioh%gcgMuus`n=#7U7N;UW#2~96inyQO4SP$tD# z#$RF(6gOjOhZBM$VS|w$ zX{fv8g5Qs3KVvtNl!|829z=s!t%|vYqq^<|)_?a8rG6|!7lK$8rl8&ZN?pEa3=do` zL+1_kPn(|LPvSZlA>h{f6YUwKPiGvzRspnRoRXt`X)Gu)qHl*_Uh@A{BxY2+d+wzz znxR(Ge@CwoCFeg%@RyQIUNR06-Q{inhOLp9>XooZG1@{gCeE++h9de^xFt3$WZH$t z*-=5rNv2e*yCFJ!q@DB+_n&ah`8S5~-_~@3Mwg--DC}ASB%QIT4mY@i^mUTA|z;Ngg2bU^`JxV8S<;RUmbkzLnM82KP8!ljJ%s@UeL za=^6=x5o8H4tHZ_wboMAJgy}a{bj?*CQ1E!@FZxfwcRq!H#wq(2NY`S>L=kNIvLgX z6XQ~3fpfEpopsJ@Sh<+mFx_xQmtYLfb}~(=-QcY`CGe$Xa%ju2*609WbU=<&&;Q4q z$>JEMY8=n|KVMYFY6ta!L<2tynOMGZ(ji)ZUVSDHd>P#N-hwtMN!3anmny>(@Mo>x z?kV|sL%E*N!PR(=m3G<+!bCtClw^bqBsL&+qNk`fyuut-%S^i+jh`5EDmV zkD93=p3Z%=&#qzIO6+CqmH?^c{Ao{=`l%-Z7%hh9;)hl&tNEmfoN0ru}Yk zW$51R&5r<*WC)7YuPICX8QKtajP4qnq+IMGZ1kmG9uzTI9nM3`I6eAu=a@Bd_8bl$ zj~c*7hvOB|QV6r=$;T6RIbs~EBoozaT9+(l{f4LVR}~`${v_!`bq%4_EL2B=QkCBt zsqCTT!BfL{LmcD*Q?Z`{Wo|zlQdQ%%dLiYvM2+-VH+sT>`1;5`#_x5r8GT*}ayN$= zsg#zCO+H~9HD4&;#;r<`Ezma0_Pslskb=pk#<_I|)^wqdFt?@|>TWa$yrYxGZ`-=xr$>?_RW zrrU)WJD9OI=D)}(UuW>i-;GJOzZ`Hf&>Q;-M7fBrHau?OI^nZC23p06ABNYJ$?D+! z0foh?|03!Wcin&HqHBsJs{l*%V!ff5de__&`CPc9cL3CfIDdJsq^pK}umes?UD*a% zkcFE9d9oemN?2ZEY@oTiPg|OdhT;suQHGBi!dg^qzUgvg3CyB$0eTHJhfZ!#+QNLf`3%#zGeoe1bjlKLc! zsEL#j9QMWgh31mBS_Ju#$?$^WU_7lniL6Mr^>pHaclY^5dQH?J&A;-s`SCk9;(sZ` z%Xznb!4&c33K~lC?Tq)C(F3oemxoO$It2O2lAB7%YvVD#%*@L)=EA%haI+W&f!mcL z!?IlDq2+E#z|5f-QaQh`8<7uKIn+!qe<2 z)J8u$)r50ymnb0cWWC%I-zPyTIRXNW?>7vJ?1g2m9@`YYfG3G%4@fd#JJGe|zmPhR zGDk=!Oy2%7c^Y!_v zti9IH4F@E|9Yh=>2$QuCv5n#m!t`B}g)h;mQ|^rHSkauNl~If3*6AB9+-oq-?FiZ@YTHWd2gTMBhV3k21&&f5l$4T`S9hLMK>#_JjuW=>&XT`NVWI$ zKqz7ThNGr-t8yOGpVkb=Zxf|5R~6$e$g@&~uqi?q4Oiqu@LkYB4NhT77c|R9!n^$I zjTgm2_-ecGnhMRXYx3*)Hhyci+l==d5wX~G`d)}<5@F|Dj?u`da5&xva;bL%D&Rdj zREq4N%*NSt40-PElCsy6@!xuVxX;pZ#=HqxcXu>SzL`6B9{HK=BR-xS$S{I%$3JlJ zNe4IBs$w$U4*=8;q!)$h%4)t?>4uv=B(2fv-+OC$ai589`%9D<_U;7kzKX`D-8e6& zJM~^WOuv&b5ypo-`xl2UUM$e5!H2ASlVS<&b_!mMuh}B3osMAvdf(k4oT0i|zJvl~ zwHl)_pY68Weo#GaUK-*30m@lgs9Y@}3J}67i=e@-Z6TJA#hHfp1~o+0r#aNR0(ptl zTlT{oPokMaJXrMe3SvQP&Ok%!RBVfolAia2vBZ*FLi+d;`%2|gU>jSxq@wjJx9J}M zWT_puzMHwj0E$?N*dotrV|uUr*2@fSQ97Wp;i}Dd-U;SBvcWscro=@jES- zMCpn?EjE?k;-tG|NU$bd8QY|&ZRFy*j_}a!yoW=!Bx%t$-r6yNjl&}D;YbG`qiE2R z#}D(OB*Np--`0}V<>VD9gLDF^U+)yEUp)kSvroQ-7l%oR?~z?Bw%7(0Y}96VJ_mp} z=c%jCaNbO*bess3yejo`T;CHAAtX?Su{0s7CV zqJ*V^xwTMbT`Nl!W!a#R9d|~E+a}cMC-Q}T59tH12_m_Q+7@MU8)`5V4)gg z6`wf7$tHP!>3uvQOk<}+EskrWw=LHqJ?SgQLg*Zyk%s}l0U=fG@w|W zrloG?!_I~VdUe?&W~<6W-l{h?8`b*B7d0%m;_?jz z!RDsi8nO4_=02#SSAkVF{q)anv}%q{8G7zyzo1@Qrd1D3>zyrK&F-=vRf6lPjHzfm z)K=cv-PhT)jVmpm@%=#Z1`)% zadE%GrRvDVc*yp9x2{soQ_sr9)mU=61w0ToVicDie4a)CTe)>Gyq;8nLs)ba*K8D( z=yq#3esa2cL6IoKe&J={(yYGQc|OiaBg~-H`Lg;}?CHYxGJ2;v{HM;*j$}f`9AT({ zn(vb!CAqR)YjtuWgEonu=%J?kq?TTd;Ok02u%xEZsv?@Uft(i&-4}5p8keR0yMs91 zowhixb;##%+CKGPXAWJfCjE09v1ezl+#Wgjy;-_bia$)XPJX;Aai~3awmu?x62g}I z**cdzBlI*J<}iQTNW1vLf27;+EUdp`ZeeA`Zg+oGbN_{@DS|Y2`JYR;jenWoptle9g14|Os%HFdE&*OL9gXIxf{!w#t8ZUaE0_Hh9?OcUUC>#$ z?@jCygT6c(^{L4~xPC~f{Sr}U;^$=-{h@^E7kAYdd(FnjaDg31SyqSSItDy%43by+ zao^ON#`itC9zWVV%ipKd$J+SAkWp5DTQq8aaOHSEOk|-$>)YW-DUQVI z`nHIM(o#&;hwcEva<}u%$L|z33)GLE`J+Zd8npov*`vKAe(&PBTsBdNjL7g`xA!sX z2{jar%NQN=eK5}UZy$yjUsiOOyYxV3Z^1g$G59VnNnSkTVJ_Rf}&tWC)6xx_7uq)lhj$`92>dsY%g}9s_pvSmq2W)J_9ma_nx;6L zv5+~A#A>i5H8W!eq>*igkqh!)jh3Nhbi{w0|J>OTwbzr=-D5G-lw{^cj>{#ovq8Tr zI9at(uuxDJW|frLc~{-RrIEHDuvimXrox~6%e0hCEZdDMpdqCQ_kgppET68w9>_6_ zpTg@4DRBKrmJ%p1bPuYG&8fzaQxX5q7$ z<{j!)6eS}3w;m}k+v=_cr7Ac_-jtuI6%6Zeoor{}Tp|8t?&~bLkZyJ;nwBcqOYT5l zUKLUB>Ags_7b*3p@aDj@OW+ozAVU=dPLC3L^icAy)VHVrHreO>h)tFE}|TlT?h4&f)X1^0c>+>Zv9p zO+=v2qvzfC7W=w>_WG}7kRq-C%j|YX`27BgXG_?r(Bq0AF%Dy5_}A~O z5_T74zYmMbktSOiDZSsW`^E`<+dEIge+Vu5ll{EtYMga`M10>rC?&Oyj?Z^>kD%mL z)AHzAFIa$E2YhJrJn~C9*Ebnm$5|bxD{Pb~<-SUp-f5&@h5oG-ze`Dx7`9ve)TvUi zOwO&f1{tMj0`kUL18l6SKt2r^TJ1rA%HR;%s7+}UErY5kR1j()Kfkq#k#~yOo1XV8 zF%5IC1$4STcF{0wch>)m#614qi zw$1s$qLkMVZjT2Z@iflormbIg_VblnFU1sn0$6i{!cT+E7zzU8{=R&VjWw*DDki?S z@mh(-A=C)8F|y=jo8hfGKNIur&k6Oa272$nOQYAJbQTZI)6&1{C#@X>bH&qZaVf&a zNaR@^npG*!OB&WSMAT*fl6%MtYbO1NMg2FKnp`XW0w5Xx@PEUo-+zDq*U-)Xd9lYN zd0&r&n_MkQJbX2kU`1Ilud!s;^D5egfKH!Js-5!7x0_v@dLGNoT303Wj{I=WT_4M* zPRnCAwPn(7`lg?E{jWZXh)vWP@GI19cHf8|aBg>$YDn7C-B?zZ5|&5-&>_*$EvhU@ z@s*)c%lE|e{#nBg5>Q9qP?)kyONkn#q6IS|Z6_y7fTGwgl zspjxO$}8^Ym!!+Y7YoAfC;cEuH8B1P6gEyN=dV`mFRO;8nic=A5>x8mY?S0eD4MKB z;P98V`pV8CYYrm=|DH1XB3#tXR3auf8-h?~dU|XdX*}^8$;6Hj5XDAo;#w} zV#=_EkMXBLow5=*5ivy;^b~>FxDgpI9G|fEpwqT*Ln$Efbb(bJb zbU2g3?&&2Q(uA9S#}tI9L~HgeC|DLmXd0xppT!{5&no2J*t>wHQ9i3HBaPVgcMG^9rbT~oVTd}yG&bES# zYS&@Y=2q^z`b%>3&DM@C1r870joi-FoJvE|jFxF~!}hoQ^`DEJp!}Y8+**yGkh+JL zsvHkd>Yzs0m7Icf9|*KS4;y0EGn%k&^il2%Ah$^+Jl#?!q7UejuB2b6j3>e~FlK** zY`-i2aoz5fhBNyk@Pji|9?9CfZZ{4tznY=Biejs4ly^pT3)QY0zu$X1``A5-?-VQO zJ>G7`pHo0F?PoCjCk=SFnrv-;+((2LZ%v zyj-IpHxRT14B~OAE4(Kx6qI=cQzYQp(M7(;M6E1c(6DxsgE11mjUruoZzER?6TGi7 z0vQvnsxD#(I~dEN@WMg^eQXTECvDmuwo+1{@(mNI5yS>vo|HPwMQMms=|w`ry`-R! z@f96;UUg8A96CsQBUN{iP_t0IC`zV`l&q^ULr-wn<6Y}|U)}KR;^AzFbwn2|PM$}V zhBmOugA?SrnQ@y@3`k z{FRl!uA5WGN-sM^(w;e*Qjqs3(TwT4D%ggejm5$ZG>k&-_JJ2Ce4kBNZ4%Mud@<*i z;$yGTCJsucT~mAuvI%+<^ETSM)uUK6X&(Zn$_DOs6r-0+X+6o9s!9xeG-_-;dWD5i zjr$7s;V^88A@HF*fU(A2V8|GImL)i~5sTYQKYf8I?-Q2o9=b?g$HKPcQ7ZhxYDlj$ zQTwg%Clbt7X;ng&*if>ZV$Yo75r1Ox(G`xihm2nD{0Zh7+1Ii_-Xxn7Y|T;+KI= z3x6o3cVT4i$C93_dMxz=_-~x#umVQs^p<*L z$1>9dE5cb86joZ=kEF@v^e;wM<7TFE8&JonkKD@e@i)2J>f^R?`e?D<*H95a6m2*h zvK31~LGmR!O>-LA$i}fZU8A7B^fepX6E&jT2P`y@3$=JA`@8w~B{}SsP#GB#5FpAb z%39S34+_~tY2i(=A^|rJ5-~39HscWJ&eIJu7-hEH*4D>oZ>r-3dmedkRk?p`mh; zY@y!O2<;HG&b=dcXwq;`Hn43ZW7Vt@<_78K9V@9bbJYVal(*4SR`+weQ&n6F*;|3k z&Ch(SHsBg=!rZG3Iwor#&WBV+L1ej#OmIBqDsz$shcUmfA=_5-%8uXVj~j%pTgD0K z(2tIawbZ0M>_pnQMNX|rJDm}f%>qi1*_PU{Xpc9u?|&lj6!Rb;_j%{=Jy-OeU#5j3 zfpw!u<3JNLCWq^i^wN9n`Df}|*^d^XW?CV$yj{Td!p;L66Ng6IV+RyFyOcA1&=C+1 zk$^^oWZFNY4Rhcbv-W@QAGeiAuRtx4c7Hk{Ii&h&XFtixs>U&HG@KaU7i;BEHco`TN8~sH zG^C?WR(h;twD2lcSG3SE*4A=ruFI!Oao(S!b>X3db1NPjtAb_r6$h>pySMmuTt_nQ z#nwS&IpJbK2pf`bh|&~x)XLa>Lre%@=n9*cAG}C&ph-`)B~?VitsBGB8fZzTmnkIJ z^!3%V4fi5M>#+-ww#_0JcIms@%gQS2lY4BzFX9*?EQ>JTst?fajS^OZ1|}3OWG-~E zff4f1-VP%YhKUueWG(ew*Q=gKm#7mbvhdy0!Se%MYjXFM#a0a0SmbjVCQ-=w5Yg2M zxJ_S&4QRg+S+)I)T-I%n&d#>u(4M3^OLxSXH${|==VSLQ42@K*+p=dBRao0zJPc{@ zEI0f22`D6mOGV(?!Ov2`H?juVCgcHzBlf0^5eCh6BpB@Bry>>@LssJ!go<|Awv{f+ zYPIerXXqEXIP_m+=uxyH`_Mx6HMDH>Ehdv|bCQMvLvg4;m$MYQX~(2wcIE1782aPv zUf7U`6}dF)Dc657z!n|G=jGz+t?VmIsLE*%(Wi}%R4{ds=rM|{GO<+J6|~Gn{Cx5e zDjFEf2I)Jx^jGM(qg`73L!5;j^MV@{-QG)lF(lPZK%F>x`7wzd?ljTwM9~85bZOW! zK?>Sr@sDnt=~}pE<6A&nJrkgg%u?C8>0mbMN|d$&IW3Dokws~7&Y?EaeO^b-tVGl< zZP>xJ0E4yP&c%Bu4kLm$*k!B{;F6!HtCf!tf5fq>ne|Y+R4ytUIkzdwg8fxrl#$@G zjte8WuE)W&eRTWVTc5WljKkmWU{vu;&V~L;-0p7PznFGk=8e9edi?hDN>Z>lSn!(s zdQ2QvVwig`E89;JmD(*Hv#gcgM620Fg+m+_W@=cn4Wc-q^a8#E|ClALL-5-X7# zw^rTAE+fwh9nRo+@q**=wA|OsAMHKu#k*NYr-ThXjS?4Yfp4IiGnH!s%%=mrS<07@ zI5DM?ImISn-;MkT6UPR!zAc@E2s6Bt`udRs$x3n9_-nu@pG{!=7{L~JZOa>syivYf zt;cz?M74tG_L<80^jyQi?=|q!oaOiAz)gnJQ&^)PDZ zjO?i1gmTLoQJ$$ml%w@Ka2~HHYiJxi&aQxVYeHx{Q0u!pcIE4Owbc%$%A#hz9Cvo% zIJwYd&0O(s6=-3!Av%LYw;RdU;4lNCa$t_Qhl*vjCoKMsUVk>c<~PmKY_kCZW!5FS zb#rU9bGSQkZfR=uc#EB_jN{hVQoL@etTEqto8XOfM`+5B?4J^AVVvmg(nabrSFc|o5ilD*uQfq~=d zi++=aARf-j($R6oX~W~l$S0SOi%2j<7GyKfOxIntq+;?SGvdaiS@BpgIB{`rd~%|` zxjnZ%(S*S6#$T{9Qr?;U7VAZvTzHS#n|PZYH;?AzY&lNOg-J92twOY{gUQ7EP$X;B7530Cpp8Csu%*Ng*XNa zJEdg&#HycN9R?q;2I{SbX{QE24y=o`gja$@@pL#*a&WMq~iH8 zJ7-qo2Xb{FzpVeD2+d5p`Nrvb?*66Jcg@}E#}C|;HojjEWB@_tC8_vM@L!3W(~E&St9#4G*3k#O6Hh<04@3s|Q{O!i1c>hUgZVAF z>-Q@a%BLA-;>lq^z4aAbep#x+OWd|b>)y1l>z5+-B|WqKWy(&?#!=s9izZT0gfC9S zTPyQFZY%%Xy1k+U$e`+Lig^*IqwdC+l{^8?lO|9nv74LmsxPgpV{oyMct0n z;GuY@Y7iH0pp2N|o&o?_VpJ8<+)jj``Hc1dk5Y9v3 zEzA>##?R2kKC&N8Tapp@bT%Na4=vMKp*uP~`4Jj^_KW70Yt;m- z)m)yuD@-l1b~QjYsxk62->k7(hB+1A!C|mIEmh^O1guwZN-^8?{V=JzDWzWJm&T@s z1h2tTHwVq>0l1(uQ++yF%xZQdrma(qDaI$OHSciL3ccC&U8Y*c)o0zrid=zk@pw>4 zp3LizzLSdgfF-_nN#|r7_)o03f}qHcl?N*=<3YYyC*ASyaH!vXYrTG@>mbrUr+N0m z-g~84JT*yK7&w?GFyrD9-{jc1E-*Hng`^6(^h#Vfa&?UU_U-b%Z5@z_m{(pAdNF%| z-Z6cZ6|_l~%7H%AnvJ&~D>KDz=^{hIq6H+sC_cg_aClP9MS3N_n_hVPhrp9y6MFD< zm22;mUvU9S(ZYxta3;+Zqod`l!N?2^c^bT@4i|5TeMKdfZ?=m6Se>55`Wr>{k-#Ru zs*{W+o3V7!O-BEzx@yKXM+{%oXtM64$(4aj5fv3(o}`h3kb)V^;8x^Mc96kqO_0F$ zQ!6w@hRIi$VPCmq=T-q_Ui;Gu`Yc8kqZ}v}o*|r8VU0oWB35Hs>QCseO^8V`B*l$j z?5M`@Xl9m2m0iLMCAdbSL#E$e+86{T5V>t;ao;QRp|JXt?Q06T`!d48OA9d^YbFn} zO|MX`NG+*M|K@00*<2TSioyKt#2NGo%d58*?CNPa34#`Z+`fP z=gc%aGO1_2I%vbvF{o^*Fm2m%)b_n)c_7!wP|4RhVE#jEvDu07lSL0-gY^U$0XLO8 zbOhdgx~T50Ip#IlXnu=>X~IYhCt@n9B-UYd=#!q$zBM+z*_d8!pp8=IF(oRs;^WGJ z;6bQz$;k{9+P6RRHu(Etl?~n(hMhCf1`NgXcFvJO`g!kj6)rr5YdfCR86Em>&aI_H zZs})7e4i&j@Vq^6WkKh+A`J4KgN!yMt{-`d=79e)(M)cwY+U8+%;*mM5U^~Em0hib z%c{5rpiMD=bOFMkKh(~+Px;nVr+FFPrbsvaf=E0w%Qf<;B16 z+B4en412d|qF7u){X9H$W6RYGJg%b+7`W{c(lqP^)|tE8NDW8%q@ZZ*QUH(1@hQ}I zrgxjVXMc>XvN)Yd*{v75oa#EHs7vD-E)vQO4jlM|!R0>k8I|lN*2R=TG=+fQ$ z!y(JKr8%Uq?mD=~dW_%?m>xLKK3V5ZY#TS*#^x|)By`EmYkRlu{1>_B7EAT_-@K14 zqrBU1D=YLWKGT*!Myoh8hBu}J?d<;QxAwL6x7NB+WamszpRpwN8PLyYGb#jX$^6%w}f~+W+XX3HmlC`E9PhVw#q5ddA6km9f76*Yva#G}W5v ze+5|-rt6n07A`DUXaT-+Bv2c8;b5(0!D{%Nw|%Y{yi#*g!7Q#yHL&z#H22b+v_RAl zX`dR>A41ba?#bq;=damik9@UvA7iKUiZiS2J5KYURo;5VUoSOu1R`KXGVt$voF*Tr zep6e+4jedep0_{HI{x=)7}ENFXc@_SQ1AAWRjsCT22=u|eRV^KPMY?2K$4rGWbygV#B7mo7PJKR}xC<}6^LTpHUMR^k z=q=Lpf3oZBZ zPxa@2-oGzPzu}U9F2oea7YB2%;1}JjVAtVt25D_F+37Ov+DuZ9@jzPIRVy~hE01_xln^L_5?rvu8?-*vrY4V6eC-y&{PO)?bQ z=II~{HF?eN06l!}!vr@;0|R0g>FJL-cT3&n{Qff0X!WT*uD3lbB1 zu<(xW{|*TO>@`UQw>TO0Hk=yobdcZnL>H@GxB78ZA$^sDhbP^aXrt)W`C6D0Zrk)<%9(Ciy$u!NN6e8!Tf$=AVJ z+t|97_bG}`k9z^jaYsJIy)Ir2Zuhgq^l|u^n#mq??*CK3xkr6|e)9=Vxvdsqo^8l? zKDJ#dYw8k_ioLB4{?H+5-Qjy*BQEOq9oB}y^_DDW^byGnZ}7;UeHvB{%Jbf#w}pw{ za=d&UcE7zXruq1e>=Sd3l554zJ-2<-Ega-UG;(gsc>-*j<()059xVBM{GN9{u5Wcw z+giFZn!%$VLN*5CgU~9YaBCN&=H_T#8@`~%%((5H4wnAwg1n5OM_(yxS~!kqB_c}N zZSHmx+gn-o^i+Qr}cQ^}n^ z`8-<`-36C?W{oy(mVJF*lDP_d`wfl^^ID`YZ89z)_WMcI%(mEVtY+QC*3}~1@gHyb{g;d&kuD4M>EacrV?e^{1t3@uaC57%YZByw~(bB(j#^yg+ z+dgxbdtpY&S_mO0wQkA17h{oYGcz+YGjl+6ixXDs<>@aqwN%bd-v6Ri{ftIn(bs8t z%z6ypy_IKYnSKmq)3rX7RJdvDf%#J={8mv+XtUSjZL;RTb8&K>F=BQUlxbhB^|CQ+Wfh@ySTMP zN2!Ibbz@1iMz}`m4)!sPTl6iXRUthK7yj&Y`5malk=$&cMZmOas14UOm$|Hgv%uVM zvcu=kwA*dX-4?P$!p&0zsReNE^}B0nxSpc4zFz(|61ed4 z9(v;zc}uV$grCBHUs;2DP>O@pE{{`((5#m^OZIv4#?=)?Qz*1@u2_t`naUb{Yy0Uk zEt*My*1%FO%W=BA&aV%Gv@Ky!GfK7cR`)U;wbxACQy5_b2c&yzjDwe?cuLQd{Pj|% z6ZFY!&QlV_!kFdTS8*xaR>U%iDg177|5H96VdCMxQ);p{TMdUrt`T2f(;=G8bJBc* zU5rX!lAv%n5hpISXZJ8VsGV=*KTFZ3%q4AdROl-oOnli8MvTn6CGGf7{>7D&SEtpls3!uGbd`h1en*LrMO3VL?* zyE=Im(;96eq?|@WM5GJyx`rBKJ|A~YRW)0W2eGx9bS#w&2x-#S-@nWnhTZDG%ynlOmOT-b-^OgQR)np znRg6=;W;Ud#iJhRgvozJz5a^=B(MSr;_P;0P?`qzvCydb?S5cM?P}TI?_A1~<@q zEWgFtG0h9R#fmI+AjbO5o%CY%#Qn^_&4g**qoK#3nDM|K4XB2R(hG3#LitL{e<%v$ zCk!`74JXKW6Pku9EPY2A%c5%&#RXu@#!5P5H9sEg<9V};b3=~<$GYg4;dGmT-kaXU zzl_W5=jP{Tf#+HSJ&9_2gFZ+wG>c~oOS9C~K3)V86wkHh5!u>KyDsh1-I3wH4-H5> zqhEo4nwM57cKmP9Cef~kWB#>Tw*sY#Nf0szBW)TS>Pily)5tjZG_} zvy5mTCevpW&y8sGrVf5I;CR|8>L5yTZGEDmpNL-uPUx0CS_{`Xaq!% zNH{!*%k2j4#X}jH0~)O+mQ<&X@G}~_TZW`b8y%yXJKuw#!&KFB#%E&o`qlX$0|eSy z99k5wf0BQ@{A8OAA0#pq_iV72ter#5%<;^Xq39{@z0L~xxZErOV8$0MhlI`=-Q-9* zt+BcI32?IO_&yRUCer0Xu35W9jy))x!l7WCezKF)hl{Sk8hLiw6z}dBJ8`Hw-WY+3*-xtEHQM^!Fv0ywe67P{?$@T9& zoxDK4>VQ{kW$M>bsO)p`a&VF}0y26hdD3122{UOd;@iRZH9l~YhjOjpp}J?^HN;?d z&3Ftwqg}~i0n1`1QQ}C-i*quc)7tt{8Blj!+NDXE|02*!%!4EN=aE{E3g<>kmwTXW z=yZNds(7%@+H6kB)-z!f0%IHi=T*pxBM8?mb2FzcVgRN^oZ~@PyR)HG{5R->iy->q z);Ui}$(b8D3*R;q+l+e)z* z%s2xeh(@z{Fy2NR`OSHbzS36iIdiRj#(!F`l5Tt-d4HYW*~UxKd#rdV#+?$yM**N3 z(C*&meK{9BuBna^%s4%R+oGKy$AnFK7n?!2P>u56SPRAfQ+(Z&b6Nx8 zde7YdMe9=^4=vMOv3aOdsnj&JME?>?qBa3-OTTfN8N|CG(l#{sAhH@}bV zd&|k-kON~I$-6#(?WC*!^ryL+y6dsSSk`4{uWBw@hVX`9p!p*h{(wdlX-yo>FSYW$ z1s#K3tt4-I{_lx1-SsIXnrW(!5tpoy@ytM9uT{OEH!Dhz`5UhXkROA=)b#9kM+O>< zFES2b<+QN*M)8Lc^Q`J&q-l>>g3%rZrZMXJJ(Kxw4FS6xDIs6nv(Dg=b$#66P2 zd>kW8meb_I=x2vriia2n-!l@+!uLq|x3;~cpLM64VbLs2s;;X$OCJDfyYoNCN>X>S|t~;i&B1DN2Bt;(> zyE=d~u6|GvFa@CVNXtii#;^2v^I?ISY}UL`ZZvbnSZEB5m5D_4dO*gc#?IW+W5;&C zMapWgRE1Hk2?smG0G;hDy`?PlRw`p6V2_0W$b?q#I9oItC|zb3U8dQG+9`c+GVO=^ zwqk=KaElw~{ZfcI3)Z58EU!tuhOA2HkypE(KT$&6%UgQ`hn6*J)LG+bq7MOwa|+uM z80z}Fsjn;BcD=j>9*V`r9fo~49`z5|H(c2K-BaZL6MJfP)SP_pkIbESoybxTlhbaB z)n_5>w5KL_G;SjL&FdfB^j|;#fFdUCtBs8M^uw~icT6zGP)%=6)IEK~-iQ(7TI%mz zw+?8eBEbljFS5t0AH}gJR(EH5rVPxN!BS02&cs1JP&7`jSsvX1l};as6JQa~ESt^b zd1*eAb~vTL=qOw~TEa%xHp{v=cCLo~IO?$m(igL6>loVfWcyC!YqcZn8ryPwH>AbW;%BqZ<<|RoENn5l|7r3w zy3dJ+BqG%$YKQll#2K^DE=?ICH;?j;i?F9lizU2f*U- zxZFBk`ibi*ykuY{NP(N;n~kQkv#=YGv_7>}5wf<~vkM3UAb>bpfZpx!uqWKNg!pGJ zBW${Mxa#%V2OM0fQR*Fmy*=mLIM?R1{n$@H5tCs@Q1KkcF!i;~P&E2)NY0C5+YN_O z@pBxq9i~!{kqO_F?GF{)&g&uV{>cUQkxhom0A>ymrnbKI%RIeU(GHtKWu`1}MQs0r znZ2dJ^LF#GySqI3d=75olQ-`A`P|We92(Xte-3YIJc|$0I!`?F&phst7@j^|u>p0_%B-?Ga+ikYY zWttQOxt2wP(pB)L>kXuum@r99I;G-qEMu=AakF{^WPU|ZHl#GUr;@>Nupo)8ZZn;~ z?)(o!m(J%+&|qiNZ=p@A`x9o(n>KHZ#rPw#K?nqW+8HvWMbJ}2LqkJBiy4_R^)qu5 zsU@IO7>+;~v$w}V+IFjR)#Y33T(W1oL1qWMi6hM;SXbddmq?qE?;yZPocm&5FtOO z%~G9O#-$>`wG2UuF?frN=P>BgpVi`PxgBi|mkqoAiH+J|%`vr8F&eE1Cli;;jl{;X z;x5uw33o3$YNY~dS&V5?&M_F5 zYd_Vzp49X;Q7J?xrKqqQZK}+Fr%UDDewAU6=uMmA|0XmcveCNz`>gCVcVERT)t!vr zt%}J0n-)d|?31J!=Mw{-bb%4c1{Vwm)W^I@%j_x7xt}#;@^JsVcO>Lc<}O4B4gE~+ zCFtxT$xZn6SBtjcS|bib36@C5hWX}<40L7<2Y&cSdS2(&>Tj2>>P4^^z5J-t5H zK!YBUh<2XzvLG_LRHR-nCpTN|8%r}`Y+j%|0GKum%N5cqY-Zq%bzarK>wi{hsSx67 SIR9V&i@744C`e^&QgDD`h6H#3 literal 18482 zcmZ6S1yCJ9x92bJ1a}DT5V%}ia&dRp;O_3h-QC^Y9fG^NyIX==Aj|jOZoS>@n(1@e zW_oI>dglD*KSIhPl44>YmOEs?f2D7@|7|~Wi2ry(TITGmf|}IInkID^1^{H$pa1^9 z^z^Uu|EYP~MOgVE6IxK?Z|(_DJ;do$4e(vUR)O}Ev>MKdn`ZWCy-%@7PACdN6YfdOO}?9f$kSM zN=*1E#A4}M%4}rVL9*-+{Fs!t793=Wi#bK_%JM^)3v_!WB^fz6!Cw?xlHRFv%Fk^+ zM_bAgc#sal=16$v?m){JLNANkZ1u?(R*`WX)0I;OyP~v6r zR1|W8XZWw~>r(^6FNBj@vJ6pFZd$=vW_1MCz`7excl%4Xf)<=*bC6OvkMnP-z0!Pv z-3UQ}Ck4p{#gYgOaz*&wvpgeNgd#X!u@q?(^y6gqiy-F3C(>X|KwW4+UY}f((v-6( zu_||z7#*TWSmDpY;Kll9$CKJ&LyvUPCJ>6>#iO`i>75H(gON2Ok50)hxEp#Yh%ZM9u&mKRiX|~HZb~uY zTqz0;KYARyT9OExsgjN{jYful#DQrKHqV04a){NS3NRPK;+Dfg3Pj+8u_hTAM0Os9t$%5$1D! z8FfAqK72L_eYe?B)|)|7znh$WSr=>^o}J~i=;_RX^LFlpQ>G(ittj1+3aafPL<#Z# z#B=;za};~|MqpMdIu0Y;s?R%1WTqB4n#nN>HSJ|cJ1$Qqa#{W*;Z0hnOg5(fyDr&^ zNLRUEpJoqez6u_;jdBkkzmMO*pPUxozsQ4_q&EOI96NwP&A;NBi17jIa$$b#8KRB0|c%P%x~3%53ej@zf6;$E17ybTLH(I(zvt}z?h zF(leUp;|sf)mbLRB);)xWbIAxi`IHn=hamFmQ7+2Vb$?TR~an`b%IQQ4~zbgVskM( zHEga&Ve7Fx2!QqKS}Wk-hzd(~FOenPktx0=HG{dsV zxlb%$yv0PKhb)3VSmfq}ghjprhhvFR3c=w)UfrTG{z`zffj=TZz@@{ZP){TvGLq)xK%&J*UK9fo$(0>K zEA7a?&`g!Ul%xy>(MJBQ>rQjQC0&nS*6$@Q#$$;xqdADV{k({daXKd89?!`Dcz6?t zA(T`<`}!pi@S@Db7o;a1+pLe$)ZB)N7w0Q_?WRa;2IJLPhwCf1gudz2JZ%IAjHye^ zT{31`I%pJ8M&cw$ScCDpQogtL+cw85xETIs=+&3JJrVtz-6Cc1b;xp<=Di7FuJjp1 zj~A3lo%u1ALH`cnKPh8AeN%X zD#;M`4^nW-6Ur4B##fXjVA@2tVCF$9kcC07CZGo#w5~W5U#V2^MAO%!&7ll(g|MrY zJNE-))5K&!N=TOBA|Uz( zA%7JK$1!>fVaJS4suQ#HqL5ih3*d!Lf?KNFdcK5H1es#dVwm760#(aosZC2C2bA#; zN`IV@q4n^rG$#yb_h@`7?7?_MUQqueKwM1yY=>=j4INF$COW$0?vP`dd*|38k_I81 zAQaie3vtpS%Gx?sn>wn14S~(Ye>CHGlWy`YyX=GY0C^*gI1na`$e$R_!+ZnVA2f<@ zD7wV%VzXjiDyhKkQ*g&iF#Idv_YpRgY&f_H|FR{JTcYpd_iKhJvZ)D%>j&d8N6*QK z^7nb9!a%8rXuZAqOur`;dt(g7Emjk?HTyc}B=9Kh+k~{)@zs`cOk;Hc9|G(Pt96OS zA0O4^NSmKqYq*EMi1EBH@XS`)cHB=dJaJE@FleA$pp8+yzw0cP2PgSgIRc@+@WTfM z>eQd*=v#cVe426M&)jrENNf*|PLzl}-3?t5L$}mb_+vqID6;G%A6Uj`vSp2oRi)!Y zePickJ(n%?xOl~3>rBk6<}gdG5@y@!Jy;uc;IT=_AA!Cm9R?yauEE<`T=i{fJ`}-C zZ`r%6M+o`2Vp(|Vbnzo8h0t(8jV)QDhmJR?X}K>MwpkiQ+?}8lL&PC%{LU#f@^skz zoL1gNKsvj?T{yNXqJ8~hRTUkDGy8-Ue;a*3zO0)E4R=${WJf3-J7a_2kX<7l_lHAu zA6@B$xno(`r84NwwUa+N6;bp%{1i=fvAIFr^7kwI>EX*1I&(hrqF)rJ z+@n97_rC-Odac%UuD0sP)?-e_7OSb==xV@-fcaU$e4a z%o!MsHf5p|#?zVlUC4!{#yvJHhgEDC_%Hu1uJ?XZhI9%}w`6|&?k?kKN`Fz{zQH>n z)B0Chdkjk@>!@>Lnxx}b0V!EX+Xs1MN{iz;|~?gnuMS|Ly0R+%)!af-vG zJ~1hGw}P1G@1|3C3`&Ya_2(3rUnLRHoNrVuPBWDSj0CM3)f zF9;pVo(9>UBNQzhf2fYi&{ji)bd(9dRO(~Nev6&O3n+U7tRk`%GydwXX78IcgyBS5+pQUIdm$kUzXpo~we7rf-&E=DWt@q_iM=9`T9oY5OT!Sgac zd_vmWiRzwW?N0kpCpW%fESMYH|M2E5=GI@o9QX|au4F3Rh!*C)qh#jT6o{yYyP_&8 zG@nD$5EmYLzOEB6ULIWchN&u99?}3ma5|go4prkqCJ7B51Y^$;$LPY>3}qA2bsSHv z5gY2X^TqbJ=5Ey|iWuFD!~jpmm{XaE@-C=V-JRCtug z$dq_S*yI-q(|bt_ao~j%ih-uY%1aMTWY6{I=(%(Op9jF;tjvZt-Qi5!nvWREHbq$NFNP_B#}A;1%*%< zZPa{p)Z*NDmVf}+Zx#T8jfO2rBt>WdQz)JrW-8M(v-8cCEQl;DC@(0Mq>~7N?sF2w zqRR#!pkzWaCDuctWIuxx*pLuE;Aaqp93m{{_ZgSKMni#<=E*56NiwiJlt(IZ zdc#I7JqbJuEndqH<>?L=WZ_p6=gu=F29y^hPvsR8(O*US*~H7^=2-~PSp3hSFvauB zNb*3SQ6Pu~5Rl{t!2&%v_L-+)Lb7}YL}>s>mZ)eD3noBb@IPe$024qBfMAhHqo9@{ zS5gEmi0I4m1+AyELJ5ZF5fFR^LKgXjVu7+CbHL{|3or)&j0s>fJ_r7%28I9gLI^-c zR%cgAIorQEa`#oZEiLdeE?vQ-|9~JTq|mV`w`r#WH}2je0fPi9rJ?RO(}w1c7UrH2 zE8MzzzX7U9GPvR53=3w_7X$mfKV9ctqB)gSUUE*zEdi}RZd@qM;DgQ~P}chXrkC7z z^=a!nDXC-wNiW0rsNXD;LQz046XT3{cYnKhW{TF|*WEFkLs~Y|3XSzhW`@MIh0pcg zvq#Jnu2mz>LR!{oRKK86r|&RI@KO@LPJfk|IsG|FN&z@MWm z3K#>=H$rrY-_um+$<)RanBQRYA?di47to9msLkM@@(n+x7^%Fjrs%FgH-r_k2Okq1 zil$?g5uNu&8M5`_yOBvLimcGYH$Tfmj?CIaX_$p7>klY`CU{{if745J3#Q1WB~!|| zgMsCVU9`MtvR~QPvXy(Qk3_5+EGKwECi2o@sB$7!Z0}p8A#I>5m=wR$S+Ld3ids_@ z5$bT!`fi%w3Ipc)Sb0Qomve&%vnZ|i&lL&GXirR^08F=Q5DmrX3K9rr{ZW38Fpi((aN&qVyvIcF9RoSkRaiAdspQ zWJDCjCBpzP#^~a>5Q_E=$|_+n)}JdRZJ9PXVtz3geW3teI}hSF7=nmWM3^645DE%f zhEc>?AAmAXi}X)W0i=L#KMPh^*(FsM0l=YP3A%HY0rU*ZFGZ0VAw+Fi!QeSTG+{z? zEU|xR3W5%-s-mn407Z4DfV`|CbWy@ZQShWF7!Dmm#r6+CTrr>kM?pnJItX1@K7cmR z2wDX2k%w5u%nV-5VI98k)H?vfR^gW(+2G2AmGwX7q;QURi$vo1o6j8Gyg)}{_E zmEE905d(;dz=wvMI>ng&qe;-_y(r|cQUDx##V$b-YEpOrz@%nzIh`CWo{SVnQA?Eh z#>Rm_)E*s~PqYFsTGoJ=T%?I+N)o;$b(*h;UKOd0&L^n?rWCZw`!a-Hog9z&thZ04 z9SorW0I({(VPvA`#+$%+;FTR4Fy>E3XkI&= zaFK~fU?5ry##JTh<2l+`i$&!68Vv->k|SWRMosk;6ibcb2LK51$>Y&Z1!Ya! z2P5~~Q1_rGnHT~~I5V*yI*@Ou1UIwNtp98!I31Q1+NVvHk*C#*B8l6{1lGyWW#=Gd zn)d6B>pS8ysZfiZLX8Ewe!*r7Vv6V~9*KOcWdz zdMt)vn1H;S214Q(ZLZnX1!9t(HguY_zszHjzQP;HvIRr4hBTEiYH<-d(P)7f;n@@7 z95$H%NcYP2W|21e6Dvu`!P!u)e%nGEgB#@YEXc;fhshE`@?!ij$xxz<22qh!!hdJ3 z*@^k!xRJe;iHUzmH5RH&xiwY9c{LAgc#Y~BMhUVcnEJVu9T;<+e&1yGWOE}OBs6=< zrytY^%Yko^T_~{|%N%Di32@5TmclGfAW&aVvkyzs6D9cV;a@-_N)CexZQS4uPhnxnv z{sI`-7t}T2}|oA z+~uaif7hlz&{Pl<~(o#f{8k^-Bs?E%S7=N1rwr` zc@@u1yzQG)h9AexQ%NWMFo309)=BGswoEB8oXzCJrNVY)r^XDN`wN?*)cdSEwDAc< z0J&h1btBGxOaGt*7B*S5fZ2$kXLWdaj_mYe=ALs~R7*YL{qsK_V}nq2xPxtOhFd3R z?=&sQZGF~hu5Pgr+{Bm#_|4XRL8yVYr-3xBmh`+LUVUHaYoT&9AUp+ zHgB-!L{%X8&439YB9wPn*0epv=QBl`PPkh=PfSby0`~)w(lL!4(hSxQo`e~1ufE(S zj^oDr5SH>=lxJZ`TNYUnOOmdUuC)krlx%ba8zr@FcA~7buvX+SvaMEB3G!OTK>A&= zdtMnea-vFoeAr*EEB1x6t*4!UU7PZ$hS6${J;@Czq-wQ{kDHlR31~f+z8%!qN(1w*z0P+kU+5xiM|Hh8l^k z!KB=jz)!=qXe^ps6#ih^0KpmS5<-8G5uasO0(Fu+nqGyvu%k0vMBF|4d^^&;{EzCn z#$BF-HaaK^s59>#&AQu;p^+eVaux%9)U{1a-7wrYoUci*v-q6u%Lp_6P1$(xo%P%t zjQ6G2jdVoASQ$)fY|l2&^!=2=#lC;m8;$MIKzT;6KacNb%gy7#G(No}x{>9mezVgW z$9SDU&O4Sah&vyVmr!G&j6N<}>W>W^%dZq~EI^=f%2|uS;2;u8w|r#|Lpn=PDiN`i zs>GENG%Jfkjf?t$m`vaJgLgq5%;x7Q#<7Cdajw7KM+y(TvCe zs%?9_jOsq@uGN_^kZLZO%k@Ro(wv}l{?dgWR%BR(=+u{HKExHnLcDd^}O;MX-I zQmo9`!cDkDJ%n}52W81i$0+0zacL5Notc{U$ha-%MZCtVgdz#ZvUi4xgApR}}~) zuu|fcNkUXX0{LNF=W$kl59F1pUj)t)HnHJ{EwBYHq%0j@GCjl3p#f%$f_81~Xp~5- z**k#1DBo-|x;Z{peFbSXBk)MG+W?oJhBnxQ;jqpayIzjaEq@;C9E(#V!v z>z3tJYENLvKM$c#{{lw{Edn(yN=-IWND-dYUc--}8J1ZQnfz3GwT;_wAqcTiXds(! zJyk!CP#Qq~;N~gG8AdEr;LzuSY#}3f)ft)OG$SF`VqWpv4+vcd~S0MLY``rv7$s!LMC-m&8u6RAkC!-0B4O}$$ZcJqf-9w&1oyS)F; zXX>`u?~v|^>!HA?OK3BlrgMK-;$-hZLm5Ug1n`?d%3S6|6e zN0uxdJCDJWAn27y!3wGb#)HB#E#po49_=EaF)PB|tcfaZ5$OkNldWiph}m`v1+b`c zrVV%#sHvUS%MY8IMt?O(5rjOr7B}<{Y3_6hEX3F9?ygofeeWdc==d7lcP!p5;2qH^ z`)kiW%q5156mbl~Rj{*)`k>^vPG|0-`3_TIefHqt&aSer-lL?+d2zwAT|MySuJ(M+ zy8M1gq%W85JIcs{UjzVJP_l38rFZQRArX0f8RiuL;bfR~fYvYyFhc+Glwy;>4^j=q zNnL|nJ2r6G*~ix-nLPHvKb>g2Eb`E?4E|e*820P~(mQHN7UNX4(Xng06I7GucekhH zGAzV-<+~T}=J85nJ-1q=Qs(C$aA34YOwxSmBb8FU=nk>Bg6x*`^0 z{jQo-??rY#HoRR6dSKLupd|aXTJVu=WhEHiVk{y!eNF@$45r$4d->_wT-J5eUh7N2 zW~H1zOJCiDVT4%G5}|KW#Ik7NvdCnqc~zg`n_9lJ`6W)ff$kpPW)hx=m4{1^>_$32 ziy4O6@hXqui~#vO=YFpXt8a02Nqop~$I_urC~V{+)ra5~U8^Hvf>v8m8MDiwcYuLv zXHu;D9HG_GW^S-X%m}Ylo<&^1)zS%1fB_5Lv9epbW}N|%_-{SQ6GGklrYwXQ6GsXN z$s~y#Rp%m%U&rSK4@M^%k4p1PBr}ZGQ<*67>tfc!z7fl@Cq^4PRU1Nq@9BdKt%ba2i;{?_W| zl_pl4%kCh)RilD63Zc0vMicY8z^6&wSGbk$mZa;p_)zq4frPLg7Vah?LZC}jB(2T>c+WwQod<4Vk+dGQML zXi9z&h#y9M>KmWW{>FE~29NVIZ z4M@qYo;M`P7QS}8F#LSk%@4@K85;gJ5RA=(WWBp6hD-A*NuvF<&`;2quAym=o4AFk ze^q?TE1WfhQR;{U(M6&xeo9Bt>ppo7(eyWmCr3u6;l)bXoRb#ePs0V(AbFpG_25EP z0{Go~<`PqRjB)6-ch*P)7^pg#R+E={C7oGNOPVkw6asl>oM$uVH2y!~bOuV>KdPPZ(I_fb1>ZI8#*YWg%~ zJ3*q~ytCmsZn;n<*bY_vB=)szd1v;!b-NP&!<-KNiqS}C_%3Rw!eAO0B|M=w>b@(8`SaE zysxnMBez$dA11DOg&F@`Zo%5}Ojm=OU&~A6CyN`|<_x6`N`|k85md->C4B6*)zBdT3rdGula}VrMR~&vVRa&_x*Tg=9D313Q6}GzY zG;z>vc6$CW!$zOzKIQULW(PQJ#VK<-9}LG?{`d`dO%S<8K~Wgkq!P3No)}|I-Daul zyBS9}I&(p4vkp}bb58YFiWPozJtNk-WAj>HB>cFK`6tE0<G)D9wpr_P8!hu~6Ar zEj6lQ+-h(=l>UUlqYv0(yJ@?m_d0*I{sM9GD4nZ${Cznhg+ zq^up82LEvZy+XA`w!9a-q+(qsd%h%Iv=FoX#3sT+>xtTc8Iv!3wZ9VfM5i6lw@UGrgiNd{Ukx_Y4Mr`lq!}WHR);$>q zsj^qK4rOGcl9b1nN&^*}E4gX1jGp*>*1bK^L-0>p|>Jgd!{Ljp4^pt*iwTQ`r zWq*g%7dNG#5--b_ui8FN@=gcN+O8jML8N5xoMrH3FL7Xz$K8l9eM5NK)X@OHf+Ky% zim>eLV5sP^n-%_&f2ozL7<-8SmoO?xVC9G`h|6FY@|D?Tws ze34`>$S`M(rG8JHqM0CfESgUA0b`~KBlydl5Y)%loAyO?w}%2wSP+J%(FQGfxK7WqjF<^Tf8D6Ds^b&C>&GkJu( zQRA^QGtG}OV5Ql;*(Z0VufX}w#%FOWaX7j2vA7k!_UeHj1)e( zx3KUcV3xo$8g}tNfSDkJ)BsAzc+}F;)BLlmuM6cRNu_n)&YDLjDc(kU3{6SR5uhclhz?NU&It7G&~3ppU&%OEsL8) z;MoXN%IIOPI$vbB(CBcjX!=3^j;oekhlAH4w4*4PvL5ool!2_czdBBu)bfq~o`}i{ z0Iqgr#o1>Ofv^D$Gc=JoUK44Xx6F#z5K1F8f&Iohglu3+P&(^io_sR&Elz8RvpLo_ zU5MN}IuYzU+|VD54eVi_uzss0I=tODZRsm*2LUPeFs=QyKL~fI#8Q^`feIvV1k!RmdQt zZ@n0u7(xKrJ`(SE+Y6RKtwKjLh#g!BGu8uT054RiZFR`Cj|-{2Ih{d`1wAWgW2ZUe@k}OjBJ>uku zl+8QgsUNwN29wT2ObHn6Wjjl3)ZIe-%OY5_?{$RIx=MD9a52M4SSW-d2qj%gL8q=_ zeAMnt98rQQSgh7WYshrF*))W?Tr)!8DR!&V;h) z7)XLdACw{&*BfG+`h=mZJiA~CcTYh8?)lez?jzpv*X0RmLqB!<(d%Eyb1KSgaGwP; z-iwZ;B(3qPWMt4h;JJnXTr@9a4TxdqJnH0iWAH#Yx8h?FT$zUJ? zWT`*K$ovhBLcGXy*#>ysvM)ox(vR0`cg#2=fBGQ@s-?MPZM=h`u3B+J#3gDw4>_T= ziRS2Bfwy68DH(;uQ$#57ua_c&G$NvePQTK<$)mSG#H&8q>=$6a?#>cEddz8TMx81p zI~Yfpx+`hm=2CY*{qife>-EjTCM~wkCHuqpD@1YWRbDIsDim(npr$$0LA1Fl$;o$Z zM-JVMxJ*LIC&q|m3$(HwF8ijeBPy;8#__>XX@?WSEssdeB2`o5NB3{k@CA@Cv5z)r z@jAn5{0WY-C5vP8OT&Ey!USVZhAM`q$8Sv6;$ki5C*QwKoBU=eTjS&nI7O z*C_}vq@jUNK(B+cmfrC?-M!FAQ~X2 zt~KWqFJgf_HaU)CYMEkP9zmCpCXpDMo|VK@f}5kd`seQv-zHpY=HzT}Q-4-XJ!$o? zATOI&4niuinHt26`Dj&TLfB*UKUXXEYfe_$6}laKK~yeTLp;N`b|NJy};I|H?HCL3eJ4zOa*3mbV99}l61odo2>pR*;J^ctup~yKCptu1f zy;aKD=5NChq5j~rC38lF;$I2el%y*LD}=o!#|&smSxEt8F7(jD9Gz*H8cBs+1sN)H zotIZ8QVY`YElfx`D}k=t7%gT>G6|^TbG{T-jqX&ihN5V|LN$XNbjV?Z5OH`sBXedE zm~ssuDsvN}lbBmGBb79GbiQH@f0}%(gM2->H0aU%1Lpm>;8wMR5dWLXlsu zBv#i}h;S|W$0(*{6=%i#kokQffZg?#rnCS0_VmHX40Y2LBCVIPE(W}-`_INwUm-iA z3xzxf#bykhNKvE;IpdR>bfxZq^S<49J*k(Cb`3N{22N0_T= z${}Y%35$KjA#6vanp$8A{WTJj62g%pJDqYz=c;<=R7Xx#LThW;S!t@9lWnMa)|t%B z*P)e$zcB4U#2*===W4~~Q~-xxwpk8CkVwu0muT%0B}>M9rbCtN7ne31fWcyxlF(sx z*^<#CuxusQCT6go3Q^U*jY_m;aLX0&;0+9QfI19by^BGh#5jP1W0SewsY%5_NI@-f zLGFQRcN~fusVI$vQ3JX3@ieDfgSG;|5f)Lj70?Tste2c7d8T1f>AVOqqXq&8^);*& zr485={c$W3ha!uQF;l(vL1?_Gi@=7{T(pco6$7K-)zOK5GYyW5z6Uz#jRPo)IDkK) z3&9Il(fXVyA?=SZMl5X}@Y8Z?ng)8jrO@99sadbbr|E)KM-wq74F$y=Vhf($dgP{X zkVY%u2{uo3M}GM}(Ljo3FVi>V(s}5XRpg-K^9V#SP&OSfok~;2)35PRCAaBke#_8A z`(3PY(rDYjM}i@`7v-hl9vkebovnAA`)?kxVlhSb!P<|^7{wy(TMhQTks^X%a^zf2 zTbU^{HKp)@F*Fh^Zu2z9ILV*ei0BYciFlSzMLFr+=#B%}f~@WLr1Hc;5gZ1D05Sf3 z^X@f?_7TZdLHM*Ai1iz!zTZ=!#c^8yCcZ`g+}wyK(L34-^JZIpix$Vu*8*=YYMXDB z0a_m?zF#JdLrG@u*}@QIlrsEV@04TwG11xys+lLR{4UaKi0L=LW^`RUolzdNCZA&6 zXgc`@w+{c$9!vxYt^a#g(;)NKihOO1Oc&e@v3zD@$HO@tieXk`@wFy?nE?JJRNbee z!wWZY=P}jg!6u#afz?70!wks?O2Zqbk-)Nr#HP7CV!o6~aBffYrrQqVckj&I$2k_# zO% zRO#__^}L5x7zG8M!BG+Ro)RFY)^ghpg(nI$>Znmlh?{B=q9G_puj!JY*w?`{F72pX z|KslGzRBx7$-_YRjQKa80xv&O92Ak3^R@3a#ug8|3CMl7ve0$4;(QLdsRO1oP%nR=5PXzqD!A^V_pbQ})#vhlk6JNCl~ znH?rs-2wuJ{;dh={nY||(41>FQAC#RVcTeNIwgxRs^~^pu^)V8eo!`LG$-+kKo8WbOa=E)6TTDD!cSbcE1%w&!(*;6fmS*Se%v>)eHHiLJ*Z` z=1SR_L)-3c#5S!dp@yi$U7+$9A!Uw z>-|jRzKLluK@z8whErEY(){s{Xw=lIpy3M`E^hSG2i!t__;Zpb!Fma8L<%bcWXI z^y)KGQ~z^>93!U9 z-Rm0tB^szz|FO{h_!lVyOW{aGz3j;!{oPN++pr^_d#uQ$IoIv#`^xTXCci7TFH^VD z8p=h?1r^lpC>858MLZ@YE2UeN?WBFkCR>du^SL&F9}Vczw}9vcRbG|vIvalMfgQju z4#ITQr9_6}p3Zr5!LXvA=gr@g-A#nnY@N~N{p})b%`|W)N&!J?0R{LOTWw+eA>2}M zd>wp=f*Ni`jueHPxS^WDpp#6kBZIF^Y|)no04u+J?02c?+6Z(oXH@4Bbe^wo;|9A` z*~HJI8ItQ(EVCtw@W?3Rg*vq#3oY6$9-+yUYD}4lqR^-K2RF7;+)a!dWz_TC&2WJU zg#a+p0zQNm?ZmG_f@Yhe*)`48U?MwOCx$Yz8ow^tjvQg^T4)zaTu=YhE*==J?w>MO zk~VS>}IUEcNf5oI=z+Jd>iA~(QoM@|vpwr#t!$LEZphYf-pdIply@1xh30GBB zW>;%rvahz%uK47&I%6c+5abo4#!+Jz))8?ubrp3<>E_PCi&1ovT!`TF(y#H9u62gS3(qTBXB4JH$OoX?2p47}B5YgssR( zKnhEAb}dn9B|C>XuX>%vFltq3UJNhZNRDj9Vk{F#2$|9Ra|$!8x=oC|$dFP@r7&x6 zf^I0LVa8MCN7s)d&(fD_{<-*j^!LrCSypXnFJsBa0ERXuJUowc|5P{Sf+n*+Ya*6F z2dd?<^v%iV7V-l8^h<#++Eq*Ufy5QhdVj}CO8_Za=zBszd|`X@)&iLSC~tkIpiP*8 zj(=>rjVl#2dzOMSYzS`JBx(d}J%b`2nXQz#rZskdZq~jxRlTk;kN+vYdY^%%Yy2lk zgpM8-_AR`=EkQyO(k~1KqIFw@@t?B>$@0yFla?(_9srF^ebA{s zaus$>H9wL7u&tC`!JB$9;&Xd!PLn-Zjuwg?q++CmeHQS;0lQ1U!*#$711^-q;htgvGII5C7V?F!fSn8s4go8 zaZ$W5VE4TMsGvp;V!N_9vxH+>TCpnmd{aQgdepjW%6xVZ&F*i(X-Oh~{C!ig*t9Pf z2WpRai6)YnAClXH#lK>#G*`-KvEO{kn7x5UU}AYZv{dINimw-(>Lxuia}ub8@k{UY zPZiS``Fv&$y}5cX-xWR1iv)6Fx}?qQjmG>Fw&S#4YK<){EeuXh>_6H+b-C;KCyt>L zq7&KS`0FM#Co|?(%cjYT!i}jRQ?J84hsWDCtbhz%`7eT^O>YzSR^}hSeBa;bCB19y zvQmAQb3NenQXpU9sz`^M9&^0q?Q0sUj+sFiH^yWWebP(CxlO^@2SigQ&)Iv zi$hU~xE$L{efHh%)&T2S53x3kZ=oq_s=Q)4v0ktC;r)+Fn9q3jW>?N4;>|x5UVHXq zjM6yCPlt0~&Rr$KASV=?N*flI#w{JlrxZjQf1>je_l&cpGMl*KvS>0ppC^EI$zRu& zW5o)>=K39MKWqwV;2L->or|sJImc3b!WJ(rT;5KYEP;zrR$jEG!LXObmBmFp)QFi) zbq{)8)mz}wx@$>MS(>-&)Yws5~N6jgYwCoy~ z(Oeo(-rrxYG+I)Lm>k^=b}#&swj41y*kFyX)kMBBjZV|YaF&~UVm1|^5gyx^sYXnC zcdz9sm#=Khq0=Llt$IwzzYj-Ie|>~_&DH$rwDjDbW$JkssM2Fc!E@l2aW_@CoEcnE zr|j(m(bw9!GI_)qI$=oK#YSfaE!f0t6=Ton2no;P=L;z@Y#@!(SP>4RmMx=fOr)GP zJC;=-JCYN5+vV!45y8;QCSn}UNDagUMUJH^824;2U`AX*rDLQ2J zKNlx){X#SfbiApRSK{arLXCnT`~DT!^(MECP>u4=*&S)rW!$L464kh&Ka~C#11vRx zhTDihh1<3>GsDQHn%(hmH_YJh9ZTn%eP&_GIz_CGuaXsJ+>Tj0kt%GvR$`2Q9v$G9 zTfwYwn~*AE#pBox-vmrPAeqG}MpWCXASjcs&X4tu3tnQIer#aZ4<>A|D zq3p`c*9V%7hgrA*md4O6eu)Ez-wsv?(=jKd&B+SFxVE&2wa^F@3s%9knyt2Wknz$Fu;%E^l6usO z+yamTSR|H5UB7e=;61Ynfjqn}J5Ui?ubx&lT8A?^q1${cWSdb3Y-N|wp8dpZWjS0_ zzy@*(swgP6{vDIv{m^`;NrsVQJYi}Dd*!VWB0Q)5eI5BkpRi~%W=L2O`5@22My~d| zNHI>cU4vQ}rLBQCSx_d8ZCmCr)`?YG%|wgDo&pz}N>P7aJX1v4w5x$8vxH$Cx24EP zdYfUJfwynmOH2iiDg1BRi?x6mC{Od#d-}~_!tR&Gl#RSRZ zhBYKY`JUZxi7PcmahxaEoy{fbv>V>sd z+ZcJQSF}e_w_0`tnRH&aNRlbnWmW837iv43i_ze)!oA=7j|`_N(Kz+`H1pUXC@dny zh5HYLl31lQj9pY62C;YNxmf)>SiIc*DIEPtpdkhgJJ<{HhR9_!>xCgi z|3O5-AzC7Qag*1qKaw>W94L#i1ImPn`d?wf)Bo*95y&i z*_5M}M7BuWvQoK?82twLi2T84!|)gHyPFqL-1Ko$+B;rNDd5VQ(C!-YeiiWCX|Azc zCz%|*x`B9)VpGoz+$pY8!9lwyM!K#JSN-QO$ry(K4t~qo`RG?BGG0S2N88O;ZJ=?P zojJb011GuN#M&PBy1>Q8^DwV)rvqRf;QF3-B8fS&F{|5jsGvakWmhlz6ywP}c=7CI zO*-pb@_8dP{17BBkRt*i9E|Tv==oG|8p-3;D}7Fe@@Kv2(n&MDvVVNbMXgT^viRH1 zbC<{v)-O=))vS`Y67M|ZSaaHi0 zIV#)!P5B#V74UjLPf^N}BamsLc^MO6Vr_QPtr1Y^S0+fwq(=l%j&nwA;Z`$vEp=`1 z{f^{yQfSGPk-_IKlNz`Rpdh6b$QT14MqpJgy3&dyX_XEGo84VX)zivT2KnVlb=O^W z*I~3`^8Gj*4By-WCIGcAbAp4C`zO}rZ?Nis!8QwwkZi3X=Ts6+O?#znAc=vd@UEvd zTCC&McTU|gVkpMtaPZg-PUGgwN2{obNH4O<3)6L6{VvGrw|n5~nep5eHCuwz^y5Ht* za-@Acz2h!BRlxqqjSTr3j=(vr}{JT8^QjgL7DqA6tEViG~qxXw9X* zTC2$L`P~ghrvn24>qs=wqTpjp@Ap18S1nnrYySSCKY#b~a(A1}?840~F42CJ(gwLT zhF@Zun>;Rp=hX-cIE)f#L_|bjfFX0zmov>_YWKr)K#z-F{r?HpoJ?A0$3}$E;LxV; zKh)q*rW^1mj$@CP1vwnzMwAGzUxq+Cx9u{FScQ1E1U-iXT^e53^Ib_$ZG0R_O|K5~e;boqciW*m;j#sI!?nDp zi0j&2D6zbiJ20E?zWeXK^Upl<&ph=BSXfJ-#CLsKe657qs;a7&RaI40RaKSLO?Qsw zh71>Y`CJgUYp*)XEV0V#uDa{4x@A?-bT3i_0qCZXsLaYJ!nFZ&`LJX!AV}jMAM&Pv z9PaNe4A{A2ERh9iaf;FGeqWct;&CJ6vowTzC{gHk(c{OD9zT}OL==hNpnJ3)CWL-F=F1G2eoUlnA|ds%~n!x*#L?t9RmnJh-nDIX(YB- zCGS`PiqiVc|A8Q`E;ENqP+0Rx7K&jg*rcT7_=eWQe<#qe{YfT1G=BuJ>42t!IT}!m zfiw+v>yNT-+TPn4)Vf%IDzR_YOc|x)L|?8Q@_F2S@@}_Hu=S0SaP34nvT?ZQ-0j=G znV6d8_e*fMj~#C1n)~SNR;QS=aOZZKuZmP-2X9fPoW9j0Y0RSQ8~BUJ!Gk$D9Mktx zV+#Cj7`laQoY$ojriI39Iv# zgQw!61D!zj`K%e@2djfuxf;X}+&-Xo>k2|g{$y4FJ-KPYIbE;pS5FYnu}5`NVd;MC yK)fyXCz+ykbjz|{K&9%1be5i8JZKfHd%J#l&!DhAo~Qo*#oUoj6eK2u(GY+I^}iYb From 04771fa4f03c5569d9f4100633ce79a0acbee6ad Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Sun, 9 Mar 2025 14:00:00 -0500 Subject: [PATCH 088/227] Core: fix pickling plando texts (#4711) --- Utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Utils.py b/Utils.py index 0aa81af150..c7f13f144d 100644 --- a/Utils.py +++ b/Utils.py @@ -443,7 +443,8 @@ class RestrictedUnpickler(pickle.Unpickler): else: mod = importlib.import_module(module) obj = getattr(mod, name) - if issubclass(obj, (self.options_module.Option, self.options_module.PlandoConnection)): + if issubclass(obj, (self.options_module.Option, self.options_module.PlandoConnection, + self.options_module.PlandoText)): return obj # Forbid everything else. raise pickle.UnpicklingError(f"global '{module}.{name}' is forbidden") From e95a41cf933946ff29d440a6e81bae314abfff96 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Mon, 10 Mar 2025 09:24:37 -0400 Subject: [PATCH 089/227] TUNIC: Add another alias for ladders #4714 --- worlds/tunic/items.py | 1 + 1 file changed, 1 insertion(+) diff --git a/worlds/tunic/items.py b/worlds/tunic/items.py index 1898534c1b..a2b4140a68 100644 --- a/worlds/tunic/items.py +++ b/worlds/tunic/items.py @@ -253,6 +253,7 @@ extra_groups: Dict[str, Set[str]] = { "Ladders in Atoll": {"Ladders in South Atoll"}, "Ladders in Ruined Atoll": {"Ladders in South Atoll"}, "Ladders in Town": {"Ladders in Overworld Town"}, # fuzzy matching decided this was Ladders in South Atoll + "Ladder in Quarry": {"Ladders in Lower Quarry"}, # fuzzy matching decided this was Ladder to Quarry } item_name_groups.update(extra_groups) From 21ffc0fc548fc4fbddb6978282df1922f77f6e9d Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Mon, 10 Mar 2025 14:43:52 +0100 Subject: [PATCH 090/227] Band-aid Linux Build breaking with the release of PyGObject 3.52.1 (#4716) * Band-aid Linux Build breaking with the release of PyGObject 3.52.1 * Update build.yml * Release workflow as well --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 27ca76e41f..2b450fe46e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -132,7 +132,7 @@ jobs: # charset-normalizer was somehow incomplete in the github runner "${{ env.PYTHON }}" -m venv venv source venv/bin/activate - "${{ env.PYTHON }}" -m pip install --upgrade pip PyGObject charset-normalizer + "${{ env.PYTHON }}" -m pip install --upgrade pip "PyGObject<3.51.0" charset-normalizer python setup.py build_exe --yes bdist_appimage --yes echo -e "setup.py build output:\n `ls build`" echo -e "setup.py dist output:\n `ls dist`" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index aec4f90998..f12e8fb80c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -64,7 +64,7 @@ jobs: # charset-normalizer was somehow incomplete in the github runner "${{ env.PYTHON }}" -m venv venv source venv/bin/activate - "${{ env.PYTHON }}" -m pip install --upgrade pip PyGObject charset-normalizer + "${{ env.PYTHON }}" -m pip install --upgrade pip "PyGObject<3.51.0" charset-normalizer python setup.py build_exe --yes bdist_appimage --yes echo -e "setup.py build output:\n `ls build`" echo -e "setup.py dist output:\n `ls dist`" From 5f73c245fc88f91bafedfa5f897839ec9fd8288a Mon Sep 17 00:00:00 2001 From: Carter Hesterman Date: Mon, 10 Mar 2025 07:53:26 -0600 Subject: [PATCH 091/227] New Game Implementation: Civilization VI (#3736) * Init * remove submodule * Init * Update docs * Fix tests * Update to use apcivvi * Update Readme and codeowners * Minor changes * Remove .value from options (except starting hint) * Minor updates * remove unnecessary property * Cleanup Rules and Region * Fix output file generation * Implement feedback * Remove 'AP' tag and fix issue with format strings and using same quotes * Update worlds/civ_6/__init__.py Co-authored-by: Scipio Wright * Minor docs changes * minor updates * Small rework of create items * Minor updates * Remove unused variable * Move client to Launcher Components with rest of similar clients * Revert "Move client to Launcher Components with rest of similar clients" This reverts commit f9fd5df9fdf19eaf4f1de54e21e3c33a74f02364. * modify component * Fix generation issues * Fix tests * Minor change * Add improvement and test case * Minor options changes * . * Preliminary Review * Fix failing test due to slot data serialization * Format json * Remove exclude missable boosts * Update options (update goody hut text, make research multiplier a range) * Update docs punctuation and slot data init * Move priority/excluded locations into options * Implement docs PR feedback * PR Feedback for options * PR feedback misc * Update location classification and fix client type * Fix typings * Update research cost multiplier * Remove unnecessary location priority code * Remove extrenous use of items() * WIP PR Feedback * WIP PR Feedback * Add victory event * Add option set for death link effect * PR improvements * Update post fill hint to support items with multiple classifications * remove unnecessary len * Move location exclusion logic * Update test to use set instead of accidental dict * Update docs around progressive eras and boost locations * Update docs for options to be more readable * Fix issue with filler items and prehints * Update filler_data to be static * Update links in docs * Minor updates and PR feedback * Update boosts data * Update era required items * Update existing techs * Update existing techs * move boost data class * Update reward data * Update prereq data * Update new items and progressive districts * Remove unused code * Make filler item name func more efficient * Update death link text * Move Civ6 to the end of readme * Fix bug with hidden locations and location.name * Partial PR Feedback Implementation * Format changes * Minor review feedback * Modify access rules to use list created in generate_early * Modify boost rules to precalculate requirements * Remove option checks from access rules * Fix issue with pre initialized dicts * Add inno setup for civ6 client * Update inno_setup.iss --------- Co-authored-by: Scipio Wright Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Co-authored-by: Exempt-Medic Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> --- .gitignore | 1 + README.md | 1 + docs/CODEOWNERS | 3 + inno_setup.iss | 5 + worlds/civ_6/Civ6Client.py | 342 ++++++++ worlds/civ_6/CivVIInterface.py | 119 +++ worlds/civ_6/Container.py | 219 +++++ worlds/civ_6/Data.py | 70 ++ worlds/civ_6/DeathLink.py | 74 ++ worlds/civ_6/Enum.py | 39 + worlds/civ_6/ItemData.py | 38 + worlds/civ_6/Items.py | 353 ++++++++ worlds/civ_6/LICENSE.md | 21 + worlds/civ_6/Locations.py | 156 ++++ worlds/civ_6/Options.py | 130 +++ worlds/civ_6/ProgressiveDistricts.py | 35 + worlds/civ_6/Regions.py | 128 +++ worlds/civ_6/Rules.py | 109 +++ worlds/civ_6/TunerClient.py | 105 +++ worlds/civ_6/__init__.py | 326 +++++++ worlds/civ_6/data/boosts.py | 919 ++++++++++++++++++++ worlds/civ_6/data/era_required_items.py | 75 ++ worlds/civ_6/data/existing_civics.py | 435 +++++++++ worlds/civ_6/data/existing_tech.py | 546 ++++++++++++ worlds/civ_6/data/goody_hut_rewards.py | 81 ++ worlds/civ_6/data/new_civic_prereqs.py | 92 ++ worlds/civ_6/data/new_civics.py | 372 ++++++++ worlds/civ_6/data/new_tech.py | 468 ++++++++++ worlds/civ_6/data/new_tech_prereqs.py | 110 +++ worlds/civ_6/data/progressive_districts.py | 41 + worlds/civ_6/docs/en_Civilization VI.md | 59 ++ worlds/civ_6/docs/setup_en.md | 51 ++ worlds/civ_6/test/TestBoostsanity.py | 107 +++ worlds/civ_6/test/TestGoodyHuts.py | 114 +++ worlds/civ_6/test/TestRegionRequirements.py | 234 +++++ worlds/civ_6/test/TestStartingHints.py | 125 +++ worlds/civ_6/test/__init__.py | 8 + 37 files changed, 6111 insertions(+) create mode 100644 worlds/civ_6/Civ6Client.py create mode 100644 worlds/civ_6/CivVIInterface.py create mode 100644 worlds/civ_6/Container.py create mode 100644 worlds/civ_6/Data.py create mode 100644 worlds/civ_6/DeathLink.py create mode 100644 worlds/civ_6/Enum.py create mode 100644 worlds/civ_6/ItemData.py create mode 100644 worlds/civ_6/Items.py create mode 100644 worlds/civ_6/LICENSE.md create mode 100644 worlds/civ_6/Locations.py create mode 100644 worlds/civ_6/Options.py create mode 100644 worlds/civ_6/ProgressiveDistricts.py create mode 100644 worlds/civ_6/Regions.py create mode 100644 worlds/civ_6/Rules.py create mode 100644 worlds/civ_6/TunerClient.py create mode 100644 worlds/civ_6/__init__.py create mode 100644 worlds/civ_6/data/boosts.py create mode 100644 worlds/civ_6/data/era_required_items.py create mode 100644 worlds/civ_6/data/existing_civics.py create mode 100644 worlds/civ_6/data/existing_tech.py create mode 100644 worlds/civ_6/data/goody_hut_rewards.py create mode 100644 worlds/civ_6/data/new_civic_prereqs.py create mode 100644 worlds/civ_6/data/new_civics.py create mode 100644 worlds/civ_6/data/new_tech.py create mode 100644 worlds/civ_6/data/new_tech_prereqs.py create mode 100644 worlds/civ_6/data/progressive_districts.py create mode 100644 worlds/civ_6/docs/en_Civilization VI.md create mode 100644 worlds/civ_6/docs/setup_en.md create mode 100644 worlds/civ_6/test/TestBoostsanity.py create mode 100644 worlds/civ_6/test/TestGoodyHuts.py create mode 100644 worlds/civ_6/test/TestRegionRequirements.py create mode 100644 worlds/civ_6/test/TestStartingHints.py create mode 100644 worlds/civ_6/test/__init__.py diff --git a/.gitignore b/.gitignore index 791f7b1bb7..5da42dc1e0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *_Spoiler.txt *.bmbp *.apbp +*.apcivvi *.apl2ac *.apm3 *.apmc diff --git a/README.md b/README.md index d60f1b9665..d119d560a7 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ Currently, the following games are supported: * Saving Princess * Castlevania: Circle of the Moon * Inscryption +* Civilization VI For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index c4cb83e42f..ac88921356 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -45,6 +45,9 @@ # ChecksFinder /worlds/checksfinder/ @SunCatMC +# Civilization VI +/worlds/civ6/ @hesto2 + # Clique /worlds/clique/ @ThePhar diff --git a/inno_setup.iss b/inno_setup.iss index eb794650f3..9d03ca7baf 100644 --- a/inno_setup.iss +++ b/inno_setup.iss @@ -221,6 +221,11 @@ Root: HKCR; Subkey: "{#MyAppName}ygo06patch"; ValueData: "Ar Root: HKCR; Subkey: "{#MyAppName}ygo06patch\DefaultIcon"; ValueData: "{app}\ArchipelagoBizHawkClient.exe,0"; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}ygo06patch\shell\open\command"; ValueData: """{app}\ArchipelagoBizHawkClient.exe"" ""%1"""; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: ".apcivvi"; ValueData: "{#MyAppName}apcivvipatch"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}apcivvipatch"; ValueData: "Archipelago Civilization 6 Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}apcivvipatch\DefaultIcon"; ValueData: "{app}\ArchipelagoLauncher.exe,0"; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}apcivvipatch\shell\open\command"; ValueData: """{app}\ArchipelagoLauncher.exe"" ""%1"""; ValueType: string; ValueName: ""; + Root: HKCR; Subkey: ".archipelago"; ValueData: "{#MyAppName}multidata"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}multidata"; ValueData: "Archipelago Server Data"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}multidata\DefaultIcon"; ValueData: "{app}\ArchipelagoServer.exe,0"; ValueType: string; ValueName: ""; diff --git a/worlds/civ_6/Civ6Client.py b/worlds/civ_6/Civ6Client.py new file mode 100644 index 0000000000..7ef0a9e364 --- /dev/null +++ b/worlds/civ_6/Civ6Client.py @@ -0,0 +1,342 @@ +import asyncio +import logging +import os +import traceback +from typing import Any, Dict, List, Optional +import zipfile + +from CommonClient import ClientCommandProcessor, CommonContext, get_base_parser, logger, server_loop, gui_enabled +from .Data import get_progressive_districts_data +from .DeathLink import handle_check_deathlink +from NetUtils import ClientStatus +import Utils +from .CivVIInterface import CivVIInterface, ConnectionState +from .Enum import CivVICheckType +from .Items import CivVIItemData, generate_item_table, get_item_by_civ_name +from .Locations import CivVILocationData, generate_era_location_table +from .TunerClient import TunerErrorException, TunerTimeoutException + + +class CivVICommandProcessor(ClientCommandProcessor): + def __init__(self, ctx: CommonContext): + super().__init__(ctx) + + def _cmd_deathlink(self): + """Toggle deathlink from client. Overrides default setting.""" + if isinstance(self.ctx, CivVIContext): + self.ctx.death_link_enabled = not self.ctx.death_link_enabled + self.ctx.death_link_just_changed = True + Utils.async_start(self.ctx.update_death_link( + self.ctx.death_link_enabled), name="Update Deathlink") + self.ctx.logger.info(f"Deathlink is now {'enabled' if self.ctx.death_link_enabled else 'disabled'}") + + def _cmd_resync(self): + """Resends all items to client, and has client resend all locations to server. This can take up to a minute if the player has received a lot of items""" + if isinstance(self.ctx, CivVIContext): + logger.info("Resyncing...") + asyncio.create_task(self.ctx.resync()) + + def _cmd_toggle_progressive_eras(self): + """If you get stuck for some reason and unable to continue your game, you can run this command to disable the defeat that comes from pushing past the max unlocked era """ + if isinstance(self.ctx, CivVIContext): + print("Toggling progressive eras, stand by...") + self.ctx.is_pending_toggle_progressive_eras = True + + +class CivVIContext(CommonContext): + is_pending_death_link_reset = False + is_pending_toggle_progressive_eras = False + command_processor = CivVICommandProcessor + game = "Civilization VI" + items_handling = 0b111 + tuner_sync_task: Optional[asyncio.Task[None]] = None + game_interface: CivVIInterface + location_name_to_civ_location: Dict[str, CivVILocationData] = {} + location_name_to_id: Dict[str, int] = {} + item_id_to_civ_item: Dict[int, CivVIItemData] = {} + item_table: Dict[str, CivVIItemData] = {} + processing_multiple_items = False + received_death_link = False + death_link_message = "" + death_link_enabled = False + slot_data: Dict[str, Any] + + death_link_just_changed = False + # Used to prevent the deathlink from triggering when someone re enables it + + logger = logger + progressive_items_by_type = get_progressive_districts_data() + item_name_to_id = { + item.name: item.code for item in generate_item_table().values()} + connection_state = ConnectionState.DISCONNECTED + + def __init__(self, server_address: Optional[str], password: Optional[str], apcivvi_file: Optional[str] = None): + super().__init__(server_address, password) + self.slot_data: Dict[str, Any] = {} + self.game_interface = CivVIInterface(logger) + location_by_era = generate_era_location_table() + self.item_table = generate_item_table() + self.apcivvi_file = apcivvi_file + + # Get tables formatted in a way that is easier to use here + for locations in location_by_era.values(): + for location in locations.values(): + self.location_name_to_id[location.name] = location.code + self.location_name_to_civ_location[location.name] = location + + for item in self.item_table.values(): + self.item_id_to_civ_item[item.code] = item + + async def resync(self): + if self.processing_multiple_items: + logger.info( + "Waiting for items to finish processing, try again later") + return + await self.game_interface.resync() + await handle_receive_items(self, -1) + logger.info("Resynced") + + def on_deathlink(self, data: Utils.Dict[str, Utils.Any]) -> None: + super().on_deathlink(data) + text = data.get("cause", "") + if text: + message = text + else: + message = f"Received from {data['source']}" + self.death_link_message = message + self.received_death_link = True + + async def server_auth(self, password_requested: bool = False): + if password_requested and not self.password: + await super(CivVIContext, self).server_auth(password_requested) + await self.get_username() + self.tags = set() + await self.send_connect() + + def run_gui(self): + from kvui import GameManager + + class CivVIManager(GameManager): + logging_pairs = [ + ("Client", "Archipelago") + ] + base_title = "Archipelago Civilization VI Client" + + self.ui = CivVIManager(self) + self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") + + def on_package(self, cmd: str, args: Dict[str, Any]): + if cmd == "Connected": + self.slot_data = args["slot_data"] + if "death_link" in args["slot_data"]: + self.death_link_enabled = bool(args["slot_data"]["death_link"]) + Utils.async_start(self.update_death_link( + bool(args["slot_data"]["death_link"]))) + + +def update_connection_status(ctx: CivVIContext, status: ConnectionState): + if ctx.connection_state == status: + return + elif status == ConnectionState.IN_GAME: + ctx.logger.info("Connected to Civ VI") + elif status == ConnectionState.IN_MENU: + ctx.logger.info("Connected to Civ VI, waiting for game to start") + elif status == ConnectionState.DISCONNECTED: + ctx.logger.info("Disconnected from Civ VI, attempting to reconnect...") + + ctx.connection_state = status + + +async def tuner_sync_task(ctx: CivVIContext): + logger.info("Starting CivVI connector") + while not ctx.exit_event.is_set(): + if not ctx.slot: + await asyncio.sleep(3) + continue + else: + try: + if ctx.processing_multiple_items: + await asyncio.sleep(3) + else: + state = await ctx.game_interface.is_in_game() + update_connection_status(ctx, state) + if state == ConnectionState.IN_GAME: + await _handle_game_ready(ctx) + else: + await asyncio.sleep(3) + except TunerTimeoutException: + logger.error( + "Timeout occurred while receiving data from Civ VI, this usually isn't a problem unless you see it repeatedly") + await asyncio.sleep(3) + except Exception as e: + if isinstance(e, TunerErrorException): + logger.debug(str(e)) + else: + logger.debug(traceback.format_exc()) + + await asyncio.sleep(3) + continue + + +async def handle_toggle_progressive_eras(ctx: CivVIContext): + if ctx.is_pending_toggle_progressive_eras: + ctx.is_pending_toggle_progressive_eras = False + current = await ctx.game_interface.get_max_allowed_era() + if current > -1: + await ctx.game_interface.set_max_allowed_era(-1) + logger.info("Disabled progressive eras") + else: + count = 0 + for _, network_item in enumerate(ctx.items_received): + item: CivVIItemData = ctx.item_id_to_civ_item[network_item.item] + if item.item_type == CivVICheckType.ERA: + count += 1 + await ctx.game_interface.set_max_allowed_era(count) + logger.info(f"Enabled progressive eras, set to {count}") + + +async def handle_checked_location(ctx: CivVIContext): + checked_locations = await ctx.game_interface.get_checked_locations() + checked_location_ids = [location.code for location_name, location in ctx.location_name_to_civ_location.items( + ) if location_name in checked_locations] + + await ctx.send_msgs([{"cmd": "LocationChecks", "locations": checked_location_ids}]) + + +async def handle_receive_items(ctx: CivVIContext, last_received_index_override: Optional[int] = None): + try: + last_received_index = last_received_index_override or await ctx.game_interface.get_last_received_index() + if len(ctx.items_received) - last_received_index > 1: + ctx.processing_multiple_items = True + + progressive_districts: List[CivVIItemData] = [] + progressive_eras: List[CivVIItemData] = [] + for index, network_item in enumerate(ctx.items_received): + + # Track these separately so if we replace "PROGRESSIVE_DISTRICT" with a specific tech, we can still check if need to add it to the list of districts + item: CivVIItemData = ctx.item_id_to_civ_item[network_item.item] + item_to_send: CivVIItemData = ctx.item_id_to_civ_item[network_item.item] + if index > last_received_index: + if item.item_type == CivVICheckType.PROGRESSIVE_DISTRICT and item.civ_name: + # if the item is progressive, then check how far in that progression type we are and send the appropriate item + count = sum( + 1 for count_item in progressive_districts if count_item.civ_name == item.civ_name) + + if count >= len(ctx.progressive_items_by_type[item.civ_name]): + logger.error( + f"Received more progressive items than expected for {item.civ_name}") + continue + + item_civ_name = ctx.progressive_items_by_type[item.civ_name][count] + actual_item_name = get_item_by_civ_name(item_civ_name, ctx.item_table).name + item_to_send = ctx.item_table[actual_item_name] + + sender = ctx.player_names[network_item.player] + if item.item_type == CivVICheckType.ERA: + count = len(progressive_eras) + 1 + await ctx.game_interface.give_item_to_player(item_to_send, sender, count) + elif item.item_type == CivVICheckType.GOODY and item_to_send.civ_name: + await ctx.game_interface.give_item_to_player(item_to_send, sender, game_id_override=item_to_send.civ_name) + else: + await ctx.game_interface.give_item_to_player(item_to_send, sender) + await asyncio.sleep(0.02) + + if item.item_type == CivVICheckType.PROGRESSIVE_DISTRICT: + progressive_districts.append(item) + elif item.item_type == CivVICheckType.ERA: + progressive_eras.append(item) + + ctx.processing_multiple_items = False + finally: + # If something errors out, then unblock item processing + ctx.processing_multiple_items = False + + +async def handle_check_goal_complete(ctx: CivVIContext): + if ctx.finished_game: + return + result = await ctx.game_interface.check_victory() + if result: + logger.info("Sending Victory to server!") + await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) + ctx.finished_game = True + + +async def _handle_game_ready(ctx: CivVIContext): + if ctx.server: + if not ctx.slot: + await asyncio.sleep(3) + return + + await handle_receive_items(ctx) + await handle_checked_location(ctx) + await handle_check_goal_complete(ctx) + + if ctx.death_link_enabled: + await handle_check_deathlink(ctx) + + # process pending commands + await handle_toggle_progressive_eras(ctx) + await asyncio.sleep(3) + else: + logger.info("Waiting for player to connect to server") + await asyncio.sleep(3) + + +def main(connect: Optional[str] = None, password: Optional[str] = None, name: Optional[str] = None): + Utils.init_logging("Civilization VI Client") + + async def _main(connect: Optional[str], password: Optional[str], name: Optional[str]): + parser = get_base_parser() + parser.add_argument("apcivvi_file", default="", type=str, nargs="?", help="Path to apcivvi file") + args = parser.parse_args() + ctx = CivVIContext(connect, password, args.apcivvi_file) + + if args.apcivvi_file: + parent_dir: str = os.path.dirname(args.apcivvi_file) + target_name: str = os.path.basename(args.apcivvi_file).replace(".apcivvi", "-MOD-FILES") + target_path: str = os.path.join(parent_dir, target_name) + if not os.path.exists(target_path): + os.makedirs(target_path, exist_ok=True) + logger.info("Extracting mod files to %s", target_path) + with zipfile.ZipFile(args.apcivvi_file, "r") as zip_ref: + for member in zip_ref.namelist(): + zip_ref.extract(member, target_path) + + ctx.auth = name + ctx.server_task = asyncio.create_task( + server_loop(ctx), name="ServerLoop") + if gui_enabled: + ctx.run_gui() + await asyncio.sleep(1) + + ctx.tuner_sync_task = asyncio.create_task( + tuner_sync_task(ctx), name="TunerSync") + + await ctx.exit_event.wait() + ctx.server_address = None + + await ctx.shutdown() + + if ctx.tuner_sync_task: + await asyncio.sleep(3) + await ctx.tuner_sync_task + + import colorama + + colorama.init() + asyncio.run(_main(connect, password, name)) + colorama.deinit() + + +def debug_main(): + parser = get_base_parser() + parser.add_argument("apcivvi_file", default="", type=str, nargs="?", help="Path to apcivvi file") + parser.add_argument("--name", default=None, + help="Slot Name to connect as.") + parser.add_argument("--debug", default=None, + help="debug mode, additional logging") + args = parser.parse_args() + if args.debug: + logger.setLevel(logging.DEBUG) + main(args.connect, args.password, args.name) diff --git a/worlds/civ_6/CivVIInterface.py b/worlds/civ_6/CivVIInterface.py new file mode 100644 index 0000000000..c74d45675a --- /dev/null +++ b/worlds/civ_6/CivVIInterface.py @@ -0,0 +1,119 @@ +from enum import Enum +from logging import Logger +from typing import List, Optional + +from .Items import CivVIItemData +from .TunerClient import TunerClient, TunerConnectionException, TunerTimeoutException + + +class ConnectionState(Enum): + DISCONNECTED = 0 + IN_GAME = 1 + IN_MENU = 2 + + +class CivVIInterface: + logger: Logger + tuner: TunerClient + last_error: Optional[str] = None + + def __init__(self, logger: Logger): + self.logger = logger + self.tuner = TunerClient(logger) + + async def is_in_game(self) -> ConnectionState: + command = "IsInGame()" + try: + result = await self.tuner.send_game_command(command) + if result == "false": + return ConnectionState.IN_MENU + self.last_error = None + return ConnectionState.IN_GAME + except TunerTimeoutException: + self.print_connection_error( + "Not connected to game, waiting for connection to be available") + return ConnectionState.DISCONNECTED + except TunerConnectionException as e: + if "The remote computer refused the network connection" in str(e): + self.print_connection_error( + "Unable to connect to game. Verify that the tuner is enabled. Attempting to reconnect") + else: + self.print_connection_error( + "Not connected to game, waiting for connection to be available") + return ConnectionState.DISCONNECTED + except Exception as e: + if "attempt to index a nil valuestack traceback" in str(e) \ + or ".. is not supported for string .. nilstack traceback" in str(e): + return ConnectionState.IN_MENU + return ConnectionState.DISCONNECTED + + def print_connection_error(self, error: str) -> None: + if error != self.last_error: + self.last_error = error + self.logger.info(error) + + async def give_item_to_player(self, item: CivVIItemData, sender: str = "", amount: int = 1, game_id_override: Optional[str] = None) -> None: + if game_id_override: + item_id = f'"{game_id_override}"' + else: + item_id = item.civ_vi_id + + command = f"HandleReceiveItem({item_id}, \"{item.name}\", \"{item.item_type.value}\", \"{sender}\", {amount})" + await self.tuner.send_game_command(command) + + async def resync(self) -> None: + """Has the client resend all the checked locations""" + command = "Resync()" + await self.tuner.send_game_command(command) + + async def check_victory(self) -> bool: + command = "ClientGetVictory()" + result = await self.tuner.send_game_command(command) + return result == "true" + + async def get_checked_locations(self) -> List[str]: + command = "GetUnsentCheckedLocations()" + result = await self.tuner.send_game_command(command, 2048 * 4) + return result.split(",") + + async def get_deathlink(self) -> str: + """returns either "false" or the name of the unit that killed the player's unit""" + command = "ClientGetDeathLink()" + result = await self.tuner.send_game_command(command) + return result + + async def kill_unit(self, message: str) -> None: + command = f"KillUnit(\"{message}\")" + await self.tuner.send_game_command(command) + + async def get_last_received_index(self) -> int: + command = "ClientGetLastReceivedIndex()" + result = await self.tuner.send_game_command(command) + return int(result) + + async def send_notification(self, item: CivVIItemData, sender: str = "someone") -> None: + command = f"GameCore.NotificationManager:SendNotification(GameCore.NotificationTypes.USER_DEFINED_2, \"{item.name} Received\", \"You have received {item.name} from \" .. \"{sender}\", 0, {item.civ_vi_id})" + await self.tuner.send_command(command) + + async def decrease_gold_by_percent(self, percent: int, message: str) -> None: + command = f"DecreaseGoldByPercent({percent}, \"{message}\")" + await self.tuner.send_game_command(command) + + async def decrease_faith_by_percent(self, percent: int, message: str) -> None: + command = f"DecreaseFaithByPercent({percent}, \"{message}\")" + await self.tuner.send_game_command(command) + + async def decrease_era_score_by_amount(self, amount: int, message: str) -> None: + command = f"DecreaseEraScoreByAmount({amount}, \"{message}\")" + await self.tuner.send_game_command(command) + + async def set_max_allowed_era(self, count: int) -> None: + command = f"SetMaxAllowedEra(\"{count}\")" + await self.tuner.send_game_command(command) + + async def get_max_allowed_era(self) -> int: + command = "ClientGetMaxAllowedEra()" + result = await self.tuner.send_game_command(command) + if result == "": + return -1 + return int(result) diff --git a/worlds/civ_6/Container.py b/worlds/civ_6/Container.py new file mode 100644 index 0000000000..26bb08c03b --- /dev/null +++ b/worlds/civ_6/Container.py @@ -0,0 +1,219 @@ +from dataclasses import dataclass +import os +from typing import TYPE_CHECKING, Dict, List, Optional, cast +import zipfile +from BaseClasses import Location +from worlds.Files import APContainer + +from .Enum import CivVICheckType +from .Locations import CivVILocation, CivVILocationData + +if TYPE_CHECKING: + from . import CivVIWorld + + +# Python fstrings don't allow backslashes, so we use this workaround +nl = "\n" +tab = "\t" +apo = "\'" + + +@dataclass +class CivTreeItem: + name: str + cost: int + ui_tree_row: int + + +class CivVIContainer(APContainer): + """ + Responsible for generating the dynamic mod files for the Civ VI multiworld + """ + game: Optional[str] = "Civilization VI" + + def __init__(self, patch_data: Dict[str, str], base_path: str, output_directory: str, + player: Optional[int] = None, player_name: str = "", server: str = ""): + self.patch_data = patch_data + self.file_path = base_path + container_path = os.path.join(output_directory, base_path + ".apcivvi") + super().__init__(container_path, player, player_name, server) + + def write_contents(self, opened_zipfile: zipfile.ZipFile) -> None: + for filename, yml in self.patch_data.items(): + opened_zipfile.writestr(filename, yml) + super().write_contents(opened_zipfile) + + +def get_cost(world: 'CivVIWorld', location: CivVILocationData) -> int: + """ + Returns the cost of the item based on the game options + """ + # Research cost is between 50 and 150 where 100 equals the default cost + multiplier = world.options.research_cost_multiplier / 100 + return int(world.location_table[location.name].cost * multiplier) + + +def get_formatted_player_name(world: 'CivVIWorld', player: int) -> str: + """ + Returns the name of the player in the world + """ + if player != world.player: + return f"{world.multiworld.player_name[player]}{apo}s" + return "Your" + + +def get_advisor_type(world: 'CivVIWorld', location: Location) -> str: + if world.options.advisor_show_progression_items and location.item and location.item.advancement: + return "ADVISOR_PROGRESSIVE" + return "ADVISOR_GENERIC" + + +def generate_new_items(world: 'CivVIWorld') -> str: + """ + Generates the XML for the new techs/civics as well as the blockers used to prevent players from researching their own items + """ + locations: List[CivVILocation] = cast(List[CivVILocation], world.multiworld.get_filled_locations(world.player)) + techs = [location for location in locations if location.location_type == + CivVICheckType.TECH] + civics = [location for location in locations if location.location_type == + CivVICheckType.CIVIC] + + boost_techs = [] + boost_civics = [] + + if world.options.boostsanity: + boost_techs = [location for location in locations if location.location_type == CivVICheckType.BOOST and location.name.split("_")[1] == "TECH"] + boost_civics = [location for location in locations if location.location_type == CivVICheckType.BOOST and location.name.split("_")[1] == "CIVIC"] + techs += boost_techs + civics += boost_civics + + return f""" + + + + + {"".join([f'{tab}{nl}' for + tech in techs])} + {"".join([f'{tab}{nl}' for + civic in civics])} + + + +{"".join([f'{tab}{nl}' + for location in techs if location.item])} + + + {"".join([f'{tab}{nl}' for location in boost_techs])} + + + +{"".join([f'{tab}{nl}' + for location in civics if location.item])} + + + {"".join([f'{tab}{nl}' for location in boost_civics])} + + + + {"".join([f'{tab}{nl}' for location in civics if world.options.hide_item_names])} + + + + {"".join([f'{tab}{nl}' for location in techs if world.options.hide_item_names])} + + + + """ + + +def generate_setup_file(world: 'CivVIWorld') -> str: + """ + Generates the Lua for the setup file. This sets initial variables and state that affect gameplay around Progressive Eras + """ + setup = "-- Setup" + if world.options.progression_style == "eras_and_districts": + setup += f""" + -- Init Progressive Era Value if it hasn't been set already + if Game.GetProperty("MaxAllowedEra") == nil then + print("Setting MaxAllowedEra to 0") + Game.SetProperty("MaxAllowedEra", 0) + end + """ + + if world.options.boostsanity: + setup += f""" + -- Init Boosts + if Game.GetProperty("BoostsAsChecks") == nil then + print("Setting Boosts As Checks to True") + Game.SetProperty("BoostsAsChecks", true) + end + """ + return setup + + +def generate_goody_hut_sql(world: 'CivVIWorld') -> str: + """ + Generates the SQL for the goody huts or an empty string if they are disabled since the mod expects the file to be there + """ + + if world.options.shuffle_goody_hut_rewards: + return f""" + UPDATE GoodyHutSubTypes SET Description = NULL WHERE GoodyHut NOT IN ('METEOR_GOODIES', 'GOODYHUT_SAILOR_WONDROUS', 'DUMMY_GOODY_BUILDIER') AND Weight > 0; + +INSERT INTO Modifiers + (ModifierId, ModifierType, RunOnce, Permanent, SubjectRequirementSetId) +SELECT ModifierID||'_AI', ModifierType, RunOnce, Permanent, 'PLAYER_IS_AI' +FROM Modifiers +WHERE EXISTS ( + SELECT ModifierId + FROM GoodyHutSubTypes + WHERE Modifiers.ModifierId = GoodyHutSubTypes.ModifierId AND GoodyHutSubTypes.GoodyHut NOT IN ('METEOR_GOODIES', 'GOODYHUT_SAILOR_WONDROUS', 'DUMMY_GOODY_BUILDIER') AND GoodyHutSubTypes.Weight > 0); + +INSERT INTO ModifierArguments + (ModifierId, Name, Type, Value) +SELECT ModifierID||'_AI', Name, Type, Value +FROM ModifierArguments +WHERE EXISTS ( + SELECT ModifierId + FROM GoodyHutSubTypes + WHERE ModifierArguments.ModifierId = GoodyHutSubTypes.ModifierId AND GoodyHutSubTypes.GoodyHut NOT IN ('METEOR_GOODIES', 'GOODYHUT_SAILOR_WONDROUS', 'DUMMY_GOODY_BUILDIER') AND GoodyHutSubTypes.Weight > 0); + +UPDATE GoodyHutSubTypes +SET ModifierID = ModifierID||'_AI' +WHERE GoodyHut NOT IN ('METEOR_GOODIES', 'GOODYHUT_SAILOR_WONDROUS', 'DUMMY_GOODY_BUILDIER') AND Weight > 0; + + """ + return "-- Goody Huts are disabled, no changes needed" + + +def generate_update_boosts_sql(world: 'CivVIWorld') -> str: + """ + Generates the SQL for existing boosts in boostsanity or an empty string if they are disabled since the mod expects the file to be there + """ + + if world.options.boostsanity: + return f""" +UPDATE Boosts +SET TechnologyType = 'BOOST_' || TechnologyType +WHERE TechnologyType IS NOT NULL; +UPDATE Boosts +SET CivicType = 'BOOST_' || CivicType +WHERE CivicType IS NOT NULL AND CivicType NOT IN ('CIVIC_CORPORATE_LIBERTARIANISM', 'CIVIC_DIGITAL_DEMOCRACY', 'CIVIC_SYNTHETIC_TECHNOCRACY', 'CIVIC_NEAR_FUTURE_GOVERNANCE'); + """ + return "-- Boostsanity is disabled, no changes needed" diff --git a/worlds/civ_6/Data.py b/worlds/civ_6/Data.py new file mode 100644 index 0000000000..7c80268834 --- /dev/null +++ b/worlds/civ_6/Data.py @@ -0,0 +1,70 @@ +from typing import Dict, List + +from .ItemData import ( + CivVIBoostData, + CivicPrereqData, + ExistingItemData, + GoodyHutRewardData, + NewItemData, + TechPrereqData, +) + + +def get_boosts_data() -> List[CivVIBoostData]: + from .data.boosts import boosts + + return boosts + + +def get_era_required_items_data() -> Dict[str, List[str]]: + from .data.era_required_items import era_required_items + + return era_required_items + + +def get_existing_civics_data() -> List[ExistingItemData]: + from .data.existing_civics import existing_civics + + return existing_civics + + +def get_existing_techs_data() -> List[ExistingItemData]: + from .data.existing_tech import existing_tech + + return existing_tech + + +def get_goody_hut_rewards_data() -> List[GoodyHutRewardData]: + from .data.goody_hut_rewards import reward_data + + return reward_data + + +def get_new_civic_prereqs_data() -> List[CivicPrereqData]: + from .data.new_civic_prereqs import new_civic_prereqs + + return new_civic_prereqs + + +def get_new_civics_data() -> List[NewItemData]: + from .data.new_civics import new_civics + + return new_civics + + +def get_new_tech_prereqs_data() -> List[TechPrereqData]: + from .data.new_tech_prereqs import new_tech_prereqs + + return new_tech_prereqs + + +def get_new_techs_data() -> List[NewItemData]: + from .data.new_tech import new_tech + + return new_tech + + +def get_progressive_districts_data() -> Dict[str, List[str]]: + from .data.progressive_districts import progressive_districts + + return progressive_districts diff --git a/worlds/civ_6/DeathLink.py b/worlds/civ_6/DeathLink.py new file mode 100644 index 0000000000..2af98fea07 --- /dev/null +++ b/worlds/civ_6/DeathLink.py @@ -0,0 +1,74 @@ +import random + +from typing import TYPE_CHECKING, List +if TYPE_CHECKING: + from .Civ6Client import CivVIContext + +# any is also an option but should not be considered an effect +DEATH_LINK_EFFECTS = ["Gold", "Faith", "Era Score", "Unit Killed"] + + +async def handle_receive_deathlink(ctx: 'CivVIContext', message: str): + """Resolves the effects of a deathlink received from the multiworld based on the options selected by the player""" + chosen_effects: List[str] = ctx.slot_data["death_link_effect"] + effect = random.choice(chosen_effects) + + percent = ctx.slot_data["death_link_effect_percent"] + if effect == "Gold": + ctx.logger.info(f"Decreasing gold by {percent}%") + await ctx.game_interface.decrease_gold_by_percent(percent, message) + elif effect == "Faith": + ctx.logger.info(f"Decreasing faith by {percent}%") + await ctx.game_interface.decrease_faith_by_percent(percent, message) + elif effect == "Era Score": + ctx.logger.info("Decreasing era score by 1") + await ctx.game_interface.decrease_era_score_by_amount(1, message) + elif effect == "Unit Killed": + ctx.logger.info("Destroying a random unit") + await ctx.game_interface.kill_unit(message) + + +async def handle_check_deathlink(ctx: 'CivVIContext'): + """Checks if the local player should send out a deathlink to the multiworld as well as if we should respond to any pending deathlinks sent to us """ + # check if we received a death link + if ctx.received_death_link: + ctx.received_death_link = False + await handle_receive_deathlink(ctx, ctx.death_link_message) + + # Check if we should send out a death link + result = await ctx.game_interface.get_deathlink() + if ctx.death_link_just_changed: + ctx.death_link_just_changed = False + return + if result != "false": + messages = [f"lost a unit to a {result}", + f"offered a sacrifice to the great {result}", + f"was killed by a {result}", + f"made a donation to the {result} fund", + f"made a tactical error", + f"picked a fight with a {result} and lost", + f"tried to befriend an enemy {result}", + f"used a {result} to reduce their military spend", + f"was defeated by a {result} in combat", + f"bravely struck a {result} and paid the price", + f"had a lapse in judgement against a {result}", + f"learned at the hands of a {result}", + f"attempted to non peacefully negotiate with a {result}", + f"was outsmarted by a {result}", + f"received a lesson from a {result}", + f"now understands the importance of not fighting a {result}", + f"let a {result} get the better of them", + f"allowed a {result} to show them the error of their ways", + f"heard the tragedy of Darth Plagueis the Wise from a {result}", + f"refused to join a {result} in their quest for power", + f"was tired of sitting in BK and decided to fight a {result} instead", + f"purposely lost to a {result} as a cry for help", + f"is wanting to remind everyone that they are here to have fun and not to win", + f"is reconsidering their pursuit of a domination victory", + f"had their plans toppled by a {result}", + ] + + if ctx.slot is not None: + player = ctx.player_names[ctx.slot] + message = random.choice(messages) + await ctx.send_death(f"{player} {message}") diff --git a/worlds/civ_6/Enum.py b/worlds/civ_6/Enum.py new file mode 100644 index 0000000000..d7c735d433 --- /dev/null +++ b/worlds/civ_6/Enum.py @@ -0,0 +1,39 @@ +from enum import Enum + +from BaseClasses import ItemClassification + + +class EraType(Enum): + ERA_ANCIENT = "ERA_ANCIENT" + ERA_CLASSICAL = "ERA_CLASSICAL" + ERA_MEDIEVAL = "ERA_MEDIEVAL" + ERA_RENAISSANCE = "ERA_RENAISSANCE" + ERA_INDUSTRIAL = "ERA_INDUSTRIAL" + ERA_MODERN = "ERA_MODERN" + ERA_ATOMIC = "ERA_ATOMIC" + ERA_INFORMATION = "ERA_INFORMATION" + ERA_FUTURE = "ERA_FUTURE" + + +class CivVICheckType(Enum): + TECH = "TECH" + CIVIC = "CIVIC" + PROGRESSIVE_DISTRICT = "PROGRESSIVE_DISTRICT" + ERA = "ERA" + GOODY = "GOODY" + BOOST = "BOOST" + EVENT = "EVENT" + +class CivVIHintClassification(Enum): + PROGRESSION = "Progression" + USEFUL = "Useful" + FILLER = "Filler" + + def to_item_classification(self) -> ItemClassification: + if self == CivVIHintClassification.PROGRESSION: + return ItemClassification.progression + if self == CivVIHintClassification.USEFUL: + return ItemClassification.useful + if self == CivVIHintClassification.FILLER: + return ItemClassification.filler + assert False diff --git a/worlds/civ_6/ItemData.py b/worlds/civ_6/ItemData.py new file mode 100644 index 0000000000..5f3c16a9b1 --- /dev/null +++ b/worlds/civ_6/ItemData.py @@ -0,0 +1,38 @@ +from dataclasses import dataclass +from typing import List, TypedDict + + +class NewItemData(TypedDict): + Type: str + Cost: int + UITreeRow: int + EraType: str + + +class ExistingItemData(NewItemData): + Name: str + + +@dataclass +class CivVIBoostData: + Type: str + EraType: str + Prereq: List[str] + PrereqRequiredCount: int + Classification: str + + +class GoodyHutRewardData(TypedDict): + Type: str + Name: str + Rarity: str + + +class CivicPrereqData(TypedDict): + Civic: str + PrereqTech: str + + +class TechPrereqData(TypedDict): + Technology: str + PrereqTech: str diff --git a/worlds/civ_6/Items.py b/worlds/civ_6/Items.py new file mode 100644 index 0000000000..64a6cbb03a --- /dev/null +++ b/worlds/civ_6/Items.py @@ -0,0 +1,353 @@ +from enum import Enum +from typing import Dict, Optional, TYPE_CHECKING, List +from BaseClasses import Item, ItemClassification +from .Data import ( + GoodyHutRewardData, + get_era_required_items_data, + get_existing_civics_data, + get_existing_techs_data, + get_goody_hut_rewards_data, + get_progressive_districts_data, +) +from .Enum import CivVICheckType, EraType +from .ProgressiveDistricts import get_flat_progressive_districts + +if TYPE_CHECKING: + from . import CivVIWorld + + +CIV_VI_AP_ITEM_ID_BASE = 5041000 + +NON_PROGRESSION_DISTRICTS = ["PROGRESSIVE_PRESERVE", "PROGRESSIVE_NEIGHBORHOOD"] + + +# Items required as progression for boostsanity mode +BOOSTSANITY_PROGRESSION_ITEMS = [ + "TECH_THE_WHEEL", + "TECH_MASONRY", + "TECH_ARCHERY", + "TECH_ENGINEERING", + "TECH_CONSTRUCTION", + "TECH_GUNPOWDER", + "TECH_MACHINERY", + "TECH_SIEGE_TACTICS", + "TECH_STIRRUPS", + "TECH_ASTRONOMY", + "TECH_BALLISTICS", + "TECH_STEAM_POWER", + "TECH_SANITATION", + "TECH_COMPUTERS", + "TECH_COMBUSTION", + "TECH_TELECOMMUNICATIONS", + "TECH_ROBOTICS", + "CIVIC_FEUDALISM", + "CIVIC_GUILDS", + "CIVIC_THE_ENLIGHTENMENT", + "CIVIC_MERCANTILISM", + "CIVIC_CONSERVATION", + "CIVIC_CIVIL_SERVICE", + "CIVIC_GLOBALIZATION", + "CIVIC_COLD_WAR", + "CIVIC_URBANIZATION", + "CIVIC_NATIONALISM", + "CIVIC_MOBILIZATION", + "PROGRESSIVE_NEIGHBORHOOD", + "PROGRESSIVE_PRESERVE", +] + + +class FillerItemRarity(Enum): + COMMON = "COMMON" + UNCOMMON = "UNCOMMON" + RARE = "RARE" + + +FILLER_DISTRIBUTION: Dict[FillerItemRarity, float] = { + FillerItemRarity.RARE: 0.025, + FillerItemRarity.UNCOMMON: 0.2, + FillerItemRarity.COMMON: 0.775, +} + + +class FillerItemData: + name: str + type: str + rarity: FillerItemRarity + civ_name: str + + def __init__(self, data: GoodyHutRewardData): + self.name = data["Name"] + self.rarity = FillerItemRarity(data["Rarity"]) + self.civ_name = data["Type"] + + +filler_data: Dict[str, FillerItemData] = { + item["Name"]: FillerItemData(item) for item in get_goody_hut_rewards_data() +} + + +class CivVIItemData: + civ_vi_id: int + classification: ItemClassification + name: str + code: int + cost: int + item_type: CivVICheckType + progressive_name: Optional[str] + civ_name: Optional[str] + era: Optional[EraType] + + def __init__( + self, + name: str, + civ_vi_id: int, + cost: int, + item_type: CivVICheckType, + id_offset: int, + classification: ItemClassification, + progressive_name: Optional[str], + civ_name: Optional[str] = None, + era: Optional[EraType] = None, + ): + self.classification = classification + self.civ_vi_id = civ_vi_id + self.name = name + self.code = civ_vi_id + CIV_VI_AP_ITEM_ID_BASE + id_offset + self.cost = cost + self.item_type = item_type + self.progressive_name = progressive_name + self.civ_name = civ_name + self.era = era + + +class CivVIEvent(Item): + game: str = "Civilization VI" + + +class CivVIItem(Item): + game: str = "Civilization VI" + civ_vi_id: int + item_type: CivVICheckType + + def __init__( + self, + item: CivVIItemData, + player: int, + classification: Optional[ItemClassification] = None, + ): + super().__init__( + item.name, classification or item.classification, item.code, player + ) + self.civ_vi_id = item.civ_vi_id + self.item_type = item.item_type + + +def format_item_name(name: str) -> str: + name_parts = name.split("_") + return " ".join([part.capitalize() for part in name_parts]) + + +_items_by_civ_name: Dict[str, CivVIItemData] = {} + + +def get_item_by_civ_name( + item_name: str, item_table: Dict[str, "CivVIItemData"] +) -> "CivVIItemData": + """Gets the names of the items in the item_table""" + if not _items_by_civ_name: + for item in item_table.values(): + if item.civ_name: + _items_by_civ_name[item.civ_name] = item + + try: + return _items_by_civ_name[item_name] + except KeyError as e: + raise KeyError(f"Item {item_name} not found in item_table") from e + + +def _generate_tech_items( + id_base: int, required_items: List[str], progressive_items: Dict[str, str] +) -> Dict[str, CivVIItemData]: + # Generate Techs + existing_techs = get_existing_techs_data() + tech_table: Dict[str, CivVIItemData] = {} + + tech_id = 0 + for tech in existing_techs: + classification = ItemClassification.useful + name = tech["Name"] + civ_name = tech["Type"] + if civ_name in required_items: + classification = ItemClassification.progression + progressive_name = None + check_type = CivVICheckType.TECH + if civ_name in progressive_items.keys(): + progressive_name = format_item_name(progressive_items[civ_name]) + + tech_table[name] = CivVIItemData( + name=name, + civ_vi_id=tech_id, + cost=tech["Cost"], + item_type=check_type, + id_offset=id_base, + classification=classification, + progressive_name=progressive_name, + civ_name=civ_name, + era=EraType(tech["EraType"]), + ) + + tech_id += 1 + + return tech_table + + +def _generate_civics_items( + id_base: int, required_items: List[str], progressive_items: Dict[str, str] +) -> Dict[str, CivVIItemData]: + civic_id = 0 + civic_table: Dict[str, CivVIItemData] = {} + existing_civics = get_existing_civics_data() + + for civic in existing_civics: + name = civic["Name"] + civ_name = civic["Type"] + progressive_name = None + check_type = CivVICheckType.CIVIC + + if civ_name in progressive_items.keys(): + progressive_name = format_item_name(progressive_items[civ_name]) + + classification = ItemClassification.useful + if civ_name in required_items: + classification = ItemClassification.progression + + civic_table[name] = CivVIItemData( + name=name, + civ_vi_id=civic_id, + cost=civic["Cost"], + item_type=check_type, + id_offset=id_base, + classification=classification, + progressive_name=progressive_name, + civ_name=civ_name, + era=EraType(civic["EraType"]), + ) + + civic_id += 1 + + return civic_table + + +def _generate_progressive_district_items(id_base: int) -> Dict[str, CivVIItemData]: + progressive_table: Dict[str, CivVIItemData] = {} + progressive_id_base = 0 + progressive_items = get_progressive_districts_data() + for item_name in progressive_items.keys(): + classification = ( + ItemClassification.useful + if item_name in NON_PROGRESSION_DISTRICTS + else ItemClassification.progression + ) + name = format_item_name(item_name) + progressive_table[name] = CivVIItemData( + name=name, + civ_vi_id=progressive_id_base, + cost=0, + item_type=CivVICheckType.PROGRESSIVE_DISTRICT, + id_offset=id_base, + classification=classification, + progressive_name=None, + civ_name=item_name, + ) + progressive_id_base += 1 + return progressive_table + + +def _generate_progressive_era_items(id_base: int) -> Dict[str, CivVIItemData]: + """Generates the single progressive district item""" + era_table: Dict[str, CivVIItemData] = {} + # Generate progressive eras + progressive_era_name = format_item_name("PROGRESSIVE_ERA") + era_table[progressive_era_name] = CivVIItemData( + name=progressive_era_name, + civ_vi_id=0, + cost=0, + item_type=CivVICheckType.ERA, + id_offset=id_base, + classification=ItemClassification.progression, + progressive_name=None, + civ_name="PROGRESSIVE_ERA", + ) + return era_table + + +def _generate_goody_hut_items(id_base: int) -> Dict[str, CivVIItemData]: + # Generate goody hut items + goody_huts = { + item["Name"]: FillerItemData(item) for item in get_goody_hut_rewards_data() + } + goody_table: Dict[str, CivVIItemData] = {} + goody_base = 0 + for value in goody_huts.values(): + goody_table[value.name] = CivVIItemData( + name=value.name, + civ_vi_id=goody_base, + cost=0, + item_type=CivVICheckType.GOODY, + id_offset=id_base, + classification=ItemClassification.filler, + progressive_name=None, + civ_name=value.civ_name, + ) + goody_base += 1 + return goody_table + + +def generate_item_table() -> Dict[str, CivVIItemData]: + era_required_items = get_era_required_items_data() + required_items: List[str] = [] + for value in era_required_items.values(): + required_items += value + + progressive_items = get_flat_progressive_districts() + + item_table: Dict[str, CivVIItemData] = {} + + def get_id_base(): + return len(item_table.keys()) + + item_table.update( + **_generate_tech_items(get_id_base(), required_items, progressive_items) + ) + item_table.update( + **_generate_civics_items(get_id_base(), required_items, progressive_items) + ) + item_table.update(**_generate_progressive_district_items(get_id_base())) + item_table.update(**_generate_progressive_era_items(get_id_base())) + item_table.update(**_generate_goody_hut_items(get_id_base())) + + return item_table + + +def get_items_by_type( + item_type: CivVICheckType, item_table: Dict[str, CivVIItemData] +) -> List[CivVIItemData]: + """ + Returns a list of items that match the given item type + """ + return [item for item in item_table.values() if item.item_type == item_type] + + +fillers_by_rarity: Dict[FillerItemRarity, List[FillerItemData]] = { + rarity: [item for item in filler_data.values() if item.rarity == rarity] + for rarity in FillerItemRarity +} + + +def get_random_filler_by_rarity( + world: "CivVIWorld", rarity: FillerItemRarity +) -> FillerItemData: + """ + Returns a random filler item by rarity + """ + return world.random.choice(fillers_by_rarity[rarity]) diff --git a/worlds/civ_6/LICENSE.md b/worlds/civ_6/LICENSE.md new file mode 100644 index 0000000000..7671a45b30 --- /dev/null +++ b/worlds/civ_6/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright © 2024 tanjo3 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/worlds/civ_6/Locations.py b/worlds/civ_6/Locations.py new file mode 100644 index 0000000000..71f29f1cfc --- /dev/null +++ b/worlds/civ_6/Locations.py @@ -0,0 +1,156 @@ +from collections import defaultdict +from dataclasses import dataclass +from typing import Optional, Dict +from BaseClasses import Location, Region + +from .Data import get_boosts_data, get_new_civics_data, get_new_techs_data + +from .Enum import CivVICheckType, EraType + +CIV_VI_AP_LOCATION_ID_BASE = 5041000 + +# Locs that should not have progression items +GOODY_HUT_LOCATION_NAMES = [ + "GOODY_HUT_1", + "GOODY_HUT_2", + "GOODY_HUT_3", + "GOODY_HUT_4", + "GOODY_HUT_5", + "GOODY_HUT_6", + "GOODY_HUT_7", + "GOODY_HUT_8", + "GOODY_HUT_9", + "GOODY_HUT_10", +] + + +@dataclass +class CivVILocationData: + name: str + cost: int + uiTreeRow: int + civ_id: int + era_type: str + location_type: CivVICheckType + + game: str = "Civilization VI" + + @property + def code(self): + return self.civ_id + CIV_VI_AP_LOCATION_ID_BASE + + +class CivVILocation(Location): + game: str = "Civilization VI" + location_type: CivVICheckType + + def __init__( + self, + player: int, + name: str = "", + address: Optional[int] = None, + parent: Optional[Region] = None, + ): + super().__init__(player, name, address, parent) + category = name.split("_")[0] + if "victory" in category: + self.location_type = CivVICheckType.EVENT + else: + self.location_type = CivVICheckType(category) + + +def generate_flat_location_table() -> Dict[str, CivVILocationData]: + """ + Generates a flat location table in the following format: + { + "TECH_AP_ANCIENT_00": CivVILocationData, + "TECH_AP_ANCIENT_01": CivVILocationData, + "CIVIC_AP_ANCIENT_00": CivVILocationData, + ... + } + """ + era_locations = generate_era_location_table() + flat_locations: Dict[str, CivVILocationData] = {} + for locations in era_locations.values(): + for location_id, location_data in locations.items(): + flat_locations[location_id] = location_data + return flat_locations + + +def generate_era_location_table() -> Dict[str, Dict[str, CivVILocationData]]: + """ + Uses the data from existing_tech.json to generate a location table in the following format: + { + "ERA_ANCIENT": { + "TECH_AP_ANCIENT_00": CivVILocationData, + "TECH_AP_ANCIENT_01": CivVILocationData, + "CIVIC_AP_ANCIENT_00": CivVILocationData, + }, + ... + } + """ + + new_techs = get_new_techs_data() + era_locations: Dict[str, Dict[str, CivVILocationData]] = defaultdict(dict) + id_base = 0 + # Techs + for data in new_techs: + era_type = data["EraType"] + era_locations[era_type][data["Type"]] = CivVILocationData( + data["Type"], + data["Cost"], + data["UITreeRow"], + id_base, + era_type, + CivVICheckType.TECH, + ) + id_base += 1 + # Civics + new_civics = get_new_civics_data() + + for data in new_civics: + era_type = data["EraType"] + era_locations[era_type][data["Type"]] = CivVILocationData( + data["Type"], + data["Cost"], + data["UITreeRow"], + id_base, + era_type, + CivVICheckType.CIVIC, + ) + id_base += 1 + + # Eras + for era in EraType: + + if era == EraType.ERA_ANCIENT: + continue + + era_locations[era.name][era.name] = CivVILocationData( + era.name, 0, 0, id_base, era.name, CivVICheckType.ERA + ) + id_base += 1 + + # Goody Huts, defaults to 10 goody huts as location checks (rarely will a player get more than this) + for i in range(10): + era_locations[EraType.ERA_ANCIENT.value]["GOODY_HUT_" + str(i + 1)] = ( + CivVILocationData( + "GOODY_HUT_" + str(i + 1), + 0, + 0, + id_base, + EraType.ERA_ANCIENT.value, + CivVICheckType.GOODY, + ) + ) + id_base += 1 + # Boosts + boosts = get_boosts_data() + for boost in boosts: + location = CivVILocationData( + boost.Type, 0, 0, id_base, boost.EraType, CivVICheckType.BOOST + ) + era_locations["ERA_ANCIENT"][boost.Type] = location + id_base += 1 + + return era_locations diff --git a/worlds/civ_6/Options.py b/worlds/civ_6/Options.py new file mode 100644 index 0000000000..72297b1ca1 --- /dev/null +++ b/worlds/civ_6/Options.py @@ -0,0 +1,130 @@ +from dataclasses import dataclass +from Options import ( + Choice, + DefaultOnToggle, + OptionSet, + PerGameCommonOptions, + Range, + StartInventoryPool, + Toggle, +) +from .Enum import CivVIHintClassification + + +class ProgressionStyle(Choice): + """ + **Districts Only**: Each tech/civic that would normally unlock a district or building now has a logical progression. + Example: TECH_BRONZE_WORKING is now PROGRESSIVE_ENCAMPMENT + + **Eras and Districts**: Players will be defeated if they play until the world era advances beyond the currently unlocked maximum era. + Unlocked eras can be seen in both the tech and civic trees. Includes all progressive districts. + + **None**: No progressive items will be included. This means you can get district upgrades that won't be usable until the relevant district is unlocked. + """ + + rich_text_doc = True + display_name = "Progression Style" + option_districts_only = 0 + option_eras_and_districts = 1 + option_none = 2 + default = option_districts_only + + +class ShuffleGoodyHuts(DefaultOnToggle): + """Shuffles the goody hut rewards. + Goody huts will only contain junk items and locations are checked sequentially (First goody hut gives GOODY_HUT_1, second gives GOODY_HUT_2, etc.). + """ + + display_name = "Shuffle Goody Hut Rewards" + + +class BoostSanity(Toggle): + """Boosts for Civics/Techs are location checks. Boosts can now be triggered even if the item has already been + researched. + + **Note**: If a boost is dependent upon a unit that is now obsolete, you can click to toggle on/off the relevant tech in + the tech tree.""" + + rich_text_doc = True + display_name = "Boostsanity" + + +class ResearchCostMultiplier(Range): + """Multiplier for research cost of techs and civics, higher values make research more expensive.""" + + display_name = "Tech/Civic Cost Multiplier" + range_start = 50 + range_end = 150 + default = 100 + + +class PreHintItems(OptionSet): + """Controls what items from the tech/civics trees are pre-hinted for the multiworld. + **Progression**: Include Progression items in hints + **Useful**: Include Useful items in hints + **Filler**: Include Filler items in hints + """ + + display_name = "Tech/Civic Tree pre-hinted Items" + valid_keys = {classification.value for classification in CivVIHintClassification} # type: ignore + + +class HideItemNames(Toggle): + """Each Tech and Civic Location will have a title of 'Unrevealed' until its prereqs have been researched. Note that + hints will still be precollected if that option is enabled.""" + + display_name = "Hide Item Names" + + +class InGameFlagProgressionItems(DefaultOnToggle): + """If enabled, an advisor icon will be added to any location that contains a progression item.""" + + display_name = "Advisor Indicates Progression Items" + + +class CivDeathLink(Toggle): + """If enabled, losing a unit will trigger a death link effect on other players in the multiworld. When a death link is received, the player will receive the effect specified in 'Death Link Effect'.""" + + display_name = "Death Link" + + +class DeathLinkEffect(OptionSet): + """What happens when a unit dies. + + **Unit Killed**: A random unit will be killed when a death link is received. + + **Faith**: Faith will be decreased by the amount specified in 'Death Link Effect Percent'. + + **Gold**: Gold will be decreased by the amount specified in 'Death Link Effect Percent'. + + **Era Score**: Era score is decreased by 1. + """ + + rich_text_doc = True + display_name = "Death Link Effect" + valid_keys = ["Unit Killed", "Faith", "Gold", "Era Score"] # type: ignore + default = frozenset({"Unit Killed"}) + + +class DeathLinkEffectPercent(Range): + """The percentage of the effect that will be applied. Only applicable for Gold and Faith effects.""" + + display_name = "Death Link Effect Percent" + default = 20 + range_start = 1 + range_end = 100 + + +@dataclass +class CivVIOptions(PerGameCommonOptions): + start_inventory_from_pool: StartInventoryPool + progression_style: ProgressionStyle + shuffle_goody_hut_rewards: ShuffleGoodyHuts + boostsanity: BoostSanity + research_cost_multiplier: ResearchCostMultiplier + pre_hint_items: PreHintItems + hide_item_names: HideItemNames + advisor_show_progression_items: InGameFlagProgressionItems + death_link: CivDeathLink + death_link_effect: DeathLinkEffect + death_link_effect_percent: DeathLinkEffectPercent diff --git a/worlds/civ_6/ProgressiveDistricts.py b/worlds/civ_6/ProgressiveDistricts.py new file mode 100644 index 0000000000..b71d2f3395 --- /dev/null +++ b/worlds/civ_6/ProgressiveDistricts.py @@ -0,0 +1,35 @@ +from typing import Dict, List, Optional + +from .Data import get_progressive_districts_data + +_flat_progressive_districts: Optional[Dict[str, str]] = {} + + +def get_flat_progressive_districts() -> Dict[str, str]: + """Returns a dictionary of all items that are associated with a progressive item. + Key is the item name ("TECH_WRITING") and the value is the associated progressive + item ("PROGRESSIVE_CAMPUS")""" + if _flat_progressive_districts: + return _flat_progressive_districts + + progressive_districts = get_progressive_districts_data() + flat_progressive_districts: Dict[str, str] = {} + for key, value in progressive_districts.items(): + for item in value: + flat_progressive_districts[item] = key + return flat_progressive_districts + + +def convert_items_to_progressive_items(items: List[str]): + """converts a list of items to instead be their associated progressive item if + they have one. ["TECH_MINING", "TECH_WRITING"] -> ["TECH_MINING", "PROGRESSIVE_CAMPUS] + """ + flat_progressive_districts = get_flat_progressive_districts() + return [flat_progressive_districts.get(item, item) for item in items] + + +def convert_item_to_progressive_item(item: str): + """converts an items to instead be its associated progressive item if + it has one. "TECH_WRITING" -> "PROGRESSIVE_CAMPUS""" + flat_progressive_districts = get_flat_progressive_districts() + return flat_progressive_districts.get(item, item) diff --git a/worlds/civ_6/Regions.py b/worlds/civ_6/Regions.py new file mode 100644 index 0000000000..9c5cca15b8 --- /dev/null +++ b/worlds/civ_6/Regions.py @@ -0,0 +1,128 @@ +from typing import TYPE_CHECKING, Dict, List, Optional, Set, Union +from BaseClasses import CollectionState, LocationProgressType, Region +from worlds.generic.Rules import add_rule, set_rule +from .Data import ( + get_boosts_data, +) +from .Enum import EraType +from .Locations import GOODY_HUT_LOCATION_NAMES, CivVILocation + +if TYPE_CHECKING: + from . import CivVIWorld + + +def has_progressive_eras( + state: CollectionState, era: EraType, world: "CivVIWorld" +) -> bool: + return state.has( + "Progressive Era", world.player, world.era_required_progressive_era_counts[era] + ) + + +def has_non_progressive_items( + state: CollectionState, era: EraType, world: "CivVIWorld" +) -> bool: + return state.has_all(world.era_required_non_progressive_items[era], world.player) + + +def has_progressive_items( + state: CollectionState, era: EraType, world: "CivVIWorld" +) -> bool: + return state.has_all_counts( + world.era_required_progressive_items_counts[era], world.player + ) + + +def create_regions(world: "CivVIWorld"): + menu = Region("Menu", world.player, world.multiworld) + world.multiworld.regions.append(menu) + + optional_location_inclusions: Dict[str, Union[bool, int]] = { + "ERA": world.options.progression_style + == world.options.progression_style.option_eras_and_districts, + "GOODY": world.options.shuffle_goody_hut_rewards.value, + "BOOST": world.options.boostsanity.value, + } + + regions: List[Region] = [] + previous_era: EraType = EraType.ERA_ANCIENT + for era in EraType: + era_region = Region(era.value, world.player, world.multiworld) + era_locations: Dict[str, Optional[int]] = {} + + for key, location in world.location_by_era[era.value].items(): + category = key.split("_")[0] + if optional_location_inclusions.get(category, True): + era_locations[location.name] = location.code + + era_region.add_locations(era_locations, CivVILocation) + + regions.append(era_region) + world.multiworld.regions.append(era_region) + + # Connect era to previous era if not ancient era + if era == EraType.ERA_ANCIENT: + menu.connect(world.get_region(EraType.ERA_ANCIENT.value)) + continue + + connection = world.get_region(previous_era.value).connect( + world.get_region(era.value) + ) + + # Access rules for eras + add_rule( + connection, + lambda state, previous_era=previous_era, world=world: has_non_progressive_items( + state, previous_era, world + ), + ) + if world.options.progression_style == "eras_and_districts": + add_rule( + connection, + lambda state, previous_era=previous_era, world=world: has_progressive_eras( + state, previous_era, world + ), + ) + if world.options.progression_style != "none": + add_rule( + connection, + lambda state, previous_era=previous_era, world=world: has_progressive_items( + state, previous_era, world + ), + ) + previous_era = era + + future_era = world.get_region(EraType.ERA_FUTURE.value) + victory = CivVILocation(world.player, "Complete a victory type", None, future_era) + victory.place_locked_item(world.create_event("Victory")) + future_era.locations.append(victory) + + set_rule( + victory, + lambda state: state.can_reach_region(EraType.ERA_FUTURE.value, world.player), + ) + + world.multiworld.completion_condition[world.player] = lambda state: state.has( + "Victory", world.player + ) + exclude_necessary_locations(world) + + +def exclude_necessary_locations(world: "CivVIWorld"): + forced_excluded_location_names: Set[str] = set() + + if world.options.shuffle_goody_hut_rewards: + forced_excluded_location_names.update(GOODY_HUT_LOCATION_NAMES) + + if world.options.boostsanity: + boost_data_list = get_boosts_data() + excluded_boosts = { + boost_data.Type + for boost_data in boost_data_list + if boost_data.Classification == "EXCLUDED" + } + forced_excluded_location_names.update(excluded_boosts) + + for location_name in forced_excluded_location_names: + location = world.get_location(location_name) + location.progress_type = LocationProgressType.EXCLUDED diff --git a/worlds/civ_6/Rules.py b/worlds/civ_6/Rules.py new file mode 100644 index 0000000000..3f4c477a83 --- /dev/null +++ b/worlds/civ_6/Rules.py @@ -0,0 +1,109 @@ +from typing import TYPE_CHECKING, List, Tuple +from BaseClasses import CollectionState +from .ItemData import CivVIBoostData +from .Items import format_item_name +from .Data import get_boosts_data, get_progressive_districts_data +from .Enum import CivVICheckType +from .ProgressiveDistricts import convert_item_to_progressive_item + +from worlds.generic.Rules import forbid_item, set_rule + + +if TYPE_CHECKING: + from . import CivVIWorld + + +def generate_requirements_for_boosts( + world: "CivVIWorld", boost_data: CivVIBoostData +) -> Tuple[List[str], List[Tuple[str, int]]]: + required_non_progressive_items: List[str] = [] + required_progressive_item_counts: List[Tuple[str, int]] = [] + + for item in boost_data.Prereq: + progressive_item_name = convert_item_to_progressive_item(item) + if ( + world.options.progression_style != "none" + and "PROGRESSIVE" in progressive_item_name + ): + required_progressive_item_counts.append( + ( + format_item_name(progressive_item_name), + get_progressive_districts_data()[progressive_item_name].index(item) + + 1, + ) + ) + else: + ap_item_name = world.item_by_civ_name[item] + required_non_progressive_items.append(ap_item_name) + return required_non_progressive_items, required_progressive_item_counts + + +def create_boost_rules(world: "CivVIWorld"): + boost_data_list = get_boosts_data() + boost_locations = [ + location + for location in world.location_table.values() + if location.location_type == CivVICheckType.BOOST + ] + for location in boost_locations: + boost_data = next( + (boost for boost in boost_data_list if boost.Type == location.name), None + ) + world_location = world.get_location(location.name) + forbid_item(world_location, "Progressive Era", world.player) + + if boost_data and boost_data.PrereqRequiredCount > 0: + required_non_progressive_items, required_progressive_item_counts = ( + generate_requirements_for_boosts(world, boost_data) + ) + if world.options.progression_style != "none": + set_rule( + world_location, + lambda state, non_progressive_prereqs=required_non_progressive_items, progressive_prereq_counts=required_progressive_item_counts, required_count=boost_data.PrereqRequiredCount: has_required_items_progressive( + state, + non_progressive_prereqs, + progressive_prereq_counts, + required_count, + world, + ), + ) + else: + set_rule( + world_location, + lambda state, prereqs=required_non_progressive_items, required_count=boost_data.PrereqRequiredCount: has_required_items_non_progressive( + state, prereqs, required_count, world + ), + ) + + +def has_required_items_progressive( + state: CollectionState, + non_progressive_prereqs: List[str], + progressive_prereq_counts: List[Tuple[str, int]], + required_count: int, + world: "CivVIWorld", +) -> bool: + collected_count = 0 + for item, count in progressive_prereq_counts: + if state.has(item, world.player, count): + collected_count += 1 + # early out if we've already gotten enough + if collected_count >= required_count: + return True + for item in non_progressive_prereqs: + if state.has(item, world.player): + collected_count += 1 + # early out if we've already gotten enough + if collected_count >= required_count: + return True + return False + + +def has_required_items_non_progressive( + state: CollectionState, prereqs: List[str], required_count: int, world: "CivVIWorld" +) -> bool: + return state.has_from_list_unique( + prereqs, + world.player, + required_count, + ) diff --git a/worlds/civ_6/TunerClient.py b/worlds/civ_6/TunerClient.py new file mode 100644 index 0000000000..c4ff461eb9 --- /dev/null +++ b/worlds/civ_6/TunerClient.py @@ -0,0 +1,105 @@ +import asyncio +from logging import Logger +import socket +from typing import Any + +ADDRESS = "127.0.0.1" +PORT = 4318 + +CLIENT_PREFIX = "APSTART:" +CLIENT_POSTFIX = ":APEND" + + +def decode_mixed_string(data: bytes) -> str: + return "".join(chr(b) if 32 <= b < 127 else "?" for b in data) + + +class TunerException(Exception): + pass + + +class TunerTimeoutException(TunerException): + pass + + +class TunerErrorException(TunerException): + pass + + +class TunerConnectionException(TunerException): + pass + + +class TunerClient: + """Interfaces with Civilization via the tuner socket""" + logger: Logger + + def __init__(self, logger: Logger): + self.logger = logger + + def __parse_response(self, response: str) -> str: + """Parses the response from the tuner socket""" + split = response.split(CLIENT_PREFIX) + if len(split) > 1: + start = split[1] + end = start.split(CLIENT_POSTFIX)[0] + return end + elif "ERR:" in response: + raise TunerErrorException(response.replace("?", "")) + else: + return "" + + async def send_game_command(self, command_string: str, size: int = 64): + """Small helper that prefixes a command with GameCore.Game.""" + return await self.send_command("GameCore.Game." + command_string, size) + + async def send_command(self, command_string: str, size: int = 64): + """Send a raw commannd""" + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.setblocking(False) + + b_command_string = command_string.encode("utf-8") + + # Send data to the server + command_prefix = b"CMD:0:" + delimiter = b"\x00" + full_command = b_command_string + message = command_prefix + full_command + delimiter + message_length = len(message).to_bytes(1, byteorder="little") + + # game expects this to be added before any command that is sent, indicates payload size + message_header = message_length + b"\x00\x00\x00\x03\x00\x00\x00" + data = message_header + command_prefix + full_command + delimiter + + server_address = (ADDRESS, PORT) + loop = asyncio.get_event_loop() + try: + await loop.sock_connect(sock, server_address) + await loop.sock_sendall(sock, data) + + # Add a delay before receiving data + await asyncio.sleep(.02) + + received_data = await self.async_recv(sock) + response = decode_mixed_string(received_data) + return self.__parse_response(response) + + except socket.timeout: + self.logger.debug("Timeout occurred while receiving data") + raise TunerTimeoutException() + except Exception as e: + self.logger.debug(f"Error occurred while receiving data: {str(e)}") + # check if No connection could be made is present in the error message + connection_errors = [ + "The remote computer refused the network connection", + ] + if any(error in str(e) for error in connection_errors): + raise TunerConnectionException(e) + else: + raise TunerErrorException(e) + finally: + sock.close() + + async def async_recv(self, sock: Any, timeout: float = 2.0, size: int = 4096): + response = await asyncio.wait_for(asyncio.get_event_loop().sock_recv(sock, size), timeout) + return response diff --git a/worlds/civ_6/__init__.py b/worlds/civ_6/__init__.py new file mode 100644 index 0000000000..0d8fb29d6c --- /dev/null +++ b/worlds/civ_6/__init__.py @@ -0,0 +1,326 @@ +from collections import defaultdict +import math +import os +from typing import Any, Dict, List, Set + +from .ProgressiveDistricts import get_flat_progressive_districts +from worlds.generic.Rules import forbid_item + + +from .Data import ( + get_boosts_data, + get_era_required_items_data, +) + +from .Rules import create_boost_rules +from .Container import ( + CivVIContainer, + generate_goody_hut_sql, + generate_new_items, + generate_setup_file, + generate_update_boosts_sql, +) +from .Enum import CivVICheckType, CivVIHintClassification +from .Items import ( + BOOSTSANITY_PROGRESSION_ITEMS, + FILLER_DISTRIBUTION, + CivVIEvent, + CivVIItemData, + FillerItemRarity, + format_item_name, + generate_item_table, + CivVIItem, + get_item_by_civ_name, + get_random_filler_by_rarity, +) +from .Locations import ( + CivVILocation, + CivVILocationData, + EraType, + generate_era_location_table, + generate_flat_location_table, +) +from .Options import CivVIOptions +from .Regions import create_regions +from BaseClasses import Item, ItemClassification, MultiWorld, Tutorial +from worlds.AutoWorld import World, WebWorld +from worlds.LauncherComponents import Component, SuffixIdentifier, Type, components, launch_subprocess # type: ignore + + +def run_client(*args: Any): + print("Running Civ6 Client") + from .Civ6Client import main # lazy import + + launch_subprocess(main, name="Civ6Client") + + +components.append( + Component( + "Civ6 Client", + func=run_client, + component_type=Type.CLIENT, + file_identifier=SuffixIdentifier(".apcivvi"), + ) +) + + +class CivVIWeb(WebWorld): + tutorials = [ + Tutorial( + "Multiworld Setup Guide", + "A guide to setting up Civilization VI for MultiWorld.", + "English", + "setup_en.md", + "setup/en", + ["hesto2"], + ) + ] + theme = "ocean" + + +class CivVIWorld(World): + """ + Civilization VI is a turn-based strategy video game in which one or more players compete alongside computer-controlled opponents to grow their individual civilization from a small tribe to control the entire planet across several periods of development. + """ + + game = "Civilization VI" + topology_present = False + options_dataclass = CivVIOptions + options: CivVIOptions # type: ignore + + web = CivVIWeb() + + item_name_to_id = {item.name: item.code for item in generate_item_table().values()} + location_name_to_id = { + location.name: location.code + for location in generate_flat_location_table().values() + } + + item_table: Dict[str, CivVIItemData] = {} + location_by_era: Dict[str, Dict[str, CivVILocationData]] + required_client_version = (0, 4, 5) + location_table: Dict[str, CivVILocationData] + era_required_non_progressive_items: Dict[EraType, List[str]] + era_required_progressive_items_counts: Dict[EraType, Dict[str, int]] + era_required_progressive_era_counts: Dict[EraType, int] + item_by_civ_name: Dict[str, str] + + def __init__(self, multiworld: MultiWorld, player: int): + super().__init__(multiworld, player) + self.location_by_era = generate_era_location_table() + + self.location_table: Dict[str, CivVILocationData] = {} + self.item_table = generate_item_table() + + self.era_required_non_progressive_items = {} + self.era_required_progressive_items_counts = {} + self.era_required_progressive_era_counts = {} + + for locations in self.location_by_era.values(): + for location in locations.values(): + self.location_table[location.name] = location + + def generate_early(self) -> None: + flat_progressive_items = get_flat_progressive_districts() + + self.item_by_civ_name = { + item.civ_name: get_item_by_civ_name(item.civ_name, self.item_table).name + for item in self.item_table.values() + if item.civ_name + } + + previous_era_counts = None + eras_list = [e.value for e in EraType] + for era in EraType: + # Initialize era_required_progressive_era_counts + era_index = eras_list.index(era.value) + self.era_required_progressive_era_counts[era] = ( + 0 + if era in {EraType.ERA_FUTURE, EraType.ERA_INFORMATION} + else era_index + 1 + ) + + # Initialize era_required_progressive_items_counts + self.era_required_progressive_items_counts[era] = defaultdict(int) + + if previous_era_counts: + self.era_required_progressive_items_counts[era].update( + previous_era_counts + ) + + # Initialize era_required_non_progressive_items and add to item counts + self.era_required_non_progressive_items[era] = [] + + for item in get_era_required_items_data()[era.value]: + if ( + item in flat_progressive_items + and self.options.progression_style != "none" + ): + progressive_name = format_item_name(flat_progressive_items[item]) + self.era_required_progressive_items_counts[era][ + progressive_name + ] += 1 + else: + self.era_required_non_progressive_items[era].append( + self.item_by_civ_name[item] + ) + + previous_era_counts = self.era_required_progressive_items_counts[era].copy() + + def get_filler_item_name(self) -> str: + return get_random_filler_by_rarity(self, FillerItemRarity.COMMON).name + + def create_regions(self) -> None: + create_regions(self) + + def set_rules(self) -> None: + if self.options.boostsanity: + create_boost_rules(self) + + def create_event(self, event: str): + return CivVIEvent(event, ItemClassification.progression, None, self.player) + + def create_item(self, name: str) -> Item: + item: CivVIItemData = self.item_table[name] + classification = item.classification + if self.options.boostsanity: + if item.civ_name in BOOSTSANITY_PROGRESSION_ITEMS: + classification = ItemClassification.progression + + return CivVIItem(item, self.player, classification) + + def create_items(self) -> None: + data = get_era_required_items_data() + early_items = data[EraType.ERA_ANCIENT.value] + early_locations = [ + location + for location in self.location_table.values() + if location.era_type == EraType.ERA_ANCIENT.value + ] + for item_name, item_data in self.item_table.items(): + # These item types are handled individually + if item_data.item_type in [ + CivVICheckType.PROGRESSIVE_DISTRICT, + CivVICheckType.ERA, + CivVICheckType.GOODY, + ]: + continue + + # If we're using progressive districts, we need to check if we need to create a different item instead + item_to_create = item_name + item: CivVIItemData = self.item_table[item_name] + if self.options.progression_style != "none": + if item.progressive_name: + item_to_create = self.item_table[item.progressive_name].name + + self.multiworld.itempool += [self.create_item(item_to_create)] + if item.civ_name in early_items: + self.multiworld.early_items[self.player][item_to_create] = 1 + elif self.item_table[item_name].era in [ + EraType.ERA_ATOMIC, + EraType.ERA_INFORMATION, + EraType.ERA_FUTURE, + ]: + for location in early_locations: + found_location = None + try: + found_location = self.get_location(location.name) + forbid_item(found_location, item_to_create, self.player) + except KeyError: + pass + + # Era items + if self.options.progression_style == "eras_and_districts": + # Add one less than the total number of eras (start in ancient, don't need to find it) + for era in EraType: + if era.value == "ERA_ANCIENT": + continue + progressive_era_item = self.item_table.get("Progressive Era") + assert progressive_era_item is not None + self.multiworld.itempool += [ + self.create_item(progressive_era_item.name) + ] + + self.multiworld.early_items[self.player]["Progressive Era"] = 2 + + num_filler_items = 0 + # Goody items, create 10 by default if options are enabled + if self.options.shuffle_goody_hut_rewards: + num_filler_items += 10 + + if self.options.boostsanity: + num_filler_items += len(get_boosts_data()) + + filler_count = { + rarity: math.ceil(FILLER_DISTRIBUTION[rarity] * num_filler_items) + for rarity in FillerItemRarity.__reversed__() + } + filler_count[FillerItemRarity.COMMON] -= ( + sum(filler_count.values()) - num_filler_items + ) + self.multiworld.itempool += [ + self.create_item(get_random_filler_by_rarity(self, rarity).name) + for rarity, count in filler_count.items() + for _ in range(count) + ] + + def post_fill(self) -> None: + if not self.options.pre_hint_items.value: + return + + def is_hintable_filler_item(item: Item) -> bool: + return ( + item.classification == 0 + and CivVIHintClassification.FILLER.value + in self.options.pre_hint_items.value + ) + + start_location_hints: Set[str] = self.options.start_location_hints.value + non_filler_flags = [ + CivVIHintClassification(flag).to_item_classification() + for flag in self.options.pre_hint_items.value + if flag != CivVIHintClassification.FILLER.value + ] + for location_name, location_data in self.location_table.items(): + if ( + location_data.location_type != CivVICheckType.CIVIC + and location_data.location_type != CivVICheckType.TECH + ): + continue + + location: CivVILocation = self.get_location(location_name) # type: ignore + + if location.item and ( + is_hintable_filler_item(location.item) + or any( + flag in location.item.classification for flag in non_filler_flags + ) + ): + start_location_hints.add(location_name) + + def fill_slot_data(self) -> Dict[str, Any]: + return self.options.as_dict( + "progression_style", + "death_link", + "research_cost_multiplier", + "death_link_effect", + "death_link_effect_percent", + ) + + def generate_output(self, output_directory: str): + mod_name = self.multiworld.get_out_file_name_base(self.player) + mod_dir = os.path.join(output_directory, mod_name) + mod_files = { + f"NewItems.xml": generate_new_items(self), + f"InitOptions.lua": generate_setup_file(self), + f"GoodyHutOverride.sql": generate_goody_hut_sql(self), + f"UpdateExistingBoosts.sql": generate_update_boosts_sql(self), + } + mod = CivVIContainer( + mod_files, + mod_dir, + output_directory, + self.player, + self.multiworld.get_file_safe_player_name(self.player), + ) + mod.write() diff --git a/worlds/civ_6/data/boosts.py b/worlds/civ_6/data/boosts.py new file mode 100644 index 0000000000..a397720815 --- /dev/null +++ b/worlds/civ_6/data/boosts.py @@ -0,0 +1,919 @@ +from typing import List + +from ..ItemData import CivVIBoostData + + +boosts: List[CivVIBoostData] = [ + CivVIBoostData("BOOST_TECH_SAILING", "ERA_ANCIENT", [], 0, "DEFAULT"), + CivVIBoostData( + "BOOST_TECH_ASTROLOGY", + "ERA_ANCIENT", + [], + 0, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_IRRIGATION", + "ERA_ANCIENT", + [], + 0, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_ARCHERY", + "ERA_ANCIENT", + [], + 0, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_WRITING", + "ERA_ANCIENT", + [], + 0, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_MASONRY", + "ERA_ANCIENT", + ["TECH_MINING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_BRONZE_WORKING", + "ERA_ANCIENT", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_THE_WHEEL", + "ERA_ANCIENT", + ["TECH_MINING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_CELESTIAL_NAVIGATION", + "ERA_CLASSICAL", + ["TECH_SAILING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_CURRENCY", + "ERA_CLASSICAL", + ["CIVIC_FOREIGN_TRADE"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_HORSEBACK_RIDING", + "ERA_CLASSICAL", + ["TECH_ANIMAL_HUSBANDRY"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_IRON_WORKING", + "ERA_CLASSICAL", + ["TECH_MINING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_SHIPBUILDING", + "ERA_CLASSICAL", + ["TECH_SAILING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_MATHEMATICS", + "ERA_CLASSICAL", + [ + "TECH_CURRENCY", + "TECH_BRONZE_WORKING", + "TECH_CELESTIAL_NAVIGATION", + "TECH_WRITING", + "TECH_APPRENTICESHIP", + "TECH_FLIGHT", + "CIVIC_GAMES_RECREATION", + "CIVIC_DRAMA_POETRY", + ], + 3, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_CONSTRUCTION", + "ERA_CLASSICAL", + ["TECH_THE_WHEEL"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_ENGINEERING", + "ERA_CLASSICAL", + ["TECH_MASONRY"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_MILITARY_TACTICS", + "ERA_MEDIEVAL", + ["TECH_BRONZE_WORKING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_APPRENTICESHIP", + "ERA_MEDIEVAL", + ["TECH_MINING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_MACHINERY", + "ERA_MEDIEVAL", + ["TECH_ARCHERY"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_EDUCATION", + "ERA_MEDIEVAL", + ["TECH_WRITING"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_STIRRUPS", + "ERA_MEDIEVAL", + ["CIVIC_FEUDALISM"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_MILITARY_ENGINEERING", + "ERA_MEDIEVAL", + ["TECH_ENGINEERING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_CASTLES", + "ERA_MEDIEVAL", + [ + "CIVIC_DIVINE_RIGHT", + "CIVIC_EXPLORATION", + "CIVIC_REFORMED_CHURCH", + "CIVIC_SUFFRAGE", + "CIVIC_TOTALITARIANISM", + "CIVIC_CLASS_STRUGGLE", + "CIVIC_DIGITAL_DEMOCRACY", + "CIVIC_CORPORATE_LIBERTARIANISM", + "CIVIC_SYNTHETIC_TECHNOCRACY", + ], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_CARTOGRAPHY", + "ERA_RENAISSANCE", + ["TECH_CELESTIAL_NAVIGATION"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_MASS_PRODUCTION", + "ERA_RENAISSANCE", + ["TECH_CONSTRUCTION"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_BANKING", + "ERA_RENAISSANCE", + ["CIVIC_GUILDS"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_GUNPOWDER", + "ERA_RENAISSANCE", + ["TECH_BRONZE_WORKING", "TECH_MILITARY_ENGINEERING"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_PRINTING", + "ERA_RENAISSANCE", + ["TECH_WRITING", "TECH_EDUCATION"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_SQUARE_RIGGING", + "ERA_RENAISSANCE", + ["TECH_GUNPOWDER"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_ASTRONOMY", + "ERA_RENAISSANCE", + ["TECH_EDUCATION"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_METAL_CASTING", + "ERA_RENAISSANCE", + ["TECH_MACHINERY"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_SIEGE_TACTICS", + "ERA_RENAISSANCE", + ["TECH_MILITARY_ENGINEERING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_INDUSTRIALIZATION", + "ERA_INDUSTRIAL", + ["TECH_APPRENTICESHIP"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_SCIENTIFIC_THEORY", + "ERA_INDUSTRIAL", + ["CIVIC_THE_ENLIGHTENMENT"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_BALLISTICS", + "ERA_INDUSTRIAL", + ["TECH_SIEGE_TACTICS", "TECH_MILITARY_ENGINEERING"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_MILITARY_SCIENCE", + "ERA_INDUSTRIAL", + ["TECH_STIRRUPS"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_STEAM_POWER", + "ERA_INDUSTRIAL", + ["TECH_MASS_PRODUCTION"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_SANITATION", + "ERA_INDUSTRIAL", + ["CIVIC_URBANIZATION"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_ECONOMICS", + "ERA_INDUSTRIAL", + ["TECH_CURRENCY", "TECH_BANKING"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_RIFLING", + "ERA_INDUSTRIAL", + ["TECH_MINING", "TECH_MILITARY_ENGINEERING"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_FLIGHT", + "ERA_MODERN", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_REPLACEABLE_PARTS", + "ERA_MODERN", + ["TECH_MILITARY_SCIENCE"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_STEEL", + "ERA_MODERN", + ["TECH_MINING", "TECH_STEAM_POWER", "TECH_INDUSTRIALIZATION"], + 3, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_ELECTRICITY", + "ERA_MODERN", + ["CIVIC_MERCANTILISM", "TECH_CELESTIAL_NAVIGATION"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_RADIO", + "ERA_MODERN", + ["CIVIC_CONSERVATION"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_CHEMISTRY", + "ERA_MODERN", + ["CIVIC_CIVIL_SERVICE"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_COMBUSTION", + "ERA_MODERN", + ["CIVIC_NATURAL_HISTORY", "CIVIC_HUMANISM"], + 2, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_ADVANCED_FLIGHT", + "ERA_ATOMIC", + ["TECH_FLIGHT"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_ROCKETRY", + "ERA_ATOMIC", + ["CIVIC_DIPLOMATIC_SERVICE"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_ADVANCED_BALLISTICS", + "ERA_ATOMIC", + [ + "TECH_ELECTRICITY", + "TECH_REFINING", + "TECH_APPRENTICESHIP", + "TECH_INDUSTRIALIZATION", + ], + 4, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_COMBINED_ARMS", + "ERA_ATOMIC", + ["CIVIC_MOBILIZATION", "CIVIC_NATIONALISM"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_PLASTICS", + "ERA_ATOMIC", + ["TECH_REFINING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_COMPUTERS", + "ERA_ATOMIC", + [ + "CIVIC_SUFFRAGE", + "CIVIC_TOTALITARIANISM", + "CIVIC_CLASS_STRUGGLE", + "CIVIC_DIGITAL_DEMOCRACY", + "CIVIC_CORPORATE_LIBERTARIANISM", + "CIVIC_SYNTHETIC_TECHNOCRACY", + ], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_NUCLEAR_FISSION", + "ERA_ATOMIC", + ["CIVIC_DIPLOMATIC_SERVICE"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_SYNTHETIC_MATERIALS", + "ERA_ATOMIC", + ["TECH_FLIGHT"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_TELECOMMUNICATIONS", + "ERA_INFORMATION", + ["CIVIC_DIPLOMATIC_SERVICE"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_SATELLITES", + "ERA_INFORMATION", + ["CIVIC_DRAMA_POETRY", "CIVIC_HUMANISM", "TECH_RADIO"], + 3, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_GUIDANCE_SYSTEMS", + "ERA_INFORMATION", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_LASERS", + "ERA_INFORMATION", + ["TECH_COMPUTERS"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_COMPOSITES", + "ERA_INFORMATION", + ["TECH_COMBUSTION"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_STEALTH_TECHNOLOGY", + "ERA_INFORMATION", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_ROBOTICS", + "ERA_INFORMATION", + ["CIVIC_GLOBALIZATION"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_NANOTECHNOLOGY", + "ERA_INFORMATION", + ["TECH_MINING", "TECH_RADIO"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_NUCLEAR_FUSION", + "ERA_INFORMATION", + [ + "TECH_APPRENTICESHIP", + "TECH_INDUSTRIALIZATION", + "TECH_ELECTRICITY", + "TECH_NUCLEAR_FISSION", + ], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_BUTTRESS", + "ERA_MEDIEVAL", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_REFINING", + "ERA_MODERN", + ["TECH_INDUSTRIALIZATION", "TECH_MINING", "TECH_APPRENTICESHIP"], + 3, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_TECH_SEASTEADS", + "ERA_FUTURE", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_ADVANCED_AI", + "ERA_FUTURE", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_ADVANCED_POWER_CELLS", + "ERA_FUTURE", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_CYBERNETICS", + "ERA_FUTURE", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_SMART_MATERIALS", + "ERA_FUTURE", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_PREDICTIVE_SYSTEMS", + "ERA_FUTURE", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_TECH_OFFWORLD_MISSION", + "ERA_FUTURE", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_CRAFTSMANSHIP", + "ERA_ANCIENT", + [ + "TECH_IRRIGATION", + "TECH_MINING", + "TECH_CONSTRUCTION", + "TECH_ANIMAL_HUSBANDRY", + "TECH_SAILING", + ], + 3, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_FOREIGN_TRADE", + "ERA_ANCIENT", + ["TECH_CARTOGRAPHY"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_MILITARY_TRADITION", + "ERA_ANCIENT", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_STATE_WORKFORCE", + "ERA_ANCIENT", + [ + "TECH_CURRENCY", + "TECH_BRONZE_WORKING", + "TECH_CELESTIAL_NAVIGATION", + "TECH_WRITING", + "TECH_APPRENTICESHIP", + "TECH_FLIGHT", + "CIVIC_GAMES_RECREATION", + "CIVIC_DRAMA_POETRY", + ], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_EARLY_EMPIRE", + "ERA_ANCIENT", + [], + 0, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_MYSTICISM", + "ERA_ANCIENT", + [], + 0, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_GAMES_RECREATION", + "ERA_CLASSICAL", + ["TECH_CONSTRUCTION"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_POLITICAL_PHILOSOPHY", + "ERA_CLASSICAL", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_DRAMA_POETRY", + "ERA_CLASSICAL", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_MILITARY_TRAINING", + "ERA_CLASSICAL", + ["TECH_BRONZE_WORKING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_DEFENSIVE_TACTICS", + "ERA_CLASSICAL", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_RECORDED_HISTORY", + "ERA_CLASSICAL", + ["TECH_WRITING"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_THEOLOGY", + "ERA_CLASSICAL", + ["TECH_ASTROLOGY"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_NAVAL_TRADITION", + "ERA_MEDIEVAL", + ["TECH_SHIPBUILDING"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_FEUDALISM", + "ERA_MEDIEVAL", + [], + 0, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_CIVIL_SERVICE", + "ERA_MEDIEVAL", + [], + 0, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_MERCENARIES", + "ERA_MEDIEVAL", + [], + 0, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_MEDIEVAL_FAIRES", + "ERA_MEDIEVAL", + ["CIVIC_FOREIGN_TRADE", "TECH_CURRENCY"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_GUILDS", + "ERA_MEDIEVAL", + ["TECH_CURRENCY"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_DIVINE_RIGHT", + "ERA_MEDIEVAL", + ["CIVIC_THEOLOGY", "TECH_ASTROLOGY"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_EXPLORATION", + "ERA_RENAISSANCE", + ["TECH_CARTOGRAPHY", "TECH_CELESTIAL_NAVIGATION"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_HUMANISM", + "ERA_RENAISSANCE", + ["CIVIC_DRAMA_POETRY"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_DIPLOMATIC_SERVICE", + "ERA_RENAISSANCE", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_REFORMED_CHURCH", + "ERA_RENAISSANCE", + ["TECH_ASTROLOGY"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_MERCANTILISM", + "ERA_RENAISSANCE", + ["TECH_CURRENCY"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_THE_ENLIGHTENMENT", + "ERA_RENAISSANCE", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_COLONIALISM", + "ERA_INDUSTRIAL", + ["TECH_ASTRONOMY"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_CIVIL_ENGINEERING", + "ERA_INDUSTRIAL", + [ + "TECH_CURRENCY", + "TECH_BRONZE_WORKING", + "TECH_CELESTIAL_NAVIGATION", + "TECH_WRITING", + "TECH_APPRENTICESHIP", + "TECH_FLIGHT", + "CIVIC_GAMES_RECREATION", + "CIVIC_DRAMA_POETRY", + ], + 8, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_NATIONALISM", + "ERA_INDUSTRIAL", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_OPERA_BALLET", + "ERA_INDUSTRIAL", + ["CIVIC_HUMANISM", "CIVIC_DRAMA_POETRY"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_NATURAL_HISTORY", + "ERA_INDUSTRIAL", + ["CIVIC_HUMANISM", "CIVIC_DRAMA_POETRY"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_SCORCHED_EARTH", + "ERA_INDUSTRIAL", + ["TECH_BALLISTICS"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_URBANIZATION", + "ERA_INDUSTRIAL", + [], + 0, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_CONSERVATION", + "ERA_MODERN", + ["CIVIC_URBANIZATION"], + 1, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_CAPITALISM", + "ERA_MODERN", + ["TECH_CURRENCY", "TECH_BANKING", "TECH_ECONOMICS"], + 3, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_NUCLEAR_PROGRAM", + "ERA_MODERN", + ["TECH_WRITING", "TECH_EDUCATION", "TECH_CHEMISTRY"], + 3, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_MASS_MEDIA", + "ERA_MODERN", + ["TECH_RADIO"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_MOBILIZATION", + "ERA_MODERN", + ["CIVIC_NATIONALISM"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_SUFFRAGE", + "ERA_MODERN", + ["TECH_SANITATION"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_TOTALITARIANISM", + "ERA_MODERN", + [ + "TECH_BRONZE_WORKING", + "TECH_MILITARY_ENGINEERING", + "TECH_MILITARY_SCIENCE", + ], + 3, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_CLASS_STRUGGLE", + "ERA_MODERN", + ["TECH_APPRENTICESHIP", "TECH_INDUSTRIALIZATION"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_COLD_WAR", + "ERA_ATOMIC", + ["TECH_NUCLEAR_FISSION"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_PROFESSIONAL_SPORTS", + "ERA_ATOMIC", + ["CIVIC_GAMES_RECREATION"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_CULTURAL_HERITAGE", + "ERA_ATOMIC", + [], + 0, + "EXCLUDED", + ), + CivVIBoostData( + "BOOST_CIVIC_RAPID_DEPLOYMENT", + "ERA_ATOMIC", + ["TECH_FLIGHT", "TECH_CARTOGRAPHY", "TECH_SHIPBUILDING"], + 3, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_SPACE_RACE", + "ERA_ATOMIC", + ["TECH_ROCKETRY"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_GLOBALIZATION", + "ERA_INFORMATION", + ["TECH_FLIGHT", "TECH_ADVANCED_FLIGHT"], + 2, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_SOCIAL_MEDIA", + "ERA_INFORMATION", + ["TECH_TELECOMMUNICATIONS"], + 1, + "DEFAULT", + ), + CivVIBoostData( + "BOOST_CIVIC_ENVIRONMENTALISM", + "ERA_INFORMATION", + ["TECH_SATELLITES"], + 1, + "DEFAULT", + ), +] diff --git a/worlds/civ_6/data/era_required_items.py b/worlds/civ_6/data/era_required_items.py new file mode 100644 index 0000000000..fd3bca6954 --- /dev/null +++ b/worlds/civ_6/data/era_required_items.py @@ -0,0 +1,75 @@ +from typing import Dict, List + + +era_required_items: Dict[str, List[str]] = { + "ERA_ANCIENT": [ + "TECH_MINING", + "TECH_BRONZE_WORKING", + "TECH_ASTROLOGY", + "TECH_WRITING", + "TECH_IRRIGATION", + "TECH_SAILING", + "TECH_ANIMAL_HUSBANDRY", + "CIVIC_STATE_WORKFORCE", + "CIVIC_FOREIGN_TRADE", + ], + "ERA_CLASSICAL": [ + "TECH_CELESTIAL_NAVIGATION", + "TECH_CURRENCY", + "TECH_MATHEMATICS", + "TECH_SHIPBUILDING", + "CIVIC_GAMES_RECREATION", + "CIVIC_POLITICAL_PHILOSOPHY", + "CIVIC_DRAMA_POETRY", + "CIVIC_THEOLOGY", + ], + "ERA_MEDIEVAL": [ + "TECH_APPRENTICESHIP", + "TECH_EDUCATION", + "TECH_MILITARY_ENGINEERING", + "CIVIC_DIVINE_RIGHT", + ], + "ERA_RENAISSANCE": [ + "TECH_MASS_PRODUCTION", + "TECH_BANKING", + "CIVIC_EXPLORATION", + "CIVIC_HUMANISM", + "CIVIC_REFORMED_CHURCH", + "CIVIC_DIPLOMATIC_SERVICE", + "TECH_CARTOGRAPHY", + ], + "ERA_INDUSTRIAL": [ + "TECH_INDUSTRIALIZATION", + "TECH_MILITARY_SCIENCE", + "TECH_ECONOMICS", + "CIVIC_NATIONALISM", + "CIVIC_NATURAL_HISTORY", + ], + "ERA_MODERN": [ + "TECH_FLIGHT", + "TECH_REFINING", + "TECH_ELECTRICITY", + "TECH_RADIO", + "TECH_CHEMISTRY", + "CIVIC_SUFFRAGE", + "CIVIC_TOTALITARIANISM", + "CIVIC_CLASS_STRUGGLE", + ], + "ERA_ATOMIC": [ + "TECH_ADVANCED_FLIGHT", + "TECH_ROCKETRY", + "TECH_COMBINED_ARMS", + "TECH_PLASTICS", + "TECH_NUCLEAR_FISSION", + "CIVIC_PROFESSIONAL_SPORTS", + ], + "ERA_INFORMATION": [ + "TECH_SATELLITES", + "TECH_NANOTECHNOLOGY", + "TECH_SMART_MATERIALS", + "CIVIC_CORPORATE_LIBERTARIANISM", + "CIVIC_DIGITAL_DEMOCRACY", + "CIVIC_SYNTHETIC_TECHNOCRACY", + ], + "ERA_FUTURE": [], +} diff --git a/worlds/civ_6/data/existing_civics.py b/worlds/civ_6/data/existing_civics.py new file mode 100644 index 0000000000..662110ab67 --- /dev/null +++ b/worlds/civ_6/data/existing_civics.py @@ -0,0 +1,435 @@ +from typing import TYPE_CHECKING, List + +if TYPE_CHECKING: + from ..Data import ExistingItemData + + +existing_civics: List["ExistingItemData"] = [ + { + "Type": "CIVIC_CODE_OF_LAWS", + "Name": "Code of Laws", + "Cost": 20, + "EraType": "ERA_ANCIENT", + "UITreeRow": 0, + }, + { + "Type": "CIVIC_CRAFTSMANSHIP", + "Name": "Craftsmanship", + "Cost": 40, + "EraType": "ERA_ANCIENT", + "UITreeRow": -2, + }, + { + "Type": "CIVIC_FOREIGN_TRADE", + "Name": "Foreign Trade", + "Cost": 40, + "EraType": "ERA_ANCIENT", + "UITreeRow": 2, + }, + { + "Type": "CIVIC_MILITARY_TRADITION", + "Name": "Military Tradition", + "Cost": 50, + "EraType": "ERA_ANCIENT", + "UITreeRow": -3, + }, + { + "Type": "CIVIC_STATE_WORKFORCE", + "Name": "State Workforce", + "Cost": 70, + "EraType": "ERA_ANCIENT", + "UITreeRow": 0, + }, + { + "Type": "CIVIC_EARLY_EMPIRE", + "Name": "Early Empire", + "Cost": 70, + "EraType": "ERA_ANCIENT", + "UITreeRow": 1, + }, + { + "Type": "CIVIC_MYSTICISM", + "Name": "Mysticism", + "Cost": 50, + "EraType": "ERA_ANCIENT", + "UITreeRow": 3, + }, + { + "Type": "CIVIC_GAMES_RECREATION", + "Name": "Games Recreation", + "Cost": 110, + "EraType": "ERA_CLASSICAL", + "UITreeRow": -2, + }, + { + "Type": "CIVIC_POLITICAL_PHILOSOPHY", + "Name": "Political Philosophy", + "Cost": 110, + "EraType": "ERA_CLASSICAL", + "UITreeRow": 0, + }, + { + "Type": "CIVIC_DRAMA_POETRY", + "Name": "Drama and Poetry", + "Cost": 110, + "EraType": "ERA_CLASSICAL", + "UITreeRow": 2, + }, + { + "Type": "CIVIC_MILITARY_TRAINING", + "Name": "Military Training", + "Cost": 120, + "EraType": "ERA_CLASSICAL", + "UITreeRow": -3, + }, + { + "Type": "CIVIC_DEFENSIVE_TACTICS", + "Name": "Defensive Tactics", + "Cost": 175, + "EraType": "ERA_CLASSICAL", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_RECORDED_HISTORY", + "Name": "Recorded History", + "Cost": 175, + "EraType": "ERA_CLASSICAL", + "UITreeRow": 1, + }, + { + "Type": "CIVIC_THEOLOGY", + "Name": "Theology", + "Cost": 120, + "EraType": "ERA_CLASSICAL", + "UITreeRow": 3, + }, + { + "Type": "CIVIC_NAVAL_TRADITION", + "Name": "Naval Tradition", + "Cost": 220, + "EraType": "ERA_MEDIEVAL", + "UITreeRow": -2, + }, + { + "Type": "CIVIC_FEUDALISM", + "Name": "Feudalism", + "Cost": 300, + "EraType": "ERA_MEDIEVAL", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_CIVIL_SERVICE", + "Name": "Civil Service", + "Cost": 300, + "EraType": "ERA_MEDIEVAL", + "UITreeRow": 1, + }, + { + "Type": "CIVIC_MERCENARIES", + "Name": "Mercenaries", + "Cost": 340, + "EraType": "ERA_MEDIEVAL", + "UITreeRow": -3, + }, + { + "Type": "CIVIC_MEDIEVAL_FAIRES", + "Name": "Medieval Faires", + "Cost": 420, + "EraType": "ERA_MEDIEVAL", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_GUILDS", + "Name": "Guilds", + "Cost": 420, + "EraType": "ERA_MEDIEVAL", + "UITreeRow": 1, + }, + { + "Type": "CIVIC_DIVINE_RIGHT", + "Name": "Divine Right", + "Cost": 340, + "EraType": "ERA_MEDIEVAL", + "UITreeRow": 3, + }, + { + "Type": "CIVIC_EXPLORATION", + "Name": "Exploration", + "Cost": 440, + "EraType": "ERA_RENAISSANCE", + "UITreeRow": -3, + }, + { + "Type": "CIVIC_HUMANISM", + "Name": "Humanism", + "Cost": 600, + "EraType": "ERA_RENAISSANCE", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_DIPLOMATIC_SERVICE", + "Name": "Diplomatic Service", + "Cost": 600, + "EraType": "ERA_RENAISSANCE", + "UITreeRow": 1, + }, + { + "Type": "CIVIC_REFORMED_CHURCH", + "Name": "Reformed Church", + "Cost": 440, + "EraType": "ERA_RENAISSANCE", + "UITreeRow": 3, + }, + { + "Type": "CIVIC_MERCANTILISM", + "Name": "Mercantilism", + "Cost": 720, + "EraType": "ERA_RENAISSANCE", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_THE_ENLIGHTENMENT", + "Name": "The Enlightenment", + "Cost": 720, + "EraType": "ERA_RENAISSANCE", + "UITreeRow": 1, + }, + { + "Type": "CIVIC_COLONIALISM", + "Name": "Colonialism", + "Cost": 800, + "EraType": "ERA_INDUSTRIAL", + "UITreeRow": -3, + }, + { + "Type": "CIVIC_CIVIL_ENGINEERING", + "Name": "Civil Engineering", + "Cost": 1010, + "EraType": "ERA_INDUSTRIAL", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_NATIONALISM", + "Name": "Nationalism", + "Cost": 1010, + "EraType": "ERA_INDUSTRIAL", + "UITreeRow": 0, + }, + { + "Type": "CIVIC_OPERA_BALLET", + "Name": "Opera and Ballet", + "Cost": 800, + "EraType": "ERA_INDUSTRIAL", + "UITreeRow": 2, + }, + { + "Type": "CIVIC_NATURAL_HISTORY", + "Name": "Natural History", + "Cost": 1050, + "EraType": "ERA_INDUSTRIAL", + "UITreeRow": -3, + }, + { + "Type": "CIVIC_SCORCHED_EARTH", + "Name": "Scorched Earth", + "Cost": 1210, + "EraType": "ERA_INDUSTRIAL", + "UITreeRow": 2, + }, + { + "Type": "CIVIC_URBANIZATION", + "Name": "Urbanization", + "Cost": 1210, + "EraType": "ERA_INDUSTRIAL", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_CONSERVATION", + "Name": "Conservation", + "Cost": 1540, + "EraType": "ERA_MODERN", + "UITreeRow": -3, + }, + { + "Type": "CIVIC_CAPITALISM", + "Name": "Capitalism", + "Cost": 1580, + "EraType": "ERA_MODERN", + "UITreeRow": -2, + }, + { + "Type": "CIVIC_NUCLEAR_PROGRAM", + "Name": "Nuclear Program", + "Cost": 1715, + "EraType": "ERA_MODERN", + "UITreeRow": -2, + }, + { + "Type": "CIVIC_MASS_MEDIA", + "Name": "Mass Media", + "Cost": 1540, + "EraType": "ERA_MODERN", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_MOBILIZATION", + "Name": "Mobilization", + "Cost": 1540, + "EraType": "ERA_MODERN", + "UITreeRow": 1, + }, + { + "Type": "CIVIC_IDEOLOGY", + "Name": "Ideology", + "Cost": 1640, + "EraType": "ERA_MODERN", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_SUFFRAGE", + "Name": "Suffrage", + "Cost": 1640, + "EraType": "ERA_MODERN", + "UITreeRow": 0, + }, + { + "Type": "CIVIC_TOTALITARIANISM", + "Name": "Totalitarianism", + "Cost": 1640, + "EraType": "ERA_MODERN", + "UITreeRow": 2, + }, + { + "Type": "CIVIC_CLASS_STRUGGLE", + "Name": "Class Struggle", + "Cost": 1640, + "EraType": "ERA_MODERN", + "UITreeRow": 3, + }, + { + "Type": "CIVIC_COLD_WAR", + "Name": "Cold War", + "Cost": 2185, + "EraType": "ERA_ATOMIC", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_PROFESSIONAL_SPORTS", + "Name": "Professional Sports", + "Cost": 2185, + "EraType": "ERA_ATOMIC", + "UITreeRow": 2, + }, + { + "Type": "CIVIC_CULTURAL_HERITAGE", + "Name": "Cultural Heritage", + "Cost": 1955, + "EraType": "ERA_ATOMIC", + "UITreeRow": -3, + }, + { + "Type": "CIVIC_RAPID_DEPLOYMENT", + "Name": "Rapid Deployment", + "Cost": 2415, + "EraType": "ERA_ATOMIC", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_SPACE_RACE", + "Name": "Space Race", + "Cost": 2415, + "EraType": "ERA_ATOMIC", + "UITreeRow": 1, + }, + { + "Type": "CIVIC_GLOBALIZATION", + "Name": "Globalization", + "Cost": 2880, + "EraType": "ERA_INFORMATION", + "UITreeRow": 0, + }, + { + "Type": "CIVIC_SOCIAL_MEDIA", + "Name": "Social Media", + "Cost": 2880, + "EraType": "ERA_INFORMATION", + "UITreeRow": 2, + }, + { + "Type": "CIVIC_FUTURE_CIVIC", + "Name": "Future Civic", + "Cost": 3500, + "EraType": "ERA_FUTURE", + "UITreeRow": 1, + }, + { + "Type": "CIVIC_ENVIRONMENTALISM", + "Name": "Environmentalism", + "Cost": 2880, + "EraType": "ERA_INFORMATION", + "UITreeRow": -2, + }, + { + "Type": "CIVIC_CORPORATE_LIBERTARIANISM", + "Name": "Corporate Libertarianism", + "Cost": 3000, + "EraType": "ERA_INFORMATION", + "UITreeRow": 0, + }, + { + "Type": "CIVIC_DIGITAL_DEMOCRACY", + "Name": "Digital Democracy", + "Cost": 3000, + "EraType": "ERA_INFORMATION", + "UITreeRow": 1, + }, + { + "Type": "CIVIC_SYNTHETIC_TECHNOCRACY", + "Name": "Synthetic Technocracy", + "Cost": 3000, + "EraType": "ERA_INFORMATION", + "UITreeRow": 2, + }, + { + "Type": "CIVIC_NEAR_FUTURE_GOVERNANCE", + "Name": "Near Future Governance", + "Cost": 3100, + "EraType": "ERA_INFORMATION", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_GLOBAL_WARMING_MITIGATION", + "Name": "Global Warming Mitigation", + "Cost": 3200, + "EraType": "ERA_FUTURE", + "UITreeRow": -2, + }, + { + "Type": "CIVIC_SMART_POWER_DOCTRINE", + "Name": "Smart Power Doctrine", + "Cost": 3200, + "EraType": "ERA_FUTURE", + "UITreeRow": -1, + }, + { + "Type": "CIVIC_INFORMATION_WARFARE", + "Name": "Information Warfare", + "Cost": 3200, + "EraType": "ERA_FUTURE", + "UITreeRow": 0, + }, + { + "Type": "CIVIC_EXODUS_IMPERATIVE", + "Name": "Exodus Imperative", + "Cost": 3200, + "EraType": "ERA_FUTURE", + "UITreeRow": 1, + }, + { + "Type": "CIVIC_CULTURAL_HEGEMONY", + "Name": "Cultural Hegemony", + "Cost": 3200, + "EraType": "ERA_FUTURE", + "UITreeRow": 2, + }, +] diff --git a/worlds/civ_6/data/existing_tech.py b/worlds/civ_6/data/existing_tech.py new file mode 100644 index 0000000000..3ff39f7a59 --- /dev/null +++ b/worlds/civ_6/data/existing_tech.py @@ -0,0 +1,546 @@ +from typing import List + +from ..ItemData import ExistingItemData + + +existing_tech: List[ExistingItemData] = [ + { + "Type": "TECH_POTTERY", + "Cost": 25, + "UITreeRow": 0, + "EraType": "ERA_ANCIENT", + "Name": "Pottery", + }, + { + "Type": "TECH_ANIMAL_HUSBANDRY", + "Cost": 25, + "UITreeRow": 1, + "EraType": "ERA_ANCIENT", + "Name": "Animal Husbandry", + }, + { + "Type": "TECH_MINING", + "Cost": 25, + "UITreeRow": 3, + "EraType": "ERA_ANCIENT", + "Name": "Mining", + }, + { + "Type": "TECH_SAILING", + "Cost": 50, + "UITreeRow": -3, + "EraType": "ERA_ANCIENT", + "Name": "Sailing", + }, + { + "Type": "TECH_ASTROLOGY", + "Cost": 50, + "UITreeRow": -2, + "EraType": "ERA_ANCIENT", + "Name": "Astrology", + }, + { + "Type": "TECH_IRRIGATION", + "Cost": 50, + "UITreeRow": -1, + "EraType": "ERA_ANCIENT", + "Name": "Irrigation", + }, + { + "Type": "TECH_ARCHERY", + "Cost": 50, + "UITreeRow": 1, + "EraType": "ERA_ANCIENT", + "Name": "Archery", + }, + { + "Type": "TECH_WRITING", + "Cost": 50, + "UITreeRow": 0, + "EraType": "ERA_ANCIENT", + "Name": "Writing", + }, + { + "Type": "TECH_MASONRY", + "Cost": 80, + "UITreeRow": 2, + "EraType": "ERA_ANCIENT", + "Name": "Masonry", + }, + { + "Type": "TECH_BRONZE_WORKING", + "Cost": 80, + "UITreeRow": 3, + "EraType": "ERA_ANCIENT", + "Name": "Bronze Working", + }, + { + "Type": "TECH_THE_WHEEL", + "Cost": 80, + "UITreeRow": 4, + "EraType": "ERA_ANCIENT", + "Name": "The Wheel", + }, + { + "Type": "TECH_CELESTIAL_NAVIGATION", + "Cost": 120, + "UITreeRow": -2, + "EraType": "ERA_CLASSICAL", + "Name": "Celestial Navigation", + }, + { + "Type": "TECH_CURRENCY", + "Cost": 120, + "UITreeRow": 0, + "EraType": "ERA_CLASSICAL", + "Name": "Currency", + }, + { + "Type": "TECH_HORSEBACK_RIDING", + "Cost": 120, + "UITreeRow": 1, + "EraType": "ERA_CLASSICAL", + "Name": "Horseback Riding", + }, + { + "Type": "TECH_IRON_WORKING", + "Cost": 120, + "UITreeRow": 3, + "EraType": "ERA_CLASSICAL", + "Name": "Iron Working", + }, + { + "Type": "TECH_SHIPBUILDING", + "Cost": 200, + "UITreeRow": -3, + "EraType": "ERA_CLASSICAL", + "Name": "Shipbuilding", + }, + { + "Type": "TECH_MATHEMATICS", + "Cost": 200, + "UITreeRow": -1, + "EraType": "ERA_CLASSICAL", + "Name": "Mathematics", + }, + { + "Type": "TECH_CONSTRUCTION", + "Cost": 200, + "UITreeRow": 2, + "EraType": "ERA_CLASSICAL", + "Name": "Construction", + }, + { + "Type": "TECH_ENGINEERING", + "Cost": 200, + "UITreeRow": 4, + "EraType": "ERA_CLASSICAL", + "Name": "Engineering", + }, + { + "Type": "TECH_MILITARY_TACTICS", + "Cost": 300, + "UITreeRow": -2, + "EraType": "ERA_MEDIEVAL", + "Name": "Military Tactics", + }, + { + "Type": "TECH_APPRENTICESHIP", + "Cost": 300, + "UITreeRow": 0, + "EraType": "ERA_MEDIEVAL", + "Name": "Apprenticeship", + }, + { + "Type": "TECH_MACHINERY", + "Cost": 300, + "UITreeRow": 4, + "EraType": "ERA_MEDIEVAL", + "Name": "Machinery", + }, + { + "Type": "TECH_EDUCATION", + "Cost": 390, + "UITreeRow": -1, + "EraType": "ERA_MEDIEVAL", + "Name": "Education", + }, + { + "Type": "TECH_STIRRUPS", + "Cost": 390, + "UITreeRow": 1, + "EraType": "ERA_MEDIEVAL", + "Name": "Stirrups", + }, + { + "Type": "TECH_MILITARY_ENGINEERING", + "Cost": 390, + "UITreeRow": 2, + "EraType": "ERA_MEDIEVAL", + "Name": "Military Engineering", + }, + { + "Type": "TECH_CASTLES", + "Cost": 390, + "UITreeRow": 3, + "EraType": "ERA_MEDIEVAL", + "Name": "Castles", + }, + { + "Type": "TECH_CARTOGRAPHY", + "Cost": 600, + "UITreeRow": -3, + "EraType": "ERA_RENAISSANCE", + "Name": "Cartography", + }, + { + "Type": "TECH_MASS_PRODUCTION", + "Cost": 600, + "UITreeRow": -2, + "EraType": "ERA_RENAISSANCE", + "Name": "Mass Production", + }, + { + "Type": "TECH_BANKING", + "Cost": 600, + "UITreeRow": 0, + "EraType": "ERA_RENAISSANCE", + "Name": "Banking", + }, + { + "Type": "TECH_GUNPOWDER", + "Cost": 600, + "UITreeRow": 1, + "EraType": "ERA_RENAISSANCE", + "Name": "Gunpowder", + }, + { + "Type": "TECH_PRINTING", + "Cost": 600, + "UITreeRow": 4, + "EraType": "ERA_RENAISSANCE", + "Name": "Printing", + }, + { + "Type": "TECH_SQUARE_RIGGING", + "Cost": 730, + "UITreeRow": -3, + "EraType": "ERA_RENAISSANCE", + "Name": "Square Rigging", + }, + { + "Type": "TECH_ASTRONOMY", + "Cost": 730, + "UITreeRow": -1, + "EraType": "ERA_RENAISSANCE", + "Name": "Astronomy", + }, + { + "Type": "TECH_METAL_CASTING", + "Cost": 730, + "UITreeRow": 1, + "EraType": "ERA_RENAISSANCE", + "Name": "Metal Casting", + }, + { + "Type": "TECH_SIEGE_TACTICS", + "Cost": 730, + "UITreeRow": 3, + "EraType": "ERA_RENAISSANCE", + "Name": "Siege Tactics", + }, + { + "Type": "TECH_INDUSTRIALIZATION", + "Cost": 930, + "UITreeRow": -2, + "EraType": "ERA_INDUSTRIAL", + "Name": "Industrialization", + }, + { + "Type": "TECH_SCIENTIFIC_THEORY", + "Cost": 930, + "UITreeRow": -1, + "EraType": "ERA_INDUSTRIAL", + "Name": "Scientific Theory", + }, + { + "Type": "TECH_BALLISTICS", + "Cost": 930, + "UITreeRow": 1, + "EraType": "ERA_INDUSTRIAL", + "Name": "Ballistics", + }, + { + "Type": "TECH_MILITARY_SCIENCE", + "Cost": 930, + "UITreeRow": 3, + "EraType": "ERA_INDUSTRIAL", + "Name": "Military Science", + }, + { + "Type": "TECH_STEAM_POWER", + "Cost": 1070, + "UITreeRow": -3, + "EraType": "ERA_INDUSTRIAL", + "Name": "Steam Power", + }, + { + "Type": "TECH_SANITATION", + "Cost": 1070, + "UITreeRow": -1, + "EraType": "ERA_INDUSTRIAL", + "Name": "Sanitation", + }, + { + "Type": "TECH_ECONOMICS", + "Cost": 1070, + "UITreeRow": 0, + "EraType": "ERA_INDUSTRIAL", + "Name": "Economics", + }, + { + "Type": "TECH_RIFLING", + "Cost": 1070, + "UITreeRow": 2, + "EraType": "ERA_INDUSTRIAL", + "Name": "Rifling", + }, + { + "Type": "TECH_FLIGHT", + "Cost": 1250, + "UITreeRow": -2, + "EraType": "ERA_MODERN", + "Name": "Flight", + }, + { + "Type": "TECH_REPLACEABLE_PARTS", + "Cost": 1250, + "UITreeRow": 0, + "EraType": "ERA_MODERN", + "Name": "Replaceable Parts", + }, + { + "Type": "TECH_STEEL", + "Cost": 1250, + "UITreeRow": 1, + "EraType": "ERA_MODERN", + "Name": "Steel", + }, + { + "Type": "TECH_ELECTRICITY", + "Cost": 1370, + "UITreeRow": -3, + "EraType": "ERA_MODERN", + "Name": "Electricity", + }, + { + "Type": "TECH_RADIO", + "Cost": 1370, + "UITreeRow": -2, + "EraType": "ERA_MODERN", + "Name": "Radio", + }, + { + "Type": "TECH_CHEMISTRY", + "Cost": 1370, + "UITreeRow": -1, + "EraType": "ERA_MODERN", + "Name": "Chemistry", + }, + { + "Type": "TECH_COMBUSTION", + "Cost": 1370, + "UITreeRow": 2, + "EraType": "ERA_MODERN", + "Name": "Combustion", + }, + { + "Type": "TECH_ADVANCED_FLIGHT", + "Cost": 1480, + "UITreeRow": -2, + "EraType": "ERA_ATOMIC", + "Name": "Advanced Flight", + }, + { + "Type": "TECH_ROCKETRY", + "Cost": 1480, + "UITreeRow": -1, + "EraType": "ERA_ATOMIC", + "Name": "Rocketry", + }, + { + "Type": "TECH_ADVANCED_BALLISTICS", + "Cost": 1480, + "UITreeRow": 0, + "EraType": "ERA_ATOMIC", + "Name": "Advanced Ballistics", + }, + { + "Type": "TECH_COMBINED_ARMS", + "Cost": 1480, + "UITreeRow": 1, + "EraType": "ERA_ATOMIC", + "Name": "Combined Arms", + }, + { + "Type": "TECH_PLASTICS", + "Cost": 1480, + "UITreeRow": 2, + "EraType": "ERA_ATOMIC", + "Name": "Plastics", + }, + { + "Type": "TECH_COMPUTERS", + "Cost": 1660, + "UITreeRow": -3, + "EraType": "ERA_ATOMIC", + "Name": "Computers", + }, + { + "Type": "TECH_NUCLEAR_FISSION", + "Cost": 1660, + "UITreeRow": 1, + "EraType": "ERA_ATOMIC", + "Name": "Nuclear Fission", + }, + { + "Type": "TECH_SYNTHETIC_MATERIALS", + "Cost": 1660, + "UITreeRow": 2, + "EraType": "ERA_ATOMIC", + "Name": "Synthetic Materials", + }, + { + "Type": "TECH_TELECOMMUNICATIONS", + "Cost": 1850, + "UITreeRow": -3, + "EraType": "ERA_INFORMATION", + "Name": "Telecommunications", + }, + { + "Type": "TECH_SATELLITES", + "Cost": 1850, + "UITreeRow": -1, + "EraType": "ERA_INFORMATION", + "Name": "Satellites", + }, + { + "Type": "TECH_GUIDANCE_SYSTEMS", + "Cost": 1850, + "UITreeRow": 0, + "EraType": "ERA_INFORMATION", + "Name": "Guidance Systems", + }, + { + "Type": "TECH_LASERS", + "Cost": 1850, + "UITreeRow": 1, + "EraType": "ERA_INFORMATION", + "Name": "Lasers", + }, + { + "Type": "TECH_COMPOSITES", + "Cost": 1850, + "UITreeRow": 2, + "EraType": "ERA_INFORMATION", + "Name": "Composites", + }, + { + "Type": "TECH_STEALTH_TECHNOLOGY", + "Cost": 1850, + "UITreeRow": 3, + "EraType": "ERA_INFORMATION", + "Name": "Stealth Technology", + }, + { + "Type": "TECH_ROBOTICS", + "Cost": 2155, + "UITreeRow": -2, + "EraType": "ERA_INFORMATION", + "Name": "Robotics", + }, + { + "Type": "TECH_NANOTECHNOLOGY", + "Cost": 2155, + "UITreeRow": 2, + "EraType": "ERA_INFORMATION", + "Name": "Nanotechnology", + }, + { + "Type": "TECH_NUCLEAR_FUSION", + "Cost": 2155, + "UITreeRow": 1, + "EraType": "ERA_INFORMATION", + "Name": "Nuclear Fusion", + }, + { + "Type": "TECH_BUTTRESS", + "Cost": 300, + "UITreeRow": -3, + "EraType": "ERA_MEDIEVAL", + "Name": "Buttress", + }, + { + "Type": "TECH_REFINING", + "Cost": 1250, + "UITreeRow": 3, + "EraType": "ERA_MODERN", + "Name": "Refining", + }, + { + "Type": "TECH_SEASTEADS", + "Cost": 2200, + "UITreeRow": -3, + "EraType": "ERA_FUTURE", + "Name": "Seasteads", + }, + { + "Type": "TECH_ADVANCED_AI", + "Cost": 2200, + "UITreeRow": -2, + "EraType": "ERA_FUTURE", + "Name": "Advanced AI", + }, + { + "Type": "TECH_ADVANCED_POWER_CELLS", + "Cost": 2200, + "UITreeRow": -1, + "EraType": "ERA_FUTURE", + "Name": "Advanced Power Cells", + }, + { + "Type": "TECH_CYBERNETICS", + "Cost": 2200, + "UITreeRow": 0, + "EraType": "ERA_FUTURE", + "Name": "Cybernetics", + }, + { + "Type": "TECH_SMART_MATERIALS", + "Cost": 2200, + "UITreeRow": 1, + "EraType": "ERA_FUTURE", + "Name": "Smart Materials", + }, + { + "Type": "TECH_PREDICTIVE_SYSTEMS", + "Cost": 2200, + "UITreeRow": 2, + "EraType": "ERA_FUTURE", + "Name": "Predictive Systems", + }, + { + "Type": "TECH_OFFWORLD_MISSION", + "Cost": 2500, + "UITreeRow": 0, + "EraType": "ERA_FUTURE", + "Name": "Offworld Mission", + }, + { + "Type": "TECH_FUTURE_TECH", + "Cost": 2600, + "UITreeRow": 0, + "EraType": "ERA_FUTURE", + "Name": "Future Tech", + }, +] diff --git a/worlds/civ_6/data/goody_hut_rewards.py b/worlds/civ_6/data/goody_hut_rewards.py new file mode 100644 index 0000000000..8bef7d8159 --- /dev/null +++ b/worlds/civ_6/data/goody_hut_rewards.py @@ -0,0 +1,81 @@ +from typing import List +from ..ItemData import GoodyHutRewardData + + +reward_data: List[GoodyHutRewardData] = [ + { + "Type": "GOODY_GOLD_SMALL_MODIFIER", + "Rarity": "COMMON", + "Name": "Gold: Small" + }, + { + "Type": "GOODY_GOLD_MEDIUM_MODIFIER", + "Rarity": "COMMON", + "Name": "Gold: Medium" + }, + { + "Type": "GOODY_GOLD_LARGE_MODIFIER", + "Rarity": "UNCOMMON", + "Name": "Gold: Large" + }, + { + "Type": "GOODY_FAITH_SMALL_MODIFIER", + "Rarity": "COMMON", + "Name": "Faith: Small" + }, + { + "Type": "GOODY_FAITH_MEDIUM_MODIFIER", + "Rarity": "COMMON", + "Name": "Faith: Medium" + }, + { + "Type": "GOODY_FAITH_LARGE_MODIFIER", + "Rarity": "UNCOMMON", + "Name": "Faith: Large" + }, + { + "Type": "GOODY_DIPLOMACY_GRANT_FAVOR", + "Rarity": "COMMON", + "Name": "Diplomatic Favor" + }, + { + "Type": "GOODY_DIPLOMACY_GRANT_GOVERNOR_TITLE", + "Rarity": "RARE", + "Name": "Governor Title" + }, + { + "Type": "GOODY_DIPLOMACY_GRANT_ENVOY", + "Rarity": "UNCOMMON", + "Name": "Envoy" + }, + { + "Type": "GOODY_CULTURE_GRANT_ONE_RELIC", + "Rarity": "RARE", + "Name": "Relic" + }, + { + "Type": "GOODY_MILITARY_GRANT_SCOUT", + "Rarity": "UNCOMMON", + "Name": "Scout" + }, + { + "Type": "GOODY_SURVIVORS_ADD_POPULATION", + "Rarity": "UNCOMMON", + "Name": "Additional Population" + }, + { + "Type": "GOODY_SURVIVORS_GRANT_BUILDER", + "Rarity": "UNCOMMON", + "Name": "Builder" + }, + { + "Type": "GOODY_SURVIVORS_GRANT_TRADER", + "Rarity": "UNCOMMON", + "Name": "Trader" + }, + { + "Type": "GOODY_SURVIVORS_GRANT_SETTLER", + "Rarity": "UNCOMMON", + "Name": "Settler" + } +] diff --git a/worlds/civ_6/data/new_civic_prereqs.py b/worlds/civ_6/data/new_civic_prereqs.py new file mode 100644 index 0000000000..0390c2d08c --- /dev/null +++ b/worlds/civ_6/data/new_civic_prereqs.py @@ -0,0 +1,92 @@ +from typing import List + +from ..ItemData import CivicPrereqData + + +new_civic_prereqs: List[CivicPrereqData] = [ + {"Civic": "CIVIC_AP_ANCIENT_01", "PrereqCivic": "CIVIC_AP_ANCIENT_00"}, + {"Civic": "CIVIC_AP_ANCIENT_02", "PrereqCivic": "CIVIC_AP_ANCIENT_00"}, + {"Civic": "CIVIC_AP_ANCIENT_03", "PrereqCivic": "CIVIC_AP_ANCIENT_01"}, + {"Civic": "CIVIC_AP_ANCIENT_04", "PrereqCivic": "CIVIC_AP_ANCIENT_01"}, + {"Civic": "CIVIC_AP_ANCIENT_05", "PrereqCivic": "CIVIC_AP_ANCIENT_02"}, + {"Civic": "CIVIC_AP_ANCIENT_06", "PrereqCivic": "CIVIC_AP_ANCIENT_02"}, + {"Civic": "CIVIC_AP_CLASSICAL_07", "PrereqCivic": "CIVIC_AP_ANCIENT_04"}, + {"Civic": "CIVIC_AP_CLASSICAL_08", "PrereqCivic": "CIVIC_AP_ANCIENT_04"}, + {"Civic": "CIVIC_AP_CLASSICAL_08", "PrereqCivic": "CIVIC_AP_ANCIENT_05"}, + {"Civic": "CIVIC_AP_CLASSICAL_09", "PrereqCivic": "CIVIC_AP_ANCIENT_05"}, + {"Civic": "CIVIC_AP_CLASSICAL_10", "PrereqCivic": "CIVIC_AP_ANCIENT_03"}, + {"Civic": "CIVIC_AP_CLASSICAL_10", "PrereqCivic": "CIVIC_AP_CLASSICAL_07"}, + {"Civic": "CIVIC_AP_CLASSICAL_11", "PrereqCivic": "CIVIC_AP_CLASSICAL_07"}, + {"Civic": "CIVIC_AP_CLASSICAL_11", "PrereqCivic": "CIVIC_AP_CLASSICAL_08"}, + {"Civic": "CIVIC_AP_CLASSICAL_12", "PrereqCivic": "CIVIC_AP_CLASSICAL_08"}, + {"Civic": "CIVIC_AP_CLASSICAL_12", "PrereqCivic": "CIVIC_AP_CLASSICAL_09"}, + {"Civic": "CIVIC_AP_CLASSICAL_13", "PrereqCivic": "CIVIC_AP_CLASSICAL_09"}, + {"Civic": "CIVIC_AP_CLASSICAL_13", "PrereqCivic": "CIVIC_AP_ANCIENT_06"}, + {"Civic": "CIVIC_AP_MEDIEVAL_14", "PrereqCivic": "CIVIC_AP_CLASSICAL_11"}, + {"Civic": "CIVIC_AP_MEDIEVAL_15", "PrereqCivic": "CIVIC_AP_CLASSICAL_11"}, + {"Civic": "CIVIC_AP_MEDIEVAL_16", "PrereqCivic": "CIVIC_AP_CLASSICAL_11"}, + {"Civic": "CIVIC_AP_MEDIEVAL_16", "PrereqCivic": "CIVIC_AP_CLASSICAL_12"}, + {"Civic": "CIVIC_AP_MEDIEVAL_17", "PrereqCivic": "CIVIC_AP_CLASSICAL_10"}, + {"Civic": "CIVIC_AP_MEDIEVAL_17", "PrereqCivic": "CIVIC_AP_MEDIEVAL_15"}, + {"Civic": "CIVIC_AP_MEDIEVAL_18", "PrereqCivic": "CIVIC_AP_MEDIEVAL_15"}, + {"Civic": "CIVIC_AP_MEDIEVAL_19", "PrereqCivic": "CIVIC_AP_MEDIEVAL_15"}, + {"Civic": "CIVIC_AP_MEDIEVAL_19", "PrereqCivic": "CIVIC_AP_MEDIEVAL_16"}, + {"Civic": "CIVIC_AP_MEDIEVAL_20", "PrereqCivic": "CIVIC_AP_MEDIEVAL_16"}, + {"Civic": "CIVIC_AP_MEDIEVAL_20", "PrereqCivic": "CIVIC_AP_CLASSICAL_13"}, + {"Civic": "CIVIC_AP_RENAISSANCE_21", "PrereqCivic": "CIVIC_AP_MEDIEVAL_17"}, + {"Civic": "CIVIC_AP_RENAISSANCE_21", "PrereqCivic": "CIVIC_AP_MEDIEVAL_18"}, + {"Civic": "CIVIC_AP_RENAISSANCE_22", "PrereqCivic": "CIVIC_AP_MEDIEVAL_18"}, + {"Civic": "CIVIC_AP_RENAISSANCE_22", "PrereqCivic": "CIVIC_AP_MEDIEVAL_19"}, + {"Civic": "CIVIC_AP_RENAISSANCE_23", "PrereqCivic": "CIVIC_AP_MEDIEVAL_19"}, + {"Civic": "CIVIC_AP_RENAISSANCE_24", "PrereqCivic": "CIVIC_AP_MEDIEVAL_19"}, + {"Civic": "CIVIC_AP_RENAISSANCE_24", "PrereqCivic": "CIVIC_AP_MEDIEVAL_20"}, + {"Civic": "CIVIC_AP_RENAISSANCE_25", "PrereqCivic": "CIVIC_AP_RENAISSANCE_22"}, + {"Civic": "CIVIC_AP_RENAISSANCE_26", "PrereqCivic": "CIVIC_AP_RENAISSANCE_22"}, + {"Civic": "CIVIC_AP_RENAISSANCE_26", "PrereqCivic": "CIVIC_AP_RENAISSANCE_23"}, + {"Civic": "CIVIC_AP_INDUSTRIAL_27", "PrereqCivic": "CIVIC_AP_RENAISSANCE_25"}, + {"Civic": "CIVIC_AP_INDUSTRIAL_28", "PrereqCivic": "CIVIC_AP_RENAISSANCE_25"}, + {"Civic": "CIVIC_AP_INDUSTRIAL_29", "PrereqCivic": "CIVIC_AP_RENAISSANCE_26"}, + {"Civic": "CIVIC_AP_INDUSTRIAL_30", "PrereqCivic": "CIVIC_AP_RENAISSANCE_26"}, + {"Civic": "CIVIC_AP_INDUSTRIAL_31", "PrereqCivic": "CIVIC_AP_INDUSTRIAL_27"}, + {"Civic": "CIVIC_AP_INDUSTRIAL_32", "PrereqCivic": "CIVIC_AP_INDUSTRIAL_29"}, + {"Civic": "CIVIC_AP_INDUSTRIAL_33", "PrereqCivic": "CIVIC_AP_INDUSTRIAL_28"}, + {"Civic": "CIVIC_AP_INDUSTRIAL_33", "PrereqCivic": "CIVIC_AP_INDUSTRIAL_29"}, + {"Civic": "CIVIC_AP_MODERN_34", "PrereqCivic": "CIVIC_AP_INDUSTRIAL_31"}, + {"Civic": "CIVIC_AP_MODERN_37", "PrereqCivic": "CIVIC_AP_INDUSTRIAL_31"}, + {"Civic": "CIVIC_AP_MODERN_37", "PrereqCivic": "CIVIC_AP_INDUSTRIAL_33"}, + {"Civic": "CIVIC_AP_MODERN_35", "PrereqCivic": "CIVIC_AP_MODERN_37"}, + {"Civic": "CIVIC_AP_MODERN_38", "PrereqCivic": "CIVIC_AP_INDUSTRIAL_33"}, + {"Civic": "CIVIC_AP_MODERN_39", "PrereqCivic": "CIVIC_AP_MODERN_37"}, + {"Civic": "CIVIC_AP_MODERN_39", "PrereqCivic": "CIVIC_AP_MODERN_38"}, + {"Civic": "CIVIC_AP_MODERN_36", "PrereqCivic": "CIVIC_AP_MODERN_39"}, + {"Civic": "CIVIC_AP_MODERN_40", "PrereqCivic": "CIVIC_AP_MODERN_39"}, + {"Civic": "CIVIC_AP_MODERN_41", "PrereqCivic": "CIVIC_AP_MODERN_39"}, + {"Civic": "CIVIC_AP_MODERN_42", "PrereqCivic": "CIVIC_AP_MODERN_39"}, + {"Civic": "CIVIC_AP_ATOMIC_43", "PrereqCivic": "CIVIC_AP_MODERN_39"}, + {"Civic": "CIVIC_AP_ATOMIC_44", "PrereqCivic": "CIVIC_AP_MODERN_39"}, + {"Civic": "CIVIC_AP_ATOMIC_45", "PrereqCivic": "CIVIC_AP_MODERN_34"}, + {"Civic": "CIVIC_AP_ATOMIC_46", "PrereqCivic": "CIVIC_AP_ATOMIC_43"}, + {"Civic": "CIVIC_AP_ATOMIC_47", "PrereqCivic": "CIVIC_AP_ATOMIC_43"}, + {"Civic": "CIVIC_AP_INFORMATION_48", "PrereqCivic": "CIVIC_AP_ATOMIC_46"}, + {"Civic": "CIVIC_AP_INFORMATION_48", "PrereqCivic": "CIVIC_AP_ATOMIC_47"}, + {"Civic": "CIVIC_AP_INFORMATION_49", "PrereqCivic": "CIVIC_AP_ATOMIC_47"}, + {"Civic": "CIVIC_AP_INFORMATION_49", "PrereqCivic": "CIVIC_AP_ATOMIC_44"}, + {"Civic": "CIVIC_AP_FUTURE_50", "PrereqCivic": "CIVIC_AP_INFORMATION_48"}, + {"Civic": "CIVIC_AP_FUTURE_50", "PrereqCivic": "CIVIC_AP_INFORMATION_49"}, + {"Civic": "CIVIC_AP_MODERN_38", "PrereqCivic": "CIVIC_AP_INDUSTRIAL_32"}, + {"Civic": "CIVIC_AP_INFORMATION_51", "PrereqCivic": "CIVIC_AP_ATOMIC_45"}, + {"Civic": "CIVIC_AP_INFORMATION_51", "PrereqCivic": "CIVIC_AP_ATOMIC_46"}, + {"Civic": "CIVIC_AP_INFORMATION_52", "PrereqCivic": "CIVIC_AP_INFORMATION_48"}, + {"Civic": "CIVIC_AP_INFORMATION_52", "PrereqCivic": "CIVIC_AP_INFORMATION_49"}, + {"Civic": "CIVIC_AP_INFORMATION_53", "PrereqCivic": "CIVIC_AP_INFORMATION_48"}, + {"Civic": "CIVIC_AP_INFORMATION_53", "PrereqCivic": "CIVIC_AP_INFORMATION_49"}, + {"Civic": "CIVIC_AP_INFORMATION_54", "PrereqCivic": "CIVIC_AP_INFORMATION_48"}, + {"Civic": "CIVIC_AP_INFORMATION_54", "PrereqCivic": "CIVIC_AP_INFORMATION_49"}, + {"Civic": "CIVIC_AP_INFORMATION_55", "PrereqCivic": "CIVIC_AP_INFORMATION_51"}, + {"Civic": "CIVIC_AP_INFORMATION_55", "PrereqCivic": "CIVIC_AP_INFORMATION_48"}, + {"Civic": "CIVIC_AP_FUTURE_56", "PrereqCivic": "CIVIC_AP_FUTURE_50"}, + {"Civic": "CIVIC_AP_FUTURE_57", "PrereqCivic": "CIVIC_AP_FUTURE_50"}, + {"Civic": "CIVIC_AP_FUTURE_58", "PrereqCivic": "CIVIC_AP_FUTURE_50"}, + {"Civic": "CIVIC_AP_FUTURE_59", "PrereqCivic": "CIVIC_AP_FUTURE_50"}, + {"Civic": "CIVIC_AP_FUTURE_60", "PrereqCivic": "CIVIC_AP_FUTURE_50"}, +] diff --git a/worlds/civ_6/data/new_civics.py b/worlds/civ_6/data/new_civics.py new file mode 100644 index 0000000000..e232b67f5c --- /dev/null +++ b/worlds/civ_6/data/new_civics.py @@ -0,0 +1,372 @@ +from typing import List +from ..ItemData import NewItemData + + +new_civics: List[NewItemData] = [ + { + "Type": "CIVIC_AP_ANCIENT_00", + "Cost": 20, + "UITreeRow": 0, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "CIVIC_AP_ANCIENT_01", + "Cost": 40, + "UITreeRow": -2, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "CIVIC_AP_ANCIENT_02", + "Cost": 40, + "UITreeRow": 2, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "CIVIC_AP_ANCIENT_03", + "Cost": 50, + "UITreeRow": -3, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "CIVIC_AP_ANCIENT_04", + "Cost": 70, + "UITreeRow": 0, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "CIVIC_AP_ANCIENT_05", + "Cost": 70, + "UITreeRow": 1, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "CIVIC_AP_ANCIENT_06", + "Cost": 50, + "UITreeRow": 3, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "CIVIC_AP_CLASSICAL_07", + "Cost": 110, + "UITreeRow": -2, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "CIVIC_AP_CLASSICAL_08", + "Cost": 110, + "UITreeRow": 0, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "CIVIC_AP_CLASSICAL_09", + "Cost": 110, + "UITreeRow": 2, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "CIVIC_AP_CLASSICAL_10", + "Cost": 120, + "UITreeRow": -3, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "CIVIC_AP_CLASSICAL_11", + "Cost": 175, + "UITreeRow": -1, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "CIVIC_AP_CLASSICAL_12", + "Cost": 175, + "UITreeRow": 1, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "CIVIC_AP_CLASSICAL_13", + "Cost": 120, + "UITreeRow": 3, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "CIVIC_AP_MEDIEVAL_14", + "Cost": 220, + "UITreeRow": -2, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "CIVIC_AP_MEDIEVAL_15", + "Cost": 300, + "UITreeRow": -1, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "CIVIC_AP_MEDIEVAL_16", + "Cost": 300, + "UITreeRow": 1, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "CIVIC_AP_MEDIEVAL_17", + "Cost": 340, + "UITreeRow": -3, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "CIVIC_AP_MEDIEVAL_18", + "Cost": 420, + "UITreeRow": -1, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "CIVIC_AP_MEDIEVAL_19", + "Cost": 420, + "UITreeRow": 1, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "CIVIC_AP_MEDIEVAL_20", + "Cost": 340, + "UITreeRow": 3, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "CIVIC_AP_RENAISSANCE_21", + "Cost": 440, + "UITreeRow": -3, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "CIVIC_AP_RENAISSANCE_22", + "Cost": 600, + "UITreeRow": -1, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "CIVIC_AP_RENAISSANCE_23", + "Cost": 600, + "UITreeRow": 1, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "CIVIC_AP_RENAISSANCE_24", + "Cost": 440, + "UITreeRow": 3, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "CIVIC_AP_RENAISSANCE_25", + "Cost": 720, + "UITreeRow": -1, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "CIVIC_AP_RENAISSANCE_26", + "Cost": 720, + "UITreeRow": 1, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "CIVIC_AP_INDUSTRIAL_27", + "Cost": 800, + "UITreeRow": -3, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "CIVIC_AP_INDUSTRIAL_28", + "Cost": 1010, + "UITreeRow": -1, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "CIVIC_AP_INDUSTRIAL_29", + "Cost": 1010, + "UITreeRow": 0, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "CIVIC_AP_INDUSTRIAL_30", + "Cost": 800, + "UITreeRow": 2, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "CIVIC_AP_INDUSTRIAL_31", + "Cost": 1050, + "UITreeRow": -3, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "CIVIC_AP_INDUSTRIAL_32", + "Cost": 1210, + "UITreeRow": 2, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "CIVIC_AP_INDUSTRIAL_33", + "Cost": 1210, + "UITreeRow": -1, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "CIVIC_AP_MODERN_34", + "Cost": 1540, + "UITreeRow": -3, + "EraType": "ERA_MODERN", + }, + { + "Type": "CIVIC_AP_MODERN_35", + "Cost": 1580, + "UITreeRow": -2, + "EraType": "ERA_MODERN", + }, + { + "Type": "CIVIC_AP_MODERN_36", + "Cost": 1715, + "UITreeRow": -2, + "EraType": "ERA_MODERN", + }, + { + "Type": "CIVIC_AP_MODERN_37", + "Cost": 1540, + "UITreeRow": -1, + "EraType": "ERA_MODERN", + }, + { + "Type": "CIVIC_AP_MODERN_38", + "Cost": 1540, + "UITreeRow": 1, + "EraType": "ERA_MODERN", + }, + { + "Type": "CIVIC_AP_MODERN_39", + "Cost": 1640, + "UITreeRow": -1, + "EraType": "ERA_MODERN", + }, + { + "Type": "CIVIC_AP_MODERN_40", + "Cost": 1640, + "UITreeRow": 0, + "EraType": "ERA_MODERN", + }, + { + "Type": "CIVIC_AP_MODERN_41", + "Cost": 1640, + "UITreeRow": 2, + "EraType": "ERA_MODERN", + }, + { + "Type": "CIVIC_AP_MODERN_42", + "Cost": 1640, + "UITreeRow": 3, + "EraType": "ERA_MODERN", + }, + { + "Type": "CIVIC_AP_ATOMIC_43", + "Cost": 2185, + "UITreeRow": -1, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "CIVIC_AP_ATOMIC_44", + "Cost": 2185, + "UITreeRow": 2, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "CIVIC_AP_ATOMIC_45", + "Cost": 1955, + "UITreeRow": -3, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "CIVIC_AP_ATOMIC_46", + "Cost": 2415, + "UITreeRow": -1, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "CIVIC_AP_ATOMIC_47", + "Cost": 2415, + "UITreeRow": 1, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "CIVIC_AP_INFORMATION_48", + "Cost": 2880, + "UITreeRow": 0, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "CIVIC_AP_INFORMATION_49", + "Cost": 2880, + "UITreeRow": 2, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "CIVIC_AP_FUTURE_50", + "Cost": 3200, + "UITreeRow": 3, + "EraType": "ERA_FUTURE", + }, + { + "Type": "CIVIC_AP_INFORMATION_51", + "Cost": 2880, + "UITreeRow": -2, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "CIVIC_AP_INFORMATION_52", + "Cost": 3000, + "UITreeRow": 0, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "CIVIC_AP_INFORMATION_53", + "Cost": 3000, + "UITreeRow": 1, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "CIVIC_AP_INFORMATION_54", + "Cost": 3000, + "UITreeRow": 2, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "CIVIC_AP_INFORMATION_55", + "Cost": 3100, + "UITreeRow": -1, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "CIVIC_AP_FUTURE_56", + "Cost": 3200, + "UITreeRow": -2, + "EraType": "ERA_FUTURE", + }, + { + "Type": "CIVIC_AP_FUTURE_57", + "Cost": 3200, + "UITreeRow": -1, + "EraType": "ERA_FUTURE", + }, + { + "Type": "CIVIC_AP_FUTURE_58", + "Cost": 3200, + "UITreeRow": 0, + "EraType": "ERA_FUTURE", + }, + { + "Type": "CIVIC_AP_FUTURE_59", + "Cost": 3200, + "UITreeRow": 1, + "EraType": "ERA_FUTURE", + }, + { + "Type": "CIVIC_AP_FUTURE_60", + "Cost": 3200, + "UITreeRow": 2, + "EraType": "ERA_FUTURE", + }, +] diff --git a/worlds/civ_6/data/new_tech.py b/worlds/civ_6/data/new_tech.py new file mode 100644 index 0000000000..2810bd231d --- /dev/null +++ b/worlds/civ_6/data/new_tech.py @@ -0,0 +1,468 @@ +from typing import List +from ..ItemData import NewItemData + + +new_tech: List[NewItemData] = [ + { + "Type": "TECH_AP_ANCIENT_00", + "Cost": 25, + "UITreeRow": 0, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "TECH_AP_ANCIENT_01", + "Cost": 25, + "UITreeRow": 1, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "TECH_AP_ANCIENT_02", + "Cost": 25, + "UITreeRow": 3, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "TECH_AP_ANCIENT_03", + "Cost": 50, + "UITreeRow": -3, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "TECH_AP_ANCIENT_04", + "Cost": 50, + "UITreeRow": -2, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "TECH_AP_ANCIENT_05", + "Cost": 50, + "UITreeRow": -1, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "TECH_AP_ANCIENT_06", + "Cost": 50, + "UITreeRow": 1, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "TECH_AP_ANCIENT_07", + "Cost": 50, + "UITreeRow": 0, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "TECH_AP_ANCIENT_08", + "Cost": 80, + "UITreeRow": 2, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "TECH_AP_ANCIENT_09", + "Cost": 80, + "UITreeRow": 3, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "TECH_AP_ANCIENT_10", + "Cost": 80, + "UITreeRow": 4, + "EraType": "ERA_ANCIENT", + }, + { + "Type": "TECH_AP_CLASSICAL_11", + "Cost": 120, + "UITreeRow": -2, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "TECH_AP_CLASSICAL_12", + "Cost": 120, + "UITreeRow": 0, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "TECH_AP_CLASSICAL_13", + "Cost": 120, + "UITreeRow": 1, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "TECH_AP_CLASSICAL_14", + "Cost": 120, + "UITreeRow": 3, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "TECH_AP_CLASSICAL_15", + "Cost": 200, + "UITreeRow": -3, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "TECH_AP_CLASSICAL_16", + "Cost": 200, + "UITreeRow": -1, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "TECH_AP_CLASSICAL_17", + "Cost": 200, + "UITreeRow": 2, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "TECH_AP_CLASSICAL_18", + "Cost": 200, + "UITreeRow": 4, + "EraType": "ERA_CLASSICAL", + }, + { + "Type": "TECH_AP_MEDIEVAL_19", + "Cost": 300, + "UITreeRow": -2, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "TECH_AP_MEDIEVAL_20", + "Cost": 300, + "UITreeRow": 0, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "TECH_AP_MEDIEVAL_21", + "Cost": 300, + "UITreeRow": 4, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "TECH_AP_MEDIEVAL_22", + "Cost": 390, + "UITreeRow": -1, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "TECH_AP_MEDIEVAL_23", + "Cost": 390, + "UITreeRow": 1, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "TECH_AP_MEDIEVAL_24", + "Cost": 390, + "UITreeRow": 2, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "TECH_AP_MEDIEVAL_25", + "Cost": 390, + "UITreeRow": 3, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "TECH_AP_RENAISSANCE_26", + "Cost": 600, + "UITreeRow": -3, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "TECH_AP_RENAISSANCE_27", + "Cost": 600, + "UITreeRow": -2, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "TECH_AP_RENAISSANCE_28", + "Cost": 600, + "UITreeRow": 0, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "TECH_AP_RENAISSANCE_29", + "Cost": 600, + "UITreeRow": 1, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "TECH_AP_RENAISSANCE_30", + "Cost": 600, + "UITreeRow": 4, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "TECH_AP_RENAISSANCE_31", + "Cost": 730, + "UITreeRow": -3, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "TECH_AP_RENAISSANCE_32", + "Cost": 730, + "UITreeRow": -1, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "TECH_AP_RENAISSANCE_33", + "Cost": 730, + "UITreeRow": 1, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "TECH_AP_RENAISSANCE_34", + "Cost": 730, + "UITreeRow": 3, + "EraType": "ERA_RENAISSANCE", + }, + { + "Type": "TECH_AP_INDUSTRIAL_35", + "Cost": 930, + "UITreeRow": -2, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "TECH_AP_INDUSTRIAL_36", + "Cost": 930, + "UITreeRow": -1, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "TECH_AP_INDUSTRIAL_37", + "Cost": 930, + "UITreeRow": 1, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "TECH_AP_INDUSTRIAL_38", + "Cost": 930, + "UITreeRow": 3, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "TECH_AP_INDUSTRIAL_39", + "Cost": 1070, + "UITreeRow": -3, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "TECH_AP_INDUSTRIAL_40", + "Cost": 1070, + "UITreeRow": -1, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "TECH_AP_INDUSTRIAL_41", + "Cost": 1070, + "UITreeRow": 0, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "TECH_AP_INDUSTRIAL_42", + "Cost": 1070, + "UITreeRow": 2, + "EraType": "ERA_INDUSTRIAL", + }, + { + "Type": "TECH_AP_MODERN_43", + "Cost": 1250, + "UITreeRow": -2, + "EraType": "ERA_MODERN", + }, + { + "Type": "TECH_AP_MODERN_44", + "Cost": 1250, + "UITreeRow": 0, + "EraType": "ERA_MODERN", + }, + { + "Type": "TECH_AP_MODERN_45", + "Cost": 1250, + "UITreeRow": 1, + "EraType": "ERA_MODERN", + }, + { + "Type": "TECH_AP_MODERN_46", + "Cost": 1370, + "UITreeRow": -3, + "EraType": "ERA_MODERN", + }, + { + "Type": "TECH_AP_MODERN_47", + "Cost": 1370, + "UITreeRow": -2, + "EraType": "ERA_MODERN", + }, + { + "Type": "TECH_AP_MODERN_48", + "Cost": 1370, + "UITreeRow": -1, + "EraType": "ERA_MODERN", + }, + { + "Type": "TECH_AP_MODERN_49", + "Cost": 1370, + "UITreeRow": 2, + "EraType": "ERA_MODERN", + }, + { + "Type": "TECH_AP_ATOMIC_50", + "Cost": 1480, + "UITreeRow": -2, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "TECH_AP_ATOMIC_51", + "Cost": 1480, + "UITreeRow": -1, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "TECH_AP_ATOMIC_52", + "Cost": 1480, + "UITreeRow": 0, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "TECH_AP_ATOMIC_53", + "Cost": 1480, + "UITreeRow": 1, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "TECH_AP_ATOMIC_54", + "Cost": 1480, + "UITreeRow": 2, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "TECH_AP_ATOMIC_55", + "Cost": 1660, + "UITreeRow": -3, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "TECH_AP_ATOMIC_56", + "Cost": 1660, + "UITreeRow": 1, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "TECH_AP_ATOMIC_57", + "Cost": 1660, + "UITreeRow": 2, + "EraType": "ERA_ATOMIC", + }, + { + "Type": "TECH_AP_INFORMATION_58", + "Cost": 1850, + "UITreeRow": -3, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "TECH_AP_INFORMATION_59", + "Cost": 1850, + "UITreeRow": -1, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "TECH_AP_INFORMATION_60", + "Cost": 1850, + "UITreeRow": 0, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "TECH_AP_INFORMATION_61", + "Cost": 1850, + "UITreeRow": 1, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "TECH_AP_INFORMATION_62", + "Cost": 1850, + "UITreeRow": 2, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "TECH_AP_INFORMATION_63", + "Cost": 1850, + "UITreeRow": 3, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "TECH_AP_INFORMATION_64", + "Cost": 2155, + "UITreeRow": -2, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "TECH_AP_INFORMATION_65", + "Cost": 2155, + "UITreeRow": 2, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "TECH_AP_INFORMATION_66", + "Cost": 2155, + "UITreeRow": 1, + "EraType": "ERA_INFORMATION", + }, + { + "Type": "TECH_AP_MEDIEVAL_67", + "Cost": 300, + "UITreeRow": -3, + "EraType": "ERA_MEDIEVAL", + }, + { + "Type": "TECH_AP_MODERN_68", + "Cost": 1250, + "UITreeRow": 3, + "EraType": "ERA_MODERN", + }, + { + "Type": "TECH_AP_FUTURE_69", + "Cost": 2200, + "UITreeRow": -3, + "EraType": "ERA_FUTURE", + }, + { + "Type": "TECH_AP_FUTURE_70", + "Cost": 2200, + "UITreeRow": -2, + "EraType": "ERA_FUTURE", + }, + { + "Type": "TECH_AP_FUTURE_71", + "Cost": 2200, + "UITreeRow": -1, + "EraType": "ERA_FUTURE", + }, + { + "Type": "TECH_AP_FUTURE_72", + "Cost": 2200, + "UITreeRow": 0, + "EraType": "ERA_FUTURE", + }, + { + "Type": "TECH_AP_FUTURE_73", + "Cost": 2200, + "UITreeRow": 1, + "EraType": "ERA_FUTURE", + }, + { + "Type": "TECH_AP_FUTURE_74", + "Cost": 2200, + "UITreeRow": 2, + "EraType": "ERA_FUTURE", + }, + { + "Type": "TECH_AP_FUTURE_75", + "Cost": 2500, + "UITreeRow": 0, + "EraType": "ERA_FUTURE", + }, + { + "Type": "TECH_AP_FUTURE_76", + "Cost": 2600, + "UITreeRow": 0, + "EraType": "ERA_FUTURE", + }, +] diff --git a/worlds/civ_6/data/new_tech_prereqs.py b/worlds/civ_6/data/new_tech_prereqs.py new file mode 100644 index 0000000000..222100c229 --- /dev/null +++ b/worlds/civ_6/data/new_tech_prereqs.py @@ -0,0 +1,110 @@ +from typing import List + +from ..ItemData import TechPrereqData + + +new_tech_prereqs: List[TechPrereqData] = [ + {"Technology": "TECH_AP_ANCIENT_06", "PrereqTech": "TECH_AP_ANCIENT_01"}, + {"Technology": "TECH_AP_ANCIENT_07", "PrereqTech": "TECH_AP_ANCIENT_00"}, + {"Technology": "TECH_AP_ANCIENT_05", "PrereqTech": "TECH_AP_ANCIENT_00"}, + {"Technology": "TECH_AP_ANCIENT_08", "PrereqTech": "TECH_AP_ANCIENT_02"}, + {"Technology": "TECH_AP_ANCIENT_09", "PrereqTech": "TECH_AP_ANCIENT_02"}, + {"Technology": "TECH_AP_ANCIENT_10", "PrereqTech": "TECH_AP_ANCIENT_02"}, + {"Technology": "TECH_AP_CLASSICAL_15", "PrereqTech": "TECH_AP_ANCIENT_03"}, + {"Technology": "TECH_AP_CLASSICAL_11", "PrereqTech": "TECH_AP_ANCIENT_03"}, + {"Technology": "TECH_AP_CLASSICAL_11", "PrereqTech": "TECH_AP_ANCIENT_04"}, + {"Technology": "TECH_AP_CLASSICAL_12", "PrereqTech": "TECH_AP_ANCIENT_07"}, + {"Technology": "TECH_AP_CLASSICAL_13", "PrereqTech": "TECH_AP_ANCIENT_06"}, + {"Technology": "TECH_AP_CLASSICAL_14", "PrereqTech": "TECH_AP_ANCIENT_09"}, + {"Technology": "TECH_AP_CLASSICAL_16", "PrereqTech": "TECH_AP_CLASSICAL_12"}, + {"Technology": "TECH_AP_CLASSICAL_17", "PrereqTech": "TECH_AP_ANCIENT_08"}, + {"Technology": "TECH_AP_CLASSICAL_17", "PrereqTech": "TECH_AP_CLASSICAL_13"}, + {"Technology": "TECH_AP_CLASSICAL_18", "PrereqTech": "TECH_AP_ANCIENT_10"}, + {"Technology": "TECH_AP_MEDIEVAL_19", "PrereqTech": "TECH_AP_CLASSICAL_16"}, + {"Technology": "TECH_AP_MEDIEVAL_20", "PrereqTech": "TECH_AP_CLASSICAL_12"}, + {"Technology": "TECH_AP_MEDIEVAL_20", "PrereqTech": "TECH_AP_CLASSICAL_13"}, + {"Technology": "TECH_AP_MEDIEVAL_23", "PrereqTech": "TECH_AP_CLASSICAL_13"}, + {"Technology": "TECH_AP_MEDIEVAL_21", "PrereqTech": "TECH_AP_CLASSICAL_14"}, + {"Technology": "TECH_AP_MEDIEVAL_21", "PrereqTech": "TECH_AP_CLASSICAL_18"}, + {"Technology": "TECH_AP_MEDIEVAL_22", "PrereqTech": "TECH_AP_CLASSICAL_16"}, + {"Technology": "TECH_AP_MEDIEVAL_22", "PrereqTech": "TECH_AP_MEDIEVAL_20"}, + {"Technology": "TECH_AP_MEDIEVAL_25", "PrereqTech": "TECH_AP_CLASSICAL_17"}, + {"Technology": "TECH_AP_MEDIEVAL_24", "PrereqTech": "TECH_AP_CLASSICAL_17"}, + {"Technology": "TECH_AP_RENAISSANCE_27", "PrereqTech": "TECH_AP_MEDIEVAL_22"}, + {"Technology": "TECH_AP_RENAISSANCE_28", "PrereqTech": "TECH_AP_MEDIEVAL_22"}, + {"Technology": "TECH_AP_RENAISSANCE_28", "PrereqTech": "TECH_AP_MEDIEVAL_23"}, + {"Technology": "TECH_AP_RENAISSANCE_29", "PrereqTech": "TECH_AP_MEDIEVAL_20"}, + {"Technology": "TECH_AP_RENAISSANCE_29", "PrereqTech": "TECH_AP_MEDIEVAL_23"}, + {"Technology": "TECH_AP_RENAISSANCE_29", "PrereqTech": "TECH_AP_MEDIEVAL_24"}, + {"Technology": "TECH_AP_RENAISSANCE_30", "PrereqTech": "TECH_AP_MEDIEVAL_21"}, + {"Technology": "TECH_AP_RENAISSANCE_31", "PrereqTech": "TECH_AP_RENAISSANCE_26"}, + {"Technology": "TECH_AP_RENAISSANCE_32", "PrereqTech": "TECH_AP_MEDIEVAL_22"}, + {"Technology": "TECH_AP_RENAISSANCE_33", "PrereqTech": "TECH_AP_RENAISSANCE_29"}, + {"Technology": "TECH_AP_RENAISSANCE_34", "PrereqTech": "TECH_AP_MEDIEVAL_25"}, + {"Technology": "TECH_AP_INDUSTRIAL_35", "PrereqTech": "TECH_AP_RENAISSANCE_31"}, + {"Technology": "TECH_AP_INDUSTRIAL_35", "PrereqTech": "TECH_AP_RENAISSANCE_27"}, + {"Technology": "TECH_AP_INDUSTRIAL_36", "PrereqTech": "TECH_AP_RENAISSANCE_32"}, + {"Technology": "TECH_AP_INDUSTRIAL_36", "PrereqTech": "TECH_AP_RENAISSANCE_28"}, + {"Technology": "TECH_AP_INDUSTRIAL_41", "PrereqTech": "TECH_AP_INDUSTRIAL_36"}, + {"Technology": "TECH_AP_INDUSTRIAL_41", "PrereqTech": "TECH_AP_RENAISSANCE_33"}, + {"Technology": "TECH_AP_INDUSTRIAL_38", "PrereqTech": "TECH_AP_RENAISSANCE_34"}, + {"Technology": "TECH_AP_INDUSTRIAL_38", "PrereqTech": "TECH_AP_RENAISSANCE_30"}, + {"Technology": "TECH_AP_INDUSTRIAL_39", "PrereqTech": "TECH_AP_INDUSTRIAL_35"}, + {"Technology": "TECH_AP_INDUSTRIAL_40", "PrereqTech": "TECH_AP_INDUSTRIAL_36"}, + {"Technology": "TECH_AP_INDUSTRIAL_37", "PrereqTech": "TECH_AP_RENAISSANCE_33"}, + {"Technology": "TECH_AP_INDUSTRIAL_42", "PrereqTech": "TECH_AP_INDUSTRIAL_37"}, + {"Technology": "TECH_AP_INDUSTRIAL_42", "PrereqTech": "TECH_AP_INDUSTRIAL_38"}, + {"Technology": "TECH_AP_MODERN_43", "PrereqTech": "TECH_AP_INDUSTRIAL_35"}, + {"Technology": "TECH_AP_MODERN_43", "PrereqTech": "TECH_AP_INDUSTRIAL_36"}, + {"Technology": "TECH_AP_MODERN_44", "PrereqTech": "TECH_AP_INDUSTRIAL_41"}, + {"Technology": "TECH_AP_MODERN_45", "PrereqTech": "TECH_AP_INDUSTRIAL_42"}, + {"Technology": "TECH_AP_MODERN_46", "PrereqTech": "TECH_AP_INDUSTRIAL_39"}, + {"Technology": "TECH_AP_MODERN_47", "PrereqTech": "TECH_AP_INDUSTRIAL_39"}, + {"Technology": "TECH_AP_MODERN_47", "PrereqTech": "TECH_AP_MODERN_43"}, + {"Technology": "TECH_AP_MODERN_48", "PrereqTech": "TECH_AP_INDUSTRIAL_40"}, + {"Technology": "TECH_AP_MODERN_49", "PrereqTech": "TECH_AP_MODERN_45"}, + {"Technology": "TECH_AP_ATOMIC_55", "PrereqTech": "TECH_AP_MODERN_46"}, + {"Technology": "TECH_AP_ATOMIC_55", "PrereqTech": "TECH_AP_MODERN_47"}, + {"Technology": "TECH_AP_ATOMIC_50", "PrereqTech": "TECH_AP_MODERN_47"}, + {"Technology": "TECH_AP_ATOMIC_51", "PrereqTech": "TECH_AP_MODERN_47"}, + {"Technology": "TECH_AP_ATOMIC_51", "PrereqTech": "TECH_AP_MODERN_48"}, + {"Technology": "TECH_AP_ATOMIC_52", "PrereqTech": "TECH_AP_MODERN_44"}, + {"Technology": "TECH_AP_ATOMIC_52", "PrereqTech": "TECH_AP_MODERN_45"}, + {"Technology": "TECH_AP_ATOMIC_53", "PrereqTech": "TECH_AP_MODERN_45"}, + {"Technology": "TECH_AP_ATOMIC_53", "PrereqTech": "TECH_AP_MODERN_49"}, + {"Technology": "TECH_AP_ATOMIC_56", "PrereqTech": "TECH_AP_ATOMIC_52"}, + {"Technology": "TECH_AP_ATOMIC_56", "PrereqTech": "TECH_AP_ATOMIC_53"}, + {"Technology": "TECH_AP_ATOMIC_54", "PrereqTech": "TECH_AP_MODERN_49"}, + {"Technology": "TECH_AP_ATOMIC_57", "PrereqTech": "TECH_AP_ATOMIC_54"}, + {"Technology": "TECH_AP_INFORMATION_58", "PrereqTech": "TECH_AP_ATOMIC_55"}, + {"Technology": "TECH_AP_INFORMATION_64", "PrereqTech": "TECH_AP_ATOMIC_55"}, + {"Technology": "TECH_AP_INFORMATION_59", "PrereqTech": "TECH_AP_ATOMIC_50"}, + {"Technology": "TECH_AP_INFORMATION_59", "PrereqTech": "TECH_AP_ATOMIC_51"}, + {"Technology": "TECH_AP_INFORMATION_60", "PrereqTech": "TECH_AP_ATOMIC_51"}, + {"Technology": "TECH_AP_INFORMATION_60", "PrereqTech": "TECH_AP_ATOMIC_52"}, + {"Technology": "TECH_AP_INFORMATION_61", "PrereqTech": "TECH_AP_ATOMIC_56"}, + {"Technology": "TECH_AP_INFORMATION_62", "PrereqTech": "TECH_AP_ATOMIC_57"}, + {"Technology": "TECH_AP_INFORMATION_63", "PrereqTech": "TECH_AP_ATOMIC_57"}, + {"Technology": "TECH_AP_INFORMATION_65", "PrereqTech": "TECH_AP_INFORMATION_62"}, + {"Technology": "TECH_AP_INFORMATION_66", "PrereqTech": "TECH_AP_INFORMATION_61"}, + {"Technology": "TECH_AP_MEDIEVAL_67", "PrereqTech": "TECH_AP_CLASSICAL_15"}, + {"Technology": "TECH_AP_MEDIEVAL_67", "PrereqTech": "TECH_AP_CLASSICAL_16"}, + {"Technology": "TECH_AP_MEDIEVAL_23", "PrereqTech": "TECH_AP_MEDIEVAL_20"}, + {"Technology": "TECH_AP_MODERN_68", "PrereqTech": "TECH_AP_INDUSTRIAL_42"}, + {"Technology": "TECH_AP_MODERN_49", "PrereqTech": "TECH_AP_MODERN_68"}, + {"Technology": "TECH_AP_RENAISSANCE_26", "PrereqTech": "TECH_AP_MEDIEVAL_67"}, + {"Technology": "TECH_AP_RENAISSANCE_27", "PrereqTech": "TECH_AP_MEDIEVAL_67"}, + {"Technology": "TECH_AP_RENAISSANCE_27", "PrereqTech": "TECH_AP_MEDIEVAL_19"}, + {"Technology": "TECH_AP_MODERN_48", "PrereqTech": "TECH_AP_MODERN_44"}, + {"Technology": "TECH_AP_INFORMATION_64", "PrereqTech": "TECH_AP_INFORMATION_59"}, + {"Technology": "TECH_AP_INFORMATION_64", "PrereqTech": "TECH_AP_INFORMATION_60"}, + {"Technology": "TECH_AP_INFORMATION_64", "PrereqTech": "TECH_AP_INFORMATION_61"}, + {"Technology": "TECH_AP_FUTURE_69", "PrereqTech": "TECH_AP_AP60"}, + {"Technology": "TECH_AP_FUTURE_70", "PrereqTech": "TECH_AP_AP60"}, + {"Technology": "TECH_AP_FUTURE_71", "PrereqTech": "TECH_AP_AP60"}, + {"Technology": "TECH_AP_FUTURE_72", "PrereqTech": "TECH_AP_AP60"}, + {"Technology": "TECH_AP_FUTURE_73", "PrereqTech": "TECH_AP_AP60"}, + {"Technology": "TECH_AP_FUTURE_74", "PrereqTech": "TECH_AP_AP60"}, + {"Technology": "TECH_AP_FUTURE_75", "PrereqTech": "TECH_AP_AP60"}, + {"Technology": "TECH_AP_FUTURE_76", "PrereqTech": "TECH_AP_AP60"}, +] diff --git a/worlds/civ_6/data/progressive_districts.py b/worlds/civ_6/data/progressive_districts.py new file mode 100644 index 0000000000..e75fbc6168 --- /dev/null +++ b/worlds/civ_6/data/progressive_districts.py @@ -0,0 +1,41 @@ +from typing import Dict, List + + +progressive_districts: Dict[str, List[str]] = { + "PROGRESSIVE_CAMPUS": ["TECH_WRITING", "TECH_EDUCATION", "TECH_CHEMISTRY"], + "PROGRESSIVE_THEATER": ["CIVIC_DRAMA_POETRY", "CIVIC_HUMANISM", "TECH_RADIO"], + "PROGRESSIVE_HOLY_SITE": ["TECH_ASTROLOGY", "CIVIC_THEOLOGY"], + "PROGRESSIVE_ENCAMPMENT": [ + "TECH_BRONZE_WORKING", + "TECH_MILITARY_ENGINEERING", + "TECH_MILITARY_SCIENCE", + ], + "PROGRESSIVE_COMMERCIAL_HUB": ["TECH_CURRENCY", "TECH_BANKING", "TECH_ECONOMICS"], + "PROGRESSIVE_HARBOR": ["TECH_CELESTIAL_NAVIGATION", "TECH_MASS_PRODUCTION"], + "PROGRESSIVE_INDUSTRIAL_ZONE": [ + "TECH_APPRENTICESHIP", + "TECH_INDUSTRIALIZATION", + "TECH_ELECTRICITY", + "TECH_NUCLEAR_FISSION", + ], + "PROGRESSIVE_PRESERVE": ["CIVIC_MYSTICISM", "CIVIC_CONSERVATION"], + "PROGRESSIVE_ENTERTAINMENT_COMPLEX": [ + "CIVIC_GAMES_RECREATION", + "CIVIC_NATURAL_HISTORY", + "CIVIC_PROFESSIONAL_SPORTS", + ], + "PROGRESSIVE_NEIGHBORHOOD": [ + "CIVIC_URBANIZATION", + "TECH_REPLACEABLE_PARTS", + "CIVIC_CAPITALISM", + ], + "PROGRESSIVE_AERODROME": ["TECH_FLIGHT", "TECH_ADVANCED_FLIGHT"], + "PROGRESSIVE_DIPLOMATIC_QUARTER": ["TECH_MATHEMATICS", "CIVIC_DIPLOMATIC_SERVICE"], + "PROGRESSIVE_SPACE_PORT": [ + "TECH_ROCKETRY", + "TECH_SATELLITES", + "TECH_NANOTECHNOLOGY", + "TECH_SMART_MATERIALS", + "TECH_OFFWORLD_MISSION", + ], +} diff --git a/worlds/civ_6/docs/en_Civilization VI.md b/worlds/civ_6/docs/en_Civilization VI.md new file mode 100644 index 0000000000..3b1fbbdb05 --- /dev/null +++ b/worlds/civ_6/docs/en_Civilization VI.md @@ -0,0 +1,59 @@ +# Civilization 6 Archipelago + +## What does randomization do to this game? + +In Civilization VI, the tech and civic trees are both shuffled. This presents some interesting ways to play the game in a non-standard way. If you are feeling adventurous, you can enable the "boostsanity" option in order to really change up the way you normally would play a Civ game. Details on the option can be found in the [Boostsanity](#boostsanity) section below. + +There are a few changes that the Archipelago mod introduces in order to make this playable/fun. These are detailed in the [__FAQ__](#faqs) section below. + +## What is the goal of Civilization VI when randomized? +The goal of randomized Civilization VI remains the same. Pursue any victory type you have enabled in your game settings, the one you normally go for may or may not be feasible based on how things have been changed up! + +## Which items can be in another player's world? +All technologies and civics can be found in another player's world. + +## What does another world's item look like in Civilization VI? +Each item from another world is represented as a researchable tech/civic in your normal tech/civic trees. + +## When the player receives an item, what happens? +A short period after receiving an item, you will get a notification indicating you have discovered the relevant tech/civic. You will also get the regular popup that details what the given item has unlocked for you. + +## FAQs +- Do I need the DLC to play this? + - Yes, you need both Rise & Fall and Gathering Storm. +- Does this work with Multiplayer? + - It does not and, despite my best efforts, probably won't until there's a new way for external programs to be able to interact with the game. +- Does my mod that reskins Barbarians as various Pro Wrestlers work with this? + - Only one way to find out! Any mods that modify techs/civics will most likely cause issues, though. +- "Help! I can't see any of the items that have been sent to me!" + - Both trees by default will show you the researchable Archipelago locations. To view the normal tree, you can click "Toggle Archipelago Tree" in the top-left corner of the tree view. +- "Oh no! I received the Machinery tech and now instead of getting an Archer next turn, I have to wait an additional 10 turns to get a Crossbowman!" + - Vanilla prevents you from building units of the same class from an earlier tech level after you have researched a later variant. For example, this could be problematic if someone unlocks Crossbowmen for you right out the gate since you won't be able to make Archers (which have a much lower production cost). +Solution: You can now go in to the tech tree, click "Toggle Archipelago Tree" to view your unlocked techs, and then can click any tech you have unlocked to toggle whether it is currently active or not. +- "How does DeathLink work? Am I going to have to start a new game every time one of my friends dies?" + - Heavens no, my fellow Archipelago appreciator. When configuring your Archipelago options for Civilization on the options page, there are several choices available for you to fine tune the way you'd like to be punished for the follies of your friends. These include: Having a random unit destroyed, losing a percentage of gold or faith, or even losing a point on your era score. If you can't make up your mind, you can elect to have any of them be selected every time a death link is sent your way. + In the event you lose one of your units in combat (this means captured units don't count), then you will send a death link event to the rest of your friends. + +- I enabled `progressive districts` but I have no idea what tech or civic a progressive district unlocks for me! + - Any technology or civic that grants you a new building in a district (or grants you the district itself) is now locked behind a progressive item. For example, `PROGRESSIVE_CAMPUS` would give you these items in the following order: + 1. `TECH_WRITING` + 2. `TECH_EDUCATION` + 3. `TECH_CHEMISTRY` + - If you want to see the details around each item, you can review [this file](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/civ_6/data/progressive_districts.json). + +## Boostsanity +Boostsanity takes all of the Eureka & Inspiration events and makes them location checks. This feature is the one to change up the way Civilization is played in an AP multiworld/randomizer. What normally are mundane tasks that are passively collected now become a novel and interesting bucket list that you need to pay attention to in order to unlock items for yourself and others! +Boosts have logic associated with them in order to verify you can always reach the ones you need to, when you need to. One side effect of this is that when boostsanity is enabled, some previously "Useful" items are now flagged as "Progression" (Urbanization, Pottery, The Wheel, to name a few). + +### Boostsanity FAQs +- Someone sent me a tech/civic, and I'm worried I won't be able to boost it anymore! + - Fear not! Through a lot of wizardry 🧙‍♂️ you can boost civics/techs that have already been received. Additionally, the UI has been updated to show you whether they have been boosted or not after receiving them. +- I need to kill a unit with a slinger/archer/musketman or some other obsolete unit I can't build anymore, how can I do this? + - Don't forget you can go into the Tech Tree and click on a Vanilla tech you've received in order to toggle it on/off. This is necessary in order to pursue some of the boosts if you receive techs in certain orders. +- Something happened, and I'm not able to unlock the boost due to game rules! + - A few scenarios you may worry about: "Found a religion", "Make an alliance with another player", "Develop an alliance to level 2", "Build a wonder from X Era", to name a few. Any boost that is "miss-able" has been flagged as an "Excluded" location and will not ever receive a progression item. For a list of how each boost is flagged, take a look [here](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/civ_6/data/boosts.json). +- I'm worried that my `PROGRESSIVE_ERA` item is going to be stuck in a boost I won't have time to complete before my maximum unlocked era ends! + - The unpredictable timing of boosts and unlocking them can occasionally lead to scenarios where you'll have to first encounter a locked era defeat and then load a previous save. To help reduce the frequency of this, local `PROGRESSIVE_ERA` items will never be located at a boost check. +- There's too many boosts, how will I know which one's I should focus on?! + - In order to give a little more focus to all the boosts rather than just arbitrarily picking them at random, items in both of the vanilla trees will now have an advisor icon on them if its associated boost contains a progression item. + diff --git a/worlds/civ_6/docs/setup_en.md b/worlds/civ_6/docs/setup_en.md new file mode 100644 index 0000000000..09f6ff55c5 --- /dev/null +++ b/worlds/civ_6/docs/setup_en.md @@ -0,0 +1,51 @@ +# Setup Guide for Civilization VI Archipelago + +This guide is meant to help you get up and running with Civilization VI in Archipelago. Note that this requires you to have both Rise & Fall and Gathering Storm installed. This will not work unless both of those DLCs are enabled. + +## Requirements + +The following are required in order to play Civ VI in Archipelago: + +- Windows OS (Firaxis does not support the necessary tooling for Mac, or Linux) + +- Installed [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) v0.4.5 or higher. + +- The latest version of the [Civ VI AP Mod](https://github.com/hesto2/civilization_archipelago_mod/releases/latest). + +## Enabling the tuner + +Depending on how you installed Civ 6 you will have to navigate to one of the following: + +- `YOUR_USER/Documents/My Games/Sid Meier's Civilization VI/AppOptions.txt` +- `YOUR_USER/AppData/Local/Firaxis Games/Sid Meier's Civilization VI/AppOptions.txt` + +Once you have located your `AppOptions.txt`, do a search for `Enable FireTuner`. Set `EnableTuner` to `1` instead of `0`. **NOTE**: While this is active, achievements will be disabled. + +## Mod Installation + +1. Download and unzip the latest release of the mod from [GitHub](https://github.com/hesto2/civilization_archipelago_mod/releases/latest). + +2. Copy the folder containing the mod files to your Civ VI mods folder. On Windows, this is usually located at `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods`. + +3. After the Archipelago host generates a game, you should be given a `.apcivvi` file. Associate the file with the Archipelago Launcher and double click it. + +4. Copy the contents of the new folder it generates (it will have the same name as the `.apcivvi` file) into your Civilization VI Archipelago Mod folder. + +5. Your finished mod folder should look something like this: + +- Civ VI Mods Directory + - civilization_archipelago_mod + - NewItems.xml + - InitOptions.lua + - Archipelago.modinfo + - All the other mod files, etc. + +## Configuring your game + +When configuring your game, make sure to start the game in the Ancient Era and leave all settings related to starting technologies and civics as the defaults. Other than that, configure difficulty, AI, etc. as you normally would. + +## Troubleshooting + +- If you are getting an error: "The remote computer refused the network connection", or something else related to the client (or tuner) not being able to connect, it likely indicates the tuner is not actually enabled. One simple way to verify that it is enabled is, after completing the setup steps, go to Main Menu → Options → Look for an option named "Tuner" and verify it is set to "Enabled" + +- If your game gets in a state where someone has sent you items or you have sent locations but these are not correctly sent to the multiworld, you can run `/resync` from the Civ 6 client. This may take up to a minute depending on how many items there are. diff --git a/worlds/civ_6/test/TestBoostsanity.py b/worlds/civ_6/test/TestBoostsanity.py new file mode 100644 index 0000000000..6efed6c66e --- /dev/null +++ b/worlds/civ_6/test/TestBoostsanity.py @@ -0,0 +1,107 @@ +from Fill import distribute_items_restrictive +from ..Data import get_boosts_data +from . import CivVITestBase + + +class TestBoostsanityIncluded(CivVITestBase): + auto_construct = False + options = { + "progressive_eras": "true", + "boostsanity": "true", + "progression_style": "none", + "shuffle_goody_hut_rewards": "false", + } + + def test_boosts_get_included(self) -> None: + self.world_setup() + distribute_items_restrictive(self.multiworld) + locations = self.multiworld.get_locations(self.player) + found_locations = 0 + for location in locations: + if "BOOST" in location.name: + found_locations += 1 + num_boost_locations = len(get_boosts_data()) + self.assertEqual(found_locations, num_boost_locations) + + def test_boosts_require_prereqs_no_progressives(self) -> None: + self.world_setup() + location = "BOOST_TECH_ADVANCED_BALLISTICS" + items_to_give = ["Refining", "Electricity", "Apprenticeship", "Industrialization"] + self.assertFalse(self.can_reach_location(location)) + + for prereq in items_to_give: + self.collect_by_name(prereq) + is_last_prereq = prereq == items_to_give[-1] + self.assertEqual(self.can_reach_location(location), is_last_prereq) + + +class TestBoostsanityIncludedNoProgressiveDistricts(CivVITestBase): + auto_construct = False + options = { + "progressive_eras": "true", + "boostsanity": "true", + "progression_style": "districts_only", + "shuffle_goody_hut_rewards": "false", + } + + def test_boosts_get_included(self) -> None: + self.world_setup() + distribute_items_restrictive(self.multiworld) + locations = self.multiworld.get_locations(self.player) + found_locations = 0 + for location in locations: + if "BOOST" in location.name: + found_locations += 1 + num_boost_locations = len(get_boosts_data()) + self.assertEqual(found_locations, num_boost_locations) + + +class TestBoostsanityPrereqsWithProgressiveDistricts(CivVITestBase): + options = { + "progressive_eras": "true", + "boostsanity": "true", + "progression_style": "districts_only", + "shuffle_goody_hut_rewards": "false", + } + + def test_boosts_require_progressive_prereqs_optional(self) -> None: + location = "BOOST_TECH_NUCLEAR_FUSION" + items_to_give = ["Progressive Industrial Zone", "Progressive Industrial Zone"] + + self.assertFalse(self.can_reach_location(location)) + for prereq in items_to_give: + self.collect_by_name(prereq) + is_last_prereq = prereq == items_to_give[-1] + self.assertEqual(self.can_reach_location(location), is_last_prereq) + + def tests_boosts_require_correct_progressive_district_count(self) -> None: + location = "BOOST_TECH_RIFLING" + items_to_give = ["Mining", "Progressive Encampment", "Progressive Encampment"] + + self.assertFalse(self.can_reach_location(location)) + for prereq in items_to_give: + self.collect_by_name(prereq) + is_last_prereq = prereq == items_to_give[-1] + self.assertEqual(self.can_reach_location(location), is_last_prereq) + + +class TestBoostsanityExcluded(CivVITestBase): + auto_construct = False + options = { + "progressive_eras": "true", + "death_link": "true", + "boostsanity": "false", + "death_link_effect": "unit_killed", + "progressive_districts": "true", + "shuffle_goody_hut_rewards": "false", + } + + def test_boosts_are_not_included(self) -> None: + self.world_setup() + distribute_items_restrictive(self.multiworld) + locations = self.multiworld.get_locations(self.player) + found_locations = 0 + for location in locations: + if "BOOST" in location.name: + found_locations += 1 + self.assertEqual(found_locations, 0) diff --git a/worlds/civ_6/test/TestGoodyHuts.py b/worlds/civ_6/test/TestGoodyHuts.py new file mode 100644 index 0000000000..a55c74f38e --- /dev/null +++ b/worlds/civ_6/test/TestGoodyHuts.py @@ -0,0 +1,114 @@ +from typing import Dict +from BaseClasses import ItemClassification +from Fill import distribute_items_restrictive +from ..Items import FillerItemRarity, filler_data +from . import CivVITestBase + + +class TestGoodyHutsIncluded(CivVITestBase): + auto_construct = False + options = { + "progressive_eras": "true", + "progressive_districts": "true", + "shuffle_goody_hut_rewards": "true", + } + + def test_goody_huts_get_included(self) -> None: + self.world_setup() + self.world.generate_early() + distribute_items_restrictive(self.multiworld) + expected_goody_huts = 10 + found = 0 + for location in self.multiworld.get_locations(self.player): + if location.name.startswith("GOODY_HUT_"): + found += 1 + self.assertEqual(found, expected_goody_huts) + + +class TestGoodyHutsExcluded(CivVITestBase): + auto_construct = False + options = { + "progressive_eras": "true", + "progressive_districts": "true", + "shuffle_goody_hut_rewards": "false", + } + + def test_goody_huts_are_not_included(self) -> None: + self.world_setup() + self.world.generate_early() + distribute_items_restrictive(self.multiworld) + found_goody_huts = 0 + for location in self.multiworld.get_locations(self.player): + if location.name.startswith("GOODY_HUT_"): + found_goody_huts += 1 + self.assertEqual(found_goody_huts, 0) + + +class TestFillerItemsIncludedByRarity(CivVITestBase): + auto_construct = False + options = { + "progressive_eras": "true", + "progressive_districts": "true", + "shuffle_goody_hut_rewards": "true", + "boostsanity": "true" + } + + def test_filler_items_are_included_by_rarity(self) -> None: + self.world_setup() + self.world.generate_early() + distribute_items_restrictive(self.multiworld) + rarity_counts: Dict[FillerItemRarity, int] = { + FillerItemRarity.COMMON: 0, + FillerItemRarity.UNCOMMON: 0, + FillerItemRarity.RARE: 0, + } + total_filler_items = 0 + for item in self.multiworld.itempool: + if item.classification == ItemClassification.filler: + rarity = filler_data[item.name].rarity + rarity_counts[rarity] += 1 + total_filler_items += 1 + + expected_counts = { + FillerItemRarity.COMMON: 101, + FillerItemRarity.UNCOMMON: 27, + FillerItemRarity.RARE: 4, + } + + for rarity, expected in expected_counts.items(): + self.assertEqual(rarity_counts[rarity], expected, f"Expected {expected} {rarity} items, found {rarity_counts[rarity]}") + + +class TestFillerItemsIncludedByRarityWithoutBoostsanity(CivVITestBase): + auto_construct = False + options = { + "progressive_eras": "true", + "progressive_districts": "true", + "shuffle_goody_hut_rewards": "true", + "boostsanity": "false" + } + + def test_filler_items_are_included_by_rarity_without_boostsanity(self) -> None: + self.world_setup() + self.world.generate_early() + distribute_items_restrictive(self.multiworld) + rarity_counts: Dict[FillerItemRarity, int] = { + FillerItemRarity.COMMON: 0, + FillerItemRarity.UNCOMMON: 0, + FillerItemRarity.RARE: 0, + } + total_filler_items = 0 + for item in self.multiworld.itempool: + if item.classification == ItemClassification.filler: + rarity = filler_data[item.name].rarity + rarity_counts[rarity] += 1 + total_filler_items += 1 + + expected_counts = { + FillerItemRarity.COMMON: 7, + FillerItemRarity.UNCOMMON: 2, + FillerItemRarity.RARE: 1, + } + + for rarity, expected in expected_counts.items(): + self.assertEqual(rarity_counts[rarity], expected, f"Expected {expected} {rarity} items, found {rarity_counts[rarity]}") diff --git a/worlds/civ_6/test/TestRegionRequirements.py b/worlds/civ_6/test/TestRegionRequirements.py new file mode 100644 index 0000000000..6ab945798f --- /dev/null +++ b/worlds/civ_6/test/TestRegionRequirements.py @@ -0,0 +1,234 @@ +from typing import Callable, List + +from BaseClasses import CollectionState +from ..Data import get_era_required_items_data +from ..Enum import EraType +from ..ProgressiveDistricts import convert_items_to_progressive_items +from ..Items import get_item_by_civ_name +from . import CivVITestBase + + +def collect_items_for_era(test: CivVITestBase, era: EraType) -> None: + era_required_items = get_era_required_items_data() + items = [ + get_item_by_civ_name(item, test.world.item_table).name + for item in era_required_items[era.value] + ] + test.collect_by_name(items) + + +def collect_items_for_era_progressive(test: CivVITestBase, era: EraType) -> None: + era_progression_items = get_era_required_items_data() + progressive_items = convert_items_to_progressive_items( + era_progression_items[era.value] + ) + items = [ + get_item_by_civ_name(item, test.world.item_table).name + for item in progressive_items + ] + for item in items: + test.collect(test.get_item_by_name(item)) + + +def verify_eras_accessible( + test: CivVITestBase, + state: CollectionState, + collect_func: Callable[[CivVITestBase, EraType], None], +) -> None: + """Collect for an era, then check if the next era is accessible and the one after that is not""" + for era in EraType: + if era == EraType.ERA_ANCIENT: + test.assertTrue(state.can_reach(era.value, "Region", test.player)) + else: + test.assertFalse(state.can_reach(era.value, "Region", test.player)) + + eras = [ + EraType.ERA_ANCIENT, + EraType.ERA_CLASSICAL, + EraType.ERA_MEDIEVAL, + EraType.ERA_RENAISSANCE, + EraType.ERA_INDUSTRIAL, + EraType.ERA_MODERN, + EraType.ERA_ATOMIC, + EraType.ERA_INFORMATION, + EraType.ERA_FUTURE, + ] + + for i in range(len(eras) - 1): + collect_func(test, eras[i]) + test.assertTrue(state.can_reach(eras[i + 1].value, "Region", test.player)) + if i + 2 < len(eras): + test.assertFalse(state.can_reach(eras[i + 2].value, "Region", test.player)) + + +class TestNonProgressiveRegionRequirements(CivVITestBase): + options = { + "progression_style": "none", + "boostsanity": "false", + } + + def test_eras_are_accessible_without_progressive_districts(self) -> None: + state = self.multiworld.state + verify_eras_accessible(self, state, collect_items_for_era) + + +class TestNonProgressiveRegionRequirementsWithBoostsanity(CivVITestBase): + options = { + "progression_style": "none", + "boostsanity": "true", + } + + def test_eras_are_accessible_without_progressive_districts(self) -> None: + state = self.multiworld.state + verify_eras_accessible(self, state, collect_items_for_era) + + +class TestProgressiveDistrictRequirementsWithBoostsanity(CivVITestBase): + options = { + "progression_style": "districts_only", + "boostsanity": "true", + } + + def test_eras_are_accessible_with_progressive_districts(self) -> None: + state = self.multiworld.state + verify_eras_accessible(self, state, collect_items_for_era_progressive) + + +class TestProgressiveDistrictRequirements(CivVITestBase): + options = { + "progression_style": "districts_only", + "boostsanity": "false", + } + + def test_eras_are_accessible_with_progressive_districts(self) -> None: + state = self.multiworld.state + verify_eras_accessible(self, state, collect_items_for_era_progressive) + + def test_progressive_districts_are_required(self) -> None: + state = self.multiworld.state + self.collect_all_but(["Progressive Encampment"]) + self.assertFalse(state.can_reach("ERA_CLASSICAL", "Region", self.player)) + self.assertFalse(state.can_reach("ERA_RENAISSANCE", "Region", self.player)) + self.assertFalse(state.can_reach("ERA_MODERN", "Region", self.player)) + + self.collect(self.get_item_by_name("Progressive Encampment")) + self.assertTrue(state.can_reach("ERA_CLASSICAL", "Region", self.player)) + self.assertFalse(state.can_reach("ERA_RENAISSANCE", "Region", self.player)) + self.assertFalse(state.can_reach("ERA_MODERN", "Region", self.player)) + + self.collect(self.get_item_by_name("Progressive Encampment")) + self.assertTrue(state.can_reach("ERA_RENAISSANCE", "Region", self.player)) + self.assertFalse(state.can_reach("ERA_MODERN", "Region", self.player)) + + self.collect(self.get_item_by_name("Progressive Encampment")) + self.assertTrue(state.can_reach("ERA_MODERN", "Region", self.player)) + + +class TestProgressiveEraRequirements(CivVITestBase): + options = { + "progression_style": "eras_and_districts", + } + + def test_eras_are_accessible_with_progressive_eras(self) -> None: + state = self.multiworld.state + self.collect_all_but(["Progressive Era"]) + + def check_eras_accessible(eras: List[EraType]): + for era in EraType: + if era in eras: + self.assertTrue(state.can_reach(era.value, "Region", self.player)) + else: + self.assertFalse(state.can_reach(era.value, "Region", self.player)) + + progresive_era_item = self.get_item_by_name("Progressive Era") + accessible_eras = [EraType.ERA_ANCIENT] + check_eras_accessible(accessible_eras) + + # Classical era requires 2 progressive era items + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_CLASSICAL] + check_eras_accessible(accessible_eras) + + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_MEDIEVAL] + check_eras_accessible(accessible_eras) + + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_RENAISSANCE] + check_eras_accessible(accessible_eras) + + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_INDUSTRIAL] + check_eras_accessible(accessible_eras) + + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_MODERN] + check_eras_accessible(accessible_eras) + + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_ATOMIC] + check_eras_accessible(accessible_eras) + + # Since we collect 2 in the ancient era, information and future era have same logic requirement + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_INFORMATION] + accessible_eras += [EraType.ERA_FUTURE] + check_eras_accessible(accessible_eras) + + +class TestProgressiveEraRequirementsWithBoostsanity(CivVITestBase): + options = { + "progression_style": "eras_and_districts", + "boostsanity": "true", + } + + def test_eras_are_accessible_with_progressive_eras(self) -> None: + state = self.multiworld.state + self.collect_all_but(["Progressive Era"]) + + def check_eras_accessible(eras: List[EraType]): + for era in EraType: + if era in eras: + self.assertTrue( + state.can_reach(era.value, "Region", self.player), + "Failed for era: " + era.value, + ) + else: + self.assertFalse( + state.can_reach(era.value, "Region", self.player), + "Failed for era: " + era.value, + ) + + progresive_era_item = self.get_item_by_name("Progressive Era") + accessible_eras = [EraType.ERA_ANCIENT] + check_eras_accessible(accessible_eras) + + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_CLASSICAL] + check_eras_accessible(accessible_eras) + + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_MEDIEVAL] + check_eras_accessible(accessible_eras) + + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_RENAISSANCE] + check_eras_accessible(accessible_eras) + + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_INDUSTRIAL] + check_eras_accessible(accessible_eras) + + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_MODERN] + check_eras_accessible(accessible_eras) + + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_ATOMIC] + check_eras_accessible(accessible_eras) + + # Since we collect 2 in the ancient era, information and future era have same logic requirement + self.collect(progresive_era_item) + accessible_eras += [EraType.ERA_INFORMATION] + accessible_eras += [EraType.ERA_FUTURE] + check_eras_accessible(accessible_eras) diff --git a/worlds/civ_6/test/TestStartingHints.py b/worlds/civ_6/test/TestStartingHints.py new file mode 100644 index 0000000000..da198c6a45 --- /dev/null +++ b/worlds/civ_6/test/TestStartingHints.py @@ -0,0 +1,125 @@ +from BaseClasses import ItemClassification +from Fill import distribute_items_restrictive +from ..Enum import CivVICheckType +from . import CivVITestBase + + +class TestStartingHints(CivVITestBase): + run_default_tests = False # type: ignore + auto_construct = False + options = { + "progressive_eras": "true", + "death_link": "true", + "death_link_effect": "unit_killed", + "progressive_districts": "true", + "pre_hint_items": set({"Progression", "Useful", "Filler"}), + } + + def test_all_tech_civic_items_are_hinted_default(self) -> None: + self.world_setup() + distribute_items_restrictive(self.multiworld) + self.world.post_fill() + start_location_hints = self.world.options.start_location_hints.value + for location_name, location_data in self.world.location_table.items(): + if location_data.location_type == CivVICheckType.CIVIC or location_data.location_type == CivVICheckType.TECH: + self.assertIn(location_name, start_location_hints) + else: + self.assertNotIn(location_name, start_location_hints) + + +class TestOnlyProgressionItemsHinted(CivVITestBase): + run_default_tests = False # type: ignore + auto_construct = False + options = { + "progressive_eras": "true", + "death_link": "true", + "death_link_effect": "unit_killed", + "progressive_districts": "true", + "pre_hint_items": set({"Progression"}), + } + + def test_only_progression_items_are_hinted(self) -> None: + self.world_setup() + distribute_items_restrictive(self.multiworld) + self.world.post_fill() + start_location_hints = self.world.options.start_location_hints.value + self.assertTrue(len(start_location_hints) > 0) + for hint in start_location_hints: + location_data = self.world.get_location(hint) + if location_data.item: + self.assertTrue(location_data.item.classification == ItemClassification.progression) + else: + self.assertTrue(False, "Location has no item") + + +class TestNoJunkItemsHinted(CivVITestBase): + run_default_tests = False # type: ignore + auto_construct = False + options = { + "progressive_eras": "true", + "death_link": "true", + "death_link_effect": "unit_killed", + "progressive_districts": "true", + "pre_hint_items": set({"Progression", "Useful"}), + "boostsanity": "true", + "shuffle_goody_hut_rewards": "true", + } + + def test_no_junk_items_are_hinted(self) -> None: + self.world_setup() + distribute_items_restrictive(self.multiworld) + item = self.multiworld.get_location("TECH_AP_ANCIENT_01", self.player).item + self.assertIsNotNone(item) + + if item: + item.classification = ItemClassification.filler + + self.world.post_fill() + start_location_hints = self.world.options.start_location_hints.value + self.assertTrue(len(start_location_hints) > 0) + self.assertNotIn("TECH_AP_ANCIENT_01", start_location_hints) + + +class TestOnlyJunkItemsHinted(CivVITestBase): + run_default_tests = False # type: ignore + auto_construct = False + options = { + "progressive_eras": "true", + "death_link": "true", + "death_link_effect": "unit_killed", + "progressive_districts": "true", + "pre_hint_items": set({"Filler"}), + } + + def test_only_junk_items_are_hinted(self) -> None: + self.world_setup() + distribute_items_restrictive(self.multiworld) + item = self.multiworld.get_location("TECH_AP_ANCIENT_01", self.player).item + self.assertIsNotNone(item) + + if item: + item.classification = ItemClassification.filler + + self.world.post_fill() + start_location_hints = self.world.options.start_location_hints.value + self.assertEqual(len(start_location_hints), 1) + self.assertIn("TECH_AP_ANCIENT_01", start_location_hints) + + +class TestNoItemsHinted(CivVITestBase): + run_default_tests = False # type: ignore + auto_construct = False + options = { + "progressive_eras": "true", + "death_link": "true", + "death_link_effect": "unit_killed", + "progressive_districts": "true", + "pre_hint_items": set({}), + } + + def test_no_items_are_hinted(self) -> None: + self.world_setup() + distribute_items_restrictive(self.multiworld) + self.world.post_fill() + start_location_hints = self.world.options.start_location_hints.value + self.assertEqual(len(start_location_hints), 0) diff --git a/worlds/civ_6/test/__init__.py b/worlds/civ_6/test/__init__.py new file mode 100644 index 0000000000..597b52711a --- /dev/null +++ b/worlds/civ_6/test/__init__.py @@ -0,0 +1,8 @@ +from typing import ClassVar + +from test.bases import WorldTestBase + + +class CivVITestBase(WorldTestBase): + game = "Civilization VI" + player: ClassVar[int] = 1 From 4882366ffcff6ed4186fc1f22ea0df2806054f5f Mon Sep 17 00:00:00 2001 From: Alchav <59858495+Alchav@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:56:05 -0400 Subject: [PATCH 092/227] LTTP: Fix TR Big Key Door Entrance Logic (#4712) --- worlds/alttp/Rules.py | 73 ++++++++++--------- .../test/inverted/TestInvertedTurtleRock.py | 30 ++++---- .../TestInvertedTurtleRock.py | 30 ++++---- .../alttp/test/inverted_owg/TestDungeons.py | 2 +- worlds/alttp/test/owg/TestDungeons.py | 4 +- 5 files changed, 70 insertions(+), 69 deletions(-) diff --git a/worlds/alttp/Rules.py b/worlds/alttp/Rules.py index f13178c6c5..47992947ac 100644 --- a/worlds/alttp/Rules.py +++ b/worlds/alttp/Rules.py @@ -1120,28 +1120,28 @@ def toss_junk_item(world, player): raise Exception("Unable to find a junk item to toss to make room for a TR small key") -def set_trock_key_rules(world, player): +def set_trock_key_rules(multiworld, player): # First set all relevant locked doors to impassible. for entrance in ['Turtle Rock Dark Room Staircase', 'Turtle Rock (Chain Chomp Room) (North)', 'Turtle Rock (Chain Chomp Room) (South)', 'Turtle Rock Entrance to Pokey Room', 'Turtle Rock (Pokey Room) (South)', 'Turtle Rock (Pokey Room) (North)', 'Turtle Rock Big Key Door']: - set_rule(world.get_entrance(entrance, player), lambda state: False) + set_rule(multiworld.get_entrance(entrance, player), lambda state: False) - all_state = world.get_all_state(use_cache=False, allow_partial_entrances=True) + all_state = multiworld.get_all_state(use_cache=False, allow_partial_entrances=True) all_state.reachable_regions[player] = set() # wipe reachable regions so that the locked doors actually work all_state.stale[player] = True # Check if each of the four main regions of the dungoen can be reached. The previous code section prevents key-costing moves within the dungeon. - can_reach_back = all_state.can_reach(world.get_region('Turtle Rock (Eye Bridge)', player)) - can_reach_front = all_state.can_reach(world.get_region('Turtle Rock (Entrance)', player)) - can_reach_big_chest = all_state.can_reach(world.get_region('Turtle Rock (Big Chest)', player)) - can_reach_middle = all_state.can_reach(world.get_region('Turtle Rock (Second Section)', player)) + can_reach_back = all_state.can_reach(multiworld.get_region('Turtle Rock (Eye Bridge)', player)) + can_reach_front = all_state.can_reach(multiworld.get_region('Turtle Rock (Entrance)', player)) + can_reach_big_chest = all_state.can_reach(multiworld.get_region('Turtle Rock (Big Chest)', player)) + can_reach_middle = all_state.can_reach(multiworld.get_region('Turtle Rock (Second Section)', player)) # If you can't enter from the back, the door to the front of TR requires only 2 small keys if the big key is in one of these chests since 2 key doors are locked behind the big key door. # If you can only enter from the middle, this includes all locations that can only be reached by exiting the front. This can include Laser Bridge and Crystaroller if the front and back connect via Dark DM Ledge! front_locked_locations = {('Turtle Rock - Compass Chest', player), ('Turtle Rock - Roller Room - Left', player), ('Turtle Rock - Roller Room - Right', player)} if can_reach_middle and not can_reach_back and not can_reach_front: normal_regions = all_state.reachable_regions[player].copy() - set_rule(world.get_entrance('Turtle Rock (Chain Chomp Room) (South)', player), lambda state: True) - set_rule(world.get_entrance('Turtle Rock (Pokey Room) (South)', player), lambda state: True) + set_rule(multiworld.get_entrance('Turtle Rock (Chain Chomp Room) (South)', player), lambda state: True) + set_rule(multiworld.get_entrance('Turtle Rock (Pokey Room) (South)', player), lambda state: True) all_state.update_reachable_regions(player) front_locked_regions = all_state.reachable_regions[player].difference(normal_regions) front_locked_locations = set((location.name, player) for region in front_locked_regions for location in region.locations) @@ -1151,37 +1151,38 @@ def set_trock_key_rules(world, player): # Big key door requires the big key, obviously. We removed this rule in the previous section to flag front_locked_locations correctly, # otherwise crystaroller room might not be properly marked as reachable through the back. - set_rule(world.get_entrance('Turtle Rock Big Key Door', player), lambda state: state.has('Big Key (Turtle Rock)', player)) + set_rule(multiworld.get_entrance('Turtle Rock Big Key Door', player), lambda state: state.has('Big Key (Turtle Rock)', player) and can_kill_most_things(state, player, 10) and can_bomb_or_bonk(state, player)) + # No matter what, the key requirement for going from the middle to the bottom should be five keys. - set_rule(world.get_entrance('Turtle Rock Dark Room Staircase', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 5)) + set_rule(multiworld.get_entrance('Turtle Rock Dark Room Staircase', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 5)) # Now we need to set rules based on which entrances we have access to. The most important point is whether we have back access. If we have back access, we # might open all the locked doors in any order, so we need maximally restrictive rules. if can_reach_back: - set_rule(world.get_location('Turtle Rock - Big Key Chest', player), lambda state: (state._lttp_has_key('Small Key (Turtle Rock)', player, 6) or location_item_name(state, 'Turtle Rock - Big Key Chest', player) == ('Small Key (Turtle Rock)', player))) - set_rule(world.get_entrance('Turtle Rock (Chain Chomp Room) (South)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 5)) - set_rule(world.get_entrance('Turtle Rock (Pokey Room) (South)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 6)) + set_rule(multiworld.get_location('Turtle Rock - Big Key Chest', player), lambda state: (state._lttp_has_key('Small Key (Turtle Rock)', player, 6) or location_item_name(state, 'Turtle Rock - Big Key Chest', player) == ('Small Key (Turtle Rock)', player))) + set_rule(multiworld.get_entrance('Turtle Rock (Chain Chomp Room) (South)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 5)) + set_rule(multiworld.get_entrance('Turtle Rock (Pokey Room) (South)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 6)) - set_rule(world.get_entrance('Turtle Rock (Chain Chomp Room) (North)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 6)) - set_rule(world.get_entrance('Turtle Rock (Pokey Room) (North)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 6)) - set_rule(world.get_entrance('Turtle Rock Entrance to Pokey Room', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 5)) + set_rule(multiworld.get_entrance('Turtle Rock (Chain Chomp Room) (North)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 6)) + set_rule(multiworld.get_entrance('Turtle Rock (Pokey Room) (North)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 6)) + set_rule(multiworld.get_entrance('Turtle Rock Entrance to Pokey Room', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 5)) else: # Middle to front requires 3 keys if the back is locked by this door, otherwise 5 - set_rule(world.get_entrance('Turtle Rock (Chain Chomp Room) (South)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 3) + set_rule(multiworld.get_entrance('Turtle Rock (Chain Chomp Room) (South)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 3) if item_name_in_location_names(state, 'Big Key (Turtle Rock)', player, front_locked_locations.union({('Turtle Rock - Pokey 1 Key Drop', player)})) else state._lttp_has_key('Small Key (Turtle Rock)', player, 5)) # Middle to front requires 4 keys if the back is locked by this door, otherwise 6 - set_rule(world.get_entrance('Turtle Rock (Pokey Room) (South)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 4) + set_rule(multiworld.get_entrance('Turtle Rock (Pokey Room) (South)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 4) if item_name_in_location_names(state, 'Big Key (Turtle Rock)', player, front_locked_locations) else state._lttp_has_key('Small Key (Turtle Rock)', player, 6)) # Front to middle requires 3 keys (if the middle is accessible then these doors can be avoided, otherwise no keys can be wasted) - set_rule(world.get_entrance('Turtle Rock (Chain Chomp Room) (North)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 3)) - set_rule(world.get_entrance('Turtle Rock (Pokey Room) (North)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 2)) - set_rule(world.get_entrance('Turtle Rock Entrance to Pokey Room', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 1)) + set_rule(multiworld.get_entrance('Turtle Rock (Chain Chomp Room) (North)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 3)) + set_rule(multiworld.get_entrance('Turtle Rock (Pokey Room) (North)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 2)) + set_rule(multiworld.get_entrance('Turtle Rock Entrance to Pokey Room', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 1)) - set_rule(world.get_location('Turtle Rock - Big Key Chest', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, tr_big_key_chest_keys_needed(state))) + set_rule(multiworld.get_location('Turtle Rock - Big Key Chest', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, tr_big_key_chest_keys_needed(state))) def tr_big_key_chest_keys_needed(state): # This function handles the key requirements for the TR Big Chest in the situations it having the Big Key should logically require 2 keys, small key @@ -1194,30 +1195,30 @@ def set_trock_key_rules(world, player): return 6 # If TR is only accessible from the middle, the big key must be further restricted to prevent softlock potential - if not can_reach_front and not world.small_key_shuffle[player]: + if not can_reach_front and not multiworld.small_key_shuffle[player]: # Must not go in the Big Key Chest - only 1 other chest available and 2+ keys required for all other chests - forbid_item(world.get_location('Turtle Rock - Big Key Chest', player), 'Big Key (Turtle Rock)', player) + forbid_item(multiworld.get_location('Turtle Rock - Big Key Chest', player), 'Big Key (Turtle Rock)', player) if not can_reach_big_chest: # Must not go in the Chain Chomps chest - only 2 other chests available and 3+ keys required for all other chests - forbid_item(world.get_location('Turtle Rock - Chain Chomps', player), 'Big Key (Turtle Rock)', player) - forbid_item(world.get_location('Turtle Rock - Pokey 2 Key Drop', player), 'Big Key (Turtle Rock)', player) - if world.accessibility[player] == 'full': - if world.big_key_shuffle[player] and can_reach_big_chest: + forbid_item(multiworld.get_location('Turtle Rock - Chain Chomps', player), 'Big Key (Turtle Rock)', player) + forbid_item(multiworld.get_location('Turtle Rock - Pokey 2 Key Drop', player), 'Big Key (Turtle Rock)', player) + if multiworld.accessibility[player] == 'full': + if multiworld.big_key_shuffle[player] and can_reach_big_chest: # Must not go in the dungeon - all 3 available chests (Chomps, Big Chest, Crystaroller) must be keys to access laser bridge, and the big key is required first for location in ['Turtle Rock - Chain Chomps', 'Turtle Rock - Compass Chest', 'Turtle Rock - Pokey 1 Key Drop', 'Turtle Rock - Pokey 2 Key Drop', 'Turtle Rock - Roller Room - Left', 'Turtle Rock - Roller Room - Right']: - forbid_item(world.get_location(location, player), 'Big Key (Turtle Rock)', player) + forbid_item(multiworld.get_location(location, player), 'Big Key (Turtle Rock)', player) else: # A key is required in the Big Key Chest to prevent a possible softlock. Place an extra key to ensure 100% locations still works - item = item_factory('Small Key (Turtle Rock)', world.worlds[player]) - location = world.get_location('Turtle Rock - Big Key Chest', player) + item = item_factory('Small Key (Turtle Rock)', multiworld.worlds[player]) + location = multiworld.get_location('Turtle Rock - Big Key Chest', player) location.place_locked_item(item) - toss_junk_item(world, player) + toss_junk_item(multiworld, player) - if world.accessibility[player] != 'full': - set_always_allow(world.get_location('Turtle Rock - Big Key Chest', player), lambda state, item: item.name == 'Small Key (Turtle Rock)' and item.player == player - and state.can_reach(state.multiworld.get_region('Turtle Rock (Second Section)', player))) + if multiworld.accessibility[player] != 'full': + set_always_allow(multiworld.get_location('Turtle Rock - Big Key Chest', player), lambda state, item: item.name == 'Small Key (Turtle Rock)' and item.player == player + and state.can_reach(state.multiworld.get_region('Turtle Rock (Second Section)', player))) def set_big_bomb_rules(world, player): diff --git a/worlds/alttp/test/inverted/TestInvertedTurtleRock.py b/worlds/alttp/test/inverted/TestInvertedTurtleRock.py index db3084b02a..21bcf70964 100644 --- a/worlds/alttp/test/inverted/TestInvertedTurtleRock.py +++ b/worlds/alttp/test/inverted/TestInvertedTurtleRock.py @@ -79,12 +79,12 @@ class TestInvertedTurtleRock(TestInverted): ["Turtle Rock - Crystaroller Room", False, [], ['Big Key (Turtle Rock)', 'Lamp']], ["Turtle Rock - Crystaroller Room", False, [], ['Magic Mirror', 'Cane of Somaria']], ["Turtle Rock - Crystaroller Room", False, ['Small Key (Turtle Rock)', 'Small Key (Turtle Rock)'], ['Magic Mirror', 'Small Key (Turtle Rock)']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Lamp', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Lamp', 'Magic Mirror', 'Progressive Glove', 'Moon Pearl', 'Hookshot']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Moon Pearl', 'Flute', 'Magic Mirror', 'Hookshot']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Flute', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Magic Mirror', 'Progressive Glove', 'Moon Pearl', 'Hookshot']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Moon Pearl', 'Flute', 'Magic Mirror', 'Hookshot']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Flute', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror']], ["Turtle Rock - Crystaroller Room", True, ['Lamp', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove', 'Cane of Somaria']], ["Turtle Rock - Crystaroller Room", True, ['Lamp', 'Magic Mirror', 'Progressive Glove', 'Moon Pearl', 'Hookshot', 'Cane of Somaria']], ["Turtle Rock - Crystaroller Room", True, ['Lamp', 'Moon Pearl', 'Flute', 'Magic Mirror', 'Hookshot', 'Cane of Somaria']], @@ -97,9 +97,9 @@ class TestInvertedTurtleRock(TestInverted): ["Turtle Rock - Boss", False, [], ['Big Key (Turtle Rock)']], ["Turtle Rock - Boss", False, [], ['Magic Mirror', 'Lamp']], ["Turtle Rock - Boss", False, ['Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)'], ['Small Key (Turtle Rock)']], - ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Flute', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Bottle', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Big Key (Turtle Rock)']], - ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Bottle', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Big Key (Turtle Rock)']], - ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Magic Upgrade (1/2)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)','Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Big Key (Turtle Rock)']], + ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Flute', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Bottle', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Big Key (Turtle Rock)']], + ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Bottle', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Big Key (Turtle Rock)']], + ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Magic Upgrade (1/2)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)','Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Big Key (Turtle Rock)']], ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove', 'Hammer', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Big Key (Turtle Rock)']], ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Flute', 'Magic Mirror', 'Moon Pearl', 'Hookshot', 'Hammer', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Big Key (Turtle Rock)']] @@ -117,12 +117,12 @@ class TestInvertedTurtleRock(TestInverted): [location, False, [], ['Magic Mirror', 'Cane of Somaria']], [location, False, [], ['Magic Mirror', 'Lamp']], [location, False, ['Small Key (Turtle Rock)', 'Small Key (Turtle Rock)'], ['Magic Mirror', 'Small Key (Turtle Rock)']], - [location, True, ['Big Key (Turtle Rock)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Cane of Byrna']], - [location, True, ['Big Key (Turtle Rock)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Cane of Byrna']], - [location, True, ['Big Key (Turtle Rock)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Cape']], - [location, True, ['Big Key (Turtle Rock)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Cape']], - [location, True, ['Big Key (Turtle Rock)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Progressive Shield', 'Progressive Shield', 'Progressive Shield']], - [location, True, ['Big Key (Turtle Rock)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Progressive Shield', 'Progressive Shield', 'Progressive Shield']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Cane of Byrna']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Cane of Byrna']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Cape']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Cape']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Progressive Shield', 'Progressive Shield', 'Progressive Shield']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Progressive Shield', 'Progressive Shield', 'Progressive Shield']], # Mirroring into Eye Bridge does not require Cane of Somaria [location, True, ['Lamp', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove', 'Cane of Byrna']], diff --git a/worlds/alttp/test/inverted_minor_glitches/TestInvertedTurtleRock.py b/worlds/alttp/test/inverted_minor_glitches/TestInvertedTurtleRock.py index a416e1b35d..343cf3f8b1 100644 --- a/worlds/alttp/test/inverted_minor_glitches/TestInvertedTurtleRock.py +++ b/worlds/alttp/test/inverted_minor_glitches/TestInvertedTurtleRock.py @@ -80,12 +80,12 @@ class TestInvertedTurtleRock(TestInvertedMinor): ["Turtle Rock - Crystaroller Room", False, [], ['Big Key (Turtle Rock)', 'Lamp']], ["Turtle Rock - Crystaroller Room", False, [], ['Magic Mirror', 'Cane of Somaria']], ["Turtle Rock - Crystaroller Room", False, ['Small Key (Turtle Rock)', 'Small Key (Turtle Rock)'], ['Magic Mirror', 'Small Key (Turtle Rock)']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Lamp', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Lamp', 'Magic Mirror', 'Progressive Glove', 'Moon Pearl', 'Hookshot']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Moon Pearl', 'Flute', 'Magic Mirror', 'Hookshot']], - ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Flute', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Magic Mirror', 'Progressive Glove', 'Moon Pearl', 'Hookshot']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Moon Pearl', 'Flute', 'Magic Mirror', 'Hookshot']], + ["Turtle Rock - Crystaroller Room", True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Flute', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror']], ["Turtle Rock - Crystaroller Room", True, ['Lamp', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove', 'Cane of Somaria']], ["Turtle Rock - Crystaroller Room", True, ['Lamp', 'Magic Mirror', 'Progressive Glove', 'Moon Pearl', 'Hookshot', 'Cane of Somaria']], ["Turtle Rock - Crystaroller Room", True, ['Lamp', 'Moon Pearl', 'Flute', 'Magic Mirror', 'Hookshot', 'Cane of Somaria']], @@ -98,9 +98,9 @@ class TestInvertedTurtleRock(TestInvertedMinor): ["Turtle Rock - Boss", False, [], ['Big Key (Turtle Rock)']], ["Turtle Rock - Boss", False, [], ['Magic Mirror', 'Lamp']], ["Turtle Rock - Boss", False, ['Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)'], ['Small Key (Turtle Rock)']], - ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Flute', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Bottle', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Big Key (Turtle Rock)']], - ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Bottle', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Big Key (Turtle Rock)']], - ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Magic Upgrade (1/2)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)','Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Big Key (Turtle Rock)']], + ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Flute', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Bottle', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Big Key (Turtle Rock)']], + ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Bottle', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Big Key (Turtle Rock)']], + ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Progressive Sword', 'Cane of Somaria', 'Magic Upgrade (1/2)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)','Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Big Key (Turtle Rock)']], ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Lamp', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove', 'Hammer', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Big Key (Turtle Rock)']], ["Turtle Rock - Boss", True, ['Ice Rod', 'Fire Rod', 'Flute', 'Magic Mirror', 'Moon Pearl', 'Hookshot', 'Hammer', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Big Key (Turtle Rock)']] ]) @@ -116,12 +116,12 @@ class TestInvertedTurtleRock(TestInvertedMinor): [location, False, [], ['Magic Mirror', 'Cane of Somaria']], [location, False, [], ['Magic Mirror', 'Lamp']], [location, False, ['Small Key (Turtle Rock)', 'Small Key (Turtle Rock)'], ['Magic Mirror', 'Small Key (Turtle Rock)']], - [location, True, ['Big Key (Turtle Rock)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Cane of Byrna']], - [location, True, ['Big Key (Turtle Rock)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Cane of Byrna']], - [location, True, ['Big Key (Turtle Rock)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Cape']], - [location, True, ['Big Key (Turtle Rock)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Cape']], - [location, True, ['Big Key (Turtle Rock)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Progressive Shield', 'Progressive Shield', 'Progressive Shield']], - [location, True, ['Big Key (Turtle Rock)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Progressive Shield', 'Progressive Shield', 'Progressive Shield']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Cane of Byrna']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Cane of Byrna']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Cape']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Cape']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Flute', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Lamp', 'Progressive Shield', 'Progressive Shield', 'Progressive Shield']], + [location, True, ['Big Key (Turtle Rock)', 'Bomb Upgrade (50)', 'Lamp', 'Progressive Glove', 'Quake', 'Progressive Sword', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Progressive Shield', 'Progressive Shield', 'Progressive Shield']], # Mirroring into Eye Bridge does not require Cane of Somaria [location, True, ['Lamp', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove', 'Cane of Byrna']], diff --git a/worlds/alttp/test/inverted_owg/TestDungeons.py b/worlds/alttp/test/inverted_owg/TestDungeons.py index ada1b92fca..595587f006 100644 --- a/worlds/alttp/test/inverted_owg/TestDungeons.py +++ b/worlds/alttp/test/inverted_owg/TestDungeons.py @@ -102,7 +102,7 @@ class TestDungeons(TestInvertedOWG): ["Turtle Rock - Chain Chomps", True, ['Progressive Sword', 'Progressive Sword', 'Pegasus Boots']], ["Turtle Rock - Crystaroller Room", False, []], - ["Turtle Rock - Crystaroller Room", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl', 'Big Key (Turtle Rock)']], + ["Turtle Rock - Crystaroller Room", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl', 'Big Key (Turtle Rock)', 'Bomb Upgrade (50)']], ["Turtle Rock - Crystaroller Room", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl', 'Lamp', 'Cane of Somaria']], ["Ganons Tower - Hope Room - Left", False, []], diff --git a/worlds/alttp/test/owg/TestDungeons.py b/worlds/alttp/test/owg/TestDungeons.py index 2e55b308d3..e9b1fde285 100644 --- a/worlds/alttp/test/owg/TestDungeons.py +++ b/worlds/alttp/test/owg/TestDungeons.py @@ -120,8 +120,8 @@ class TestDungeons(TestVanillaOWG): #todo: does clip require sword? #["Turtle Rock - Crystaroller Room", True, ['Moon Pearl', 'Pegasus Boots', 'Big Key (Turtle Rock)']], ["Turtle Rock - Crystaroller Room", True, ['Moon Pearl', 'Pegasus Boots', 'Big Key (Turtle Rock)', 'Progressive Sword']], - ["Turtle Rock - Crystaroller Room", True, ['Moon Pearl', 'Pegasus Boots', 'Big Key (Turtle Rock)', 'Hookshot']], - ["Turtle Rock - Crystaroller Room", True, ['Pegasus Boots', 'Magic Mirror', 'Big Key (Turtle Rock)']], + ["Turtle Rock - Crystaroller Room", True, ['Moon Pearl', 'Pegasus Boots', 'Big Key (Turtle Rock)', 'Hookshot', 'Bomb Upgrade (50)']], + ["Turtle Rock - Crystaroller Room", True, ['Pegasus Boots', 'Magic Mirror', 'Big Key (Turtle Rock)', 'Bomb Upgrade (50)']], ["Ganons Tower - Hope Room - Left", False, []], ["Ganons Tower - Hope Room - Left", False, ['Moon Pearl', 'Crystal 1']], From 7c30c4a16952a3a6b325bdc6cb497b9fa0591714 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Mon, 10 Mar 2025 10:16:09 -0500 Subject: [PATCH 093/227] The Messenger: Transition Shuffle (#4402) * The Messenger: transition rando * remove unused import * always link both directions for plando when using coupled transitions * er_type was renamed to randomization_type * use frozenset for things that shouldn't change * review suggestions * do portal and transition shuffle in `connect_entrances` * remove some unnecessary connections that were causing entrance caching collisions * add test for strictest possible ER settings * use unittest.skip on the skipped test, so we don't waste time doing setUp and tearDown * use the world helpers * make the plando connection description more verbose * always add searing crags portal if portal shuffle is disabled * guarantee an arbitrary number of locations with first connection * make the constraints more lenient for a bit more variety --- worlds/messenger/__init__.py | 82 ++++++++++++++--- worlds/messenger/connections.py | 74 ++++++++------- worlds/messenger/options.py | 33 ++++--- worlds/messenger/portals.py | 10 +- worlds/messenger/subclasses.py | 23 ++++- .../test/test_entrance_randomization.py | 19 ++++ worlds/messenger/transitions.py | 92 +++++++++++++++++++ 7 files changed, 258 insertions(+), 75 deletions(-) create mode 100644 worlds/messenger/test/test_entrance_randomization.py create mode 100644 worlds/messenger/transitions.py diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index a6effc31d5..8bde3bbc7a 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -1,7 +1,7 @@ import logging from typing import Any, ClassVar, TextIO -from BaseClasses import CollectionState, Entrance, Item, ItemClassification, MultiWorld, Tutorial +from BaseClasses import CollectionState, Entrance, EntranceType, Item, ItemClassification, MultiWorld, Tutorial from Options import Accessibility from Utils import output_path from settings import FilePath, Group @@ -17,6 +17,7 @@ from .regions import LEVELS, MEGA_SHARDS, LOCATIONS, REGION_CONNECTIONS from .rules import MessengerHardRules, MessengerOOBRules, MessengerRules from .shop import FIGURINES, PROG_SHOP_ITEMS, SHOP_ITEMS, USEFUL_SHOP_ITEMS, shuffle_shop_prices from .subclasses import MessengerEntrance, MessengerItem, MessengerRegion, MessengerShopLocation +from .transitions import shuffle_transitions components.append( Component("The Messenger", component_type=Type.CLIENT, func=launch_game, game_name="The Messenger", supports_uri=True) @@ -128,7 +129,7 @@ class MessengerWorld(World): spoiler_portal_mapping: dict[str, str] portal_mapping: list[int] transitions: list[Entrance] - reachable_locs: int = 0 + reachable_locs: bool = False filler: dict[str, int] def generate_early(self) -> None: @@ -145,13 +146,13 @@ class MessengerWorld(World): self.shop_prices, self.figurine_prices = shuffle_shop_prices(self) - starting_portals = ["Autumn Hills", "Howling Grotto", "Glacial Peak", "Riviere Turquoise", "Sunken Shrine", "Searing Crags"] + starting_portals = ["Autumn Hills", "Howling Grotto", "Glacial Peak", "Riviere Turquoise", "Sunken Shrine", + "Searing Crags"] self.starting_portals = [f"{portal} Portal" for portal in starting_portals[:3] + self.random.sample(starting_portals[3:], k=self.options.available_portals - 3)] # super complicated method for adding searing crags to starting portals if it wasn't chosen - # TODO add a check for transition shuffle when that gets added back in if not self.options.shuffle_portals and "Searing Crags Portal" not in self.starting_portals: self.starting_portals.append("Searing Crags Portal") portals_to_strip = [portal for portal in ["Riviere Turquoise Portal", "Sunken Shrine Portal"] @@ -181,7 +182,7 @@ class MessengerWorld(World): region_name = region.name.removeprefix(f"{region.parent} - ") connection_data = CONNECTIONS[region.parent][region_name] for exit_region in connection_data: - region.connect(self.multiworld.get_region(exit_region, self.player)) + region.connect(self.get_region(exit_region)) # all regions need to be created before i can do these connections so we create and connect the complex first for region in [level for level in simple_regions if level.name in REGION_CONNECTIONS]: @@ -256,6 +257,7 @@ class MessengerWorld(World): f" {logic} for {self.multiworld.get_player_name(self.player)}") # MessengerOOBRules(self).set_messenger_rules() + def connect_entrances(self) -> None: add_closed_portal_reqs(self) # i need portal shuffle to happen after rules exist so i can validate it attempts = 5 @@ -271,6 +273,9 @@ class MessengerWorld(World): else: raise RuntimeError("Unable to generate valid portal output.") + if self.options.shuffle_transitions: + shuffle_transitions(self) + def write_spoiler_header(self, spoiler_handle: TextIO) -> None: if self.options.available_portals < 6: spoiler_handle.write(f"\nStarting Portals:\n\n") @@ -286,9 +291,54 @@ class MessengerWorld(World): key=lambda portal: ["Autumn Hills", "Riviere Turquoise", "Howling Grotto", "Sunken Shrine", - "Searing Crags", "Glacial Peak"].index(portal[0])) + "Searing Crags", "Glacial Peak"].index(portal[0]) + ) for portal, output in portal_info: - spoiler.set_entrance(f"{portal} Portal", output, "I can write anything I want here lmao", self.player) + spoiler.set_entrance(f"{portal} Portal", output, "", self.player) + + if self.options.shuffle_transitions: + for transition in self.transitions: + if (transition.randomization_type == EntranceType.TWO_WAY + and (transition.connected_region.name, "both", self.player) in spoiler.entrances): + continue + spoiler.set_entrance( + transition.name if "->" not in transition.name else transition.parent_region.name, + transition.connected_region.name, + "both" if transition.randomization_type == EntranceType.TWO_WAY + and self.options.shuffle_transitions == ShuffleTransitions.option_coupled else "", + self.player + ) + + def extend_hint_information(self, hint_data: dict[int, dict[int, str]]) -> None: + if not self.options.shuffle_transitions: + return + + hint_data.update({self.player: {}}) + + all_state = self.multiworld.get_all_state(True) + # sometimes some of my regions aren't in path for some reason? + all_state.update_reachable_regions(self.player) + paths = all_state.path + start = self.get_region("Tower HQ") + start_connections = [entrance.name for entrance in start.exits if entrance not in {"Home", "Shrink Down"}] + transition_names = [transition.name for transition in self.transitions] + start_connections + for loc in self.get_locations(): + if (loc.parent_region.name in {"Tower HQ", "The Shop", "Music Box", "The Craftsman's Corner"} + or loc.address is None): + continue + path_to_loc: list[str] = [] + name, connection = paths.get(loc.parent_region, (None, None)) + while connection != ("Menu", None) and name is not None: + name, connection = connection + if name in transition_names: + if name in start_connections: + name = f"{name} -> {self.get_entrance(name).connected_region.name}" + path_to_loc.append(name) + + text = " => ".join(reversed(path_to_loc)) + if not text: + continue + hint_data[self.player][loc.address] = text def fill_slot_data(self) -> dict[str, Any]: slot_data = { @@ -308,11 +358,13 @@ class MessengerWorld(World): def get_filler_item_name(self) -> str: if not getattr(self, "_filler_items", None): - self._filler_items = [name for name in self.random.choices( - list(self.filler), - weights=list(self.filler.values()), - k=20 - )] + self._filler_items = [ + name for name in self.random.choices( + list(self.filler), + weights=list(self.filler.values()), + k=20 + ) + ] return self._filler_items.pop(0) def create_item(self, name: str) -> MessengerItem: @@ -331,7 +383,7 @@ class MessengerWorld(World): self.total_shards += count return ItemClassification.progression_skip_balancing if count else ItemClassification.filler - if name == "Windmill Shuriken" and getattr(self, "multiworld", None) is not None: + if name == "Windmill Shuriken": return ItemClassification.progression if self.options.logic_level else ItemClassification.filler if name == "Power Seal": @@ -344,7 +396,7 @@ class MessengerWorld(World): if name in {*USEFUL_ITEMS, *USEFUL_SHOP_ITEMS}: return ItemClassification.useful - + if name in TRAPS: return ItemClassification.trap @@ -354,7 +406,7 @@ class MessengerWorld(World): def create_group(cls, multiworld: "MultiWorld", new_player_id: int, players: set[int]) -> World: group = super().create_group(multiworld, new_player_id, players) assert isinstance(group, MessengerWorld) - + group.filler = FILLER.copy() group.options.traps.value = all(multiworld.worlds[player].options.traps for player in players) if group.options.traps: diff --git a/worlds/messenger/connections.py b/worlds/messenger/connections.py index 79912a5688..84f7f9b242 100644 --- a/worlds/messenger/connections.py +++ b/worlds/messenger/connections.py @@ -244,14 +244,12 @@ CONNECTIONS: dict[str, dict[str, list[str]]] = { "Bottom Left": [ "Howling Grotto - Top", "Quillshroom Marsh - Sand Trap Shop", - "Quillshroom Marsh - Bottom Right", ], "Top Right": [ "Quillshroom Marsh - Queen of Quills Shop", "Searing Crags - Left", ], "Bottom Right": [ - "Quillshroom Marsh - Bottom Left", "Quillshroom Marsh - Sand Trap Shop", "Searing Crags - Bottom", ], @@ -639,43 +637,43 @@ CONNECTIONS: dict[str, dict[str, list[str]]] = { } RANDOMIZED_CONNECTIONS: dict[str, str] = { - "Ninja Village - Right": "Autumn Hills - Left", - "Autumn Hills - Left": "Ninja Village - Right", - "Autumn Hills - Right": "Forlorn Temple - Left", - "Autumn Hills - Bottom": "Catacombs - Bottom Left", - "Forlorn Temple - Left": "Autumn Hills - Right", - "Forlorn Temple - Right": "Bamboo Creek - Top Left", - "Forlorn Temple - Bottom": "Catacombs - Top Left", - "Catacombs - Top Left": "Forlorn Temple - Bottom", - "Catacombs - Bottom Left": "Autumn Hills - Bottom", - "Catacombs - Bottom": "Dark Cave - Right", - "Catacombs - Right": "Bamboo Creek - Bottom Left", - "Bamboo Creek - Bottom Left": "Catacombs - Right", - "Bamboo Creek - Right": "Howling Grotto - Left", - "Bamboo Creek - Top Left": "Forlorn Temple - Right", - "Howling Grotto - Left": "Bamboo Creek - Right", - "Howling Grotto - Top": "Quillshroom Marsh - Bottom Left", - "Howling Grotto - Right": "Quillshroom Marsh - Top Left", - "Howling Grotto - Bottom": "Sunken Shrine - Left", - "Quillshroom Marsh - Top Left": "Howling Grotto - Right", - "Quillshroom Marsh - Bottom Left": "Howling Grotto - Top", - "Quillshroom Marsh - Top Right": "Searing Crags - Left", + "Ninja Village - Right": "Autumn Hills - Left", + "Autumn Hills - Left": "Ninja Village - Right", + "Autumn Hills - Right": "Forlorn Temple - Left", + "Autumn Hills - Bottom": "Catacombs - Bottom Left", + "Forlorn Temple - Left": "Autumn Hills - Right", + "Forlorn Temple - Right": "Bamboo Creek - Top Left", + "Forlorn Temple - Bottom": "Catacombs - Top Left", + "Catacombs - Top Left": "Forlorn Temple - Bottom", + "Catacombs - Bottom Left": "Autumn Hills - Bottom", + "Catacombs - Bottom": "Dark Cave - Right", + "Catacombs - Right": "Bamboo Creek - Bottom Left", + "Bamboo Creek - Bottom Left": "Catacombs - Right", + "Bamboo Creek - Right": "Howling Grotto - Left", + "Bamboo Creek - Top Left": "Forlorn Temple - Right", + "Howling Grotto - Left": "Bamboo Creek - Right", + "Howling Grotto - Top": "Quillshroom Marsh - Bottom Left", + "Howling Grotto - Right": "Quillshroom Marsh - Top Left", + "Howling Grotto - Bottom": "Sunken Shrine - Left", + "Quillshroom Marsh - Top Left": "Howling Grotto - Right", + "Quillshroom Marsh - Bottom Left": "Howling Grotto - Top", + "Quillshroom Marsh - Top Right": "Searing Crags - Left", "Quillshroom Marsh - Bottom Right": "Searing Crags - Bottom", - "Searing Crags - Left": "Quillshroom Marsh - Top Right", - "Searing Crags - Top": "Glacial Peak - Bottom", - "Searing Crags - Bottom": "Quillshroom Marsh - Bottom Right", - "Searing Crags - Right": "Underworld - Left", - "Glacial Peak - Bottom": "Searing Crags - Top", - "Glacial Peak - Top": "Cloud Ruins - Left", - "Glacial Peak - Left": "Elemental Skylands - Air Shmup", - "Cloud Ruins - Left": "Glacial Peak - Top", - "Elemental Skylands - Right": "Glacial Peak - Left", - "Tower HQ": "Tower of Time - Left", - "Artificer": "Corrupted Future", - "Underworld - Left": "Searing Crags - Right", - "Dark Cave - Right": "Catacombs - Bottom", - "Dark Cave - Left": "Riviere Turquoise - Right", - "Sunken Shrine - Left": "Howling Grotto - Bottom", + "Searing Crags - Left": "Quillshroom Marsh - Top Right", + "Searing Crags - Top": "Glacial Peak - Bottom", + "Searing Crags - Bottom": "Quillshroom Marsh - Bottom Right", + "Searing Crags - Right": "Underworld - Left", + "Glacial Peak - Bottom": "Searing Crags - Top", + "Glacial Peak - Top": "Cloud Ruins - Left", + "Glacial Peak - Left": "Elemental Skylands - Air Shmup", + "Cloud Ruins - Left": "Glacial Peak - Top", + "Elemental Skylands - Right": "Glacial Peak - Left", + "Tower HQ": "Tower of Time - Left", + "Artificer": "Corrupted Future", + "Underworld - Left": "Searing Crags - Right", + "Dark Cave - Right": "Catacombs - Bottom", + "Dark Cave - Left": "Riviere Turquoise - Right", + "Sunken Shrine - Left": "Howling Grotto - Bottom", } TRANSITIONS: list[str] = [ diff --git a/worlds/messenger/options.py b/worlds/messenger/options.py index 8b61a94354..9ee04d26a6 100644 --- a/worlds/messenger/options.py +++ b/worlds/messenger/options.py @@ -3,7 +3,8 @@ from dataclasses import dataclass from schema import And, Optional, Or, Schema from Options import Choice, DeathLinkMixin, DefaultOnToggle, ItemsAccessibility, OptionDict, PerGameCommonOptions, \ - PlandoConnections, Range, StartInventoryPool, Toggle, Visibility + PlandoConnections, Range, StartInventoryPool, Toggle +from . import RANDOMIZED_CONNECTIONS from .portals import CHECKPOINTS, PORTALS, SHOP_POINTS @@ -30,17 +31,25 @@ class PortalPlando(PlandoConnections): portals = [f"{portal} Portal" for portal in PORTALS] shop_points = [point for points in SHOP_POINTS.values() for point in points] checkpoints = [point for points in CHECKPOINTS.values() for point in points] - portal_entrances = PORTALS - portal_exits = portals + shop_points + checkpoints - entrances = portal_entrances - exits = portal_exits + + entrances = frozenset(PORTALS) + exits = frozenset(portals + shop_points + checkpoints) -# for back compatibility. To later be replaced with transition plando -class HiddenPortalPlando(PortalPlando): - visibility = Visibility.none - entrances = PortalPlando.entrances - exits = PortalPlando.exits +class TransitionPlando(PlandoConnections): + """ + Plando connections to be used with transition shuffle. + List of valid connections can be found at https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/messenger/connections.py#L641. + Dictionary keys (left) are entrances and values (right) are exits. If transition shuffle is on coupled all plando + connections will be coupled. If on decoupled, "entrance" and "exit" will be treated the same, simply making the + plando connection one-way from entrance to exit. + Example: + - entrance: Searing Crags - Top + exit: Dark Cave - Right + direction: both + """ + entrances = frozenset(RANDOMIZED_CONNECTIONS.keys()) + exits = frozenset(RANDOMIZED_CONNECTIONS.values()) class Logic(Choice): @@ -226,7 +235,7 @@ class MessengerOptions(DeathLinkMixin, PerGameCommonOptions): early_meditation: EarlyMed available_portals: AvailablePortals shuffle_portals: ShufflePortals - # shuffle_transitions: ShuffleTransitions + shuffle_transitions: ShuffleTransitions goal: Goal music_box: MusicBox notes_needed: NotesNeeded @@ -236,4 +245,4 @@ class MessengerOptions(DeathLinkMixin, PerGameCommonOptions): shop_price: ShopPrices shop_price_plan: PlannedShopPrices portal_plando: PortalPlando - plando_connections: HiddenPortalPlando + plando_connections: TransitionPlando diff --git a/worlds/messenger/portals.py b/worlds/messenger/portals.py index 896fefa686..704285896c 100644 --- a/worlds/messenger/portals.py +++ b/worlds/messenger/portals.py @@ -1,7 +1,7 @@ from copy import deepcopy from typing import TYPE_CHECKING -from BaseClasses import CollectionState, PlandoOptions +from BaseClasses import CollectionState from Options import PlandoConnection if TYPE_CHECKING: @@ -252,9 +252,7 @@ def shuffle_portals(world: "MessengerWorld") -> None: world.random.shuffle(available_portals) plando = world.options.portal_plando.value - if not plando: - plando = world.options.plando_connections.value - if plando and world.multiworld.plando_options & PlandoOptions.connections and not world.plando_portals: + if plando and not world.plando_portals: try: handle_planned_portals(plando) # any failure i expect will trigger on available_portals.remove @@ -294,8 +292,8 @@ def disconnect_portals(world: "MessengerWorld") -> None: def validate_portals(world: "MessengerWorld") -> bool: - # if world.options.shuffle_transitions: - # return True + if world.options.shuffle_transitions: + return True new_state = CollectionState(world.multiworld) new_state.update_reachable_regions(world.player) reachable_locs = 0 diff --git a/worlds/messenger/subclasses.py b/worlds/messenger/subclasses.py index 29e3ea8953..0138a3f074 100644 --- a/worlds/messenger/subclasses.py +++ b/worlds/messenger/subclasses.py @@ -1,7 +1,8 @@ from functools import cached_property from typing import TYPE_CHECKING -from BaseClasses import CollectionState, Entrance, Item, ItemClassification, Location, Region +from BaseClasses import CollectionState, Entrance, EntranceType, Item, ItemClassification, Location, Region +from entrance_rando import ERPlacementState from .regions import LOCATIONS, MEGA_SHARDS from .shop import FIGURINES, SHOP_ITEMS @@ -12,9 +13,21 @@ if TYPE_CHECKING: class MessengerEntrance(Entrance): world: "MessengerWorld | None" = None + def can_connect_to(self, other: Entrance, dead_end: bool, state: "ERPlacementState") -> bool: + can_connect = super().can_connect_to(other, dead_end, state) + world: MessengerWorld = getattr(self, "world", None) + if not world or world.reachable_locs or not can_connect: + return can_connect + empty_state = CollectionState(world.multiworld, True) + self.connected_region = other.connected_region + empty_state.update_reachable_regions(world.player) + world.reachable_locs = any(loc.can_reach(empty_state) and not loc.is_event for loc in world.get_locations()) + self.connected_region = None + return world.reachable_locs and (not state.coupled or self.name != other.name) + class MessengerRegion(Region): - parent: str + parent: str | None entrance_type = MessengerEntrance def __init__(self, name: str, world: "MessengerWorld", parent: str | None = None) -> None: @@ -32,8 +45,9 @@ class MessengerRegion(Region): for shop_loc in SHOP_ITEMS} self.add_locations(shop_locations, MessengerShopLocation) elif name == "The Craftsman's Corner": - self.add_locations({figurine: world.location_name_to_id[figurine] for figurine in FIGURINES}, - MessengerLocation) + self.add_locations( + {figurine: world.location_name_to_id[figurine] for figurine in FIGURINES}, + MessengerLocation) elif name == "Tower HQ": locations.append("Money Wrench") @@ -57,6 +71,7 @@ class MessengerLocation(Location): class MessengerShopLocation(MessengerLocation): + @cached_property def cost(self) -> int: name = self.name.removeprefix("The Shop - ") diff --git a/worlds/messenger/test/test_entrance_randomization.py b/worlds/messenger/test/test_entrance_randomization.py new file mode 100644 index 0000000000..2a06a2e034 --- /dev/null +++ b/worlds/messenger/test/test_entrance_randomization.py @@ -0,0 +1,19 @@ +import unittest + +from . import MessengerTestBase + + +class StrictEntranceRandoTest(MessengerTestBase): + """Bare-bones world that tests the strictest possible settings to ensure it doesn't crash""" + auto_construct = True + options = { + "limited_movement": 1, + "available_portals": 3, + "shuffle_portals": 1, + "shuffle_transitions": 1, + } + + @unittest.skip + def test_all_state_can_reach_everything(self) -> None: + """It's not possible to reach everything with these options so skip this test.""" + pass diff --git a/worlds/messenger/transitions.py b/worlds/messenger/transitions.py new file mode 100644 index 0000000000..1db975b3cd --- /dev/null +++ b/worlds/messenger/transitions.py @@ -0,0 +1,92 @@ +from typing import TYPE_CHECKING + +from BaseClasses import Region +from entrance_rando import EntranceType, randomize_entrances +from .connections import RANDOMIZED_CONNECTIONS, TRANSITIONS +from .options import ShuffleTransitions, TransitionPlando + +if TYPE_CHECKING: + from . import MessengerWorld + + +def connect_plando(world: "MessengerWorld", plando_connections: TransitionPlando) -> None: + def remove_dangling_exit(region: Region) -> None: + # find the disconnected exit and remove references to it + for _exit in region.exits: + if not _exit.connected_region: + break + else: + raise ValueError(f"Unable to find randomized transition for {plando_connection}") + region.exits.remove(_exit) + + def remove_dangling_entrance(region: Region) -> None: + # find the disconnected entrance and remove references to it + for _entrance in region.entrances: + if not _entrance.parent_region: + break + else: + raise ValueError(f"Invalid target region for {plando_connection}") + region.entrances.remove(_entrance) + + for plando_connection in plando_connections: + # get the connecting regions + reg1 = world.get_region(plando_connection.entrance) + reg2 = world.get_region(plando_connection.exit) + + remove_dangling_exit(reg1) + remove_dangling_entrance(reg2) + # connect the regions + reg1.connect(reg2) + + # pretend the user set the plando direction as "both" regardless of what they actually put on coupled + if ((world.options.shuffle_transitions == ShuffleTransitions.option_coupled + or plando_connection.direction == "both") + and plando_connection.exit in RANDOMIZED_CONNECTIONS): + remove_dangling_exit(reg2) + remove_dangling_entrance(reg1) + reg2.connect(reg1) + + +def shuffle_transitions(world: "MessengerWorld") -> None: + coupled = world.options.shuffle_transitions == ShuffleTransitions.option_coupled + + def disconnect_entrance() -> None: + child_region.entrances.remove(entrance) + entrance.connected_region = None + + er_type = EntranceType.ONE_WAY if child == "Glacial Peak - Left" else \ + EntranceType.TWO_WAY if child in RANDOMIZED_CONNECTIONS else EntranceType.ONE_WAY + if er_type == EntranceType.TWO_WAY: + mock_entrance = parent_region.create_er_target(entrance.name) + else: + mock_entrance = child_region.create_er_target(child) + + entrance.randomization_type = er_type + mock_entrance.randomization_type = er_type + + for parent, child in RANDOMIZED_CONNECTIONS.items(): + if child == "Corrupted Future": + entrance = world.get_entrance("Artificer's Portal") + elif child == "Tower of Time - Left": + entrance = world.get_entrance("Artificer's Challenge") + else: + entrance = world.get_entrance(f"{parent} -> {child}") + parent_region = entrance.parent_region + child_region = entrance.connected_region + entrance.world = world + disconnect_entrance() + + plando = world.options.plando_connections + if plando: + connect_plando(world, plando) + + result = randomize_entrances(world, coupled, {0: [0]}) + + world.transitions = sorted(result.placements, key=lambda entrance: TRANSITIONS.index(entrance.parent_region.name)) + + for transition in world.transitions: + if "->" not in transition.name: + continue + transition.parent_region.exits.remove(transition) + transition.name = f"{transition.parent_region.name} -> {transition.connected_region.name}" + transition.parent_region.exits.append(transition) From e267714d441c56e6a8bd1496138dc17ff0861035 Mon Sep 17 00:00:00 2001 From: Mysteryem Date: Mon, 10 Mar 2025 15:34:10 +0000 Subject: [PATCH 094/227] AHiT: Rework Subcon Forest Boss Arena, Boss Firewall and YCHE logic (#4494) A new `Subcon Forest - Behind Boss Firewall` region is added for `Subcon Village - Snatcher Statue Chest`. `Subcon Forest Area` connects to this new region, requiring either the first `Progressive Painting Unlock`, or Expert logic + `NoPaintingSkips: false`. A new `Subcon Forest Boss Arena` region is added for `Subcon Forest - Boss Arena Chest` because this is immediately accessible from YCHE. There are connections to this region from `Your Contract has Expired` (no requirements) and from `Subcon Forest - Behind Boss Firewall` (requiring either Hard logic or `Hookshot Badge` + `TOD Access`). A reverse connection is also added to Expert logic, for `Subcon Forest Boss Arena` -> `Subcon Forest - Behind Boss Firewall`. This could be extended to include Hard logic if there is a reasonable Cherry Bridge setup. A reverse connection is also added to Expert logic, for `Subcon Forest - Behind Boss Firewall` -> `Subcon Forest Area`, so long as `NoPaintingSkips: false` because it is impossible to burn the paintings to remove the firewall, from behind the firewall. A new `Your Contract has Expired - Post Fight` region is added for the Snatcher post fight cutscene to prevent the Snatcher Hover trick giving access to YCHE, which would otherwise also give access to the new `Subcon Forest Boss Arena` Region. The paintings and boss arena gap logic for `Snatcher Statue Chest` and `Boss Arena Chest` are now handled using the connections to/from these new regions rather than being on the locations themselves. The logic for `Act Completion (Toilet of Doom)` remains unchanged because it has to be in the `Toilet of Doom` region. In Expert logic, with `NoPaintingSkips: false`, YCHE is added as a rift access region to Subcon Forest Time Rift entrances. The `YCHE Access` event is no longer used and has been removed. - Fixes painting skips logic for Subcon Village - Snatcher Statue Chest - Fixes Subcon Forest - Boss Arena Chest being inaccessible from YCHE - Adds Expert logic to reach `Snatcher Statue Chest` from YCHE - Adds Expert logic to skip the boss firewall in reverse from YCHE so long as painting skips are not removed from logic - Adds Expert logic to access Subcon Forest Time Rift entrances from YCHE so long as painting skips are not removed from logic --- worlds/ahit/Locations.py | 7 ++-- worlds/ahit/Regions.py | 25 +++++++++++++- worlds/ahit/Rules.py | 75 ++++++++++++++++++++++++++++++---------- 3 files changed, 84 insertions(+), 23 deletions(-) diff --git a/worlds/ahit/Locations.py b/worlds/ahit/Locations.py index b34e6bb4a7..713113e691 100644 --- a/worlds/ahit/Locations.py +++ b/worlds/ahit/Locations.py @@ -206,7 +206,7 @@ ahit_locations = { "Subcon Village - Graveyard Ice Cube": LocData(2000325077, "Subcon Forest Area"), "Subcon Village - House Top": LocData(2000325471, "Subcon Forest Area"), "Subcon Village - Ice Cube House": LocData(2000325469, "Subcon Forest Area"), - "Subcon Village - Snatcher Statue Chest": LocData(2000323730, "Subcon Forest Area", paintings=1), + "Subcon Village - Snatcher Statue Chest": LocData(2000323730, "Subcon Forest Behind Boss Firewall"), "Subcon Village - Stump Platform Chest": LocData(2000323729, "Subcon Forest Area"), "Subcon Forest - Giant Tree Climb": LocData(2000325470, "Subcon Forest Area"), @@ -233,7 +233,7 @@ ahit_locations = { "Subcon Forest - Long Tree Climb Chest": LocData(2000323734, "Subcon Forest Area", required_hats=[HatType.DWELLER], paintings=2), - "Subcon Forest - Boss Arena Chest": LocData(2000323735, "Subcon Forest Area"), + "Subcon Forest - Boss Arena Chest": LocData(2000323735, "Subcon Forest Boss Arena"), "Subcon Forest - Manor Rooftop": LocData(2000325466, "Subcon Forest Area", hit_type=HitType.dweller_bell, paintings=1), @@ -411,7 +411,7 @@ act_completions = { "Act Completion (Mail Delivery Service)": LocData(2000312032, "Mail Delivery Service", required_hats=[HatType.SPRINT]), - "Act Completion (Your Contract has Expired)": LocData(2000311390, "Your Contract has Expired", + "Act Completion (Your Contract has Expired)": LocData(2000311390, "Your Contract has Expired - Post Fight", hit_type=HitType.umbrella), "Act Completion (Time Rift - Pipe)": LocData(2000313069, "Time Rift - Pipe", hookshot=True), @@ -976,7 +976,6 @@ event_locs = { **snatcher_coins, "HUMT Access": LocData(0, "Heating Up Mafia Town"), "TOD Access": LocData(0, "Toilet of Doom"), - "YCHE Access": LocData(0, "Your Contract has Expired"), "AFR Access": LocData(0, "Alpine Free Roam"), "TIHS Access": LocData(0, "The Illness has Spread"), diff --git a/worlds/ahit/Regions.py b/worlds/ahit/Regions.py index 31edf1d0b0..857c04f1d7 100644 --- a/worlds/ahit/Regions.py +++ b/worlds/ahit/Regions.py @@ -347,7 +347,7 @@ def create_regions(world: "HatInTimeWorld"): sf_act3 = create_region_and_connect(world, "Toilet of Doom", "Subcon Forest - Act 3", subcon_forest) sf_act4 = create_region_and_connect(world, "Queen Vanessa's Manor", "Subcon Forest - Act 4", subcon_forest) sf_act5 = create_region_and_connect(world, "Mail Delivery Service", "Subcon Forest - Act 5", subcon_forest) - create_region_and_connect(world, "Your Contract has Expired", "Subcon Forest - Finale", subcon_forest) + sf_finale = create_region_and_connect(world, "Your Contract has Expired", "Subcon Forest - Finale", subcon_forest) # ------------------------------------------- ALPINE SKYLINE ------------------------------------------ # alpine_skyline = create_region_and_connect(world, "Alpine Skyline", "Telescope -> Alpine Skyline", spaceship) @@ -386,11 +386,24 @@ def create_regions(world: "HatInTimeWorld"): create_rift_connections(world, create_region(world, "Time Rift - Bazaar")) sf_area: Region = create_region(world, "Subcon Forest Area") + sf_behind_boss_firewall: Region = create_region(world, "Subcon Forest Behind Boss Firewall") + sf_boss_arena: Region = create_region(world, "Subcon Forest Boss Arena") + sf_area.connect(sf_behind_boss_firewall, "SF Area -> SF Behind Boss Firewall") + sf_behind_boss_firewall.connect(sf_boss_arena, "SF Behind Boss Firewall -> SF Boss Arena") sf_act1.connect(sf_area, "Subcon Forest Entrance CO") sf_act2.connect(sf_area, "Subcon Forest Entrance SW") sf_act3.connect(sf_area, "Subcon Forest Entrance TOD") sf_act4.connect(sf_area, "Subcon Forest Entrance QVM") sf_act5.connect(sf_area, "Subcon Forest Entrance MDS") + # YCHE puts the player directly in the boss arena, with no access to the rest of Subcon Forest by default. + sf_finale.connect(sf_boss_arena, "Subcon Forest Entrance YCHE") + # To support the Snatcher Hover expert logic for Act Completion (Your Contract has Expired), the act completion has + # to go in a separate region because the Snatcher Hover gives direct access to the Act Completion, but does not + # give access to the act itself. + sf_finale_post_fight: Region = create_region(world, "Your Contract has Expired - Post Fight") + # This connection must never have any rules placed on it because they will not be inherited when setting up act + # connections, only the rules for the entrances to the act and the rules for the Act Completion are inherited. + sf_finale.connect(sf_finale_post_fight, "YCHE -> YCHE - Post Fight") create_rift_connections(world, create_region(world, "Time Rift - Sleepy Subcon")) create_rift_connections(world, create_region(world, "Time Rift - Pipe")) @@ -947,6 +960,16 @@ def get_shuffled_region(world: "HatInTimeWorld", region: str) -> str: return name +def get_region_shuffled_to(world: "HatInTimeWorld", region: str) -> str: + if world.options.ActRandomizer: + original_ci: str = chapter_act_info[region] + shuffled_ci = world.act_connections[original_ci] + return next(act_name for act_name, ci in chapter_act_info.items() + if ci == shuffled_ci) + else: + return region + + def get_region_location_count(world: "HatInTimeWorld", region_name: str, included_only: bool = True) -> int: count = 0 region = world.multiworld.get_region(region_name, world.player) diff --git a/worlds/ahit/Rules.py b/worlds/ahit/Rules.py index 6753b8eb81..2ca0628a68 100644 --- a/worlds/ahit/Rules.py +++ b/worlds/ahit/Rules.py @@ -481,9 +481,8 @@ def set_hard_rules(world: "HatInTimeWorld"): set_rule(world.multiworld.get_location("Subcon Forest - Dweller Platforming Tree B", world.player), lambda state: has_paintings(state, world, 3)) - # Cherry bridge over boss arena gap (painting still expected) - set_rule(world.multiworld.get_location("Subcon Forest - Boss Arena Chest", world.player), - lambda state: has_paintings(state, world, 1, False) or state.has("YCHE Access", world.player)) + # Cherry bridge over boss arena gap + set_rule(world.get_entrance("SF Behind Boss Firewall -> SF Boss Arena"), lambda state: True) set_rule(world.multiworld.get_location("Subcon Forest - Noose Treehouse", world.player), lambda state: has_paintings(state, world, 2, True)) @@ -566,27 +565,61 @@ def set_expert_rules(world: "HatInTimeWorld"): lambda state: True) # Expert: Cherry Hovering - subcon_area = world.multiworld.get_region("Subcon Forest Area", world.player) - yche = world.multiworld.get_region("Your Contract has Expired", world.player) - entrance = yche.connect(subcon_area, "Subcon Forest Entrance YCHE") + # Skipping the boss firewall is possible with a Cherry Hover. + set_rule(world.get_entrance("SF Area -> SF Behind Boss Firewall"), + lambda state: has_paintings(state, world, 1, True)) + # The boss arena gap can be crossed in reverse with a Cherry Hover. + subcon_boss_arena = world.get_region("Subcon Forest Boss Arena") + subcon_behind_boss_firewall = world.get_region("Subcon Forest Behind Boss Firewall") + subcon_boss_arena.connect(subcon_behind_boss_firewall, "SF Boss Arena -> SF Behind Boss Firewall") - if world.options.NoPaintingSkips: - add_rule(entrance, lambda state: has_paintings(state, world, 1)) + subcon_area = world.get_region("Subcon Forest Area") + + # The boss firewall can be skipped in reverse with a Cherry Hover, but it is not possible to remove the boss + # firewall from reverse because the paintings to burn to remove the firewall are on the other side of the firewall. + # Therefore, a painting skip is required. The paintings could be burned by already having access to + # "Subcon Forest Area" through another entrance, but making a new connection to "Subcon Forest Area" in that case + # would be pointless. + if not world.options.NoPaintingSkips: + # The import cannot be done at the module-level because it would cause a circular import. + from .Regions import get_region_shuffled_to + + subcon_behind_boss_firewall.connect(subcon_area, "SF Behind Boss Firewall -> SF Area") + + # Because the Your Contract has Expired entrance can now reach "Subcon Forest Area", it needs to be connected to + # each of the Subcon Forest Time Rift entrances, like the other Subcon Forest Acts. + yche = world.get_region("Your Contract has Expired") + + def connect_to_shuffled_act_at(original_act_name): + region_name = get_region_shuffled_to(world, original_act_name) + return yche.connect(world.get_region(region_name), f"{original_act_name} Portal - Entrance YCHE") + + # Rules copied from `Rules.set_rift_rules()` with painting logic removed because painting skips must be + # available. + entrance = connect_to_shuffled_act_at("Time Rift - Pipe") + add_rule(entrance, lambda state: can_clear_required_act(state, world, "Subcon Forest - Act 2")) + reg_act_connection(world, world.get_entrance("Subcon Forest - Act 2").connected_region, entrance) + + entrance = connect_to_shuffled_act_at("Time Rift - Village") + add_rule(entrance, lambda state: can_clear_required_act(state, world, "Subcon Forest - Act 4")) + reg_act_connection(world, world.get_entrance("Subcon Forest - Act 4").connected_region, entrance) + + entrance = connect_to_shuffled_act_at("Time Rift - Sleepy Subcon") + add_rule(entrance, lambda state: has_relic_combo(state, world, "UFO")) set_rule(world.multiworld.get_location("Act Completion (Toilet of Doom)", world.player), lambda state: can_use_hookshot(state, world) and can_hit(state, world) and has_paintings(state, world, 1, True)) # Set painting rules only. Skipping paintings is determined in has_paintings - set_rule(world.multiworld.get_location("Subcon Forest - Boss Arena Chest", world.player), - lambda state: has_paintings(state, world, 1, True)) set_rule(world.multiworld.get_location("Subcon Forest - Magnet Badge Bush", world.player), lambda state: has_paintings(state, world, 3, True)) # You can cherry hover to Snatcher's post-fight cutscene, which completes the level without having to fight him - subcon_area.connect(yche, "Snatcher Hover") - set_rule(world.multiworld.get_location("Act Completion (Your Contract has Expired)", world.player), - lambda state: True) + yche_post_fight = world.get_region("Your Contract has Expired - Post Fight") + subcon_area.connect(yche_post_fight, "Snatcher Hover") + # Cherry Hover from YCHE also works, so there are no requirements for the Act Completion. + set_rule(world.get_location("Act Completion (Your Contract has Expired)"), lambda state: True) if world.is_dlc2(): # Expert: clear Rush Hour with nothing @@ -681,12 +714,18 @@ def set_subcon_rules(world: "HatInTimeWorld"): lambda state: can_use_hat(state, world, HatType.BREWING) or state.has("Umbrella", world.player) or can_use_hat(state, world, HatType.DWELLER)) - # You can't skip over the boss arena wall without cherry hover, so these two need to be set this way - set_rule(world.multiworld.get_location("Subcon Forest - Boss Arena Chest", world.player), - lambda state: state.has("TOD Access", world.player) and can_use_hookshot(state, world) - and has_paintings(state, world, 1, False) or state.has("YCHE Access", world.player)) + # You can't skip over the boss arena wall without cherry hover. + set_rule(world.get_entrance("SF Area -> SF Behind Boss Firewall"), + lambda state: has_paintings(state, world, 1, False)) - # The painting wall can't be skipped without cherry hover, which is Expert + # The hookpoints to cross the boss arena gap are only present in Toilet of Doom. + set_rule(world.get_entrance("SF Behind Boss Firewall -> SF Boss Arena"), + lambda state: state.has("TOD Access", world.player) + and can_use_hookshot(state, world)) + + # The Act Completion is in the Toilet of Doom region, so the same rules as passing the boss firewall and crossing + # the boss arena gap are required. "TOD Access" is implied from the region so does not need to be included in the + # rule. set_rule(world.multiworld.get_location("Act Completion (Toilet of Doom)", world.player), lambda state: can_use_hookshot(state, world) and can_hit(state, world) and has_paintings(state, world, 1, False)) From dd554092095e51104205bb70c9d4aebf78c2efdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BCbcke?= <49335240+PaddiLu@users.noreply.github.com> Date: Mon, 10 Mar 2025 16:35:40 +0100 Subject: [PATCH 095/227] =?UTF-8?q?Pok=C3=A9mon=20R/B:=20Fix=20Rock=20Tunn?= =?UTF-8?q?el=20B1F=20randomization=20(#4670)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Bottom to central path sealed off * Bottom-to-left-path to right path sealed off * Central opening (r4444): Left unsealed, paths seperated * Top right half rocks fixed * Middle to top opening sealed * Right hallway seal correctly positioned * Top right ladder: Fixed overlapping walls --- worlds/pokemon_rb/rock_tunnel.py | 42 +++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/worlds/pokemon_rb/rock_tunnel.py b/worlds/pokemon_rb/rock_tunnel.py index 3a70709eb0..46b2be3040 100644 --- a/worlds/pokemon_rb/rock_tunnel.py +++ b/worlds/pokemon_rb/rock_tunnel.py @@ -177,7 +177,11 @@ def randomize_rock_tunnel(data, random): if random.randint(0, 1): floor(10, 7) floor(11, 7) - tall(random.randint(12, 17), 8) + if current_map[10][13]==1: + # (13,10) is floor + tall(random.randint(14, 16), 8) + else: + tall(random.randint(12, 16), 8) else: floor(12, 5) floor(12, 6) @@ -185,8 +189,10 @@ def randomize_rock_tunnel(data, random): wide(17, random.randint(3, 5)) r = random.choice([1, 3]) floor(12, r) - floor(12, + 1) - + floor(12, r + 1) + if current_map[4][12] + current_map[5][12] == 2: + # (12,4) and (12,5) are floor + wide(11,4) elif c == 2: r = random.randint(0, 6) if r == 0: @@ -221,6 +227,9 @@ def randomize_rock_tunnel(data, random): #early block wide(13, random.randint(2, 5)) tall(random.randint(14, 15), 1) + if not 1 in (current_map[1][14],current_map[2][13]): + # wide(13,2) and tall(14,1) overlap + single(13,2) elif r == 1: if random.randint(0, 1): tall(16, 5) @@ -243,19 +252,34 @@ def randomize_rock_tunnel(data, random): 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) + if random.randint(0, 1): + floor(1, 14) + floor(2, 14) + else: + floor(3, 14) + floor(4, 14) elif r == 5: - floor(6, 12) - floor(6, 13) + if random.randint(0,1): + floor(6, 12) + floor(6, 13) + else: + floor(5, 14) + floor(6, 14) elif r == 4: if random.randint(0, 1): floor(6, 11) floor(7, 11) else: floor(8, 11) - floor(9, 11) + if current_map[12][10]==32: + # (10,12) is wide + single(9, 11) + else: + floor(9, 11) + if 31 in (current_map[8][6],current_map[8][7]): + # (6,7) or (7,7) are tall + floor(6, 10) + wide(7, 9) elif r == 3: floor(9, 9) floor(9, 10) From be550ff6fb6d8ca4832e0ba7401d069f6c88b3d4 Mon Sep 17 00:00:00 2001 From: Dinopony Date: Mon, 10 Mar 2025 16:35:58 +0100 Subject: [PATCH 096/227] Landstalker: Several small fixes (#4675) * Landstalker: Fixed duplicate entrance names when using the "No teleport tree requirements" option * Landstalker: Fixed more cases of duplicate entrance names when using "Shuffle Trees" with open trees * Landstalker: Fixed endgame locations being present in "Reach Kazalt" goal * Landstalker: Fixed Lithograph hint pointing at the wrong player * Landstalker: Updated docs to remove the link to Steam since game got delisted * Landstalker: Fixed high value hint_count rarely failing at generation * Landstalker: Fixed dynamic shop prices being potentially invalid in case of a progression balancing (changes by ExemptMedic) --- worlds/landstalker/Hints.py | 2 +- worlds/landstalker/__init__.py | 19 ++++++------------- .../landstalker/docs/landstalker_setup_en.md | 2 +- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/worlds/landstalker/Hints.py b/worlds/landstalker/Hints.py index 4211e0ef3b..366925c64d 100644 --- a/worlds/landstalker/Hints.py +++ b/worlds/landstalker/Hints.py @@ -131,7 +131,7 @@ def generate_random_hints(world: "LandstalkerWorld"): hint_texts = list(set(hint_texts)) random.shuffle(hint_texts) - hint_count = world.options.hint_count.value + hint_count = min(world.options.hint_count.value, len(hint_texts)) del hint_texts[hint_count:] hint_source_names = [source["description"] for source in HINT_SOURCES_JSON if diff --git a/worlds/landstalker/__init__.py b/worlds/landstalker/__init__.py index cfdc335c48..98172eb6a7 100644 --- a/worlds/landstalker/__init__.py +++ b/worlds/landstalker/__init__.py @@ -39,7 +39,7 @@ class LandstalkerWorld(World): item_name_to_id = build_item_name_to_id_table() location_name_to_id = build_location_name_to_id_table() - cached_spheres: List[Set[Location]] + cached_spheres: List[Set[Location]] = [] def __init__(self, multiworld, player): super().__init__(multiworld, player) @@ -48,9 +48,11 @@ class LandstalkerWorld(World): self.dark_region_ids = [] self.teleport_tree_pairs = [] self.jewel_items = [] - self.cached_spheres = [] def fill_slot_data(self) -> dict: + if not LandstalkerWorld.cached_spheres: + LandstalkerWorld.cached_spheres = list(self.multiworld.get_spheres()) + # Generate hints. self.adjust_shop_prices() hints = Hints.generate_random_hints(self) @@ -232,18 +234,9 @@ class LandstalkerWorld(World): else: return 4 - @classmethod - def stage_post_fill(cls, multiworld: MultiWorld): - # Cache spheres for hint calculation after fill completes. - cached_spheres = list(multiworld.get_spheres()) - for world in multiworld.get_game_worlds(cls.game): - world.cached_spheres = cached_spheres - @classmethod def stage_modify_multidata(cls, multiworld: MultiWorld, *_): - # Clean up all references in cached spheres after generation completes. - for world in multiworld.get_game_worlds(cls.game): - world.cached_spheres = [] + LandstalkerWorld.cached_spheres = [] def adjust_shop_prices(self): # Calculate prices for items in shops once all items have their final position @@ -254,7 +247,7 @@ class LandstalkerWorld(World): global_price_factor = self.options.shop_prices_factor / 100.0 - spheres = self.cached_spheres + spheres = LandstalkerWorld.cached_spheres sphere_count = len(spheres) for sphere_id, sphere in enumerate(spheres): location: LandstalkerLocation # after conditional, we guarantee it's this kind of location. diff --git a/worlds/landstalker/docs/landstalker_setup_en.md b/worlds/landstalker/docs/landstalker_setup_en.md index 30f85dd8f1..05cf35f8b0 100644 --- a/worlds/landstalker/docs/landstalker_setup_en.md +++ b/worlds/landstalker/docs/landstalker_setup_en.md @@ -6,7 +6,7 @@ - A compatible emulator to run the game - [RetroArch](https://retroarch.com?page=platforms) with the Genesis Plus GX core - [Bizhawk 2.9.1 (x64)](https://tasvideos.org/BizHawk/ReleaseHistory) with the Genesis Plus GX core -- Your legally obtained Landstalker US ROM file (which can be acquired on [Steam](https://store.steampowered.com/app/71118/Landstalker_The_Treasures_of_King_Nole/)) +- A Landstalker US ROM file dumped from the original cartridge ## Installation Instructions From d83294efa7a52170f4a7f71f1e6e2a53056cf368 Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Mon, 10 Mar 2025 18:39:35 +0300 Subject: [PATCH 097/227] Stardew valley: Fix Aurora Vineyard Tablet logic (#4512) * - Add requirement on Aurora Vineyard tablet to start the quest * - Add rule for using the aurora vineyard staircase * - Added a test for the tablet * - Add a few missing items to the test * - Introduce a new item to split the quest from the door and avoir ER issues * - Optimize imports * - Forgot to generate the item * fix Aurora mess # Conflicts: # worlds/stardew_valley/rules.py # worlds/stardew_valley/test/mods/TestMods.py * fix a couple errors in the cherry picked commit, added a method to improve readability and reduce chance of human error on story quest conditions * - remove blank line * - Code review comments * - fixed weird assert name * - fixed accidentally surviving line * - Fixed imports --------- Co-authored-by: Jouramie <16137441+Jouramie@users.noreply.github.com> --- worlds/stardew_valley/data/items.csv | 1 + worlds/stardew_valley/early_items.py | 2 +- worlds/stardew_valley/items.py | 6 ++-- worlds/stardew_valley/locations.py | 4 +-- worlds/stardew_valley/logic/bundle_logic.py | 2 +- worlds/stardew_valley/logic/crafting_logic.py | 2 +- worlds/stardew_valley/logic/quest_logic.py | 31 +++++++++---------- .../logic/relationship_logic.py | 12 +++++-- .../stardew_valley/mods/logic/quests_logic.py | 10 +++++- worlds/stardew_valley/mods/logic/sve_logic.py | 24 +++++++------- worlds/stardew_valley/options/options.py | 6 ++++ worlds/stardew_valley/rules.py | 9 +++--- .../strings/ap_names/mods/mod_items.py | 15 ++++++--- worlds/stardew_valley/test/mods/TestMods.py | 19 ++++++++++-- worlds/stardew_valley/test/mods/TestSVE.py | 29 +++++++++++++++++ 15 files changed, 120 insertions(+), 52 deletions(-) create mode 100644 worlds/stardew_valley/test/mods/TestSVE.py diff --git a/worlds/stardew_valley/data/items.csv b/worlds/stardew_valley/data/items.csv index 05af275ba4..36e048100c 100644 --- a/worlds/stardew_valley/data/items.csv +++ b/worlds/stardew_valley/data/items.csv @@ -928,6 +928,7 @@ id,name,classification,groups,mod_name 10518,Aurora Vineyard Tablet,progression,,Stardew Valley Expanded 10519,Scarlett's Job Offer,progression,,Stardew Valley Expanded 10520,Morgan's Schooling,progression,,Stardew Valley Expanded +10521,Aurora Vineyard Reclamation,progression,,Stardew Valley Expanded 10601,Magic Elixir Recipe,progression,"CHEFSANITY,CHEFSANITY_PURCHASE",Magic 10602,Travel Core Recipe,progression,CRAFTSANITY,Magic 10603,Haste Elixir Recipe,progression,CRAFTSANITY,Stardew Valley Expanded diff --git a/worlds/stardew_valley/early_items.py b/worlds/stardew_valley/early_items.py index 5ad48912a2..1457c5c7c5 100644 --- a/worlds/stardew_valley/early_items.py +++ b/worlds/stardew_valley/early_items.py @@ -41,7 +41,7 @@ def setup_early_items(multiworld, options: stardew_options.StardewValleyOptions, if fishing is not None and content.features.skill_progression.is_progressive: early_forced.append(fishing.level_name) - if options.quest_locations >= 0: + if options.quest_locations.has_story_quests(): early_candidates.append(Wallet.magnifying_glass) if options.special_order_locations & stardew_options.SpecialOrderLocations.option_board: diff --git a/worlds/stardew_valley/items.py b/worlds/stardew_valley/items.py index 1fbe012e27..dcb37a8f41 100644 --- a/worlds/stardew_valley/items.py +++ b/worlds/stardew_valley/items.py @@ -264,7 +264,7 @@ def create_unique_items(item_factory: StardewItemFactory, options: StardewValley def create_raccoons(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): number_progressive_raccoons = 9 - if options.quest_locations < 0: + if options.quest_locations.has_no_story_quests(): number_progressive_raccoons = number_progressive_raccoons - 1 items.extend(item_factory(item) for item in [CommunityUpgrade.raccoon] * number_progressive_raccoons) @@ -387,7 +387,7 @@ def create_quest_rewards(item_factory: StardewItemFactory, options: StardewValle def create_special_quest_rewards(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): - if options.quest_locations < 0: + if options.quest_locations.has_no_story_quests(): return # items.append(item_factory("Adventurer's Guild")) # Now unlocked always! items.append(item_factory(Wallet.club_card)) @@ -698,7 +698,7 @@ def create_quest_rewards_sve(item_factory: StardewItemFactory, options: StardewV if not exclude_ginger_island: items.extend([item_factory(item) for item in SVEQuestItem.sve_always_quest_items_ginger_island]) - if options.quest_locations < 0: + if options.quest_locations.has_no_story_quests(): return items.extend([item_factory(item) for item in SVEQuestItem.sve_quest_items]) diff --git a/worlds/stardew_valley/locations.py b/worlds/stardew_valley/locations.py index df86e08125..c7d787e55d 100644 --- a/worlds/stardew_valley/locations.py +++ b/worlds/stardew_valley/locations.py @@ -191,7 +191,7 @@ def extend_cropsanity_locations(randomized_locations: List[LocationData], conten def extend_quests_locations(randomized_locations: List[LocationData], options: StardewValleyOptions, content: StardewContent): - if options.quest_locations < 0: + if options.quest_locations.has_no_story_quests(): return story_quest_locations = locations_by_tag[LocationTags.STORY_QUEST] @@ -317,7 +317,7 @@ def extend_mandatory_locations(randomized_locations: List[LocationData], options def extend_situational_quest_locations(randomized_locations: List[LocationData], options: StardewValleyOptions): - if options.quest_locations < 0: + if options.quest_locations.has_no_story_quests(): return if ModNames.distant_lands in options.mods: if ModNames.alecto in options.mods: diff --git a/worlds/stardew_valley/logic/bundle_logic.py b/worlds/stardew_valley/logic/bundle_logic.py index 98fda1c73c..8ede4de5e7 100644 --- a/worlds/stardew_valley/logic/bundle_logic.py +++ b/worlds/stardew_valley/logic/bundle_logic.py @@ -76,7 +76,7 @@ SkillLogicMixin, QuestLogicMixin]]): self.logic.region.can_reach_location("Complete Boiler Room")) def can_access_raccoon_bundles(self) -> StardewRule: - if self.options.quest_locations < 0: + if self.options.quest_locations.has_no_story_quests(): return self.logic.received(CommunityUpgrade.raccoon, 1) & self.logic.quest.can_complete_quest(Quest.giant_stump) # 1 - Break the tree diff --git a/worlds/stardew_valley/logic/crafting_logic.py b/worlds/stardew_valley/logic/crafting_logic.py index 28bf0d2af2..bd839707ef 100644 --- a/worlds/stardew_valley/logic/crafting_logic.py +++ b/worlds/stardew_valley/logic/crafting_logic.py @@ -48,7 +48,7 @@ SkillLogicMixin, SpecialOrderLogicMixin, CraftingLogicMixin, QuestLogicMixin]]): else: return self.logic.crafting.received_recipe(recipe.item) if isinstance(recipe.source, QuestSource): - if self.options.quest_locations < 0: + if self.options.quest_locations.has_no_story_quests(): return self.logic.crafting.can_learn_recipe(recipe) else: return self.logic.crafting.received_recipe(recipe.item) diff --git a/worlds/stardew_valley/logic/quest_logic.py b/worlds/stardew_valley/logic/quest_logic.py index 42f401b960..8779848fed 100644 --- a/worlds/stardew_valley/logic/quest_logic.py +++ b/worlds/stardew_valley/logic/quest_logic.py @@ -118,25 +118,24 @@ class QuestLogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, MoneyLogicMi return Has(quest, self.registry.quest_rules, "quest") def has_club_card(self) -> StardewRule: - if self.options.quest_locations < 0: - return self.logic.quest.can_complete_quest(Quest.the_mysterious_qi) - return self.logic.received(Wallet.club_card) + if self.options.quest_locations.has_story_quests(): + return self.logic.received(Wallet.club_card) + return self.logic.quest.can_complete_quest(Quest.the_mysterious_qi) def has_magnifying_glass(self) -> StardewRule: - if self.options.quest_locations < 0: - return self.logic.quest.can_complete_quest(Quest.a_winter_mystery) - return self.logic.received(Wallet.magnifying_glass) + if self.options.quest_locations.has_story_quests(): + return self.logic.received(Wallet.magnifying_glass) + return self.logic.quest.can_complete_quest(Quest.a_winter_mystery) def has_dark_talisman(self) -> StardewRule: - if self.options.quest_locations < 0: - return self.logic.quest.can_complete_quest(Quest.dark_talisman) - return self.logic.received(Wallet.dark_talisman) + if self.options.quest_locations.has_story_quests(): + return self.logic.received(Wallet.dark_talisman) + return self.logic.quest.can_complete_quest(Quest.dark_talisman) def has_raccoon_shop(self) -> StardewRule: - if self.options.quest_locations < 0: - return self.logic.received(CommunityUpgrade.raccoon, 2) & self.logic.quest.can_complete_quest(Quest.giant_stump) - - # 1 - Break the tree - # 2 - Build the house, which summons the bundle racoon. This one is done manually if quests are turned off - # 3 - Raccoon's wife opens the shop - return self.logic.received(CommunityUpgrade.raccoon, 3) + if self.options.quest_locations.has_story_quests(): + # 1 - Break the tree + # 2 - Build the house, which summons the bundle racoon. This one is done manually if quests are turned off + # 3 - Raccoon's wife opens the shop + return self.logic.received(CommunityUpgrade.raccoon, 3) + return self.logic.received(CommunityUpgrade.raccoon, 2) & self.logic.quest.can_complete_quest(Quest.giant_stump) diff --git a/worlds/stardew_valley/logic/relationship_logic.py b/worlds/stardew_valley/logic/relationship_logic.py index 61e63a90c8..b74bdc5645 100644 --- a/worlds/stardew_valley/logic/relationship_logic.py +++ b/worlds/stardew_valley/logic/relationship_logic.py @@ -1,4 +1,5 @@ import math +import typing from typing import Union from Utils import cache_self1 @@ -14,13 +15,18 @@ from ..content.feature import friendsanity from ..data.villagers_data import Villager from ..stardew_rule import StardewRule, True_, false_, true_ from ..strings.ap_names.mods.mod_items import SVEQuestItem -from ..strings.crop_names import Fruit from ..strings.generic_names import Generic from ..strings.gift_names import Gift +from ..strings.quest_names import ModQuest from ..strings.region_names import Region from ..strings.season_names import Season from ..strings.villager_names import NPC, ModNPC +if typing.TYPE_CHECKING: + from ..mods.logic.mod_logic import ModLogicMixin +else: + ModLogicMixin = object + possible_kids = ("Cute Baby", "Ugly Baby") @@ -38,7 +44,7 @@ class RelationshipLogicMixin(BaseLogicMixin): class RelationshipLogic(BaseLogic[Union[RelationshipLogicMixin, BuildingLogicMixin, SeasonLogicMixin, TimeLogicMixin, GiftLogicMixin, RegionLogicMixin, -ReceivedLogicMixin, HasLogicMixin]]): +ReceivedLogicMixin, HasLogicMixin, ModLogicMixin]]): def can_date(self, npc: str) -> StardewRule: return self.logic.relationship.has_hearts(npc, 8) & self.logic.has(Gift.bouquet) @@ -141,7 +147,7 @@ ReceivedLogicMixin, HasLogicMixin]]): rules.append(self.logic.region.can_reach(Region.volcano_floor_10)) elif npc == ModNPC.apples: - rules.append(self.logic.has(Fruit.starfruit)) + rules.append(self.logic.mod.quest.has_completed_aurora_vineyard_bundle()) elif npc == ModNPC.scarlett: scarlett_job = self.logic.received(SVEQuestItem.scarlett_job_offer) diff --git a/worlds/stardew_valley/mods/logic/quests_logic.py b/worlds/stardew_valley/mods/logic/quests_logic.py index 2ff7452394..ef96982661 100644 --- a/worlds/stardew_valley/mods/logic/quests_logic.py +++ b/worlds/stardew_valley/mods/logic/quests_logic.py @@ -12,6 +12,7 @@ from ...logic.season_logic import SeasonLogicMixin from ...logic.time_logic import TimeLogicMixin from ...stardew_rule import StardewRule from ...strings.animal_product_names import AnimalProduct +from ...strings.ap_names.mods.mod_items import SVEQuestItem from ...strings.artisan_good_names import ArtisanGood from ...strings.crop_names import Fruit, SVEFruit, SVEVegetable, Vegetable from ...strings.fertilizer_names import Fertilizer @@ -83,7 +84,8 @@ TimeLogicMixin, SeasonLogicMixin, RelationshipLogicMixin, MonsterLogicMixin]]): self.logic.region.can_reach(SVERegion.grandpas_shed), ModQuest.MarlonsBoat: self.logic.has_all(*(Loot.void_essence, Loot.solar_essence, Loot.slime, Loot.bat_wing, Loot.bug_meat)) & self.logic.relationship.can_meet(ModNPC.lance) & self.logic.region.can_reach(SVERegion.guild_summit), - ModQuest.AuroraVineyard: self.logic.has(Fruit.starfruit) & self.logic.region.can_reach(SVERegion.aurora_vineyard), + ModQuest.AuroraVineyard: self.logic.region.can_reach(SVERegion.aurora_vineyard) & self.logic.received(SVEQuestItem.aurora_vineyard_tablet) & + self.logic.has(Fruit.starfruit) & self.logic.region.can_reach(Region.forest), ModQuest.MonsterCrops: self.logic.has_all(*(SVEVegetable.monster_mushroom, SVEFruit.slime_berry, SVEFruit.monster_fruit, SVEVegetable.void_root)), ModQuest.VoidSoul: self.logic.has(ModLoot.void_soul) & self.logic.region.can_reach(Region.farm) & self.logic.season.has_any_not_winter() & self.logic.region.can_reach(SVERegion.badlands_entrance) & @@ -91,6 +93,12 @@ TimeLogicMixin, SeasonLogicMixin, RelationshipLogicMixin, MonsterLogicMixin]]): self.logic.monster.can_kill_any((Monster.shadow_brute, Monster.shadow_shaman, Monster.shadow_sniper)), } + def has_completed_aurora_vineyard_bundle(self): + if self.options.quest_locations.has_story_quests(): + return self.logic.received(SVEQuestItem.aurora_vineyard_reclamation) + return self.logic.quest.can_complete_quest(ModQuest.AuroraVineyard) + + def _get_distant_lands_quest_rules(self): if ModNames.distant_lands not in self.options.mods: return {} diff --git a/worlds/stardew_valley/mods/logic/sve_logic.py b/worlds/stardew_valley/mods/logic/sve_logic.py index fc093554d8..faca8d332d 100644 --- a/worlds/stardew_valley/mods/logic/sve_logic.py +++ b/worlds/stardew_valley/mods/logic/sve_logic.py @@ -41,24 +41,24 @@ class SVELogic(BaseLogic[Union[HasLogicMixin, ReceivedLogicMixin, QuestLogicMixi return self.logic.or_(*(self.logic.received(rune) for rune in rune_list)) def has_iridium_bomb(self): - if self.options.quest_locations < 0: - return self.logic.quest.can_complete_quest(ModQuest.RailroadBoulder) - return self.logic.received(SVEQuestItem.iridium_bomb) + if self.options.quest_locations.has_story_quests(): + return self.logic.received(SVEQuestItem.iridium_bomb) + return self.logic.quest.can_complete_quest(ModQuest.RailroadBoulder) def has_marlon_boat(self): - if self.options.quest_locations < 0: - return self.logic.quest.can_complete_quest(ModQuest.MarlonsBoat) - return self.logic.received(SVEQuestItem.marlon_boat_paddle) + if self.options.quest_locations.has_story_quests(): + return self.logic.received(SVEQuestItem.marlon_boat_paddle) + return self.logic.quest.can_complete_quest(ModQuest.MarlonsBoat) def has_grandpa_shed_repaired(self): - if self.options.quest_locations < 0: - return self.logic.quest.can_complete_quest(ModQuest.GrandpasShed) - return self.logic.received(SVEQuestItem.grandpa_shed) + if self.options.quest_locations.has_story_quests(): + return self.logic.received(SVEQuestItem.grandpa_shed) + return self.logic.quest.can_complete_quest(ModQuest.GrandpasShed) def has_bear_knowledge(self): - if self.options.quest_locations < 0: - return self.logic.quest.can_complete_quest(Quest.strange_note) - return self.logic.received(Wallet.bears_knowledge) + if self.options.quest_locations.has_story_quests(): + return self.logic.received(Wallet.bears_knowledge) + return self.logic.quest.can_complete_quest(Quest.strange_note) def can_buy_bear_recipe(self): access_rule = (self.logic.quest.can_complete_quest(Quest.strange_note) & self.logic.tool.has_tool(Tool.axe, ToolMaterial.basic) & diff --git a/worlds/stardew_valley/options/options.py b/worlds/stardew_valley/options/options.py index 5cfdfcf9c7..bc76c617b3 100644 --- a/worlds/stardew_valley/options/options.py +++ b/worlds/stardew_valley/options/options.py @@ -384,6 +384,12 @@ class QuestLocations(NamedRange): "maximum": 56, } + def has_story_quests(self) -> bool: + return self.value >= 0 + + def has_no_story_quests(self) -> bool: + return not self.has_story_quests() + class Fishsanity(Choice): """Locations for catching each fish the first time? diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index 01acc7b822..dc63018697 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -149,7 +149,7 @@ def set_bundle_rules(bundle_rooms: List[BundleRoom], logic: StardewLogic, multiw bundle_rules = logic.bundle.can_complete_bundle(bundle) if bundle_room.name == CCRoom.raccoon_requests: num = int(bundle.name[-1]) - extra_raccoons = 1 if world_options.quest_locations >= 0 else 0 + extra_raccoons = 1 if world_options.quest_locations.has_story_quests() else 0 extra_raccoons = extra_raccoons + num bundle_rules = logic.received(CommunityUpgrade.raccoon, extra_raccoons) & bundle_rules if num > 1: @@ -505,7 +505,7 @@ def set_cropsanity_rules(logic: StardewLogic, multiworld, player, world_content: def set_story_quests_rules(all_location_names: Set[str], logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): - if world_options.quest_locations < 0: + if world_options.quest_locations.has_no_story_quests(): return for quest in locations.locations_by_tag[LocationTags.STORY_QUEST]: if quest.name in all_location_names and (quest.mod_name is None or quest.mod_name in world_options.mods): @@ -540,9 +540,9 @@ slay_monsters = "Slay Monsters" def set_help_wanted_quests_rules(logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): - help_wanted_number = world_options.quest_locations.value - if help_wanted_number < 0: + if world_options.quest_locations.has_no_story_quests(): return + help_wanted_number = world_options.quest_locations.value for i in range(0, help_wanted_number): set_number = i // 7 month_rule = logic.time.has_lived_months(set_number) @@ -973,6 +973,7 @@ def set_sve_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, worl set_entrance_rule(multiworld, player, SVEEntrance.use_bear_shop, (logic.mod.sve.can_buy_bear_recipe())) set_entrance_rule(multiworld, player, SVEEntrance.railroad_to_grampleton_station, logic.received(SVEQuestItem.scarlett_job_offer)) set_entrance_rule(multiworld, player, SVEEntrance.museum_to_gunther_bedroom, logic.relationship.has_hearts(ModNPC.gunther, 2)) + set_entrance_rule(multiworld, player, SVEEntrance.to_aurora_basement, logic.mod.quest.has_completed_aurora_vineyard_bundle()) logic.mod.sve.initialize_rules() for location in logic.registry.sve_location_rules: MultiWorldRules.set_rule(multiworld.get_location(location, player), diff --git a/worlds/stardew_valley/strings/ap_names/mods/mod_items.py b/worlds/stardew_valley/strings/ap_names/mods/mod_items.py index 58371aebe7..d87a81f5e5 100644 --- a/worlds/stardew_valley/strings/ap_names/mods/mod_items.py +++ b/worlds/stardew_valley/strings/ap_names/mods/mod_items.py @@ -19,6 +19,12 @@ class SkillLevel: class SVEQuestItem: aurora_vineyard_tablet = "Aurora Vineyard Tablet" + """Triggers the apparition of the bundle tablet in the Aurora Vineyard, so you can do the Aurora Vineyard quest. + This aim to break dependencies on completing the Community Center. + """ + aurora_vineyard_reclamation = "Aurora Vineyard Reclamation" + """Triggers the unlock of the Aurora Vineyard basement, so you can meet Apples. + """ iridium_bomb = "Iridium Bomb" void_soul = "Void Spirit Peace Agreement" kittyfish_spell = "Kittyfish Spell" @@ -29,10 +35,10 @@ class SVEQuestItem: fable_reef_portal = "Fable Reef Portal" grandpa_shed = "Grandpa's Shed" - sve_always_quest_items: List[str] = [kittyfish_spell, scarlett_job_offer, morgan_schooling] - sve_always_quest_items_ginger_island: List[str] = [fable_reef_portal] - sve_quest_items: List[str] = [aurora_vineyard_tablet, iridium_bomb, void_soul, grandpa_shed] - sve_quest_items_ginger_island: List[str] = [marlon_boat_paddle] + sve_always_quest_items: list[str] = [kittyfish_spell, scarlett_job_offer, morgan_schooling, aurora_vineyard_tablet, ] + sve_always_quest_items_ginger_island: list[str] = [fable_reef_portal, ] + sve_quest_items: list[str] = [iridium_bomb, void_soul, grandpa_shed, aurora_vineyard_reclamation, ] + sve_quest_items_ginger_island: list[str] = [marlon_boat_paddle, ] class SVELocation: @@ -53,4 +59,3 @@ class SVERunes: nexus_wizard = "Nexus: Wizard Runes" nexus_items: List[str] = [nexus_farm, nexus_wizard, nexus_spring, nexus_aurora, nexus_guild, nexus_junimo, nexus_outpost] - diff --git a/worlds/stardew_valley/test/mods/TestMods.py b/worlds/stardew_valley/test/mods/TestMods.py index 1dd2ab4902..dc958652e1 100644 --- a/worlds/stardew_valley/test/mods/TestMods.py +++ b/worlds/stardew_valley/test/mods/TestMods.py @@ -1,10 +1,9 @@ import random -from BaseClasses import get_seed +from BaseClasses import get_seed, ItemClassification from .. import SVTestBase, SVTestCase, allsanity_mods_6_x_x, fill_dataclass_with_default from ..assertion import ModAssertMixin, WorldAssertMixin -from ... import items, Group, ItemClassification, create_content -from ... import options +from ... import options, items, Group, create_content from ...mods.mod_data import ModNames from ...options import SkillProgression, Walnutsanity from ...options.options import all_mods @@ -188,3 +187,17 @@ class TestModEntranceRando(SVTestCase): self.assertEqual(len(set(randomized_connections.values())), len(randomized_connections.values()), f"Connections are duplicated in randomization.") + + +class TestVanillaLogicAlternativeWhenQuestsAreNotRandomized(WorldAssertMixin, SVTestBase): + """We often forget to add an alternative rule that works when quests are not randomized. When this happens, some + Location are not reachable because they depend on items that are only added to the pool when quests are randomized. + """ + options = allsanity_mods_6_x_x() | { + options.QuestLocations.internal_name: options.QuestLocations.special_range_names["none"], + options.Goal.internal_name: options.Goal.option_perfection, + } + + def test_given_no_quest_all_mods_when_generate_then_can_reach_everything(self): + self.collect_everything() + self.assert_can_reach_everything(self.multiworld) diff --git a/worlds/stardew_valley/test/mods/TestSVE.py b/worlds/stardew_valley/test/mods/TestSVE.py new file mode 100644 index 0000000000..ca63dcb351 --- /dev/null +++ b/worlds/stardew_valley/test/mods/TestSVE.py @@ -0,0 +1,29 @@ +from .. import SVTestBase +from ... import options +from ...mods.mod_data import ModNames +from ...strings.ap_names.mods.mod_items import SVEQuestItem +from ...strings.quest_names import ModQuest +from ...strings.region_names import SVERegion + + +class TestAuroraVineyard(SVTestBase): + options = { + options.Cropsanity.internal_name: options.Cropsanity.option_enabled, + options.Mods.internal_name: frozenset({ModNames.sve}) + } + + def test_need_tablet_to_do_quest(self): + self.collect("Starfruit Seeds") + self.collect("Bus Repair") + self.collect("Shipping Bin") + self.collect("Summer") + location_name = ModQuest.AuroraVineyard + self.assert_cannot_reach_location(location_name, self.multiworld.state) + self.collect(SVEQuestItem.aurora_vineyard_tablet) + self.assert_can_reach_location(location_name, self.multiworld.state) + + def test_need_reclamation_to_go_downstairs(self): + region_name = SVERegion.aurora_vineyard_basement + self.assert_cannot_reach_region(region_name, self.multiworld.state) + self.collect(SVEQuestItem.aurora_vineyard_reclamation, 1) + self.assert_can_reach_region(region_name, self.multiworld.state) From 06111ac6cf30de7d8cfdf52f1f96baea9da7e9ea Mon Sep 17 00:00:00 2001 From: justinspatz <164453633+justinspatz@users.noreply.github.com> Date: Mon, 10 Mar 2025 12:39:45 -0400 Subject: [PATCH 098/227] OOT: Have beehives that only appear as a child not be in logic if only adult can break beehives (#4646) * Change the logic for the 3 Zora's Domain Beehives to support new rule Implement new logic changes to these 3 locations * Update LogicHelpers.json with new rule for beehives that only appear for child link Added below the "can_break_upper_beehive" a new helper called "can_break_upper_beehive_child" which removes the requirement for hookshot to avoid a logic error in the Zora Domain Beehives where it checks whether child or adult can break beehives, even though these beehives do not appear as an adult. * Update LogicHelpers.json moving the call for is_child As is_child is already called for can_use (Boomerang), it's a bit redundant to include the check for using the Boomerang, so it's being moved to be with the Bombchu check to ensure that it's not expected if the Bombchu Logic Rule is turned on that Adult can use bombchus to break the beehives. This effectively does the same thing, but should be better on performance. --- worlds/oot/data/LogicHelpers.json | 1 + worlds/oot/data/World/Overworld.json | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/worlds/oot/data/LogicHelpers.json b/worlds/oot/data/LogicHelpers.json index 7f3641062a..a05fe66066 100644 --- a/worlds/oot/data/LogicHelpers.json +++ b/worlds/oot/data/LogicHelpers.json @@ -66,6 +66,7 @@ "can_break_heated_crate": "deadly_bonks != 'ohko' or (Fairy and (can_use(Goron_Tunic) or damage_multiplier != 'ohko')) or can_use(Nayrus_Love) or can_blast_or_smash", "can_break_lower_beehive": "can_use(Boomerang) or can_use(Hookshot) or Bombs or (logic_beehives_bombchus and has_bombchus)", "can_break_upper_beehive": "can_use(Boomerang) or can_use(Hookshot) or (logic_beehives_bombchus and has_bombchus)", + "can_break_upper_beehive_child": "can_use(Boomerang) or (logic_beehives_bombchus and has_bombchus and is_child)", # can_use and helpers # The parser reduces this to smallest form based on item category. # Note that can_use(item) is False for any item not covered here. diff --git a/worlds/oot/data/World/Overworld.json b/worlds/oot/data/World/Overworld.json index de2b4a61dc..87b24a6e57 100644 --- a/worlds/oot/data/World/Overworld.json +++ b/worlds/oot/data/World/Overworld.json @@ -2233,8 +2233,8 @@ "ZD Pot 3": "True", "ZD Pot 4": "True", "ZD Pot 5": "True", - "ZD In Front of King Zora Beehive 1": "is_child and can_break_upper_beehive", - "ZD In Front of King Zora Beehive 2": "is_child and can_break_upper_beehive", + "ZD In Front of King Zora Beehive 1": "can_break_upper_beehive_child", + "ZD In Front of King Zora Beehive 2": "can_break_upper_beehive_child", "ZD GS Frozen Waterfall": " is_adult and at_night and (Hookshot or Bow or Magic_Meter or logic_domain_gs)", @@ -2259,7 +2259,7 @@ "scene": "Zoras Domain", "hint": "ZORAS_DOMAIN", "locations": { - "ZD Behind King Zora Beehive": "is_child and can_break_upper_beehive" + "ZD Behind King Zora Beehive": "can_break_upper_beehive_child" }, "exits": { "Zoras Domain": " From 2c8dded52f31485f6d9e9876a07dd667ddc38577 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Mon, 10 Mar 2025 21:13:49 -0500 Subject: [PATCH 099/227] The Messenger: Fix some transition plando issues (#4720) * don't allow one-way and two-way entrances to be connected to each other * add special handling for the tower hq nodes since they share the same parent region --- worlds/messenger/options.py | 6 ++++++ worlds/messenger/transitions.py | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/worlds/messenger/options.py b/worlds/messenger/options.py index 9ee04d26a6..85c746aae7 100644 --- a/worlds/messenger/options.py +++ b/worlds/messenger/options.py @@ -51,6 +51,12 @@ class TransitionPlando(PlandoConnections): entrances = frozenset(RANDOMIZED_CONNECTIONS.keys()) exits = frozenset(RANDOMIZED_CONNECTIONS.values()) + @classmethod + def can_connect(cls, entrance: str, exit: str) -> bool: + if entrance != "Glacial Peak - Left" and entrance.lower() in cls.exits: + return exit.lower() in cls.entrances + return exit.lower() not in cls.entrances + class Logic(Choice): """ diff --git a/worlds/messenger/transitions.py b/worlds/messenger/transitions.py index 1db975b3cd..53cfd836d5 100644 --- a/worlds/messenger/transitions.py +++ b/worlds/messenger/transitions.py @@ -30,10 +30,19 @@ def connect_plando(world: "MessengerWorld", plando_connections: TransitionPlando for plando_connection in plando_connections: # get the connecting regions - reg1 = world.get_region(plando_connection.entrance) + # need to handle these special because the names are unique but have the same parent region + if plando_connection.entrance in ("Artificer", "Tower HQ"): + reg1 = world.get_region("Tower HQ") + if plando_connection.entrance == "Artificer": + dangling_exit = world.get_entrance("Artificer's Portal") + else: + dangling_exit = world.get_entrance("Artificer's Challenge") + reg1.exits.remove(dangling_exit) + else: + reg1 = world.get_region(plando_connection.entrance) + remove_dangling_exit(reg1) + reg2 = world.get_region(plando_connection.exit) - - remove_dangling_exit(reg1) remove_dangling_entrance(reg2) # connect the regions reg1.connect(reg2) From 3192799bbf65259d8cdca73112081d13f1c491f3 Mon Sep 17 00:00:00 2001 From: LiquidCat64 <74896918+LiquidCat64@users.noreply.github.com> Date: Wed, 12 Mar 2025 17:21:09 -0600 Subject: [PATCH 100/227] CVCotM: Clarify the Wii U VC version is unsupported (#4734) * Comment out VC ROM hash usages and clarify that it's unsupported. * Update worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md Co-authored-by: Scipio Wright * Update worlds/cvcotm/docs/setup_en.md Co-authored-by: Scipio Wright --------- Co-authored-by: Scipio Wright --- worlds/cvcotm/__init__.py | 7 ++++--- .../docs/en_Castlevania - Circle of the Moon.md | 7 +++---- worlds/cvcotm/docs/setup_en.md | 2 +- worlds/cvcotm/rom.py | 12 ++++++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/worlds/cvcotm/__init__.py b/worlds/cvcotm/__init__.py index 4466ed79bd..0f5077e709 100644 --- a/worlds/cvcotm/__init__.py +++ b/worlds/cvcotm/__init__.py @@ -19,8 +19,8 @@ from worlds.AutoWorld import WebWorld, World from .aesthetics import shuffle_sub_weapons, get_location_data, get_countdown_flags, populate_enemy_drops, \ get_start_inventory_data -from .rom import RomData, patch_rom, get_base_rom_path, CVCotMProcedurePatch, CVCOTM_CT_US_HASH, CVCOTM_AC_US_HASH, \ - CVCOTM_VC_US_HASH +from .rom import RomData, patch_rom, get_base_rom_path, CVCotMProcedurePatch, CVCOTM_CT_US_HASH, CVCOTM_AC_US_HASH + # CVCOTM_VC_US_HASH from .client import CastlevaniaCotMClient @@ -29,7 +29,8 @@ class CVCotMSettings(settings.Group): """File name of the Castlevania CotM US rom""" copy_to = "Castlevania - Circle of the Moon (USA).gba" description = "Castlevania CotM (US) ROM File" - md5s = [CVCOTM_CT_US_HASH, CVCOTM_AC_US_HASH, CVCOTM_VC_US_HASH] + # md5s = [CVCOTM_CT_US_HASH, CVCOTM_AC_US_HASH, CVCOTM_VC_US_HASH] + md5s = [CVCOTM_CT_US_HASH, CVCOTM_AC_US_HASH] rom_file: RomFile = RomFile(RomFile.copy_to) diff --git a/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md b/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md index e81b79bf20..695c5f0ff9 100644 --- a/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md +++ b/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md @@ -153,11 +153,10 @@ Advance Collection ROM; most notably the fact that the audio does not function w which is currently a requirement to connect to a multiworld. This happens because all audio code was stripped from the ROM, and all sound is instead played by the collection through external means. -For this reason, it is most recommended to obtain the ROM by dumping it from an original cartridge of the game that you legally own. -Though, the Advance Collection *can* still technically be an option if you cannot do that and don't mind the lack of sound. +The Wii U Virtual Console version does not work due to changes in the code in that version. -The Wii U Virtual Console version is currently untested. If you happen to have purchased it before the Wii U eShop shut down, you can try -dumping and playing with it. However, at the moment, we cannot guarantee that it will work well due to it being untested. +Due to the reasons mentioned above, it is most recommended to obtain the ROM by dumping it from an original cartridge of the +game that you legally own. However, the Advance Collection *is* an option if you cannot do that and don't mind the lack of sound. Regardless of which released ROM you intend to try playing with, the US version of the game is required. diff --git a/worlds/cvcotm/docs/setup_en.md b/worlds/cvcotm/docs/setup_en.md index 7899ac9973..459e0d6afb 100644 --- a/worlds/cvcotm/docs/setup_en.md +++ b/worlds/cvcotm/docs/setup_en.md @@ -4,7 +4,7 @@ - [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases/latest). - A Castlevania: Circle of the Moon ROM of the US version specifically. The Archipelago community cannot provide this. -The Castlevania Advance Collection ROM can technically be used, but it has no audio. The Wii U Virtual Console ROM is untested. +The Castlevania Advance Collection ROM can be used, but it has no audio. The Wii U Virtual Console ROM does not work. - [BizHawk](https://tasvideos.org/BizHawk/ReleaseHistory) 2.7 or later. ### Configuring BizHawk diff --git a/worlds/cvcotm/rom.py b/worlds/cvcotm/rom.py index e7b0710d13..6ae0b6e438 100644 --- a/worlds/cvcotm/rom.py +++ b/worlds/cvcotm/rom.py @@ -22,11 +22,9 @@ if TYPE_CHECKING: CVCOTM_CT_US_HASH = "50a1089600603a94e15ecf287f8d5a1f" # Original GBA cartridge ROM CVCOTM_AC_US_HASH = "87a1bd6577b6702f97a60fc55772ad74" # Castlevania Advance Collection ROM -CVCOTM_VC_US_HASH = "2cc38305f62b337281663bad8c901cf9" # Wii U Virtual Console ROM +# CVCOTM_VC_US_HASH = "2cc38305f62b337281663bad8c901cf9" # Wii U Virtual Console ROM -# NOTE: The Wii U VC version is untested as of when this comment was written. I am only including its hash in case it -# does work. If someone who has it can confirm it does indeed work, this comment should be removed. If it doesn't, the -# hash should be removed in addition. See the Game Page for more information about supported versions. +# The Wii U VC version is not currently supported. See the Game Page for more info. ARCHIPELAGO_IDENTIFIER_START = 0x7FFF00 ARCHIPELAGO_IDENTIFIER = "ARCHIPELAG03" @@ -518,7 +516,8 @@ class CVCotMPatchExtensions(APPatchExtension): class CVCotMProcedurePatch(APProcedurePatch, APTokenMixin): - hash = [CVCOTM_CT_US_HASH, CVCOTM_AC_US_HASH, CVCOTM_VC_US_HASH] + # hash = [CVCOTM_CT_US_HASH, CVCOTM_AC_US_HASH, CVCOTM_VC_US_HASH] + hash = [CVCOTM_CT_US_HASH, CVCOTM_AC_US_HASH] patch_file_ending: str = ".apcvcotm" result_file_ending: str = ".gba" @@ -585,7 +584,8 @@ def get_base_rom_bytes(file_name: str = "") -> bytes: basemd5 = hashlib.md5() basemd5.update(base_rom_bytes) - if basemd5.hexdigest() not in [CVCOTM_CT_US_HASH, CVCOTM_AC_US_HASH, CVCOTM_VC_US_HASH]: + # if basemd5.hexdigest() not in [CVCOTM_CT_US_HASH, CVCOTM_AC_US_HASH, CVCOTM_VC_US_HASH]: + if basemd5.hexdigest() not in [CVCOTM_CT_US_HASH, CVCOTM_AC_US_HASH]: raise Exception("Supplied Base ROM does not match known MD5s for Castlevania: Circle of the Moon USA." "Get the correct game and version, then dump it.") setattr(get_base_rom_bytes, "base_rom_bytes", base_rom_bytes) From 1de411ec894e5667ea4d850e1949f9f79822e909 Mon Sep 17 00:00:00 2001 From: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Date: Thu, 13 Mar 2025 23:59:09 +0100 Subject: [PATCH 101/227] The Witness: Change Regions, Areas and Connections from Dict[str, Any] to dataclasses&NamedTuples (#4415) * Change Regions, Areas and Connections to dataclasses/NamedTuples * Move to new file * we do a little renaming * Purge the 'lambda' naming in favor of 'rule' or 'WitnessRule' * missed one * unnecessary change * omega oops * NOOOOOOOO * Merge error * mypy thing --- worlds/witness/data/definition_classes.py | 33 +++++++ worlds/witness/data/static_locations.py | 2 +- worlds/witness/data/static_logic.py | 109 +++++++++++----------- worlds/witness/data/utils.py | 42 +++------ worlds/witness/entity_hunt.py | 2 +- worlds/witness/generate_data_file.py | 2 +- worlds/witness/hints.py | 12 +-- worlds/witness/options.py | 1 - worlds/witness/player_logic.py | 59 ++++++------ worlds/witness/regions.py | 9 +- worlds/witness/rules.py | 2 +- 11 files changed, 148 insertions(+), 125 deletions(-) create mode 100644 worlds/witness/data/definition_classes.py diff --git a/worlds/witness/data/definition_classes.py b/worlds/witness/data/definition_classes.py new file mode 100644 index 0000000000..281fbfcdff --- /dev/null +++ b/worlds/witness/data/definition_classes.py @@ -0,0 +1,33 @@ +from dataclasses import dataclass, field +from typing import FrozenSet, List, NamedTuple + +# A WitnessRule is just an or-chain of and-conditions. +# It represents the set of all options that could fulfill this requirement. +# E.g. if something requires "Dots or (Shapers and Stars)", it'd be represented as: {{"Dots"}, {"Shapers, "Stars"}} +# {} is an unusable requirement. +# {{}} is an always usable requirement. +WitnessRule = FrozenSet[FrozenSet[str]] + + +@dataclass +class AreaDefinition: + name: str + regions: List[str] = field(default_factory=list) + + +@dataclass +class RegionDefinition: + name: str + short_name: str + area: AreaDefinition + logical_entities: List[str] = field(default_factory=list) + physical_entities: List[str] = field(default_factory=list) + + +class ConnectionDefinition(NamedTuple): + target_region: str + traversal_rule: WitnessRule + + @property + def can_be_traversed(self) -> bool: + return bool(self.traversal_rule) diff --git a/worlds/witness/data/static_locations.py b/worlds/witness/data/static_locations.py index 5c5ad554dd..a5cfc3b49f 100644 --- a/worlds/witness/data/static_locations.py +++ b/worlds/witness/data/static_locations.py @@ -486,5 +486,5 @@ for key, item in ALL_LOCATIONS_TO_IDS.items(): ALL_LOCATIONS_TO_ID[key] = item for loc in ALL_LOCATIONS_TO_IDS: - area = static_witness_logic.ENTITIES_BY_NAME[loc]["area"]["name"] + area = static_witness_logic.ENTITIES_BY_NAME[loc]["area"].name AREA_LOCATION_GROUPS.setdefault(area, set()).add(loc) diff --git a/worlds/witness/data/static_logic.py b/worlds/witness/data/static_logic.py index 4f4786a38b..bfe92467fb 100644 --- a/worlds/witness/data/static_logic.py +++ b/worlds/witness/data/static_logic.py @@ -1,8 +1,9 @@ from collections import Counter, defaultdict -from typing import Any, Dict, List, Optional, Set, Tuple +from typing import Any, Dict, FrozenSet, List, Optional, Set from Utils import cache_argsless +from .definition_classes import AreaDefinition, ConnectionDefinition, RegionDefinition, WitnessRule from .item_definition_classes import ( CATEGORY_NAME_MAPPINGS, DoorItemDefinition, @@ -13,7 +14,6 @@ from .item_definition_classes import ( ) from .settings.easter_eggs import EASTER_EGGS from .utils import ( - WitnessRule, define_new_region, get_items, get_sigma_expert_logic, @@ -21,7 +21,7 @@ from .utils import ( get_umbra_variety_logic, get_vanilla_logic, logical_or_witness_rules, - parse_lambda, + parse_witness_rule, ) @@ -31,10 +31,10 @@ class StaticWitnessLogicObj: lines = get_sigma_normal_logic() # All regions with a list of panels in them and the connections to other regions, before logic adjustments - self.ALL_REGIONS_BY_NAME: Dict[str, Dict[str, Any]] = {} - self.ALL_AREAS_BY_NAME: Dict[str, Dict[str, Any]] = {} - self.CONNECTIONS_WITH_DUPLICATES: Dict[str, Dict[str, Set[WitnessRule]]] = defaultdict(lambda: defaultdict(set)) - self.STATIC_CONNECTIONS_BY_REGION_NAME: Dict[str, Set[Tuple[str, WitnessRule]]] = {} + self.ALL_REGIONS_BY_NAME: Dict[str, RegionDefinition] = {} + self.ALL_AREAS_BY_NAME: Dict[str, AreaDefinition] = {} + self.CONNECTIONS_WITH_DUPLICATES: Dict[str, List[ConnectionDefinition]] = defaultdict(list) + self.STATIC_CONNECTIONS_BY_REGION_NAME: Dict[str, List[ConnectionDefinition]] = {} self.ENTITIES_BY_HEX: Dict[str, Dict[str, Any]] = {} self.ENTITIES_BY_NAME: Dict[str, Dict[str, Any]] = {} @@ -55,15 +55,15 @@ class StaticWitnessLogicObj: area_counts: Dict[str, int] = Counter() for region_name, entity_amount in EASTER_EGGS.items(): region_object = self.ALL_REGIONS_BY_NAME[region_name] - correct_area = region_object["area"] + correct_area = region_object.area for _ in range(entity_amount): location_id = 160200 + egg_counter entity_hex = hex(0xEE000 + egg_counter) egg_counter += 1 - area_counts[correct_area["name"]] += 1 - full_entity_name = f"{correct_area['name']} Easter Egg {area_counts[correct_area['name']]}" + area_counts[correct_area.name] += 1 + full_entity_name = f"{correct_area.name} Easter Egg {area_counts[correct_area.name]}" self.ENTITIES_BY_HEX[entity_hex] = { "checkName": full_entity_name, @@ -81,11 +81,11 @@ class StaticWitnessLogicObj: self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX[entity_hex] = { "entities": frozenset({frozenset({})}) } - region_object["entities"].append(entity_hex) - region_object["physical_entities"].append(entity_hex) + region_object.logical_entities.append(entity_hex) + region_object.physical_entities.append(entity_hex) easter_egg_region = self.ALL_REGIONS_BY_NAME["Easter Eggs"] - easter_egg_area = easter_egg_region["area"] + easter_egg_area = easter_egg_region.area for i in range(sum(EASTER_EGGS.values())): location_id = 160000 + i entity_hex = hex(0xEE200 + i) @@ -111,19 +111,15 @@ class StaticWitnessLogicObj: self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX[entity_hex] = { "entities": frozenset({frozenset({})}) } - easter_egg_region["entities"].append(entity_hex) - easter_egg_region["physical_entities"].append(entity_hex) + easter_egg_region.logical_entities.append(entity_hex) + easter_egg_region.physical_entities.append(entity_hex) def read_logic_file(self, lines: List[str]) -> None: """ Reads the logic file and does the initial population of data structures """ - - current_region = {} - current_area: Dict[str, Any] = { - "name": "Misc", - "regions": [], - } + current_area = AreaDefinition("Misc") + current_region = RegionDefinition("Fake", "Fake", current_area) # Unused, but makes PyCharm & mypy shut up self.ALL_AREAS_BY_NAME["Misc"] = current_area for line in lines: @@ -133,19 +129,16 @@ class StaticWitnessLogicObj: if line[-1] == ":": new_region_and_connections = define_new_region(line, current_area) current_region = new_region_and_connections[0] - region_name = current_region["name"] + region_name = current_region.name self.ALL_REGIONS_BY_NAME[region_name] = current_region for connection in new_region_and_connections[1]: - self.CONNECTIONS_WITH_DUPLICATES[region_name][connection[0]].add(connection[1]) - current_area["regions"].append(region_name) + self.CONNECTIONS_WITH_DUPLICATES[region_name].append(connection) + current_area.regions.append(region_name) continue if line[0] == "=": area_name = line[2:-2] - current_area = { - "name": area_name, - "regions": [], - } + current_area = AreaDefinition(area_name, []) self.ALL_AREAS_BY_NAME[area_name] = current_area continue @@ -158,9 +151,9 @@ class StaticWitnessLogicObj: entity_hex = entity_name_full[0:7] entity_name = entity_name_full[9:-1] - required_panel_lambda = line_split.pop(0) + entity_requirement_string = line_split.pop(0) - full_entity_name = current_region["shortName"] + " " + entity_name + full_entity_name = current_region.short_name + " " + entity_name if location_id == "Door" or location_id == "Laser": self.ENTITIES_BY_HEX[entity_hex] = { @@ -177,18 +170,18 @@ class StaticWitnessLogicObj: self.ENTITIES_BY_NAME[self.ENTITIES_BY_HEX[entity_hex]["checkName"]] = self.ENTITIES_BY_HEX[entity_hex] self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX[entity_hex] = { - "entities": parse_lambda(required_panel_lambda) + "entities": parse_witness_rule(entity_requirement_string) } # Lasers and Doors exist in a region, but don't have a regional *requirement* # If a laser is activated, you don't need to physically walk up to it for it to count # As such, logically, they behave more as if they were part of the "Entry" region - self.ALL_REGIONS_BY_NAME["Entry"]["entities"].append(entity_hex) + self.ALL_REGIONS_BY_NAME["Entry"].logical_entities.append(entity_hex) # However, it will also be important to keep track of their physical location for postgame purposes. - current_region["physical_entities"].append(entity_hex) + current_region.physical_entities.append(entity_hex) continue - required_item_lambda = line_split.pop(0) + item_requirement_string = line_split.pop(0) laser_names = { "Laser", @@ -224,18 +217,18 @@ class StaticWitnessLogicObj: entity_type = "Panel" location_type = "General" - required_items = parse_lambda(required_item_lambda) - required_panels = parse_lambda(required_panel_lambda) + required_items = parse_witness_rule(item_requirement_string) + required_entities = parse_witness_rule(entity_requirement_string) required_items = frozenset(required_items) requirement = { - "entities": required_panels, + "entities": required_entities, "items": required_items } if entity_type == "Obelisk Side": - eps = set(next(iter(required_panels))) + eps = set(next(iter(required_entities))) eps -= {"Theater to Tunnels"} eps_ints = {int(h, 16) for h in eps} @@ -260,39 +253,43 @@ class StaticWitnessLogicObj: self.ENTITIES_BY_NAME[self.ENTITIES_BY_HEX[entity_hex]["checkName"]] = self.ENTITIES_BY_HEX[entity_hex] self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX[entity_hex] = requirement - current_region["entities"].append(entity_hex) - current_region["physical_entities"].append(entity_hex) + current_region.logical_entities.append(entity_hex) + current_region.physical_entities.append(entity_hex) self.add_easter_eggs() - def reverse_connection(self, source_region: str, connection: Tuple[str, Set[WitnessRule]]) -> None: - target = connection[0] - traversal_options = connection[1] - + def reverse_connection(self, source_region: str, connection: ConnectionDefinition) -> None: # Reverse this connection with all its possibilities, except the ones marked as "OneWay". - for requirement in traversal_options: - remaining_options = set() - for option in requirement: - if not any(req == "TrueOneWay" for req in option): - remaining_options.add(option) + remaining_options: Set[FrozenSet[str]] = set() + for sub_option in connection.traversal_rule: + if not any(req == "TrueOneWay" for req in sub_option): + remaining_options.add(sub_option) - if remaining_options: - self.CONNECTIONS_WITH_DUPLICATES[target][source_region].add(frozenset(remaining_options)) + reversed_connection = ConnectionDefinition(source_region, frozenset(remaining_options)) + if reversed_connection.can_be_traversed: + self.CONNECTIONS_WITH_DUPLICATES[connection.target_region].append(reversed_connection) def reverse_connections(self) -> None: # Iterate all connections for region_name, connections in list(self.CONNECTIONS_WITH_DUPLICATES.items()): - for connection in connections.items(): + for connection in connections: self.reverse_connection(region_name, connection) def combine_connections(self) -> None: # All regions need to be present, and this dict is copied later - Thus, defaultdict is not the correct choice. - self.STATIC_CONNECTIONS_BY_REGION_NAME = {region_name: set() for region_name in self.ALL_REGIONS_BY_NAME} + self.STATIC_CONNECTIONS_BY_REGION_NAME = {region_name: [] for region_name in self.ALL_REGIONS_BY_NAME} for source, connections in self.CONNECTIONS_WITH_DUPLICATES.items(): - for target, requirement in connections.items(): - combined_req = logical_or_witness_rules(requirement) - self.STATIC_CONNECTIONS_BY_REGION_NAME[source].add((target, combined_req)) + # Organize rules by target region + traversal_options_by_target_region = defaultdict(list) + for target_region, traversal_option in connections: + traversal_options_by_target_region[target_region].append(traversal_option) + + # Combine connections to the same target region into one connection + for target, traversal_rules in traversal_options_by_target_region.items(): + combined_rule = logical_or_witness_rules(traversal_rules) + combined_connection = ConnectionDefinition(target, combined_rule) + self.STATIC_CONNECTIONS_BY_REGION_NAME[source].append(combined_connection) # Item data parsed from WitnessItems.txt diff --git a/worlds/witness/data/utils.py b/worlds/witness/data/utils.py index aca4573806..5f5622819d 100644 --- a/worlds/witness/data/utils.py +++ b/worlds/witness/data/utils.py @@ -2,17 +2,12 @@ from datetime import date from math import floor from pkgutil import get_data from random import Random -from typing import Any, Collection, Dict, FrozenSet, Iterable, List, Optional, Set, Tuple, TypeVar +from typing import Collection, FrozenSet, Iterable, List, Optional, Set, Tuple, TypeVar + +from .definition_classes import AreaDefinition, ConnectionDefinition, RegionDefinition, WitnessRule T = TypeVar("T") -# A WitnessRule is just an or-chain of and-conditions. -# It represents the set of all options that could fulfill this requirement. -# E.g. if something requires "Dots or (Shapers and Stars)", it'd be represented as: {{"Dots"}, {"Shapers, "Stars"}} -# {} is an unusable requirement. -# {{}} is an always usable requirement. -WitnessRule = FrozenSet[FrozenSet[str]] - def cast_not_none(value: Optional[T]) -> T: assert value is not None @@ -62,7 +57,7 @@ def build_weighted_int_list(inputs: Collection[float], total: int) -> List[int]: return rounded_output -def define_new_region(region_string: str, area: dict[str, Any]) -> Tuple[Dict[str, Any], Set[Tuple[str, WitnessRule]]]: +def define_new_region(region_string: str, area: AreaDefinition) -> Tuple[RegionDefinition, List[ConnectionDefinition]]: """ Returns a region object by parsing a line in the logic file """ @@ -77,35 +72,28 @@ def define_new_region(region_string: str, area: dict[str, Any]) -> Tuple[Dict[st region_name = region_name_split[0] region_name_simple = region_name_split[1][:-1] - options = set() + options = [] for _ in range(len(line_split) // 2): connected_region = line_split.pop(0) - corresponding_lambda = line_split.pop(0) + traversal_rule_string = line_split.pop(0) - options.add( - (connected_region, parse_lambda(corresponding_lambda)) - ) + options.append(ConnectionDefinition(connected_region, parse_witness_rule(traversal_rule_string))) + + region_obj = RegionDefinition(region_name, region_name_simple, area) - region_obj = { - "name": region_name, - "shortName": region_name_simple, - "entities": [], - "physical_entities": [], - "area": area, - } return region_obj, options -def parse_lambda(lambda_string: str) -> WitnessRule: +def parse_witness_rule(rule_string: str) -> WitnessRule: """ - Turns a lambda String literal like this: a | b & c - into a set of sets like this: {{a}, {b, c}} - The lambda has to be in DNF. + Turns a rule string literal like this: a | b & c + into a set of sets (called "WitnessRule") like this: {{a}, {b, c}} + The rule string has to be in DNF. """ - if lambda_string == "True": + if rule_string == "True": return frozenset([frozenset()]) - split_ands = set(lambda_string.split(" | ")) + split_ands = set(rule_string.split(" | ")) return frozenset({frozenset(a.split(" & ")) for a in split_ands}) diff --git a/worlds/witness/entity_hunt.py b/worlds/witness/entity_hunt.py index 9549246ce4..de2f7dd68d 100644 --- a/worlds/witness/entity_hunt.py +++ b/worlds/witness/entity_hunt.py @@ -129,7 +129,7 @@ class EntityHuntPicker: eligible_panels_by_area = defaultdict(set) for eligible_panel in all_eligible_panels: - associated_area = static_witness_logic.ENTITIES_BY_HEX[eligible_panel]["area"]["name"] + associated_area = static_witness_logic.ENTITIES_BY_HEX[eligible_panel]["area"].name eligible_panels_by_area[associated_area].add(eligible_panel) return all_eligible_panels, eligible_panels_by_area diff --git a/worlds/witness/generate_data_file.py b/worlds/witness/generate_data_file.py index cc05015cd8..679aa80b28 100644 --- a/worlds/witness/generate_data_file.py +++ b/worlds/witness/generate_data_file.py @@ -18,7 +18,7 @@ if __name__ == "__main__": for entity_id, entity_object in static_witness_logic.ENTITIES_BY_HEX.items(): location_id = entity_object["id"] - area = entity_object["area"]["name"] + area = entity_object["area"].name area_to_entity_ids[area].append(entity_id) if location_id is None: diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index 6f274f5e2c..c82024cc12 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -464,7 +464,7 @@ def choose_areas(world: "WitnessWorld", amount: int, locations_per_area: Dict[st def get_hintable_areas(world: "WitnessWorld") -> Tuple[Dict[str, List[Location]], Dict[str, List[Item]]]: - potential_areas = list(static_witness_logic.ALL_AREAS_BY_NAME.keys()) + potential_areas = list(static_witness_logic.ALL_AREAS_BY_NAME.values()) locations_per_area = {} items_per_area = {} @@ -472,14 +472,14 @@ def get_hintable_areas(world: "WitnessWorld") -> Tuple[Dict[str, List[Location]] for area in potential_areas: regions = [ world.get_region(region) - for region in static_witness_logic.ALL_AREAS_BY_NAME[area]["regions"] + for region in area.regions if region in world.player_regions.created_region_names ] locations = [location for region in regions for location in region.get_locations() if not location.is_event] if locations: - locations_per_area[area] = locations - items_per_area[area] = [location.item for location in locations] + locations_per_area[area.name] = locations + items_per_area[area.name] = [location.item for location in locations] return locations_per_area, items_per_area @@ -516,7 +516,7 @@ def word_area_hint(world: "WitnessWorld", hinted_area: str, area_items: List[Ite hunt_panels = None if world.options.victory_condition == "panel_hunt" and hinted_area != "Easter Eggs": hunt_panels = sum( - static_witness_logic.ENTITIES_BY_HEX[hunt_entity]["area"]["name"] == hinted_area + static_witness_logic.ENTITIES_BY_HEX[hunt_entity]["area"].name == hinted_area for hunt_entity in world.player_logic.HUNT_ENTITIES ) @@ -620,7 +620,7 @@ def create_all_hints(world: "WitnessWorld", hint_amount: int, area_hints: int, already_hinted_locations |= { loc for loc in world.multiworld.get_reachable_locations(state, world.player) - if loc.address and static_witness_logic.ENTITIES_BY_NAME[loc.name]["area"]["name"] == "Tutorial (Inside)" + if loc.address and static_witness_logic.ENTITIES_BY_NAME[loc.name]["area"].name == "Tutorial (Inside)" } intended_location_hints = hint_amount - area_hints diff --git a/worlds/witness/options.py b/worlds/witness/options.py index c56209b226..1c2bc9324f 100644 --- a/worlds/witness/options.py +++ b/worlds/witness/options.py @@ -1,5 +1,4 @@ from dataclasses import dataclass -from datetime import datetime from typing import Tuple from schema import And, Schema diff --git a/worlds/witness/player_logic.py b/worlds/witness/player_logic.py index 1276d55dce..52bddde17e 100644 --- a/worlds/witness/player_logic.py +++ b/worlds/witness/player_logic.py @@ -20,10 +20,10 @@ from collections import defaultdict from typing import TYPE_CHECKING, Dict, List, Set, Tuple, cast from .data import static_logic as static_witness_logic +from .data.definition_classes import ConnectionDefinition, WitnessRule from .data.item_definition_classes import DoorItemDefinition, ItemCategory, ProgressiveItemDefinition from .data.static_logic import StaticWitnessLogicObj from .data.utils import ( - WitnessRule, get_boat, get_caves_except_path_to_challenge_exclusion_list, get_complex_additional_panels, @@ -47,7 +47,7 @@ from .data.utils import ( get_vault_exclusion_list, logical_and_witness_rules, logical_or_witness_rules, - parse_lambda, + parse_witness_rule, ) from .entity_hunt import EntityHuntPicker @@ -97,10 +97,10 @@ class WitnessPlayerLogic: elif self.DIFFICULTY == "none": self.REFERENCE_LOGIC = static_witness_logic.vanilla - self.CONNECTIONS_BY_REGION_NAME_THEORETICAL: Dict[str, Set[Tuple[str, WitnessRule]]] = copy.deepcopy( + self.CONNECTIONS_BY_REGION_NAME_THEORETICAL: Dict[str, List[ConnectionDefinition]] = copy.deepcopy( self.REFERENCE_LOGIC.STATIC_CONNECTIONS_BY_REGION_NAME ) - self.CONNECTIONS_BY_REGION_NAME: Dict[str, Set[Tuple[str, WitnessRule]]] = copy.deepcopy( + self.CONNECTIONS_BY_REGION_NAME: Dict[str, List[ConnectionDefinition]] = copy.deepcopy( self.REFERENCE_LOGIC.STATIC_CONNECTIONS_BY_REGION_NAME ) self.DEPENDENT_REQUIREMENTS_BY_HEX: Dict[str, Dict[str, WitnessRule]] = copy.deepcopy( @@ -178,7 +178,7 @@ class WitnessPlayerLogic: entity_obj = self.REFERENCE_LOGIC.ENTITIES_BY_HEX[entity_hex] - if entity_obj["region"] is not None and entity_obj["region"]["name"] in self.UNREACHABLE_REGIONS: + if entity_obj["region"] is not None and entity_obj["region"].name in self.UNREACHABLE_REGIONS: return frozenset() # For the requirement of an entity, we consider two things: @@ -270,7 +270,7 @@ class WitnessPlayerLogic: new_items = theoretical_new_items if dep_obj["region"] and entity_obj["region"] != dep_obj["region"]: new_items = frozenset( - frozenset(possibility | {dep_obj["region"]["name"]}) + frozenset(possibility | {dep_obj["region"].name}) for possibility in new_items ) @@ -359,11 +359,11 @@ class WitnessPlayerLogic: line_split = line.split(" - ") requirement = { - "entities": parse_lambda(line_split[1]), + "entities": parse_witness_rule(line_split[1]), } if len(line_split) > 2: - required_items = parse_lambda(line_split[2]) + required_items = parse_witness_rule(line_split[2]) items_actually_in_the_game = [ item_name for item_name, item_definition in static_witness_logic.ALL_ITEMS.items() if item_definition.category is ItemCategory.SYMBOL @@ -394,26 +394,31 @@ class WitnessPlayerLogic: return if adj_type == "New Connections": + # This adjustment type does not actually reverse the connection if it could be reversed. + # If needed, this might be added later line_split = line.split(" - ") source_region = line_split[0] target_region = line_split[1] panel_set_string = line_split[2] for connection in self.CONNECTIONS_BY_REGION_NAME_THEORETICAL[source_region]: - if connection[0] == target_region: + if connection.target_region == target_region: self.CONNECTIONS_BY_REGION_NAME_THEORETICAL[source_region].remove(connection) if panel_set_string == "TrueOneWay": - self.CONNECTIONS_BY_REGION_NAME_THEORETICAL[source_region].add( - (target_region, frozenset({frozenset(["TrueOneWay"])})) - ) + # This means the connection can be completely replaced + only_connection = ConnectionDefinition(target_region, frozenset({frozenset(["TrueOneWay"])})) + self.CONNECTIONS_BY_REGION_NAME_THEORETICAL[source_region].append(only_connection) else: - new_lambda = logical_or_witness_rules([connection[1], parse_lambda(panel_set_string)]) - self.CONNECTIONS_BY_REGION_NAME_THEORETICAL[source_region].add((target_region, new_lambda)) + combined_rule = logical_or_witness_rules( + [connection.traversal_rule, parse_witness_rule(panel_set_string)] + ) + combined_connection = ConnectionDefinition(target_region, combined_rule) + self.CONNECTIONS_BY_REGION_NAME_THEORETICAL[source_region].append(combined_connection) break else: - new_conn = (target_region, parse_lambda(panel_set_string)) - self.CONNECTIONS_BY_REGION_NAME_THEORETICAL[source_region].add(new_conn) + new_connection = ConnectionDefinition(target_region, parse_witness_rule(panel_set_string)) + self.CONNECTIONS_BY_REGION_NAME_THEORETICAL[source_region].append(new_connection) if adj_type == "Added Locations": if "0x" in line: @@ -558,7 +563,7 @@ class WitnessPlayerLogic: self.AVAILABLE_EASTER_EGGS_PER_REGION = defaultdict(int) for entity_hex in self.AVAILABLE_EASTER_EGGS: - region_name = static_witness_logic.ENTITIES_BY_HEX[entity_hex]["region"]["name"] + region_name = static_witness_logic.ENTITIES_BY_HEX[entity_hex]["region"].name self.AVAILABLE_EASTER_EGGS_PER_REGION[region_name] += 1 eggs_per_check, logically_required_eggs_per_check = world.options.easter_egg_hunt.get_step_and_logical_step() @@ -796,7 +801,7 @@ class WitnessPlayerLogic: next_region = regions_to_check.pop() for region_exit in self.CONNECTIONS_BY_REGION_NAME[next_region]: - target = region_exit[0] + target = region_exit.target_region if target in reachable_regions: continue @@ -844,7 +849,7 @@ class WitnessPlayerLogic: # First, entities in unreachable regions are obviously themselves unreachable. for region in new_unreachable_regions: - for entity in static_witness_logic.ALL_REGIONS_BY_NAME[region]["physical_entities"]: + for entity in static_witness_logic.ALL_REGIONS_BY_NAME[region].physical_entities: # Never disable the Victory Location. if entity == self.VICTORY_LOCATION: continue @@ -879,11 +884,11 @@ class WitnessPlayerLogic: if not new_unreachable_regions and not newly_discovered_disabled_entities: return - def reduce_connection_requirement(self, connection: Tuple[str, WitnessRule]) -> WitnessRule: + def reduce_connection_requirement(self, connection: ConnectionDefinition) -> ConnectionDefinition: all_possibilities = [] # Check each traversal option individually - for option in connection[1]: + for option in connection.traversal_rule: individual_entity_requirements: List[WitnessRule] = [] for entity in option: # If a connection requires solving a disabled entity, it is not valid. @@ -901,7 +906,7 @@ class WitnessPlayerLogic: entity_req = self.get_entity_requirement(entity) if self.REFERENCE_LOGIC.ENTITIES_BY_HEX[entity]["region"]: - region_name = self.REFERENCE_LOGIC.ENTITIES_BY_HEX[entity]["region"]["name"] + region_name = self.REFERENCE_LOGIC.ENTITIES_BY_HEX[entity]["region"].name entity_req = logical_and_witness_rules([entity_req, frozenset({frozenset({region_name})})]) individual_entity_requirements.append(entity_req) @@ -909,7 +914,7 @@ class WitnessPlayerLogic: # Merge all possible requirements into one DNF condition. all_possibilities.append(logical_and_witness_rules(individual_entity_requirements)) - return logical_or_witness_rules(all_possibilities) + return ConnectionDefinition(connection.target_region, logical_or_witness_rules(all_possibilities)) def make_dependency_reduced_checklist(self) -> None: """ @@ -942,14 +947,14 @@ class WitnessPlayerLogic: # Make independent region connection requirements based on the entities they require for region, connections in self.CONNECTIONS_BY_REGION_NAME_THEORETICAL.items(): - new_connections = set() + new_connections = [] for connection in connections: - overall_requirement = self.reduce_connection_requirement(connection) + reduced_connection = self.reduce_connection_requirement(connection) # If there is a way to use this connection, add it. - if overall_requirement: - new_connections.add((connection[0], overall_requirement)) + if reduced_connection.can_be_traversed: + new_connections.append(reduced_connection) self.CONNECTIONS_BY_REGION_NAME[region] = new_connections diff --git a/worlds/witness/regions.py b/worlds/witness/regions.py index 8cb3678ab6..c057134adb 100644 --- a/worlds/witness/regions.py +++ b/worlds/witness/regions.py @@ -10,8 +10,9 @@ from BaseClasses import Entrance, Region from worlds.generic.Rules import CollectionRule from .data import static_logic as static_witness_logic +from .data.definition_classes import WitnessRule from .data.static_logic import StaticWitnessLogicObj -from .data.utils import WitnessRule, optimize_witness_rule +from .data.utils import optimize_witness_rule from .locations import WitnessPlayerLocations from .player_logic import WitnessPlayerLogic @@ -114,7 +115,7 @@ class WitnessPlayerRegions: if k not in player_logic.UNREACHABLE_REGIONS } - event_locations_per_region = defaultdict(dict) + event_locations_per_region: Dict[str, Dict[str, int]] = defaultdict(dict) for event_location, event_item_and_entity in player_logic.EVENT_ITEM_PAIRS.items(): entity_or_region = event_item_and_entity[1] @@ -126,13 +127,13 @@ class WitnessPlayerRegions: if region is None: region_name = "Entry" else: - region_name = region["name"] + region_name = region.name order = self.reference_logic.ENTITIES_BY_HEX[entity_or_region]["order"] event_locations_per_region[region_name][event_location] = order for region_name, region in regions_to_create.items(): location_entities_for_this_region = [ - self.reference_logic.ENTITIES_BY_HEX[entity] for entity in region["entities"] + self.reference_logic.ENTITIES_BY_HEX[entity] for entity in region.logical_entities ] locations_for_this_region = { entity["checkName"]: entity["order"] for entity in location_entities_for_this_region diff --git a/worlds/witness/rules.py b/worlds/witness/rules.py index 866f4690f5..545c3e7dd0 100644 --- a/worlds/witness/rules.py +++ b/worlds/witness/rules.py @@ -10,7 +10,7 @@ from BaseClasses import CollectionState from worlds.generic.Rules import CollectionRule, set_rule from .data import static_logic as static_witness_logic -from .data.utils import WitnessRule +from .data.definition_classes import WitnessRule from .player_logic import WitnessPlayerLogic if TYPE_CHECKING: From 9b3ee018e9866dd2a35649b130da6b9e6a9041f9 Mon Sep 17 00:00:00 2001 From: Benny D <78334662+benny-dreamly@users.noreply.github.com> Date: Fri, 14 Mar 2025 01:24:37 -0600 Subject: [PATCH 102/227] Core/Various Worlds: Fix crash/freeze with unicode characters (#4671) replace colorama.init with just_fix_windows_console --- AdventureClient.py | 2 +- CommonClient.py | 2 +- FF1Client.py | 2 +- LinksAwakeningClient.py | 2 +- MMBN3Client.py | 2 +- MultiServer.py | 2 +- OoTClient.py | 2 +- SNIClient.py | 2 +- UndertaleClient.py | 2 +- WargrooveClient.py | 2 +- Zelda1Client.py | 2 +- worlds/_bizhawk/context.py | 2 +- worlds/ahit/Client.py | 2 +- worlds/factorio/Client.py | 2 +- worlds/kh1/Client.py | 2 +- worlds/kh2/Client.py | 2 +- worlds/sc2/Client.py | 2 +- worlds/zillion/client.py | 2 +- worlds/zork_grand_inquisitor/client.py | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/AdventureClient.py b/AdventureClient.py index 24c6a4c4fc..91567fc0a0 100644 --- a/AdventureClient.py +++ b/AdventureClient.py @@ -511,7 +511,7 @@ if __name__ == '__main__': import colorama - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main()) colorama.deinit() diff --git a/CommonClient.py b/CommonClient.py index 33792f0ed2..ae411838d8 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -1128,7 +1128,7 @@ def run_as_textclient(*args): args = handle_url_arg(args, parser=parser) # use colorama to display colored text highlighting on windows - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main(args)) colorama.deinit() diff --git a/FF1Client.py b/FF1Client.py index b7c58e2061..748a95b72c 100644 --- a/FF1Client.py +++ b/FF1Client.py @@ -261,7 +261,7 @@ if __name__ == '__main__': parser = get_base_parser() args = parser.parse_args() - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main(args)) colorama.deinit() diff --git a/LinksAwakeningClient.py b/LinksAwakeningClient.py index ff932e7c76..aac6c2f214 100644 --- a/LinksAwakeningClient.py +++ b/LinksAwakeningClient.py @@ -803,6 +803,6 @@ async def main(): await ctx.shutdown() if __name__ == '__main__': - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main()) colorama.deinit() diff --git a/MMBN3Client.py b/MMBN3Client.py index 140a98745c..4945d49221 100644 --- a/MMBN3Client.py +++ b/MMBN3Client.py @@ -370,7 +370,7 @@ if __name__ == "__main__": import colorama - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main()) colorama.deinit() diff --git a/MultiServer.py b/MultiServer.py index a310808b3a..f9ed34e2f7 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -47,7 +47,7 @@ from NetUtils import Endpoint, ClientStatus, NetworkItem, decode, encode, Networ from BaseClasses import ItemClassification min_client_version = Version(0, 1, 6) -colorama.init() +colorama.just_fix_windows_console() def remove_from_list(container, value): diff --git a/OoTClient.py b/OoTClient.py index 1154904173..6a87b9e722 100644 --- a/OoTClient.py +++ b/OoTClient.py @@ -346,7 +346,7 @@ if __name__ == '__main__': import colorama - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main()) colorama.deinit() diff --git a/SNIClient.py b/SNIClient.py index 9140c73c14..1156bf6040 100644 --- a/SNIClient.py +++ b/SNIClient.py @@ -735,6 +735,6 @@ async def main() -> None: if __name__ == '__main__': - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main()) colorama.deinit() diff --git a/UndertaleClient.py b/UndertaleClient.py index dfacee148a..1c522fac92 100644 --- a/UndertaleClient.py +++ b/UndertaleClient.py @@ -500,7 +500,7 @@ def main(): import colorama - colorama.init() + colorama.just_fix_windows_console() asyncio.run(_main()) colorama.deinit() diff --git a/WargrooveClient.py b/WargrooveClient.py index f9971f7a6c..f900e05e3f 100644 --- a/WargrooveClient.py +++ b/WargrooveClient.py @@ -446,6 +446,6 @@ if __name__ == '__main__': parser = get_base_parser(description="Wargroove Client, for text interfacing.") args, rest = parser.parse_known_args() - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main(args)) colorama.deinit() diff --git a/Zelda1Client.py b/Zelda1Client.py index 1154804fbf..4473b3f3c7 100644 --- a/Zelda1Client.py +++ b/Zelda1Client.py @@ -386,7 +386,7 @@ if __name__ == '__main__': parser.add_argument('diff_file', default="", type=str, nargs="?", help='Path to a Archipelago Binary Patch file') args = parser.parse_args() - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main(args)) colorama.deinit() diff --git a/worlds/_bizhawk/context.py b/worlds/_bizhawk/context.py index 21c54d30c7..c9b1076644 100644 --- a/worlds/_bizhawk/context.py +++ b/worlds/_bizhawk/context.py @@ -276,6 +276,6 @@ def launch(*launch_args: str) -> None: Utils.init_logging("BizHawkClient", exception_logger="Client") import colorama - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main()) colorama.deinit() diff --git a/worlds/ahit/Client.py b/worlds/ahit/Client.py index cbb5f2a13d..0a9d8d6042 100644 --- a/worlds/ahit/Client.py +++ b/worlds/ahit/Client.py @@ -261,6 +261,6 @@ def launch(): # options = Utils.get_options() import colorama - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main()) colorama.deinit() diff --git a/worlds/factorio/Client.py b/worlds/factorio/Client.py index ac58339c5e..ff1de17f0b 100644 --- a/worlds/factorio/Client.py +++ b/worlds/factorio/Client.py @@ -530,7 +530,7 @@ server_args = ("--rcon-port", rcon_port, "--rcon-password", rcon_password) def launch(): import colorama global executable, server_settings, server_args - colorama.init() + colorama.just_fix_windows_console() if server_settings: server_settings = os.path.abspath(server_settings) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index 33fba85f6c..b98f215312 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -295,6 +295,6 @@ def launch(): parser = get_base_parser(description="KH1 Client, for text interfacing.") args, rest = parser.parse_known_args() - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main(args)) colorama.deinit() diff --git a/worlds/kh2/Client.py b/worlds/kh2/Client.py index 15a103c2a1..96b406c72f 100644 --- a/worlds/kh2/Client.py +++ b/worlds/kh2/Client.py @@ -981,6 +981,6 @@ def launch(): parser = get_base_parser(description="KH2 Client, for text interfacing.") args, rest = parser.parse_known_args() - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main(args)) colorama.deinit() diff --git a/worlds/sc2/Client.py b/worlds/sc2/Client.py index 813cf28845..77b13a5acb 100644 --- a/worlds/sc2/Client.py +++ b/worlds/sc2/Client.py @@ -1625,6 +1625,6 @@ def get_location_offset(mission_id): def launch(): - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main()) colorama.deinit() diff --git a/worlds/zillion/client.py b/worlds/zillion/client.py index d629df583a..71f0615d32 100644 --- a/worlds/zillion/client.py +++ b/worlds/zillion/client.py @@ -516,6 +516,6 @@ async def main() -> None: def launch() -> None: - colorama.init() + colorama.just_fix_windows_console() asyncio.run(main()) colorama.deinit() diff --git a/worlds/zork_grand_inquisitor/client.py b/worlds/zork_grand_inquisitor/client.py index 11d6b7f8f1..8b8d7d3ebf 100644 --- a/worlds/zork_grand_inquisitor/client.py +++ b/worlds/zork_grand_inquisitor/client.py @@ -177,7 +177,7 @@ def main() -> None: import colorama - colorama.init() + colorama.just_fix_windows_console() asyncio.run(_main()) From 0d1935e7572b7fdaef624086bffc87a987ea88bc Mon Sep 17 00:00:00 2001 From: neocerber <140952826+neocerber@users.noreply.github.com> Date: Fri, 14 Mar 2025 11:35:58 -0400 Subject: [PATCH 103/227] SC2: Add a description of mission order and the impact of collect on a SC2 world (#4398) * Added mission order to randomized stuff, added a mention to the default option collect on goal, added an issue about mission order progress vs AP collect * Remove false menion of collect being note modifyable after the mworld was gen * Simplification of some sentences * American spelling, header newline, and other * Revert gray to grey, corrected some colors * Forgot a gray -> grey * Replace how the faction color option is described to side-step difference within yaml and client. Both fr/en. --- worlds/sc2/docs/en_Starcraft 2.md | 40 ++++++++++++++++++++++----- worlds/sc2/docs/fr_Starcraft 2.md | 45 +++++++++++++++++++++++++------ worlds/sc2/docs/setup_en.md | 1 + worlds/sc2/docs/setup_fr.md | 1 + 4 files changed, 73 insertions(+), 14 deletions(-) diff --git a/worlds/sc2/docs/en_Starcraft 2.md b/worlds/sc2/docs/en_Starcraft 2.md index 813fdb5f4a..e860e8a6b6 100644 --- a/worlds/sc2/docs/en_Starcraft 2.md +++ b/worlds/sc2/docs/en_Starcraft 2.md @@ -1,10 +1,13 @@ # StarCraft 2 ## Game page in other languages: + * [Français](/games/Starcraft%202/info/fr) ## What does randomization do to this game? +### Items and locations + The following unlocks are randomized as items: 1. Your ability to build any non-worker unit. 2. Unit specific upgrades including some combinations not available in the vanilla campaigns, such as both strain @@ -34,18 +37,28 @@ When you receive items, they will immediately become available, even during a mi notified via a text box in the top-right corner of the game screen. Item unlocks are also logged in the Archipelago client. +### Mission order + +The missions and the order in which they need to be completed, referred to as the mission order, can also be randomized. +The four StarCraft 2 campaigns can be used to populate the mission order. +Note that the evolution missions from Heart of the Swarm are not included in the randomizer. +The default mission order follows the structure of the selected campaigns but several other options are available, +e.g., blitz, grid, etc. + Missions are launched through the StarCraft 2 Archipelago client, through the StarCraft 2 Launcher tab. The between mission segments on the Hyperion, the Leviathan, and the Spear of Adun are not included. Additionally, metaprogression currencies such as credits and Solarite are not used. +Available missions are in blue; missions where all locations were collected are in white. +If you move your mouse over a mission, the uncollected locations will be displayed, categorized by type. +Unavailable missions are in grey; their requirements will also be shown there. ## What is the goal of this game when randomized? The goal is to beat the final mission in the mission order. -The yaml configuration file controls the mission order (e.g. blitz, grid, etc.), which combination of the four -StarCraft 2 campaigns can be used to populate the mission order and how missions are shuffled. +The yaml configuration file controls the mission order, which combination of the four StarCraft 2 campaigns can be +used, and how missions are shuffled. Since the first two options determine the number of missions in a StarCraft 2 world, they can be used to customize the expected time to complete the world. -Note that the evolution missions from Heart of the Swarm are not included in the randomizer. ## What non-randomized changes are there from vanilla StarCraft 2? @@ -78,9 +91,7 @@ Will overwrite existing files * `/game_speed [game_speed]` Overrides the game speed for the world * Options: default, slower, slow, normal, fast, faster * `/color [faction] [color]` Changes your color for one of your playable factions. - * Faction options: raynor, kerrigan, primal, protoss, nova - * Color options: white, red, blue, teal, purple, yellow, orange, green, lightpink, violet, lightgrey, darkgreen, - brown, lightgreen, darkgrey, pink, rainbow, random, default + * Run without arguments to list all factions and colors that are available. * `/option [option_name] [option_value]` Sets an option normally controlled by your yaml after generation. * Run without arguments to list all options. * Options pertain to automatic cutscene skipping, Kerrigan presence, Spear of Adun presence, starting resource @@ -100,6 +111,19 @@ Additionally, upgrades are grouped beneath their corresponding units or building A filter parameter can be provided, e.g., `/received Thor`, to limit the number of items shown. Every item whose name, race, or group name contains the provided parameter will be shown. +## Particularities in a multiworld + +### Collect on goal completion + +One of the default options of multiworlds is that once a world has achieved its goal, it collects its items from all +other worlds. +If you do not want this to happen, you should ask the person generating the multiworld to set the `Collect Permission` +option to something else, e.g., manual. +If the generation is not done via the website, the person that does the generation should modify the `collect_mode` +option in their `host.yaml` file prior to generation. +If the multiworld has already been generated, the host can use the command `/option collect_mode [value]` to change +this option. + ## Known issues - StarCraft 2 Archipelago does not support loading a saved game. @@ -108,3 +132,7 @@ For this reason, it is recommended to play on a difficulty level lower than what To restart a mission, use the StarCraft 2 Client. - A crash report is often generated when a mission is closed. This does not affect the game and can be ignored. +- Currently, the StarCraft 2 client uses the Victory locations to determine which missions have been completed. +As a result, the Archipelago collect feature can sometime grant access to missions that are connected to a mission that +you did not complete. + diff --git a/worlds/sc2/docs/fr_Starcraft 2.md b/worlds/sc2/docs/fr_Starcraft 2.md index 092835c8e3..190802e91b 100644 --- a/worlds/sc2/docs/fr_Starcraft 2.md +++ b/worlds/sc2/docs/fr_Starcraft 2.md @@ -2,6 +2,8 @@ ## Quel est l'effet de la *randomization* sur ce jeu ? +### *Items* et *locations* + Les éléments qui suivent sont les *items* qui sont *randomized* et qui doivent être débloqués pour être utilisés dans le jeu: 1. La capacité de produire des unités, excepté les drones/probes/scv. @@ -37,21 +39,33 @@ Quand vous recevez un *item*, il devient immédiatement disponible, même pendan la boîte de texte situé dans le coin en haut à droite de *StarCraft 2*. L'acquisition d'un *item* est aussi indiquée dans le client d'Archipelago. +### *Mission order* + +Les missions et l'ordre dans lequel elles doivent être complétées, dénoté *mission order*, peuvent également être +*randomized*. +Les quatre campagnes de *StarCraft 2* peuvent être utilisées pour remplir le *mission order*. +Notez que les missions d'évolution de *Heart of the Swarm* ne sont pas incluses dans le *randomizer*. +Par défaut, le *mission order* suit la structure des campagnes sélectionnées, mais plusieurs autres options sont +disponibles, comme *blitz*, *grid*, etc. + Les missions peuvent être lancées par le client *StarCraft 2 Archipelago*, via l'interface graphique de l'onglet *StarCraft 2 Launcher*. Les segments qui se passent sur l'*Hyperion*, un Léviathan et la *Spear of Adun* ne sont pas inclus. -De plus, les points de progression tels que les crédits ou la Solarite ne sont pas utilisés dans *StarCraft 2 +De plus, les points de progression, tels que les crédits ou la Solarite, ne sont pas utilisés dans *StarCraft 2 Archipelago*. +Les missions accessibles ont leur nom en bleu, tandis que celles où toutes les *locations* ont été collectées +apparaissent en blanc. +En plaçant votre souris sur une mission, les *locations* non collectées s’affichent, classées par catégorie. +Les missions qui ne sont pas accessibles ont leur nom en gris et leurs prérequis seront également affichés à cet endroit. + ## Quel est le but de ce jeu quand il est *randomized*? Le but est de réussir la mission finale du *mission order* (e.g. *blitz*, *grid*, etc.). -Le fichier de configuration yaml permet de spécifier le *mission order*, lesquelles des quatre campagnes de -*StarCraft 2* peuvent être utilisées pour remplir le *mission order* et comment les missions sont distribuées dans le -*mission order*. +Le fichier de configuration yaml permet de spécifier le *mission order*, quelle combinaison des quatre campagnes de +*StarCraft 2* peuvent être utilisée et comment les missions sont distribuées dans le *mission order*. Étant donné que les deux premières options déterminent le nombre de missions dans un monde de *StarCraft 2*, elles peuvent être utilisées pour moduler le temps nécessaire pour terminer le monde. -Notez que les missions d'évolution de Heart of the Swarm ne sont pas incluses dans le *randomizer*. ## Quelles sont les modifications non aléatoires comparativement à la version de base de *StarCraft 2* @@ -89,9 +103,7 @@ Les fichiers existants vont être écrasés. * `/game_speed [game_speed]` Remplace la vitesse du jeu pour le monde. * Les options sont *default*, *slower*, *slow*, *normal*, *fast*, and *faster*. * `/color [faction] [color]` Remplace la couleur d'une des *factions* qui est jouable. - * Les options de *faction*: raynor, kerrigan, primal, protoss, nova. - * Les options de couleur: *white*, *red*, *blue*, *teal*, *purple*, *yellow*, *orange*, *green*, *lightpink*, -*violet*, *lightgrey*, *darkgreen*, *brown*, *lightgreen*, *darkgrey*, *pink*, *rainbow*, *random*, *default*. + * Si la commande est lancée sans option, la liste des *factions* et des couleurs disponibles sera affichée. * `/option [option_name] [option_value]` Permet de changer un option normalement définit dans le *yaml*. * Si la commande est lancée sans option, la liste des options qui sont modifiables va être affichée. * Les options qui peuvent être changées avec cette commande incluent sauter les cinématiques automatiquement, la @@ -114,6 +126,19 @@ De plus, les améliorations sont regroupées sous leurs unités/bâtiments corre Un paramètre de filtrage peut aussi être fourni, e.g., `/received Thor`, pour limiter le nombre d'*items* affichés. Tous les *items* dont le nom, la race ou le nom de groupe contient le paramètre fourni seront affichés. +## Particularités dans un multiworld + +### *Collect on goal completion* + +L'une des options par défaut des *multiworlds* est qu'une fois qu'un monde a atteint son objectif final, il collecte +tous ses *items*, incluant ceux dans les autres mondes. +Si vous ne souhaitez pas que cela se produise, vous devez demander à la personne générant le *multiworld* de changer +l'option *Collect Permission*. +Si la génération n'est pas effectuée via le site web, la personne qui effectue la génération doit modifier l'option +`collect_mode` dans son fichier *host.yaml* avant la génération. +Si le *multiworld* a déjà été généré, l'hôte peut utiliser la commande `/option collect_mode [valeur]` pour modifier +cette option. + ## Problèmes connus - *StarCraft 2 Archipelago* ne supporte pas le chargement d'une sauvegarde. @@ -123,3 +148,7 @@ normalement à l'aise. Pour redémarrer une mission, utilisez le client de *StarCraft 2 Archipelago*. - Un rapport d'erreur est souvent généré lorsqu'une mission est fermée. Cela n'affecte pas le jeu et peut être ignoré. +- Actuellement, le client de *StarCraft 2* utilise la *location* associée à la victoire d'une mission pour déterminer +si celle-ci a été complétée. +En conséquence, la fonctionnalité *collect* d'*Archipelago* peut rendre accessible des missions connectées à une +mission que vous n'avez pas terminée. \ No newline at end of file diff --git a/worlds/sc2/docs/setup_en.md b/worlds/sc2/docs/setup_en.md index 5b378873f4..4364008b58 100644 --- a/worlds/sc2/docs/setup_en.md +++ b/worlds/sc2/docs/setup_en.md @@ -41,6 +41,7 @@ Remember the name you enter in the options page or in the yaml file, you'll need Check out [Creating a YAML](/tutorial/Archipelago/setup/en#creating-a-yaml) for more game-agnostic information. ### Common yaml questions + #### How do I know I set my yaml up correctly? The simplest way to check is to use the website [validator](/check). diff --git a/worlds/sc2/docs/setup_fr.md b/worlds/sc2/docs/setup_fr.md index d9b754572a..7cdb7225b4 100644 --- a/worlds/sc2/docs/setup_fr.md +++ b/worlds/sc2/docs/setup_fr.md @@ -49,6 +49,7 @@ Si vous désirez des informations et/ou instructions générales sur l'utilisati veuillez consulter [*Creating a YAML*](/tutorial/Archipelago/setup/en#creating-a-yaml). ### Questions récurrentes à propos du fichier *yaml* + #### Comment est-ce que je sais que mon *yaml* est bien défini? La manière la plus simple de valider votre *yaml* est d'utiliser le From 7e32feeea373daca8a4a1045c2afadabe61c7429 Mon Sep 17 00:00:00 2001 From: Scipio Wright Date: Sat, 15 Mar 2025 07:09:04 -0400 Subject: [PATCH 104/227] Webhost: Update random option wording on webhost (#4555) * Update random option wording on webhost * Update WebHostLib/templates/playerOptions/macros.html Co-authored-by: Jouramie <16137441+Jouramie@users.noreply.github.com> --- WebHostLib/templates/playerOptions/macros.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebHostLib/templates/playerOptions/macros.html b/WebHostLib/templates/playerOptions/macros.html index 64f0f140de..972f03175d 100644 --- a/WebHostLib/templates/playerOptions/macros.html +++ b/WebHostLib/templates/playerOptions/macros.html @@ -213,7 +213,7 @@ {% endmacro %} {% macro RandomizeButton(option_name, option) %} -
+
- {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/hostGame.html b/WebHostLib/templates/hostGame.html index 2bcb993af5..d7d0a96331 100644 --- a/WebHostLib/templates/hostGame.html +++ b/WebHostLib/templates/hostGame.html @@ -1,4 +1,5 @@ {% extends 'pageWrapper.html' %} +{% set show_footer = True %} {% block head %} Upload Multidata @@ -27,6 +28,4 @@
- - {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/landing.html b/WebHostLib/templates/landing.html index b489ef18ac..e7d0569e6c 100644 --- a/WebHostLib/templates/landing.html +++ b/WebHostLib/templates/landing.html @@ -1,4 +1,5 @@ {% extends 'pageWrapper.html' %} +{% set show_footer = True %} {% block head %} Archipelago @@ -57,5 +58,4 @@ - {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/pageWrapper.html b/WebHostLib/templates/pageWrapper.html index c7dda523ef..4347b4add3 100644 --- a/WebHostLib/templates/pageWrapper.html +++ b/WebHostLib/templates/pageWrapper.html @@ -5,26 +5,29 @@ - {% block head %} Archipelago {% endblock %} +
+ {% with messages = get_flashed_messages() %} + {% if messages %} +
+ {% for message in messages | unique %} +
{{ message }}
+ {% endfor %} +
+ {% endif %} + {% endwith %} -{% with messages = get_flashed_messages() %} - {% if messages %} -
- {% for message in messages | unique %} -
{{ message }}
- {% endfor %} -
+ {% block body %} + {% endblock %} +
+ + {% if show_footer %} + {% include "islandFooter.html" %} {% endif %} -{% endwith %} - -{% block body %} -{% endblock %} - diff --git a/WebHostLib/templates/seedError.html b/WebHostLib/templates/seedError.html index 0f5850da1b..a5eec1a4cc 100644 --- a/WebHostLib/templates/seedError.html +++ b/WebHostLib/templates/seedError.html @@ -1,5 +1,6 @@ {% extends 'pageWrapper.html' %} {% import "macros.html" as macros %} +{% set show_footer = True %} {% block head %} Generation failed, please retry. @@ -15,5 +16,4 @@ {{ seed_error }} - {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/startPlaying.html b/WebHostLib/templates/startPlaying.html index ab2f021d61..9e09474bd0 100644 --- a/WebHostLib/templates/startPlaying.html +++ b/WebHostLib/templates/startPlaying.html @@ -1,4 +1,5 @@ {% extends 'pageWrapper.html' %} +{% set show_footer = True %} {% block head %} Start Playing @@ -26,6 +27,4 @@

- - {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/viewSeed.html b/WebHostLib/templates/viewSeed.html index a8478c95c3..70ffe23b7b 100644 --- a/WebHostLib/templates/viewSeed.html +++ b/WebHostLib/templates/viewSeed.html @@ -1,5 +1,6 @@ {% extends 'pageWrapper.html' %} {% import "macros.html" as macros %} +{% set show_footer = True %} {% block head %} View Seed {{ seed.id|suuid }} @@ -50,5 +51,4 @@
- {% include 'islandFooter.html' %} {% endblock %} diff --git a/WebHostLib/templates/waitSeed.html b/WebHostLib/templates/waitSeed.html index 9041b901b5..235c2f1665 100644 --- a/WebHostLib/templates/waitSeed.html +++ b/WebHostLib/templates/waitSeed.html @@ -1,5 +1,6 @@ {% extends 'pageWrapper.html' %} {% import "macros.html" as macros %} +{% set show_footer = True %} {% block head %} Generation in Progress @@ -15,5 +16,4 @@ Waiting for game to generate, this page auto-refreshes to check. - {% include 'islandFooter.html' %} {% endblock %} From e211dfa1c2f6da28c17353749e319ec8a4ec7a4f Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Wed, 9 Apr 2025 07:43:28 +0200 Subject: [PATCH 199/227] WebHost: use JS to refresh waitSeed if scripting is enabled (#4843) --- WebHostLib/templates/waitSeed.html | 34 +++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/WebHostLib/templates/waitSeed.html b/WebHostLib/templates/waitSeed.html index 235c2f1665..f2729353a6 100644 --- a/WebHostLib/templates/waitSeed.html +++ b/WebHostLib/templates/waitSeed.html @@ -4,7 +4,9 @@ {% block head %} Generation in Progress - + {% endblock %} @@ -16,4 +18,34 @@ Waiting for game to generate, this page auto-refreshes to check. + {% endblock %} From f93734f9e3b7b805bff4edacc204fbf31559e345 Mon Sep 17 00:00:00 2001 From: Alchav <59858495+Alchav@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:20:56 -0400 Subject: [PATCH 200/227] Pokemon Red and Blue: PC Item Fix (#4835) * Pokemon Red and Blue PC Item fix * Respect non_local_items for PC Item * prefer exclude if also in priority locations --------- Co-authored-by: alchav --- worlds/pokemon_rb/regions.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/worlds/pokemon_rb/regions.py b/worlds/pokemon_rb/regions.py index a7c0b6d533..84c9b25735 100644 --- a/worlds/pokemon_rb/regions.py +++ b/worlds/pokemon_rb/regions.py @@ -1580,16 +1580,22 @@ def create_regions(world): world.random.shuffle(world.item_pool) if not world.options.key_items_only: - if "Player's House 2F - Player's PC" in world.options.exclude_locations: - acceptable_item = lambda item: item.excludable - elif "Player's House 2F - Player's PC" in world.options.priority_locations: - acceptable_item = lambda item: item.advancement - else: - acceptable_item = lambda item: True + def acceptable_item(item): + return ("Badge" not in item.name and "Trap" not in item.name and item.name != "Pokedex" + and "Coins" not in item.name and "Progressive" not in item.name + and ("Player's House 2F - Player's PC" not in world.options.exclude_locations or item.excludable) + and ("Player's House 2F - Player's PC" in world.options.exclude_locations or + "Player's House 2F - Player's PC" not in world.options.priority_locations or item.advancement)) for i, item in enumerate(world.item_pool): - if acceptable_item(item): + if acceptable_item(item) and (item.name not in world.options.non_local_items.value): world.pc_item = world.item_pool.pop(i) break + else: + for i, item in enumerate(world.item_pool): + if acceptable_item(item): + world.pc_item = world.item_pool.pop(i) + break + advancement_items = [item.name for item in world.item_pool if item.advancement] \ + [item.name for item in world.multiworld.precollected_items[world.player] if From 1ee749b3522735bdd7f250a69d7b3a2a1b19d4a4 Mon Sep 17 00:00:00 2001 From: Ziktofel Date: Wed, 9 Apr 2025 22:21:16 +0200 Subject: [PATCH 201/227] SC2 Client: Fix missing mission tooltip after KivyMD switch (#4827) --- worlds/sc2/ClientGui.py | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/worlds/sc2/ClientGui.py b/worlds/sc2/ClientGui.py index 27857715a8..d16acad83d 100644 --- a/worlds/sc2/ClientGui.py +++ b/worlds/sc2/ClientGui.py @@ -5,12 +5,11 @@ from NetUtils import JSONMessagePart from kvui import GameManager, HoverBehavior, ServerToolTip, KivyJSONtoTextParser from kivy.app import App from kivy.clock import Clock -from kivymd.uix.tab import MDTabsItem, MDTabsItemText from kivy.uix.gridlayout import GridLayout from kivy.lang import Builder from kivy.uix.label import Label from kivy.uix.button import Button -from kivy.uix.floatlayout import FloatLayout +from kivymd.uix.tooltip import MDTooltip from kivy.uix.scrollview import ScrollView from kivy.properties import StringProperty @@ -26,30 +25,22 @@ class HoverableButton(HoverBehavior, Button): pass -class MissionButton(HoverableButton): +class MissionButton(HoverableButton, MDTooltip): tooltip_text = StringProperty("Test") def __init__(self, *args, **kwargs): - super(HoverableButton, self).__init__(*args, **kwargs) - self.layout = FloatLayout() - self.popuplabel = ServerToolTip(text=self.text, markup=True) - self.popuplabel.padding = [5, 2, 5, 2] - self.layout.add_widget(self.popuplabel) + super(HoverableButton, self).__init__(**kwargs) + self._tooltip = ServerToolTip(text=self.text, markup=True) + self._tooltip.padding = [5, 2, 5, 2] def on_enter(self): - self.popuplabel.text = self.tooltip_text + self._tooltip.text = self.tooltip_text - if self.ctx.current_tooltip: - App.get_running_app().root.remove_widget(self.ctx.current_tooltip) - - if self.tooltip_text == "": - self.ctx.current_tooltip = None - else: - App.get_running_app().root.add_widget(self.layout) - self.ctx.current_tooltip = self.layout + if self.tooltip_text != "": + self.display_tooltip() def on_leave(self): - self.ctx.ui.clear_tooltip() + self.remove_tooltip() @property def ctx(self) -> SC2Context: From b7263edfd0512949c0dbfef86e1e48bd43c13890 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 9 Apr 2025 19:41:07 -0400 Subject: [PATCH 202/227] Lingo: Removed unnecessary "global" keywords (#4854) --- worlds/lingo/items.py | 2 -- worlds/lingo/locations.py | 2 -- worlds/lingo/utils/pickle_static_data.py | 21 ++------------------- 3 files changed, 2 insertions(+), 23 deletions(-) diff --git a/worlds/lingo/items.py b/worlds/lingo/items.py index b773caeb4e..338ddffa5d 100644 --- a/worlds/lingo/items.py +++ b/worlds/lingo/items.py @@ -58,8 +58,6 @@ def get_prog_item_classification(item_name: str): def load_item_data(): - global ALL_ITEM_TABLE, ITEMS_BY_GROUP - for color in ["Black", "Red", "Blue", "Yellow", "Green", "Orange", "Gray", "Brown", "Purple"]: ALL_ITEM_TABLE[color] = ItemData(get_special_item_id(color), get_prog_item_classification(color), ItemType.COLOR, False, []) diff --git a/worlds/lingo/locations.py b/worlds/lingo/locations.py index c527e522fb..bcd14fc5a7 100644 --- a/worlds/lingo/locations.py +++ b/worlds/lingo/locations.py @@ -35,8 +35,6 @@ LOCATIONS_BY_GROUP: Dict[str, List[str]] = {} def load_location_data(): - global ALL_LOCATION_TABLE, LOCATIONS_BY_GROUP - for room_name, panels in PANELS_BY_ROOM.items(): for panel_name, panel in panels.items(): location_name = f"{room_name} - {panel_name}" if panel.location_name is None else panel.location_name diff --git a/worlds/lingo/utils/pickle_static_data.py b/worlds/lingo/utils/pickle_static_data.py index df82a12861..740e129bcb 100644 --- a/worlds/lingo/utils/pickle_static_data.py +++ b/worlds/lingo/utils/pickle_static_data.py @@ -58,8 +58,7 @@ def hash_file(path): def load_static_data(ll1_path, ids_path): - global PAINTING_EXITS, SPECIAL_ITEM_IDS, PANEL_LOCATION_IDS, DOOR_LOCATION_IDS, DOOR_ITEM_IDS, \ - DOOR_GROUP_ITEM_IDS, PROGRESSIVE_ITEM_IDS, PANEL_DOOR_ITEM_IDS, PANEL_GROUP_ITEM_IDS + global PAINTING_EXITS # Load in all item and location IDs. These are broken up into groups based on the type of item/location. with open(ids_path, "r") as file: @@ -128,7 +127,7 @@ def load_static_data(ll1_path, ids_path): def process_single_entrance(source_room: str, room_name: str, door_obj) -> RoomEntrance: - global PAINTING_ENTRANCES, PAINTING_EXIT_ROOMS + global PAINTING_ENTRANCES entrance_type = EntranceType.NORMAL if "painting" in door_obj and door_obj["painting"]: @@ -175,8 +174,6 @@ def process_entrance(source_room, doors, room_obj): def process_panel_door(room_name, panel_door_name, panel_door_data): - global PANEL_DOORS_BY_ROOM, PANEL_DOOR_BY_PANEL_BY_ROOM - panels: List[RoomAndPanel] = list() for panel in panel_door_data["panels"]: if isinstance(panel, dict): @@ -215,8 +212,6 @@ def process_panel_door(room_name, panel_door_name, panel_door_data): def process_panel(room_name, panel_name, panel_data): - global PANELS_BY_ROOM - # required_room can either be a single room or a list of rooms. if "required_room" in panel_data: if isinstance(panel_data["required_room"], list): @@ -310,8 +305,6 @@ def process_panel(room_name, panel_name, panel_data): def process_door(room_name, door_name, door_data): - global DOORS_BY_ROOM - # The item name associated with a door can be explicitly specified in the configuration. If it is not, it is # generated from the room and door name. if "item_name" in door_data: @@ -409,8 +402,6 @@ def process_door(room_name, door_name, door_data): def process_painting(room_name, painting_data): - global PAINTINGS, REQUIRED_PAINTING_ROOMS, REQUIRED_PAINTING_WHEN_NO_DOORS_ROOMS - # Read in information about this painting and store it in an object. painting_id = painting_data["id"] @@ -468,8 +459,6 @@ def process_painting(room_name, painting_data): def process_sunwarp(room_name, sunwarp_data): - global SUNWARP_ENTRANCES, SUNWARP_EXITS - if sunwarp_data["direction"] == "enter": SUNWARP_ENTRANCES[sunwarp_data["dots"] - 1] = room_name else: @@ -477,8 +466,6 @@ def process_sunwarp(room_name, sunwarp_data): def process_progressive_door(room_name, progression_name, progression_doors): - global PROGRESSIVE_ITEMS, PROGRESSIVE_DOORS_BY_ROOM - # Progressive items are configured as a list of doors. PROGRESSIVE_ITEMS.add(progression_name) @@ -497,8 +484,6 @@ def process_progressive_door(room_name, progression_name, progression_doors): def process_progressive_panel(room_name, progression_name, progression_panel_doors): - global PROGRESSIVE_ITEMS, PROGRESSIVE_PANELS_BY_ROOM - # Progressive items are configured as a list of panel doors. PROGRESSIVE_ITEMS.add(progression_name) @@ -517,8 +502,6 @@ def process_progressive_panel(room_name, progression_name, progression_panel_doo def process_room(room_name, room_data): - global ALL_ROOMS - room_obj = Room(room_name, []) if "entrances" in room_data: From e3b8a60584524e5dbb24cfc1542a3acb92da9360 Mon Sep 17 00:00:00 2001 From: qwint Date: Wed, 9 Apr 2025 20:29:11 -0500 Subject: [PATCH 203/227] Webhost: Fix Sphere Tracker crashing on item links (#4855) --- BaseClasses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseClasses.py b/BaseClasses.py index 4db3917985..4074108b4b 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -616,7 +616,7 @@ class MultiWorld(): locations: Set[Location] = set() events: Set[Location] = set() for location in self.get_filled_locations(): - if type(location.item.code) is int: + if type(location.item.code) is int and type(location.address) is int: locations.add(location) else: events.add(location) From 78c93d7e3905d932d284c72c525911fe1f731fe8 Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 10 Apr 2025 12:00:48 -0500 Subject: [PATCH 204/227] Docs: Add FAQ section for corrupted metadata debugging (#4705) Co-authored-by: Scipio Wright --- docs/apworld_dev_faq.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/apworld_dev_faq.md b/docs/apworld_dev_faq.md index 769a2fb3a0..6d7d23b488 100644 --- a/docs/apworld_dev_faq.md +++ b/docs/apworld_dev_faq.md @@ -66,3 +66,22 @@ The reason entrance access rules using `location.can_reach` and `entrance.can_re We recognize it can feel like a trap since it will not alert you when you are missing an indirect condition, and that some games have very complex access rules. As of [PR #3682 (Core: Region handling customization)](https://github.com/ArchipelagoMW/Archipelago/pull/3682) being merged, it is possible for a world to opt out of indirect conditions entirely, instead using the system of checking each entrance whenever a region has been reached, although this does come with a performance cost. Opting out of using indirect conditions should only be used by games that *really* need it. For most games, it should be reasonable to know all entrance → region dependencies, making indirect conditions preferred because they are much faster. + +--- + +### I uploaded the generated output of my world to the webhost and webhost is erroring on corrupted multidata + +The error `Could not load multidata. File may be corrupted or incompatible.` occurs when uploading a locally generated +file where there is an issue with the multidata contained within it. It may come with a description like +`(No module named 'worlds.myworld')` or `(global 'worlds.myworld.names.ItemNames' is forbidden)` + +Pickling is a way to compress python objects such that they can be decompressed and be used to rebuild the +python objects. This means that if one of your custom class instances ends up in the multidata, the server would not +be able to load that custom class to decompress the data, which can fail either because the custom class is unknown +(because it cannot load your world module) or the class it's attempting to import to decompress is deemed unsafe. + +Common situations where this can happen include: +* Using Option instances directly in slot_data. Ex: using `options.option_name` instead of `options.option_name.value`. + Also, consider using the `options.as_dict("option_name", "option_two")` helper. +* Using enums as Location/Item names in the datapackage. When building out `location_name_to_id` and `item_name_to_id`, + make sure that you are not using your enum class for either the names or ids in these mappings. From 399958c8814112ed266eef5734999544a9337da3 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 10 Apr 2025 12:03:05 -0500 Subject: [PATCH 205/227] The Messenger: Add an FAQ (#4718) --- worlds/messenger/docs/en_The Messenger.md | 20 ++++++++++++++++++-- worlds/messenger/options.py | 4 +++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/worlds/messenger/docs/en_The Messenger.md b/worlds/messenger/docs/en_The Messenger.md index a68ee5ba4c..1886162fc9 100644 --- a/worlds/messenger/docs/en_The Messenger.md +++ b/worlds/messenger/docs/en_The Messenger.md @@ -1,6 +1,7 @@ # The Messenger ## Quick Links + - [Setup](/tutorial/The%20Messenger/setup/en) - [Options Page](/games/The%20Messenger/player-options) - [Courier Github](https://github.com/Brokemia/Courier) @@ -26,6 +27,7 @@ obtained. You'll be forced to do sections of the game in different ways with you ## Where can I find items? You can find items wherever items can be picked up in the original game. This includes: + * Shopkeeper dialog where the player originally gains movement items * Quest Item pickups * Music Box notes @@ -42,6 +44,7 @@ group of items. Hinting for a group will choose a random item from the group tha for it. The groups you can use for The Messenger are: + * Notes - This covers the music notes * Keys - An alternative name for the music notes * Crest - The Sun and Moon Crests @@ -64,16 +67,29 @@ The groups you can use for The Messenger are: be entered in game. ## Known issues + * Ruxxtin Coffin cutscene will sometimes not play correctly, but will still reward the item * If you receive the Magic Firefly while in Quillshroom Marsh, The De-curse Queen cutscene will not play. You can exit to Searing Crags and re-enter to get it to play correctly. * Teleporting back to HQ, then returning to the same level you just left through a Portal can cause Ninja to run left and enter a different portal than the one entered by the player or lead to other incorrect inputs, causing a soft lock * Text entry menus don't accept controller input -* In power seal hunt mode, the chest must be opened by entering the shop from a level. Teleporting to HQ and opening the - chest will not work. ## What do I do if I have a problem? If you believe something happened that isn't intended, please get the `log.txt` from the folder of your game installation and send a bug report either on GitHub or the [Archipelago Discord Server](http://archipelago.gg/discord) + +## FAQ + +* The tracker says I can get some checks in Howling Grotto, but I can't defeat the Emerald Golem. How do I get there? + * Due to the way the vanilla game handles bosses and level transitions, if you die to him, the room will be unlocked, + and you can leave. +* I have the money wrench. Why won't the shopkeeper let me enter the sink? + * The money wrench is both an item you must find or receive from another player and a location check, which you must + purchase from the Artificer, as in vanilla. +* How do I unfreeze Manfred? Where is the monk? + * The monk will only appear near Manfred after you cleanse the Queen of Quills with the fairy (magic firefly). +* I have all the power seals I need to win, but nothing is happening when I open the chest. + * Due to how the level loading code works, I am currently unable to teleport you out of HQ at will; you must enter the + shop from within a level. diff --git a/worlds/messenger/options.py b/worlds/messenger/options.py index c7a0f543ba..aaf152fbf8 100644 --- a/worlds/messenger/options.py +++ b/worlds/messenger/options.py @@ -147,7 +147,9 @@ class MusicBox(DefaultOnToggle): class NotesNeeded(Range): - """How many notes are needed to access the Music Box.""" + """ + How many notes need to be found in order to access the Music Box. 6 are always needed to enter, so this places the others in your start inventory. + """ display_name = "Notes Needed" range_start = 1 range_end = 6 From 50fd42d0c2ade7fdd071c158cc172c42a416176e Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Thu, 10 Apr 2025 12:13:38 -0500 Subject: [PATCH 206/227] The Messenger: Add a plando guide (#4719) --- worlds/messenger/__init__.py | 10 ++- worlds/messenger/docs/plando_en.md | 101 +++++++++++++++++++++++++++++ worlds/messenger/options.py | 22 +------ 3 files changed, 113 insertions(+), 20 deletions(-) create mode 100644 worlds/messenger/docs/plando_en.md diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index 8bde3bbc7a..2382a46c31 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -46,8 +46,16 @@ class MessengerWeb(WebWorld): "setup/en", ["alwaysintreble"], ) + plando_en = Tutorial( + "The Messenger Plando Guide", + "A guide detailing The Messenger's various supported plando options.", + "English", + "plando_en.md", + "plando/en", + ["alwaysintreble"], + ) - tutorials = [tut_en] + tutorials = [tut_en, plando_en] class MessengerWorld(World): diff --git a/worlds/messenger/docs/plando_en.md b/worlds/messenger/docs/plando_en.md new file mode 100644 index 0000000000..920cf029d8 --- /dev/null +++ b/worlds/messenger/docs/plando_en.md @@ -0,0 +1,101 @@ +# The Messenger Plando Guide + +This guide details the usage of the game-specific plando options that The Messenger has. The Messenger also supports the +generic item plando. For more information on what plando is and for information covering item plando, refer to the +[generic Archipelago plando guide](/tutorial/Archipelago/plando/en). The Messenger also uses the generic connection +plando system, but with specific behaviors that will be covered in this guide along with the other options. + +## Shop Price Plando + +This option allows you to specify prices for items in both shops. This also supports weighting, allowing you to choose +from multiple different prices for any given item. + +### Example + +```yaml +The Messenger: + shop_price_plan: + Karuta Plates: 50 + Devil's Due: 1 + Barmath'azel Figurine: + # left side is price, right side is weight + 500: 10 + 700: 5 + 1000: 20 +``` + +This block will make the item at the `Karuta Plates` node cost 50 shards, `Devil's Due` will cost 1 shard, and +`Barmath'azel Figurine` will cost either 500, 700, or 1000, with 1000 being the most likely with a 20/35 chance. + +## Portal Plando + +This option allows you to specify certain outputs for the portals. This option will only be checked if portal shuffle +and the `connections` plando host setting are enabled. + +A portal connection is plandoed by specifying an `entrance` and an `exit`. This option also supports `percentage`, which +is the percent chance that that connection occurs. The `entrance` is which portal is going to be entered, whereas the +`exit` is where the portal will lead and can include a shop location, a checkpoint, or any portal. However, the +portal exit must also be in the available pool for the selected portal shuffle option. For example, if portal shuffle is +set to `shops`, then the valid exits will only be portals and shops; any exit that is a checkpoint will not be valid. If +portal shuffle is set to `checkpoints`, you may not have multiple portals lead to the same area, e.g. `Seashell` and +`Spike Wave` may not both be used since they are both in Quillshroom Marsh. If the option is set to `anywhere`, then all +exits are valid. + +All valid connections for portal shuffle can be found by scrolling through the [portals module](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/messenger/portals.py#L12). +The entrance and exit should be written exactly as they appear within that file, except for when the **exit** point is a +portal. In that case, it should have "Portal" included. + +### Example + +```yaml +The Messenger: + portal_plando: + - entrance: Riviere Turquoise + exit: Wingsuit + - entrance: Sunken Shrine + exit: Sunny Day + - entrance: Searing Crags + exit: Glacial Peak Portal +``` + +This block will make it so that the Riviere Turquoise Portal will exit to the Wingsuit Shop, the Sunken Shrine Portal +will exit to the Sunny Day checkpoint, and the Searing Crags Portal will exit to the Glacial Peak Portal. + +## Transition Plando + +This option allows you to specify certain connections when using transition shuffle. This will only work if +transition shuffle and the `connections` plando host setting are enabled. + +Each transition connection is plandoed by specifying its attributes: + +* `entrance` is where you will enter this transition from. +* `exit` is where the transition will lead. +* `percentage` is the chance this connection will happen at all. +* `direction` is used to specify whether this connection will also go in reverse. This entry will be ignored if the + transition shuffle is set to `coupled` or if the specified connection can only occur in one direction, such as exiting + to Riviere Turquoise. The default direction is "both", which will make it so that returning through the exit + transition will return you to where you entered it from. "entrance" and "exit" are treated the same, with them both + making this transition only one-way. + +Valid connections can be found in the [`RANDOMIZED_CONNECTIONS` dictionary](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/messenger/connections.py#L640). +The keys (left) are entrances, and values (right) are exits. Whether you want the connection to go both ways or not, +both sides must either be two-way or one-way; E.g. connecting Artificer (Corrupted Future Portal) to one of the +Quillshroom Marsh entrances is not a valid pairing. A pairing can be determined to be two-way if both the entrance and +exit of that pair are an exit and entrance of another pairing, respectively. + +### Example + +```yaml +The Messenger: + plando_connections: + - entrance: Searing Crags - Top + exit: Dark Cave - Right + - entrance: Glacial Peak - Left + exit: Corrupted Future +``` + +This block will create the following connections: +1. Leaving Searing Crags towards Glacial Peak will take you to the beginning of Dark Cave, and leaving the Dark Cave + door will return you to the top of Searing Crags. +2. Taking Manfred to leave Glacial Peak, will take you to Corrupted Future. There is no reverse connection here so it + will always be one-way. diff --git a/worlds/messenger/options.py b/worlds/messenger/options.py index aaf152fbf8..6b04118893 100644 --- a/worlds/messenger/options.py +++ b/worlds/messenger/options.py @@ -16,17 +16,8 @@ class MessengerAccessibility(ItemsAccessibility): class PortalPlando(PlandoConnections): """ - Plando connections to be used with portal shuffle. Direction is ignored. - List of valid connections can be found here: https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/messenger/portals.py#L12. - The entering Portal should *not* have "Portal" appended. - For the exits, those in checkpoints and shops should just be the name of the spot, while portals should have " Portal" at the end. - Example: - - entrance: Riviere Turquoise - exit: Wingsuit - - entrance: Sunken Shrine - exit: Sunny Day - - entrance: Searing Crags - exit: Glacial Peak Portal + Plando connections to be used with portal shuffle. + Documentation on using this can be found in The Messenger plando guide. """ display_name = "Portal Plando Connections" portals = [f"{portal} Portal" for portal in PORTALS] @@ -40,14 +31,7 @@ class PortalPlando(PlandoConnections): class TransitionPlando(PlandoConnections): """ Plando connections to be used with transition shuffle. - List of valid connections can be found at https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/messenger/connections.py#L641. - Dictionary keys (left) are entrances and values (right) are exits. If transition shuffle is on coupled all plando - connections will be coupled. If on decoupled, "entrance" and "exit" will be treated the same, simply making the - plando connection one-way from entrance to exit. - Example: - - entrance: Searing Crags - Top - exit: Dark Cave - Right - direction: both + Documentation on using this can be found in The Messenger plando guide. """ display_name = "Transition Plando Connections" entrances = frozenset(RANDOMIZED_CONNECTIONS.keys()) From 1fd8e4435ec46c8c03140804ba5a7a323e1850e4 Mon Sep 17 00:00:00 2001 From: Carter Hesterman Date: Thu, 10 Apr 2025 11:19:03 -0600 Subject: [PATCH 207/227] Civ 6: Update setup documentation to account for common pitfalls (#4797) --- worlds/civ_6/docs/en_Civilization VI.md | 2 +- worlds/civ_6/docs/setup_en.md | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/worlds/civ_6/docs/en_Civilization VI.md b/worlds/civ_6/docs/en_Civilization VI.md index 3b1fbbdb05..215da00aa4 100644 --- a/worlds/civ_6/docs/en_Civilization VI.md +++ b/worlds/civ_6/docs/en_Civilization VI.md @@ -51,7 +51,7 @@ Boosts have logic associated with them in order to verify you can always reach t - I need to kill a unit with a slinger/archer/musketman or some other obsolete unit I can't build anymore, how can I do this? - Don't forget you can go into the Tech Tree and click on a Vanilla tech you've received in order to toggle it on/off. This is necessary in order to pursue some of the boosts if you receive techs in certain orders. - Something happened, and I'm not able to unlock the boost due to game rules! - - A few scenarios you may worry about: "Found a religion", "Make an alliance with another player", "Develop an alliance to level 2", "Build a wonder from X Era", to name a few. Any boost that is "miss-able" has been flagged as an "Excluded" location and will not ever receive a progression item. For a list of how each boost is flagged, take a look [here](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/civ_6/data/boosts.json). + - A few scenarios you may worry about: "Found a religion", "Make an alliance with another player", "Develop an alliance to level 2", "Build a wonder from X Era", to name a few. Any boost that is "miss-able" has been flagged as an "Excluded" location and will not ever receive a progression item. For a list of how each boost is flagged, take a look [here](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/civ_6/data/boosts.py). - I'm worried that my `PROGRESSIVE_ERA` item is going to be stuck in a boost I won't have time to complete before my maximum unlocked era ends! - The unpredictable timing of boosts and unlocking them can occasionally lead to scenarios where you'll have to first encounter a locked era defeat and then load a previous save. To help reduce the frequency of this, local `PROGRESSIVE_ERA` items will never be located at a boost check. - There's too many boosts, how will I know which one's I should focus on?! diff --git a/worlds/civ_6/docs/setup_en.md b/worlds/civ_6/docs/setup_en.md index 09f6ff55c5..9cf4744b65 100644 --- a/worlds/civ_6/docs/setup_en.md +++ b/worlds/civ_6/docs/setup_en.md @@ -14,22 +14,17 @@ The following are required in order to play Civ VI in Archipelago: ## Enabling the tuner -Depending on how you installed Civ 6 you will have to navigate to one of the following: - -- `YOUR_USER/Documents/My Games/Sid Meier's Civilization VI/AppOptions.txt` -- `YOUR_USER/AppData/Local/Firaxis Games/Sid Meier's Civilization VI/AppOptions.txt` - -Once you have located your `AppOptions.txt`, do a search for `Enable FireTuner`. Set `EnableTuner` to `1` instead of `0`. **NOTE**: While this is active, achievements will be disabled. +In the main menu, navigate to the "Game Options" page. On the "Game" menu, make sure that "Tuner (disables achievements)" is enabled. ## Mod Installation 1. Download and unzip the latest release of the mod from [GitHub](https://github.com/hesto2/civilization_archipelago_mod/releases/latest). -2. Copy the folder containing the mod files to your Civ VI mods folder. On Windows, this is usually located at `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods`. +2. Copy the folder containing the mod files to your Civ VI mods folder. On Windows, this is usually located at `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods`. If you use OneDrive, check if the folder is instead located in your OneDrive file structure. 3. After the Archipelago host generates a game, you should be given a `.apcivvi` file. Associate the file with the Archipelago Launcher and double click it. -4. Copy the contents of the new folder it generates (it will have the same name as the `.apcivvi` file) into your Civilization VI Archipelago Mod folder. +4. Copy the contents of the new folder it generates (it will have the same name as the `.apcivvi` file) into your Civilization VI Archipelago Mod folder. If double clicking the `.apcivvi` file doesn't generate a folder, you can just rename it to a file ending with `.zip` and extract its contents to a new folder. To do this, right click the `.apcivvi` file and click "Rename", make sure it ends in `.zip`, then right click it again and select "Extract All". 5. Your finished mod folder should look something like this: From 934b09238ea5f0ce7b699c902cd95123e5a9a152 Mon Sep 17 00:00:00 2001 From: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> Date: Thu, 10 Apr 2025 13:21:33 -0400 Subject: [PATCH 208/227] Docs: Update to adding games.md (#4816) --- docs/adding games.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/adding games.md b/docs/adding games.md index fbbd798859..2decb667b7 100644 --- a/docs/adding games.md +++ b/docs/adding games.md @@ -60,7 +60,7 @@ These are "nice to have" features for a client, but they are not strictly requir if possible. * If your client appears in the Archipelago Launcher, you may define an icon for it that differentiates it from - other clients. The icon size is 38x38 pixels, but it will accept larger images with downscaling. + other clients. The icon size is 48x48 pixels, but smaller or larger images will scale to that size. ## World @@ -109,6 +109,10 @@ subclass for webhost documentation and behaviors * A non-zero number of locations, added to your regions * A non-zero number of items **equal** to the number of locations, added to the multiworld itempool * In rare cases, there may be 0-location-0-item games, but this is extremely atypical. +* A set + [completion condition](https://github.com/ArchipelagoMW/Archipelago/blob/main/BaseClasses.py#L77) (aka "goal") for + the player. + * Use your player as the index (`multiworld.completion_condition[player]`) for your world's completion goal. ### Encouraged Features @@ -145,8 +149,8 @@ workarounds or preferred methods which should be used instead: * It is discouraged to use `yaml.load` directly due to security concerns. * When possible, use `Utils.yaml_load` instead, as this defaults to the safe loader. * When submitting regions or items to the multiworld (`multiworld.regions` and `multiworld.itempool` respectively), - Do **not** use `=` as this will overwrite all elements for all games in the seed. - * Instead, use `append`, `extend`, or `+=`. + do **not** use `=` as this will overwrite all elements for all games in the seed. + * Instead, use `append`, `extend`, or `+=`. ### Notable Caveats From 879d7c23b796ce281354add5be4211bd27852796 Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 10 Apr 2025 13:18:43 -0500 Subject: [PATCH 209/227] HK: Workaround for NamedRange webhost bug (#4819) --- worlds/hk/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/hk/Options.py b/worlds/hk/Options.py index e76e7eba9d..fbfdbfa871 100644 --- a/worlds/hk/Options.py +++ b/worlds/hk/Options.py @@ -450,7 +450,7 @@ class GrubHuntGoal(NamedRange): display_name = "Grub Hunt Goal" range_start = 1 range_end = 46 - special_range_names = {"all": -1} + special_range_names = {"all": -1, "forty_six": 46} default = 46 From ee471a48bd443b3663100efa6044dce88bfc3679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Thu, 10 Apr 2025 14:34:21 -0400 Subject: [PATCH 210/227] Stardew Valley: Fix some determinism issues with entrance rando when playing with mods (#4812) --- worlds/stardew_valley/content/__init__.py | 2 +- worlds/stardew_valley/region_classes.py | 2 +- worlds/stardew_valley/regions.py | 5 ++--- .../stardew_valley/test/stability/StabilityOutputScript.py | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/worlds/stardew_valley/content/__init__.py b/worlds/stardew_valley/content/__init__.py index 33608531d9..5f7d4a5fc5 100644 --- a/worlds/stardew_valley/content/__init__.py +++ b/worlds/stardew_valley/content/__init__.py @@ -21,7 +21,7 @@ def choose_content_packs(player_options: options.StardewValleyOptions): if player_options.special_order_locations & options.SpecialOrderLocations.value_qi: active_packs.append(content_packs.qi_board_content_pack) - for mod in player_options.mods.value: + for mod in sorted(player_options.mods.value): active_packs.append(content_packs.by_mod[mod]) return active_packs diff --git a/worlds/stardew_valley/region_classes.py b/worlds/stardew_valley/region_classes.py index bd64518ea1..d3d16e3878 100644 --- a/worlds/stardew_valley/region_classes.py +++ b/worlds/stardew_valley/region_classes.py @@ -34,7 +34,7 @@ class RegionData: merged_exits.extend(self.exits) if exits is not None: merged_exits.extend(exits) - merged_exits = list(set(merged_exits)) + merged_exits = sorted(set(merged_exits)) return RegionData(self.name, merged_exits, is_ginger_island=self.is_ginger_island) def get_without_exits(self, exits_to_remove: Set[str]): diff --git a/worlds/stardew_valley/regions.py b/worlds/stardew_valley/regions.py index 7a680d5faa..d5be53ba86 100644 --- a/worlds/stardew_valley/regions.py +++ b/worlds/stardew_valley/regions.py @@ -521,7 +521,7 @@ def create_final_regions(world_options) -> List[RegionData]: final_regions.extend(vanilla_regions) if world_options.mods is None: return final_regions - for mod in world_options.mods.value: + for mod in sorted(world_options.mods.value): if mod not in ModDataList: continue for mod_region in ModDataList[mod].regions: @@ -747,8 +747,7 @@ def swap_one_random_connection(regions_by_name, connections_by_name, randomized_ randomized_connections_already_shuffled = {connection: randomized_connections[connection] for connection in randomized_connections if connection != randomized_connections[connection]} - unreachable_regions_names_leading_somewhere = tuple([region for region in unreachable_regions - if len(regions_by_name[region].exits) > 0]) + unreachable_regions_names_leading_somewhere = [region for region in sorted(unreachable_regions) if len(regions_by_name[region].exits) > 0] unreachable_regions_leading_somewhere = [regions_by_name[region_name] for region_name in unreachable_regions_names_leading_somewhere] unreachable_regions_exits_names = [exit_name for region in unreachable_regions_leading_somewhere for exit_name in region.exits] unreachable_connections = [connections_by_name[exit_name] for exit_name in unreachable_regions_exits_names] diff --git a/worlds/stardew_valley/test/stability/StabilityOutputScript.py b/worlds/stardew_valley/test/stability/StabilityOutputScript.py index a5385362b7..9b4b608d4e 100644 --- a/worlds/stardew_valley/test/stability/StabilityOutputScript.py +++ b/worlds/stardew_valley/test/stability/StabilityOutputScript.py @@ -2,7 +2,7 @@ import argparse import json from .. import setup_solo_multiworld -from ..options.presets import allsanity_mods_6_x_x +from ..options.presets import allsanity_mods_6_x_x_exclude_disabled from ...options import FarmType, EntranceRandomization if __name__ == "__main__": @@ -12,7 +12,7 @@ if __name__ == "__main__": args = parser.parse_args() seed = args.seed - options = allsanity_mods_6_x_x() + options = allsanity_mods_6_x_x_exclude_disabled() options[FarmType.internal_name] = FarmType.option_standard options[EntranceRandomization.internal_name] = EntranceRandomization.option_buildings multi_world = setup_solo_multiworld(options, seed=seed) From 6a9299018c7829f5ac922ed0805ccc9e1bb521e2 Mon Sep 17 00:00:00 2001 From: Mysteryem Date: Fri, 11 Apr 2025 02:17:28 +0100 Subject: [PATCH 211/227] MLSS: Fix generation error with emblem hunt and no digspots (#4859) --- worlds/mlss/Rules.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/worlds/mlss/Rules.py b/worlds/mlss/Rules.py index 6592a805d5..848f00cb63 100644 --- a/worlds/mlss/Rules.py +++ b/worlds/mlss/Rules.py @@ -148,12 +148,13 @@ def set_rules(world: "MLSSWorld", excluded): and StateLogic.canDash(state, world.player) and StateLogic.canCrash(state, world.player) ) - add_rule( - world.get_location(LocationName.BowsersCastleWendyLarryHallwayDigspot), - lambda state: StateLogic.ultra(state, world.player) - and StateLogic.fire(state, world.player) - and StateLogic.canCrash(state, world.player) - ) + if world.options.chuckle_beans != 0: + add_rule( + world.get_location(LocationName.BowsersCastleWendyLarryHallwayDigspot), + lambda state: StateLogic.ultra(state, world.player) + and StateLogic.fire(state, world.player) + and StateLogic.canCrash(state, world.player) + ) add_rule( world.get_location(LocationName.BowsersCastleBeforeFawfulFightBlock1), lambda state: StateLogic.canDig(state, world.player) From f263a0bc912755b40024a45bd971a290afe6cbc4 Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Thu, 10 Apr 2025 18:18:49 -0700 Subject: [PATCH 212/227] DS3: Mark a lizard location that was previously not annotated (#4860) --- worlds/dark_souls_3/Locations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worlds/dark_souls_3/Locations.py b/worlds/dark_souls_3/Locations.py index cc202c76e8..c5cdbba85d 100644 --- a/worlds/dark_souls_3/Locations.py +++ b/worlds/dark_souls_3/Locations.py @@ -930,7 +930,7 @@ location_tables: Dict[str, List[DS3LocationData]] = { "Great Swamp Ring", miniboss=True), # Giant Crab drop DS3LocationData("RS: Blue Sentinels - Horace", "Blue Sentinels", missable=True, npc=True), # Horace quest - DS3LocationData("RS: Crystal Gem - stronghold, lizard", "Crystal Gem"), + DS3LocationData("RS: Crystal Gem - stronghold, lizard", "Crystal Gem", lizard=True), DS3LocationData("RS: Fading Soul - woods by Crucifixion Woods bonfire", "Fading Soul", static='03,0:53300210::'), From a324c9781541563bde9885c4d7715b89b5e96f63 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 11 Apr 2025 20:52:20 +0200 Subject: [PATCH 213/227] Factorio: fix FloatRanges writing effectively nil into the mod (#4846) --- worlds/factorio/Options.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/worlds/factorio/Options.py b/worlds/factorio/Options.py index 481ed00987..12fc90c1fd 100644 --- a/worlds/factorio/Options.py +++ b/worlds/factorio/Options.py @@ -8,17 +8,20 @@ from schema import Schema, Optional, And, Or, SchemaError from Options import Choice, OptionDict, OptionSet, DefaultOnToggle, Range, DeathLink, Toggle, \ StartInventoryPool, PerGameCommonOptions, OptionGroup + # schema helpers class FloatRange: def __init__(self, low, high): self._low = low self._high = high - def validate(self, value): + def validate(self, value) -> float: if not isinstance(value, (float, int)): raise SchemaError(f"should be instance of float or int, but was {value!r}") if not self._low <= value <= self._high: raise SchemaError(f"{value} is not between {self._low} and {self._high}") + return float(value) + LuaBool = Or(bool, And(int, lambda n: n in (0, 1))) From b7b5bf58aa16cae9926f66613db4c7f3d0aa2d02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bolduc?= <16137441+Jouramie@users.noreply.github.com> Date: Fri, 11 Apr 2025 20:19:17 -0400 Subject: [PATCH 214/227] Stardew Valley: Use classvar_matrix to split tests (#4762) * Unroll tests for better parallelization * fix ut test * self review * bro it's the second time today I have to commit some garbage to have a github action rerun because messenger fails what is this * my god can the tests plz pass * code reviews * code reviews * move TestRandomWorlds out of long module --- worlds/stardew_valley/test/TestOptions.py | 89 +++++++------- .../stardew_valley/test/TestRandomWorlds.py | 29 +++++ worlds/stardew_valley/test/__init__.py | 53 ++++---- .../stardew_valley/test/long/TestModsLong.py | 115 ++++++++++-------- .../test/long/TestOptionsLong.py | 48 ++++---- .../test/long/TestPreRolledRandomness.py | 37 +++--- .../test/long/TestRandomWorlds.py | 86 ------------- .../stardew_valley/test/long/option_names.py | 30 ----- worlds/stardew_valley/test/mods/TestMods.py | 110 +++++++---------- .../test/options/option_names.py | 51 ++++++++ .../test/stability/TestUniversalTracker.py | 7 +- 11 files changed, 304 insertions(+), 351 deletions(-) create mode 100644 worlds/stardew_valley/test/TestRandomWorlds.py delete mode 100644 worlds/stardew_valley/test/long/TestRandomWorlds.py delete mode 100644 worlds/stardew_valley/test/long/option_names.py create mode 100644 worlds/stardew_valley/test/options/option_names.py diff --git a/worlds/stardew_valley/test/TestOptions.py b/worlds/stardew_valley/test/TestOptions.py index 9d9af04a4e..4894ea55f2 100644 --- a/worlds/stardew_valley/test/TestOptions.py +++ b/worlds/stardew_valley/test/TestOptions.py @@ -1,12 +1,13 @@ import itertools +from typing import ClassVar from BaseClasses import ItemClassification -from Options import NamedRange +from test.param import classvar_matrix from . import SVTestCase, solo_multiworld, SVTestBase from .assertion import WorldAssertMixin -from .long.option_names import all_option_choices +from .options.option_names import all_option_choices from .options.presets import allsanity_no_mods_6_x_x, allsanity_mods_6_x_x -from .. import items_by_group, Group, StardewValleyWorld +from .. import items_by_group, Group from ..locations import locations_by_tag, LocationTags, location_table from ..options import ExcludeGingerIsland, ToolProgression, Goal, SeasonRandomization, TrapItems, SpecialOrderLocations, ArcadeMachineLocations from ..strings.goal_names import Goal as GoalName @@ -18,42 +19,36 @@ SEASONS = {Season.spring, Season.summer, Season.fall, Season.winter} TOOLS = {"Hoe", "Pickaxe", "Axe", "Watering Can", "Trash Can", "Fishing Rod"} +@classvar_matrix(option_and_choice=all_option_choices) class TestGenerateDynamicOptions(WorldAssertMixin, SVTestCase): - def test_given_special_range_when_generate_then_basic_checks(self): - options = StardewValleyWorld.options_dataclass.type_hints - for option_name, option in options.items(): - if not issubclass(option, NamedRange): - continue - for value in option.special_range_names: - world_options = {option_name: option.special_range_names[value]} - with self.solo_world_sub_test(f"{option_name}: {value}", world_options) as (multiworld, _): - self.assert_basic_checks(multiworld) + option_and_choice: ClassVar[tuple[str, str]] - def test_given_choice_when_generate_then_basic_checks(self): - options = StardewValleyWorld.options_dataclass.type_hints - for option_name, option in options.items(): - if not option.options: - continue - for value in option.options: - world_options = {option_name: option.options[value]} - with self.solo_world_sub_test(f"{option_name}: {value}", world_options) as (multiworld, _): - self.assert_basic_checks(multiworld) + def test_given_option_and_choice_when_generate_then_basic_checks(self): + option, choice = self.option_and_choice + world_options = {option: choice} + with solo_multiworld(world_options) as (multiworld, stardew_world): + self.assert_basic_checks(multiworld) +@classvar_matrix(goal_and_location=[ + ("community_center", GoalName.community_center), + ("grandpa_evaluation", GoalName.grandpa_evaluation), + ("bottom_of_the_mines", GoalName.bottom_of_the_mines), + ("cryptic_note", GoalName.cryptic_note), + ("master_angler", GoalName.master_angler), + ("complete_collection", GoalName.complete_museum), + ("full_house", GoalName.full_house), + ("perfection", GoalName.perfection), +]) class TestGoal(SVTestCase): + goal_and_location: ClassVar[tuple[str, str]] + def test_given_goal_when_generate_then_victory_is_in_correct_location(self): - for goal, location in [("community_center", GoalName.community_center), - ("grandpa_evaluation", GoalName.grandpa_evaluation), - ("bottom_of_the_mines", GoalName.bottom_of_the_mines), - ("cryptic_note", GoalName.cryptic_note), - ("master_angler", GoalName.master_angler), - ("complete_collection", GoalName.complete_museum), - ("full_house", GoalName.full_house), - ("perfection", GoalName.perfection)]: - world_options = {Goal.internal_name: Goal.options[goal]} - with self.solo_world_sub_test(f"Goal: {goal}, Location: {location}", world_options) as (multi_world, _): - victory = multi_world.find_item("Victory", 1) - self.assertEqual(victory.name, location) + goal, location = self.goal_and_location + world_options = {Goal.internal_name: goal} + with solo_multiworld(world_options) as (multi_world, _): + victory = multi_world.find_item("Victory", 1) + self.assertEqual(victory.name, location) class TestSeasonRandomization(SVTestCase): @@ -104,26 +99,28 @@ class TestToolProgression(SVTestBase): self.assertEqual(useful_count, 1) +@classvar_matrix(option_and_choice=all_option_choices) class TestGenerateAllOptionsWithExcludeGingerIsland(WorldAssertMixin, SVTestCase): + option_and_choice: ClassVar[tuple[str, str]] def test_given_choice_when_generate_exclude_ginger_island_then_ginger_island_is_properly_excluded(self): - for option, option_choice in all_option_choices: - if option is ExcludeGingerIsland: - continue + option, option_choice = self.option_and_choice - world_options = { - ExcludeGingerIsland: ExcludeGingerIsland.option_true, - option: option_choice - } + if option == ExcludeGingerIsland.internal_name: + self.skipTest("ExcludeGingerIsland is forced to true") - with self.solo_world_sub_test(f"{option.internal_name}: {option_choice}", world_options) as (multiworld, stardew_world): + world_options = { + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + option: option_choice + } - # Some options, like goals, will force Ginger island back in the game. We want to skip testing those. - if stardew_world.options.exclude_ginger_island != ExcludeGingerIsland.option_true: - continue + with solo_multiworld(world_options) as (multiworld, stardew_world): - self.assert_basic_checks(multiworld) - self.assert_no_ginger_island_content(multiworld) + if stardew_world.options.exclude_ginger_island != ExcludeGingerIsland.option_true: + self.skipTest("Some options, like goals, will force Ginger island back in the game. We want to skip testing those.") + + self.assert_basic_checks(multiworld) + self.assert_no_ginger_island_content(multiworld) class TestTraps(SVTestCase): diff --git a/worlds/stardew_valley/test/TestRandomWorlds.py b/worlds/stardew_valley/test/TestRandomWorlds.py new file mode 100644 index 0000000000..550ae14b55 --- /dev/null +++ b/worlds/stardew_valley/test/TestRandomWorlds.py @@ -0,0 +1,29 @@ +from typing import ClassVar + +from BaseClasses import MultiWorld, get_seed +from test.param import classvar_matrix +from . import SVTestCase, skip_long_tests, solo_multiworld +from .assertion import GoalAssertMixin, OptionAssertMixin, WorldAssertMixin +from .options.option_names import generate_random_world_options + + +@classvar_matrix(n=range(10 if skip_long_tests() else 1000)) +class TestGenerateManyWorlds(GoalAssertMixin, OptionAssertMixin, WorldAssertMixin, SVTestCase): + n: ClassVar[int] + + def test_generate_many_worlds_then_check_results(self): + seed = get_seed() + world_options = generate_random_world_options(seed + self.n) + + print(f"Generating solo multiworld with seed {seed} for Stardew Valley...") + with solo_multiworld(world_options, seed=seed, world_caching=False) as (multiworld, _): + self.assert_multiworld_is_valid(multiworld) + + def assert_multiworld_is_valid(self, multiworld: MultiWorld): + self.assert_victory_exists(multiworld) + self.assert_same_number_items_locations(multiworld) + self.assert_goal_world_is_valid(multiworld) + self.assert_can_reach_island_if_should(multiworld) + self.assert_cropsanity_same_number_items_and_locations(multiworld) + self.assert_festivals_give_access_to_deluxe_scarecrow(multiworld) + self.assert_has_festival_recipes(multiworld) diff --git a/worlds/stardew_valley/test/__init__.py b/worlds/stardew_valley/test/__init__.py index 800b210576..702f590221 100644 --- a/worlds/stardew_valley/test/__init__.py +++ b/worlds/stardew_valley/test/__init__.py @@ -22,21 +22,19 @@ DEFAULT_TEST_SEED = get_seed() logger.info(f"Default Test Seed: {DEFAULT_TEST_SEED}") -class SVTestCase(unittest.TestCase): - # Set False to not skip some 'extra' tests - skip_base_tests: bool = True - # Set False to run tests that take long - skip_long_tests: bool = True +def skip_default_tests() -> bool: + return not bool(os.environ.get("base", False)) - @classmethod - def setUpClass(cls) -> None: - super().setUpClass() - base_tests_key = "base" - if base_tests_key in os.environ: - cls.skip_base_tests = not bool(os.environ[base_tests_key]) - long_tests_key = "long" - if long_tests_key in os.environ: - cls.skip_long_tests = not bool(os.environ[long_tests_key]) + +def skip_long_tests() -> bool: + return not bool(os.environ.get("long", False)) + + +class SVTestCase(unittest.TestCase): + skip_default_tests: bool = skip_default_tests() + """Set False to not skip the base fill tests""" + skip_long_tests: bool = skip_long_tests() + """Set False to run tests that take long""" @contextmanager def solo_world_sub_test(self, msg: Optional[str] = None, @@ -94,7 +92,7 @@ class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase): @property def run_default_tests(self) -> bool: - if self.skip_base_tests: + if self.skip_default_tests: return False return super().run_default_tests @@ -196,21 +194,22 @@ def solo_multiworld(world_options: Optional[Dict[Union[str, StardewValleyOption] yield multiworld, multiworld.worlds[1] else: multiworld = setup_solo_multiworld(world_options, seed) - multiworld.lock.acquire() - world = multiworld.worlds[1] + try: + multiworld.lock.acquire() + world = multiworld.worlds[1] - original_state = multiworld.state.copy() - original_itempool = multiworld.itempool.copy() - unfilled_locations = multiworld.get_unfilled_locations(1) + original_state = multiworld.state.copy() + original_itempool = multiworld.itempool.copy() + unfilled_locations = multiworld.get_unfilled_locations(1) - yield multiworld, world + yield multiworld, world - multiworld.state = original_state - multiworld.itempool = original_itempool - for location in unfilled_locations: - location.item = None - - multiworld.lock.release() + multiworld.state = original_state + multiworld.itempool = original_itempool + for location in unfilled_locations: + location.item = None + finally: + multiworld.lock.release() # Mostly a copy of test.general.setup_solo_multiworld, I just don't want to change the core. diff --git a/worlds/stardew_valley/test/long/TestModsLong.py b/worlds/stardew_valley/test/long/TestModsLong.py index 395c48ee69..bc5e8bfff8 100644 --- a/worlds/stardew_valley/test/long/TestModsLong.py +++ b/worlds/stardew_valley/test/long/TestModsLong.py @@ -1,61 +1,19 @@ import unittest -from itertools import combinations, product +from itertools import combinations +from typing import ClassVar from BaseClasses import get_seed -from .option_names import all_option_choices, get_option_choices -from .. import SVTestCase +from test.param import classvar_matrix +from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion import WorldAssertMixin, ModAssertMixin +from ..options.option_names import all_option_choices from ... import options from ...mods.mod_data import ModNames - -assert unittest +from ...options.options import all_mods -class TestGenerateModsOptions(WorldAssertMixin, ModAssertMixin, SVTestCase): - - @classmethod - def setUpClass(cls) -> None: - super().setUpClass() - if cls.skip_long_tests: - raise unittest.SkipTest("Long tests disabled") - - def test_given_mod_pairs_when_generate_then_basic_checks(self): - for mod_pair in combinations(options.Mods.valid_keys, 2): - world_options = { - options.Mods: frozenset(mod_pair) - } - - with self.solo_world_sub_test(f"Mods: {mod_pair}", world_options, world_caching=False) as (multiworld, _): - self.assert_basic_checks(multiworld) - self.assert_stray_mod_items(list(mod_pair), multiworld) - - def test_given_mod_names_when_generate_paired_with_other_options_then_basic_checks(self): - for mod, (option, value) in product(options.Mods.valid_keys, all_option_choices): - world_options = { - option: value, - options.Mods: mod - } - - with self.solo_world_sub_test(f"{option.internal_name}: {value}, Mod: {mod}", world_options, world_caching=False) as (multiworld, _): - self.assert_basic_checks(multiworld) - self.assert_stray_mod_items(mod, multiworld) - - def test_given_no_quest_all_mods_when_generate_with_all_goals_then_basic_checks(self): - for goal, (option, value) in product(get_option_choices(options.Goal), all_option_choices): - if option is options.QuestLocations: - continue - - world_options = { - options.Goal: goal, - option: value, - options.QuestLocations: -1, - options.Mods: frozenset(options.Mods.valid_keys), - } - - with self.solo_world_sub_test(f"Goal: {goal}, {option.internal_name}: {value}", world_options, world_caching=False) as (multiworld, _): - self.assert_basic_checks(multiworld) - - @unittest.skip +@unittest.skip +class TestTroubleshootMods(WorldAssertMixin, ModAssertMixin, SVTestCase): def test_troubleshoot_option(self): seed = get_seed(78709133382876990000) @@ -67,3 +25,60 @@ class TestGenerateModsOptions(WorldAssertMixin, ModAssertMixin, SVTestCase): with self.solo_world_sub_test(world_options=world_options, seed=seed, world_caching=False) as (multiworld, _): self.assert_basic_checks(multiworld) self.assert_stray_mod_items(world_options[options.Mods], multiworld) + + +if skip_long_tests(): + raise unittest.SkipTest("Long tests disabled") + + +@classvar_matrix(mod_pair=combinations(sorted(all_mods), 2)) +class TestGenerateModsPairs(WorldAssertMixin, ModAssertMixin, SVTestCase): + mod_pair: ClassVar[tuple[str, str]] + + def test_given_mod_pairs_when_generate_then_basic_checks(self): + world_options = { + options.Mods.internal_name: frozenset(self.mod_pair) + } + + with solo_multiworld(world_options, world_caching=False) as (multiworld, _): + self.assert_basic_checks(multiworld) + self.assert_stray_mod_items(list(self.mod_pair), multiworld) + + +@classvar_matrix(mod=all_mods, option_and_choice=all_option_choices) +class TestGenerateModAndOptionChoice(WorldAssertMixin, ModAssertMixin, SVTestCase): + mod: ClassVar[str] + option_and_choice: ClassVar[tuple[str, str]] + + def test_given_mod_names_when_generate_paired_with_other_options_then_basic_checks(self): + option, choice = self.option_and_choice + + world_options = { + option: choice, + options.Mods.internal_name: self.mod + } + + with solo_multiworld(world_options, world_caching=False) as (multiworld, _): + self.assert_basic_checks(multiworld) + self.assert_stray_mod_items(self.mod, multiworld) + + +@classvar_matrix(goal=options.Goal.options.keys(), option_and_choice=all_option_choices) +class TestGenerateAllGoalAndAllOptionWithAllModsWithoutQuest(WorldAssertMixin, ModAssertMixin, SVTestCase): + goal = ClassVar[str] + option_and_choice = ClassVar[tuple[str, str]] + + def test_given_no_quest_all_mods_when_generate_with_all_goals_then_basic_checks(self): + option, choice = self.option_and_choice + if option == options.QuestLocations.internal_name: + self.skipTest("QuestLocations are disabled") + + world_options = { + options.Goal.internal_name: self.goal, + option: choice, + options.QuestLocations.internal_name: -1, + options.Mods.internal_name: frozenset(options.Mods.valid_keys), + } + + with solo_multiworld(world_options, world_caching=False) as (multiworld, _): + self.assert_basic_checks(multiworld) diff --git a/worlds/stardew_valley/test/long/TestOptionsLong.py b/worlds/stardew_valley/test/long/TestOptionsLong.py index 81bb4d1f30..db467964e7 100644 --- a/worlds/stardew_valley/test/long/TestOptionsLong.py +++ b/worlds/stardew_valley/test/long/TestOptionsLong.py @@ -1,34 +1,16 @@ import unittest from itertools import combinations +from typing import ClassVar from BaseClasses import get_seed -from .option_names import all_option_choices -from .. import SVTestCase, solo_multiworld +from test.param import classvar_matrix +from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion.world_assert import WorldAssertMixin +from ..options.option_names import all_option_choices from ... import options -class TestGenerateDynamicOptions(WorldAssertMixin, SVTestCase): - def test_given_option_pair_when_generate_then_basic_checks(self): - if self.skip_long_tests: - raise unittest.SkipTest("Long tests disabled") - - for (option1, option1_choice), (option2, option2_choice) in combinations(all_option_choices, 2): - if option1 is option2: - continue - - world_options = { - option1: option1_choice, - option2: option2_choice - } - - with self.solo_world_sub_test(f"{option1.internal_name}: {option1_choice}, {option2.internal_name}: {option2_choice}", - world_options, - world_caching=False) \ - as (multiworld, _): - self.assert_basic_checks(multiworld) - - +@unittest.skip class TestDynamicOptionDebug(WorldAssertMixin, SVTestCase): def test_option_pair_debug(self): @@ -42,3 +24,23 @@ class TestDynamicOptionDebug(WorldAssertMixin, SVTestCase): print(f"Seed: {seed}") with solo_multiworld(option_dict, seed=seed) as (multiworld, _): self.assert_basic_checks(multiworld) + + +if skip_long_tests(): + raise unittest.SkipTest("Long tests disabled") + + +@classvar_matrix(options_and_choices=combinations(all_option_choices, 2)) +class TestGenerateDynamicOptions(WorldAssertMixin, SVTestCase): + options_and_choices: ClassVar[tuple[tuple[str, str], tuple[str, str]]] + + def test_given_option_pair_when_generate_then_basic_checks(self): + (option1, option1_choice), (option2, option2_choice) = self.options_and_choices + + world_options = { + option1: option1_choice, + option2: option2_choice + } + + with solo_multiworld(world_options, world_caching=False) as (multiworld, _): + self.assert_basic_checks(multiworld) diff --git a/worlds/stardew_valley/test/long/TestPreRolledRandomness.py b/worlds/stardew_valley/test/long/TestPreRolledRandomness.py index f233fc36dc..3b6f818ec4 100644 --- a/worlds/stardew_valley/test/long/TestPreRolledRandomness.py +++ b/worlds/stardew_valley/test/long/TestPreRolledRandomness.py @@ -1,28 +1,29 @@ import unittest +from typing import ClassVar from BaseClasses import get_seed -from .. import SVTestCase +from test.param import classvar_matrix +from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion import WorldAssertMixin from ... import options +if skip_long_tests(): + raise unittest.SkipTest("Long tests disabled") +player_options = { + options.EntranceRandomization.internal_name: options.EntranceRandomization.option_buildings, + options.BundleRandomization.internal_name: options.BundleRandomization.option_remixed, + options.BundlePrice.internal_name: options.BundlePrice.option_maximum +} + + +@classvar_matrix(n=range(1000)) class TestGeneratePreRolledRandomness(WorldAssertMixin, SVTestCase): + n: ClassVar[int] + def test_given_pre_rolled_difficult_randomness_when_generate_then_basic_checks(self): - if self.skip_long_tests: - raise unittest.SkipTest("Long tests disabled") + seed = get_seed() - choices = { - options.EntranceRandomization.internal_name: options.EntranceRandomization.option_buildings, - options.BundleRandomization.internal_name: options.BundleRandomization.option_remixed, - options.BundlePrice.internal_name: options.BundlePrice.option_maximum - } - - num_tests = 1000 - for i in range(num_tests): - seed = get_seed() # Put seed in parameter to test - with self.solo_world_sub_test(f"Entrance Randomizer and Remixed Bundles", - choices, - seed=seed, - world_caching=False) \ - as (multiworld, _): - self.assert_basic_checks(multiworld) + print(f"Generating solo multiworld with seed {seed} for Stardew Valley...") + with solo_multiworld(player_options, seed=seed, world_caching=False) as (multiworld, _): + self.assert_basic_checks(multiworld) diff --git a/worlds/stardew_valley/test/long/TestRandomWorlds.py b/worlds/stardew_valley/test/long/TestRandomWorlds.py deleted file mode 100644 index 6d4931280a..0000000000 --- a/worlds/stardew_valley/test/long/TestRandomWorlds.py +++ /dev/null @@ -1,86 +0,0 @@ -import random -import unittest -from typing import Dict - -from BaseClasses import MultiWorld, get_seed -from Options import NamedRange, Range -from .option_names import options_to_include -from .. import SVTestCase -from ..assertion import GoalAssertMixin, OptionAssertMixin, WorldAssertMixin - - -def get_option_choices(option) -> Dict[str, int]: - if issubclass(option, NamedRange): - return option.special_range_names - if issubclass(option, Range): - return {f"{val}": val for val in range(option.range_start, option.range_end + 1)} - elif option.options: - return option.options - return {} - - -def generate_random_world_options(seed: int) -> Dict[str, int]: - num_options = len(options_to_include) - world_options = dict() - rng = random.Random(seed) - for option_index in range(0, num_options): - option = options_to_include[option_index] - option_choices = get_option_choices(option) - if not option_choices: - continue - chosen_option_value = rng.choice(list(option_choices.values())) - world_options[option.internal_name] = chosen_option_value - return world_options - - -def get_number_log_steps(number_worlds: int) -> int: - if number_worlds <= 10: - return 2 - if number_worlds <= 100: - return 5 - if number_worlds <= 500: - return 10 - if number_worlds <= 1000: - return 20 - if number_worlds <= 5000: - return 25 - if number_worlds <= 10000: - return 50 - return 100 - - -class TestGenerateManyWorlds(GoalAssertMixin, OptionAssertMixin, WorldAssertMixin, SVTestCase): - def test_generate_many_worlds_then_check_results(self): - if self.skip_long_tests: - raise unittest.SkipTest("Long tests disabled") - - number_worlds = 10 if self.skip_long_tests else 1000 - seed = get_seed() - self.generate_and_check_many_worlds(number_worlds, seed) - - def generate_and_check_many_worlds(self, number_worlds: int, seed: int): - num_steps = get_number_log_steps(number_worlds) - log_step = number_worlds / num_steps - - print(f"Generating {number_worlds} Solo Multiworlds [Start Seed: {seed}] for Stardew Valley...") - for world_number in range(0, number_worlds + 1): - - world_seed = world_number + seed - world_options = generate_random_world_options(world_seed) - - with self.solo_world_sub_test(f"Multiworld: {world_seed}", world_options, seed=world_seed, world_caching=False) as (multiworld, _): - self.assert_multiworld_is_valid(multiworld) - - if world_number > 0 and world_number % log_step == 0: - print(f"Generated and Verified {world_number}/{number_worlds} worlds [{(world_number * 100) // number_worlds}%]") - - print(f"Finished generating and verifying {number_worlds} Solo Multiworlds for Stardew Valley") - - def assert_multiworld_is_valid(self, multiworld: MultiWorld): - self.assert_victory_exists(multiworld) - self.assert_same_number_items_locations(multiworld) - self.assert_goal_world_is_valid(multiworld) - self.assert_can_reach_island_if_should(multiworld) - self.assert_cropsanity_same_number_items_and_locations(multiworld) - self.assert_festivals_give_access_to_deluxe_scarecrow(multiworld) - self.assert_has_festival_recipes(multiworld) diff --git a/worlds/stardew_valley/test/long/option_names.py b/worlds/stardew_valley/test/long/option_names.py deleted file mode 100644 index 9f3cf98b87..0000000000 --- a/worlds/stardew_valley/test/long/option_names.py +++ /dev/null @@ -1,30 +0,0 @@ -from typing import Dict - -from Options import NamedRange -from ... import StardewValleyWorld - -options_to_exclude = {"profit_margin", "starting_money", "multiple_day_sleep_enabled", "multiple_day_sleep_cost", - "experience_multiplier", "friendship_multiplier", "debris_multiplier", - "quick_start", "gifting", "gift_tax", - "progression_balancing", "accessibility", "start_inventory", "start_hints", "death_link"} - -options_to_include = [option - for option_name, option in StardewValleyWorld.options_dataclass.type_hints.items() - if option_name not in options_to_exclude] - - -def get_option_choices(option) -> Dict[str, int]: - if issubclass(option, NamedRange): - return option.special_range_names - elif option.options: - return option.options - return {} - - -all_option_choices = [(option, value) - for option in options_to_include - if option.options - for value in get_option_choices(option) - if option.default != get_option_choices(option)[value]] - -assert all_option_choices diff --git a/worlds/stardew_valley/test/mods/TestMods.py b/worlds/stardew_valley/test/mods/TestMods.py index 932c76c680..bd5d7d626d 100644 --- a/worlds/stardew_valley/test/mods/TestMods.py +++ b/worlds/stardew_valley/test/mods/TestMods.py @@ -1,88 +1,64 @@ import random +from typing import ClassVar from BaseClasses import get_seed -from .. import SVTestBase, SVTestCase +from test.param import classvar_matrix +from .. import SVTestBase, SVTestCase, solo_multiworld from ..TestGeneration import get_all_permanent_progression_items from ..assertion import ModAssertMixin, WorldAssertMixin from ..options.presets import allsanity_mods_6_x_x from ..options.utils import fill_dataclass_with_default from ... import options, Group, create_content from ...mods.mod_data import ModNames -from ...options import SkillProgression, Walnutsanity from ...options.options import all_mods from ...regions import RandomizationFlag, randomize_connections, create_final_connections_and_regions -class TestGenerateModsOptions(WorldAssertMixin, ModAssertMixin, SVTestCase): - - def test_given_single_mods_when_generate_then_basic_checks(self): - for mod in options.Mods.valid_keys: - world_options = {options.Mods: mod, options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false} - with self.solo_world_sub_test(f"Mod: {mod}", world_options) as (multi_world, _): - self.assert_basic_checks(multi_world) - self.assert_stray_mod_items(mod, multi_world) - - # The following tests validate that ER still generates winnable and logically-sane games with given mods. - # Mods that do not interact with entrances are skipped - # Not all ER settings are tested, because 'buildings' is, essentially, a superset of all others - def test_deepwoods_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.deepwoods, options.EntranceRandomization.option_buildings) - - def test_juna_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.juna, options.EntranceRandomization.option_buildings) - - def test_jasper_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.jasper, options.EntranceRandomization.option_buildings) - - def test_alec_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.alec, options.EntranceRandomization.option_buildings) - - def test_yoba_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.yoba, options.EntranceRandomization.option_buildings) - - def test_eugene_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.eugene, options.EntranceRandomization.option_buildings) - - def test_ayeisha_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.ayeisha, options.EntranceRandomization.option_buildings) - - def test_riley_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.riley, options.EntranceRandomization.option_buildings) - - def test_sve_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.sve, options.EntranceRandomization.option_buildings) - - def test_alecto_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.alecto, options.EntranceRandomization.option_buildings) - - def test_lacey_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.lacey, options.EntranceRandomization.option_buildings) - - def test_boarding_house_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(ModNames.boarding_house, options.EntranceRandomization.option_buildings) - - def test_all_mods_entrance_randomization_buildings(self): - self.perform_basic_checks_on_mod_with_er(all_mods, options.EntranceRandomization.option_buildings) - - def perform_basic_checks_on_mod_with_er(self, mods: str | set[str], er_option: int) -> None: - if isinstance(mods, str): - mods = {mods} - world_options = { - options.EntranceRandomization: er_option, - options.Mods: frozenset(mods), - options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false - } - with self.solo_world_sub_test(f"entrance_randomization: {er_option}, Mods: {mods}", world_options) as (multi_world, _): - self.assert_basic_checks(multi_world) +class TestCanGenerateAllsanityWithMods(WorldAssertMixin, ModAssertMixin, SVTestCase): def test_allsanity_all_mods_when_generate_then_basic_checks(self): - with self.solo_world_sub_test(world_options=allsanity_mods_6_x_x()) as (multi_world, _): + with solo_multiworld(allsanity_mods_6_x_x()) as (multi_world, _): self.assert_basic_checks(multi_world) def test_allsanity_all_mods_exclude_island_when_generate_then_basic_checks(self): world_options = allsanity_mods_6_x_x() world_options.update({options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true}) - with self.solo_world_sub_test(world_options=world_options) as (multi_world, _): + with solo_multiworld(world_options) as (multi_world, _): + self.assert_basic_checks(multi_world) + + +@classvar_matrix(mod=all_mods) +class TestCanGenerateWithEachMod(WorldAssertMixin, ModAssertMixin, SVTestCase): + mod: ClassVar[str] + + def test_given_single_mods_when_generate_then_basic_checks(self): + world_options = { + options.Mods: self.mod, + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false + } + with solo_multiworld(world_options) as (multi_world, _): + self.assert_basic_checks(multi_world) + self.assert_stray_mod_items(self.mod, multi_world) + + +@classvar_matrix(mod=all_mods.difference([ + ModNames.ginger, ModNames.distant_lands, ModNames.skull_cavern_elevator, ModNames.wellwick, ModNames.magic, ModNames.binning_skill, ModNames.big_backpack, + ModNames.luck_skill, ModNames.tractor, ModNames.shiko, ModNames.archaeology, ModNames.delores, ModNames.socializing_skill, ModNames.cooking_skill +])) +class TestCanGenerateEachModWithEntranceRandomizationBuildings(WorldAssertMixin, SVTestCase): + """The following tests validate that ER still generates winnable and logically-sane games with given mods. + Mods that do not interact with entrances are skipped + Not all ER settings are tested, because 'buildings' is, essentially, a superset of all others + """ + mod: ClassVar[str] + + def test_given_mod_when_generate_then_basic_checks(self) -> None: + world_options = { + options.EntranceRandomization: options.EntranceRandomization.option_buildings, + options.Mods: self.mod, + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false + } + with solo_multiworld(world_options, world_caching=False) as (multi_world, _): self.assert_basic_checks(multi_world) @@ -105,7 +81,7 @@ class TestBaseItemGeneration(SVTestBase): options.Chefsanity.internal_name: options.Chefsanity.option_all, options.Craftsanity.internal_name: options.Craftsanity.option_all, options.Booksanity.internal_name: options.Booksanity.option_all, - Walnutsanity.internal_name: Walnutsanity.preset_all, + options.Walnutsanity.internal_name: options.Walnutsanity.preset_all, options.Mods.internal_name: frozenset(options.Mods.valid_keys) } @@ -151,7 +127,7 @@ class TestModEntranceRando(SVTestCase): sv_options = fill_dataclass_with_default({ options.EntranceRandomization.internal_name: option, options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, - SkillProgression.internal_name: SkillProgression.option_progressive_with_masteries, + options.SkillProgression.internal_name: options.SkillProgression.option_progressive_with_masteries, options.Mods.internal_name: frozenset(options.Mods.valid_keys) }) content = create_content(sv_options) diff --git a/worlds/stardew_valley/test/options/option_names.py b/worlds/stardew_valley/test/options/option_names.py new file mode 100644 index 0000000000..07fa42b508 --- /dev/null +++ b/worlds/stardew_valley/test/options/option_names.py @@ -0,0 +1,51 @@ +import random + +from Options import NamedRange, Option, Range +from ... import StardewValleyWorld +from ...options import StardewValleyOption + +options_to_exclude = {"profit_margin", "starting_money", "multiple_day_sleep_enabled", "multiple_day_sleep_cost", + "experience_multiplier", "friendship_multiplier", "debris_multiplier", + "quick_start", "gifting", "gift_tax", + "progression_balancing", "accessibility", "start_inventory", "start_hints", "death_link"} + +options_to_include: list[type[StardewValleyOption | Option]] = [ + option + for option_name, option in StardewValleyWorld.options_dataclass.type_hints.items() + if option_name not in options_to_exclude +] + + +def get_option_choices(option: type[Option]) -> dict[str, int]: + if issubclass(option, NamedRange): + return option.special_range_names + if issubclass(option, Range): + return {f"{val}": val for val in range(option.range_start, option.range_end + 1)} + elif option.options: + return option.options + return {} + + +def generate_random_world_options(seed: int) -> dict[str, int]: + num_options = len(options_to_include) + world_options = dict() + rng = random.Random(seed) + for option_index in range(0, num_options): + option = options_to_include[option_index] + option_choices = get_option_choices(option) + if not option_choices: + continue + chosen_option_value = rng.choice(list(option_choices.values())) + world_options[option.internal_name] = chosen_option_value + return world_options + + +all_option_choices = [ + (option.internal_name, value) + for option in options_to_include + if option.options + for value in get_option_choices(option) + if option.default != get_option_choices(option)[value] +] + +assert all_option_choices diff --git a/worlds/stardew_valley/test/stability/TestUniversalTracker.py b/worlds/stardew_valley/test/stability/TestUniversalTracker.py index 5e8075e4a1..0268d9e515 100644 --- a/worlds/stardew_valley/test/stability/TestUniversalTracker.py +++ b/worlds/stardew_valley/test/stability/TestUniversalTracker.py @@ -1,11 +1,12 @@ import unittest from unittest.mock import Mock -from .. import SVTestBase, fill_namespace_with_default +from .. import SVTestBase, fill_namespace_with_default, skip_long_tests from ..options.presets import allsanity_mods_6_x_x from ... import STARDEW_VALLEY, FarmType, BundleRandomization, EntranceRandomization +@unittest.skipIf(skip_long_tests(), "Long tests disabled") class TestUniversalTrackerGenerationIsStable(SVTestBase): options = allsanity_mods_6_x_x() options.update({ @@ -16,8 +17,6 @@ class TestUniversalTrackerGenerationIsStable(SVTestBase): def test_all_locations_and_items_are_the_same_between_two_generations(self): # This might open a kivy window temporarily, but it's the only way to test this... - if self.skip_long_tests: - raise unittest.SkipTest("Long tests disabled") try: # This test only run if UT is present, so no risk of running in the CI. @@ -30,7 +29,7 @@ class TestUniversalTrackerGenerationIsStable(SVTestBase): fake_context = Mock() fake_context.re_gen_passthrough = {STARDEW_VALLEY: ut_data} - args = fill_namespace_with_default({0: self.options}) + args = fill_namespace_with_default([self.options]) args.outputpath = None args.outputname = None args.multi = 1 From 347efac0cd787ded2eb79299e5eee6e60789733e Mon Sep 17 00:00:00 2001 From: agilbert1412 Date: Fri, 11 Apr 2025 20:41:08 -0400 Subject: [PATCH 215/227] DLC Quest - Skip two long tests in the main pipeline (#4862) * - Set up the two long tests to only run when the specific config is active * Apply Black Sliver's suggestion --- worlds/dlcquest/test/TestOptionsLong.py | 9 +++++++-- worlds/dlcquest/test/__init__.py | 15 +++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/worlds/dlcquest/test/TestOptionsLong.py b/worlds/dlcquest/test/TestOptionsLong.py index c6c594b6a0..d31e82c00f 100644 --- a/worlds/dlcquest/test/TestOptionsLong.py +++ b/worlds/dlcquest/test/TestOptionsLong.py @@ -1,10 +1,11 @@ +import unittest from typing import Dict from BaseClasses import MultiWorld from Options import NamedRange -from .option_names import options_to_include -from .checks.world_checks import assert_can_win, assert_same_number_items_locations from . import DLCQuestTestBase, setup_dlc_quest_solo_multiworld +from .checks.world_checks import assert_can_win, assert_same_number_items_locations +from .option_names import options_to_include def basic_checks(tester: DLCQuestTestBase, multiworld: MultiWorld): @@ -38,6 +39,8 @@ class TestGenerateDynamicOptions(DLCQuestTestBase): basic_checks(self, multiworld) def test_given_option_truple_when_generate_then_basic_checks(self): + if self.skip_long_tests: + raise unittest.SkipTest("Long tests disabled") num_options = len(options_to_include) for option1_index in range(0, num_options): for option2_index in range(option1_index + 1, num_options): @@ -59,6 +62,8 @@ class TestGenerateDynamicOptions(DLCQuestTestBase): basic_checks(self, multiworld) def test_given_option_quartet_when_generate_then_basic_checks(self): + if self.skip_long_tests: + raise unittest.SkipTest("Long tests disabled") num_options = len(options_to_include) for option1_index in range(0, num_options): for option2_index in range(option1_index + 1, num_options): diff --git a/worlds/dlcquest/test/__init__.py b/worlds/dlcquest/test/__init__.py index 0432ae8b60..bcc4c14659 100644 --- a/worlds/dlcquest/test/__init__.py +++ b/worlds/dlcquest/test/__init__.py @@ -1,19 +1,26 @@ -from typing import ClassVar - -from typing import Dict, FrozenSet, Tuple, Any +import os from argparse import Namespace +from typing import ClassVar +from typing import Dict, FrozenSet, Tuple, Any from BaseClasses import MultiWorld from test.bases import WorldTestBase -from .. import DLCqworld from test.general import gen_steps, setup_solo_multiworld as setup_base_solo_multiworld from worlds.AutoWorld import call_all +from .. import DLCqworld class DLCQuestTestBase(WorldTestBase): game = "DLCQuest" world: DLCqworld player: ClassVar[int] = 1 + # Set False to run tests that take long + skip_long_tests: bool = True + + @classmethod + def setUpClass(cls) -> None: + super().setUpClass() + cls.skip_long_tests = not bool(os.environ.get("long")) def world_setup(self, *args, **kwargs): super().world_setup(*args, **kwargs) From ec1e113b4c6dbaa977a46325fb6cb7d958ea531e Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Sun, 13 Apr 2025 13:10:36 +0200 Subject: [PATCH 216/227] Doc: fix parse_yaml in adding games.md (#4872) --- docs/adding games.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/adding games.md b/docs/adding games.md index 2decb667b7..c3eb0d023e 100644 --- a/docs/adding games.md +++ b/docs/adding games.md @@ -146,8 +146,8 @@ workarounds or preferred methods which should be used instead: * If you need to place specific items, there are multiple ways to do so, but they should not be added to the multiworld itempool. * It is not allowed to use `eval` for most reasons, chiefly due to security concerns. -* It is discouraged to use `yaml.load` directly due to security concerns. - * When possible, use `Utils.yaml_load` instead, as this defaults to the safe loader. +* It is discouraged to use PyYAML (i.e. `yaml.load`) directly due to security concerns. + * When possible, use `Utils.parse_yaml` instead, as this defaults to the safe loader and the faster C parser. * When submitting regions or items to the multiworld (`multiworld.regions` and `multiworld.itempool` respectively), do **not** use `=` as this will overwrite all elements for all games in the seed. * Instead, use `append`, `extend`, or `+=`. From 1873c52aa6f66fb79657555098d6c8e2efc9dada Mon Sep 17 00:00:00 2001 From: Seldom <38388947+Seldom-SE@users.noreply.github.com> Date: Tue, 15 Apr 2025 06:51:05 -0700 Subject: [PATCH 217/227] Terraria: 1.4.4 and Calamity support (#3847) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Terraria integration * Precollected items for debugging * Fix item classification * Golem requires Plantera's Bulb * Pumpkin Moon requires Dungeon * Progressive Dungeon * Reorg, Options.py work * Items are boss flags * Removed unused option * Removed nothing * Wall, Plantera, and Zenith goals * Achievements and items * Fixed The Cavalry and Completely Awesome achievements * Made "Dead Men Tell No Tales" a grindy achievement * Some docs, Python 3.8 compat * docs * Fix extra item and "Head in the Clouds" being included when achievements are disabled * Requested changes * Fix potential thread unsafety, replace Nothing with 50 Silver * Remove a log * Corrected heading * Added incompatible mods list * In-progress calamity integration * Terraria events progress * Rules use events * Removed an intentional crash I accidentally left in * Fixed infinite loop * Moved rules to data file * Moved item rewards to data file * Generating from data file * Fixed broken Mech Boss goal * Changes Calamity makes to vanilla rules, Calamity final bosses goal * Added Deerclops, fixed Zenith goal * Final detailed vanilla pass * Disable calamity goals * Typo * Fixed some reward items not adding to item pool * In-progress unit test fixes * Unit test fixes * `.apworld` compat * Organized rewards file, made Frog Leg and Fllpper available in vanilla * Water Walking Boots and Titan Glove rewards * Add goals to slot data * Fixed Hammush logic in Post-Mech goal * Fixed coin rewards * Updated Terraria docs * Formatted * Deathlink in-progress * Boots of the Hero is grindy * Fixed zenith goal not placing an item * Address review * Gelatin World Tour is grindy * Difficulty notice * Switched some achievements' grindiness * Added "Hey! Listen!" achievement * Terarria Python 3.8 compat * Fixed Terraria You and What Army logic * Calamity minion accessories * Typo * Calamity integration * `deathlink` -> `death_link` Co-authored-by: Zach Parks * Missing `.` Co-authored-by: Zach Parks * Incorrect type annotation Co-authored-by: Zach Parks * `deathlink` -> `death_link` 2 Co-authored-by: Zach Parks * Style Co-authored-by: Zach Parks * Markdown style Co-authored-by: Zach Parks * Markdown style 2 Co-authored-by: Zach Parks * Address review * Fix bad merge * Terraria utility mod recommendations * Calamity minion armor logic * ArmorMinions -> Armor Minions, boss rush goal, fixed unplaced item * Fixed unplaced item * Started on Terraria 1.4.4 * Crate logic * getfixedboi, 1.4.4 achievements, shimmer, town slimes, `Rule`, `Condition`, etc * More clam getfixedboi logic, bar decraft logic, `NotGetfixedboi` -> `Not Getfixedboi` * Calamity fixes * Calamity crate ore logic * Fixed item accessibility not generating in getfixedboi, fixed not generating with incompatible options, fixed grindy function * Early achievements, separate achievement category options * Infinity +1 Sword achievement can be location in later goals * The Frequent Flyer is impossible in Calamity getfixedboi * Add Enchanted Sword and Starfury for starting inventories * Don't Dread on Me is redundant in Calamity * In Calamity getfixedboi, Queen Bee summons enemies who drop Plague Cell Canisters * Can't use Gelatin Crystal outside Hallow * You can't get the Terminus without flags * Typo * Options difficult warnings * Robbing the Grave is Hardmode * Don't reserve an ID for unused Victory item * Plantera is accessible early in Calamity via Giant Plantera's Bulbs * Unshuffled Life Crystal and Defender Medal items * Comment about Midas' Blessing * Update worlds/terraria/Options.py Co-authored-by: Scipio Wright * Remove stray expression Co-authored-by: Scipio Wright * Review suggestions * Option naming caps consistency, add Laser Drill, Lunatic Cultist alt reqs, fix Eldritch Soul Artifact, Ceaseless Void reqs Dungeon * Cal Clone doesn't drop Broken Hero Sword anymore, Laser Drill is weaker in Calamity Co-authored-by: Seatori <92278897+Seatori@users.noreply.github.com> * Fix Acid Rain logic * Fix XB-∞ Hekate failing accessibility checks (by commenting it out bc it doesn't affect logic) * Hardmode ores being fishable early in Calamity is not a bug anymore * Mecha Mayhem is inaccessible in getfixedboi * Update worlds/terraria/Rules.dsv Co-authored-by: Seafo <92278897+Seatori@users.noreply.github.com> --------- Co-authored-by: Fabian Dill Co-authored-by: Zach Parks Co-authored-by: Scipio Wright Co-authored-by: Seatori <92278897+Seatori@users.noreply.github.com> --- worlds/terraria/Checks.py | 245 +++++++++++-------- worlds/terraria/Options.py | 73 ++++-- worlds/terraria/Rewards.dsv | 12 +- worlds/terraria/Rules.dsv | 465 ++++++++++++++++++++++++------------ worlds/terraria/__init__.py | 247 ++++++++++--------- 5 files changed, 661 insertions(+), 381 deletions(-) diff --git a/worlds/terraria/Checks.py b/worlds/terraria/Checks.py index 0630d6290b..53e6626204 100644 --- a/worlds/terraria/Checks.py +++ b/worlds/terraria/Checks.py @@ -157,24 +157,57 @@ COND_FN = 2 COND_GROUP = 3 +class Condition: + def __init__( + self, + # True = positive, False = negative + sign: bool, + # See the `COND_*` constants + type: int, + # Condition name or list + condition: Union[str, Tuple[Union[bool, None], List["Condition"]]], + argument: Union[str, int, None], + ): + self.sign = sign + self.type = type + self.condition = condition + self.argument = argument + + +class Rule: + def __init__( + self, + name: str, + # Name to arg + flags: Dict[str, Union[str, int, None]], + # True = or, False = and, None = N/A + operator: Union[bool, None], + conditions: List[Condition], + ): + self.name = name + self.flags = flags + self.operator = operator + self.conditions = conditions + + def validate_conditions( rule: str, rule_indices: dict, - conditions: List[ - Tuple[ - bool, int, Union[str, Tuple[Union[bool, None], list]], Union[str, int, None] - ] - ], + conditions: List[Condition], ): - for _, type, condition, _ in conditions: - if type == COND_ITEM: - if condition not in rule_indices: - raise Exception(f"item `{condition}` in `{rule}` is not defined") - elif type == COND_LOC: - if condition not in rule_indices: - raise Exception(f"location `{condition}` in `{rule}` is not defined") - elif type == COND_FN: - if condition not in { + for condition in conditions: + if condition.type == COND_ITEM: + if condition.condition not in rule_indices: + raise Exception( + f"item `{condition.condition}` in `{rule}` is not defined" + ) + elif condition.type == COND_LOC: + if condition.condition not in rule_indices: + raise Exception( + f"location `{condition.condition}` in `{rule}` is not defined" + ) + elif condition.type == COND_FN: + if condition.condition not in { "npc", "calamity", "grindy", @@ -182,43 +215,48 @@ def validate_conditions( "hammer", "mech_boss", "minions", + "getfixedboi", }: - raise Exception(f"function `{condition}` in `{rule}` is not defined") - elif type == COND_GROUP: - _, conditions = condition + raise Exception( + f"function `{condition.condition}` in `{rule}` is not defined" + ) + elif condition.type == COND_GROUP: + _, conditions = condition.condition validate_conditions(rule, rule_indices, conditions) def mark_progression( - conditions: List[ - Tuple[ - bool, int, Union[str, Tuple[Union[bool, None], list]], Union[str, int, None] - ] - ], + conditions: List[Condition], progression: Set[str], rules: list, rule_indices: dict, loc_to_item: dict, ): - for _, type, condition, _ in conditions: - if type == COND_ITEM: - prog = condition in progression - progression.add(loc_to_item[condition]) - _, flags, _, conditions = rules[rule_indices[condition]] + for condition in conditions: + if condition.type == COND_ITEM: + prog = condition.condition in progression + progression.add(loc_to_item[condition.condition]) + rule = rules[rule_indices[condition.condition]] if ( not prog - and "Achievement" not in flags - and "Location" not in flags - and "Item" not in flags + and "Achievement" not in rule.flags + and "Location" not in rule.flags + and "Item" not in rule.flags ): mark_progression( - conditions, progression, rules, rule_indices, loc_to_item + rule.conditions, progression, rules, rule_indices, loc_to_item ) - elif type == COND_LOC: - _, _, _, conditions = rules[rule_indices[condition]] - mark_progression(conditions, progression, rules, rule_indices, loc_to_item) - elif type == COND_GROUP: - _, conditions = condition + elif condition.type == COND_LOC: + + mark_progression( + rules[rule_indices[condition.condition]].conditions, + progression, + rules, + rule_indices, + loc_to_item, + ) + elif condition.type == COND_GROUP: + _, conditions = condition.condition mark_progression(conditions, progression, rules, rule_indices, loc_to_item) @@ -226,29 +264,7 @@ def read_data() -> Tuple[ # Goal to rule index that ends that goal's range and the locations required List[Tuple[int, Set[str]]], # Rules - List[ - Tuple[ - # Rule - str, - # Flag to flag arg - Dict[str, Union[str, int, None]], - # True = or, False = and, None = N/A - Union[bool, None], - # Conditions - List[ - Tuple[ - # True = positive, False = negative - bool, - # Condition type - int, - # Condition name or list (True = or, False = and, None = N/A) (list shares type with outer) - Union[str, Tuple[Union[bool, None], List]], - # Condition arg - Union[str, int, None], - ] - ], - ] - ], + List[Rule], # Rule to rule index Dict[str, int], # Label to rewards @@ -379,7 +395,7 @@ def read_data() -> Tuple[ unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv") elif pos == COND_OR_SEMI: if id == IDENT: - conditions.append((sign, COND_ITEM, token, None)) + conditions.append(Condition(sign, COND_ITEM, token, None)) sign = True pos = POST_COND elif id == HASH: @@ -424,14 +440,14 @@ def read_data() -> Tuple[ ) condition = operator, conditions sign, operator, conditions = outer.pop() - conditions.append((sign, COND_GROUP, condition, None)) + conditions.append(Condition(sign, COND_GROUP, condition, None)) sign = True pos = POST_COND else: unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv") elif pos == COND: if id == IDENT: - conditions.append((sign, COND_ITEM, token, None)) + conditions.append(Condition(sign, COND_ITEM, token, None)) sign = True pos = POST_COND elif id == HASH: @@ -449,7 +465,7 @@ def read_data() -> Tuple[ unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv") elif pos == LOC: if id == IDENT: - conditions.append((sign, COND_LOC, token, None)) + conditions.append(Condition(sign, COND_LOC, token, None)) sign = True pos = POST_COND else: @@ -464,10 +480,10 @@ def read_data() -> Tuple[ if id == LPAREN: pos = FN_ARG elif id == SEMI: - conditions.append((sign, COND_FN, function, None)) + conditions.append(Condition(sign, COND_FN, function, None)) pos = END elif id == AND: - conditions.append((sign, COND_FN, function, None)) + conditions.append(Condition(sign, COND_FN, function, None)) sign = True if operator is True: raise Exception( @@ -476,7 +492,7 @@ def read_data() -> Tuple[ operator = False pos = COND elif id == OR: - conditions.append((sign, COND_FN, function, None)) + conditions.append(Condition(sign, COND_FN, function, None)) sign = True if operator is False: raise Exception( @@ -485,21 +501,21 @@ def read_data() -> Tuple[ operator = True pos = COND elif id == RPAREN: - conditions.append((sign, COND_FN, function, None)) + conditions.append(Condition(sign, COND_FN, function, None)) if not outer: raise Exception( f"found `)` at {line + 1}:{char + 1} without matching `(`" ) condition = operator, conditions sign, operator, conditions = outer.pop() - conditions.append((sign, COND_GROUP, condition, None)) + conditions.append(Condition(sign, COND_GROUP, condition, None)) sign = True pos = POST_COND else: unexpected(line, char, id, token, pos, POS_FMT, "Rules.dsv") elif pos == FN_ARG: if id == IDENT or id == NUM: - conditions.append((sign, COND_FN, function, token)) + conditions.append(Condition(sign, COND_FN, function, token)) sign = True pos = FN_ARG_END else: @@ -527,7 +543,33 @@ def read_data() -> Tuple[ f"rule `{name}` on line `{line + 1}` shadows a previous rule" ) rule_indices[name] = len(rules) - rules.append((name, flags, operator, conditions)) + rules.append(Rule(name, flags, operator, conditions)) + + for flag in flags: + if flag not in { + "Location", + "Item", + "Goal", + "Early", + "Achievement", + "Grindy", + "Fishing", + "Npc", + "Pickaxe", + "Hammer", + "Minions", + "Armor Minions", + "Mech Boss", + "Final Boss", + "Getfixedboi", + "Not Getfixedboi", + "Calamity", + "Not Calamity", + "Not Calamity Getfixedboi", + }: + raise Exception( + f"rule `{name}` on line `{line + 1}` has unrecognized flag `{flag}`" + ) if "Item" in flags: item_name = flags["Item"] or f"Post-{name}" @@ -558,7 +600,7 @@ def read_data() -> Tuple[ final_bosses.append(flags["Item"] or f"Post-{name}") final_boss_loc.append(name) - if (minions := flags.get("ArmorMinions")) is not None: + if (minions := flags.get("Armor Minions")) is not None: armor_minions[name] = minions if (minions := flags.get("Minions")) is not None: @@ -572,16 +614,19 @@ def read_data() -> Tuple[ goal_indices[goal] = len(goals) goals.append((len(rules), set())) - for name, flags, _, _ in rules: - if "Goal" in flags: - _, items = goals[ - goal_indices[ - name.translate(str.maketrans("", "", string.punctuation)) + for rule in rules: + if "Goal" in rule.flags: + if (name := rule.flags.get("Goal")) is not None: + goal_name = name + else: + goal_name = ( + rule.name.translate(str.maketrans("", "", string.punctuation)) .replace(" ", "_") .lower() - ] - ] - items.add(name) + ) + + _, items = goals[goal_indices[goal_name]] + items.add(rule.name) _, mech_boss_items = goals[goal_indices["mechanical_bosses"]] mech_boss_items.update(mech_boss_loc) @@ -589,24 +634,27 @@ def read_data() -> Tuple[ _, final_boss_items = goals[goal_indices["calamity_final_bosses"]] final_boss_items.update(final_boss_loc) - for name, _, _, conditions in rules: - validate_conditions(name, rule_indices, conditions) + for rule in rules: + validate_conditions(rule.name, rule_indices, rule.conditions) - for name, flags, _, conditions in rules: + for rule in rules: prog = False if ( - "Npc" in flags - or "Goal" in flags - or "Pickaxe" in flags - or "Hammer" in flags - or "Mech Boss" in flags - or "Minions" in flags - or "ArmorMinions" in flags + "Npc" in rule.flags + or "Goal" in rule.flags + or "Pickaxe" in rule.flags + or "Hammer" in rule.flags + or "Mech Boss" in rule.flags + or "Final Boss" in rule.flags + or "Minions" in rule.flags + or "Armor Minions" in rule.flags ): - progression.add(loc_to_item[name]) + progression.add(loc_to_item[rule.name]) prog = True - if prog or "Location" in flags or "Achievement" in flags: - mark_progression(conditions, progression, rules, rule_indices, loc_to_item) + if prog or "Location" in rule.flags or "Achievement" in rule.flags: + mark_progression( + rule.conditions, progression, rules, rule_indices, loc_to_item + ) # Will be randomized via `slot_randoms` / `self.multiworld.random` label = None @@ -685,16 +733,15 @@ def read_data() -> Tuple[ next_id += 1 item_name_to_id["Reward: Coins"] = next_id - item_name_to_id["Victory"] = next_id + 1 - next_id += 2 + next_id += 1 location_name_to_id = {} - for name, flags, _, _ in rules: - if "Location" in flags or "Achievement" in flags: - if name in location_name_to_id: - raise Exception(f"location `{name}` shadows a previous location") - location_name_to_id[name] = next_id + for rule in rules: + if "Location" in rule.flags or "Achievement" in rule.flags: + if rule.name in location_name_to_id: + raise Exception(f"location `{rule.name}` shadows a previous location") + location_name_to_id[rule.name] = next_id next_id += 1 return ( diff --git a/worlds/terraria/Options.py b/worlds/terraria/Options.py index 4c4b96056c..f5056e4a06 100644 --- a/worlds/terraria/Options.py +++ b/worlds/terraria/Options.py @@ -1,40 +1,70 @@ from dataclasses import dataclass -from Options import Choice, DeathLink, PerGameCommonOptions +from Options import Choice, DeathLink, PerGameCommonOptions, Toggle, DefaultOnToggle + + +class Calamity(Toggle): + """Calamity mod bosses and events are shuffled""" + + display_name = "Calamity Mod Integration" + + +class Getfixedboi(Toggle): + """Generation accomodates the secret, very difficult "getfixedboi" seed""" + + display_name = """"getfixedboi" Seed""" class Goal(Choice): - """The victory condition for your run. Stuff after the goal will not be shuffled.""" + """ + The victory condition for your run. Stuff after the goal will not be shuffled. + Primordial Wyrm and Boss Rush are accessible relatively early, so consider "Items" or + "Locations" accessibility to avoid getting stuck on the goal. + """ display_name = "Goal" option_mechanical_bosses = 0 - # option_calamitas_clone = 1 + option_calamitas_clone = 1 option_plantera = 2 option_golem = 3 option_empress_of_light = 4 option_lunatic_cultist = 5 - # option_astrum_deus = 6 + option_astrum_deus = 6 option_moon_lord = 7 - # option_providence_the_profaned_goddess = 8 - # option_devourer_of_gods = 9 - # option_yharon_dragon_of_rebirth = 10 + option_providence_the_profaned_goddess = 8 + option_devourer_of_gods = 9 + option_yharon_dragon_of_rebirth = 10 option_zenith = 11 - # option_calamity_final_bosses = 12 - # option_adult_eidolon_wyrm = 13 + option_calamity_final_bosses = 12 + option_primordial_wyrm = 13 + option_boss_rush = 14 default = 0 -class Achievements(Choice): +class EarlyAchievements(DefaultOnToggle): + """Adds checks upon collecting early Pre-Hardmode achievements. Adds many sphere 1 checks.""" + + display_name = "Early Pre-Hardmode Achievements" + + +class NormalAchievements(DefaultOnToggle): """ - Adds checks upon collecting achievements. Achievements for clearing bosses and events are excluded. - "Exclude Grindy" also excludes fishing achievements. + Adds checks upon collecting achivements not covered by the other options. Achievements for + clearing bosses and events are excluded. """ - display_name = "Achievements" - option_none = 0 - option_exclude_grindy = 1 - option_exclude_fishing = 2 - option_all = 3 - default = 1 + display_name = "Normal Achievements" + + +class GrindyAchievements(Toggle): + """Adds checks upon collecting grindy achievements""" + + display_name = "Grindy Achievements" + + +class FishingAchievements(Toggle): + """Adds checks upon collecting fishing quest achievements""" + + display_name = "Fishing Quest Achievements" class FillExtraChecksWith(Choice): @@ -51,7 +81,12 @@ class FillExtraChecksWith(Choice): @dataclass class TerrariaOptions(PerGameCommonOptions): + calamity: Calamity + getfixedboi: Getfixedboi goal: Goal - achievements: Achievements + early_achievements: EarlyAchievements + normal_achievements: NormalAchievements + grindy_achievements: GrindyAchievements + fishing_achievements: FishingAchievements fill_extra_checks_with: FillExtraChecksWith death_link: DeathLink diff --git a/worlds/terraria/Rewards.dsv b/worlds/terraria/Rewards.dsv index dbae37b449..c8fb969689 100644 --- a/worlds/terraria/Rewards.dsv +++ b/worlds/terraria/Rewards.dsv @@ -121,10 +121,9 @@ Corrupt Flask; Calamity; Crimson Flask; Calamity; Craw Carapace; Calamity; Giant Shell; Calamity; -Fungal Carapace; Calamity; Life Jelly; Calamity; Vital Jelly; Calamity; -Mana Jelly; Calamity; +Cleansing Jelly; Calamity; Giant Tortoise Shell; Calamity; Coin of Deceit; Calamity; Ink Bomb; Calamity; @@ -151,4 +150,11 @@ Depths Charm; Calamity; Anechoic Plating; Calamity; Iron Boots; Calamity; Sprit Glyph; Calamity; -Abyssal Amulet; Calamity; \ No newline at end of file +Abyssal Amulet; Calamity; + +# unshuffled + +Life Crystal; +Enchanted Sword; +Starfury; +Defender Medal; \ No newline at end of file diff --git a/worlds/terraria/Rules.dsv b/worlds/terraria/Rules.dsv index 322bf9c5d3..9ae82d7472 100644 --- a/worlds/terraria/Rules.dsv +++ b/worlds/terraria/Rules.dsv @@ -1,43 +1,57 @@ -// TODO Calamity minion armor +// For the logic to account for all skips, these rules would need to be made much more comprehensive // Starting gear Copper Shortsword; Guide; Npc; // Immediately accessible -Timber!!; Achievement; -Benched; Achievement; -Stop! Hammer Time!; Achievement; -Matching Attire; Achievement; -Fashion Statement; Achievement; -Ooo! Shiny!; Achievement; -No Hobo; Achievement; +Squire Slime; Npc; +Traveling Merchant; ; @npc(2); +Lifeform Analyzer; ; Traveling Merchant; +DPS Meter; ; Traveling Merchant | (@calamity & Wire); +Stopwatch; ; Traveling Merchant; +Timber!!; Achievement | Early; +Benched; Achievement | Early; +Stop! Hammer Time!; Achievement | Early; +Matching Attire; Achievement | Early; +Fashion Statement; Achievement | Early; +Ooo! Shiny!; Achievement | Early; +No Hobo; Achievement | Early; // When NPC shuffling is added, this shouldn't be considered early Merchant; Npc; Bug Net; ; @calamity | Merchant; -Heavy Metal; Achievement; -Nurse; Npc; Merchant; -The Frequent Flyer; Achievement; Nurse; -Demolitionist; Npc; Merchant; +Heavy Metal; Achievement | Early; Dye Trader; Npc; @npc(4); Dye Hard; Achievement; Dye Trader; -Lucky Break; Achievement; -Star Power; Achievement; -You Can Do It!; Achievement; +Demolitionist; Npc; Merchant; +Lucky Break; Achievement | Early; +Star Power; Achievement | Early; +You Can Do It!; Achievement | Early; +Wulfrum Battery; Calamity; +Wulfrum Armor; Calamity | Armor Minions(1); // Surface exploration +Cactus; +Unusual Survival Strategies; Achievement | Early; Aglet; +Radar; +Wand of Sparking; Heliophobia; Achievement; Blighted Gel; Calamity; +Evil Powder; Archaeologist; Achievement | Grindy; Zoologist; Npc; Cat; Npc; Zoologist; Feeling Petty; Achievement; Cat | Dog; Dog; Npc; Zoologist; +Painter; Npc; @npc(8); A Rather Blustery Day; Achievement | Grindy; Enchanted Sword; Pretty in Pink; Achievement | Grindy; Marathon Medalist; Achievement | Grindy; Angler; Npc; +Fisherman's Pocket Guide; ; Angler | Weather Radio; +Weather Radio; ; Angler | Sextant; +Sextant; ; Angler | Fisherman's Pocket Guide; Servant-in-Training; Achievement | Fishing; Angler; \10 Fishing Quests; Achievement | Fishing; Angler; Trout Monkey; Achievement | Fishing; Angler; @@ -45,52 +59,69 @@ Glorious Golden Pole; Achievement | Fishing; Fast and Fishious; Achievement | Fishing; Angler; Supreme Helper Minion!; Achievement | Fishing; Angler; Water Walking Boots; -Painter; Npc; @npc(8); +Aquatic Heart; Calamity; // Sky exploration -Into Orbit; Achievement; +Into Orbit; Achievement | Early; Mysterious Circuitry; Calamity; Dubious Plating; Calamity; Charging Station; Calamity; Codebreaker Base; Calamity; Starfury; +Celestial Magnet; +Clumsy Slime; Npc; // Underground -Watch Your Step!; Achievement; -Throwing Lines; Achievement; +Watch Your Step!; Achievement | Early; +Throwing Lines; Achievement | Early; Torch God; Location | Item(Reward: Torch God's Favor); -Vehicular Manslaughter; Achievement; -Hey! Listen!; Achievement; +Vehicular Manslaughter; Achievement | Early; +Ancient Bone Dust; Calamity; +Depth Meter; +Compass; +Hey! Listen!; Achievement | Early; I Am Loot!; Achievement; +Magic Mirror; Heart Breaker; Achievement; -Hold on Tight!; Achievement; +Nurse; Npc; Merchant; +The Frequent Flyer; Not Calamity Getfixedboi | Achievement; Nurse; +Feast of Midas; Achievement; Bug Net; +Hold on Tight!; Achievement | Early; Feller of Evergreens; Calamity; Gold Hammer; Hammer(55); Gold Pickaxe; Pickaxe(55); +Gold Watch; Like a Boss; Achievement; Hermes Boots; Jeepers Creepers; Achievement; Stylist; Npc; Funkytown; Achievement; Deceiver of Fools; Achievement | Grindy; +Metal Detector; Dead Men Tell No Tales; Achievement; Bulldozer; Achievement | Grindy; // Cavern Obsidian; Obsidian Skull; ; Obsidian; +Raider's Talisman; Calamity; Obsidian; There are Some Who Call Him...; Achievement | Grindy; Lava Charm; Demonite Ore; -Demonite Bar; ; Demonite Ore | (@calamity & #Calamity Evil Boss); +Demonite Bar; ; Demonite Ore; Evil Sword; ; Demonite Bar; +Coin of Deceit; Calamity; Demonite Bar | Ruin Medallion; // Underground Ice Ice Skates; -Flinx Fur Coat; ArmorMinions(1); +Flinx Fur Coat; Armor Minions(1); // Underground Desert +Stormlion Mandible; Calamity; Golfer; Npc; +Party Girl; Npc; @npc(14); +Jolly Jamboree; Achievement | Grindy; Party Girl; +Cool Slime; Npc; Party Girl; // Sunken Sea Sea Prism; Calamity; @@ -98,37 +129,50 @@ Navyplate; Calamity; // Underground Jungle Anklet of the Wind; +Feral Claws; Stinger; Jungle Spores; Vine; Blade of Grass; ; Stinger & Jungle Spores & Vine; +Nature's Gift; +Bezoar; Summoning Potion; Minions(1); +// The Aether +A Shimmer In The Dark; Achievement; + // Underworld It's Getting Hot in Here; Achievement; Rock Bottom; Achievement; Obsidian Rose; Havocplate; Calamity; +Magma Stone; // Evil Smashing, Poppet!; Achievement; Arms Dealer; Npc; Leading Landlord; Achievement; Nurse & Arms Dealer; // The logic is way more complex, but that doesn't affect anything Completely Awesome; Achievement; Arms Dealer; +Illegal Gun Parts; ; Arms Dealer | Flamethrower; + +// Abyss +Ink Bomb; Calamity; // King Slime King Slime; Location | Item; -Sticky Situation; Achievement | Grindy; +Sticky Situation; Not Getfixedboi | Achievement | Grindy; The Cavalry; Achievement; Solidifier; ; #King Slime; +Nerdy Slime; Npc; #King Slime; // Desert Scourge Desert Scourge; Calamity | Location | Item; Pearl Shard; Calamity; #Desert Scourge; Sea Remains; Calamity; Pearl Shard; Reefclaw Hamaxe; Calamity | Hammer(60); Sea Remains; +Victide Armor; Calamity | Armor Minions(1); Sea Remains; Sandstorm; ; ~@calamity | Desert Scourge; -Voltaic Jelly; Calamity | Minions(1); Desert Scourge; // Jelly-Charged Battery doesn't stack. This is the case for all Calamity minion accessory upgrades. +Voltaic Jelly; Calamity | Minions(1); Desert Scourge | Jelly-Charged Battery; // Jelly-Charged Battery doesn't stack. This is the case for all Calamity minion accessory upgrades. // Giant Clam Giant Clam; Calamity | Location | Item; Desert Scourge; @@ -136,18 +180,21 @@ Amidias; Calamity; // Blood Moon Bloodbath; Achievement | Grindy; +Blood Orb; Calamity; +Shark Tooth Necklace; Til Death...; Achievement | Grindy; -Quiet Neighborhood; Achievement; +Quiet Neighborhood; Achievement | Early; +Surly Slime; Npc; // Eye of Cthulhu Eye of Cthulhu; Location | Item; Dryad; Npc; Eye of Cthulhu | Evil Boss | Skeletron; Pumpkin Seeds; ; Dryad; -Pumpkin; ; Pumpkin Seeds; -Purification Powder; ; Dryad; // Shimmered from Evil Powder in 1.4.4. Not bought from Dryad in get fixed boi. -Party Girl; Npc; @npc(14); -Jolly Jamboree; Achievement | Grindy; Party Girl; -Acid Rain Tier 1; Calamity | Location | Item; Eye of Cthulhu; +Pumpkin; ; Pumpkin Seeds | Cactus; +Purification Powder; ; (~@getfixedboi & Dryad) | Evil Powder; +Mystic Slime; Npc; Purification Powder; +And Good Riddance!; Achievement | Grindy; Dryad; +Acid Rain Tier 1; Calamity | Location | Item; Eye of Cthulhu | Wall of Flesh | Aquatic Scourge; // Crabulon Crabulon; Calamity | Location | Item; @@ -156,112 +203,160 @@ Crabulon; Calamity | Location | Item; Evil Boss; Location | Item; Evil Boss Part; ; #Evil Boss; Evil Pickaxe; Pickaxe(65); Evil Boss Part; -Obsidian Armor; ArmorMinions(1); Obsidian & Evil Boss Part; +Obsidian Armor; Armor Minions(1); Obsidian & Evil Boss Part; Tavernkeep; Npc; Evil Boss; Old One's Army Tier 1; Location | Item; Tavernkeep; -Meteorite; ; Evil Boss; -Meteorite Bar; ; Meteorite; +Meteorite; ; #Evil Boss | Evil Boss | Meteorite Bar | (@calamity & Astral Infection); +Meteorite Bar; ; Meteorite | (@calamity & Astral Infection) | Meteor Staff; Meteor Hamaxe; Hammer(60); Meteorite Bar; Hellforge; ; @pickaxe(60); -Hellstone; ; @pickaxe(65) | Wall of Flesh; +Hellstone; ; @pickaxe(65) | Wall of Flesh | Hellstone Bar; Hellstone Bar; ; Hellstone; Fiery Greatsword; ; Hellstone Bar; Molten Hamaxe; Hammer(70); Hellstone Bar; Molten Pickaxe; Pickaxe(100); Hellstone Bar; Miner for Fire; Achievement; Molten Pickaxe; -Hot Reels!; Achievement; Hellstone Bar & Bug Net; // TODO Calamity +Hot Reels!; Achievement; Hellstone Bar & (@calamity | Bug Net); Brimstone Slag; Calamity; @pickaxe(100); // Goblin Army Goblin Army; Location | Item; Goblin Tinkerer; Npc; Goblin Army; Tinkerer's Workshop; ; Goblin Tinkerer; +Mana Flower; ; (Tinkerer's Workshop & Nature's Gift) | (@calamity & Ethereal Talisman); +Silencing Sheath; Calamity; (Tinkerer's Workshop & Demonite Bar & Evil Boss Part) | Dark Matter Sheath; Rocket Boots; ; Goblin Tinkerer; Spectre Boots; ; Tinkerer's Workshop & Hermes Boots & Rocket Boots; Lightning Boots; ; Tinkerer's Workshop & Spectre Boots & Anklet of the Wind & Aglet; Frostspark Boots; ; Tinkerer's Workshop & Lightning Boots & Ice Skates; Lava Waders; ; Tinkerer's Workshop & Obsidian Skull & Lava Charm & Obsidian Rose & Water Walking Boots; Terraspark Boots; ; Tinkerer's Workshop & Frostspark Boots & Lava Waders; +GPS; ; Tinkerer's Workshop & Depth Meter & Gold Watch & Compass; +Goblin Tech; ; Tinkerer's Workshop & DPS Meter & Stopwatch & Metal Detector; +Fish Finder; ; Tinkerer's Workshop & Fisherman's Pocket Guide & Weather Radio & Sextant; Boots of the Hero; Achievement | Grindy; Terraspark Boots; +Diving Gear; ; Tinkerer's Workshop; // Queen Bee Where's My Honey?; Achievement; Queen Bee; Location | Item; Bee Keeper; ; #Queen Bee; Bee Wax; ; #Queen Bee; -Bee Armor; ArmorMinions(2); Bee Wax; +Bee Armor; Armor Minions(2); Bee Wax; Not the Bees!; Achievement; #Queen Bee & Bee Armor; Witch Doctor; Npc; Queen Bee; -Pygmy Necklace; Minions(1); Witch Doctor; +Pygmy Necklace; Minions(1); Witch Doctor | (@calamity & Statis' Blessing); // Calamity Evil Boss -Calamity Evil Boss; Calamity | Location | Item; -Aerialite Ore; Calamity; Calamity Evil Boss & @pickaxe(65); -Aerialite Bar; Calamity; Aerialite Ore; +The Hive Mind; Calamity | Location | Item; +The Perforators; Calamity | Location | Item; +Blood Sample; Calamity; #The Perforators; +Aerialite Ore; Calamity; The Hive Mind | The Perforators | Cobalt Ore | Aerialite Bar; // No pick needed; can be fished +Aerialite Bar; Calamity; Aerialite Ore | Feather Crown; Aerial Hamaxe; Calamity | Hammer(70); Aerialite Bar; Skyfringe Pickaxe; Calamity | Pickaxe(75); Aerialite Bar; +Aerospec Armor; Calamity | Armor Minions(1); Aerialite Bar; +Feather Crown; Calamity; Aerialite Bar | Moonstone Crown; // Skeletron Skeletron; Location | Item; Clothier; Npc; Skeletron; Dungeon; ; Skeletron; Dungeon Heist; Achievement; Dungeon; -Bone; ; Dungeon | (@calamity & #Skeletron); -Bewitching Table; Minions(1); Dungeon | (Witch Doctor & Wizard); +Bone; ; Dungeon | (@calamity & (#Skeletron | (@getfixedboi & #Ravager) | Mirage Mirror)); +Mirage Mirror; Calamity; (Tinkerer's Workshop & Bone) | Abyssal Mirror; +Tally Counter; ; Dungeon; +R.E.K. 3000; ; Tinkerer's Workshop & Radar & Tally Counter & Lifeform Analyzer; +PDA; ; Tinkerer's Workshop & GPS & R.E.K. 3000 & Goblin Tech & Fish Finder; +Cell Phone; ; (Tinkerer's Workshop & Magic Mirror & PDA) | (@getfixedboi & @calamity & #Polterghast); +Black Mirror; Achievement | Grindy; Cell Phone; +Bewitching Table; Minions(1); Dungeon | (Witch Doctor & Wizard) | Alchemy Table; +Alchemy Table; ; Dungeon | Bewitching Table; Mechanic; ; Dungeon; -Wire; ; Mechanic; +Wire; ; Mechanic | (@calamity & Electrician's Glove); Decryption Computer; Calamity; Mysterious Circuitry & Dubious Plating & Wire; Actuator; ; Mechanic; Muramasa; ; Dungeon; +Cobalt Shield; ; Dungeon | (@calamity & Cobalt Bar); +Obsidian Shield; ; Tinkerer's Workshop & Cobalt Shield & Obsidian Skull; +Elder Slime; Npc; Skeletron & Dungeon; // Deerclops Deerclops; Location | Item; // The Slime God The Slime God; Calamity | Location | Item; Blighted Gel; -Purified Gel; Calamity; #The Slime God; +Purified Gel; Calamity; #The Slime God | Jelly-Charged Battery; +Jelly-Charged Battery; Calamity; (Wulfrum Battery & Voltaic Jelly & Purified Gel & Stormlion Mandible) | Star-Tainted Generator; Static Refiner; Calamity; Purified Gel & Solidifier; Gelpick; Calamity | Pickaxe(100); Static Refiner & Purified Gel & Blighted Gel; +Statigel Armor; Calamity | Armor Minions(1); Static Refiner & Purified Gel & Blighted Gel; Night's Edge; ; Evil Sword & Muramasa & Blade of Grass & Fiery Greatsword & (~@calamity | Purified Gel); // Wall of Flesh Wall of Flesh; Location | Item(Hardmode); Guide; Pwnhammer; Hammer(80); #Wall of Flesh; +Emblem; ; #Wall of Flesh | Avenger Emblem | (@calamity & (Mechanical Glove | Celestial Emblem | Statis' Blessing)); +Fast Clock; ; Wall of Flesh | Trifold Map | (@calamity & Wire & Pixie Dust & Soul of Light); Wizard; Npc; Wall of Flesh; -Tax Collector; Npc; Purification Powder & Wall of Flesh; +Titan Glove; ; Wall of Flesh | Power Glove; +Power Glove; ; Tinkerer's Workshop & Titan Glove & Feral Claws; +Magic Quiver; ; Wall of Flesh | (@calamity & Elemental Quiver); +Hallowed Seeds; ; (Wall of Flesh & Dryad) | Holy Water; +Armor Polish; ; Wall of Flesh | Vitamins | (@calamity & Bone & Ancient Bone Dust); +Adhesive Bandage; ; @calamity | Wall of Flesh; +Medicated Bandage; ; Tinkerer's Workshop & Bezoar & Adhesive Bandage; +Megaphone; ; Wall of Flesh | Nazar | (@calamity & Wire & Cobalt Bar); +Pocket Mirror; ; Wall of Flesh | Blindfold | (@calamity & Crystal Shard & Soul of Night); +Trifold Map; ; Wall of Flesh | Fast Clock | (@calamity & Soul of Light & Soul of Night); +The Plan; ; Tinkerer's Workshop & Trifold Map & Fast Clock; +Tax Collector; Npc; (Purification Powder & Wall of Flesh) | @getfixedboi; Spider Fangs; ; Wall of Flesh; -Spider Armor; ArmorMinions(3); Spider Fangs; +Spider Armor; Armor Minions(3); Spider Fangs; Cross Necklace; ; Wall of Flesh; Altar; ; Wall of Flesh & @hammer(80); Begone, Evil!; Achievement; Altar; -Cobalt Ore; ; (((~@calamity & Altar) | (@calamity & Wall of Flesh)) & @pickaxe(100)) | Wall of Flesh; +Cobalt Ore; ; (((~@calamity & Altar) | (@calamity & Wall of Flesh)) & @pickaxe(100)) | Wall of Flesh | Mythril Ore | Cobalt Bar; Extra Shiny!; Achievement; Cobalt Ore | Mythril Ore | Adamantite Ore | Chlorophyte Ore; -Cobalt Bar; ; Cobalt Ore | Wall of Flesh; +Cobalt Bar; ; Cobalt Ore | (@calamity & Lunic Eye) | Wall of Flesh; Cobalt Pickaxe; Pickaxe(110); Cobalt Bar; -Soul of Night; ; Wall of Flesh | (@calamity & Altar); +Blindfold; ; @calamity | Wall of Flesh | Pocket Mirror; +Reflective Shades; ; Tinkerer's Workshop & Blindfold & Pocket Mirror; +Vitamins; ; Wall of Flesh | Armor Polish | (@calamity & Alchemy Table & Blood Orb); +Armor Bracing; ; Tinkerer's Workshop & Vitamins & Armor Polish; +Nazar; ; Wall of Flesh | Megaphone | (@calamity & Soul of Night); +Countercurse Mantra; ; Tinkerer's Workshop & Nazar & Megaphone; +Ankh Charm; ; Tinkerer's Workshop & Reflective Shades & Armor Bracing & Medicated Bandage & Countercurse Mantra & The Plan; +Ankh Shield; ; Tinkerer's Workshop & Obsidian Shield & Ankh Charm; +Ankhumulation Complete; Achievement | Grindy; Ankh Shield; +Soul of Night; ; Wall of Flesh | (@calamity & (Altar | (@getfixedboi & #Duke Fishron))); Hallow; ; Wall of Flesh; -Pixie Dust; ; Hallow; +Pixie Dust; ; Hallow | Meteor Staff | Holy Water; +Holy Water; ; (Pixie Dust & Hallowed Seeds) | (@calamity & Statis' Blessing); Unicorn Horn; ; Hallow; Crystal Shard; ; Hallow; Axe of Purity; Calamity; Feller of Evergreens & Purification Powder & Pixie Dust & Crystal Shard; -Soul of Light; ; Hallow | (@calamity & #Queen Slime); +Fabsol's Vodka; Calamity; (Pixie Dust & Crystal Shard & Unicorn Horn) | (@getfixedboi & #Empress of Light); +Soul of Light; ; Hallow | (@calamity & (#Queen Slime | (@getfixedboi & #Duke Fishron))) | Light Disc | Meteor Staff; +Meteor Staff; ; (Hardmode Anvil & Meteorite Bar & Pixie Dust & Soul of Light) | Asteroid Staff; Blessed Apple; ; Hallow; Rod of Discord; ; Hallow; Gelatin World Tour; Achievement | Grindy; Dungeon & Wall of Flesh & Hallow & #King Slime; Soul of Flight; ; Wall of Flesh; -Head in the Clouds; Achievement; @grindy | (Soul of Flight & ((Hardmode Anvil & (Soul of Light | Soul of Night | Pixie Dust | Wall of Flesh | Solar Eclipse | @mech_boss(1) | Plantera | Spectre Bar | #Golem)) | (Shroomite Bar & Autohammer) | #Mourning Wood | #Pumpking)) | Steampunker | (Wall of Flesh & Witch Doctor) | (Solar Eclipse & Plantera) | #Everscream | #Old One's Army Tier 3 | #Empress of Light | #Duke Fishron | (Fragment & Luminite Bar & Ancient Manipulator); // Leaf Wings are Post-Plantera in 1.4.4 +Head in the Clouds; Achievement; @grindy | (Soul of Flight & ((Hardmode Anvil & (Soul of Light | Soul of Night | Pixie Dust | Wall of Flesh | Solar Eclipse | @mech_boss(1) | Plantera | Spectre Bar | #Golem)) | (Shroomite Bar & Autohammer) | #Mourning Wood | #Pumpking)) | Steampunker | (Wall of Flesh & Plantera & Witch Doctor) | (Solar Eclipse & Plantera) | #Everscream | #Old One's Army Tier 3 | #Empress of Light | #Duke Fishron | (Fragment & Luminite Bar & Ancient Manipulator); Bunny; Npc; Zoologist & Wall of Flesh; // Extremely simplified Forbidden Fragment; ; Sandstorm & Wall of Flesh; -Astral Infection; Calamity; Wall of Flesh; -Stardust; Calamity; Astral Infection | #Astrum Aureus | #Astrum Deus; +Astral Infection; Calamity; Wall of Flesh | Astrum Aureus; +Stardust; Calamity; Astral Infection | #Astrum Aureus | #Astrum Deus | Eye of Magnus | Meld Construct; +Lunic Eye; Calamity; (Cobalt Bar & Stardust) | Eye of Magnus; Trapper Bulb; Calamity; Wall of Flesh; Titan Heart; Calamity; Astral Infection; Essence of Sunlight; Calamity; Wall of Flesh | Golem; -Essence of Eleum; Calamity; Wall of Flesh | Cryogen | #Cryogen; // TODO Check -Essence of Havoc; Calamity; Wall of Flesh | #Calamitas Clone | #Brimstone Elemental; -Don't Dread on Me; Achievement; Wall of Flesh; -Earth Elemental; Calamity | Location | Item; Wall of Flesh; -Cloud Elemental; Calamity | Location | Item; Wall of Flesh; +Essence of Eleum; Calamity; Wall of Flesh | Cryogen | #Cryogen | (@getfixedboi & #Duke Fishron); +Essence of Havoc; Calamity; Wall of Flesh | #Calamitas Clone | #Brimstone Elemental | Ruin Medallion; +Dreadnautilus; Calamity | Location | Item; Wall of Flesh; +Don't Dread on Me; Not Calamity | Achievement; Wall of Flesh; +Hardmode Giant Clam; Calamity | Location | Item; #Giant Clam & Wall of Flesh; Truffle; Npc; Wall of Flesh; It Can Talk?!; Achievement; Truffle; The First Shadowflame; Calamity | Minions(1); Goblin Army | Wall of Flesh; @@ -271,103 +366,125 @@ Pirate Invasion; Location | Item; Pirate; Npc; Pirate Invasion; // Queen Slime -Queen Slime; Location | Item; Hallow; +Queen Slime; Location | Item; Hallow | (@getfixedboi & @calamity & #Supreme Alchemist, Cirrus); +Sparkle Slime Balloon; ; #Queen Slime; +Diva Slime; Npc; Sparkle Slime Balloon; +The Great Slime Mitosis; Achievement; Nerdy Slime & Cool Slime & Elder Slime & Clumsy Slime & Diva Slime & Surly Slime & Mystic Slime & Squire Slime; // Aquatic Scourge -Mythril Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(1))) & @pickaxe(110)) | (Wall of Flesh & (~@calamity | @mech_boss(1))); -Mythril Bar; ; Mythril Ore | (Wall of Flesh & (~@calamity | @mech_boss(1))); +Mythril Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(1))) & @pickaxe(110)) | Wall of Flesh | Adamantite Ore | Mythril Bar; +Mythril Bar; ; Mythril Ore | Wall of Flesh | (@calamity & Electrician's Glove); Hardmode Anvil; ; Mythril Bar; Mythril Pickaxe; Pickaxe(150); Hardmode Anvil & Mythril Bar; -Adamantite Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(2))) & @pickaxe(150)) | (Wall of Flesh & (~@calamity | @mech_boss(2))); +Electrician's Glove; Calamity; (Hardmode Anvil & Wire & Mythril Bar) | Nanotech; +Adamantite Ore; ; (((~@calamity & Altar) | (@calamity & @mech_boss(2))) & @pickaxe(150)) | Wall of Flesh | (~@calamity & Chlorophyte Ore) | Adamantite Bar | (@calamity & Hallowed Ore); Hardmode Forge; ; Hardmode Anvil & Adamantite Ore & Hellforge; -Adamantite Bar; ; (Hardmode Forge & Adamantite Ore) | (Wall of Flesh & (~@calamity | @mech_boss(2))); +Adamantite Bar; ; (Hardmode Forge & Adamantite Ore) | Wall of Flesh; Adamantite Pickaxe; Pickaxe(180); Hardmode Anvil & Adamantite Bar; -Forbidden Armor; ArmorMinions(2); Hardmode Anvil & Adamantite Bar & Forbidden Fragment; +Forbidden Armor; Armor Minions(2); Hardmode Anvil & Adamantite Bar & Forbidden Fragment; Aquatic Scourge; Calamity | Location | Item; -The Twins; Location | Item | Mech Boss; (@calamity | Hardmode Anvil) & Soul of Light; -Brimstone Elemental; Calamity | Location | Item; Soul of Night & Essence of Havoc & Unholy Core; -The Destroyer; Location | Item | Mech Boss; (@calamity | Hardmode Anvil) & Soul of Night; -Cryogen; Calamity | Location | Item; Soul of Night & Soul of Light & Essence of Eleum; -Skeletron Prime; Location | Item | Mech Boss; (@calamity | Hardmode Anvil) & Soul of Night & Soul of Light & Bone; -# mechanical_bosses Cragmaw Mire; Calamity | Location | Item; #Acid Rain Tier 2; -Nuclear Rod; Calamity | Minions(1); #Cragmaw Mire; -Acid Rain Tier 2; Calamity | Location | Item; #Acid Rain Tier 1 & Aquatic Scourge; +Nuclear Fuel Rod; Calamity | Minions(1); #Cragmaw Mire | Star-Tainted Generator; +Acid Rain Tier 2; Calamity | Location | Item; #Acid Rain Tier 1 & (Aquatic Scourge | Acid Rain Tier 3); +Mechanical Eye; ; (@calamity | Hardmode Anvil) & Soul of Light; +Mechanical Worm; ; (@calamity | Hardmode Anvil) & Soul of Night; +Mechanical Skull; ; (@calamity | Hardmode Anvil) & Soul of Night & Soul of Light & Bone; +Ocram's Razor; Getfixedboi; (@calamity | Hardmode Anvil) & Mechanical Eye & Mechanical Worm & Mechanical Skull; +The Twins; Location | Item | Mech Boss; (~@getfixedboi & Mechanical Eye) | (@getfixedboi & Ocram's Razor); +Brimstone Elemental; Calamity | Location | Item; Soul of Night & Essence of Havoc & Unholy Core; +The Destroyer; Location | Item | Mech Boss; (~@getfixedboi & Mechanical Worm) | (@getfixedboi & Ocram's Razor); +Cryogen; Calamity | Location | Item; Soul of Night & Soul of Light & Essence of Eleum; +Skeletron Prime; Location | Item | Mech Boss; (~@getfixedboi & Mechanical Skull) | (@getfixedboi & Ocram's Razor); +# mechanical_bosses // The Twins -Soul of Sight; ; #The Twins; +Soul of Sight; ; #The Twins | Avenger Emblem | (@calamity & (Mechanical Glove | Celestial Emblem)); Steampunker; Npc; @mech_boss(1); Hammush; ; Truffle & @mech_boss(1); Rainbow Rod; ; Hardmode Anvil & Crystal Shard & Unicorn Horn & Pixie Dust & Soul of Light & Soul of Sight; Prismancer; Achievement; Rainbow Rod; Long Ranged Sensor Array; Calamity; Hardmode Anvil & Mysterious Circuitry & Dubious Plating & Mythril Bar & Wire & Decryption Computer & Codebreaker Base; Hydraulic Volt Crusher; Calamity; Hardmode Anvil & Mysterious Circuitry & Dubious Plating & Mythril Bar & Soul of Sight; -Life Fruit; ; (@mech_boss(1) & Wall of Flesh) | (@calamity & (Living Shard | Wall of Flesh)); +Life Fruit; ; (@mech_boss(1) & Wall of Flesh) | (@calamity & (Living Shard | Wall of Flesh | (@getfixedboi & #Plantera))); Get a Life; Achievement; Life Fruit; Topped Off; Achievement; Life Fruit; Old One's Army Tier 2; Location | Item; #Old One's Army Tier 1 & ((Wall of Flesh & @mech_boss(1)) | #Old One's Army Tier 3); // Brimstone Elemental Infernal Suevite; Calamity; @pickaxe(150) | Brimstone Elemental; -Unholy Core; Calamity; Infernal Suevite & Hellstone; +Unholy Core; Calamity; (Infernal Suevite & Hellstone) | Brimstone Elemental; +Ruin Medallion; Calamity; (Hardmode Anvil & Coin of Deceit & Unholy Core & Essence of Havoc) | Dark Matter Sheath; // The Destroyer -Soul of Might; ; #The Destroyer; +Soul of Might; ; #The Destroyer | Avenger Emblem | Light Disc | (@calamity & (Mechanical Glove | Celestial Emblem)); // Cryogen -Cryonic Ore; Calamity; Cryogen & (@pickaxe(180) | @mech_boss(2)); -Cryonic Bar; Calamity; (Hardmode Forge & Cryonic Ore) | Fleshy Geode | Necromantic Geode; +Cryonic Ore; Calamity; (Cryogen & (@pickaxe(180) | @mech_boss(2))) | Cryonic Bar; +Cryonic Bar; Calamity; (Hardmode Forge & Cryonic Ore) | Fleshy Geode | Necromantic Geode | (Cryogen & @mech_boss(2)) | Life Alloy; Abyssal Warhammer; Calamity | Hammer(88); Hardmode Anvil & Cryonic Bar; Shardlight Pickaxe; Calamity | Pickaxe(180); Hardmode Anvil & Cryonic Bar; +Daedalus Armor; Calamity | Armor Minions(2); Hardmode Anvil & Cryonic Bar & Essence of Eleum; // Skeletron Prime -Soul of Fright; ; #Skeletron Prime; +Soul of Fright; ; #Skeletron Prime | Avenger Emblem | Flamethrower | (@calamity & (Mechanical Glove | Celestial Emblem)); Inferna Cutter; Calamity; Hardmode Anvil & Axe of Purity & Soul of Fright & Essence of Havoc; +Flamethrower; ; (Hardmode Anvil & Illegal Gun Parts & Soul of Fright) | (@getfixedboi & @calamity & #Skeletron); Buckets of Bolts; Achievement; #The Twins & #The Destroyer & #Skeletron Prime; -Mecha Mayhem; Achievement; #The Twins & #The Destroyer & #Skeletron Prime; -Hallowed Bar; ; (#The Twins | #The Destroyer | #Skeletron Prime) & (~@calamity | @mech_boss(3)); // Can't count on Hallowed Ore, since the player may be in prehardmode (TODO Check this) -Hallowed Armor; ArmorMinions(3); Hardmode Anvil & Hallowed Bar; +Mecha Mayhem; Achievement | Not Getfixedboi; #The Twins & #The Destroyer & #Skeletron Prime; +Hallowed Ore; Calamity; (@mech_boss(3) & @pickaxe(180)) | Chlorophyte Ore | Hallowed Bar; +Hallowed Bar; ; ((#The Twins | #The Destroyer | #Skeletron Prime) & (~@calamity | @mech_boss(3))) | (@calamity & Hardmode Forge & Hallowed Ore) | Light Disc; +Hallowed Armor; Armor Minions(3); Hardmode Anvil & Hallowed Bar; Excalibur; ; Hardmode Anvil & Hallowed Bar; Pickaxe Axe; Pickaxe(200); Hardmode Anvil & Hallowed Bar & Soul of Fright & Soul of Might & Soul of Sight; Drax Attax; Achievement; Pickaxe Axe; True Night's Edge; ; Hardmode Anvil & Night's Edge & Soul of Fright & Soul of Might & Soul of Sight; -Chlorophyte Ore; ; Wall of Flesh & @pickaxe(200); +Avenger Emblem; ; (Tinkerer's Workshop & Emblem & Soul of Might & Soul of Sight & Soul of Fright) | (@calamity & (Sand Shark Tooth Necklace | Sigil of Calamitas)) | (~@calamity & (Mechanical Glove | Celestial Emblem)); +Mechanical Glove; ; (Power Glove & ((~@calamity & Tinkerer's Workshop & Avenger Emblem) | (@calamity & Emblem & Soul of Fright & Soul of Might & Soul of Sight))) | Fire Gauntlet; +Celestial Emblem; ; (Celestial Magnet & ((~@calamity & Tinkerer's Workshop & Avenger Emblem) | (@calamity & Emblem & Soul of Fright & Soul of Might & Soul of Sight))) | Sigil of Calamitas; +Light Disc; ; (Hallowed Bar & Soul of Light & Soul of Might) | (@getfixedboi & @calamity & #Evil Boss); +Chlorophyte Ore; ; (Wall of Flesh & @pickaxe(200)) | (~@calamity & Luminite) | Chlorophyte Bar | (@calamity & Perennial Ore); Photosynthesis; Achievement; Chlorophyte Ore; -Chlorophyte Bar; ; Hardmode Forge & Chlorophyte Ore; +Chlorophyte Bar; ; (Hardmode Forge & Chlorophyte Ore) | Spectre Bar | Shroomite Bar; True Excalibur; ; Hardmode Anvil & Excalibur & Chlorophyte Bar; Chlorophyte Pickaxe; Pickaxe(200); Hardmode Anvil & Chlorophyte Bar; Chlorophyte Warhammer; Hammer(90); Hardmode Anvil & Chlorophyte Bar; // Calamitas Clone Calamitas Clone; Calamity | Location | Item | Goal; Hardmode Anvil & Hellstone Bar & Essence of Havoc; -Plantera; Location | Item | Goal; Wall of Flesh & (@mech_boss(3) | (@calamity & Hardmode Anvil & Trapper Bulb)); +Plantera; Location | Item | Goal; Wall of Flesh & (@mech_boss(3) | @calamity); # calamitas_clone # plantera -Ashes of Calamity; Calamity; #Calamitas Clone; +Ashes of Calamity; Calamity; #Calamitas Clone | Sigil of Calamitas; +Depth Cells; Calamity; Calamitas Clone | Abyssal Mirror; +Lumenyl; Calamity; Calamitas Clone | Abyssal Mirror; +Abyssal Mirror; Calamity; (Hardmode Anvil & Mirage Mirror & Ink Bomb & Depth Cells & Lumenyl) | Eclipse Mirror; +Fathom Swarmer Armor; Calamity | Armor Minions(2); Hardmode Anvil & Sea Remains & Depth Cells; // Plantera The Axe; Hammer(100); #Plantera; Seedler; ; #Plantera; Living Shard; Calamity; #Plantera; -Tiki Armor; ArmorMinions(4); Witch Doctor & Wall of Flesh & Plantera; +Tiki Armor; Armor Minions(4); Witch Doctor & Wall of Flesh & Plantera; Hercules Beetle; ; Witch Doctor & Wall of Flesh & Plantera; You and What Army?; Achievement; @minions(8); Cyborg; Npc; Plantera; +To Infinity... and Beyond!; Achievement; Cyborg & Wall of Flesh; Autohammer; ; Truffle & Plantera; Shroomite Bar; ; Autohammer & Chlorophyte Bar; Shroomite Digging Claw; Pickaxe(200); Hardmode Anvil & Shroomite Bar; Princess; Npc; Guide & Merchant & Nurse & Demolitionist & Dye Trader & Zoologist & Angler & Painter & Stylist & Golfer & Arms Dealer & Dryad & Party Girl & Tavernkeep & Goblin Tinkerer & Witch Doctor & Clothier & Wizard & Truffle & Tax Collector & Pirate & Steampunker & Cyborg; Real Estate Agent; Achievement; Princess; -Ectoplasm; ; ((Dungeon & Wall of Flesh) | @calamity) & Plantera; +Ectoplasm; ; (((Dungeon & Wall of Flesh) | @calamity) & Plantera) | Spectre Bar; Paladin's Shield; ; Dungeon & Wall of Flesh & Plantera; -Core of Sunlight; Calamity; (Hardmode Anvil & Essence of Sunlight & Ectoplasm) | Fleshy Geode | Necromantic Geode; -Core of Eleum; Calamity; (Hardmode Anvil & Essence of Eleum & Ectoplasm) | Fleshy Geode | Necromantic Geode; -Core of Havoc; Calamity; (Hardmode Anvil & Essence of Havoc & Ectoplasm) | Fleshy Geode | Necromantic Geode; -Core of Calamity; Calamity; (Hardmode Anvil & Core of Sunlight & Core of Eleum & Core of Havoc & Ashes of Calamity) | Necromantic Geode; +Core of Sunlight; Calamity; (Hardmode Anvil & Essence of Sunlight & Ectoplasm) | Fleshy Geode | Necromantic Geode | Core of Calamity | Statis' Blessing; +Core of Eleum; Calamity; (Hardmode Anvil & Essence of Eleum & Ectoplasm) | Fleshy Geode | Necromantic Geode | Core of Calamity; +Core of Havoc; Calamity; (Hardmode Anvil & Essence of Havoc & Ectoplasm) | Fleshy Geode | Necromantic Geode | Core of Calamity; +Core of Calamity; Calamity; (Hardmode Anvil & Core of Sunlight & Core of Eleum & Core of Havoc & Ashes of Calamity) | Necromantic Geode | Deadshot Brooch; +Deadshot Brooch; Calamity; (Hardmode Anvil & Emblem & Core of Calamity) | Elemental Quiver; Spectre Bar; ; Hardmode Forge & Chlorophyte Bar & Ectoplasm; Spectre Pickaxe; Pickaxe(200); Hardmode Anvil & Spectre Bar; Spectre Hamaxe; Hammer(90); Hardmode Anvil & Spectre Bar; -Robbing the Grave; Achievement; Dungeon & Plantera; +Robbing the Grave; Achievement; Dungeon & Wall of Flesh & Plantera; Evil Key; ; Plantera | (@calamity & #Wall of Flesh); Frozen Key; ; Plantera | (@calamity & #Cryogen); Jungle Key; ; Plantera | (@calamity & #Plantera); @@ -376,22 +493,25 @@ Desert Key; ; Big Booty; Achievement; Dungeon & Wall of Flesh & Plantera & (Evil Key | Frozen Key | Jungle Key | Hallowed Key | Desert Key); Rainbow Gun; ; Dungeon & Wall of Flesh & Plantera & Hallowed Key; Rainbows and Unicorns; Achievement; Blessed Apple & Rainbow Gun; -Perennial Ore; Calamity; Plantera; -Perennial Bar; Calamity; Hardmode Forge & Perennial Ore; +Perennial Ore; Calamity; Plantera | Perennial Bar; +Perennial Bar; Calamity; (Hardmode Forge & Perennial Ore) | Plantera | Life Alloy; Beastial Pickaxe; Calamity | Pickaxe(200); Hardmode Anvil & Perennial Bar; -Armored Digger; Calamity | Location | Item; Plantera; // TODO Check // Solar Eclipse Temple Raider; Achievement; #Plantera; Lihzahrd Temple; ; #Plantera | (Plantera & Actuator) | @pickaxe(210) | (@calamity & Hardmode Anvil & Soul of Light & Soul of Night); +Lihzahrd Furniture; ; Lihzahrd Temple; Solar Eclipse; ; Lihzahrd Temple & Wall of Flesh; -Broken Hero Sword; ; (Solar Eclipse & Plantera & @mech_boss(3)) | (@calamity & #Calamitas Clone); +Broken Hero Sword; ; Solar Eclipse & Plantera & @mech_boss(3); Terra Blade; ; Hardmode Anvil & True Night's Edge & True Excalibur & Broken Hero Sword & (~@calamity | Living Shard); Sword of the Hero; Achievement; Terra Blade; +Neptune's Shell; ; Solar Eclipse; Kill the Sun; Achievement; Solar Eclipse; // Great Sand Shark Great Sand Shark; Calamity | Location | Item; Hardmode Anvil & Forbidden Fragment & Core of Sunlight; +Grand Scale; Calamity; #Great Sand Shark | Sand Shark Tooth Necklace; +Sand Shark Tooth Necklace; Calamity; (Tinkerer's Workshop & Shark Tooth Necklace & Avenger Emblem & Grand Scale) | (@getfixedboi & #Desert Scourge); // Leviathan and Anahita Leviathan and Anahita; Calamity | Location | Item; @@ -404,32 +524,40 @@ Starbuster Core; Calamity | Minions(1); Golem; Location | Item | Goal; (Wall of Flesh & Plantera & Lihzahrd Temple) | (@calamity & Hardmode Anvil & Lihzahrd Temple & Essence of Sunlight); # golem Picksaw; Pickaxe(210); #Golem; -Lihzahrd Brick; ; @pickaxe(210); -Scoria Ore; Calamity; Golem | @pickaxe(210); -Scoria Bar; Calamity; Hardmode Forge & Scoria Ore; +Lihzahrd Brick; ; @pickaxe(210) | (Lihzahrd Furniture & Golem) | (@calamity & Lihzahrd Temple); +Scoria Ore; Calamity; Golem | @pickaxe(210) | Astral Ore | Luminite | Scoria Bar; +Scoria Bar; Calamity; (Hardmode Forge & Scoria Ore) | Golem | Life Alloy | Sigil of Calamitas | Fire Gauntlet; Seismic Hampick; Calamity | Pickaxe(210) | Hammer(95); Hardmode Anvil & Scoria Bar; -Life Alloy; Calamity; (Hardmode Anvil & Cryonic Bar & Perennial Bar & Scoria Bar) | Necromantic Geode; +Hydrothermic Armor; Calamity | Armor Minions(2); Hardmode Anvil & Scoria Bar & Core of Havoc; +Fire Gauntlet; ; (Tinkerer's Workshop & Magma Stone & Mechanical Glove & (~@calamity | Scoria Bar)) | (@calamity & Elemental Gauntlet); +Sigil of Calamitas; Calamity; (Hardmode Anvil & Celestial Emblem & Scoria Bar & Ashes of Calamity) | Ethereal Talisman; +Life Alloy; Calamity; (Hardmode Anvil & Cryonic Bar & Perennial Bar & Scoria Bar) | Necromantic Geode | Star-Tainted Generator | (@getfixedboi & #Yharon, Dragon of Rebirth); Advanced Display; Calamity; Hardmode Anvil & Mysterious Circuitry & Dubious Plating & Life Alloy & Long Ranged Sensor Array; +Star-Tainted Generator; Calamity; (Hardmode Anvil & Jelly-Charged Battery & Nuclear Fuel Rod & Starbuster Core & Life Alloy) | Nucleogenesis; Old One's Army Tier 3; Location | Item; #Old One's Army Tier 1 & Wall of Flesh & Golem; // Martian Madness Martian Madness; Location | Item; Wall of Flesh & Golem; +Laser Drill; Pickaxe(220); #Martian Madness; Influx Waver; ; #Martian Madness; // The Plaguebringer Goliath -Plague Cell Canister; Calamity; Golem; -Plaguebringer; Calamity | Location | Item; Golem; +Plague Cell Canister; Calamity; Golem | Alchemical Flask | (@getfixedboi & #Queen Bee); +Alchemical Flask; Calamity; (Hardmode Anvil & Bee Wax & Plague Cell Canister) | (@getfixedboi & #Queen Bee); The Plaguebringer Goliath; Calamity | Location | Item; Hardmode Anvil & Plague Cell Canister; +Infected Armor Plating; Calamity; #The Plaguebringer Goliath; +Plaguebringer Armor; Calamity | Armor Minions(3); Hardmode Anvil & Bee Armor & Alchemical Flask & Plague Cell Canister & Infected Armor Plating; // Duke Fishron -Duke Fishron; Location | Item; Bug Net & Wall of Flesh; +Duke Fishron; Location | Item; (Bug Net & Wall of Flesh) | (@getfixedboi & @calamity & #Astrum Deus); // Pumpkin Moon Pumpkin Moon; ; Hardmode Anvil & Pumpkin & Ectoplasm & (@calamity | Hallowed Bar); -Spooky Armor; ArmorMinions(4); Pumpkin Moon; +Spooky Armor; Armor Minions(4); Pumpkin Moon; Mourning Wood; Location | Item; Pumpkin Moon; Necromantic Scroll; Minions(1); #Mourning Wood; -Papyrus Scarab; Minions(1); Tinkerer's Workshop & Hercules Beetle & Necromantic Scroll; +Papyrus Scarab; Minions(1); (Tinkerer's Workshop & Hercules Beetle & Necromantic Scroll) | (@calamity & Statis' Blessing); +Statis' Blessing; Calamity; (Hardmode Anvil & Papyrus Scarab & Pygmy Necklace & Emblem & Holy Water & Core of Sunlight) | Statis' Curse; Pumpking; Location | Item; Pumpkin Moon; The Horseman's Blade; ; #Pumpking; Baleful Harvest; Achievement; Pumpkin Moon; @@ -451,11 +579,11 @@ Ravager; Calamity | Location | Item; Fleshy Geode; Calamity; #Ravager; // Empress of Light -Empress of Light; Location | Item | Goal; Wall of Flesh & Hallow & (@calamity | Plantera); +Empress of Light; Location | Item | Goal; (Wall of Flesh & Hallow & (@calamity | Plantera)) | (@getfixedboi & @calamity & #Supreme Alchemist, Cirrus); # empress_of_light // Lunatic Cultist -Lunatic Cultist; Location | Item | Goal; (@calamity | (Dungeon & Golem)) & Wall of Flesh; +Lunatic Cultist; Location | Item | Goal; ((@calamity | (Dungeon & Golem)) & Wall of Flesh) | (@calamity & Calamitas Clone); Astrum Deus; Calamity | Location | Item | Goal; Titan Heart; # lunatic_cultist # astrum_deus @@ -463,111 +591,142 @@ Ancient Manipulator; ; // Lunar Events Lunar Events; Location | Item; #Lunatic Cultist; -Fragment; ; #Lunar Events | #Astrum Deus; -Galactica Singularity; Calamity; Ancient Manipulator & Fragment; -Meld Blob; Calamity; #Lunar Events | #Astrum Deus; -Meld Construct; Calamity; Ancient Manipulator & Meld Blob & Stardust; +Fragment; ; #Lunar Events | #Astrum Deus | (Ancient Manipulator & (Nebula Fragment | Stardust Fragment)) | (@calamity & Galactica Singularity); +Nebula Fragment; ; Fragment | (@calamity & Eye of Magnus); +Eye of Magnus; Calamity; (Ancient Manipulator & Lunic Eye & Nebula Fragment) | (@getfixedboi & #Wall of Flesh); +Stardust Fragment; ; Fragment | (@calamity & Statis' Curse); +Statis' Curse; Calamity; (Ancient Manipulator & Statis' Blessing & The First Shadowflame & Stardust Fragment) | Nucleogenesis; +Galactica Singularity; Calamity; (Ancient Manipulator & Fragment) | Elemental Gauntlet | Elemental Quiver | Nucleogenesis | Moonstone Crown | Ethereal Talisman; +Meld Blob; Calamity; #Lunar Events | #Astrum Deus | (Astral Infection & Astrum Deus) | Meld Construct; +Meld Construct; Calamity; (Ancient Manipulator & Meld Blob & Stardust) | Dark Matter Sheath; +Dark Matter Sheath; Calamity; (Ancient Manipulator & Silencing Sheath & Ruin Medallion & Meld Construct) | Eclipse Mirror; // Astrum Deus -Astral Ore; Calamity; Wall of Flesh & Astrum Deus; -Astral Bar; Calamity; Ancient Manipulator & Stardust & Astral Ore; +Astral Ore; Calamity; (Astral Infection & Astrum Deus) | Astral Bar; // No pick needed; you can fish it +Astral Bar; Calamity; (Ancient Manipulator & Stardust & Astral Ore) | (Astral Infection & Astrum Deus); Astral Hamaxe; Calamity | Hammer(100); Ancient Manipulator & Astral Bar; Astral Pickaxe; Calamity | Pickaxe(220); Ancient Manipulator & Astral Bar; +Astral Armor; Calamity | Armor Minions(3); Ancient Manipulator & Astral Bar & Meteorite Bar; // Moon Lord Moon Lord; Location | Item | Goal; #Lunar Events; # moon_lord Slayer of Worlds; Achievement; #Evil Boss & #The Destroyer & #Duke Fishron & #Eye of Cthulhu & #Golem & #King Slime & #Lunatic Cultist & #Moon Lord & #Plantera & #Queen Bee & #Skeletron & #Skeletron Prime & #The Twins & #Wall of Flesh; -Luminite; ; #Moon Lord; -Luminite Bar; ; Ancient Manipulator & Luminite; +Luminite; ; #Moon Lord | (@calamity & (Exodium Cluster | Asteroid Staff)) | Luminite Bar; +Luminite Bar; ; (Ancient Manipulator & Luminite) | (@calamity & (Elemental Gauntlet | Elemental Quiver | Nucleogenesis | Moonstone Crown | Ethereal Talisman)); Luminite Hamaxe; Hammer(100); Ancient Manipulator & Fragment & Luminite Bar; Luminite Pickaxe; Pickaxe(225); Ancient Manipulator & Fragment & Luminite Bar; Genesis Pickaxe; Calamity | Pickaxe(225); Ancient Manipulator & Meld Construct & Luminite Bar; -Stardust Armor; ArmorMinions(5); Ancient Manipulator & Fragment & Luminite Bar; +Stardust Armor; Armor Minions(5); Ancient Manipulator & Fragment & Luminite Bar; +Asteroid Staff; Calamity; (Ancient Manipulator & Meteor Staff & Luminite Bar) | (@getfixedboi & #Astrum Aureus); +Moonstone Crown; Calamity; (Ancient Manipulator & Feather Crown & Luminite Bar & Galactica Singularity) | Nanotech; Terrarian; ; #Moon Lord; Sick Throw; Achievement; Terrarian; Meowmere; ; #Moon Lord; Star Wrath; ; #Moon Lord; -Exodium Cluster; Calamity; Moon Lord & @pickaxe(225); +Exodium Cluster; Calamity; Moon Lord | Uelibloom Ore; // No pick needed; can be fished Normality Relocator; Calamity; Ancient Manipulator & Rod of Discord & Exodium Cluster & Fragment; -Unholy Essence; Calamity; Moon Lord | #Providence, the Profaned Goddess; -Phantoplasm; Calamity; Moon Lord & (Wall of Flesh | Dungeon); // TODO Check -Eldritch Soul Artifact; Calamity; Exodium Cluster & Navyplate & Phantoplasm; +Unholy Essence; Calamity; Moon Lord | #Providence, the Profaned Goddess | (Hallow & Providence, the Profaned Goddess) | (@getfixedboi & Plantera); +Polterplasm; Calamity; (Moon Lord & Wall of Flesh) | (Dungeon & (Polterghast | Moon Lord)) | #Polterghast; +Eldritch Soul Artifact; Calamity | Minions(1); Exodium Cluster & Navyplate & Polterplasm; // Profaned Guardians Profaned Guardians; Calamity | Location | Item; Ancient Manipulator & Unholy Essence & Luminite Bar; // Dragonfolly -The Dragonfolly; Calamity | Location | Item; Ancient Manipulator & Unholy Essence & Luminite Bar; -Effulgent Feather; Calamity; Moon Lord | #The Dragonfolly; +The Dragonfolly; Calamity | Location | Item; (Ancient Manipulator & Unholy Essence & Luminite Bar) | (@getfixedboi & #Supreme Alchemist, Cirrus); +Effulgent Feather; Calamity; Moon Lord | #The Dragonfolly | (@getfixedboi & #Yharon, Dragon of Rebirth); // Providence, the Profaned Goddess -Providence, the Profaned Goddess; Calamity | Location | Item | Goal; #Profaned Guardians; +Providence, the Profaned Goddess; Calamity | Location | Item | Goal; #Profaned Guardians | (@getfixedboi & #Supreme Alchemist, Cirrus); # providence_the_profaned_goddess -Divine Geode; Calamity; #Providence, the Profaned Goddess; +Divine Geode; Calamity; #Providence, the Profaned Goddess | (@getfixedboi & #Profaned Guardians); Profaned Soul Artifact; Calamity | Minions(1); Exodium Cluster & Havocplate & Divine Geode; Rune of Kos; Calamity; #Providence, the Profaned Goddess; -Uelibloom Ore; Calamity; Providence, the Profaned Goddess; -Uelibloom Bar; Calamity; Hardmode Forge & Uelibloom Ore; +Uelibloom Ore; Calamity; Providence, the Profaned Goddess | Auric Ore | Uelibloom Bar; +Uelibloom Bar; Calamity; (Hardmode Forge & Uelibloom Ore) | Providence, the Profaned Goddess; Grax; Calamity | Hammer(110); Ancient Manipulator & Inferna Cutter & Luminite Hamaxe & Uelibloom Bar; Blossom Pickaxe; Calamity | Pickaxe(250); Ancient Manipulator & Uelibloom Bar; Voltage Regulation System; Calamity; Ancient Manipulator & Mysterious Circuitry & Dubious Plating & Uelibloom Bar & Luminite Bar & Advanced Display; +Tarragon Armor; Calamity | Armor Minions(3); Ancient Manipulator & Uelibloom Bar & Divine Geode; Necromantic Geode; Calamity; #Ravager & Providence, the Profaned Goddess; +Bloodstone; Calamity; Providence, the Profaned Goddess; +Bloodstone Core; Calamity; Hardmode Forge & Bloodstone & Polterplasm; // Sentinels of the Devourer Storm Weaver; Calamity | Location | Item; Rune of Kos; Armored Shell; Calamity; #Storm Weaver; -Ceaseless Void; Calamity | Location | Item; Rune of Kos; +Ceaseless Void; Calamity | Location | Item; Dungeon & Rune of Kos; Dark Plasma; Calamity; #Ceaseless Void; Signus, Envoy of the Devourer; Calamity | Location | Item; Rune of Kos; Twisting Nether; Calamity; #Signus, Envoy of the Devourer; // Polterghast -Polterghast; Calamity | Location | Item; Dungeon & ((Ancient Manipulator & Phantoplasm) | Moon Lord); -Colossal Squid; Calamity | Location | Item; -Reaper Shark; Calamity | Location | Item; -Eidolon Wyrm; Calamity | Location | Item; +Polterghast; Calamity | Location | Item; Dungeon & ((Ancient Manipulator & Polterplasm) | Moon Lord); +Ruinous Soul; Calamity; #Polterghast; +Bloodflare Armor; Calamity | Armor Minions(3); Ancient Manipulator & Bloodstone Core & Ruinous Soul; +Reaper Tooth; Calamity; Polterghast; +Omega Blue Armor; Calamity | Armor Minions(2); Ancient Manipulator & Reaper Tooth & Depth Cells & Ruinous Soul; // The Old Duke -Mauler; Calamity | Location | Item; #Acid Rain Tier 3; -Nuclear Terror; Calamity | Location | Item; #Acid Rain Tier 3; -Acid Rain Tier 3; Calamity | Location | Item; #Acid Rain Tier 1 & Polterghast; // TODO Check -The Old Duke; Calamity | Location | Item; #Acid Rain Tier 3 | (Bug Net & Moon Lord) | (Amidias & The Old Duke); +Mauler; Calamity | Location | Item; Acid Rain Tier 3; +Nuclear Terror; Calamity | Location | Item; Acid Rain Tier 3; +Acid Rain Tier 3; Calamity; #Acid Rain Tier 1 & Polterghast; +The Old Duke; Calamity | Location | Item; Acid Rain Tier 3 | (Bug Net & Moon Lord) | (Amidias & The Old Duke) | (@getfixedboi & #The Destroyer); // The Devourer of Gods -The Devourer of Gods; Calamity | Location | Item | Goal; Ancient Manipulator & ((Armored Shell & Twisting Nether & Dark Plasma) | (Luminite Bar & Galactica Singularity & Phantoplasm)); +The Devourer of Gods; Calamity | Location | Item | Goal; (Ancient Manipulator & ((Armored Shell & Twisting Nether & Dark Plasma) | (Luminite Bar & Galactica Singularity & Polterplasm))) | (@getfixedboi & #Supreme Alchemist, Cirrus); # the_devourer_of_gods Cosmilite Bar; Calamity; #The Devourer of Gods; Cosmic Anvil; Calamity; Ancient Manipulator & Hardmode Anvil & Cosmilite Bar & Luminite Bar & Galactica Singularity & Exodium Cluster; -Nightmare Fuel; Calamity; Pumpkin Moon & The Devourer of Gods; +Nightmare Fuel; Calamity; (Pumpkin Moon & The Devourer of Gods) | Occult Skull Crown; +Occult Skull Crown; Calamity | Getfixedboi; @getfixedboi & #Evil Boss; // Revengeance or getfixedboi Endothermic Energy; Calamity; Frost Moon & The Devourer of Gods; -Darksun Fragment; Calamity; Solar Eclipse & The Devourer of Gods; +Darksun Fragment; Calamity; (Solar Eclipse & The Devourer of Gods) | Eclipse Mirror; Dark Sun Ring; Calamity; Cosmic Anvil & Uelibloom Bar & Darksun Fragment; -Ascendant Spirit Essence; Calamity; Ancient Manipulator & Phantoplasm & Nightmare Fuel & Endothermic Energy & Darksun Fragment; +Eclipse Mirror; Calamity; (Cosmic Anvil & Abyssal Mirror & Dark Matter Sheath & Darksun Fragment) | (@getfixedboi & #Ceaseless Void); +Ascendant Spirit Essence; Calamity; (Ancient Manipulator & Polterplasm & Nightmare Fuel & Endothermic Energy & Darksun Fragment) | (@getfixedboi & #Providence, the Profaned Goddess) | Elemental Gauntlet | Elemental Quiver | Nucleogenesis | Nanotech | Ethereal Talisman; +Fearmonger Armor; Calamity | Armor Minions(2); Cosmic Anvil & Spooky Armor & Cosmilite Bar & Soul of Fright & Ascendant Spirit Essence; +Silva Armor; Calamity | Armor Minions(5); Cosmic Anvil & Effulgent Feather & Ascendant Spirit Essence; +Elemental Gauntlet; Calamity; (Cosmic Anvil & Fire Gauntlet & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Storm Weaver); +Elemental Quiver; Calamity; (Cosmic Anvil & Magic Quiver & Deadshot Brooch & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Storm Weaver); +Nucleogenesis; Calamity; (Cosmic Anvil & Star-Tainted Generator & Statis' Curse & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Ceaseless Void); +Nanotech; Calamity; (Emblem & Raider's Talisman & Moonstone Crown & Electrician's Glove & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Signus, Envoy of the Devourer); +Ethereal Talisman; Calamity; (Cosmic Anvil & Sigil of Calamitas & Mana Flower & Luminite Bar & Galactica Singularity & Ascendant Spirit Essence) | (@getfixedboi & #Signus, Envoy of the Devourer); // Yharon, Dragon of Rebirth Yharon, Dragon of Rebirth; Calamity | Location | Item | Goal; Ancient Manipulator & Effulgent Feather & Life Alloy; # yharon_dragon_of_rebirth -Yharon Soul Fragment; Calamity; #Yharon, Dragon of Rebirth; -Auric Ore; Calamity; Yharon, Dragon of Rebirth & @pickaxe(250); -Auric Bar; Calamity; Cosmic Anvil & Auric Ore & Yharon Soul Fragment; -Zenith; Location | Item(Has Zenith) | Goal; Hardmode Anvil & Terra Blade & Meowmere & Star Wrath & Influx Waver & The Horseman's Blade & Seedler & Starfury & Bee Keeper & Enchanted Sword & Copper Shortsword & (~@calamity | Auric Bar); +Yharon Soul Fragment; Calamity; #Yharon, Dragon of Rebirth | The Wand | Auric Bar; +The Wand; Calamity; (Cosmic Anvil & Wand of Sparking & Yharon Soul Fragment) | (@getfixedboi & #The Devourer of Gods); +Auric Ore; Calamity; (Yharon, Dragon of Rebirth & (@pickaxe(250) | Wall of Flesh)) | Auric Bar; +Auric Bar; Calamity; (Cosmic Anvil & Auric Ore & Yharon Soul Fragment) | Shadowspec Bar; +Auric Tesla Armor; Calamity | Armor Minions(6); Cosmic Anvil & Silva Armor & Bloodflare Armor & Tarragon Armor & Auric Bar; +Infinity +1 Sword; Achievement | Grindy | Item(Has Zenith) | Goal(zenith); Hardmode Anvil & Terra Blade & Meowmere & Star Wrath & Influx Waver & The Horseman's Blade & Seedler & Starfury & Bee Keeper & Enchanted Sword & Copper Shortsword & (~@calamity | Auric Bar); # zenith // Exo Mechs Auric Quantum Cooling Cell; Calamity; Cosmic Anvil & Auric Bar & Mysterious Circuitry & Dubious Plating & Endothermic Energy & Core of Eleum & Voltage Regulation System; Exo Mechs; Calamity | Location | Item | Final Boss; Codebreaker Base & Decryption Computer & Auric Quantum Cooling Cell; -Supreme Witch, Calamitas; Calamity | Location | Item | Final Boss; Cosmic Anvil & Brimstone Slag & Auric Bar & Core of Calamity & Ashes of Calamity; +// XB-Infinity Hekate; Getfixedboi | Calamity; Codebreaker Base & Decryption Computer & Auric Quantum Cooling Cell & Blood Sample; // Currently, this boss doesn't affect logic at all +Supreme Witch, Calamitas; Calamity | Location | Item | Final Boss; (Cosmic Anvil & Brimstone Slag & Auric Bar & Core of Calamity & Ashes of Calamity) | (@getfixedboi & #Supreme Alchemist, Cirrus); +Supreme Alchemist, Cirrus; Getfixedboi | Calamity; Cosmic Anvil & Brimstone Slag & Auric Bar & Core of Calamity & Fabsol's Vodka; +THE LORDE; Getfixedboi | Calamity; Lihzahrd Temple; # calamity_final_bosses -Exo Prism; Calamity; #Exo Mechs; +Exo Prism; Calamity; #Exo Mechs | Shadowspec Bar; Draedon's Forge; Calamity; Cosmic Anvil & Hardmode Forge & Tinkerer's Workshop & Ancient Manipulator & Auric Bar & Exo Prism & Ascendant Spirit Essence; // Supreme Witch, Calamitas -Ashes of Annihilation; Calamity; #Supreme Witch, Calamitas; +Ashes of Annihilation; Calamity; #Supreme Witch, Calamitas | (@getfixedboi & #Calamitas Clone) | Shadowspec Bar; Shadowspec Bar; Calamity; Draedon's Forge & Auric Bar & Exo Prism & Ashes of Annihilation; Crystyl Crusher; Calamity | Pickaxe(1000); Draedon's Forge & Luminite Pickaxe & Blossom Pickaxe & Shadowspec Bar; Angelic Alliance; Calamity | Minions(2); Draedon's Forge & Hallowed Armor & Paladin's Shield & True Excalibur & Cross Necklace & Shadowspec Bar; +Demonshade Armor; Calamity | Armor Minions(10); Draedon's Forge & Shadowspec Bar; -// Adult Eidolon Wyrm; -Adult Eidolon Wyrm; Calamity | Location | Item | Goal; Rod of Discord | Normality Relocator; -# adult_eidolon_wyrm +// Primordial Wyrm +Primordial Wyrm; Calamity | Location | Item | Goal; Rod of Discord | Normality Relocator; +# primordial_wyrm + +// Boss Rush +Boss Rush; Calamity | Location | Item | Goal; Diving Gear | Neptune's Shell | (Aquatic Heart & Skeletron); // Might be obtainable earlier with Midas' Blessing +# boss_rush diff --git a/worlds/terraria/__init__.py b/worlds/terraria/__init__.py index abc10a7bb3..20f56c8f63 100644 --- a/worlds/terraria/__init__.py +++ b/worlds/terraria/__init__.py @@ -1,11 +1,13 @@ # Look at `Rules.dsv` first to get an idea for how this works +import logging from typing import Union, Tuple, List, Dict, Set from worlds.AutoWorld import WebWorld, World from BaseClasses import Region, ItemClassification, Tutorial, CollectionState from .Checks import ( TerrariaItem, TerrariaLocation, + Condition, goals, rules, rule_indices, @@ -25,7 +27,7 @@ from .Checks import ( armor_minions, accessory_minions, ) -from .Options import TerrariaOptions +from .Options import TerrariaOptions, Goal class TerrariaWeb(WebWorld): @@ -55,8 +57,8 @@ class TerrariaWorld(World): item_name_to_id = item_name_to_id location_name_to_id = location_name_to_id - # Turn into an option when calamity is supported in the mod calamity = False + getfixedboi = False ter_items: List[str] ter_locations: List[str] @@ -70,72 +72,100 @@ class TerrariaWorld(World): ter_goals = {} goal_items = set() for location in goal_locations: - _, flags, _, _ = rules[rule_indices[location]] + flags = rules[rule_indices[location]].flags + if not self.options.calamity.value and "Calamity" in flags: + logging.warning( + f"Terraria goal `{Goal.name_lookup[self.options.goal.value]}`, which requires Calamity, was selected with Calamity disabled; enabling Calamity" + ) + self.options.calamity.value = True + item = flags.get("Item") or f"Post-{location}" ter_goals[item] = location goal_items.add(item) - achievements = self.options.achievements.value location_count = 0 locations = [] - for rule, flags, _, _ in rules[:goal]: - if ( - (not self.calamity and "Calamity" in flags) - or (achievements < 1 and "Achievement" in flags) - or (achievements < 2 and "Grindy" in flags) - or (achievements < 3 and "Fishing" in flags) - or ( - rule == "Zenith" and self.options.goal.value != 11 - ) # Bad hardcoding - ): - continue - if "Location" in flags or ("Achievement" in flags and achievements >= 1): - # Location - location_count += 1 - locations.append(rule) - elif ( - "Achievement" not in flags - and "Location" not in flags - and "Item" not in flags - ): - # Event - locations.append(rule) - item_count = 0 items = [] - for rule, flags, _, _ in rules[:goal]: - if not self.calamity and "Calamity" in flags: + for rule in rules[:goal]: + early = "Early" in rule.flags + grindy = "Grindy" in rule.flags + fishing = "Fishing" in rule.flags + + if ( + (not self.options.getfixedboi.value and "Getfixedboi" in rule.flags) + or (self.options.getfixedboi.value and "Not Getfixedboi" in rule.flags) + or (not self.options.calamity.value and "Calamity" in rule.flags) + or (self.options.calamity.value and "Not Calamity" in rule.flags) + or ( + self.options.getfixedboi.value + and self.options.calamity.value + and "Not Calamity Getfixedboi" in rule.flags + ) + or (not self.options.early_achievements.value and early) + or ( + not self.options.normal_achievements.value + and "Achievement" in rule.flags + and not early + and not grindy + and not fishing + ) + or (not self.options.grindy_achievements.value and grindy) + or (not self.options.fishing_achievements.value and fishing) + ) and rule.name not in goal_locations: continue - if "Item" in flags: - # Item - item_count += 1 - if rule not in goal_locations: - items.append(rule) + + if "Location" in rule.flags or "Achievement" in rule.flags: + # Location + location_count += 1 + locations.append(rule.name) elif ( - "Achievement" not in flags - and "Location" not in flags - and "Item" not in flags + "Achievement" not in rule.flags + and "Location" not in rule.flags + and "Item" not in rule.flags ): # Event - items.append(rule) + locations.append(rule.name) + + if "Item" in rule.flags and not ( + "Achievement" in rule.flags and rule.name not in goal_locations + ): + # Item + item_count += 1 + if rule.name not in goal_locations: + items.append(rule.name) + elif ( + "Achievement" not in rule.flags + and "Location" not in rule.flags + and "Item" not in rule.flags + ): + # Event + items.append(rule.name) - extra_checks = self.options.fill_extra_checks_with.value ordered_rewards = [ reward for reward in labels["ordered"] - if self.calamity or "Calamity" not in rewards[reward] + if self.options.calamity.value or "Calamity" not in rewards[reward] ] - while extra_checks == 1 and item_count < location_count and ordered_rewards: + while ( + self.options.fill_extra_checks_with.value == 1 + and item_count < location_count + and ordered_rewards + ): items.append(ordered_rewards.pop(0)) item_count += 1 random_rewards = [ reward for reward in labels["random"] - if self.calamity or "Calamity" not in rewards[reward] + if self.options.calamity.value or "Calamity" not in rewards[reward] ] self.multiworld.random.shuffle(random_rewards) - while extra_checks == 1 and item_count < location_count and random_rewards: + while ( + self.options.fill_extra_checks_with.value == 1 + and item_count < location_count + and random_rewards + ): items.append(random_rewards.pop(0)) item_count += 1 @@ -173,9 +203,9 @@ class TerrariaWorld(World): def create_items(self) -> None: for item in self.ter_items: if (rule_index := rule_indices.get(item)) is not None: - _, flags, _, _ = rules[rule_index] - if "Item" in flags: - name = flags.get("Item") or f"Post-{item}" + rule = rules[rule_index] + if "Item" in rule.flags: + name = rule.flags.get("Item") or f"Post-{item}" else: continue else: @@ -186,8 +216,8 @@ class TerrariaWorld(World): locked_items = {} for location in self.ter_locations: - _, flags, _, _ = rules[rule_indices[location]] - if "Location" not in flags and "Achievement" not in flags: + rule = rules[rule_indices[location]] + if "Location" not in rule.flags and "Achievement" not in rule.flags: if location in progression: classification = ItemClassification.progression else: @@ -202,95 +232,92 @@ class TerrariaWorld(World): for location, item in locked_items.items(): self.multiworld.get_location(location, self.player).place_locked_item(item) - def check_condition( - self, - state, - sign: bool, - ty: int, - condition: Union[str, Tuple[Union[bool, None], list]], - arg: Union[str, int, None], - ) -> bool: - if ty == COND_ITEM: - _, flags, _, _ = rules[rule_indices[condition]] - if "Item" in flags: - name = flags.get("Item") or f"Post-{condition}" + def check_condition(self, state, condition: Condition) -> bool: + if condition.type == COND_ITEM: + rule = rules[rule_indices[condition.condition]] + if "Item" in rule.flags: + name = rule.flags.get("Item") or f"Post-{condition.condition}" else: - name = condition + name = condition.condition - return sign == state.has(name, self.player) - elif ty == COND_LOC: - _, _, operator, conditions = rules[rule_indices[condition]] - return sign == self.check_conditions(state, operator, conditions) - elif ty == COND_FN: - if condition == "npc": - if type(arg) is not int: + return condition.sign == state.has(name, self.player) + elif condition.type == COND_LOC: + rule = rules[rule_indices[condition.condition]] + return condition.sign == self.check_conditions( + state, rule.operator, rule.conditions + ) + elif condition.type == COND_FN: + if condition.condition == "npc": + if type(condition.argument) is not int: raise Exception("@npc requires an integer argument") npc_count = 0 for npc in npcs: if state.has(npc, self.player): npc_count += 1 - if npc_count >= arg: - return sign + if npc_count >= condition.argument: + return condition.sign - return not sign - elif condition == "calamity": - return sign == self.calamity - elif condition == "grindy": - return sign == (self.options.achievements.value >= 2) - elif condition == "pickaxe": - if type(arg) is not int: + return not condition.sign + elif condition.condition == "calamity": + return condition.sign == self.options.calamity.value + elif condition.condition == "grindy": + return condition.sign == self.options.grindy_achievements.value + elif condition.condition == "pickaxe": + if type(condition.argument) is not int: raise Exception("@pickaxe requires an integer argument") for pickaxe, power in pickaxes.items(): - if power >= arg and state.has(pickaxe, self.player): - return sign + if power >= condition.argument and state.has(pickaxe, self.player): + return condition.sign - return not sign - elif condition == "hammer": - if type(arg) is not int: + return not condition.sign + elif condition.condition == "hammer": + if type(condition.argument) is not int: raise Exception("@hammer requires an integer argument") for hammer, power in hammers.items(): - if power >= arg and state.has(hammer, self.player): - return sign + if power >= condition.argument and state.has(hammer, self.player): + return condition.sign - return not sign - elif condition == "mech_boss": - if type(arg) is not int: + return not condition.sign + elif condition.condition == "mech_boss": + if type(condition.argument) is not int: raise Exception("@mech_boss requires an integer argument") boss_count = 0 for boss in mech_bosses: if state.has(boss, self.player): boss_count += 1 - if boss_count >= arg: - return sign + if boss_count >= condition.argument: + return condition.sign - return not sign - elif condition == "minions": - if type(arg) is not int: + return not condition.sign + elif condition.condition == "minions": + if type(condition.argument) is not int: raise Exception("@minions requires an integer argument") minion_count = 1 for armor, minions in armor_minions.items(): if state.has(armor, self.player) and minions + 1 > minion_count: minion_count = minions + 1 - if minion_count >= arg: - return sign + if minion_count >= condition.argument: + return condition.sign for accessory, minions in accessory_minions.items(): if state.has(accessory, self.player): minion_count += minions - if minion_count >= arg: - return sign + if minion_count >= condition.argument: + return condition.sign - return not sign + return not condition.sign + elif condition.condition == "getfixedboi": + return condition.sign == self.options.getfixedboi.value else: - raise Exception(f"Unknown function {condition}") - elif ty == COND_GROUP: - operator, conditions = condition - return sign == self.check_conditions(state, operator, conditions) + raise Exception(f"Unknown function {condition.condition}") + elif condition.type == COND_GROUP: + operator, conditions = condition.condition + return condition.sign == self.check_conditions(state, operator, conditions) def check_conditions( self, @@ -310,22 +337,22 @@ class TerrariaWorld(World): return True if len(conditions) > 1: raise Exception("Found multiple conditions without an operator") - return self.check_condition(state, *conditions[0]) + return self.check_condition(state, conditions[0]) elif operator: return any( - self.check_condition(state, *condition) for condition in conditions + self.check_condition(state, condition) for condition in conditions ) else: return all( - self.check_condition(state, *condition) for condition in conditions + self.check_condition(state, condition) for condition in conditions ) def set_rules(self) -> None: for location in self.ter_locations: def check(state: CollectionState, location=location): - _, _, operator, conditions = rules[rule_indices[location]] - return self.check_conditions(state, operator, conditions) + rule = rules[rule_indices[location]] + return self.check_conditions(state, rule.operator, rule.conditions) self.multiworld.get_location(location, self.player).access_rule = check @@ -336,6 +363,12 @@ class TerrariaWorld(World): def fill_slot_data(self) -> Dict[str, object]: return { "goal": list(self.goal_locations), - "achievements": self.options.achievements.value, "deathlink": bool(self.options.death_link), + # The rest of these are included for trackers + "calamity": self.options.calamity.value, + "getfixedboi": self.options.getfixedboi.value, + "early_achievements": self.options.early_achievements.value, + "normal_achievements": self.options.normal_achievements.value, + "grindy_achievements": self.options.grindy_achievements.value, + "fishing_achievements": self.options.fishing_achievements.value, } From 125bf6f2702d9e7e8348c58dea639125a7778213 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Tue, 15 Apr 2025 17:09:27 -0500 Subject: [PATCH 218/227] Core: Post-KivyMD cleanup 2 and enhancements (#4876) * Adds a new class allowing TextFields to be resized * Resizes most CommonClient components to be more in-line with pre-KivyMD * Change the color of SelectableLabels and TooltipLabels to white * Fixed ClientTabs not correctly showing the current tab indicator * The server label now features a (i) icon to indicate that it can be hovered over. * Changed the default `primary_palette` to `Lightsteelblue` and the default `dynamic_scheme_name` to `VIBRANT` * Properly set attributes on `KivyJSONToTextParser.TextColors` so that proper typing can be utilized if an individual value is needed * Fixed some buttons being discolored permanently once pressed * Sped up the animations of button ripples and tab switching * Added the ability to insert a new tab to `GameManager.add_client_tab` * Hovering over the "Command" button in CommonClient will now display the contents of `/help` as a popup (note: this popup can be too large on default height for adequately large /help (SC2 Client), but should always fit fine on fullscreen). * Fixed invalid sizing of MessageBox errors, and changed their text color to white --- Launcher.py | 5 ++ data/client.kv | 41 ++++++++-- data/launcher.kv | 7 +- kvui.py | 197 ++++++++++++++++++++++++++++++++++++----------- 4 files changed, 198 insertions(+), 52 deletions(-) diff --git a/Launcher.py b/Launcher.py index d636ceab74..29bd71764e 100644 --- a/Launcher.py +++ b/Launcher.py @@ -359,6 +359,11 @@ def run_gui(path: str, args: Any) -> None: self._refresh_components(self.current_filter) + # Uncomment to re-enable the Kivy console/live editor + # Ctrl-E to enable it, make sure numlock/capslock is disabled + # from kivy.modules.console import create_console + # create_console(Window, self.top_screen) + return self.top_screen def on_start(self): diff --git a/data/client.kv b/data/client.kv index ac0a45023c..562986cd17 100644 --- a/data/client.kv +++ b/data/client.kv @@ -16,21 +16,30 @@ orange: "FF7700" # Used for command echo # KivyMD theming parameters theme_style: "Dark" # Light/Dark - primary_palette: "Green" # Many options - dynamic_scheme_name: "TONAL_SPOT" + primary_palette: "Lightsteelblue" # Many options + dynamic_scheme_name: "VIBRANT" dynamic_scheme_contrast: 0.0 : color: self.theme_cls.primaryColor +: + ripple_color: app.theme_cls.primaryColor + ripple_duration_in_fast: 0.2 +: + ripple_color: app.theme_cls.primaryColor + ripple_duration_in_fast: 0.2 : adaptive_height: True - font_size: dp(20) + theme_font_size: "Custom" + font_size: "20dp" markup: True halign: "left" : size_hint: 1, None + theme_text_color: "Custom" + text_color: 1, 1, 1, 1 canvas.before: Color: - rgba: (.0, 0.9, .1, .3) if self.selected else self.theme_cls.surfaceContainerLowColor + rgba: (self.theme_cls.primaryColor[0], self.theme_cls.primaryColor[1], self.theme_cls.primaryColor[2], .3) if self.selected else self.theme_cls.surfaceContainerLowestColor Rectangle: size: self.size pos: self.pos @@ -154,9 +163,12 @@ : size: self.texture_size size_hint: None, None + theme_font_size: "Custom" font_size: dp(18) pos_hint: {'center_y': 0.5, 'center_x': 0.5} halign: "left" + theme_text_color: "Custom" + text_color: (1, 1, 1, 1) canvas.before: Color: rgba: 0.2, 0.2, 0.2, 1 @@ -175,11 +187,28 @@ rectangle: self.x-2, self.y-2, self.width+4, self.height+4 : pos_hint: {'center_y': 0.5, 'center_x': 0.5} - +: size_hint_y: None - height: dp(30) + height: "30dp" multiline: False write_tab: False + pos_hint: {"center_x": 0.5, "center_y": 0.5} +: + height: "30dp" + multiline: False + write_tab: False + role: "medium" + size_hint_y: None + pos_hint: {"center_x": 0.5, "center_y": 0.5} +: + size_hint_y: None + height: "30dp" + multiline: False + write_tab: False + pos_hint: {"center_x": 0.5, "center_y": 0.5} +: + theme_text_color: "Custom" + text_color: 1, 1, 1, 1 : layout: layout bar_width: "12dp" diff --git a/data/launcher.kv b/data/launcher.kv index 03e1c3e078..8c6a8288e4 100644 --- a/data/launcher.kv +++ b/data/launcher.kv @@ -5,12 +5,13 @@ size_hint: 1, None height: "75dp" context_button: context + focus_behavior: False MDRelativeLayout: ApAsyncImage: source: main.image size: (48, 48) - size_hint_y: None + size_hint: None, None pos_hint: {"center_x": 0.1, "center_y": 0.5} MDLabel: @@ -37,6 +38,7 @@ pos_hint:{"center_x": 0.85, "center_y": 0.8} theme_text_color: "Custom" text_color: app.theme_cls.primaryColor + detect_visible: False on_release: app.set_favorite(self) MDIconButton: @@ -46,6 +48,7 @@ pos_hint:{"center_x": 0.95, "center_y": 0.8} theme_text_color: "Custom" text_color: app.theme_cls.primaryColor + detect_visible: False MDButton: pos_hint:{"center_x": 0.9, "center_y": 0.25} @@ -53,7 +56,7 @@ height: "25dp" component: main.component on_release: app.component_action(self) - + detect_visible: False MDButtonText: text: "Open" diff --git a/kvui.py b/kvui.py index 81e3876fe5..9a8b7109fa 100644 --- a/kvui.py +++ b/kvui.py @@ -43,8 +43,8 @@ from kivy.core.image import ImageLoader, ImageLoaderBase, ImageData from kivy.base import ExceptionHandler, ExceptionManager from kivy.clock import Clock from kivy.factory import Factory -from kivy.properties import BooleanProperty, ObjectProperty, NumericProperty -from kivy.metrics import dp +from kivy.properties import BooleanProperty, ObjectProperty, NumericProperty, StringProperty +from kivy.metrics import dp, sp from kivy.uix.widget import Widget from kivy.uix.layout import Layout from kivy.utils import escape_markup @@ -60,7 +60,7 @@ from kivymd.app import MDApp from kivymd.uix.gridlayout import MDGridLayout from kivymd.uix.floatlayout import MDFloatLayout from kivymd.uix.boxlayout import MDBoxLayout -from kivymd.uix.tab.tab import MDTabsPrimary, MDTabsItem, MDTabsItemText, MDTabsCarousel +from kivymd.uix.tab.tab import MDTabsSecondary, MDTabsItem, MDTabsItemText, MDTabsCarousel from kivymd.uix.menu import MDDropdownMenu from kivymd.uix.menu.menu import MDDropdownTextItem from kivymd.uix.dropdownitem import MDDropDownItem, MDDropDownItemText @@ -90,10 +90,10 @@ remove_between_brackets = re.compile(r"\[.*?]") class ThemedApp(MDApp): def set_colors(self): text_colors = KivyJSONtoTextParser.TextColors() - self.theme_cls.theme_style = getattr(text_colors, "theme_style", "Dark") - self.theme_cls.primary_palette = getattr(text_colors, "primary_palette", "Green") - self.theme_cls.dynamic_scheme_name = getattr(text_colors, "dynamic_scheme_name", "TONAL_SPOT") - self.theme_cls.dynamic_scheme_contrast = getattr(text_colors, "dynamic_scheme_contrast", 0.0) + self.theme_cls.theme_style = text_colors.theme_style + self.theme_cls.primary_palette = text_colors.primary_palette + self.theme_cls.dynamic_scheme_name = text_colors.dynamic_scheme_name + self.theme_cls.dynamic_scheme_contrast = text_colors.dynamic_scheme_contrast class ImageIcon(MDButtonIcon, AsyncImage): @@ -166,6 +166,32 @@ class ToggleButton(MDButton, ToggleButtonBehavior): child.icon_color = self.theme_cls.primaryColor +# thanks kivymd +class ResizableTextField(MDTextField): + """ + Resizable MDTextField that manually overrides the builtin sizing. + + Note that in order to use this, the sizing must be specified from within a .kv rule. + """ + def __init__(self, *args, **kwargs): + # cursed rules override + rules = Builder.match(self) + textfield = next((rule for rule in rules if rule.name == f""), None) + if textfield: + subclasses = rules[rules.index(textfield) + 1:] + for subclass in subclasses: + height_rule = subclass.properties.get("height", None) + if height_rule: + height_rule.ignore_prev = True + super().__init__(args, kwargs) + + +def on_release(self: MDButton, *args): + super(MDButton, self).on_release(args) + self.on_leave() + +MDButton.on_release = on_release + # I was surprised to find this didn't already exist in kivy :( class HoverBehavior(object): """originally from https://stackoverflow.com/a/605348110""" @@ -266,11 +292,15 @@ class TooltipLabel(HovererableLabel, MDTooltip): self._tooltip = None -class ServerLabel(HovererableLabel, MDTooltip): +class ServerLabel(HoverBehavior, MDTooltip, MDBoxLayout): tooltip_display_delay = 0.1 + text: str = StringProperty("Server:") def __init__(self, *args, **kwargs): - super(HovererableLabel, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) + self.add_widget(MDIcon(icon="information", font_size=sp(15))) + self.add_widget(TooltipLabel(text=self.text, pos_hint={"center_x": 0.5, "center_y": 0.5}, + font_size=sp(15))) self._tooltip = ServerToolTip(text="Test") def on_enter(self): @@ -383,7 +413,6 @@ class MarkupDropdownTextItem(MDDropdownTextItem): for child in self.children: if child.__class__ == MDLabel: child.markup = True - print(self.text) # Currently, this only lets us do markup on text that does not have any icons # Create new TextItems as needed @@ -461,14 +490,13 @@ class MarkupDropdown(MDDropdownMenu): self.menu.data = self._items -class AutocompleteHintInput(MDTextField): +class AutocompleteHintInput(ResizableTextField): min_chars = NumericProperty(3) def __init__(self, **kwargs): super().__init__(**kwargs) - self.dropdown = MarkupDropdown(caller=self, position="bottom", border_margin=dp(24), width=self.width) - self.dropdown.bind(on_select=lambda instance, x: setattr(self, 'text', x)) + self.dropdown = MarkupDropdown(caller=self, position="bottom", border_margin=dp(2), width=self.width) self.bind(on_text_validate=self.on_message) self.bind(width=lambda instance, x: setattr(self.dropdown, "width", x)) @@ -485,8 +513,11 @@ class AutocompleteHintInput(MDTextField): def on_press(text): split_text = MarkupLabel(text=text).markup - return self.dropdown.select("".join(text_frag for text_frag in split_text - if not text_frag.startswith("["))) + self.set_text(self, "".join(text_frag for text_frag in split_text + if not text_frag.startswith("["))) + self.dropdown.dismiss() + self.focus = True + lowered = value.lower() for item_name in item_names: try: @@ -498,7 +529,7 @@ class AutocompleteHintInput(MDTextField): text = text[:index] + "[b]" + text[index:index+len(value)]+"[/b]"+text[index+len(value):] self.dropdown.items.append({ "text": text, - "on_release": lambda: on_press(text), + "on_release": lambda txt=text: on_press(txt), "markup": True }) if not self.dropdown.parent: @@ -620,7 +651,7 @@ class HintLabel(RecycleDataViewBehavior, MDBoxLayout): self.selected = is_selected -class ConnectBarTextInput(MDTextField): +class ConnectBarTextInput(ResizableTextField): def insert_text(self, substring, from_undo=False): s = substring.replace("\n", "").replace("\r", "") return super(ConnectBarTextInput, self).insert_text(s, from_undo=from_undo) @@ -630,14 +661,14 @@ def is_command_input(string: str) -> bool: return len(string) > 0 and string[0] in "/!" -class CommandPromptTextInput(MDTextField): +class CommandPromptTextInput(ResizableTextField): MAXIMUM_HISTORY_MESSAGES = 50 def __init__(self, **kwargs) -> None: super().__init__(**kwargs) self._command_history_index = -1 self._command_history: typing.Deque[str] = deque(maxlen=CommandPromptTextInput.MAXIMUM_HISTORY_MESSAGES) - + def update_history(self, new_entry: str) -> None: self._command_history_index = -1 if is_command_input(new_entry): @@ -664,7 +695,7 @@ class CommandPromptTextInput(MDTextField): self._change_to_history_text_if_available(self._command_history_index - 1) return True return super().keyboard_on_key_down(window, keycode, text, modifiers) - + def _change_to_history_text_if_available(self, new_index: int) -> None: if new_index < -1: return @@ -682,29 +713,61 @@ class MessageBox(Popup): def __init__(self, **kwargs): super().__init__(**kwargs) self._label.refresh() - self.size = self._label.texture.size - if self.width + 50 > Window.width: - self.text_size[0] = Window.width - 50 - self._label.refresh() - self.size = self._label.texture.size def __init__(self, title, text, error=False, **kwargs): label = MessageBox.MessageBoxLabel(text=text) separator_color = [217 / 255, 129 / 255, 122 / 255, 1.] if error else [47 / 255., 167 / 255., 212 / 255, 1.] - super().__init__(title=title, content=label, size_hint=(None, None), width=max(100, int(label.width) + 40), + super().__init__(title=title, content=label, size_hint=(0.5, None), width=max(100, int(label.width) + 40), separator_color=separator_color, **kwargs) self.height += max(0, label.height - 18) -class ClientTabs(MDTabsPrimary): +class ClientTabs(MDTabsSecondary): carousel: MDTabsCarousel lock_swiping = True def __init__(self, *args, **kwargs): - self.carousel = MDTabsCarousel(lock_swiping=True) - super().__init__(*args, MDDivider(size_hint_y=None, height=dp(4)), self.carousel, **kwargs) + self.carousel = MDTabsCarousel(lock_swiping=True, anim_move_duration=0.2) + super().__init__(*args, MDDivider(size_hint_y=None, height=dp(1)), self.carousel, **kwargs) self.size_hint_y = 1 + def _check_panel_height(self, *args): + self.ids.tab_scroll.height = dp(38) + + def update_indicator( + self, x: float = 0.0, w: float = 0.0, instance: MDTabsItem = None + ) -> None: + def update_indicator(*args): + indicator_pos = (0, 0) + indicator_size = (0, 0) + + item_text_object = self._get_tab_item_text_icon_object() + + if item_text_object: + indicator_pos = ( + instance.x + dp(12), + self.indicator.pos[1] + if not self._tabs_carousel + else self._tabs_carousel.height, + ) + indicator_size = ( + instance.width - dp(24), + self.indicator_height, + ) + + Animation( + pos=indicator_pos, + size=indicator_size, + d=0 if not self.indicator_anim else self.indicator_duration, + t=self.indicator_transition, + ).start(self.indicator) + + if not instance: + self.indicator.pos = (x, self.indicator.pos[1]) + self.indicator.size = (w, self.indicator_height) + else: + Clock.schedule_once(update_indicator) + def remove_tab(self, tab, content=None): if content is None: content = tab.content @@ -713,6 +776,21 @@ class ClientTabs(MDTabsPrimary): self.on_size(self, self.size) +class CommandButton(MDButton, MDTooltip): + def __init__(self, *args, manager: "GameManager", **kwargs): + super().__init__(*args, **kwargs) + self.manager = manager + self._tooltip = ToolTip(text="Test") + + def on_enter(self): + self._tooltip.text = self.manager.commandprocessor.get_help_text() + self._tooltip.font_size = dp(20 - (len(self._tooltip.text) // 400)) # mostly guessing on the numbers here + self.display_tooltip() + + def on_leave(self): + self.animation_tooltip_dismiss() + + class GameManager(ThemedApp): logging_pairs = [ ("Client", "Archipelago"), @@ -767,19 +845,19 @@ class GameManager(ThemedApp): self.grid = MainLayout() self.grid.cols = 1 - self.connect_layout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(70), + self.connect_layout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(40), spacing=5, padding=(5, 10)) # top part - server_label = ServerLabel(halign="center") + server_label = ServerLabel(width=dp(75)) self.connect_layout.add_widget(server_label) self.server_connect_bar = ConnectBarTextInput(text=self.ctx.suggested_address or "archipelago.gg:", - size_hint_y=None, role="medium", - height=dp(70), multiline=False, write_tab=False) + pos_hint={"center_x": 0.5, "center_y": 0.5}) def connect_bar_validate(sender): if not self.ctx.server: self.connect_button_action(sender) + self.server_connect_bar.height = dp(30) self.server_connect_bar.bind(on_text_validate=connect_bar_validate) self.connect_layout.add_widget(self.server_connect_bar) self.server_connect_button = MDButton(MDButtonText(text="Connect"), style="filled", size=(dp(100), dp(70)), @@ -792,7 +870,7 @@ class GameManager(ThemedApp): self.grid.add_widget(self.progressbar) # middle part - self.tabs = ClientTabs() + self.tabs = ClientTabs(pos_hint={"center_x": 0.5, "center_y": 0.5}) self.tabs.add_widget(MDTabsItem(MDTabsItemText(text="All" if len(self.logging_pairs) > 1 else "Archipelago"))) self.log_panels["All"] = self.tabs.default_tab_content = UILog(*(logging.getLogger(logger_name) for logger_name, name in @@ -820,9 +898,10 @@ class GameManager(ThemedApp): self.grid.add_widget(self.main_area_container) # bottom part - bottom_layout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(70), spacing=5, padding=(5, 10)) - info_button = MDButton(MDButtonText(text="Command:"), radius=5, style="filled", size=(dp(100), dp(70)), - size_hint_x=None, size_hint_y=None, pos_hint={"center_y": 0.575}) + bottom_layout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(40), spacing=5, padding=(5, 10)) + info_button = CommandButton(MDButtonText(text="Command:", halign="left"), manager=self, radius=5, + style="filled", size=(dp(100), dp(70)), size_hint_x=None, size_hint_y=None, + pos_hint={"center_y": 0.575}) info_button.bind(on_release=self.command_button_action) bottom_layout.add_widget(info_button) self.textinput = CommandPromptTextInput(size_hint_y=None, height=dp(30), multiline=False, write_tab=False) @@ -843,15 +922,27 @@ class GameManager(ThemedApp): self.server_connect_bar.focus = True self.server_connect_bar.select_text(port_start if port_start > 0 else host_start, len(s)) + # Uncomment to enable the kivy live editor console + # Press Ctrl-E (with numlock/capslock) disabled to open + # from kivy.core.window import Window + # from kivy.modules import console + # console.create_console(Window, self.container) + return self.container - def add_client_tab(self, title: str, content: Widget) -> Widget: + def add_client_tab(self, title: str, content: Widget, index: int = -1) -> Widget: """Adds a new tab to the client window with a given title, and provides a given Widget as its content. Returns the new tab widget, with the provided content being placed on the tab as content.""" new_tab = MDTabsItem(MDTabsItemText(text=title)) new_tab.content = content - self.tabs.add_widget(new_tab) - self.tabs.carousel.add_widget(new_tab.content) + if -1 < index <= len(self.tabs.carousel.slides): + new_tab.bind(on_release=self.tabs.set_active_item) + new_tab._tabs = self.tabs + self.tabs.ids.container.add_widget(new_tab, index=index) + self.tabs.carousel.add_widget(new_tab.content, index=len(self.tabs.carousel.slides) - index) + else: + self.tabs.add_widget(new_tab) + self.tabs.carousel.add_widget(new_tab.content) return new_tab def update_texts(self, dt): @@ -1001,8 +1092,9 @@ class HintLayout(MDBoxLayout): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - boxlayout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(55)) - boxlayout.add_widget(MDLabel(text="New Hint:", size_hint_x=None, size_hint_y=None, height=dp(55))) + boxlayout = MDBoxLayout(orientation="horizontal", size_hint_y=None, height=dp(40)) + boxlayout.add_widget(MDLabel(text="New Hint:", size_hint_x=None, size_hint_y=None, + height=dp(40), width=dp(75), halign="center", valign="center")) boxlayout.add_widget(AutocompleteHintInput()) self.add_widget(boxlayout) @@ -1012,7 +1104,7 @@ class HintLayout(MDBoxLayout): if fix_func: fix_func() - + status_names: typing.Dict[HintStatus, str] = { HintStatus.HINT_FOUND: "Found", HintStatus.HINT_UNSPECIFIED: "Unspecified", @@ -1109,6 +1201,7 @@ class HintLog(MDRecycleView): class ApAsyncImage(AsyncImage): + def is_uri(self, filename: str) -> bool: if filename.startswith("ap:"): return True @@ -1154,7 +1247,23 @@ class E(ExceptionHandler): class KivyJSONtoTextParser(JSONtoTextParser): # dummy class to absorb kvlang definitions class TextColors(Widget): - pass + white: str = StringProperty("FFFFFF") + black: str = StringProperty("000000") + red: str = StringProperty("EE0000") + green: str = StringProperty("00FF7F") + yellow: str = StringProperty("FAFAD2") + blue: str = StringProperty("6495ED") + magenta: str = StringProperty("EE00EE") + cyan: str = StringProperty("00EEEE") + slateblue: str = StringProperty("6D8BE8") + plum: str = StringProperty("AF99EF") + salmon: str = StringProperty("FA8072") + orange: str = StringProperty("FF7700") + # KivyMD parameters + theme_style: str = StringProperty("Dark") + primary_palette: str = StringProperty("Lightsteelblue") + dynamic_scheme_name: str = StringProperty("VIBRANT") + dynamic_scheme_contrast: int = NumericProperty(0) def __init__(self, *args, **kwargs): # we grab the color definitions from the .kv file, then overwrite the JSONtoTextParser default entries From 4b1898bfaf6522478ff738a3e99c5257903061f2 Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 17 Apr 2025 17:57:17 -0500 Subject: [PATCH 219/227] HK: fix docs whitespace (#4885) --- worlds/hk/docs/setup_en.md | 46 +++++++++++++++++------------------ worlds/hk/docs/setup_pt_br.md | 34 +++++++++++++------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/worlds/hk/docs/setup_en.md b/worlds/hk/docs/setup_en.md index 25f7c78075..0375867d40 100644 --- a/worlds/hk/docs/setup_en.md +++ b/worlds/hk/docs/setup_en.md @@ -3,34 +3,34 @@ ## Required Software * Download and unzip the Lumafly Mod Manager from the [Lumafly website](https://themulhima.github.io/Lumafly/). * A legal copy of Hollow Knight. - * Steam, Gog, and Xbox Game Pass versions of the game are supported. - * Windows, Mac, and Linux (including Steam Deck) are supported. + * Steam, Gog, and Xbox Game Pass versions of the game are supported. + * Windows, Mac, and Linux (including Steam Deck) are supported. ## Installing the Archipelago Mod using Lumafly 1. Launch Lumafly and ensure it locates your Hollow Knight installation directory. 2. Install the Archipelago mods by doing either of the following: - * Click one of the links below to allow Lumafly to install the mods. Lumafly will prompt for confirmation. - * [Archipelago and dependencies only](https://themulhima.github.io/Lumafly/commands/download/?mods=Archipelago) - * [Archipelago with rando essentials](https://themulhima.github.io/Lumafly/commands/download/?mods=Archipelago/Archipelago%20Map%20Mod/RecentItemsDisplay/DebugMod/RandoStats/Additional%20Timelines/CompassAlwaysOn/AdditionalMaps/) - (includes Archipelago Map Mod, RecentItemsDisplay, DebugMod, RandoStats, AdditionalTimelines, CompassAlwaysOn, - and AdditionalMaps). - * Click the "Install" button near the "Archipelago" mod entry. If desired, also install "Archipelago Map Mod" - to use as an in-game tracker. + * Click one of the links below to allow Lumafly to install the mods. Lumafly will prompt for confirmation. + * [Archipelago and dependencies only](https://themulhima.github.io/Lumafly/commands/download/?mods=Archipelago) + * [Archipelago with rando essentials](https://themulhima.github.io/Lumafly/commands/download/?mods=Archipelago/Archipelago%20Map%20Mod/RecentItemsDisplay/DebugMod/RandoStats/Additional%20Timelines/CompassAlwaysOn/AdditionalMaps/) + (includes Archipelago Map Mod, RecentItemsDisplay, DebugMod, RandoStats, AdditionalTimelines, CompassAlwaysOn, + and AdditionalMaps). + * Click the "Install" button near the "Archipelago" mod entry. If desired, also install "Archipelago Map Mod" + to use as an in-game tracker. 3. Launch the game, you're all set! ### What to do if Lumafly fails to find your installation directory 1. Find the directory manually. - * Xbox Game Pass: - 1. Enter the Xbox app and move your mouse over "Hollow Knight" on the left sidebar. - 2. Click the three points then click "Manage". - 3. Go to the "Files" tab and select "Browse...". - 4. Click "Hollow Knight", then "Content", then click the path bar and copy it. - * Steam: - 1. You likely put your Steam library in a non-standard place. If this is the case, you probably know where - it is. Find your steam library and then find the Hollow Knight folder and copy the path. - * Windows - `C:\Program Files (x86)\Steam\steamapps\common\Hollow Knight` - * Linux/Steam Deck - ~/.local/share/Steam/steamapps/common/Hollow Knight - * Mac - ~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app + * Xbox Game Pass: + 1. Enter the Xbox app and move your mouse over "Hollow Knight" on the left sidebar. + 2. Click the three points then click "Manage". + 3. Go to the "Files" tab and select "Browse...". + 4. Click "Hollow Knight", then "Content", then click the path bar and copy it. + * Steam: + 1. You likely put your Steam library in a non-standard place. If this is the case, you probably know where + it is. Find your steam library and then find the Hollow Knight folder and copy the path. + * Windows - `C:\Program Files (x86)\Steam\steamapps\common\Hollow Knight` + * Linux/Steam Deck - ~/.local/share/Steam/steamapps/common/Hollow Knight + * Mac - ~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app 2. Run Lumafly as an administrator and, when it asks you for the path, paste the path you copied. ## Configuring your YAML File @@ -49,9 +49,9 @@ website to generate a YAML using a graphical interface. 4. Enter the correct settings for your Archipelago server. 5. Hit **Start** to begin the game. The game will stall for a few seconds while it does all item placements. 6. The game will immediately drop you into the randomized game. - * If you are waiting for a countdown then wait for it to lapse before hitting Start. - * Or hit Start then pause the game once you're in it. - + * If you are waiting for a countdown then wait for it to lapse before hitting Start. + * Or hit Start then pause the game once you're in it. + ## Hints and other commands While playing in a multiworld, you can interact with the server using various commands listed in the [commands guide](/tutorial/Archipelago/commands/en). You can use the Archipelago Text Client to do this, diff --git a/worlds/hk/docs/setup_pt_br.md b/worlds/hk/docs/setup_pt_br.md index 9ae1ea89d5..511ee0d552 100644 --- a/worlds/hk/docs/setup_pt_br.md +++ b/worlds/hk/docs/setup_pt_br.md @@ -3,28 +3,28 @@ ## Programas obrigatórios * Baixe e extraia o Lumafly Mod Manager (gerenciador de mods Lumafly) do [Site Lumafly](https://themulhima.github.io/Lumafly/). * Uma cópia legal de Hollow Knight. - * Versões Steam, Gog, e Xbox Game Pass do jogo são suportadas. - * Windows, Mac, e Linux (incluindo Steam Deck) são suportados. + * Versões Steam, Gog, e Xbox Game Pass do jogo são suportadas. + * Windows, Mac, e Linux (incluindo Steam Deck) são suportados. ## Instalando o mod Archipelago Mod usando Lumafly 1. Abra o Lumafly e confirme que ele localizou sua pasta de instalação do Hollow Knight. 2. Clique em "Install (instalar)" perto da opção "Archipelago" mod. - * Se quiser, instale também o "Archipelago Map Mod (mod do mapa do archipelago)" para usá-lo como rastreador dentro do jogo. + * Se quiser, instale também o "Archipelago Map Mod (mod do mapa do archipelago)" para usá-lo como rastreador dentro do jogo. 3. Abra o jogo, tudo preparado! ### O que fazer se o Lumafly falha em encontrar a sua pasta de instalação 1. Encontre a pasta manualmente. - * Xbox Game Pass: - 1. Entre no seu aplicativo Xbox e mova seu mouse em cima de "Hollow Knight" na sua barra da esquerda. - 2. Clique nos 3 pontos depois clique gerenciar. - 3. Vá nos arquivos e selecione procurar. - 4. Clique em "Hollow Knight", depois em "Content (Conteúdo)", depois clique na barra com o endereço e a copie. - * Steam: - 1. Você provavelmente colocou sua biblioteca Steam num local não padrão. Se esse for o caso você provavelmente sabe onde está. - . Encontre sua biblioteca Steam, depois encontre a pasta do Hollow Knight e copie seu endereço. - * Windows - `C:\Program Files (x86)\Steam\steamapps\common\Hollow Knight` - * Linux/Steam Deck - `~/.local/share/Steam/steamapps/common/Hollow Knight` - * Mac - `~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app` + * Xbox Game Pass: + 1. Entre no seu aplicativo Xbox e mova seu mouse em cima de "Hollow Knight" na sua barra da esquerda. + 2. Clique nos 3 pontos depois clique gerenciar. + 3. Vá nos arquivos e selecione procurar. + 4. Clique em "Hollow Knight", depois em "Content (Conteúdo)", depois clique na barra com o endereço e a copie. + * Steam: + 1. Você provavelmente colocou sua biblioteca Steam num local não padrão. Se esse for o caso você provavelmente sabe onde está. + Encontre sua biblioteca Steam, depois encontre a pasta do Hollow Knight e copie seu endereço. + * Windows - `C:\Program Files (x86)\Steam\steamapps\common\Hollow Knight` + * Linux/Steam Deck - `~/.local/share/Steam/steamapps/common/Hollow Knight` + * Mac - `~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app` 2. Rode o Lumafly como administrador e, quando ele perguntar pelo endereço do arquivo, cole o endereço do arquivo que você copiou. ## Configurando seu arquivo YAML @@ -43,9 +43,9 @@ para gerar o YAML usando a interface gráfica. 4. Coloque as configurações corretas do seu servidor Archipelago. 5. Aperte em **Começar**. O jogo vai travar por uns segundos enquanto ele coloca todos itens. 6. O jogo vai te colocar imediatamente numa partida randomizada. - * Se você está esperando uma contagem então espere ele cair antes de apertar começar. - * Ou clique em começar e pause o jogo enquanto estiver nele. - + * Se você está esperando uma contagem então espere ele cair antes de apertar começar. + * Ou clique em começar e pause o jogo enquanto estiver nele. + ## Dicas e outros comandos Enquanto jogar um multiworld, você pode interagir com o servidor usando vários comandos listados no [Guia de comandos](/tutorial/Archipelago/commands/en). Você pode usar o cliente de texto do Archipelago para isso, From 2dc55873f015f96ac0db361bd9495b66592715bc Mon Sep 17 00:00:00 2001 From: qwint Date: Thu, 17 Apr 2025 21:57:41 -0500 Subject: [PATCH 220/227] Webhost: add link to new session page (#4857) Co-authored-by: massimilianodelliubaldini <8584296+massimilianodelliubaldini@users.noreply.github.com> --- WebHostLib/templates/userContent.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WebHostLib/templates/userContent.html b/WebHostLib/templates/userContent.html index 4e3747f4f9..fa60deacd8 100644 --- a/WebHostLib/templates/userContent.html +++ b/WebHostLib/templates/userContent.html @@ -29,7 +29,8 @@

User Content

- Below is a list of all the content you have generated on this site. Rooms and seeds are listed separately. + Below is a list of all the content you have generated on this site. Rooms and seeds are listed separately.
+ Sessions can be saved or synced across devices using the Sessions Page.

Your Rooms

{% if rooms %} From 38bfb1087b6cda27cfe36d303012cde6d9dbd27a Mon Sep 17 00:00:00 2001 From: qwint Date: Fri, 18 Apr 2025 11:15:59 -0500 Subject: [PATCH 221/227] Webhost: fix get_seeds api endpoint (#4889) --- WebHostLib/api/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebHostLib/api/user.py b/WebHostLib/api/user.py index 0ddb6fe83e..2524cc40a6 100644 --- a/WebHostLib/api/user.py +++ b/WebHostLib/api/user.py @@ -28,6 +28,6 @@ def get_seeds(): response.append({ "seed_id": seed.id, "creation_time": seed.creation_time, - "players": get_players(seed.slots), + "players": get_players(seed), }) return jsonify(response) From 552a6e7f1c6cac89f7d6766122eaf20717764351 Mon Sep 17 00:00:00 2001 From: Mysteryem Date: Fri, 18 Apr 2025 17:41:46 +0100 Subject: [PATCH 222/227] Stardew Valley: Precollect building items in deterministic order (#4883) #4239 refactored buildings, but introduced iteration of a set when precollecting the building items into start inventory. The iteration order of sets varies between separate Python processes due to set order being partially based on the hashes of the objects in the set and because Python processes each have a random hash seed by default. --- worlds/stardew_valley/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index bf900742b9..bad0ab9e68 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -206,7 +206,8 @@ class StardewValleyWorld(World): if not building_progression.is_progressive: return - for building in building_progression.starting_buildings: + # starting_buildings is a set, so sort for deterministic order. + for building in sorted(building_progression.starting_buildings): item, quantity = building_progression.to_progressive_item(building) for _ in range(quantity): self.multiworld.push_precollected(self.create_item(item)) From 1b3ee0e94fdcc604c246bacedab4d60b9f0eb6cb Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 18 Apr 2025 20:41:09 +0200 Subject: [PATCH 223/227] Core: require clients to support overlapping IDs (#4451) --- MultiServer.py | 3 ++- test/hosting/client.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/MultiServer.py b/MultiServer.py index 05e93e678d..c9e0ad8bfa 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -46,7 +46,8 @@ from NetUtils import Endpoint, ClientStatus, NetworkItem, decode, encode, Networ SlotType, LocationStore, Hint, HintStatus from BaseClasses import ItemClassification -min_client_version = Version(0, 1, 6) + +min_client_version = Version(0, 5, 0) colorama.just_fix_windows_console() diff --git a/test/hosting/client.py b/test/hosting/client.py index b805bb6a26..01572c442c 100644 --- a/test/hosting/client.py +++ b/test/hosting/client.py @@ -80,8 +80,8 @@ class Client: "version": { "class": "Version", "major": 0, - "minor": 4, - "build": 6, + "minor": 6, + "build": 0, }, "items_handling": 0, "tags": [], From a0c83b48547d0e170de2324ce0a2a851adb2dee6 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 18 Apr 2025 20:49:08 +0200 Subject: [PATCH 224/227] Core: no longer log ID ranges on generate (#4013) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- Main.py | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/Main.py b/Main.py index 528db10c64..6f6a09619d 100644 --- a/Main.py +++ b/Main.py @@ -56,29 +56,15 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No logger.info(f"Found {len(AutoWorld.AutoWorldRegister.world_types)} World Types:") longest_name = max(len(text) for text in AutoWorld.AutoWorldRegister.world_types) - max_item = 0 - max_location = 0 - for cls in AutoWorld.AutoWorldRegister.world_types.values(): - if cls.item_id_to_name: - max_item = max(max_item, max(cls.item_id_to_name)) - max_location = max(max_location, max(cls.location_id_to_name)) - - item_digits = len(str(max_item)) - location_digits = len(str(max_location)) item_count = len(str(max(len(cls.item_names) for cls in AutoWorld.AutoWorldRegister.world_types.values()))) location_count = len(str(max(len(cls.location_names) for cls in AutoWorld.AutoWorldRegister.world_types.values()))) - del max_item, max_location for name, cls in AutoWorld.AutoWorldRegister.world_types.items(): if not cls.hidden and len(cls.item_names) > 0: - logger.info(f" {name:{longest_name}}: {len(cls.item_names):{item_count}} " - f"Items (IDs: {min(cls.item_id_to_name):{item_digits}} - " - f"{max(cls.item_id_to_name):{item_digits}}) | " - f"{len(cls.location_names):{location_count}} " - f"Locations (IDs: {min(cls.location_id_to_name):{location_digits}} - " - f"{max(cls.location_id_to_name):{location_digits}})") + logger.info(f" {name:{longest_name}}: Items: {len(cls.item_names):{item_count}} | " + f"Locations: {len(cls.location_names):{location_count}}") - del item_digits, location_digits, item_count, location_count + del item_count, location_count # This assertion method should not be necessary to run if we are not outputting any multidata. if not args.skip_output and not args.spoiler_only: From cb3d35faf9c08b1900b310343c5c406eae501bcc Mon Sep 17 00:00:00 2001 From: ScootyPuffJr1 <77215594+ScootyPuffJr1@users.noreply.github.com> Date: Fri, 18 Apr 2025 14:50:51 -0400 Subject: [PATCH 225/227] LttP: Add keydrop locations to location groups (#4465) --- worlds/alttp/__init__.py | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py index e4a04fe67e..4a026f109b 100644 --- a/worlds/alttp/__init__.py +++ b/worlds/alttp/__init__.py @@ -141,7 +141,7 @@ class ALTTPWorld(World): item_name_groups = item_name_groups location_name_groups = { "Blind's Hideout": {"Blind's Hideout - Top", "Blind's Hideout - Left", "Blind's Hideout - Right", - "Blind's Hideout - Far Left", "Blind's Hideout - Far Right"}, + "Blind's Hideout - Far Left", "Blind's Hideout - Far Right"}, "Kakariko Well": {"Kakariko Well - Top", "Kakariko Well - Left", "Kakariko Well - Middle", "Kakariko Well - Right", "Kakariko Well - Bottom"}, "Mini Moldorm Cave": {"Mini Moldorm Cave - Far Left", "Mini Moldorm Cave - Left", "Mini Moldorm Cave - Right", @@ -154,15 +154,23 @@ class ALTTPWorld(World): "Hookshot Cave": {"Hookshot Cave - Top Right", "Hookshot Cave - Top Left", "Hookshot Cave - Bottom Right", "Hookshot Cave - Bottom Left"}, "Hyrule Castle": {"Hyrule Castle - Boomerang Chest", "Hyrule Castle - Map Chest", - "Hyrule Castle - Zelda's Chest", "Sewers - Dark Cross", "Sewers - Secret Room - Left", - "Sewers - Secret Room - Middle", "Sewers - Secret Room - Right"}, + "Hyrule Castle - Zelda's Chest", "Hyrule Castle - Big Key Drop", + "Hyrule Castle - Boomerang Guard Key Drop", "Hyrule Castle - Map Guard Key Drop", + "Sewers - Dark Cross", "Sewers - Secret Room - Left", + "Sewers - Secret Room - Middle", "Sewers - Secret Room - Right", + "Sewers - Key Rat Key Drop"}, "Eastern Palace": {"Eastern Palace - Compass Chest", "Eastern Palace - Big Chest", "Eastern Palace - Cannonball Chest", "Eastern Palace - Big Key Chest", + "Eastern Palace - Dark Eyegore Key Drop", "Eastern Palace - Dark Square Pot Key", "Eastern Palace - Map Chest", "Eastern Palace - Boss"}, "Desert Palace": {"Desert Palace - Big Chest", "Desert Palace - Torch", "Desert Palace - Map Chest", - "Desert Palace - Compass Chest", "Desert Palace - Big Key Chest", "Desert Palace - Boss"}, + "Desert Palace - Beamos Hall Pot Key", "Desert Palace - Desert Tiles 1 Pot Key", + "Desert Palace - Desert Tiles 2 Pot Key", "Desert Palace - Compass Chest", + "Desert Palace - Big Key Chest", "Desert Palace - Boss"}, "Tower of Hera": {"Tower of Hera - Basement Cage", "Tower of Hera - Map Chest", "Tower of Hera - Big Key Chest", "Tower of Hera - Compass Chest", "Tower of Hera - Big Chest", "Tower of Hera - Boss"}, + "Castle Tower": {"Castle Tower - Room 03", "Castle Tower - Dark Maze", + "Castle Tower - Dark Archer Key Drop", "Castle Tower - Circle of Pots Key Drop"}, "Palace of Darkness": {"Palace of Darkness - Shooter Room", "Palace of Darkness - The Arena - Bridge", "Palace of Darkness - Stalfos Basement", "Palace of Darkness - Big Key Chest", "Palace of Darkness - The Arena - Ledge", "Palace of Darkness - Map Chest", @@ -173,25 +181,33 @@ class ALTTPWorld(World): "Swamp Palace": {"Swamp Palace - Entrance", "Swamp Palace - Map Chest", "Swamp Palace - Big Chest", "Swamp Palace - Compass Chest", "Swamp Palace - Big Key Chest", "Swamp Palace - West Chest", "Swamp Palace - Flooded Room - Left", "Swamp Palace - Flooded Room - Right", - "Swamp Palace - Waterfall Room", "Swamp Palace - Boss"}, + "Swamp Palace - Hookshot Pot Key", "Swamp Palace - Pot Row Pot Key", + "Swamp Palace - Trench 1 Pot Key", "Swamp Palace - Trench 2 Pot Key", + "Swamp Palace - Waterway Pot Key", "Swamp Palace - Waterfall Room", "Swamp Palace - Boss"}, "Thieves' Town": {"Thieves' Town - Big Key Chest", "Thieves' Town - Map Chest", "Thieves' Town - Compass Chest", "Thieves' Town - Ambush Chest", "Thieves' Town - Attic", "Thieves' Town - Big Chest", + "Thieves' Town - Hallway Pot Key", "Thieves' Town - Spike Switch Pot Key", "Thieves' Town - Blind's Cell", "Thieves' Town - Boss"}, "Skull Woods": {"Skull Woods - Map Chest", "Skull Woods - Pinball Room", "Skull Woods - Compass Chest", "Skull Woods - Pot Prison", "Skull Woods - Big Chest", "Skull Woods - Big Key Chest", + "Skull Woods - Spike Corner Key Drop", "Skull Woods - West Lobby Pot Key", "Skull Woods - Bridge Room", "Skull Woods - Boss"}, "Ice Palace": {"Ice Palace - Compass Chest", "Ice Palace - Freezor Chest", "Ice Palace - Big Chest", "Ice Palace - Freezor Chest", "Ice Palace - Big Chest", "Ice Palace - Iced T Room", "Ice Palace - Spike Room", "Ice Palace - Big Key Chest", "Ice Palace - Map Chest", + "Ice Palace - Conveyor Key Drop", "Ice Palace - Hammer Block Key Drop", + "Ice Palace - Jelly Key Drop", "Ice Palace - Many Pots Pot Key", "Ice Palace - Boss"}, "Misery Mire": {"Misery Mire - Big Chest", "Misery Mire - Map Chest", "Misery Mire - Main Lobby", "Misery Mire - Bridge Chest", "Misery Mire - Spike Chest", "Misery Mire - Compass Chest", - "Misery Mire - Big Key Chest", "Misery Mire - Boss"}, + "Misery Mire - Conveyor Crystal Key Drop", "Misery Mire - Fishbone Pot Key", + "Misery Mire - Spikes Pot Key", "Misery Mire - Big Key Chest", "Misery Mire - Boss"}, "Turtle Rock": {"Turtle Rock - Compass Chest", "Turtle Rock - Roller Room - Left", "Turtle Rock - Roller Room - Right", "Turtle Rock - Chain Chomps", "Turtle Rock - Big Key Chest", "Turtle Rock - Big Chest", "Turtle Rock - Crystaroller Room", "Turtle Rock - Eye Bridge - Bottom Left", "Turtle Rock - Eye Bridge - Bottom Right", "Turtle Rock - Eye Bridge - Top Left", "Turtle Rock - Eye Bridge - Top Right", + "Turtle Rock - Pokey 1 Key Drop", "Turtle Rock - Pokey 2 Key Drop", "Turtle Rock - Boss"}, "Ganons Tower": {"Ganons Tower - Bob's Torch", "Ganons Tower - Hope Room - Left", "Ganons Tower - Hope Room - Right", "Ganons Tower - Tile Room", @@ -204,10 +220,13 @@ class ALTTPWorld(World): "Ganons Tower - Randomizer Room - Bottom Left", "Ganons Tower - Randomizer Room - Bottom Right", "Ganons Tower - Bob's Chest", "Ganons Tower - Big Chest", "Ganons Tower - Big Key Room - Left", "Ganons Tower - Big Key Room - Right", "Ganons Tower - Big Key Chest", - "Ganons Tower - Mini Helmasaur Room - Left", "Ganons Tower - Mini Helmasaur Room - Right", - "Ganons Tower - Pre-Moldorm Chest", "Ganons Tower - Validation Chest"}, + "Ganons Tower - Conveyor Cross Pot Key", "Ganons Tower - Conveyor Star Pits Pot Key", + "Ganons Tower - Double Switch Pot Key", "Ganons Tower - Mini Helmasaur Room - Left", + "Ganons Tower - Mini Helmasaur Room - Right", "Ganons Tower - Pre-Moldorm Chest", + "Ganons Tower - Mini Helmasaur Key Drop", "Ganons Tower - Validation Chest"}, "Ganons Tower Climb": {"Ganons Tower - Mini Helmasaur Room - Left", "Ganons Tower - Mini Helmasaur Room - Right", - "Ganons Tower - Pre-Moldorm Chest", "Ganons Tower - Validation Chest"}, + "Ganons Tower - Mini Helmasaur Key Drop", "Ganons Tower - Pre-Moldorm Chest", + "Ganons Tower - Validation Chest"}, } hint_blacklist = {"Triforce"} From 1b51714f3b734d0c43e6fdffa006c692b12f8c50 Mon Sep 17 00:00:00 2001 From: Aaron Wagener Date: Fri, 18 Apr 2025 16:34:34 -0500 Subject: [PATCH 226/227] LTTP: Rip Lttp specific entrance code out of core and use Region helpers (#1960) --- BaseClasses.py | 7 +------ worlds/alttp/OverworldGlitchRules.py | 10 ++-------- worlds/alttp/Regions.py | 8 ++++---- worlds/alttp/Rules.py | 8 ++++---- worlds/alttp/SubClasses.py | 17 +++++++++++++++-- worlds/alttp/UnderworldGlitchRules.py | 14 ++++++-------- worlds/pokemon_rb/regions.py | 6 +++++- 7 files changed, 37 insertions(+), 33 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 4074108b4b..ec3fa9cef1 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1022,9 +1022,6 @@ class Entrance: connected_region: Optional[Region] = None randomization_group: int randomization_type: EntranceType - # LttP specific, TODO: should make a LttPEntrance - addresses = None - target = None def __init__(self, player: int, name: str = "", parent: Optional[Region] = None, randomization_group: int = 0, randomization_type: EntranceType = EntranceType.ONE_WAY) -> None: @@ -1043,10 +1040,8 @@ class Entrance: return False - def connect(self, region: Region, addresses: Any = None, target: Any = None) -> None: + def connect(self, region: Region) -> None: self.connected_region = region - self.target = target - self.addresses = addresses region.entrances.append(self) def is_valid_source_transition(self, er_state: "ERPlacementState") -> bool: diff --git a/worlds/alttp/OverworldGlitchRules.py b/worlds/alttp/OverworldGlitchRules.py index 2da76234bd..1a1c01525d 100644 --- a/worlds/alttp/OverworldGlitchRules.py +++ b/worlds/alttp/OverworldGlitchRules.py @@ -2,8 +2,6 @@ Helper functions to deliver entrance/exit/region sets to OWG rules. """ -from BaseClasses import Entrance - from .StateHelpers import can_lift_heavy_rocks, can_boots_clip_lw, can_boots_clip_dw, can_get_glitched_speed_dw @@ -279,18 +277,14 @@ def create_no_logic_connections(player, world, connections): for entrance, parent_region, target_region, *rule_override in connections: parent = world.get_region(parent_region, player) target = world.get_region(target_region, player) - connection = Entrance(player, entrance, parent) - parent.exits.append(connection) - connection.connect(target) + parent.connect(target, entrance) def create_owg_connections(player, world, connections): for entrance, parent_region, target_region, *rule_override in connections: parent = world.get_region(parent_region, player) target = world.get_region(target_region, player) - connection = Entrance(player, entrance, parent) - parent.exits.append(connection) - connection.connect(target) + parent.connect(target, entrance) def set_owg_connection_rules(player, world, connections, default_rule): diff --git a/worlds/alttp/Regions.py b/worlds/alttp/Regions.py index f3dbbdc059..c2af795637 100644 --- a/worlds/alttp/Regions.py +++ b/worlds/alttp/Regions.py @@ -1,11 +1,11 @@ import collections import typing -from BaseClasses import Entrance, MultiWorld -from .SubClasses import LTTPRegion, LTTPRegionType +from BaseClasses import MultiWorld +from .SubClasses import LTTPEntrance, LTTPRegion, LTTPRegionType -def is_main_entrance(entrance: Entrance) -> bool: +def is_main_entrance(entrance: LTTPEntrance) -> bool: return entrance.parent_region.type in {LTTPRegionType.DarkWorld, LTTPRegionType.LightWorld} if entrance.parent_region.type else True @@ -410,7 +410,7 @@ def _create_region(world: MultiWorld, player: int, name: str, type: LTTPRegionTy ret = LTTPRegion(name, type, hint, player, world) if exits: for exit in exits: - ret.exits.append(Entrance(player, exit, ret)) + ret.create_exit(exit) if locations: for location in locations: if location in key_drop_data: diff --git a/worlds/alttp/Rules.py b/worlds/alttp/Rules.py index 47992947ac..3f5081129a 100644 --- a/worlds/alttp/Rules.py +++ b/worlds/alttp/Rules.py @@ -3,7 +3,7 @@ import logging from typing import Iterator, Set from Options import ItemsAccessibility -from BaseClasses import Entrance, MultiWorld +from BaseClasses import MultiWorld from worlds.generic.Rules import (add_item_rule, add_rule, forbid_item, item_name_in_location_names, location_item_name, set_rule, allow_self_locking_items) @@ -1071,9 +1071,8 @@ def swordless_rules(world, player): def add_connection(parent_name, target_name, entrance_name, world, player): parent = world.get_region(parent_name, player) target = world.get_region(target_name, player) - connection = Entrance(player, entrance_name, parent) - parent.exits.append(connection) - connection.connect(target) + parent.connect(target, entrance_name) + def standard_rules(world, player): @@ -1108,6 +1107,7 @@ def standard_rules(world, player): set_rule(world.get_location('Hyrule Castle - Zelda\'s Chest', player), lambda state: state.has('Big Key (Hyrule Castle)', player)) + def toss_junk_item(world, player): items = ['Rupees (20)', 'Bombs (3)', 'Arrows (10)', 'Rupees (5)', 'Rupee (1)', 'Bombs (10)', 'Single Arrow', 'Rupees (50)', 'Rupees (100)', 'Single Bomb', 'Bee', 'Bee Trap', diff --git a/worlds/alttp/SubClasses.py b/worlds/alttp/SubClasses.py index 328e28da93..a3b1d778d6 100644 --- a/worlds/alttp/SubClasses.py +++ b/worlds/alttp/SubClasses.py @@ -2,11 +2,10 @@ from typing import Optional, TYPE_CHECKING from enum import IntEnum -from BaseClasses import Location, Item, ItemClassification, Region, MultiWorld +from BaseClasses import Entrance, Location, Item, ItemClassification, Region, MultiWorld if TYPE_CHECKING: from .Dungeons import Dungeon - from .Regions import LTTPRegion class ALttPLocation(Location): @@ -77,6 +76,19 @@ class ALttPItem(Item): return self.type +Addresses = int | list[int] | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int] + + +class LTTPEntrance(Entrance): + addresses: Addresses | None = None + target: int | None = None + + def connect(self, region: Region, addresses: Addresses | None = None, target: int | None = None) -> None: + super().connect(region) + self.addresses = addresses + self.target = target + + class LTTPRegionType(IntEnum): LightWorld = 1 DarkWorld = 2 @@ -90,6 +102,7 @@ class LTTPRegionType(IntEnum): class LTTPRegion(Region): + entrance_type = LTTPEntrance type: LTTPRegionType # will be set after making connections. diff --git a/worlds/alttp/UnderworldGlitchRules.py b/worlds/alttp/UnderworldGlitchRules.py index 50397dea16..2b18f67ed9 100644 --- a/worlds/alttp/UnderworldGlitchRules.py +++ b/worlds/alttp/UnderworldGlitchRules.py @@ -1,6 +1,6 @@ -from BaseClasses import Entrance from worlds.generic.Rules import set_rule, add_rule from .StateHelpers import can_bomb_clip, has_sword, has_beam_sword, has_fire_source, can_melt_things, has_misery_mire_medallion +from .SubClasses import LTTPEntrance # We actually need the logic to properly "mark" these regions as Light or Dark world. @@ -9,17 +9,15 @@ def underworld_glitch_connections(world, player): specrock = world.get_region('Spectacle Rock Cave (Bottom)', player) mire = world.get_region('Misery Mire (West)', player) - kikiskip = Entrance(player, 'Kiki Skip', specrock) - mire_to_hera = Entrance(player, 'Mire to Hera Clip', mire) - mire_to_swamp = Entrance(player, 'Hera to Swamp Clip', mire) - specrock.exits.append(kikiskip) - mire.exits.extend([mire_to_hera, mire_to_swamp]) + kikiskip = specrock.create_exit('Kiki Skip') + mire_to_hera = mire.create_exit('Mire to Hera Clip') + mire_to_swamp = mire.create_exit('Hera to Swamp Clip') if world.worlds[player].fix_fake_world: kikiskip.connect(world.get_entrance('Palace of Darkness Exit', player).connected_region) mire_to_hera.connect(world.get_entrance('Tower of Hera Exit', player).connected_region) mire_to_swamp.connect(world.get_entrance('Swamp Palace Exit', player).connected_region) - else: + else: kikiskip.connect(world.get_region('Palace of Darkness (Entrance)', player)) mire_to_hera.connect(world.get_region('Tower of Hera (Bottom)', player)) mire_to_swamp.connect(world.get_region('Swamp Palace (Entrance)', player)) @@ -37,7 +35,7 @@ def fake_pearl_state(state, player): # Sets the rules on where we can actually go using this clip. # Behavior differs based on what type of ER shuffle we're playing. -def dungeon_reentry_rules(world, player, clip: Entrance, dungeon_region: str, dungeon_exit: str): +def dungeon_reentry_rules(world, player, clip: LTTPEntrance, dungeon_region: str, dungeon_exit: str): fix_dungeon_exits = world.worlds[player].fix_palaceofdarkness_exit fix_fake_worlds = world.worlds[player].fix_fake_world diff --git a/worlds/pokemon_rb/regions.py b/worlds/pokemon_rb/regions.py index 84c9b25735..5aa6243514 100644 --- a/worlds/pokemon_rb/regions.py +++ b/worlds/pokemon_rb/regions.py @@ -2640,9 +2640,13 @@ class PokemonRBWarp(Entrance): self.warp_id = warp_id self.address = address self.flags = flags + self.addresses = None + self.target = None def connect(self, entrance): - super().connect(entrance.parent_region, None, target=entrance.warp_id) + super().connect(entrance.parent_region) + self.addresses = None + self.target = entrance.warp_id def access_rule(self, state): if self.connected_region is None: From 57a716b57a7df9a6ca3ad2c4d2d7e5169bde7021 Mon Sep 17 00:00:00 2001 From: Nicholas Saylor <79181893+nicholassaylor@users.noreply.github.com> Date: Fri, 18 Apr 2025 17:41:38 -0400 Subject: [PATCH 227/227] LTTP: Update to options API (#4134) Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> --- worlds/alttp/Bosses.py | 13 +- worlds/alttp/Dungeons.py | 4 +- worlds/alttp/EntranceShuffle.py | 100 +++--- worlds/alttp/ItemPool.py | 168 ++++----- worlds/alttp/Items.py | 4 +- worlds/alttp/Options.py | 6 +- worlds/alttp/OverworldGlitchRules.py | 20 +- worlds/alttp/Rom.py | 339 +++++++++--------- worlds/alttp/Rules.py | 155 ++++---- worlds/alttp/Shops.py | 56 +-- worlds/alttp/StateHelpers.py | 26 +- worlds/alttp/UnderworldGlitchRules.py | 6 +- worlds/alttp/__init__.py | 141 ++++---- worlds/alttp/test/dungeons/TestDungeon.py | 4 +- worlds/alttp/test/inverted/TestInverted.py | 6 +- .../test/inverted/TestInvertedBombRules.py | 2 +- .../TestInvertedMinor.py | 8 +- .../test/inverted_owg/TestInvertedOWG.py | 8 +- worlds/alttp/test/minor_glitches/TestMinor.py | 6 +- worlds/alttp/test/options/TestOpenPyramid.py | 2 +- worlds/alttp/test/owg/TestVanillaOWG.py | 6 +- worlds/alttp/test/vanilla/TestVanilla.py | 6 +- 22 files changed, 532 insertions(+), 554 deletions(-) diff --git a/worlds/alttp/Bosses.py b/worlds/alttp/Bosses.py index 02970edb9f..54686f45ad 100644 --- a/worlds/alttp/Bosses.py +++ b/worlds/alttp/Bosses.py @@ -102,7 +102,7 @@ def KholdstareDefeatRule(state, player: int) -> bool: state.has('Fire Rod', player) or ( state.has('Bombos', player) and - (has_sword(state, player) or state.multiworld.swordless[player]) + (has_sword(state, player) or state.multiworld.worlds[player].options.swordless) ) ) and ( @@ -111,7 +111,7 @@ def KholdstareDefeatRule(state, player: int) -> bool: ( state.has('Fire Rod', player) and state.has('Bombos', player) and - state.multiworld.swordless[player] and + state.multiworld.worlds[player].options.swordless and can_extend_magic(state, player, 16) ) ) @@ -137,7 +137,7 @@ def AgahnimDefeatRule(state, player: int) -> bool: def GanonDefeatRule(state, player: int) -> bool: - if state.multiworld.swordless[player]: + if state.multiworld.worlds[player].options.swordless: return state.has('Hammer', player) and \ has_fire_source(state, player) and \ state.has('Silver Bow', player) and \ @@ -146,7 +146,7 @@ def GanonDefeatRule(state, player: int) -> bool: can_hurt = has_beam_sword(state, player) common = can_hurt and has_fire_source(state, player) # silverless ganon may be needed in anything higher than no glitches - if state.multiworld.glitches_required[player] != 'no_glitches': + if state.multiworld.worlds[player].options.glitches_required != 'no_glitches': # need to light torch a sufficient amount of times return common and (state.has('Tempered Sword', player) or state.has('Golden Sword', player) or ( state.has('Silver Bow', player) and can_shoot_arrows(state, player)) or @@ -248,7 +248,7 @@ for location in boss_location_table: def place_boss(world: "ALTTPWorld", boss: str, location: str, level: Optional[str]) -> None: player = world.player - if location == 'Ganons Tower' and world.multiworld.mode[player] == 'inverted': + if location == 'Ganons Tower' and world.options.mode == 'inverted': location = 'Inverted Ganons Tower' logging.debug('Placing boss %s at %s', boss, location + (' (' + level + ')' if level else '')) world.dungeons[location].bosses[level] = BossFactory(boss, player) @@ -260,9 +260,8 @@ def format_boss_location(location_name: str, level: str) -> str: def place_bosses(world: "ALTTPWorld") -> None: multiworld = world.multiworld - player = world.player # will either be an int or a lower case string with ';' between options - boss_shuffle: Union[str, int] = multiworld.boss_shuffle[player].value + boss_shuffle: Union[str, int] = world.options.boss_shuffle.value already_placed_bosses: List[str] = [] remaining_locations: List[Tuple[str, str]] = [] # handle plando diff --git a/worlds/alttp/Dungeons.py b/worlds/alttp/Dungeons.py index 8405fc4480..39e8d7072b 100644 --- a/worlds/alttp/Dungeons.py +++ b/worlds/alttp/Dungeons.py @@ -66,7 +66,7 @@ def create_dungeons(world: "ALTTPWorld"): def make_dungeon(name, default_boss, dungeon_regions, big_key, small_keys, dungeon_items): dungeon = Dungeon(name, dungeon_regions, big_key, - [] if multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal else small_keys, + [] if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal else small_keys, dungeon_items, player) for item in dungeon.all_items: item.dungeon = dungeon @@ -143,7 +143,7 @@ def create_dungeons(world: "ALTTPWorld"): item_factory(['Small Key (Turtle Rock)'] * 6, world), item_factory(['Map (Turtle Rock)', 'Compass (Turtle Rock)'], world)) - if multiworld.mode[player] != 'inverted': + if multiworld.worlds[player].options.mode != 'inverted': AT = make_dungeon('Agahnims Tower', 'Agahnim', ['Agahnims Tower', 'Agahnim 1'], None, item_factory(['Small Key (Agahnims Tower)'] * 4, world), []) GT = make_dungeon('Ganons Tower', 'Agahnim2', diff --git a/worlds/alttp/EntranceShuffle.py b/worlds/alttp/EntranceShuffle.py index d0487494aa..c062a17ea6 100644 --- a/worlds/alttp/EntranceShuffle.py +++ b/worlds/alttp/EntranceShuffle.py @@ -23,17 +23,17 @@ def link_entrances(world, player): connect_simple(world, exitname, regionname, player) # if we do not shuffle, set default connections - if world.entrance_shuffle[player] == 'vanilla': + if world.worlds[player].options.entrance_shuffle == 'vanilla': for exitname, regionname in default_connections: connect_simple(world, exitname, regionname, player) for exitname, regionname in default_dungeon_connections: connect_simple(world, exitname, regionname, player) - elif world.entrance_shuffle[player] == 'dungeons_simple': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_simple': for exitname, regionname in default_connections: connect_simple(world, exitname, regionname, player) simple_shuffle_dungeons(world, player) - elif world.entrance_shuffle[player] == 'dungeons_full': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_full': for exitname, regionname in default_connections: connect_simple(world, exitname, regionname, player) @@ -43,7 +43,7 @@ def link_entrances(world, player): lw_entrances = list(LW_Dungeon_Entrances) dw_entrances = list(DW_Dungeon_Entrances) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # must connect front of hyrule castle to do escape connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) else: @@ -56,7 +56,7 @@ def link_entrances(world, player): dw_entrances.append('Ganons Tower') dungeon_exits.append('Ganons Tower Exit') - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # rest of hyrule castle must be in light world, so it has to be the one connected to east exit of desert hyrule_castle_exits = [('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)')] connect_mandatory_exits(world, lw_entrances, hyrule_castle_exits, list(LW_Dungeon_Entrances_Must_Exit), player) @@ -65,9 +65,9 @@ def link_entrances(world, player): connect_mandatory_exits(world, lw_entrances, dungeon_exits, list(LW_Dungeon_Entrances_Must_Exit), player) connect_mandatory_exits(world, dw_entrances, dungeon_exits, list(DW_Dungeon_Entrances_Must_Exit), player) connect_caves(world, lw_entrances, dw_entrances, dungeon_exits, player) - elif world.entrance_shuffle[player] == 'dungeons_crossed': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_crossed': crossed_shuffle_dungeons(world, player) - elif world.entrance_shuffle[player] == 'simple': + elif world.worlds[player].options.entrance_shuffle == 'simple': simple_shuffle_dungeons(world, player) old_man_entrances = list(Old_Man_Entrances) @@ -138,7 +138,7 @@ def link_entrances(world, player): # place remaining doors connect_doors(world, single_doors, door_targets, player) - elif world.entrance_shuffle[player] == 'restricted': + elif world.worlds[player].options.entrance_shuffle == 'restricted': simple_shuffle_dungeons(world, player) lw_entrances = list(LW_Entrances + LW_Single_Cave_Doors + Old_Man_Entrances) @@ -210,7 +210,7 @@ def link_entrances(world, player): # place remaining doors connect_doors(world, doors, door_targets, player) - elif world.entrance_shuffle[player] == 'full': + elif world.worlds[player].options.entrance_shuffle == 'full': skull_woods_shuffle(world, player) lw_entrances = list(LW_Entrances + LW_Dungeon_Entrances + LW_Single_Cave_Doors + Old_Man_Entrances) @@ -227,7 +227,7 @@ def link_entrances(world, player): # tavern back door cannot be shuffled yet connect_doors(world, ['Tavern North'], ['Tavern'], player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # must connect front of hyrule castle to do escape connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) else: @@ -264,7 +264,7 @@ def link_entrances(world, player): pass else: #if the cave wasn't placed we get here connect_caves(world, lw_entrances, [], old_man_house, player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # rest of hyrule castle must be in light world connect_caves(world, lw_entrances, [], [('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)')], player) @@ -316,7 +316,7 @@ def link_entrances(world, player): # place remaining doors connect_doors(world, doors, door_targets, player) - elif world.entrance_shuffle[player] == 'crossed': + elif world.worlds[player].options.entrance_shuffle == 'crossed': skull_woods_shuffle(world, player) entrances = list(LW_Entrances + LW_Dungeon_Entrances + LW_Single_Cave_Doors + Old_Man_Entrances + DW_Entrances + DW_Dungeon_Entrances + DW_Single_Cave_Doors) @@ -331,7 +331,7 @@ def link_entrances(world, player): # tavern back door cannot be shuffled yet connect_doors(world, ['Tavern North'], ['Tavern'], player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # must connect front of hyrule castle to do escape connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) else: @@ -348,7 +348,7 @@ def link_entrances(world, player): #place must-exit caves connect_mandatory_exits(world, entrances, caves, must_exits, player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # rest of hyrule castle must be dealt with connect_caves(world, entrances, [], [('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)')], player) @@ -394,7 +394,7 @@ def link_entrances(world, player): # place remaining doors connect_doors(world, entrances, door_targets, player) - elif world.entrance_shuffle[player] == 'insanity': + elif world.worlds[player].options.entrance_shuffle == 'insanity': # beware ye who enter here entrances = LW_Entrances + LW_Dungeon_Entrances + DW_Entrances + DW_Dungeon_Entrances + Old_Man_Entrances + ['Skull Woods Second Section Door (East)', 'Skull Woods First Section Door', 'Kakariko Well Cave', 'Bat Cave Cave', 'North Fairy Cave', 'Sanctuary', 'Lost Woods Hideout Stump', 'Lumberjack Tree Cave'] @@ -431,7 +431,7 @@ def link_entrances(world, player): # tavern back door cannot be shuffled yet connect_doors(world, ['Tavern North'], ['Tavern'], player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # cannot move uncle cave connect_entrance(world, 'Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Secret Entrance', player) connect_exit(world, 'Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Secret Entrance Stairs', player) @@ -464,7 +464,7 @@ def link_entrances(world, player): connect_entrance(world, hole, hole_targets.pop(), player) # hyrule castle handling - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # must connect front of hyrule castle to do escape connect_entrance(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) connect_exit(world, 'Hyrule Castle Exit (South)', 'Hyrule Castle Entrance (South)', player) @@ -544,12 +544,12 @@ def link_entrances(world, player): else: raise NotImplementedError( - f'{world.entrance_shuffle[player]} Shuffling not supported yet. Player {world.get_player_name(player)}') + f'{world.worlds[player].options.entrance_shuffle} Shuffling not supported yet. Player {world.get_player_name(player)}') - if world.glitches_required[player] in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: overworld_glitch_connections(world, player) # mandatory hybrid major glitches connections - if world.glitches_required[player] in ['hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['hybrid_major_glitches', 'no_logic']: underworld_glitch_connections(world, player) # check for swamp palace fix @@ -584,17 +584,17 @@ def link_inverted_entrances(world, player): connect_simple(world, exitname, regionname, player) # if we do not shuffle, set default connections - if world.entrance_shuffle[player] == 'vanilla': + if world.worlds[player].options.entrance_shuffle == 'vanilla': for exitname, regionname in inverted_default_connections: connect_simple(world, exitname, regionname, player) for exitname, regionname in inverted_default_dungeon_connections: connect_simple(world, exitname, regionname, player) - elif world.entrance_shuffle[player] == 'dungeons_simple': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_simple': for exitname, regionname in inverted_default_connections: connect_simple(world, exitname, regionname, player) simple_shuffle_dungeons(world, player) - elif world.entrance_shuffle[player] == 'dungeons_full': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_full': for exitname, regionname in inverted_default_connections: connect_simple(world, exitname, regionname, player) @@ -649,9 +649,9 @@ def link_inverted_entrances(world, player): connect_mandatory_exits(world, lw_entrances, dungeon_exits, lw_dungeon_entrances_must_exit, player) connect_caves(world, lw_entrances, dw_entrances, dungeon_exits, player) - elif world.entrance_shuffle[player] == 'dungeons_crossed': + elif world.worlds[player].options.entrance_shuffle == 'dungeons_crossed': inverted_crossed_shuffle_dungeons(world, player) - elif world.entrance_shuffle[player] == 'simple': + elif world.worlds[player].options.entrance_shuffle == 'simple': simple_shuffle_dungeons(world, player) old_man_entrances = list(Inverted_Old_Man_Entrances) @@ -748,7 +748,7 @@ def link_inverted_entrances(world, player): # place remaining doors connect_doors(world, single_doors, door_targets, player) - elif world.entrance_shuffle[player] == 'restricted': + elif world.worlds[player].options.entrance_shuffle == 'restricted': simple_shuffle_dungeons(world, player) lw_entrances = list(Inverted_LW_Entrances + Inverted_LW_Single_Cave_Doors) @@ -833,7 +833,7 @@ def link_inverted_entrances(world, player): doors = lw_entrances + dw_entrances # place remaining doors connect_doors(world, doors, door_targets, player) - elif world.entrance_shuffle[player] == 'full': + elif world.worlds[player].options.entrance_shuffle == 'full': skull_woods_shuffle(world, player) lw_entrances = list(Inverted_LW_Entrances + Inverted_LW_Dungeon_Entrances + Inverted_LW_Single_Cave_Doors) @@ -984,7 +984,7 @@ def link_inverted_entrances(world, player): # place remaining doors connect_doors(world, doors, door_targets, player) - elif world.entrance_shuffle[player] == 'crossed': + elif world.worlds[player].options.entrance_shuffle == 'crossed': skull_woods_shuffle(world, player) entrances = list(Inverted_LW_Entrances + Inverted_LW_Dungeon_Entrances + Inverted_LW_Single_Cave_Doors + Inverted_Old_Man_Entrances + Inverted_DW_Entrances + Inverted_DW_Dungeon_Entrances + Inverted_DW_Single_Cave_Doors) @@ -1095,7 +1095,7 @@ def link_inverted_entrances(world, player): # place remaining doors connect_doors(world, entrances, door_targets, player) - elif world.entrance_shuffle[player] == 'insanity': + elif world.worlds[player].options.entrance_shuffle == 'insanity': # beware ye who enter here entrances = Inverted_LW_Entrances + Inverted_LW_Dungeon_Entrances + Inverted_DW_Entrances + Inverted_DW_Dungeon_Entrances + Inverted_Old_Man_Entrances + Old_Man_Entrances + ['Skull Woods Second Section Door (East)', 'Skull Woods Second Section Door (West)', 'Skull Woods First Section Door', 'Kakariko Well Cave', 'Bat Cave Cave', 'North Fairy Cave', 'Sanctuary', 'Lost Woods Hideout Stump', 'Lumberjack Tree Cave', 'Hyrule Castle Entrance (South)'] @@ -1254,10 +1254,10 @@ def link_inverted_entrances(world, player): else: raise NotImplementedError('Shuffling not supported yet') - if world.glitches_required[player] in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: overworld_glitch_connections(world, player) # mandatory hybrid major glitches connections - if world.glitches_required[player] in ['hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['hybrid_major_glitches', 'no_logic']: underworld_glitch_connections(world, player) # patch swamp drain @@ -1349,7 +1349,7 @@ def scramble_holes(world, player): else: hole_targets.append(('Pyramid Exit', 'Pyramid')) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # cannot move uncle cave connect_two_way(world, 'Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Secret Entrance Exit', player) connect_entrance(world, 'Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Secret Entrance', player) @@ -1358,14 +1358,14 @@ def scramble_holes(world, player): hole_targets.append(('Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Secret Entrance')) # do not shuffle sanctuary into pyramid hole unless shuffle is crossed - if world.entrance_shuffle[player] == 'crossed': + if world.worlds[player].options.entrance_shuffle == 'crossed': hole_targets.append(('Sanctuary Exit', 'Sewer Drop')) if world.shuffle_ganon: world.random.shuffle(hole_targets) exit, target = hole_targets.pop() connect_two_way(world, 'Pyramid Entrance', exit, player) connect_entrance(world, 'Pyramid Hole', target, player) - if world.entrance_shuffle[player] != 'crossed': + if world.worlds[player].options.entrance_shuffle != 'crossed': hole_targets.append(('Sanctuary Exit', 'Sewer Drop')) world.random.shuffle(hole_targets) @@ -1400,14 +1400,14 @@ def scramble_inverted_holes(world, player): hole_targets.append(('Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Secret Entrance')) # do not shuffle sanctuary into pyramid hole unless shuffle is crossed - if world.entrance_shuffle[player] == 'crossed': + if world.worlds[player].options.entrance_shuffle == 'crossed': hole_targets.append(('Sanctuary Exit', 'Sewer Drop')) if world.shuffle_ganon: world.random.shuffle(hole_targets) exit, target = hole_targets.pop() connect_two_way(world, 'Inverted Pyramid Entrance', exit, player) connect_entrance(world, 'Inverted Pyramid Hole', target, player) - if world.entrance_shuffle[player] != 'crossed': + if world.worlds[player].options.entrance_shuffle != 'crossed': hole_targets.append(('Sanctuary Exit', 'Sewer Drop')) world.random.shuffle(hole_targets) @@ -1430,15 +1430,15 @@ def connect_random(world, exitlist, targetlist, player, two_way=False): def connect_mandatory_exits(world, entrances, caves, must_be_exits, player): # Keeps track of entrances that cannot be used to access each exit / cave - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': invalid_connections = Inverted_Must_Exit_Invalid_Connections.copy() else: invalid_connections = Must_Exit_Invalid_Connections.copy() invalid_cave_connections = defaultdict(set) - if world.glitches_required[player] in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: from . import OverworldGlitchRules - for entrance in OverworldGlitchRules.get_non_mandatory_exits(world.mode[player] == 'inverted'): + for entrance in OverworldGlitchRules.get_non_mandatory_exits(world.worlds[player].options.mode == 'inverted'): invalid_connections[entrance] = set() if entrance in must_be_exits: must_be_exits.remove(entrance) @@ -1449,7 +1449,7 @@ def connect_mandatory_exits(world, entrances, caves, must_be_exits, player): world.random.shuffle(caves) # Handle inverted Aga Tower - if it depends on connections, then so does Hyrule Castle Ledge - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': for entrance in invalid_connections: if world.get_entrance(entrance, player).connected_region == world.get_region('Inverted Agahnims Tower', player): @@ -1490,7 +1490,7 @@ def connect_mandatory_exits(world, entrances, caves, must_be_exits, player): entrance = next(e for e in entrances[::-1] if e not in invalid_connections[exit]) cave_entrances.append(entrance) entrances.remove(entrance) - connect_two_way(world,entrance,cave_exit, player) + connect_two_way(world, entrance, cave_exit, player) if entrance not in invalid_connections: invalid_connections[exit] = set() if all(entrance in invalid_connections for entrance in cave_entrances): @@ -1564,7 +1564,7 @@ def simple_shuffle_dungeons(world, player): dungeon_entrances = ['Eastern Palace', 'Tower of Hera', 'Thieves Town', 'Skull Woods Final Section', 'Palace of Darkness', 'Ice Palace', 'Misery Mire', 'Swamp Palace'] dungeon_exits = ['Eastern Palace Exit', 'Tower of Hera Exit', 'Thieves Town Exit', 'Skull Woods Final Section Exit', 'Palace of Darkness Exit', 'Ice Palace Exit', 'Misery Mire Exit', 'Swamp Palace Exit'] - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': if not world.shuffle_ganon: connect_two_way(world, 'Ganons Tower', 'Ganons Tower Exit', player) else: @@ -1579,13 +1579,13 @@ def simple_shuffle_dungeons(world, player): # mix up 4 door dungeons multi_dungeons = ['Desert', 'Turtle Rock'] - if world.mode[player] == 'open' or (world.mode[player] == 'inverted' and world.shuffle_ganon): + if world.worlds[player].options.mode == 'open' or (world.worlds[player].options.mode == 'inverted' and world.shuffle_ganon): multi_dungeons.append('Hyrule Castle') world.random.shuffle(multi_dungeons) dp_target = multi_dungeons[0] tr_target = multi_dungeons[1] - if world.mode[player] not in ['open', 'inverted'] or (world.mode[player] == 'inverted' and world.shuffle_ganon is False): + if world.worlds[player].options.mode not in ['open', 'inverted'] or (world.worlds[player].options.mode == 'inverted' and world.shuffle_ganon is False): # place hyrule castle as intended hc_target = 'Hyrule Castle' else: @@ -1593,7 +1593,7 @@ def simple_shuffle_dungeons(world, player): # ToDo improve this? - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': if hc_target == 'Hyrule Castle': connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) connect_two_way(world, 'Hyrule Castle Entrance (East)', 'Hyrule Castle Exit (East)', player) @@ -1708,7 +1708,7 @@ def crossed_shuffle_dungeons(world, player: int): dungeon_entrances.append('Ganons Tower') dungeon_exits.append('Ganons Tower Exit') - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': # must connect front of hyrule castle to do escape connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) else: @@ -1718,7 +1718,7 @@ def crossed_shuffle_dungeons(world, player: int): connect_mandatory_exits(world, dungeon_entrances, dungeon_exits, LW_Dungeon_Entrances_Must_Exit + DW_Dungeon_Entrances_Must_Exit, player) - if world.mode[player] == 'standard': + if world.worlds[player].options.mode == 'standard': connect_caves(world, dungeon_entrances, [], [('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)')], player) connect_caves(world, dungeon_entrances, [], dungeon_exits, player) @@ -1823,14 +1823,14 @@ lookup = { def plando_connect(world, player: int): - if world.plando_connections[player]: - for connection in world.plando_connections[player]: + if world.worlds[player].options.plando_connections: + for connection in world.worlds[player].options.plando_connections: func = lookup[connection.direction] try: func(world, connection.entrance, connection.exit, player) except Exception as e: raise Exception(f"Could not connect using {connection}") from e - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': mark_light_world_regions(world, player) else: mark_dark_world_regions(world, player) diff --git a/worlds/alttp/ItemPool.py b/worlds/alttp/ItemPool.py index 77d02f9770..2b99ef8a73 100644 --- a/worlds/alttp/ItemPool.py +++ b/worlds/alttp/ItemPool.py @@ -226,25 +226,25 @@ def generate_itempool(world): player = world.player multiworld = world.multiworld - if multiworld.item_pool[player].current_key not in difficulties: - raise NotImplementedError(f"Diffulty {multiworld.item_pool[player]}") - if multiworld.goal[player] not in ('ganon', 'pedestal', 'bosses', 'triforce_hunt', 'local_triforce_hunt', - 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'crystals', - 'ganon_pedestal'): - raise NotImplementedError(f"Goal {multiworld.goal[player]} for player {player}") - if multiworld.mode[player] not in ('open', 'standard', 'inverted'): - raise NotImplementedError(f"Mode {multiworld.mode[player]} for player {player}") - if multiworld.timer[player] not in (False, 'display', 'timed', 'timed_ohko', 'ohko', 'timed_countdown'): - raise NotImplementedError(f"Timer {multiworld.timer[player]} for player {player}") + if world.options.item_pool.current_key not in difficulties: + raise NotImplementedError(f"Diffulty {world.options.item_pool}") + if world.options.goal not in ('ganon', 'pedestal', 'bosses', 'triforce_hunt', 'local_triforce_hunt', + 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'crystals', + 'ganon_pedestal'): + raise NotImplementedError(f"Goal {world.options.goal} for player {player}") + if world.options.mode not in ('open', 'standard', 'inverted'): + raise NotImplementedError(f"Mode {world.options.mode} for player {player}") + if world.options.timer not in (False, 'display', 'timed', 'timed_ohko', 'ohko', 'timed_countdown'): + raise NotImplementedError(f"Timer {world.options.timer} for player {player}") - if multiworld.timer[player] in ['ohko', 'timed_ohko']: + if world.options.timer in ['ohko', 'timed_ohko']: world.can_take_damage = False - if multiworld.goal[player] in ['pedestal', 'triforce_hunt', 'local_triforce_hunt']: + if world.options.goal in ['pedestal', 'triforce_hunt', 'local_triforce_hunt']: multiworld.push_item(multiworld.get_location('Ganon', player), item_factory('Nothing', world), False) else: multiworld.push_item(multiworld.get_location('Ganon', player), item_factory('Triforce', world), False) - if multiworld.goal[player] in ['triforce_hunt', 'local_triforce_hunt']: + if world.options.goal in ['triforce_hunt', 'local_triforce_hunt']: region = multiworld.get_region('Light World', player) loc = ALttPLocation(player, "Murahdahla", parent=region) @@ -288,7 +288,7 @@ def generate_itempool(world): for item in precollected_items: multiworld.push_precollected(item_factory(item, world)) - if multiworld.mode[player] == 'standard' and not has_melee_weapon(multiworld.state, player): + if world.options.mode == 'standard' and not has_melee_weapon(multiworld.state, player): if "Link's Uncle" not in placed_items: found_sword = False found_bow = False @@ -304,10 +304,10 @@ def generate_itempool(world): elif item in ['Hammer', 'Fire Rod', 'Cane of Somaria', 'Cane of Byrna']: if item not in possible_weapons: possible_weapons.append(item) - elif (item == 'Bombs (10)' and (not multiworld.bombless_start[player]) and item not in + elif (item == 'Bombs (10)' and (not world.options.bombless_start) and item not in possible_weapons): possible_weapons.append(item) - elif (item in ['Bomb Upgrade (+10)', 'Bomb Upgrade (50)'] and multiworld.bombless_start[player] and item + elif (item in ['Bomb Upgrade (+10)', 'Bomb Upgrade (50)'] and world.options.bombless_start and item not in possible_weapons): possible_weapons.append(item) @@ -315,21 +315,21 @@ def generate_itempool(world): placed_items["Link's Uncle"] = starting_weapon pool.remove(starting_weapon) if (placed_items["Link's Uncle"] in ['Bow', 'Progressive Bow', 'Bombs (10)', 'Bomb Upgrade (+10)', - 'Bomb Upgrade (50)', 'Cane of Somaria', 'Cane of Byrna'] and multiworld.enemy_health[player] not in ['default', 'easy']): - if multiworld.bombless_start[player] and "Bomb Upgrade" not in placed_items["Link's Uncle"]: + 'Bomb Upgrade (50)', 'Cane of Somaria', 'Cane of Byrna'] and world.options.enemy_health not in ['default', 'easy']): + if world.options.bombless_start and "Bomb Upgrade" not in placed_items["Link's Uncle"]: if 'Bow' in placed_items["Link's Uncle"]: - multiworld.worlds[player].escape_assist.append('arrows') + world.escape_assist.append('arrows') elif 'Cane' in placed_items["Link's Uncle"]: - multiworld.worlds[player].escape_assist.append('magic') + world.escape_assist.append('magic') else: - multiworld.worlds[player].escape_assist.append('bombs') + world.escape_assist.append('bombs') for (location, item) in placed_items.items(): multiworld.get_location(location, player).place_locked_item(item_factory(item, world)) items = item_factory(pool, world) # convert one Progressive Bow into Progressive Bow (Alt), in ID only, for ganon silvers hint text - if multiworld.worlds[player].has_progressive_bows: + if world.has_progressive_bows: for item in items: if item.code == 0x64: # Progressive Bow item.code = 0x65 # Progressive Bow (Alt) @@ -338,21 +338,21 @@ def generate_itempool(world): if clock_mode: world.clock_mode = clock_mode - multiworld.worlds[player].treasure_hunt_required = treasure_hunt_required % 999 - multiworld.worlds[player].treasure_hunt_total = treasure_hunt_total + world.treasure_hunt_required = treasure_hunt_required % 999 + world.treasure_hunt_total = treasure_hunt_total dungeon_items = [item for item in get_dungeon_item_pool_player(world) - if item.name not in multiworld.worlds[player].dungeon_local_item_names] + if item.name not in world.dungeon_local_item_names] for key_loc in key_drop_data: key_data = key_drop_data[key_loc] drop_item = item_factory(key_data[3], world) - if not multiworld.key_drop_shuffle[player]: + if not world.options.key_drop_shuffle: if drop_item in dungeon_items: dungeon_items.remove(drop_item) else: dungeon = drop_item.name.split("(")[1].split(")")[0] - if multiworld.mode[player] == 'inverted': + if world.options.mode == 'inverted': if dungeon == "Agahnims Tower": dungeon = "Inverted Agahnims Tower" if dungeon == "Ganons Tower": @@ -365,7 +365,7 @@ def generate_itempool(world): loc = multiworld.get_location(key_loc, player) loc.place_locked_item(drop_item) loc.address = None - elif "Small" in key_data[3] and multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal: + elif "Small" in key_data[3] and world.options.small_key_shuffle == small_key_shuffle.option_universal: # key drop shuffle and universal keys are on. Add universal keys in place of key drop keys. multiworld.itempool.append(item_factory(GetBeemizerItem(multiworld, player, 'Small Key (Universal)'), world)) dungeon_item_replacements = sum(difficulties[world.options.item_pool.current_key].extras, []) * 2 @@ -373,10 +373,10 @@ def generate_itempool(world): for x in range(len(dungeon_items)-1, -1, -1): item = dungeon_items[x] - if ((multiworld.small_key_shuffle[player] == small_key_shuffle.option_start_with and item.type == 'SmallKey') - or (multiworld.big_key_shuffle[player] == big_key_shuffle.option_start_with and item.type == 'BigKey') - or (multiworld.compass_shuffle[player] == compass_shuffle.option_start_with and item.type == 'Compass') - or (multiworld.map_shuffle[player] == map_shuffle.option_start_with and item.type == 'Map')): + if ((world.options.small_key_shuffle == small_key_shuffle.option_start_with and item.type == 'SmallKey') + or (world.options.big_key_shuffle == big_key_shuffle.option_start_with and item.type == 'BigKey') + or (world.options.compass_shuffle == compass_shuffle.option_start_with and item.type == 'Compass') + or (world.options.map_shuffle == map_shuffle.option_start_with and item.type == 'Map')): dungeon_items.pop(x) multiworld.push_precollected(item) multiworld.itempool.append(item_factory(dungeon_item_replacements.pop(), world)) @@ -384,7 +384,7 @@ def generate_itempool(world): set_up_shops(multiworld, player) - if multiworld.retro_bow[player]: + if world.options.retro_bow: shop_items = 0 shop_locations = [location for shop_locations in (shop.region.locations for shop in multiworld.shops if shop.type == ShopType.Shop and shop.region.player == player) for location in shop_locations if @@ -395,12 +395,12 @@ def generate_itempool(world): else: shop_items += 1 else: - shop_items = min(multiworld.shop_item_slots[player], 30 if multiworld.include_witch_hut[player] else 27) + shop_items = min(world.options.shop_item_slots, 30 if world.options.include_witch_hut else 27) - if multiworld.shuffle_capacity_upgrades[player]: + if world.options.shuffle_capacity_upgrades: shop_items += 2 - chance_100 = int(multiworld.retro_bow[player]) * 0.25 + int( - multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal) * 0.5 + chance_100 = int(world.options.retro_bow) * 0.25 + int( + world.options.small_key_shuffle == small_key_shuffle.option_universal) * 0.5 for _ in range(shop_items): if multiworld.random.random() < chance_100: items.append(item_factory(GetBeemizerItem(multiworld, player, "Rupees (100)"), world)) @@ -410,19 +410,19 @@ def generate_itempool(world): multiworld.random.shuffle(items) pool_count = len(items) new_items = ["Triforce Piece" for _ in range(additional_triforce_pieces)] - if multiworld.shuffle_capacity_upgrades[player] or multiworld.bombless_start[player]: - progressive = multiworld.progressive[player] + if world.options.shuffle_capacity_upgrades or world.options.bombless_start: + progressive = world.options.progressive progressive = multiworld.random.choice([True, False]) if progressive == 'grouped_random' else progressive == 'on' - if multiworld.shuffle_capacity_upgrades[player] == "on_combined": + if world.options.shuffle_capacity_upgrades == "on_combined": new_items.append("Bomb Upgrade (50)") - elif multiworld.shuffle_capacity_upgrades[player] == "on": + elif world.options.shuffle_capacity_upgrades == "on": new_items += ["Bomb Upgrade (+5)"] * 6 new_items.append("Bomb Upgrade (+5)" if progressive else "Bomb Upgrade (+10)") - if multiworld.shuffle_capacity_upgrades[player] != "on_combined" and multiworld.bombless_start[player]: + if world.options.shuffle_capacity_upgrades != "on_combined" and world.options.bombless_start: new_items.append("Bomb Upgrade (+5)" if progressive else "Bomb Upgrade (+10)") - if multiworld.shuffle_capacity_upgrades[player] and not multiworld.retro_bow[player]: - if multiworld.shuffle_capacity_upgrades[player] == "on_combined": + if world.options.shuffle_capacity_upgrades and not world.options.retro_bow: + if world.options.shuffle_capacity_upgrades == "on_combined": new_items += ["Arrow Upgrade (70)"] else: new_items += ["Arrow Upgrade (+5)"] * 6 @@ -481,7 +481,7 @@ def generate_itempool(world): if len(items) < pool_count: items += removed_filler[len(items) - pool_count:] - if multiworld.randomize_cost_types[player]: + if world.options.randomize_cost_types: # Heart and Arrow costs require all Heart Container/Pieces and Arrow Upgrades to be advancement items for logic for item in items: if item.name in ("Boss Heart Container", "Sanctuary Heart Container", "Piece of Heart"): @@ -490,21 +490,21 @@ def generate_itempool(world): # Otherwise, logic has some branches where having 4 hearts is one possible requirement (of several alternatives) # rather than making all hearts/heart pieces progression items (which slows down generation considerably) # We mark one random heart container as an advancement item (or 4 heart pieces in expert mode) - if multiworld.item_pool[player] in ['easy', 'normal', 'hard'] and not (multiworld.custom and multiworld.customitemarray[30] == 0): + if world.options.item_pool in ['easy', 'normal', 'hard'] and not (multiworld.custom and multiworld.customitemarray[30] == 0): next(item for item in items if item.name == 'Boss Heart Container').classification = ItemClassification.progression - elif multiworld.item_pool[player] in ['expert'] and not (multiworld.custom and multiworld.customitemarray[29] < 4): + elif world.options.item_pool in ['expert'] and not (multiworld.custom and multiworld.customitemarray[29] < 4): adv_heart_pieces = (item for item in items if item.name == 'Piece of Heart') for i in range(4): next(adv_heart_pieces).classification = ItemClassification.progression - world.required_medallions = (multiworld.misery_mire_medallion[player].current_key.title(), - multiworld.turtle_rock_medallion[player].current_key.title()) + world.required_medallions = (world.options.misery_mire_medallion.current_key.title(), + world.options.turtle_rock_medallion.current_key.title()) place_bosses(world) multiworld.itempool += items - if multiworld.retro_caves[player]: + if world.options.retro_caves: set_up_take_anys(multiworld, world, player) # depends on world.itempool to be set @@ -527,7 +527,7 @@ take_any_locations.sort() def set_up_take_anys(multiworld, world, player): # these are references, do not modify these lists in-place - if multiworld.mode[player] == 'inverted': + if world.options.mode == 'inverted': take_any_locs = take_any_locations_inverted else: take_any_locs = take_any_locations @@ -578,14 +578,14 @@ def set_up_take_anys(multiworld, world, player): def get_pool_core(world, player: int): - shuffle = world.entrance_shuffle[player].current_key - difficulty = world.item_pool[player].current_key - timer = world.timer[player].current_key - goal = world.goal[player].current_key - mode = world.mode[player].current_key - swordless = world.swordless[player] - retro_bow = world.retro_bow[player] - logic = world.glitches_required[player] + shuffle = world.worlds[player].options.entrance_shuffle.current_key + difficulty = world.worlds[player].options.item_pool.current_key + timer = world.worlds[player].options.timer.current_key + goal = world.worlds[player].options.goal.current_key + mode = world.worlds[player].options.mode.current_key + swordless = world.worlds[player].options.swordless + retro_bow = world.worlds[player].options.retro_bow + logic = world.worlds[player].options.glitches_required pool = [] placed_items = {} @@ -602,11 +602,11 @@ def get_pool_core(world, player: int): placed_items[loc] = item # provide boots to major glitch dependent seeds - if logic.current_key in {'overworld_glitches', 'hybrid_major_glitches', 'no_logic'} and world.glitch_boots[player]: + if logic.current_key in {'overworld_glitches', 'hybrid_major_glitches', 'no_logic'} and world.worlds[player].options.glitch_boots: precollected_items.append('Pegasus Boots') pool.remove('Pegasus Boots') pool.append('Rupees (20)') - want_progressives = world.progressive[player].want_progressives + want_progressives = world.worlds[player].options.progressive.want_progressives if want_progressives(world.random): pool.extend(diff.progressiveglove) @@ -680,22 +680,22 @@ def get_pool_core(world, player: int): additional_pieces_to_place = 0 if 'triforce_hunt' in goal: - if world.triforce_pieces_mode[player].value == TriforcePiecesMode.option_extra: - treasure_hunt_total = (world.triforce_pieces_required[player].value - + world.triforce_pieces_extra[player].value) - elif world.triforce_pieces_mode[player].value == TriforcePiecesMode.option_percentage: - percentage = float(world.triforce_pieces_percentage[player].value) / 100 - treasure_hunt_total = int(round(world.triforce_pieces_required[player].value * percentage, 0)) + if world.worlds[player].options.triforce_pieces_mode.value == TriforcePiecesMode.option_extra: + treasure_hunt_total = (world.worlds[player].options.triforce_pieces_required.value + + world.worlds[player].options.triforce_pieces_extra.value) + elif world.worlds[player].options.triforce_pieces_mode.value == TriforcePiecesMode.option_percentage: + percentage = float(world.worlds[player].options.triforce_pieces_percentage.value) / 100 + treasure_hunt_total = int(round(world.worlds[player].options.triforce_pieces_required.value * percentage, 0)) else: # available - treasure_hunt_total = world.triforce_pieces_available[player].value + treasure_hunt_total = world.worlds[player].options.triforce_pieces_available.value - triforce_pieces = min(90, max(treasure_hunt_total, world.triforce_pieces_required[player].value)) + triforce_pieces = min(90, max(treasure_hunt_total, world.worlds[player].options.triforce_pieces_required.value)) pieces_in_core = min(extraitems, triforce_pieces) additional_pieces_to_place = triforce_pieces - pieces_in_core pool.extend(["Triforce Piece"] * pieces_in_core) extraitems -= pieces_in_core - treasure_hunt_required = world.triforce_pieces_required[player].value + treasure_hunt_required = world.worlds[player].options.triforce_pieces_required.value for extra in diff.extras: if extraitems >= len(extra): @@ -714,10 +714,10 @@ def get_pool_core(world, player: int): if retro_bow: replace = {'Single Arrow', 'Arrows (10)', 'Arrow Upgrade (+5)', 'Arrow Upgrade (+10)', 'Arrow Upgrade (70)'} pool = ['Rupees (5)' if item in replace else item for item in pool] - if world.small_key_shuffle[player] == small_key_shuffle.option_universal: + if world.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: pool.extend(diff.universal_keys) if mode == 'standard': - if world.key_drop_shuffle[player]: + if world.worlds[player].options.key_drop_shuffle: key_locations = ['Secret Passage', 'Hyrule Castle - Map Guard Key Drop'] key_location = world.random.choice(key_locations) key_locations.remove(key_location) @@ -741,11 +741,11 @@ def get_pool_core(world, player: int): def make_custom_item_pool(world, player): - shuffle = world.entrance_shuffle[player] - difficulty = world.item_pool[player] - timer = world.timer[player] - goal = world.goal[player] - mode = world.mode[player] + shuffle = world.worlds[player].options.entrance_shuffle + difficulty = world.worlds[player].options.item_pool + timer = world.worlds[player].options.timer + goal = world.worlds[player].options.goal + mode = world.worlds[player].options.mode customitemarray = world.customitemarray pool = [] @@ -845,10 +845,10 @@ def make_custom_item_pool(world, player): thisbottle = world.random.choice(diff.bottles) pool.append(thisbottle) - if "triforce" in world.goal[player]: - pool.extend(["Triforce Piece"] * world.triforce_pieces_available[player]) - itemtotal += world.triforce_pieces_available[player] - treasure_hunt_required = world.triforce_pieces_required[player] + if "triforce" in world.worlds[player].options.goal: + pool.extend(["Triforce Piece"] * world.worlds[player].options.triforce_pieces_available) + itemtotal += world.worlds[player].options.triforce_pieces_available + treasure_hunt_required = world.worlds[player].options.triforce_pieces_required if timer in ['display', 'timed', 'timed_countdown']: clock_mode = 'countdown' if timer == 'timed_countdown' else 'stopwatch' @@ -862,7 +862,7 @@ def make_custom_item_pool(world, player): itemtotal = itemtotal + 1 if mode == 'standard': - if world.small_key_shuffle[player] == small_key_shuffle.option_universal: + if world.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: key_location = world.random.choice( ['Secret Passage', 'Hyrule Castle - Boomerang Chest', 'Hyrule Castle - Map Chest', 'Hyrule Castle - Zelda\'s Chest', 'Sewers - Dark Cross']) @@ -885,9 +885,9 @@ def make_custom_item_pool(world, player): pool.extend(['Magic Mirror'] * customitemarray[22]) pool.extend(['Moon Pearl'] * customitemarray[28]) - if world.small_key_shuffle[player] == small_key_shuffle.option_universal: + if world.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: itemtotal = itemtotal - 28 # Corrects for small keys not being in item pool in universal Mode - if world.key_drop_shuffle[player]: + if world.worlds[player].options.key_drop_shuffle: itemtotal = itemtotal - (len(key_drop_data) - 1) if itemtotal < total_items_to_place: pool.extend(['Nothing'] * (total_items_to_place - itemtotal)) diff --git a/worlds/alttp/Items.py b/worlds/alttp/Items.py index 5f081e65fc..cbe6e99642 100644 --- a/worlds/alttp/Items.py +++ b/worlds/alttp/Items.py @@ -11,11 +11,11 @@ def GetBeemizerItem(world, player: int, item): return item # first roll - replaceable item should be replaced, within beemizer_total_chance - if not world.beemizer_total_chance[player] or world.random.random() > (world.beemizer_total_chance[player] / 100): + if not world.worlds[player].options.beemizer_total_chance or world.random.random() > (world.worlds[player].options.beemizer_total_chance / 100): return item # second roll - bee replacement should be trap, within beemizer_trap_chance - if not world.beemizer_trap_chance[player] or world.random.random() > (world.beemizer_trap_chance[player] / 100): + if not world.worlds[player].options.beemizer_trap_chance or world.random.random() > (world.worlds[player].options.beemizer_trap_chance / 100): return "Bee" if isinstance(item, str) else world.create_item("Bee", player) else: return "Bee Trap" if isinstance(item, str) else world.create_item("Bee Trap", player) diff --git a/worlds/alttp/Options.py b/worlds/alttp/Options.py index 0974586117..519241d7f4 100644 --- a/worlds/alttp/Options.py +++ b/worlds/alttp/Options.py @@ -156,10 +156,10 @@ class OpenPyramid(Choice): def to_bool(self, world: MultiWorld, player: int) -> bool: if self.value == self.option_goal: - return world.goal[player].current_key in {'crystals', 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'ganon_pedestal'} + return world.worlds[player].options.goal.current_key in {'crystals', 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'ganon_pedestal'} elif self.value == self.option_auto: - return world.goal[player].current_key in {'crystals', 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'ganon_pedestal'} \ - and (world.entrance_shuffle[player].current_key in {'vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed'} or not + return world.worlds[player].options.goal.current_key in {'crystals', 'ganon_triforce_hunt', 'local_ganon_triforce_hunt', 'ganon_pedestal'} \ + and (world.worlds[player].options.entrance_shuffle.current_key in {'vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed'} or not world.shuffle_ganon) elif self.value == self.option_open: return True diff --git a/worlds/alttp/OverworldGlitchRules.py b/worlds/alttp/OverworldGlitchRules.py index 1a1c01525d..aeff9cb88e 100644 --- a/worlds/alttp/OverworldGlitchRules.py +++ b/worlds/alttp/OverworldGlitchRules.py @@ -220,14 +220,14 @@ def get_invalid_bunny_revival_dungeons(): def overworld_glitch_connections(world, player): # Boots-accessible locations. - create_owg_connections(player, world, get_boots_clip_exits_lw(world.mode[player] == 'inverted')) - create_owg_connections(player, world, get_boots_clip_exits_dw(world.mode[player] == 'inverted', player)) + create_owg_connections(player, world, get_boots_clip_exits_lw(world.worlds[player].options.mode == 'inverted')) + create_owg_connections(player, world, get_boots_clip_exits_dw(world.worlds[player].options.mode == 'inverted', player)) # Glitched speed drops. - create_owg_connections(player, world, get_glitched_speed_drops_dw(world.mode[player] == 'inverted')) + create_owg_connections(player, world, get_glitched_speed_drops_dw(world.worlds[player].options.mode == 'inverted')) # Mirror clip spots. - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': create_owg_connections(player, world, get_mirror_clip_spots_dw()) create_owg_connections(player, world, get_mirror_offset_spots_dw()) else: @@ -237,24 +237,24 @@ def overworld_glitch_connections(world, player): def overworld_glitches_rules(world, player): # Boots-accessible locations. - set_owg_connection_rules(player, world, get_boots_clip_exits_lw(world.mode[player] == 'inverted'), lambda state: can_boots_clip_lw(state, player)) - set_owg_connection_rules(player, world, get_boots_clip_exits_dw(world.mode[player] == 'inverted', player), lambda state: can_boots_clip_dw(state, player)) + set_owg_connection_rules(player, world, get_boots_clip_exits_lw(world.worlds[player].options.mode == 'inverted'), lambda state: can_boots_clip_lw(state, player)) + set_owg_connection_rules(player, world, get_boots_clip_exits_dw(world.worlds[player].options.mode == 'inverted', player), lambda state: can_boots_clip_dw(state, player)) # Glitched speed drops. - set_owg_connection_rules(player, world, get_glitched_speed_drops_dw(world.mode[player] == 'inverted'), lambda state: can_get_glitched_speed_dw(state, player)) + set_owg_connection_rules(player, world, get_glitched_speed_drops_dw(world.worlds[player].options.mode == 'inverted'), lambda state: can_get_glitched_speed_dw(state, player)) # Dark Death Mountain Ledge Clip Spot also accessible with mirror. - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': add_alternate_rule(world.get_entrance('Dark Death Mountain Ledge Clip Spot', player), lambda state: state.has('Magic Mirror', player)) # Mirror clip spots. - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': set_owg_connection_rules(player, world, get_mirror_clip_spots_dw(), lambda state: state.has('Magic Mirror', player)) set_owg_connection_rules(player, world, get_mirror_offset_spots_dw(), lambda state: state.has('Magic Mirror', player) and can_boots_clip_lw(state, player)) else: set_owg_connection_rules(player, world, get_mirror_offset_spots_lw(player), lambda state: state.has('Magic Mirror', player) and can_boots_clip_dw(state, player)) # Regions that require the boots and some other stuff. - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': world.get_entrance('Turtle Rock Teleporter', player).access_rule = lambda state: (can_boots_clip_lw(state, player) or can_lift_heavy_rocks(state, player)) and state.has('Hammer', player) add_alternate_rule(world.get_entrance('Waterfall of Wishing', player), lambda state: state.has('Moon Pearl', player) or state.has('Pegasus Boots', player)) else: diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py index 5ed048e881..f69e6bb955 100644 --- a/worlds/alttp/Rom.py +++ b/worlds/alttp/Rom.py @@ -92,7 +92,7 @@ class LocalRom: # cause crash to provide traceback import xxtea - local_random = world.per_slot_randoms[player] + local_random = world.worlds[player].random key = bytes(local_random.getrandbits(8 * 16).to_bytes(16, 'big')) self.write_bytes(0x1800B0, bytearray(key)) self.write_int16(0x180087, 1) @@ -281,7 +281,6 @@ def apply_random_sprite_on_event(rom: LocalRom, sprite, local_random, allow_rand def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): player = world.player - multiworld = world.multiworld check_enemizer(enemizercli) randopatch_path = os.path.abspath(os.path.join(output_directory, f'enemizer_randopatch_{player}.sfc')) options_path = os.path.abspath(os.path.join(output_directory, f'enemizer_options_{player}.json')) @@ -289,18 +288,18 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): # write options file for enemizer options = { - 'RandomizeEnemies': multiworld.enemy_shuffle[player].value, + 'RandomizeEnemies': world.options.enemy_shuffle.value, 'RandomizeEnemiesType': 3, - 'RandomizeBushEnemyChance': multiworld.bush_shuffle[player].value, - 'RandomizeEnemyHealthRange': multiworld.enemy_health[player] != 'default', + 'RandomizeBushEnemyChance': world.options.bush_shuffle.value, + 'RandomizeEnemyHealthRange': world.options.enemy_health != 'default', 'RandomizeEnemyHealthType': {'default': 0, 'easy': 0, 'normal': 1, 'hard': 2, 'expert': 3}[ - multiworld.enemy_health[player].current_key], + world.options.enemy_health.current_key], 'OHKO': False, - 'RandomizeEnemyDamage': multiworld.enemy_damage[player] != 'default', + 'RandomizeEnemyDamage': world.options.enemy_damage != 'default', 'AllowEnemyZeroDamage': True, - 'ShuffleEnemyDamageGroups': multiworld.enemy_damage[player] != 'default', - 'EnemyDamageChaosMode': multiworld.enemy_damage[player] == 'chaos', - 'EasyModeEscape': multiworld.mode[player] == "standard", + 'ShuffleEnemyDamageGroups': world.options.enemy_damage != 'default', + 'EnemyDamageChaosMode': world.options.enemy_damage == 'chaos', + 'EasyModeEscape': world.options.mode == "standard", 'EnemiesAbsorbable': False, 'AbsorbableSpawnRate': 10, 'AbsorbableTypes': { @@ -329,7 +328,7 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): 'GrayscaleMode': False, 'GenerateSpoilers': False, 'RandomizeLinkSpritePalette': False, - 'RandomizePots': multiworld.pot_shuffle[player].value, + 'RandomizePots': world.options.pot_shuffle.value, 'ShuffleMusic': False, 'BootlegMagic': True, 'CustomBosses': False, @@ -342,7 +341,7 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): 'BeesLevel': 0, 'RandomizeTileTrapPattern': False, 'RandomizeTileTrapFloorTile': False, - 'AllowKillableThief': multiworld.killable_thieves[player].value, + 'AllowKillableThief': world.options.killable_thieves.value, 'RandomizeSpriteOnHit': False, 'DebugMode': False, 'DebugForceEnemy': False, @@ -366,13 +365,13 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): 'MiseryMire': world.dungeons["Misery Mire"].boss.enemizer_name, 'TurtleRock': world.dungeons["Turtle Rock"].boss.enemizer_name, 'GanonsTower1': - world.dungeons["Ganons Tower" if multiworld.mode[player] != 'inverted' else + world.dungeons["Ganons Tower" if world.options.mode != 'inverted' else "Inverted Ganons Tower"].bosses['bottom'].enemizer_name, 'GanonsTower2': - world.dungeons["Ganons Tower" if multiworld.mode[player] != 'inverted' else + world.dungeons["Ganons Tower" if world.options.mode != 'inverted' else "Inverted Ganons Tower"].bosses['middle'].enemizer_name, 'GanonsTower3': - world.dungeons["Ganons Tower" if multiworld.mode[player] != 'inverted' else + world.dungeons["Ganons Tower" if world.options.mode != 'inverted' else "Inverted Ganons Tower"].bosses['top'].enemizer_name, 'GanonsTower4': 'Agahnim2', 'Ganon': 'Ganon', @@ -386,7 +385,7 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): max_enemizer_tries = 5 for i in range(max_enemizer_tries): - enemizer_seed = str(multiworld.per_slot_randoms[player].randint(0, 999999999)) + enemizer_seed = str(world.random.randint(0, 999999999)) enemizer_command = [os.path.abspath(enemizercli), '--rom', randopatch_path, '--seed', enemizer_seed, @@ -416,7 +415,7 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): continue for j in range(i + 1, max_enemizer_tries): - multiworld.per_slot_randoms[player].randint(0, 999999999) + world.random.randint(0, 999999999) # Sacrifice all remaining random numbers that would have been used for unused enemizer tries. # This allows for future enemizer bug fixes to NOT affect the rest of the seed's randomness break @@ -430,7 +429,7 @@ def patch_enemizer(world, rom: LocalRom, enemizercli, output_directory): # Moblins attached to "key drop" locations crash the game when dropping their item when Key Drop Shuffle is on. # Replace them with a Slime enemy if they are placed. - if multiworld.key_drop_shuffle[player]: + if world.options.key_drop_shuffle: key_drop_enemies = { 0x4DA20, 0x4DA5C, 0x4DB7F, 0x4DD73, 0x4DDC3, 0x4DE07, 0x4E201, 0x4E20A, 0x4E326, 0x4E4F7, 0x4E687, 0x4E70C, 0x4E7C8, 0x4E7FA @@ -792,8 +791,8 @@ def get_nonnative_item_sprite(code: int) -> int: def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): + local_random = world.worlds[player].random local_world = world.worlds[player] - local_random = local_world.random # patch items @@ -840,14 +839,14 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # patch music music_addresses = dungeon_music_addresses[location.name] - if world.map_shuffle[player]: + if local_world.options.map_shuffle: music = local_random.choice([0x11, 0x16]) else: music = 0x11 if 'Pendant' in location.item.name else 0x16 for music_address in music_addresses: rom.write_byte(music_address, music) - if world.map_shuffle[player]: + if local_world.options.map_shuffle: rom.write_byte(0x155C9, local_random.choice([0x11, 0x16])) # Randomize GT music too with map shuffle # patch entrance/exits/holes @@ -868,15 +867,15 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Thanks to Zarby89 for originally finding these values # todo fix screen scrolling - if world.entrance_shuffle[player] != 'insanity' and \ + if local_world.options.entrance_shuffle != 'insanity' and \ exit.name in {'Eastern Palace Exit', 'Tower of Hera Exit', 'Thieves Town Exit', 'Skull Woods Final Section Exit', 'Ice Palace Exit', 'Misery Mire Exit', 'Palace of Darkness Exit', 'Swamp Palace Exit', 'Ganons Tower Exit', 'Desert Palace Exit (North)', 'Agahnims Tower Exit', 'Spiral Cave Exit (Top)', 'Superbunny Cave Exit (Bottom)', 'Turtle Rock Ledge Exit (East)'} and \ - (world.glitches_required[player] not in ['hybrid_major_glitches', 'no_logic'] or - exit.name not in {'Palace of Darkness Exit', 'Tower of Hera Exit', 'Swamp Palace Exit'}): - # For exits that connot be reached from another, no need to apply offset fixes. + (local_world.options.glitches_required not in ['hybrid_major_glitches', 'no_logic'] or + exit.name not in {'Palace of Darkness Exit', 'Tower of Hera Exit', 'Swamp Palace Exit'}): + # For exits that cannot be reached from another, no need to apply offset fixes. rom.write_int16(0x15DB5 + 2 * offset, link_y) # same as final else elif room_id == 0x0059 and local_world.fix_skullwoods_exit: rom.write_int16(0x15DB5 + 2 * offset, 0x00F8) @@ -903,7 +902,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): else: # patch door table rom.write_byte(0xDBB73 + exit.addresses, exit.target) - if world.mode[player] == 'inverted': + if local_world.options.mode == 'inverted': patch_shuffled_dark_sanc(world, rom, player) write_custom_shops(rom, world, player) @@ -914,16 +913,16 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): return 0x53 + int(num), 0x79 + int(num) credits_total = 216 - if world.retro_caves[player]: # Old man cave and Take any caves will count towards collection rate. + if local_world.options.retro_caves: # Old man cave and Take any caves will count towards collection rate. credits_total += 5 - if world.shop_item_slots[player]: # Potion shop only counts towards collection rate if included in the shuffle. - credits_total += 30 if world.include_witch_hut[player] else 27 - if world.shuffle_capacity_upgrades[player]: + if local_world.options.shop_item_slots: # Potion shop only counts towards collection rate if included in the shuffle. + credits_total += 30 if local_world.options.include_witch_hut else 27 + if local_world.options.shuffle_capacity_upgrades: credits_total += 2 rom.write_byte(0x187010, credits_total) # dynamic credits - if world.key_drop_shuffle[player]: + if local_world.options.key_drop_shuffle: rom.write_byte(0x140000, 1) # enable key drop shuffle credits_total += len(key_drop_data) # update dungeon counters @@ -977,11 +976,11 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x51DE, 0x00) # set open mode: - if world.mode[player] in ['open', 'inverted']: + if local_world.options.mode in ['open', 'inverted']: rom.write_byte(0x180032, 0x01) # open mode - if world.mode[player] == 'inverted': + if local_world.options.mode == 'inverted': set_inverted_mode(world, player, rom) - elif world.mode[player] == 'standard': + elif local_world.options.mode == 'standard': rom.write_byte(0x180032, 0x00) # standard mode uncle_location = world.get_location('Link\'s Uncle', player) @@ -1001,7 +1000,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_bytes(0x6D323, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E]) # set light cones - rom.write_byte(0x180038, 0x01 if world.mode[player] == "standard" else 0x00) + rom.write_byte(0x180038, 0x01 if local_world.options.mode == "standard" else 0x00) rom.write_byte(0x180039, 0x01 if world.light_world_light_cone else 0x00) rom.write_byte(0x18003A, 0x01 if world.dark_world_light_cone else 0x00) @@ -1011,7 +1010,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x18004F, 0x01) # Byrna Invulnerability: on # handle item_functionality - if world.item_functionality[player] == 'hard': + if local_world.options.item_functionality == 'hard': rom.write_byte(0x180181, 0x01) # Make silver arrows work only on ganon rom.write_byte(0x180182, 0x00) # Don't auto equip silvers on pickup # Powdered Fairies Prize @@ -1031,7 +1030,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_int16(0x180036, world.rupoor_cost) # Set stun items rom.write_byte(0x180180, 0x02) # Hookshot only - elif world.item_functionality[player] == 'expert': + elif local_world.options.item_functionality == 'expert': rom.write_byte(0x180181, 0x01) # Make silver arrows work only on ganon rom.write_byte(0x180182, 0x00) # Don't auto equip silvers on pickup # Powdered Fairies Prize @@ -1071,7 +1070,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Set stun items rom.write_byte(0x180180, 0x03) # All standard items # Set overflow items for progressive equipment - if world.timer[player] in ['timed', 'timed_countdown', 'timed_ohko']: + if local_world.options.timer in ['timed', 'timed_countdown', 'timed_ohko']: overflow_replacement = GREEN_CLOCK else: overflow_replacement = GREEN_TWENTY_RUPEES @@ -1083,7 +1082,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Set overflow items for progressive equipment rom.write_bytes(0x180090, - [difficulty.progressive_sword_limit if not world.swordless[player] else 0, + [difficulty.progressive_sword_limit if not local_world.options.swordless else 0, item_table[difficulty.basicsword[-1]].item_code, difficulty.progressive_shield_limit, item_table[difficulty.basicshield[-1]].item_code, difficulty.progressive_armor_limit, item_table[difficulty.basicarmor[-1]].item_code, @@ -1091,7 +1090,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): difficulty.progressive_bow_limit, item_table[difficulty.basicbow[-1]].item_code]) if difficulty.progressive_bow_limit < 2 and ( - world.swordless[player] or world.glitches_required[player] == 'no_glitches'): + local_world.options.swordless or local_world.options.glitches_required == 'no_glitches'): rom.write_bytes(0x180098, [2, item_table["Silver Bow"].item_code]) rom.write_byte(0x180181, 0x01) # Make silver arrows work only on ganon rom.write_byte(0x180182, 0x00) # Don't auto equip silvers on pickup @@ -1099,15 +1098,15 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # set up game internal RNG seed rom.write_bytes(0x178000, local_random.getrandbits(8 * 1024).to_bytes(1024, 'big')) prize_replacements = {} - if world.item_functionality[player] in ['hard', 'expert']: + if local_world.options.item_functionality in ['hard', 'expert']: prize_replacements[0xE0] = 0xDF # Fairy -> heart prize_replacements[0xE3] = 0xD8 # Big magic -> small magic - if world.retro_bow[player]: + if local_world.options.retro_bow: prize_replacements[0xE1] = 0xDA # 5 Arrows -> Blue Rupee prize_replacements[0xE2] = 0xDB # 10 Arrows -> Red Rupee - if world.shuffle_prizes[player] in ("general", "both"): + if local_world.options.shuffle_prizes in ("general", "both"): # shuffle prize packs prizes = [0xD8, 0xD8, 0xD8, 0xD8, 0xD9, 0xD8, 0xD8, 0xD9, 0xDA, 0xD9, 0xDA, 0xDB, 0xDA, 0xD9, 0xDA, 0xDA, 0xE0, 0xDF, 0xDF, 0xDA, 0xE0, 0xDF, 0xD8, 0xDF, @@ -1169,7 +1168,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): byte = int(rom.read_byte(address)) rom.write_byte(address, prize_replacements.get(byte, byte)) - if world.shuffle_prizes[player] in ("bonk", "both"): + if local_world.options.shuffle_prizes in ("bonk", "both"): # set bonk prizes bonk_prizes = [0x79, 0xE3, 0x79, 0xAC, 0xAC, 0xE0, 0xDC, 0xAC, 0xE3, 0xE3, 0xDA, 0xE3, 0xDA, 0xD8, 0xAC, 0xAC, 0xE3, 0xD8, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xE3, 0xDC, 0xDB, 0xE3, 0xDA, 0x79, 0x79, @@ -1196,7 +1195,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): 0x12, 0x01, 0x35, 0xFF, # lamp -> 5 rupees 0x51, 0x06, 0x52, 0xFF, # 6 +5 bomb upgrades -> +10 bomb upgrade 0x53, 0x06, 0x54, 0xFF, # 6 +5 arrow upgrades -> +10 arrow upgrade - 0x58, 0x01, 0x36 if world.retro_bow[player] else 0x43, 0xFF, # silver arrows -> single arrow (red 20 in retro mode) + 0x58, 0x01, 0x36 if local_world.options.retro_bow else 0x43, 0xFF, # silver arrows -> single arrow (red 20 in retro mode) 0x3E, difficulty.boss_heart_container_limit, 0x47, 0xff, # boss heart -> green 20 0x17, difficulty.heart_piece_limit, 0x47, 0xff, # piece of heart -> green 20 0xFF, 0xFF, 0xFF, 0xFF, # end of table sentinel @@ -1238,13 +1237,13 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x180029, 0x01) # Smithy quick item give # set swordless mode settings - rom.write_byte(0x18003F, 0x01 if world.swordless[player] else 0x00) # hammer can harm ganon - rom.write_byte(0x180040, 0x01 if world.swordless[player] else 0x00) # open curtains - rom.write_byte(0x180041, 0x01 if world.swordless[player] else 0x00) # swordless medallions - rom.write_byte(0x180043, 0xFF if world.swordless[player] else 0x00) # starting sword for link - rom.write_byte(0x180044, 0x01 if world.swordless[player] else 0x00) # hammer activates tablets + rom.write_byte(0x18003F, 0x01 if local_world.options.swordless else 0x00) # hammer can harm ganon + rom.write_byte(0x180040, 0x01 if local_world.options.swordless else 0x00) # open curtains + rom.write_byte(0x180041, 0x01 if local_world.options.swordless else 0x00) # swordless medallions + rom.write_byte(0x180043, 0xFF if local_world.options.swordless else 0x00) # starting sword for link + rom.write_byte(0x180044, 0x01 if local_world.options.swordless else 0x00) # hammer activates tablets - if world.item_functionality[player] == 'easy': + if local_world.options.item_functionality == 'easy': rom.write_byte(0x18003F, 0x01) # hammer can harm ganon rom.write_byte(0x180041, 0x02) # Allow swordless medallion use EVERYWHERE. rom.write_byte(0x180044, 0x01) # hammer activates tablets @@ -1262,11 +1261,11 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Set up requested clock settings if local_world.clock_mode in ['countdown-ohko', 'stopwatch', 'countdown']: rom.write_int32(0x180200, - world.red_clock_time[player] * 60 * 60) # red clock adjustment time (in frames, sint32) + local_world.options.red_clock_time * 60 * 60) # red clock adjustment time (in frames, sint32) rom.write_int32(0x180204, - world.blue_clock_time[player] * 60 * 60) # blue clock adjustment time (in frames, sint32) + local_world.options.blue_clock_time * 60 * 60) # blue clock adjustment time (in frames, sint32) rom.write_int32(0x180208, - world.green_clock_time[player] * 60 * 60) # green clock adjustment time (in frames, sint32) + local_world.options.green_clock_time * 60 * 60) # green clock adjustment time (in frames, sint32) else: rom.write_int32(0x180200, 0) # red clock adjustment time (in frames, sint32) rom.write_int32(0x180204, 0) # blue clock adjustment time (in frames, sint32) @@ -1274,20 +1273,20 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Set up requested start time for countdown modes if local_world.clock_mode in ['countdown-ohko', 'countdown']: - rom.write_int32(0x18020C, world.countdown_start_time[player] * 60 * 60) # starting time (in frames, sint32) + rom.write_int32(0x18020C, local_world.options.countdown_start_time * 60 * 60) # starting time (in frames, sint32) else: rom.write_int32(0x18020C, 0) # starting time (in frames, sint32) # set up goals for treasure hunt rom.write_int16(0x180163, max(0, local_world.treasure_hunt_required - - sum(1 for item in world.precollected_items[player] if item.name == "Triforce Piece"))) + sum(1 for item in world.precollected_items[player] if item.name == "Triforce Piece"))) rom.write_bytes(0x180165, [0x0E, 0x28]) # Triforce Piece Sprite rom.write_byte(0x180194, 1) # Must turn in triforced pieces (instant win not enabled) rom.write_bytes(0x180213, [0x00, 0x01]) # Not a Tournament Seed gametype = 0x04 # item - if world.entrance_shuffle[player] != 'vanilla': + if local_world.options.entrance_shuffle != 'vanilla': gametype |= 0x02 # entrance if enemized: gametype |= 0x01 # enemizer @@ -1298,7 +1297,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x1800A2, 0x01 if local_world.fix_fake_world else 0x00) # Lock or unlock aga tower door during escape sequence. rom.write_byte(0x180169, 0x00) - if world.mode[player] == 'inverted': + if local_world.options.mode == 'inverted': rom.write_byte(0x180169, 0x02) # lock aga/ganon tower door with crystals in inverted rom.write_byte(0x180171, 0x01 if local_world.ganon_at_pyramid else 0x00) # Enable respawning on pyramid after ganon death @@ -1309,9 +1308,8 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_bytes(0x50563, [0x3F, 0x14]) # disable below ganon chest rom.write_byte(0x50599, 0x00) # disable below ganon chest rom.write_bytes(0xE9A5, [0x7E, 0x00, 0x24]) # disable below ganon chest - rom.write_byte(0x18008B, 0x01 if world.open_pyramid[player].to_bool(world, player) else 0x00) # pre-open Pyramid Hole - rom.write_byte(0x18008C, 0x01 if world.crystals_needed_for_gt[ - player] == 0 else 0x00) # GT pre-opened if crystal requirement is 0 + rom.write_byte(0x18008B, 0x01 if local_world.options.open_pyramid.to_bool(world, player) else 0x00) # pre-open Pyramid Hole + rom.write_byte(0x18008C, 0x01 if local_world.options.crystals_needed_for_gt == 0 else 0x00) # GT pre-opened if crystal requirement is 0 rom.write_byte(0xF5D73, 0xF0) # bees are catchable rom.write_byte(0xF5F10, 0xF0) # bees are catchable rom.write_byte(0x180086, 0x00 if world.aga_randomness else 0x01) # set blue ball and ganon warp randomness @@ -1325,7 +1323,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): equip[0x36C] = 0x18 equip[0x36D] = 0x18 equip[0x379] = 0x68 - starting_max_bombs = 0 if world.bombless_start[player] else 10 + starting_max_bombs = 0 if local_world.options.bombless_start else 10 starting_max_arrows = 30 startingstate = CollectionState(world) @@ -1333,12 +1331,12 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): if startingstate.has('Silver Bow', player): equip[0x340] = 1 equip[0x38E] |= 0x60 - if not world.retro_bow[player]: + if not local_world.options.retro_bow: equip[0x38E] |= 0x80 elif startingstate.has('Bow', player): equip[0x340] = 1 equip[0x38E] |= 0x20 # progressive flag to get the correct hint in all cases - if not world.retro_bow[player]: + if not local_world.options.retro_bow: equip[0x38E] |= 0x80 if startingstate.has('Silver Arrows', player): equip[0x38E] |= 0x40 @@ -1476,7 +1474,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): elif item.name in bombs: equip[0x343] += bombs[item.name] elif item.name in arrows: - if world.retro_bow[player]: + if local_world.options.retro_bow: equip[0x38E] |= 0x80 equip[0x377] = 1 else: @@ -1502,16 +1500,13 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_bytes(0x183000, equip[0x340:]) rom.write_bytes(0x271A6, equip[0x340:0x340 + 60]) - rom.write_byte(0x18004A, 0x00 if world.mode[player] != 'inverted' else 0x01) # Inverted mode + rom.write_byte(0x18004A, 0x00 if local_world.options.mode != 'inverted' else 0x01) # Inverted mode rom.write_byte(0x18005D, 0x00) # Hammer always breaks barrier - rom.write_byte(0x2AF79, 0xD0 if world.mode[ - player] != 'inverted' else 0xF0) # vortexes: Normal (D0=light to dark, F0=dark to light, 42 = both) - rom.write_byte(0x3A943, 0xD0 if world.mode[ - player] != 'inverted' else 0xF0) # Mirror: Normal (D0=Dark to Light, F0=light to dark, 42 = both) - rom.write_byte(0x3A96D, 0xF0 if world.mode[ - player] != 'inverted' else 0xD0) # Residual Portal: Normal (F0= Light Side, D0=Dark Side, 42 = both (Darth Vader)) + rom.write_byte(0x2AF79, 0xD0 if local_world.options.mode != 'inverted' else 0xF0) # vortexes: Normal (D0=light to dark, F0=dark to light, 42 = both) + rom.write_byte(0x3A943, 0xD0 if local_world.options.mode != 'inverted' else 0xF0) # Mirror: Normal (D0=Dark to Light, F0=light to dark, 42 = both) + rom.write_byte(0x3A96D, 0xF0 if local_world.options.mode != 'inverted' else 0xD0) # Residual Portal: Normal (F0= Light Side, D0=Dark Side, 42 = both (Darth Vader)) rom.write_byte(0x3A9A7, 0xD0) # Residual Portal: Normal (D0= Light Side, F0=Dark Side, 42 = both (Darth Vader)) - if world.shuffle_capacity_upgrades[player]: + if local_world.options.shuffle_capacity_upgrades: rom.write_bytes(0x180080, [5, 10, 5, 10]) # values to fill for Capacity Upgrades (Bomb5, Bomb10, Arrow5, Arrow10) else: @@ -1522,21 +1517,21 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): (0x02 if 'bombs' in local_world.escape_assist else 0x00) | (0x04 if 'magic' in local_world.escape_assist else 0x00))) # Escape assist - if world.goal[player] in ['pedestal', 'triforce_hunt', 'local_triforce_hunt']: + if local_world.options.goal in ['pedestal', 'triforce_hunt', 'local_triforce_hunt']: rom.write_byte(0x18003E, 0x01) # make ganon invincible - elif world.goal[player] in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: + elif local_world.options.goal in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: rom.write_byte(0x18003E, 0x05) # make ganon invincible until enough triforce pieces are collected - elif world.goal[player] in ['ganon_pedestal']: + elif local_world.options.goal in ['ganon_pedestal']: rom.write_byte(0x18003E, 0x06) - elif world.goal[player] in ['bosses']: + elif local_world.options.goal in ['bosses']: rom.write_byte(0x18003E, 0x02) # make ganon invincible until all bosses are beat - elif world.goal[player] in ['crystals']: + elif local_world.options.goal in ['crystals']: rom.write_byte(0x18003E, 0x04) # make ganon invincible until all crystals else: rom.write_byte(0x18003E, 0x03) # make ganon invincible until all crystals and aga 2 are collected - rom.write_byte(0x18005E, world.crystals_needed_for_gt[player]) - rom.write_byte(0x18005F, world.crystals_needed_for_ganon[player]) + rom.write_byte(0x18005E, local_world.options.crystals_needed_for_gt) + rom.write_byte(0x18005F, local_world.options.crystals_needed_for_ganon) # Bitfield - enable text box to show with free roaming items # @@ -1547,21 +1542,20 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # c - enabled for inside compasses # s - enabled for inside small keys # block HC upstairs doors in rain state in standard mode - rom.write_byte(0x18008A, 0x01 if world.mode[player] == "standard" and world.entrance_shuffle[player] != 'vanilla' else 0x00) + rom.write_byte(0x18008A, 0x01 if local_world.options.mode == "standard" and local_world.options.entrance_shuffle != 'vanilla' else 0x00) - rom.write_byte(0x18016A, 0x10 | ((0x01 if world.small_key_shuffle[player] else 0x00) - | (0x02 if world.compass_shuffle[player] else 0x00) - | (0x04 if world.map_shuffle[player] else 0x00) - | (0x08 if world.big_key_shuffle[ - player] else 0x00))) # free roaming item text boxes - rom.write_byte(0x18003B, 0x01 if world.map_shuffle[player] else 0x00) # maps showing crystals on overworld + rom.write_byte(0x18016A, 0x10 | ((0x01 if local_world.options.small_key_shuffle else 0x00) + | (0x02 if local_world.options.compass_shuffle else 0x00) + | (0x04 if local_world.options.map_shuffle else 0x00) + | (0x08 if local_world.options.big_key_shuffle else 0x00))) # free roaming item text boxes + rom.write_byte(0x18003B, 0x01 if local_world.options.map_shuffle else 0x00) # maps showing crystals on overworld # compasses showing dungeon count - if local_world.clock_mode or world.dungeon_counters[player] == 'off': + if local_world.clock_mode or local_world.options.dungeon_counters == 'off': rom.write_byte(0x18003C, 0x00) # Currently must be off if timer is on, because they use same HUD location - elif world.dungeon_counters[player] == 'on': + elif local_world.options.dungeon_counters == 'on': rom.write_byte(0x18003C, 0x02) # always on - elif world.compass_shuffle[player] or world.dungeon_counters[player] == 'pickup': + elif local_world.options.compass_shuffle or local_world.options.dungeon_counters == 'pickup': rom.write_byte(0x18003C, 0x01) # show on pickup else: rom.write_byte(0x18003C, 0x00) @@ -1574,11 +1568,11 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # b - Big Key # a - Small Key # - rom.write_byte(0x180045, ((0x00 if (world.small_key_shuffle[player] == small_key_shuffle.option_original_dungeon or - world.small_key_shuffle[player] == small_key_shuffle.option_universal) else 0x01) - | (0x02 if world.big_key_shuffle[player] else 0x00) - | (0x04 if world.map_shuffle[player] else 0x00) - | (0x08 if world.compass_shuffle[player] else 0x00))) # free roaming items in menu + rom.write_byte(0x180045, ((0x00 if (local_world.options.small_key_shuffle == small_key_shuffle.option_original_dungeon or + local_world.options.small_key_shuffle == small_key_shuffle.option_universal) else 0x01) + | (0x02 if local_world.options.big_key_shuffle else 0x00) + | (0x04 if local_world.options.map_shuffle else 0x00) + | (0x08 if local_world.options.compass_shuffle else 0x00))) # free roaming items in menu # Map reveals reveal_bytes = { @@ -1604,31 +1598,25 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): return 0x0000 rom.write_int16(0x18017A, - get_reveal_bytes('Green Pendant') if world.map_shuffle[player] else 0x0000) # Sahasrahla reveal - rom.write_int16(0x18017C, get_reveal_bytes('Crystal 5') | get_reveal_bytes('Crystal 6') if world.map_shuffle[ - player] else 0x0000) # Bomb Shop Reveal + get_reveal_bytes('Green Pendant') if local_world.options.map_shuffle else 0x0000) # Sahasrahla reveal + rom.write_int16(0x18017C, get_reveal_bytes('Crystal 5') | get_reveal_bytes('Crystal 6') if local_world.options.map_shuffle else 0x0000) # Bomb Shop Reveal - rom.write_byte(0x180172, 0x01 if world.small_key_shuffle[ - player] == small_key_shuffle.option_universal else 0x00) # universal keys - rom.write_byte(0x18637E, 0x01 if world.retro_bow[player] else 0x00) # Skip quiver in item shops once bought - rom.write_byte(0x180175, 0x01 if world.retro_bow[player] else 0x00) # rupee bow - rom.write_byte(0x180176, 0x0A if world.retro_bow[player] else 0x00) # wood arrow cost - rom.write_byte(0x180178, 0x32 if world.retro_bow[player] else 0x00) # silver arrow cost - rom.write_byte(0x301FC, 0xDA if world.retro_bow[player] else 0xE1) # rupees replace arrows under pots - rom.write_byte(0x30052, 0xDB if world.retro_bow[player] else 0xE2) # replace arrows in fish prize from bottle merchant - rom.write_bytes(0xECB4E, [0xA9, 0x00, 0xEA, 0xEA] if world.retro_bow[player] else [0xAF, 0x77, 0xF3, - 0x7E]) # Thief steals rupees instead of arrows - rom.write_bytes(0xF0D96, [0xA9, 0x00, 0xEA, 0xEA] if world.retro_bow[player] else [0xAF, 0x77, 0xF3, - 0x7E]) # Pikit steals rupees instead of arrows - rom.write_bytes(0xEDA5, - [0x35, 0x41] if world.retro_bow[player] else [0x43, 0x44]) # Chest game gives rupees instead of arrows + rom.write_byte(0x180172, 0x01 if local_world.options.small_key_shuffle == small_key_shuffle.option_universal else 0x00) # universal keys + rom.write_byte(0x18637E, 0x01 if local_world.options.retro_bow else 0x00) # Skip quiver in item shops once bought + rom.write_byte(0x180175, 0x01 if local_world.options.retro_bow else 0x00) # rupee bow + rom.write_byte(0x180176, 0x0A if local_world.options.retro_bow else 0x00) # wood arrow cost + rom.write_byte(0x180178, 0x32 if local_world.options.retro_bow else 0x00) # silver arrow cost + rom.write_byte(0x301FC, 0xDA if local_world.options.retro_bow else 0xE1) # rupees replace arrows under pots + rom.write_byte(0x30052, 0xDB if local_world.options.retro_bow else 0xE2) # replace arrows in fish prize from bottle merchant + rom.write_bytes(0xECB4E, [0xA9, 0x00, 0xEA, 0xEA] if local_world.options.retro_bow else [0xAF, 0x77, 0xF3, 0x7E]) # Thief steals rupees instead of arrows + rom.write_bytes(0xF0D96, [0xA9, 0x00, 0xEA, 0xEA] if local_world.options.retro_bow else [0xAF, 0x77, 0xF3, 0x7E]) # Pikit steals rupees instead of arrows + rom.write_bytes(0xEDA5, [0x35, 0x41] if local_world.options.retro_bow else [0x43, 0x44]) # Chest game gives rupees instead of arrows digging_game_rng = local_random.randint(1, 30) # set rng for digging game rom.write_byte(0x180020, digging_game_rng) rom.write_byte(0xEFD95, digging_game_rng) rom.write_byte(0x1800A3, 0x01) # enable correct world setting behaviour after agahnim kills - rom.write_byte(0x1800A4, 0x01 if world.glitches_required[player] != 'no_logic' else 0x00) # enable POD EG fix - rom.write_byte(0x186383, 0x01 if world.glitches_required[ - player] == 'no_logic' else 0x00) # disable glitching to Triforce from Ganons Room + rom.write_byte(0x1800A4, 0x01 if local_world.options.glitches_required != 'no_logic' else 0x00) # enable POD EG fix + rom.write_byte(0x186383, 0x01 if local_world.options.glitches_required == 'no_logic' else 0x00) # disable glitching to Triforce from Ganons Room rom.write_byte(0x180042, 0x01 if world.save_and_quit_from_boss else 0x00) # Allow Save and Quit after boss kill # remove shield from uncle @@ -1645,7 +1633,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_bytes(0x180185, [0, 0, 0]) # Uncle respawn refills (magic, bombs, arrows) rom.write_bytes(0x180188, [0, 0, 0]) # Zelda respawn refills (magic, bombs, arrows) rom.write_bytes(0x18018B, [0, 0, 0]) # Mantle respawn refills (magic, bombs, arrows) - if world.mode[player] == 'standard' and uncle_location.item and uncle_location.item.player == player: + if local_world.options.mode == 'standard' and uncle_location.item and uncle_location.item.player == player: if uncle_location.item.name in {'Bow', 'Progressive Bow'}: rom.write_byte(0x18004E, 1) # Escape Fill (arrows) rom.write_int16(0x180183, 300) # Escape fill rupee bow @@ -1673,8 +1661,8 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): 0xAD, 0xBF, 0x0A, 0xF0, 0x4F]) # allow smith into multi-entrance caves in appropriate shuffles - if world.entrance_shuffle[player] in ['restricted', 'full', 'crossed', 'insanity'] or ( - world.entrance_shuffle[player] == 'simple' and world.mode[player] == 'inverted'): + if local_world.options.entrance_shuffle in ['restricted', 'full', 'crossed', 'insanity'] or ( + local_world.options.entrance_shuffle == 'simple' and local_world.options.mode == 'inverted'): rom.write_byte(0x18004C, 0x01) # set correct flag for hera basement item @@ -1694,8 +1682,8 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0xFED31, 0x2A) # bombable exit rom.write_byte(0xFEE41, 0x2A) # bombable exit - if world.tile_shuffle[player]: - tile_set = TileSet.get_random_tile_set(world.per_slot_randoms[player]) + if local_world.options.tile_shuffle: + tile_set = TileSet.get_random_tile_set(world.worlds[player].random) rom.write_byte(0x4BA21, tile_set.get_speed()) rom.write_byte(0x4BA1D, tile_set.get_len()) rom.write_bytes(0x4BA2A, tile_set.get_bytes()) @@ -1770,9 +1758,9 @@ def write_custom_shops(rom, world, player): slot = 0 if shop.type == ShopType.TakeAny else index if item is None: break - if world.shop_item_slots[player] or shop.type == ShopType.TakeAny: - count_shop = (shop.region.name != 'Potion Shop' or world.include_witch_hut[player]) and \ - (shop.region.name != 'Capacity Upgrade' or world.shuffle_capacity_upgrades[player]) + if world.worlds[player].options.shop_item_slots or shop.type == ShopType.TakeAny: + count_shop = (shop.region.name != 'Potion Shop' or world.worlds[player].options.include_witch_hut) and \ + (shop.region.name != 'Capacity Upgrade' or world.worlds[player].options.shuffle_capacity_upgrades) rom.write_byte(0x186560 + shop.sram_offset + slot, 1 if count_shop else 0) if item['item'] == 'Single Arrow' and item['player'] == 0: arrow_mask |= 1 << index @@ -1789,7 +1777,7 @@ def write_custom_shops(rom, world, player): item_code = get_nonnative_item_sprite(world.worlds[item['player']].item_name_to_id[item['item']]) else: item_code = item_table[item["item"]].item_code - if item['item'] == 'Single Arrow' and item['player'] == 0 and world.retro_bow[player]: + if item['item'] == 'Single Arrow' and item['player'] == 0 and world.worlds[player].options.retro_bow: rom.write_byte(0x186500 + shop.sram_offset + slot, arrow_mask) item_data = [shop_id, item_code] + price_data + \ @@ -1802,7 +1790,7 @@ def write_custom_shops(rom, world, player): items_data.extend([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]) rom.write_bytes(0x184900, items_data) - if world.retro_bow[player]: + if world.worlds[player].options.retro_bow: retro_shop_slots.append(0xFF) rom.write_bytes(0x186540, retro_shop_slots) @@ -2207,19 +2195,18 @@ def write_string_to_rom(rom, target, string): def write_strings(rom, world, player): from . import ALTTPWorld - + local_random = world.worlds[player].random w: ALTTPWorld = world.worlds[player] - local_random = w.random tt = TextTable() tt.removeUnwantedText() # Let's keep this guy's text accurate to the shuffle setting. - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_full', 'dungeons_simple', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_full', 'dungeons_simple', 'dungeons_crossed']: tt['kakariko_flophouse_man_no_flippers'] = 'I really hate mowing my yard.\n{PAGEBREAK}\nI should move.' tt['kakariko_flophouse_man'] = 'I really hate mowing my yard.\n{PAGEBREAK}\nI should move.' - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': tt['sign_village_of_outcasts'] = 'attention\nferal ducks sighted\nhiding in statues\n\nflute players beware\n' def hint_text(dest, ped_hint=False): @@ -2238,21 +2225,21 @@ def write_strings(rom, world, player): hint += f" for {world.player_name[dest.player]}" return hint - if world.scams[player].gives_king_zora_hint: + if world.worlds[player].options.scams.gives_king_zora_hint: # Zora hint zora_location = world.get_location("King Zora", player) tt['zora_tells_cost'] = f"You got 500 rupees to buy {hint_text(zora_location.item)}" \ f"\n ≥ Duh\n Oh carp\n{{CHOICE}}" - if world.scams[player].gives_bottle_merchant_hint: + if world.worlds[player].options.scams.gives_bottle_merchant_hint: # Bottle Vendor hint vendor_location = world.get_location("Bottle Merchant", player) tt['bottle_vendor_choice'] = f"I gots {hint_text(vendor_location.item)}\nYous gots 100 rupees?" \ f"\n ≥ I want\n no way!\n{{CHOICE}}" # First we write hints about entrances, some from the inconvenient list others from all reasonable entrances. - if world.hints[player]: - if world.hints[player].value >= 2: - if world.hints[player] == "full": + if world.worlds[player].options.hints: + if world.worlds[player].options.hints.value >= 2: + if world.worlds[player].options.hints == "full": tt['sign_north_of_links_house'] = '> Randomizer The telepathic tiles have hints!' else: tt['sign_north_of_links_house'] = '> Randomizer The telepathic tiles can have hints!' @@ -2265,11 +2252,11 @@ def write_strings(rom, world, player): entrances_to_hint = {} entrances_to_hint.update(InconvenientDungeonEntrances) if world.shuffle_ganon: - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': entrances_to_hint.update({'Inverted Ganons Tower': 'The sealed castle door'}) else: entrances_to_hint.update({'Ganons Tower': 'Ganon\'s Tower'}) - if world.entrance_shuffle[player] in ['simple', 'restricted']: + if world.worlds[player].options.entrance_shuffle in ['simple', 'restricted']: for entrance in all_entrances: if entrance.name in entrances_to_hint: this_hint = entrances_to_hint[entrance.name] + ' leads to ' + hint_text( @@ -2279,9 +2266,9 @@ def write_strings(rom, world, player): break # Now we write inconvenient locations for most shuffles and finish taking care of the less chaotic ones. entrances_to_hint.update(InconvenientOtherEntrances) - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: hint_count = 0 - elif world.entrance_shuffle[player] in ['simple', 'restricted']: + elif world.worlds[player].options.entrance_shuffle in ['simple', 'restricted']: hint_count = 2 else: hint_count = 4 @@ -2298,31 +2285,31 @@ def write_strings(rom, world, player): # Next we handle hints for randomly selected other entrances, # curating the selection intelligently based on shuffle. - if world.entrance_shuffle[player] not in ['simple', 'restricted']: + if world.worlds[player].options.entrance_shuffle not in ['simple', 'restricted']: entrances_to_hint.update(ConnectorEntrances) entrances_to_hint.update(DungeonEntrances) - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': entrances_to_hint.update({'Inverted Agahnims Tower': 'The dark mountain tower'}) else: entrances_to_hint.update({'Agahnims Tower': 'The sealed castle door'}) - elif world.entrance_shuffle[player] == 'restricted': + elif world.worlds[player].options.entrance_shuffle == 'restricted': entrances_to_hint.update(ConnectorEntrances) entrances_to_hint.update(OtherEntrances) - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': entrances_to_hint.update({'Inverted Dark Sanctuary': 'The dark sanctuary cave'}) entrances_to_hint.update({'Inverted Big Bomb Shop': 'The old hero\'s dark home'}) entrances_to_hint.update({'Inverted Links House': 'The old hero\'s light home'}) else: entrances_to_hint.update({'Dark Sanctuary Hint': 'The dark sanctuary cave'}) entrances_to_hint.update({'Big Bomb Shop': 'The old bomb shop'}) - if world.entrance_shuffle[player] != 'insanity': + if world.worlds[player].options.entrance_shuffle != 'insanity': entrances_to_hint.update(InsanityEntrances) if world.shuffle_ganon: - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': entrances_to_hint.update({'Inverted Pyramid Entrance': 'The extra castle passage'}) else: entrances_to_hint.update({'Pyramid Ledge': 'The pyramid ledge'}) - hint_count = 4 if world.entrance_shuffle[player] not in ['vanilla', 'dungeons_simple', 'dungeons_full', + hint_count = 4 if world.worlds[player].options.entrance_shuffle not in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed'] else 0 for entrance in all_entrances: if entrance.name in entrances_to_hint: @@ -2337,10 +2324,10 @@ def write_strings(rom, world, player): # Next we write a few hints for specific inconvenient locations. We don't make many because in entrance this is highly unpredictable. locations_to_hint = InconvenientLocations.copy() - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: locations_to_hint.extend(InconvenientVanillaLocations) local_random.shuffle(locations_to_hint) - hint_count = 3 if world.entrance_shuffle[player] not in ['vanilla', 'dungeons_simple', 'dungeons_full', + hint_count = 3 if world.worlds[player].options.entrance_shuffle not in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed'] else 5 for location in locations_to_hint[:hint_count]: if location == 'Swamp Left': @@ -2395,15 +2382,15 @@ def write_strings(rom, world, player): # Lastly we write hints to show where certain interesting items are. items_to_hint = RelevantItems.copy() - if world.small_key_shuffle[player].hints_useful: + if world.worlds[player].options.small_key_shuffle.hints_useful: items_to_hint |= item_name_groups["Small Keys"] - if world.big_key_shuffle[player].hints_useful: + if world.worlds[player].options.big_key_shuffle.hints_useful: items_to_hint |= item_name_groups["Big Keys"] - if world.hints[player] == "full": + if world.worlds[player].options.hints == "full": hint_count = len(hint_locations) # fill all remaining hint locations with Item hints. else: - hint_count = 5 if world.entrance_shuffle[player] not in ['vanilla', 'dungeons_simple', 'dungeons_full', + hint_count = 5 if world.worlds[player].options.entrance_shuffle not in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed'] else 8 hint_count = min(hint_count, len(items_to_hint), len(hint_locations)) if hint_count: @@ -2434,7 +2421,7 @@ def write_strings(rom, world, player): tt['ganon_phase_3_no_silvers'] = 'Did you find the silver arrows%s' % silverarrow_hint tt['ganon_phase_3_no_silvers_alt'] = 'Did you find the silver arrows%s' % silverarrow_hint if world.worlds[player].has_progressive_bows and (w.difficulty_requirements.progressive_bow_limit >= 2 or ( - world.swordless[player] or world.glitches_required[player] == 'no_glitches')): + world.worlds[player].options.swordless or world.worlds[player].options.glitches_required == 'no_glitches')): prog_bow_locs = world.find_item_locations('Progressive Bow', player, True) local_random.shuffle(prog_bow_locs) found_bow = False @@ -2458,26 +2445,26 @@ def write_strings(rom, world, player): greenpendant = world.find_item('Green Pendant', player) tt['sahasrahla_bring_courage'] = 'I lost my family heirloom in %s' % greenpendant.hint_text - if world.crystals_needed_for_gt[player] == 1: + if world.worlds[player].options.crystals_needed_for_gt == 1: tt['sign_ganons_tower'] = 'You need a crystal to enter.' else: - tt['sign_ganons_tower'] = f'You need {world.crystals_needed_for_gt[player]} crystals to enter.' + tt['sign_ganons_tower'] = f'You need {world.worlds[player].options.crystals_needed_for_gt} crystals to enter.' - if world.goal[player] == 'bosses': + if world.worlds[player].options.goal == 'bosses': tt['sign_ganon'] = 'You need to kill all bosses, Ganon last.' - elif world.goal[player] == 'ganon_pedestal': + elif world.worlds[player].options.goal == 'ganon_pedestal': tt['sign_ganon'] = 'You need to pull the pedestal to defeat Ganon.' - elif world.goal[player] == "ganon": - if world.crystals_needed_for_ganon[player] == 1: + elif world.worlds[player].options.goal == "ganon": + if world.worlds[player].options.crystals_needed_for_ganon == 1: tt['sign_ganon'] = 'You need a crystal to beat Ganon and have beaten Agahnim atop Ganons Tower.' else: - tt['sign_ganon'] = f'You need {world.crystals_needed_for_ganon[player]} crystals to beat Ganon and ' \ + tt['sign_ganon'] = f'You need {world.worlds[player].options.crystals_needed_for_ganon} crystals to beat Ganon and ' \ f'have beaten Agahnim atop Ganons Tower' else: - if world.crystals_needed_for_ganon[player] == 1: + if world.worlds[player].options.crystals_needed_for_ganon == 1: tt['sign_ganon'] = 'You need a crystal to beat Ganon.' else: - tt['sign_ganon'] = f'You need {world.crystals_needed_for_ganon[player]} crystals to beat Ganon.' + tt['sign_ganon'] = f'You need {world.worlds[player].options.crystals_needed_for_ganon} crystals to beat Ganon.' tt['uncle_leaving_text'] = Uncle_texts[local_random.randint(0, len(Uncle_texts) - 1)] tt['end_triforce'] = "{NOBORDER}\n" + Triforce_texts[local_random.randint(0, len(Triforce_texts) - 1)] @@ -2490,10 +2477,10 @@ def write_strings(rom, world, player): triforce_pieces_required = max(0, w.treasure_hunt_required - sum(1 for item in world.precollected_items[player] if item.name == "Triforce Piece")) - if world.goal[player] in ['triforce_hunt', 'local_triforce_hunt']: + if world.worlds[player].options.goal in ['triforce_hunt', 'local_triforce_hunt']: tt['ganon_fall_in_alt'] = 'Why are you even here?\n You can\'t even hurt me! Get the Triforce Pieces.' tt['ganon_phase_3_alt'] = 'Seriously? Go Away, I will not Die.' - if world.goal[player] == 'triforce_hunt' and world.players > 1: + if world.worlds[player].options.goal == 'triforce_hunt' and world.players > 1: tt['sign_ganon'] = 'Go find the Triforce pieces with your friends... Ganon is invincible!' else: tt['sign_ganon'] = 'Go find the Triforce pieces... Ganon is invincible!' @@ -2507,7 +2494,7 @@ def write_strings(rom, world, player): "invisibility.\n\n\n\n… … …\n\nWait! you can see me? I knew I should have\n" \ "hidden in a hollow tree. If you bring\n%d Triforce piece out of %d, I can reassemble it." % \ (triforce_pieces_required, w.treasure_hunt_total) - elif world.goal[player] in ['pedestal']: + elif world.worlds[player].options.goal in ['pedestal']: tt['ganon_fall_in_alt'] = 'Why are you even here?\n You can\'t even hurt me! Your goal is at the pedestal.' tt['ganon_phase_3_alt'] = 'Seriously? Go Away, I will not Die.' tt['sign_ganon'] = 'You need to get to the pedestal... Ganon is invincible!' @@ -2516,17 +2503,17 @@ def write_strings(rom, world, player): tt['ganon_fall_in_alt'] = 'You cannot defeat me until you finish your goal!' tt['ganon_phase_3_alt'] = 'Got wax in\nyour ears?\nI can not die!' if triforce_pieces_required > 1: - if world.goal[player] == 'ganon_triforce_hunt' and world.players > 1: + if world.worlds[player].options.goal == 'ganon_triforce_hunt' and world.players > 1: tt['sign_ganon'] = 'You need to find %d Triforce pieces out of %d with your friends to defeat Ganon.' % \ (triforce_pieces_required, w.treasure_hunt_total) - elif world.goal[player] in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: + elif world.worlds[player].options.goal in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: tt['sign_ganon'] = 'You need to find %d Triforce pieces out of %d to defeat Ganon.' % \ (triforce_pieces_required, w.treasure_hunt_total) else: - if world.goal[player] == 'ganon_triforce_hunt' and world.players > 1: + if world.worlds[player].options.goal == 'ganon_triforce_hunt' and world.players > 1: tt['sign_ganon'] = 'You need to find %d Triforce piece out of %d with your friends to defeat Ganon.' % \ (triforce_pieces_required, w.treasure_hunt_total) - elif world.goal[player] in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: + elif world.worlds[player].options.goal in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: tt['sign_ganon'] = 'You need to find %d Triforce piece out of %d to defeat Ganon.' % \ (triforce_pieces_required, w.treasure_hunt_total) @@ -2549,11 +2536,11 @@ def write_strings(rom, world, player): tt['tablet_bombos_book'] = bombos_text # inverted spawn menu changes - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': tt['menu_start_2'] = "{MENU}\n{SPEED0}\n≥@'s house\n Dark Chapel\n{CHOICE3}" tt['menu_start_3'] = "{MENU}\n{SPEED0}\n≥@'s house\n Dark Chapel\n Mountain Cave\n{CHOICE2}" - for at, text, _ in world.plando_texts[player]: + for at, text, _ in world.worlds[player].options.plando_texts: if at not in tt: raise Exception(f"No text target \"{at}\" found.") @@ -2626,12 +2613,12 @@ def set_inverted_mode(world, player, rom): rom.write_byte(snes_to_pc(0x08D40C), 0xD0) # morph proof # the following bytes should only be written in vanilla # or they'll overwrite the randomizer's shuffles - if world.entrance_shuffle[player] == 'vanilla': + if world.worlds[player].options.entrance_shuffle == 'vanilla': rom.write_byte(0xDBB73 + 0x23, 0x37) # switch AT and GT rom.write_byte(0xDBB73 + 0x36, 0x24) rom.write_int16(0x15AEE + 2 * 0x38, 0x00E0) rom.write_int16(0x15AEE + 2 * 0x25, 0x000C) - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: rom.write_byte(0x15B8C, 0x6C) rom.write_byte(0xDBB73 + 0x00, 0x53) # switch bomb shop and links house rom.write_byte(0xDBB73 + 0x52, 0x01) @@ -2689,7 +2676,7 @@ def set_inverted_mode(world, player, rom): rom.write_int16(snes_to_pc(0x02D9A6), 0x005A) rom.write_byte(snes_to_pc(0x02D9B3), 0x12) # keep the old man spawn point at old man house unless shuffle is vanilla - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_full', 'dungeons_simple', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_full', 'dungeons_simple', 'dungeons_crossed']: rom.write_bytes(snes_to_pc(0x308350), [0x00, 0x00, 0x01]) rom.write_int16(snes_to_pc(0x02D8DE), 0x00F1) rom.write_bytes(snes_to_pc(0x02D910), [0x1F, 0x1E, 0x1F, 0x1F, 0x03, 0x02, 0x03, 0x03]) @@ -2752,7 +2739,7 @@ def set_inverted_mode(world, player, rom): rom.write_int16s(snes_to_pc(0x1bb836), [0x001B, 0x001B, 0x001B]) rom.write_int16(snes_to_pc(0x308300), 0x0140) # new pyramid hole entrance rom.write_int16(snes_to_pc(0x308320), 0x001B) - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: rom.write_byte(snes_to_pc(0x308340), 0x7B) rom.write_int16(snes_to_pc(0x1af504), 0x148B) rom.write_int16(snes_to_pc(0x1af50c), 0x149B) @@ -2789,10 +2776,10 @@ def set_inverted_mode(world, player, rom): rom.write_bytes(snes_to_pc(0x1BC85A), [0x50, 0x0F, 0x82]) rom.write_int16(0xDB96F + 2 * 0x35, 0x001B) # move pyramid exit door rom.write_int16(0xDBA71 + 2 * 0x35, 0x06A4) - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: rom.write_byte(0xDBB73 + 0x35, 0x36) rom.write_byte(snes_to_pc(0x09D436), 0xF3) # remove castle gate warp - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: rom.write_int16(0x15AEE + 2 * 0x37, 0x0010) # pyramid exit to new hc area rom.write_byte(0x15B8C + 0x37, 0x1B) rom.write_int16(0x15BDB + 2 * 0x37, 0x0418) diff --git a/worlds/alttp/Rules.py b/worlds/alttp/Rules.py index 3f5081129a..452c15223c 100644 --- a/worlds/alttp/Rules.py +++ b/worlds/alttp/Rules.py @@ -27,9 +27,9 @@ from .UnderworldGlitchRules import underworld_glitches_rules def set_rules(world): player = world.player world = world.multiworld - if world.glitches_required[player] == 'no_logic': + if world.worlds[player].options.glitches_required == 'no_logic': if player == next(player_id for player_id in world.get_game_players("A Link to the Past") - if world.glitches_required[player_id] == 'no_logic'): # only warn one time + if world.worlds[player_id].options.glitches_required == 'no_logic'): # only warn one time logging.info( 'WARNING! Seeds generated under this logic often require major glitches and may be impossible!') @@ -40,8 +40,8 @@ def set_rules(world): else: # Set access rules according to max glitches for multiworld progression. # Set accessibility to none, and shuffle assuming the no logic players can always win - world.accessibility[player].value = ItemsAccessibility.option_minimal - world.progression_balancing[player].value = 0 + world.worlds[player].options.accessibility.value = ItemsAccessibility.option_minimal + world.worlds[player].options.progression_balancing.value = 0 else: world.completion_condition[player] = lambda state: state.has('Triforce', player) @@ -49,52 +49,52 @@ def set_rules(world): dungeon_boss_rules(world, player) global_rules(world, player) - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': default_rules(world, player) - if world.mode[player] == 'open': + if world.worlds[player].options.mode == 'open': open_rules(world, player) - elif world.mode[player] == 'standard': + elif world.worlds[player].options.mode == 'standard': standard_rules(world, player) - elif world.mode[player] == 'inverted': + elif world.worlds[player].options.mode == 'inverted': open_rules(world, player) inverted_rules(world, player) else: - raise NotImplementedError(f'World state {world.mode[player]} is not implemented yet') + raise NotImplementedError(f'World state {world.worlds[player].options.mode} is not implemented yet') - if world.glitches_required[player] == 'no_glitches': + if world.worlds[player].options.glitches_required == 'no_glitches': no_glitches_rules(world, player) forbid_bomb_jump_requirements(world, player) - elif world.glitches_required[player] == 'overworld_glitches': + elif world.worlds[player].options.glitches_required == 'overworld_glitches': # Initially setting no_glitches_rules to set the baseline rules for some # entrances. The overworld_glitches_rules set is primarily additive. no_glitches_rules(world, player) fake_flipper_rules(world, player) overworld_glitches_rules(world, player) forbid_bomb_jump_requirements(world, player) - elif world.glitches_required[player] in ['hybrid_major_glitches', 'no_logic']: + elif world.worlds[player].options.glitches_required in ['hybrid_major_glitches', 'no_logic']: no_glitches_rules(world, player) fake_flipper_rules(world, player) overworld_glitches_rules(world, player) underworld_glitches_rules(world, player) bomb_jump_requirements(world, player) - elif world.glitches_required[player] == 'minor_glitches': + elif world.worlds[player].options.glitches_required == 'minor_glitches': no_glitches_rules(world, player) fake_flipper_rules(world, player) forbid_bomb_jump_requirements(world, player) else: - raise NotImplementedError(f'Not implemented yet: Logic - {world.glitches_required[player]}') + raise NotImplementedError(f'Not implemented yet: Logic - {world.worlds[player].options.glitches_required}') - if world.goal[player] == 'bosses': + if world.worlds[player].options.goal == 'bosses': # require all bosses to beat ganon add_rule(world.get_location('Ganon', player), lambda state: state.can_reach('Master Sword Pedestal', 'Location', player) and state.has('Beat Agahnim 1', player) and state.has('Beat Agahnim 2', player) and has_crystals(state, 7, player)) - elif world.goal[player] == 'ganon': + elif world.worlds[player].options.goal == 'ganon': # require aga2 to beat ganon add_rule(world.get_location('Ganon', player), lambda state: state.has('Beat Agahnim 2', player)) - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': set_big_bomb_rules(world, player) - if world.glitches_required[player].current_key in {'overworld_glitches', 'hybrid_major_glitches', 'no_logic'} and world.entrance_shuffle[player].current_key not in {'insanity', 'insanity_legacy', 'madness'}: + if world.worlds[player].options.glitches_required.current_key in {'overworld_glitches', 'hybrid_major_glitches', 'no_logic'} and world.worlds[player].options.entrance_shuffle.current_key not in {'insanity', 'insanity_legacy', 'madness'}: path_to_courtyard = mirrorless_path_to_castle_courtyard(world, player) add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.multiworld.get_entrance('Dark Death Mountain Offset Mirror', player).can_reach(state) and all(rule(state) for rule in path_to_courtyard), 'or') else: @@ -102,21 +102,24 @@ def set_rules(world): # if swamp and dam have not been moved we require mirror for swamp palace # however there is mirrorless swamp in hybrid MG, so we don't necessarily want this. HMG handles this requirement itself. - if not world.worlds[player].swamp_patch_required and world.glitches_required[player] not in ['hybrid_major_glitches', 'no_logic']: + if not world.worlds[player].swamp_patch_required and world.worlds[player].options.glitches_required not in ['hybrid_major_glitches', 'no_logic']: add_rule(world.get_entrance('Swamp Palace Moat', player), lambda state: state.has('Magic Mirror', player)) # GT Entrance may be required for Turtle Rock for OWG and < 7 required - ganons_tower = world.get_entrance('Inverted Ganons Tower' if world.mode[player] == 'inverted' else 'Ganons Tower', player) - if world.crystals_needed_for_gt[player] == 7 and not (world.glitches_required[player] in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic'] and world.mode[player] != 'inverted'): + ganons_tower = world.get_entrance('Inverted Ganons Tower' if world.worlds[player].options.mode == 'inverted' else 'Ganons Tower', player) + if (world.worlds[player].options.crystals_needed_for_gt == 7 + and not (world.worlds[player].options.glitches_required + in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic'] + and world.worlds[player].options.mode != 'inverted')): set_rule(ganons_tower, lambda state: False) set_trock_key_rules(world, player) - set_rule(ganons_tower, lambda state: has_crystals(state, state.multiworld.crystals_needed_for_gt[player], player)) - if world.mode[player] != 'inverted' and world.glitches_required[player] in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: + set_rule(ganons_tower, lambda state: has_crystals(state, state.multiworld.worlds[player].options.crystals_needed_for_gt, player)) + if world.worlds[player].options.mode != 'inverted' and world.worlds[player].options.glitches_required in ['overworld_glitches', 'hybrid_major_glitches', 'no_logic']: add_rule(world.get_entrance('Ganons Tower', player), lambda state: state.multiworld.get_entrance('Ganons Tower Ascent', player).can_reach(state), 'or') - set_bunny_rules(world, player, world.mode[player] == 'inverted') + set_bunny_rules(world, player, world.worlds[player].options.mode == 'inverted') def mirrorless_path_to_castle_courtyard(world, player): @@ -150,17 +153,17 @@ def set_always_allow(spot, rule): def add_lamp_requirement(world: MultiWorld, spot, player: int, has_accessible_torch: bool = False): - if world.dark_room_logic[player] == "lamp": + if world.worlds[player].options.dark_room_logic == "lamp": add_rule(spot, lambda state: state.has('Lamp', player)) - elif world.dark_room_logic[player] == "torches": # implicitly lamp as well + elif world.worlds[player].options.dark_room_logic == "torches": # implicitly lamp as well if has_accessible_torch: add_rule(spot, lambda state: state.has('Lamp', player) or state.has('Fire Rod', player)) else: add_rule(spot, lambda state: state.has('Lamp', player)) - elif world.dark_room_logic[player] == "none": + elif world.worlds[player].options.dark_room_logic == "none": pass else: - raise ValueError(f"Unknown Dark Room Logic: {world.dark_room_logic[player]}") + raise ValueError(f"Unknown Dark Room Logic: {world.worlds[player].options.dark_room_logic}") non_crossover_items = (item_name_groups["Small Keys"] | item_name_groups["Big Keys"] | progression_items) - { @@ -227,12 +230,13 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_location('Sick Kid', player), lambda state: state.has_group("Bottles", player)) set_rule(multiworld.get_location('Library', player), lambda state: state.has('Pegasus Boots', player)) - if multiworld.enemy_shuffle[player]: + if world.options.enemy_shuffle: set_rule(multiworld.get_location('Mimic Cave', player), lambda state: state.has('Hammer', player) and can_kill_most_things(state, player, 4)) else: set_rule(multiworld.get_location('Mimic Cave', player), lambda state: state.has('Hammer', player) - and ((state.multiworld.enemy_health[player] in ("easy", "default") and can_use_bombs(state, player, 4)) + and ((state.multiworld.worlds[player].options.enemy_health in ("easy", "default") + and can_use_bombs(state, player, 4)) or can_shoot_arrows(state, player) or state.has("Cane of Somaria", player) or has_beam_sword(state, player))) @@ -299,8 +303,7 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_entrance('Sewers Door', player), lambda state: state._lttp_has_key('Small Key (Hyrule Castle)', player, 4) or ( - multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal and multiworld.mode[ - player] == 'standard')) # standard universal small keys cannot access the shop + world.options.small_key_shuffle == small_key_shuffle.option_universal and world.options.mode == 'standard')) # standard universal small keys cannot access the shop set_rule(multiworld.get_entrance('Sewers Back Door', player), lambda state: state._lttp_has_key('Small Key (Hyrule Castle)', player, 4)) set_rule(multiworld.get_entrance('Sewers Secret Room', player), lambda state: can_bomb_or_bonk(state, player)) @@ -339,12 +342,12 @@ def global_rules(multiworld: MultiWorld, player: int): add_rule(ep_prize, lambda state: state.has('Big Key (Eastern Palace)', player) and state._lttp_has_key('Small Key (Eastern Palace)', player, 2) and ep_prize.parent_region.dungeon.boss.can_defeat(state)) - if not multiworld.enemy_shuffle[player]: + if not world.options.enemy_shuffle: add_rule(ep_boss, lambda state: can_shoot_arrows(state, player)) add_rule(ep_prize, lambda state: can_shoot_arrows(state, player)) # You can always kill the Stalfos' with the pots on easy/normal - if multiworld.enemy_health[player] in ("hard", "expert") or multiworld.enemy_shuffle[player]: + if world.options.enemy_health in ("hard", "expert") or world.options.enemy_shuffle: stalfos_rule = lambda state: can_kill_most_things(state, player, 4) for location in ['Eastern Palace - Compass Chest', 'Eastern Palace - Big Chest', 'Eastern Palace - Dark Square Pot Key', 'Eastern Palace - Dark Eyegore Key Drop', @@ -362,14 +365,14 @@ def global_rules(multiworld: MultiWorld, player: int): add_rule(multiworld.get_location('Desert Palace - Boss', player), lambda state: state._lttp_has_key('Small Key (Desert Palace)', player, 4) and state.has('Big Key (Desert Palace)', player) and has_fire_source(state, player) and state.multiworld.get_location('Desert Palace - Boss', player).parent_region.dungeon.boss.can_defeat(state)) # logic patch to prevent placing a crystal in Desert that's required to reach the required keys - if not (multiworld.small_key_shuffle[player] and multiworld.big_key_shuffle[player]): + if not (world.options.small_key_shuffle and world.options.big_key_shuffle): add_rule(multiworld.get_location('Desert Palace - Prize', player), lambda state: state.multiworld.get_region('Desert Palace Main (Outer)', player).can_reach(state)) set_rule(multiworld.get_location('Tower of Hera - Basement Cage', player), lambda state: can_activate_crystal_switch(state, player)) set_rule(multiworld.get_location('Tower of Hera - Map Chest', player), lambda state: can_activate_crystal_switch(state, player)) set_rule(multiworld.get_entrance('Tower of Hera Small Key Door', player), lambda state: can_activate_crystal_switch(state, player) and (state._lttp_has_key('Small Key (Tower of Hera)', player) or location_item_name(state, 'Tower of Hera - Big Key Chest', player) == ('Small Key (Tower of Hera)', player))) set_rule(multiworld.get_entrance('Tower of Hera Big Key Door', player), lambda state: can_activate_crystal_switch(state, player) and state.has('Big Key (Tower of Hera)', player)) - if multiworld.enemy_shuffle[player]: + if world.options.enemy_shuffle: add_rule(multiworld.get_entrance('Tower of Hera Big Key Door', player), lambda state: can_kill_most_things(state, player, 3)) else: add_rule(multiworld.get_entrance('Tower of Hera Big Key Door', player), @@ -378,7 +381,7 @@ def global_rules(multiworld: MultiWorld, player: int): or state.has("Cane of Somaria", player))) set_rule(multiworld.get_location('Tower of Hera - Big Chest', player), lambda state: state.has('Big Key (Tower of Hera)', player)) set_rule(multiworld.get_location('Tower of Hera - Big Key Chest', player), lambda state: has_fire_source(state, player)) - if multiworld.accessibility[player] != 'full': + if world.options.accessibility != 'full': set_always_allow(multiworld.get_location('Tower of Hera - Big Key Chest', player), lambda state, item: item.name == 'Small Key (Tower of Hera)' and item.player == player) set_rule(multiworld.get_entrance('Swamp Palace Moat', player), lambda state: state.has('Flippers', player) and state.has('Open Floodgate', player)) @@ -387,32 +390,32 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_location('Swamp Palace - Trench 1 Pot Key', player), lambda state: state._lttp_has_key('Small Key (Swamp Palace)', player, 2)) set_rule(multiworld.get_entrance('Swamp Palace (Center)', player), lambda state: state.has('Hammer', player) and state._lttp_has_key('Small Key (Swamp Palace)', player, 3)) set_rule(multiworld.get_location('Swamp Palace - Hookshot Pot Key', player), lambda state: state.has('Hookshot', player)) - if multiworld.pot_shuffle[player]: + if world.options.pot_shuffle: # it could move the key to the top right platform which can only be reached with bombs add_rule(multiworld.get_location('Swamp Palace - Hookshot Pot Key', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Swamp Palace (West)', player), lambda state: state._lttp_has_key('Small Key (Swamp Palace)', player, 6) if state.has('Hookshot', player) else state._lttp_has_key('Small Key (Swamp Palace)', player, 4)) set_rule(multiworld.get_location('Swamp Palace - Big Chest', player), lambda state: state.has('Big Key (Swamp Palace)', player)) - if multiworld.accessibility[player] != 'full': + if world.options.accessibility != 'full': allow_self_locking_items(multiworld.get_location('Swamp Palace - Big Chest', player), 'Big Key (Swamp Palace)') set_rule(multiworld.get_entrance('Swamp Palace (North)', player), lambda state: state.has('Hookshot', player) and state._lttp_has_key('Small Key (Swamp Palace)', player, 5)) - if not multiworld.small_key_shuffle[player] and multiworld.glitches_required[player] not in ['hybrid_major_glitches', 'no_logic']: + if not world.options.small_key_shuffle and world.options.glitches_required not in ['hybrid_major_glitches', 'no_logic']: forbid_item(multiworld.get_location('Swamp Palace - Entrance', player), 'Big Key (Swamp Palace)', player) add_rule(multiworld.get_location('Swamp Palace - Prize', player), lambda state: state._lttp_has_key('Small Key (Swamp Palace)', player, 6)) add_rule(multiworld.get_location('Swamp Palace - Boss', player), lambda state: state._lttp_has_key('Small Key (Swamp Palace)', player, 6)) - if multiworld.pot_shuffle[player]: + if world.options.pot_shuffle: # key can (and probably will) be moved behind bombable wall set_rule(multiworld.get_location('Swamp Palace - Waterway Pot Key', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Thieves Town Big Key Door', player), lambda state: state.has('Big Key (Thieves Town)', player)) - if multiworld.worlds[player].dungeons["Thieves Town"].boss.enemizer_name == "Blind": + if world.dungeons["Thieves Town"].boss.enemizer_name == "Blind": set_rule(multiworld.get_entrance('Blind Fight', player), lambda state: state._lttp_has_key('Small Key (Thieves Town)', player, 3) and can_use_bombs(state, player)) set_rule(multiworld.get_location('Thieves\' Town - Big Chest', player), lambda state: ((state._lttp_has_key('Small Key (Thieves Town)', player, 3)) or (location_item_name(state, 'Thieves\' Town - Big Chest', player) == ("Small Key (Thieves Town)", player)) and state._lttp_has_key('Small Key (Thieves Town)', player, 2)) and state.has('Hammer', player)) set_rule(multiworld.get_location('Thieves\' Town - Blind\'s Cell', player), lambda state: state._lttp_has_key('Small Key (Thieves Town)', player)) - if multiworld.accessibility[player] != 'full' and not multiworld.key_drop_shuffle[player]: + if world.options.accessibility != 'full' and not world.options.key_drop_shuffle: set_always_allow(multiworld.get_location('Thieves\' Town - Big Chest', player), lambda state, item: item.name == 'Small Key (Thieves Town)' and item.player == player) set_rule(multiworld.get_location('Thieves\' Town - Attic', player), lambda state: state._lttp_has_key('Small Key (Thieves Town)', player, 3)) set_rule(multiworld.get_location('Thieves\' Town - Spike Switch Pot Key', player), @@ -424,7 +427,7 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_entrance('Skull Woods First Section West Door', player), lambda state: state._lttp_has_key('Small Key (Skull Woods)', player, 5)) set_rule(multiworld.get_entrance('Skull Woods First Section (Left) Door to Exit', player), lambda state: state._lttp_has_key('Small Key (Skull Woods)', player, 5)) set_rule(multiworld.get_location('Skull Woods - Big Chest', player), lambda state: state.has('Big Key (Skull Woods)', player) and can_use_bombs(state, player)) - if multiworld.accessibility[player] != 'full': + if world.options.accessibility != 'full': allow_self_locking_items(multiworld.get_location('Skull Woods - Big Chest', player), 'Big Key (Skull Woods)') set_rule(multiworld.get_entrance('Skull Woods Torch Room', player), lambda state: state._lttp_has_key('Small Key (Skull Woods)', player, 4) and state.has('Fire Rod', player) and has_sword(state, player)) # sword required for curtain add_rule(multiworld.get_location('Skull Woods - Prize', player), lambda state: state._lttp_has_key('Small Key (Skull Woods)', player, 5)) @@ -501,13 +504,13 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_entrance('Turtle Rock (Trinexx)', player), lambda state: state._lttp_has_key('Small Key (Turtle Rock)', player, 6) and state.has('Big Key (Turtle Rock)', player) and state.has('Cane of Somaria', player)) set_rule(multiworld.get_entrance('Turtle Rock Second Section Bomb Wall', player), lambda state: can_kill_most_things(state, player, 10)) - if not multiworld.worlds[player].fix_trock_doors: + if not world.fix_trock_doors: add_rule(multiworld.get_entrance('Turtle Rock Second Section Bomb Wall', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Turtle Rock Second Section from Bomb Wall', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Turtle Rock Eye Bridge from Bomb Wall', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Turtle Rock Eye Bridge Bomb Wall', player), lambda state: can_use_bombs(state, player)) - if multiworld.enemy_shuffle[player]: + if world.options.enemy_shuffle: set_rule(multiworld.get_entrance('Palace of Darkness Bonk Wall', player), lambda state: can_bomb_or_bonk(state, player) and can_kill_most_things(state, player, 3)) else: set_rule(multiworld.get_entrance('Palace of Darkness Bonk Wall', player), lambda state: can_bomb_or_bonk(state, player) and can_shoot_arrows(state, player)) @@ -517,18 +520,18 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_entrance('Palace of Darkness (North)', player), lambda state: state._lttp_has_key('Small Key (Palace of Darkness)', player, 4)) set_rule(multiworld.get_location('Palace of Darkness - Big Chest', player), lambda state: can_use_bombs(state, player) and state.has('Big Key (Palace of Darkness)', player)) set_rule(multiworld.get_location('Palace of Darkness - The Arena - Ledge', player), lambda state: can_use_bombs(state, player)) - if multiworld.pot_shuffle[player]: + if world.options.pot_shuffle: # chest switch may be up on ledge where bombs are required set_rule(multiworld.get_location('Palace of Darkness - Stalfos Basement', player), lambda state: can_use_bombs(state, player)) set_rule(multiworld.get_entrance('Palace of Darkness Big Key Chest Staircase', player), lambda state: can_use_bombs(state, player) and (state._lttp_has_key('Small Key (Palace of Darkness)', player, 6) or ( location_item_name(state, 'Palace of Darkness - Big Key Chest', player) in [('Small Key (Palace of Darkness)', player)] and state._lttp_has_key('Small Key (Palace of Darkness)', player, 3)))) - if multiworld.accessibility[player] != 'full': + if world.options.accessibility != 'full': set_always_allow(multiworld.get_location('Palace of Darkness - Big Key Chest', player), lambda state, item: item.name == 'Small Key (Palace of Darkness)' and item.player == player and state._lttp_has_key('Small Key (Palace of Darkness)', player, 5)) set_rule(multiworld.get_entrance('Palace of Darkness Spike Statue Room Door', player), lambda state: state._lttp_has_key('Small Key (Palace of Darkness)', player, 6) or ( location_item_name(state, 'Palace of Darkness - Harmless Hellway', player) in [('Small Key (Palace of Darkness)', player)] and state._lttp_has_key('Small Key (Palace of Darkness)', player, 4))) - if multiworld.accessibility[player] != 'full': + if world.options.accessibility != 'full': set_always_allow(multiworld.get_location('Palace of Darkness - Harmless Hellway', player), lambda state, item: item.name == 'Small Key (Palace of Darkness)' and item.player == player and state._lttp_has_key('Small Key (Palace of Darkness)', player, 5)) set_rule(multiworld.get_entrance('Palace of Darkness Maze Door', player), lambda state: state._lttp_has_key('Small Key (Palace of Darkness)', player, 6)) @@ -541,13 +544,13 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_location('Ganons Tower - Bob\'s Torch', player), lambda state: state.has('Pegasus Boots', player)) set_rule(multiworld.get_entrance('Ganons Tower (Tile Room)', player), lambda state: state.has('Cane of Somaria', player)) set_rule(multiworld.get_entrance('Ganons Tower (Hookshot Room)', player), lambda state: state.has('Hammer', player) and (state.has('Hookshot', player) or state.has('Pegasus Boots', player))) - if multiworld.pot_shuffle[player]: + if world.options.pot_shuffle: set_rule(multiworld.get_location('Ganons Tower - Conveyor Cross Pot Key', player), lambda state: state.has('Hammer', player) and (state.has('Hookshot', player) or state.has('Pegasus Boots', player))) set_rule(multiworld.get_entrance('Ganons Tower (Map Room)', player), lambda state: state._lttp_has_key('Small Key (Ganons Tower)', player, 8) or ( location_item_name(state, 'Ganons Tower - Map Chest', player) in [('Big Key (Ganons Tower)', player)] and state._lttp_has_key('Small Key (Ganons Tower)', player, 6))) # this seemed to be causing generation failure, disable for now - # if world.accessibility[player] != 'full': + # if world.worlds[player].options.accessibility != 'full': # set_always_allow(world.get_location('Ganons Tower - Map Chest', player), lambda state, item: item.name == 'Small Key (Ganons Tower)' and item.player == player and state._lttp_has_key('Small Key (Ganons Tower)', player, 7) and state.can_reach('Ganons Tower (Hookshot Room)', 'region', player)) # It is possible to need more than 6 keys to get through this entrance if you spend keys elsewhere. We reflect this in the chest requirements. @@ -582,7 +585,7 @@ def global_rules(multiworld: MultiWorld, player: int): lambda state: can_use_bombs(state, player) and state.multiworld.get_location('Ganons Tower - Big Key Chest', player).parent_region.dungeon.bosses['bottom'].can_defeat(state)) set_rule(multiworld.get_location('Ganons Tower - Big Key Room - Right', player), lambda state: can_use_bombs(state, player) and state.multiworld.get_location('Ganons Tower - Big Key Room - Right', player).parent_region.dungeon.bosses['bottom'].can_defeat(state)) - if multiworld.enemy_shuffle[player]: + if world.options.enemy_shuffle: set_rule(multiworld.get_entrance('Ganons Tower Big Key Door', player), lambda state: state.has('Big Key (Ganons Tower)', player)) else: @@ -600,12 +603,12 @@ def global_rules(multiworld: MultiWorld, player: int): set_defeat_dungeon_boss_rule(multiworld.get_location('Agahnim 2', player)) ganon = multiworld.get_location('Ganon', player) set_rule(ganon, lambda state: GanonDefeatRule(state, player)) - if multiworld.goal[player] in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: + if world.options.goal in ['ganon_triforce_hunt', 'local_ganon_triforce_hunt']: add_rule(ganon, lambda state: has_triforce_pieces(state, player)) - elif multiworld.goal[player] == 'ganon_pedestal': + elif world.options.goal == 'ganon_pedestal': add_rule(multiworld.get_location('Ganon', player), lambda state: state.can_reach('Master Sword Pedestal', 'Location', player)) else: - add_rule(ganon, lambda state: has_crystals(state, state.multiworld.crystals_needed_for_ganon[player], player)) + add_rule(ganon, lambda state: has_crystals(state, state.multiworld.worlds[player].options.crystals_needed_for_ganon, player)) set_rule(multiworld.get_entrance('Ganon Drop', player), lambda state: has_beam_sword(state, player)) # need to damage ganon to get tiles to drop set_rule(multiworld.get_location('Flute Activation Spot', player), lambda state: state.has('Flute', player)) @@ -722,9 +725,9 @@ def default_rules(world, player): set_rule(world.get_entrance('Floating Island Mirror Spot', player), lambda state: state.has('Magic Mirror', player)) set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has('Moon Pearl', player) and has_sword(state, player) and has_turtle_rock_medallion(state, player) and state.can_reach('Turtle Rock (Top)', 'Region', player)) # sword required to cast magic (!) - set_rule(world.get_entrance('Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player].to_bool(world, player)) + set_rule(world.get_entrance('Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.worlds[player].options.open_pyramid.to_bool(world, player)) - if world.swordless[player]: + if world.worlds[player].options.swordless: swordless_rules(world, player) @@ -879,14 +882,14 @@ def inverted_rules(world, player): set_rule(world.get_entrance('Dark Grassy Lawn Flute', player), lambda state: state.has('Activated Flute', player)) set_rule(world.get_entrance('Hammer Peg Area Flute', player), lambda state: state.has('Activated Flute', player)) - set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player]) + set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.worlds[player].options.open_pyramid) - if world.swordless[player]: + if world.worlds[player].options.swordless: swordless_rules(world, player) def no_glitches_rules(world, player): """""" - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': set_rule(world.get_entrance('Zoras River', player), lambda state: state.has('Moon Pearl', player) and (state.has('Flippers', player) or can_lift_rocks(state, player))) set_rule(world.get_entrance('Lake Hylia Central Island Pier', player), lambda state: state.has('Moon Pearl', player) and state.has('Flippers', player)) # can be fake flippered to set_rule(world.get_entrance('Lake Hylia Island Pier', player), lambda state: state.has('Moon Pearl', player) and state.has('Flippers', player)) # can be fake flippered to @@ -910,7 +913,7 @@ def no_glitches_rules(world, player): add_conditional_lamps(world, player) def fake_flipper_rules(world, player): - if world.mode[player] == 'inverted': + if world.worlds[player].options.mode == 'inverted': set_rule(world.get_entrance('Zoras River', player), lambda state: state.has('Moon Pearl', player)) set_rule(world.get_entrance('Lake Hylia Central Island Pier', player), lambda state: state.has('Moon Pearl', player)) set_rule(world.get_entrance('Lake Hylia Island Pier', player), lambda state: state.has('Moon Pearl', player)) @@ -996,7 +999,7 @@ def add_conditional_lamps(world, player): 'Location', True) add_conditional_lamp('Palace of Darkness - Dark Basement - Right', 'Palace of Darkness (Entrance)', 'Location', True) - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': add_conditional_lamp('Agahnim 1', 'Agahnims Tower', 'Entrance') add_conditional_lamp('Castle Tower - Dark Maze', 'Agahnims Tower') add_conditional_lamp('Castle Tower - Dark Archer Key Drop', 'Agahnims Tower') @@ -1018,7 +1021,7 @@ def add_conditional_lamps(world, player): add_conditional_lamp('Eastern Palace - Boss', 'Eastern Palace', 'Location', True) add_conditional_lamp('Eastern Palace - Prize', 'Eastern Palace', 'Location', True) - if not world.mode[player] == "standard": + if not world.worlds[player].options.mode == "standard": add_lamp_requirement(world, world.get_location('Sewers - Dark Cross', player), player) add_lamp_requirement(world, world.get_entrance('Sewers Back Door', player), player) add_lamp_requirement(world, world.get_entrance('Throne Room', player), player) @@ -1044,7 +1047,7 @@ def open_rules(world, player): set_rule(world.get_location('Hyrule Castle - Zelda\'s Chest', player), lambda state: state._lttp_has_key('Small Key (Hyrule Castle)', player, 4) and state.has('Big Key (Hyrule Castle)', player) - and (world.enemy_health[player] in ("easy", "default") + and (world.worlds[player].options.enemy_health in ("easy", "default") or can_kill_most_things(state, player, 1))) @@ -1058,7 +1061,7 @@ def swordless_rules(world, player): set_rule(world.get_entrance('Ganon Drop', player), lambda state: state.has('Hammer', player)) # need to damage ganon to get tiles to drop - if world.mode[player] != 'inverted': + if world.worlds[player].options.mode != 'inverted': set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has('Hammer', player) or state.has('Beat Agahnim 1', player)) # barrier gets removed after killing agahnim, relevant for entrance shuffle set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has('Moon Pearl', player) and has_turtle_rock_medallion(state, player) and state.can_reach('Turtle Rock (Top)', 'Region', player)) # sword not required to use medallion for opening in swordless (!) set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has('Moon Pearl', player) and has_misery_mire_medallion(state, player)) # sword not required to use medallion for opening in swordless (!) @@ -1084,7 +1087,7 @@ def standard_rules(world, player): set_rule(world.get_entrance('Links House S&Q', player), lambda state: state.can_reach('Sanctuary', 'Region', player)) set_rule(world.get_entrance('Sanctuary S&Q', player), lambda state: state.can_reach('Sanctuary', 'Region', player)) - if world.small_key_shuffle[player] != small_key_shuffle.option_universal: + if world.worlds[player].options.small_key_shuffle != small_key_shuffle.option_universal: set_rule(world.get_location('Hyrule Castle - Boomerang Guard Key Drop', player), lambda state: state._lttp_has_key('Small Key (Hyrule Castle)', player, 1) and can_kill_most_things(state, player, 2)) @@ -1097,7 +1100,7 @@ def standard_rules(world, player): set_rule(world.get_location('Hyrule Castle - Zelda\'s Chest', player), lambda state: state._lttp_has_key('Small Key (Hyrule Castle)', player, 2) and state.has('Big Key (Hyrule Castle)', player) - and (world.enemy_health[player] in ("easy", "default") + and (world.worlds[player].options.enemy_health in ("easy", "default") or can_kill_most_things(state, player, 1))) set_rule(world.get_location('Sewers - Key Rat Key Drop', player), @@ -1195,15 +1198,15 @@ def set_trock_key_rules(multiworld, player): return 6 # If TR is only accessible from the middle, the big key must be further restricted to prevent softlock potential - if not can_reach_front and not multiworld.small_key_shuffle[player]: + if not can_reach_front and not multiworld.worlds[player].options.small_key_shuffle: # Must not go in the Big Key Chest - only 1 other chest available and 2+ keys required for all other chests forbid_item(multiworld.get_location('Turtle Rock - Big Key Chest', player), 'Big Key (Turtle Rock)', player) if not can_reach_big_chest: # Must not go in the Chain Chomps chest - only 2 other chests available and 3+ keys required for all other chests forbid_item(multiworld.get_location('Turtle Rock - Chain Chomps', player), 'Big Key (Turtle Rock)', player) forbid_item(multiworld.get_location('Turtle Rock - Pokey 2 Key Drop', player), 'Big Key (Turtle Rock)', player) - if multiworld.accessibility[player] == 'full': - if multiworld.big_key_shuffle[player] and can_reach_big_chest: + if multiworld.worlds[player].options.accessibility == 'full': + if multiworld.worlds[player].options.big_key_shuffle and can_reach_big_chest: # Must not go in the dungeon - all 3 available chests (Chomps, Big Chest, Crystaroller) must be keys to access laser bridge, and the big key is required first for location in ['Turtle Rock - Chain Chomps', 'Turtle Rock - Compass Chest', 'Turtle Rock - Pokey 1 Key Drop', 'Turtle Rock - Pokey 2 Key Drop', @@ -1216,9 +1219,9 @@ def set_trock_key_rules(multiworld, player): location.place_locked_item(item) toss_junk_item(multiworld, player) - if multiworld.accessibility[player] != 'full': + if multiworld.worlds[player].options.accessibility != 'full': set_always_allow(multiworld.get_location('Turtle Rock - Big Key Chest', player), lambda state, item: item.name == 'Small Key (Turtle Rock)' and item.player == player - and state.can_reach(state.multiworld.get_region('Turtle Rock (Second Section)', player))) + and state.can_reach(state.multiworld.get_region('Turtle Rock (Second Section)', player))) def set_big_bomb_rules(world, player): @@ -1683,7 +1686,7 @@ def set_bunny_rules(world: MultiWorld, player: int, inverted: bool): def get_rule_to_add(region, location = None, connecting_entrance = None): # In OWG, a location can potentially be superbunny-mirror accessible or # bunny revival accessible. - if world.glitches_required[player] in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic']: + if world.worlds[player].options.glitches_required in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic']: if region.name == 'Swamp Palace (Entrance)': # Need to 0hp revive - not in logic return lambda state: state.has('Moon Pearl', player) if region.name == 'Tower of Hera (Bottom)': # Need to hit the crystal switch @@ -1723,7 +1726,7 @@ def set_bunny_rules(world: MultiWorld, player: int, inverted: bool): seen.add(new_region) if not is_link(new_region): # For glitch rulesets, establish superbunny and revival rules. - if world.glitches_required[player] in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] and entrance.name not in OverworldGlitchRules.get_invalid_bunny_revival_dungeons(): + if world.worlds[player].options.glitches_required in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] and entrance.name not in OverworldGlitchRules.get_invalid_bunny_revival_dungeons(): if region.name in OverworldGlitchRules.get_sword_required_superbunny_mirror_regions(): possible_options.append(lambda state: path_to_access_rule(new_path, entrance) and state.has('Magic Mirror', player) and has_sword(state, player)) elif (region.name in OverworldGlitchRules.get_boots_required_superbunny_mirror_regions() @@ -1760,7 +1763,7 @@ def set_bunny_rules(world: MultiWorld, player: int, inverted: bool): # Add requirements for all locations that are actually in the dark world, except those available to the bunny, including dungeon revival for entrance in world.get_entrances(player): if is_bunny(entrance.connected_region): - if world.glitches_required[player] in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] : + if world.worlds[player].options.glitches_required in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] : if entrance.connected_region.type == LTTPRegionType.Dungeon: if entrance.parent_region.type != LTTPRegionType.Dungeon and entrance.connected_region.name in OverworldGlitchRules.get_invalid_bunny_revival_dungeons(): add_rule(entrance, get_rule_to_add(entrance.connected_region, None, entrance)) @@ -1768,7 +1771,7 @@ def set_bunny_rules(world: MultiWorld, player: int, inverted: bool): if entrance.connected_region.name == 'Turtle Rock (Entrance)': add_rule(world.get_entrance('Turtle Rock Entrance Gap', player), get_rule_to_add(entrance.connected_region, None, entrance)) for location in entrance.connected_region.locations: - if world.glitches_required[player] in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] and entrance.name in OverworldGlitchRules.get_invalid_mirror_bunny_entrances(): + if world.worlds[player].options.glitches_required in ['minor_glitches', 'overworld_glitches', 'hybrid_major_glitches', 'no_logic'] and entrance.name in OverworldGlitchRules.get_invalid_mirror_bunny_entrances(): continue if location.name in bunny_accessible_locations: continue diff --git a/worlds/alttp/Shops.py b/worlds/alttp/Shops.py index 055eb2da93..bb3945f5b0 100644 --- a/worlds/alttp/Shops.py +++ b/worlds/alttp/Shops.py @@ -168,7 +168,7 @@ def push_shop_inventories(multiworld): for location in shop_slots: item_name = location.item.name # Retro Bow arrows will already have been pushed - if (not multiworld.retro_bow[location.player]) or ((item_name, location.item.player) + if (not multiworld.worlds[location.player].options.retro_bow) or ((item_name, location.item.player) != ("Single Arrow", location.player)): location.shop.push_inventory(location.shop_slot, item_name, round(location.shop_price * get_price_modifier(location.item)), @@ -185,36 +185,36 @@ def push_shop_inventories(multiworld): def create_shops(multiworld, player: int): from .Options import RandomizeShopInventories player_shop_table = shop_table.copy() - if multiworld.include_witch_hut[player]: + if multiworld.worlds[player].options.include_witch_hut: player_shop_table["Potion Shop"] = player_shop_table["Potion Shop"]._replace(locked=False) dynamic_shop_slots = total_dynamic_shop_slots + 3 else: dynamic_shop_slots = total_dynamic_shop_slots - if multiworld.shuffle_capacity_upgrades[player]: + if multiworld.worlds[player].options.shuffle_capacity_upgrades: player_shop_table["Capacity Upgrade"] = player_shop_table["Capacity Upgrade"]._replace(locked=False) - num_slots = min(dynamic_shop_slots, multiworld.shop_item_slots[player]) + num_slots = min(dynamic_shop_slots, multiworld.worlds[player].options.shop_item_slots) single_purchase_slots: List[bool] = [True] * num_slots + [False] * (dynamic_shop_slots - num_slots) multiworld.random.shuffle(single_purchase_slots) - if multiworld.randomize_shop_inventories[player]: + if multiworld.worlds[player].options.randomize_shop_inventories: default_shop_table = [i for l in [shop_generation_types[x] for x in ['arrows', 'bombs', 'potions', 'shields', 'bottle'] if - not multiworld.retro_bow[player] or x != 'arrows'] for i in l] + not multiworld.worlds[player].options.retro_bow or x != 'arrows'] for i in l] new_basic_shop = multiworld.random.sample(default_shop_table, k=3) new_dark_shop = multiworld.random.sample(default_shop_table, k=3) for name, shop in player_shop_table.items(): typ, shop_id, keeper, custom, locked, items, sram_offset = shop if not locked: new_items = multiworld.random.sample(default_shop_table, k=len(items)) - if multiworld.randomize_shop_inventories[player] == RandomizeShopInventories.option_randomize_by_shop_type: + if multiworld.worlds[player].options.randomize_shop_inventories == RandomizeShopInventories.option_randomize_by_shop_type: if items == _basic_shop_defaults: new_items = new_basic_shop elif items == _dark_world_shop_defaults: new_items = new_dark_shop keeper = multiworld.random.choice([0xA0, 0xC1, 0xFF]) player_shop_table[name] = ShopData(typ, shop_id, keeper, custom, locked, new_items, sram_offset) - if multiworld.mode[player] == "inverted": + if multiworld.worlds[player].options.mode == "inverted": # make sure that blue potion is available in inverted, special case locked = None; lock when done. player_shop_table["Dark Lake Hylia Shop"] = \ player_shop_table["Dark Lake Hylia Shop"]._replace(items=_inverted_hylia_shop_defaults, locked=None) @@ -237,7 +237,7 @@ def create_shops(multiworld, player: int): add_rule(loc, lambda state, spot=loc: shop_price_rules(state, player, spot)) loc.shop = shop loc.shop_slot = index - if ((not (multiworld.shuffle_capacity_upgrades[player] and type == ShopType.UpgradeShop)) + if ((not (multiworld.worlds[player].options.shuffle_capacity_upgrades and type == ShopType.UpgradeShop)) and not single_purchase_slots.pop()): loc.shop_slot_disabled = True loc.locked = True @@ -309,18 +309,18 @@ def set_up_shops(multiworld, player: int): from .Options import small_key_shuffle # TODO: move hard+ mode changes for shields here, utilizing the new shops - if multiworld.retro_bow[player]: + if multiworld.worlds[player].options.retro_bow: rss = multiworld.get_region('Red Shield Shop', player).shop replacement_items = [['Red Potion', 150], ['Green Potion', 75], ['Blue Potion', 200], ['Bombs (10)', 50], ['Blue Shield', 50], ['Small Heart', 10]] # Can't just replace the single arrow with 10 arrows as retro doesn't need them. - if multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal: + if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: replacement_items.append(['Small Key (Universal)', 100]) replacement_item = multiworld.random.choice(replacement_items) rss.add_inventory(2, 'Single Arrow', 80, 1, replacement_item[0], replacement_item[1]) rss.locked = True - if multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal or multiworld.retro_bow[player]: + if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal or multiworld.worlds[player].options.retro_bow: for shop in multiworld.random.sample([s for s in multiworld.shops if s.custom and not s.locked and s.type == ShopType.Shop and s.region.player == player], 5): @@ -328,19 +328,19 @@ def set_up_shops(multiworld, player: int): slots = [0, 1, 2] multiworld.random.shuffle(slots) slots = iter(slots) - if multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal: + if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: shop.add_inventory(next(slots), 'Small Key (Universal)', 100) - if multiworld.retro_bow[player]: + if multiworld.worlds[player].options.retro_bow: shop.push_inventory(next(slots), 'Single Arrow', 80) - if multiworld.shuffle_capacity_upgrades[player]: + if multiworld.worlds[player].options.shuffle_capacity_upgrades: for shop in multiworld.shops: if shop.type == ShopType.UpgradeShop and shop.region.player == player and \ shop.region.name == "Capacity Upgrade": shop.clear_inventory() - if (multiworld.shuffle_shop_inventories[player] or multiworld.randomize_shop_prices[player] - or multiworld.randomize_cost_types[player]): + if (multiworld.worlds[player].options.shuffle_shop_inventories or multiworld.worlds[player].options.randomize_shop_prices + or multiworld.worlds[player].options.randomize_cost_types): shops = [] total_inventory = [] for shop in multiworld.shops: @@ -352,7 +352,7 @@ def set_up_shops(multiworld, player: int): for item in total_inventory: item["price_type"], item["price"] = get_price(multiworld, item, player) - if multiworld.shuffle_shop_inventories[player]: + if multiworld.worlds[player].options.shuffle_shop_inventories: multiworld.random.shuffle(total_inventory) i = 0 @@ -434,39 +434,39 @@ def get_price(multiworld, item, player: int, price_type=None): price_types = [price_type] else: price_types = [ShopPriceType.Rupees] # included as a chance to not change price - if multiworld.randomize_cost_types[player]: + if multiworld.worlds[player].options.randomize_cost_types: price_types += [ ShopPriceType.Hearts, ShopPriceType.Bombs, ShopPriceType.Magic, ] - if multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal: + if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: if item and item["item"] == "Small Key (Universal)": price_types = [ShopPriceType.Rupees, ShopPriceType.Magic] # no logical requirements for repeatable keys else: price_types.append(ShopPriceType.Keys) - if multiworld.retro_bow[player]: + if multiworld.worlds[player].options.retro_bow: if item and item["item"] == "Single Arrow": price_types = [ShopPriceType.Rupees, ShopPriceType.Magic] # no logical requirements for arrows else: price_types.append(ShopPriceType.Arrows) - diff = multiworld.item_pool[player].value + diff = multiworld.worlds[player].options.item_pool.value if item: # This is for a shop's regular inventory, the item is already determined, and we will decide the price here price = item["price"] - if multiworld.randomize_shop_prices[player]: + if multiworld.worlds[player].options.randomize_shop_prices: adjust = 2 if price < 100 else 5 - price = int((price / adjust) * (0.5 + multiworld.per_slot_randoms[player].random() * 1.5)) * adjust - multiworld.per_slot_randoms[player].shuffle(price_types) + price = int((price / adjust) * (0.5 + multiworld.worlds[player].random.random() * 1.5)) * adjust + multiworld.worlds[player].random.shuffle(price_types) for p_type in price_types: if any(x in item['item'] for x in price_blacklist[p_type]): continue return p_type, price_chart[p_type](price, diff) else: # This is an AP location and the price will be adjusted after an item is shuffled into it - p_type = multiworld.per_slot_randoms[player].choice(price_types) - return p_type, price_chart[p_type](min(int(multiworld.per_slot_randoms[player].randint(8, 56) - * multiworld.shop_price_modifier[player] / 100) * 5, 9999), diff) + p_type = multiworld.worlds[player].random.choice(price_types) + return p_type, price_chart[p_type](min(int(multiworld.worlds[player].random.randint(8, 56) + * multiworld.worlds[player].options.shop_price_modifier / 100) * 5, 9999), diff) def shop_price_rules(state: CollectionState, player: int, location: ALttPLocation): diff --git a/worlds/alttp/StateHelpers.py b/worlds/alttp/StateHelpers.py index 8661632b83..6ac3c4b8f8 100644 --- a/worlds/alttp/StateHelpers.py +++ b/worlds/alttp/StateHelpers.py @@ -6,7 +6,7 @@ def is_not_bunny(state: CollectionState, region: LTTPRegion, player: int) -> boo if state.has('Moon Pearl', player): return True - return region.is_light_world if state.multiworld.mode[player] != 'inverted' else region.is_dark_world + return region.is_light_world if state.multiworld.worlds[player].options.mode != 'inverted' else region.is_dark_world def can_bomb_clip(state: CollectionState, region: LTTPRegion, player: int) -> bool: @@ -24,7 +24,7 @@ def can_buy(state: CollectionState, item: str, player: int) -> bool: def can_shoot_arrows(state: CollectionState, player: int, count: int = 0) -> bool: - if state.multiworld.retro_bow[player]: + if state.multiworld.worlds[player].options.retro_bow: return (state.has('Bow', player) or state.has('Silver Bow', player)) and can_buy(state, 'Single Arrow', player) return (state.has('Bow', player) or state.has('Silver Bow', player)) and can_hold_arrows(state, player, count) @@ -74,9 +74,9 @@ def can_extend_magic(state: CollectionState, player: int, smallmagic: int = 16, elif state.has('Magic Upgrade (1/2)', player): basemagic = 16 if can_buy_unlimited(state, 'Green Potion', player) or can_buy_unlimited(state, 'Blue Potion', player): - if state.multiworld.item_functionality[player] == 'hard' and not fullrefill: + if state.multiworld.worlds[player].options.item_functionality == 'hard' and not fullrefill: basemagic = basemagic + int(basemagic * 0.5 * bottle_count(state, player)) - elif state.multiworld.item_functionality[player] == 'expert' and not fullrefill: + elif state.multiworld.worlds[player].options.item_functionality == 'expert' and not fullrefill: basemagic = basemagic + int(basemagic * 0.25 * bottle_count(state, player)) else: basemagic = basemagic + basemagic * bottle_count(state, player) @@ -99,12 +99,12 @@ def can_hold_arrows(state: CollectionState, player: int, quantity: int): def can_use_bombs(state: CollectionState, player: int, quantity: int = 1) -> bool: - bombs = 0 if state.multiworld.bombless_start[player] else 10 + bombs = 0 if state.multiworld.worlds[player].options.bombless_start else 10 bombs += ((state.count("Bomb Upgrade (+5)", player) * 5) + (state.count("Bomb Upgrade (+10)", player) * 10) + (state.count("Bomb Upgrade (50)", player) * 50)) # Bomb Upgrade (+5) beyond the 6th gives +10 bombs += max(0, ((state.count("Bomb Upgrade (+5)", player) - 6) * 10)) - if (not state.multiworld.shuffle_capacity_upgrades[player]) and state.has("Capacity Upgrade Shop", player): + if (not state.multiworld.worlds[player].options.shuffle_capacity_upgrades) and state.has("Capacity Upgrade Shop", player): bombs += 40 return bombs >= min(quantity, 50) @@ -120,7 +120,7 @@ def can_activate_crystal_switch(state: CollectionState, player: int) -> bool: def can_kill_most_things(state: CollectionState, player: int, enemies: int = 5) -> bool: - if state.multiworld.enemy_shuffle[player]: + if state.multiworld.worlds[player].options.enemy_shuffle: # I don't fully understand Enemizer's logic for placing enemies in spots where they need to be killable, if any. # Just go with maximal requirements for now. return (has_melee_weapon(state, player) @@ -135,7 +135,7 @@ def can_kill_most_things(state: CollectionState, player: int, enemies: int = 5) or (state.has('Cane of Byrna', player) and (enemies < 6 or can_extend_magic(state, player))) or can_shoot_arrows(state, player) or state.has('Fire Rod', player) - or (state.multiworld.enemy_health[player] in ("easy", "default") + or (state.multiworld.worlds[player].options.enemy_health in ("easy", "default") and can_use_bombs(state, player, enemies * 4))) @@ -152,7 +152,7 @@ def can_get_good_bee(state: CollectionState, player: int) -> bool: def can_retrieve_tablet(state: CollectionState, player: int) -> bool: return state.has('Book of Mudora', player) and (has_beam_sword(state, player) or - (state.multiworld.swordless[player] and + (state.multiworld.worlds[player].options.swordless and state.has("Hammer", player))) @@ -179,7 +179,7 @@ def has_fire_source(state: CollectionState, player: int) -> bool: def can_melt_things(state: CollectionState, player: int) -> bool: return state.has('Fire Rod', player) or \ (state.has('Bombos', player) and - (state.multiworld.swordless[player] or + (state.multiworld.worlds[player].options.swordless or has_sword(state, player))) @@ -192,19 +192,19 @@ def has_turtle_rock_medallion(state: CollectionState, player: int) -> bool: def can_boots_clip_lw(state: CollectionState, player: int) -> bool: - if state.multiworld.mode[player] == 'inverted': + if state.multiworld.worlds[player].options.mode == 'inverted': return state.has('Pegasus Boots', player) and state.has('Moon Pearl', player) return state.has('Pegasus Boots', player) def can_boots_clip_dw(state: CollectionState, player: int) -> bool: - if state.multiworld.mode[player] != 'inverted': + if state.multiworld.worlds[player].options.mode != 'inverted': return state.has('Pegasus Boots', player) and state.has('Moon Pearl', player) return state.has('Pegasus Boots', player) def can_get_glitched_speed_dw(state: CollectionState, player: int) -> bool: rules = [state.has('Pegasus Boots', player), any([state.has('Hookshot', player), has_sword(state, player)])] - if state.multiworld.mode[player] != 'inverted': + if state.multiworld.worlds[player].options.mode != 'inverted': rules.append(state.has('Moon Pearl', player)) return all(rules) diff --git a/worlds/alttp/UnderworldGlitchRules.py b/worlds/alttp/UnderworldGlitchRules.py index 2b18f67ed9..25511f320d 100644 --- a/worlds/alttp/UnderworldGlitchRules.py +++ b/worlds/alttp/UnderworldGlitchRules.py @@ -59,7 +59,7 @@ def dungeon_reentry_rules(world, player, clip: LTTPEntrance, dungeon_region: str # since the clip links directly to the exterior region. -def underworld_glitches_rules(world, player): +def underworld_glitches_rules(world, player): # Ice Palace Entrance Clip # This is the easiest one since it's a simple internal clip. # Need to also add melting to freezor chest since it's otherwise assumed. @@ -88,12 +88,12 @@ def underworld_glitches_rules(world, player): # We need to be able to s+q to old man, then go to either Mire or Hera at either Hera or GT. # First we require a certain type of entrance shuffle, then build the rule from its pieces. if not world.worlds[player].swamp_patch_required: - if world.entrance_shuffle[player] in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: + if world.worlds[player].options.entrance_shuffle in ['vanilla', 'dungeons_simple', 'dungeons_full', 'dungeons_crossed']: rule_map = { 'Misery Mire (Entrance)': (lambda state: True), 'Tower of Hera (Bottom)': (lambda state: state.can_reach('Tower of Hera Big Key Door', 'Entrance', player)) } - inverted = world.mode[player] == 'inverted' + inverted = world.worlds[player].options.mode == 'inverted' hera_rule = lambda state: (state.has('Moon Pearl', player) or not inverted) and \ rule_map.get(world.get_entrance('Tower of Hera', player).connected_region.name, lambda state: False)(state) gt_rule = lambda state: (state.has('Moon Pearl', player) or inverted) and \ diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py index 4a026f109b..1934138afa 100644 --- a/worlds/alttp/__init__.py +++ b/worlds/alttp/__init__.py @@ -313,74 +313,62 @@ class ALTTPWorld(World): break def generate_early(self): - # write old options - import dataclasses - is_first = self.player == min(self.multiworld.get_game_players(self.game)) - - for field in dataclasses.fields(self.options_dataclass): - if is_first: - setattr(self.multiworld, field.name, {}) - getattr(self.multiworld, field.name)[self.player] = getattr(self.options, field.name) - # end of old options re-establisher - - player = self.player multiworld = self.multiworld - self.fix_trock_doors = (multiworld.entrance_shuffle[player] != 'vanilla' - or multiworld.mode[player] == 'inverted') - self.fix_skullwoods_exit = multiworld.entrance_shuffle[player] not in ['vanilla', 'simple', 'restricted', - 'dungeons_simple'] - self.fix_palaceofdarkness_exit = multiworld.entrance_shuffle[player] not in ['dungeons_simple', 'vanilla', - 'simple', 'restricted'] - self.fix_trock_exit = multiworld.entrance_shuffle[player] not in ['vanilla', 'simple', 'restricted', - 'dungeons_simple'] + self.fix_trock_doors = (self.options.entrance_shuffle != 'vanilla' or self.options.mode == 'inverted') + self.fix_skullwoods_exit = self.options.entrance_shuffle not in ['vanilla', 'simple', 'restricted', 'dungeons_simple'] + self.fix_palaceofdarkness_exit = self.options.entrance_shuffle not in ['dungeons_simple', 'vanilla', 'simple', 'restricted'] + self.fix_trock_exit = self.options.entrance_shuffle not in ['vanilla', 'simple', 'restricted', 'dungeons_simple'] # fairy bottle fills bottle_options = [ "Bottle (Red Potion)", "Bottle (Green Potion)", "Bottle (Blue Potion)", "Bottle (Bee)", "Bottle (Good Bee)" ] - if multiworld.item_pool[player] not in ["hard", "expert"]: + if self.options.item_pool not in ["hard", "expert"]: bottle_options.append("Bottle (Fairy)") self.waterfall_fairy_bottle_fill = self.random.choice(bottle_options) self.pyramid_fairy_bottle_fill = self.random.choice(bottle_options) - if multiworld.mode[player] == 'standard': - if multiworld.small_key_shuffle[player]: - if (multiworld.small_key_shuffle[player] not in - (small_key_shuffle.option_universal, small_key_shuffle.option_own_dungeons, - small_key_shuffle.option_start_with)): + if self.options.mode == 'standard': + if self.options.small_key_shuffle: + if (self.options.small_key_shuffle not in + (small_key_shuffle.option_universal, small_key_shuffle.option_own_dungeons, + small_key_shuffle.option_start_with)): self.multiworld.local_early_items[self.player]["Small Key (Hyrule Castle)"] = 1 - self.multiworld.local_items[self.player].value.add("Small Key (Hyrule Castle)") - self.multiworld.non_local_items[self.player].value.discard("Small Key (Hyrule Castle)") - if multiworld.big_key_shuffle[player]: - self.multiworld.local_items[self.player].value.add("Big Key (Hyrule Castle)") - self.multiworld.non_local_items[self.player].value.discard("Big Key (Hyrule Castle)") + self.options.local_items.value.add("Small Key (Hyrule Castle)") + self.options.non_local_items.value.discard("Small Key (Hyrule Castle)") + if self.options.big_key_shuffle: + self.options.local_items.value.add("Big Key (Hyrule Castle)") + self.options.non_local_items.value.discard("Big Key (Hyrule Castle)") # system for sharing ER layouts self.er_seed = str(multiworld.random.randint(0, 2 ** 64)) - if multiworld.entrance_shuffle[player] != "vanilla" and multiworld.entrance_shuffle_seed[player] != "random": - shuffle = multiworld.entrance_shuffle[player].current_key + if self.options.entrance_shuffle != "vanilla" and self.options.entrance_shuffle_seed != "random": + shuffle = self.options.entrance_shuffle.current_key if shuffle == "vanilla": self.er_seed = "vanilla" - elif (not multiworld.entrance_shuffle_seed[player].value.isdigit()) or multiworld.is_race: + elif (not self.options.entrance_shuffle_seed.value.isdigit()) or multiworld.is_race: self.er_seed = get_same_seed(multiworld, ( - shuffle, multiworld.entrance_shuffle_seed[player].value, multiworld.retro_caves[player], multiworld.mode[player], - multiworld.glitches_required[player])) + shuffle, self.options.entrance_shuffle_seed.value, + self.options.retro_caves, + self.options.mode, + self.options.glitches_required + )) else: # not a race or group seed, use set seed as is. - self.er_seed = int(multiworld.entrance_shuffle_seed[player].value) - elif multiworld.entrance_shuffle[player] == "vanilla": + self.er_seed = int(self.options.entrance_shuffle_seed.value) + elif self.options.entrance_shuffle == "vanilla": self.er_seed = "vanilla" for dungeon_item in ["small_key_shuffle", "big_key_shuffle", "compass_shuffle", "map_shuffle"]: - option = getattr(multiworld, dungeon_item)[player] + option = getattr(self.options, dungeon_item) if option == "own_world": - multiworld.local_items[player].value |= self.item_name_groups[option.item_name_group] + self.options.local_items.value |= self.item_name_groups[option.item_name_group] elif option == "different_world": - multiworld.non_local_items[player].value |= self.item_name_groups[option.item_name_group] - if multiworld.mode[player] == "standard": - multiworld.non_local_items[player].value -= {"Small Key (Hyrule Castle)"} + self.options.non_local_items.value |= self.item_name_groups[option.item_name_group] + if self.options.mode == "standard": + self.options.non_local_items.value -= {"Small Key (Hyrule Castle)"} elif option.in_dungeon: self.dungeon_local_item_names |= self.item_name_groups[option.item_name_group] if option == "original_dungeon": @@ -388,15 +376,15 @@ class ALTTPWorld(World): else: self.options.local_items.value |= self.dungeon_local_item_names - self.difficulty_requirements = difficulties[multiworld.item_pool[player].current_key] + self.difficulty_requirements = difficulties[self.options.item_pool.current_key] # enforce pre-defined local items. - if multiworld.goal[player] in ["local_triforce_hunt", "local_ganon_triforce_hunt"]: - multiworld.local_items[player].value.add('Triforce Piece') + if self.options.goal in ["local_triforce_hunt", "local_ganon_triforce_hunt"]: + self.options.local_items.value.add('Triforce Piece') # Not possible to place crystals outside boss prizes yet (might as well make it consistent with pendants too). - multiworld.non_local_items[player].value -= item_name_groups['Pendants'] - multiworld.non_local_items[player].value -= item_name_groups['Crystals'] + self.options.non_local_items.value -= item_name_groups['Pendants'] + self.options.non_local_items.value -= item_name_groups['Crystals'] create_dungeons = create_dungeons @@ -404,15 +392,15 @@ class ALTTPWorld(World): player = self.player multiworld = self.multiworld - if multiworld.mode[player] != 'inverted': + if self.options.mode != 'inverted': create_regions(multiworld, player) else: create_inverted_regions(multiworld, player) create_shops(multiworld, player) self.create_dungeons() - if (multiworld.glitches_required[player] not in ["no_glitches", "minor_glitches"] and - multiworld.entrance_shuffle[player] in [ + if (self.options.glitches_required not in ["no_glitches", "minor_glitches"] and + self.options.entrance_shuffle in [ "vanilla", "dungeons_simple", "dungeons_full", "simple", "restricted", "full"]): self.fix_fake_world = False @@ -420,7 +408,7 @@ class ALTTPWorld(World): old_random = multiworld.random multiworld.random = random.Random(self.er_seed) - if multiworld.mode[player] != 'inverted': + if self.options.mode != 'inverted': link_entrances(multiworld, player) mark_light_world_regions(multiworld, player) else: @@ -505,8 +493,9 @@ class ALTTPWorld(World): if state.has('Silver Bow', item.player): return elif state.has('Bow', item.player) and (self.difficulty_requirements.progressive_bow_limit >= 2 - or self.multiworld.glitches_required[self.player] == 'no_glitches' - or self.multiworld.swordless[self.player]): # modes where silver bow is always required for ganon + or self.options.glitches_required == 'no_glitches' + or self.options.swordless): + # modes where silver bow is always required for ganon return 'Silver Bow' elif self.difficulty_requirements.progressive_bow_limit >= 1: return 'Bow' @@ -549,9 +538,9 @@ class ALTTPWorld(World): break else: raise FillError('Unable to place dungeon prizes') - if world.mode[player] == 'standard' and world.small_key_shuffle[player] \ - and world.small_key_shuffle[player] != small_key_shuffle.option_universal and \ - world.small_key_shuffle[player] != small_key_shuffle.option_own_dungeons: + if self.options.mode == 'standard' and self.options.small_key_shuffle \ + and self.options.small_key_shuffle != small_key_shuffle.option_universal and \ + self.options.small_key_shuffle != small_key_shuffle.option_own_dungeons: world.local_early_items[player]["Small Key (Hyrule Castle)"] = 1 @classmethod @@ -592,27 +581,27 @@ class ALTTPWorld(World): multiworld.spoiler.hashes[player] = get_hash_string(rom.hash) palettes_options = { - 'dungeon': multiworld.uw_palettes[player], - 'overworld': multiworld.ow_palettes[player], - 'hud': multiworld.hud_palettes[player], - 'sword': multiworld.sword_palettes[player], - 'shield': multiworld.shield_palettes[player], + 'dungeon': self.options.uw_palettes, + 'overworld': self.options.ow_palettes, + 'hud': self.options.hud_palettes, + 'sword': self.options.sword_palettes, + 'shield': self.options.shield_palettes, # 'link': world.link_palettes[player] } palettes_options = {key: option.current_key for key, option in palettes_options.items()} - apply_rom_settings(rom, multiworld.heartbeep[player].current_key, - multiworld.heartcolor[player].current_key, - multiworld.quickswap[player], - multiworld.menuspeed[player].current_key, - multiworld.music[player], + apply_rom_settings(rom, self.options.heartbeep.current_key, + self.options.heartcolor.current_key, + self.options.quickswap, + self.options.menuspeed.current_key, + self.options.music, multiworld.sprite[player], None, palettes_options, multiworld, player, True, - reduceflashing=multiworld.reduceflashing[player] or multiworld.is_race, - triforcehud=multiworld.triforcehud[player].current_key, - deathlink=multiworld.death_link[player], - allowcollect=multiworld.allow_collect[player]) + reduceflashing=self.options.reduceflashing or multiworld.is_race, + triforcehud=self.options.triforcehud.current_key, + deathlink=self.options.death_link, + allowcollect=self.options.allow_collect) rompath = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.sfc") rom.write_to_file(rompath) @@ -629,7 +618,7 @@ class ALTTPWorld(World): @classmethod def stage_extend_hint_information(cls, world, hint_data: typing.Dict[int, typing.Dict[int, str]]): er_hint_data = {player: {} for player in world.get_game_players("A Link to the Past") if - world.entrance_shuffle[player] != "vanilla" or world.retro_caves[player]} + world.worlds[player].options.entrance_shuffle != "vanilla" or world.worlds[player].options.retro_caves} for region in world.regions: if region.player in er_hint_data and region.locations: @@ -745,7 +734,7 @@ class ALTTPWorld(World): f" {self.pyramid_fairy_bottle_fill}") spoiler_handle.write(f"\nWaterfall Fairy ({player_name}):" f" {self.waterfall_fairy_bottle_fill}") - if self.multiworld.boss_shuffle[self.player] != "none": + if self.options.boss_shuffle != "none": def create_boss_map() -> typing.Dict: boss_map = { "Eastern Palace": self.dungeons["Eastern Palace"].boss.name, @@ -762,7 +751,7 @@ class ALTTPWorld(World): "Ganons Tower": "Agahnim 2", "Ganon": "Ganon" } - if self.multiworld.mode[self.player] != 'inverted': + if self.options.mode != 'inverted': boss_map.update({ "Ganons Tower Basement": self.dungeons["Ganons Tower"].bosses["bottom"].name, @@ -847,7 +836,7 @@ class ALTTPWorld(World): "triforce_pieces_available", "triforce_pieces_extra", ] - slot_data = {option_name: getattr(self.multiworld, option_name)[self.player].value for option_name in slot_options} + slot_data = {option_name: getattr(self.options, option_name).value for option_name in slot_options} slot_data.update({ 'mm_medalion': self.required_medallions[0], @@ -868,8 +857,8 @@ def get_same_seed(world, seed_def: tuple) -> str: class ALttPLogic(LogicMixin): def _lttp_has_key(self, item, player, count: int = 1): - if self.multiworld.glitches_required[player] == 'no_logic': + if self.multiworld.worlds[player].options.glitches_required == 'no_logic': return True - if self.multiworld.small_key_shuffle[player] == small_key_shuffle.option_universal: + if self.multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: return can_buy_unlimited(self, 'Small Key (Universal)', player) return self.prog_items[player][item] >= count diff --git a/worlds/alttp/test/dungeons/TestDungeon.py b/worlds/alttp/test/dungeons/TestDungeon.py index 5ab1b23065..c06955a122 100644 --- a/worlds/alttp/test/dungeons/TestDungeon.py +++ b/worlds/alttp/test/dungeons/TestDungeon.py @@ -14,8 +14,8 @@ class TestDungeon(LTTPTestBase): self.starting_regions = [] # Where to start exploring self.remove_exits = [] # Block dungeon exits self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 create_regions(self.multiworld, 1) self.multiworld.worlds[1].create_dungeons() create_shops(self.multiworld, 1) diff --git a/worlds/alttp/test/inverted/TestInverted.py b/worlds/alttp/test/inverted/TestInverted.py index a0a654991b..3c86b6ba0a 100644 --- a/worlds/alttp/test/inverted/TestInverted.py +++ b/worlds/alttp/test/inverted/TestInverted.py @@ -14,9 +14,9 @@ class TestInverted(TestBase, LTTPTestBase): def setUp(self): self.world_setup() self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] - self.multiworld.mode[1].value = 2 - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.mode.value = 2 + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 create_inverted_regions(self.multiworld, 1) self.world.create_dungeons() create_shops(self.multiworld, 1) diff --git a/worlds/alttp/test/inverted/TestInvertedBombRules.py b/worlds/alttp/test/inverted/TestInvertedBombRules.py index a33beca7a9..ab73d91108 100644 --- a/worlds/alttp/test/inverted/TestInvertedBombRules.py +++ b/worlds/alttp/test/inverted/TestInvertedBombRules.py @@ -12,7 +12,7 @@ class TestInvertedBombRules(LTTPTestBase): def setUp(self): self.world_setup() self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] - self.multiworld.mode[1].value = 2 + self.multiworld.worlds[1].options.mode.value = 2 create_inverted_regions(self.multiworld, 1) self.multiworld.worlds[1].create_dungeons() diff --git a/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py b/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py index bf25c5c9a1..972b617a29 100644 --- a/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py +++ b/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py @@ -14,10 +14,10 @@ from worlds.alttp.test import LTTPTestBase class TestInvertedMinor(TestBase, LTTPTestBase): def setUp(self): self.world_setup() - self.multiworld.mode[1].value = 2 - self.multiworld.glitches_required[1] = GlitchesRequired.from_any("minor_glitches") - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.mode.value = 2 + self.multiworld.worlds[1].options.glitches_required = GlitchesRequired.from_any("minor_glitches") + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] create_inverted_regions(self.multiworld, 1) self.world.create_dungeons() diff --git a/worlds/alttp/test/inverted_owg/TestInvertedOWG.py b/worlds/alttp/test/inverted_owg/TestInvertedOWG.py index 1de22b95e5..4be51f6298 100644 --- a/worlds/alttp/test/inverted_owg/TestInvertedOWG.py +++ b/worlds/alttp/test/inverted_owg/TestInvertedOWG.py @@ -14,10 +14,10 @@ from worlds.alttp.test import LTTPTestBase class TestInvertedOWG(TestBase, LTTPTestBase): def setUp(self): self.world_setup() - self.multiworld.glitches_required[1] = GlitchesRequired.from_any("overworld_glitches") - self.multiworld.mode[1].value = 2 - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.glitches_required = GlitchesRequired.from_any("overworld_glitches") + self.multiworld.worlds[1].options.mode.value = 2 + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] create_inverted_regions(self.multiworld, 1) self.world.create_dungeons() diff --git a/worlds/alttp/test/minor_glitches/TestMinor.py b/worlds/alttp/test/minor_glitches/TestMinor.py index 7663c20a29..d5ffe8cac5 100644 --- a/worlds/alttp/test/minor_glitches/TestMinor.py +++ b/worlds/alttp/test/minor_glitches/TestMinor.py @@ -11,9 +11,9 @@ from worlds.alttp.test import LTTPTestBase class TestMinor(TestBase, LTTPTestBase): def setUp(self): self.world_setup() - self.multiworld.glitches_required[1] = GlitchesRequired.from_any("minor_glitches") - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.glitches_required = GlitchesRequired.from_any("minor_glitches") + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] self.world.er_seed = 0 self.world.create_regions() diff --git a/worlds/alttp/test/options/TestOpenPyramid.py b/worlds/alttp/test/options/TestOpenPyramid.py index c7912c43d7..5769b337fb 100644 --- a/worlds/alttp/test/options/TestOpenPyramid.py +++ b/worlds/alttp/test/options/TestOpenPyramid.py @@ -23,7 +23,7 @@ class GoalPyramidTest(PyramidTestBase): } def testCrystalsGoalAccess(self): - self.multiworld.goal[1].value = 1 # crystals + self.multiworld.worlds[1].options.goal.value = 1 # crystals self.assertFalse(self.can_reach_entrance("Pyramid Hole")) self.collect_by_name(["Hammer", "Progressive Glove", "Moon Pearl"]) self.assertTrue(self.can_reach_entrance("Pyramid Hole")) diff --git a/worlds/alttp/test/owg/TestVanillaOWG.py b/worlds/alttp/test/owg/TestVanillaOWG.py index e51970bc50..6b6db1454b 100644 --- a/worlds/alttp/test/owg/TestVanillaOWG.py +++ b/worlds/alttp/test/owg/TestVanillaOWG.py @@ -12,9 +12,9 @@ class TestVanillaOWG(TestBase, LTTPTestBase): def setUp(self): self.world_setup() self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] - self.multiworld.glitches_required[1] = GlitchesRequired.from_any("overworld_glitches") - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.glitches_required = GlitchesRequired.from_any("overworld_glitches") + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 self.multiworld.worlds[1].er_seed = 0 self.multiworld.worlds[1].create_regions() self.multiworld.worlds[1].create_items() diff --git a/worlds/alttp/test/vanilla/TestVanilla.py b/worlds/alttp/test/vanilla/TestVanilla.py index 9b5db7b122..031aec1ff9 100644 --- a/worlds/alttp/test/vanilla/TestVanilla.py +++ b/worlds/alttp/test/vanilla/TestVanilla.py @@ -10,10 +10,10 @@ from worlds.alttp.test import LTTPTestBase class TestVanilla(TestBase, LTTPTestBase): def setUp(self): self.world_setup() - self.multiworld.glitches_required[1] = GlitchesRequired.from_any("no_glitches") + self.multiworld.worlds[1].options.glitches_required = GlitchesRequired.from_any("no_glitches") self.multiworld.worlds[1].difficulty_requirements = difficulties['normal'] - self.multiworld.bombless_start[1].value = True - self.multiworld.shuffle_capacity_upgrades[1].value = 2 + self.multiworld.worlds[1].options.bombless_start.value = True + self.multiworld.worlds[1].options.shuffle_capacity_upgrades.value = 2 self.multiworld.worlds[1].er_seed = 0 self.multiworld.worlds[1].create_regions() self.multiworld.worlds[1].create_items()